<?php

return [
    'site_title' => 'Website visibility',
    'site_public' => 'Public',
    'site_hidden' => 'Hidden',
    'site_public_body' => 'Website and customer portal are reachable by anyone and indexed by search engines.',
    'site_hidden_body' => 'Outside visitors only see a placeholder (status 503, noindex). Through the VPN and as a signed-in staff member you still see everything. The console stays reachable either way.',
    'site_your_view' => 'Your address :ip —',
    'site_via_vpn' => 'through the VPN, you always see the real site.',
    'site_not_vpn' => 'not on the VPN. As a signed-in staff member you still see the real site.',
    'site_hide' => 'Hide website',
    'site_show' => 'Publish website',
    'site_now_public' => 'The website is public again.',
    'site_now_hidden' => 'The website is hidden now.',
    'title' => 'Settings',
    'subtitle' => 'Your operator account and team management.',
    'save' => 'Save',

    'account_title' => 'My account',
    'name' => 'Name',
    'email' => 'Email',
    'account_saved' => 'Account updated.',

    'staff_title' => 'Team & access',
    'staff_sub' => 'Invite staff and set their role. Only the Owner can manage the team.',
    'role' => 'Role',
    'invite' => 'Invite',
    'invite_hint' => 'We send an invitation to this address. The link in it is valid for :hours hours; the staff member sets their own password — nobody here gets to see it.',
    'staff_invited' => 'Invitation sent.',
    // Only while the old link has never been used (Settings::render(),
    // never_signed_in) — the way back from an expired invitation, without the
    // shell and without becoming the Owner along the way.
    'resend_invitation' => 'Resend invitation',
    'invitation_resent' => 'Invitation resent.',

    'col_person' => 'Person',
    'col_actions' => 'Actions',
    'you' => 'You',
    'revoke' => 'Revoke access',

    'role_owner' => 'Owner',
    'role_admin' => 'Administrator',
    'role_support' => 'Support',
    'role_billing' => 'Billing',
    'role_read-only' => 'Read-only',
    'role_developer' => 'Developer',

    'role_updated' => 'Role updated.',
    'staff_revoked' => 'Access revoked.',
    'not_self' => 'You cannot change your own role.',
    'owner_only' => 'Only an Owner may grant or revoke the Owner role.',
    'last_owner' => 'The last Owner cannot be changed or removed.',
    'not_staff' => 'Only existing staff can be edited.',
    'is_customer' => 'This email already belongs to a customer account.',

    // Console network access — who may reach /admin at all.
    'console_title' => 'Console access',
    'console_locked_badge' => 'Restricted',
    'console_open_badge' => 'Open',
    'console_locked_body' => 'Only the VPN and the addresses listed below reach the console. Everyone else gets a 404 — they do not even learn it exists.',
    'console_open_body' => 'The console answers wherever its hostname is used. While that is so, only the password protects it.',
    'console_your_ip' => 'You are viewing this from :ip',
    'console_lock' => 'Restrict',
    'console_unlock' => 'Open up',
    'console_always' => 'Always allowed',
    'console_vpn_note' => 'Management VPN, not removable',
    'console_env_note' => 'Set in TRUSTED_RANGES in the .env — belongs in the list below, where you can change it.',
    'console_extra' => 'Additionally allowed',
    'console_none' => 'No further address yet — without the VPN, nobody gets in.',
    'console_add' => 'Add',
    'console_remove' => 'Remove',
    'console_ip_hint' => 'A single address or a range, e.g. 203.0.113.7 or 203.0.113.0/24.',
    'console_terminal_note' => 'The same addresses also decide where the terminal to the CluPilot server opens from — whether or not the lock above is switched on.',

    // Terminal to the server itself
    'server_terminal_title' => 'Terminal to the server',
    'server_terminal_body' => 'A root session on the CluPilot server itself — not on a host. Whoever opens it reaches the database, the vault, the DNS token and every customer instance.',
    'server_terminal_installed' => 'Set up on :when.',
    'server_terminal_off_network' => 'It does not open from :ip. Only from the management network or one of the addresses above.',
    'server_terminal_no_key' => 'There is no identity yet. It is generated here and then installed on the server once.',
    'server_terminal_not_installed' => 'The identity exists but has not been installed on the server. Run this there once:',
    'server_terminal_generate' => 'Generate identity',
    'server_terminal_regenerate' => 'Generate a new identity',
    'server_terminal_key_hint' => 'Its own key, separate from the fleet key for the hosts.',
    'server_terminal_generated' => 'New identity generated. Now run "sudo bash deploy/install-agent.sh" on the server.',
    'server_terminal_generate_title' => 'A new identity for the server terminal?',
    'server_terminal_generate_body' => 'The current one sits in /root/.ssh/authorized_keys on the server and is not removed from here. Until "sudo bash deploy/install-agent.sh" has run there, the terminal to the server will not open.',
    'server_terminal_generate_confirm' => 'Generate',
    'console_ip_invalid' => 'That is not a valid IP address or range.',
    'console_ip_added' => ':ip may now reach the console.',
    'console_ip_removed' => ':ip removed.',
    'console_ip_last' => 'Not removed: you are connecting from :ip yourself and would lock yourself out.',
    'console_locked' => 'Console restricted — VPN and listed addresses only.',
    'console_unlocked' => 'Restriction lifted.',
    'console_lock_refused' => 'Not restricted: :ip is on no list, so this would have locked you out.',

    // Two-factor policy — console.require_2fa. Enrolment itself is its own
    // page, admin.two-factor-setup (App\Livewire\Admin\TwoFactorSetup) — see
    // RequireOperatorTwoFactor for why only enrolment, and not this whole
    // page, is exempt from the redirect this forces.
    'saved' => 'Saved.',
    'two_factor_title' => 'Two-factor requirement',
    'two_factor_body' => 'Applies to every member of staff: anyone who has not set two-factor up can reach the two-factor setup page and nothing else.',
    'two_factor_require' => 'Make it compulsory for everyone',
    'two_factor_required' => 'Two-factor is compulsory for the console. Please set it up here.',
    'two_factor_self_first' => 'Set up your own two-factor confirmation first — otherwise this switch locks you out yourself.',

    'update_title' => 'Version & update',
    'update_version' => 'Running',
    'update_source' => 'Source',
    'update_deployed' => 'Deployed',
    'update_checked' => 'Last checked',
    // Two separate actions instead of one that did both: looking must not
    // have to go through a real update and its maintenance window first.
    'update_check' => 'Check for updates',
    'update_checking' => 'Checking',
    'update_now' => 'Update now',
    'update_running' => 'Running',
    'update_available' => ':n update(s) available',
    // With the version number once the agent has named the tag: "Version 1.1.0
    // available" is something a person can decide about.
    'update_available_release' => 'Version :version available',
    // Why the button is grey. Updates only ever go to a tagged version, never
    // to the head of a branch — a commit on main is not a release.
    'update_only_releases' => 'Updates only ever go to a released version. What lands on main changes nothing here until it is tagged as one.',
    'update_nothing_released' => 'There is no newer released version.',
    'update_current' => 'Up to date',
    'update_unknown' => 'Unknown',
    // Kept short, with no time of its own: the live countdown shown right
    // after it (update_starts_in) already carries the precision.
    'update_requested' => 'Update requested.',
    'update_check_requested' => 'Check requested.',
    'update_already_requested' => 'Something has already been requested — please wait a moment.',
    'update_no_agent' => 'The server-side update service is not running. Set it up once on the server:  sudo bash /opt/clupilot/deploy/install-agent.sh',
    'update_agent_blocked' => 'The update service is running but has been unable to work since :since — another process holds the lock. While that lasts, the figures above are from before. If it does not clear on its own, look at the process named below.',
    'update_log' => 'Log of the last run',

    'update_error' => [
        'repo_unreachable' => 'The repository cannot be reached from the server.',
        'detached_no_release' => 'The checkout is on no branch and pinned to no release.',
        'update_failed' => 'The update failed (code :code). See the log.',
        'restart_failed' => 'Restarting the services failed. Please run manually: docker compose restart queue scheduler reverb.',
    ],

    'update_last_run' => 'Last run: :state, :when.',
    'update_state' => [
        'succeeded' => 'succeeded',
        'failed' => 'failed',
        'running' => 'running',
    ],

    // Full-screen view in the console shell (layouts/admin.blade.php) — shown
    // on every console page while an update is running, not just Settings.
    'update_overlay_title' => 'Update in progress.',

    // No countdown any more, for a check or for a run. The old one ran back
    // four seconds and snapped to a full minute, because its target was
    // recomputed on every poll and landed in the past on every host whose timer
    // is longer than the interval the agent reports. Nor is it needed: the
    // agent is woken when the request lands.
    'update_starting' => 'Starting now.',
    // Only for servers where deploy/install-agent.sh has not been re-run — the
    // timer collects the request there, and saying so beats promising an
    // immediacy that host does not deliver.
    'update_starting_queued' => 'Starting as soon as the agent picks the request up.',
    'update_step' => 'Step: :step',
    'update_since' => 'Running since :when',
    'update_offline_hint' => 'During the update the site is briefly in maintenance mode — this view stays put and comes back on its own afterwards.',
    'update_took' => 'Took :duration',
    'update_failed_at' => 'Stopped at step: :step',

    // The steps deploy/update.sh reports. The script writes keys so they are
    // translated here rather than passed through in English.
    'update_phase' => [
        'fetch' => 'Fetching the new version',
        'maintenance_on' => 'Enabling maintenance mode',
        'checkout' => 'Applying the code',
        'image' => 'Rebuilding the container image',
        'composer' => 'Installing PHP packages',
        'npm' => 'Installing JS packages',
        'migrate' => 'Migrating the database',
        'assets' => 'Rebuilding assets',
        'caches' => 'Rebuilding caches',
        'restart' => 'Restarting services',
        'maintenance_off' => 'Leaving maintenance mode',
    ],

    'password_title' => 'Change password',
    'password_sub' => 'Takes effect immediately. Other sessions stay signed in.',
    'password_current' => 'Current password',
    'password_new' => 'New password',
    'password_repeat' => 'Repeat',
    'password_save' => 'Change password',
    'password_wrong' => 'The current password is not correct.',
    'password_changed' => 'Password changed.',

    // ── Automation ───────────────────────────────────────────────────────
    'auto_title' => 'Update automatically',
    'auto_hint' => 'Takes an available release on its own inside the chosen window. By hand still works at any time — and if you updated earlier, the window finds nothing to do.',
    'auto_enabled' => 'Enable automation',
    'auto_days' => 'Weekdays',
    'auto_from' => 'from',
    'auto_to' => 'to',
    'auto_saved' => 'Window saved.',
    'auto_off' => 'Automation is off — updates by hand only.',
    'auto_next' => 'Next window: :days, :from–:to.',
    'update_by_schedule' => 'Automation',
    'weekday' => [
        1 => 'Mon', 2 => 'Tue', 3 => 'Wed', 4 => 'Thu', 5 => 'Fri', 6 => 'Sat', 7 => 'Sun',
    ],

    // The page's outline. It had none — eight cards of equal weight in one
    // column, with the operator's own password between two platform switches.
    'group' => [
        'installation' => 'Installation',
        'account' => 'My account',
        'team' => 'Team & access',
    ],

    // The tab bar. Kept apart from `group` — those were the headings of a
    // scrolled page and read as such; a tab is a thing you click, and it has
    // room for fewer words.
    'password_policy_title' => 'Password policy',
    'password_policy_body' => 'Applies to customers and staff alike — on registration, on reset and on change.',
    'password_min_length' => 'Minimum length (characters)',
    'password_min_length_hint' => 'Shorter than :floor characters is not possible. Longer is always possible and costs nothing.',
    'password_policy_saved' => 'Password policy saved. It applies from the next password set.',
    'tab' => [
        'installation' => 'Installation',
        'account' => 'My account',
        'two_factor' => 'Security',
        'team' => 'Team',
    ],
];
