From 799d04142e90da63b417e646b62c4bf4202f8601 Mon Sep 17 00:00:00 2001 From: LenaertsJ Date: Fri, 14 Nov 2025 13:52:33 +0000 Subject: [PATCH] Ajouter une variable de localisation aux utilisateurs --- config/packages/chill.yaml | 2 +- .../Service/Messenger/OnGenerationFails.php | 22 +++++ .../Messenger/RequestGenerationHandler.php | 27 ++++++ .../UpdateProfile/UpdateProfileCommand.php | 5 +- .../UpdateProfileCommandHandler.php | 1 + src/Bundle/ChillMainBundle/Entity/User.php | 15 +++- .../Form/Type/UserLocaleType.php | 43 ++++++++++ .../Form/UpdateProfileType.php | 2 + .../Notification/Email/NotificationMailer.php | 85 ++++++++++++++++++- ....fr.md.twig => email_daily_digest.md.twig} | 0 ...l_non_system_notification_content.md.twig} | 2 +- ...tem_notification_content_to_email.md.twig} | 0 ...mail_notification_comment_persist.md.twig} | 2 +- .../Resources/views/User/profile.html.twig | 1 + ...n_transition_completed_content.fr.txt.twig | 12 +-- ..._on_transition_completed_title.fr.txt.twig | 4 +- .../PasswordRecover/RecoverPasswordHelper.php | 22 ++++- .../NotificationToUserGroupsOnTransition.php | 21 +++++ .../ChillMainBundle/config/services/form.yaml | 6 ++ .../migrations/Version20251022140718.php | 33 +++++++ .../translations/messages.fr.yml | 32 ++++++- .../translations/messages.nl.yml | 19 +++++ 22 files changed, 337 insertions(+), 19 deletions(-) create mode 100644 src/Bundle/ChillMainBundle/Form/Type/UserLocaleType.php rename src/Bundle/ChillMainBundle/Resources/views/Notification/{email_daily_digest.fr.md.twig => email_daily_digest.md.twig} (100%) rename src/Bundle/ChillMainBundle/Resources/views/Notification/{email_non_system_notification_content.fr.md.twig => email_non_system_notification_content.md.twig} (88%) rename src/Bundle/ChillMainBundle/Resources/views/Notification/{email_non_system_notification_content_to_email.fr.md.twig => email_non_system_notification_content_to_email.md.twig} (100%) rename src/Bundle/ChillMainBundle/Resources/views/Notification/{email_notification_comment_persist.fr.md.twig => email_notification_comment_persist.md.twig} (87%) create mode 100644 src/Bundle/ChillMainBundle/migrations/Version20251022140718.php diff --git a/config/packages/chill.yaml b/config/packages/chill.yaml index 0f5aa08b7..26f91feb5 100644 --- a/config/packages/chill.yaml +++ b/config/packages/chill.yaml @@ -1,5 +1,5 @@ chill_main: - available_languages: [ '%env(resolve:LOCALE)%', 'en' ] + available_languages: [ '%env(resolve:LOCALE)%', 'en', 'nl' ] available_countries: ['BE', 'FR'] top_banner: visible: false diff --git a/src/Bundle/ChillDocGeneratorBundle/Service/Messenger/OnGenerationFails.php b/src/Bundle/ChillDocGeneratorBundle/Service/Messenger/OnGenerationFails.php index b9d538a63..a950b88c0 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Service/Messenger/OnGenerationFails.php +++ b/src/Bundle/ChillDocGeneratorBundle/Service/Messenger/OnGenerationFails.php @@ -25,6 +25,8 @@ use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; use Symfony\Contracts\Translation\TranslatorInterface; +// use Symfony\Component\Translation\LocaleSwitcher; + /** * @see OnGenerationFailsTest for test suite */ @@ -40,6 +42,7 @@ final readonly class OnGenerationFails implements EventSubscriberInterface private StoredObjectRepositoryInterface $storedObjectRepository, private TranslatorInterface $translator, private UserRepositoryInterface $userRepository, + // private LocaleSwitcher $localeSwitcher, ) {} public static function getSubscribedEvents() @@ -118,6 +121,25 @@ final readonly class OnGenerationFails implements EventSubscriberInterface return; } + // Implementation with LocaleSwitcher (commented out - to be activated after migration to sf7.2): + /* + $this->localeSwitcher->runWithLocale($creator->getLocale(), function () use ($message, $errors, $template, $creator) { + $email = (new TemplatedEmail()) + ->to($message->getSendResultToEmail()) + ->subject($this->translator->trans('docgen.failure_email.The generation of a document failed')) + ->textTemplate('@ChillDocGenerator/Email/on_generation_failed_email.txt.twig') + ->context([ + 'errors' => $errors, + 'template' => $template, + 'creator' => $creator, + 'stored_object_id' => $message->getDestinationStoredObjectId(), + ]); + + $this->mailer->send($email); + }); + */ + + // Current implementation: $email = (new TemplatedEmail()) ->to($message->getSendResultToEmail()) ->subject($this->translator->trans('docgen.failure_email.The generation of a document failed')) diff --git a/src/Bundle/ChillDocGeneratorBundle/Service/Messenger/RequestGenerationHandler.php b/src/Bundle/ChillDocGeneratorBundle/Service/Messenger/RequestGenerationHandler.php index 9dd20af91..a67f5a68f 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Service/Messenger/RequestGenerationHandler.php +++ b/src/Bundle/ChillDocGeneratorBundle/Service/Messenger/RequestGenerationHandler.php @@ -27,6 +27,8 @@ use Symfony\Component\Messenger\Exception\UnrecoverableMessageHandlingException; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; use Symfony\Contracts\Translation\TranslatorInterface; +// use Symfony\Component\Translation\LocaleSwitcher; + /** * Handle the request of document generation. */ @@ -46,6 +48,7 @@ class RequestGenerationHandler implements MessageHandlerInterface private readonly MailerInterface $mailer, private readonly TranslatorInterface $translator, private readonly StoredObjectManagerInterface $storedObjectManager, + // private readonly LocaleSwitcher $localeSwitcher, ) {} public function __invoke(RequestGenerationMessage $message) @@ -122,6 +125,30 @@ class RequestGenerationHandler implements MessageHandlerInterface private function sendDataDump(StoredObject $destinationStoredObject, RequestGenerationMessage $message): void { + // Implementation with LocaleSwitcher (commented out - to be activated after migration to sf7.2): + // Note: This method sends emails to admin addresses, not user addresses, so locale switching may not be needed + /* + $this->localeSwitcher->runWithLocale('fr', function () use ($destinationStoredObject, $message) { + // Get the content of the document + $content = $this->storedObjectManager->read($destinationStoredObject); + $filename = $destinationStoredObject->getFilename(); + $contentType = $destinationStoredObject->getType(); + + // Create the email with the document as an attachment + $email = (new TemplatedEmail()) + ->to($message->getSendResultToEmail()) + ->textTemplate('@ChillDocGenerator/Email/send_data_dump_to_admin.txt.twig') + ->context([ + 'filename' => $filename, + ]) + ->subject($this->translator->trans('docgen.data_dump_email.subject')) + ->attach($content, $filename, $contentType); + + $this->mailer->send($email); + }); + */ + + // Current implementation: // Get the content of the document $content = $this->storedObjectManager->read($destinationStoredObject); $filename = $destinationStoredObject->getFilename(); diff --git a/src/Bundle/ChillMainBundle/Action/User/UpdateProfile/UpdateProfileCommand.php b/src/Bundle/ChillMainBundle/Action/User/UpdateProfile/UpdateProfileCommand.php index f0751cb58..061f8e55a 100644 --- a/src/Bundle/ChillMainBundle/Action/User/UpdateProfile/UpdateProfileCommand.php +++ b/src/Bundle/ChillMainBundle/Action/User/UpdateProfile/UpdateProfileCommand.php @@ -15,6 +15,7 @@ use Chill\MainBundle\Entity\User; use Chill\MainBundle\Notification\NotificationFlagManager; use Chill\MainBundle\Validation\Constraint\PhonenumberConstraint; use libphonenumber\PhoneNumber; +use Symfony\Component\Validator\Constraints as Assert; final class UpdateProfileCommand { @@ -23,11 +24,13 @@ final class UpdateProfileCommand public function __construct( #[PhonenumberConstraint] public ?PhoneNumber $phonenumber, + #[Assert\Choice(choices: ['fr', 'nl'], message: 'Locale must be either "fr" or "nl"')] + public string $locale = 'fr', ) {} public static function create(User $user, NotificationFlagManager $flagManager): self { - $updateProfileCommand = new self($user->getPhonenumber()); + $updateProfileCommand = new self($user->getPhonenumber(), $user->getLocale()); foreach ($flagManager->getAllNotificationFlagProviders() as $provider) { $updateProfileCommand->setNotificationFlag( diff --git a/src/Bundle/ChillMainBundle/Action/User/UpdateProfile/UpdateProfileCommandHandler.php b/src/Bundle/ChillMainBundle/Action/User/UpdateProfile/UpdateProfileCommandHandler.php index 4c46e686e..08684b8c6 100644 --- a/src/Bundle/ChillMainBundle/Action/User/UpdateProfile/UpdateProfileCommandHandler.php +++ b/src/Bundle/ChillMainBundle/Action/User/UpdateProfile/UpdateProfileCommandHandler.php @@ -18,6 +18,7 @@ final readonly class UpdateProfileCommandHandler public function updateProfile(User $user, UpdateProfileCommand $command): void { $user->setPhonenumber($command->phonenumber); + $user->setLocale($command->locale); foreach ($command->notificationFlags as $flag => $values) { $user->setNotificationImmediately($flag, $values['immediate_email']); diff --git a/src/Bundle/ChillMainBundle/Entity/User.php b/src/Bundle/ChillMainBundle/Entity/User.php index 70b032238..b5539aa83 100644 --- a/src/Bundle/ChillMainBundle/Entity/User.php +++ b/src/Bundle/ChillMainBundle/Entity/User.php @@ -128,6 +128,12 @@ class User implements UserInterface, \Stringable, PasswordAuthenticatedUserInter #[ORM\Column(type: \Doctrine\DBAL\Types\Types::JSON, nullable: false, options: ['default' => '[]', 'jsonb' => true])] private array $notificationFlags = []; + /** + * User's preferred locale. + */ + #[ORM\Column(type: \Doctrine\DBAL\Types\Types::STRING, length: 5, nullable: false, options: ['default' => 'fr'])] + private string $locale = 'fr'; + /** * User constructor. */ @@ -716,7 +722,14 @@ class User implements UserInterface, \Stringable, PasswordAuthenticatedUserInter public function getLocale(): string { - return 'fr'; + return $this->locale; + } + + public function setLocale(string $locale): self + { + $this->locale = $locale; + + return $this; } #[Assert\Callback] diff --git a/src/Bundle/ChillMainBundle/Form/Type/UserLocaleType.php b/src/Bundle/ChillMainBundle/Form/Type/UserLocaleType.php new file mode 100644 index 000000000..8e9c7fa62 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Form/Type/UserLocaleType.php @@ -0,0 +1,43 @@ +availableLanguages as $languageCode) { + $choices[Languages::getName($languageCode)] = $languageCode; + } + + $resolver->setDefaults([ + 'choices' => $choices, + 'placeholder' => 'user.locale.placeholder', + 'required' => true, + 'label' => 'user.locale.label', + 'help' => 'user.locale.help', + ]); + } + + public function getParent(): string + { + return ChoiceType::class; + } +} diff --git a/src/Bundle/ChillMainBundle/Form/UpdateProfileType.php b/src/Bundle/ChillMainBundle/Form/UpdateProfileType.php index 6aa8f0943..3806facb9 100644 --- a/src/Bundle/ChillMainBundle/Form/UpdateProfileType.php +++ b/src/Bundle/ChillMainBundle/Form/UpdateProfileType.php @@ -14,6 +14,7 @@ namespace Chill\MainBundle\Form; use Chill\MainBundle\Action\User\UpdateProfile\UpdateProfileCommand; use Chill\MainBundle\Form\Type\ChillPhoneNumberType; use Chill\MainBundle\Form\Type\NotificationFlagsType; +use Chill\MainBundle\Form\Type\UserLocaleType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -26,6 +27,7 @@ class UpdateProfileType extends AbstractType ->add('phonenumber', ChillPhoneNumberType::class, [ 'required' => false, ]) + ->add('locale', UserLocaleType::class) ->add('notificationFlags', NotificationFlagsType::class) ; } diff --git a/src/Bundle/ChillMainBundle/Notification/Email/NotificationMailer.php b/src/Bundle/ChillMainBundle/Notification/Email/NotificationMailer.php index 2f888ffd5..1cb64ff4a 100644 --- a/src/Bundle/ChillMainBundle/Notification/Email/NotificationMailer.php +++ b/src/Bundle/ChillMainBundle/Notification/Email/NotificationMailer.php @@ -24,6 +24,8 @@ use Symfony\Component\Mime\Email; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Contracts\Translation\TranslatorInterface; +// use Symfony\Component\Translation\LocaleSwitcher; + readonly class NotificationMailer { public function __construct( @@ -31,6 +33,7 @@ readonly class NotificationMailer private LoggerInterface $logger, private MessageBusInterface $messageBus, private TranslatorInterface $translator, + // private LocaleSwitcher $localeSwitcher, ) {} public function postPersistComment(NotificationComment $comment, PostPersistEventArgs $eventArgs): void @@ -56,7 +59,7 @@ readonly class NotificationMailer $email ->to($dest->getEmail()) ->subject('Re: '.$comment->getNotification()->getTitle()) - ->textTemplate('@ChillMain/Notification/email_notification_comment_persist.fr.md.twig') + ->textTemplate('@ChillMain/Notification/email_notification_comment_persist.md.twig') ->context([ 'comment' => $comment, 'dest' => $dest, @@ -137,13 +140,53 @@ readonly class NotificationMailer return; } + // Implementation with LocaleSwitcher (commented out - to be activated after migration to sf7.2): + /* + $this->localeSwitcher->runWithLocale($addressee->getLocale(), function () use ($notification, $addressee) { + if ($notification->isSystem()) { + $email = new Email(); + $email->text($notification->getMessage()); + } else { + $email = new TemplatedEmail(); + $email + ->textTemplate('@ChillMain/Notification/email_non_system_notification_content.md.twig') + ->context([ + 'notification' => $notification, + 'dest' => $addressee, + ]); + } + + $email + ->subject($notification->getTitle()) + ->to($addressee->getEmail()); + + try { + $this->mailer->send($email); + $this->logger->info('[NotificationMailer] Email sent successfully', [ + 'notification_id' => $notification->getId(), + 'addressee_email' => $addressee->getEmail(), + 'locale' => $addressee->getLocale(), + ]); + } catch (TransportExceptionInterface $e) { + $this->logger->warning('[NotificationMailer] Could not send an email notification', [ + 'to' => $addressee->getEmail(), + 'notification_id' => $notification->getId(), + 'error_message' => $e->getMessage(), + 'error_trace' => $e->getTraceAsString(), + ]); + throw $e; + } + }); + */ + + // Current implementation: if ($notification->isSystem()) { $email = new Email(); $email->text($notification->getMessage()); } else { $email = new TemplatedEmail(); $email - ->textTemplate('@ChillMain/Notification/email_non_system_notification_content.fr.md.twig') + ->textTemplate('@ChillMain/Notification/email_non_system_notification_content.md.twig') ->context([ 'notification' => $notification, 'dest' => $addressee, @@ -182,9 +225,43 @@ readonly class NotificationMailer return; } + // Implementation with LocaleSwitcher (commented out - to be activated after migration to sf7.2): + /* + $this->localeSwitcher->runWithLocale($user->getLocale(), function () use ($user, $notifications) { + $email = new TemplatedEmail(); + $email + ->htmlTemplate('@ChillMain/Notification/email_daily_digest.md.twig') + ->context([ + 'user' => $user, + 'notifications' => $notifications, + 'notification_count' => count($notifications), + ]) + ->subject($this->translator->trans('notification.Daily Notification Digest')) + ->to($user->getEmail()); + + try { + $this->mailer->send($email); + $this->logger->info('[NotificationMailer] Daily digest email sent successfully', [ + 'user_email' => $user->getEmail(), + 'notification_count' => count($notifications), + 'locale' => $user->getLocale(), + ]); + } catch (TransportExceptionInterface $e) { + $this->logger->warning('[NotificationMailer] Could not send daily digest email', [ + 'to' => $user->getEmail(), + 'notification_count' => count($notifications), + 'error_message' => $e->getMessage(), + 'error_trace' => $e->getTraceAsString(), + ]); + throw $e; + } + }); + */ + + // Current implementation: $email = new TemplatedEmail(); $email - ->htmlTemplate('@ChillMain/Notification/email_daily_digest.fr.md.twig') + ->htmlTemplate('@ChillMain/Notification/email_daily_digest.md.twig') ->context([ 'user' => $user, 'notifications' => $notifications, @@ -222,7 +299,7 @@ readonly class NotificationMailer $email = new TemplatedEmail(); $email - ->textTemplate('@ChillMain/Notification/email_non_system_notification_content_to_email.fr.md.twig') + ->textTemplate('@ChillMain/Notification/email_non_system_notification_content_to_email.md.twig') ->context([ 'notification' => $notification, 'dest' => $emailAddress, diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_daily_digest.fr.md.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_daily_digest.md.twig similarity index 100% rename from src/Bundle/ChillMainBundle/Resources/views/Notification/email_daily_digest.fr.md.twig rename to src/Bundle/ChillMainBundle/Resources/views/Notification/email_daily_digest.md.twig diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.fr.md.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.md.twig similarity index 88% rename from src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.fr.md.twig rename to src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.md.twig index 62e41860b..023f2901a 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.fr.md.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.md.twig @@ -14,7 +14,7 @@ Vous pouvez visualiser la notification et y répondre ici: -{{ absolute_url(path('chill_main_notification_show', {'_locale': 'fr', 'id': notification.id }, false)) }} +{{ absolute_url(path('chill_main_notification_show', {'_locale': dest.locale, 'id': notification.id }, false)) }} -- Le logiciel Chill diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content_to_email.fr.md.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content_to_email.md.twig similarity index 100% rename from src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content_to_email.fr.md.twig rename to src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content_to_email.md.twig diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.fr.md.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.md.twig similarity index 87% rename from src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.fr.md.twig rename to src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.md.twig index b1244da39..e7e212492 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.fr.md.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.md.twig @@ -13,7 +13,7 @@ Commentaire: Vous pouvez visualiser la notification et y répondre ici: -{{ absolute_url(path('chill_main_notification_show', {'_locale': 'fr', 'id': comment.notification.id }, false)) }} +{{ absolute_url(path('chill_main_notification_show', {'_locale': dest.locale, 'id': comment.notification.id }, false)) }} -- Le logiciel Chill diff --git a/src/Bundle/ChillMainBundle/Resources/views/User/profile.html.twig b/src/Bundle/ChillMainBundle/Resources/views/User/profile.html.twig index 0b268af03..266f75115 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/User/profile.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/User/profile.html.twig @@ -44,6 +44,7 @@
{{ form_start(form) }} {{ form_row(form.phonenumber) }} + {{ form_row(form.locale) }}

{{ 'user.profile.notification_preferences'|trans }}

diff --git a/src/Bundle/ChillMainBundle/Resources/views/Workflow/workflow_notification_on_transition_completed_content.fr.txt.twig b/src/Bundle/ChillMainBundle/Resources/views/Workflow/workflow_notification_on_transition_completed_content.fr.txt.twig index 03ddad84f..2b4beb42b 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Workflow/workflow_notification_on_transition_completed_content.fr.txt.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Workflow/workflow_notification_on_transition_completed_content.fr.txt.twig @@ -1,16 +1,16 @@ {{ dest.label }}, -Un suivi "{{ workflow.text }}" a atteint une nouvelle étape: {{ workflow.text }} +{{ 'workflow.notification.content.new_step_reached'|trans({'%workflow%': workflow.text}) }} -Titre du workflow: "{{ title }}". +{{ 'workflow.notification.content.workflow_title'|trans({'%title%': title}) }} {% if is_dest %} -Vous êtes invités à valider cette étape au plus tôt. +{{ 'workflow.notification.content.validation_needed'|trans }} {% endif %} -Vous pouvez visualiser le workflow sur cette page: +{{ 'workflow.notification.content.view_workflow'|trans }} -{{ absolute_url(path('chill_main_workflow_show', {'id': entity_workflow.id, '_locale': 'fr'})) }} +{{ absolute_url(path('chill_main_workflow_show', {'id': entity_workflow.id, '_locale': dest.locale|default('fr')})) }} -Cordialement, +{{ 'workflow.notification.content.regards'|trans }} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Workflow/workflow_notification_on_transition_completed_title.fr.txt.twig b/src/Bundle/ChillMainBundle/Resources/views/Workflow/workflow_notification_on_transition_completed_title.fr.txt.twig index 9a6bc70a0..0d266cbac 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Workflow/workflow_notification_on_transition_completed_title.fr.txt.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Workflow/workflow_notification_on_transition_completed_title.fr.txt.twig @@ -1,5 +1,5 @@ {%- if is_dest -%} -Un suivi {{ workflow.text }} demande votre attention: {{ title }} +{{ 'workflow.notification.title.attention_needed'|trans({'%workflow%': workflow.text, '%title%': title}) }} {%- else -%} -Un suivi {{ workflow.text }} a atteint une nouvelle étape: {{ place.text }}: {{ title }} +{{ 'workflow.notification.title.new_step'|trans({'%workflow%': workflow.text, '%place%': place.text, '%title%': title}) }} {%- endif -%} diff --git a/src/Bundle/ChillMainBundle/Security/PasswordRecover/RecoverPasswordHelper.php b/src/Bundle/ChillMainBundle/Security/PasswordRecover/RecoverPasswordHelper.php index b325a9345..7ef9eadb2 100644 --- a/src/Bundle/ChillMainBundle/Security/PasswordRecover/RecoverPasswordHelper.php +++ b/src/Bundle/ChillMainBundle/Security/PasswordRecover/RecoverPasswordHelper.php @@ -16,11 +16,13 @@ use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +// use Symfony\Component\Translation\LocaleSwitcher; + class RecoverPasswordHelper { final public const RECOVER_PASSWORD_ROUTE = 'password_recover'; - public function __construct(private readonly TokenManager $tokenManager, private readonly UrlGeneratorInterface $urlGenerator, private readonly MailerInterface $mailer) {} + public function __construct(private readonly TokenManager $tokenManager, private readonly UrlGeneratorInterface $urlGenerator, private readonly MailerInterface $mailer/* , private readonly LocaleSwitcher $localeSwitcher */) {} /** * @param bool $absolute @@ -53,6 +55,24 @@ class RecoverPasswordHelper throw new \UnexpectedValueException('No emaail associated to the user'); } + // Implementation with LocaleSwitcher (commented out - to be activated after migration to sf7.2): + /* + $this->localeSwitcher->runWithLocale($user->getLocale(), function () use ($user, $expiration, $template, $templateParameters, $emailSubject, $additionalUrlParameters) { + $email = (new TemplatedEmail()) + ->subject($emailSubject) + ->to($user->getEmail()) + ->textTemplate($template) + ->context([ + 'user' => $user, + 'url' => $this->generateUrl($user, $expiration, true, $additionalUrlParameters), + ...$templateParameters, + ]); + + $this->mailer->send($email); + }); + */ + + // Current implementation: $email = (new TemplatedEmail()) ->subject($emailSubject) ->to($user->getEmail()) diff --git a/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/NotificationToUserGroupsOnTransition.php b/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/NotificationToUserGroupsOnTransition.php index 1eebb03a6..dad18a30c 100644 --- a/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/NotificationToUserGroupsOnTransition.php +++ b/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/NotificationToUserGroupsOnTransition.php @@ -22,6 +22,8 @@ use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Workflow\Event\Event; use Symfony\Component\Workflow\Registry; +// use Symfony\Component\Translation\LocaleSwitcher; + final readonly class NotificationToUserGroupsOnTransition implements EventSubscriberInterface { public function __construct( @@ -31,6 +33,7 @@ final readonly class NotificationToUserGroupsOnTransition implements EventSubscr private MailerInterface $mailer, private EntityManagerInterface $entityManager, private EntityWorkflowManager $entityWorkflowManager, + // private LocaleSwitcher $localeSwitcher, ) {} public static function getSubscribedEvents(): array @@ -87,6 +90,24 @@ final readonly class NotificationToUserGroupsOnTransition implements EventSubscr 'title' => $title, ]; + // Implementation with LocaleSwitcher (commented out - to be activated after migration to sf7.2): + // Note: This sends emails to user groups, not individual users, so locale switching may use default locale + /* + $this->localeSwitcher->runWithLocale('fr', function () use ($context, $userGroup) { + $email = new TemplatedEmail(); + $email + ->htmlTemplate('@ChillMain/Workflow/workflow_notification_on_transition_completed_content_to_user_group.fr.txt.twig') + ->context($context) + ->subject( + $this->engine->render('@ChillMain/Workflow/workflow_notification_on_transition_completed_title.fr.txt.twig', $context) + ) + ->to($userGroup->getEmail()); + + $this->mailer->send($email); + }); + */ + + // Current implementation: $email = new TemplatedEmail(); $email ->htmlTemplate('@ChillMain/Workflow/workflow_notification_on_transition_completed_content_to_user_group.fr.txt.twig') diff --git a/src/Bundle/ChillMainBundle/config/services/form.yaml b/src/Bundle/ChillMainBundle/config/services/form.yaml index e917b37c9..ab7a49c68 100644 --- a/src/Bundle/ChillMainBundle/config/services/form.yaml +++ b/src/Bundle/ChillMainBundle/config/services/form.yaml @@ -12,6 +12,12 @@ services: tags: - { name: form.type, alias: translatable_string } + Chill\MainBundle\Form\Type\UserLocaleType: + arguments: + - "%chill_main.available_languages%" + tags: + - { name: form.type } + chill.main.form.type.select2choice: class: Chill\MainBundle\Form\Type\Select2ChoiceType tags: diff --git a/src/Bundle/ChillMainBundle/migrations/Version20251022140718.php b/src/Bundle/ChillMainBundle/migrations/Version20251022140718.php new file mode 100644 index 000000000..733bf5da1 --- /dev/null +++ b/src/Bundle/ChillMainBundle/migrations/Version20251022140718.php @@ -0,0 +1,33 @@ +addSql('ALTER TABLE users ADD locale VARCHAR(5) DEFAULT \'fr\' NOT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE users DROP locale'); + } +} diff --git a/src/Bundle/ChillMainBundle/translations/messages.fr.yml b/src/Bundle/ChillMainBundle/translations/messages.fr.yml index de0027dd7..b6343312e 100644 --- a/src/Bundle/ChillMainBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillMainBundle/translations/messages.fr.yml @@ -56,6 +56,10 @@ user: no job: Pas de métier assigné no scope: Pas de service assigné notification_preferences: Préférences pour mes notifications + locale: + label: Langue de communication + help: Langue utilisée pour les notifications par email et autres communications. + placeholder: Choisissez une langue user_group: inactive: Inactif @@ -668,6 +672,17 @@ workflow: reject_are_you_sure: Êtes-vous sûr de vouloir rejeter la signature de %signer% waiting_for: En attente de modification de l'état de la signature + notification: + title: + attention_needed: "Attention requise dans le workflow %workflow% pour %title%" + new_step: "Nouvelle étape dans le workflow %workflow% (%place%) pour %title%" + content: + new_step_reached: "Une nouvelle étape a été atteinte dans le workflow %workflow%." + workflow_title: "Titre du workflow : %title%" + validation_needed: "Votre validation est nécessaire pour cette étape." + view_workflow: "Vous pouvez consulter le workflow ici :" + regards: "Cordialement," + attachments: title: Pièces jointes no_attachment: Aucune pièce jointe @@ -747,7 +762,22 @@ notification: greeting: "Bonjour %user%" intro: "Vous avez reçu %notification_count% nouvelle(s) notification(s)." view_notification: "Vous pouvez visualiser la notification et y répondre ici:" - signature: "Le logiciel Chill" + signature: "L'équipe Chill" + +daily_notifications: "{1}Vous avez 1 nouvelle notification.|]1,Inf[Vous avez %notification_count% nouvelles notifications." + +docgen: + failure_email: + "The generation of a document failed": "La génération d'un document a échoué" + "The generation of the document %template_name% failed": "La génération du document %template_name% a échoué" + "Forward this email to your administrator for solving": "Transmettez cet email à votre administrateur pour résolution" + "References": "Références" + "The following errors were encoutered": "Les erreurs suivantes ont été rencontrées" + data_dump_email: + subject: "Export de données disponible" + "Dear": "Cher utilisateur," + "data_dump_ready_and_attached": "Votre export de données est prêt et joint à cet email." + "filename": "Nom du fichier : %filename%" CHILL_MAIN_COMPOSE_EXPORT: Exécuter des exports et les sauvegarder CHILL_MAIN_GENERATE_SAVED_EXPORT: Exécuter et modifier des exports préalablement sauvegardés diff --git a/src/Bundle/ChillMainBundle/translations/messages.nl.yml b/src/Bundle/ChillMainBundle/translations/messages.nl.yml index 22bb6a50e..f545f7396 100644 --- a/src/Bundle/ChillMainBundle/translations/messages.nl.yml +++ b/src/Bundle/ChillMainBundle/translations/messages.nl.yml @@ -46,6 +46,14 @@ No title: Geen titel User profile: Mijn gebruikersprofiel Phonenumber successfully updated!: Telefoonnummer bijgewerkt! +user: + locale: + label: Communicatietaal + help: Taal gebruikt voor e-mailmeldingen en andere communicatie. + placeholder: Kies een taal + choice: + french: Français + dutch: Nederlands Edit: Bewerken Update: Updaten @@ -423,6 +431,17 @@ workflow: For: Pour Cc: Cc + notification: + title: + attention_needed: "Aandacht vereist in workflow %workflow% voor %title%" + new_step: "Nieuwe stap in workflow %workflow% (%place%) voor %title%" + content: + new_step_reached: "Een nieuwe stap is bereikt in workflow %workflow%." + workflow_title: "Workflow titel: %title%" + validation_needed: "Uw validatie is nodig voor deze stap." + view_workflow: "U kunt de workflow hier bekijken:" + regards: "Met vriendelijke groeten," + Subscribe final: Recevoir une notification à l'étape finale Subscribe all steps: Recevoir une notification à chaque étape