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
analytics: Analytics
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}."
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
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 : admin / AdminPass123. 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}"
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
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.
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
comped: Offert
stripe: Stripe
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)
teams_title: Équipes
no_teams: Aucune équipe enregistrée.
table:
team: Équipe
sport: Sport
matches_and_details: Matchs et détails
replay: Replays
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
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é.
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
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: "—"
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
layer: Couche
layer_move: Mouvements souris
layer_click: Clics
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
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 page live (mise en page actuelle). Vert = faible, rouge = fort.
preview_title: Aperçu de la page
preview_unavailable: Aperçu indisponible pour les chemins avec placeholder (ex. /clubs/:id). Overlay seul.
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.
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 /opt/matchlivetv/infra/.env :"
not_shown_again_html: "Elle ne sera plus affichée. Ensuite : docker compose -f docker-compose.prod.yml restart rails sidekiq"
no_refresh_token_html: "Google n'a pas renvoyé de refresh token. Dans votre compte Google → accès aux applications, révoquez « Match Live TV », puis recommencez depuis /admin/youtube/platform."
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