en:
admin:
layout:
title: "Match Live TV — Admin"
nav:
dashboard: Dashboard
ops: Ops
clubs: Clubs & teams
billing: Billing
youtube: YouTube
sessions: Sessions
stream_nodes: Stream nodes
password: Password
logout: Log out
flash:
login_required: Please log in to continue
login_success: Signed in successfully
invalid_credentials: Invalid username or password
logout_success: Signed out
password_current_incorrect: Current password is incorrect
password_too_short: The new password must be at least 8 characters long
password_too_long: New password cannot exceed 72 characters
password_too_weak: "New password must include at least 3 of: lowercase, uppercase, numbers and symbols"
password_same_as_current: New password must be different from the current password
password_mismatch: Passwords do not match
password_updated: Password updated
ops_acknowledged: Incident acknowledged
ops_resolved: Incident resolved
ops_muted: Notifications muted for 24 hours
stream_node_created: "Lab node %{slug} provisioned."
stream_node_destroyed: "Node %{slug} removed."
stream_node_draining: "Node %{slug} is draining (no new sessions)."
autoscale_kill_on: "Autoscaler kill-switch engaged. No automatic scale-out."
autoscale_kill_off: "Autoscaler kill-switch cleared (still needs STREAM_AUTOSCALE_ENABLED=1)."
comped_granted: "%{plan} complimentary subscription activated for %{club}."
comped_revoked: "Complimentary subscription revoked for %{club}."
session_already_terminated: "Session already ended (%{status})."
session_stopped: Session ended.
session_stop_error: "Error while stopping: %{error}"
session_terminated_no_regia: "Session ended: unable to generate the control link."
session_regia_generated: Control link generated.
invoice_upload_hint: Upload the PDF from the "Payments to invoice" list.
invoice_draft_created: Draft created. Upload the PDF from the Billing page or below.
invoice_issued: "Invoice %{number} issued and sent to %{email}."
invoice_updated: "Invoice %{number} updated."
invoice_uploaded: "Invoice uploaded and sent to %{email}."
youtube_not_configured: Configure YOUTUBE_CLIENT_ID and YOUTUBE_CLIENT_SECRET in .env
common:
free_plan: Free
yes: "Yes"
no: "No"
dash: "—"
live_page: Live page
auth:
new:
title: Admin login
username_label: Username
password_label: Password
submit: Log in
initial_credentials_html: "Initial credentials: admin / admin. Change the password after the first login."
passwords:
edit:
title: Change password
current_password_label: Current password
new_password_label: "New password (min. 8, at least 3 character types)"
confirm_password_label: Confirm new password
submit: Save password
cancel: Cancel
dashboard:
kpi:
active_sessions: Active sessions
active_sessions_sub: live right now
today: Streamed today
today_sub: "%{duration} of streaming"
month: Streamed this month
month_sub: "%{duration} total"
teams: Teams
teams_sub: "%{count} users"
cpu: CPU
cpu_sub: "load %{one} / %{five} / %{fifteen}"
ram: RAM
ram_sub: "%{used} / %{total}"
network: Bandwidth (total)
network_sub: "↑ %{tx} · ↓ %{rx}"
recordings: Recordings in archive
recordings_sub: "%{count} recordings"
charts:
cpu: CPU (%)
ram: RAM (%)
ops_panel:
title: Platform status (Ops)
critical: "%{count} critical incident(s) open"
view_dashboard: View Ops dashboard
warnings: "%{count} warning(s)"
dashboard_link: Ops dashboard
none_html: "No open incidents. %{link}"
disk:
system_title: System disk
free_label: "Free: %{free} (%{percent}% used)"
not_available: Disk metrics not available
recordings_title: Recordings archive
recordings_content: "Recordings content: %{size}"
recordings_not_mounted: "Path %{path} not mounted"
sessions:
title: Active sessions
table:
match: Match
status: Status
start: Start
link: Link
none: No active session right now.
detail: Details
stop: Stop
stop_confirm: End this session?
regia: Control
teams:
title: Teams
matches_count: "%{count} matches"
view_all: "View clubs (%{count} teams)"
stream_nodes:
title: Streaming nodes
providers: "Cloud: %{cloud} · DNS: %{dns}"
actions_title: Actions
table_title: Registered nodes
empty: No nodes registered.
free_slots:
one: "%{count} free"
other: "%{count} free"
kpi:
autoscaler: Autoscaler
kill_switch: KILL
kind: "%{kind} mode"
free_slots: Free slots
soft_slots: "soft threshold ≤ %{soft}"
spare: Spare
warm_spare: warm spares ready
overflow: Overflow
overflow_nodes: cloud/lab nodes
budget: Estimated budget
budget_of: "of €%{budget}/mo (%{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 ACTIVE"
engage_kill_switch: "Kill-switch ON"
clear_kill_switch: "Kill-switch OFF"
kill_switch_confirm: "Immediately block the autoscaler? Existing nodes stay up."
provision_lab: Provision lab
provision_cloud: Provision Hetzner
provision_cloud_confirm: "Create a Hetzner Cloud server + DNS record on mltv-stream.net? Billing applies until destroyed."
hetzner_token_missing: "Set HCLOUD_TOKEN to enable Cloud provisioning."
drain: Drain
destroy: Delete
destroy_confirm: "Delete node %{slug}?"
hosts_title: Lab DNS records (/etc/hosts snippet)
col:
slug: Slug
role: Role
status: Status
slots: Slots
hostname: Hostname
provider: Provider
ops:
kpi:
critical: Critical open
warning: Warnings open
total: Total open
open:
title: Open incidents
table:
severity: Severity
kind: Type
title: Title
occurrences: Occ.
last_seen: Last seen
none: No open incidents. The platform looks healthy.
actions:
acknowledge: Acknowledge
resolve: Resolve
mute: Mute 24h
resolved:
title: Resolved (last 30 days)
table:
resolved_at: Resolved
none: No incidents resolved recently.
clubs:
index:
title: Clubs & teams
subtitle_html: "Complimentary subscriptions (sponsors / promotions) and YouTube status per team. Stripe payments: %{billing_link}."
billing_link: Billing
table:
club: Club
plan: Plan
teams: Teams
comped: Comp
stripe: Stripe
manage: Manage
invoices: Invoices
show:
back: "← Clubs & teams"
sport_label: "Sport: %{sport}"
recordings_archive: Recordings archive
billing_link: Payments & invoices
youtube_platform_link: Platform YouTube channel
youtube_club_label: "Club YouTube:"
youtube_connected: (connected)
youtube_premium_full_not_connected: Premium Full — club channel not connected (using Match Live TV)
no_channel_hint_html: "Without a connected channel, the app uses the Match Live TV channel. %{link}."
link_channel: Connect channel (club page)
teams_title: Teams
no_teams: No teams registered.
table:
team: Team
sport: Sport
matches_and_details: Matches & details
replay: Replays
comped:
title: Complimentary subscription
description: "Sponsor or promotion: grant Premium Light/Full without a Stripe payment. Revocable at any time."
active_label: "Active:"
since_label_html: "Since %{date}"
by_admin: "· admin %{username}"
stripe_note: "Note: a linked Stripe subscription also exists; the comp takes priority over the plan."
revoke_button: Revoke comp (revert to Free or restore Stripe)
revoke_confirm: "Revoke the complimentary subscription for %{club}?"
current_plan: "Current plan: %{plan}"
stripe_active: "· active Stripe payment"
plan_label: Plan
reason_label: "Reason (e.g. 2026 sponsor)"
reason_placeholder: "Sponsor, promotion…"
grant_button: Grant comp
teams:
show:
back: "← %{club}"
sport_label: "Sport: %{sport}"
club_label_html: "Club: %{club} · %{replay_link} · %{billing_link}"
replay_link: Team replays
billing_link: Payments & invoices
youtube_label: "YouTube:"
youtube_platform_default_no_oauth: ", default without club OAuth"
youtube_platform_channel: "(platform channel%{suffix})"
youtube_club_channel: (club channel)
youtube_not_ready: not ready
no_channel_hint_html: "Without a connected channel, the app uses the Match Live TV channel. %{link}."
link_channel: Connect channel (club page)
matches_title: Matches
sessions:
index:
title: Stream sessions
table:
match: Match
status: Status
disconnects: Disconnects
link: Link
detail: Details
regia: Control
show:
title: "Session %{id}"
status_label: "Status:"
stop_button: End session
stop_confirm: "End the broadcast? The RTMP path will be removed and the status will move to ended."
match_label: "Match: %{team} vs %{opponent}"
youtube_studio: YouTube Studio
broadcast: Broadcast
rtmp_ingest: "RTMP ingest:"
events_title: Events
table:
type: Type
when: When
meta: Meta
links:
watch_title: Live link
none: No video link available for this session.
regia_title: Control link
terminated: Session ended — control link not available.
regia_label: Control
valid_until: "Valid until %{date}"
active_exists: An active control link already exists (the URL cannot be retrieved). Generate a new one if you need to share it again.
none_active: No active control link. Generate a link to share with whoever manages the score.
generate_button: Generate control link
billing:
index:
title: Payments to invoice
description: Stripe payments that are paid but have no invoice PDF yet. Generate the PDF in your systems, then upload it here — it will be linked to the payment and emailed to the customer.
filter_label: "Filter clubs:"
filter_all: All
incomplete_profile_warning: Billing details incomplete
no_billing_data: No billing details — the customer must complete their profile.
pdf_label: Invoice PDF
upload_button: Upload PDF and send to customer
none_pending: "No payments awaiting an invoice%{club}."
none_pending_for_club: " for %{club}"
uploaded_title: Invoices already uploaded
table:
date: Date
club: Club
description: Description
amount: Amount
invoice: Invoice
status: Status
back_dashboard: "← Dashboard"
billing_invoices:
index:
title: "Billing — %{club}"
back_dashboard: "← Dashboard"
new_invoice: New invoice (no payment)
payments_title: Payments
table:
date: Date
description: Description
amount: Amount
invoice: Invoice
pdf_suffix: " (PDF)"
edit_send_pdf: Edit / send PDF
create_invoice: Create invoice
no_payments: No payments recorded for this club.
all_invoices_title: All invoices
table2:
number: Number
date: Date
amount: Amount
status: Status
payment: Payment
edit: Edit
no_invoices: No invoices.
new:
title: "New invoice — %{club}"
linked_payment: "Linked to the payment of %{date} (%{amount})."
number_label: Invoice number
issued_on_label: Issue date
amount_label: "Amount (€)"
notes_label: Internal notes (optional)
hint: Save the draft, then upload the PDF and send it to the customer from the next screen.
submit: Create invoice draft
back: "← Payments & invoices"
edit:
title: "Invoice %{number} — %{club}"
status_label: "Status:"
sent_at: "· Sent on %{date}"
number_label: Invoice number
issued_on_label: Issue date
amount_label: "Amount (€)"
payment_info: "Payment: %{description} — %{amount}"
pdf_label: Invoice PDF
pdf_already: "PDF already uploaded: %{filename}"
notes_label: Internal notes
save_draft: Save draft
issue_send: Issue and send by email
issue_confirm: "Send the invoice to %{email}?"
back: "← Payments & invoices"
youtube:
platform_token:
title: Match Live TV channel token
page_title: "YouTube token — Match Live TV"
channel_label: "Channel: %{title}"
success: "Connection successful. Copy this line right away:"
env_hint_html: "Add to /opt/matchlivetv/infra/.env:"
not_shown_again_html: "It won't be shown again. Then run: docker compose -f docker-compose.prod.yml restart rails sidekiq"
no_refresh_token_html: "Google did not return a refresh token. In your Google account → app access, revoke «Match Live TV», then repeat from /admin/youtube/platform."
back_dashboard: "← Admin dashboard"
club_recordings:
index:
title: "Replays — %{club}"