diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 16aa80fa..30e0a488 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class ApplicationController < ActionController::Base
+ BROWSER_LOCALE_REGEXP = /\A\w{2}(?:-\w{2})?/
+
include ActiveStorage::SetCurrent
include Pagy::Backend
@@ -32,6 +34,21 @@ class ApplicationController < ActionController::Base
private
+ def with_browser_locale(&)
+ locale = request.env['HTTP_ACCEPT_LANGUAGE'].to_s[BROWSER_LOCALE_REGEXP].to_s
+
+ locale =
+ if locale.starts_with?('en-') && locale != 'en-US'
+ 'en-GB'
+ else
+ locale.split('-').first.presence || 'en-GB'
+ end
+
+ locale = 'en-GB' unless I18n.locale_available?(locale)
+
+ I18n.with_locale(locale, &)
+ end
+
def sign_in_for_demo
sign_in(User.active.order('random()').take) unless signed_in?
end
diff --git a/app/controllers/start_form_controller.rb b/app/controllers/start_form_controller.rb
index bad00328..d19c69b1 100644
--- a/app/controllers/start_form_controller.rb
+++ b/app/controllers/start_form_controller.rb
@@ -6,6 +6,7 @@ class StartFormController < ApplicationController
skip_before_action :authenticate_user!
skip_authorization_check
+ around_action :with_browser_locale, only: %i[show completed]
before_action :load_template
def show
diff --git a/app/controllers/submit_form_controller.rb b/app/controllers/submit_form_controller.rb
index a9ae111b..1564cfc6 100644
--- a/app/controllers/submit_form_controller.rb
+++ b/app/controllers/submit_form_controller.rb
@@ -3,6 +3,7 @@
class SubmitFormController < ApplicationController
layout 'form'
+ around_action :with_browser_locale, only: %i[show completed]
skip_before_action :authenticate_user!
skip_authorization_check
diff --git a/app/javascript/submission_form/i18n.js b/app/javascript/submission_form/i18n.js
index 83c16850..19b94434 100644
--- a/app/javascript/submission_form/i18n.js
+++ b/app/javascript/submission_form/i18n.js
@@ -453,7 +453,7 @@ const he = {
use_international_format: 'השתמש בפורמט בינלאומי: +1xxx',
six_digits_code: 'קוד משתמש שש ספרות',
change_phone_number: 'שינוי מספר טלפון',
- sending: 'שולח...',
+ sending: 'שולח',
resend_code: 'שלח מחדש קוד',
verification_code_has_been_resent: 'קוד האימות נשלח מחדש בSMS',
please_fill_all_required_fields: 'אנא מלא את כל השדות הדרושים',
diff --git a/app/views/start_form/completed.html.erb b/app/views/start_form/completed.html.erb
index 145f2ba1..e78bc48f 100644
--- a/app/views/start_form/completed.html.erb
+++ b/app/views/start_form/completed.html.erb
@@ -10,23 +10,23 @@
<%= svg_icon('writing_sign', class: 'w-10 h-10') %>
-
<%= @submitter.submission.template.name %>
-
Signed on <%= l(@submitter.completed_at.to_date, format: :long, locale: @submitter.submission.template.account.locale) %>
+
<%= @submitter.submission.template.name %>
+
<%= t('signed_on_time', time: l(@submitter.completed_at.to_date, format: :long)) %>
-
- Form has been submitted already
+
+ <%= t('form_has_been_submitted_already') %>
<% if Accounts.can_send_emails?(@submitter.submission.template.account) %>
- <%= button_to button_title(title: 'Send copy to Email', disabled_with: 'Sending', icon: svg_icon('mail_forward', class: 'w-6 h-6')), send_submission_email_index_path, params: { submitter_slug: @submitter.slug }, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'base-button w-full' %>
+ <%= button_to button_title(title: t('send_copy_to_email'), disabled_with: t('sending'), icon: svg_icon('mail_forward', class: 'w-6 h-6')), send_submission_email_index_path, params: { submitter_slug: @submitter.slug }, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'base-button w-full' %>
<% end %>
<% if @template.submitters.to_a.size == 1 %>
- <%= button_to button_title(title: 'Resubmit', disabled_with: 'Resubmit', icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@template.slug), params: { submitter: { email: params[:email] }, resubmit: @submitter.slug }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %>
+ <%= button_to button_title(title: t('resubmit'), disabled_with: t('resubmit'), icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@template.slug), params: { submitter: { email: params[:email] }, resubmit: @submitter.slug }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %>
<% end %>
diff --git a/app/views/start_form/show.html.erb b/app/views/start_form/show.html.erb
index a9a505cb..cb46e97f 100644
--- a/app/views/start_form/show.html.erb
+++ b/app/views/start_form/show.html.erb
@@ -4,7 +4,7 @@
<%= render 'banner' %>
<% unless @template.archived_at? %>
-
You have been invited to submit a form
+
<%= t('you_have_been_invited_to_submit_a_form') %>
<% end %>
@@ -15,9 +15,9 @@
<%= @template.name %>
<% if @template.archived_at? %>
-
Form has been deleted by <%= @template.account.name %>.
+
<%= t('form_has_been_deleted_by_html', name: @template.account.name) %>
<% else %>
-
Invited by <%= @template.account.name %>
+
<%= t('invited_by_html', name: @template.account.name) %>
<% end %>
@@ -25,13 +25,13 @@
<% unless @template.archived_at? %>
<%= form_for @submitter, url: start_form_path(@template.slug), data: { turbo_frame: :_top }, method: :put, html: { class: 'space-y-4', onsubmit: 'event.submitter.disabled = true' } do |f| %>
-
-
<%= @submitter.submission.template.name %>
-
Signed on <%= l(@submitter.completed_at.to_date, format: :long, locale: @submitter.submission.template.account.locale) %>
+
<%= @submitter.submission.template.name %>
+
<%= t('signed_on_time', time: l(@submitter.completed_at.to_date, format: :long)) %>
<% if Accounts.can_send_emails?(@submitter.submission.template.account) && @submitter.email.present? %>
- <%= button_to button_title(title: 'Send copy to Email', disabled_with: 'Sending', icon: svg_icon('mail_forward', class: 'w-6 h-6')), send_submission_email_index_path, params: { submitter_slug: @submitter.slug }, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %>
+ <%= button_to button_title(title: t('send_copy_to_email'), disabled_with: t('sending'), icon: svg_icon('mail_forward', class: 'w-6 h-6')), send_submission_email_index_path, params: { submitter_slug: @submitter.slug }, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %>
<% if @submitter.submission.template.submitters.size != 1 %>
-
OR
+
<%= t('or') %>
<% else %>
<% end %>
@@ -28,18 +28,18 @@
<%= svg_icon('download', class: 'w-6 h-6') %>
- Download documents
+ <%= t('download_documents') %>
<%= svg_icon('loader', class: 'w-6 h-6 animate-spin') %>
- Downloading
+ <%= t('downloading') %>
<% if @submitter.submission.template.submitters.size == 1 %>
- OR
+ <%= t('or') %>
- <%= button_to button_title(title: 'Resubmit', disabled_with: 'Resubmit', icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@submitter.submission.template.slug), params: { submitter: { email: @submitter.email, phone: @submitter.phone, name: @submitter.name }, resubmit: @submitter.slug }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %>
+ <%= button_to button_title(title: t('resubmit'), disabled_with: t('resubmit'), icon: svg_icon('reload', class: 'w-6 h-6')), start_form_path(@submitter.submission.template.slug), params: { submitter: { email: @submitter.email, phone: @submitter.phone, name: @submitter.name }, resubmit: @submitter.slug }, method: :put, form: { onsubmit: 'event.submitter.disabled = true' }, class: 'white-button w-full' %>
<% end %>
diff --git a/config/application.rb b/config/application.rb
index b48291c7..01bd3d68 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -22,7 +22,7 @@ module DocuSeal
config.active_storage.routes_prefix = ''
- config.i18n.available_locales = %i[en en-US en-GB es-ES fr-FR pt-PT de-DE pt]
+ config.i18n.available_locales = %i[en en-US en-GB es-ES fr-FR pt-PT de-DE es it de fr pl uk cs pt he]
config.i18n.fallbacks = [:en]
config.exceptions_app = ->(env) { ErrorsController.action(:show).call(env) }
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 127c1417..90bcaa3c 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -82,7 +82,7 @@ Rails.application.configure do
ActiveRecord::Encryption.configure(**config.active_record.encryption)
# Raises error for missing translations.
- # config.i18n.raise_on_missing_translations = true
+ config.i18n.raise_on_missing_translations = true
# Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true
diff --git a/config/locales/en.yml b/config/locales/en.yml
index e8d944c9..4d03c9f6 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1,29 +1,222 @@
-en-US:
+en: &en
+ email: Email
digitally_signed_by: Digitally signed by
role: Role
+ provide_your_email_to_start: Provide your email to start
+ start: Start
+ starting: Starting
+ form_has_been_deleted_by_html: 'Form has been deleted by %{name}.'
+ invited_by_html: 'Invited by %{name}'
+ you_have_been_invited_to_submit_a_form: You have been invited to submit a form
+ signed_on_time: 'Signed on %{time}'
+ form_has_been_submitted_already: Form has been submitted already
+ send_copy_to_email: Send copy to Email
+ sending: Sending
+ resubmit: Resubmit
+ form_has_been_deleted_by_html: 'Form has been deleted by %{name}.'
+ or: or
+ download_documents: Download documents
+ downloading: Downloading
+
+es: &es
+ digitally_signed_by: Firmado digitalmente por
+ role: Rol
+ email: Correo electrónico
+ digitally_signed_by: Firmado digitalmente por
+ role: Rol
+ provide_your_email_to_start: Proporciona tu correo electrónico para comenzar
+ start: Comenzar
+ starting: Comenzando
+ form_has_been_deleted_by_html: 'El formulario ha sido eliminado por %{name}.'
+ invited_by_html: 'Invitado por %{name}'
+ you_have_been_invited_to_submit_a_form: Has sido invitado/a a enviar un formulario
+ signed_on_time: 'Firmado en %{time}'
+ form_has_been_submitted_already: El formulario ya ha sido enviado
+ send_copy_to_email: Enviar copia a Correo electrónico
+ sending: Enviando
+ resubmit: Reenviar
+ or: o
+ download_documents: Descargar documentos
+ downloading: Descargando
+
+it:
+ digitally_signed_by: Signé numériquement par
+ role: Rôle
+ email: Email
+ digitally_signed_by: Firmato digitalmente da
+ role: Ruolo
+ provide_your_email_to_start: Fornisci la tua email per iniziare
+ start: Inizia
+ starting: Iniziando
+ form_has_been_deleted_by_html: 'Il modulo è stato eliminato da %{name}.'
+ invited_by_html: 'Invitato da %{name}'
+ you_have_been_invited_to_submit_a_form: Sei stato invitato a inviare un modulo
+ signed_on_time: 'Firmato alle %{time}'
+ form_has_been_submitted_already: Il modulo è già stato inviato
+ send_copy_to_email: Invia copia via email
+ sending: Inviando
+ resubmit: Reinvia
+ or: o
+ download_documents: Scarica documenti
+ downloading: Scaricamento
+
+fr: &fr
+ email: Email
+ digitally_signed_by: Signé numériquement par
+ role: Rôle
+ provide_your_email_to_start: Entrez votre email pour commencer
+ start: Démarrer
+ starting: Démarrage
+ form_has_been_deleted_by_html: 'Le formulaire a été supprimé par %{name}.'
+ invited_by_html: 'Invité par %{name}'
+ you_have_been_invited_to_submit_a_form: Vous avez été invité à soumettre un formulaire
+ signed_on_time: 'Signé à %{time}'
+ form_has_been_submitted_already: Le formulaire a déjà été soumis
+ send_copy_to_email: Envoyer une copie par email
+ sending: Envoi
+ resubmit: Soumettre à nouveau
+ or: ou
+ download_documents: Télécharger des documents
+ downloading: Téléchargement
+
+pt: &pt
+ digitally_signed_by: Assinado digitalmente por
+ role: Função
+ email: Email
+ digitally_signed_by: Assinado digitalmente por
+ role: Função
+ provide_your_email_to_start: Forneça o seu email para começar
+ start: Iniciar
+ starting: Iniciando
+ form_has_been_deleted_by_html: 'O formulário foi eliminado por %{name}.'
+ invited_by_html: 'Convidado por %{name}'
+ you_have_been_invited_to_submit_a_form: Foi convidado a submeter um formulário
+ signed_on_time: 'Assinado em %{time}'
+ form_has_been_submitted_already: O formulário já foi submetido
+ send_copy_to_email: Enviar cópia para Email
+ sending: Enviando
+ resubmit: Reenviar
+ or: ou
+ download_documents: Baixar documentos
+ downloading: Baixando
+
+de: &de
+ digitally_signed_by: Digital signiert von
+ role: Rolle
+ email: E-Mail
+ digitally_signed_by: Digital unterzeichnet von
+ role: Rolle
+ provide_your_email_to_start: Gib deine E-Mail-Adresse ein, um zu starten
+ start: Starten
+ starting: Starten
+ form_has_been_deleted_by_html: 'Das Formular wurde von %{name} gelöscht.'
+ invited_by_html: 'Eingeladen von %{name}'
+ you_have_been_invited_to_submit_a_form: Du wurdest eingeladen, ein Formular einzureichen
+ signed_on_time: 'Unterzeichnet um %{time}'
+ form_has_been_submitted_already: Formular wurde bereits eingereicht
+ send_copy_to_email: Kopie per E-Mail senden
+ sending: Senden
+ resubmit: Erneut einreichen
+ or: oder
+ download_documents: Dokumente herunterladen
+ downloading: Herunterladen
+
+pl:
+ email: Email
+ digitally_signed_by: Podpis cyfrowy przez
+ role: Rola
+ provide_your_email_to_start: Podaj swój adres email, aby rozpocząć
+ start: Rozpocznij
+ starting: Rozpoczynanie
+ form_has_been_deleted_by_html: 'Formularz został usunięty przez %{name}.'
+ invited_by_html: 'Zaproszony przez %{name}'
+ you_have_been_invited_to_submit_a_form: Zostałeś zaproszony do przesłania formularza
+ signed_on_time: 'Podpisano %{time}'
+ form_has_been_submitted_already: Formularz został już przesłany
+ send_copy_to_email: Wyślij kopię na Email
+ sending: Wysyłanie
+ resubmit: Prześlij ponownie
+ or: lub
+ download_documents: Pobierz dokumenty
+ downloading: Pobieranie
+
+uk:
+ email: Email
+ digitally_signed_by: Цифровий підпис від
+ role: Роль
+ provide_your_email_to_start: Введіть свій email, щоб почати
+ start: Почати
+ starting: Початок
+ form_has_been_deleted_by_html: 'Форму було видалено користувачем %{name}.'
+ invited_by_html: 'Запрошений користувачем %{name}'
+ you_have_been_invited_to_submit_a_form: Вас запросили подати форму
+ signed_on_time: 'Підписаний %{time}'
+ form_has_been_submitted_already: Форма вже була подана
+ send_copy_to_email: Надіслати копію на Email
+ sending: Надсилання
+ resubmit: Подати знову
+ or: або
+ download_documents: Завантажити документи
+ downloading: Завантаження
+
+cs:
+ email: Email
+ digitally_signed_by: Digitálně podepsáno uživatelem
+ role: Role
+ provide_your_email_to_start: Zadejte svůj email pro zahájení
+ start: Zahájit
+ starting: Zahajování
+ form_has_been_deleted_by_html: 'Formulář byl smazán uživatelem %{name}.'
+ invited_by_html: 'Pozván uživatelem %{name}'
+ you_have_been_invited_to_submit_a_form: Byli jste pozváni k odeslání formuláře
+ signed_on_time: 'Podepsáno %{time}'
+ form_has_been_submitted_already: Formulář již byl odeslán
+ send_copy_to_email: Odeslat kopii na Email
+ sending: Odesílání
+ resubmit: Odeslat znovu
+ or: nebo
+ download_documents: Stáhnout dokumenty
+ downloading: Stahování
+
+he:
+ email: דוא"ל
+ digitally_signed_by: חתום דיגיטלית על ידי
+ role: תפקיד
+ provide_your_email_to_start: ספק את כתובת הדוא"ל שלך כדי להתחיל
+ start: התחל
+ starting: מתחיל
+ form_has_been_deleted_by_html: 'הטופס נמחק על ידי %{name}.'
+ invited_by_html: 'הוזמן על ידי %{name}'
+ you_have_been_invited_to_submit_a_form: הוזמנת להגיש טופס
+ signed_on_time: 'חתום ב-%{time}'
+ form_has_been_submitted_already: הטופס כבר נשלח
+ send_copy_to_email: שלח עותק לדוא"ל
+ sending: שולח
+ resubmit: שלח מחדש
+ or: או
+ download_documents: הורד מסמכים
+ downloading: מוריד
+
+en-US:
+ <<: *en
date:
formats:
default: "%m/%d/%Y"
en-GB:
- digitally_signed_by: Digitally signed by
- role: Role
+ <<: *en
date:
formats:
default: "%d/%m/%Y"
es-ES:
- digitally_signed_by: Firmado digitalmente por
- role: Rol
+ <<: *es
fr-FR:
- digitally_signed_by: Signé numériquement par
- role: Rôle
+ <<: *fr
pt-PT:
- digitally_signed_by: Assinado digitalmente por
- role: Função
+ <<: *pt
de-DE:
- digitally_signed_by: Digital signiert von
- role: Rolle
+ <<: *de