Files
eminuxandCursor cc95fcacbf Permette all’admin di forzare anagrafica, fiscali, owner, staff e inviti.
Ops può correggere dati clienti errati (es. email titolare) dalla scheda società senza interventi manuali sul DB.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 18:18:18 +02:00

675 lines
27 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
fr:
admin:
layout:
title: "Match Live TV — Admin"
nav:
dashboard: Tableau de bord
ops: Ops
announcements: Alertes
clubs: Clubs et équipes
billing: Facturation
youtube: YouTube
sessions: Sessions
stream_concurrency: Abus de compte
analytics: Analytics
costs: Coûts
stream_nodes: Nœuds stream
password: Mot de passe
logout: Déconnexion
flash:
login_required: Connectez-vous pour continuer
login_success: Connexion réussie
invalid_credentials: Nom d'utilisateur ou mot de passe invalide
logout_success: Déconnecté
password_current_incorrect: Le mot de passe actuel est incorrect
password_too_short: Le nouveau mot de passe doit contenir au moins 8 caractères
password_too_long: Le nouveau mot de passe ne peut pas dépasser 72 caractères
password_too_weak: "Le nouveau mot de passe doit inclure au moins 3 parmi : minuscules, majuscules, chiffres et symboles"
password_same_as_current: "Le nouveau mot de passe doit être différent de l'actuel"
password_mismatch: Les mots de passe ne correspondent pas
password_updated: Mot de passe mis à jour
ops_acknowledged: Incident pris en charge
ops_resolved: Incident résolu
ops_muted: Notifications suspendues pendant 24 heures
stream_node_created: "Nœud lab %{slug} provisionné."
stream_node_destroyed: "Nœud %{slug} supprimé."
stream_node_draining: "Nœud %{slug} en drain."
autoscale_kill_on: "Kill-switch autoscaler activé. Pas de scale-out automatique."
autoscale_kill_off: "Kill-switch autoscaler désactivé (nécessite aussi STREAM_AUTOSCALE_ENABLED=1)."
comped_granted: "Abonnement offert %{plan} activé pour %{club}."
comped_revoked: "Abonnement offert révoqué pour %{club}."
session_already_terminated: "Session déjà terminée (%{status})."
session_stopped: Session terminée.
session_stop_error: "Erreur lors de la fermeture : %{error}"
session_terminated_no_regia: "Session terminée : impossible de générer le lien de régie."
session_regia_generated: Lien de régie généré.
invoice_upload_hint: Chargez le PDF depuis la liste « Paiements à facturer ».
invoice_draft_created: Brouillon créé. Chargez le PDF depuis la page Facturation ou ci-dessous.
invoice_issued: "Facture %{number} émise et envoyée à %{email}."
invoice_updated: "Facture %{number} mise à jour."
invoice_uploaded: "Facture chargée et envoyée à %{email}."
club_updated: "Données mises à jour pour %{club}."
youtube_not_configured: Configurez YOUTUBE_CLIENT_ID et YOUTUBE_CLIENT_SECRET dans .env
announcement_created: Alerte enregistrée
announcement_updated: Alerte mise à jour
announcement_destroyed: Alerte supprimée
cost_entry_created: Poste de coût enregistré.
cost_entry_updated: Poste de coût mis à jour.
cost_entry_destroyed: Poste de coût supprimé.
common:
free_plan: Free
yes: "Oui"
no: "Non"
dash: "—"
live_page: Page en direct
auth:
new:
title: Connexion admin
username_label: Nom d'utilisateur
password_label: Mot de passe
submit: Se connecter
initial_credentials_html: "Identifiants initiaux : <code>admin</code> / <code>AdminPass123</code>. Changez le mot de passe après la première connexion."
passwords:
edit:
title: Changer le mot de passe
current_password_label: Mot de passe actuel
new_password_label: "Nouveau mot de passe (min. 8, au moins 3 types de caractères)"
confirm_password_label: Confirmer le nouveau mot de passe
submit: Enregistrer le mot de passe
cancel: Annuler
dashboard:
kpi:
active_sessions: Sessions actives
active_sessions_sub: en direct maintenant
today: Diffusées aujourd'hui
today_sub: "%{duration} de diffusion"
month: Diffusées ce mois-ci
month_sub: "%{duration} au total"
teams: Équipes
teams_sub: "%{count} utilisateurs"
cpu: CPU
cpu_sub: "charge %{one} / %{five} / %{fifteen}"
ram: RAM
ram_sub: "%{used} / %{total}"
network: Bande passante (totale)
network_sub: "↑ %{tx} · ↓ %{rx}"
recordings: Replays archivés
recordings_sub: "%{count} enregistrements"
charts:
cpu: CPU (%)
ram: RAM (%)
ops_panel:
title: État de la plateforme (Ops)
critical: "%{count} incident(s) critique(s) ouvert(s)"
view_dashboard: Voir le tableau de bord Ops
warnings: "%{count} avertissement(s)"
dashboard_link: Tableau de bord Ops
none_html: "Aucun incident ouvert. %{link}"
concurrency_panel:
title: Abus de compte (deuxième direct)
count: "%{count} tentative(s) sur les 30 derniers jours"
view_all: Voir tout
none: Aucune tentative enregistrée.
none_html: "Aucune tentative de second direct avec le même compte. %{link}"
disk:
system_title: Disque système
free_label: "Libre : %{free} (%{percent}% utilisé)"
not_available: Métriques disque non disponibles
recordings_title: Archive des enregistrements
recordings_content: "Contenu des enregistrements : %{size}"
recordings_not_mounted: "Chemin %{path} non monté"
sessions:
title: Sessions actives
table:
match: Match
status: Statut
client: Client
ingest: Ingest
start: Début
link: Lien
none: Aucune session active pour le moment.
detail: Détail
stop: Arrêter
stop_confirm: Terminer cette session ?
regia: Régie
teams:
title: Équipes
matches_count: "%{count} matchs"
view_all: "Voir les clubs (%{count} équipes)"
stream_nodes:
title: Nœuds streaming
providers: "Cloud: %{cloud} · DNS: %{dns}"
actions_title: Actions
table_title: Nœuds enregistrés
empty: Aucun nœud enregistré.
free_slots:
one: "%{count} libre"
other: "%{count} libres"
kpi:
autoscaler: Autoscaler
kill_switch: KILL
kind: "mode %{kind}"
free_slots: Slots libres
soft_slots: "seuil soft ≤ %{soft}"
spare: Spare
warm_spare: warm spares prêts
overflow: Overflow
overflow_nodes: nœuds cloud/lab
budget: Budget estimé
budget_of: "sur €%{budget}/mois (%{ok})"
autoscale: "Autoscaler %{enabled} · free_slots=%{free} (soft≤%{soft}) · spare=%{spare}/%{warm} · overflow=%{overflow}/%{max} · kind=%{kind}"
autoscale_budget: "budget €%{eur}/€%{budget} (%{ok})"
kill_switch_active: "KILL-SWITCH ACTIF"
engage_kill_switch: "Kill-switch ON"
clear_kill_switch: "Kill-switch OFF"
kill_switch_confirm: "Bloquer immédiatement l'autoscaler ?"
provision_lab: Provisionner lab
provision_cloud: Provisionner Hetzner
provision_cloud_confirm: "Créer un serveur Hetzner Cloud + DNS sur mltv-stream.net ?"
hetzner_token_missing: "Définir HCLOUD_TOKEN pour activer le provisioning Cloud."
drain: Drain
destroy: Supprimer
destroy_confirm: "Supprimer le nœud %{slug} ?"
hosts_title: DNS lab (/etc/hosts)
col:
slug: Slug
role: Rôle
status: Statut
slots: Slots
hostname: Hostname
provider: Provider
ops:
kpi:
critical: Critiques ouverts
warning: Avertissements ouverts
total: Total ouverts
open:
title: Incidents ouverts
table:
severity: Sévérité
kind: Type
title: Titre
occurrences: Occ.
last_seen: Dernier
none: Aucun incident ouvert. La plateforme semble saine.
actions:
acknowledge: Pris en charge
resolve: Résoudre
mute: Muet 24h
resolved:
title: Résolus (30 derniers jours)
table:
resolved_at: Résolu
none: Aucun incident résolu récemment.
stream_concurrency:
index:
title: Abus de compte
lead: Tentatives de démarrer un second direct avec le même compte alors quun autre était déjà en cours (connecting, live, reconnecting ou en pause).
results: "%{shown} sur %{total} affichés"
none: Aucune tentative enregistrée.
kpi:
lookback: 30 derniers jours
lookback_sub: tentatives bloquées
two_devices: Deux appareils
two_devices_sub: modèles de téléphone différents
filters:
q: Rechercher
q_placeholder: E-mail, club, match…
two_devices: Filtre
two_devices_hint: Uniquement les tentatives depuis des appareils différents
apply: Filtrer
reset: Réinitialiser
table:
when: Quand
account: Compte
club: Club
occupying: Direct déjà en cours
attempted: Tentative bloquée
action:
start: démarrage
resume: reprise
badge:
two_devices: 2 téléphones
same_or_unknown: même appareil / n. d.
clubs:
index:
title: Clubs et équipes
subtitle_html: "Abonnements offerts (sponsors / promotions) et statut YouTube par équipe. Paiements Stripe : %{billing_link}."
billing_link: Facturation
table:
club: Club
plan: Forfait
teams: Équipes
billing_profile: Données fiscales
comped: Offert
stripe: Stripe
quote: Convenu
manage: Gérer
invoices: Factures
show:
back: "← Clubs et équipes"
sport_label: "Sport : %{sport}"
recordings_archive: Archive des replays
billing_link: Paiements et factures
youtube_platform_link: Chaîne YouTube plateforme
youtube_club_label: "YouTube du club :"
youtube_connected: (connectée)
youtube_premium_full_not_connected: Premium Full — chaîne du club non connectée (utilise Match Live TV)
no_channel_hint_html: "Sans chaîne connectée, l'application utilise la chaîne Match Live TV. %{link}."
link_channel: Connecter la chaîne (page du club)
profile_title: Coordonnées et données fiscales
owner_title: Titulaire du compte
owner_name: Nom
owner_email: E-mail
owner_none: Aucun titulaire associé.
billing_title: Données de facturation
billing_none: Aucune donnée de facturation renseignée.
teams_title: Équipes
no_teams: Aucune équipe enregistrée.
table:
team: Équipe
sport: Sport
matches_and_details: Matchs et détails
replay: Replays
concurrency_title: Tentatives de second direct
concurrency_lead: Le même compte a tenté de démarrer un autre direct alors quun était déjà en cours.
concurrency_none: Aucune tentative enregistrée pour ce club.
concurrency_all: Voir tous les abus de compte
edit_link: Modifier les données
edit:
back: "← Retour au club"
title: "Modifier %{club}"
lead: "Forcez les données saisies par le client : profil, facturation, titulaire, staff, invitations et équipes."
cancel: Annuler
submit: Enregistrer
billing_hint: Vous pouvez enregistrer un profil incomplet ; le badge sur la fiche reflète l'état.
staff_hint: Utilisateurs déjà liés aux équipes du club.
staff_none: Aucun staff lié aux équipes.
invitations_hint: Uniquement les invitations encore en attente d'acceptation.
invitations_none: Aucune invitation en attente.
sections:
club: Profil du club
billing: Données de facturation
owner: Titulaire du compte
staff: Staff accepté
invitations: Invitations en attente
teams: Équipes
fields:
name: Nom du club
sport: Sport
primary_color: Couleur primaire
secondary_color: Couleur secondaire
logo_url: URL du logo
owner_name: Nom du titulaire
owner_email: E-mail du titulaire
staff_name: Nom
staff_email: E-mail
invitation_team: Équipe
invitation_email: E-mail d'invitation
team_name: Nom de l'équipe
team_sport: Sport de l'équipe
errors:
owner_missing: Aucun titulaire associé à ce club.
email_taken: "E-mail déjà utilisé : %{email}"
billing_status:
complete: Complet
incomplete: Incomplet
absent: Absentes
comped:
title: Abonnement offert
description: "Sponsor ou promotion : accordez Premium Light/Full sans paiement Stripe. Révocable à tout moment."
active_label: "Actif :"
since_label_html: "Depuis le %{date}"
by_admin: "· admin %{username}"
stripe_note: "Remarque : un abonnement Stripe lié existe également ; l'offre est prioritaire sur le forfait."
revoke_button: Révoquer l'offre (retour à Free ou restauration Stripe)
revoke_confirm: "Révoquer l'abonnement offert pour %{club} ?"
current_plan: "Forfait actuel : %{plan}"
stripe_active: "· paiement Stripe actif"
plan_label: Forfait
reason_label: "Motif (ex. sponsor 2026)"
reason_placeholder: "Sponsor, promotion…"
grant_button: Accorder l'offre
teams:
show:
back: "← %{club}"
sport_label: "Sport : %{sport}"
club_label_html: "Club : %{club} · %{replay_link} · %{billing_link}"
replay_link: Replays de l'équipe
billing_link: Paiements et factures
youtube_label: "YouTube :"
youtube_platform_default_no_oauth: ", par défaut sans OAuth du club"
youtube_platform_channel: "(chaîne plateforme%{suffix})"
youtube_club_channel: (chaîne du club)
youtube_not_ready: non prête
no_channel_hint_html: "Sans chaîne connectée, l'application utilise la chaîne Match Live TV. %{link}."
link_channel: Connecter la chaîne (page du club)
matches_title: Matchs
sessions:
index:
title: Sessions de diffusion
lead: Recherchez par club, équipe, adversaire ou lieu. Filtrez par statut, plateforme, nœud et période.
results: "%{shown} sur %{total} affichées"
none: Aucune session ne correspond à ces filtres.
filters:
q: Recherche
q_placeholder: Club, équipe, adversaire…
status: Statut
platform: Plateforme
club: Club
node: Nœud ingest
from: Du
to: Au
any: Tous
apply: Filtrer
reset: Réinitialiser
table:
club: Club
match: Match
status: Statut
started: Début
ended: Fin
duration: Durée
ingest: Ingest
disconnects: Déconnexions
client: Client
link: Lien
detail: Détail
regia: Régie
show:
title: "Session %{id}"
heading: Détail de la session
back: "← Retour aux sessions"
club_label: "Club :"
summary_title: Résumé
timing_title: Horaires
ingest_title: Ingest et médias
devices_title: Appareils
events_title: Événements
events_none: Aucun événement enregistré.
concurrency_title: Tentatives de second direct
concurrency_lead: Ce compte a tenté de démarrer un autre direct alors que celui-ci était déjà en cours (ou a été bloqué par une autre session du même compte).
status_label: "Statut :"
stop_button: Terminer la session
stop_confirm: "Terminer la diffusion ? Le chemin RTMP sera supprimé et le statut passera à terminé."
match_label: "Match : %{team} contre %{opponent}"
youtube_studio: YouTube Studio
broadcast: Diffusion
open_replays: Ouvrir les replays du club
audio_muted: Audio coupé
audio_on: Audio actif
ingest_node: "Nœud ingest :"
rtmp_ingest: "Ingestion RTMP :"
fields:
id: ID
club: Club
team: Équipe
opponent: Adversaire
operator: Opérateur
platform: Plateforme
client_os: Système
app_version: Version app
device: Appareil
os_version: Version OS
carrier: Opérateur mobile
privacy: Confidentialité
quality: Qualité
min_quality: Qualité mini
audio: Audio
created: Créée
started: Début
ended: Fin
duration: Durée
disconnects: Déconnexions
scheduled: Match programmé
location: Lieu
node: Nœud
rtmp: Ingestion RTMP
hls: HLS
recording: Replay
devices:
role: Rôle
network: Réseau
battery: Batterie
bitrate: Débit
fps: FPS
last_seen: Dernier contact
table:
type: Type
when: Quand
meta: Détails
links:
watch_title: Lien en direct
none: Aucun lien vidéo disponible pour cette session.
regia_title: Lien de régie
terminated: Session terminée — lien de régie non disponible.
regia_label: Régie
valid_until: "Valide jusqu'au %{date}"
active_exists: Un lien de régie actif existe déjà (l'URL n'est pas récupérable). Générez-en un nouveau si vous devez le repartager.
none_active: Aucun lien de régie actif. Générez un lien à partager avec la personne qui gère le score.
generate_button: Générer le lien de régie
ingest:
none: "—"
decommissioned: "(nœud retiré)"
role:
home: Home-lab
lab: Lab
cloud: Hetzner
analytics:
missing_path: Sélectionnez une page.
filters:
from: Du
to: Au
device: Appareil
any: Tous
apply: Filtrer
reset: Réinitialiser
chart_path: Page (graphique)
chart_path_all: Toutes les pages
layer: Couche
layer_move: Mouvements souris
layer_click: Clics
devices:
mobile: Mobile
tablet: Tablette
desktop: Ordinateur
index:
title: Analytics du site
lead: Heatmaps mouvements/clics et scroll agrégés (first-party), uniquement avec consentement statistiques. Aucune donnée personnelle.
none: Aucune donnée sur la période sélectionnée.
heatmap: Heatmap
chart_for_path: Graphique
trend_title: Évolution des pages vues
trend_lead: Total des pages vues sur toutes les pages, jour par jour. Mêmes filtres De / À / Appareil. Choisissez une page dans le filtre ou cliquez « Graphique » dans le tableau.
trend_lead_path: "Pages vues jour par jour pour %{path} uniquement (mêmes filtres De / À / Appareil)."
trend_total_label: Pages vues totales (toutes les pages)
trend_total_label_path: Pages vues de la page sélectionnée
trend_total_hint: "%{from} → %{to}"
hide_chart: Masquer le graphique
show_chart: Afficher le graphique
pages_title: Détail par page
pages_lead: Pages vues et engagement sur la période filtrée, par chemin. « Graphique » montre l’évolution dune page.
table:
path: Page
pageviews: Pages vues
moves: Mouvements
clicks: Clics
avg_scroll: Scroll moyen
max_scroll: Scroll max
show:
title: Heatmap de page
back: "← Retour aux Analytics"
summary: Résumé
scroll_depth: Profondeur de scroll
scroll_hint: "Moyenne %{avg}% · maximum %{max}%"
heatmap_moves: Carte des mouvements
heatmap_clicks: Carte des clics
heatmap_hint: Superposition colorée sur la capture %{device}. Vert = faible, rouge = fort. Les données ne sont pas mélangées entre appareils.
device_tabs_label: Appareil
preview_title: Capture de page
preview_unavailable: Aperçu indisponible pour les chemins avec placeholder (ex. /clubs/:id).
snapshot_missing: Pas encore de capture pour %{device}. Visitez la page sur cet appareil avec consentement analytics, puis réessayez.
snapshot_meta: "Capture %{device} · %{at}"
no_points: Aucun point agrégé pour cette couche sur la période.
heatmap_title: Carte des clics
no_clicks: Aucun clic agrégé pour cette page sur la période.
preview:
title: Aperçu sans suivi
lead: Parcourez le site public sans enregistrer pages vues, clics, mouvements ni captures heatmap. Utile pour tester en production.
active: Aperçu staff actif sur ce navigateur (7 jours ou jusqu'à désactivation).
enable: Activer l'aperçu staff
disable: Désactiver l'aperçu
open_site: Ouvrir le site
enabled: Aperçu staff activé. Ce navigateur ne enregistrera pas d'analytics.
disabled: Aperçu staff désactivé.
billing:
index:
title: Paiements à facturer
description: "Paiements Stripe payés sans PDF de facture. Générez le PDF dans vos systèmes, puis chargez-le ici : il sera associé au paiement et envoyé par email au client."
filter_label: "Filtrer par club :"
filter_all: Tous
incomplete_profile_warning: Données de facturation incomplètes
no_billing_data: Aucune donnée de facturation — le client doit compléter son profil.
pdf_label: PDF de la facture
upload_button: Charger le PDF et envoyer au client
none_pending: "Aucun paiement en attente de facturation%{club}."
none_pending_for_club: " pour %{club}"
uploaded_title: Factures déjà chargées
table:
date: Date
club: Club
description: Description
amount: Montant
invoice: Facture
status: Statut
back_dashboard: "← Tableau de bord"
billing_invoices:
index:
title: "Facturation — %{club}"
back_dashboard: "← Tableau de bord"
new_invoice: Nouvelle facture (sans paiement)
payments_title: Paiements
table:
date: Date
description: Description
amount: Montant
invoice: Facture
pdf_suffix: " (PDF)"
edit_send_pdf: Modifier / envoyer le PDF
create_invoice: Créer une facture
no_payments: Aucun paiement enregistré pour ce club.
all_invoices_title: Toutes les factures
table2:
number: Numéro
date: Date
amount: Montant
status: Statut
payment: Paiement
edit: Modifier
no_invoices: Aucune facture.
new:
title: "Nouvelle facture — %{club}"
linked_payment: "Liée au paiement du %{date} (%{amount})."
number_label: Numéro de facture
issued_on_label: Date d'émission
amount_label: "Montant (€)"
notes_label: Notes internes (facultatif)
hint: Enregistrez le brouillon, puis chargez le PDF et envoyez-le au client depuis l'écran suivant.
submit: Créer le brouillon de facture
back: "← Paiements et factures"
edit:
title: "Facture %{number} — %{club}"
status_label: "Statut :"
sent_at: "· Envoyée le %{date}"
number_label: Numéro de facture
issued_on_label: Date d'émission
amount_label: "Montant (€)"
payment_info: "Paiement : %{description} — %{amount}"
pdf_label: PDF de la facture
pdf_already: "PDF déjà chargé : %{filename}"
notes_label: Notes internes
save_draft: Enregistrer le brouillon
issue_send: Émettre et envoyer par email
issue_confirm: "Envoyer la facture à %{email} ?"
back: "← Paiements et factures"
youtube:
platform_token:
title: Jeton de la chaîne Match Live TV
page_title: "Jeton YouTube — Match Live TV"
channel_label: "Chaîne : %{title}"
success: "Connexion réussie. Copiez immédiatement cette ligne :"
env_hint_html: "Ajoutez dans <code>/opt/matchlivetv/infra/.env</code> :"
not_shown_again_html: "Elle ne sera plus affichée. Ensuite : <code>docker compose -f docker-compose.prod.yml restart rails sidekiq</code>"
no_refresh_token_html: "Google n'a pas renvoyé de refresh token. Dans <a href=\"https://myaccount.google.com/permissions\" target=\"_blank\" rel=\"noopener\">votre compte Google → accès aux applications</a>, révoquez « Match Live TV », puis recommencez depuis <a href=\"/admin/youtube/platform\">/admin/youtube/platform</a>."
back_dashboard: "← Tableau de bord admin"
club_recordings:
index:
title: "Replays — %{club}"
announcements:
index:
title: Alertes
lead: Messages vers les apps, le site public et l'espace connecté — maintenance, mises à jour ou communications.
new: Nouvelle alerte
table_title: Alertes
none: Aucune alerte. Créez-en une pour notifier les applications et le site.
new:
title: Nouvelle alerte
edit:
title: Modifier l'alerte
table:
status: Statut
kind: Type
title: Message
channels: Destinations
window: Fenêtre
actions:
edit: Modifier
delete: Supprimer
delete_confirm: Supprimer cette alerte ? Elle n'apparaîtra plus aux destinations choisies.
kind:
info: Information
maintenance: Maintenance
update: Mise à jour
severity:
info: Info
warning: Attention
critical: Critique
status:
draft: Brouillon
published: Publié
archived: Archivé
channels:
android: App Android
ios: App iOS
web_public: Site public
web_private: Espace connecté
window:
always: Toujours (tant que publié)
from: "À partir de %{time}"
until: "Jusqu'à %{time}"
form:
kind: Type
severity: Gravité
status: Statut
channels: Où l'afficher
channels_hint: "Choisissez une ou plusieurs destinations. Android et iOS sont indépendants : créez deux alertes si le texte doit différer. L'espace connecté est visible après connexion (club, équipes, compte)."
title: Titre
body: Texte
starts_at: Visible à partir de
ends_at: Visible jusqu'à
window_hint: Laissez vide pour afficher immédiatement tant que l'alerte est publiée.
action_url: Lien (facultatif)
action_url_hint: Pour une mise à jour, une URL vide ouvre le store de la plateforme (Play Store sur Android, App Store sur iOS).
action_label: Libellé du bouton
locales_legend: Texte par langue
locales_hint: Renseignez toutes les langues de l'app (italien, anglais, français, allemand, espagnol). L'italien est obligatoire ; les langues manquantes basculent vers l'anglais puis l'italien.
locale_required: obligatoire
dismissible: L'utilisateur peut fermer l'alerte
dismissible_hint: Décochez pour une maintenance qui doit rester visible.
submit_create: Enregistrer l'alerte
submit_update: Mettre à jour l'alerte
cancel: Annuler