revert: undo mailer i18n commits for PR-based rework

This commit is contained in:
gabrieljablonski 2026-04-03 13:49:06 -03:00
parent ca765f5645
commit 0b6bc691ad
43 changed files with 186 additions and 542 deletions

View File

@ -39,8 +39,7 @@ class AdministratorNotifications::AccountComplianceMailer < AdministratorNotific
end
def subject_for(account)
I18n.t('mailer.administrator_notifications.account_compliance.account_deleted.subject',
account_id: account.id, account_name: account.name)
"Account Deletion Notice for #{account.id} - #{account.name}"
end
def instance_admin_email

View File

@ -1,7 +1,6 @@
class AdministratorNotifications::AccountNotificationMailer < AdministratorNotifications::BaseMailer
def account_deletion_user_initiated(account, reason)
brand_name = GlobalConfig.get('BRAND_NAME')['BRAND_NAME'].presence || 'Chatwoot'
subject = I18n.t('mailer.administrator_notifications.account_notifications.account_deletion_user_initiated.subject', brand_name: brand_name)
subject = 'Your Chatwoot account deletion has been scheduled'
action_url = settings_url('general')
meta = {
'account_name' => account.name,
@ -13,8 +12,7 @@ class AdministratorNotifications::AccountNotificationMailer < AdministratorNotif
end
def account_deletion_for_inactivity(account, reason)
brand_name = GlobalConfig.get('BRAND_NAME')['BRAND_NAME'].presence || 'Chatwoot'
subject = I18n.t('mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.subject', brand_name: brand_name)
subject = 'Your Chatwoot account is scheduled for deletion due to inactivity'
action_url = settings_url('general')
meta = {
'account_name' => account.name,
@ -26,7 +24,7 @@ class AdministratorNotifications::AccountNotificationMailer < AdministratorNotif
end
def contact_import_complete(resource)
subject = I18n.t('mailer.administrator_notifications.account_notifications.contact_import_complete.subject')
subject = 'Contact Import Completed'
action_url = if resource.failed_records.attached?
Rails.application.routes.url_helpers.rails_blob_url(resource.failed_records)
@ -43,17 +41,17 @@ class AdministratorNotifications::AccountNotificationMailer < AdministratorNotif
end
def contact_import_failed
subject = I18n.t('mailer.administrator_notifications.account_notifications.contact_import_failed.subject')
subject = 'Contact Import Failed'
send_notification(subject)
end
def contact_export_complete(file_url, email_to)
subject = I18n.t('mailer.administrator_notifications.account_notifications.contact_export_complete.subject')
subject = "Your contact's export file is available to download."
send_notification(subject, to: email_to, action_url: file_url)
end
def automation_rule_disabled(rule)
subject = I18n.t('mailer.administrator_notifications.account_notifications.automation_rule_disabled.subject')
subject = 'Automation rule disabled due to validation errors.'
action_url = settings_url('automation/list')
meta = { 'rule_name' => rule.name }

View File

@ -1,11 +1,11 @@
class AdministratorNotifications::ChannelNotificationsMailer < AdministratorNotifications::BaseMailer
def facebook_disconnect(inbox)
subject = I18n.t('mailer.administrator_notifications.channel_notifications.facebook_disconnect.subject')
subject = 'Your Facebook page connection has expired'
send_notification(subject, action_url: inbox_url(inbox))
end
def instagram_disconnect(inbox)
subject = I18n.t('mailer.administrator_notifications.channel_notifications.instagram_disconnect.subject')
subject = 'Your Instagram connection has expired'
send_notification(subject, action_url: inbox_url(inbox))
end
@ -15,12 +15,12 @@ class AdministratorNotifications::ChannelNotificationsMailer < AdministratorNoti
end
def whatsapp_disconnect(inbox)
subject = I18n.t('mailer.administrator_notifications.channel_notifications.whatsapp_disconnect.subject')
subject = 'Your Whatsapp connection has expired'
send_notification(subject, action_url: inbox_url(inbox))
end
def email_disconnect(inbox)
subject = I18n.t('mailer.administrator_notifications.channel_notifications.email_disconnect.subject')
subject = 'Your email inbox has been disconnected. Please update the credentials for SMTP/IMAP'
send_notification(subject, action_url: inbox_url(inbox))
end
end

View File

@ -1,12 +1,12 @@
class AdministratorNotifications::IntegrationsNotificationMailer < AdministratorNotifications::BaseMailer
def slack_disconnect
subject = I18n.t('mailer.administrator_notifications.integrations_notifications.slack_disconnect.subject')
subject = 'Your Slack integration has expired'
action_url = settings_url('integrations/slack')
send_notification(subject, action_url: action_url)
end
def dialogflow_disconnect
subject = I18n.t('mailer.administrator_notifications.integrations_notifications.dialogflow_disconnect.subject')
subject = 'Your Dialogflow integration was disconnected'
send_notification(subject)
end
end

View File

@ -5,8 +5,7 @@ class AgentNotifications::ConversationNotificationsMailer < ApplicationMailer
@agent = agent
@conversation = conversation
inbox_name = @conversation.inbox&.sanitized_name
subject = I18n.t('mailer.agent_notifications.conversation_creation.subject',
agent_name: @agent.available_name, conversation_id: @conversation.display_id, inbox_name: inbox_name)
subject = "#{@agent.available_name}, A new conversation [ID - #{@conversation.display_id}] has been created in #{inbox_name}."
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
send_mail_with_liquid(to: @agent.email, subject: subject) and return
end
@ -16,8 +15,7 @@ class AgentNotifications::ConversationNotificationsMailer < ApplicationMailer
@agent = agent
@conversation = conversation
subject = I18n.t('mailer.agent_notifications.conversation_assignment.subject',
agent_name: @agent.available_name, conversation_id: @conversation.display_id)
subject = "#{@agent.available_name}, A new conversation [ID - #{@conversation.display_id}] has been assigned to you."
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
send_mail_with_liquid(to: @agent.email, subject: subject) and return
end
@ -28,8 +26,7 @@ class AgentNotifications::ConversationNotificationsMailer < ApplicationMailer
@agent = agent
@conversation = conversation
@message = message
subject = I18n.t('mailer.agent_notifications.conversation_mention.subject',
agent_name: @agent.available_name, conversation_id: @conversation.display_id)
subject = "#{@agent.available_name}, You have been mentioned in conversation [ID - #{@conversation.display_id}]"
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
send_mail_with_liquid(to: @agent.email, subject: subject) and return
end
@ -41,8 +38,7 @@ class AgentNotifications::ConversationNotificationsMailer < ApplicationMailer
@agent = agent
@conversation = conversation
subject = I18n.t('mailer.agent_notifications.assigned_conversation_new_message.subject',
agent_name: @agent.available_name, conversation_id: @conversation.display_id)
subject = "#{@agent.available_name}, New message in your assigned conversation [ID - #{@conversation.display_id}]."
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
send_mail_with_liquid(to: @agent.email, subject: subject) and return
end
@ -54,8 +50,7 @@ class AgentNotifications::ConversationNotificationsMailer < ApplicationMailer
@agent = agent
@conversation = conversation
subject = I18n.t('mailer.agent_notifications.participating_conversation_new_message.subject',
agent_name: @agent.available_name, conversation_id: @conversation.display_id)
subject = "#{@agent.available_name}, New message in your participating conversation [ID - #{@conversation.display_id}]."
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
send_mail_with_liquid(to: @agent.email, subject: subject) and return
end

View File

@ -18,10 +18,6 @@ class ApplicationMailer < ActionMailer::Base
rescue_from(*ExceptionList::SMTP_EXCEPTIONS, with: :handle_smtp_exceptions)
def liquid_filters
[LiquidFilters::I18nFilter]
end
def smtp_config_set_or_development?
ENV.fetch('SMTP_ADDRESS', nil).present? || ENV.fetch('RESEND_API_KEY', nil).present? || Rails.env.development?
end

View File

@ -13,7 +13,7 @@ class TeamNotifications::AutomationNotificationMailer < ApplicationMailer
private
def send_an_email_to_team
subject = I18n.t('mailer.team_notifications.automation.subject')
subject = 'This email has been sent via automation rule actions.'
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
@agent_emails = @agents.collect(&:user).pluck(:email)
send_mail_with_liquid(to: @agent_emails, subject: subject) and return

View File

@ -10,12 +10,10 @@ class ApplicationRecord < ActiveRecord::Base
end
# ModelDrop class should exist in app/drops
# Walks the STI hierarchy so subclasses (e.g. SuperAdmin < User) resolve to the matching Drop
def to_drop
drop_class = self.class.ancestors.find { |k| k.is_a?(Class) && droppables.include?(k.name) }
return unless drop_class
return unless droppables.include?(self.class.name)
"#{drop_class.name}Drop".constantize.new(self)
"#{self.class.name}Drop".constantize.new(self)
end
private

View File

@ -1,30 +1,29 @@
<p><%== t('mailer.common.hi', name: @resource.name) %>,</p>
<p>Hi <%= @resource.name %>,</p>
<% account_user = @resource&.account_users&.first %>
<% brand_name = global_config['BRAND_NAME'] || 'Chatwoot' %>
<% if account_user&.inviter.present? && @resource.unconfirmed_email.blank? %>
<p><%== t('mailer.devise.confirmation_instructions.invited', inviter_name: account_user.inviter.name, account_name: account_user.account.name, brand_name: brand_name) %></p>
<p><%= account_user.inviter.name %>, with <%= account_user.account.name %>, has invited you to try out <%= global_config['BRAND_NAME'] || 'Chatwoot' %>.</p>
<% end %>
<% if @resource.confirmed? %>
<p><%== t('mailer.devise.confirmation_instructions.login_message', brand_name: brand_name) %></p>
<p>You can login to your <%= global_config['BRAND_NAME'] || 'Chatwoot' %> account through the link below:</p>
<% else %>
<% if account_user&.inviter.blank? %>
<p>
<%== t('mailer.devise.confirmation_instructions.welcome', brand_name: brand_name) %>
Welcome to <%= global_config['BRAND_NAME'] || 'Chatwoot' %>! We have a suite of powerful tools ready for you to explore. Before that we quickly need to verify your email address to know it's really you.
</p>
<% end %>
<p><%== t('mailer.devise.confirmation_instructions.activate') %></p>
<p>Please take a moment and click the link below and activate your account.</p>
<% end %>
<% if @resource.unconfirmed_email.present? %>
<p><%= link_to t('mailer.devise.confirmation_instructions.confirm_account'), frontend_url('auth/confirmation', confirmation_token: @token) %></p>
<p><%= link_to 'Confirm my account', frontend_url('auth/confirmation', confirmation_token: @token) %></p>
<% elsif @resource.confirmed? %>
<p><%= link_to t('mailer.devise.confirmation_instructions.login_account'), frontend_url('auth/sign_in') %></p>
<p><%= link_to 'Login to my account', frontend_url('auth/sign_in') %></p>
<% elsif account_user&.inviter.present? %>
<p><%= link_to t('mailer.devise.confirmation_instructions.confirm_account'), frontend_url('auth/password/edit', reset_password_token: @resource.send(:set_reset_password_token)) %></p>
<p><%= link_to 'Confirm my account', frontend_url('auth/password/edit', reset_password_token: @resource.send(:set_reset_password_token)) %></p>
<% else %>
<p><%= link_to t('mailer.devise.confirmation_instructions.confirm_account'), frontend_url('auth/confirmation', confirmation_token: @token) %></p>
<% end %>
<p><%= link_to 'Confirm my account', frontend_url('auth/confirmation', confirmation_token: @token) %></p>
<% end %>

View File

@ -1,3 +1,3 @@
<p><%== t('mailer.devise.password_change.greeting', name: @resource.name) %></p>
<p>Hello <%= @resource.name %>!</p>
<p><%== t('mailer.devise.password_change.body') %></p>
<p>We're contacting you to notify you that your password has been changed.</p>

View File

@ -1,10 +1,10 @@
<p><%== t('mailer.devise.reset_password_instructions.greeting', name: @resource.name) %></p>
<p>Hello <%= @resource.name %>!</p>
<p><%== t('mailer.devise.reset_password_instructions.body') %></p>
<p>Someone has requested a link to change your password. You can do this through the link below.</p>
<p><%= link_to t('mailer.devise.reset_password_instructions.action'), frontend_url('auth/password/edit', reset_password_token: @token) %></p>
<p><%= link_to 'Change my password', frontend_url('auth/password/edit', reset_password_token: @token) %></p>
<p style="color: #999999; font-size: 12px;"><%== t('mailer.devise.reset_password_instructions.copy_paste') %> <%= frontend_url('auth/password/edit', reset_password_token: @token) %></p>
<p style="color: #999999; font-size: 12px;">Copy and paste the URL into your browser if the link above doesn't work: <%= frontend_url('auth/password/edit', reset_password_token: @token) %></p>
<p><%== t('mailer.devise.reset_password_instructions.ignore') %></p>
<p><%== t('mailer.devise.reset_password_instructions.no_change') %></p>
<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>

View File

@ -1,7 +1,7 @@
<p><%== t('mailer.devise.unlock_instructions.greeting', name: @resource.name) %></p>
<p>Hello <%= @resource.name %>!</p>
<p><%== t('mailer.devise.unlock_instructions.body') %></p>
<p>Your account has been locked due to an excessive number of unsuccessful sign in attempts.</p>
<p><%== t('mailer.devise.unlock_instructions.action_prompt') %></p>
<p>Click the link below to unlock your account:</p>
<p><%= link_to t('mailer.devise.unlock_instructions.unlock_account'), unlock_url(@resource, unlock_token: @token) %></p>
<p><%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %></p>

View File

@ -78,7 +78,7 @@
<tr style="margin: 0;">
{% if global_config['BRAND_NAME'] != '' %}
<td class="content-block" style="font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
{{ 'mailer.common.powered_by' | t }}
Powered by
<a href="{{ global_config['BRAND_URL'] }}" style="vertical-align: top; color: #93AFC8; text-align: center; margin: 0; padding: 0 0 20px;" align="center" valign="top">
{{ global_config['BRAND_NAME'] }}
</a>

View File

@ -1,30 +1,30 @@
<p>{{ 'mailer.common.hello' | t }}</p>
<p>Hello,</p>
<p>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.body' | t: 'brand_name', global_config['BRAND_NAME'] }}</p>
<p>This is a notification to inform you that an account has been permanently deleted from your Chatwoot instance.</p>
<p>
<strong>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.installation' | t: 'brand_name', global_config['BRAND_NAME'] }}</strong> {{ meta.instance_url }}<br>
<strong>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.account_id' | t }}</strong> {{ meta.account_id }}<br>
<strong>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.account_name' | t }}</strong> {{ meta.account_name }}<br>
<strong>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.deletion_due_at' | t }}</strong> {{ meta.marked_for_deletion_at }}<br>
<strong>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.deleted_at' | t }}</strong> {{ meta.deleted_at }}<br>
<strong>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.deletion_reason' | t }}</strong> {{ meta.deletion_reason }}
<strong>Chatwoot Installation:</strong> {{ meta.instance_url }}<br>
<strong>Account ID:</strong> {{ meta.account_id }}<br>
<strong>Account Name:</strong> {{ meta.account_name }}<br>
<strong>Deletion due at:</strong> {{ meta.marked_for_deletion_at }}<br>
<strong>Deleted At:</strong> {{ meta.deleted_at }}<br>
<strong>Deletion Reason:</strong> {{ meta.deletion_reason }}
</p>
{% if meta.deleted_user_count > 0 %}
<p>
<strong>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.deleted_users' | t: 'count', meta.deleted_user_count }}</strong><br>
<strong>Deleted Users ({{ meta.deleted_user_count }}):</strong><br>
{% for user in meta.soft_deleted_users %}
{{ 'mailer.administrator_notifications.account_compliance.account_deleted.user_id' | t }} {{ user.user_id }}, Email: {{ user.user_email }}{% unless forloop.last %}<br>{% endunless %}
User ID: {{ user.user_id }}, Email: {{ user.user_email }}{% unless forloop.last %}<br>{% endunless %}
{% endfor %}
</p>
{% else %}
<p>
<strong>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.deleted_users_none' | t }}</strong>
<strong>Deleted Users:</strong> None
</p>
{% endif %}
<p>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.compliance_notice' | t }}</p>
<p>This email serves as a record for compliance purposes.</p>
<p>{{ 'mailer.administrator_notifications.account_compliance.account_deleted.thank_you' | t }}<br>
{{ 'mailer.administrator_notifications.account_compliance.account_deleted.system_name' | t: 'brand_name', global_config['BRAND_NAME'] }}</p>
<p>Thank you,<br>
Chatwoot System</p>

View File

@ -1,19 +1,21 @@
<p>{{ 'mailer.common.hello_there' | t }}</p>
<p>Hello there,</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.body' | t: 'brand_name', global_config['BRAND_NAME'], 'account_name', meta.account_name, 'deletion_date', meta.deletion_date }}</p>
<p>We've noticed that your Chatwoot account <strong>{{ meta.account_name }}</strong> has been inactive for some time. Because of this, it's scheduled for deletion on <strong>{{ meta.deletion_date }}</strong>.</p>
<p><strong>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.how_to_keep' | t }}</strong></p>
<p><strong>How do I keep my account?</strong></p>
<p>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.how_to_keep_body' | t: 'brand_name', global_config['BRAND_NAME'], 'deletion_date', meta.deletion_date, 'url', action_url }}</p>
<p>Log in to your Chatwoot account before <strong>{{ meta.deletion_date }}</strong>. From your account settings, you can <a href="{{ action_url }}">cancel the deletion</a> and continue using your account.</p>
<p><strong>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.what_if_no_cancel' | t }}</strong></p>
<p><strong>What happens if I don't cancel?</strong></p>
<p>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.what_if_no_cancel_body' | t: 'deletion_date', meta.deletion_date }}</p>
<p>Unless you cancel the account deletion before <strong>{{ meta.deletion_date }}</strong>, your account and all associated data — including conversations, contacts, reports, and settings — will be permanently deleted.</p>
<p><strong>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.why_doing_this' | t }}</strong></p>
<p><strong>Why are we doing this?</strong></p>
<p>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.why_doing_this_body' | t }}</p>
<p>To keep things secure and efficient, we regularly remove inactive accounts so our systems remain optimized for active teams.</p>
<p>If you have any questions, feel free to reach us at <a href="mailto:hello@chatwoot.com">hello@chatwoot.com</a>.</p>
<p>— The Chatwoot Team</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_for_inactivity.contact_us' | t: 'email', 'hello@chatwoot.com' }}</p>
<p>{{ 'mailer.common.the_chatwoot_team' | t: 'brand_name', global_config['BRAND_NAME'] }}</p>

View File

@ -1,14 +1,16 @@
<p>{{ 'mailer.common.hello_there' | t }}</p>
<p>Hello there,</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_user_initiated.body' | t: 'brand_name', global_config['BRAND_NAME'], 'account_name', meta.account_name, 'deletion_date', meta.deletion_date }}</p>
<p>An account administrator has requested deletion of the Chatwoot account <strong>{{ meta.account_name }}</strong>. The account is scheduled for deletion on <strong>{{ meta.deletion_date }}</strong>.</p>
<p><strong>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_user_initiated.what_happens_next' | t }}</strong></p>
<p><strong>What happens next?</strong></p>
<ul>
<li>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_user_initiated.remains_accessible' | t }}</li>
<li>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_user_initiated.data_permanently_removed' | t }}</li>
</ul>
<li>The account will remain accessible until the scheduled deletion date.</li>
<li>After that, all data including conversations, contacts, integrations, and settings will be permanently removed.</li>
</ul>
<p>If you change your mind before the deletion date, you can <a href="{{ action_url }}">cancel this request</a> by visiting your account settings.</p>
<p>— The Chatwoot Team</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.account_deletion_user_initiated.cancel_request' | t: 'url', action_url }}</p>
<p>{{ 'mailer.common.the_chatwoot_team' | t: 'brand_name', global_config['BRAND_NAME'] }}</p>

View File

@ -1,8 +1,8 @@
<p>{{ 'mailer.common.hello_there' | t }}</p>
<p>Hello there,</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.automation_rule_disabled.body' | t: 'rule_name', meta['rule_name'] }}</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.automation_rule_disabled.explanation' | t }}</p>
<p>The automation rule <b>{{meta['rule_name']}}</b> has been disabled becuase it has invalid conditions.</p>
<p>This typically happens when you delete any custom attributes which are still being used in automation rules.</p>
<p>
{{ 'mailer.administrator_notifications.account_notifications.automation_rule_disabled.action' | t: 'url', action_url }}
Click <a href="{{action_url}}">here</a> to update the conditions.
</p>

View File

@ -1,7 +1,8 @@
<p>{{ 'mailer.common.hi_plain' | t }}</p>
<p>Hi</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.contact_export_complete.body' | t }}</p>
<p>Your contact export file is ready to download.</p>
<p>
{{ 'mailer.administrator_notifications.account_notifications.contact_export_complete.action' | t: 'url', action_url }}
Click <a href="{{ action_url }}">here</a> to download the export file.
</p>

View File

@ -1,17 +1,17 @@
<p>{{ 'mailer.common.hello' | t }}</p>
<p>Hello,</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.contact_import_complete.body' | t }}</p>
<p>Your contact import has been completed. Please check the contacts tab to view the imported contacts.</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.contact_import_complete.imported_records' | t: 'count', meta['imported_contacts'] }}</p>
<p>Number of records imported: {{meta['imported_contacts']}}</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.contact_import_complete.failed_records' | t: 'count', meta['failed_contacts'] }}</p>
<p>Number of records failed: {{meta['failed_contacts']}}</p>
{% if meta['failed_contacts'] == 0 %}
<p>
{{ 'mailer.administrator_notifications.account_notifications.contact_import_complete.click_to_view_imported' | t: 'url', action_url }}
Click <a href="{{action_url}}">here</a> to view the imported contacts.
</p>
{% else %}
<p>
{{ 'mailer.administrator_notifications.account_notifications.contact_import_complete.click_to_view_failed' | t: 'url', action_url }}
Click <a href="{{ action_url }}" target="_blank">here</a> to view failed records.
</p>
{% endif %}

View File

@ -1,3 +1,3 @@
<p>{{ 'mailer.common.hello' | t }}</p>
<p>Hello,</p>
<p>{{ 'mailer.administrator_notifications.account_notifications.contact_import_failed.body' | t }}</p>
<p>Your contact import has failed. It appears that the CSV file you uploaded may not be valid. We kindly request that you review the file and ensure it complies with the required format.<p/>

View File

@ -1,8 +1,8 @@
<p>{{ 'mailer.common.hello' | t }}</p>
<p>Hello,</p>
<p>{{ 'mailer.administrator_notifications.channel_notifications.email_disconnect.body' | t }}</p>
<p>{{ 'mailer.administrator_notifications.channel_notifications.email_disconnect.action' | t }}</p>
<p>Your email inbox has been disconnected due to configuration errors. </p>
<p>Please update it to continue receiving messages.</p>
<p>
{{ 'mailer.administrator_notifications.channel_notifications.email_disconnect.click_to_reconnect' | t: 'url', action_url }}
Click <a href="{{action_url}}">here</a> to re-connect.
</p>

View File

@ -1,8 +1,8 @@
<p>{{ 'mailer.common.hello' | t }}</p>
<p>Hello,</p>
<p>{{ 'mailer.administrator_notifications.channel_notifications.facebook_disconnect.body' | t }}</p>
<p>{{ 'mailer.administrator_notifications.channel_notifications.facebook_disconnect.action' | t }}</p>
<p>Your Facebook Inbox Access has expired. </p>
<p>Please reconnect Facebook Page to continue receiving messages.</p>
<p>
{{ 'mailer.administrator_notifications.channel_notifications.facebook_disconnect.click_to_reconnect' | t: 'url', action_url }}
Click <a href="{{action_url}}">here</a> to re-connect.
</p>

View File

@ -1,8 +1,8 @@
<p>{{ 'mailer.common.hello' | t }}</p>
<p>Hello,</p>
<p>{{ 'mailer.administrator_notifications.channel_notifications.instagram_disconnect.body' | t }}</p>
<p>{{ 'mailer.administrator_notifications.channel_notifications.instagram_disconnect.action' | t }}</p>
<p>Your Instagram Inbox Access has expired. </p>
<p>Please reconnect Instagram to continue receiving messages.</p>
<p>
{{ 'mailer.administrator_notifications.channel_notifications.instagram_disconnect.click_to_reconnect' | t: 'url', action_url }}
</p>
Click <a href="{{action_url}}">here</a> to re-connect.
</p>

View File

@ -1,8 +1,8 @@
<p>{{ 'mailer.common.hello' | t }}</p>
<p>Hello,</p>
<p>{{ 'mailer.administrator_notifications.channel_notifications.whatsapp_disconnect.body' | t }}</p>
<p>{{ 'mailer.administrator_notifications.channel_notifications.whatsapp_disconnect.action' | t }}</p>
<p>Your Whatsapp Access has expired. </p>
<p>Please reconnect Whatsapp to continue receiving messages.</p>
<p>
{{ 'mailer.administrator_notifications.channel_notifications.whatsapp_disconnect.click_to_reconnect' | t: 'url', action_url }}
Click <a href="{{action_url}}">here</a> to re-connect.
</p>

View File

@ -1,3 +1,3 @@
<p>{{ 'mailer.common.hello_there' | t }}</p>
<p>Hello there,</p>
<p>{{ 'mailer.administrator_notifications.integrations_notifications.dialogflow_disconnect.body' | t }}</p>
<p>Your Dialogflow integration was disconnected because of permission issues. To resolve this, please delete the integration from the admin dashboard and reconnect it using new credentials.</p>

View File

@ -1,7 +1,7 @@
<p>{{ 'mailer.common.hello' | t }}</p>
<p>Hello,</p>
<p>{{ 'mailer.administrator_notifications.integrations_notifications.slack_disconnect.body' | t }}</p>
<p>Your Slack integration has expired. To continue receiving messages on Slack, please delete the integration and connect your workspace again. </p>
<p>
{{ 'mailer.administrator_notifications.integrations_notifications.slack_disconnect.click_to_reconnect' | t: 'url', action_url }}
Click <a href="{{action_url}}">here</a> to re-connect.
</p>

View File

@ -1,7 +1,7 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }},</p>
<p>Hi {{user.available_name}},</p>
<p>{{ 'mailer.agent_notifications.assigned_conversation_new_message.body' | t }}</p>
<p>You have received a new message in your assigned conversation.</p>
<p>
{{ 'mailer.common.click_here_to_get_cracking' | t: 'url', action_url }}
Click <a href="{{action_url}}">here</a> to get cracking.
</p>

View File

@ -1,12 +1,12 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }},</p>
<p>Hi {{user.available_name}},</p>
<p>{{ 'mailer.agent_notifications.conversation_assignment.body' | t }}</p>
<p>Time to save the world. A new conversation has been assigned to you</p>
{% for chat_message in conversation.recent_messages %}
<div>
<h4 style="margin: 0;">
{% if chat_message.sender == user.available_name %}
{{ 'mailer.common.you' | t }}
You
{% else %}
{{chat_message.sender}}
{% endif %}
@ -20,12 +20,12 @@
{% if chat_message.attachments %}
{% for attachment in chat_message.attachments %}
{{ 'mailer.common.attachment_click_to_view' | t: 'url', attachment }}
Attachment [<a href="{{ attachment }}" _target="blank">Click here to view</a>]
{% endfor %}
{% endif %}
</div>
{% endfor %}
<p>
{{ 'mailer.common.click_here_to_get_cracking' | t: 'url', action_url }}
Click <a href="{{action_url}}">here</a> to get cracking.
</p>

View File

@ -1,14 +1,15 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }}</p>
<p>Hi {{user.available_name}}</p>
<p>
{{ 'mailer.agent_notifications.conversation_creation.body' | t: 'url', action_url, 'conversation_id', conversation.display_id, 'inbox_name', inbox.name, 'contact_name', conversation.contact_name }}
A new conversation (<a href="{{ action_url }}">#{{conversation.display_id}}</a>) has been created in {{ inbox.name }}.
<strong>{{ conversation.contact_name }}</strong> wrote:
</p>
{% for chat_message in conversation.recent_messages %}
<div>
<h4 style="margin: 0;">
{% if chat_message.sender == user.available_name %}
{{ 'mailer.common.you' | t }}
You
{% else %}
{{chat_message.sender}}
{% endif %}
@ -22,7 +23,7 @@
{% if chat_message.attachments %}
{% for attachment in chat_message.attachments %}
{{ 'mailer.common.attachment_click_to_view' | t: 'url', attachment }}
Attachment [<a href="{{ attachment }}" _target="blank">Click here to view</a>]
{% endfor %}
{% endif %}
</div>

View File

@ -1,16 +1,16 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }}, </p>
<p>Hi {{user.available_name}}, </p>
<p>{{ 'mailer.agent_notifications.conversation_mention.body' | t: 'sender_name', message.sender_display_name }}</p>
<p>You've been mentioned in a conversation. <b>{{message.sender_display_name}}</b> wrote:</p>
<blockquote style="box-sizing:border-box; padding:8px 16px; margin:0 0 20px; font-size:14px; border-left:5px solid #eeeeee">
{{message.text_content}}
</blockquote>
<p><b>{{ 'mailer.agent_notifications.conversation_mention.previous_messages' | t }}</b></p>
<p><b>Previous messages:</b></p>
{% for chat_message in conversation.recent_messages %}
<div>
<h4 style="margin: 0;">
{% if chat_message.sender == user.available_name %}
{{ 'mailer.common.you' | t }}
You
{% else %}
{{chat_message.sender}}
{% endif %}
@ -24,11 +24,11 @@
{% if chat_message.attachments %}
{% for attachment in chat_message.attachments %}
{{ 'mailer.common.attachment_click_to_view' | t: 'url', attachment }}
Attachment [<a href="{{ attachment }}" _target="blank">Click here to view</a>]
{% endfor %}
{% endif %}
</div>
{% endfor %}
<p>
<a href="{{ action_url }}">{{ 'mailer.agent_notifications.conversation_mention.view_message' | t }}</a>
<a href="{{ action_url }}">View Message</a>
</p>

View File

@ -1,5 +1,5 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }},</p>
<p>Hi {{user.available_name}},</p>
<p>{{ 'mailer.agent_notifications.participating_conversation_new_message.body' | t }}</p>
<p>You have received a new message in a conversation you are participating.</p>
<p>{{ 'mailer.common.click_here_to_get_cracking' | t: 'url', action_url }}</p>
<p>Click <a href="{{action_url}}">here</a> to get cracking.</p>

View File

@ -1,10 +1,10 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }},</p>
<p>Hi {{user.available_name}},</p>
<p>
Conversation #{{conversation.display_id}} in {{ inbox.name }}
{{ 'mailer.agent_notifications.sla_missed_first_response.body' | t }} {{ sla_policy.name }}.
Conversation #{{conversation.display_id}} in {{ inbox.name }}
has missed the SLA for first response under policy {{ sla_policy.name }}.
</p>
<p>
<a href="{{action_url}}">{{ 'mailer.agent_notifications.sla_missed_first_response.action' | t }}</a>
<a href="{{action_url}}">Please address immediately.</a>
</p>

View File

@ -1,10 +1,10 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }},</p>
<p>Hi {{user.available_name}},</p>
<p>
Conversation #{{conversation.display_id}} in {{ inbox.name }}
{{ 'mailer.agent_notifications.sla_missed_next_response.body' | t }} {{ sla_policy.name }}.
Conversation #{{conversation.display_id}} in {{ inbox.name }}
has missed the SLA for next response under policy {{ sla_policy.name }}..
</p>
<p>
<a href="{{action_url}}">{{ 'mailer.agent_notifications.sla_missed_next_response.action' | t }}</a>
<a href="{{action_url}}">Please address immediately.</a>
</p>

View File

@ -1,10 +1,10 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }},</p>
<p>Hi {{user.available_name}},</p>
<p>
Conversation #{{conversation.display_id}} in {{ inbox.name }}
{{ 'mailer.agent_notifications.sla_missed_resolution.body' | t }} {{ sla_policy.name }}.
Conversation #{{conversation.display_id}} in {{ inbox.name }}
has missed the SLA for resolution time under policy {{ sla_policy.name }}.
</p>
<p>
<a href="{{action_url}}">{{ 'mailer.agent_notifications.sla_missed_resolution.action' | t }}</a>
<a href="{{action_url}}">Please address immediately.</a>
</p>

View File

@ -1,9 +1,8 @@
<tr>
<td>
<p>{{ 'mailer.portal.cname_instructions.greeting' | t }}</p>
{% assign domain = cname_record | split: ' ' | first %}
<p>{{ 'mailer.portal.cname_instructions.intro' | t: 'domain', domain }}</p>
<p>{{ 'mailer.portal.cname_instructions.add_cname' | t }}</p>
<p>Hello there,</p>
<p>To complete the setup of your help center, you'll need to update the DNS settings for your custom domain: <strong>{{ cname_record | split: ' ' | first }}</strong>.</p>
<p>Please add the following CNAME record to your DNS provider's configuration:</p>
</td>
</tr>
@ -15,17 +14,17 @@
<tr>
<td>
<p>{{ 'mailer.portal.cname_instructions.steps_title' | t }}</p>
<p>Step-by-step Instructions:</p>
<ol>
<li>{{ 'mailer.portal.cname_instructions.step_1' | t }}</li>
<li>{{ 'mailer.portal.cname_instructions.step_2' | t }}</li>
<li>{{ 'mailer.portal.cname_instructions.step_3' | t }}</li>
<li>{{ 'mailer.portal.cname_instructions.step_4' | t }}</li>
<li>Log in to your DNS providers dashboard</li>
<li>Go to the DNS management section</li>
<li>Create a new CNAME record using the information above</li>
<li>Save the changes and allow up to 24 hours for the DNS to propagate</li>
</ol>
<p>{{ 'mailer.portal.cname_instructions.ssl_notice' | t }}</p>
<p>Once the DNS record is live, your custom domain will automatically be secured with an SSL certificate.</p>
<p>{{ 'mailer.portal.cname_instructions.support_message' | t }}</p>
<p>If you have any questions or need help, feel free to reach out to our support team—were here to assist you.</p>
</td>
</tr>

View File

@ -1,7 +1,7 @@
<p>{{ 'mailer.team_notifications.automation.automation_system' | t }}</p>
<p>This is the mail from Automation System</p>
<p>{{ custom_message }}</p>
<p>
{{ 'mailer.common.click_here_to_get_cracking' | t: 'url', action_url }}
Click <a href="{{ action_url }}">here</a> to get cracking.
</p>

View File

@ -1,7 +1,8 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }}</p>
<p>Hi {{user.available_name}}</p>
<p>{{ custom_message }}</p>
<p>
{{ 'mailer.common.click_here_to_get_cracking' | t: 'url', action_url }}
Click <a href="{{ action_url }}">here</a> to get cracking.
</p>

View File

@ -1,7 +1,8 @@
<p>{{ 'mailer.common.hi' | t: 'name', user.available_name }}</p>
<p>Hi {{user.available_name}}</p>
<p>{{ custom_message }}</p>
<p>
{{ 'mailer.common.click_here_to_get_cracking' | t: 'url', action_url }}
Click <a href="{{ action_url }}">here</a> to get cracking.
</p>

View File

@ -557,171 +557,3 @@ en:
fourth: "fourth"
fifth: "fifth"
last: "last"
mailer:
common:
hi: "Hi %{name}"
hi_plain: "Hi"
hello: "Hello,"
hello_there: "Hello there,"
click_here: "Click <a href=\"%{url}\">here</a>"
powered_by: "Powered by"
you: "You"
attachment_click_to_view: "Attachment [<a href=\"%{url}\" _target=\"blank\">Click here to view</a>]"
click_here_to_get_cracking: "Click <a href=\"%{url}\">here</a> to get cracking."
the_chatwoot_team: "The %{brand_name} Team"
agent_notifications:
conversation_creation:
subject: "%{agent_name}, A new conversation [ID - %{conversation_id}] has been created in %{inbox_name}."
body: "A new conversation (<a href=\"%{url}\">#%{conversation_id}</a>) has been created in %{inbox_name}. <strong>%{contact_name}</strong> wrote:"
conversation_assignment:
subject: "%{agent_name}, A new conversation [ID - %{conversation_id}] has been assigned to you."
body: "Time to save the world. A new conversation has been assigned to you"
conversation_mention:
subject: "%{agent_name}, You have been mentioned in conversation [ID - %{conversation_id}]"
body: "You've been mentioned in a conversation. <b>%{sender_name}</b> wrote:"
previous_messages: "Previous messages:"
view_message: "View Message"
assigned_conversation_new_message:
subject: "%{agent_name}, New message in your assigned conversation [ID - %{conversation_id}]."
body: "You have received a new message in your assigned conversation."
participating_conversation_new_message:
subject: "%{agent_name}, New message in your participating conversation [ID - %{conversation_id}]."
body: "You have received a new message in a conversation you are participating."
sla_missed_first_response:
subject: "Conversation [ID - %{conversation_id}] missed SLA for first response"
body: "has missed the SLA for first response under policy"
action: "Please address immediately."
sla_missed_next_response:
subject: "Conversation [ID - %{conversation_id}] missed SLA for next response"
body: "has missed the SLA for next response under policy"
action: "Please address immediately."
sla_missed_resolution:
subject: "Conversation [ID - %{conversation_id}] missed SLA for resolution time"
body: "has missed the SLA for resolution time under policy"
action: "Please address immediately."
administrator_notifications:
channel_notifications:
whatsapp_disconnect:
subject: "Your Whatsapp connection has expired"
body: "Your Whatsapp Access has expired."
action: "Please reconnect Whatsapp to continue receiving messages."
click_to_reconnect: "Click <a href=\"%{url}\">here</a> to re-connect."
facebook_disconnect:
subject: "Your Facebook page connection has expired"
body: "Your Facebook Inbox Access has expired."
action: "Please reconnect Facebook Page to continue receiving messages."
click_to_reconnect: "Click <a href=\"%{url}\">here</a> to re-connect."
instagram_disconnect:
subject: "Your Instagram connection has expired"
body: "Your Instagram Inbox Access has expired."
action: "Please reconnect Instagram to continue receiving messages."
click_to_reconnect: "Click <a href=\"%{url}\">here</a> to re-connect."
email_disconnect:
subject: "Your email inbox has been disconnected. Please update the credentials for SMTP/IMAP"
body: "Your email inbox has been disconnected due to configuration errors."
action: "Please update it to continue receiving messages."
click_to_reconnect: "Click <a href=\"%{url}\">here</a> to re-connect."
account_notifications:
automation_rule_disabled:
subject: "Automation rule disabled due to validation errors."
body: "The automation rule <b>%{rule_name}</b> has been disabled because it has invalid conditions."
explanation: "This typically happens when you delete any custom attributes which are still being used in automation rules."
action: "Click <a href=\"%{url}\">here</a> to update the conditions."
contact_import_complete:
subject: "Contact Import Completed"
body: "Your contact import has been completed. Please check the contacts tab to view the imported contacts."
imported_records: "Number of records imported: %{count}"
failed_records: "Number of records failed: %{count}"
click_to_view_imported: "Click <a href=\"%{url}\">here</a> to view the imported contacts."
click_to_view_failed: "Click <a href=\"%{url}\" target=\"_blank\">here</a> to view failed records."
contact_import_failed:
subject: "Contact Import Failed"
body: "Your contact import has failed. It appears that the CSV file you uploaded may not be valid. We kindly request that you review the file and ensure it complies with the required format."
contact_export_complete:
subject: "Your contact's export file is available to download."
body: "Your contact export file is ready to download."
action: "Click <a href=\"%{url}\">here</a> to download the export file."
account_deletion_user_initiated:
subject: "Your %{brand_name} account deletion has been scheduled"
body: "An account administrator has requested deletion of the %{brand_name} account <strong>%{account_name}</strong>. The account is scheduled for deletion on <strong>%{deletion_date}</strong>."
what_happens_next: "What happens next?"
remains_accessible: "The account will remain accessible until the scheduled deletion date."
data_permanently_removed: "After that, all data including conversations, contacts, integrations, and settings will be permanently removed."
cancel_request: "If you change your mind before the deletion date, you can <a href=\"%{url}\">cancel this request</a> by visiting your account settings."
account_deletion_for_inactivity:
subject: "Your %{brand_name} account is scheduled for deletion due to inactivity"
body: "We've noticed that your %{brand_name} account <strong>%{account_name}</strong> has been inactive for some time. Because of this, it's scheduled for deletion on <strong>%{deletion_date}</strong>."
how_to_keep: "How do I keep my account?"
how_to_keep_body: "Log in to your %{brand_name} account before <strong>%{deletion_date}</strong>. From your account settings, you can <a href=\"%{url}\">cancel the deletion</a> and continue using your account."
what_if_no_cancel: "What happens if I don't cancel?"
what_if_no_cancel_body: "Unless you cancel the account deletion before <strong>%{deletion_date}</strong>, your account and all associated data, including conversations, contacts, reports, and settings, will be permanently deleted."
why_doing_this: "Why are we doing this?"
why_doing_this_body: "To keep things secure and efficient, we regularly remove inactive accounts so our systems remain optimized for active teams."
contact_us: "If you have any questions, feel free to reach us at <a href=\"mailto:%{email}\">%{email}</a>."
integrations_notifications:
slack_disconnect:
subject: "Your Slack integration has expired"
body: "Your Slack integration has expired. To continue receiving messages on Slack, please delete the integration and connect your workspace again."
click_to_reconnect: "Click <a href=\"%{url}\">here</a> to re-connect."
dialogflow_disconnect:
subject: "Your Dialogflow integration was disconnected"
body: "Your Dialogflow integration was disconnected because of permission issues. To resolve this, please delete the integration from the admin dashboard and reconnect it using new credentials."
account_compliance:
account_deleted:
subject: "Account Deletion Notice for %{account_id} - %{account_name}"
body: "This is a notification to inform you that an account has been permanently deleted from your %{brand_name} instance."
installation: "%{brand_name} Installation:"
account_id: "Account ID:"
account_name: "Account Name:"
deletion_due_at: "Deletion due at:"
deleted_at: "Deleted At:"
deletion_reason: "Deletion Reason:"
deleted_users: "Deleted Users (%{count}):"
deleted_users_none: "Deleted Users: None"
user_id: "User ID:"
compliance_notice: "This email serves as a record for compliance purposes."
thank_you: "Thank you,"
system_name: "%{brand_name} System"
team_notifications:
automation:
subject: "This email has been sent via automation rule actions."
automation_system: "This is the mail from Automation System"
portal:
cname_instructions:
greeting: "Hello there,"
intro: "To complete the setup of your help center, you'll need to update the DNS settings for your custom domain: <strong>%{domain}</strong>."
add_cname: "Please add the following CNAME record to your DNS provider's configuration:"
steps_title: "Step-by-step Instructions:"
step_1: "Log in to your DNS provider's dashboard"
step_2: "Go to the DNS management section"
step_3: "Create a new CNAME record using the information above"
step_4: "Save the changes and allow up to 24 hours for the DNS to propagate"
ssl_notice: "Once the DNS record is live, your custom domain will automatically be secured with an SSL certificate."
support_message: "If you have any questions or need help, feel free to reach out to our support team. We're here to assist you."
devise:
confirmation_instructions:
invited: "%{inviter_name}, with %{account_name}, has invited you to try out %{brand_name}."
login_message: "You can login to your %{brand_name} account through the link below:"
welcome: "Welcome to %{brand_name}! We have a suite of powerful tools ready for you to explore. Before that we quickly need to verify your email address to know it's really you."
activate: "Please take a moment and click the link below and activate your account."
confirm_account: "Confirm my account"
login_account: "Login to my account"
invited_sso: "%{inviter_name}, with %{account_name}, has invited you to access %{brand_name} via Single Sign-On (SSO)."
sso_no_password: "Your organization uses SSO for secure authentication. You will not need a password to access your account."
sso_login: "You can now access your account by logging in through your organization's SSO portal."
sso_access: "You can access your account by logging in through your organization's SSO portal."
reset_password_instructions:
greeting: "Hello %{name}!"
body: "Someone has requested a link to change your password. You can do this through the link below."
action: "Change my password"
copy_paste: "Copy and paste the URL into your browser if the link above doesn't work:"
ignore: "If you didn't request this, please ignore this email."
no_change: "Your password won't change until you access the link above and create a new one."
password_change:
greeting: "Hello %{name}!"
body: "We're contacting you to notify you that your password has been changed."
unlock_instructions:
greeting: "Hello %{name}!"
body: "Your account has been locked due to an excessive number of unsuccessful sign in attempts."
action_prompt: "Click the link below to unlock your account:"
unlock_account: "Unlock my account"

View File

@ -538,171 +538,3 @@ pt_BR:
fourth: "quarto(a)"
fifth: "quinto(a)"
last: "último(a)"
mailer:
common:
hi: "Olá %{name}"
hi_plain: "Olá"
hello: "Olá,"
hello_there: "Olá,"
click_here: "Clique <a href=\"%{url}\">aqui</a>"
powered_by: "Desenvolvido por"
you: "Você"
attachment_click_to_view: "Anexo [<a href=\"%{url}\" _target=\"blank\">Clique aqui para visualizar</a>]"
click_here_to_get_cracking: "Clique <a href=\"%{url}\">aqui</a> para começar."
the_chatwoot_team: "Equipe %{brand_name}"
agent_notifications:
conversation_creation:
subject: "%{agent_name}, Uma nova conversa [ID - %{conversation_id}] foi criada em %{inbox_name}."
body: "Uma nova conversa (<a href=\"%{url}\">#%{conversation_id}</a>) foi criada em %{inbox_name}. <strong>%{contact_name}</strong> escreveu:"
conversation_assignment:
subject: "%{agent_name}, Uma nova conversa [ID - %{conversation_id}] foi atribuída a você."
body: "Hora de salvar o mundo. Uma nova conversa foi atribuída a você"
conversation_mention:
subject: "%{agent_name}, Você foi mencionado na conversa [ID - %{conversation_id}]"
body: "Você foi mencionado em uma conversa. <b>%{sender_name}</b> escreveu:"
previous_messages: "Mensagens anteriores:"
view_message: "Ver Mensagem"
assigned_conversation_new_message:
subject: "%{agent_name}, Nova mensagem na sua conversa atribuída [ID - %{conversation_id}]."
body: "Você recebeu uma nova mensagem na sua conversa atribuída."
participating_conversation_new_message:
subject: "%{agent_name}, Nova mensagem na sua conversa participante [ID - %{conversation_id}]."
body: "Você recebeu uma nova mensagem em uma conversa da qual você participa."
sla_missed_first_response:
subject: "Conversa [ID - %{conversation_id}] perdeu o SLA de primeira resposta"
body: "perdeu o SLA de primeira resposta sob a política"
action: "Por favor, resolva imediatamente."
sla_missed_next_response:
subject: "Conversa [ID - %{conversation_id}] perdeu o SLA de próxima resposta"
body: "perdeu o SLA de próxima resposta sob a política"
action: "Por favor, resolva imediatamente."
sla_missed_resolution:
subject: "Conversa [ID - %{conversation_id}] perdeu o SLA de tempo de resolução"
body: "perdeu o SLA de tempo de resolução sob a política"
action: "Por favor, resolva imediatamente."
administrator_notifications:
channel_notifications:
whatsapp_disconnect:
subject: "Sua conexão com o WhatsApp expirou"
body: "Seu acesso ao WhatsApp expirou."
action: "Por favor, reconecte o WhatsApp para continuar recebendo mensagens."
click_to_reconnect: "Clique <a href=\"%{url}\">aqui</a> para reconectar."
facebook_disconnect:
subject: "Sua conexão com a página do Facebook expirou"
body: "Seu acesso à caixa de entrada do Facebook expirou."
action: "Por favor, reconecte a página do Facebook para continuar recebendo mensagens."
click_to_reconnect: "Clique <a href=\"%{url}\">aqui</a> para reconectar."
instagram_disconnect:
subject: "Sua conexão com o Instagram expirou"
body: "Seu acesso à caixa de entrada do Instagram expirou."
action: "Por favor, reconecte o Instagram para continuar recebendo mensagens."
click_to_reconnect: "Clique <a href=\"%{url}\">aqui</a> para reconectar."
email_disconnect:
subject: "Sua caixa de entrada de e-mail foi desconectada. Por favor, atualize as credenciais SMTP/IMAP"
body: "Sua caixa de entrada de e-mail foi desconectada devido a erros de configuração."
action: "Por favor, atualize-a para continuar recebendo mensagens."
click_to_reconnect: "Clique <a href=\"%{url}\">aqui</a> para reconectar."
account_notifications:
automation_rule_disabled:
subject: "Regra de automação desativada devido a erros de validação."
body: "A regra de automação <b>%{rule_name}</b> foi desativada porque possui condições inválidas."
explanation: "Isso normalmente acontece quando você exclui atributos personalizados que ainda estão sendo usados em regras de automação."
action: "Clique <a href=\"%{url}\">aqui</a> para atualizar as condições."
contact_import_complete:
subject: "Importação de Contatos Concluída"
body: "Sua importação de contatos foi concluída. Verifique a aba de contatos para visualizar os contatos importados."
imported_records: "Número de registros importados: %{count}"
failed_records: "Número de registros com falha: %{count}"
click_to_view_imported: "Clique <a href=\"%{url}\">aqui</a> para visualizar os contatos importados."
click_to_view_failed: "Clique <a href=\"%{url}\" target=\"_blank\">aqui</a> para visualizar os registros com falha."
contact_import_failed:
subject: "Falha na Importação de Contatos"
body: "Sua importação de contatos falhou. Parece que o arquivo CSV enviado pode não ser válido. Solicitamos que você revise o arquivo e garanta que ele esteja no formato correto."
contact_export_complete:
subject: "Seu arquivo de exportação de contatos está disponível para download."
body: "Seu arquivo de exportação de contatos está pronto para download."
action: "Clique <a href=\"%{url}\">aqui</a> para baixar o arquivo de exportação."
account_deletion_user_initiated:
subject: "A exclusão da sua conta %{brand_name} foi agendada"
body: "Um administrador da conta solicitou a exclusão da conta %{brand_name} <strong>%{account_name}</strong>. A conta está agendada para exclusão em <strong>%{deletion_date}</strong>."
what_happens_next: "O que acontece a seguir?"
remains_accessible: "A conta permanecerá acessível até a data de exclusão agendada."
data_permanently_removed: "Após essa data, todos os dados, incluindo conversas, contatos, integrações e configurações, serão permanentemente removidos."
cancel_request: "Se você mudar de ideia antes da data de exclusão, pode <a href=\"%{url}\">cancelar esta solicitação</a> acessando as configurações da sua conta."
account_deletion_for_inactivity:
subject: "Sua conta %{brand_name} está agendada para exclusão por inatividade"
body: "Notamos que sua conta %{brand_name} <strong>%{account_name}</strong> está inativa há algum tempo. Por isso, ela está agendada para exclusão em <strong>%{deletion_date}</strong>."
how_to_keep: "Como manter minha conta?"
how_to_keep_body: "Faça login na sua conta %{brand_name} antes de <strong>%{deletion_date}</strong>. Nas configurações da sua conta, você pode <a href=\"%{url}\">cancelar a exclusão</a> e continuar usando sua conta."
what_if_no_cancel: "O que acontece se eu não cancelar?"
what_if_no_cancel_body: "A menos que você cancele a exclusão da conta antes de <strong>%{deletion_date}</strong>, sua conta e todos os dados associados, incluindo conversas, contatos, relatórios e configurações, serão permanentemente excluídos."
why_doing_this: "Por que estamos fazendo isso?"
why_doing_this_body: "Para manter tudo seguro e eficiente, removemos regularmente contas inativas para que nossos sistemas permaneçam otimizados para equipes ativas."
contact_us: "Se você tiver alguma dúvida, entre em contato conosco em <a href=\"mailto:%{email}\">%{email}</a>."
integrations_notifications:
slack_disconnect:
subject: "Sua integração com o Slack expirou"
body: "Sua integração com o Slack expirou. Para continuar recebendo mensagens no Slack, exclua a integração e conecte seu workspace novamente."
click_to_reconnect: "Clique <a href=\"%{url}\">aqui</a> para reconectar."
dialogflow_disconnect:
subject: "Sua integração com o Dialogflow foi desconectada"
body: "Sua integração com o Dialogflow foi desconectada devido a problemas de permissão. Para resolver isso, exclua a integração do painel de administração e reconecte-a usando novas credenciais."
account_compliance:
account_deleted:
subject: "Notificação de Exclusão de Conta para %{account_id} - %{account_name}"
body: "Esta é uma notificação para informar que uma conta foi permanentemente excluída da sua instância %{brand_name}."
installation: "Instalação %{brand_name}:"
account_id: "ID da Conta:"
account_name: "Nome da Conta:"
deletion_due_at: "Exclusão prevista para:"
deleted_at: "Excluída em:"
deletion_reason: "Motivo da Exclusão:"
deleted_users: "Usuários Excluídos (%{count}):"
deleted_users_none: "Usuários Excluídos: Nenhum"
user_id: "ID do Usuário:"
compliance_notice: "Este e-mail serve como registro para fins de conformidade."
thank_you: "Obrigado,"
system_name: "Sistema %{brand_name}"
team_notifications:
automation:
subject: "Este e-mail foi enviado via ações de regra de automação."
automation_system: "Este é o e-mail do Sistema de Automação"
portal:
cname_instructions:
greeting: "Olá,"
intro: "Para concluir a configuração do seu centro de ajuda, você precisará atualizar as configurações de DNS do seu domínio personalizado: <strong>%{domain}</strong>."
add_cname: "Adicione o seguinte registro CNAME na configuração do seu provedor de DNS:"
steps_title: "Instruções passo a passo:"
step_1: "Acesse o painel do seu provedor de DNS"
step_2: "Vá para a seção de gerenciamento de DNS"
step_3: "Crie um novo registro CNAME usando as informações acima"
step_4: "Salve as alterações e aguarde até 24 horas para a propagação do DNS"
ssl_notice: "Quando o registro DNS estiver ativo, seu domínio personalizado será automaticamente protegido com um certificado SSL."
support_message: "Se você tiver alguma dúvida ou precisar de ajuda, entre em contato com nossa equipe de suporte. Estamos aqui para ajudá-lo."
devise:
confirmation_instructions:
invited: "%{inviter_name}, de %{account_name}, convidou você para experimentar o %{brand_name}."
login_message: "Você pode acessar sua conta %{brand_name} através do link abaixo:"
welcome: "Bem-vindo ao %{brand_name}! Temos um conjunto de ferramentas poderosas prontas para você explorar. Antes disso, precisamos verificar rapidamente seu endereço de e-mail para confirmar que é realmente você."
activate: "Reserve um momento e clique no link abaixo para ativar sua conta."
confirm_account: "Confirmar minha conta"
login_account: "Acessar minha conta"
invited_sso: "%{inviter_name}, de %{account_name}, convidou você para acessar o %{brand_name} via Single Sign-On (SSO)."
sso_no_password: "Sua organização utiliza SSO para autenticação segura. Você não precisará de uma senha para acessar sua conta."
sso_login: "Agora você pode acessar sua conta fazendo login pelo portal SSO da sua organização."
sso_access: "Você pode acessar sua conta fazendo login pelo portal SSO da sua organização."
reset_password_instructions:
greeting: "Olá %{name}!"
body: "Alguém solicitou um link para alterar sua senha. Você pode fazer isso através do link abaixo."
action: "Alterar minha senha"
copy_paste: "Copie e cole a URL no seu navegador se o link acima não funcionar:"
ignore: "Se você não solicitou isso, ignore este e-mail."
no_change: "Sua senha não será alterada até que você acesse o link acima e crie uma nova."
password_change:
greeting: "Olá %{name}!"
body: "Estamos entrando em contato para notificá-lo de que sua senha foi alterada."
unlock_instructions:
greeting: "Olá %{name}!"
body: "Sua conta foi bloqueada devido a um número excessivo de tentativas de login malsucedidas."
action_prompt: "Clique no link abaixo para desbloquear sua conta:"
unlock_account: "Desbloquear minha conta"

View File

@ -5,7 +5,7 @@ module Enterprise::AgentNotifications::ConversationNotificationsMailer
@agent = agent
@conversation = conversation
@sla_policy = sla_policy
subject = I18n.t('mailer.agent_notifications.sla_missed_first_response.subject', conversation_id: @conversation.display_id)
subject = "Conversation [ID - #{@conversation.display_id}] missed SLA for first response"
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
send_mail_with_liquid(to: @agent.email, subject: subject) and return
end
@ -17,8 +17,7 @@ module Enterprise::AgentNotifications::ConversationNotificationsMailer
@conversation = conversation
@sla_policy = sla_policy
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
subject = I18n.t('mailer.agent_notifications.sla_missed_next_response.subject', conversation_id: @conversation.display_id)
send_mail_with_liquid(to: @agent.email, subject: subject) and return
send_mail_with_liquid(to: @agent.email, subject: "Conversation [ID - #{@conversation.display_id}] missed SLA for next response") and return
end
def sla_missed_resolution(conversation, agent, sla_policy)
@ -28,8 +27,7 @@ module Enterprise::AgentNotifications::ConversationNotificationsMailer
@conversation = conversation
@sla_policy = sla_policy
@action_url = app_account_conversation_url(account_id: @conversation.account_id, id: @conversation.display_id)
subject = I18n.t('mailer.agent_notifications.sla_missed_resolution.subject', conversation_id: @conversation.display_id)
send_mail_with_liquid(to: @agent.email, subject: subject) and return
send_mail_with_liquid(to: @agent.email, subject: "Conversation [ID - #{@conversation.display_id}] missed SLA for resolution time") and return
end
def liquid_droppables

View File

@ -1,46 +1,45 @@
<p><%== t('mailer.common.hi', name: @resource.name) %>,</p>
<p>Hi <%= @resource.name %>,</p>
<% account_user = @resource&.account_users&.first %>
<% is_saml_account = account_user&.account&.saml_enabled? %>
<% brand_name = global_config['BRAND_NAME'] || 'Chatwoot' %>
<% if account_user&.inviter.present? && @resource.unconfirmed_email.blank? %>
<% if is_saml_account %>
<p><%== t('mailer.devise.confirmation_instructions.invited_sso', inviter_name: account_user.inviter.name, account_name: account_user.account.name, brand_name: brand_name) %></p>
<p><%== t('mailer.devise.confirmation_instructions.sso_no_password') %></p>
<p><%= account_user.inviter.name %>, with <%= account_user.account.name %>, has invited you to access <%= global_config['BRAND_NAME'] || 'Chatwoot' %> via Single Sign-On (SSO).</p>
<p>Your organization uses SSO for secure authentication. You will not need a password to access your account.</p>
<% else %>
<p><%== t('mailer.devise.confirmation_instructions.invited', inviter_name: account_user.inviter.name, account_name: account_user.account.name, brand_name: brand_name) %></p>
<p><%= account_user.inviter.name %>, with <%= account_user.account.name %>, has invited you to try out <%= global_config['BRAND_NAME'] || 'Chatwoot' %>.</p>
<% end %>
<% end %>
<% if @resource.confirmed? %>
<p><%== t('mailer.devise.confirmation_instructions.login_message', brand_name: brand_name) %></p>
<p>You can login to your <%= global_config['BRAND_NAME'] || 'Chatwoot' %> account through the link below:</p>
<% else %>
<% if account_user&.inviter.blank? %>
<p>
<%== t('mailer.devise.confirmation_instructions.welcome', brand_name: brand_name) %>
Welcome to <%= global_config['BRAND_NAME'] || 'Chatwoot' %>! We have a suite of powerful tools ready for you to explore. Before that we quickly need to verify your email address to know it's really you.
</p>
<% end %>
<% unless is_saml_account %>
<p><%== t('mailer.devise.confirmation_instructions.activate') %></p>
<p>Please take a moment and click the link below and activate your account.</p>
<% end %>
<% end %>
<% if @resource.unconfirmed_email.present? %>
<p><%= link_to t('mailer.devise.confirmation_instructions.confirm_account'), frontend_url('auth/confirmation', confirmation_token: @token) %></p>
<p><%= link_to 'Confirm my account', frontend_url('auth/confirmation', confirmation_token: @token) %></p>
<% elsif @resource.confirmed? %>
<% if is_saml_account %>
<p><%== t('mailer.devise.confirmation_instructions.sso_login') %></p>
<p>You can now access your account by logging in through your organization's SSO portal.</p>
<% else %>
<p><%= link_to t('mailer.devise.confirmation_instructions.login_account'), frontend_url('auth/sign_in') %></p>
<p><%= link_to 'Login to my account', frontend_url('auth/sign_in') %></p>
<% end %>
<% elsif account_user&.inviter.present? %>
<% if is_saml_account %>
<p><%== t('mailer.devise.confirmation_instructions.sso_access') %></p>
<p>You can access your account by logging in through your organization's SSO portal.</p>
<% else %>
<p><%= link_to t('mailer.devise.confirmation_instructions.confirm_account'), frontend_url('auth/password/edit', reset_password_token: @resource.send(:set_reset_password_token)) %></p>
<p><%= link_to 'Confirm my account', frontend_url('auth/password/edit', reset_password_token: @resource.send(:set_reset_password_token)) %></p>
<% end %>
<% else %>
<p><%= link_to t('mailer.devise.confirmation_instructions.confirm_account'), frontend_url('auth/confirmation', confirmation_token: @token) %></p>
<p><%= link_to 'Confirm my account', frontend_url('auth/confirmation', confirmation_token: @token) %></p>
<% end %>

View File

@ -1,9 +0,0 @@
module LiquidFilters::I18nFilter
def t(key, *args)
result = I18n.t(key, default: key)
args.each_slice(2) do |placeholder, value|
result = result.gsub("%{#{placeholder}}", value.to_s) if placeholder
end
result
end
end