Completa i18n IT/EN/FR/DE/ES su sito pubblico, area autenticata e admin.
Tutte le view marketing, legali, viewer, dashboard e admin usano t(); mailer utente-facing e flash localizzati; admin con LocaleResolver e selettore lingua. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,311 @@
|
||||
fr:
|
||||
admin:
|
||||
layout:
|
||||
title: "Match Live TV — Admin"
|
||||
nav:
|
||||
dashboard: Tableau de bord
|
||||
ops: Ops
|
||||
clubs: Clubs et équipes
|
||||
billing: Facturation
|
||||
youtube: YouTube
|
||||
sessions: Sessions
|
||||
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_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
|
||||
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
|
||||
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>admin</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 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
|
||||
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)"
|
||||
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
|
||||
table:
|
||||
match: Match
|
||||
status: Statut
|
||||
disconnects: Déconnexions
|
||||
link: Lien
|
||||
detail: Détail
|
||||
regia: Régie
|
||||
show:
|
||||
title: "Session %{id}"
|
||||
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
|
||||
rtmp_ingest: "Ingestion RTMP :"
|
||||
events_title: Événements
|
||||
table:
|
||||
type: Type
|
||||
when: Quand
|
||||
meta: Méta
|
||||
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
|
||||
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}"
|
||||
Reference in New Issue
Block a user