Merge pull request #5500 from betagouv/contact-page-EN

Mise en place de l'infrastructure de localisation de la page `/contact`
This commit is contained in:
Pierre de La Morinerie 2020-08-27 11:13:25 +02:00 committed by GitHub
commit f15b96cb3a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 447 additions and 95 deletions

View file

@ -38,12 +38,12 @@ class SupportController < ApplicationController
def setup_context
@dossier_id = dossier&.id
@tags = tags
@options = Helpscout::FormAdapter::OPTIONS
@options = Helpscout::FormAdapter.options
end
def setup_context_admin
@tags = tags
@options = Helpscout::FormAdapter::ADMIN_OPTIONS
@options = Helpscout::FormAdapter.admin_options
end
def create_conversation

View file

@ -1,24 +1,37 @@
class Helpscout::FormAdapter
attr_reader :params
def self.options
[
[I18n.t(TYPE_INFO, scope: [:support, :question]), TYPE_INFO],
[I18n.t(TYPE_PERDU, scope: [:support, :question]), TYPE_PERDU],
[I18n.t(TYPE_INSTRUCTION, scope: [:support, :question]), TYPE_INSTRUCTION],
[I18n.t(TYPE_AMELIORATION, scope: [:support, :question]), TYPE_AMELIORATION],
[I18n.t(TYPE_AUTRE, scope: [:support, :question]), TYPE_AUTRE]
]
end
def self.admin_options
[
[I18n.t(ADMIN_TYPE_QUESTION, scope: [:supportadmin]), ADMIN_TYPE_QUESTION],
[I18n.t(ADMIN_TYPE_RDV, scope: [:supportadmin]), ADMIN_TYPE_RDV],
[I18n.t(ADMIN_TYPE_SOUCIS, scope: [:supportadmin]), ADMIN_TYPE_SOUCIS],
[I18n.t(ADMIN_TYPE_PRODUIT, scope: [:supportadmin]), ADMIN_TYPE_PRODUIT],
[I18n.t(ADMIN_TYPE_DEMANDE_COMPTE, scope: [:supportadmin]), ADMIN_TYPE_DEMANDE_COMPTE],
[I18n.t(ADMIN_TYPE_AUTRE, scope: [:supportadmin]), ADMIN_TYPE_AUTRE]
]
end
def initialize(params = {}, api = nil)
@params = params
@api = api || Helpscout::API.new
end
TYPE_INFO = 'info demarche'
TYPE_PERDU = 'usager perdu'
TYPE_INSTRUCTION = 'info instruction'
TYPE_AMELIORATION = 'produit'
TYPE_AUTRE = 'autre'
OPTIONS = [
[I18n.t(TYPE_INFO, scope: [:support]), TYPE_INFO],
[I18n.t(TYPE_PERDU, scope: [:support]), TYPE_PERDU],
[I18n.t(TYPE_INSTRUCTION, scope: [:support]), TYPE_INSTRUCTION],
[I18n.t(TYPE_AMELIORATION, scope: [:support]), TYPE_AMELIORATION],
[I18n.t(TYPE_AUTRE, scope: [:support]), TYPE_AUTRE]
]
TYPE_INFO = 'procedure_info'
TYPE_PERDU = 'lost_user'
TYPE_INSTRUCTION = 'instruction_info'
TYPE_AMELIORATION = 'product'
TYPE_AUTRE = 'other'
ADMIN_TYPE_RDV = 'admin demande rdv'
ADMIN_TYPE_QUESTION = 'admin question'
@ -27,15 +40,6 @@ class Helpscout::FormAdapter
ADMIN_TYPE_DEMANDE_COMPTE = 'admin demande compte'
ADMIN_TYPE_AUTRE = 'admin autre'
ADMIN_OPTIONS = [
[I18n.t(ADMIN_TYPE_QUESTION, scope: [:supportadmin]), ADMIN_TYPE_QUESTION],
[I18n.t(ADMIN_TYPE_RDV, scope: [:supportadmin]), ADMIN_TYPE_RDV],
[I18n.t(ADMIN_TYPE_SOUCIS, scope: [:supportadmin]), ADMIN_TYPE_SOUCIS],
[I18n.t(ADMIN_TYPE_PRODUIT, scope: [:supportadmin]), ADMIN_TYPE_PRODUIT],
[I18n.t(ADMIN_TYPE_DEMANDE_COMPTE, scope: [:supportadmin]), ADMIN_TYPE_DEMANDE_COMPTE],
[I18n.t(ADMIN_TYPE_AUTRE, scope: [:supportadmin]), ADMIN_TYPE_AUTRE]
]
def send_form
conversation_id = create_conversation

View file

@ -10,29 +10,29 @@
%li
= link_to manager_root_path, class: "menu-item menu-link" do
= image_tag "icons/super-admin.svg", alt: ''
Passer en super-admin
= t('go_superadmin', scope: [:layouts])
- if multiple_devise_profile_connect?
- if user_signed_in? && nav_bar_profile != :user
%li
= link_to dossiers_path, class: "menu-item menu-link" do
= image_tag "icons/switch-profile.svg", alt: ''
Passer en usager
= t('go_user', scope: [:layouts])
- if instructeur_signed_in? && nav_bar_profile != :instructeur
%li
= link_to instructeur_procedures_path, class: "menu-item menu-link" do
= image_tag "icons/switch-profile.svg", alt: ''
Passer en instructeur
= t('go_instructor', scope: [:layouts])
- if administrateur_signed_in? && nav_bar_profile != :administrateur
%li
= link_to admin_procedures_path, class: "menu-item menu-link" do
= image_tag "icons/switch-profile.svg", alt: ''
Passer en administrateur
= t('go_admin', scope: [:layouts])
%li
= link_to profil_path, class: "menu-item menu-link" do
= image_tag "icons/switch-profile.svg", alt: ''
Voir mon profil
= t('profile', scope: [:layouts])
%li
= link_to destroy_user_session_path, method: :delete, class: "menu-item menu-link" do
= image_tag "icons/sign-out.svg", alt: ''
Se déconnecter
= t('logout', scope: [:layouts])

View file

@ -4,19 +4,15 @@
#contact-form
.container
%h1.new-h1 Contact
%h1.new-h1
= t('contact', scope: [:support])
= form_tag contact_path, method: :post, multipart: true, class: 'form' do |f|
.description
%p
Contactez-nous via ce formulaire et nous vous répondrons dans les plus brefs délais.
Pensez bien à nous donner le plus d'informations possible pour que nous puissions vous aider au mieux.
%p= t('intro_html', scope: [:support])
%br
%p.mandatory-explanation
Les champs suivis dun astérisque (
%span.mandatory *
) sont obligatoires.
%p.mandatory-explanation= t('asterisk_html', scope: [:utils])
- if !user_signed_in?
.contact-champ
@ -27,88 +23,60 @@
.contact-champ
= label_tag :type do
Votre question
= t('your_question', scope: [:support, :question])
%span.mandatory *
= select_tag :type, options_for_select(@options, params[:type]), include_blank: "Choisir une question", required: true
= select_tag :type, options_for_select(@options, params[:type]), include_blank: t('choose_question', scope: [:support, :question]), required: true
.support.card.featured.hidden{ data: { 'contact-type-only': Helpscout::FormAdapter::TYPE_INFO } }
.card-title
👉 Notre réponse
= t('our_answer', scope: [:support, :response])
.card-content
%p
Avez-vous bien vérifié que tous les champs obligatoires (
%span.mandatory *
) sont bien remplis ?
%p Si vous avez des questions sur les informations à saisir, contactez les services en charge de la démarche.
%p
%a{ href: FAQ_CONTACTER_SERVICE_EN_CHARGE_URL }
En savoir plus
= t('procedure_info_html', scope: [:support, :response], link_procedure_info: FAQ_CONTACTER_SERVICE_EN_CHARGE_URL)
.support.card.featured.hidden{ data: { 'contact-type-only': Helpscout::FormAdapter::TYPE_PERDU } }
.card-title
👉 Notre réponse
= t('our_answer', scope: [:support, :response])
.card-content
%p Nous vous invitons à contacter ladministration en charge de votre démarche pour quelle vous indique le lien à suivre. Celui-ci devrait ressembler à cela : #{APPLICATION_BASE_URL}/commencer/NOM_DE_LA_DEMARCHE .
%br
%p Vous pouvez aussi consulter ici la liste de nos démarches les plus frequentes (permis, detr etc) :
%p
%a{ href: LISTE_DES_DEMARCHES_URL }
= LISTE_DES_DEMARCHES_URL
= t('lost_user_html', scope: [:support, :response], base_url: APPLICATION_BASE_URL, link_lost_user: LISTE_DES_DEMARCHES_URL)
.support.card.featured.hidden{ data: { 'contact-type-only': Helpscout::FormAdapter::TYPE_INSTRUCTION } }
.card-title
👉 Notre réponse
%p Si vous avez des questions sur linstruction de votre dossier (par exemple sur les délais), nous vous invitons à contacter directement les services qui instruisent votre dossier par votre messagerie.
%p
%a{ href: FAQ_OU_EN_EST_MON_DOSSIER_URL }
En savoir plus
%br
%p Si vous souhaitez poser une question pour un problème technique sur le site, utilisez le formulaire ci-dessous. Nous ne pourrons pas vous renseigner sur l'instruction de votre dossier.
= t('our_answer', scope: [:support, :response])
.card-content
= t('instruction_info_html', scope: [:support, :response], link_instruction: FAQ_OU_EN_EST_MON_DOSSIER_URL)
.support.card.featured.hidden{ data: { 'contact-type-only': Helpscout::FormAdapter::TYPE_AMELIORATION } }
.card-title
👉 Notre réponse
%p
Une idée ? Pensez à consulter notre
= succeed ' !' do
%strong
tableau de bord des améliorations
%p
%ul
%li • Votez pour vos améliorations prioritaires ;
%li • Proposez votre propre idée.
%p
%strong
%a{ href: FEATURE_UPVOTE_URL }
➡ Accéder au tableau des améliorations
= t('our_answer', scope: [:support, :response])
.card-content
= t('product_html', scope: [:support, :response], link_product: FEATURE_UPVOTE_URL)
.contact-champ
= label_tag :dossier_id, 'Numéro du dossier concerné'
= label_tag :dossier_id, t('file_number', scope: [:utils])
= text_field_tag :dossier_id, @dossier_id
.contact-champ
= label_tag :subject do
Sujet
= t('subject', scope: [:utils])
%span.mandatory *
= text_field_tag :subject, params[:subject], required: true
.contact-champ
= label_tag :text do
Message
= t('message', scope: [:utils])
%span.mandatory *
= text_area_tag :text, params[:text], rows: 6, required: true
.contact-champ
= label_tag :piece_jointe do
Pièce jointe
= t('pj', scope: [:utils])
%p.notice.hidden{ data: { 'contact-type-only': Helpscout::FormAdapter::TYPE_AMELIORATION } }
Une capture décran peut nous aider à identifier plus facilement lendroit à améliorer.
= t('notice_pj_product', scope: [:support, :response])
%p.notice.hidden{ data: { 'contact-type-only': Helpscout::FormAdapter::TYPE_AUTRE } }
Une capture décran peut nous aider à identifier plus facilement le problème.
= t('notice_pj_other', scope: [:support, :response])
= file_field_tag :piece_jointe
= hidden_field_tag :tags, @tags&.join(',')
.send-wrapper
= button_tag 'Envoyer le message', type: :submit, class: 'button send primary'
= button_tag t('send_mail', scope: [:utils]), type: :submit, class: 'button send primary'

View file

@ -20,10 +20,312 @@
# available at http://guides.rubyonrails.org/i18n.html.
en:
hello: "Hello world"
utils:
deconnexion: "Logout"
deconnexion: "Log out"
involved: "See concerned people"
no-commentaires: "There is no message yet, feel free to start the first one."
depositaire: "Dépositaire"
pieces: "Pièces jointes"
pj: "Attachments"
asterisk_html: Fields marked by an asterisk ( <span class = mandatory>*</span> ) are mandatory.
file_number: File number
subject: Subject
message: Message
send_mail: Send message
views:
pagination:
next: Next
last: Last
previous: Previous
first: First
truncate: '&hellip;'
# mail:
# administration:
# dossier_expiration_summary:
# expired_dossiers:
# one: "Un dossier a passé sa date limite de conservation"
# other: "%{count} dossiers ont passé leur date limite de conservation"
# expiring_dossiers:
# one: "Un dossier est sur le point de passer sa date limite de conservation"
# other: "%{count} dossiers sont sur le point de passer leur date limite de conservation"
modal:
publish:
title:
publish: Publish the procedure
reopen: Reopen the procedure
body:
publish: You are about to publish the procedure to the public.
reopen: You are about to reopen the procedure.
submit:
publish: Publish
reopen: Reopen
supportadmin:
# admin demande rdv: Demande de RDV pour une présentation à distance de demarches-simplifiees.fr
admin question: I have a question about demarches-simplifiees.fr
admin soucis: I am facing a technical issue on demarches-simplifiees.fr
admin suggestion produit: I have a suggestion for an evolution
admin demande compte: I want to open an admin account with an Orange, Wanadoo, etc. email
admin autre: Other topic
number:
currency:
format:
delimiter: ","
format: "%u%n"
precision: 2
separator: "."
significant: false
strip_insignificant_zeros: false
unit: "€"
format:
delimiter: ","
precision: 3
separator: "."
significant: false
strip_insignificant_zeros: false
human:
decimal_units:
format: "%n %u"
units:
billion: Billion
million: Million
quadrillion: Quadrillion
thousand: Thousand
trillion: Trillion
unit: ''
format:
delimiter: ''
precision: 3
significant: true
strip_insignificant_zeros: true
storage_units:
format: "%n %u"
units:
byte:
one: Byte
other: Bytes
gb: GB
kb: KB
mb: MB
pb: PB
tb: TB
percentage:
format:
delimiter: ''
format: "%n%"
precision:
format:
delimiter: ''
activerecord:
attributes:
user:
siret: 'Numéro SIRET'
password: 'password'
instructeur:
password: 'password'
errors:
messages:
blank: "must be filled"
not_a_number: 'must be a number'
not_an_integer: 'must be an integer (without digit after the comma)'
greater_than: "must be greater than %{count}"
greater_than_or_equal_to: "must be greater than or equal to %{count}"
less_than: "must be less than %{count}"
less_than_or_equal_to: "must be less than or equal to %{count}"
models:
attestation_template:
attributes:
footer:
too_long: ": the footer is too long."
user:
attributes:
reset_password_token:
# invalid: ": Votre lien de nouveau mot de passe a expiré. Merci den demander un nouveau."
email:
invalid: invalid
taken: already in use
password:
too_short: 'is too short'
password_confirmation:
confirmation: ': The two passwords do not match'
invite:
attributes:
email:
taken: ': Invitation already sent'
instructeur:
attributes:
email:
invalid: invalid
taken: already in use
password:
too_short: 'is too short'
procedure:
attributes:
path:
taken: is already used for procedure. You cannot use it because it belongs to another administrator.
# taken_can_be_claimed: est identique à celui dune autre de vos procedures publiées. Si vous publiez cette procedure, lancienne sera dépubliée et ne sera plus accessible au public. Les utilisateurs qui ont commencé un brouillon vont pouvoir le déposer.
invalid: is not valid. It must countain between 3 and 50 characters among a-z, 0-9, '_' et '-'.
errors:
messages:
# already_confirmed: "a déjà été validé(e), veuillez essayer de vous connecter"
# confirmation_period_expired: "à confirmer dans les %{period}, merci de faire une nouvelle demande"
# expired: "a expiré, merci den faire une nouvelle demande"
not_found: "was not found"
not_locked: "was not locked"
not_saved:
one: "1 error prevented this %{resource} from being saved :"
other: "%{count} errors prevented this %{resource} from being saved :"
dossier_not_found: "The file does not exist or you do not have access to it."
dossier_map_not_activated: "The file does not have access to the map."
invalid_siret: "The SIRET is incorrect"
procedure_not_found: "The procedure does not exist"
siret_unknown: 'Sorry, we did not find any establishment registered under this SIRET number.'
# siret_network_error: 'Désolé, la récupération des informations SIRET est temporairement indisponible. Veuillez réessayer dans quelques instants.'
# etablissement_fail: 'Désolé, nous navons pas réussi à enregistrer létablissement correspondant à ce numéro SIRET'
france_connect:
connexion: "Error trying to connect to France Connect."
procedure_archived: "This procedure has been closed, it is no longer possible to submit a file."
procedure_not_draft: "THis procedure is not a draft anymore."
# cadastres_empty:
# one: "Aucune parcelle cadastrale sur la zone sélectionnée"
# other: "Aucune parcelle cadastrale sur les zones sélectionnées"
# quartiers_prioritaires_empty:
# one: "Aucun quartier prioritaire sur la zone sélectionnée"
# other: "Aucun quartier prioritaire sur les zones sélectionnées"
# parcelles_agricoles_empty:
# one: "Aucune parcelle agricole sur la zone sélectionnée"
# other: "Aucune parcelle agricole sur les zones sélectionnées"
date:
abbr_day_names:
- Sun
- Mon
- Tue
- Wed
- Thu
- Fri
- Sat
abbr_month_names:
-
- Jan
- Feb
- Mar
- Apr
- May
- Jun
- Jul
- Aug
- Sep
- Oct
- Nov
- Dec
month_names:
-
- January
- February
- March
- April
- May
- June
- July
- August
- September
- October
- November
- December
order:
- :year
- :month
- :day
day_names:
- Sunday
- Monday
- Tuesday
- Wednesday
- Thursday
- Friday
- Saturday
formats:
default: "%Y-%m-%d"
long: "%B %d, %Y"
short: "%b %d"
datetime:
distance_in_words:
about_x_hours:
one: about an hour
other: about %{count} hours
about_x_months:
one: about a month
other: about %{count} months
about_x_years:
one: about a year
other: about %{count} years
almost_x_years:
one: almost a year
other: almost %{count} years
half_a_minute: half a minute
less_than_x_minutes:
zero: less than a minute
one: less than a minute
other: less than %{count} minutes
less_than_x_seconds:
zero: less than a second
one: less than a second
other: less than %{count} seconds
over_x_years:
one: more than a year
other: more than %{count} years
x_days:
one: 1 day
other: "%{count} days"
x_minutes:
one: 1 minute
other: "%{count} minutes"
x_months:
one: 1 month
other: "%{count} months"
x_seconds:
one: 1 second
other: "%{count} seconds"
time:
formats:
default: "%B %d %Y %R"
pluralize:
case:
zero: file
one: file
other: files
processed:
zero: processed
one: processed
other: processed
new:
zero: new
one: new
other: new
followed:
zero: followed
one: followed
other: followed
archived:
zero: archived
one: archived
other: archived
dossier_trouve:
zero: 0 file found
one: 1 file found
other: "%{count} files found"
published:
zero: Published
one: Published
other: Published
closed:
zero: Closed
one: Closed
other: Closed
draft:
zero: Draft
one: Draft
other: Drafts

View file

@ -25,7 +25,12 @@ fr:
involved: "Voir les personnes impliquées"
no-commentaires: "Il ny a aucun message dans le fil de discussion, nhésitez pas à initier le premier."
depositaire: "Dépositaire"
pieces: "Pièces jointes"
pj: "Pièces jointes"
asterisk_html: Les champs suivis dun astérisque ( <span class = mandatory> * </span> ) sont obligatoires.
file_number: Numéro de dossier
subject: Sujet
message: Message
send_mail: Envoyer le message
views:
pagination:
next: Suivant
@ -55,12 +60,6 @@ fr:
submit:
publish: Publier
reopen: Réactiver
support:
info demarche: Jai un problème lors du remplissage de mon dossier
info instruction: Jai une question sur linstruction de mon dossier
produit: Jai une idée damélioration pour votre site
usager perdu: Je ne trouve pas la démarche que je veux faire
autre: Autre sujet
supportadmin:
admin demande rdv: Demande de RDV pour une présentation à distance de demarches-simplifiees.fr
admin question: Jai une question sur demarches-simplifiees.fr

View file

@ -0,0 +1,8 @@
en:
layouts:
go_superadmin: "Switch to super-admin"
go_user: "Switch to user"
go_instructor: "Switch to instructor"
go_admin: "Switch to administrator"
profile: "See my profile"
logout: "Log out"

View file

@ -0,0 +1,8 @@
fr:
layouts:
go_superadmin: "Passer en super-admin"
go_user: "Passer en usager"
go_instructor: "Passer en instructeur"
go_admin: "Passer en administrateur"
profile: "Voir mon profil"
logout: "Se déconnecter"

View file

@ -0,0 +1,32 @@
en:
support:
contact: Contact
intro_html: Contact us via this form and we will answer you as quickly as possible.<br>Make sure you provide all the required information so we can help you in the best way.
question:
your_question: Your question
choose_question: Choose your question
procedure_info: I've encountered a problem while completing my application
instruction_info: I have a question about the instruction of my application
product: I have an idea to improve the website
lost_user: I am having trouble finding the procedure I am looking for
other: Other topic
response:
our_answer: 👉 Our answer
procedure_info_html: "<p>Are you sure that all the mandatory fields (<span class= mandatory> * </span>) are properly filled?
<p>If you have questions about the information requested, contact the service in charge of the procedure.</p>
<p><a href=%{link_procedure_info}>Find more information</a></p>"
instruction_info_html: "<p>If you have questions about the instruction of your application (response delay for example), contact directly the instructor via our mail system.</p>
<p><a href=%{link_instruction}>Find more information</a></p>
<br>
<p>If you are facing technical issues on the website, use the form below. We will not be able to inform you about the instruction of your application.</p>"
product_html: "<p>Got an idea? Please check our <strong>enhancement dashboard</strong></p>
<p><ul><li>Vote for your priority improvements</li>
<li>Share your own ideas</li></ul></p>
<p><strong><a href=%{link_product}>➡ Access the enhancement dashboard</a></strong></p>"
lost_user_html: "<p>We invite you to contact the administration in charge of the procedure so they can provide you the link.
It should look like this: %{base_url}/commencer/NOM_DE_LA_DEMARCHE.</p>
<br>
<p>You can find here the most popular procedures (licence, detr, etc.) :</p>
<p><a href=%{link_lost_user}>%{link_lost_user}</a></p>"
notice_pj_product: A screenshot can help us identify the element to improve.
notice_pj_other: A screenshot can help us identify the issue.

View file

@ -0,0 +1,31 @@
fr:
support:
contact: Contact
intro_html: Contactez-nous via ce formulaire et nous vous répondrons dans les plus brefs délais.<br>Pensez bien à nous donner le plus d'informations possible pour que nous puissions vous aider au mieux.
question:
your_question: Votre question
choose_question: Choisir une question
procedure_info: Jai un problème lors du remplissage de mon dossier
instruction_info: Jai une question sur linstruction de mon dossier
product: Jai une idée damélioration pour votre site
lost_user: Je ne trouve pas la démarche que je veux faire
other: Autre sujet
response:
our_answer: 👉 Notre réponse
procedure_info_html: "<p>Avez-vous bien vérifié que tous les champs obligatoires (<span class= mandatory> * </span>) sont remplis ?
<p>Si vous avez des questions sur les informations à saisir, contactez les services en charge de la démarche.</p>
<p><a href=%{link_procedure_info}>En savoir plus</a></p>"
instruction_info_html: "<p>Si vous avez des questions sur linstruction de votre dossier (par exemple sur les délais), nous vous invitons à contacter directement les services qui instruisent votre dossier par votre messagerie.</p>
<p><a href=%{link_instruction}>En savoir plus</a></p>
<br>
<p>Si vous souhaitez poser une question pour un problème technique sur le site, utilisez le formulaire ci-dessous. Nous ne pourrons pas vous renseigner sur l'instruction de votre dossier.</p>"
product_html: "<p>Une idée ? Pensez à consulter notre <strong>tableau de bord des améliorations</strong></p>
<p><ul><li>Votez pour vos améliorations prioritaires;</li>
<li>Proposez votre propre idée.</li></ul></p>
<p><strong><a href=%{link_product}>➡ Accéder au tableau des améliorations</a></strong></p>"
lost_user_html: "<p>Nous vous invitons à contacter ladministration en charge de votre démarche pour quelle vous indique le lien à suivre. Celui-ci devrait ressembler à cela : %{base_url}/commencer/NOM_DE_LA_DEMARCHE.</p>
<br>
<p>Vous pouvez aussi consulter ici la liste de nos démarches les plus frequentes (permis, detr etc) :</p>
<p><a href=%{link_lost_user}>%{link_lost_user}</a></p>"
notice_pj_product: Une capture décran peut nous aider à identifier plus facilement lendroit à améliorer.
notice_pj_other: Une capture décran peut nous aider à identifier plus facilement le problème.