{% extends 'base.html.twig' %} {% block title %}{{ 'login.title'|trans }} - {{ 'app.portal'|trans }}{% endblock %} {% block body %}

{{ 'app.name'|trans }}

{{ 'app.portal'|trans }}

{# Choix de la langue avant connexion (mémorisé en session par LocaleSubscriber) ; une fois connecté, c'est la langue du compte qui s'applique. #}

{% for locale in ['fr', 'en', 'zh'] %} {{ ('lang.' ~ locale)|trans }} {% endfor %}

{% if error %}
{{ error.messageKey|trans(error.messageData, 'security') }}
{% endif %} {# action explicite vers check_path : login_path (GET, cette page) et check_path (POST, intercepté par le firewall) sont deux routes distinctes — sans action, le formulaire se soumettait à lui-même et aucune authentification n'était tentée (régression vue côté Radar le 2026-09-22). #}
{% if app.environment == 'dev' %} {% endif %}
{% endblock %}