Restructure omni services and add Chatwoot research snapshot
This commit is contained in:
41
research/chatwoot/config/agents/tools.yml
Normal file
41
research/chatwoot/config/agents/tools.yml
Normal file
@@ -0,0 +1,41 @@
|
||||
###### Captain Agent Tools Configuration #######
|
||||
# id: Tool identifier used to resolve the class (Captain::Tools::{PascalCase(id)}Tool)
|
||||
# title: Human-readable tool name for frontend display
|
||||
# description: Brief description of what the tool does
|
||||
# icon: Icon name for frontend display (frontend icon system)
|
||||
#######################################################
|
||||
|
||||
- id: add_contact_note
|
||||
title: 'Add Contact Note'
|
||||
description: 'Add a note to a contact profile'
|
||||
icon: 'note-add'
|
||||
|
||||
- id: add_private_note
|
||||
title: 'Add Private Note'
|
||||
description: 'Add a private note to a conversation (internal only)'
|
||||
icon: 'eye-off'
|
||||
|
||||
- id: update_priority
|
||||
title: 'Update Priority'
|
||||
description: 'Update conversation priority level'
|
||||
icon: 'exclamation-triangle'
|
||||
|
||||
- id: add_label_to_conversation
|
||||
title: 'Add Label to Conversation'
|
||||
description: 'Add a label to a conversation'
|
||||
icon: 'tag'
|
||||
|
||||
- id: faq_lookup
|
||||
title: 'FAQ Lookup'
|
||||
description: 'Search FAQ responses using semantic similarity'
|
||||
icon: 'search'
|
||||
|
||||
- id: resolve_conversation
|
||||
title: 'Resolve Conversation'
|
||||
description: 'Resolve a conversation when the issue has been addressed'
|
||||
icon: 'checkmark'
|
||||
|
||||
- id: handoff
|
||||
title: 'Handoff to Human'
|
||||
description: 'Hand off the conversation to a human agent'
|
||||
icon: 'user-switch'
|
||||
14
research/chatwoot/config/app.yml
Normal file
14
research/chatwoot/config/app.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
shared: &shared
|
||||
version: '4.11.1'
|
||||
|
||||
development:
|
||||
<<: *shared
|
||||
|
||||
production:
|
||||
<<: *shared
|
||||
|
||||
staging:
|
||||
<<: *shared
|
||||
|
||||
test:
|
||||
<<: *shared
|
||||
113
research/chatwoot/config/application.rb
Normal file
113
research/chatwoot/config/application.rb
Normal file
@@ -0,0 +1,113 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative 'boot'
|
||||
|
||||
require 'rails/all'
|
||||
|
||||
# Require the gems listed in Gemfile, including any gems
|
||||
# you've limited to :test, :development, or :production.
|
||||
Bundler.require(*Rails.groups)
|
||||
|
||||
## Load the specific APM agent
|
||||
# We rely on DOTENV to load the environment variables
|
||||
# We need these environment variables to load the specific APM agent
|
||||
Dotenv::Rails.load
|
||||
require 'datadog' if ENV.fetch('DD_TRACE_AGENT_URL', false).present?
|
||||
require 'elastic-apm' if ENV.fetch('ELASTIC_APM_SECRET_TOKEN', false).present?
|
||||
require 'scout_apm' if ENV.fetch('SCOUT_KEY', false).present?
|
||||
|
||||
if ENV.fetch('NEW_RELIC_LICENSE_KEY', false).present?
|
||||
require 'newrelic-sidekiq-metrics'
|
||||
require 'newrelic_rpm'
|
||||
end
|
||||
|
||||
if ENV.fetch('SENTRY_DSN', false).present?
|
||||
require 'sentry-ruby'
|
||||
require 'sentry-rails'
|
||||
require 'sentry-sidekiq'
|
||||
end
|
||||
|
||||
# heroku autoscaling
|
||||
if ENV.fetch('JUDOSCALE_URL', false).present?
|
||||
require 'judoscale-rails'
|
||||
require 'judoscale-sidekiq'
|
||||
end
|
||||
|
||||
module Chatwoot
|
||||
class Application < Rails::Application
|
||||
# Initialize configuration defaults for originally generated Rails version.
|
||||
config.load_defaults 7.0
|
||||
|
||||
config.eager_load_paths << Rails.root.join('lib')
|
||||
config.eager_load_paths << Rails.root.join('enterprise/lib')
|
||||
config.eager_load_paths << Rails.root.join('enterprise/listeners')
|
||||
# rubocop:disable Rails/FilePath
|
||||
config.eager_load_paths += Dir["#{Rails.root}/enterprise/app/**"]
|
||||
# rubocop:enable Rails/FilePath
|
||||
# Add enterprise views to the view paths
|
||||
config.paths['app/views'].unshift('enterprise/app/views')
|
||||
|
||||
# Load enterprise initializers alongside standard initializers
|
||||
enterprise_initializers = Rails.root.join('enterprise/config/initializers')
|
||||
Dir[enterprise_initializers.join('**/*.rb')].each { |f| require f } if enterprise_initializers.exist?
|
||||
|
||||
# Settings in config/environments/* take precedence over those specified here.
|
||||
# Application configuration can go into files in config/initializers
|
||||
# -- all .rb files in that directory are automatically loaded after loading
|
||||
# the framework and any gems in your application.
|
||||
config.generators.javascripts = false
|
||||
config.generators.stylesheets = false
|
||||
|
||||
# Custom chatwoot configurations
|
||||
config.x = config_for(:app).with_indifferent_access
|
||||
|
||||
# https://stackoverflow.com/questions/72970170/upgrading-to-rails-6-1-6-1-causes-psychdisallowedclass-tried-to-load-unspecif
|
||||
# https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record/81017
|
||||
# FIX ME : fixes breakage of installation config. we need to migrate.
|
||||
config.active_record.yaml_column_permitted_classes = [ActiveSupport::HashWithIndifferentAccess]
|
||||
|
||||
# Disable PDF/video preview generation as we don't use them
|
||||
config.active_storage.previewers = []
|
||||
|
||||
# Active Record Encryption configuration
|
||||
# Required for MFA/2FA features - skip if not using encryption
|
||||
if ENV['ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY'].present?
|
||||
config.active_record.encryption.primary_key = ENV['ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY']
|
||||
config.active_record.encryption.deterministic_key = ENV.fetch('ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY', nil)
|
||||
config.active_record.encryption.key_derivation_salt = ENV.fetch('ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT', nil)
|
||||
# TODO: Remove once encryption is mandatory and legacy plaintext is migrated.
|
||||
config.active_record.encryption.support_unencrypted_data = true
|
||||
# Extend deterministic queries so they match both encrypted and plaintext rows
|
||||
config.active_record.encryption.extend_queries = true
|
||||
# Store a per-row key reference to support future key rotation
|
||||
config.active_record.encryption.store_key_references = true
|
||||
end
|
||||
end
|
||||
|
||||
def self.config
|
||||
@config ||= Rails.configuration.x
|
||||
end
|
||||
|
||||
def self.redis_ssl_verify_mode
|
||||
# Introduced this method to fix the issue in heroku where redis connections fail for redis 6
|
||||
# ref: https://github.com/chatwoot/chatwoot/issues/2420
|
||||
#
|
||||
# unless the redis verify mode is explicitly specified as none, we will fall back to the default 'verify peer'
|
||||
# ref: https://www.rubydoc.info/stdlib/openssl/OpenSSL/SSL/SSLContext#DEFAULT_PARAMS-constant
|
||||
ENV['REDIS_OPENSSL_VERIFY_MODE'] == 'none' ? OpenSSL::SSL::VERIFY_NONE : OpenSSL::SSL::VERIFY_PEER
|
||||
end
|
||||
|
||||
def self.encryption_configured?
|
||||
# TODO: Once Active Record encryption keys are mandatory (target 3-4 releases out),
|
||||
# remove this guard and assume encryption is always enabled.
|
||||
# Check if proper encryption keys are configured
|
||||
# MFA/2FA features should only be enabled when proper keys are set
|
||||
ENV['ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY'].present? &&
|
||||
ENV['ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY'].present? &&
|
||||
ENV['ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT'].present?
|
||||
end
|
||||
|
||||
def self.mfa_enabled?
|
||||
encryption_configured?
|
||||
end
|
||||
end
|
||||
4
research/chatwoot/config/boot.rb
Normal file
4
research/chatwoot/config/boot.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
||||
|
||||
require 'bundler/setup' # Set up gems listed in the Gemfile.
|
||||
require 'bootsnap/setup' # Speed up boot time by caching expensive operations.
|
||||
20
research/chatwoot/config/cable.yml
Normal file
20
research/chatwoot/config/cable.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
default: &default
|
||||
adapter: redis
|
||||
url: <%= ENV.fetch('REDIS_URL', 'redis://127.0.0.1:6379') %>
|
||||
password: <%= ENV.fetch('REDIS_PASSWORD', nil).presence %>
|
||||
ssl_params:
|
||||
verify_mode: <%= Chatwoot.redis_ssl_verify_mode %>
|
||||
channel_prefix: <%= "chatwoot_#{Rails.env}_action_cable" %>
|
||||
|
||||
development:
|
||||
<<: *default
|
||||
|
||||
test:
|
||||
adapter: test
|
||||
channel_prefix: <%= "chatwoot_#{Rails.env}_action_cable" %>
|
||||
|
||||
staging:
|
||||
<<: *default
|
||||
|
||||
production:
|
||||
<<: *default
|
||||
31
research/chatwoot/config/database.yml
Normal file
31
research/chatwoot/config/database.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
default: &default
|
||||
adapter: postgresql
|
||||
encoding: unicode
|
||||
host: <%= ENV.fetch('POSTGRES_HOST', 'localhost') %>
|
||||
port: <%= ENV.fetch('POSTGRES_PORT', '5432') %>
|
||||
# ref: https://github.com/mperham/sidekiq/issues/2985#issuecomment-531097962
|
||||
pool: <%= Sidekiq.server? ? ENV.fetch('SIDEKIQ_CONCURRENCY', 10) : ENV.fetch('RAILS_MAX_THREADS', 5) %>
|
||||
# frequency in seconds to periodically run the Reaper, which attempts
|
||||
# to find and recover connections from dead threads
|
||||
reaping_frequency: <%= ENV.fetch('DB_POOL_REAPING_FREQUENCY', 30) %>
|
||||
variables:
|
||||
# we are setting this value to be close to the racktimeout value. we will iterate and reduce this value going forward
|
||||
statement_timeout: <%= ENV["POSTGRES_STATEMENT_TIMEOUT"] || "14s" %>
|
||||
|
||||
development:
|
||||
<<: *default
|
||||
database: "<%= ENV.fetch('POSTGRES_DATABASE', 'chatwoot_dev') %>"
|
||||
username: "<%= ENV.fetch('POSTGRES_USERNAME', 'postgres') %>"
|
||||
password: "<%= ENV.fetch('POSTGRES_PASSWORD', '') %>"
|
||||
|
||||
test:
|
||||
<<: *default
|
||||
database: "<%= ENV.fetch('POSTGRES_DATABASE', 'chatwoot_test') %>"
|
||||
username: "<%= ENV.fetch('POSTGRES_USERNAME', 'postgres') %>"
|
||||
password: "<%= ENV.fetch('POSTGRES_PASSWORD', '') %>"
|
||||
|
||||
production:
|
||||
<<: *default
|
||||
database: "<%= ENV.fetch('POSTGRES_DATABASE', 'chatwoot_production') %>"
|
||||
username: "<%= ENV.fetch('POSTGRES_USERNAME', 'chatwoot_prod') %>"
|
||||
password: "<%= ENV.fetch('POSTGRES_PASSWORD', 'chatwoot_prod') %>"
|
||||
5
research/chatwoot/config/elastic_apm.yml
Normal file
5
research/chatwoot/config/elastic_apm.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
# Disabled by default to prevent the agent starting up when not required
|
||||
# To enable, set your ELASTIC_APM_SERVER_URL and ELASTIC_APM_SECRET_TOKEN in your .env
|
||||
# Additional configuration options can be set below, as per the docs: https://www.elastic.co/guide/en/apm/agent/ruby/current/configuration.html#configuration
|
||||
|
||||
enabled: <%= ENV.fetch('ELASTIC_APM_SECRET_TOKEN', false).present? %>
|
||||
5
research/chatwoot/config/environment.rb
Normal file
5
research/chatwoot/config/environment.rb
Normal file
@@ -0,0 +1,5 @@
|
||||
# Load the Rails application.
|
||||
require_relative 'application'
|
||||
|
||||
# Initialize the Rails application.
|
||||
Rails.application.initialize!
|
||||
88
research/chatwoot/config/environments/development.rb
Normal file
88
research/chatwoot/config/environments/development.rb
Normal file
@@ -0,0 +1,88 @@
|
||||
Rails.application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb.
|
||||
|
||||
# In the development environment your application's code is reloaded on
|
||||
# every request. This slows down response time but is perfect for development
|
||||
# since you don't have to restart the web server when you make code changes.
|
||||
config.cache_classes = false
|
||||
|
||||
# Do not eager load code on boot.
|
||||
config.eager_load = false
|
||||
|
||||
# Show full error reports.
|
||||
config.consider_all_requests_local = true
|
||||
|
||||
# Enable/disable caching. By default caching is disabled.
|
||||
# Run rails dev:cache to toggle caching.
|
||||
if Rails.root.join('tmp/caching-dev.txt').exist?
|
||||
config.action_controller.perform_caching = true
|
||||
config.action_controller.enable_fragment_cache_logging = true
|
||||
|
||||
config.cache_store = :memory_store
|
||||
config.public_file_server.headers = {
|
||||
'Cache-Control' => "public, max-age=#{2.days.to_i}"
|
||||
}
|
||||
else
|
||||
config.action_controller.perform_caching = false
|
||||
|
||||
config.cache_store = :null_store
|
||||
end
|
||||
config.public_file_server.enabled = true
|
||||
|
||||
# Store uploaded files on the local file system (see config/storage.yml for options).
|
||||
config.active_storage.service = ENV.fetch('ACTIVE_STORAGE_SERVICE', 'local').to_sym
|
||||
|
||||
config.active_job.queue_adapter = :sidekiq
|
||||
|
||||
Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] }
|
||||
|
||||
# Print deprecation notices to the Rails logger.
|
||||
config.active_support.deprecation = :log
|
||||
|
||||
# Raise an error on page load if there are pending migrations.
|
||||
config.active_record.migration_error = :page_load
|
||||
|
||||
# Highlight code that triggered database queries in logs.
|
||||
config.active_record.verbose_query_logs = true
|
||||
|
||||
# Debug mode disables concatenation and preprocessing of assets.
|
||||
# This option may cause significant delays in view rendering with a large
|
||||
# number of complex assets.
|
||||
config.assets.debug = true
|
||||
|
||||
# Suppress logger output for asset requests.
|
||||
config.assets.quiet = true
|
||||
|
||||
# Raises error for missing translations.
|
||||
# config.action_view.raise_on_missing_translations = true
|
||||
|
||||
# Use an evented file watcher to asynchronously detect changes in source code,
|
||||
# routes, locales, etc. This feature depends on the listen gem.
|
||||
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
|
||||
|
||||
# Disable host check during development
|
||||
config.hosts = nil
|
||||
|
||||
# GitHub Codespaces configuration
|
||||
if ENV['CODESPACES']
|
||||
# Allow web console access from any IP
|
||||
config.web_console.allowed_ips = %w(0.0.0.0/0 ::/0)
|
||||
# Allow CSRF from codespace URLs
|
||||
config.force_ssl = false
|
||||
config.action_controller.forgery_protection_origin_check = false
|
||||
end
|
||||
|
||||
# customize using the environment variables
|
||||
config.log_level = ENV.fetch('LOG_LEVEL', 'debug').to_sym
|
||||
|
||||
# Use a different logger for distributed setups.
|
||||
# require 'syslog/logger'
|
||||
config.logger = ActiveSupport::Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 1, ENV.fetch('LOG_SIZE', '1024').to_i.megabytes)
|
||||
|
||||
# Bullet configuration to fix the N+1 queries
|
||||
config.after_initialize do
|
||||
Bullet.enable = true
|
||||
Bullet.bullet_logger = true
|
||||
Bullet.rails_logger = true
|
||||
end
|
||||
end
|
||||
106
research/chatwoot/config/environments/production.rb
Normal file
106
research/chatwoot/config/environments/production.rb
Normal file
@@ -0,0 +1,106 @@
|
||||
Rails.application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb.
|
||||
|
||||
# Code is not reloaded between requests.
|
||||
config.cache_classes = true
|
||||
|
||||
# Eager load code on boot. This eager loads most of Rails and
|
||||
# your application in memory, allowing both threaded web servers
|
||||
# and those relying on copy on write to perform better.
|
||||
# Rake tasks automatically ignore this option for performance.
|
||||
config.eager_load = true
|
||||
|
||||
# Full error reports are disabled and caching is turned on.
|
||||
config.consider_all_requests_local = false
|
||||
config.action_controller.perform_caching = true
|
||||
|
||||
# Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
|
||||
# or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
|
||||
# config.require_master_key = true
|
||||
|
||||
# Disable serving static files from the `/public` folder by default since
|
||||
# Apache or NGINX already handles this.
|
||||
config.public_file_server.enabled = ActiveModel::Type::Boolean.new.cast(ENV.fetch('RAILS_SERVE_STATIC_FILES', true))
|
||||
config.public_file_server.headers = {
|
||||
'Cache-Control' => "public, max-age=#{1.year.to_i}"
|
||||
}
|
||||
# Compress JavaScripts and CSS.
|
||||
# config.assets.js_compressor = :uglifier
|
||||
# config.assets.css_compressor = :sass
|
||||
|
||||
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
||||
config.assets.compile = false
|
||||
|
||||
# `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
|
||||
|
||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
||||
config.action_controller.asset_host = ENV.fetch('ASSET_CDN_HOST') if ENV['ASSET_CDN_HOST'].present?
|
||||
# Specifies the header that your server uses for sending files.
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
|
||||
|
||||
# Store uploaded files on the local file system (see config/storage.yml for options)
|
||||
config.active_storage.service = ENV.fetch('ACTIVE_STORAGE_SERVICE', 'local').to_sym
|
||||
|
||||
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
||||
config.force_ssl = ActiveModel::Type::Boolean.new.cast(ENV.fetch('FORCE_SSL', false))
|
||||
|
||||
# Use the lowest log level to ensure availability of diagnostic information
|
||||
# when problems arise.
|
||||
config.log_level = ENV.fetch('LOG_LEVEL', 'info').to_sym
|
||||
|
||||
# Prepend all log lines with the following tags.
|
||||
config.log_tags = [:request_id]
|
||||
|
||||
# Use a different cache store in production.
|
||||
# config.cache_store = :mem_cache_store
|
||||
|
||||
# Use a real queuing backend for Active Job (and separate queues per environment)
|
||||
config.active_job.queue_adapter = :sidekiq
|
||||
# config.active_job.queue_name_prefix = "Chatwoot_#{Rails.env}"
|
||||
|
||||
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
||||
# the I18n.default_locale when a translation cannot be found).
|
||||
config.i18n.fallbacks = [I18n.default_locale]
|
||||
|
||||
# Send deprecation notices to registered listeners.
|
||||
config.active_support.deprecation = :notify
|
||||
|
||||
# Use default logging formatter so that PID and timestamp are not suppressed.
|
||||
config.log_formatter = ::Logger::Formatter.new
|
||||
|
||||
# Use a different logger for distributed setups.
|
||||
# require 'syslog/logger'
|
||||
# config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
|
||||
|
||||
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('RAILS_LOG_TO_STDOUT', true))
|
||||
logger = ActiveSupport::Logger.new($stdout)
|
||||
logger.formatter = config.log_formatter
|
||||
config.logger = ActiveSupport::TaggedLogging.new(logger)
|
||||
else
|
||||
config.logger = ActiveSupport::Logger.new(
|
||||
Rails.root.join("log/#{Rails.env}.log"),
|
||||
1,
|
||||
ENV.fetch('LOG_SIZE', '1024').to_i.megabytes
|
||||
)
|
||||
end
|
||||
|
||||
# Do not dump schema after migrations.
|
||||
config.active_record.dump_schema_after_migration = false
|
||||
|
||||
config.action_mailer.perform_caching = false
|
||||
|
||||
# Ignore bad email addresses and do not raise email delivery errors.
|
||||
# Set this to true and configure the email server for immediate delivery to raise delivery errors.
|
||||
# config.action_mailer.raise_delivery_errors = false
|
||||
|
||||
# Set this to appropriate ingress service for which the options are :
|
||||
# :relay for Exim, Postfix, Qmail
|
||||
# :mailgun for Mailgun
|
||||
# :mandrill for Mandrill
|
||||
# :postmark for Postmark
|
||||
# :sendgrid for Sendgrid
|
||||
config.action_mailbox.ingress = ENV.fetch('RAILS_INBOUND_EMAIL_SERVICE', 'relay').to_sym
|
||||
|
||||
Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] }
|
||||
end
|
||||
78
research/chatwoot/config/environments/staging.rb
Normal file
78
research/chatwoot/config/environments/staging.rb
Normal file
@@ -0,0 +1,78 @@
|
||||
Rails.application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb.
|
||||
|
||||
# Code is not reloaded between requests.
|
||||
config.cache_classes = true
|
||||
config.assets.enabled = false
|
||||
# Eager load code on boot. This eager loads most of Rails and
|
||||
# your application in memory, allowing both threaded web servers
|
||||
# and those relying on copy on write to perform better.
|
||||
# Rake tasks automatically ignore this option for performance.
|
||||
config.eager_load = true
|
||||
|
||||
# Full error reports are disabled and caching is turned on.
|
||||
config.consider_all_requests_local = false
|
||||
config.action_controller.perform_caching = true
|
||||
|
||||
# Disable serving static files from the `/public` folder by default since
|
||||
# Apache or NGINX already handles this.
|
||||
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
|
||||
|
||||
# Compress JavaScripts and CSS.
|
||||
config.assets.js_compressor = :uglifier
|
||||
# config.assets.css_compressor = :sass
|
||||
|
||||
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
||||
config.assets.compile = false
|
||||
|
||||
# `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
|
||||
|
||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
||||
# config.action_controller.asset_host = 'http://assets.example.com'
|
||||
|
||||
# Specifies the header that your server uses for sending files.
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
|
||||
|
||||
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
||||
config.force_ssl = ActiveModel::Type::Boolean.new.cast(ENV.fetch('FORCE_SSL', false))
|
||||
|
||||
# customize using the environment variables
|
||||
config.log_level = ENV.fetch('LOG_LEVEL', 'info').to_sym
|
||||
|
||||
# Prepend all log lines with the following tags.
|
||||
config.log_tags = [:request_id]
|
||||
|
||||
# Use a different cache store in production.
|
||||
# config.cache_store = :mem_cache_store
|
||||
|
||||
# Use a real queuing backend for Active Job (and separate queues per environment)
|
||||
# config.active_job.queue_adapter = :resque
|
||||
# config.active_job.queue_name_prefix = "chatwoot_#{Rails.env}"
|
||||
|
||||
Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] }
|
||||
|
||||
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
||||
# the I18n.default_locale when a translation cannot be found).
|
||||
config.i18n.fallbacks = [I18n.default_locale]
|
||||
config.active_job.queue_adapter = :sidekiq
|
||||
|
||||
# Send deprecation notices to registered listeners.
|
||||
config.active_support.deprecation = :notify
|
||||
|
||||
# Use default logging formatter so that PID and timestamp are not suppressed.
|
||||
config.log_formatter = ::Logger::Formatter.new
|
||||
|
||||
# Use a different logger for distributed setups.
|
||||
# require 'syslog/logger'
|
||||
config.logger = ActiveSupport::Logger.new(Rails.root.join("log/#{Rails.env}.log"), 1, ENV.fetch('LOG_SIZE', '1024').to_i.megabytes)
|
||||
|
||||
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('RAILS_LOG_TO_STDOUT', true))
|
||||
logger = ActiveSupport::Logger.new($stdout)
|
||||
logger.formatter = config.log_formatter
|
||||
config.logger = ActiveSupport::TaggedLogging.new(logger)
|
||||
end
|
||||
|
||||
# Do not dump schema after migrations.
|
||||
config.active_record.dump_schema_after_migration = false
|
||||
end
|
||||
54
research/chatwoot/config/environments/test.rb
Normal file
54
research/chatwoot/config/environments/test.rb
Normal file
@@ -0,0 +1,54 @@
|
||||
# The test environment is used exclusively to run your application's
|
||||
# test suite. You never need to work with it otherwise. Remember that
|
||||
# your test database is "scratch space" for the test suite and is wiped
|
||||
# and recreated between test runs. Don't rely on the data there!
|
||||
|
||||
require 'active_support/core_ext/integer/time'
|
||||
|
||||
Rails.application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb.
|
||||
|
||||
config.cache_classes = false
|
||||
|
||||
# Do not eager load code on boot. This avoids loading your whole application
|
||||
# just for the purpose of running a single test. If you are using a tool that
|
||||
# preloads Rails for running tests, you may have to set it to true.
|
||||
config.eager_load = false
|
||||
|
||||
# Configure public file server for tests with Cache-Control for performance.
|
||||
config.public_file_server.enabled = true
|
||||
config.public_file_server.headers = {
|
||||
'Cache-Control' => "public, max-age=#{1.hour.to_i}"
|
||||
}
|
||||
config.action_mailer.default_url_options = { host: 'http://localhost:3000' }
|
||||
Rails.application.routes.default_url_options = { host: 'http://localhost:3000' }
|
||||
|
||||
# Show full error reports and disable caching.
|
||||
config.consider_all_requests_local = true
|
||||
config.action_controller.perform_caching = false
|
||||
config.cache_store = :null_store
|
||||
|
||||
# Raise exceptions instead of rendering exception templates.
|
||||
config.action_dispatch.show_exceptions = true
|
||||
|
||||
# Disable request forgery protection in test environment.
|
||||
config.action_controller.allow_forgery_protection = false
|
||||
|
||||
# Store uploaded files on the local file system in a temporary directory.
|
||||
config.active_storage.service = :test
|
||||
|
||||
config.action_mailer.perform_caching = false
|
||||
|
||||
# Tell Action Mailer not to deliver emails to the real world.
|
||||
# The :test delivery method accumulates sent emails in the
|
||||
# ActionMailer::Base.deliveries array.
|
||||
config.action_mailer.delivery_method = :test
|
||||
config.active_job.queue_adapter = :test
|
||||
|
||||
# Print deprecation notices to the stderr.
|
||||
config.active_support.deprecation = :stderr
|
||||
|
||||
# Raises error for missing translations.
|
||||
# config.action_view.raise_on_missing_translations = true
|
||||
config.log_level = ENV.fetch('LOG_LEVEL', 'debug').to_sym
|
||||
end
|
||||
247
research/chatwoot/config/features.yml
Normal file
247
research/chatwoot/config/features.yml
Normal file
@@ -0,0 +1,247 @@
|
||||
# DO NOT change the order of features EVER
|
||||
############################################
|
||||
# name: the name to be used internally in the code
|
||||
# display_name: the name to be used in the UI
|
||||
# enabled: whether the feature is enabled by default
|
||||
# help_url: the url to the help center article
|
||||
# chatwoot_internal: whether the feature is internal to Chatwoot and should not be shown in the UI for other self hosted installations
|
||||
# deprecated: purpose of feature flag is done, no need to show it in the UI anymore
|
||||
- name: inbound_emails
|
||||
display_name: Inbound Emails
|
||||
enabled: true
|
||||
- name: channel_email
|
||||
display_name: Email Channel
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/email
|
||||
- name: channel_facebook
|
||||
display_name: Facebook Channel
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/fb
|
||||
- name: channel_twitter
|
||||
display_name: Twitter Channel
|
||||
enabled: true
|
||||
deprecated: true
|
||||
- name: ip_lookup
|
||||
display_name: IP Lookup
|
||||
enabled: false
|
||||
- name: disable_branding
|
||||
display_name: Disable Branding
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: email_continuity_on_api_channel
|
||||
display_name: Email Continuity on API Channel
|
||||
enabled: false
|
||||
- name: help_center
|
||||
display_name: Help Center
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/help-center
|
||||
- name: agent_bots
|
||||
display_name: Agent Bots
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/agent-bots
|
||||
- name: macros
|
||||
display_name: Macros
|
||||
enabled: true
|
||||
- name: agent_management
|
||||
display_name: Agent Management
|
||||
enabled: true
|
||||
- name: team_management
|
||||
display_name: Team Management
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/teams
|
||||
- name: inbox_management
|
||||
display_name: Inbox Management
|
||||
enabled: true
|
||||
- name: labels
|
||||
display_name: Labels
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/labels
|
||||
- name: custom_attributes
|
||||
display_name: Custom Attributes
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/custom-attributes
|
||||
- name: automations
|
||||
display_name: Automations
|
||||
enabled: true
|
||||
- name: canned_responses
|
||||
display_name: Canned Responses
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/canned
|
||||
- name: integrations
|
||||
display_name: Integrations
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/integrations
|
||||
- name: voice_recorder
|
||||
display_name: Voice Recorder
|
||||
enabled: true
|
||||
- name: mobile_v2
|
||||
display_name: Mobile App V2
|
||||
enabled: false
|
||||
deprecated: true
|
||||
- name: channel_website
|
||||
display_name: Website Channel
|
||||
enabled: true
|
||||
- name: campaigns
|
||||
display_name: Campaigns
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/campaigns
|
||||
- name: reports
|
||||
display_name: Reports
|
||||
enabled: true
|
||||
help_url: https://chwt.app/hc/reports
|
||||
- name: crm
|
||||
display_name: CRM
|
||||
enabled: true
|
||||
- name: auto_resolve_conversations
|
||||
display_name: Auto Resolve Conversations
|
||||
enabled: true
|
||||
- name: custom_reply_email
|
||||
display_name: Custom Reply Email
|
||||
enabled: false
|
||||
- name: custom_reply_domain
|
||||
display_name: Custom Reply Domain
|
||||
enabled: false
|
||||
- name: audit_logs
|
||||
display_name: Audit Logs
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: response_bot
|
||||
display_name: Response Bot
|
||||
enabled: false
|
||||
premium: true
|
||||
deprecated: true
|
||||
- name: message_reply_to
|
||||
display_name: Message Reply To
|
||||
enabled: false
|
||||
help_url: https://chwt.app/hc/reply-to
|
||||
deprecated: true
|
||||
- name: insert_article_in_reply
|
||||
display_name: Insert Article in Reply
|
||||
enabled: false
|
||||
deprecated: true
|
||||
- name: inbox_view
|
||||
display_name: Inbox View
|
||||
enabled: false
|
||||
chatwoot_internal: true
|
||||
- name: sla
|
||||
display_name: SLA
|
||||
enabled: false
|
||||
premium: true
|
||||
help_url: https://chwt.app/hc/sla
|
||||
- name: help_center_embedding_search
|
||||
display_name: Help Center Embedding Search
|
||||
enabled: false
|
||||
premium: true
|
||||
chatwoot_internal: true
|
||||
- name: linear_integration
|
||||
display_name: Linear Integration
|
||||
enabled: false
|
||||
- name: captain_integration
|
||||
display_name: Captain
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: custom_roles
|
||||
display_name: Custom Roles
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: chatwoot_v4
|
||||
display_name: Chatwoot V4
|
||||
enabled: true
|
||||
- name: report_v4
|
||||
display_name: Report V4
|
||||
enabled: true
|
||||
deprecated: true
|
||||
- name: contact_chatwoot_support_team
|
||||
display_name: Contact Chatwoot Support Team
|
||||
enabled: true
|
||||
chatwoot_internal: true
|
||||
- name: shopify_integration
|
||||
display_name: Shopify Integration
|
||||
enabled: false
|
||||
chatwoot_internal: true
|
||||
- name: search_with_gin
|
||||
display_name: Search messages with GIN
|
||||
enabled: false
|
||||
chatwoot_internal: true
|
||||
- name: channel_instagram
|
||||
display_name: Instagram Channel
|
||||
enabled: true
|
||||
- name: crm_integration
|
||||
display_name: CRM Integration
|
||||
enabled: false
|
||||
- name: channel_voice
|
||||
display_name: Voice Channel
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: notion_integration
|
||||
display_name: Notion Integration
|
||||
enabled: false
|
||||
- name: captain_integration_v2
|
||||
display_name: Captain V2
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: whatsapp_embedded_signup
|
||||
display_name: WhatsApp Embedded Signup
|
||||
enabled: false
|
||||
deprecated: true
|
||||
- name: whatsapp_campaign
|
||||
display_name: WhatsApp Campaign
|
||||
enabled: false
|
||||
- name: crm_v2
|
||||
display_name: CRM V2
|
||||
enabled: false
|
||||
chatwoot_internal: true
|
||||
- name: assignment_v2
|
||||
display_name: Assignment V2
|
||||
enabled: false
|
||||
chatwoot_internal: true
|
||||
- name: twilio_content_templates
|
||||
display_name: Twilio Content Templates
|
||||
enabled: false
|
||||
deprecated: true
|
||||
- name: advanced_search
|
||||
display_name: Advanced Search
|
||||
enabled: false
|
||||
premium: true
|
||||
chatwoot_internal: true
|
||||
- name: saml
|
||||
display_name: SAML
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: advanced_search_indexing
|
||||
display_name: Advanced Search Indexing
|
||||
enabled: false
|
||||
premium: true
|
||||
chatwoot_internal: true
|
||||
- name: reply_mailer_migration
|
||||
# This feature is temporary only to migrate reply mailer to new email builder
|
||||
# Once the migration is done, this feature can be removed
|
||||
display_name: Reply Mailer Migration
|
||||
enabled: false
|
||||
chatwoot_internal: true
|
||||
- name: quoted_email_reply
|
||||
display_name: Quoted Email Reply
|
||||
enabled: false
|
||||
- name: companies
|
||||
display_name: Companies
|
||||
enabled: false
|
||||
premium: true
|
||||
chatwoot_internal: true
|
||||
- name: channel_tiktok
|
||||
display_name: TikTok Channel
|
||||
enabled: true
|
||||
- name: csat_review_notes
|
||||
display_name: CSAT Review Notes
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: captain_tasks
|
||||
display_name: Captain Tasks
|
||||
enabled: true
|
||||
- name: conversation_required_attributes
|
||||
display_name: Required Conversation Attributes
|
||||
enabled: false
|
||||
premium: true
|
||||
- name: advanced_assignment
|
||||
display_name: Advanced Assignment
|
||||
enabled: false
|
||||
premium: true
|
||||
1
research/chatwoot/config/initializers/00_init.rb
Normal file
1
research/chatwoot/config/initializers/00_init.rb
Normal file
@@ -0,0 +1 @@
|
||||
APPS_CONFIG = YAML.load_file(Rails.root.join('config/integration/apps.yml'))
|
||||
@@ -0,0 +1,87 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# original Authors: Gitlab
|
||||
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/initializers/0_inject_enterprise_edition_module.rb
|
||||
#
|
||||
|
||||
### Ref: https://medium.com/@leo_hetsch/ruby-modules-include-vs-prepend-vs-extend-f09837a5b073
|
||||
# Ancestors chain : it holds a list of constant names which are its ancestors
|
||||
# example, by calling ancestors on the String class,
|
||||
# String.ancestors => [String, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]
|
||||
#
|
||||
# Include: Ruby will insert the module into the ancestors chain of the class, just after its superclass
|
||||
# ancestor chain : [OriginalClass, IncludedModule, ...]
|
||||
#
|
||||
# Extend: class will actually import the module methods as class methods
|
||||
#
|
||||
# Prepend: Ruby will look into the module methods before looking into the class.
|
||||
# ancestor chain : [PrependedModule, OriginalClass, ...]
|
||||
########
|
||||
|
||||
require 'active_support/inflector'
|
||||
|
||||
module InjectEnterpriseEditionModule
|
||||
def prepend_mod_with(constant_name, namespace: Object, with_descendants: false)
|
||||
each_extension_for(constant_name, namespace) do |constant|
|
||||
prepend_module(constant, with_descendants)
|
||||
end
|
||||
end
|
||||
|
||||
def extend_mod_with(constant_name, namespace: Object)
|
||||
# rubocop:disable Performance/MethodObjectAsBlock
|
||||
each_extension_for(
|
||||
constant_name,
|
||||
namespace,
|
||||
&method(:extend)
|
||||
)
|
||||
# rubocop:enable Performance/MethodObjectAsBlock
|
||||
end
|
||||
|
||||
def include_mod_with(constant_name, namespace: Object)
|
||||
# rubocop:disable Performance/MethodObjectAsBlock
|
||||
each_extension_for(
|
||||
constant_name,
|
||||
namespace,
|
||||
&method(:include)
|
||||
)
|
||||
# rubocop:enable Performance/MethodObjectAsBlock
|
||||
end
|
||||
|
||||
def prepend_mod(with_descendants: false)
|
||||
prepend_mod_with(name, with_descendants: with_descendants)
|
||||
end
|
||||
|
||||
def extend_mod
|
||||
extend_mod_with(name)
|
||||
end
|
||||
|
||||
def include_mod
|
||||
include_mod_with(name)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def prepend_module(mod, with_descendants)
|
||||
prepend(mod)
|
||||
|
||||
descendants.each { |descendant| descendant.prepend(mod) } if with_descendants
|
||||
end
|
||||
|
||||
def each_extension_for(constant_name, namespace)
|
||||
ChatwootApp.extensions.each do |extension_name|
|
||||
extension_namespace =
|
||||
const_get_maybe_false(namespace, extension_name.camelize)
|
||||
|
||||
extension_module =
|
||||
const_get_maybe_false(extension_namespace, constant_name)
|
||||
|
||||
yield(extension_module) if extension_module
|
||||
end
|
||||
end
|
||||
|
||||
def const_get_maybe_false(mod, name)
|
||||
mod&.const_defined?(name, false) && mod&.const_get(name, false)
|
||||
end
|
||||
end
|
||||
|
||||
Module.prepend(InjectEnterpriseEditionModule)
|
||||
20
research/chatwoot/config/initializers/01_redis.rb
Normal file
20
research/chatwoot/config/initializers/01_redis.rb
Normal file
@@ -0,0 +1,20 @@
|
||||
# TODO: Phase out the custom ConnectionPool wrappers ($alfred / $velma),
|
||||
# switch to plain Redis clients here and let Rails 7.1+ handle pooling
|
||||
# via `pool:` in RedisCacheStore (see rack_attack initializer).
|
||||
|
||||
# Alfred
|
||||
# Add here as you use it for more features
|
||||
# Used for Round Robin, Conversation Emails & Online Presence
|
||||
alfred_size = ENV.fetch('REDIS_ALFRED_SIZE', 5)
|
||||
$alfred = ConnectionPool.new(size: alfred_size, timeout: 1) do
|
||||
redis = Rails.env.test? ? MockRedis.new : Redis.new(Redis::Config.app)
|
||||
Redis::Namespace.new('alfred', redis: redis, warning: true)
|
||||
end
|
||||
|
||||
# Velma : Determined protector
|
||||
# used in rack attack
|
||||
velma_size = ENV.fetch('REDIS_VELMA_SIZE', 10)
|
||||
$velma = ConnectionPool.new(size: velma_size, timeout: 1) do
|
||||
config = Rails.env.test? ? MockRedis.new : Redis.new(Redis::Config.app)
|
||||
Redis::Namespace.new('velma', redis: config, warning: true)
|
||||
end
|
||||
15
research/chatwoot/config/initializers/actioncable.rb
Normal file
15
research/chatwoot/config/initializers/actioncable.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'action_cable/subscription_adapter/redis'
|
||||
|
||||
ActionCable::SubscriptionAdapter::Redis.redis_connector = lambda do |config|
|
||||
# For supporting GCP Memorystore where `client` command is disabled.
|
||||
# You can configure the following ENV variable to get your installation working.
|
||||
# ref:
|
||||
# https://github.com/mperham/sidekiq/issues/3518#issuecomment-595611673
|
||||
# https://github.com/redis/redis-rb/issues/767
|
||||
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75173
|
||||
# https://github.com/rails/rails/blob/4a23cb3415eac03d76623112576559a722d1f23d/actioncable/lib/action_cable/subscription_adapter/base.rb#L30
|
||||
config[:id] = nil if ENV['REDIS_DISABLE_CLIENT_COMMAND'].present?
|
||||
Redis.new(config.except(:adapter, :channel_prefix))
|
||||
end
|
||||
@@ -0,0 +1 @@
|
||||
ActiveRecordQueryTrace.enabled = true if Rails.env.development?
|
||||
23
research/chatwoot/config/initializers/ai_agents.rb
Normal file
23
research/chatwoot/config/initializers/ai_agents.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'agents'
|
||||
|
||||
Rails.application.config.after_initialize do
|
||||
api_key = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_API_KEY')&.value
|
||||
model = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_MODEL')&.value.presence || LlmConstants::DEFAULT_MODEL
|
||||
api_endpoint = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_ENDPOINT')&.value || LlmConstants::OPENAI_API_ENDPOINT
|
||||
|
||||
if api_key.present?
|
||||
Agents.configure do |config|
|
||||
config.openai_api_key = api_key
|
||||
if api_endpoint.present?
|
||||
api_base = "#{api_endpoint.chomp('/')}/v1"
|
||||
config.openai_api_base = api_base
|
||||
end
|
||||
config.default_model = model
|
||||
config.debug = false
|
||||
end
|
||||
end
|
||||
rescue StandardError => e
|
||||
Rails.logger.error "Failed to configure AI Agents SDK: #{e.message}"
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# ActiveSupport::Reloader.to_prepare do
|
||||
# ApplicationController.renderer.defaults.merge!(
|
||||
# http_host: 'example.org',
|
||||
# https: false
|
||||
# )
|
||||
# end
|
||||
20
research/chatwoot/config/initializers/assets.rb
Normal file
20
research/chatwoot/config/initializers/assets.rb
Normal file
@@ -0,0 +1,20 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Version of your assets, change this if you want to expire all your assets.
|
||||
Rails.application.config.assets.version = '1.0'
|
||||
|
||||
# Add additional assets to the asset load path.
|
||||
# Rails.application.config.assets.paths << Emoji.images_path
|
||||
# Add Yarn node_modules folder to the asset load path.
|
||||
Rails.application.config.assets.paths << Rails.root.join('node_modules')
|
||||
|
||||
# Precompile additional assets.
|
||||
# application.js, application.css, and all non-JS/CSS in the app/assets
|
||||
# folder are already added.
|
||||
# Rails.application.config.assets.precompile += %w( admin.js admin.css )
|
||||
Rails.application.config.assets.precompile += %w[dashboardChart.js]
|
||||
|
||||
# to take care of fonts in assets pre-compiling
|
||||
# Ref: https://stackoverflow.com/questions/56960709/rails-font-cors-policy
|
||||
# https://github.com/rails/sprockets/issues/632#issuecomment-551324428
|
||||
Rails.application.config.assets.precompile << ['*.svg', '*.eot', '*.woff', '*.ttf']
|
||||
5
research/chatwoot/config/initializers/audited.rb
Normal file
5
research/chatwoot/config/initializers/audited.rb
Normal file
@@ -0,0 +1,5 @@
|
||||
# configuration related audited gem : https://github.com/collectiveidea/audited
|
||||
|
||||
Audited.config do |config|
|
||||
config.audit_class = 'Enterprise::AuditLog'
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
|
||||
# Rails.backtrace_cleaner.add_silencer { |line| /my_noisy_library/.match?(line) }
|
||||
|
||||
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
|
||||
# Rails.backtrace_cleaner.remove_silencers!
|
||||
@@ -0,0 +1,36 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Define an application-wide content security policy
|
||||
# For further information see the following documentation
|
||||
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
|
||||
|
||||
# Rails.application.config.content_security_policy do |policy|
|
||||
# policy.default_src :self, :https
|
||||
# policy.font_src :self, :https, :data
|
||||
# policy.img_src :self, :https, :data
|
||||
# policy.object_src :none
|
||||
# policy.script_src :self, :https
|
||||
# Allow @vite/client to hot reload javascript changes in development
|
||||
# policy.script_src *policy.script_src, :unsafe_eval, "http://#{ ViteRuby.config.host_with_port }" if Rails.env.development?
|
||||
# You may need to enable this in production as well depending on your setup.
|
||||
# policy.script_src *policy.script_src, :blob if Rails.env.test?
|
||||
# policy.style_src :self, :https
|
||||
# Allow @vite/client to hot reload style changes in development
|
||||
# policy.style_src *policy.style_src, :unsafe_inline if Rails.env.development?
|
||||
# Allow @vite/client to hot reload changes in development
|
||||
# policy.connect_src *policy.connect_src, "ws://#{ ViteRuby.config.host_with_port }" if Rails.env.development?
|
||||
|
||||
# # Specify URI for violation reports
|
||||
# # policy.report_uri "/csp-violation-report-endpoint"
|
||||
# end
|
||||
|
||||
# If you are using UJS then enable automatic nonce generation
|
||||
# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }
|
||||
|
||||
# Set the nonce only to specific directives
|
||||
# Rails.application.config.content_security_policy_nonce_directives = %w(script-src)
|
||||
|
||||
# Report CSP violations to a specified URI
|
||||
# For further information see the following documentation:
|
||||
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
|
||||
# Rails.application.config.content_security_policy_report_only = true
|
||||
@@ -0,0 +1,5 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Specify a serializer for the signed and encrypted cookie jars.
|
||||
# Valid options are :json, :marshal, and :hybrid.
|
||||
Rails.application.config.action_dispatch.cookies_serializer = :json
|
||||
35
research/chatwoot/config/initializers/cors.rb
Normal file
35
research/chatwoot/config/initializers/cors.rb
Normal file
@@ -0,0 +1,35 @@
|
||||
# config/initializers/cors.rb
|
||||
# ref: https://github.com/cyu/rack-cors
|
||||
|
||||
# font cors issue with CDN
|
||||
# Ref: https://stackoverflow.com/questions/56960709/rails-font-cors-policy
|
||||
Rails.application.config.middleware.insert_before 0, Rack::Cors do
|
||||
allow do
|
||||
origins '*'
|
||||
resource '/packs/*', headers: :any, methods: [:get, :options]
|
||||
resource '/audio/*', headers: :any, methods: [:get, :options]
|
||||
# Make the public endpoints accessible to the frontend
|
||||
resource '/public/api/*', headers: :any, methods: :any
|
||||
|
||||
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('CW_API_ONLY_SERVER', false)) || Rails.env.development?
|
||||
resource '*', headers: :any, methods: :any, expose: %w[access-token client uid expiry]
|
||||
end
|
||||
|
||||
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('ENABLE_API_CORS', false))
|
||||
resource '/api/*', headers: :any, methods: :any, expose: %w[access-token client uid expiry]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
################################################
|
||||
######### Action Cable Related Config ##########
|
||||
################################################
|
||||
|
||||
# Mount Action Cable outside main process or domain
|
||||
# Rails.application.config.action_cable.mount_path = nil
|
||||
# Rails.application.config.action_cable.url = 'wss://example.com/cable'
|
||||
# Rails.application.config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]
|
||||
|
||||
# To Enable connecting to the API channel public APIs
|
||||
# ref : https://medium.com/@emikaijuin/connecting-to-action-cable-without-rails-d39a8aaa52d5
|
||||
Rails.application.config.action_cable.disable_request_forgery_protection = true
|
||||
@@ -0,0 +1,2 @@
|
||||
Rack::Utils::HTTP_STATUS_CODES[901] = 'Trial Expired'
|
||||
Rack::Utils::HTTP_STATUS_CODES[902] = 'Account Suspended'
|
||||
6
research/chatwoot/config/initializers/datadog.rb
Normal file
6
research/chatwoot/config/initializers/datadog.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
if ENV['DD_TRACE_AGENT_URL'].present?
|
||||
Datadog.configure do |c|
|
||||
# Instrumentation
|
||||
c.tracing.instrument :rails
|
||||
end
|
||||
end
|
||||
274
research/chatwoot/config/initializers/devise.rb
Normal file
274
research/chatwoot/config/initializers/devise.rb
Normal file
@@ -0,0 +1,274 @@
|
||||
# Use this hook to configure devise mailer, warden hooks and so forth.
|
||||
# Many of these configuration options can be set straight in your model.
|
||||
Devise.setup do |config|
|
||||
# The secret key used by Devise. Devise uses this key to generate
|
||||
# random tokens. Changing this key will render invalid all existing
|
||||
# confirmation, reset password and unlock tokens in the database.
|
||||
# Devise will use the `secret_key_base` as its `secret_key`
|
||||
# by default. You can change it below and use your own secret key.
|
||||
# config.secret_key = 'dff4665a082305d28b485d1d763d0d3e52e2577220eaa551836862a3dbca1aade309fe7ceed35180ac494cbc27bd2f5f84d45e1'
|
||||
|
||||
# ==> Mailer Configuration
|
||||
# Configure the e-mail address which will be shown in Devise::Mailer,
|
||||
# note that it will be overwritten if you use your own mailer class
|
||||
# with default "from" parameter.
|
||||
config.mailer_sender = ENV.fetch('MAILER_SENDER_EMAIL', 'Chatwoot <accounts@chatwoot.com>')
|
||||
|
||||
# Configure the class responsible to send e-mails.
|
||||
# config.mailer = 'Devise::Mailer'
|
||||
|
||||
# Configure the parent class responsible to send e-mails.
|
||||
config.parent_mailer = 'ApplicationMailer'
|
||||
|
||||
# ==> ORM configuration
|
||||
# Load and configure the ORM. Supports :active_record (default) and
|
||||
# :mongoid (bson_ext recommended) by default. Other ORMs may be
|
||||
# available as additional gems.
|
||||
require 'devise/orm/active_record'
|
||||
|
||||
# ==> Configuration for any authentication mechanism
|
||||
# Configure which keys are used when authenticating a user. The default is
|
||||
# just :email. You can configure it to use [:username, :subdomain], so for
|
||||
# authenticating a user, both parameters are required. Remember that those
|
||||
# parameters are used only when authenticating and not when retrieving from
|
||||
# session. If you need permissions, you should implement that in a before filter.
|
||||
# You can also supply a hash where the value is a boolean determining whether
|
||||
# or not authentication should be aborted when the value is not present.
|
||||
# config.authentication_keys = [:email]
|
||||
|
||||
# Configure parameters from the request object used for authentication. Each entry
|
||||
# given should be a request method and it will automatically be passed to the
|
||||
# find_for_authentication method and considered in your model lookup. For instance,
|
||||
# if you set :request_keys to [:subdomain], :subdomain will be used on authentication.
|
||||
# The same considerations mentioned for authentication_keys also apply to request_keys.
|
||||
# config.request_keys = []
|
||||
|
||||
# Configure which authentication keys should be case-insensitive.
|
||||
# These keys will be downcased upon creating or modifying a user and when used
|
||||
# to authenticate or find a user. Default is :email.
|
||||
config.case_insensitive_keys = [:email]
|
||||
|
||||
# Configure which authentication keys should have whitespace stripped.
|
||||
# These keys will have whitespace before and after removed upon creating or
|
||||
# modifying a user and when used to authenticate or find a user. Default is :email.
|
||||
config.strip_whitespace_keys = [:email]
|
||||
|
||||
# Tell if authentication through request.params is enabled. True by default.
|
||||
# It can be set to an array that will enable params authentication only for the
|
||||
# given strategies, for example, `config.params_authenticatable = [:database]` will
|
||||
# enable it only for database (email + password) authentication.
|
||||
# config.params_authenticatable = true
|
||||
|
||||
# Tell if authentication through HTTP Auth is enabled. False by default.
|
||||
# It can be set to an array that will enable http authentication only for the
|
||||
# given strategies, for example, `config.http_authenticatable = [:database]` will
|
||||
# enable it only for database authentication. The supported strategies are:
|
||||
# :database = Support basic authentication with authentication key + password
|
||||
# config.http_authenticatable = false
|
||||
|
||||
# If 401 status code should be returned for AJAX requests. True by default.
|
||||
# config.http_authenticatable_on_xhr = true
|
||||
|
||||
# The realm used in Http Basic Authentication. 'Application' by default.
|
||||
# config.http_authentication_realm = 'Application'
|
||||
|
||||
# It will change confirmation, password recovery and other workflows
|
||||
# to behave the same regardless if the e-mail provided was right or wrong.
|
||||
# Does not affect registerable.
|
||||
# config.paranoid = true
|
||||
|
||||
# By default Devise will store the user in session. You can skip storage for
|
||||
# particular strategies by setting this option.
|
||||
# Notice that if you are skipping storage for all authentication paths, you
|
||||
# may want to disable generating routes to Devise's sessions controller by
|
||||
# passing skip: :sessions to `devise_for` in your config/routes.rb
|
||||
config.skip_session_storage = [:http_auth]
|
||||
|
||||
# By default, Devise cleans up the CSRF token on authentication to
|
||||
# avoid CSRF token fixation attacks. This means that, when using AJAX
|
||||
# requests for sign in and sign up, you need to get a new CSRF token
|
||||
# from the server. You can disable this option at your own risk.
|
||||
# config.clean_up_csrf_token_on_authentication = true
|
||||
|
||||
# When false, Devise will not attempt to reload routes on eager load.
|
||||
# This can reduce the time taken to boot the app but if your application
|
||||
# requires the Devise mappings to be loaded during boot time the application
|
||||
# won't boot properly.
|
||||
# config.reload_routes = true
|
||||
|
||||
# ==> Configuration for :database_authenticatable
|
||||
# For bcrypt, this is the cost for hashing the password and defaults to 11. If
|
||||
# using other algorithms, it sets how many times you want the password to be hashed.
|
||||
#
|
||||
# Limiting the stretches to just one in testing will increase the performance of
|
||||
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
|
||||
# a value less than 10 in other environments. Note that, for bcrypt (the default
|
||||
# algorithm), the cost increases exponentially with the number of stretches (e.g.
|
||||
# a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation).
|
||||
config.stretches = Rails.env.test? ? 1 : 11
|
||||
|
||||
# Set up a pepper to generate the hashed password.
|
||||
# config.pepper = '476c6cafcbeb13c8862c8e11eebf80deb085775f2471c15d7e8c8bfe258874701f2f619f5feefdcf593575b2997847de25a6dc57a9838145136de1155e91dce7'
|
||||
|
||||
# Send a notification email when the user's password is changed
|
||||
# config.send_password_change_notification = false
|
||||
|
||||
# ==> Configuration for :confirmable
|
||||
# A period that the user is allowed to access the website even without
|
||||
# confirming their account. For instance, if set to 2.days, the user will be
|
||||
# able to access the website for two days without confirming their account,
|
||||
# access will be blocked just in the third day. Default is 0.days, meaning
|
||||
# the user cannot access the website without confirming their account.
|
||||
# config.allow_unconfirmed_access_for = 2.days
|
||||
|
||||
# A period that the user is allowed to confirm their account before their
|
||||
# token becomes invalid. For example, if set to 3.days, the user can confirm
|
||||
# their account within 3 days after the mail was sent, but on the fourth day
|
||||
# their account can't be confirmed with the token any more.
|
||||
# Default is nil, meaning there is no restriction on how long a user can take
|
||||
# before confirming their account.
|
||||
# config.confirm_within = 3.days
|
||||
|
||||
# If true, requires any email changes to be confirmed (exactly the same way as
|
||||
# initial account confirmation) to be applied. Requires additional unconfirmed_email
|
||||
# db field (see migrations). Until confirmed, new email is stored in
|
||||
# unconfirmed_email column, and copied to email column on successful confirmation.
|
||||
config.reconfirmable = true
|
||||
|
||||
# Defines which key will be used when confirming an account
|
||||
# config.confirmation_keys = [:email]
|
||||
|
||||
# ==> Configuration for :rememberable
|
||||
# The time the user will be remembered without asking for credentials again.
|
||||
# config.remember_for = 2.weeks
|
||||
|
||||
# Invalidates all the remember me tokens when the user signs out.
|
||||
config.expire_all_remember_me_on_sign_out = true
|
||||
|
||||
# If true, extends the user's remember period when remembered via cookie.
|
||||
# config.extend_remember_period = false
|
||||
|
||||
# Options to be passed to the created cookie. For instance, you can set
|
||||
# secure: true in order to force SSL only cookies.
|
||||
# config.rememberable_options = {}
|
||||
|
||||
# ==> Configuration for :validatable
|
||||
# Range for password length.
|
||||
config.password_length = 6..128
|
||||
|
||||
# Email regex used to validate email formats. It simply asserts that
|
||||
# one (and only one) @ exists in the given string. This is mainly
|
||||
# to give user feedback and not to assert the e-mail validity.
|
||||
config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
|
||||
|
||||
# ==> Configuration for :timeoutable
|
||||
# The time you want to timeout the user session without activity. After this
|
||||
# time the user will be asked for credentials again. Default is 30 minutes.
|
||||
# config.timeout_in = 30.minutes
|
||||
|
||||
# ==> Configuration for :lockable
|
||||
# Defines which strategy will be used to lock an account.
|
||||
# :failed_attempts = Locks an account after a number of failed attempts to sign in.
|
||||
# :none = No lock strategy. You should handle locking by yourself.
|
||||
# config.lock_strategy = :failed_attempts
|
||||
|
||||
# Defines which key will be used when locking and unlocking an account
|
||||
# config.unlock_keys = [:email]
|
||||
|
||||
# Defines which strategy will be used to unlock an account.
|
||||
# :email = Sends an unlock link to the user email
|
||||
# :time = Re-enables login after a certain amount of time (see :unlock_in below)
|
||||
# :both = Enables both strategies
|
||||
# :none = No unlock strategy. You should handle unlocking by yourself.
|
||||
# config.unlock_strategy = :both
|
||||
|
||||
# Number of authentication tries before locking an account if lock_strategy
|
||||
# is failed attempts.
|
||||
# config.maximum_attempts = 20
|
||||
|
||||
# Time interval to unlock the account if :time is enabled as unlock_strategy.
|
||||
# config.unlock_in = 1.hour
|
||||
|
||||
# Warn on the last attempt before the account is locked.
|
||||
# config.last_attempt_warning = true
|
||||
|
||||
# ==> Configuration for :recoverable
|
||||
#
|
||||
# Defines which key will be used when recovering the password for an account
|
||||
# config.reset_password_keys = [:email]
|
||||
|
||||
# Time interval you can reset your password with a reset password key.
|
||||
# Don't put a too small interval or your users won't have the time to
|
||||
# change their passwords.
|
||||
config.reset_password_within = 6.hours
|
||||
|
||||
# When set to false, does not sign a user in automatically after their password is
|
||||
# reset. Defaults to true, so a user is signed in automatically after a reset.
|
||||
# config.sign_in_after_reset_password = true
|
||||
|
||||
# ==> Configuration for :encryptable
|
||||
# Allow you to use another hashing or encryption algorithm besides bcrypt (default).
|
||||
# You can use :sha1, :sha512 or algorithms from others authentication tools as
|
||||
# :clearance_sha1, :authlogic_sha512 (then you should set stretches above to 20
|
||||
# for default behavior) and :restful_authentication_sha1 (then you should set
|
||||
# stretches to 10, and copy REST_AUTH_SITE_KEY to pepper).
|
||||
#
|
||||
# Require the `devise-encryptable` gem when using anything other than bcrypt
|
||||
# config.encryptor = :sha512
|
||||
|
||||
# ==> Scopes configuration
|
||||
# Turn scoped views on. Before rendering "sessions/new", it will first check for
|
||||
# "users/sessions/new". It's turned off by default because it's slower if you
|
||||
# are using only default views.
|
||||
config.scoped_views = true
|
||||
|
||||
# Configure the default scope given to Warden. By default it's the first
|
||||
# devise role declared in your routes (usually :user).
|
||||
config.default_scope = :user
|
||||
|
||||
# Set this configuration to false if you want /users/sign_out to sign out
|
||||
# only the current scope. By default, Devise signs out all scopes.
|
||||
config.sign_out_all_scopes = true
|
||||
|
||||
# ==> Navigation configuration
|
||||
# Lists the formats that should be treated as navigational. Formats like
|
||||
# :html, should redirect to the sign in page when the user does not have
|
||||
# access, but formats like :xml or :json, should return 401.
|
||||
#
|
||||
# If you have any extra navigational formats, like :iphone or :mobile, you
|
||||
# should add them to the navigational formats lists.
|
||||
#
|
||||
# The "*/*" below is required to match Internet Explorer requests.
|
||||
# config.navigational_formats = ['*/*', :html]
|
||||
|
||||
# The default HTTP method used to sign out a resource. Default is :delete.
|
||||
config.sign_out_via = :delete
|
||||
|
||||
# ==> OmniAuth
|
||||
# Add a new OmniAuth provider. Check the wiki for more information on setting
|
||||
# up on your models and hooks.
|
||||
# config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
|
||||
|
||||
# ==> Warden configuration
|
||||
# If you want to use other strategies, that are not supported by Devise, or
|
||||
# change the failure app, you can configure them inside the config.warden block.
|
||||
#
|
||||
# config.warden do |manager|
|
||||
# manager.intercept_401 = false
|
||||
# manager.default_strategies(scope: :user).unshift :some_external_strategy
|
||||
# end
|
||||
|
||||
# ==> Mountable engine configurations
|
||||
# When using Devise inside an engine, let's call it `MyEngine`, and this engine
|
||||
# is mountable, there are some extra configurations to be taken into account.
|
||||
# The following options are available, assuming the engine is mounted as:
|
||||
#
|
||||
# mount MyEngine, at: '/my_engine'
|
||||
#
|
||||
# The router that invoked `devise_for`, in the example above, would be:
|
||||
# config.router_name = :my_engine
|
||||
#
|
||||
# When using OmniAuth, Devise cannot automatically set OmniAuth path,
|
||||
# so you need to do it manually. For the users scope, it would be:
|
||||
# config.omniauth_path_prefix = '/my_engine/users/auth'
|
||||
end
|
||||
52
research/chatwoot/config/initializers/devise_token_auth.rb
Normal file
52
research/chatwoot/config/initializers/devise_token_auth.rb
Normal file
@@ -0,0 +1,52 @@
|
||||
DeviseTokenAuth.setup do |config|
|
||||
# By default the authorization headers will change after each request. The
|
||||
# client is responsible for keeping track of the changing tokens. Change
|
||||
# this to false to prevent the Authorization header from changing after
|
||||
# each request.
|
||||
config.change_headers_on_each_request = false
|
||||
|
||||
# By default, users will need to re-authenticate after 2 weeks. This setting
|
||||
# determines how long tokens will remain valid after they are issued.
|
||||
config.token_lifespan = 2.months
|
||||
|
||||
# By default, old tokens are not invalidated when password is changed.
|
||||
# Enable this option if you want to make passwords updates to logout other devices.
|
||||
config.remove_tokens_after_password_reset = true
|
||||
|
||||
# Sets the max number of concurrent devices per user, which is 10 by default.
|
||||
# After this limit is reached, the oldest tokens will be removed.
|
||||
config.max_number_of_devices = 25
|
||||
|
||||
# Sometimes it's necessary to make several requests to the API at the same
|
||||
# time. In this case, each request in the batch will need to share the same
|
||||
# auth token. This setting determines how far apart the requests can be while
|
||||
# still using the same auth token.
|
||||
# config.batch_request_buffer_throttle = 5.seconds
|
||||
|
||||
# This route will be the prefix for all oauth2 redirect callbacks. For
|
||||
# example, using the default '/omniauth', the github oauth2 provider will
|
||||
# redirect successful authentications to '/omniauth/github/callback'
|
||||
# config.omniauth_prefix = "/omniauth"
|
||||
|
||||
# By default sending current password is not needed for the password update.
|
||||
# Uncomment to enforce current_password param to be checked before all
|
||||
# attribute updates. Set it to :password if you want it to be checked only if
|
||||
# password is updated.
|
||||
# config.check_current_password_before_update = :attributes
|
||||
|
||||
# By default we will use callbacks for single omniauth.
|
||||
# It depends on fields like email, provider and uid.
|
||||
# config.default_callbacks = true
|
||||
|
||||
# Makes it possible to change the headers names
|
||||
# config.headers_names = {:'access-token' => 'access-token',
|
||||
# :'client' => 'client',
|
||||
# :'expiry' => 'expiry',
|
||||
# :'uid' => 'uid',
|
||||
# :'token-type' => 'token-type' }
|
||||
|
||||
# By default, only Bearer Token authentication is implemented out of the box.
|
||||
# If, however, you wish to integrate with legacy Devise authentication, you can
|
||||
# do so by enabling this flag. NOTE: This feature is highly experimental!
|
||||
# config.enable_standard_devise_support = false
|
||||
end
|
||||
6
research/chatwoot/config/initializers/event_handlers.rb
Normal file
6
research/chatwoot/config/initializers/event_handlers.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
Rails.application.configure do
|
||||
config.to_prepare do
|
||||
Rails.configuration.dispatcher = Dispatcher.instance
|
||||
Rails.configuration.dispatcher.load_listeners
|
||||
end
|
||||
end
|
||||
46
research/chatwoot/config/initializers/facebook_messenger.rb
Normal file
46
research/chatwoot/config/initializers/facebook_messenger.rb
Normal file
@@ -0,0 +1,46 @@
|
||||
# ref: https://github.com/jgorset/facebook-messenger#make-a-configuration-provider
|
||||
class ChatwootFbProvider < Facebook::Messenger::Configuration::Providers::Base
|
||||
def valid_verify_token?(_verify_token)
|
||||
GlobalConfigService.load('FB_VERIFY_TOKEN', '')
|
||||
end
|
||||
|
||||
def app_secret_for(_page_id)
|
||||
GlobalConfigService.load('FB_APP_SECRET', '')
|
||||
end
|
||||
|
||||
def access_token_for(page_id)
|
||||
Channel::FacebookPage.where(page_id: page_id).last.page_access_token
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def bot
|
||||
Chatwoot::Bot
|
||||
end
|
||||
end
|
||||
|
||||
Rails.application.reloader.to_prepare do
|
||||
Facebook::Messenger.configure do |config|
|
||||
config.provider = ChatwootFbProvider.new
|
||||
end
|
||||
|
||||
Facebook::Messenger::Bot.on :message do |message|
|
||||
Webhooks::FacebookEventsJob.perform_later(message.to_json)
|
||||
end
|
||||
|
||||
Facebook::Messenger::Bot.on :delivery do |delivery|
|
||||
Rails.logger.info "Recieved delivery status #{delivery.to_json}"
|
||||
Webhooks::FacebookDeliveryJob.perform_later(delivery.to_json)
|
||||
end
|
||||
|
||||
Facebook::Messenger::Bot.on :read do |read|
|
||||
Rails.logger.info "Recieved read status #{read.to_json}"
|
||||
Webhooks::FacebookDeliveryJob.perform_later(read.to_json)
|
||||
end
|
||||
|
||||
Facebook::Messenger::Bot.on :message_echo do |message|
|
||||
# Add delay to prevent race condition where echo arrives before send message API completes
|
||||
# This avoids duplicate messages when echo comes early during API processing
|
||||
Webhooks::FacebookEventsJob.set(wait: 2.seconds).perform_later(message.to_json)
|
||||
end
|
||||
end
|
||||
11
research/chatwoot/config/initializers/feature_policy.rb
Normal file
11
research/chatwoot/config/initializers/feature_policy.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
# Define an application-wide HTTP feature policy. For further
|
||||
# information see https://developers.google.com/web/updates/2018/06/feature-policy
|
||||
#
|
||||
# Rails.application.config.feature_policy do |f|
|
||||
# f.camera :none
|
||||
# f.gyroscope :none
|
||||
# f.microphone :none
|
||||
# f.usb :none
|
||||
# f.fullscreen :self
|
||||
# f.payment :self, "https://secure.example.com"
|
||||
# end
|
||||
@@ -0,0 +1,13 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Configure sensitive parameters which will be filtered from the log file.
|
||||
Rails.application.config.filter_parameters += [
|
||||
:password, :secret, :_key, :auth, :crypt, :salt, :certificate, :otp, :access, :private, :protected, :ssn,
|
||||
:otp_secret, :otp_code, :backup_code, :mfa_token, :otp_backup_codes
|
||||
]
|
||||
|
||||
# Regex to filter all occurrences of 'token' in keys except for 'website_token'
|
||||
filter_regex = /\A(?!.*\bwebsite_token\b).*token/i
|
||||
|
||||
# Apply the regex for filtering
|
||||
Rails.application.config.filter_parameters += [filter_regex]
|
||||
30
research/chatwoot/config/initializers/geocoder.rb
Normal file
30
research/chatwoot/config/initializers/geocoder.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
# Geocoding options
|
||||
# timeout: 3, # geocoding service timeout (secs)
|
||||
# lookup: :nominatim, # name of geocoding service (symbol)
|
||||
# ip_lookup: :ipinfo_io, # name of IP address geocoding service (symbol)
|
||||
# language: :en, # ISO-639 language code
|
||||
# use_https: false, # use HTTPS for lookup requests? (if supported)
|
||||
# http_proxy: nil, # HTTP proxy server (user:pass@host:port)
|
||||
# https_proxy: nil, # HTTPS proxy server (user:pass@host:port)
|
||||
# api_key: nil, # API key for geocoding service
|
||||
# cache: nil, # cache object (must respond to #[], #[]=, and #del)
|
||||
# cache_prefix: 'geocoder:', # prefix (string) to use for all cache keys
|
||||
|
||||
# Exceptions that should not be rescued by default
|
||||
# (if you want to implement custom error handling);
|
||||
# supports SocketError and Timeout::Error
|
||||
# always_raise: [],
|
||||
|
||||
# Calculation options
|
||||
# units: :mi, # :km for kilometers or :mi for miles
|
||||
# distances: :linear # :spherical or :linear
|
||||
|
||||
module GeocoderConfiguration
|
||||
LOOK_UP_DB = Rails.root.join('vendor/db/GeoLiteCity.mmdb')
|
||||
end
|
||||
|
||||
Geocoder.configure(ip_lookup: :geoip2, geoip2: { file: GeocoderConfiguration::LOOK_UP_DB }) if ENV['IP_LOOKUP_API_KEY'].present?
|
||||
|
||||
Rails.application.config.after_initialize do
|
||||
Geocoder::SetupService.new.perform
|
||||
end
|
||||
16
research/chatwoot/config/initializers/git_sha.rb
Normal file
16
research/chatwoot/config/initializers/git_sha.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
# Define a method to fetch the git commit hash
|
||||
def fetch_git_sha
|
||||
sha = `git rev-parse HEAD` if File.directory?('.git')
|
||||
if sha.present?
|
||||
sha.strip
|
||||
elsif File.exist?('.git_sha')
|
||||
File.read('.git_sha').strip
|
||||
# This is for Heroku. Ensure heroku labs:enable runtime-dyno-metadata is turned on.
|
||||
elsif ENV.fetch('HEROKU_SLUG_COMMIT', nil).present?
|
||||
ENV.fetch('HEROKU_SLUG_COMMIT', nil)
|
||||
else
|
||||
'unknown'
|
||||
end
|
||||
end
|
||||
|
||||
GIT_HASH = fetch_git_sha
|
||||
16
research/chatwoot/config/initializers/inflections.rb
Normal file
16
research/chatwoot/config/initializers/inflections.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Add new inflection rules using the following format. Inflections
|
||||
# are locale specific, and you may define rules for as many different
|
||||
# locales as you wish. All of these examples are active by default:
|
||||
# ActiveSupport::Inflector.inflections(:en) do |inflect|
|
||||
# inflect.plural /^(ox)$/i, '\1en'
|
||||
# inflect.singular /^(ox)en/i, '\1'
|
||||
# inflect.irregular 'person', 'people'
|
||||
# inflect.uncountable %w( fish sheep )
|
||||
# end
|
||||
|
||||
# These inflection rules are supported but not enabled by default:
|
||||
# ActiveSupport::Inflector.inflections(:en) do |inflect|
|
||||
# inflect.acronym 'RESTful'
|
||||
# end
|
||||
48
research/chatwoot/config/initializers/languages.rb
Normal file
48
research/chatwoot/config/initializers/languages.rb
Normal file
@@ -0,0 +1,48 @@
|
||||
# Based on ISO_639-3 Codes. ref: https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes
|
||||
# This Hash is used in account model, so do not change the index for existing languages
|
||||
|
||||
LANGUAGES_CONFIG = {
|
||||
0 => { name: 'English (en)', iso_639_3_code: 'eng', iso_639_1_code: 'en', enabled: true },
|
||||
1 => { name: 'العربية (ar)', iso_639_3_code: 'ara', iso_639_1_code: 'ar', enabled: true },
|
||||
2 => { name: 'Nederlands (nl) ', iso_639_3_code: 'nld', iso_639_1_code: 'nl', enabled: true },
|
||||
3 => { name: 'Français (fr)', iso_639_3_code: 'fra', iso_639_1_code: 'fr', enabled: true },
|
||||
4 => { name: 'Deutsch (de)', iso_639_3_code: 'deu', iso_639_1_code: 'de', enabled: true },
|
||||
5 => { name: 'हिन्दी (hi)', iso_639_3_code: 'hin', iso_639_1_code: 'hi', enabled: false },
|
||||
6 => { name: 'Italiano (it)', iso_639_3_code: 'ita', iso_639_1_code: 'it', enabled: true },
|
||||
7 => { name: '日本語 (ja)', iso_639_3_code: 'jpn', iso_639_1_code: 'ja', enabled: true },
|
||||
8 => { name: '한국어 (ko)', iso_639_3_code: 'kor', iso_639_1_code: 'ko', enabled: true },
|
||||
9 => { name: 'Português (pt)', iso_639_3_code: 'por', iso_639_1_code: 'pt', enabled: true },
|
||||
10 => { name: 'русский (ru)', iso_639_3_code: 'rus', iso_639_1_code: 'ru', enabled: true },
|
||||
11 => { name: '中文 (zh)', iso_639_3_code: 'zho', iso_639_1_code: 'zh', enabled: false },
|
||||
12 => { name: 'Español (es)', iso_639_3_code: 'spa', iso_639_1_code: 'es', enabled: true },
|
||||
13 => { name: 'മലയാളം (ml)', iso_639_3_code: 'mal', iso_639_1_code: 'ml', enabled: true },
|
||||
14 => { name: 'Català (ca)', iso_639_3_code: 'cat', iso_639_1_code: 'ca', enabled: true },
|
||||
15 => { name: 'ελληνικά (el)', iso_639_3_code: 'ell', iso_639_1_code: 'el', enabled: true },
|
||||
16 => { name: 'Português Brasileiro (pt-BR)', iso_639_3_code: '', iso_639_1_code: 'pt_BR', enabled: true },
|
||||
17 => { name: 'Română (ro)', iso_639_3_code: 'ron', iso_639_1_code: 'ro', enabled: true },
|
||||
18 => { name: 'தமிழ் (ta)', iso_639_3_code: 'tam', iso_639_1_code: 'ta', enabled: true },
|
||||
19 => { name: 'فارسی (fa)', iso_639_3_code: 'fas', iso_639_1_code: 'fa', enabled: true },
|
||||
20 => { name: '中文 (台湾) (zh-TW)', iso_639_3_code: 'zho', iso_639_1_code: 'zh_TW', enabled: true },
|
||||
21 => { name: 'Tiếng Việt (vi)', iso_639_3_code: 'vie', iso_639_1_code: 'vi', enabled: true },
|
||||
22 => { name: 'dansk (da)', iso_639_3_code: 'dan', iso_639_1_code: 'da', enabled: true },
|
||||
23 => { name: 'Türkçe (tr)', iso_639_3_code: 'tur', iso_639_1_code: 'tr', enabled: true },
|
||||
24 => { name: 'čeština (cs)', iso_639_3_code: 'ces', iso_639_1_code: 'cs', enabled: true },
|
||||
25 => { name: 'suomi, suomen kieli (fi)', iso_639_3_code: 'fin', iso_639_1_code: 'fi', enabled: true },
|
||||
26 => { name: 'Bahasa Indonesia (id)', iso_639_3_code: 'ind', iso_639_1_code: 'id', enabled: true },
|
||||
27 => { name: 'Svenska (sv)', iso_639_3_code: 'swe', iso_639_1_code: 'sv', enabled: true },
|
||||
28 => { name: 'magyar nyelv (hu)', iso_639_3_code: 'hun', iso_639_1_code: 'hu', enabled: true },
|
||||
29 => { name: 'norsk (no)', iso_639_3_code: 'nor', iso_639_1_code: 'no', enabled: true },
|
||||
30 => { name: '中文 (zh-CN)', iso_639_3_code: 'zho', iso_639_1_code: 'zh_CN', enabled: true },
|
||||
31 => { name: 'język polski (pl)', iso_639_3_code: 'pol', iso_639_1_code: 'pl', enabled: true },
|
||||
32 => { name: 'slovenčina (sk)', iso_639_3_code: 'slk', iso_639_1_code: 'sk', enabled: true },
|
||||
33 => { name: 'украї́нська мо́ва (uk)', iso_639_3_code: 'ukr', iso_639_1_code: 'uk', enabled: true },
|
||||
34 => { name: 'ภาษาไทย (th)', iso_639_3_code: 'tha', iso_639_1_code: 'th', enabled: true },
|
||||
35 => { name: 'latviešu valoda (lv)', iso_639_3_code: 'lav', iso_639_1_code: 'lv', enabled: true },
|
||||
36 => { name: 'íslenska (is)', iso_639_3_code: 'isl', iso_639_1_code: 'is', enabled: true },
|
||||
37 => { name: 'עִברִית (he)', iso_639_3_code: 'heb', iso_639_1_code: 'he', enabled: true },
|
||||
38 => { name: 'lietuvių (lt)', iso_639_3_code: 'lit', iso_639_1_code: 'lt', enabled: true },
|
||||
39 => { name: 'Српски (sr)', iso_639_3_code: 'srp', iso_639_1_code: 'sr', enabled: true },
|
||||
40 => { name: 'български (bg)', iso_639_3_code: 'bul', iso_639_1_code: 'bg', enabled: true }
|
||||
}.filter { |_key, val| val[:enabled] }.freeze
|
||||
|
||||
Rails.configuration.i18n.available_locales = LANGUAGES_CONFIG.map { |_index, lang| lang[:iso_639_1_code].to_sym }
|
||||
3
research/chatwoot/config/initializers/liquid_handler.rb
Normal file
3
research/chatwoot/config/initializers/liquid_handler.rb
Normal file
@@ -0,0 +1,3 @@
|
||||
require Rails.root.join('lib/action_view/template/handlers/liquid')
|
||||
|
||||
ActionView::Template.register_template_handler :liquid, ActionView::Template::Handlers::Liquid
|
||||
30
research/chatwoot/config/initializers/lograge.rb
Normal file
30
research/chatwoot/config/initializers/lograge.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('LOGRAGE_ENABLED', false)).present?
|
||||
require 'lograge'
|
||||
|
||||
Rails.application.configure do
|
||||
config.lograge.enabled = true
|
||||
config.lograge.formatter = Lograge::Formatters::Json.new
|
||||
config.lograge.custom_payload do |controller|
|
||||
# We only need user_id for API requests
|
||||
# might error out for other controller - ref: https://github.com/chatwoot/chatwoot/issues/6922
|
||||
user_id = controller&.try(:current_user)&.id if controller.is_a?(Api::BaseController) && controller&.try(:current_user).is_a?(User)
|
||||
{
|
||||
host: controller.request.host,
|
||||
remote_ip: controller.request.remote_ip,
|
||||
user_id: user_id
|
||||
}
|
||||
end
|
||||
|
||||
config.lograge.custom_options = lambda do |event|
|
||||
param_exceptions = %w[controller action format id]
|
||||
{
|
||||
params: event.payload[:params]&.except(*param_exceptions)
|
||||
}
|
||||
end
|
||||
|
||||
config.lograge.ignore_custom = lambda do |event|
|
||||
# ignore update_presence events in log
|
||||
return true if event.payload[:channel_class] == 'RoomChannel'
|
||||
end
|
||||
end
|
||||
end
|
||||
54
research/chatwoot/config/initializers/mailer.rb
Normal file
54
research/chatwoot/config/initializers/mailer.rb
Normal file
@@ -0,0 +1,54 @@
|
||||
Rails.application.configure do
|
||||
#########################################
|
||||
# Configuration Related to Action Mailer
|
||||
#########################################
|
||||
|
||||
# We need the application frontend url to be used in our emails
|
||||
config.action_mailer.default_url_options = { host: ENV['FRONTEND_URL'] } if ENV['FRONTEND_URL'].present?
|
||||
# We load certain mailer templates from our database. This ensures changes to it is reflected immediately
|
||||
config.action_mailer.perform_caching = false
|
||||
config.action_mailer.perform_deliveries = true
|
||||
config.action_mailer.raise_delivery_errors = true
|
||||
|
||||
# Config related to smtp
|
||||
smtp_settings = {
|
||||
address: ENV.fetch('SMTP_ADDRESS', 'localhost'),
|
||||
port: ENV.fetch('SMTP_PORT', 587)
|
||||
}
|
||||
|
||||
smtp_settings[:authentication] = ENV.fetch('SMTP_AUTHENTICATION', 'login').to_sym if ENV['SMTP_AUTHENTICATION'].present?
|
||||
smtp_settings[:domain] = ENV['SMTP_DOMAIN'] if ENV['SMTP_DOMAIN'].present?
|
||||
smtp_settings[:user_name] = ENV.fetch('SMTP_USERNAME', nil)
|
||||
smtp_settings[:password] = ENV.fetch('SMTP_PASSWORD', nil)
|
||||
smtp_settings[:enable_starttls_auto] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_ENABLE_STARTTLS_AUTO', true))
|
||||
smtp_settings[:openssl_verify_mode] = ENV['SMTP_OPENSSL_VERIFY_MODE'] if ENV['SMTP_OPENSSL_VERIFY_MODE'].present?
|
||||
smtp_settings[:ssl] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_SSL', true)) if ENV['SMTP_SSL']
|
||||
smtp_settings[:tls] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_TLS', true)) if ENV['SMTP_TLS']
|
||||
smtp_settings[:open_timeout] = ENV['SMTP_OPEN_TIMEOUT'].to_i if ENV['SMTP_OPEN_TIMEOUT'].present?
|
||||
smtp_settings[:read_timeout] = ENV['SMTP_READ_TIMEOUT'].to_i if ENV['SMTP_READ_TIMEOUT'].present?
|
||||
|
||||
config.action_mailer.delivery_method = :smtp unless Rails.env.test?
|
||||
config.action_mailer.smtp_settings = smtp_settings
|
||||
|
||||
# Use sendmail if using postfix for email
|
||||
config.action_mailer.delivery_method = :sendmail if ENV['SMTP_ADDRESS'].blank?
|
||||
|
||||
# You can use letter opener for your local development by setting the environment variable
|
||||
config.action_mailer.delivery_method = :letter_opener if Rails.env.development? && ENV['LETTER_OPENER']
|
||||
|
||||
#########################################
|
||||
# Configuration Related to Action MailBox
|
||||
#########################################
|
||||
|
||||
# Set this to appropriate ingress service for which the options are :
|
||||
# :relay for Exim, Postfix, Qmail
|
||||
# :mailgun for Mailgun
|
||||
# :mandrill for Mandrill
|
||||
# :postmark for Postmark
|
||||
# :sendgrid for Sendgrid
|
||||
# :ses for Amazon SES
|
||||
config.action_mailbox.ingress = ENV.fetch('RAILS_INBOUND_EMAIL_SERVICE', 'relay').to_sym
|
||||
|
||||
# Amazon SES ActionMailbox configuration
|
||||
config.action_mailbox.ses.subscribed_topic = ENV['ACTION_MAILBOX_SES_SNS_TOPIC'] if ENV['ACTION_MAILBOX_SES_SNS_TOPIC'].present?
|
||||
end
|
||||
4
research/chatwoot/config/initializers/mime_types.rb
Normal file
4
research/chatwoot/config/initializers/mime_types.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Add new mime types for use in respond_to blocks:
|
||||
# Mime::Type.register "text/richtext", :rtf
|
||||
21
research/chatwoot/config/initializers/monkey_patches/chat.rb
Normal file
21
research/chatwoot/config/initializers/monkey_patches/chat.rb
Normal file
@@ -0,0 +1,21 @@
|
||||
module Slack
|
||||
module Web
|
||||
module Api
|
||||
module Endpoints
|
||||
module Chat
|
||||
# TODO: Remove this monkey patch when PR for this issue https://github.com/slack-ruby/slack-ruby-client/issues/388 is merged
|
||||
def chat_unfurl(options = {})
|
||||
if (options[:channel].nil? || options[:ts].nil?) && (options[:unfurl_id].nil? || options[:source].nil?)
|
||||
raise ArgumentError, 'Either a combination of :channel and :ts or :unfurl_id and :source is required'
|
||||
end
|
||||
|
||||
raise ArgumentError, 'Required arguments :unfurls missing' if options[:unfurls].nil?
|
||||
|
||||
options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
|
||||
post('chat.unfurl', options)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,29 @@
|
||||
# When working with experimental extensions, which doesn't have support on all providers
|
||||
# This monkey patch will help us to ignore the extensions when dumping the schema
|
||||
# Additionally we will also ignore the tables associated with those features and exentions
|
||||
|
||||
# Once the feature stabilizes, we can remove the tables/extension from the ignore list
|
||||
# Ensure you write appropriate migrations when you do that.
|
||||
|
||||
module ActiveRecord
|
||||
module ConnectionAdapters
|
||||
module PostgreSQL
|
||||
class SchemaDumper < ConnectionAdapters::SchemaDumper
|
||||
cattr_accessor :ignore_extentions, default: []
|
||||
|
||||
private
|
||||
|
||||
def extensions(stream)
|
||||
extensions = @connection.extensions
|
||||
return unless extensions.any?
|
||||
|
||||
stream.puts ' # These extensions should be enabled to support this database'
|
||||
extensions.sort.each do |extension|
|
||||
stream.puts " enable_extension #{extension.inspect}" unless ignore_extentions.include?(extension)
|
||||
end
|
||||
stream.puts
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
9
research/chatwoot/config/initializers/omniauth.rb
Normal file
9
research/chatwoot/config/initializers/omniauth.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
# OmniAuth configuration
|
||||
# Sets the full host URL for callbacks and proper redirect handling
|
||||
OmniAuth.config.full_host = ENV.fetch('FRONTEND_URL', 'http://localhost:3000')
|
||||
|
||||
Rails.application.config.middleware.use OmniAuth::Builder do
|
||||
provider :google_oauth2, ENV.fetch('GOOGLE_OAUTH_CLIENT_ID', nil), ENV.fetch('GOOGLE_OAUTH_CLIENT_SECRET', nil), {
|
||||
provider_ignores_state: true
|
||||
}
|
||||
end
|
||||
11
research/chatwoot/config/initializers/permissions_policy.rb
Normal file
11
research/chatwoot/config/initializers/permissions_policy.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
# Define an application-wide HTTP permissions policy. For further
|
||||
# information see https://developers.google.com/web/updates/2018/06/feature-policy
|
||||
#
|
||||
# Rails.application.config.permissions_policy do |f|
|
||||
# f.camera :none
|
||||
# f.gyroscope :none
|
||||
# f.microphone :none
|
||||
# f.usb :none
|
||||
# f.fullscreen :self
|
||||
# f.payment :self, "https://secure.example.com"
|
||||
# end
|
||||
267
research/chatwoot/config/initializers/rack_attack.rb
Normal file
267
research/chatwoot/config/initializers/rack_attack.rb
Normal file
@@ -0,0 +1,267 @@
|
||||
class Rack::Attack
|
||||
### Configure Cache ###
|
||||
|
||||
# If you don't want to use Rails.cache (Rack::Attack's default), then
|
||||
# configure it here.
|
||||
#
|
||||
# Note: The store is only used for throttling (not blocklisting and
|
||||
# safelisting). It must implement .increment and .write like
|
||||
# ActiveSupport::Cache::Store
|
||||
|
||||
# Rack::Attack.cache.store = ActiveSupport::Cache::MemoryStore.new
|
||||
|
||||
# https://github.com/rack/rack-attack/issues/102
|
||||
# Rails 7.1 automatically adds its own ConnectionPool around RedisCacheStore.
|
||||
# Because `$velma` is *already* a ConnectionPool, double-wrapping causes
|
||||
# Redis calls like `get` to hit the outer wrapper and explode.
|
||||
# `pool: false` tells Rails to skip its internal pool and use ours directly.
|
||||
# TODO: We can use build in connection pool in future upgrade
|
||||
Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new(redis: $velma, pool: false)
|
||||
|
||||
class Request < ::Rack::Request
|
||||
# You many need to specify a method to fetch the correct remote IP address
|
||||
# if the web server is behind a load balancer.
|
||||
def remote_ip
|
||||
@remote_ip ||= (env['action_dispatch.remote_ip'] || ip).to_s
|
||||
end
|
||||
|
||||
def allowed_ip?
|
||||
default_allowed_ips = ['127.0.0.1', '::1']
|
||||
env_allowed_ips = ENV.fetch('RACK_ATTACK_ALLOWED_IPS', '').split(',').map(&:strip)
|
||||
(default_allowed_ips + env_allowed_ips).include?(remote_ip)
|
||||
end
|
||||
|
||||
# Rails would allow requests to paths with extentions, so lets compare against the path with extention stripped
|
||||
# example /auth & /auth.json would both work
|
||||
def path_without_extentions
|
||||
path[/^[^.]+/]
|
||||
end
|
||||
end
|
||||
|
||||
### Safelist IPs from Environment Variable ###
|
||||
#
|
||||
# This block ensures requests from any IP present in RACK_ATTACK_ALLOWED_IPS
|
||||
# will bypass Rack::Attack’s throttling rules.
|
||||
#
|
||||
# Example: RACK_ATTACK_ALLOWED_IPS="127.0.0.1,::1,192.168.0.10"
|
||||
|
||||
Rack::Attack.safelist('trusted IPs', &:allowed_ip?)
|
||||
|
||||
# Safelist health check endpoint so it never touches Redis for throttle tracking.
|
||||
# This keeps /health fully dependency-free for ALB liveness checks.
|
||||
Rack::Attack.safelist('health check') do |req|
|
||||
req.path == '/health'
|
||||
end
|
||||
|
||||
### Throttle Spammy Clients ###
|
||||
|
||||
# If any single client IP is making tons of requests, then they're
|
||||
# probably malicious or a poorly-configured scraper. Either way, they
|
||||
# don't deserve to hog all of the app server's CPU. Cut them off!
|
||||
#
|
||||
# Note: If you're serving assets through rack, those requests may be
|
||||
# counted by rack-attack and this throttle may be activated too
|
||||
# quickly. If so, enable the condition to exclude them from tracking.
|
||||
|
||||
# Throttle all requests by IP (60rpm)
|
||||
#
|
||||
# Key: "rack::attack:#{Time.now.to_i/:period}:req/ip:#{req.ip}"
|
||||
|
||||
throttle('req/ip', limit: ENV.fetch('RACK_ATTACK_LIMIT', '3000').to_i, period: 1.minute, &:ip)
|
||||
|
||||
###-----------------------------------------------###
|
||||
###-----Authentication Related Throttling---------###
|
||||
###-----------------------------------------------###
|
||||
|
||||
### Prevent Brute-Force Super Admin Login Attacks ###
|
||||
throttle('super_admin_login/ip', limit: 5, period: 5.minutes) do |req|
|
||||
req.ip if req.path_without_extentions == '/super_admin/sign_in' && req.post?
|
||||
end
|
||||
|
||||
throttle('super_admin_login/email', limit: 5, period: 15.minutes) do |req|
|
||||
if req.path_without_extentions == '/super_admin/sign_in' && req.post?
|
||||
# NOTE: This line used to throw ArgumentError /rails/action_mailbox/sendgrid/inbound_emails : invalid byte sequence in UTF-8
|
||||
# Hence placed in the if block
|
||||
# ref: https://github.com/rack/rack-attack/issues/399
|
||||
email = req.params['email'].presence || ActionDispatch::Request.new(req.env).params['email'].presence
|
||||
email.to_s.downcase.gsub(/\s+/, '')
|
||||
end
|
||||
end
|
||||
|
||||
# ### Prevent Brute-Force Login Attacks ###
|
||||
# Exclude MFA verification attempts from regular login throttling
|
||||
throttle('login/ip', limit: 5, period: 5.minutes) do |req|
|
||||
if req.path_without_extentions == '/auth/sign_in' && req.post? && req.params['mfa_token'].blank?
|
||||
# Skip if this is an MFA verification request
|
||||
req.ip
|
||||
end
|
||||
end
|
||||
|
||||
throttle('login/email', limit: 10, period: 15.minutes) do |req|
|
||||
# Skip if this is an MFA verification request
|
||||
if req.path_without_extentions == '/auth/sign_in' && req.post? && req.params['mfa_token'].blank?
|
||||
# ref: https://github.com/rack/rack-attack/issues/399
|
||||
# NOTE: This line used to throw ArgumentError /rails/action_mailbox/sendgrid/inbound_emails : invalid byte sequence in UTF-8
|
||||
# Hence placed in the if block
|
||||
email = req.params['email'].presence || ActionDispatch::Request.new(req.env).params['email'].presence
|
||||
email.to_s.downcase.gsub(/\s+/, '')
|
||||
end
|
||||
end
|
||||
|
||||
## Reset password throttling
|
||||
throttle('reset_password/ip', limit: 5, period: 30.minutes) do |req|
|
||||
req.ip if req.path_without_extentions == '/auth/password' && req.post?
|
||||
end
|
||||
|
||||
throttle('reset_password/email', limit: 5, period: 1.hour) do |req|
|
||||
if req.path_without_extentions == '/auth/password' && req.post?
|
||||
email = req.params['email'].presence || ActionDispatch::Request.new(req.env).params['email'].presence
|
||||
email.to_s.downcase.gsub(/\s+/, '')
|
||||
end
|
||||
end
|
||||
|
||||
## Resend confirmation throttling
|
||||
throttle('resend_confirmation/ip', limit: 5, period: 30.minutes) do |req|
|
||||
req.ip if req.path_without_extentions == '/api/v1/profile/resend_confirmation' && req.post?
|
||||
end
|
||||
|
||||
## MFA throttling - prevent brute force attacks
|
||||
throttle('mfa_verification/ip', limit: 5, period: 1.minute) do |req|
|
||||
if req.path_without_extentions == '/api/v1/profile/mfa'
|
||||
req.ip if req.delete? # Throttle disable attempts
|
||||
elsif req.path_without_extentions.match?(%r{/api/v1/profile/mfa/(verify|backup_codes)})
|
||||
req.ip if req.post? # Throttle verify and backup_codes attempts
|
||||
end
|
||||
end
|
||||
|
||||
# Separate rate limiting for MFA verification attempts
|
||||
throttle('mfa_login/ip', limit: 10, period: 1.minute) do |req|
|
||||
req.ip if req.path_without_extentions == '/auth/sign_in' && req.post? && req.params['mfa_token'].present?
|
||||
end
|
||||
|
||||
throttle('mfa_login/token', limit: 10, period: 1.minute) do |req|
|
||||
if req.path_without_extentions == '/auth/sign_in' && req.post?
|
||||
# Track by MFA token to prevent brute force on a specific token
|
||||
mfa_token = req.params['mfa_token'].presence
|
||||
(mfa_token.presence)
|
||||
end
|
||||
end
|
||||
|
||||
## Prevent Brute-Force Signup Attacks ###
|
||||
throttle('accounts/ip', limit: 5, period: 30.minutes) do |req|
|
||||
req.ip if req.path_without_extentions == '/api/v1/accounts' && req.post?
|
||||
end
|
||||
|
||||
##-----------------------------------------------##
|
||||
|
||||
###-----------------------------------------------###
|
||||
###-----------Widget API Throttling---------------###
|
||||
###-----------------------------------------------###
|
||||
|
||||
# Rack attack on widget APIs can be disabled by setting ENABLE_RACK_ATTACK_WIDGET_API to false
|
||||
# For clients using the widgets in specific conditions like inside and iframe
|
||||
# TODO: Deprecate this feature in future after finding a better solution
|
||||
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('ENABLE_RACK_ATTACK_WIDGET_API', true))
|
||||
## Prevent Conversation Bombing on Widget APIs ###
|
||||
throttle('api/v1/widget/conversations', limit: 6, period: 12.hours) do |req|
|
||||
req.ip if req.path_without_extentions == '/api/v1/widget/conversations' && req.post?
|
||||
end
|
||||
|
||||
## Prevent Contact update Bombing in Widget API ###
|
||||
throttle('api/v1/widget/contacts', limit: 60, period: 1.hour) do |req|
|
||||
req.ip if req.path_without_extentions == '/api/v1/widget/contacts' && (req.patch? || req.put?)
|
||||
end
|
||||
|
||||
## Prevent Conversation Bombing through multiple sessions
|
||||
throttle('widget?website_token={website_token}&cw_conversation={x-auth-token}', limit: 5, period: 1.hour) do |req|
|
||||
req.ip if req.path_without_extentions == '/widget' && ActionDispatch::Request.new(req.env).params['cw_conversation'].blank?
|
||||
end
|
||||
end
|
||||
|
||||
##-----------------------------------------------##
|
||||
|
||||
###-----------------------------------------------###
|
||||
###----------Application API Throttling-----------###
|
||||
###-----------------------------------------------###
|
||||
|
||||
## Prevent Abuse of Converstion Transcript APIs ###
|
||||
throttle('/api/v1/accounts/:account_id/conversations/:conversation_id/transcript', limit: 30, period: 1.hour) do |req|
|
||||
match_data = %r{/api/v1/accounts/(?<account_id>\d+)/conversations/(?<conversation_id>\d+)/transcript}.match(req.path)
|
||||
match_data[:account_id] if match_data.present?
|
||||
end
|
||||
|
||||
## Prevent Abuse of attachment upload APIs ##
|
||||
throttle('/api/v1/accounts/:account_id/upload', limit: 60, period: 1.hour) do |req|
|
||||
match_data = %r{/api/v1/accounts/(?<account_id>\d+)/upload}.match(req.path)
|
||||
match_data[:account_id] if match_data.present?
|
||||
end
|
||||
|
||||
## Prevent abuse of contact search api
|
||||
throttle('/api/v1/accounts/:account_id/contacts/search', limit: ENV.fetch('RATE_LIMIT_CONTACT_SEARCH', '100').to_i, period: 1.minute) do |req|
|
||||
match_data = %r{/api/v1/accounts/(?<account_id>\d+)/contacts/search}.match(req.path)
|
||||
match_data[:account_id] if match_data.present?
|
||||
end
|
||||
|
||||
# Throttle by individual user (based on uid)
|
||||
throttle('/api/v2/accounts/:account_id/reports/user', limit: ENV.fetch('RATE_LIMIT_REPORTS_API_USER_LEVEL', '100').to_i, period: 1.minute) do |req|
|
||||
match_data = %r{/api/v2/accounts/(?<account_id>\d+)/reports}.match(req.path)
|
||||
# Extract user identification (uid for web, api_access_token for API requests)
|
||||
user_uid = req.get_header('HTTP_UID')
|
||||
api_access_token = req.get_header('HTTP_API_ACCESS_TOKEN') || req.get_header('api_access_token')
|
||||
|
||||
# Use uid if present, otherwise fallback to api_access_token for tracking
|
||||
user_identifier = user_uid.presence || api_access_token.presence
|
||||
|
||||
"#{user_identifier}:#{match_data[:account_id]}" if match_data.present? && user_identifier.present?
|
||||
end
|
||||
|
||||
## Prevent abuse of reports api at account level
|
||||
throttle('/api/v2/accounts/:account_id/reports', limit: ENV.fetch('RATE_LIMIT_REPORTS_API_ACCOUNT_LEVEL', '1000').to_i, period: 1.minute) do |req|
|
||||
match_data = %r{/api/v2/accounts/(?<account_id>\d+)/reports}.match(req.path)
|
||||
match_data[:account_id] if match_data.present?
|
||||
end
|
||||
|
||||
## Prevent increased use of conversations meta API per user
|
||||
throttle('/api/v1/accounts/:account_id/conversations/meta/user',
|
||||
limit: ENV.fetch('RATE_LIMIT_CONVERSATIONS_META', '30').to_i, period: 1.minute) do |req|
|
||||
match_data = %r{/api/v1/accounts/(?<account_id>\d+)/conversations/meta}.match(req.path)
|
||||
next unless match_data.present? && req.get?
|
||||
|
||||
user_uid = req.get_header('HTTP_UID')
|
||||
api_access_token = req.get_header('HTTP_API_ACCESS_TOKEN') || req.get_header('api_access_token')
|
||||
user_identifier = user_uid.presence || api_access_token.presence
|
||||
|
||||
"#{user_identifier}:#{match_data[:account_id]}" if user_identifier.present?
|
||||
end
|
||||
|
||||
## ----------------------------------------------- ##
|
||||
end
|
||||
|
||||
# Log blocked events
|
||||
ActiveSupport::Notifications.subscribe('throttle.rack_attack') do |_name, _start, _finish, _request_id, payload|
|
||||
req = payload[:request]
|
||||
|
||||
user_uid = req.get_header('HTTP_UID')
|
||||
api_access_token = req.get_header('HTTP_API_ACCESS_TOKEN') || req.get_header('api_access_token')
|
||||
|
||||
# Mask the token if present
|
||||
masked_api_token = api_access_token.present? ? "#{api_access_token[0..4]}...[REDACTED]" : nil
|
||||
|
||||
# Use uid if present, otherwise fallback to masked api_access_token for tracking
|
||||
user_identifier = user_uid.presence || masked_api_token.presence || 'unknown_user'
|
||||
|
||||
# Extract account ID if present
|
||||
account_match = %r{/accounts/(?<account_id>\d+)}.match(req.path)
|
||||
account_id = account_match ? account_match[:account_id] : 'unknown_account'
|
||||
|
||||
Rails.logger.warn(
|
||||
"[Rack::Attack][Blocked] remote_ip: \"#{req.remote_ip}\", " \
|
||||
"path: \"#{req.path}\", " \
|
||||
"user_identifier: \"#{user_identifier}\", " \
|
||||
"account_id: \"#{account_id}\", " \
|
||||
"method: \"#{req.request_method}\", " \
|
||||
"user_agent: \"#{req.user_agent}\""
|
||||
)
|
||||
end
|
||||
|
||||
Rack::Attack.enabled = Rails.env.production? ? ActiveModel::Type::Boolean.new.cast(ENV.fetch('ENABLE_RACK_ATTACK', true)) : false
|
||||
8
research/chatwoot/config/initializers/rack_profiler.rb
Normal file
8
research/chatwoot/config/initializers/rack_profiler.rb
Normal file
@@ -0,0 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
if Rails.env.development? && ENV['DISABLE_MINI_PROFILER'].blank?
|
||||
require 'rack-mini-profiler'
|
||||
|
||||
# initialization is skipped so trigger it
|
||||
Rack::MiniProfilerRails.initialize!(Rails.application)
|
||||
end
|
||||
6
research/chatwoot/config/initializers/rack_timeout.rb
Normal file
6
research/chatwoot/config/initializers/rack_timeout.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
require 'rack-timeout'
|
||||
|
||||
# Reduce noise by filtering state=ready and state=completed which are logged at INFO level
|
||||
Rails.application.config.after_initialize do
|
||||
Rack::Timeout::Logger.level = Logger::ERROR
|
||||
end
|
||||
14
research/chatwoot/config/initializers/searchkick.rb
Normal file
14
research/chatwoot/config/initializers/searchkick.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
Searchkick.queue_name = :async_database_migration if ENV.fetch('OPENSEARCH_URL', '').present?
|
||||
|
||||
access_key_id = ENV.fetch('OPENSEARCH_AWS_ACCESS_KEY_ID', '')
|
||||
secret_access_key = ENV.fetch('OPENSEARCH_AWS_SECRET_ACCESS_KEY', '')
|
||||
|
||||
if access_key_id.present? && secret_access_key.present?
|
||||
region = ENV.fetch('OPENSEARCH_AWS_REGION', 'us-east-1')
|
||||
|
||||
Searchkick.aws_credentials = {
|
||||
access_key_id: access_key_id,
|
||||
secret_access_key: secret_access_key,
|
||||
region: region
|
||||
}
|
||||
end
|
||||
44
research/chatwoot/config/initializers/secure_password.rb
Normal file
44
research/chatwoot/config/initializers/secure_password.rb
Normal file
@@ -0,0 +1,44 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
Devise.setup do |config|
|
||||
# ==> Configuration for the Devise Secure Password extension
|
||||
# Module: password_has_required_content
|
||||
#
|
||||
# Configure password content requirements including the number of uppercase,
|
||||
# lowercase, number, and special characters that are required. To configure the
|
||||
# minimum and maximum length refer to the Devise config.password_length
|
||||
# standard configuration parameter.
|
||||
|
||||
# The number of uppercase letters (latin A-Z) required in a password:
|
||||
config.password_required_uppercase_count = 1
|
||||
|
||||
# The number of lowercase letters (latin A-Z) required in a password:
|
||||
config.password_required_lowercase_count = 1
|
||||
|
||||
# The number of numbers (0-9) required in a password:
|
||||
config.password_required_number_count = 1
|
||||
|
||||
# The number of special characters (!@#$%^&*()_+-=[]{}|') required in a password:
|
||||
config.password_required_special_character_count = 1
|
||||
|
||||
# we are not using the configurations below
|
||||
# ==> Configuration for the Devise Secure Password extension
|
||||
# Module: password_disallows_frequent_reuse
|
||||
#
|
||||
# The number of previously used passwords that can not be reused:
|
||||
# config.password_previously_used_count = 8
|
||||
|
||||
# ==> Configuration for the Devise Secure Password extension
|
||||
# Module: password_disallows_frequent_changes
|
||||
# *Requires* password_disallows_frequent_reuse
|
||||
#
|
||||
# The minimum time that must pass between password changes:
|
||||
# config.password_minimum_age = 1.days
|
||||
|
||||
# ==> Configuration for the Devise Secure Password extension
|
||||
# Module: password_requires_regular_updates
|
||||
# *Requires* password_disallows_frequent_reuse
|
||||
#
|
||||
# The maximum allowed age of a password:
|
||||
# config.password_maximum_age = 180.days
|
||||
end
|
||||
15
research/chatwoot/config/initializers/sentry.rb
Normal file
15
research/chatwoot/config/initializers/sentry.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
if ENV['SENTRY_DSN'].present?
|
||||
Sentry.init do |config|
|
||||
config.dsn = ENV['SENTRY_DSN']
|
||||
config.enabled_environments = %w[staging production]
|
||||
|
||||
# To activate performance monitoring, set one of these options.
|
||||
# We recommend adjusting the value in production:
|
||||
config.traces_sample_rate = 0.1 if ENV['ENABLE_SENTRY_TRANSACTIONS']
|
||||
|
||||
config.excluded_exceptions += ['Rack::Timeout::RequestTimeoutException']
|
||||
|
||||
# to track post data in sentry
|
||||
config.send_default_pii = true unless ENV['DISABLE_SENTRY_PII']
|
||||
end
|
||||
end
|
||||
3
research/chatwoot/config/initializers/session_store.rb
Normal file
3
research/chatwoot/config/initializers/session_store.rb
Normal file
@@ -0,0 +1,3 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
Rails.application.config.session_store :cookie_store, key: '_chatwoot_session', same_site: :lax
|
||||
38
research/chatwoot/config/initializers/sidekiq.rb
Normal file
38
research/chatwoot/config/initializers/sidekiq.rb
Normal file
@@ -0,0 +1,38 @@
|
||||
require Rails.root.join('lib/redis/config')
|
||||
|
||||
schedule_file = 'config/schedule.yml'
|
||||
|
||||
Sidekiq.configure_client do |config|
|
||||
config.redis = Redis::Config.app
|
||||
end
|
||||
|
||||
# Logs whenever a job is pulled off Redis for execution.
|
||||
class ChatwootDequeuedLogger
|
||||
def call(_worker, job, queue)
|
||||
payload = job['args'].first
|
||||
Sidekiq.logger.info("Dequeued #{job['wrapped']} #{payload['job_id']} from #{queue}")
|
||||
yield
|
||||
end
|
||||
end
|
||||
|
||||
Sidekiq.configure_server do |config|
|
||||
config.redis = Redis::Config.app
|
||||
|
||||
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('ENABLE_SIDEKIQ_DEQUEUE_LOGGER', false))
|
||||
config.server_middleware do |chain|
|
||||
chain.add ChatwootDequeuedLogger
|
||||
end
|
||||
end
|
||||
|
||||
# skip the default start stop logging
|
||||
if Rails.env.production?
|
||||
config.logger.formatter = Sidekiq::Logger::Formatters::JSON.new
|
||||
config[:skip_default_job_logging] = true
|
||||
config.logger.level = Logger.const_get(ENV.fetch('LOG_LEVEL', 'info').upcase.to_s)
|
||||
end
|
||||
end
|
||||
|
||||
# https://github.com/ondrejbartas/sidekiq-cron
|
||||
Rails.application.reloader.to_prepare do
|
||||
Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file) if File.exist?(schedule_file) && Sidekiq.server?
|
||||
end
|
||||
3
research/chatwoot/config/initializers/stripe.rb
Normal file
3
research/chatwoot/config/initializers/stripe.rb
Normal file
@@ -0,0 +1,3 @@
|
||||
require 'stripe'
|
||||
|
||||
Stripe.api_key = ENV.fetch('STRIPE_SECRET_KEY', nil)
|
||||
11
research/chatwoot/config/initializers/warden_hooks.rb
Normal file
11
research/chatwoot/config/initializers/warden_hooks.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
Warden::Manager.after_set_user do |user, auth, opts|
|
||||
scope = opts[:scope]
|
||||
auth.cookies.signed["#{scope}.id"] = user.id
|
||||
auth.cookies.signed["#{scope}.expires_at"] = 30.minutes.from_now
|
||||
end
|
||||
|
||||
Warden::Manager.before_logout do |_user, auth, opts|
|
||||
scope = opts[:scope]
|
||||
auth.cookies.signed["#{scope}.id"] = nil
|
||||
auth.cookies.signed["#{scope}.expires_at"] = nil
|
||||
end
|
||||
14
research/chatwoot/config/initializers/wrap_parameters.rb
Normal file
14
research/chatwoot/config/initializers/wrap_parameters.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# This file contains settings for ActionController::ParamsWrapper which
|
||||
# is enabled by default.
|
||||
|
||||
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
|
||||
ActiveSupport.on_load(:action_controller) do
|
||||
wrap_parameters format: [:json]
|
||||
end
|
||||
|
||||
# To enable root element in JSON for ActiveRecord objects.
|
||||
# ActiveSupport.on_load(:active_record) do
|
||||
# self.include_root_in_json = true
|
||||
# end
|
||||
527
research/chatwoot/config/installation_config.yml
Normal file
527
research/chatwoot/config/installation_config.yml
Normal file
@@ -0,0 +1,527 @@
|
||||
# This file contains all the installation wide configuration which controls various settings in Chatwoot
|
||||
# This is internal config and should not be modified by the user directly in database
|
||||
# Chatwoot might override and modify these values during the upgrade process
|
||||
# Configs which can be modified by the user are available in the dashboard under appropriate UI
|
||||
#
|
||||
# name: the name of the config referenced in the code
|
||||
# value: the value of the config
|
||||
# display_title: the title of the config displayed in the dashboard UI
|
||||
# description: the description of the config displayed in the dashboard UI
|
||||
# locked: if you don't specify locked attribute in yaml, the default value will be true,
|
||||
# which means the particular config will be locked and won't be available in `super_admin/installation_configs`
|
||||
# premium: These values get overwritten unless the user is on a premium plan
|
||||
# type: The type of the config. Default is text, select and boolean are also supported
|
||||
# options: For select types, its required to have options for the select in the following pattern: "option_value":"Human readable option"
|
||||
|
||||
# ------- Branding Related Config ------- #
|
||||
- name: INSTALLATION_NAME
|
||||
value: 'Chatwoot'
|
||||
display_title: 'Installation Name'
|
||||
description: 'The installation wide name that would be used in the dashboard, title etc.'
|
||||
- name: LOGO_THUMBNAIL
|
||||
value: '/brand-assets/logo_thumbnail.svg'
|
||||
display_title: 'Logo Thumbnail'
|
||||
description: 'The thumbnail that would be used for favicon (512px X 512px)'
|
||||
- name: LOGO
|
||||
value: '/brand-assets/logo.svg'
|
||||
display_title: 'Logo'
|
||||
description: 'The logo that would be used on the dashboard, login page etc.'
|
||||
- name: LOGO_DARK
|
||||
value: '/brand-assets/logo_dark.svg'
|
||||
display_title: 'Logo Dark Mode'
|
||||
description: 'The logo that would be used on the dashboard, login page etc. for dark mode'
|
||||
- name: BRAND_URL
|
||||
value: 'https://www.chatwoot.com'
|
||||
display_title: 'Brand URL'
|
||||
description: 'The URL that would be used in emails under the section “Powered By”'
|
||||
- name: WIDGET_BRAND_URL
|
||||
value: 'https://www.chatwoot.com'
|
||||
display_title: 'Widget Brand URL'
|
||||
description: 'The URL that would be used in the widget under the section “Powered By”'
|
||||
- name: BRAND_NAME
|
||||
value: 'Chatwoot'
|
||||
display_title: 'Brand Name'
|
||||
description: 'The name that would be used in emails and the widget'
|
||||
- name: TERMS_URL
|
||||
value: 'https://www.chatwoot.com/terms-of-service'
|
||||
display_title: 'Terms URL'
|
||||
description: 'The terms of service URL displayed in Signup Page'
|
||||
- name: PRIVACY_URL
|
||||
value: 'https://www.chatwoot.com/privacy-policy'
|
||||
display_title: 'Privacy URL'
|
||||
description: 'The privacy policy URL displayed in the app'
|
||||
- name: DISPLAY_MANIFEST
|
||||
value: true
|
||||
display_title: 'Chatwoot Metadata'
|
||||
description: 'Display default Chatwoot metadata like favicons and upgrade warnings'
|
||||
type: boolean
|
||||
# ------- End of Branding Related Config ------- #
|
||||
|
||||
# ------- Signup & Account Related Config ------- #
|
||||
- name: ENABLE_ACCOUNT_SIGNUP
|
||||
display_title: 'Enable Account Signup'
|
||||
value: false
|
||||
description: 'Allow users to signup for new accounts'
|
||||
locked: false
|
||||
type: boolean
|
||||
- name: CREATE_NEW_ACCOUNT_FROM_DASHBOARD
|
||||
value: false
|
||||
description: 'Allow users to create new accounts from the dashboard'
|
||||
locked: false
|
||||
- name: HCAPTCHA_SITE_KEY
|
||||
value:
|
||||
locked: false
|
||||
- name: HCAPTCHA_SERVER_KEY
|
||||
value:
|
||||
locked: false
|
||||
- name: INSTALLATION_EVENTS_WEBHOOK_URL
|
||||
value:
|
||||
display_title: 'System events Webhook URL'
|
||||
description: 'The URL to which the system events like new accounts created will be sent'
|
||||
locked: false
|
||||
- name: WEBHOOK_TIMEOUT
|
||||
value: 5
|
||||
display_title: 'Webhook request timeout (seconds)'
|
||||
description: 'Maximum time Chatwoot waits for a webhook response before failing the request'
|
||||
locked: false
|
||||
- name: DIRECT_UPLOADS_ENABLED
|
||||
type: boolean
|
||||
value: false
|
||||
description: 'Enable direct uploads to cloud storage'
|
||||
locked: false
|
||||
- name: MAXIMUM_FILE_UPLOAD_SIZE
|
||||
value: 40
|
||||
display_title: 'Attachment size limit (MB)'
|
||||
description: 'Maximum attachment size in MB allowed for uploads'
|
||||
locked: false
|
||||
# ------- End of Account Related Config ------- #
|
||||
|
||||
# ------- Email Related Config ------- #
|
||||
- name: MAILER_INBOUND_EMAIL_DOMAIN
|
||||
display_title: 'Inbound Email Domain'
|
||||
value:
|
||||
description: 'The domain name to be used for generating conversation continuity emails (reply+id@domain.com)'
|
||||
locked: false
|
||||
- name: MAILER_SUPPORT_EMAIL
|
||||
display_title: 'Support Email'
|
||||
value:
|
||||
description: 'The support email address for your installation'
|
||||
locked: false
|
||||
- name: ACCOUNT_EMAILS_LIMIT
|
||||
display_title: 'Account Email Sending Limit (Daily)'
|
||||
description: 'Maximum number of non-channel emails an account can send per day'
|
||||
value: 100
|
||||
locked: false
|
||||
- name: ACCOUNT_EMAILS_PLAN_LIMITS
|
||||
display_title: 'Account Email Plan Limits (Daily)'
|
||||
description: 'Per-plan daily email sending limits as JSON'
|
||||
value:
|
||||
type: code
|
||||
# ------- End of Email Related Config ------- #
|
||||
|
||||
# ------- Facebook Channel Related Config ------- #
|
||||
- name: FB_APP_ID
|
||||
display_title: 'Facebook App ID'
|
||||
locked: false
|
||||
- name: FB_VERIFY_TOKEN
|
||||
display_title: 'Facebook Verify Token'
|
||||
description: 'The verify token used for Facebook Messenger Webhook'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: FB_APP_SECRET
|
||||
display_title: 'Facebook App Secret'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: IG_VERIFY_TOKEN
|
||||
display_title: 'Instagram Verify Token'
|
||||
description: 'The verify token used for Instagram Webhook'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: FACEBOOK_API_VERSION
|
||||
display_title: 'Facebook API Version'
|
||||
description: 'Configure this if you want to use a different Facebook API version. Make sure its prefixed with `v`'
|
||||
value: 'v18.0'
|
||||
locked: false
|
||||
- name: ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT
|
||||
display_title: 'Enable human agent'
|
||||
value: false
|
||||
locked: false
|
||||
description: 'Enable human agent for messenger channel for longer message back period. Needs additional app approval: https://developers.facebook.com/docs/features-reference/human-agent/'
|
||||
type: boolean
|
||||
# ------- End of Facebook Channel Related Config ------- #
|
||||
|
||||
# ------- WhatsApp Channel Related Config ------- #
|
||||
- name: WHATSAPP_APP_ID
|
||||
display_title: 'WhatsApp App ID'
|
||||
description: 'The Facebook App ID for WhatsApp Business API integration'
|
||||
locked: false
|
||||
- name: WHATSAPP_CONFIGURATION_ID
|
||||
display_title: 'WhatsApp Configuration ID'
|
||||
description: 'The Configuration ID for WhatsApp Embedded Signup flow (required for embedded signup)'
|
||||
locked: false
|
||||
- name: WHATSAPP_APP_SECRET
|
||||
display_title: 'WhatsApp App Secret'
|
||||
description: 'The App Secret for WhatsApp Embedded Signup flow (required for embedded signup)'
|
||||
locked: false
|
||||
- name: WHATSAPP_API_VERSION
|
||||
display_title: 'WhatsApp API Version'
|
||||
description: 'Configure this if you want to use a different WhatsApp API version. Make sure its prefixed with `v`'
|
||||
value: 'v22.0'
|
||||
locked: false
|
||||
# ------- End of WhatsApp Channel Related Config ------- #
|
||||
|
||||
# MARK: Microsoft Email Channel Config
|
||||
- name: AZURE_APP_ID
|
||||
display_title: 'Azure App ID'
|
||||
description: 'The App ID that will be used to authenticate with customer Microsoft accounts. Find more details on setting up Azure here: https://chwt.app/dev/ms'
|
||||
locked: false
|
||||
- name: AZURE_APP_SECRET
|
||||
display_title: 'Azure App Secret'
|
||||
locked: false
|
||||
type: secret
|
||||
# End of Microsoft Email Channel Config
|
||||
|
||||
# MARK: Captain Config
|
||||
- name: CAPTAIN_OPEN_AI_API_KEY
|
||||
display_title: 'OpenAI API Key'
|
||||
description: 'The API key used to authenticate requests to OpenAI services for Captain AI.'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: CAPTAIN_OPEN_AI_MODEL
|
||||
display_title: 'OpenAI Model'
|
||||
description: 'The OpenAI model configured for use in Captain AI. Default: gpt-4.1-mini'
|
||||
locked: false
|
||||
- name: CAPTAIN_OPEN_AI_ENDPOINT
|
||||
display_title: 'OpenAI API Endpoint (optional)'
|
||||
description: 'The OpenAI endpoint configured for use in Captain AI. Default: https://api.openai.com/'
|
||||
locked: false
|
||||
- name: CAPTAIN_EMBEDDING_MODEL
|
||||
display_title: 'Embedding Model (optional)'
|
||||
description: 'The embedding model configured for use in Captain AI. Default: text-embedding-3-small'
|
||||
locked: false
|
||||
- name: CAPTAIN_FIRECRAWL_API_KEY
|
||||
display_title: 'FireCrawl API Key (optional)'
|
||||
description: 'The FireCrawl API key for the Captain AI service'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: CAPTAIN_CLOUD_PLAN_LIMITS
|
||||
display_title: 'Captain Cloud Plan Limits'
|
||||
description: 'The limits for the Captain AI service for different plans'
|
||||
value:
|
||||
type: code
|
||||
# End of Captain Config
|
||||
|
||||
# ------- Chatwoot Internal Config for Cloud ----#
|
||||
- name: CHATWOOT_INBOX_TOKEN
|
||||
value:
|
||||
display_title: 'Inbox Token'
|
||||
description: 'The Chatwoot Inbox Token for Contact Support in Cloud'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: CHATWOOT_INBOX_HMAC_KEY
|
||||
value:
|
||||
display_title: 'Inbox HMAC Key'
|
||||
description: 'The Chatwoot Inbox HMAC Key for Contact Support in Cloud'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: CHATWOOT_CLOUD_PLANS
|
||||
display_title: 'Cloud Plans'
|
||||
value:
|
||||
description: 'Config to store stripe plans for cloud'
|
||||
- name: CHATWOOT_CLOUD_PLAN_FEATURES
|
||||
display_title: 'Planwise Features List'
|
||||
value:
|
||||
description: 'Config to features and their associated plans'
|
||||
- name: DEPLOYMENT_ENV
|
||||
value: self-hosted
|
||||
description: 'The deployment environment of the installation, to differentiate between Chatwoot cloud and self-hosted'
|
||||
- name: CLOUD_ANALYTICS_TOKEN
|
||||
value:
|
||||
display_title: 'Analytics Token'
|
||||
description: 'The Amplitude analytics API key for Chatwoot cloud'
|
||||
type: secret
|
||||
- name: CLEARBIT_API_KEY
|
||||
value:
|
||||
display_title: 'Clearbit API Key'
|
||||
description: 'This API key is used for onboarding the users, to pre-fill account data.'
|
||||
type: secret
|
||||
- name: DASHBOARD_SCRIPTS
|
||||
value:
|
||||
display_title: 'Dashboard Scripts'
|
||||
description: 'Scripts are loaded as the last item in the <body> tag'
|
||||
type: code
|
||||
- name: BLOCKED_EMAIL_DOMAINS
|
||||
value:
|
||||
display_title: 'Blocked Email Domains'
|
||||
description: 'Add a domain per line to block them from signing up, accepts Regex'
|
||||
type: code
|
||||
- name: SKIP_INCOMING_BCC_PROCESSING
|
||||
value:
|
||||
display_title: 'Skip BCC Processing For'
|
||||
description: 'Comma-separated list of account IDs that should be skipped from incoming BCC processing'
|
||||
- name: INACTIVE_WHATSAPP_NUMBERS
|
||||
value: ''
|
||||
display_title: 'Inactive WhatsApp Numbers'
|
||||
description: 'Comma-separated list of WhatsApp numbers that should be rejected with a 422 error'
|
||||
type: code
|
||||
# ------- End of Chatwoot Internal Config for Cloud ----#
|
||||
|
||||
# ------- Chatwoot Internal Config for Self Hosted ----#
|
||||
- name: INSTALLATION_PRICING_PLAN
|
||||
value: 'community'
|
||||
description: 'The pricing plan for the installation, retrieved from the billing API'
|
||||
- name: INSTALLATION_PRICING_PLAN_QUANTITY
|
||||
value: 0
|
||||
description: 'The number of licenses purchased for the installation, retrieved from the billing API'
|
||||
- name: CHATWOOT_SUPPORT_WEBSITE_TOKEN
|
||||
value:
|
||||
description: 'The Chatwoot website token, used to identify the Chatwoot inbox and display the "Contact Support" option on the billing page'
|
||||
type: secret
|
||||
- name: CHATWOOT_SUPPORT_SCRIPT_URL
|
||||
value:
|
||||
description: 'The Chatwoot script base URL, to display the "Contact Support" option on the billing page'
|
||||
- name: CHATWOOT_SUPPORT_IDENTIFIER_HASH
|
||||
value:
|
||||
description: 'The Chatwoot identifier hash, to validate the contact in the live chat window.'
|
||||
type: secret
|
||||
- name: ACCOUNT_SECURITY_NOTIFICATION_WEBHOOK_URL
|
||||
display_title: Webhook URL to post security analysis
|
||||
value:
|
||||
description: Used to notify Chatwoot about account abuses, potential threads (Should be a Discord Webhook URL)
|
||||
# ------- End of Chatwoot Internal Config for Self Hosted ----#
|
||||
|
||||
# ------- Compliance Related Config ----#
|
||||
- name: CHATWOOT_INSTANCE_ADMIN_EMAIL
|
||||
display_title: 'Instance Admin Email'
|
||||
value:
|
||||
description: 'The email of the instance administrator to receive compliance-related notifications'
|
||||
locked: false
|
||||
# ------- End of Compliance Related Config ----#
|
||||
|
||||
## ------ Configs added for enterprise clients ------ ##
|
||||
- name: API_CHANNEL_NAME
|
||||
value:
|
||||
description: 'Custom name for the API channel'
|
||||
- name: API_CHANNEL_THUMBNAIL
|
||||
value:
|
||||
description: 'Custom thumbnail for the API channel'
|
||||
- name: LOGOUT_REDIRECT_LINK
|
||||
value: /app/login
|
||||
locked: false
|
||||
description: 'Redirect to a different link after logout'
|
||||
- name: DISABLE_USER_PROFILE_UPDATE
|
||||
value: false
|
||||
locked: false
|
||||
description: 'Disable rendering profile update page for users'
|
||||
## ------ End of Configs added for enterprise clients ------ ##
|
||||
|
||||
## ------ Configs added for FCM v1 notifications ------ ##
|
||||
- name: FIREBASE_PROJECT_ID
|
||||
display_title: 'Firebase Project ID'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Firebase project ID'
|
||||
- name: FIREBASE_CREDENTIALS
|
||||
display_title: 'Firebase Credentials'
|
||||
value:
|
||||
locked: false
|
||||
type: secret
|
||||
description: 'Contents on your firebase credentials json file'
|
||||
## ------ End of Configs added for FCM v1 notifications ------ ##
|
||||
|
||||
## ------ Configs added for Linear ------ ##
|
||||
- name: LINEAR_CLIENT_ID
|
||||
display_title: 'Linear Client ID'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Linear client ID'
|
||||
- name: LINEAR_CLIENT_SECRET
|
||||
display_title: 'Linear Client Secret'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Linear client secret'
|
||||
type: secret
|
||||
## ------ End of Configs added for Linear ------ ##
|
||||
|
||||
## ------ Configs added for Notion ------ ##
|
||||
- name: NOTION_CLIENT_ID
|
||||
display_title: 'Notion Client ID'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Notion client ID'
|
||||
- name: NOTION_CLIENT_SECRET
|
||||
display_title: 'Notion Client Secret'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Notion client secret'
|
||||
type: secret
|
||||
- name: NOTION_VERSION
|
||||
display_title: 'Notion Version'
|
||||
value: '2022-06-28'
|
||||
locked: false
|
||||
description: 'Notion version'
|
||||
## ------ End of Configs added for Notion ------ ##
|
||||
|
||||
## ------ Configs added for Slack ------ ##
|
||||
- name: SLACK_CLIENT_ID
|
||||
display_title: 'Slack Client ID'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Slack client ID'
|
||||
- name: SLACK_CLIENT_SECRET
|
||||
display_title: 'Slack Client Secret'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Slack client secret'
|
||||
type: secret
|
||||
## ------ End of Configs added for Slack ------ ##
|
||||
|
||||
# ------- Shopify Integration Config ------- #
|
||||
- name: SHOPIFY_CLIENT_ID
|
||||
display_title: 'Shopify Client ID'
|
||||
description: 'The Client ID (API Key) from your Shopify Partner account'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: SHOPIFY_CLIENT_SECRET
|
||||
display_title: 'Shopify Client Secret'
|
||||
description: 'The Client Secret (API Secret Key) from your Shopify Partner account'
|
||||
locked: false
|
||||
type: secret
|
||||
# ------- End of Shopify Related Config ------- #
|
||||
|
||||
# ------- Instagram Channel Related Config ------- #
|
||||
- name: INSTAGRAM_APP_ID
|
||||
display_title: 'Instagram App ID'
|
||||
locked: false
|
||||
- name: INSTAGRAM_APP_SECRET
|
||||
display_title: 'Instagram App Secret'
|
||||
description: 'The App Secret used for Instagram authentication'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: INSTAGRAM_VERIFY_TOKEN
|
||||
display_title: 'Instagram Verify Token'
|
||||
description: 'The verify token used for Instagram Webhook'
|
||||
locked: false
|
||||
type: secret
|
||||
- name: ENABLE_INSTAGRAM_CHANNEL_HUMAN_AGENT
|
||||
display_title: 'Enable human agent for instagram channel'
|
||||
value: false
|
||||
locked: false
|
||||
description: 'Enable human agent for instagram channel for longer message back period. Needs additional app approval: https://developers.facebook.com/docs/features-reference/human-agent/'
|
||||
type: boolean
|
||||
- name: INSTAGRAM_API_VERSION
|
||||
display_title: 'Instagram API Version'
|
||||
description: 'Configure this if you want to use a different Instagram API version. Make sure its prefixed with `v`'
|
||||
value: 'v22.0'
|
||||
locked: true
|
||||
# ------- End of Instagram Channel Related Config ------- #
|
||||
|
||||
# ------- TikTok Channel Related Config ------- #
|
||||
- name: TIKTOK_API_VERSION
|
||||
display_title: 'TikTok API Version'
|
||||
description: 'Configure this if you want to use a different TikTok API version. Make sure its prefixed with `v`'
|
||||
value: 'v1.3'
|
||||
locked: false
|
||||
- name: TIKTOK_APP_ID
|
||||
display_title: 'TikTok App ID'
|
||||
locked: false
|
||||
- name: TIKTOK_APP_SECRET
|
||||
display_title: 'TikTok App Secret'
|
||||
locked: false
|
||||
type: secret
|
||||
# ------- End of TikTok Channel Related Config ------- #
|
||||
|
||||
# ------- OG Image Related Config ------- #
|
||||
- name: OG_IMAGE_CDN_URL
|
||||
display_title: 'OG Image CDN URL'
|
||||
description: 'The CDN URL for serving OG images'
|
||||
value: ''
|
||||
locked: false
|
||||
- name: OG_IMAGE_CLIENT_REF
|
||||
display_title: 'OG Image Client Reference'
|
||||
description: 'Token used to block unauthorized access to OG images'
|
||||
value: ''
|
||||
locked: false
|
||||
type: secret
|
||||
# ------- End of OG Image Related Config ------- #
|
||||
|
||||
## ------ Configs added for Google OAuth ------ ##
|
||||
- name: GOOGLE_OAUTH_CLIENT_ID
|
||||
display_title: 'Google OAuth Client ID'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Google OAuth Client ID for email authentication'
|
||||
- name: GOOGLE_OAUTH_CLIENT_SECRET
|
||||
display_title: 'Google OAuth Client Secret'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Google OAuth Client Secret for email authentication'
|
||||
type: secret
|
||||
- name: GOOGLE_OAUTH_REDIRECT_URI
|
||||
display_title: 'Google OAuth Redirect URI'
|
||||
value:
|
||||
locked: false
|
||||
description: 'The redirect URI configured in your Google OAuth app'
|
||||
- name: ENABLE_GOOGLE_OAUTH_LOGIN
|
||||
display_title: 'Enable Google OAuth login'
|
||||
value: true
|
||||
locked: false
|
||||
description: 'Show Google OAuth as a login option when credentials are configured'
|
||||
type: boolean
|
||||
## ------ End of Configs added for Google OAuth ------ ##
|
||||
|
||||
## ------ Configs added for SAML SSO ------ ##
|
||||
- name: ENABLE_SAML_SSO_LOGIN
|
||||
display_title: 'Enable SAML SSO login'
|
||||
value: true
|
||||
locked: false
|
||||
description: 'Show SAML SSO as a login option. Cannot be disabled if any users are using SAML authentication.'
|
||||
type: boolean
|
||||
## ------ End of Configs added for SAML SSO ------ ##
|
||||
|
||||
## ------ Configs added for Cloudflare ------ ##
|
||||
- name: CLOUDFLARE_API_KEY
|
||||
display_title: 'Cloudflare API Key'
|
||||
value:
|
||||
locked: false
|
||||
description: 'API key for Cloudflare account authentication'
|
||||
type: secret
|
||||
- name: CLOUDFLARE_ZONE_ID
|
||||
display_title: 'Cloudflare Zone ID'
|
||||
value:
|
||||
locked: false
|
||||
description: 'Zone ID for the Cloudflare domain'
|
||||
## ------ End of Configs added for Cloudflare ------ ##
|
||||
|
||||
## ------ Customizations for Customers ------ ##
|
||||
- name: WIDGET_TOKEN_EXPIRY
|
||||
display_title: 'Widget Token Expiry'
|
||||
value: 180
|
||||
locked: false
|
||||
description: 'Token expiry in days'
|
||||
## ------ End of Customizations for Customers ------ ##
|
||||
|
||||
## ----- LLM Observability ---- ##
|
||||
- name: OTEL_PROVIDER
|
||||
display_title: 'OpenTelemetry Provider'
|
||||
description: 'LLM observability provider (langfuse, langsmith, etc.)'
|
||||
value: ''
|
||||
locked: false
|
||||
- name: LANGFUSE_PUBLIC_KEY
|
||||
display_title: 'Langfuse Public Key'
|
||||
description: 'Public key for Langfuse authentication'
|
||||
value: ''
|
||||
locked: false
|
||||
type: secret
|
||||
- name: LANGFUSE_SECRET_KEY
|
||||
display_title: 'Langfuse Secret Key'
|
||||
description: 'Secret key for Langfuse authentication'
|
||||
value: ''
|
||||
locked: false
|
||||
type: secret
|
||||
- name: LANGFUSE_BASE_URL
|
||||
display_title: 'Langfuse Base URL'
|
||||
description: 'Langfuse endpoint (US: https://us.cloud.langfuse.com, EU: https://cloud.langfuse.com)'
|
||||
value: 'https://us.cloud.langfuse.com'
|
||||
locked: false
|
||||
## ---- End of LLM Observability ---- ##
|
||||
286
research/chatwoot/config/integration/apps.yml
Normal file
286
research/chatwoot/config/integration/apps.yml
Normal file
@@ -0,0 +1,286 @@
|
||||
###### Attributes Supported by Integration Apps #######
|
||||
# id: Internal Id for the integrations, used by the hooks
|
||||
# logo: place the image in /public/dashboard/images/integrations and reference here
|
||||
# i18n_key: the key under which translations for the integration is placed in en.yml
|
||||
# action: if integration requires external redirect url
|
||||
# hook_type: ( account / inbox )
|
||||
# feature_flag: (string) feature flag to enable/disable the integration
|
||||
# allow_multiple_hooks: whether multiple hooks can be created for the integration
|
||||
# settings_json_schema: the json schema used to validate the settings hash (https://json-schema.org/)
|
||||
# settings_form_schema: the formulate schema used in frontend to render settings form (https://vueformulate.com/)
|
||||
########################################################
|
||||
webhooks:
|
||||
id: webhook
|
||||
logo: webhooks.png
|
||||
i18n_key: webhooks
|
||||
action: /webhook
|
||||
hook_type: account
|
||||
allow_multiple_hooks: true
|
||||
dashboard_apps:
|
||||
id: dashboard_apps
|
||||
logo: dashboard_apps.png
|
||||
i18n_key: dashboard_apps
|
||||
hook_type: account
|
||||
allow_multiple_hooks: true
|
||||
openai:
|
||||
id: openai
|
||||
logo: openai.png
|
||||
i18n_key: openai
|
||||
action: /openai
|
||||
hook_type: account
|
||||
allow_multiple_hooks: false
|
||||
settings_json_schema:
|
||||
{
|
||||
'type': 'object',
|
||||
'properties':
|
||||
{
|
||||
'api_key': { 'type': 'string' },
|
||||
'label_suggestion': { 'type': 'boolean' },
|
||||
},
|
||||
'required': ['api_key'],
|
||||
'additionalProperties': false,
|
||||
}
|
||||
settings_form_schema:
|
||||
[
|
||||
{
|
||||
'label': 'API Key',
|
||||
'type': 'text',
|
||||
'name': 'api_key',
|
||||
'validation': 'required',
|
||||
},
|
||||
{
|
||||
'label': 'Show label suggestions',
|
||||
'type': 'checkbox',
|
||||
'name': 'label_suggestion',
|
||||
'validation': '',
|
||||
},
|
||||
]
|
||||
visible_properties: ['api_key', 'label_suggestion']
|
||||
linear:
|
||||
id: linear
|
||||
logo: linear.png
|
||||
i18n_key: linear
|
||||
action: https://linear.app/oauth/authorize
|
||||
hook_type: account
|
||||
allow_multiple_hooks: false
|
||||
notion:
|
||||
id: notion
|
||||
logo: notion.png
|
||||
i18n_key: notion
|
||||
hook_type: account
|
||||
allow_multiple_hooks: false
|
||||
slack:
|
||||
id: slack
|
||||
logo: slack.png
|
||||
i18n_key: slack
|
||||
action: https://slack.com/oauth/v2/authorize?scope=commands,chat:write,channels:read,channels:manage,channels:join,groups:read,groups:write,im:write,mpim:write,users:read,users:read.email,chat:write.customize,channels:history,groups:history,mpim:history,im:history,files:read,files:write
|
||||
hook_type: account
|
||||
allow_multiple_hooks: false
|
||||
dialogflow:
|
||||
id: dialogflow
|
||||
logo: dialogflow.png
|
||||
i18n_key: dialogflow
|
||||
action: /dialogflow
|
||||
hook_type: inbox
|
||||
allow_multiple_hooks: true
|
||||
settings_json_schema:
|
||||
{
|
||||
'type': 'object',
|
||||
'properties':
|
||||
{
|
||||
'project_id': { 'type': 'string' },
|
||||
'credentials': { 'type': 'object' },
|
||||
'region': { 'type': 'string' },
|
||||
},
|
||||
'required': ['project_id', 'credentials'],
|
||||
'additionalProperties': false,
|
||||
}
|
||||
settings_form_schema:
|
||||
[
|
||||
{
|
||||
'label': 'Dialogflow Project ID',
|
||||
'type': 'text',
|
||||
'name': 'project_id',
|
||||
'validation': 'required',
|
||||
'validationName': 'Project Id',
|
||||
},
|
||||
{
|
||||
'label': 'Dialogflow Project Key File',
|
||||
'type': 'textarea',
|
||||
'name': 'credentials',
|
||||
'validation': 'required|JSON',
|
||||
'validationName': 'Credentials',
|
||||
'validation-messages':
|
||||
{ 'JSON': 'Invalid JSON', 'required': 'Credentials is required' },
|
||||
},
|
||||
{
|
||||
'label': 'Dialogflow Region',
|
||||
'type': 'select',
|
||||
'name': 'region',
|
||||
'default': 'global',
|
||||
'options': [
|
||||
{ 'label': 'Global - Default', 'value': 'global' },
|
||||
{ 'label': 'AS-NE1 - Tokyo, Japan', 'value': 'asia-northeast1' },
|
||||
{ 'label': 'AU-SE1 - Sydney, Australia', 'value': 'australia-southeast1' },
|
||||
{ 'label': 'EU-W1 - St. Ghislain, Belgium', 'value': 'europe-west1' },
|
||||
{ 'label': 'EU-W2 - London, England', 'value': 'europe-west2' },
|
||||
],
|
||||
},
|
||||
]
|
||||
visible_properties: ['project_id', 'region']
|
||||
google_translate:
|
||||
id: google_translate
|
||||
logo: google-translate.png
|
||||
i18n_key: google_translate
|
||||
action: /google_translate
|
||||
hook_type: account
|
||||
allow_multiple_hooks: false
|
||||
settings_json_schema:
|
||||
{
|
||||
'type': 'object',
|
||||
'properties':
|
||||
{
|
||||
'project_id': { 'type': 'string' },
|
||||
'credentials': { 'type': 'object' },
|
||||
},
|
||||
'required': ['project_id', 'credentials'],
|
||||
'additionalProperties': false,
|
||||
}
|
||||
settings_form_schema:
|
||||
[
|
||||
{
|
||||
'label': 'Google Cloud Project ID',
|
||||
'type': 'text',
|
||||
'name': 'project_id',
|
||||
'validation': 'required',
|
||||
'validationName': 'Project Id',
|
||||
},
|
||||
{
|
||||
'label': 'Google Cloud Project Key File',
|
||||
'type': 'textarea',
|
||||
'name': 'credentials',
|
||||
'validation': 'required|JSON',
|
||||
'validationName': 'Credentials',
|
||||
'validation-messages':
|
||||
{ 'JSON': 'Invalid JSON', 'required': 'Credentials is required' },
|
||||
},
|
||||
]
|
||||
visible_properties: ['project_id']
|
||||
dyte:
|
||||
id: dyte
|
||||
logo: dyte.png
|
||||
i18n_key: dyte
|
||||
action: /dyte
|
||||
hook_type: account
|
||||
allow_multiple_hooks: false
|
||||
settings_json_schema:
|
||||
{
|
||||
'type': 'object',
|
||||
'properties':
|
||||
{
|
||||
'api_key': { 'type': 'string' },
|
||||
'organization_id': { 'type': 'string' },
|
||||
},
|
||||
'required': ['api_key', 'organization_id'],
|
||||
'additionalProperties': false,
|
||||
}
|
||||
settings_form_schema:
|
||||
[
|
||||
{
|
||||
'label': 'Organization ID',
|
||||
'type': 'text',
|
||||
'name': 'organization_id',
|
||||
'validation': 'required',
|
||||
},
|
||||
{
|
||||
'label': 'API Key',
|
||||
'type': 'text',
|
||||
'name': 'api_key',
|
||||
'validation': 'required',
|
||||
},
|
||||
]
|
||||
visible_properties: ['organization_id']
|
||||
|
||||
shopify:
|
||||
id: shopify
|
||||
logo: shopify.png
|
||||
i18n_key: shopify
|
||||
hook_type: account
|
||||
allow_multiple_hooks: false
|
||||
|
||||
leadsquared:
|
||||
id: leadsquared
|
||||
feature_flag: crm_integration
|
||||
logo: leadsquared.png
|
||||
i18n_key: leadsquared
|
||||
action: /leadsquared
|
||||
hook_type: account
|
||||
allow_multiple_hooks: false
|
||||
settings_json_schema:
|
||||
{
|
||||
'type': 'object',
|
||||
'properties':
|
||||
{
|
||||
'access_key': { 'type': 'string' },
|
||||
'secret_key': { 'type': 'string' },
|
||||
'endpoint_url': { 'type': 'string' },
|
||||
'app_url': { 'type': 'string' },
|
||||
'timezone': { 'type': 'string' },
|
||||
'enable_conversation_activity': { 'type': 'boolean' },
|
||||
'enable_transcript_activity': { 'type': 'boolean' },
|
||||
'conversation_activity_score': { 'type': 'string' },
|
||||
'transcript_activity_score': { 'type': 'string' },
|
||||
'conversation_activity_code': { 'type': 'integer' },
|
||||
'transcript_activity_code': { 'type': 'integer' },
|
||||
},
|
||||
'required': ['access_key', 'secret_key'],
|
||||
'additionalProperties': false,
|
||||
}
|
||||
settings_form_schema:
|
||||
[
|
||||
{
|
||||
'label': 'Access Key',
|
||||
'type': 'text',
|
||||
'name': 'access_key',
|
||||
'validation': 'required',
|
||||
},
|
||||
{
|
||||
'label': 'Secret Key',
|
||||
'type': 'text',
|
||||
'name': 'secret_key',
|
||||
'validation': 'required',
|
||||
},
|
||||
{
|
||||
'label': 'Push Conversation Activity',
|
||||
'type': 'checkbox',
|
||||
'name': 'enable_conversation_activity',
|
||||
'help': 'Enable this option to push an activity when a conversation is created',
|
||||
},
|
||||
{
|
||||
'label': 'Conversation Activity Score',
|
||||
'type': 'number',
|
||||
'name': 'conversation_activity_score',
|
||||
'help': 'Score to assign to the conversation created activity, default is 0',
|
||||
},
|
||||
{
|
||||
'label': 'Push Transcript Activity',
|
||||
'type': 'checkbox',
|
||||
'name': 'enable_transcript_activity',
|
||||
'help': 'Enable this option to push an activity when a transcript is created',
|
||||
},
|
||||
{
|
||||
'label': 'Transcript Activity Score',
|
||||
'type': 'number',
|
||||
'name': 'transcript_activity_score',
|
||||
'help': 'Score to assign to the conversation transcript activity, default is 0',
|
||||
},
|
||||
]
|
||||
visible_properties:
|
||||
[
|
||||
'access_key',
|
||||
'endpoint_url',
|
||||
'enable_conversation_activity',
|
||||
'enable_transcript_activity',
|
||||
'conversation_activity_score',
|
||||
'transcript_activity_score',
|
||||
]
|
||||
563
research/chatwoot/config/languages/language_map.yml
Normal file
563
research/chatwoot/config/languages/language_map.yml
Normal file
@@ -0,0 +1,563 @@
|
||||
af: 'Afrikaans'
|
||||
af_NA: 'Afrikaans (Namibia)'
|
||||
af_ZA: 'Afrikaans (South Africa)'
|
||||
ak: 'Akan'
|
||||
ak_GH: 'Akan (Ghana)'
|
||||
sq: 'Albanian'
|
||||
sq_AL: 'Albanian (Albania)'
|
||||
sq_XK: 'Albanian (Kosovo)'
|
||||
sq_MK: 'Albanian (Macedonia)'
|
||||
am: 'Amharic'
|
||||
am_ET: 'Amharic (Ethiopia)'
|
||||
ar: 'Arabic'
|
||||
ar_DZ: 'Arabic (Algeria)'
|
||||
ar_BH: 'Arabic (Bahrain)'
|
||||
ar_TD: 'Arabic (Chad)'
|
||||
ar_KM: 'Arabic (Comoros)'
|
||||
ar_DJ: 'Arabic (Djibouti)'
|
||||
ar_EG: 'Arabic (Egypt)'
|
||||
ar_ER: 'Arabic (Eritrea)'
|
||||
ar_IQ: 'Arabic (Iraq)'
|
||||
ar_IL: 'Arabic (Israel)'
|
||||
ar_JO: 'Arabic (Jordan)'
|
||||
ar_KW: 'Arabic (Kuwait)'
|
||||
ar_LB: 'Arabic (Lebanon)'
|
||||
ar_LY: 'Arabic (Libya)'
|
||||
ar_MR: 'Arabic (Mauritania)'
|
||||
ar_MA: 'Arabic (Morocco)'
|
||||
ar_OM: 'Arabic (Oman)'
|
||||
ar_PS: 'Arabic (Palestinian Territories)'
|
||||
ar_QA: 'Arabic (Qatar)'
|
||||
ar_SA: 'Arabic (Saudi Arabia)'
|
||||
ar_SO: 'Arabic (Somalia)'
|
||||
ar_SS: 'Arabic (South Sudan)'
|
||||
ar_SD: 'Arabic (Sudan)'
|
||||
ar_SY: 'Arabic (Syria)'
|
||||
ar_TN: 'Arabic (Tunisia)'
|
||||
ar_AE: 'Arabic (United Arab Emirates)'
|
||||
ar_EH: 'Arabic (Western Sahara)'
|
||||
ar_YE: 'Arabic (Yemen)'
|
||||
hy: 'Armenian'
|
||||
hy_AM: 'Armenian (Armenia)'
|
||||
as: 'Assamese'
|
||||
as_IN: 'Assamese (India)'
|
||||
az: 'Azerbaijani'
|
||||
az_AZ: 'Azerbaijani (Azerbaijan)'
|
||||
az_Cyrl_AZ: 'Azerbaijani (Cyrillic, Azerbaijan)'
|
||||
az_Cyrl: 'Azerbaijani (Cyrillic)'
|
||||
az_Latn_AZ: 'Azerbaijani (Latin, Azerbaijan)'
|
||||
az_Latn: 'Azerbaijani (Latin)'
|
||||
bm: 'Bambara'
|
||||
bm_Latn_ML: 'Bambara (Latin, Mali)'
|
||||
bm_Latn: 'Bambara (Latin)'
|
||||
eu: 'Basque'
|
||||
eu_ES: 'Basque (Spain)'
|
||||
be: 'Belarusian'
|
||||
be_BY: 'Belarusian (Belarus)'
|
||||
bn: 'Bengali'
|
||||
bn_BD: 'Bengali (Bangladesh)'
|
||||
bn_IN: 'Bengali (India)'
|
||||
bs: 'Bosnian'
|
||||
bs_BA: 'Bosnian (Bosnia & Herzegovina)'
|
||||
bs_Cyrl_BA: 'Bosnian (Cyrillic, Bosnia & Herzegovina)'
|
||||
bs_Cyrl: 'Bosnian (Cyrillic)'
|
||||
bs_Latn_BA: 'Bosnian (Latin, Bosnia & Herzegovina)'
|
||||
bs_Latn: 'Bosnian (Latin)'
|
||||
br: 'Breton'
|
||||
br_FR: 'Breton (France)'
|
||||
bg: 'Bulgarian'
|
||||
bg_BG: 'Bulgarian (Bulgaria)'
|
||||
my: 'Burmese'
|
||||
my_MM: 'Burmese (Myanmar (Burma))'
|
||||
ca: 'Catalan'
|
||||
ca_AD: 'Catalan (Andorra)'
|
||||
ca_FR: 'Catalan (France)'
|
||||
ca_IT: 'Catalan (Italy)'
|
||||
ca_ES: 'Catalan (Spain)'
|
||||
zh: 'Chinese'
|
||||
zh_CN: 'Chinese (China)'
|
||||
zh_HK: 'Chinese (Hong Kong SAR China)'
|
||||
zh_MO: 'Chinese (Macau SAR China)'
|
||||
zh_Hans_CN: 'Chinese (Simplified, China)'
|
||||
zh_Hans_HK: 'Chinese (Simplified, Hong Kong SAR China)'
|
||||
zh_Hans_MO: 'Chinese (Simplified, Macau SAR China)'
|
||||
zh_Hans_SG: 'Chinese (Simplified, Singapore)'
|
||||
zh_Hans: 'Chinese (Simplified)'
|
||||
zh_SG: 'Chinese (Singapore)'
|
||||
zh_TW: 'Chinese (Taiwan)'
|
||||
zh_Hant_HK: 'Chinese (Traditional, Hong Kong SAR China)'
|
||||
zh_Hant_MO: 'Chinese (Traditional, Macau SAR China)'
|
||||
zh_Hant_TW: 'Chinese (Traditional, Taiwan)'
|
||||
zh_Hant: 'Chinese (Traditional)'
|
||||
kw: 'Cornish'
|
||||
kw_GB: 'Cornish (United Kingdom)'
|
||||
hr: 'Croatian'
|
||||
hr_BA: 'Croatian (Bosnia & Herzegovina)'
|
||||
hr_HR: 'Croatian (Croatia)'
|
||||
cs: 'Czech'
|
||||
cs_CZ: 'Czech (Czech Republic)'
|
||||
da: 'Danish'
|
||||
da_DK: 'Danish (Denmark)'
|
||||
da_GL: 'Danish (Greenland)'
|
||||
nl: 'Dutch'
|
||||
nl_AW: 'Dutch (Aruba)'
|
||||
nl_BE: 'Dutch (Belgium)'
|
||||
nl_BQ: 'Dutch (Caribbean Netherlands)'
|
||||
nl_CW: 'Dutch (Curaçao)'
|
||||
nl_NL: 'Dutch (Netherlands)'
|
||||
nl_SX: 'Dutch (Sint Maarten)'
|
||||
nl_SR: 'Dutch (Suriname)'
|
||||
dz: 'Dzongkha'
|
||||
dz_BT: 'Dzongkha (Bhutan)'
|
||||
en: 'English'
|
||||
en_AS: 'English (American Samoa)'
|
||||
en_AI: 'English (Anguilla)'
|
||||
en_AG: 'English (Antigua & Barbuda)'
|
||||
en_AU: 'English (Australia)'
|
||||
en_BS: 'English (Bahamas)'
|
||||
en_BB: 'English (Barbados)'
|
||||
en_BE: 'English (Belgium)'
|
||||
en_BZ: 'English (Belize)'
|
||||
en_BM: 'English (Bermuda)'
|
||||
en_BW: 'English (Botswana)'
|
||||
en_IO: 'English (British Indian Ocean Territory)'
|
||||
en_VG: 'English (British Virgin Islands)'
|
||||
en_CM: 'English (Cameroon)'
|
||||
en_CA: 'English (Canada)'
|
||||
en_KY: 'English (Cayman Islands)'
|
||||
en_CX: 'English (Christmas Island)'
|
||||
en_CC: 'English (Cocos (Keeling) Islands)'
|
||||
en_CK: 'English (Cook Islands)'
|
||||
en_DG: 'English (Diego Garcia)'
|
||||
en_DM: 'English (Dominica)'
|
||||
en_ER: 'English (Eritrea)'
|
||||
en_FK: 'English (Falkland Islands)'
|
||||
en_FJ: 'English (Fiji)'
|
||||
en_GM: 'English (Gambia)'
|
||||
en_GH: 'English (Ghana)'
|
||||
en_GI: 'English (Gibraltar)'
|
||||
en_GD: 'English (Grenada)'
|
||||
en_GU: 'English (Guam)'
|
||||
en_GG: 'English (Guernsey)'
|
||||
en_GY: 'English (Guyana)'
|
||||
en_HK: 'English (Hong Kong SAR China)'
|
||||
en_IN: 'English (India)'
|
||||
en_IE: 'English (Ireland)'
|
||||
en_IM: 'English (Isle of Man)'
|
||||
en_JM: 'English (Jamaica)'
|
||||
en_JE: 'English (Jersey)'
|
||||
en_KE: 'English (Kenya)'
|
||||
en_KI: 'English (Kiribati)'
|
||||
en_LS: 'English (Lesotho)'
|
||||
en_LR: 'English (Liberia)'
|
||||
en_MO: 'English (Macau SAR China)'
|
||||
en_MG: 'English (Madagascar)'
|
||||
en_MW: 'English (Malawi)'
|
||||
en_MY: 'English (Malaysia)'
|
||||
en_MT: 'English (Malta)'
|
||||
en_MH: 'English (Marshall Islands)'
|
||||
en_MU: 'English (Mauritius)'
|
||||
en_FM: 'English (Micronesia)'
|
||||
en_MS: 'English (Montserrat)'
|
||||
en_NA: 'English (Namibia)'
|
||||
en_NR: 'English (Nauru)'
|
||||
en_NZ: 'English (New Zealand)'
|
||||
en_NG: 'English (Nigeria)'
|
||||
en_NU: 'English (Niue)'
|
||||
en_NF: 'English (Norfolk Island)'
|
||||
en_MP: 'English (Northern Mariana Islands)'
|
||||
en_PK: 'English (Pakistan)'
|
||||
en_PW: 'English (Palau)'
|
||||
en_PG: 'English (Papua New Guinea)'
|
||||
en_PH: 'English (Philippines)'
|
||||
en_PN: 'English (Pitcairn Islands)'
|
||||
en_PR: 'English (Puerto Rico)'
|
||||
en_RW: 'English (Rwanda)'
|
||||
en_WS: 'English (Samoa)'
|
||||
en_SC: 'English (Seychelles)'
|
||||
en_SL: 'English (Sierra Leone)'
|
||||
en_SG: 'English (Singapore)'
|
||||
en_SX: 'English (Sint Maarten)'
|
||||
en_SB: 'English (Solomon Islands)'
|
||||
en_ZA: 'English (South Africa)'
|
||||
en_SS: 'English (South Sudan)'
|
||||
en_SH: 'English (St. Helena)'
|
||||
en_KN: 'English (St. Kitts & Nevis)'
|
||||
en_LC: 'English (St. Lucia)'
|
||||
en_VC: 'English (St. Vincent & Grenadines)'
|
||||
en_SD: 'English (Sudan)'
|
||||
en_SZ: 'English (Swaziland)'
|
||||
en_TZ: 'English (Tanzania)'
|
||||
en_TK: 'English (Tokelau)'
|
||||
en_TO: 'English (Tonga)'
|
||||
en_TT: 'English (Trinidad & Tobago)'
|
||||
en_TC: 'English (Turks & Caicos Islands)'
|
||||
en_TV: 'English (Tuvalu)'
|
||||
en_UM: 'English (U.S. Outlying Islands)'
|
||||
en_VI: 'English (U.S. Virgin Islands)'
|
||||
en_UG: 'English (Uganda)'
|
||||
en_GB: 'English (United Kingdom)'
|
||||
en_US: 'English (United States)'
|
||||
en_VU: 'English (Vanuatu)'
|
||||
en_ZM: 'English (Zambia)'
|
||||
en_ZW: 'English (Zimbabwe)'
|
||||
eo: 'Esperanto'
|
||||
et: 'Estonian'
|
||||
et_EE: 'Estonian (Estonia)'
|
||||
ee: 'Ewe'
|
||||
ee_GH: 'Ewe (Ghana)'
|
||||
ee_TG: 'Ewe (Togo)'
|
||||
fo: 'Faroese'
|
||||
fo_FO: 'Faroese (Faroe Islands)'
|
||||
fi: 'Finnish'
|
||||
fi_FI: 'Finnish (Finland)'
|
||||
fr: 'French'
|
||||
fr_DZ: 'French (Algeria)'
|
||||
fr_BE: 'French (Belgium)'
|
||||
fr_BJ: 'French (Benin)'
|
||||
fr_BF: 'French (Burkina Faso)'
|
||||
fr_BI: 'French (Burundi)'
|
||||
fr_CM: 'French (Cameroon)'
|
||||
fr_CA: 'French (Canada)'
|
||||
fr_CF: 'French (Central African Republic)'
|
||||
fr_TD: 'French (Chad)'
|
||||
fr_KM: 'French (Comoros)'
|
||||
fr_CG: 'French (Congo - Brazzaville)'
|
||||
fr_CD: 'French (Congo - Kinshasa)'
|
||||
fr_CI: 'French (Côte d’Ivoire)'
|
||||
fr_DJ: 'French (Djibouti)'
|
||||
fr_GQ: 'French (Equatorial Guinea)'
|
||||
fr_FR: 'French (France)'
|
||||
fr_GF: 'French (French Guiana)'
|
||||
fr_PF: 'French (French Polynesia)'
|
||||
fr_GA: 'French (Gabon)'
|
||||
fr_GP: 'French (Guadeloupe)'
|
||||
fr_GN: 'French (Guinea)'
|
||||
fr_HT: 'French (Haiti)'
|
||||
fr_LU: 'French (Luxembourg)'
|
||||
fr_MG: 'French (Madagascar)'
|
||||
fr_ML: 'French (Mali)'
|
||||
fr_MQ: 'French (Martinique)'
|
||||
fr_MR: 'French (Mauritania)'
|
||||
fr_MU: 'French (Mauritius)'
|
||||
fr_YT: 'French (Mayotte)'
|
||||
fr_MC: 'French (Monaco)'
|
||||
fr_MA: 'French (Morocco)'
|
||||
fr_NC: 'French (New Caledonia)'
|
||||
fr_NE: 'French (Niger)'
|
||||
fr_RE: 'French (Réunion)'
|
||||
fr_RW: 'French (Rwanda)'
|
||||
fr_SN: 'French (Senegal)'
|
||||
fr_SC: 'French (Seychelles)'
|
||||
fr_BL: 'French (St. Barthélemy)'
|
||||
fr_MF: 'French (St. Martin)'
|
||||
fr_PM: 'French (St. Pierre & Miquelon)'
|
||||
fr_CH: 'French (Switzerland)'
|
||||
fr_SY: 'French (Syria)'
|
||||
fr_TG: 'French (Togo)'
|
||||
fr_TN: 'French (Tunisia)'
|
||||
fr_VU: 'French (Vanuatu)'
|
||||
fr_WF: 'French (Wallis & Futuna)'
|
||||
ff: 'Fulah'
|
||||
ff_CM: 'Fulah (Cameroon)'
|
||||
ff_GN: 'Fulah (Guinea)'
|
||||
ff_MR: 'Fulah (Mauritania)'
|
||||
ff_SN: 'Fulah (Senegal)'
|
||||
gl: 'Galician'
|
||||
gl_ES: 'Galician (Spain)'
|
||||
lg: 'Ganda'
|
||||
lg_UG: 'Ganda (Uganda)'
|
||||
ka: 'Georgian'
|
||||
ka_GE: 'Georgian (Georgia)'
|
||||
de: 'German'
|
||||
de_AT: 'German (Austria)'
|
||||
de_BE: 'German (Belgium)'
|
||||
de_DE: 'German (Germany)'
|
||||
de_LI: 'German (Liechtenstein)'
|
||||
de_LU: 'German (Luxembourg)'
|
||||
de_CH: 'German (Switzerland)'
|
||||
el: 'Greek'
|
||||
el_CY: 'Greek (Cyprus)'
|
||||
el_GR: 'Greek (Greece)'
|
||||
gu: 'Gujarati'
|
||||
gu_IN: 'Gujarati (India)'
|
||||
ha: 'Hausa'
|
||||
ha_GH: 'Hausa (Ghana)'
|
||||
ha_Latn_GH: 'Hausa (Latin, Ghana)'
|
||||
ha_Latn_NE: 'Hausa (Latin, Niger)'
|
||||
ha_Latn_NG: 'Hausa (Latin, Nigeria)'
|
||||
ha_Latn: 'Hausa (Latin)'
|
||||
ha_NE: 'Hausa (Niger)'
|
||||
ha_NG: 'Hausa (Nigeria)'
|
||||
he: 'Hebrew'
|
||||
he_IL: 'Hebrew (Israel)'
|
||||
hi: 'Hindi'
|
||||
hi_IN: 'Hindi (India)'
|
||||
hu: 'Hungarian'
|
||||
hu_HU: 'Hungarian (Hungary)'
|
||||
is: 'Icelandic'
|
||||
is_IS: 'Icelandic (Iceland)'
|
||||
ig: 'Igbo'
|
||||
ig_NG: 'Igbo (Nigeria)'
|
||||
id: 'Indonesian'
|
||||
id_ID: 'Indonesian (Indonesia)'
|
||||
ga: 'Irish'
|
||||
ga_IE: 'Irish (Ireland)'
|
||||
it: 'Italian'
|
||||
it_IT: 'Italian (Italy)'
|
||||
it_SM: 'Italian (San Marino)'
|
||||
it_CH: 'Italian (Switzerland)'
|
||||
ja: 'Japanese'
|
||||
ja_JP: 'Japanese (Japan)'
|
||||
kl: 'Kalaallisut'
|
||||
kl_GL: 'Kalaallisut (Greenland)'
|
||||
kn: 'Kannada'
|
||||
kn_IN: 'Kannada (India)'
|
||||
ks: 'Kashmiri'
|
||||
ks_Arab_IN: 'Kashmiri (Arabic, India)'
|
||||
ks_Arab: 'Kashmiri (Arabic)'
|
||||
ks_IN: 'Kashmiri (India)'
|
||||
kk: 'Kazakh'
|
||||
kk_Cyrl_KZ: 'Kazakh (Cyrillic, Kazakhstan)'
|
||||
kk_Cyrl: 'Kazakh (Cyrillic)'
|
||||
kk_KZ: 'Kazakh (Kazakhstan)'
|
||||
km: 'Khmer'
|
||||
km_KH: 'Khmer (Cambodia)'
|
||||
ki: 'Kikuyu'
|
||||
ki_KE: 'Kikuyu (Kenya)'
|
||||
rw: 'Kinyarwanda'
|
||||
rw_RW: 'Kinyarwanda (Rwanda)'
|
||||
ko: 'Korean'
|
||||
ko_KP: 'Korean (North Korea)'
|
||||
ko_KR: 'Korean (South Korea)'
|
||||
ky: 'Kyrgyz'
|
||||
ky_Cyrl_KG: 'Kyrgyz (Cyrillic, Kyrgyzstan)'
|
||||
ky_Cyrl: 'Kyrgyz (Cyrillic)'
|
||||
ky_KG: 'Kyrgyz (Kyrgyzstan)'
|
||||
lo: 'Lao'
|
||||
lo_LA: 'Lao (Laos)'
|
||||
lv: 'Latvian'
|
||||
lv_LV: 'Latvian (Latvia)'
|
||||
ln: 'Lingala'
|
||||
ln_AO: 'Lingala (Angola)'
|
||||
ln_CF: 'Lingala (Central African Republic)'
|
||||
ln_CG: 'Lingala (Congo - Brazzaville)'
|
||||
ln_CD: 'Lingala (Congo - Kinshasa)'
|
||||
lt: 'Lithuanian'
|
||||
lt_LT: 'Lithuanian (Lithuania)'
|
||||
lu: 'Luba-Katanga'
|
||||
lu_CD: 'Luba-Katanga (Congo - Kinshasa)'
|
||||
lb: 'Luxembourgish'
|
||||
lb_LU: 'Luxembourgish (Luxembourg)'
|
||||
mk: 'Macedonian'
|
||||
mk_MK: 'Macedonian (Macedonia)'
|
||||
mg: 'Malagasy'
|
||||
mg_MG: 'Malagasy (Madagascar)'
|
||||
ms: 'Malay'
|
||||
ms_BN: 'Malay (Brunei)'
|
||||
ms_Latn_BN: 'Malay (Latin, Brunei)'
|
||||
ms_Latn_MY: 'Malay (Latin, Malaysia)'
|
||||
ms_Latn_SG: 'Malay (Latin, Singapore)'
|
||||
ms_Latn: 'Malay (Latin)'
|
||||
ms_MY: 'Malay (Malaysia)'
|
||||
ms_SG: 'Malay (Singapore)'
|
||||
ml: 'Malayalam'
|
||||
ml_IN: 'Malayalam (India)'
|
||||
mt: 'Maltese'
|
||||
mt_MT: 'Maltese (Malta)'
|
||||
gv: 'Manx'
|
||||
gv_IM: 'Manx (Isle of Man)'
|
||||
mr: 'Marathi'
|
||||
mr_IN: 'Marathi (India)'
|
||||
mn: 'Mongolian'
|
||||
mn_Cyrl_MN: 'Mongolian (Cyrillic, Mongolia)'
|
||||
mn_Cyrl: 'Mongolian (Cyrillic)'
|
||||
mn_MN: 'Mongolian (Mongolia)'
|
||||
ne: 'Nepali'
|
||||
ne_IN: 'Nepali (India)'
|
||||
ne_NP: 'Nepali (Nepal)'
|
||||
nd: 'North Ndebele'
|
||||
nd_ZW: 'North Ndebele (Zimbabwe)'
|
||||
se: 'Northern Sami'
|
||||
se_FI: 'Northern Sami (Finland)'
|
||||
se_NO: 'Northern Sami (Norway)'
|
||||
se_SE: 'Northern Sami (Sweden)'
|
||||
no: 'Norwegian'
|
||||
no_NO: 'Norwegian (Norway)'
|
||||
nb: 'Norwegian Bokmål'
|
||||
nb_NO: 'Norwegian Bokmål (Norway)'
|
||||
nb_SJ: 'Norwegian Bokmål (Svalbard & Jan Mayen)'
|
||||
nn: 'Norwegian Nynorsk'
|
||||
nn_NO: 'Norwegian Nynorsk (Norway)'
|
||||
or: 'Oriya'
|
||||
or_IN: 'Oriya (India)'
|
||||
om: 'Oromo'
|
||||
om_ET: 'Oromo (Ethiopia)'
|
||||
om_KE: 'Oromo (Kenya)'
|
||||
os: 'Ossetic'
|
||||
os_GE: 'Ossetic (Georgia)'
|
||||
os_RU: 'Ossetic (Russia)'
|
||||
ps: 'Pashto'
|
||||
ps_AF: 'Pashto (Afghanistan)'
|
||||
fa: 'Persian'
|
||||
fa_AF: 'Persian (Afghanistan)'
|
||||
fa_IR: 'Persian (Iran)'
|
||||
pl: 'Polish'
|
||||
pl_PL: 'Polish (Poland)'
|
||||
pt: 'Portuguese'
|
||||
pt_AO: 'Portuguese (Angola)'
|
||||
pt_BR: 'Portuguese (Brazil)'
|
||||
pt_CV: 'Portuguese (Cape Verde)'
|
||||
pt_GW: 'Portuguese (Guinea-Bissau)'
|
||||
pt_MO: 'Portuguese (Macau SAR China)'
|
||||
pt_MZ: 'Portuguese (Mozambique)'
|
||||
pt_PT: 'Portuguese (Portugal)'
|
||||
pt_ST: 'Portuguese (São Tomé & Príncipe)'
|
||||
pt_TL: 'Portuguese (Timor-Leste)'
|
||||
pa: 'Punjabi'
|
||||
pa_Arab_PK: 'Punjabi (Arabic, Pakistan)'
|
||||
pa_Arab: 'Punjabi (Arabic)'
|
||||
pa_Guru_IN: 'Punjabi (Gurmukhi, India)'
|
||||
pa_Guru: 'Punjabi (Gurmukhi)'
|
||||
pa_IN: 'Punjabi (India)'
|
||||
pa_PK: 'Punjabi (Pakistan)'
|
||||
qu: 'Quechua'
|
||||
qu_BO: 'Quechua (Bolivia)'
|
||||
qu_EC: 'Quechua (Ecuador)'
|
||||
qu_PE: 'Quechua (Peru)'
|
||||
ro: 'Romanian'
|
||||
ro_MD: 'Romanian (Moldova)'
|
||||
ro_RO: 'Romanian (Romania)'
|
||||
rm: 'Romansh'
|
||||
rm_CH: 'Romansh (Switzerland)'
|
||||
rn: 'Rundi'
|
||||
rn_BI: 'Rundi (Burundi)'
|
||||
ru: 'Russian'
|
||||
ru_BY: 'Russian (Belarus)'
|
||||
ru_KZ: 'Russian (Kazakhstan)'
|
||||
ru_KG: 'Russian (Kyrgyzstan)'
|
||||
ru_MD: 'Russian (Moldova)'
|
||||
ru_RU: 'Russian (Russia)'
|
||||
ru_UA: 'Russian (Ukraine)'
|
||||
sg: 'Sango'
|
||||
sg_CF: 'Sango (Central African Republic)'
|
||||
gd: 'Scottish Gaelic'
|
||||
gd_GB: 'Scottish Gaelic (United Kingdom)'
|
||||
sr: 'Serbian'
|
||||
sr_BA: 'Serbian (Bosnia & Herzegovina)'
|
||||
sr_Cyrl_BA: 'Serbian (Cyrillic, Bosnia & Herzegovina)'
|
||||
sr_Cyrl_XK: 'Serbian (Cyrillic, Kosovo)'
|
||||
sr_Cyrl_ME: 'Serbian (Cyrillic, Montenegro)'
|
||||
sr_Cyrl_RS: 'Serbian (Cyrillic, Serbia)'
|
||||
sr_Cyrl: 'Serbian (Cyrillic)'
|
||||
sr_XK: 'Serbian (Kosovo)'
|
||||
sr_Latn_BA: 'Serbian (Latin, Bosnia & Herzegovina)'
|
||||
sr_Latn_XK: 'Serbian (Latin, Kosovo)'
|
||||
sr_Latn_ME: 'Serbian (Latin, Montenegro)'
|
||||
sr_Latn_RS: 'Serbian (Latin, Serbia)'
|
||||
sr_Latn: 'Serbian (Latin)'
|
||||
sr_ME: 'Serbian (Montenegro)'
|
||||
sr_RS: 'Serbian (Serbia)'
|
||||
sh: 'Serbo-Croatian'
|
||||
sh_BA: 'Serbo-Croatian (Bosnia & Herzegovina)'
|
||||
sn: 'Shona'
|
||||
sn_ZW: 'Shona (Zimbabwe)'
|
||||
ii: 'Sichuan Yi'
|
||||
ii_CN: 'Sichuan Yi (China)'
|
||||
si: 'Sinhala'
|
||||
si_LK: 'Sinhala (Sri Lanka)'
|
||||
sk: 'Slovak'
|
||||
sk_SK: 'Slovak (Slovakia)'
|
||||
sl: 'Slovenian'
|
||||
sl_SI: 'Slovenian (Slovenia)'
|
||||
so: 'Somali'
|
||||
so_DJ: 'Somali (Djibouti)'
|
||||
so_ET: 'Somali (Ethiopia)'
|
||||
so_KE: 'Somali (Kenya)'
|
||||
so_SO: 'Somali (Somalia)'
|
||||
es: 'Spanish'
|
||||
es_AR: 'Spanish (Argentina)'
|
||||
es_BO: 'Spanish (Bolivia)'
|
||||
es_IC: 'Spanish (Canary Islands)'
|
||||
es_EA: 'Spanish (Ceuta & Melilla)'
|
||||
es_CL: 'Spanish (Chile)'
|
||||
es_CO: 'Spanish (Colombia)'
|
||||
es_CR: 'Spanish (Costa Rica)'
|
||||
es_CU: 'Spanish (Cuba)'
|
||||
es_DO: 'Spanish (Dominican Republic)'
|
||||
es_EC: 'Spanish (Ecuador)'
|
||||
es_SV: 'Spanish (El Salvador)'
|
||||
es_GQ: 'Spanish (Equatorial Guinea)'
|
||||
es_GT: 'Spanish (Guatemala)'
|
||||
es_HN: 'Spanish (Honduras)'
|
||||
es_MX: 'Spanish (Mexico)'
|
||||
es_NI: 'Spanish (Nicaragua)'
|
||||
es_PA: 'Spanish (Panama)'
|
||||
es_PY: 'Spanish (Paraguay)'
|
||||
es_PE: 'Spanish (Peru)'
|
||||
es_PH: 'Spanish (Philippines)'
|
||||
es_PR: 'Spanish (Puerto Rico)'
|
||||
es_ES: 'Spanish (Spain)'
|
||||
es_US: 'Spanish (United States)'
|
||||
es_UY: 'Spanish (Uruguay)'
|
||||
es_VE: 'Spanish (Venezuela)'
|
||||
sw: 'Swahili'
|
||||
sw_KE: 'Swahili (Kenya)'
|
||||
sw_TZ: 'Swahili (Tanzania)'
|
||||
sw_UG: 'Swahili (Uganda)'
|
||||
sv: 'Swedish'
|
||||
sv_AX: 'Swedish (Åland Islands)'
|
||||
sv_FI: 'Swedish (Finland)'
|
||||
sv_SE: 'Swedish (Sweden)'
|
||||
tl: 'Tagalog'
|
||||
tl_PH: 'Tagalog (Philippines)'
|
||||
ta: 'Tamil'
|
||||
ta_IN: 'Tamil (India)'
|
||||
ta_MY: 'Tamil (Malaysia)'
|
||||
ta_SG: 'Tamil (Singapore)'
|
||||
ta_LK: 'Tamil (Sri Lanka)'
|
||||
te: 'Telugu'
|
||||
te_IN: 'Telugu (India)'
|
||||
th: 'Thai'
|
||||
th_TH: 'Thai (Thailand)'
|
||||
bo: 'Tibetan'
|
||||
bo_CN: 'Tibetan (China)'
|
||||
bo_IN: 'Tibetan (India)'
|
||||
ti: 'Tigrinya'
|
||||
ti_ER: 'Tigrinya (Eritrea)'
|
||||
ti_ET: 'Tigrinya (Ethiopia)'
|
||||
to: 'Tongan'
|
||||
to_TO: 'Tongan (Tonga)'
|
||||
tr: 'Turkish'
|
||||
tr_CY: 'Turkish (Cyprus)'
|
||||
tr_TR: 'Turkish (Turkey)'
|
||||
uk: 'Ukrainian'
|
||||
uk_UA: 'Ukrainian (Ukraine)'
|
||||
ur: 'Urdu'
|
||||
ur_IN: 'Urdu (India)'
|
||||
ur_PK: 'Urdu (Pakistan)'
|
||||
ug: 'Uyghur'
|
||||
ug_Arab_CN: 'Uyghur (Arabic, China)'
|
||||
ug_Arab: 'Uyghur (Arabic)'
|
||||
ug_CN: 'Uyghur (China)'
|
||||
uz: 'Uzbek'
|
||||
uz_AF: 'Uzbek (Afghanistan)'
|
||||
uz_Arab_AF: 'Uzbek (Arabic, Afghanistan)'
|
||||
uz_Arab: 'Uzbek (Arabic)'
|
||||
uz_Cyrl_UZ: 'Uzbek (Cyrillic, Uzbekistan)'
|
||||
uz_Cyrl: 'Uzbek (Cyrillic)'
|
||||
uz_Latn_UZ: 'Uzbek (Latin, Uzbekistan)'
|
||||
uz_Latn: 'Uzbek (Latin)'
|
||||
uz_UZ: 'Uzbek (Uzbekistan)'
|
||||
vi: 'Vietnamese'
|
||||
vi_VN: 'Vietnamese (Vietnam)'
|
||||
cy: 'Welsh'
|
||||
cy_GB: 'Welsh (United Kingdom)'
|
||||
fy: 'Western Frisian'
|
||||
fy_NL: 'Western Frisian (Netherlands)'
|
||||
yi: 'Yiddish'
|
||||
yo: 'Yoruba'
|
||||
yo_BJ: 'Yoruba (Benin)'
|
||||
yo_NG: 'Yoruba (Nigeria)'
|
||||
zu: 'Zulu'
|
||||
zu_ZA: 'Zulu (South Africa)'
|
||||
117
research/chatwoot/config/llm.yml
Normal file
117
research/chatwoot/config/llm.yml
Normal file
@@ -0,0 +1,117 @@
|
||||
aproviders:
|
||||
openai:
|
||||
display_name: 'OpenAI'
|
||||
anthropic:
|
||||
display_name: 'Anthropic'
|
||||
gemini:
|
||||
display_name: 'Gemini'
|
||||
|
||||
models:
|
||||
gpt-4.1:
|
||||
provider: openai
|
||||
display_name: 'GPT-4.1'
|
||||
credit_multiplier: 3
|
||||
gpt-4.1-mini:
|
||||
provider: openai
|
||||
display_name: 'GPT-4.1 Mini'
|
||||
credit_multiplier: 1
|
||||
gpt-4.1-nano:
|
||||
provider: openai
|
||||
display_name: 'GPT-4.1 Nano'
|
||||
credit_multiplier: 1
|
||||
gpt-5.1:
|
||||
provider: openai
|
||||
display_name: 'GPT-5.1'
|
||||
credit_multiplier: 2
|
||||
gpt-5-mini:
|
||||
provider: openai
|
||||
display_name: 'GPT-5 Mini'
|
||||
credit_multiplier: 1
|
||||
gpt-5-nano:
|
||||
provider: openai
|
||||
display_name: 'GPT-5 Nano'
|
||||
credit_multiplier: 1
|
||||
gpt-5.2:
|
||||
provider: openai
|
||||
display_name: 'GPT-5.2'
|
||||
credit_multiplier: 3
|
||||
claude-haiku-4.5:
|
||||
provider: anthropic
|
||||
display_name: 'Claude Haiku 4.5'
|
||||
coming_soon: true
|
||||
credit_multiplier: 2
|
||||
claude-sonnet-4.5:
|
||||
provider: anthropic
|
||||
display_name: 'Claude Sonnet 4.5'
|
||||
coming_soon: true
|
||||
credit_multiplier: 3
|
||||
gemini-3-flash:
|
||||
provider: gemini
|
||||
display_name: 'Gemini 3 Flash'
|
||||
coming_soon: true
|
||||
credit_multiplier: 1
|
||||
gemini-3-pro:
|
||||
provider: gemini
|
||||
display_name: 'Gemini 3 Pro'
|
||||
coming_soon: true
|
||||
credit_multiplier: 3
|
||||
whisper-1:
|
||||
provider: openai
|
||||
display_name: 'Whisper'
|
||||
credit_multiplier: 1
|
||||
text-embedding-3-small:
|
||||
provider: openai
|
||||
display_name: 'Text Embedding 3 Small'
|
||||
credit_multiplier: 1
|
||||
|
||||
features:
|
||||
editor:
|
||||
models:
|
||||
[
|
||||
gpt-4.1-mini,
|
||||
gpt-4.1-nano,
|
||||
gpt-5-mini,
|
||||
gpt-4.1,
|
||||
gpt-5.1,
|
||||
gpt-5.2,
|
||||
claude-haiku-4.5,
|
||||
gemini-3-flash,
|
||||
gemini-3-pro,
|
||||
]
|
||||
default: gpt-4.1-mini
|
||||
assistant:
|
||||
models:
|
||||
[
|
||||
gpt-5-mini,
|
||||
gpt-4.1,
|
||||
gpt-5.1,
|
||||
gpt-5.2,
|
||||
claude-haiku-4.5,
|
||||
claude-sonnet-4.5,
|
||||
gemini-3-flash,
|
||||
gemini-3-pro,
|
||||
]
|
||||
default: gpt-5.1
|
||||
copilot:
|
||||
models:
|
||||
[
|
||||
gpt-5-mini,
|
||||
gpt-4.1,
|
||||
gpt-5.1,
|
||||
gpt-5.2,
|
||||
claude-haiku-4.5,
|
||||
claude-sonnet-4.5,
|
||||
gemini-3-flash,
|
||||
gemini-3-pro,
|
||||
]
|
||||
default: gpt-5.1
|
||||
label_suggestion:
|
||||
models:
|
||||
[gpt-4.1-nano, gpt-4.1-mini, gpt-5-mini, gemini-3-flash, claude-haiku-4.5]
|
||||
default: gpt-4.1-nano
|
||||
audio_transcription:
|
||||
models: [whisper-1]
|
||||
default: whisper-1
|
||||
help_center_search:
|
||||
models: [text-embedding-3-small]
|
||||
default: text-embedding-3-small
|
||||
440
research/chatwoot/config/locales/am.yml
Normal file
440
research/chatwoot/config/locales/am.yml
Normal file
@@ -0,0 +1,440 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
am:
|
||||
hello: 'Hello world'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'Please enter a valid email address'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: Woot! Request for password reset is successful. Check your mail for instructions.
|
||||
reset_password_failure: Uh ho! We could not find any user with the specified email.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: Your inbox deletion request will be processed in some time.
|
||||
errors:
|
||||
validations:
|
||||
presence: must not be blank
|
||||
webhook:
|
||||
invalid: Invalid events
|
||||
signup:
|
||||
disposable_email: We do not allow disposable emails
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: You have entered an invalid email
|
||||
email_already_exists: 'You have already signed up for an account with %{email}'
|
||||
invalid_params: 'Invalid, please check the signup paramters and try again'
|
||||
failed: Signup failed
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: Invalid data type
|
||||
contacts:
|
||||
import:
|
||||
failed: File is blank
|
||||
export:
|
||||
success: We will notify you once contacts export file is ready to view.
|
||||
email:
|
||||
invalid: Invalid email
|
||||
phone_number:
|
||||
invalid: should be in e164 format
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: should be unique in the category and portal
|
||||
dyte:
|
||||
invalid_message_type: 'Invalid message type. Action not permitted'
|
||||
slack:
|
||||
invalid_channel_id: 'Invalid slack channel. Please try again'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: Please check the network connection, IMAP address and try again.
|
||||
no_response_error: Please check the IMAP credentials and try again.
|
||||
host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
|
||||
connection_timed_out_error: Connection timed out for %{address}:%{port}
|
||||
connection_closed_error: Connection closed.
|
||||
validations:
|
||||
name: should not start or end with symbols, and it should not have < > / \ @ characters.
|
||||
custom_filters:
|
||||
number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
|
||||
invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
|
||||
invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: Reporting period %{since} to %{until}
|
||||
utc_warning: The report generated is in UTC timezone
|
||||
agent_csv:
|
||||
agent_name: Agent name
|
||||
conversations_count: Assigned conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Resolution Count
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
inbox_csv:
|
||||
inbox_name: Inbox name
|
||||
inbox_type: Inbox type
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
label_csv:
|
||||
label_title: Label
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
avg_reply_time: Avg reply time
|
||||
resolution_count: Resolution Count
|
||||
team_csv:
|
||||
team_name: Team name
|
||||
conversations_count: Conversations count
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Resolution Count
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
conversation_traffic_csv:
|
||||
timezone: Timezone
|
||||
sla_csv:
|
||||
conversation_id: Conversation ID
|
||||
sla_policy_breached: SLA Policy
|
||||
assignee: Assignee
|
||||
team: Team
|
||||
inbox: Inbox
|
||||
labels: Labels
|
||||
conversation_link: Link to the Conversation
|
||||
breached_events: Breached Events
|
||||
default_group_by: day
|
||||
csat:
|
||||
headers:
|
||||
contact_name: Contact Name
|
||||
contact_email_address: Contact Email Address
|
||||
contact_phone_number: Contact Phone Number
|
||||
link_to_the_conversation: Link to the conversation
|
||||
agent_name: Agent Name
|
||||
rating: Rating
|
||||
feedback: Feedback Comment
|
||||
recorded_at: Recorded date
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
|
||||
conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
|
||||
assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
|
||||
conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
|
||||
sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
|
||||
sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
|
||||
sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
|
||||
attachment: 'Attachment'
|
||||
no_content: 'No content'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'Transferring to another agent for further assistance.'
|
||||
messages:
|
||||
instagram_story_content: '%{story_sender} mentioned you in the story: '
|
||||
instagram_deleted_story_content: This story is no longer available.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: This message was deleted
|
||||
whatsapp:
|
||||
list_button_label: 'Choose an item'
|
||||
delivery_status:
|
||||
error_code: 'Error code: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
|
||||
open: 'Conversation was marked open by %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'Conversation was marked resolved by %{user_name}'
|
||||
contact_resolved: 'Conversation was resolved by %{contact_name}'
|
||||
open: 'Conversation was reopened by %{user_name}'
|
||||
pending: 'Conversation was marked as pending by %{user_name}'
|
||||
snoozed: 'Conversation was snoozed by %{user_name}'
|
||||
auto_resolved_days: 'Conversation was marked resolved by system due to %{count} days of inactivity'
|
||||
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
|
||||
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
|
||||
system_auto_open: System reopened the conversation due to a new incoming message.
|
||||
priority:
|
||||
added: '%{user_name} set the priority to %{new_priority}'
|
||||
updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
|
||||
removed: '%{user_name} removed the priority'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} self-assigned this conversation'
|
||||
assigned: 'Assigned to %{assignee_name} by %{user_name}'
|
||||
removed: 'Conversation unassigned by %{user_name}'
|
||||
team:
|
||||
assigned: 'Assigned to %{team_name} by %{user_name}'
|
||||
assigned_with_assignee: 'Assigned to %{assignee_name} via %{team_name} by %{user_name}'
|
||||
removed: 'Unassigned from %{team_name} by %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} added %{labels}'
|
||||
removed: '%{user_name} removed %{labels}'
|
||||
sla:
|
||||
added: '%{user_name} added SLA policy %{sla_name}'
|
||||
removed: '%{user_name} removed SLA policy %{sla_name}'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} has muted the conversation'
|
||||
unmuted: '%{user_name} has unmuted the conversation'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} typically replies in a few hours.'
|
||||
ways_to_reach_you_message_body: 'Give the team a way to reach you.'
|
||||
email_input_box_message_body: 'Get notified by email'
|
||||
csat_input_message_body: 'Please rate the conversation'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'Notifications'
|
||||
from_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <reply+%{reply_email}>'
|
||||
friendly_name: '%{sender_name} from %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'New messages on this conversation'
|
||||
transcript_subject: 'Conversation Transcript'
|
||||
survey:
|
||||
response: 'Please rate this conversation, %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} is Online, please try again later'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'Dashboard Apps'
|
||||
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
||||
meeting_name: '%{agent_name} has started a meeting'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
||||
webhooks:
|
||||
name: 'Webhooks'
|
||||
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
||||
google_translate:
|
||||
name: 'Google Translate'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
||||
notion:
|
||||
name: 'Notion'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: Message is required
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: Search for article by title or body...
|
||||
empty_placeholder: No results found.
|
||||
loading_placeholder: Searching...
|
||||
results_title: Search results
|
||||
toc_header: 'On this page'
|
||||
hero:
|
||||
sub_title: Search for the articles here or browse the categories below.
|
||||
common:
|
||||
home: Home
|
||||
last_updated_on: Last updated on %{last_updated_on}
|
||||
view_all_articles: View all
|
||||
article: article
|
||||
articles: articles
|
||||
author: author
|
||||
authors: authors
|
||||
other: other
|
||||
others: others
|
||||
by: By
|
||||
no_articles: There are no articles here
|
||||
footer:
|
||||
made_with: Made with
|
||||
header:
|
||||
go_to_homepage: Website
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: System
|
||||
light: Light
|
||||
dark: Dark
|
||||
featured_articles: Featured Articles
|
||||
uncategorized: Uncategorized
|
||||
404:
|
||||
title: Page not found
|
||||
description: We couldn't find the page you were looking for.
|
||||
back_to_home: Go to home page
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: Name
|
||||
email: Email
|
||||
phone_number: Phone
|
||||
company_name: Company
|
||||
inbox_name: Inbox
|
||||
inbox_type: Inbox Type
|
||||
button: Open conversation
|
||||
time_units:
|
||||
days:
|
||||
one: '%{count} day'
|
||||
other: '%{count} days'
|
||||
hours:
|
||||
one: '%{count} hour'
|
||||
other: '%{count} hours'
|
||||
minutes:
|
||||
one: '%{count} minute'
|
||||
other: '%{count} minutes'
|
||||
seconds:
|
||||
one: '%{count} second'
|
||||
other: '%{count} seconds'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[No content]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'Email is required'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
456
research/chatwoot/config/locales/ar.yml
Normal file
456
research/chatwoot/config/locales/ar.yml
Normal file
@@ -0,0 +1,456 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
ar:
|
||||
hello: 'مرحباً بالعالم'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'الرجاء إدخال عنوان بريد إلكتروني صحيح'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: تم إرسال طلب إعادة تعيين كلمة المرور. يرجى مراجعة بريدك الإلكتروني للحصول على التعليمات.
|
||||
reset_password_failure: المعذرة! لم نتمكن من العثور على أي مستخدم بعنوان البريد الإلكتروني المحدد.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: سيتم معالجة طلب حذف صندوق الوارد الخاص بك في بعض الوقت.
|
||||
errors:
|
||||
validations:
|
||||
presence: يجب ألا يكون فارغاً
|
||||
webhook:
|
||||
invalid: أحداث غير صالحة
|
||||
signup:
|
||||
disposable_email: نحن لا نسمح باسخدام عناوين البريد الإلكتروني المؤقتة
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: لقد قمت بإدخال عنوان بريد إلكتروني غير صالح
|
||||
email_already_exists: 'لقد قمت بالفعل بتسجيل حساب سابقاً بالعنوان %{email}'
|
||||
invalid_params: 'غير صالح، الرجاء التحقق من خانات التسجيل وحاول مرة أخرى'
|
||||
failed: فشلت عملية التسجيل
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: نوع البيانات غير صالح
|
||||
contacts:
|
||||
import:
|
||||
failed: الملف فارغ
|
||||
export:
|
||||
success: سنقوم بإعلامك بمجرد أن يكون ملف تصدير جهات الاتصال جاهزاً للعرض.
|
||||
email:
|
||||
invalid: إيميل غير صالح
|
||||
phone_number:
|
||||
invalid: يجب أن يكون بصيغة e164
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: يجب أن تكون فريدة من نوعها في الفئة والبوابة
|
||||
dyte:
|
||||
invalid_message_type: 'نوع الرسالة غير صالح. الإجراء غير مسموح به'
|
||||
slack:
|
||||
invalid_channel_id: 'قناة Slack غير صحيحة. الرجاء المحاولة مرة أخرى'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: الرجاء التحقق من اتصال الشبكة وعنوان IMAP ثم حاول مرة أخرى.
|
||||
no_response_error: الرجاء التحقق من بيانات اعتماد IMAP ثم حاول مرة أخرى.
|
||||
host_unreachable_error: المضيف لا يمكن الوصول إليه، الرجاء التحقق من عنوان IMAP ومنفذ IMAP ثم حاول مرة أخرى.
|
||||
connection_timed_out_error: انتهت مهلة الاتصال لـ %{address}:%{port}
|
||||
connection_closed_error: تم إغلاق الاتصال.
|
||||
validations:
|
||||
name: لا ينبغي أن تبدأ أو تنتهي بالرموز، ولا ينبغي أن يكون أقل من > / \ أحرف @ .
|
||||
custom_filters:
|
||||
number_of_records: تم الوصول إلى الحد الأقصى. الحد الأقصى لعدد عوامل التصفية المخصصة المسموح به للمستخدم لكل حساب هو 1000.
|
||||
invalid_attribute: مفتاح السمة غير صالح - [%{key}]. يجب أن يكون المفتاح واحد من [%{allowed_keys}] أو سمة مخصصة محددة في الحساب.
|
||||
invalid_operator: مشغل غير صالح. المشغل المسموح به لـ %{attribute_name} هو [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: قيمة غير صالحة. القيم المقدمة ل %{attribute_name} غير صالحة
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: فترة التبليغ %{since} إلى %{until}
|
||||
utc_warning: التقرير الذي تم إنشاؤه في التوقيت العالمي الموحّد
|
||||
agent_csv:
|
||||
agent_name: اسم الوكيل
|
||||
conversations_count: المحادثات المعينة
|
||||
avg_first_response_time: متوسط وقت الاستجابة الأولى
|
||||
avg_resolution_time: متوسط وقت الحل
|
||||
resolution_count: عدد مرات الإغلاق
|
||||
avg_customer_waiting_time: متوسط وقت انتظار العميل
|
||||
inbox_csv:
|
||||
inbox_name: اسم صندوق الوارد
|
||||
inbox_type: نوع صندوق البريد
|
||||
conversations_count: عدد المحادثات
|
||||
avg_first_response_time: متوسط وقت الرد الأول
|
||||
avg_resolution_time: متوسط وقت الحل
|
||||
label_csv:
|
||||
label_title: الوسم
|
||||
conversations_count: عدد المحادثات
|
||||
avg_first_response_time: متوسط وقت الرد الأول
|
||||
avg_resolution_time: متوسط وقت الحل
|
||||
avg_reply_time: معدل وقت الرد
|
||||
resolution_count: عدد مرات الإغلاق
|
||||
team_csv:
|
||||
team_name: اسم الفريق
|
||||
conversations_count: عدد المحادثات
|
||||
avg_first_response_time: متوسط وقت الرد الأول
|
||||
avg_resolution_time: متوسط وقت الحل
|
||||
resolution_count: عدد مرات الإغلاق
|
||||
avg_customer_waiting_time: متوسط وقت انتظار العميل
|
||||
conversation_traffic_csv:
|
||||
timezone: منطقة زمنية
|
||||
sla_csv:
|
||||
conversation_id: معرف المحادثة
|
||||
sla_policy_breached: سياسة مستوى الخدمة
|
||||
assignee: المكلَّف
|
||||
team: الفريق
|
||||
inbox: صندوق الوارد
|
||||
labels: الوسوم
|
||||
conversation_link: رابط للمحادثة
|
||||
breached_events: أحداث الخرق
|
||||
default_group_by: اليوم
|
||||
csat:
|
||||
headers:
|
||||
contact_name: اسم جهة الاتصال
|
||||
contact_email_address: عنوان البريد الإلكتروني الخاص بجهة الاتصال
|
||||
contact_phone_number: رقم هاتف جهة الاتصال
|
||||
link_to_the_conversation: رابط إلى المحادثة
|
||||
agent_name: اسم الوكيل
|
||||
rating: التقييم
|
||||
feedback: التعليق على الملاحظات
|
||||
recorded_at: تاريخ التسجيل
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'تم إنشاء محادثة (#%{display_id}) في %{inbox_name}'
|
||||
conversation_assignment: 'تم تعيين محادثة (#%{display_id}) لك'
|
||||
assigned_conversation_new_message: 'تم إنشاء رسالة جديدة في المحادثة (#%{display_id})'
|
||||
conversation_mention: 'تمت الإشارة إليك في المحادثة من قبل (#%{display_id})'
|
||||
sla_missed_first_response: 'هدف سياسة خدمة أول رد مفقود للمحادثة (#%{display_id})'
|
||||
sla_missed_next_response: 'هدف سياسة خدمة الرد القادم مفقود للمحادثة (#%{display_id})'
|
||||
sla_missed_resolution: 'هدف سياسة خدمة أول حل مفقود للمحادثة (#%{display_id})'
|
||||
attachment: 'المرفقات'
|
||||
no_content: 'لا يوجد محتوى'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'تحويل إلى وكيل آخر لمزيد من المساعدة.'
|
||||
messages:
|
||||
instagram_story_content: 'أشار %{story_sender} إليك في القصة: '
|
||||
instagram_deleted_story_content: هذه القصة لم تعد متاحة.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: تم حذف هذه الرسالة
|
||||
whatsapp:
|
||||
list_button_label: 'اختر عنصر'
|
||||
delivery_status:
|
||||
error_code: 'رمز الخطأ: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'تم تحديد هذه المحادثة كمحلولة بواسطة %{user_name} بسبب عدم النشاط'
|
||||
open: 'تم تحديد هذه المحادثة كمفتوحة بواسطة %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'تم تحديث حالة المحادثة لـ"مغلقة" بواسطة %{user_name}'
|
||||
contact_resolved: 'تم حل المحادثة بواسطة %{contact_name}'
|
||||
open: 'تم إعادة فتح المحادثة بواسطة %{user_name}'
|
||||
pending: 'تم تحديث حالة المحادثة لـ"معلقة" بواسطة %{user_name}'
|
||||
snoozed: 'تم تأجيل المحادثة بواسطة %{user_name}'
|
||||
auto_resolved_days: 'تم وضع علامة على المحادثة كمحلولة من قبل النظام بسبب %{count} أيام من عدم النشاط'
|
||||
auto_resolved_hours: 'تم تحديد هذه المحادثة كمحلولة بواسطة النظام بسبب عدم النشاط لمدة %{count} ساعات'
|
||||
auto_resolved_minutes: 'تم تحديد هذه المحادثة كمحلولة بواسطة النظام بسبب عدم النشاط لمدة %{count} دقائق'
|
||||
system_auto_open: أعاد النظام فتح المحادثة بسبب رسالة واردة جديدة.
|
||||
priority:
|
||||
added: '%{user_name} حدد الأولوية إلى %{new_priority}'
|
||||
updated: '%{user_name} غيّر الأولوية من %{old_priority} إلى %{new_priority}'
|
||||
removed: '%{user_name} أزال الأولوية'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} تم تعيينه تلقائياً لهذه المحادثة'
|
||||
assigned: 'تم إسنادها إلى %{assignee_name} بواسطة %{user_name}'
|
||||
removed: 'المحادثة غير مسندة بواسطة %{user_name}'
|
||||
team:
|
||||
assigned: 'تم إسنادها إلى %{team_name} بواسطة %{user_name}'
|
||||
assigned_with_assignee: 'تم تعيينه إلى %{assignee_name} عبر %{team_name} بواسطة %{user_name}'
|
||||
removed: 'إلغاء التعيين من %{team_name} بواسطة %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} أضاف %{labels}'
|
||||
removed: '%{user_name} أزال %{labels}'
|
||||
sla:
|
||||
added: '%{user_name} أضاف سياسة مستوى الخدمة %{sla_name}'
|
||||
removed: '%{user_name} أزال سياسة مستوى الخدمة %{sla_name}'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} كتم صوت المحادثة'
|
||||
unmuted: '%{user_name} قام بإلغاء كتم المحادثة'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} يرد عادة خلال بضع ساعات.'
|
||||
ways_to_reach_you_message_body: 'زودنا بوسيلة للتواصل معك.'
|
||||
email_input_box_message_body: 'احصل على الإشعارات في البريد الإلكتروني'
|
||||
csat_input_message_body: 'الرجاء تقييم المحادثة'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'الإشعارات'
|
||||
from_with_name: '%{assignee_name} من %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} من %{inbox_name} <%{reply_email}>'
|
||||
friendly_name: '%{sender_name} من %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} من %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'رسائل جديدة في هذه المحادثة'
|
||||
transcript_subject: 'نص المحادثة'
|
||||
survey:
|
||||
response: 'الرجاء تقييم هذه المحادثة، %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} متصل، يرجى المحاولة مرة أخرى لاحقاً'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'تطبيقات لوحة التحكم'
|
||||
description: 'تسمح لك تطبيقات لوحة التحكم بإنشاء وتضمين التطبيقات التي تعرض معلومات المستخدم أو الطلبات أو سجل الدفع، مما يوفر المزيد من السياق لوكلاء دعم العملاء الخاص بك.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte هو منتج يدمج وظائف الصوت والفيديو في تطبيقك. مع هذا الدمج، يمكن لوكلائك بدء مكالمات الفيديو/الصوت مع عملائك مباشرة من Chatwoot.'
|
||||
meeting_name: 'بدأ %{agent_name} اجتماعاً'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "دمج Chatwoot مع Slack للحفاظ على مزامنة فريقك. هذا التكامل يسمح لك باستلام إشعارات للمحادثات الجديدة والرد عليها مباشرة داخل واجهة Slacks."
|
||||
webhooks:
|
||||
name: 'Webhook'
|
||||
description: 'أحداث Webhook توفر تحديثات في الوقت الحقيقي حول الأنشطة في حساب Chatwoot الخاص بك. يمكنك الاشتراك في الأحداث المفضلة الخاصة بك، وسترسل Chatwoot لك اتصالات HTTP مع التحديثات.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'بناء روبوتات الدردشة مع حركة الاتصال ودمجها بسهولة في صندوق الوارد الخاص بك. يمكن لهذه الروبوتات التعامل مع الاستفسارات الأولية قبل نقلها إلى وكيل خدمة العملاء.'
|
||||
google_translate:
|
||||
name: 'ترجمة Google'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "دمج ترجمة جوجل لمساعدة الوكلاء على ترجمة رسائل العملاء بسهولة. هذا الدمج يكشف تلقائياً اللغة ويحولها إلى اللغة المفضلة لدى الوكيل أو المدير."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'الاستفادة من قوة نماذج اللغات الكبيرة من OpenAI مع ميزات مثل اقتراحات الرد، التلخيص، إعادة صياغة الرسائل، التحقق الإملائي، تصنيف البطاقات.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'إنشاء مشكلات في Linear مباشرة من نافذة المحادثة الخاصة بك. بدلاً من ذلك، قم بربط مشكلات Linear القائمة من أجل عملية تتبع أكثر تبسيطاً وكفاءة.'
|
||||
notion:
|
||||
name: 'نوشن'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: الرسالة مطلوبة
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: البحث عن مقالة حسب العنوان أو الجسم...
|
||||
empty_placeholder: لم يتم العثور على النتائج.
|
||||
loading_placeholder: جاري البحث...
|
||||
results_title: نتائج البحث
|
||||
toc_header: 'في هذه الصفحة'
|
||||
hero:
|
||||
sub_title: ابحث عن المقالات هنا أو تصفح الفئات أدناه.
|
||||
common:
|
||||
home: الرئيسية
|
||||
last_updated_on: آخر تحديث في %{last_updated_on}
|
||||
view_all_articles: عرض الكل
|
||||
article: مقال
|
||||
articles: المقالات
|
||||
author: المؤلف
|
||||
authors: المؤلفون
|
||||
other: آخر
|
||||
others: الآخرين
|
||||
by: بواسطة
|
||||
no_articles: لا توجد مقالات
|
||||
footer:
|
||||
made_with: صنع بـ
|
||||
header:
|
||||
go_to_homepage: الموقع الإلكتروني
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: النظام
|
||||
light: فاتح
|
||||
dark: مظلم
|
||||
featured_articles: المقالات المميزة
|
||||
uncategorized: غير مصنف
|
||||
404:
|
||||
title: لم يتم العثور على الصفحة
|
||||
description: لم نتمكن من العثور على الصفحة التي تبحث عنها.
|
||||
back_to_home: الذهاب إلى الصفحة الرئيسية
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: الاسم
|
||||
email: البريد الإلكتروني
|
||||
phone_number: هاتف
|
||||
company_name: المنشأة
|
||||
inbox_name: صندوق الوارد
|
||||
inbox_type: نوع صندوق الوارد
|
||||
button: فتح المحادثة
|
||||
time_units:
|
||||
days:
|
||||
zero: '%{count} يوم'
|
||||
one: '%{count} يوم'
|
||||
two: '%{count} يوم'
|
||||
few: '%{count} أيام'
|
||||
many: '%{count} أيام'
|
||||
other: '%{count} يوم'
|
||||
hours:
|
||||
zero: '%{count} ساعة'
|
||||
one: '%{count} ساعة'
|
||||
two: '%{count} ساعات'
|
||||
few: '%{count} ساعات'
|
||||
many: '%{count} ساعة'
|
||||
other: '%{count} ساعة'
|
||||
minutes:
|
||||
zero: '%{count} دقيقة'
|
||||
one: '%{count} دقيقة'
|
||||
two: '%{count} دقائق'
|
||||
few: '%{count} دقائق'
|
||||
many: '%{count} دقيقة'
|
||||
other: '%{count} دقيقة'
|
||||
seconds:
|
||||
zero: '%{count} ثانية'
|
||||
one: '%{count} ثانية'
|
||||
two: '%{count} ثواني'
|
||||
few: '%{count} ثواني'
|
||||
many: '%{count} ثانية'
|
||||
other: '%{count} ثانية'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[لا يوجد محتوى]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'البريد الإلكتروني مطلوب'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
440
research/chatwoot/config/locales/az.yml
Normal file
440
research/chatwoot/config/locales/az.yml
Normal file
@@ -0,0 +1,440 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
az:
|
||||
hello: 'Hello world'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'Please enter a valid email address'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: Woot! Request for password reset is successful. Check your mail for instructions.
|
||||
reset_password_failure: Uh ho! We could not find any user with the specified email.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: Your inbox deletion request will be processed in some time.
|
||||
errors:
|
||||
validations:
|
||||
presence: must not be blank
|
||||
webhook:
|
||||
invalid: Invalid events
|
||||
signup:
|
||||
disposable_email: We do not allow disposable emails
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: You have entered an invalid email
|
||||
email_already_exists: 'You have already signed up for an account with %{email}'
|
||||
invalid_params: 'Invalid, please check the signup paramters and try again'
|
||||
failed: Signup failed
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: Invalid data type
|
||||
contacts:
|
||||
import:
|
||||
failed: File is blank
|
||||
export:
|
||||
success: We will notify you once contacts export file is ready to view.
|
||||
email:
|
||||
invalid: Invalid email
|
||||
phone_number:
|
||||
invalid: should be in e164 format
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: should be unique in the category and portal
|
||||
dyte:
|
||||
invalid_message_type: 'Invalid message type. Action not permitted'
|
||||
slack:
|
||||
invalid_channel_id: 'Invalid slack channel. Please try again'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: Please check the network connection, IMAP address and try again.
|
||||
no_response_error: Please check the IMAP credentials and try again.
|
||||
host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
|
||||
connection_timed_out_error: Connection timed out for %{address}:%{port}
|
||||
connection_closed_error: Connection closed.
|
||||
validations:
|
||||
name: should not start or end with symbols, and it should not have < > / \ @ characters.
|
||||
custom_filters:
|
||||
number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
|
||||
invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
|
||||
invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: Reporting period %{since} to %{until}
|
||||
utc_warning: The report generated is in UTC timezone
|
||||
agent_csv:
|
||||
agent_name: Agent name
|
||||
conversations_count: Assigned conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Resolution Count
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
inbox_csv:
|
||||
inbox_name: Inbox name
|
||||
inbox_type: Inbox type
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
label_csv:
|
||||
label_title: Label
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
avg_reply_time: Avg reply time
|
||||
resolution_count: Resolution Count
|
||||
team_csv:
|
||||
team_name: Team name
|
||||
conversations_count: Conversations count
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Resolution Count
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
conversation_traffic_csv:
|
||||
timezone: Timezone
|
||||
sla_csv:
|
||||
conversation_id: Conversation ID
|
||||
sla_policy_breached: SLA Policy
|
||||
assignee: Assignee
|
||||
team: Team
|
||||
inbox: Inbox
|
||||
labels: Labels
|
||||
conversation_link: Link to the Conversation
|
||||
breached_events: Breached Events
|
||||
default_group_by: day
|
||||
csat:
|
||||
headers:
|
||||
contact_name: Contact Name
|
||||
contact_email_address: Contact Email Address
|
||||
contact_phone_number: Contact Phone Number
|
||||
link_to_the_conversation: Link to the conversation
|
||||
agent_name: Agent Name
|
||||
rating: Rating
|
||||
feedback: Feedback Comment
|
||||
recorded_at: Recorded date
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
|
||||
conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
|
||||
assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
|
||||
conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
|
||||
sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
|
||||
sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
|
||||
sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
|
||||
attachment: 'Attachment'
|
||||
no_content: 'No content'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'Transferring to another agent for further assistance.'
|
||||
messages:
|
||||
instagram_story_content: '%{story_sender} mentioned you in the story: '
|
||||
instagram_deleted_story_content: This story is no longer available.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: This message was deleted
|
||||
whatsapp:
|
||||
list_button_label: 'Choose an item'
|
||||
delivery_status:
|
||||
error_code: 'Error code: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
|
||||
open: 'Conversation was marked open by %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'Conversation was marked resolved by %{user_name}'
|
||||
contact_resolved: 'Conversation was resolved by %{contact_name}'
|
||||
open: 'Conversation was reopened by %{user_name}'
|
||||
pending: 'Conversation was marked as pending by %{user_name}'
|
||||
snoozed: 'Conversation was snoozed by %{user_name}'
|
||||
auto_resolved_days: 'Conversation was marked resolved by system due to %{count} days of inactivity'
|
||||
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
|
||||
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
|
||||
system_auto_open: System reopened the conversation due to a new incoming message.
|
||||
priority:
|
||||
added: '%{user_name} set the priority to %{new_priority}'
|
||||
updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
|
||||
removed: '%{user_name} removed the priority'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} self-assigned this conversation'
|
||||
assigned: 'Assigned to %{assignee_name} by %{user_name}'
|
||||
removed: 'Conversation unassigned by %{user_name}'
|
||||
team:
|
||||
assigned: 'Assigned to %{team_name} by %{user_name}'
|
||||
assigned_with_assignee: 'Assigned to %{assignee_name} via %{team_name} by %{user_name}'
|
||||
removed: 'Unassigned from %{team_name} by %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} added %{labels}'
|
||||
removed: '%{user_name} removed %{labels}'
|
||||
sla:
|
||||
added: '%{user_name} added SLA policy %{sla_name}'
|
||||
removed: '%{user_name} removed SLA policy %{sla_name}'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} has muted the conversation'
|
||||
unmuted: '%{user_name} has unmuted the conversation'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} typically replies in a few hours.'
|
||||
ways_to_reach_you_message_body: 'Give the team a way to reach you.'
|
||||
email_input_box_message_body: 'Get notified by email'
|
||||
csat_input_message_body: 'Please rate the conversation'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'Notifications'
|
||||
from_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <reply+%{reply_email}>'
|
||||
friendly_name: '%{sender_name} from %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'New messages on this conversation'
|
||||
transcript_subject: 'Conversation Transcript'
|
||||
survey:
|
||||
response: 'Please rate this conversation, %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} is Online, please try again later'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'Dashboard Apps'
|
||||
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
||||
meeting_name: '%{agent_name} has started a meeting'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
||||
webhooks:
|
||||
name: 'Webhooks'
|
||||
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
||||
google_translate:
|
||||
name: 'Google Translate'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
||||
notion:
|
||||
name: 'Notion'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: Message is required
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: Search for article by title or body...
|
||||
empty_placeholder: No results found.
|
||||
loading_placeholder: Searching...
|
||||
results_title: Search results
|
||||
toc_header: 'On this page'
|
||||
hero:
|
||||
sub_title: Search for the articles here or browse the categories below.
|
||||
common:
|
||||
home: Home
|
||||
last_updated_on: Last updated on %{last_updated_on}
|
||||
view_all_articles: View all
|
||||
article: article
|
||||
articles: articles
|
||||
author: author
|
||||
authors: authors
|
||||
other: other
|
||||
others: others
|
||||
by: By
|
||||
no_articles: There are no articles here
|
||||
footer:
|
||||
made_with: Made with
|
||||
header:
|
||||
go_to_homepage: Website
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: System
|
||||
light: Light
|
||||
dark: Dark
|
||||
featured_articles: Featured Articles
|
||||
uncategorized: Uncategorized
|
||||
404:
|
||||
title: Page not found
|
||||
description: We couldn't find the page you were looking for.
|
||||
back_to_home: Go to home page
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: Name
|
||||
email: Email
|
||||
phone_number: Phone
|
||||
company_name: Company
|
||||
inbox_name: Inbox
|
||||
inbox_type: Inbox Type
|
||||
button: Open conversation
|
||||
time_units:
|
||||
days:
|
||||
one: '%{count} day'
|
||||
other: '%{count} days'
|
||||
hours:
|
||||
one: '%{count} hour'
|
||||
other: '%{count} hours'
|
||||
minutes:
|
||||
one: '%{count} minute'
|
||||
other: '%{count} minutes'
|
||||
seconds:
|
||||
one: '%{count} second'
|
||||
other: '%{count} seconds'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[No content]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'Email is required'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
440
research/chatwoot/config/locales/bg.yml
Normal file
440
research/chatwoot/config/locales/bg.yml
Normal file
@@ -0,0 +1,440 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
bg:
|
||||
hello: 'Hello world'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'Please enter a valid email address'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: Woot! Request for password reset is successful. Check your mail for instructions.
|
||||
reset_password_failure: Uh ho! We could not find any user with the specified email.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: Your inbox deletion request will be processed in some time.
|
||||
errors:
|
||||
validations:
|
||||
presence: must not be blank
|
||||
webhook:
|
||||
invalid: Invalid events
|
||||
signup:
|
||||
disposable_email: We do not allow disposable emails
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: You have entered an invalid email
|
||||
email_already_exists: 'You have already signed up for an account with %{email}'
|
||||
invalid_params: 'Invalid, please check the signup paramters and try again'
|
||||
failed: Signup failed
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: Invalid data type
|
||||
contacts:
|
||||
import:
|
||||
failed: File is blank
|
||||
export:
|
||||
success: We will notify you once contacts export file is ready to view.
|
||||
email:
|
||||
invalid: Invalid email
|
||||
phone_number:
|
||||
invalid: should be in e164 format
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: should be unique in the category and portal
|
||||
dyte:
|
||||
invalid_message_type: 'Invalid message type. Action not permitted'
|
||||
slack:
|
||||
invalid_channel_id: 'Invalid slack channel. Please try again'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: Please check the network connection, IMAP address and try again.
|
||||
no_response_error: Please check the IMAP credentials and try again.
|
||||
host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
|
||||
connection_timed_out_error: Connection timed out for %{address}:%{port}
|
||||
connection_closed_error: Connection closed.
|
||||
validations:
|
||||
name: should not start or end with symbols, and it should not have < > / \ @ characters.
|
||||
custom_filters:
|
||||
number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
|
||||
invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
|
||||
invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: Reporting period %{since} to %{until}
|
||||
utc_warning: The report generated is in UTC timezone
|
||||
agent_csv:
|
||||
agent_name: Agent name
|
||||
conversations_count: Assigned conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Resolution Count
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
inbox_csv:
|
||||
inbox_name: Inbox name
|
||||
inbox_type: Inbox type
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
label_csv:
|
||||
label_title: Label
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
avg_reply_time: Avg reply time
|
||||
resolution_count: Resolution Count
|
||||
team_csv:
|
||||
team_name: Team name
|
||||
conversations_count: Conversations count
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Resolution Count
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
conversation_traffic_csv:
|
||||
timezone: Timezone
|
||||
sla_csv:
|
||||
conversation_id: Conversation ID
|
||||
sla_policy_breached: SLA Policy
|
||||
assignee: Assignee
|
||||
team: Team
|
||||
inbox: Входяща кутия
|
||||
labels: Етикети
|
||||
conversation_link: Link to the Conversation
|
||||
breached_events: Breached Events
|
||||
default_group_by: day
|
||||
csat:
|
||||
headers:
|
||||
contact_name: Contact Name
|
||||
contact_email_address: Contact Email Address
|
||||
contact_phone_number: Contact Phone Number
|
||||
link_to_the_conversation: Link to the conversation
|
||||
agent_name: Име на агента
|
||||
rating: Rating
|
||||
feedback: Feedback Comment
|
||||
recorded_at: Recorded date
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
|
||||
conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
|
||||
assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
|
||||
conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
|
||||
sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
|
||||
sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
|
||||
sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
|
||||
attachment: 'Attachment'
|
||||
no_content: 'No content'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'Transferring to another agent for further assistance.'
|
||||
messages:
|
||||
instagram_story_content: '%{story_sender} mentioned you in the story: '
|
||||
instagram_deleted_story_content: This story is no longer available.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: This message was deleted
|
||||
whatsapp:
|
||||
list_button_label: 'Choose an item'
|
||||
delivery_status:
|
||||
error_code: 'Error code: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
|
||||
open: 'Conversation was marked open by %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'Conversation was marked resolved by %{user_name}'
|
||||
contact_resolved: 'Conversation was resolved by %{contact_name}'
|
||||
open: 'Conversation was reopened by %{user_name}'
|
||||
pending: 'Conversation was marked as pending by %{user_name}'
|
||||
snoozed: 'Conversation was snoozed by %{user_name}'
|
||||
auto_resolved_days: 'Conversation was marked resolved by system due to %{count} days of inactivity'
|
||||
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
|
||||
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
|
||||
system_auto_open: System reopened the conversation due to a new incoming message.
|
||||
priority:
|
||||
added: '%{user_name} set the priority to %{new_priority}'
|
||||
updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
|
||||
removed: '%{user_name} removed the priority'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} self-assigned this conversation'
|
||||
assigned: 'Assigned to %{assignee_name} by %{user_name}'
|
||||
removed: 'Conversation unassigned by %{user_name}'
|
||||
team:
|
||||
assigned: 'Assigned to %{team_name} by %{user_name}'
|
||||
assigned_with_assignee: 'Assigned to %{assignee_name} via %{team_name} by %{user_name}'
|
||||
removed: 'Unassigned from %{team_name} by %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} added %{labels}'
|
||||
removed: '%{user_name} removed %{labels}'
|
||||
sla:
|
||||
added: '%{user_name} added SLA policy %{sla_name}'
|
||||
removed: '%{user_name} removed SLA policy %{sla_name}'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} has muted the conversation'
|
||||
unmuted: '%{user_name} has unmuted the conversation'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} typically replies in a few hours.'
|
||||
ways_to_reach_you_message_body: 'Give the team a way to reach you.'
|
||||
email_input_box_message_body: 'Get notified by email'
|
||||
csat_input_message_body: 'Please rate the conversation'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'Notifications'
|
||||
from_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <reply+%{reply_email}>'
|
||||
friendly_name: '%{sender_name} from %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'New messages on this conversation'
|
||||
transcript_subject: 'Conversation Transcript'
|
||||
survey:
|
||||
response: 'Please rate this conversation, %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} is Online, please try again later'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'Dashboard Apps'
|
||||
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
||||
meeting_name: '%{agent_name} has started a meeting'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
||||
webhooks:
|
||||
name: 'Webhooks'
|
||||
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
||||
google_translate:
|
||||
name: 'Google Translate'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
||||
notion:
|
||||
name: 'Notion'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: Message is required
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: Search for article by title or body...
|
||||
empty_placeholder: Няма намерени резултати.
|
||||
loading_placeholder: Searching...
|
||||
results_title: Search results
|
||||
toc_header: 'On this page'
|
||||
hero:
|
||||
sub_title: Search for the articles here or browse the categories below.
|
||||
common:
|
||||
home: Home
|
||||
last_updated_on: Last updated on %{last_updated_on}
|
||||
view_all_articles: View all
|
||||
article: article
|
||||
articles: articles
|
||||
author: author
|
||||
authors: authors
|
||||
other: other
|
||||
others: others
|
||||
by: By
|
||||
no_articles: There are no articles here
|
||||
footer:
|
||||
made_with: Made with
|
||||
header:
|
||||
go_to_homepage: Website
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: System
|
||||
light: Light
|
||||
dark: Dark
|
||||
featured_articles: Featured Articles
|
||||
uncategorized: Uncategorized
|
||||
404:
|
||||
title: Page not found
|
||||
description: We couldn't find the page you were looking for.
|
||||
back_to_home: Go to home page
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: Име
|
||||
email: Имейл
|
||||
phone_number: Phone
|
||||
company_name: Фирма
|
||||
inbox_name: Входяща кутия
|
||||
inbox_type: Inbox Type
|
||||
button: Open conversation
|
||||
time_units:
|
||||
days:
|
||||
one: '%{count} day'
|
||||
other: '%{count} days'
|
||||
hours:
|
||||
one: '%{count} hour'
|
||||
other: '%{count} hours'
|
||||
minutes:
|
||||
one: '%{count} minute'
|
||||
other: '%{count} minutes'
|
||||
seconds:
|
||||
one: '%{count} second'
|
||||
other: '%{count} seconds'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[No content]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'Email is required'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
440
research/chatwoot/config/locales/bn.yml
Normal file
440
research/chatwoot/config/locales/bn.yml
Normal file
@@ -0,0 +1,440 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
bn:
|
||||
hello: 'Hello world'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'Please enter a valid email address'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: Woot! Request for password reset is successful. Check your mail for instructions.
|
||||
reset_password_failure: Uh ho! We could not find any user with the specified email.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: Your inbox deletion request will be processed in some time.
|
||||
errors:
|
||||
validations:
|
||||
presence: must not be blank
|
||||
webhook:
|
||||
invalid: Invalid events
|
||||
signup:
|
||||
disposable_email: We do not allow disposable emails
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: You have entered an invalid email
|
||||
email_already_exists: 'You have already signed up for an account with %{email}'
|
||||
invalid_params: 'Invalid, please check the signup paramters and try again'
|
||||
failed: Signup failed
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: Invalid data type
|
||||
contacts:
|
||||
import:
|
||||
failed: File is blank
|
||||
export:
|
||||
success: We will notify you once contacts export file is ready to view.
|
||||
email:
|
||||
invalid: Invalid email
|
||||
phone_number:
|
||||
invalid: should be in e164 format
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: should be unique in the category and portal
|
||||
dyte:
|
||||
invalid_message_type: 'Invalid message type. Action not permitted'
|
||||
slack:
|
||||
invalid_channel_id: 'Invalid slack channel. Please try again'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: Please check the network connection, IMAP address and try again.
|
||||
no_response_error: Please check the IMAP credentials and try again.
|
||||
host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
|
||||
connection_timed_out_error: Connection timed out for %{address}:%{port}
|
||||
connection_closed_error: Connection closed.
|
||||
validations:
|
||||
name: should not start or end with symbols, and it should not have < > / \ @ characters.
|
||||
custom_filters:
|
||||
number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
|
||||
invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
|
||||
invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: Reporting period %{since} to %{until}
|
||||
utc_warning: The report generated is in UTC timezone
|
||||
agent_csv:
|
||||
agent_name: Agent name
|
||||
conversations_count: Assigned conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Resolution Count
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
inbox_csv:
|
||||
inbox_name: Inbox name
|
||||
inbox_type: Inbox type
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
label_csv:
|
||||
label_title: Label
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
avg_reply_time: Avg reply time
|
||||
resolution_count: Resolution Count
|
||||
team_csv:
|
||||
team_name: Team name
|
||||
conversations_count: Conversations count
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Resolution Count
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
conversation_traffic_csv:
|
||||
timezone: Timezone
|
||||
sla_csv:
|
||||
conversation_id: Conversation ID
|
||||
sla_policy_breached: SLA Policy
|
||||
assignee: Assignee
|
||||
team: Team
|
||||
inbox: Inbox
|
||||
labels: Labels
|
||||
conversation_link: Link to the Conversation
|
||||
breached_events: Breached Events
|
||||
default_group_by: day
|
||||
csat:
|
||||
headers:
|
||||
contact_name: Contact Name
|
||||
contact_email_address: Contact Email Address
|
||||
contact_phone_number: Contact Phone Number
|
||||
link_to_the_conversation: Link to the conversation
|
||||
agent_name: Agent Name
|
||||
rating: Rating
|
||||
feedback: Feedback Comment
|
||||
recorded_at: Recorded date
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
|
||||
conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
|
||||
assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
|
||||
conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
|
||||
sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
|
||||
sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
|
||||
sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
|
||||
attachment: 'Attachment'
|
||||
no_content: 'No content'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'Transferring to another agent for further assistance.'
|
||||
messages:
|
||||
instagram_story_content: '%{story_sender} mentioned you in the story: '
|
||||
instagram_deleted_story_content: This story is no longer available.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: This message was deleted
|
||||
whatsapp:
|
||||
list_button_label: 'Choose an item'
|
||||
delivery_status:
|
||||
error_code: 'Error code: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
|
||||
open: 'Conversation was marked open by %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'Conversation was marked resolved by %{user_name}'
|
||||
contact_resolved: 'Conversation was resolved by %{contact_name}'
|
||||
open: 'Conversation was reopened by %{user_name}'
|
||||
pending: 'Conversation was marked as pending by %{user_name}'
|
||||
snoozed: 'Conversation was snoozed by %{user_name}'
|
||||
auto_resolved_days: 'Conversation was marked resolved by system due to %{count} days of inactivity'
|
||||
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
|
||||
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
|
||||
system_auto_open: System reopened the conversation due to a new incoming message.
|
||||
priority:
|
||||
added: '%{user_name} set the priority to %{new_priority}'
|
||||
updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
|
||||
removed: '%{user_name} removed the priority'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} self-assigned this conversation'
|
||||
assigned: 'Assigned to %{assignee_name} by %{user_name}'
|
||||
removed: 'Conversation unassigned by %{user_name}'
|
||||
team:
|
||||
assigned: 'Assigned to %{team_name} by %{user_name}'
|
||||
assigned_with_assignee: 'Assigned to %{assignee_name} via %{team_name} by %{user_name}'
|
||||
removed: 'Unassigned from %{team_name} by %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} added %{labels}'
|
||||
removed: '%{user_name} removed %{labels}'
|
||||
sla:
|
||||
added: '%{user_name} added SLA policy %{sla_name}'
|
||||
removed: '%{user_name} removed SLA policy %{sla_name}'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} has muted the conversation'
|
||||
unmuted: '%{user_name} has unmuted the conversation'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} typically replies in a few hours.'
|
||||
ways_to_reach_you_message_body: 'Give the team a way to reach you.'
|
||||
email_input_box_message_body: 'Get notified by email'
|
||||
csat_input_message_body: 'Please rate the conversation'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'Notifications'
|
||||
from_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <reply+%{reply_email}>'
|
||||
friendly_name: '%{sender_name} from %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'New messages on this conversation'
|
||||
transcript_subject: 'Conversation Transcript'
|
||||
survey:
|
||||
response: 'Please rate this conversation, %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} is Online, please try again later'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'Dashboard Apps'
|
||||
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
||||
meeting_name: '%{agent_name} has started a meeting'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
||||
webhooks:
|
||||
name: 'Webhooks'
|
||||
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
||||
google_translate:
|
||||
name: 'Google Translate'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
||||
notion:
|
||||
name: 'Notion'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: Message is required
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: Search for article by title or body...
|
||||
empty_placeholder: No results found.
|
||||
loading_placeholder: Searching...
|
||||
results_title: Search results
|
||||
toc_header: 'On this page'
|
||||
hero:
|
||||
sub_title: Search for the articles here or browse the categories below.
|
||||
common:
|
||||
home: Home
|
||||
last_updated_on: Last updated on %{last_updated_on}
|
||||
view_all_articles: View all
|
||||
article: article
|
||||
articles: articles
|
||||
author: author
|
||||
authors: authors
|
||||
other: other
|
||||
others: others
|
||||
by: By
|
||||
no_articles: There are no articles here
|
||||
footer:
|
||||
made_with: Made with
|
||||
header:
|
||||
go_to_homepage: Website
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: System
|
||||
light: Light
|
||||
dark: Dark
|
||||
featured_articles: Featured Articles
|
||||
uncategorized: Uncategorized
|
||||
404:
|
||||
title: Page not found
|
||||
description: We couldn't find the page you were looking for.
|
||||
back_to_home: Go to home page
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: Name
|
||||
email: Email
|
||||
phone_number: Phone
|
||||
company_name: Company
|
||||
inbox_name: Inbox
|
||||
inbox_type: Inbox Type
|
||||
button: Open conversation
|
||||
time_units:
|
||||
days:
|
||||
one: '%{count} day'
|
||||
other: '%{count} days'
|
||||
hours:
|
||||
one: '%{count} hour'
|
||||
other: '%{count} hours'
|
||||
minutes:
|
||||
one: '%{count} minute'
|
||||
other: '%{count} minutes'
|
||||
seconds:
|
||||
one: '%{count} second'
|
||||
other: '%{count} seconds'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[No content]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'Email is required'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
440
research/chatwoot/config/locales/ca.yml
Normal file
440
research/chatwoot/config/locales/ca.yml
Normal file
@@ -0,0 +1,440 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
ca:
|
||||
hello: 'Hola món'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'Introduïu una adreça de correu electrònic vàlida'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: Woot! S'ha restablert la contrasenya amb èxit. Revisa el correu per més instruccions.
|
||||
reset_password_failure: Uh ho! No s'ha trobat cap compte amb aquest correu electrònic.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: La teva sol·licitud d'eliminació de la safata d'entrada es processarà d'aquí a un temps.
|
||||
errors:
|
||||
validations:
|
||||
presence: no ha de quedar en blanc
|
||||
webhook:
|
||||
invalid: Esdeveniments no vàlids
|
||||
signup:
|
||||
disposable_email: Els correus d'un sol ús no s'accepten
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: Heu introduït un correu electrònic no vàlid
|
||||
email_already_exists: 'Ja us heu registrat amb el compte %{email}'
|
||||
invalid_params: 'No és vàlid, comprova els paràmetres de registre i torna-ho a provar'
|
||||
failed: El registre ha fallat
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: Tipus de dades no vàlid
|
||||
contacts:
|
||||
import:
|
||||
failed: El fitxer està en blanc
|
||||
export:
|
||||
success: Us notificarem quan el fitxer d'exportació de contactes estigui llest per veure'l.
|
||||
email:
|
||||
invalid: Correu electrònic invàlid
|
||||
phone_number:
|
||||
invalid: hauria d'estar en format e164
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: hauria de ser únic a la categoria i al portal
|
||||
dyte:
|
||||
invalid_message_type: 'Tipus de missatge no vàlid. Acció no permesa'
|
||||
slack:
|
||||
invalid_channel_id: 'Canal slack no vàlid. Torna-ho a provar'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: Comprova la connexió de xarxa, l'adreça IMAP i torna-ho a provar.
|
||||
no_response_error: Comprova les credencials IMAP i torna-ho a provar.
|
||||
host_unreachable_error: Amfitrió inaccessible. Comprova l'adreça IMAP, el port IMAP i torna-ho a provar.
|
||||
connection_timed_out_error: S'ha esgotat el temps d'espera de la connexió per a %{address}:%{port}
|
||||
connection_closed_error: Connexió tancada.
|
||||
validations:
|
||||
name: no hauria de començar ni acabar amb símbols, i no hauria de tenir caràcters < > / \ @.
|
||||
custom_filters:
|
||||
number_of_records: S'ha arribat al límit. El nombre màxim de filtres personalitzats permesos per a un usuari per compte és de 1000.
|
||||
invalid_attribute: 'Clau d''atribut no vàlida: [%{key}]. La clau hauria de ser una de [%{allowed_keys}] o un atribut personalitzat definit al compte.'
|
||||
invalid_operator: Operador no vàlid. Els operadors permesos per a %{attribute_name} son [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: Valor no vàlid. Els valors proporcionats per a %{attribute_name} no són vàlids
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: Període d'informes %{since} a %{until}
|
||||
utc_warning: L'informe generat es troba a la zona horària UTC
|
||||
agent_csv:
|
||||
agent_name: Nom de l'Agent
|
||||
conversations_count: Converses assignades
|
||||
avg_first_response_time: Temps mitjà de primera resposta
|
||||
avg_resolution_time: Temps mitjà de resolució
|
||||
resolution_count: Total de resolucions
|
||||
avg_customer_waiting_time: Temps mitjà d'espera dels clients
|
||||
inbox_csv:
|
||||
inbox_name: Nom de la safata d'entrada
|
||||
inbox_type: Tipus de safata d'entrada
|
||||
conversations_count: Nre. de converses
|
||||
avg_first_response_time: Temps mitjà de primera resposta
|
||||
avg_resolution_time: Temps mitjà de resolució
|
||||
label_csv:
|
||||
label_title: Etiqueta
|
||||
conversations_count: Nre. de converses
|
||||
avg_first_response_time: Temps mitjà de primera resposta
|
||||
avg_resolution_time: Temps mitjà de resolució
|
||||
avg_reply_time: Avg reply time
|
||||
resolution_count: Total de resolucions
|
||||
team_csv:
|
||||
team_name: Nom de l'equip
|
||||
conversations_count: Recompte de converses
|
||||
avg_first_response_time: Temps mitjà de primera resposta
|
||||
avg_resolution_time: Temps mitjà de resolució
|
||||
resolution_count: Total de resolucions
|
||||
avg_customer_waiting_time: Temps mitjà d'espera dels clients
|
||||
conversation_traffic_csv:
|
||||
timezone: Fus horari
|
||||
sla_csv:
|
||||
conversation_id: ID de la conversa
|
||||
sla_policy_breached: Política SLA
|
||||
assignee: Cessionari
|
||||
team: Equip
|
||||
inbox: Safata d'entrada
|
||||
labels: Etiquetes
|
||||
conversation_link: Enllaç a la conversa
|
||||
breached_events: Cas d'incompliment
|
||||
default_group_by: dia
|
||||
csat:
|
||||
headers:
|
||||
contact_name: Nom de contacte
|
||||
contact_email_address: Correu electrònic de contacte
|
||||
contact_phone_number: Telèfon de contacte
|
||||
link_to_the_conversation: Enllaç a la conversa
|
||||
agent_name: Nom de l'Agent
|
||||
rating: Valoració
|
||||
feedback: Comentaris
|
||||
recorded_at: Data gravada
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'Una conversa (#%{display_id}) ha estat creada a %{inbox_name}'
|
||||
conversation_assignment: 'Una conversa (#%{display_id}) ha estat assignada a tu'
|
||||
assigned_conversation_new_message: 'Es crea un missatge nou a la conversa (#%{display_id})'
|
||||
conversation_mention: 'T''han mencionat a la conversa (#%{display_id})'
|
||||
sla_missed_first_response: 'S''ha perdut la primera resposta de l''objectiu de SLA per a la conversa (#%{display_id})'
|
||||
sla_missed_next_response: 'S''ha perdut la següent resposta de l''objectiu de SLA per a la conversa (#%{display_id})'
|
||||
sla_missed_resolution: 'S''ha perdut la resolució de l''objectiu de SLA per a la conversa (#%{display_id})'
|
||||
attachment: 'Adjunt'
|
||||
no_content: 'Sense contingut'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'Transferring to another agent for further assistance.'
|
||||
messages:
|
||||
instagram_story_content: '%{story_sender} t''ha mencionat a la història: '
|
||||
instagram_deleted_story_content: Aquesta història ja no està disponible.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: Aquest missatge a sigut eliminat
|
||||
whatsapp:
|
||||
list_button_label: 'Choose an item'
|
||||
delivery_status:
|
||||
error_code: 'Codi d''error: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
|
||||
open: 'Conversation was marked open by %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'La conversa va ser marcada com resolta per %{user_name}'
|
||||
contact_resolved: 'La conversa va ser resolta per %{contact_name}'
|
||||
open: 'La conversa es va reobrir per %{user_name}'
|
||||
pending: 'La conversa va ser marcada com pendent per %{user_name}'
|
||||
snoozed: '%{user_name} ha posposat la conversa'
|
||||
auto_resolved_days: 'El sistema ha marcat que la conversa s''ha resolt a causa de %{count} dies d''inactivitat'
|
||||
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
|
||||
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
|
||||
system_auto_open: El sistema ha reobert la conversa a causa d'un nou missatge entrant.
|
||||
priority:
|
||||
added: '%{user_name} ha establert la prioritat a %{new_priority}'
|
||||
updated: '%{user_name} ha canviat la prioritat de %{old_priority} a %{new_priority}'
|
||||
removed: '%{user_name} ha eliminat la prioritat'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} s''ha auto assignat aquesta conversa'
|
||||
assigned: 'Assignada a %{assignee_name} per %{user_name}'
|
||||
removed: '%{user_name} ha tret l''assignació de la conversa'
|
||||
team:
|
||||
assigned: 'Assignada a %{team_name} per %{user_name}'
|
||||
assigned_with_assignee: 'Assignat a %{assignee_name} mitjançant %{team_name} per %{user_name}'
|
||||
removed: 'Sense assignar des de %{team_name} per %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} ha afegit %{labels}'
|
||||
removed: '%{user_name} ha eliminat %{labels}'
|
||||
sla:
|
||||
added: '%{user_name} ha afegit la política de SLA %{sla_name}'
|
||||
removed: '%{user_name} ha eliminat la política de SLA %{sla_name}'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} ha silenciat la conversa'
|
||||
unmuted: '%{user_name} ha desactivat el silenci de la conversa'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} normalment respon a les poques hores.'
|
||||
ways_to_reach_you_message_body: 'Fes saber a l''equip la forma de posar-nos en contacte amb tu.'
|
||||
email_input_box_message_body: 'Rep les notificacions per correu electrònic'
|
||||
csat_input_message_body: 'Si us plau, valoreu la conversa'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'Notificacions'
|
||||
from_with_name: '%{assignee_name} des de %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} des de %{inbox_name} <reply+%{reply_email}>'
|
||||
friendly_name: '%{sender_name} des de %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} des de %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'Missatges nous en aquesta conversa'
|
||||
transcript_subject: 'Transcripció de conversa'
|
||||
survey:
|
||||
response: 'Si us plau, valoreu la conversa, %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} està en línia, si us plau, torna-ho a provar més tard'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'Aplicacions del tauler de control'
|
||||
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
||||
meeting_name: '%{agent_name} ha iniciat una reunió'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
||||
webhooks:
|
||||
name: 'Webhooks'
|
||||
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
||||
google_translate:
|
||||
name: 'Google Translate'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
||||
notion:
|
||||
name: 'Notion'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: El missatge és obligatori
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: Cerca l'article per títol o cos...
|
||||
empty_placeholder: No s'ha trobat agents.
|
||||
loading_placeholder: S'està cercant...
|
||||
results_title: Resultats de la cerca
|
||||
toc_header: 'En aquesta pàgina'
|
||||
hero:
|
||||
sub_title: Cerca els articles aquí o navega per les categories següents.
|
||||
common:
|
||||
home: Inici
|
||||
last_updated_on: Última actualització el %{last_updated_on}
|
||||
view_all_articles: Veure tot
|
||||
article: article
|
||||
articles: articles
|
||||
author: autor
|
||||
authors: autors
|
||||
other: altre
|
||||
others: altres
|
||||
by: Per
|
||||
no_articles: No hi ha articles aquí
|
||||
footer:
|
||||
made_with: Fet amb
|
||||
header:
|
||||
go_to_homepage: Lloc web
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: Sistema
|
||||
light: Clar
|
||||
dark: Fosc
|
||||
featured_articles: Articles destacats
|
||||
uncategorized: Sense categoria
|
||||
404:
|
||||
title: Pàgina no trobada
|
||||
description: No hem pogut trobar la pàgina que estaves buscant.
|
||||
back_to_home: Ves a la pàgina d'inici
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: Nom
|
||||
email: Correu electrònic
|
||||
phone_number: Telèfon
|
||||
company_name: Companyia
|
||||
inbox_name: Safata d'entrada
|
||||
inbox_type: Tipus de safata d'entrada
|
||||
button: Obrir conversa
|
||||
time_units:
|
||||
days:
|
||||
one: '%{count} dia'
|
||||
other: '%{count} dies'
|
||||
hours:
|
||||
one: '%{count} hora'
|
||||
other: '%{count} hores'
|
||||
minutes:
|
||||
one: '%{count} minut'
|
||||
other: '%{count} minuts '
|
||||
seconds:
|
||||
one: '%{count} segon'
|
||||
other: '%{count} segons'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[Sense contingut]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'El correu electrònic és obligatori'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
448
research/chatwoot/config/locales/cs.yml
Normal file
448
research/chatwoot/config/locales/cs.yml
Normal file
@@ -0,0 +1,448 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
cs:
|
||||
hello: 'Ahoj svět'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'Zadejte prosím platnou e-mailovou adresu'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: Woot! Žádost o obnovení hesla byla úspěšná. Zkontrolujte svůj e-mail pro pokyny.
|
||||
reset_password_failure: Jejda! Nenašli jsme žádného uživatele se zadaným e-mailem.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: Your inbox deletion request will be processed in some time.
|
||||
errors:
|
||||
validations:
|
||||
presence: must not be blank
|
||||
webhook:
|
||||
invalid: Invalid events
|
||||
signup:
|
||||
disposable_email: Nepovolujeme jednorázové e-maily
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: Zadali jste neplatný e-mail
|
||||
email_already_exists: 'Již jste se zaregistrovali k účtu s %{email}'
|
||||
invalid_params: 'Invalid, please check the signup paramters and try again'
|
||||
failed: Registrace se nezdařila
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: Invalid data type
|
||||
contacts:
|
||||
import:
|
||||
failed: File is blank
|
||||
export:
|
||||
success: We will notify you once contacts export file is ready to view.
|
||||
email:
|
||||
invalid: Invalid email
|
||||
phone_number:
|
||||
invalid: should be in e164 format
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: should be unique in the category and portal
|
||||
dyte:
|
||||
invalid_message_type: 'Invalid message type. Action not permitted'
|
||||
slack:
|
||||
invalid_channel_id: 'Invalid slack channel. Please try again'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: Please check the network connection, IMAP address and try again.
|
||||
no_response_error: Please check the IMAP credentials and try again.
|
||||
host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
|
||||
connection_timed_out_error: Connection timed out for %{address}:%{port}
|
||||
connection_closed_error: Connection closed.
|
||||
validations:
|
||||
name: should not start or end with symbols, and it should not have < > / \ @ characters.
|
||||
custom_filters:
|
||||
number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
|
||||
invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
|
||||
invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: Reporting period %{since} to %{until}
|
||||
utc_warning: The report generated is in UTC timezone
|
||||
agent_csv:
|
||||
agent_name: Jméno agenta
|
||||
conversations_count: Assigned conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Počet rozlišení
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
inbox_csv:
|
||||
inbox_name: Inbox name
|
||||
inbox_type: Inbox type
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
label_csv:
|
||||
label_title: Label
|
||||
conversations_count: No. of conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
avg_reply_time: Avg reply time
|
||||
resolution_count: Počet rozlišení
|
||||
team_csv:
|
||||
team_name: Team name
|
||||
conversations_count: Conversations count
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Počet rozlišení
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
conversation_traffic_csv:
|
||||
timezone: Timezone
|
||||
sla_csv:
|
||||
conversation_id: Conversation ID
|
||||
sla_policy_breached: SLA Policy
|
||||
assignee: Assignee
|
||||
team: Team
|
||||
inbox: Inbox
|
||||
labels: Štítky
|
||||
conversation_link: Link to the Conversation
|
||||
breached_events: Breached Events
|
||||
default_group_by: day
|
||||
csat:
|
||||
headers:
|
||||
contact_name: Contact Name
|
||||
contact_email_address: Contact Email Address
|
||||
contact_phone_number: Contact Phone Number
|
||||
link_to_the_conversation: Link to the conversation
|
||||
agent_name: Název agenta
|
||||
rating: Hodnocení
|
||||
feedback: Feedback Comment
|
||||
recorded_at: Recorded date
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
|
||||
conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
|
||||
assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
|
||||
conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
|
||||
sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
|
||||
sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
|
||||
sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
|
||||
attachment: 'Attachment'
|
||||
no_content: 'No content'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'Transferring to another agent for further assistance.'
|
||||
messages:
|
||||
instagram_story_content: '%{story_sender} mentioned you in the story: '
|
||||
instagram_deleted_story_content: This story is no longer available.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: Tato zpráva byla smazána
|
||||
whatsapp:
|
||||
list_button_label: 'Choose an item'
|
||||
delivery_status:
|
||||
error_code: 'Error code: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
|
||||
open: 'Conversation was marked open by %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'Konverzace byla vyřešena uživatelem %{user_name}'
|
||||
contact_resolved: 'Conversation was resolved by %{contact_name}'
|
||||
open: 'Konverzace byla znovu otevřena uživatelem %{user_name}'
|
||||
pending: 'Conversation was marked as pending by %{user_name}'
|
||||
snoozed: 'Conversation was snoozed by %{user_name}'
|
||||
auto_resolved_days: 'Conversation was marked resolved by system due to %{count} days of inactivity'
|
||||
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
|
||||
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
|
||||
system_auto_open: System reopened the conversation due to a new incoming message.
|
||||
priority:
|
||||
added: '%{user_name} set the priority to %{new_priority}'
|
||||
updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
|
||||
removed: '%{user_name} removed the priority'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} self-assigned this conversation'
|
||||
assigned: 'Přiřazeno k %{assignee_name} uživatelem %{user_name}'
|
||||
removed: 'Konverzace zrušena uživatelem %{user_name}'
|
||||
team:
|
||||
assigned: 'Assigned to %{team_name} by %{user_name}'
|
||||
assigned_with_assignee: 'Assigned to %{assignee_name} via %{team_name} by %{user_name}'
|
||||
removed: 'Unassigned from %{team_name} by %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} odstranil/a %{labels}'
|
||||
removed: '%{user_name} odebral/a %{labels}'
|
||||
sla:
|
||||
added: '%{user_name} added SLA policy %{sla_name}'
|
||||
removed: '%{user_name} removed SLA policy %{sla_name}'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} ztlumil/a konverzaci'
|
||||
unmuted: '%{user_name} has unmuted the conversation'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} typically replies in a few hours.'
|
||||
ways_to_reach_you_message_body: 'Dejte týmu způsob, jak se k vám dostat.'
|
||||
email_input_box_message_body: 'Dostat upozornění e-mailem'
|
||||
csat_input_message_body: 'Ohodnoťte prosím konverzaci'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'Oznámení'
|
||||
from_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <reply+%{reply_email}>'
|
||||
friendly_name: '%{sender_name} from %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'Nové zprávy v této konverzaci'
|
||||
transcript_subject: 'Přepis konverzace'
|
||||
survey:
|
||||
response: 'Please rate this conversation, %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} is Online, please try again later'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'Dashboard Apps'
|
||||
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
||||
meeting_name: '%{agent_name} has started a meeting'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
||||
webhooks:
|
||||
name: 'Webhooky'
|
||||
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
||||
google_translate:
|
||||
name: 'Google Translate'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
||||
notion:
|
||||
name: 'Notion'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: Message is required
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: Search for article by title or body...
|
||||
empty_placeholder: Žádné výsledky.
|
||||
loading_placeholder: Searching...
|
||||
results_title: Search results
|
||||
toc_header: 'On this page'
|
||||
hero:
|
||||
sub_title: Search for the articles here or browse the categories below.
|
||||
common:
|
||||
home: Domů
|
||||
last_updated_on: Last updated on %{last_updated_on}
|
||||
view_all_articles: View all
|
||||
article: article
|
||||
articles: články
|
||||
author: autor
|
||||
authors: authors
|
||||
other: other
|
||||
others: others
|
||||
by: By
|
||||
no_articles: There are no articles here
|
||||
footer:
|
||||
made_with: Made with
|
||||
header:
|
||||
go_to_homepage: Website
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: System
|
||||
light: Light
|
||||
dark: Dark
|
||||
featured_articles: Featured Articles
|
||||
uncategorized: Uncategorized
|
||||
404:
|
||||
title: Page not found
|
||||
description: We couldn't find the page you were looking for.
|
||||
back_to_home: Go to home page
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: Název
|
||||
email: E-mailová adresa
|
||||
phone_number: Phone
|
||||
company_name: Společnost
|
||||
inbox_name: Inbox
|
||||
inbox_type: Inbox Type
|
||||
button: Open conversation
|
||||
time_units:
|
||||
days:
|
||||
one: '%{count} day'
|
||||
few: '%{count} days'
|
||||
many: '%{count} days'
|
||||
other: '%{count} days'
|
||||
hours:
|
||||
one: '%{count} hour'
|
||||
few: '%{count} hours'
|
||||
many: '%{count} hours'
|
||||
other: '%{count} hours'
|
||||
minutes:
|
||||
one: '%{count} minute'
|
||||
few: '%{count} minutes'
|
||||
many: '%{count} minutes'
|
||||
other: '%{count} minutes'
|
||||
seconds:
|
||||
one: '%{count} second'
|
||||
few: '%{count} seconds'
|
||||
many: '%{count} seconds'
|
||||
other: '%{count} seconds'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[No content]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'Email is required'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
440
research/chatwoot/config/locales/da.yml
Normal file
440
research/chatwoot/config/locales/da.yml
Normal file
@@ -0,0 +1,440 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
da:
|
||||
hello: 'Hej verden'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'Indtast venligst en gyldig e-mailadresse'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: Woot! Anmodning om nulstilling af adgangskode er vellykket. Tjek din mail for instruktioner.
|
||||
reset_password_failure: Åh nej! Vi kunne ikke finde nogen bruger med den angivne e-mail.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: Your inbox deletion request will be processed in some time.
|
||||
errors:
|
||||
validations:
|
||||
presence: må ikke være tomt
|
||||
webhook:
|
||||
invalid: Ugyldige begivenheder
|
||||
signup:
|
||||
disposable_email: Vi tillader ikke engangs e-mails
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: Du har indtastet en ugyldig e-mail
|
||||
email_already_exists: 'Du har allerede tilmeldt dig en konto med %{email}'
|
||||
invalid_params: 'Invalid, please check the signup paramters and try again'
|
||||
failed: Tilmelding mislykkedes
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: Ugyldig datatype
|
||||
contacts:
|
||||
import:
|
||||
failed: Filen er tom
|
||||
export:
|
||||
success: We will notify you once contacts export file is ready to view.
|
||||
email:
|
||||
invalid: Invalid email
|
||||
phone_number:
|
||||
invalid: skal være i e164 format
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: bør være unik i kategorien og portalen
|
||||
dyte:
|
||||
invalid_message_type: 'Invalid message type. Action not permitted'
|
||||
slack:
|
||||
invalid_channel_id: 'Invalid slack channel. Please try again'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: Tjek venligst netværksforbindelsen, IMAP-adressen og prøv igen.
|
||||
no_response_error: Tjek venligst IMAP-legitimationsoplysningerne og prøv igen.
|
||||
host_unreachable_error: Vært utilgængeligt, tjek venligst IMAP-adressen, IMAP-porten og prøv igen.
|
||||
connection_timed_out_error: Forbindelsen fik timeout for %{address}:%{port}
|
||||
connection_closed_error: Forbindelsen er lukket.
|
||||
validations:
|
||||
name: bør ikke starte eller slutte med symboler, og det skal ikke have < > / \ @ tegn.
|
||||
custom_filters:
|
||||
number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
|
||||
invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
|
||||
invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: Rapporteringsperiode %{since} til %{until}
|
||||
utc_warning: The report generated is in UTC timezone
|
||||
agent_csv:
|
||||
agent_name: Agentens navn
|
||||
conversations_count: Assigned conversations
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Antal Afsluttede
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
inbox_csv:
|
||||
inbox_name: Indbakkens navn
|
||||
inbox_type: Indbakke type
|
||||
conversations_count: Antal samtaler
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
label_csv:
|
||||
label_title: Etiketter
|
||||
conversations_count: Antal samtaler
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
avg_reply_time: Avg reply time
|
||||
resolution_count: Antal Afsluttede
|
||||
team_csv:
|
||||
team_name: Team navn
|
||||
conversations_count: Samtaler tæller
|
||||
avg_first_response_time: Avg first response time
|
||||
avg_resolution_time: Avg resolution time
|
||||
resolution_count: Antal Afsluttede
|
||||
avg_customer_waiting_time: Avg customer waiting time
|
||||
conversation_traffic_csv:
|
||||
timezone: Timezone
|
||||
sla_csv:
|
||||
conversation_id: Conversation ID
|
||||
sla_policy_breached: SLA Policy
|
||||
assignee: Assignee
|
||||
team: Team
|
||||
inbox: Indbakke
|
||||
labels: Etiketter
|
||||
conversation_link: Link to the Conversation
|
||||
breached_events: Breached Events
|
||||
default_group_by: dag
|
||||
csat:
|
||||
headers:
|
||||
contact_name: Kontakt Navn
|
||||
contact_email_address: Kontakt E-Mail Adresse
|
||||
contact_phone_number: Kontakt Telefonnummer
|
||||
link_to_the_conversation: Link til samtalen
|
||||
agent_name: Agentens Navn
|
||||
rating: Bedømmelse
|
||||
feedback: Feedback Kommentar
|
||||
recorded_at: Optaget dato
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
|
||||
conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
|
||||
assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
|
||||
conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
|
||||
sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
|
||||
sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
|
||||
sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
|
||||
attachment: 'Attachment'
|
||||
no_content: 'No content'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'Transferring to another agent for further assistance.'
|
||||
messages:
|
||||
instagram_story_content: '%{story_sender} nævnte dig i historien: '
|
||||
instagram_deleted_story_content: Denne historie er ikke længere tilgængelig.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: Denne besked blev slettet
|
||||
whatsapp:
|
||||
list_button_label: 'Choose an item'
|
||||
delivery_status:
|
||||
error_code: 'Error code: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
|
||||
open: 'Conversation was marked open by %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'Samtalen blev markeret som løst af %{user_name}'
|
||||
contact_resolved: 'Samtalen blev løst af %{contact_name}'
|
||||
open: 'Samtalen blev genåbnet af %{user_name}'
|
||||
pending: 'Samtalen blev markeret som afventende af %{user_name}'
|
||||
snoozed: 'Samtalen blev udskudt af %{user_name}'
|
||||
auto_resolved_days: 'Samtalen blev markeret som løst af systemet på grund af %{count} dages inaktivitet'
|
||||
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
|
||||
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
|
||||
system_auto_open: System reopened the conversation due to a new incoming message.
|
||||
priority:
|
||||
added: '%{user_name} set the priority to %{new_priority}'
|
||||
updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
|
||||
removed: '%{user_name} removed the priority'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} selv-tildelte denne samtale'
|
||||
assigned: 'Tildelt %{assignee_name} af %{user_name}'
|
||||
removed: 'Samtale fjernet tildeling af %{user_name}'
|
||||
team:
|
||||
assigned: 'Tildelt %{team_name} af %{user_name}'
|
||||
assigned_with_assignee: 'Tildelt %{assignee_name} via %{team_name} af %{user_name}'
|
||||
removed: 'Ikke tildelt fra %{team_name} af %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} tilføjede %{labels}'
|
||||
removed: '%{user_name} fjernede %{labels}'
|
||||
sla:
|
||||
added: '%{user_name} added SLA policy %{sla_name}'
|
||||
removed: '%{user_name} removed SLA policy %{sla_name}'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} har slukket for samtalen'
|
||||
unmuted: '%{user_name} har genaktiveret samtalen'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} svarer typisk på et par timer.'
|
||||
ways_to_reach_you_message_body: 'Giv teamet en måde at kontakte dig på.'
|
||||
email_input_box_message_body: 'Få besked via e-mail'
|
||||
csat_input_message_body: 'Bedøm venligst samtalen'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'Notifikationer'
|
||||
from_with_name: '%{assignee_name} fra %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} fra %{inbox_name} <reply+%{reply_email}>'
|
||||
friendly_name: '%{sender_name} fra %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} fra %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'Nye beskeder i denne samtale'
|
||||
transcript_subject: 'Samtaleudskrift'
|
||||
survey:
|
||||
response: 'Bedøm denne samtale, %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} er online, prøv igen senere'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'Dashboard Apps'
|
||||
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
||||
meeting_name: '%{agent_name} has started a meeting'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
||||
webhooks:
|
||||
name: 'Webhooks'
|
||||
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
||||
google_translate:
|
||||
name: 'Google Translate'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
||||
notion:
|
||||
name: 'Notion'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: Beskeden er påkrævet
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: Search for article by title or body...
|
||||
empty_placeholder: Ingen resultater fundet.
|
||||
loading_placeholder: Søger...
|
||||
results_title: Søgeresultater
|
||||
toc_header: 'On this page'
|
||||
hero:
|
||||
sub_title: Søg efter artiklerne her eller gennemse kategorierne nedenfor.
|
||||
common:
|
||||
home: Hjem
|
||||
last_updated_on: Last updated on %{last_updated_on}
|
||||
view_all_articles: View all
|
||||
article: article
|
||||
articles: artikler
|
||||
author: forfatter
|
||||
authors: authors
|
||||
other: other
|
||||
others: others
|
||||
by: By
|
||||
no_articles: There are no articles here
|
||||
footer:
|
||||
made_with: Made with
|
||||
header:
|
||||
go_to_homepage: Website
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: System
|
||||
light: Light
|
||||
dark: Dark
|
||||
featured_articles: Featured Articles
|
||||
uncategorized: Ikke Kategoriseret
|
||||
404:
|
||||
title: Page not found
|
||||
description: We couldn't find the page you were looking for.
|
||||
back_to_home: Go to home page
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: Navn
|
||||
email: E-mail
|
||||
phone_number: Phone
|
||||
company_name: Virksomhed
|
||||
inbox_name: Indbakke
|
||||
inbox_type: Inbox Type
|
||||
button: Åbn samtale
|
||||
time_units:
|
||||
days:
|
||||
one: '%{count} day'
|
||||
other: '%{count} days'
|
||||
hours:
|
||||
one: '%{count} hour'
|
||||
other: '%{count} hours'
|
||||
minutes:
|
||||
one: '%{count} minute'
|
||||
other: '%{count} minutes'
|
||||
seconds:
|
||||
one: '%{count} second'
|
||||
other: '%{count} seconds'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[No content]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'Email is required'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
440
research/chatwoot/config/locales/de.yml
Normal file
440
research/chatwoot/config/locales/de.yml
Normal file
@@ -0,0 +1,440 @@
|
||||
#Files in the config/locales directory are used for internationalization
|
||||
#and are automatically loaded by Rails. If you want to use locales other
|
||||
#than English, add the necessary files in this directory.
|
||||
#To use the locales, use `I18n.t`:
|
||||
#I18n.t 'hello'
|
||||
#In views, this is aliased to just `t`:
|
||||
#<%= t('hello') %>
|
||||
#To use a different locale, set it with `I18n.locale`:
|
||||
#I18n.locale = :es
|
||||
#This would use the information in config/locales/es.yml.
|
||||
#The following keys must be escaped otherwise they will not be retrieved by
|
||||
#the default I18n backend:
|
||||
#true, false, on, off, yes, no
|
||||
#Instead, surround them with single quotes.
|
||||
#en:
|
||||
#'true': 'foo'
|
||||
#To learn more, please read the Rails Internationalization guide
|
||||
#available at https://guides.rubyonrails.org/i18n.html.
|
||||
de:
|
||||
hello: 'Hallo Welt'
|
||||
inbox:
|
||||
reauthorization:
|
||||
success: 'Channel reauthorized successfully'
|
||||
not_required: 'Reauthorization is not required for this inbox'
|
||||
invalid_channel: 'Invalid channel type for reauthorization'
|
||||
auth:
|
||||
saml:
|
||||
invalid_email: 'Bitte geben Sie eine gültige E-Mail-Adresse ein'
|
||||
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||
messages:
|
||||
reset_password_success: Woot! Die Anforderung zum Zurücksetzen des Passworts ist erfolgreich. Überprüfen Sie Ihre E-Mails auf Anweisungen.
|
||||
reset_password_failure: Uh ho! Wir konnten keinen Benutzer mit der angegebenen E-Mail-Adresse finden.
|
||||
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
|
||||
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
|
||||
saml_not_available: SAML authentication is not available in this installation.
|
||||
inbox_deletetion_response: Die Löschanfrage Ihres Posteingangs wird in Kürze bearbeitet.
|
||||
errors:
|
||||
validations:
|
||||
presence: darf nicht leer sein
|
||||
webhook:
|
||||
invalid: Ungültige Events
|
||||
signup:
|
||||
disposable_email: Wir erlauben keine Einweg-E-Mails
|
||||
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
||||
invalid_email: Sie haben eine ungültige E-Mail-Adresse eingegeben
|
||||
email_already_exists: 'Sie haben sich bereits für ein Konto bei %{email} angemeldet.'
|
||||
invalid_params: 'Ungültig, bitte überprüfen Sie die Anmeldeparameter und versuchen Sie es erneut'
|
||||
failed: Anmeldung gescheitert
|
||||
assignment_policy:
|
||||
not_found: Assignment policy not found
|
||||
attachments:
|
||||
invalid: Invalid attachment
|
||||
saml:
|
||||
feature_not_enabled: SAML feature not enabled for this account
|
||||
sso_not_enabled: SAML SSO is not enabled for this installation
|
||||
data_import:
|
||||
data_type:
|
||||
invalid: Ungültiger Datentyp
|
||||
contacts:
|
||||
import:
|
||||
failed: Datei ist leer
|
||||
export:
|
||||
success: Wir werden Sie benachrichtigen, sobald die Exportdatei der Kontakte angezeigt werden kann.
|
||||
email:
|
||||
invalid: Ungültige E-Mail
|
||||
phone_number:
|
||||
invalid: sollte im e164-Format vorliegen
|
||||
companies:
|
||||
domain:
|
||||
invalid: must be a valid domain name
|
||||
search:
|
||||
query_missing: Specify search string with parameter q
|
||||
messages:
|
||||
search:
|
||||
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
|
||||
categories:
|
||||
locale:
|
||||
unique: sollte in der Kategorie und im Portal eindeutig sein
|
||||
dyte:
|
||||
invalid_message_type: 'Ungültiger Nachrichtentyp. Aktion nicht erlaubt'
|
||||
slack:
|
||||
invalid_channel_id: 'Ungültiger Slack Channel. Bitte erneut versuchen'
|
||||
whatsapp:
|
||||
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
|
||||
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
|
||||
phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
|
||||
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
|
||||
reauthorization:
|
||||
generic: 'Failed to reauthorize WhatsApp. Please try again.'
|
||||
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
|
||||
inboxes:
|
||||
imap:
|
||||
socket_error: Bitte überprüfen Sie die Netzwerkverbindung, die IMAP-Adresse und versuchen Sie es erneut.
|
||||
no_response_error: Bitte überprüfen Sie die IMAP-Anmeldeinformationen und versuchen Sie es erneut.
|
||||
host_unreachable_error: Host nicht erreichbar. Bitte überprüfen Sie die IMAP-Adresse und den IMAP-Port und versuchen Sie es erneut.
|
||||
connection_timed_out_error: Zeitüberschreitung der Verbindung für %{address}:%{port}
|
||||
connection_closed_error: Verbindung geschlossen.
|
||||
validations:
|
||||
name: Sollte nicht mit Symbolen beginnen oder enden, und es sollte keine < > / \ @ Zeichen enthalten.
|
||||
custom_filters:
|
||||
number_of_records: Limit erreicht. Die maximale Anzahl an benutzerdefinierten Filtern pro Benutzerkonto beträgt 1000.
|
||||
invalid_attribute: Ungültiger Attribut schlüssel - [%{key}]. Der Schlüssel sollte einer von [%{allowed_keys}] oder ein benutzerdefiniertes Attribut sein, das im Konto definiert ist.
|
||||
invalid_operator: Ungültiger Operator. Die erlaubten Operatoren für %{attribute_name} sind [%{allowed_keys}].
|
||||
invalid_query_operator: Query operator must be either "AND" or "OR".
|
||||
invalid_value: Ungültiger Wert. Die Werte für %{attribute_name} sind ungültig
|
||||
custom_attribute_definition:
|
||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||
mfa:
|
||||
already_enabled: MFA is already enabled
|
||||
not_enabled: MFA is not enabled
|
||||
invalid_code: Invalid verification code
|
||||
invalid_backup_code: Invalid backup code
|
||||
invalid_token: Invalid or expired MFA token
|
||||
invalid_credentials: Invalid credentials or verification code
|
||||
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||
topup:
|
||||
credits_required: Credits amount is required
|
||||
invalid_credits: Invalid credits amount
|
||||
invalid_option: Invalid topup option
|
||||
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
|
||||
stripe_customer_not_configured: Stripe customer not configured
|
||||
no_payment_method: No payment methods found. Please add a payment method before making a purchase.
|
||||
profile:
|
||||
mfa:
|
||||
enabled: MFA enabled successfully
|
||||
disabled: MFA disabled successfully
|
||||
account_saml_settings:
|
||||
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||
reports:
|
||||
period: Berichtszeitraum von %{since} bis %{until}
|
||||
utc_warning: Der generierte Bericht ist in UTC-Zeitzone
|
||||
agent_csv:
|
||||
agent_name: Agentenname
|
||||
conversations_count: Zugewiesene Unterhaltungen
|
||||
avg_first_response_time: Durchschnittliche Zeit bis zur ersten Antwort
|
||||
avg_resolution_time: Durchschnittliche Auflösung
|
||||
resolution_count: Auflösungsanzahl
|
||||
avg_customer_waiting_time: Durchschnittliche Kundenwartezeit
|
||||
inbox_csv:
|
||||
inbox_name: Posteingangsname
|
||||
inbox_type: Posteingangstyp
|
||||
conversations_count: Anzahl der Konversationen
|
||||
avg_first_response_time: Durchschnittliche Zeit bis zur ersten Antwort
|
||||
avg_resolution_time: Durchschnittliche Auflösung
|
||||
label_csv:
|
||||
label_title: Label
|
||||
conversations_count: Anzahl der Konversationen
|
||||
avg_first_response_time: Durchschnittliche Zeit bis zur ersten Antwort
|
||||
avg_resolution_time: Durchschnittliche Auflösung
|
||||
avg_reply_time: Avg reply time
|
||||
resolution_count: Auflösungsanzahl
|
||||
team_csv:
|
||||
team_name: Teamname
|
||||
conversations_count: Anzahl Gespräche
|
||||
avg_first_response_time: Durchschnittliche Zeit bis zur ersten Antwort
|
||||
avg_resolution_time: Durchschnittliche Auflösung
|
||||
resolution_count: Auflösungsanzahl
|
||||
avg_customer_waiting_time: Durchschnittliche Kundenwartezeit
|
||||
conversation_traffic_csv:
|
||||
timezone: Zeitzone
|
||||
sla_csv:
|
||||
conversation_id: Konversation-ID
|
||||
sla_policy_breached: SLA-Richtlinie
|
||||
assignee: Zugewiesener
|
||||
team: Team
|
||||
inbox: Posteingang
|
||||
labels: Labels
|
||||
conversation_link: Link zur Konversation
|
||||
breached_events: Gesperrte Ereignisse
|
||||
default_group_by: Tag
|
||||
csat:
|
||||
headers:
|
||||
contact_name: Kontaktname
|
||||
contact_email_address: Kontakt-E-Mail-Adresse
|
||||
contact_phone_number: Kontakt Telefonnummer
|
||||
link_to_the_conversation: Link zur Konversation
|
||||
agent_name: Agentenname
|
||||
rating: Bewertung
|
||||
feedback: Feedback-Kommentar
|
||||
recorded_at: Aufnahmedatum
|
||||
notifications:
|
||||
notification_title:
|
||||
conversation_creation: 'Neues Gespräch - #%{display_id} wurde in %{inbox_name} erstellt'
|
||||
conversation_assignment: 'Eine Unterhaltung (#%{display_id}) wurde Ihnen zugewiesen'
|
||||
assigned_conversation_new_message: 'Eine neue Nachricht wurde in der Unterhaltung erstellt (#%{display_id})'
|
||||
conversation_mention: 'Du wurdest in der Unterhaltung erwähnt (#%{display_id})'
|
||||
sla_missed_first_response: 'SLA Ziel erste Antwort für die Unterhaltung verpasst (#%{display_id})'
|
||||
sla_missed_next_response: 'SLA Ziel nächste Antwort für die Unterhaltung verpasst (#%{display_id})'
|
||||
sla_missed_resolution: 'SLA Ziel Auflösung für die Unterhaltung verpasst (#%{display_id})'
|
||||
attachment: 'Anhang'
|
||||
no_content: 'Kein Inhalt'
|
||||
conversations:
|
||||
captain:
|
||||
handoff: 'Transferring to another agent for further assistance.'
|
||||
messages:
|
||||
instagram_story_content: '%{story_sender} erwähnte sie in der Geschichte: '
|
||||
instagram_deleted_story_content: Diese Geschichte ist nicht mehr verfügbar.
|
||||
instagram_shared_story_content: 'Shared story'
|
||||
instagram_shared_post_content: 'Shared post'
|
||||
deleted: Diese Nachricht wurde gelöscht
|
||||
whatsapp:
|
||||
list_button_label: 'Choose an item'
|
||||
delivery_status:
|
||||
error_code: 'Fehlercode: %{error_code}'
|
||||
activity:
|
||||
captain:
|
||||
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
|
||||
open: 'Conversation was marked open by %{user_name}'
|
||||
agent_bot:
|
||||
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
|
||||
status:
|
||||
resolved: 'Das Gespräch wurde von %{user_name} gelöst'
|
||||
contact_resolved: 'Konversation wurde von %{contact_name} gelöst'
|
||||
open: 'Das Gespräch wurde von %{user_name} wieder eröffnet'
|
||||
pending: 'Das Gespräch wurde von %{user_name} als ausstehend markiert'
|
||||
snoozed: 'Das Gespräch wurde von %{user_name} zur Erinnerung markiert'
|
||||
auto_resolved_days: 'Das Gespräch wurde vom System aufgrund von %{count} Tagen Inaktivität gelöst'
|
||||
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
|
||||
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
|
||||
system_auto_open: Das System hat die Unterhaltung aufgrund einer neuen eingehenden Nachricht wieder geöffnet.
|
||||
priority:
|
||||
added: '%{user_name} hat die Priorität auf %{new_priority} gesetzt'
|
||||
updated: '%{user_name} hat die Priorität von %{old_priority} zu %{new_priority} geändert'
|
||||
removed: '%{user_name} hat die Priorität entfernt'
|
||||
assignee:
|
||||
self_assigned: '%{user_name} hat sich dieses Gespräch selbst zugewiesen'
|
||||
assigned: '%{user_name} von %{assignee_name} zugewiesen'
|
||||
removed: 'Gespräch nicht zugewiesen von %{user_name}'
|
||||
team:
|
||||
assigned: 'Zugewiesen an %{team_name} von %{user_name}'
|
||||
assigned_with_assignee: 'Zugewiesen an %{assignee_name} über %{team_name} von %{user_name}'
|
||||
removed: 'Entfernt aus %{team_name} von %{user_name}'
|
||||
labels:
|
||||
added: '%{user_name} hat %{labels} hinzugefügt'
|
||||
removed: '%{user_name} hat %{labels} entfernt'
|
||||
sla:
|
||||
added: '%{user_name} hat SLA-Richtlinie %{sla_name} hinzugefügt'
|
||||
removed: '%{user_name} hat SLA-Richtlinie %{sla_name} entfernt'
|
||||
linear:
|
||||
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
|
||||
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
|
||||
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
|
||||
csat:
|
||||
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
|
||||
auto_resolve:
|
||||
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||
muted: '%{user_name} hat das Gespräch stumm geschaltet'
|
||||
unmuted: '%{user_name} hat das Gespräch laut gestellt'
|
||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||
templates:
|
||||
greeting_message_body: '%{account_name} antwortet in der Regel in wenigen Stunden.'
|
||||
ways_to_reach_you_message_body: 'Geben Sie dem Team einen Weg, Sie zu erreichen.'
|
||||
email_input_box_message_body: 'Lassen Sie sich per E-Mail benachrichtigen'
|
||||
csat_input_message_body: 'Bitte bewerte die Unterhaltung'
|
||||
reply:
|
||||
email:
|
||||
header:
|
||||
notifications: 'Push-Benachrichtigungen'
|
||||
from_with_name: '%{assignee_name} von %{inbox_name} <%{from_email}>'
|
||||
reply_with_name: '%{assignee_name} von %{inbox_name} <reply+%{reply_email}>'
|
||||
friendly_name: '%{sender_name} von %{business_name} <%{from_email}>'
|
||||
professional_name: '%{business_name} <%{from_email}>'
|
||||
channel_email:
|
||||
header:
|
||||
reply_with_name: '%{assignee_name} von %{inbox_name} <%{from_email}>'
|
||||
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
||||
email_subject: 'Neue Nachrichten in dieser Unterhaltung'
|
||||
transcript_subject: 'Gesprächsprotokoll'
|
||||
survey:
|
||||
response: 'Bitte bewerten Sie diese Unterhaltung, %{link}'
|
||||
contacts:
|
||||
online:
|
||||
delete: '%{contact_name} ist online, bitte versuchen Sie es später erneut'
|
||||
integration_apps:
|
||||
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
|
||||
dashboard_apps:
|
||||
name: 'Dashboard-Apps'
|
||||
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
||||
dyte:
|
||||
name: 'Dyte'
|
||||
short_description: 'Start video/voice calls with customers directly from Chatwoot.'
|
||||
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
||||
meeting_name: '%{agent_name} hat ein Meeting begonnen'
|
||||
slack:
|
||||
name: 'Slack'
|
||||
short_description: 'Receive notifications and respond to conversations directly in Slack.'
|
||||
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
||||
webhooks:
|
||||
name: 'Webhooks'
|
||||
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
||||
dialogflow:
|
||||
name: 'Dialogflow'
|
||||
short_description: 'Build chatbots to handle initial queries before transferring to agents.'
|
||||
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
||||
google_translate:
|
||||
name: 'Google Übersetzer'
|
||||
short_description: 'Automatically translate customer messages for agents.'
|
||||
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
||||
openai:
|
||||
name: 'OpenAI'
|
||||
short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
|
||||
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
||||
linear:
|
||||
name: 'Linear'
|
||||
short_description: 'Create and link Linear issues directly from conversations.'
|
||||
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
||||
notion:
|
||||
name: 'Notion'
|
||||
short_description: 'Integrate databases, documents and pages directly with Captain.'
|
||||
description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
|
||||
shopify:
|
||||
name: 'Shopify'
|
||||
short_description: 'Access order details and customer data from your Shopify store.'
|
||||
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
||||
leadsquared:
|
||||
name: 'LeadSquared'
|
||||
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
|
||||
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
|
||||
captain:
|
||||
copilot_message_required: Nachricht ist erforderlich
|
||||
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
||||
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
||||
copilot:
|
||||
using_tool: 'Using tool %{function_name}'
|
||||
completed_tool_call: 'Completed %{function_name} tool call'
|
||||
invalid_tool_call: 'Invalid tool call'
|
||||
tool_not_available: 'Tool not available'
|
||||
documents:
|
||||
limit_exceeded: 'Document limit exceeded'
|
||||
pdf_format_error: 'must be a PDF file'
|
||||
pdf_size_error: 'must be less than 10MB'
|
||||
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||
response_creation_error: 'Error in creating response document: %{error}'
|
||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||
openai_api_error: 'OpenAI API Error: %{error}'
|
||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
|
||||
custom_tool:
|
||||
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
|
||||
public_portal:
|
||||
search:
|
||||
search_placeholder: Artikel nach Titel oder Text suchen...
|
||||
empty_placeholder: Keine Ergebnisse gefunden.
|
||||
loading_placeholder: Suchen...
|
||||
results_title: Suchergebnisse
|
||||
toc_header: 'Auf dieser Seite'
|
||||
hero:
|
||||
sub_title: Suchen Sie hier nach den Artikeln oder stöbern Sie in den unten stehenden Kategorien.
|
||||
common:
|
||||
home: Startseite
|
||||
last_updated_on: Zuletzt aktualisiert am %{last_updated_on}
|
||||
view_all_articles: Alle anzeigen
|
||||
article: Artikel
|
||||
articles: Artikel
|
||||
author: autor
|
||||
authors: Autoren
|
||||
other: anders
|
||||
others: andere
|
||||
by: Von
|
||||
no_articles: Keine Artikel vorhanden
|
||||
footer:
|
||||
made_with: Erstellt mit
|
||||
header:
|
||||
go_to_homepage: Webseite
|
||||
visit_website: Visit website
|
||||
appearance:
|
||||
system: System
|
||||
light: Hell
|
||||
dark: Dunkel
|
||||
featured_articles: Empfohlene Artikel
|
||||
uncategorized: Unkategorisiert
|
||||
404:
|
||||
title: Seite nicht gefunden
|
||||
description: Wir konnten die von Ihnen gesuchte Seite nicht finden.
|
||||
back_to_home: Zur Startseite wechseln
|
||||
slack_unfurl:
|
||||
fields:
|
||||
name: Name
|
||||
email: E-Mail
|
||||
phone_number: Telefon
|
||||
company_name: Firma
|
||||
inbox_name: Posteingang
|
||||
inbox_type: Posteingangstyp
|
||||
button: Unterhaltung öffnen
|
||||
time_units:
|
||||
days:
|
||||
one: '%{count} Tag'
|
||||
other: '%{count} Tage'
|
||||
hours:
|
||||
one: '%{count} Stunde'
|
||||
other: '%{count} Stunden'
|
||||
minutes:
|
||||
one: '%{count} Minute'
|
||||
other: '%{count} Minuten'
|
||||
seconds:
|
||||
one: '%{count} Sekunde'
|
||||
other: '%{count} Sekunden'
|
||||
automation:
|
||||
system_name: 'Automation System'
|
||||
crm:
|
||||
no_message: 'No messages in conversation'
|
||||
attachment: '[Attachment: %{type}]'
|
||||
no_content: '[Kein Inhalt]'
|
||||
created_activity: |
|
||||
New conversation started on %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Created: %{formatted_creation_time}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
transcript_activity: |
|
||||
Conversation Transcript from %{brand_name}
|
||||
|
||||
Channel: %{channel_info}
|
||||
Conversation ID: %{display_id}
|
||||
View in %{brand_name}: %{url}
|
||||
|
||||
Transcript:
|
||||
%{format_messages}
|
||||
agent_capacity_policy:
|
||||
inbox_already_assigned: 'Inbox has already been assigned to this policy'
|
||||
portals:
|
||||
send_instructions:
|
||||
email_required: 'E-Mail ist erforderlich'
|
||||
invalid_email_format: 'Invalid email format'
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
instructions_sent_successfully: 'Instructions sent successfully'
|
||||
subject: 'Finish setting up %{custom_domain}'
|
||||
ssl_status:
|
||||
custom_domain_not_configured: 'Custom domain is not configured'
|
||||
61
research/chatwoot/config/locales/devise.am.yml
Normal file
61
research/chatwoot/config/locales/devise.am.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
am:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
65
research/chatwoot/config/locales/devise.ar.yml
Normal file
65
research/chatwoot/config/locales/devise.ar.yml
Normal file
@@ -0,0 +1,65 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
ar:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "تم تأكيد عنوان بريدك الإلكتروني بنجاح."
|
||||
send_instructions: "سوف تتلقى رسالة بريد إلكتروني تحتوي على تعليمات لكيفية تأكيد عنوان البريد الإلكتروني الخاص بك خلال بضع دقائق."
|
||||
send_paranoid_instructions: "إذا كان عنوان بريدك الإلكتروني موجود في قاعدة بياناتنا، سوف تتلقى رسالة بريد إلكتروني مع إرشادات لكيفية تأكيد عنوان البريد الإلكتروني الخاص بك خلال بضع دقائق."
|
||||
failure:
|
||||
already_authenticated: "أنت مسجل الدخول مسبقاً."
|
||||
inactive: "لم يتم تفعيل حسابك بعد."
|
||||
invalid: "لم يتم التحقق من %{authentication_keys}/كلمة المرور أو أن الحساب غير مُفعّل بعد."
|
||||
locked: "حسابك مقفل."
|
||||
last_attempt: "لديك محاولة أخرى قبل أن يتم إقفال حسابك."
|
||||
not_found_in_database: "%{authentication_keys} أو كلمة المرور غير صحيحة."
|
||||
timeout: "انتهت صلاحية جلستك. الرجاء تسجيل الدخول مرة أخرى للمتابعة."
|
||||
unauthenticated: "يجب عليك تسجيل الدخول أو التسجيل قبل المتابعة."
|
||||
unconfirmed: "يجب عليك تأكيد عنوان بريدك الإلكتروني قبل المتابعة."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "تعليمات التأكيد"
|
||||
reset_password_instructions:
|
||||
subject: "تعليمات إعادة تعيين كلمة المرور"
|
||||
unlock_instructions:
|
||||
subject: "إرشادات إلغاء القفل"
|
||||
password_change:
|
||||
subject: "تم تغيير كلمة المرور"
|
||||
omniauth_callbacks:
|
||||
failure: "تعذر المصادقة من %{kind} لأن \"%{reason}\"."
|
||||
success: "تمت المصادقة بنجاح من حساب %{kind}."
|
||||
passwords:
|
||||
no_token: "لا يمكنك الوصول لهذه الصفحة دون أن تأتي من البريد الإلكتروني لإعادة تعيين كلمة المرور. إذا كنت وصلت إلى هنا عبر البريد إلكتروني لإعادة تعيين كلمة المرور، الرجاء التأكد من أنك استخدمت عنوان الرابط بأكمله."
|
||||
send_instructions: "سوف تتلقى رسالة بريد إلكتروني تحتوي على تعليمات إعادة ضبط كلمة المرور خلال بضع دقائق."
|
||||
send_paranoid_instructions: "إذا كان عنوان بريدك الإلكتروني موجود في قاعدة بياناتنا، سوف تتلقى رسالة بريد إلكتروني مع إرشادات إعادة ضبط كلمة المرور خلال بضع دقائق."
|
||||
updated: "تم تغيير كلمة المرور الخاصة بك بنجاح وتم تسجيل دخولك الآن."
|
||||
updated_not_active: "تم تغيير كلمة المرور بنجاح."
|
||||
registrations:
|
||||
destroyed: "وداعاً! لقد تم إلغاء حسابك بنجاح. نأمل أن نراك مرة أخرى قريباً."
|
||||
signed_up: "مرحبًا! لقد قمت بالتسجيل بنجاح."
|
||||
signed_up_but_inactive: "لقد قمت بالتسجيل بنجاح. ومع ذلك، لم نستطع تسجيل دخولك لأن حسابك لم يتم تفعيله بعد."
|
||||
signed_up_but_locked: "لقد قمت بالتسجيل بنجاح. ومع ذلك، لم نستطع تسجيل دخولك لأن حسابك لم يتم تفعيله بعد."
|
||||
signed_up_but_unconfirmed: "تم إرسال رسالة مع رابط تأكيد إلى عنوان بريدك الإلكتروني. الرجاء اتباع الرابط لتفعيل حسابك."
|
||||
update_needs_confirmation: "لقد قمت بتحديث حسابك بنجاح، ولكن نحن بحاجة إلى التحقق من عنوان بريدك الإلكتروني الجديد. الرجاء التحقق من بريدك الإلكتروني واتبع رابط التأكيد لتأكيد عنوان بريدك الإلكتروني الجديد."
|
||||
updated: "تم تحديث حسابك بنجاح."
|
||||
sessions:
|
||||
signed_in: "تم تسجيل الدخول بنجاح."
|
||||
signed_out: "تم تسجيل الخروج بنجاح."
|
||||
already_signed_out: "تم تسجيل الخروج بنجاح."
|
||||
unlocks:
|
||||
send_instructions: "سوف تتلقى رسالة بريد إلكتروني تحتوي على تعليمات لكيفية فتح قفل حسابك في بضع دقائق."
|
||||
send_paranoid_instructions: "إذا كان حسابك موجودا، سوف تتلقى رسالة بريد إلكتروني تحتوي على إرشادات لكيفية فتحه في بضع دقائق."
|
||||
unlocked: "تم إلغاء قفل حسابك بنجاح. الرجاء تسجيل الدخول للمتابعة."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "تم تأكيده مسبقا، الرجاء محاولة تسجيل الدخول"
|
||||
confirmation_period_expired: "يحتاج إلى تأكيد في غضون %{period}، الرجاء طلب التأكيد مره أخرى"
|
||||
expired: "انتهت صلاحيته، الرجاء إجراء طلب جديد"
|
||||
not_found: "غير موجود"
|
||||
not_locked: "لم يكن مقفلاً"
|
||||
not_saved:
|
||||
zero: "%{count} خطأ حظر هذا %{resource} من الحفظ:"
|
||||
one: "خطأ واحد حظر هذا %{resource} من الحفظ:"
|
||||
two: "%{count} أخطاء تمنع هذا %{resource} من الحفظ:"
|
||||
few: "%{count} خطأ تمنع هذا %{resource} من الحفظ:"
|
||||
many: "%{count} أخطاء تمنع هذا %{resource} من الحفظ:"
|
||||
other: "%{count} أخطاء تمنع هذا %{resource} من الحفظ:"
|
||||
61
research/chatwoot/config/locales/devise.az.yml
Normal file
61
research/chatwoot/config/locales/devise.az.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
az:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
61
research/chatwoot/config/locales/devise.bg.yml
Normal file
61
research/chatwoot/config/locales/devise.bg.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
bg:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
61
research/chatwoot/config/locales/devise.bn.yml
Normal file
61
research/chatwoot/config/locales/devise.bn.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
bn:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
61
research/chatwoot/config/locales/devise.ca.yml
Normal file
61
research/chatwoot/config/locales/devise.ca.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
ca:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "El teu compte ha estat confirmat correctament. Si us plau, inicia la sessió."
|
||||
send_instructions: "En breu rebràs un correu electrònic amb instruccions sobre com confirmar el teu compte."
|
||||
send_paranoid_instructions: "Si la teva adreça electrònica existeix a la base de dades, rebràs un correu electrònic amb instruccions sobre com confirmar el teu compte."
|
||||
failure:
|
||||
already_authenticated: "Ja estàs identificat."
|
||||
inactive: "El teu compte encara no ha estat activat."
|
||||
invalid: "%{authentication_keys} o contrasenya invàlids."
|
||||
locked: "El teu compte està bloquejat."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid email or password."
|
||||
timeout: "La teva sessió ha caducat. Si us plau, torna a iniciar sessió per a continuar."
|
||||
unauthenticated: "Has d'iniciar sessió o bé registrar-te abans de continuar."
|
||||
unconfirmed: "Has de confirmar el teu compte abans de continuar."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Instruccions de confirmació"
|
||||
reset_password_instructions:
|
||||
subject: "Instruccions de regeneració de contrasenya"
|
||||
unlock_instructions:
|
||||
subject: "Instruccions de desbloqueig"
|
||||
password_change:
|
||||
subject: "S'ha canviat la contrasenya"
|
||||
omniauth_callbacks:
|
||||
failure: "No hem pogut autoritzar el compte des de %{kind} perquè \"%{reason}\"."
|
||||
success: "Autoritzat satisfactoriament el compte des de %{kind}."
|
||||
passwords:
|
||||
no_token: "No pots accedir aquesta pàgina si no ho fas seguint l'enllaç d'un correu de regeneració de contrasenya. Si ja en vens, assegura't que estàs utilitzant l'adreça sencera que has rebut."
|
||||
send_instructions: "En breu rebràs un correu electrònic amb instruccions sobre com restablir la teva contrasenya."
|
||||
send_paranoid_instructions: "Si la teva adreça electrònica existeix a la base de dades, rebràs un correu electrònic amb un enllaç per reestablir la contrasenya."
|
||||
updated: "La teva contrasenya ha estat canviada correctament. S'ha iniciat la sessió."
|
||||
updated_not_active: "La teva contrasenya ha estat canviada correctament."
|
||||
registrations:
|
||||
destroyed: "Adéu! El teu compte ha estat cancel·lat correctament. Esperem tornar-te a veure!"
|
||||
signed_up: "Has estat registrat correctament."
|
||||
signed_up_but_inactive: "Has estat registrat correctament. Tanmateix, no hem pogut iniciar la sessió perquè el teu compte encara no està activat."
|
||||
signed_up_but_locked: "Has estat registrat correctament. Tanmateix, no hem pogut iniciar la sessió perquè el teu compte està bloquejat."
|
||||
signed_up_but_unconfirmed: "Hem enviat un missatge amb un enllaç de confirmació a la teva adreça de correu electrònic. Si us plau, segueix l'enllaç per activar el teu compte."
|
||||
update_needs_confirmation: "Has actualitzat el teu compte correctament, però hem de verificar la teva nova adreça de correu electrònic. Si us plau, revisa el teu correu i clica l'enllaç de confirmació per acabar el procès de verificació de la teva adreça de correu electrònic."
|
||||
updated: "Has actualitzat el teu compte correctament."
|
||||
sessions:
|
||||
signed_in: "Sessió iniciada correctament."
|
||||
signed_out: "Sessió tancada correctament."
|
||||
already_signed_out: "Sessió tancada correctament."
|
||||
unlocks:
|
||||
send_instructions: "En breu rebràs un correu electrònic amb instruccions sobre com desbloquejar el teu compte."
|
||||
send_paranoid_instructions: "Si el teu compte existeix, rebràs un correu electrònic amb instruccions sobre com desbloquejar-lo."
|
||||
unlocked: "El teu compte ha estat desbloquejat correctament. S'ha iniciat la sessió."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "ja està confirmat"
|
||||
confirmation_period_expired: "ha de ser confirmada en %{period}, si us plau, demana'n un de nou"
|
||||
expired: "ha caducat, demana'n un de nou"
|
||||
not_found: "no s'ha trobat"
|
||||
not_locked: "no està bloquejat"
|
||||
not_saved:
|
||||
one: "1 error ha evitat que %{resource} es pugui desar:"
|
||||
other: "%{count} errors han evitat que %{resource} es pugui desar:"
|
||||
63
research/chatwoot/config/locales/devise.cs.yml
Normal file
63
research/chatwoot/config/locales/devise.cs.yml
Normal file
@@ -0,0 +1,63 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
cs:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Vaše e-mailová adresa byla úspěšně potvrzena."
|
||||
send_instructions: "Za několik minut obdržíte e-mail s pokyny, jak potvrdit vaši e-mailovou adresu."
|
||||
send_paranoid_instructions: "Pokud vaše e-mailová adresa existuje v naší databázi, za několik minut obdržíte e-mail s pokyny, jak potvrdit vaši e-mailovou adresu."
|
||||
failure:
|
||||
already_authenticated: "Již jste přihlášeni."
|
||||
inactive: "Váš účet ještě není aktivován."
|
||||
invalid: "Neplatný %{authentication_keys}/password nebo účet ještě nebyl ověřen."
|
||||
locked: "Váš účet je uzamčen."
|
||||
last_attempt: "Máte ještě jeden pokus než bude váš účet uzamčen."
|
||||
not_found_in_database: "Neplatné %{authentication_keys} nebo heslo."
|
||||
timeout: "Vaše relace vypršela. Chcete-li pokračovat, přihlaste se znovu."
|
||||
unauthenticated: "Před pokračováním se musíte přihlásit nebo se zaregistrovat."
|
||||
unconfirmed: "Než budete pokračovat, musíte potvrdit svou e-mailovou adresu."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Instrukce pro potvrzení"
|
||||
reset_password_instructions:
|
||||
subject: "Pokyny pro obnovení hesla"
|
||||
unlock_instructions:
|
||||
subject: "Pokyny pro odemknutí"
|
||||
password_change:
|
||||
subject: "Heslo změněno"
|
||||
omniauth_callbacks:
|
||||
failure: "Nelze se přihlásit z %{kind} , protože \"%{reason}\"."
|
||||
success: "Úspěšně ověřeno z účtu %{kind}."
|
||||
passwords:
|
||||
no_token: "Na tuto stránku nemáte přístup bez e-mailu pro obnovení hesla. Pokud pocházíte z e-mailu pro obnovení hesla, ujistěte se, že jste použili celou URL adresu."
|
||||
send_instructions: "Za několik minut obdržíte e-mail s pokyny, jak obnovit heslo."
|
||||
send_paranoid_instructions: "Pokud vaše e-mailová adresa existuje v naší databázi, za několik minut obdržíte na vaši e-mailovou adresu odkaz pro obnovení hesla."
|
||||
updated: "Vaše heslo bylo úspěšně změněno. Nyní jste přihlášeni."
|
||||
updated_not_active: "Vaše heslo bylo úspěšně změněno."
|
||||
registrations:
|
||||
destroyed: "O! Váš účet byl úspěšně zrušen. Doufáme, že vás brzy znovu uvidíme."
|
||||
signed_up: "Vítejte! Úspěšně jste se zaregistrovali."
|
||||
signed_up_but_inactive: "Úspěšně jste se zaregistrovali. Nicméně, nemohli jsme se přihlásit, protože Váš účet ještě není aktivován."
|
||||
signed_up_but_locked: "Úspěšně jste se zaregistrovali. Nicméně, nemohli jsme se přihlásit, protože Váš účet je uzamčen."
|
||||
signed_up_but_unconfirmed: "Zpráva s potvrzovacím odkazem byla odeslána na vaši e-mailovou adresu. Pro aktivaci účtu prosím postupujte podle odkazu."
|
||||
update_needs_confirmation: "Váš účet byl úspěšně aktualizován, ale musíme ověřit Vaši novou e-mailovou adresu. Prosím zkontrolujte svůj e-mail a klikněte na odkaz pro potvrzení Vaší nové e-mailové adresy."
|
||||
updated: "Váš účet byl úspěšně aktualizován."
|
||||
sessions:
|
||||
signed_in: "Úspěšně přihlášeno."
|
||||
signed_out: "Úspěšně odhlášeno."
|
||||
already_signed_out: "Úspěšně odhlášeno."
|
||||
unlocks:
|
||||
send_instructions: "Za několik minut obdržíte e-mail s pokyny, jak odemknout váš účet."
|
||||
send_paranoid_instructions: "Pokud váš účet existuje, obdržíte během několika minut e-mail s pokyny, jak jej odemknout."
|
||||
unlocked: "Váš účet byl úspěšně odemčen. Pro pokračování se přihlaste."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "byl již potvrzen, zkuste se prosím přihlásit"
|
||||
confirmation_period_expired: "musí být potvrzeno do %{period}, prosím požádejte o nový"
|
||||
expired: "vypršela platnost. Požádejte prosím o nový"
|
||||
not_found: "nenalezeno"
|
||||
not_locked: "nebylo uzamčeno"
|
||||
not_saved:
|
||||
one: "1 chyba zabránila uložení tohoto %{resource}:"
|
||||
few: "%{count} chyb znemožnilo uložení %{resource}:"
|
||||
many: "%{count} chyb znemožnilo uložení %{resource}:"
|
||||
other: "%{count} chyb znemožnilo uložení %{resource}:"
|
||||
61
research/chatwoot/config/locales/devise.da.yml
Normal file
61
research/chatwoot/config/locales/devise.da.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
da:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Din e-mailadresse er blevet bekræftet."
|
||||
send_instructions: "Du vil modtage en e-mail med instruktioner til, hvordan du bekræfter din e-mail-adresse om et par minutter."
|
||||
send_paranoid_instructions: "Hvis din e-mailadresse findes i vores database, du vil modtage en e-mail med instruktioner til, hvordan du bekræfter din e-mail-adresse om et par minutter."
|
||||
failure:
|
||||
already_authenticated: "Du er allerede logget ind."
|
||||
inactive: "Din konto er ikke aktiveret endnu."
|
||||
invalid: "Ugyldig %{authentication_keys}/password eller konto er ikke bekræftet endnu."
|
||||
locked: "Din konto er låst."
|
||||
last_attempt: "Du har et forsøg mere, før din konto er låst."
|
||||
not_found_in_database: "Ugyldig %{authentication_keys} eller adgangskode."
|
||||
timeout: "Din session er udløbet. Log ind igen for at fortsætte."
|
||||
unauthenticated: "Du skal logge ind eller tilmelde dig, før du fortsætter."
|
||||
unconfirmed: "Du skal bekræfte din e-mailadresse, før du fortsætter."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Bekræftelsesinstruktioner"
|
||||
reset_password_instructions:
|
||||
subject: "Nulstil adgangskodeinstruktioner"
|
||||
unlock_instructions:
|
||||
subject: "Lås instruktioner op"
|
||||
password_change:
|
||||
subject: "Adgangskode Ændret"
|
||||
omniauth_callbacks:
|
||||
failure: "Kunne ikke godkende dig fra %{kind} fordi \"%{reason}\"."
|
||||
success: "Godkendt fra %{kind} -kontoen."
|
||||
passwords:
|
||||
no_token: "Du kan ikke få adgang til denne side uden at komme fra en e-mailen til nulstilling af adgangskoden. Hvis du kommer fra en e-mail til nulstilling af adgangskoden, skal du sørge for at bruge den fulde URL, der er angivet."
|
||||
send_instructions: "Du vil om få minutter modtage en e-mail med instruktioner om, hvordan du nulstiller din adgangskode."
|
||||
send_paranoid_instructions: "Hvis din e-mailadresse findes i vores database, vil du om få minutter modtage et link til genoprettelse af adgangskoden på din e-mailadresse."
|
||||
updated: "Din adgangskode er blevet ændret. Du er nu logget ind."
|
||||
updated_not_active: "Din adgangskode er blevet ændret."
|
||||
registrations:
|
||||
destroyed: "Farvel! Din konto er blevet annulleret. Vi håber snart at se dig igen."
|
||||
signed_up: "Velkommen! Du er nu tilmeldt."
|
||||
signed_up_but_inactive: "Du har tilmeldt dig. Vi kunne dog ikke logge dig på, fordi din konto endnu ikke er aktiveret."
|
||||
signed_up_but_locked: "Du har tilmeldt dig. Vi kunne dog ikke logge dig ind, fordi din konto er låst."
|
||||
signed_up_but_unconfirmed: "En besked med et bekræftelseslink er blevet sendt til din e-mailadresse. Følg linket for at aktivere din konto."
|
||||
update_needs_confirmation: "Din konto er opdateret, men vi er nødt til at bekræfte din nye e-mailadresse. Tjek venligst din e-mail og følg linket for at bekræfte din nye e-mailadresse."
|
||||
updated: "Din konto er blevet opdateret."
|
||||
sessions:
|
||||
signed_in: "Logget ind."
|
||||
signed_out: "Logget ud."
|
||||
already_signed_out: "Logget ud."
|
||||
unlocks:
|
||||
send_instructions: "Du vil modtage en e-mail med instruktioner til, hvordan du låser din konto op om et par minutter."
|
||||
send_paranoid_instructions: "Hvis din konto findes, vil du modtage en e-mail med instruktioner til, hvordan du låser den op om et par minutter."
|
||||
unlocked: "Din konto er blevet låst op. Log venligst ind for at fortsætte."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "var allerede bekræftet, prøv venligst at logge ind"
|
||||
confirmation_period_expired: "skal bekræftes inden for %{period}, anmod venligst om en ny"
|
||||
expired: "er udløbet, anmod venligst om en ny"
|
||||
not_found: "ikke fundet"
|
||||
not_locked: "var ikke låst"
|
||||
not_saved:
|
||||
one: "1 fejl forhindrede denne %{resource} i at blive gemt:"
|
||||
other: "%{count} fejl forhindrede denne %{resource} i at blive gemt:"
|
||||
61
research/chatwoot/config/locales/devise.de.yml
Normal file
61
research/chatwoot/config/locales/devise.de.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
de:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Ihre E-Mail-Adresse wurde erfolgreich bestätigt."
|
||||
send_instructions: "Sie erhalten in wenigen Minuten eine E-Mail mit Anweisungen zur Bestätigung Ihrer E-Mail-Adresse."
|
||||
send_paranoid_instructions: "Wenn Ihre E-Mail-Adresse in unserer Datenbank vorhanden ist, erhalten Sie in wenigen Minuten eine E-Mail mit Anweisungen zur Bestätigung Ihrer E-Mail-Adresse."
|
||||
failure:
|
||||
already_authenticated: "Sie sind bereits angemeldet."
|
||||
inactive: "Ihr Konto ist noch nicht aktiviert."
|
||||
invalid: "Ungültiges %{authentication_keys}/Passwort oder dieses Konto ist noch nicht verifiziert."
|
||||
locked: "Ihr Konto ist gesperrt."
|
||||
last_attempt: "Sie haben noch einen Versuch, bevor Ihr Konto gesperrt wird."
|
||||
not_found_in_database: "Ungültiger %{authentication_keys} oder Passwort."
|
||||
timeout: "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an, um fortzufahren."
|
||||
unauthenticated: "Sie müssen sich anmelden oder registrieren, bevor Sie fortfahren können."
|
||||
unconfirmed: "Sie müssen Ihre E-Mail-Adresse bestätigen, bevor Sie fortfahren können."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Anleitung zur Bestätigung"
|
||||
reset_password_instructions:
|
||||
subject: "Anweisungen zum Zurücksetzen des Passworts"
|
||||
unlock_instructions:
|
||||
subject: "Anleitung zur Entsperren"
|
||||
password_change:
|
||||
subject: "Passwort geändert"
|
||||
omniauth_callbacks:
|
||||
failure: "Sie konnten nicht von %{kind} authentifiziert werden, weil \"%{reason}\"."
|
||||
success: "Erfolgreich authentifiziert mit %{kind} Konto."
|
||||
passwords:
|
||||
no_token: "Sie können nicht auf diese Seite zugreifen, ohne von einer E-Mail zum Zurücksetzen des Passworts zu kommen. Wenn Sie von einer E-Mail zum Zurücksetzen des Passworts kommen, stellen Sie bitte sicher, dass Sie die vollständige angegebene URL verwendet haben."
|
||||
send_instructions: "Sie erhalten in wenigen Minuten eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts."
|
||||
send_paranoid_instructions: "Wenn Ihre E-Mail-Adresse in unserer Datenbank existiert, erhalten Sie in wenigen Minuten einen Link zur Passwortwiederherstellung an Ihre E-Mail-Adresse."
|
||||
updated: "Ihr Passwort wurde erfolgreich geändert. Sie sind jetzt angemeldet."
|
||||
updated_not_active: "Ihr Passwort wurde erfolgreich geändert."
|
||||
registrations:
|
||||
destroyed: "Wiedersehen! Ihr Konto wurde erfolgreich gekündigt. Wir hoffen, Sie bald wieder zu sehen."
|
||||
signed_up: "Willkommen! Sie haben sich erfolgreich angemeldet."
|
||||
signed_up_but_inactive: "Sie haben sich erfolgreich registriert. Wir konnten Sie jedoch nicht anmelden, da Ihr Konto noch nicht aktiviert ist."
|
||||
signed_up_but_locked: "Sie haben sich erfolgreich registriert. Wir konnten Sie jedoch nicht anmelden, da Ihr Konto gesperrt ist."
|
||||
signed_up_but_unconfirmed: "Eine Nachricht mit einem Bestätigungslink wurde an Ihre E-Mail-Adresse gesendet. Bitte folgen Sie dem Link, um Ihr Konto zu aktivieren."
|
||||
update_needs_confirmation: "Sie haben Ihr Konto erfolgreich aktualisiert, aber wir müssen Ihre neue E-Mail-Adresse verifizieren. Bitte überprüfen Sie Ihr Postfach und folgen Sie dem Bestätigungslink, um Ihre neue E-Mail-Adresse zu bestätigen."
|
||||
updated: "Ihr Konto wurde erfolgreich aktualisiert."
|
||||
sessions:
|
||||
signed_in: "Erfolgreich angemeldet."
|
||||
signed_out: "Erfolgreich abgemeldet."
|
||||
already_signed_out: "Erfolgreich abgemeldet."
|
||||
unlocks:
|
||||
send_instructions: "Sie erhalten in wenigen Minuten eine E-Mail mit Anweisungen, wie Sie Ihr Konto entsperren können."
|
||||
send_paranoid_instructions: "Wenn Ihr Konto existiert, werden Sie in wenigen Minuten eine E-Mail mit Anweisungen erhalten, wie Sie dieses entsperren können."
|
||||
unlocked: "Ihr Konto wurde erfolgreich entsperrt. Bitte einloggen, um fortzufahren."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "wurde bereits bestätigt, bitte versuchen Sie sich anzumelden"
|
||||
confirmation_period_expired: "muss innerhalb von %{period} bestätigt werden, bitte fordern Sie einen neuen an"
|
||||
expired: "ist abgelaufen, bitte fordern Sie einen neuen an"
|
||||
not_found: "nicht gefunden"
|
||||
not_locked: "wurde nicht gesperrt"
|
||||
not_saved:
|
||||
one: "1 Fehler verhinderte, dass %{resource} gespeichert wurde:"
|
||||
other: "%{count} Fehler verhinderten, dass %{resource} gespeichert wurde:"
|
||||
61
research/chatwoot/config/locales/devise.el.yml
Normal file
61
research/chatwoot/config/locales/devise.el.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
el:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Η διεύθυνση του email έχει επιβεβαιωθεί."
|
||||
send_instructions: "Θα λάβετε ένα email με οδηγίες για την επιβεβαίωση της διεύθυνσης email σε λίγα λεπτά."
|
||||
send_paranoid_instructions: "Αν η διεύθυνση email υπάρχει στην βάση δεδομένων, θα λάβετε ένα email με οδηγίες πως θα επιβεβαιώσετε την διεύθυνση email σε λίγα λεπτά."
|
||||
failure:
|
||||
already_authenticated: "Έχετε ήδη εγγραφεί."
|
||||
inactive: "Ο λογαριασμός σας δεν έχει ενεργοποιηθεί ακόμη."
|
||||
invalid: "Ακατάλληλο %{authentication_keys}/κωδικός ή ο λογαριασμός σας δεν έχει ακόμη επιβεβαιωθεί."
|
||||
locked: "Ο Λογαριασμός σας έχει κλειδωθεί."
|
||||
last_attempt: "Έχετε μια ακόμη προσπάθεια πριν ο λογαριασμός σας κλειδωθεί."
|
||||
not_found_in_database: "Ακατάλληλα %{authentication_keys} ή κωδικός."
|
||||
timeout: "Η σύνοδος έχει λήξει. Παρακαλώ εισέλθετε ξανά για την συνέχεια."
|
||||
unauthenticated: "Απαιτείται να εγγραφείτε ή να εισέλθετε πριν συνεχίσετε."
|
||||
unconfirmed: "Πρέπει να επιβεβαιώσετε την διεύθυνση email πριν συνεχίσετε."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Οδηγίες επιβεβαίωσης"
|
||||
reset_password_instructions:
|
||||
subject: "Οδηγίες επαναφοράς κωδικού"
|
||||
unlock_instructions:
|
||||
subject: "Οδηγίες ξεκλειδώματος"
|
||||
password_change:
|
||||
subject: "Ο κωδικός άλλαξε"
|
||||
omniauth_callbacks:
|
||||
failure: "Δεν μπορεί να γίνει η ταυτοποίηση σας από %{kind} επειδή \"%{reason}\"."
|
||||
success: "Έγινε ταυτοποίηση από %{kind} λογαριασμού."
|
||||
passwords:
|
||||
no_token: "Δεν έχετε πρόσβαση σε αυτήν την σελίδα, χωρίς να προέρχεστε από το σύνδεσμο της επαναφοράς κωδικού. Αν έρχεστε από αυτόν τον σύνδεσμο σιγουρευτείτε ότι υπάρχει το πλήρες URL."
|
||||
send_instructions: "Θα λάβετε ένα email με οδηγίες πως θα επαναφέρετε τον κωδικό σας σε μερικά λεπτά."
|
||||
send_paranoid_instructions: "Αν η διεύθυνση email υπάρχει στην βάση μας, θα λάβετε ένα σύνδεσμο επαναφοράς κωδικού στο email σας σε μερικά λεπτά."
|
||||
updated: "Ο κωδικός σας άλλαξε. Τώρα έχετε εισέθλει."
|
||||
updated_not_active: "Ο κωδικός σας άλλαξε με επιτυχία."
|
||||
registrations:
|
||||
destroyed: "Στο καλό! Ο λογαριασμός σας ακυρώθηκε. Ελπίζουμε να σας ξαναδούμε σύντομα."
|
||||
signed_up: "Καλώς ορίσατε! Η εγγραφής ολοκληρώθηκε με επιτυχία."
|
||||
signed_up_but_inactive: "Εγγραφήκατε με επιτυχία. Πάντως, δεν μπορείτε ακόμη να εισέλθετε επειδή ο λογαριασμός σας δεν ενεργοποιήθηκε ακόμα."
|
||||
signed_up_but_locked: "Εγγραφήκατε με επιτυχία. Πάντως, δεν μπορείτε ακόμη να εισέλθετε επειδή ο λογαριασμός σας είναι κλειδωμένος."
|
||||
signed_up_but_unconfirmed: "Ένα μήνυμα με τον σύνδεσμο επιβεβαίωσης έχει σταλεί στο email σας. Ακολουθήστε τον σύνδεσμο για την ενεργοποίηση του λογαριασμού σας."
|
||||
update_needs_confirmation: "Ενημερώσατε τον λογαριασμό σας με επιτυχία, αλλά πρέπει να επιβεβαιώστε την διεύθυνση email. Ελέγξτε την αλληλογραφία σας και ακολουθήστε το σύνδεσμο επιβεβαίωσης."
|
||||
updated: "Ο κωδικός σας ενημερώθηκε με επιτυχία."
|
||||
sessions:
|
||||
signed_in: "Επιτυχής είσοδος."
|
||||
signed_out: "Επιτυχής έξοδος."
|
||||
already_signed_out: "Επιτυχής έξοδος."
|
||||
unlocks:
|
||||
send_instructions: "Θα λάβετε ένα email με οδηγίες πως θα ξεκλειδώστε τον λογαριασμό σας σε μερικά λεπτά."
|
||||
send_paranoid_instructions: "Αν ο λογαριασμός σας υπάρχει, θα λάβετε ειδοποίηση email με οδηγίες για το ξεκλείδωμα σε μερικά λεπτά."
|
||||
unlocked: "Ο λογαριασμός σας ξεκλειδώθηκε. Παρακαλώ εισέλθετε για να συνεχίσετε."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "έχει ήδη επιβεβαιωθεί, παρακαλώ δοκιμάστε την είσοδο"
|
||||
confirmation_period_expired: "απαιτείται να επιβεβαιωθεί εντός %{period}, παρακαλώ αιτηθείτε νέο"
|
||||
expired: "έχει λήξει, παρακαλώ αιτηθείτε νέο"
|
||||
not_found: "δεν βρέθηκε"
|
||||
not_locked: "δεν είναι κλειδωμένος"
|
||||
not_saved:
|
||||
one: "1 σφάλμα αποτρέπει το %{resource} από την αποθήκευση:"
|
||||
other: "%{count} σφάλματα αποτρέπουν το %{resource} από την αποθήκευση:"
|
||||
62
research/chatwoot/config/locales/devise.en.yml
Normal file
62
research/chatwoot/config/locales/devise.en.yml
Normal file
@@ -0,0 +1,62 @@
|
||||
# Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
|
||||
en:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
61
research/chatwoot/config/locales/devise.es.yml
Normal file
61
research/chatwoot/config/locales/devise.es.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
es:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Su dirección de correo electrónico ha sido confirmada con éxito."
|
||||
send_instructions: "Recibirás un correo electrónico con instrucciones para confirmar tu dirección de correo electrónico en unos minutos."
|
||||
send_paranoid_instructions: "Si tu dirección de correo electrónico existe en nuestra base de datos, recibirás un correo electrónico con instrucciones para confirmar tu dirección de correo electrónico en unos minutos."
|
||||
failure:
|
||||
already_authenticated: "Ya has iniciado sesión."
|
||||
inactive: "Tu cuenta aún no está activada."
|
||||
invalid: "%{authentication_keys}/password o cuenta no válida aún no está verificada."
|
||||
locked: "Tu cuenta está bloqueada."
|
||||
last_attempt: "Tienes un intento más antes de que tu cuenta esté bloqueada."
|
||||
not_found_in_database: "%{authentication_keys} o contraseña no válida."
|
||||
timeout: "Su sesión ha caducado. Por favor, inicie sesión de nuevo para continuar."
|
||||
unauthenticated: "Necesitas iniciar sesión o registrarte antes de continuar."
|
||||
unconfirmed: "Tienes que confirmar tu dirección de correo electrónico antes de continuar."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Instrucciones de confirmación"
|
||||
reset_password_instructions:
|
||||
subject: "Instrucciones para restablecer la contraseña"
|
||||
unlock_instructions:
|
||||
subject: "Instrucciones de desbloqueo"
|
||||
password_change:
|
||||
subject: "Contraseña cambiada"
|
||||
omniauth_callbacks:
|
||||
failure: "No se pudo autenticar desde %{kind} porque \"%{reason}\"."
|
||||
success: "Autenticado correctamente desde la cuenta de %{kind}."
|
||||
passwords:
|
||||
no_token: "No puede acceder a esta página sin proceder de un correo electrónico de restablecimiento de contraseña. Si viene de un correo electrónico de restablecimiento de contraseña, por favor asegúrese de utilizar la URL completa proporcionada."
|
||||
send_instructions: "Recibirás un correo electrónico con instrucciones sobre cómo restablecer tu contraseña en unos minutos."
|
||||
send_paranoid_instructions: "Si tu dirección de correo electrónico existe en nuestra base de datos, recibirás un enlace de recuperación de contraseña en tu dirección de correo electrónico en unos minutos."
|
||||
updated: "Tu contraseña ha sido cambiada con éxito. Ahora estás conectado."
|
||||
updated_not_active: "Su contraseña se ha cambiado correctamente."
|
||||
registrations:
|
||||
destroyed: "¡Por! Tu cuenta ha sido cancelada con éxito. Esperamos verte de nuevo pronto."
|
||||
signed_up: "¡Bienvenido! Te has registrado correctamente."
|
||||
signed_up_but_inactive: "Te has registrado correctamente. Sin embargo, no pudimos iniciar sesión porque tu cuenta aún no está activada."
|
||||
signed_up_but_locked: "Te has registrado correctamente. Sin embargo, no pudimos iniciar sesión porque tu cuenta está bloqueada."
|
||||
signed_up_but_unconfirmed: "Se ha enviado un mensaje con un enlace de confirmación a su dirección de correo electrónico. Por favor, siga el enlace para activar su cuenta."
|
||||
update_needs_confirmation: "Has actualizado tu cuenta con éxito, pero necesitamos verificar tu nueva dirección de correo electrónico. Por favor, comprueba tu correo electrónico y sigue el enlace de confirmación para confirmar tu nueva dirección de correo electrónico."
|
||||
updated: "Tu cuenta se ha actualizado correctamente."
|
||||
sessions:
|
||||
signed_in: "Sesión iniciada correctamente."
|
||||
signed_out: "Cerrado con éxito."
|
||||
already_signed_out: "Cerrado con éxito."
|
||||
unlocks:
|
||||
send_instructions: "Recibirás un correo electrónico con instrucciones para desbloquear tu cuenta en unos minutos."
|
||||
send_paranoid_instructions: "Si tu cuenta existe, recibirás un correo electrónico con instrucciones sobre cómo desbloquearla en unos minutos."
|
||||
unlocked: "Tu cuenta ha sido desbloqueada con éxito. Por favor, inicia sesión para continuar."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "ya ha sido confirmado, por favor intenta iniciar sesión"
|
||||
confirmation_period_expired: "necesita ser confirmado dentro de %{period}, por favor solicite una nueva"
|
||||
expired: "ha expirado, por favor solicita uno nuevo"
|
||||
not_found: "no encontrado"
|
||||
not_locked: "no se ha bloqueado"
|
||||
not_saved:
|
||||
one: "1 error impide guardar este %{resource}:"
|
||||
other: "%{count} errores impiden guardar este %{resource}:"
|
||||
61
research/chatwoot/config/locales/devise.et.yml
Normal file
61
research/chatwoot/config/locales/devise.et.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
et:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
61
research/chatwoot/config/locales/devise.fa.yml
Normal file
61
research/chatwoot/config/locales/devise.fa.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
fa:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "ایمیل شما با موفقیت فعال شد."
|
||||
send_instructions: "ظرف چند دقیقه ایمیلی حاوی روش فعال کردن حساب خود دریافت خواهید کرد."
|
||||
send_paranoid_instructions: "در صورت موجود بودن ایمیل شما در پایگاه داده ما، ظرف چند دقیقه یک ایمیل حاوی روش فعال کردن حساب خود دریافت خواهید کرد."
|
||||
failure:
|
||||
already_authenticated: "شما قبلا از حساب کاربری خود خارج شدهاید."
|
||||
inactive: "حساب کاربری شما هنوز فعال نشده است."
|
||||
invalid: "شناسه %{authentication_keys} یا رمز عبور اشتباه است و یا هنوز فعال نشده است."
|
||||
locked: "حساب کاربری شما مسدود شده است."
|
||||
last_attempt: "یک مرتبه دیگر میتوانید امتحان کنید و پس از آن حساب کاربری شما مسدود میشود."
|
||||
not_found_in_database: "شناسه %{authentication_keys} یا رمز عبور اشتباه است."
|
||||
timeout: "مدت زیادی است که با سایت کار نکردهاید، جهت تامین امنیت شما لازم است مجددا به حساب کاربری خود وارد شوید."
|
||||
unauthenticated: "برای استفاده از این بخش لازم است ثبت نام کرده و به حساب کاربری خود وارد شوید."
|
||||
unconfirmed: "برای استفاده از این بخش لازم است از طریق ایمیل خود، حساب کاربریتان را فعال کنید."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "روش فعالسازی"
|
||||
reset_password_instructions:
|
||||
subject: "روش تغییر رمزعبور"
|
||||
unlock_instructions:
|
||||
subject: "روش باز کردن حساب مسدود شده"
|
||||
password_change:
|
||||
subject: "رمزعبور تغییر کرد"
|
||||
omniauth_callbacks:
|
||||
failure: "متاسفانه به علت \"%{reason}\" امکان ورود از %{kind} وجود ندارد."
|
||||
success: "ورود از حساب %{kind} با موفقیت انجام شد."
|
||||
passwords:
|
||||
no_token: "این صفحه تنها در صورتی قابل مشاهده است که از طریق ایمیل باز شده باشد. چنانچه از طریق ایمیل وارد این لینک شدهاید مطمئن شوید لینک را به طور کامل کپی کردهاید."
|
||||
send_instructions: "ظرف چند دقیقه ایمیلی حاوی روش تغییر دادن رمز عبور برای شما ارسال میشود."
|
||||
send_paranoid_instructions: "در صورتیکه ایمیل شما در پایگاه داده ما موجود باشد، ایمیلی حاوی لینک تغییر رمز عبور دریافت خواهید کرد."
|
||||
updated: "رمز عبور شما عوض شد. حالا به سیستم وارد شدید."
|
||||
updated_not_active: "رمز عبورتان عوض شد."
|
||||
registrations:
|
||||
destroyed: "بدرود! حساب شما با موفقیت لغو شد. به امید دیدار مجدد شما"
|
||||
signed_up: "خوش آمدید! حساب کاربری با موفقیت ساخته شد."
|
||||
signed_up_but_inactive: "حساب کاربری شما ساخته شد. ولی برای ورود به حساب لازم است آن را فعال کنید."
|
||||
signed_up_but_locked: "حساب شما با موفقیت ساخته شد. ولی در حال حاضر امکان ورود ندارید. حساب شما مسدود شده است."
|
||||
signed_up_but_unconfirmed: "پیامی حاوی لینک فعالسازی حساب به ایمیل شما ارسال شد. لطفا لینک ارسال شده را کلیک کنید تا حساب شما فعال شود."
|
||||
update_needs_confirmation: "تغییرات حساب شما ثبت شد، ولی نیاز است ایمیل جدید خود را تایید کنید. لطفا آن ایمیل را چک کنید و لینک تایید ایمیل ارسال شده به آن را کلیک کنید تا ایمیل جدیدتان تایید شود."
|
||||
updated: "تغییرات پروفایل با موفقیت ثبت شد."
|
||||
sessions:
|
||||
signed_in: "با موفقیت وارد شدید."
|
||||
signed_out: "با موفقیت خارج شدید."
|
||||
already_signed_out: "قبلا از حساب خود خارج شدهاید."
|
||||
unlocks:
|
||||
send_instructions: "ظرف چند دقیقه ایمیلی حاوی نحوه رفع مسدودیت حساب کاربری خود دریافت خواهید کرد."
|
||||
send_paranoid_instructions: "اگر حساب کاربری شما وجود داشته باشد، ایمیلی حاوی روش رفع مسدودیت آن را دریافت خواهید کرد."
|
||||
unlocked: "مسدودیت حساب شما با موفقیت برطرف شد. لطفا به حساب خود وارد شوید."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "حساب کاربری قبلا فعال شده، به حساب کاربری خود وارد شوید."
|
||||
confirmation_period_expired: "فعالسازی حساب میبایست ظرف %{period}، انجام میشد. لطفا درخواست دهید تا مجددا ایمیل فعالسازی ارسال شود."
|
||||
expired: "منقضی شده است، لطفا مجددا درخواست بدهید."
|
||||
not_found: "یافت نشد"
|
||||
not_locked: "مسدود نشده است."
|
||||
not_saved:
|
||||
one: "یک خطا مانع ثبت شدن تغییرات %{resource} شده است.:"
|
||||
other: "%{count} خطا مانع ثبت شدن تغییرات %{resource} شده است:"
|
||||
61
research/chatwoot/config/locales/devise.fi.yml
Normal file
61
research/chatwoot/config/locales/devise.fi.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
fi:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Sähköpostiosoitteesi on vahvistettu onnistuneesti."
|
||||
send_instructions: "Saat sähköpostiviestin, jossa on ohjeet siitä, miten voit vahvistaa sähköpostiosoitteesi muutamassa minuutissa."
|
||||
send_paranoid_instructions: "Jos sähköpostiosoitteesi on olemassa tietokannassamme, saat sähköpostiviestin, jossa on ohjeet siitä, miten voit vahvistaa sähköpostiosoitteesi muutamassa minuutissa."
|
||||
failure:
|
||||
already_authenticated: "Olet jo kirjautunut sisään."
|
||||
inactive: "Tilisi ei ole vielä aktivoitu."
|
||||
invalid: "Virheellinen %{authentication_keys}/salasana tai tiliä ei ole vielä vahvistettu."
|
||||
locked: "Tilisi on lukittu."
|
||||
last_attempt: "Sinulla on vielä yksi yritys ennen kuin tilisi lukitaan."
|
||||
not_found_in_database: "Virheellinen %{authentication_keys} tai salasana."
|
||||
timeout: "Istuntosi on vanhentunut. Ole hyvä ja kirjaudu sisään jatkaaksesi."
|
||||
unauthenticated: "Sinun täytyy kirjautua sisään tai rekisteröityä ennen jatkamista."
|
||||
unconfirmed: "Sinun on vahvistettava sähköpostiosoitteesi ennen jatkamista."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Vahvistusohjeet"
|
||||
reset_password_instructions:
|
||||
subject: "Salasanan nollausohjeet"
|
||||
unlock_instructions:
|
||||
subject: "Avausohjeet"
|
||||
password_change:
|
||||
subject: "Salasana vaihdettu"
|
||||
omniauth_callbacks:
|
||||
failure: "Sinua ei voitu todentaa %{kind}-tililtä koska \"%{reason}\"."
|
||||
success: "Onnistuneesti todennettu %{kind}-tililtä."
|
||||
passwords:
|
||||
no_token: "Et voi käyttää tätä sivua ilman salasanan nollaussähköpostia. Jos tulet sivulle sähköpostin linkin kautta, varmista, että olet käyttänyt koko URL-osoite."
|
||||
send_instructions: "Saat sähköpostiviestin, jossa on ohjeet siitä, miten salasanasi palautetaan muutamassa minuutissa."
|
||||
send_paranoid_instructions: "Jos sähköpostiosoitteesi on olemassa tietokannassamme, saat sähköpostiviestin, jossa on ohjeet siitä, miten voit vaihtaa salasanan muutamassa minuutissa."
|
||||
updated: "Salasanasi on vaihdettu onnistuneesti. Olet nyt kirjautunut sisään."
|
||||
updated_not_active: "Salasanasi on vaihdettu onnistuneesti."
|
||||
registrations:
|
||||
destroyed: "Heippa! Tilisi on peruutettu onnistuneesti. Toivomme näkevämme sinut pian uudelleen."
|
||||
signed_up: "Tervetuloa! Olet rekisteröitynyt onnistuneesti."
|
||||
signed_up_but_inactive: "Olet rekisteröitynyt onnistuneesti. Emme kuitenkaan voineet kirjata sinua sisään, koska tilisi ei ole vielä aktivoitu."
|
||||
signed_up_but_locked: "Olet rekisteröitynyt onnistuneesti. Emme kuitenkaan voineet kirjata sinua sisään, koska tilisi on lukittu."
|
||||
signed_up_but_unconfirmed: "Sähköpostiosoitteeseesi on lähetetty viesti, jossa on vahvistuslinkki. Ole hyvä ja seuraa linkkiä aktivoidaksesi tilisi."
|
||||
update_needs_confirmation: "Olet päivittänyt tilisi onnistuneesti, mutta meidän on vahvistettava uusi sähköpostiosoitteesi. Ole hyvä ja tarkista sähköpostisi ja seuraa vahvistuslinkkiä vahvistaaksesi uuden sähköpostiosoitteesi."
|
||||
updated: "Tilisi on päivitetty onnistuneesti."
|
||||
sessions:
|
||||
signed_in: "Kirjauduttu sisään onnistuneesti."
|
||||
signed_out: "Kirjauduttu ulos onnistuneesti."
|
||||
already_signed_out: "Kirjauduttu ulos onnistuneesti."
|
||||
unlocks:
|
||||
send_instructions: "Saat sähköpostiviestin, jossa on ohjeet siitä, miten tilin lukitus avataan muutamassa minuutissa."
|
||||
send_paranoid_instructions: "Jos tilisi on olemassa, saat sähköpostiviestin, jossa on ohjeet sen avaamisesta muutamassa minuutissa."
|
||||
unlocked: "Tilisi lukitus on poistettu onnistuneesti. Kirjaudu sisään jatkaaksesi."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "on jo vahvistettu, yritä kirjautua sisään"
|
||||
confirmation_period_expired: "täytyy vahvistaa %{period} päivän sisällä, pyydä uusi versio"
|
||||
expired: "on vanhentunut, pyydä uusi"
|
||||
not_found: "ei löydy"
|
||||
not_locked: "ei ollut lukittu"
|
||||
not_saved:
|
||||
one: "1 virhe esti tämän %{resource} tallennuksen:"
|
||||
other: "%{count} virhettä esti tämän %{resource} tallennuksen:"
|
||||
61
research/chatwoot/config/locales/devise.fr.yml
Normal file
61
research/chatwoot/config/locales/devise.fr.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
fr:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Votre adresse e-mail a été confirmée avec succès."
|
||||
send_instructions: "Vous allez recevoir dans quelques minutes un e-mail contenant les instructions pour confirmer votre adresse e-mail."
|
||||
send_paranoid_instructions: "Si votre adresse e-mail existe dans notre base de données, vous allez recevoir dans quelques minutes un e-mail contenant les instructions pour confirmer votre adresse e-mail."
|
||||
failure:
|
||||
already_authenticated: "Vous êtes déjà connecté."
|
||||
inactive: "Votre compte n'est pas encore activé."
|
||||
invalid: "%{authentication_keys}/mot de passe invalide ou le compte n'est pas encore vérifié."
|
||||
locked: "Votre compte est verrouillé."
|
||||
last_attempt: "Vous avez encore une tentative avant que votre compte soit verrouillé."
|
||||
not_found_in_database: "%{authentication_keys} ou mot de passe invalide."
|
||||
timeout: "Votre session a expiré. Veuillez vous reconnecter pour continuer."
|
||||
unauthenticated: "Vous devez vous connecter ou vous inscrire avant de continuer."
|
||||
unconfirmed: "Vous devez confirmer votre adresse e-mail avant de continuer."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Instructions de confirmation"
|
||||
reset_password_instructions:
|
||||
subject: "Instructions de réinitialisation du mot de passe"
|
||||
unlock_instructions:
|
||||
subject: "Instructions de déverrouillage"
|
||||
password_change:
|
||||
subject: "Mot de passe modifié"
|
||||
omniauth_callbacks:
|
||||
failure: "Impossible de vous authentifier depuis %{kind} car \"%{reason}\"."
|
||||
success: "Authentifié avec succès à partir du compte %{kind}."
|
||||
passwords:
|
||||
no_token: "Vous ne pouvez pas accéder à cette page sans passer par un e-mail de réinitialisation de mot de passe. Si vous venez d'un courriel de réinitialisation de mot de passe, assurez-vous d'avoir utilisé l'URL complète fournie."
|
||||
send_instructions: "Vous allez recevoir dans quelques minutes un courriel contenant les instructions pour réinitialiser votre mot de passe."
|
||||
send_paranoid_instructions: "Si votre adresse e-mail existe dans notre base de données, vous recevrez un lien de récupération de mot de passe à votre adresse e-mail dans quelques minutes."
|
||||
updated: "Votre mot de passe a été modifié avec succès. Vous êtes maintenant connecté."
|
||||
updated_not_active: "Votre mot de passe a été modifié avec succès."
|
||||
registrations:
|
||||
destroyed: "Au revoir ! Votre compte a été clôturé avec succès. Nous espérons vous revoir bientôt."
|
||||
signed_up: "Bienvenue ! Vous vous êtes inscrit avec succès."
|
||||
signed_up_but_inactive: "Vous vous êtes inscrit avec succès. Cependant, nous n'avons pas pu vous connecter car votre compte n'est pas encore activé."
|
||||
signed_up_but_locked: "Vous vous êtes inscrit avec succès. Cependant, nous n'avons pas pu vous connecter car votre compte est verrouillé."
|
||||
signed_up_but_unconfirmed: "Un message avec un lien de confirmation a été envoyé à votre adresse e-mail. Veuillez suivre le lien pour activer votre compte."
|
||||
update_needs_confirmation: "Vous avez mis à jour votre compte avec succès, mais nous devons vérifier votre nouvelle adresse de courriel. Veuillez vérifier votre messagerie et suivre le lien de confirmation pour confirmer votre nouvelle adresse de courriel."
|
||||
updated: "Votre compte a été mis à jour avec succès."
|
||||
sessions:
|
||||
signed_in: "Connexion réussie."
|
||||
signed_out: "Déconnecté avec succès."
|
||||
already_signed_out: "Déconnecté avec succès."
|
||||
unlocks:
|
||||
send_instructions: "Vous allez recevoir dans quelques minutes un courriel contenant les instructions pour déverrouiller votre compte."
|
||||
send_paranoid_instructions: "Si votre compte existe, vous recevrez un courriel contenant les instructions pour le débloquer dans quelques minutes."
|
||||
unlocked: "Votre compte a été déverrouillé avec succès. Veuillez vous connecter pour continuer."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "a déjà été confirmé, veuillez essayer de vous connecter"
|
||||
confirmation_period_expired: "doit être confirmé avant %{period}, veuillez en demander un nouveau"
|
||||
expired: "a expiré, veuillez en demander un nouveau"
|
||||
not_found: "non trouvé"
|
||||
not_locked: "n'a pas été verrouillé"
|
||||
not_saved:
|
||||
one: "1 erreur a empêché l'enregistrement de %{resource} :"
|
||||
other: "%{count} erreurs ont empêché l'enregistrement de %{resource} :"
|
||||
63
research/chatwoot/config/locales/devise.he.yml
Normal file
63
research/chatwoot/config/locales/devise.he.yml
Normal file
@@ -0,0 +1,63 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
he:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "כתובת המייל שלך אושרה בהצלחה."
|
||||
send_instructions: "אתה תקבל הוראות לאישרור המייל לתיבת המייל שלך תוך כמה דקות."
|
||||
send_paranoid_instructions: "אם המייל שלך רשום אצלינו, אתה תקבל מייל עם הוראות לאישרור כתובת המייל שלך תוך כמה דקות."
|
||||
failure:
|
||||
already_authenticated: "אתה כבר רשום."
|
||||
inactive: "החשבון שלך עוד לא הופעל."
|
||||
invalid: "%{authentication_keys}/סיסמה או חשבון לא חוקיים עדיין לא אומתו."
|
||||
locked: "החשבון שלך נעול."
|
||||
last_attempt: "יש לך עוד ניסיון אחד לפני שהחשבון שלך יינעל."
|
||||
not_found_in_database: "%{authentication_keys} או סיסמה לא חוקיים."
|
||||
timeout: "פג תוקף ההפעלה שלך. אנא היכנס שוב כדי להמשיך."
|
||||
unauthenticated: "עליך להיכנס או להירשם לפני שתמשיך."
|
||||
unconfirmed: "עליך לאשר את כתובת הדוא\"ל שלך לפני שתמשיך."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "הוראות אישור"
|
||||
reset_password_instructions:
|
||||
subject: "הוראות לאפס סיסמה"
|
||||
unlock_instructions:
|
||||
subject: "הוראות לביטול הנעילה"
|
||||
password_change:
|
||||
subject: "סיסמא שונתה"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "אושרה בהצלחה מחשבון %{kind}."
|
||||
passwords:
|
||||
no_token: "אינך יכול לגשת לדף זה מבלי להגיע ממייל לאיפוס סיסמה. אם אתה מגיע ממייל לאיפוס סיסמה, אנא ודא שהשתמשת בכתובת האתר המלאה שסופקה."
|
||||
send_instructions: "\"תוך מספר דקות תקבל אימייל עם הוראות כיצד לאפס את הסיסמה שלך\"."
|
||||
send_paranoid_instructions: "אם כתובת הדוא\"ל שלך קיימת במסד הנתונים שלנו, תקבל קישור לשחזור סיסמה לכתובת הדוא\"ל שלך תוך מספר דקות."
|
||||
updated: "הסיסמה שלך שונתה בהצלחה. אתה מחובר עכשיו."
|
||||
updated_not_active: "הסיסמה שלך שונתה בהצלחה."
|
||||
registrations:
|
||||
destroyed: "ביי! חשבונך בוטל בהצלחה. אנחנו מקווים לראות אותך שוב בקרוב."
|
||||
signed_up: "ברוך הבא! נרשמת בהצלחה."
|
||||
signed_up_but_inactive: "נרשמת בהצלחה. עם זאת, לא הצלחנו להיכנס לך מכיוון שחשבונך עדיין לא הופעל."
|
||||
signed_up_but_locked: "נרשמת בהצלחה. עם זאת, לא הצלחנו להיכנס לך מכיוון שהחשבון שלך נעול."
|
||||
signed_up_but_unconfirmed: "הודעה עם קישור אישור נשלחה לכתובת האימייל שלך. אנא עקוב אחר הקישור כדי להפעיל את חשבונך."
|
||||
update_needs_confirmation: "עדכנת את חשבונך בהצלחה, אך עלינו לאמת את כתובת הדוא\"ל החדשה שלך. אנא בדוק את הדוא\"ל שלך ופעל על קישור האישור כדי לאשר את כתובת הדוא\"ל החדשה שלך."
|
||||
updated: "החשבון שלך עודכן בהצלחה."
|
||||
sessions:
|
||||
signed_in: "נכנס בהצלחה."
|
||||
signed_out: "יצא בהצלחה."
|
||||
already_signed_out: "יצא בהצלחה."
|
||||
unlocks:
|
||||
send_instructions: "תקבל מייל עם הוראות כיצד לבטל את נעילת חשבונך בעוד מספר דקות."
|
||||
send_paranoid_instructions: "אם החשבון שלך קיים, תקבל דוא\"ל עם הוראות כיצד לבטל את הנעילה שלו תוך מספר דקות."
|
||||
unlocked: "חשבונך בוטלה בהצלחה. אנא היכנס כדי להמשיך."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
two: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
many: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
61
research/chatwoot/config/locales/devise.hi.yml
Normal file
61
research/chatwoot/config/locales/devise.hi.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
hi:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
62
research/chatwoot/config/locales/devise.hr.yml
Normal file
62
research/chatwoot/config/locales/devise.hr.yml
Normal file
@@ -0,0 +1,62 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
hr:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "Već ste prijavljeni."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Lozinka promijenjena"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
few: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
61
research/chatwoot/config/locales/devise.hu.yml
Normal file
61
research/chatwoot/config/locales/devise.hu.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
hu:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Az email címed megerősítése sikerült."
|
||||
send_instructions: "Néhány percen belül egy emailt fogsz kapni az email címed megerősítéséhez szükséges teendőkkel."
|
||||
send_paranoid_instructions: "Ha az email címed már regisztrálva van a rendszerünkben, hamarosan egy emailt fogsz kapni a megerősítéshez szükséges teendőkkel."
|
||||
failure:
|
||||
already_authenticated: "Már be vagy jelentkezve."
|
||||
inactive: "A fiókod még nincs aktiválva."
|
||||
invalid: "Hibás %{authentication_keys}/jelszó vagy a fiók még nincs visszaigazolva."
|
||||
locked: "A fiókod zárolva van."
|
||||
last_attempt: "Egy próbálkozásod van a fiók zárolása előtt."
|
||||
not_found_in_database: "Hibás %{authentication_keys} vagy jelszó."
|
||||
timeout: "Időtúllépés. Kérlek jelentkezz be újra a folytatáshoz."
|
||||
unauthenticated: "Lépj be vagy iratkozz fel mielőtt folytatnád."
|
||||
unconfirmed: "A folytatás előtt meg kell erősítened e-mailcímed."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Megerősítési instrukciók"
|
||||
reset_password_instructions:
|
||||
subject: "Jelszó változtatási instrukciók"
|
||||
unlock_instructions:
|
||||
subject: "Feloldási instrukciók"
|
||||
password_change:
|
||||
subject: "Jelszó megváltoztatva"
|
||||
omniauth_callbacks:
|
||||
failure: "Nem tudunk authentikálni a %{kind} mert %{reason}."
|
||||
success: "Sikeresen authentikált a %{kind} fiókról."
|
||||
passwords:
|
||||
no_token: "Nem tudod elérni az oldalt, csak ha jelszóváltó e-mailről érkezel. Ha onnan érkezel, akkor kérjük bizonyosodj meg róla, hogy a teljes megadott URL-t használod."
|
||||
send_instructions: "Néhány percen belül egy e-mailt fogsz kapni a jelszavad megváltoztatásához szükséges teendőkkel."
|
||||
send_paranoid_instructions: "Ha az email címed már regisztrálva van a rendszerünkben, néhány percen belül egy emailt fogsz kapni a jelszavad megváltoztatásához szükséges linkkel."
|
||||
updated: "A jelszavad sikeresen megváltoztattad. Most már be vagy jelentkezve."
|
||||
updated_not_active: "A jelszavad sikeresen megváltoztattad."
|
||||
registrations:
|
||||
destroyed: "Viszlát! A fiókod sikeresen megszüntetted. Reméljük hamarosan viszontláthatunk."
|
||||
signed_up: "Köszöntünk! Sikeresen feliratkoztál."
|
||||
signed_up_but_inactive: "Sikeresen feliratkoztál. Viszont nem tudsz még belépni, mivel a fiókod nincs aktiválva."
|
||||
signed_up_but_locked: "Sikeresen feliratkoztál. Viszont még nem tudsz belépni, mivel a fiókod zárolva van."
|
||||
signed_up_but_unconfirmed: "Egy jóváhagyó linket tartalmazó e-mailt elküldünk az e-mailcímedre. Kérjük kövesd a linket a fiókod aktiválásához."
|
||||
update_needs_confirmation: "A fiókod sikeresen frissítetted de még ellenőriznünk kell az e-mailcímed. Kérjük ellenőrizd az e-mail fiókod és kövesd a benne található ellenörző linked az új e-mailcímed megerősítéséhez."
|
||||
updated: "A fiókod sikeresen frissítetted."
|
||||
sessions:
|
||||
signed_in: "Sikeresen belépett."
|
||||
signed_out: "Sikeresen kilépett."
|
||||
already_signed_out: "Sikeresen kilépett."
|
||||
unlocks:
|
||||
send_instructions: "Néhány percen belül egy emailt fogsz kapni a fiókod zárolásának feloldásához szükséges teendőkkel."
|
||||
send_paranoid_instructions: "Ha létezik a fiókod, fogsz kapni egy e-mailt a fiókod zárolásának feloldásához szükséges teendőkkel."
|
||||
unlocked: "A fiókod zárolását sikeresen feloldottad. Kérjük lépj be a folytatáshoz."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "már megerősítve, kérjük próbálj meg belépni"
|
||||
confirmation_period_expired: "a következő %{period} szükséges megerősíteni, kérjük kérvényezz egy újat"
|
||||
expired: "lejárt, kérjük kérvényezz egy újat"
|
||||
not_found: "nem található"
|
||||
not_locked: "nem volt zárolva"
|
||||
not_saved:
|
||||
one: "Egy hiba miatt nem lehetett elmenteni az alábbit: %{resource}"
|
||||
other: "%{count} hiba miatt nem lehetett elmenteni az alábbit: %{resource}"
|
||||
61
research/chatwoot/config/locales/devise.hy.yml
Normal file
61
research/chatwoot/config/locales/devise.hy.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
hy:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
60
research/chatwoot/config/locales/devise.id.yml
Normal file
60
research/chatwoot/config/locales/devise.id.yml
Normal file
@@ -0,0 +1,60 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
id:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Alamat email Anda telah berhasil dikonfirmasi."
|
||||
send_instructions: "Anda akan menerima email dengan instruksi bagaimana untuk mengkonfirmasi alamat email Anda dalam beberapa menit."
|
||||
send_paranoid_instructions: "Jika alamat email Anda ada di database kami, Anda akan menerima email dengan instruksi bagaimana untuk mengkonfirmasi alamat email Anda dalam beberapa menit."
|
||||
failure:
|
||||
already_authenticated: "Anda berhasil masuk."
|
||||
inactive: "Akun Anda belum diaktifkan."
|
||||
invalid: "%{authentication_keys} / password atau akun tidak valid."
|
||||
locked: "Akun Anda terkunci."
|
||||
last_attempt: "Anda memiliki satu kesempatan lagi sebelum akun Anda dikunci."
|
||||
not_found_in_database: "%{authentication_keys} atau password tidak valid."
|
||||
timeout: "Sesi Anda kadalwarsa. Harap masuk lagi untuk melanjutkan."
|
||||
unauthenticated: "Anda harus masuk atau mendaftar sebelum melanjutkan."
|
||||
unconfirmed: "Anda harus mengkonfirmasi alamat email Anda sebelum melanjutkan."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Petunjuk Konfirmasi"
|
||||
reset_password_instructions:
|
||||
subject: "Instruksi ubah kata sandi"
|
||||
unlock_instructions:
|
||||
subject: "Petunjuk unlock"
|
||||
password_change:
|
||||
subject: "Kata Sandi Diubah"
|
||||
omniauth_callbacks:
|
||||
failure: "Tidak dapat mengautentikasi Anda dari %{kind} karena \"%{reason}\"."
|
||||
success: "Berhasil diautentikasi dari akun %{kind}."
|
||||
passwords:
|
||||
no_token: "Anda tidak dapat mengakses halaman ini tanpa datang dari email pengaturan ulang kata sandi. Jika Anda memang datang dari email pengaturan ulang kata sandi, harap pastikan Anda menggunakan URL lengkap yang telah disediakan."
|
||||
send_instructions: "Anda akan menerima email dengan instruksi tentang cara mengatur ulang kata sandi Anda dalam beberapa menit."
|
||||
send_paranoid_instructions: "Jika alamat email Anda ada di database kami, Anda akan menerima tautan pemulihan kata sandi di alamat email Anda dalam beberapa menit."
|
||||
updated: "Kata sandi Anda telah berhasil diubah. Anda sekarang sudah masuk."
|
||||
updated_not_active: "Kata sandi Anda berhasil diubah."
|
||||
registrations:
|
||||
destroyed: "Selamat tinggal! Akun Anda telah berhasil dibatalkan. Kami berharap dapat bertemu Anda lagi segera."
|
||||
signed_up: "Selamat datang! Anda berhasil mendaftar."
|
||||
signed_up_but_inactive: "Anda berhasil mendaftar. Namun, Anda tidak dapat masuk karena akun Anda belum diaktifkan."
|
||||
signed_up_but_locked: "Anda berhasil mendaftar. Namun, Anda tidak dapat masuk karena akun Anda terkunci."
|
||||
signed_up_but_unconfirmed: "Sebuah pesan dengan link konfirmasi telah dikirim ke alamat email Anda. Silakan ikuti link untuk mengaktifkan akun Anda."
|
||||
update_needs_confirmation: "Anda berhasil memperbarui akun Anda, tetapi kami perlu memverifikasi alamat email baru Anda. Silakan periksa email Anda dan ikuti tautan konfirmasi untuk mengonfirmasi alamat email baru Anda."
|
||||
updated: "Akun Anda berhasil diperbarui."
|
||||
sessions:
|
||||
signed_in: "Berhasil masuk."
|
||||
signed_out: "Berhasil keluar."
|
||||
already_signed_out: "Berhasil keluar."
|
||||
unlocks:
|
||||
send_instructions: "Anda akan menerima email dengan instruksi bagaimana membuka akun Anda dalam beberapa menit."
|
||||
send_paranoid_instructions: "Jika akun Anda ada, Anda akan menerima email dengan instruksi tentang cara membukanya dalam beberapa menit."
|
||||
unlocked: "Kunci akun Anda berhasil dibuka. Silahkan masuk untuk melanjutkan."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "sudah dikonfirmasi, silakan coba masuk"
|
||||
confirmation_period_expired: "perlu dikonfirmasi dalam %{period}, harap minta yang baru"
|
||||
expired: "telah kedaluwarsa, silakan minta yang baru"
|
||||
not_found: "tidak ditemukan"
|
||||
not_locked: "tidak terkunci"
|
||||
not_saved:
|
||||
other: "%{count} kesalahan mengakibatkan %{resource} ini tidak dapat disimpan:"
|
||||
61
research/chatwoot/config/locales/devise.is.yml
Normal file
61
research/chatwoot/config/locales/devise.is.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
is:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Netfangið þitt hefur verið staðfest."
|
||||
send_instructions: "Þú færð tölvupóst með leiðbeiningum um hvernig á að staðfesta netfangið þitt eftir nokkrar mínútur."
|
||||
send_paranoid_instructions: "Ef netfangið þitt er til í gagnagrunninum okkar færðu tölvupóst með leiðbeiningum um hvernig á að staðfesta netfangið þitt eftir nokkrar mínútur."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Ógilt %{authentication_keys}/lykilorð eða reikningur hefur ekki verið staðfestur ennþá."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "Þú átt eina tilraun í viðbót áður en reikningnum þínum er læst."
|
||||
not_found_in_database: "Ógilt %{authentication_keys} eða lykilorð."
|
||||
timeout: "Lotan þín rann út. Vinsamlegast skráðu þig inn aftur til að halda áfram."
|
||||
unauthenticated: "Þú þarft að skrá þig inn eða skrá þig áður en þú heldur áfram."
|
||||
unconfirmed: "Þú verður að staðfesta netfangið þitt áður en þú heldur áfram."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Gat ekki auðkennt þig frá %{kind} vegna þess að „%{reason}“."
|
||||
success: "Tókst að auðkenna af %{kind} reikningi."
|
||||
passwords:
|
||||
no_token: "Þú getur ekki opnað þessa síðu án þess að koma frá tölvupósti sem er til að endurstilla lykilorð. Ef þú kemur frá tölvupósti með endurstillingu lykilorðs, vinsamlegast vertu viss um að þú hafir notað alla vefslóðina sem gefin er upp."
|
||||
send_instructions: "Þú færð tölvupóst með leiðbeiningum um hvernig á að endurstilla lykilorðið þitt eftir nokkrar mínútur."
|
||||
send_paranoid_instructions: "Ef netfangið þitt er til í gagnagrunninum okkar færðu hlekk til að endurheimta lykilorð á netfangið þitt eftir nokkrar mínútur."
|
||||
updated: "Lykilorðinu þínu hefur verið breytt. Þú ert núna skráður inn."
|
||||
updated_not_active: "Lykilorðinu þínu hefur verið breytt."
|
||||
registrations:
|
||||
destroyed: "Bless! Reikningnum þínum hefur verið lokað. Við vonumst til að sjá þig aftur fljótlega."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "Þú hefur skráð þig. Hins vegar gátum við ekki skráð þig inn vegna þess að reikningurinn þinn er ekki enn virkur."
|
||||
signed_up_but_locked: "Þú hefur skráð þig. Hins vegar gátum við ekki skráð þig inn vegna þess að reikningurinn þinn er læstur."
|
||||
signed_up_but_unconfirmed: "Skilaboð með staðfestingartengli hafa verið send á netfangið þitt. Vinsamlegast fylgdu hlekknum til að virkja reikninginn þinn."
|
||||
update_needs_confirmation: "Þú uppfærðir reikninginn þinn með góðum árangri en við þurfum að staðfesta nýja netfangið þitt. Vinsamlegast athugaðu tölvupóstinn þinn og fylgdu staðfestingartenglinum til að staðfesta nýja netfangið þitt."
|
||||
updated: "Reikningurinn þinn hefur verið uppfærður."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "Þú færð tölvupóst með leiðbeiningum um hvernig á að opna reikninginn þinn eftir nokkrar mínútur."
|
||||
send_paranoid_instructions: "Ef reikningurinn þinn er til færðu tölvupóst með leiðbeiningum um hvernig á að opna hann eftir nokkrar mínútur."
|
||||
unlocked: "Reikningurinn þinn hefur verið opnaður. Vinsamlegast skráðu þig inn til að halda áfram."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "var þegar staðfest, vinsamlegast reyndu að skrá þig inn"
|
||||
confirmation_period_expired: "þarf að staðfesta innan %{period}, vinsamlegast biðjið um nýjan"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 villa bannaði að þessi %{resource} væri vistuð:"
|
||||
other: "%{count} villur bönnuðu að þessi %{resource} væri vistuð:"
|
||||
61
research/chatwoot/config/locales/devise.it.yml
Normal file
61
research/chatwoot/config/locales/devise.it.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
it:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Il tuo indirizzo email è stato confermato con successo."
|
||||
send_instructions: "Riceverai una email con le istruzioni per confermare il tuo indirizzo email in pochi minuti."
|
||||
send_paranoid_instructions: "Se il tuo indirizzo email esiste nel nostro database, entro pochi minuti riceverai un'email con le istruzioni per confermare il tuo indirizzo email."
|
||||
failure:
|
||||
already_authenticated: "Hai già effettuato l'accesso."
|
||||
inactive: "Il tuo account non è ancora attivato."
|
||||
invalid: "%{authentication_keys}/password non valida o account non ancora verificato."
|
||||
locked: "Il tuo account è bloccato."
|
||||
last_attempt: "Hai ancora un tentativo prima che il tuo account venga bloccato."
|
||||
not_found_in_database: "%{authentication_keys} o password non validi."
|
||||
timeout: "La sessione è scaduta. Effettua nuovamente l'accesso per continuare."
|
||||
unauthenticated: "Devi accedere o registrarti prima di continuare."
|
||||
unconfirmed: "Devi confermare il tuo indirizzo email prima di continuare."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Istruzioni di conferma"
|
||||
reset_password_instructions:
|
||||
subject: "Istruzioni per reimpostare la password"
|
||||
unlock_instructions:
|
||||
subject: "Istruzioni di sblocco"
|
||||
password_change:
|
||||
subject: "Password modificata"
|
||||
omniauth_callbacks:
|
||||
failure: "Impossibile autenticarti da %{kind} perché \"%{reason}\"."
|
||||
success: "Autenticato con successo dall'account %{kind}."
|
||||
passwords:
|
||||
no_token: "Non puoi accedere a questa pagina senza provenire da un'email di reimpostazione della password. Se vieni da un'email di reimpostazione della password, assicurati di aver utilizzato l'URL completo."
|
||||
send_instructions: "Tra pochi minuti riceverai un'email con le istruzioni su come reimpostare la password."
|
||||
send_paranoid_instructions: "Se il tuo indirizzo email è presente nel nostro database, entro pochi minuti riceverai un link per reimpostare la password."
|
||||
updated: "La tua password è stata modificata con successo. Ora sei collegato."
|
||||
updated_not_active: "La tua password è stata modificata con successo."
|
||||
registrations:
|
||||
destroyed: "Ciao! Il tuo account è stato eliminato con successo. Speriamo di rivederti presto."
|
||||
signed_up: "Benvenuto! Ti sei registrato correttamente."
|
||||
signed_up_but_inactive: "Ti sei registrato correttamente. Tuttavia, non puoi accedere perché il tuo account non è ancora attivato."
|
||||
signed_up_but_locked: "Ti sei registrato correttamente. Tuttavia, non puoi accedere perché il tuo account è bloccato."
|
||||
signed_up_but_unconfirmed: "Un messaggio con un link di conferma è stato inviato al tuo indirizzo email. Segui il link per attivare l'account."
|
||||
update_needs_confirmation: "Il tuo account è stato aggiornato correttamente, ma dobbiamo verificare il tuo nuovo indirizzo email. Controlla la tua email e segui il link di conferma per confermare il tuo nuovo indirizzo email."
|
||||
updated: "Il tuo account è stato aggiornato con successo."
|
||||
sessions:
|
||||
signed_in: "Accesso effettuato."
|
||||
signed_out: "Disconnessione effettuata."
|
||||
already_signed_out: "Disconnessione effettuata."
|
||||
unlocks:
|
||||
send_instructions: "Entro pochi minuti riceverai una email con le istruzioni per sbloccare il tuo account."
|
||||
send_paranoid_instructions: "Se il tuo account esiste, entro pochi minuti riceverai un'email con le istruzioni per sbloccarlo."
|
||||
unlocked: "Il tuo account è stato sbloccato con successo. Accedi per continuare."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "è già stato confermato, prova ad accedere"
|
||||
confirmation_period_expired: "deve essere confermato entro %{period}, si prega di richiederne uno nuovo"
|
||||
expired: "è scaduto, si prega di richiederne uno nuovo"
|
||||
not_found: "non trovato"
|
||||
not_locked: "non è stato bloccato"
|
||||
not_saved:
|
||||
one: "1 errore impedisce il salvataggio di questo %{resource}:"
|
||||
other: "%{count} errori impediscono il salvataggio di questo %{resource}:"
|
||||
60
research/chatwoot/config/locales/devise.ja.yml
Normal file
60
research/chatwoot/config/locales/devise.ja.yml
Normal file
@@ -0,0 +1,60 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
ja:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "あなたのメールアドレスは正常に確認されました。"
|
||||
send_instructions: "数分以内にメールアドレスを確認する方法が記載されたメールが届きます。"
|
||||
send_paranoid_instructions: "メールアドレスがデータベースに存在する場合、数分以内にメールアドレスの確認方法が記載されたメールが届きます。"
|
||||
failure:
|
||||
already_authenticated: "既にサインインしています。"
|
||||
inactive: "あなたのアカウントはまだアクティベートされていません。"
|
||||
invalid: "%{authentication_keys}/password が無効です。アカウントがまだ認証されていません。"
|
||||
locked: "あなたのアカウントはロックされています。"
|
||||
last_attempt: "アカウントがロックされる前にもう1回試行できます。"
|
||||
not_found_in_database: "%{authentication_keys} またはパスワードが無効です。"
|
||||
timeout: "セッションの有効期限が切れました。続行するには再度ログインしてください。"
|
||||
unauthenticated: "続行するにはサインインまたはサインアップする必要があります。"
|
||||
unconfirmed: "続行する前にメールアドレスを確認する必要があります。"
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "確認の手順"
|
||||
reset_password_instructions:
|
||||
subject: "パスワードのリセット手順"
|
||||
unlock_instructions:
|
||||
subject: "ロック解除の手順"
|
||||
password_change:
|
||||
subject: "パスワード変更完了"
|
||||
omniauth_callbacks:
|
||||
failure: "%{reason} のため、「 %{kind} 」からの認証ができませんでした。"
|
||||
success: "%{kind} アカウントから正常に認証されました。"
|
||||
passwords:
|
||||
no_token: "このページは、パスワードリセットのメールに記載されたリンクからでしかアクセスすることはできません。パスワードリセットのメールから来た場合は、正しいURLをクリックしているか確認してください。"
|
||||
send_instructions: "数分以内にパスワードをリセットする方法に関するメールが届きます。"
|
||||
send_paranoid_instructions: "メールアドレスがデータベースに存在する場合 数分後にパスワード再発行の方法が記載されたメールが届きます。"
|
||||
updated: "パスワードが正常に変更されました。サインインしています。"
|
||||
updated_not_active: "パスワードが正常に変更されました。"
|
||||
registrations:
|
||||
destroyed: "さようなら!あなたのアカウントは正常にキャンセルされました。またお会いできることを楽しみにしています。"
|
||||
signed_up: "ようこそ!正常にサインアップしました。"
|
||||
signed_up_but_inactive: "正常にサインアップしました。ただし、アカウントが有効化されていないため、サインインできませんでした。"
|
||||
signed_up_but_locked: "正常にサインアップしました。しかし、アカウントがロックされているため、サインインできませんでした。"
|
||||
signed_up_but_unconfirmed: "確認リンクが記載されたメッセージがあなたのメールアドレスに送信されました。リンクに従ってアカウントを有効にしてください。"
|
||||
update_needs_confirmation: "アカウントを正常に更新しましたが、新しいメールアドレスを確認する必要があります。 メールを確認し、新しいメールアドレスを確認するためのリンクをクリックしてください。"
|
||||
updated: "アカウントが正常に更新されました"
|
||||
sessions:
|
||||
signed_in: "正常にサインインしました。"
|
||||
signed_out: "正常にサインアウトしました。"
|
||||
already_signed_out: "正常にサインアウトしました。"
|
||||
unlocks:
|
||||
send_instructions: "数分でアカウントのロックを解除する方法が記載されたメールが届きます。"
|
||||
send_paranoid_instructions: "アカウントが存在する場合、数分でロックを解除する方法が記載されたメールが届きます。"
|
||||
unlocked: "アカウントのロックが解除されました。続行するにはログインしてください。"
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "が確認されました。サインインしてみてください"
|
||||
confirmation_period_expired: "%{period} 以内に確認する必要があります。新しいものをリクエストしてください"
|
||||
expired: "有効期限が切れました。新しいものをリクエストしてください"
|
||||
not_found: "見つかりませんでした"
|
||||
not_locked: "はロックされていません"
|
||||
not_saved:
|
||||
other: "%{count} 個のエラーが発生し、 %{resource} を保存できませんでした:"
|
||||
61
research/chatwoot/config/locales/devise.ka.yml
Normal file
61
research/chatwoot/config/locales/devise.ka.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
ka:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Your email address has been successfully confirmed."
|
||||
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
||||
failure:
|
||||
already_authenticated: "You are already signed in."
|
||||
inactive: "Your account is not activated yet."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "Your account is locked."
|
||||
last_attempt: "You have one more attempt before your account is locked."
|
||||
not_found_in_database: "Invalid %{authentication_keys} or password."
|
||||
timeout: "Your session expired. Please sign in again to continue."
|
||||
unauthenticated: "You need to sign in or sign up before continuing."
|
||||
unconfirmed: "You have to confirm your email address before continuing."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmation Instructions"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
||||
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
||||
signed_up: "Welcome! You have signed up successfully."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
one: "1 error prohibited this %{resource} from being saved:"
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
60
research/chatwoot/config/locales/devise.ko.yml
Normal file
60
research/chatwoot/config/locales/devise.ko.yml
Normal file
@@ -0,0 +1,60 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
ko:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "귀하의 이메일 주소가 성공적으로 확인되었습니다."
|
||||
send_instructions: "몇 분 안에 이메일 주소를 인증하는 방법에 대한 지침이 발송될 것입니다."
|
||||
send_paranoid_instructions: "귀하의 이메일 주소가 당사 데이터베이스에 있는 경우 몇 분 안에 이메일 주소를 인증하는 방법에 대한 지침이 포함된 이메일이 발송될 것입니다."
|
||||
failure:
|
||||
already_authenticated: "이미 가입하셨습니다."
|
||||
inactive: "귀하의 계정이 아직 활성화되지 않았습니다."
|
||||
invalid: "Invalid %{authentication_keys}/password or account is not verified yet."
|
||||
locked: "계정이 잠금 상태입니다."
|
||||
last_attempt: "계정이 잠기기 전에 남은 마지막 시도입니다."
|
||||
not_found_in_database: "잘못된 %{authentication_keys} 또는 잘못된 비밀번호입니다."
|
||||
timeout: "세션이 만료되었습니다. 다시 가입해 주십시오."
|
||||
unauthenticated: "계속하기 전에 로그인하거나 가입해야 합니다."
|
||||
unconfirmed: "계속하기 전에 이메일 주소를 확인해 주십시오."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "확인 절차"
|
||||
reset_password_instructions:
|
||||
subject: "Reset password instructions"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "Password Changed"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "비밀번호 재설정 이메일을 받지 않으셨다면 이 페이지에 액세스할 수 없습니다. 비밀번호 재설정 이메일에서 온 경우 전체 URL을 사용했는지 확인하십시오."
|
||||
send_instructions: "몇 분 안에 비밀번호 초기화 방법에 대한 지침이 귀하의 이메일로 발송될 것입니다."
|
||||
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
||||
updated: "Your password has been changed successfully. You are now signed in."
|
||||
updated_not_active: "Your password has been changed successfully."
|
||||
registrations:
|
||||
destroyed: "잘 가요! 계정이 성공적으로 취소되었습니다.\n곧 다시 뵙기를 바래요!"
|
||||
signed_up: "환영합니다! 성공적으로 가입하셨습니다."
|
||||
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
||||
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
||||
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
||||
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
||||
updated: "Your account has been updated successfully."
|
||||
sessions:
|
||||
signed_in: "Signed in successfully."
|
||||
signed_out: "Signed out successfully."
|
||||
already_signed_out: "Signed out successfully."
|
||||
unlocks:
|
||||
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
||||
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
||||
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "was already confirmed, please try signing in"
|
||||
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
||||
expired: "has expired, please request a new one"
|
||||
not_found: "not found"
|
||||
not_locked: "was not locked"
|
||||
not_saved:
|
||||
other: "%{count} errors prohibited this %{resource} from being saved:"
|
||||
63
research/chatwoot/config/locales/devise.lt.yml
Normal file
63
research/chatwoot/config/locales/devise.lt.yml
Normal file
@@ -0,0 +1,63 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
lt:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Jūsų el. pašto adresas sėkmingai patvirtintas."
|
||||
send_instructions: "Po kelių minučių gausite el. laišką su instrukcijomis, kaip patvirtinti jūsų el. pašto adresą."
|
||||
send_paranoid_instructions: "Jei jūsų el. pašto adresas yra mūsų duomenų bazėje, po kelių minučių į savo el. pašto adresą gausite el. pašto adresą patvirtinimo instrukciją."
|
||||
failure:
|
||||
already_authenticated: "Jūs jau prisijungėte."
|
||||
inactive: "Tavo prisijungimo paskyra dar neaktyvuota."
|
||||
invalid: "Neteisingas %{authentication_keys}/slaptažodis arba paskyra dar nepatvirtinta."
|
||||
locked: "Tavo prisijungimo paskyra užrakinta."
|
||||
last_attempt: "Turite dar vieną bandymą, kol jūsų paskyra bus užrakinta."
|
||||
not_found_in_database: "Neteisingas %{authentication_keys} arba slaptažodis."
|
||||
timeout: "Jūsų sesija baigėsi. Prisijunkite dar kartą, kad galėtumėte tęsti."
|
||||
unauthenticated: "Prieš tęsdami turite prisijungti arba užsiregistruoti."
|
||||
unconfirmed: "Prieš tęsdami turite patvirtinti savo el. pašto adresą."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Patvirtinimo instrukcijos"
|
||||
reset_password_instructions:
|
||||
subject: "Slaptažodžio atkūrimo instrukcijos"
|
||||
unlock_instructions:
|
||||
subject: "Atrakinimo instrukcija"
|
||||
password_change:
|
||||
subject: "Slaptažodis pakeistas"
|
||||
omniauth_callbacks:
|
||||
failure: "Nepavyko jūsų autentifikuoti iš %{kind}, nes \"%{reason}\"."
|
||||
success: "Sėkmingai autentifikuota naudojant %{kind} paskyrą."
|
||||
passwords:
|
||||
no_token: "Negalite pasiekti šio puslapio neišsiuntę slaptažodžio nustatymo iš naujo el. laiško. Jei gavote el. laišką dėl slaptažodžio nustatymo iš naujo, įsitikinkite, kad naudojote visą URL."
|
||||
send_instructions: "Po kelių minučių gausite el. laišką su instrukcijomis, kaip iš naujo nustatyti slaptažodį."
|
||||
send_paranoid_instructions: "Jei jūsų el. pašto adresas yra mūsų duomenų bazėje, po kelių minučių į savo el. pašto adresą gausite slaptažodžio atkūrimo nuorodą."
|
||||
updated: "Jūsų slaptažodis buvo sėkmingai pakeistas. Dabar esate prisijungę."
|
||||
updated_not_active: "Jūsų slaptažodis buvo sėkmingai pakeistas."
|
||||
registrations:
|
||||
destroyed: "Ate! Jūsų paskyra buvo sėkmingai atšaukta. Tikimės, kad greitu metu vėl pasimatysime."
|
||||
signed_up: "Sveiki! Jūs sėkmingai užsiregistravote."
|
||||
signed_up_but_inactive: "Jūs sėkmingai užsiregistravote. Tačiau negalėjome jūsų prijungti, nes jūsų paskyra dar nesuaktyvinta."
|
||||
signed_up_but_locked: "Jūs sėkmingai užsiregistravote. Tačiau negalėjome jūsų prijungti, nes jūsų paskyra užrakinta."
|
||||
signed_up_but_unconfirmed: "Jūsų el. pašto adresu išsiųstas pranešimas su patvirtinimo nuoroda. Norėdami aktyvuoti paskyrą, spustelėkite nuorodą."
|
||||
update_needs_confirmation: "Sėkmingai atnaujinote paskyrą, bet turime patvirtinti naują el. pašto adresą. Patikrinkite savo el. paštą ir spustelėkite patvirtinimo nuorodą, kad patvirtintumėte naują el. pašto adresą."
|
||||
updated: "Jūsų paskyra sėkmingai atnaujinta."
|
||||
sessions:
|
||||
signed_in: "Prisijungta sėkmingai."
|
||||
signed_out: "Atsijungta sėkmingai."
|
||||
already_signed_out: "Atsijungta sėkmingai."
|
||||
unlocks:
|
||||
send_instructions: "Po kelių minučių gausite el. laišką su instrukcijomis, kaip atrakinti paskyrą."
|
||||
send_paranoid_instructions: "Jei jūsų paskyra egzistuoja, po kelių minučių gausite el. laišką su instrukcijomis, kaip ją atrakinti."
|
||||
unlocked: "Jūsų paskyra buvo sėkmingai atrakinta. Prisijunkite, kad galėtumėte tęsti."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "jau buvo patvirtinta, pabandykite prisijungti"
|
||||
confirmation_period_expired: "turi būti patvirtintas per %{period}, prašome paprašyti naujo"
|
||||
expired: "galiojimo laikas baigėsi, prašykite naujo"
|
||||
not_found: "nerasta"
|
||||
not_locked: "nebuvo užrakintas"
|
||||
not_saved:
|
||||
one: "1 klaida neleido išsaugoti šio %{resource}:"
|
||||
few: "%{count} klaidos neleido išsaugoti šio %{resource}:"
|
||||
many: "%{count} klaidų neleido išsaugoti šio %{resource}:"
|
||||
other: "%{count} klaidos neleido išsaugoti šio %{resource}:"
|
||||
62
research/chatwoot/config/locales/devise.lv.yml
Normal file
62
research/chatwoot/config/locales/devise.lv.yml
Normal file
@@ -0,0 +1,62 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
lv:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "Jūsu e-pasta adrese ir veiksmīgi apstiprināta."
|
||||
send_instructions: "Dažu minūšu laikā jūs saņemsit e-pasta ziņojumu ar norādījumiem, kā apstiprināt savu e-pasta adresi."
|
||||
send_paranoid_instructions: "Ja jūsu e-pasta adrese pastāv mūsu datubāzē, dažu minūšu laikā jūs saņemsit e-pasta ziņojumu ar norādījumiem, kā apstiprināt savu e-pasta adresi."
|
||||
failure:
|
||||
already_authenticated: "Jūs jau esat pierakstījies."
|
||||
inactive: "Jūsu konts vēl nav aktivizēts."
|
||||
invalid: "Nederīga %{authentication_keys}/parole, vai konts vēl nav verificēts."
|
||||
locked: "Jūsu konts ir bloķēts."
|
||||
last_attempt: "Jums ir vēl viens mēģinājums, pirms jūsu konts tiek bloķēts."
|
||||
not_found_in_database: "Nederīga %{authentication_keys} vai parole."
|
||||
timeout: "Jūsu sesijai beidzās derīguma termiņš. Lūdzu, pierakstieties vēlreiz, lai turpinātu."
|
||||
unauthenticated: "Pirms turpināt, jums ir jāpierakstās vai jāreģistrējas."
|
||||
unconfirmed: "Pirms turpināt, jums ir jāapstiprina sava e-pasta adrese."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Apstiprināšanas Instrukcijas"
|
||||
reset_password_instructions:
|
||||
subject: "Paroles atiestatīšanas instrukcijas"
|
||||
unlock_instructions:
|
||||
subject: "Atbloķēšanas instrukcijas"
|
||||
password_change:
|
||||
subject: "Parole nomainīta"
|
||||
omniauth_callbacks:
|
||||
failure: "Nevarēja jūs autentificēt no %{kind} jo \"%{reason}\"."
|
||||
success: "Veiksmīgi autentificēts no %{kind} konta."
|
||||
passwords:
|
||||
no_token: "Šai lapai nevar piekļūt, ja neesat saņēmis paroles atiestatīšanas e-pasta ziņojumu. Ja esat saņēmis paroles atiestatīšanas e-pasta ziņojumu, lūdzu, pārliecinieties, vai esat izmantojis pilnu norādīto URL."
|
||||
send_instructions: "Dažu minūšu laikā jūs saņemsit e-pasta ziņojumu ar norādījumiem, kā atiestatīt paroli."
|
||||
send_paranoid_instructions: "Ja jūsu e-pasta adrese pastāv mūsu datubāzē, pēc dažām minūtēm uz jūsu e-pasta adresi saņemsit paroles atgūšanas saiti."
|
||||
updated: "Jūsu parole ir veiksmīgi nomainīta. Tagad Jūs esat pierakstījies."
|
||||
updated_not_active: "Jūsu parole ir veiksmīgi nomainīta."
|
||||
registrations:
|
||||
destroyed: "Uz redzēšanos! Jūsu konts ir veiksmīgi atcelts. Mēs ceram, ka drīz Jūs atkal redzēsim."
|
||||
signed_up: "Laipni lūdzam! Jūs esat veiksmīgi piereģistrējies."
|
||||
signed_up_but_inactive: "Jūs esat veiksmīgi piereģistrējies. Tomēr, mēs nevarējām Jūs pierakstīt, jo Jūsu konts vēl nav aktivizēts."
|
||||
signed_up_but_locked: "Jūs esat veiksmīgi piereģistrējies. Tomēr, mēs nevarējām Jūs pierakstīt, jo Jūsu konts ir bloķēts."
|
||||
signed_up_but_unconfirmed: "Uz jūsu e -pasta adresi ir nosūtīts ziņojums ar apstiprinājuma saiti. Lūdzu, atveriet saiti, lai aktivizētu savu kontu."
|
||||
update_needs_confirmation: "Jūs veiksmīgi atjauninājāt savu kontu un mums ir jāpārbauda Jūsu jaunā e -pasta adrese. Lūdzu, pārbaudiet savu e -pastu un atveriet apstiprināšanas saiti, lai apstiprinātu jauno e-pasta adresi."
|
||||
updated: "Jūsu konts ir veiksmīgi atjaunināts."
|
||||
sessions:
|
||||
signed_in: "Pierakstīšanās veiksmīga."
|
||||
signed_out: "Izrakstīšanās veiksmīga."
|
||||
already_signed_out: "Izrakstīšanās veiksmīga."
|
||||
unlocks:
|
||||
send_instructions: "Dažu minūšu laikā Jūs saņemsit e-pastu ar norādījumiem kā atbloķēt kontu."
|
||||
send_paranoid_instructions: "Ja konts pastāv, Jūs dažu minūšu laikā saņemsit e-pastu ar norādījumiem kā to atbloķēt."
|
||||
unlocked: "Jūsu konts ir veiksmīgi atbloķēts. Lūdzu, pierakstieties, lai turpinātu."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "jau bija apstiprināts. Lūdzu, mēģiniet pierakstīties"
|
||||
confirmation_period_expired: "ir jāapstiprina %{period} laikā. Lūdzu pieprasiet jaunu"
|
||||
expired: "ir beidzies derīguma termiņš. Lūdzu, pieprasiet jaunu"
|
||||
not_found: "nav atrasts"
|
||||
not_locked: "nebija bloķēts"
|
||||
not_saved:
|
||||
zero: "%{count} kļūdas neļāva saglabāt šo %{resource}:"
|
||||
one: "1 kļūda neļāva saglabāt šo %{resource}:"
|
||||
other: "%{count} kļūdas neļāva saglabāt šo %{resource}:"
|
||||
61
research/chatwoot/config/locales/devise.ml.yml
Normal file
61
research/chatwoot/config/locales/devise.ml.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
#Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
||||
ml:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: "നിങ്ങളുടെ ഇമെയിൽ വിലാസം വിജയകരമായി സ്ഥിരീകരിച്ചു."
|
||||
send_instructions: "കുറച്ച് മിനിറ്റിനുള്ളിൽ നിങ്ങളുടെ ഇമെയിൽ വിലാസം എങ്ങനെ സ്ഥിരീകരിക്കാമെന്നതിനുള്ള നിർദ്ദേശങ്ങളുള്ള ഒരു ഇമെയിൽ നിങ്ങൾക്ക് ലഭിക്കും.\n"
|
||||
send_paranoid_instructions: "നിങ്ങളുടെ ഇമെയിൽ വിലാസം ഞങ്ങളുടെ ഡാറ്റാബേസിൽ ഉണ്ടെങ്കിൽ, കുറച്ച് മിനിറ്റിനുള്ളിൽ നിങ്ങളുടെ ഇമെയിൽ വിലാസം എങ്ങനെ സ്ഥിരീകരിക്കാമെന്നതിനുള്ള നിർദ്ദേശങ്ങളുള്ള ഒരു ഇമെയിൽ നിങ്ങൾക്ക് ലഭിക്കും."
|
||||
failure:
|
||||
already_authenticated: "നിങ്ങൾ ഇതിനകം പ്രവേശിച്ചു."
|
||||
inactive: "നിങ്ങളുടെ അക്കൗണ്ട് ഇതുവരെയും സജീവമാക്കിയിട്ടില്ല."
|
||||
invalid: "%{authentication_keys} പാസ്വേഡോ അക്കൗണ്ടോ ഇതുവരെ പരിശോധിച്ചിട്ടില്ല.\n"
|
||||
locked: "നിങ്ങളുടെ അക്കൗണ്ട് ലോക്കുചെയ്തു.\n"
|
||||
last_attempt: "നിങ്ങളുടെ അക്കൗണ്ട് ലോക്കുചെയ്യുന്നതിന് മുമ്പ് നിങ്ങൾക്ക് ഒരു ശ്രമം കൂടി."
|
||||
not_found_in_database: "%{authentication_keys} അല്ലെങ്കിൽ പാസ്വേഡ് അസാധുവാണ്."
|
||||
timeout: "നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടു. തുടരാൻ വീണ്ടും സൈൻ ഇൻ ചെയ്യുക."
|
||||
unauthenticated: "തുടരുന്നതിന് മുമ്പ് നിങ്ങൾ സൈൻ ഇൻ ചെയ്യുകയോ സൈൻ അപ്പ് ചെയ്യുകയോ ചെയ്യേണ്ടതുണ്ട്."
|
||||
unconfirmed: "തുടരുന്നതിന് മുമ്പ് നിങ്ങളുടെ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കേണ്ടതുണ്ട്."
|
||||
mailer:
|
||||
confirmation_instructions:
|
||||
subject: "സ്ഥിരീകരണ നിർദ്ദേശങ്ങൾ"
|
||||
reset_password_instructions:
|
||||
subject: "പാസ്വേഡ് നിർദ്ദേശങ്ങൾ പുനഃസജ്ജമാക്കുക"
|
||||
unlock_instructions:
|
||||
subject: "Unlock instructions"
|
||||
password_change:
|
||||
subject: "പാസ്വേഡ് മാറ്റി"
|
||||
omniauth_callbacks:
|
||||
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
||||
success: "Successfully authenticated from %{kind} account."
|
||||
passwords:
|
||||
no_token: "പാസ്വേഡ് റീസെറ്റ് ഇമെയിലിൽ നിന്ന് വരാതെ നിങ്ങൾക്ക് ഈ പേജ് ആക്സസ് ചെയ്യാൻ കഴിയില്ല. നിങ്ങൾ ഒരു പാസ്വേഡ് പുനഃസജ്ജീകരണ ഇമെയിലിൽ നിന്നാണ് വരുന്നതെങ്കിൽ, നൽകിയിരിക്കുന്ന മുഴുവൻ URL നിങ്ങൾ ഉപയോഗിച്ചുവെന്ന് ഉറപ്പാക്കുക."
|
||||
send_instructions: "കുറച്ച് മിനിറ്റിനുള്ളിൽ നിങ്ങളുടെ പാസ്വേഡ് എങ്ങനെ പുനഃസജ്ജമാക്കാം എന്നതിനെക്കുറിച്ചുള്ള നിർദ്ദേശങ്ങളടങ്ങിയ ഒരു ഇമെയിൽ നിങ്ങൾക്ക് ലഭിക്കും."
|
||||
send_paranoid_instructions: "ഞങ്ങളുടെ ഡാറ്റാബേസിൽ നിങ്ങളുടെ ഇമെയിൽ വിലാസം നിലവിലുണ്ടെങ്കിൽ, കുറച്ച് മിനിറ്റുകൾക്കുള്ളിൽ നിങ്ങളുടെ ഇമെയിൽ വിലാസത്തിൽ ഒരു പാസ്വേഡ് വീണ്ടെടുക്കൽ ലിങ്ക് ലഭിക്കും."
|
||||
updated: "നിങ്ങളുടെ പാസ്വേഡ് വിജയകരമായി മാറ്റി. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഇൻ ചെയ്തു."
|
||||
updated_not_active: "നിങ്ങളുടെ പാസ്വേഡ് വിജയകരമായി മാറ്റിയിരിക്കുന്നു."
|
||||
registrations:
|
||||
destroyed: "ബൈ! നിങ്ങളുടെ അക്കൗണ്ട് വിജയകരമായി റദ്ദാക്കി. ഉടൻ തന്നെ നിങ്ങളെ വീണ്ടും കാണുമെന്ന് ഞങ്ങൾ പ്രതീക്ഷിക്കുന്നു."
|
||||
signed_up: "സ്വാഗതം! നിങ്ങൾ വിജയകരമായി സൈൻ അപ്പ് ചെയ്തിരിക്കുന്നു."
|
||||
signed_up_but_inactive: "നിങ്ങൾ വിജയകരമായി സൈൻ അപ്പ് ചെയ്തു. എന്നിരുന്നാലും, നിങ്ങളുടെ അക്കൗണ്ട് ഇതുവരെ സജീവമാക്കാത്തതിനാൽ ഞങ്ങൾക്ക് നിങ്ങളെ സൈൻ ഇൻ ചെയ്യാൻ കഴിഞ്ഞില്ല."
|
||||
signed_up_but_locked: "നിങ്ങൾ വിജയകരമായി സൈൻ അപ്പ് ചെയ്തു. എന്നിരുന്നാലും, നിങ്ങളുടെ അക്കൗണ്ട് ലോക്ക് ആയതിനാൽ ഞങ്ങൾക്ക് നിങ്ങളെ സൈൻ ഇൻ ചെയ്യാൻ കഴിഞ്ഞില്ല."
|
||||
signed_up_but_unconfirmed: "സ്ഥിരീകരണ ലിങ്കുള്ള ഒരു സന്ദേശം നിങ്ങളുടെ ഇമെയിൽ വിലാസത്തിലേക്ക് അയച്ചു. നിങ്ങളുടെ അക്കൗണ്ട് സജീവമാക്കുന്നതിന് ദയവായി ലിങ്ക് പിന്തുടരുക."
|
||||
update_needs_confirmation: "നിങ്ങളുടെ അക്കൗണ്ട് വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു, പക്ഷേ ഞങ്ങൾക്ക് നിങ്ങളുടെ പുതിയ ഇമെയിൽ വിലാസം പരിശോധിക്കേണ്ടതുണ്ട്. നിങ്ങളുടെ പുതിയ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കുന്നതിന് ദയവായി നിങ്ങളുടെ ഇമെയിൽ പരിശോധിച്ച് സ്ഥിരീകരണ ലിങ്ക് പിന്തുടരുക."
|
||||
updated: "നിങ്ങളുടെ അക്കൗണ്ട് വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തിരിക്കുന്നു."
|
||||
sessions:
|
||||
signed_in: "വിജയകരമായി സൈൻ ഇൻ ചെയ്തിരിക്കുന്നു."
|
||||
signed_out: "വിജയകരമായി സൈൻ ഔട്ട് ചെയ്തിരിക്കുന്നു."
|
||||
already_signed_out: "വിജയകരമായി സൈൻ ഔട്ട് ചെയ്തിരിക്കുന്നു."
|
||||
unlocks:
|
||||
send_instructions: "നിങ്ങളുടെ അക്കൗണ്ട് എങ്ങനെ അൺലോക്ക് ചെയ്യാം എന്നതിനുള്ള നിർദ്ദേശങ്ങളടങ്ങിയ ഒരു ഇമെയിൽ ഏതാനും മിനിറ്റുകൾക്കുള്ളിൽ നിങ്ങൾക്ക് ലഭിക്കും."
|
||||
send_paranoid_instructions: "നിങ്ങളുടെ അക്കൗണ്ട് നിലവിലുണ്ടെങ്കിൽ, കുറച്ച് മിനിറ്റിനുള്ളിൽ അത് എങ്ങനെ അൺലോക്ക് ചെയ്യാം എന്നതിനുള്ള നിർദ്ദേശങ്ങളടങ്ങിയ ഒരു ഇമെയിൽ നിങ്ങൾക്ക് ലഭിക്കും."
|
||||
unlocked: "നിങ്ങളുടെ അക്കൗണ്ട് വിജയകരമായി അൺലോക്ക് ചെയ്തു. തുടരാൻ സൈൻ ഇൻ ചെയ്യുക."
|
||||
errors:
|
||||
messages:
|
||||
already_confirmed: "ഇതിനകം സ്ഥിരീകരിച്ചു, ദയവായി സൈൻ ഇൻ ചെയ്യാൻ ശ്രമിക്കുക"
|
||||
confirmation_period_expired: "%{period}-നുള്ളിൽ സ്ഥിരീകരിക്കേണ്ടതുണ്ട്, ദയവായി പുതിയൊരെണ്ണം അഭ്യർത്ഥിക്കുക"
|
||||
expired: "കാലഹരണപ്പെട്ടു, പുതിയൊരെണ്ണം അഭ്യർത്ഥിക്കുക"
|
||||
not_found: "കണ്ടെത്തിയില്ല"
|
||||
not_locked: "പൂട്ടിയിരുന്നില്ല"
|
||||
not_saved:
|
||||
one: "ഒരു തെറ്റ് ഈ %{resource} സംരക്ഷിക്കുന്നതിൽ നിന്ന് വിലക്കി:"
|
||||
other: "%{count} തെറ്റുകൾ ഈ %{resource} സംരക്ഷിക്കുന്നതിൽ നിന്ന് വിലക്കി:"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user