326 lines
21 KiB
JSON
326 lines
21 KiB
JSON
{
|
||
"title": "Admin",
|
||
"subtitle": "Server & content administration",
|
||
"servers": "Servers",
|
||
"images": "Images",
|
||
"images_title": "Images",
|
||
"images_subtitle": "The platform image whitelist. Only enabled images can back a new server. You can add external images or delete unwanted images from the whitelist.",
|
||
"add_image_title": "Add External Image",
|
||
"add_image_btn": "Add Image",
|
||
"image_ref_placeholder": "e.g. registry.felis.svc:5000/image:tag",
|
||
"delete_image_tooltip": "Delete Whitelist Image",
|
||
"image_source_built": "Built here",
|
||
"image_source_external": "External",
|
||
"image_source_recommended": "Recommended",
|
||
"delete_image_title": "Remove this image from the whitelist?",
|
||
"delete_image_desc": "New servers can no longer be created from",
|
||
"delete_image_confirm": "Remove image",
|
||
"cancel_build_title": "Stop this build?",
|
||
"cancel_build_desc": "The build stops now and pushes nothing:",
|
||
"cancel_build_keep": "Keep building",
|
||
"cancel_build_confirm": "Stop build",
|
||
"delete_btn": "Delete",
|
||
"builds_title": "Build Pipeline",
|
||
"builds_subtitle": "History of image build jobs and trigger controls. The build pod runs inside an isolated namespace with automated Trivy scans.",
|
||
"trigger_build_title": "Trigger New Image Build",
|
||
"trigger_build_btn": "Start Build",
|
||
"dockerfile_label": "Dockerfile Content",
|
||
"dockerfile_placeholder": "FROM library/postgres:15\nRUN echo 'setup'",
|
||
"dockerfile_audit_hint": "Archived on the build row for audit. Kaniko executes the `Dockerfile` inside the context tarball — this text is never executed.",
|
||
"context_ref_label": "Context Reference",
|
||
"context_ref_placeholder": "e.g. minio/contexts/my-modpack.tar.gz",
|
||
"download_context_btn": "Download context",
|
||
"download_context_hint": "Downloads the uploaded context (.tar.gz) — it contains the Dockerfile that will actually be executed.",
|
||
"context_sha256_label": "Context SHA-256",
|
||
"context_sha256_hint": "Approving binds this digest: if the submitter uploads again, the build refuses to run. When reviewing offline, compare it with sha256sum of your download.",
|
||
"context_sha256_missing": "No build context uploaded yet, or it was uploaded before digests were recorded and must be uploaded again.",
|
||
"context_sha256_downloaded": "Matches the file you just downloaded; approving binds exactly these bytes.",
|
||
"context_sha256_stale": "The copy you downloaded ({{digest}}…) was replaced by a newer upload; download and review it again.",
|
||
"approve_needs_context": "Nothing to approve: the context has not been uploaded, or must be uploaded again",
|
||
"base_image_label": "Base Image",
|
||
"base_image_placeholder": "e.g. library/postgres:15",
|
||
"build_status_pending": "Queued",
|
||
"build_status_building": "Building",
|
||
"build_status_succeeded": "Succeeded",
|
||
"build_status_failed": "Failed",
|
||
"build_status_cancelled": "Cancelled",
|
||
"build_queued_hint": "The concurrent build limit ([registry] max_concurrent_builds) is reached; this build starts on its own when an earlier one finishes.",
|
||
"view_logs_btn": "Scan & logs",
|
||
"cancel_build_btn": "Cancel",
|
||
"no_builds_title": "No Builds Found",
|
||
"no_builds_hint": "You can trigger your first image build task using the form on the top right.",
|
||
"no_images_title": "No images whitelisted",
|
||
"no_images_hint": "The whitelist is empty — a platform admin must add one (CLI for now).",
|
||
"enabled": "enabled",
|
||
"disabled": "disabled",
|
||
"table_ref": "Image Reference",
|
||
"table_source": "Source",
|
||
"table_status": "Status",
|
||
"table_action": "Action",
|
||
"table_build_id": "Build ID",
|
||
"table_requester": "Requester",
|
||
"table_created_at": "Created At",
|
||
"table_duration": "Duration",
|
||
"build_duration_seconds": "{{s}}s",
|
||
"build_duration_minutes": "{{m}}m {{s}}s",
|
||
"filter_all": "All",
|
||
"filter_enabled": "Enabled",
|
||
"filter_disabled": "Disabled",
|
||
"image_ref_label": "Image Reference",
|
||
"submissions_title": "Submissions",
|
||
"submissions_subtitle": "Review queue for user-uploaded modpacks. Approved submissions will automatically trigger safe Kaniko builds with Trivy scans.",
|
||
"table_submitted_by": "Submitted By",
|
||
"table_display_name": "Name",
|
||
"approve_btn": "Approve",
|
||
"reject_btn": "Reject",
|
||
"delete_submission_btn": "Delete submission",
|
||
"delete_submission_confirm": "Delete",
|
||
"delete_submission_cancel": "Cancel",
|
||
"reject_reason_label": "Rejection Reason",
|
||
"reject_reason_placeholder": "Please provide a reason (max 1000 characters)",
|
||
"reject_dialog_title": "Reject Submission",
|
||
"reject_dialog_desc": "Please provide a detailed reason for rejecting this modpack submission. This reason will be shown to the user.",
|
||
"reject_dialog_submit": "Confirm Reject",
|
||
"status_pending_review": "Pending Review",
|
||
"status_approved": "Approved",
|
||
"status_rejected": "Rejected",
|
||
"no_submissions_title": "No Submissions Found",
|
||
"no_submissions_hint": "There are currently no pending or reviewed modpack submissions.",
|
||
"reviewer": "Reviewer",
|
||
"reviewed_at": "Reviewed At",
|
||
"reject_reason": "Rejection Reason",
|
||
"updates_title": "Maintenance & Backups",
|
||
"updates_subtitle": "Check database backup freshness, review available versions, and set a maintenance window. Run `felis update` on the host to inspect a target; only an explicit `--apply` installs it.",
|
||
"updates_window_advisory": "Apply is allowed inside this window. The host checks it before taking a backup and again before installation. Outside the window, apply is refused unless `--now` explicitly starts manual maintenance; `--force` does not bypass the checks.",
|
||
"updates_current_unset": "No maintenance window set. Configure one before applying, or explicitly use `--apply --now` for manual maintenance.",
|
||
"updates_start_label": "Start Time",
|
||
"updates_end_label": "End Time",
|
||
"updates_set_title": "Configure Maintenance Window",
|
||
"updates_submit_btn": "Save Maintenance Window",
|
||
"updates_clear_btn": "Clear Maintenance Window",
|
||
"updates_save_success": "Maintenance window updated successfully.",
|
||
"updates_clear_success": "Maintenance window cleared successfully.",
|
||
"updates_validation_both": "Both start and end times must be set, or both cleared.",
|
||
"updates_validation_order": "End time must be strictly after start time.",
|
||
"updates_status_active": "Currently Active",
|
||
"updates_status_pending": "Scheduled (Future)",
|
||
"updates_status_expired": "Expired (Past)",
|
||
"updates_status_unset": "Unset",
|
||
"updates_timezone_hint": "Times are selected and displayed in your browser's local time zone ({{tz}}).",
|
||
"updates_stat_status": "System Status",
|
||
"updates_stat_start": "Start Time",
|
||
"updates_stat_end": "End Time",
|
||
"updates_stat_timezone": "Local Timezone",
|
||
"dbbackup_title": "Control-plane database backup",
|
||
"dbbackup_subtitle": "Users, passkeys, server ownership, quotas, audit logs and the world-archive index live in this database. felis-db-backup.timer on the host backs it up daily, and every upgrade snapshots it before migrating.",
|
||
"dbbackup_status_ok": "Healthy",
|
||
"dbbackup_status_stale": "Overdue",
|
||
"dbbackup_status_never": "Never backed up",
|
||
"dbbackup_status_incomplete": "Incomplete",
|
||
"dbbackup_refresh": "Refresh",
|
||
"dbbackup_loading": "Reading backup status…",
|
||
"dbbackup_field_when": "Last backup",
|
||
"dbbackup_field_label": "Kind",
|
||
"dbbackup_field_size": "Size",
|
||
"dbbackup_field_schema": "Schema version",
|
||
"dbbackup_field_file": "Bundle (host path)",
|
||
"dbbackup_label_daily": "Daily",
|
||
"dbbackup_label_pre_migrate": "Pre-upgrade snapshot",
|
||
"dbbackup_label_pre_restore": "Pre-restore snapshot",
|
||
"dbbackup_label_offsite": "Off-site copy snapshot",
|
||
"dbbackup_label_manual": "Manual",
|
||
"dbbackup_never_title": "No database backup has been recorded yet",
|
||
"dbbackup_stale_title": "The newest backup is more than {{hours}} hours old",
|
||
"dbbackup_daily_stale_title": "The daily backup last completed {{when}}, past the {{hours}}-hour limit",
|
||
"dbbackup_daily_never_title": "The daily timer has not completed a backup yet",
|
||
"dbbackup_daily_fix_hint": "The newer backup above was taken by hand or by another job and can be restored from, but it grows older every day the timer stays broken. Run the daily backup on the host now, then read its log to find out why it stopped:",
|
||
"dbbackup_servers_title": "The newest backup lacks the server definitions",
|
||
"dbbackup_servers_hint": "The cluster did not answer when the backup was taken. Restoring from it brings back accounts and the database, but no servers. Once the cluster answers, take a backup on the host again:",
|
||
"dbbackup_fix_hint": "If the host failed now, accounts, server ownership and the archive index could not be recovered. Run the daily backup on the host now, then read its log to find out why the timer missed it:",
|
||
"dbbackup_copy": "Copy command",
|
||
"dbbackup_offsite_note": "Backups are kept on this host only and are lost with its disk. Copy the backup directory to another machine regularly; restore and disaster-recovery steps are in the troubleshooting guide, §16.",
|
||
"versions_title": "Component versions",
|
||
"versions_subtitle": "felis-update-check.timer compares what this host runs with the newest upstream releases every day. Felis applies nothing on its own.",
|
||
"versions_status_available_one": "{{count}} update available",
|
||
"versions_status_available_other": "{{count}} updates available",
|
||
"versions_status_current": "Up to date",
|
||
"versions_status_stale": "Check overdue",
|
||
"versions_status_never": "Never checked",
|
||
"versions_refresh": "Refresh",
|
||
"versions_loading": "Reading the latest version check…",
|
||
"versions_checked": "Checked {{when}} by felis {{felis}}",
|
||
"versions_none": "The check tracked no components.",
|
||
"versions_col_component": "Component",
|
||
"versions_col_installed": "Installed",
|
||
"versions_col_latest": "Newer release",
|
||
"versions_col_status": "Status",
|
||
"versions_state_available": "Update available",
|
||
"versions_state_current": "Up to date",
|
||
"versions_state_unknown": "Feed unreachable",
|
||
"versions_state_unreadable": "Version unreadable",
|
||
"versions_state_pinned": "Pinned",
|
||
"versions_apply_hint": "Run this read-only check on the host. It shows the target, scope and an exact `--apply` command. Review it, then run that command during the maintenance window:",
|
||
"versions_never_title": "No version check has been recorded yet",
|
||
"versions_stale_title": "The newest version check is more than {{hours}} hours old",
|
||
"versions_fix_hint": "The versions below may be out of date. Run a check on the host now, then read the timer's log to find out why it did not run:",
|
||
"build_import_submission_label": "Import parameters from submission",
|
||
"build_import_submission_placeholder": "Select a user submission...",
|
||
"build_import_submission_none": "No submissions to import yet",
|
||
"build_import_submission_no_match": "No submissions match “{{query}}”",
|
||
"build_import_submission_unavailable": "Submission list not loaded",
|
||
"build_import_submission_failed": "Couldn't load submissions: {{reason}}",
|
||
"build_import_submission_more": "Listing the newest {{shown}} of {{total}}; search above to find older ones.",
|
||
"build_import_search_placeholder": "Search submissions by name, ID or submitter",
|
||
"build_import_submission_hint": "Selecting a submission automatically populates the Image Reference, Context Reference, and the corresponding Dockerfile audit header.",
|
||
"build_import_submission_warning_title": "Warning: This submission is currently \"{{status}}\"",
|
||
"build_import_submission_warning_desc": "Manually triggering a build will not automatically mark this submission as approved, nor will it update its associated build status in the database. Use for emergency debugging or testing only.",
|
||
"_users_comment": "User administration (admin-tier only).",
|
||
"users_title": "Users",
|
||
"users_subtitle": "Manage platform user accounts, quotas, and sessions.",
|
||
"users_create_btn": "Create User",
|
||
"users_create_title": "Create New User",
|
||
"users_create_desc": "Create a new platform account. Accounts are passwordless — the user signs in with an in-game /link bind code, or with email verification / a passkey once bound.",
|
||
"users_create_username_placeholder": "e.g. alice",
|
||
"users_create_validation_username": "Username is required.",
|
||
"users_create_validation_username_taken": "This username is already taken.",
|
||
"users_search_placeholder": "Search username or email...",
|
||
"users_search_btn": "Search",
|
||
"users_filter_role_all": "All Roles",
|
||
"users_filter_status_all": "All Status",
|
||
"users_filter_role": "Filter by role",
|
||
"users_filter_status": "Filter by status",
|
||
"users_status_active": "Active",
|
||
"users_status_disabled": "Disabled",
|
||
"users_role_admin": "Admin",
|
||
"users_role_owner": "Owner",
|
||
"users_role_user": "User",
|
||
"users_col_user": "User",
|
||
"users_col_role": "Role",
|
||
"users_col_servers": "Servers",
|
||
"users_col_status": "Status",
|
||
"users_col_created": "Created",
|
||
"users_view_detail": "Details",
|
||
"user_not_found_title": "No such user",
|
||
"user_not_found_body": "This account may have been deleted. Find it again from the user list.",
|
||
"users_empty_title": "No Users Found",
|
||
"users_empty_hint": "No users match the current filters.",
|
||
"users_back_to_list": "Back to user list",
|
||
"users_edit_profile": "Edit Profile",
|
||
"users_field_username": "Username",
|
||
"users_field_email": "Email",
|
||
"users_field_role": "Role",
|
||
"users_role_locked_self": "You can't change your own role.",
|
||
"users_role_locked_owner": "The owner's role is fixed. Only the host's break-glass console (sudo felis breakGlass) manages the owner.",
|
||
"users_save_btn": "Save Changes",
|
||
"users_save_ok": "Changes saved successfully.",
|
||
"users_linked_accounts": "Linked Minecraft Accounts",
|
||
"users_no_linked": "No Minecraft accounts linked yet.",
|
||
"users_link_add": "Link Account",
|
||
"users_link_source": "Auth Source",
|
||
"users_link_source_mojang": "Mojang",
|
||
"users_link_source_thirdparty": "Third-party Yggdrasil",
|
||
"users_link_confirm": "Link",
|
||
"users_unlink_tooltip": "Unlink this Minecraft account",
|
||
"users_unlink_dlg_title": "Unlink Minecraft Account",
|
||
"users_unlink_dlg_desc": "Are you sure you want to unlink this Minecraft account? The user will lose any in-game identity tied to this UUID.",
|
||
"users_unlink_btn": "Unlink",
|
||
"users_quotas": "Quotas",
|
||
"users_quota_servers": "Max Servers",
|
||
"users_quota_cpu": "Max CPU (millicore)",
|
||
"users_quota_memory": "Max Memory (MiB)",
|
||
"users_quota_storage": "Max Storage (GiB)",
|
||
"users_quota_unlimited": "Unlimited",
|
||
"users_quota_hint": "Leave a box empty for unlimited. 0 grants none of it, so every claim that needs it is refused. A cap below current use only stops new claims; servers the user already has stay.",
|
||
"users_sessions": "Sessions",
|
||
"users_no_sessions": "No active sessions.",
|
||
"users_session_expires": "Expires",
|
||
"users_sessions_revoke_all": "Revoke All",
|
||
"users_session_revoke_device": "Revoke the session on {{device}}",
|
||
"users_sessions_revoked": "All sessions revoked.",
|
||
"users_session_revoke_one_dlg_title": "Revoke Session",
|
||
"users_session_revoke_one_dlg_desc": "Are you sure you want to revoke this session? The user will be logged out from this device immediately.",
|
||
"users_session_revoke_all_dlg_title": "Revoke All Sessions",
|
||
"users_session_revoke_all_dlg_desc": "Are you sure you want to revoke all active sessions? The user will be logged out from every device.",
|
||
"users_session_revoke_confirm": "Revoke",
|
||
"users_danger_zone": "Danger Zone",
|
||
"users_protected_self": "You can't disable or delete the account you're signed in with.",
|
||
"users_protected_owner": "The owner account can't be disabled or deleted from the panel. Only the host's break-glass console (sudo felis breakGlass) manages it.",
|
||
"users_danger_disable": "Disable User",
|
||
"users_danger_disable_desc": "Prevent this user from logging in. All active sessions will be revoked immediately.",
|
||
"users_danger_disable_btn": "Disable User",
|
||
"users_danger_enable": "Enable User",
|
||
"users_danger_enable_desc": "Allow this user to log in again.",
|
||
"users_danger_enable_btn": "Enable",
|
||
"users_danger_disable_dlg_title": "Disable User",
|
||
"users_danger_disable_dlg_desc": "This user will be unable to log in. All active sessions will be revoked immediately.",
|
||
"users_danger_enable_dlg_title": "Enable User",
|
||
"users_danger_enable_dlg_desc": "This user will be able to log in again.",
|
||
"users_danger_delete_dlg_title": "Delete User",
|
||
"users_danger_delete_dlg_desc": "This action is permanent. The user's owned servers will be released, all sessions revoked, and the account permanently disabled. This cannot be undone through the panel.",
|
||
"users_danger_delete": "Delete User",
|
||
"users_danger_delete_desc": "Soft-delete this user. Owned servers are released, all sessions are revoked, and the account is permanently disabled. This action cannot be undone through the panel.",
|
||
"users_danger_delete_btn": "Delete User",
|
||
"users_danger_delete_yes": "Yes, Delete Permanently",
|
||
"users_danger_passkeys": "Unbind passkeys",
|
||
"users_danger_passkeys_desc": "Sever every passkey this account holds — the remediation when an authenticator is lost or compromised. Other login doors (email code, in-game approval) keep working.",
|
||
"users_danger_passkeys_btn": "Unbind passkeys",
|
||
"users_danger_passkeys_dlg_title": "Unbind passkeys",
|
||
"users_danger_passkeys_dlg_desc": "Every passkey for this account will be permanently removed. This is not a lockout: the user can sign in another way and re-enroll from the account page.",
|
||
"users_danger_passkeys_yes": "Yes, unbind",
|
||
"add_image_desc": "Register an external Docker image reference on the whitelist for later server creation.",
|
||
"images_search_placeholder": "Search image name or source...",
|
||
"search_no_results": "No matches",
|
||
"search_no_results_hint": "Try a different search term or filter.",
|
||
"submissions_search_placeholder": "Search modpack name or submitter...",
|
||
"trigger_build_desc": "Enter the build parameters to launch a Kaniko pipeline job in an isolated namespace.",
|
||
"builds_search_placeholder": "Search build ID, image reference, or status...",
|
||
"builds_refresh_failed": "Couldn't refresh the build list: {{reason}}",
|
||
"build_requested_by_you": "You",
|
||
"scan_title": "Security scan",
|
||
"scan_blocked": "Blocked",
|
||
"scan_passed": "Passed",
|
||
"scan_loading": "Loading the security scan…",
|
||
"scan_none": "No security scan was kept for this build. It stopped before the scan step, or it ran before builds kept their scans.",
|
||
"scan_load_failed": "Couldn't load the security scan: {{reason}}",
|
||
"scan_meta_one": "Scanned {{when}} · {{count}} package",
|
||
"scan_meta_other": "Scanned {{when}} · {{count}} packages",
|
||
"scan_policy": "Blocks on {{severities}}; vulnerabilities with no fixed release are listed only",
|
||
"scan_policy_unfixed": "Blocks on {{severities}}, including vulnerabilities with no fixed release",
|
||
"scan_counts_label": "Findings by severity",
|
||
"scan_blocking_count_one": "{{count}} blocks the image",
|
||
"scan_blocking_count_other": "{{count}} block the image",
|
||
"scan_clean": "Trivy found nothing to report in this image.",
|
||
"scan_showing": "Showing {{shown}} of {{total}} findings. The full report lists every one.",
|
||
"scan_col_id": "ID",
|
||
"scan_col_severity": "Severity",
|
||
"scan_col_package": "Package",
|
||
"scan_col_version": "Installed → fixed",
|
||
"scan_col_target": "Found in",
|
||
"scan_no_fix": "no fix yet",
|
||
"scan_blocks": "Blocks",
|
||
"scan_policy_accepts_one": "{{count}} ID accepted as a known risk",
|
||
"scan_policy_accepts_other": "{{count}} IDs accepted as known risks",
|
||
"scan_accepted": "Accepted",
|
||
"scan_accepted_title": "Listed in [registry] scan_accept as a known risk, so it never blocks.",
|
||
"scan_secret": "Secret: {{title}}",
|
||
"scan_download_report": "Trivy report",
|
||
"scan_download_sbom": "SBOM",
|
||
"scan_not_kept": "Not kept with this build: the file was too large, or the step that writes it failed.",
|
||
"scan_download_failed": "Couldn't download: {{reason}}",
|
||
"platform_title": "Platform settings",
|
||
"platform_subtitle": "Global controls for server startup and wake requests.",
|
||
"platform_reload": "Reload",
|
||
"platform_wake_title": "Startup and wake policy",
|
||
"platform_loading": "Loading the saved policy…",
|
||
"platform_limit": "Running server limit (0–10000)",
|
||
"platform_limit_hint": "0 means unlimited. New starts count servers already running or requested to run; system services can always start. Lowering the limit does not stop existing servers.",
|
||
"platform_cooldown": "Wake cooldown (0–3600 seconds)",
|
||
"platform_cooldown_hint": "Minimum interval between accepted wake requests for the same server. 0 disables the cooldown.",
|
||
"platform_scope": "The limit applies to panel starts, in-game wakes and scheduled starts. It is an admission check; available memory still determines whether Kubernetes can schedule a server. User quotas remain under Users.",
|
||
"platform_saved": "Saved. The new policy is active without a restart.",
|
||
"platform_unsaved": "Unsaved changes",
|
||
"platform_live": "Saved changes apply immediately on all API replicas.",
|
||
"platform_discard": "Discard changes",
|
||
"platform_save": "Save and apply"
|
||
}
|