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:
@@ -5,7 +5,7 @@
|
||||
badge_class = local_assigns[:badge_class]
|
||||
|
||||
unless badge_label
|
||||
badge_label = closed ? "Terminata" : (session.paused? ? "In pausa" : (on_air ? "LIVE" : "In attesa"))
|
||||
badge_label = closed ? t("live.overlays.badge_ended") : (session.paused? ? t("live.index.badge_paused") : (on_air ? t("live.index.badge_live") : t("live.overlays.badge_waiting")))
|
||||
end
|
||||
|
||||
unless badge_class
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
<% content_for :title, "Dirette live partite giovanili in corso — Match Live TV" %>
|
||||
<% content_for :meta_description, "Guarda le dirette live delle partite giovanili ora in corso e le prossime gare programmate. Cerca la tua squadra e apri il link senza installare app." %>
|
||||
<% content_for :title, t("live.index.meta_title") %>
|
||||
<% content_for :meta_description, t("live.index.meta_description") %>
|
||||
<% content_for :canonical_url, seo_absolute_url(public_live_index_path) %>
|
||||
|
||||
<% live_index_params = @club ? { club_id: @club.id } : {} %>
|
||||
<div class="wrap">
|
||||
<% if @club %>
|
||||
<p class="results-hint" style="margin-bottom:8px">
|
||||
<%= link_to "← #{@club.name}", public_club_path(@club), class: "back-link" %>
|
||||
<%= link_to t("live.index.club_back_link", name: @club.name), public_club_path(@club), class: "back-link" %>
|
||||
</p>
|
||||
<h1>Dirette e partite — <%= @club.name %></h1>
|
||||
<h1><%= t("live.index.club_title", name: @club.name) %></h1>
|
||||
<p class="results-hint">
|
||||
Solo le squadre di questa società: dirette in corso e partite programmate da app o sito.
|
||||
<%= t("live.index.club_hint") %>
|
||||
</p>
|
||||
<div class="live-actions" style="display:flex;gap:12px;flex-wrap:wrap;margin-bottom:16px">
|
||||
<%= link_to "Replay di #{@club.name}", public_replay_index_path(club_id: @club.id), class: "btn btn-secondary" %>
|
||||
<%= link_to t("live.index.club_replay_link", name: @club.name), public_replay_index_path(club_id: @club.id), class: "btn btn-secondary" %>
|
||||
</div>
|
||||
<% else %>
|
||||
<h1>Dirette e partite in programma</h1>
|
||||
<h1><%= t("live.index.default_title") %></h1>
|
||||
<p class="results-hint">
|
||||
Cerca per società, squadra, avversario o luogo: trovi le dirette attive e le partite programmate.
|
||||
<%= t("live.index.default_hint") %>
|
||||
</p>
|
||||
<div class="live-actions" style="display:flex;gap:12px;flex-wrap:wrap;margin-bottom:20px">
|
||||
<%= link_to "Live passate — archivio replay", public_replay_index_path, class: "btn btn-secondary" %>
|
||||
<%= link_to t("live.index.replay_archive_link"), public_replay_index_path, class: "btn btn-secondary" %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if @club && @can_schedule_match %>
|
||||
<div style="display:flex;gap:12px;flex-wrap:wrap;margin-bottom:16px">
|
||||
<%= link_to "Programma partita", public_new_club_match_path(@club), class: "btn btn-primary" %>
|
||||
<%= link_to t("live.index.schedule_match_link"), public_new_club_match_path(@club), class: "btn btn-primary" %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
@@ -39,25 +39,25 @@
|
||||
type="search"
|
||||
name="q"
|
||||
value="<%= @query %>"
|
||||
placeholder="<%= @club ? "Cerca società, squadra, avversario o luogo…" : "Es. Crazy Volley, Serie D, avversario…" %>"
|
||||
aria-label="Cerca squadra"
|
||||
placeholder="<%= @club ? t("live.index.search_placeholder_club") : t("live.index.search_placeholder_default") %>"
|
||||
aria-label="<%= t("live.index.search_aria_label") %>"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<button type="submit" class="btn btn-primary">Cerca</button>
|
||||
<button type="submit" class="btn btn-primary"><%= t("live.index.search_button") %></button>
|
||||
<% if @query.present? %>
|
||||
<%= link_to "Azzera", public_live_index_path(live_index_params), class: "btn btn-secondary" %>
|
||||
<%= link_to t("live.index.reset_link"), public_live_index_path(live_index_params), class: "btn btn-secondary" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% if @query.present? %>
|
||||
<% club_suffix = @club ? t("live.index.results_hint_club_suffix", name: @club.name) : "" %>
|
||||
<p class="results-hint">
|
||||
Risultati per «<%= h @query %>»<%= @club ? " in #{@club.name}" : "" %>:
|
||||
<%= @sessions.size %> in diretta · <%= @upcoming_matches.size %> in programma
|
||||
<%= t("live.index.results_hint", query: @query, club_suffix: club_suffix, live_count: @sessions.size, upcoming_count: @upcoming_matches.size) %>
|
||||
</p>
|
||||
<% end %>
|
||||
|
||||
<% if @sessions.any? %>
|
||||
<h2 class="section-heading">In diretta adesso</h2>
|
||||
<h2 class="section-heading"><%= t("live.index.section_live_now") %></h2>
|
||||
<div class="live-grid">
|
||||
<% @sessions.each do |session| %>
|
||||
<% match = session.match %>
|
||||
@@ -72,33 +72,33 @@
|
||||
<p class="card-score">
|
||||
<span class="card-sets"><%= live_score_sets_label(session.score_state) %></span>
|
||||
<% if live_score_partials_label(session.score_state).present? %>
|
||||
<span class="card-partials">Parziali: <%= live_score_partials_label(session.score_state) %></span>
|
||||
<span class="card-partials"><%= t("score.partials_prefix", value: live_score_partials_label(session.score_state)) %></span>
|
||||
<% end %>
|
||||
<span class="card-points"><%= session.score_state.home_points %> - <%= session.score_state.away_points %></span>
|
||||
</p>
|
||||
<% end %>
|
||||
<div class="badges">
|
||||
<% if on_air %>
|
||||
<span class="badge badge-on-air">In onda</span>
|
||||
<span class="badge badge-on-air"><%= t("live.index.badge_on_air") %></span>
|
||||
<% elsif session.status == "live" %>
|
||||
<span class="badge badge-live">Live</span>
|
||||
<span class="badge badge-live"><%= t("live.index.badge_live") %></span>
|
||||
<% elsif session.status == "paused" %>
|
||||
<span class="badge badge-connecting">In pausa</span>
|
||||
<span class="badge badge-connecting"><%= t("live.index.badge_paused") %></span>
|
||||
<% elsif session.status == "reconnecting" %>
|
||||
<span class="badge badge-connecting">Riconnessione</span>
|
||||
<span class="badge badge-connecting"><%= t("live.index.badge_reconnecting") %></span>
|
||||
<% else %>
|
||||
<span class="badge badge-wait">In avvio</span>
|
||||
<span class="badge badge-wait"><%= t("live.index.badge_starting") %></span>
|
||||
<% end %>
|
||||
</div>
|
||||
<%= link_to "Guarda diretta →", public_live_path(session), class: "btn-watch" %>
|
||||
<%= link_to t("live.index.watch_link"), public_live_path(session), class: "btn-watch" %>
|
||||
</article>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if @upcoming_matches.any? %>
|
||||
<h2 class="section-heading<%= ' section-heading--spaced' if @sessions.any? %>">Prossime partite</h2>
|
||||
<p class="results-hint">Programmate da app o sito: la diretta partirà quando lo staff avvierà la trasmissione.</p>
|
||||
<h2 class="section-heading<%= ' section-heading--spaced' if @sessions.any? %>"><%= t("live.index.section_upcoming") %></h2>
|
||||
<p class="results-hint"><%= t("live.index.upcoming_hint") %></p>
|
||||
<div class="live-grid upcoming-grid">
|
||||
<% @upcoming_matches.each do |match| %>
|
||||
<article class="live-card live-card--upcoming">
|
||||
@@ -111,7 +111,7 @@
|
||||
<%= live_scheduled_relative(match.scheduled_at) %>
|
||||
</p>
|
||||
<div class="badges">
|
||||
<span class="badge badge-scheduled">In programma</span>
|
||||
<span class="badge badge-scheduled"><%= t("live.index.badge_scheduled") %></span>
|
||||
</div>
|
||||
</article>
|
||||
<% end %>
|
||||
@@ -121,59 +121,59 @@
|
||||
<% if @sessions.empty? %>
|
||||
<% if @upcoming_matches.any? %>
|
||||
<div class="empty-state empty-state--soft">
|
||||
<p><strong>Nessuna diretta in questo momento.</strong></p>
|
||||
<p>Torna all’orario indicato: quando la squadra avvierà lo streaming, la partita comparirà in «In diretta adesso».</p>
|
||||
<p><strong><%= t("live.index.empty_soft_title") %></strong></p>
|
||||
<p><%= t("live.index.empty_soft_body") %></p>
|
||||
</div>
|
||||
<% elsif @club %>
|
||||
<div class="empty-state">
|
||||
<p><strong>Nessuna diretta o partita in programma per <%= @club.name %>.</strong></p>
|
||||
<p><strong><%= t("live.index.empty_club_title", name: @club.name) %></strong></p>
|
||||
<p>
|
||||
<% if @can_schedule_match %>
|
||||
<%= link_to "Programma la prima partita", public_new_club_match_path(@club), class: "btn btn-primary" %>
|
||||
oppure dall’app Match Live TV.
|
||||
<%= link_to t("live.index.empty_club_schedule_link"), public_new_club_match_path(@club), class: "btn btn-primary" %>
|
||||
<%= t("live.index.empty_club_schedule_suffix") %>
|
||||
<% elsif @club.teams.any? %>
|
||||
Chiedi al titolare della società o a un responsabile trasmissione di programmare una gara.
|
||||
<%= t("live.index.empty_club_ask_staff") %>
|
||||
<% else %>
|
||||
Aggiungi una squadra dalla
|
||||
<%= link_to "pagina società", public_club_path(@club) %>
|
||||
e programma la prima partita.
|
||||
<%= raw t(
|
||||
"live.index.empty_club_add_team_html",
|
||||
club_link: link_to(t("live.index.empty_club_page_link"), public_club_path(@club))
|
||||
) %>
|
||||
<% end %>
|
||||
</p>
|
||||
<p style="margin-top:16px">
|
||||
<%= link_to "← Torna alla società", public_club_path(@club), class: "btn btn-secondary" %>
|
||||
<%= link_to t("live.index.empty_club_back_link"), public_club_path(@club), class: "btn btn-secondary" %>
|
||||
</p>
|
||||
</div>
|
||||
<% else %>
|
||||
<div class="empty-hero">
|
||||
<div class="empty-hero-copy">
|
||||
<h2>Nessuna diretta adesso — ma puoi già organizzarti</h2>
|
||||
<h2><%= t("live.index.empty_hero_title") %></h2>
|
||||
<p>
|
||||
Se la tua squadra usa Match Live TV, dal telefono si programma la partita con data e ora.
|
||||
Genitori e parenti trovano qui la diretta quando il fischio d’inizio è vicino.
|
||||
<%= t("live.index.empty_hero_body") %>
|
||||
</p>
|
||||
<ul class="empty-hero-list">
|
||||
<li>Programma la gara dall’app (senza avviare subito la diretta)</li>
|
||||
<li>La partita compare in «Prossime partite» con orario e campo</li>
|
||||
<li>Lo streaming parte solo quando premi avvio in palestra</li>
|
||||
<li><%= t("live.index.empty_hero_list_item1") %></li>
|
||||
<li><%= t("live.index.empty_hero_list_item2") %></li>
|
||||
<li><%= t("live.index.empty_hero_list_item3") %></li>
|
||||
</ul>
|
||||
<p class="empty-hero-cta">
|
||||
<%= link_to "Registra la tua squadra", public_signup_path, class: "btn btn-primary" %>
|
||||
<%= link_to "Scopri come funziona", public_features_path, class: "btn btn-secondary" %>
|
||||
<%= link_to t("live.index.empty_hero_cta_signup"), public_signup_path, class: "btn btn-primary" %>
|
||||
<%= link_to t("live.index.empty_hero_cta_features"), public_features_path, class: "btn btn-secondary" %>
|
||||
</p>
|
||||
</div>
|
||||
<aside class="demo-live-card" aria-label="Esempio di diretta attiva">
|
||||
<p class="demo-label">Esempio — così appare una diretta attiva</p>
|
||||
<aside class="demo-live-card" aria-label="<%= t("live.index.demo_aria_label") %>">
|
||||
<p class="demo-label"><%= t("live.index.demo_label") %></p>
|
||||
<article class="live-card live-card--demo">
|
||||
<h3>Tigers Volley vs ASD Eagles</h3>
|
||||
<p class="meta">PalaTigers · Match Live TV</p>
|
||||
<p class="meta"><%= t("live.index.demo_meta") %></p>
|
||||
<p class="card-score">
|
||||
<span class="card-sets">Set 2 · Set vinti 1-0</span>
|
||||
<span class="card-sets"><%= t("live.index.demo_sets") %></span>
|
||||
<span class="card-points">18 - 16</span>
|
||||
</p>
|
||||
<div class="badges">
|
||||
<span class="badge badge-on-air">In onda</span>
|
||||
<span class="badge badge-on-air"><%= t("live.index.badge_on_air") %></span>
|
||||
</div>
|
||||
<span class="btn-watch btn-watch--demo">Guarda diretta →</span>
|
||||
<span class="btn-watch btn-watch--demo"><%= t("live.index.watch_link") %></span>
|
||||
</article>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
<% club_name = @match.team.club&.name %>
|
||||
<% content_for :title do %><%= club_name %> · <%= @match.team.name %> vs <%= @match.opponent_name %> — Diretta live<% end %>
|
||||
<% content_for :meta_description do %>Segui in diretta live <%= club_name %> — <%= @match.team.name %> vs <%= @match.opponent_name %><% if @match.location.present? %> — <%= @match.location %><% end %>. Guarda dal browser senza installare app.<% end %>
|
||||
<% content_for :title do %><%= t("live.show.title", club_name: club_name, team_name: @match.team.name, opponent_name: @match.opponent_name) %><% end %>
|
||||
<% content_for :meta_description do %><%= t(
|
||||
"live.show.meta_description",
|
||||
club_name: club_name,
|
||||
team_name: @match.team.name,
|
||||
opponent_name: @match.opponent_name,
|
||||
location: @match.location.present? ? t("live.show.meta_description_location", location: @match.location) : ""
|
||||
) %><% end %>
|
||||
<% content_for :robots, @session.publicly_listed? ? "index, follow" : "noindex, nofollow" %>
|
||||
|
||||
<% content_for :head do %>
|
||||
@@ -10,45 +16,45 @@
|
||||
<% end %>
|
||||
|
||||
<div class="wrap">
|
||||
<%= link_to "← Tutte le dirette", public_live_index_path, class: "back-link" %>
|
||||
<%= link_to t("live.show.back_to_all"), public_live_index_path, class: "back-link" %>
|
||||
|
||||
<%= live_match_page_heading(@match) %>
|
||||
|
||||
<% if @stream_closed %>
|
||||
<div id="stream-ended" class="stream-ended" role="status" aria-live="polite">
|
||||
<div class="stream-ended-icon" aria-hidden="true">📡</div>
|
||||
<h2>Diretta terminata</h2>
|
||||
<p>Lo streaming di questa partita è stato chiuso.</p>
|
||||
<h2><%= t("live.show.stream_ended_title") %></h2>
|
||||
<p><%= t("live.show.stream_ended_body") %></p>
|
||||
<% if @session.ended_at %>
|
||||
<p class="stream-ended-meta">Chiusa il <%= l_local(@session.ended_at) %></p>
|
||||
<p class="stream-ended-meta"><%= t("live.show.stream_ended_closed_at", date: l_local(@session.ended_at)) %></p>
|
||||
<% end %>
|
||||
<p class="stream-ended-hint">Il punteggio è visibile nel video se la diretta era ancora in corso.</p>
|
||||
<%= link_to "Tutte le dirette", public_live_index_path, class: "btn btn-secondary stream-ended-btn" %>
|
||||
<p class="stream-ended-hint"><%= t("live.show.stream_ended_hint") %></p>
|
||||
<%= link_to t("live.show.all_live_link"), public_live_index_path, class: "btn btn-secondary stream-ended-btn" %>
|
||||
</div>
|
||||
<% elsif @session.platform == "youtube" %>
|
||||
<div class="stream-ended youtube-live-cta" role="status" aria-live="polite">
|
||||
<div class="stream-ended-icon" aria-hidden="true">▶</div>
|
||||
<h2>Diretta su YouTube</h2>
|
||||
<h2><%= t("live.show.youtube_title") %></h2>
|
||||
<% if @session.youtube_watch_url.present? %>
|
||||
<p>Questa partita è trasmessa sul canale YouTube Match Live TV, non sul player del sito.</p>
|
||||
<%= link_to "Guarda su YouTube", @session.youtube_watch_url, class: "btn stream-ended-btn", target: "_blank", rel: "noopener" %>
|
||||
<p><%= t("live.show.youtube_available_body") %></p>
|
||||
<%= link_to t("live.show.youtube_watch_link"), @session.youtube_watch_url, class: "btn stream-ended-btn", target: "_blank", rel: "noopener" %>
|
||||
<% else %>
|
||||
<p>Stiamo preparando la diretta sul canale YouTube. Aggiorna tra qualche secondo.</p>
|
||||
<p><%= t("live.show.youtube_preparing_body") %></p>
|
||||
<meta http-equiv="refresh" content="8">
|
||||
<% end %>
|
||||
<p class="stream-ended-hint">Condividi solo il link YouTube con tifosi e società.</p>
|
||||
<p class="stream-ended-hint"><%= t("live.show.youtube_hint") %></p>
|
||||
</div>
|
||||
<% else %>
|
||||
<div class="live-player-wrap">
|
||||
<video id="player" controls playsinline muted autoplay poster="/images/copertina-canale.png"></video>
|
||||
<%= render "public/live/player_overlays", match: @match, session: @session %>
|
||||
<button type="button" id="play-hint" class="live-play-hint" hidden>
|
||||
▶ Avvia la diretta
|
||||
<%= t("live.show.play_hint") %>
|
||||
</button>
|
||||
</div>
|
||||
<p id="offline-msg" class="live-status-msg" hidden>La diretta non è ancora disponibile. Si aggiorna automaticamente quando torna in onda.</p>
|
||||
<p id="awaiting-msg" class="live-status-msg" hidden>In attesa del segnale dal telefono — apri la camera nell'app e verifica che la diretta sia avviata (non in pausa).</p>
|
||||
<p id="paused-msg" class="live-status-msg" hidden>Trasmissione in pausa — il flusso continua (copertina server).</p>
|
||||
<p id="offline-msg" class="live-status-msg" hidden><%= t("live.show.offline_msg") %></p>
|
||||
<p id="awaiting-msg" class="live-status-msg" hidden><%= t("live.show.awaiting_msg") %></p>
|
||||
<p id="paused-msg" class="live-status-msg" hidden><%= t("live.show.paused_msg") %></p>
|
||||
|
||||
<script>
|
||||
const sessionId = "<%= @session.id %>";
|
||||
@@ -63,19 +69,19 @@
|
||||
function syncStreamBadge(data) {
|
||||
if (!streamBadge) return;
|
||||
if (data.stream_closed) {
|
||||
streamBadge.textContent = "Terminata";
|
||||
streamBadge.textContent = "<%= j t("live.overlays.badge_ended") %>";
|
||||
streamBadge.className = "live-ovl-badge live-ovl-badge--right badge-ended";
|
||||
return;
|
||||
}
|
||||
const paused = !!(data.paused || data.status === "paused");
|
||||
if (paused) {
|
||||
streamBadge.textContent = "In pausa";
|
||||
streamBadge.textContent = "<%= j t("live.index.badge_paused") %>";
|
||||
streamBadge.className = "live-ovl-badge live-ovl-badge--right badge-wait";
|
||||
} else if (data.on_air) {
|
||||
streamBadge.textContent = "LIVE";
|
||||
streamBadge.textContent = "<%= j t("live.index.badge_live") %>";
|
||||
streamBadge.className = "live-ovl-badge live-ovl-badge--right badge-live";
|
||||
} else {
|
||||
streamBadge.textContent = "In attesa";
|
||||
streamBadge.textContent = "<%= j t("live.overlays.badge_waiting") %>";
|
||||
streamBadge.className = "live-ovl-badge live-ovl-badge--right badge-wait";
|
||||
}
|
||||
}
|
||||
@@ -158,10 +164,10 @@
|
||||
panel.setAttribute("role", "status");
|
||||
panel.innerHTML = `
|
||||
<div class="stream-ended-icon" aria-hidden="true">📡</div>
|
||||
<h2>Diretta terminata</h2>
|
||||
<p>Lo streaming di questa partita è stato chiuso.</p>
|
||||
<p class="stream-ended-hint">Ricarica la pagina per l’ultimo stato registrato.</p>
|
||||
<a href="<%= public_live_index_path %>" class="btn btn-secondary stream-ended-btn">Tutte le dirette</a>
|
||||
<h2><%= j t("live.show.stream_ended_title") %></h2>
|
||||
<p><%= j t("live.show.stream_ended_body") %></p>
|
||||
<p class="stream-ended-hint"><%= j t("live.show.stream_ended_reload_hint") %></p>
|
||||
<a href="<%= public_live_index_path %>" class="btn btn-secondary stream-ended-btn"><%= j t("live.show.all_live_link") %></a>
|
||||
`;
|
||||
video.parentNode.insertBefore(panel, video.nextSibling);
|
||||
}
|
||||
@@ -277,7 +283,7 @@
|
||||
offlineMsg.hidden = true;
|
||||
if (!publisherOnline && showingCover && !paused) {
|
||||
awaitingMsg.hidden = false;
|
||||
awaitingMsg.textContent = "In riconnessione - in attesa del video dall'evento";
|
||||
awaitingMsg.textContent = "<%= j t("live.show.js_reconnecting_awaiting") %>";
|
||||
} else {
|
||||
awaitingMsg.hidden = !awaitingSignal;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user