Merge pull request #6470 from betagouv/lint-locales

Ajout d'un linter pour vérifier que toutes les chaînes localisées sont traduites en français (#6470)
This commit is contained in:
Pierre de La Morinerie 2021-09-16 08:25:15 -05:00 committed by GitHub
commit 152b8648e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 85 additions and 66 deletions

View file

@ -18,7 +18,7 @@ class Champs::SiretController < ApplicationController
begin begin
etablissement = find_etablissement_with_siret etablissement = find_etablissement_with_siret
rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::ServiceUnavailable rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::ServiceUnavailable
# i18n-tasks-use t('errors.siret_network_error') # i18n-tasks-use t('errors.messages.siret_network_error')
return siret_error(:network_error) return siret_error(:network_error)
end end
if etablissement.nil? if etablissement.nil?

View file

@ -318,13 +318,13 @@ module Users
def show_demarche_en_test_banner def show_demarche_en_test_banner
if @dossier.present? && @dossier.revision.draft? if @dossier.present? && @dossier.revision.draft?
flash.now.alert = t('.test_procedure') flash.now.alert = t('users.dossiers.test_procedure')
end end
end end
def ensure_dossier_can_be_updated def ensure_dossier_can_be_updated
if !dossier.can_be_updated_by_user? if !dossier.can_be_updated_by_user?
flash.alert = t('.no_longer_editable') flash.alert = t('users.dossiers.no_longer_editable')
redirect_to dossiers_path redirect_to dossiers_path
end end
end end
@ -425,7 +425,7 @@ module Users
end end
def forbidden! def forbidden!
flash[:alert] = t('.no_access') flash[:alert] = t('users.dossiers.no_access')
redirect_to root_path redirect_to root_path
end end

View file

@ -48,14 +48,13 @@
- if matching_archive.status == 'generated' && matching_archive.file.attached? - if matching_archive.status == 'generated' && matching_archive.file.attached?
= link_to url_for(matching_archive.file), class: 'button primary' do = link_to url_for(matching_archive.file), class: 'button primary' do
%span.icon.download-white %span.icon.download-white
= t(:archive_ready_html, generated_period: time_ago_in_words(matching_archive.updated_at), scope: [:instructeurs, :procedure]) = t(:archive_ready_html, scope: [:instructeurs, :procedure], generated_period: time_ago_in_words(matching_archive.updated_at))
- else - else
%span.icon.retry %span.icon.retry
= t(:archive_pending_html, created_period: time_ago_in_words(matching_archive.created_at), scope: [:instructeurs, :procedure]) = t(:archive_pending_html, scope: [:instructeurs, :procedure], created_period: time_ago_in_words(matching_archive.created_at))
- elsif weight < 1.gigabyte - elsif weight < 1.gigabyte
= link_to instructeur_archives_path(@procedure, type:'monthly', month: month.strftime('%Y-%m')), method: :post, class: "button" do = link_to instructeur_archives_path(@procedure, type:'monthly', month: month.strftime('%Y-%m')), method: :post, class: "button" do
%span.icon.new-folder %span.icon.new-folder
Demander la création Demander la création
- else - else
Archive trop volumineuse Archive trop volumineuse

View file

@ -16,33 +16,39 @@
%li.mb-1= t("update_description#{postfix}", label: change[:label], to: change[:to], scope: [:new_administrateur, :revision_changes]) %li.mb-1= t("update_description#{postfix}", label: change[:label], to: change[:to], scope: [:new_administrateur, :revision_changes])
- when :mandatory - when :mandatory
- if change[:from] == false - if change[:from] == false
%li.mb-1= t(:enabled, label: change[:label], scope: [:new_administrateur, :revision_changes, "update_mandatory#{postfix}"]) -# i18n-tasks-use t('new_administrateur.revision_changes.update_mandatory.enabled')
-# i18n-tasks-use t('new_administrateur.revision_changes.update_mandatory_private.enabled')
%li.mb-1= t("new_administrateur.revision_changes.update_mandatory#{postfix}.enabled", label: change[:label])
- else - else
%li.mb-1= t(:disabled, label: change[:label], scope: [:new_administrateur, :revision_changes, "update_mandatory#{postfix}"]) -# i18n-tasks-use t('new_administrateur.revision_changes.update_mandatory.disabled')
-# i18n-tasks-use t('new_administrateur.revision_changes.update_mandatory_private.disabled')
%li.mb-1= t("new_administrateur.revision_changes.update_mandatory#{postfix}.disabled", label: change[:label])
- when :piece_justificative_template - when :piece_justificative_template
%li.mb-1= t("update_piece_justificative_template#{postfix}", label: change[:label], scope: [:new_administrateur, :revision_changes]) -# i18n-tasks-use t('new_administrateur.revision_changes.update_piece_justificative_template')
-# i18n-tasks-use t('new_administrateur.revision_changes.update_piece_justificative_template_private')
%li.mb-1= t("new_administrateur.revision_changes.update_piece_justificative_template#{postfix}", label: change[:label])
- when :drop_down_options - when :drop_down_options
- added = change[:to].sort - change[:from].sort - added = change[:to].sort - change[:from].sort
- removed = change[:from].sort - change[:to].sort - removed = change[:from].sort - change[:to].sort
%li.mb-1 %li.mb-1
= t("update_drop_down_options#{postfix}", label: change[:label], scope: [:new_administrateur, :revision_changes]) = t("update_drop_down_options#{postfix}", scope: [:new_administrateur, :revision_changes], label: change[:label])
%ul %ul
- if added.present? - if added.present?
%li= t(:add_option, items: added.map{ |term| "« #{term.strip} »" }.join(", "), scope: [:new_administrateur, :revision_changes]) %li= t(:add_option, scope: [:new_administrateur, :revision_changes], items: added.map{ |term| "« #{term.strip} »" }.join(", "))
- if removed.present? - if removed.present?
%li= t(:remove_option, items: removed.map{ |term| "« #{term.strip} »" }.join(", "), scope: [:new_administrateur, :revision_changes]) %li= t(:remove_option, scope: [:new_administrateur, :revision_changes], items: removed.map{ |term| "« #{term.strip} »" }.join(", "))
- when :carte_layers - when :carte_layers
- added = change[:to].sort - change[:from].sort - added = change[:to].sort - change[:from].sort
- removed = change[:from].sort - change[:to].sort - removed = change[:from].sort - change[:to].sort
%li.mb-1 %li.mb-1
= t("update_carte_layers#{postfix}", label: change[:label], scope: [:new_administrateur, :revision_changes]) = t("update_carte_layers#{postfix}", scope: [:new_administrateur, :revision_changes], label: change[:label])
%ul %ul
- if added.present? - if added.present?
%li= t(:add_option, items: added.map{ |term| "« #{t(term, scope: [:new_administrateur, :carte_layers])} »" }.join(", "), scope: [:new_administrateur, :revision_changes]) %li= t(:add_option, scope: [:new_administrateur, :revision_changes], items: added.map{ |term| "« #{t(term, scope: [:new_administrateur, :carte_layers])} »" }.join(", "))
- if removed.present? - if removed.present?
%li= t(:remove_option, items: removed.map{ |term| "« #{t(term, scope: [:new_administrateur, :carte_layers])} »" }.join(", "), scope: [:new_administrateur, :revision_changes]) %li= t(:remove_option, scope: [:new_administrateur, :revision_changes], items: removed.map{ |term| "« #{t(term, scope: [:new_administrateur, :carte_layers])} »" }.join(", "))
- move_changes, move_private_changes = changes.filter { |change| change[:op] == :move }.partition { |change| !change[:private] } - move_changes, move_private_changes = changes.filter { |change| change[:op] == :move }.partition { |change| !change[:private] }
- if move_changes.size != 0 - if move_changes.size != 0
%li.mb-1= t(:move, count: move_changes.size, scope: [:new_administrateur, :revision_changes]) %li.mb-1= t(:move, scope: [:new_administrateur, :revision_changes], count: move_changes.size)
- if move_private_changes.size != 0 - if move_private_changes.size != 0
%li.mb-1= t(:move_private, count: move_private_changes.size, scope: [:new_administrateur, :revision_changes]) %li.mb-1= t(:move_private, scope: [:new_administrateur, :revision_changes], count: move_private_changes.size)

View file

@ -8,7 +8,6 @@
- when :network_error - when :network_error
= t('errors.messages.siret_network_error') = t('errors.messages.siret_network_error')
-# i18n-tasks-use t('errors.messages.siret_network_error')
- else - else
- if siret.present? && siret == etablissement&.siret - if siret.present? && siret == etablissement&.siret

View file

@ -2,7 +2,7 @@
%tbody %tbody
- if etablissement.diffusable_commercialement == false && profile != 'instructeur' - if etablissement.diffusable_commercialement == false && profile != 'instructeur'
%tr %tr
%td= t('warning_for_private_info', etablissement: raison_sociale_or_name(etablissement), scope: 'views.shared.dossiers.identite_entreprise') %td= t('warning_for_private_info', scope: 'views.shared.dossiers.identite_entreprise', etablissement: raison_sociale_or_name(etablissement))
- else - else
%tr %tr
%th.libelle Dénomination : %th.libelle Dénomination :

View file

@ -3,8 +3,8 @@
Sélectionnez une des valeurs Sélectionnez une des valeurs
%label %label
= form.radio_button :value, Individual::GENDER_FEMALE = form.radio_button :value, Individual::GENDER_FEMALE
= t(Individual::GENDER_FEMALE, scope: 'activerecord.attributes.individual.gender_options') = Individual.human_attribute_name('gender.female')
%label %label
= form.radio_button :value, Individual::GENDER_MALE = form.radio_button :value, Individual::GENDER_MALE
= t('activerecord.attributes.individual.gender_options')[Individual::GENDER_MALE.to_sym] # GENDER_MALE contains a point letter = Individual.human_attribute_name('gender.male')

View file

@ -26,7 +26,7 @@
.contact-champ .contact-champ
= label_tag :phone do = label_tag :phone do
= t('professional_phone_number', scope: [:supportadmin]) = t('pro_phone_number', scope: [:supportadmin])
= text_field_tag :phone = text_field_tag :phone
.contact-champ .contact-champ

View file

@ -9,7 +9,7 @@
- etablissement = @dossier.etablissement - etablissement = @dossier.etablissement
- if etablissement.diffusable_commercialement == false - if etablissement.diffusable_commercialement == false
%p= t('warning_for_private_info', etablissement: raison_sociale_or_name(etablissement), scope: 'views.shared.dossiers.identite_entreprise') %p= t('warning_for_private_info', scope: 'views.shared.dossiers.identite_entreprise', etablissement: raison_sociale_or_name(etablissement))
- else - else
%p %p

View file

@ -14,10 +14,10 @@
.radios .radios
%label %label
= f.radio_button :gender, Individual::GENDER_FEMALE, required: true = f.radio_button :gender, Individual::GENDER_FEMALE, required: true
= t(Individual::GENDER_FEMALE, scope: 'activerecord.attributes.individual.gender_options') = Individual.human_attribute_name('gender.female')
%label %label
= f.radio_button :gender, Individual::GENDER_MALE, required: true = f.radio_button :gender, Individual::GENDER_MALE, required: true
= t('activerecord.attributes.individual.gender_options')[Individual::GENDER_MALE.to_sym] # GENDER_MALE contains a point letter = Individual.human_attribute_name('gender.male')
.flex .flex
.inline-champ .inline-champ

View file

@ -29,8 +29,8 @@ data:
# External locale data (e.g. gems). # External locale data (e.g. gems).
# This data is not considered unused and is never written to. # This data is not considered unused and is never written to.
external: external:
## Example (replace %#= with %=): - "<%= %x[bundle info --path administrate].chomp %>/config/locales/*%{locale}.yml"
# - "<%#= %x[bundle show vagrant].chomp %>/templates/locales/%{locale}.yml" - "<%= %x[bundle info --path devise-i18n].chomp %>/rails/locales/*%{locale}.yml"
## Specify the router (see Readme for details). Valid values: conservative_router, pattern_router, or a custom class. ## Specify the router (see Readme for details). Valid values: conservative_router, pattern_router, or a custom class.
# router: conservative_router # router: conservative_router

View file

@ -64,7 +64,6 @@ en:
start_procedure: Start the procedure start_procedure: Start the procedure
existing_dossiers: You already have files for this procedure existing_dossiers: You already have files for this procedure
show_dossiers: View my current files show_dossiers: View my current files
start_new_dossier: Start a new file
already_draft: "You already started to fill a file" already_draft: "You already started to fill a file"
already_draft_detail_html: "You started to fill a file for the \"%{procedure}\" procedure <strong>%{time_ago} ago</strong>" already_draft_detail_html: "You started to fill a file for the \"%{procedure}\" procedure <strong>%{time_ago} ago</strong>"
already_not_draft: "You already submitted a file" already_not_draft: "You already submitted a file"
@ -203,7 +202,7 @@ en:
connection: Sign in connection: Sign in
are_you_new: First time on %{app_name}? are_you_new: First time on %{app_name}?
find_procedure: Find your procedure find_procedure: Find your procedure
password: passwords:
reset_link_sent: reset_link_sent:
got_it: Got it! got_it: Got it!
open_your_mailbox: Now open your mailbox. open_your_mailbox: Now open your mailbox.
@ -213,9 +212,9 @@ en:
check_spams: Check your junk or spam email. check_spams: Check your junk or spam email.
check_account: Have you created a %{application_name} account with the adress %{email}? You will not receive any message if no account is linked to your email adress. check_account: Have you created a %{application_name} account with the adress %{email}? You will not receive any message if no account is linked to your email adress.
check_france_connect_html: Have you once logged in with France Connect? If yes, <a href=\"%{href}\">try again with France Connect</a>. check_france_connect_html: Have you once logged in with France Connect? If yes, <a href=\"%{href}\">try again with France Connect</a>.
shared: shared:
email_can_take_a_while_html: <strong>Please note</strong> that this message can take up to 15 minutes to arrive. email_can_take_a_while_html: <strong>Please note</strong> that this message can take up to 15 minutes to arrive.
contact_us_if_any_trouble_html: You can contact us <a href=\"%{href}\">through this form</a> if a problem still exists. contact_us_if_any_trouble_html: You can contact us <a href=\"%{href}\">through this form</a> if a problem still exists.
modal: modal:
publish: publish:
title: title:
@ -352,13 +351,20 @@ en:
users: users:
dossiers: dossiers:
test_procedure: "This file is submitted on a test procedure. Any modification of the procedure by the administrator (addition of a field, publication of the procedure, etc.) will result in the removal of the file." test_procedure: "This file is submitted on a test procedure. Any modification of the procedure by the administrator (addition of a field, publication of the procedure, etc.) will result in the removal of the file."
message_send: "Your message has been sent to the instructor in charge of your file."
no_access: "You do not have access to this file" no_access: "You do not have access to this file"
no_longer_editable: "Your file can no longer be edited" no_longer_editable: "Your file can no longer be edited"
undergoingreview: "Your file is undergoing review. It is no longer possible to delete your file. To cancel the undergoingreview contact the adminitration via the mailbox." create_commentaire:
deleted_dossier: "Your file has been successfully deleted" message_send: "Your message has been sent to the instructor in charge of your file."
archived_dossier: "Your file will be archived for an additional month" ask_deletion:
draft_saved: "Your draft has been saved." undergoingreview: "Your file is undergoing review. It is no longer possible to delete your file. To cancel the undergoingreview contact the adminitration via the mailbox."
no_establishment: "There is no establishment tied to this file" deleted_dossier: "Your file has been successfully deleted"
identity_saved: "Identity data is registred" extend_conservation:
no_longer_available: "The certificate is no longer available on this file." archived_dossier: "Your file will be archived for an additional month"
update_brouillon:
draft_saved: "Your draft has been saved."
etablissement:
no_establishment: "There is no establishment tied to this file"
update_identite:
identity_saved: "Identity data is registred"
attestation:
no_longer_available: "The certificate is no longer available on this file."

View file

@ -359,17 +359,29 @@ fr:
users: users:
dossiers: dossiers:
test_procedure: "Ce dossier est déposé sur une démarche en test. Toute modification de la démarche par ladministrateur (ajout d'un champ, publication de la démarche...) entraînera sa suppression." test_procedure: "Ce dossier est déposé sur une démarche en test. Toute modification de la démarche par ladministrateur (ajout d'un champ, publication de la démarche...) entraînera sa suppression."
message_send: "Votre message a bien été envoyé à linstructeur en charge de votre dossier."
no_access: "Vous navez pas accès à ce dossier" no_access: "Vous navez pas accès à ce dossier"
no_longer_editable: "Votre dossier ne peut plus être modifié" no_longer_editable: "Votre dossier ne peut plus être modifié"
undergoingreview: "Linstruction de votre dossier a commencé, il nest plus possible de supprimer votre dossier. Si vous souhaitez annuler linstruction contactez votre administration par la messagerie de votre dossier." create_commentaire:
deleted_dossier: "Votre dossier a bien été supprimé." message_send: "Votre message a bien été envoyé à linstructeur en charge de votre dossier."
archived_dossier: "Votre dossier sera conservé un mois supplémentaire" ask_deletion:
draft_saved: "Votre brouillon a bien été sauvegardé." undergoingreview: "Linstruction de votre dossier a commencé, il nest plus possible de supprimer votre dossier. Si vous souhaitez annuler linstruction contactez votre administration par la messagerie de votre dossier."
no_establishment: "Aucun établissement nest associé à ce dossier" deleted_dossier: "Votre dossier a bien été supprimé."
identity_saved: "Identité enregistrée" extend_conservation:
no_longer_available: "Lattestation n'est plus disponible sur ce dossier." archived_dossier: "Votre dossier sera conservé un mois supplémentaire"
update_brouillon:
draft_saved: "Votre brouillon a bien été sauvegardé."
etablissement:
no_establishment: "Aucun établissement nest associé à ce dossier"
update_identite:
identity_saved: "Identité enregistrée"
attestation:
no_longer_available: "Lattestation n'est plus disponible sur ce dossier."
new_administrateur: new_administrateur:
procedures:
show:
ready: "Validé"
needs_configuration: "À configurer"
configure_api_particulier_token: "Configurer le jeton API particulier"
jeton_particulier: jeton_particulier:
show: show:
configure_token: "Configurer le jeton API Particulier" configure_token: "Configurer le jeton API Particulier"
@ -380,11 +392,6 @@ fr:
no_scopes_token: "Mise à jour impossible : le jeton n'a pas acces aux données.<br /><br />Vérifier le auprès de <a href='https://datapass.api.gouv.fr/'>https://datapass.api.gouv.fr/</a>" no_scopes_token: "Mise à jour impossible : le jeton n'a pas acces aux données.<br /><br />Vérifier le auprès de <a href='https://datapass.api.gouv.fr/'>https://datapass.api.gouv.fr/</a>"
not_found_token: "Mise à jour impossible : le jeton n'a pas été trouvé ou n'est pas actif<br /><br />Vérifier le auprès de <a href='https://datapass.api.gouv.fr/'>https://datapass.api.gouv.fr/</a>" not_found_token: "Mise à jour impossible : le jeton n'a pas été trouvé ou n'est pas actif<br /><br />Vérifier le auprès de <a href='https://datapass.api.gouv.fr/'>https://datapass.api.gouv.fr/</a>"
network_error: "Mise à jour impossible : une erreur réseau est survenue" network_error: "Mise à jour impossible : une erreur réseau est survenue"
procedures:
show:
ready: "Validé"
needs_configuration: "À configurer"
configure_api_particulier_token: "Configurer le jeton API particulier"
api_particulier: api_particulier:
already_configured: "Déjà rempli" already_configured: "Déjà rempli"
needs_configuration: "À remplir" needs_configuration: "À remplir"

View file

@ -6,6 +6,6 @@ en:
nom: Last name nom: Last name
prenom: First name prenom: First name
birthdate: Date de naissance birthdate: Date de naissance
gender_options: individual/gender:
"Mme": "Ms" female: Ms
"M.": "Mr" male: Mr

View file

@ -6,6 +6,6 @@ fr:
nom: Nom nom: Nom
prenom: Prénom prenom: Prénom
birthdate: Date de naissance birthdate: Date de naissance
gender_options: individual/gender:
"Mme": "Madame" female: Madame
"M.": "Monsieur" male: Monsieur

View file

@ -1,4 +1,4 @@
fr: en:
dossier_mailer: dossier_mailer:
notify_new_answer: notify_new_answer:
subject: New message on your file nº %{dossier_id} « %{libelle_demarche} » subject: New message on your file nº %{dossier_id} « %{libelle_demarche} »

View file

@ -4,7 +4,8 @@ fr:
wrong_address: wrong_address:
one: "%{value} nest pas une adresse email valide" one: "%{value} nest pas une adresse email valide"
other: "%{value} ne sont pas des adresses emails valides" other: "%{value} ne sont pas des adresses emails valides"
experts_assignment: create:
experts_assignment:
one: "L'expert %{value} a été affecté à la démarche n° %{procedure}" one: "L'expert %{value} a été affecté à la démarche n° %{procedure}"
other: "Les experts %{value} ont été affectés à la démarche n° %{procedure}" other: "Les experts %{value} ont été affectés à la démarche n° %{procedure}"
groupe_instructeurs: groupe_instructeurs:

View file

@ -11,8 +11,8 @@ fr:
update_description: La description du champ « %{label} » a été modifiée. La nouvelle description est « %{to} » update_description: La description du champ « %{label} » a été modifiée. La nouvelle description est « %{to} »
update_type_champ: Le type du champ « %{label} » a été modifié. Il est maintenant de type « %{to} » update_type_champ: Le type du champ « %{label} » a été modifié. Il est maintenant de type « %{to} »
update_mandatory: update_mandatory:
enable: Le champ « %{label} » est maintenant obligatoire enabled: Le champ « %{label} » est maintenant obligatoire
disable: Le champ « %{label} » nest plus obligatoire disabled: Le champ « %{label} » nest plus obligatoire
update_piece_justificative_template: Le modèle de pièce justificative du champ « %{label} » a été modifié update_piece_justificative_template: Le modèle de pièce justificative du champ « %{label} » a été modifié
update_drop_down_options: Les options de sélection du champ « %{label} » ont été modifiées update_drop_down_options: Les options de sélection du champ « %{label} » ont été modifiées
update_carte_layers: Les référentiels cartographiques du champ « %{label} » ont été modifiés update_carte_layers: Les référentiels cartographiques du champ « %{label} » ont été modifiés
@ -25,8 +25,8 @@ fr:
update_description_private: La description de lannotation privée « %{label} » a été modifiée. La nouvelle description est « %{to} » update_description_private: La description de lannotation privée « %{label} » a été modifiée. La nouvelle description est « %{to} »
update_type_champ_private: Le type de lannotation privée « %{label} » a été modifié. Elle est maintenant de type « %{to} » update_type_champ_private: Le type de lannotation privée « %{label} » a été modifié. Elle est maintenant de type « %{to} »
update_mandatory_private: update_mandatory_private:
enable: Lannotation privée « %{label} » est maintenant obligatoire enabled: Lannotation privée « %{label} » est maintenant obligatoire
disable: Lannotation privée « %{label} » nest plus obligatoire disabled: Lannotation privée « %{label} » nest plus obligatoire
update_piece_justificative_template_private: Le modèle de pièce justificative de lannotation privée « %{label} » a été modifié update_piece_justificative_template_private: Le modèle de pièce justificative de lannotation privée « %{label} » a été modifié
update_drop_down_options_private: Les options de sélection de lannotation privée « %{label} » ont été modifiées update_drop_down_options_private: Les options de sélection de lannotation privée « %{label} » ont été modifiées
update_carte_layers_private: Les référentiels cartographiques de lannotation privée « %{label} » ont été modifiés update_carte_layers_private: Les référentiels cartographiques de lannotation privée « %{label} » ont été modifiés

View file

@ -2,6 +2,7 @@ task :lint do
sh "bundle exec rubocop --parallel" sh "bundle exec rubocop --parallel"
sh "bundle exec haml-lint app/views/" sh "bundle exec haml-lint app/views/"
sh "bundle exec scss-lint app/assets/stylesheets/" sh "bundle exec scss-lint app/assets/stylesheets/"
sh "bundle exec i18n-tasks missing --locales fr"
sh "bundle exec brakeman --no-pager" sh "bundle exec brakeman --no-pager"
sh "yarn lint:js" sh "yarn lint:js"
end end