Restructure omni services and add Chatwoot research snapshot

This commit is contained in:
Ruslan Bakiev
2026-02-21 11:11:27 +07:00
parent edea7a0034
commit b73babbbf6
7732 changed files with 978203 additions and 32 deletions

View 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'

View File

@@ -0,0 +1,14 @@
shared: &shared
version: '4.11.1'
development:
<<: *shared
production:
<<: *shared
staging:
<<: *shared
test:
<<: *shared

View 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

View 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.

View 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

View 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') %>"

View 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? %>

View File

@@ -0,0 +1,5 @@
# Load the Rails application.
require_relative 'application'
# Initialize the Rails application.
Rails.application.initialize!

View 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

View 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

View 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

View 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

View 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

View File

@@ -0,0 +1 @@
APPS_CONFIG = YAML.load_file(Rails.root.join('config/integration/apps.yml'))

View File

@@ -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)

View 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

View 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

View File

@@ -0,0 +1 @@
ActiveRecordQueryTrace.enabled = true if Rails.env.development?

View 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

View File

@@ -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

View 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']

View File

@@ -0,0 +1,5 @@
# configuration related audited gem : https://github.com/collectiveidea/audited
Audited.config do |config|
config.audit_class = 'Enterprise::AuditLog'
end

View File

@@ -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!

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -0,0 +1,2 @@
Rack::Utils::HTTP_STATUS_CODES[901] = 'Trial Expired'
Rack::Utils::HTTP_STATUS_CODES[902] = 'Account Suspended'

View File

@@ -0,0 +1,6 @@
if ENV['DD_TRACE_AGENT_URL'].present?
Datadog.configure do |c|
# Instrumentation
c.tracing.instrument :rails
end
end

View 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

View 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

View 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

View 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

View 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

View File

@@ -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]

View 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

View 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

View 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

View 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 }

View 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

View 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

View 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

View 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

View 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

View File

@@ -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

View 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

View 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

View 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::Attacks 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@@ -0,0 +1,3 @@
require 'stripe'
Stripe.api_key = ENV.fetch('STRIPE_SECRET_KEY', nil)

View 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

View 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

View 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 ---- ##

View 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',
]

View 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 dIvoire)'
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)'

View 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

View 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'

View 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'

View 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'

View 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'

View 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'

View 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'

View 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'

View 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'

View 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'

View 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:"

View 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} من الحفظ:"

View 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:"

View 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:"

View 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:"

View 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:"

View 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}:"

View 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:"

View 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:"

View 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} από την αποθήκευση:"

View 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:"

View 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}:"

View 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:"

View 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} شده است:"

View 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:"

View 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} :"

View 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:"

View 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:"

View 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:"

View 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}"

View 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:"

View 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:"

View 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ð:"

View 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}:"

View 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} を保存できませんでした:"

View 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:"

View 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:"

View 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}:"

View 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}:"

View 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