{% load i18n %} {% if nodes|length > 1 or top_jails or top_countries %}
{% if nodes|length > 1 %} {% comment %} Heartbeat (last_seen) n'est mis à jour que par master_listen, qui ne tourne que sur le master : sur un noeud simple, NodeRegistry ne contient jamais que lui-même — ce bloc n'a de sens que là où plusieurs noeuds sont effectivement suivis. {% endcomment %}
{% trans "Noeuds" %}
{% for node in nodes %}
{% if node.dashboard_url %} {{ node.display_name }} {% else %} {{ node.display_name }} {% endif %} {{ node.last_seen|timesince }}
{% endfor %}
{% endif %} {% if top_jails %}
{% trans "Top jails" %}
{% for row in top_jails %}
{{ row.jail_name }} {{ row.count }}
{% endfor %} {% endif %} {% if top_countries %}
{% trans "Top pays attaquants" %}
{% for row in top_countries %}
{{ row.country }} {{ row.count }}
{% endfor %} {% endif %}
{% endif %} {% comment %} Sélecteur de langue (Phase 5) — POST vers la vue set_language intégrée de Django (config/urls.py, path("i18n/...")), qui pose le cookie django_language lu par LocaleMiddleware à chaque requête suivante. Auto-soumis au changement, pas de bouton "Valider" séparé. {% endcomment %}
{% csrf_token %}