# English strings. Each entry sets MSG[]. Loaded by lib/i18n.sh. # Keep keys in sync with i18n/ru.sh. MSG[yes]="yes" MSG[no]="no" MSG[default_label]="default" MSG[invalid_input]="Invalid input, please try again." MSG[aborted]="Aborted." MSG[enter_to_keep]="(Enter to keep default)" # -- preflight ------------------------------------------------------------- MSG[err_bash_version]="Bash 4+ is required (found %s). Install a newer bash." MSG[err_need_docker]="Docker is not installed or not on PATH. See https://docs.docker.com/get-docker/" MSG[err_docker_daemon]="The Docker daemon is not reachable. Is Docker running?" MSG[err_need_compose]="Docker Compose v2 is required ('docker compose'). Update Docker Desktop or install the compose plugin." MSG[err_need_openssl]="openssl is required to generate secrets." MSG[preflight_ok]="Preflight checks passed." MSG[port_in_use]="Port %s looks busy. Choose another or stop whatever is using it." # -- locale / welcome ------------------------------------------------------ MSG[choose_locale]="Choose language / Выберите язык" MSG[welcome_title]="MCMA installer" MSG[welcome_body]="This wizard will ask a few questions, generate a .env.deploy and docker-compose.yml, pull the images, run database migrations, create the first admin and verify everything is healthy. Secrets are generated for you — nothing secret is printed. Press Ctrl+C any time to abort cleanly." # -- existing install ------------------------------------------------------ MSG[existing_found]="An existing installation was found (.env.deploy). What would you like to do?" MSG[menu_update_images]="Update images (pull + restart, keep config)" MSG[menu_reconfigure]="Reconfigure (back up current config, run the wizard again)" MSG[menu_cancel]="Cancel" MSG[backup_made]="Backed up current config to %s" # -- services -------------------------------------------------------------- MSG[step_services]="Which services do you want to run?" MSG[svc_backend]="mcma-backend — core app + sync node + worker (required)" MSG[svc_webui]="mcma-webui — web interface" MSG[backend_required]="The backend is required and cannot be disabled." # -- image tag ------------------------------------------------------------- MSG[step_tag]="Which image tag should be deployed?" MSG[tag_latest]="latest — always the newest build (may occasionally break)" MSG[tag_custom]="Enter a specific tag (e.g. a release version)" MSG[tag_prompt]="Image tag" # -- database -------------------------------------------------------------- MSG[step_db]="Database" MSG[db_embedded]="Use the built-in Postgres (recommended)" MSG[db_external]="Connect to an external Postgres" MSG[db_host]="Postgres host" MSG[db_port]="Postgres port" MSG[db_name]="Database name" MSG[db_user]="Database user" MSG[db_pass]="Database password" # -- redis ----------------------------------------------------------------- MSG[step_redis]="Redis" MSG[redis_embedded]="Use the built-in Redis (recommended)" MSG[redis_external]="Connect to an external Redis" MSG[redis_url_prompt]="Redis URL (redis://host:port/db)" # -- storage --------------------------------------------------------------- MSG[step_storage]="Where should media files be stored?" MSG[storage_local]="Local directory on the host (recommended)" MSG[storage_s3]="S3-compatible object storage" MSG[storage_path_prompt]="Host directory for media" MSG[s3_choice]="S3 storage" MSG[s3_embedded]="Use built-in MinIO" MSG[s3_external]="Connect to an external S3 endpoint" MSG[s3_endpoint]="S3 endpoint URL (https://...)" MSG[s3_bucket]="S3 bucket name" MSG[s3_region]="S3 region (blank if not applicable)" MSG[s3_key]="S3 access key" MSG[s3_secret]="S3 secret key" # -- network --------------------------------------------------------------- MSG[step_network]="Network & access" MSG[proxy_note]="The web UI and API must share one origin. The bundled Caddy proxy does that for you as a single entrypoint." MSG[net_caddy_http]="Bundled reverse proxy (Caddy), plain HTTP on a port — recommended" MSG[net_caddy_https]="Bundled reverse proxy (Caddy), automatic HTTPS for a domain" MSG[net_direct]="No bundled proxy — publish ports / I run my own proxy" MSG[direct_cors_warn]="Without the bundled proxy the web UI and API must be same-origin: the backend sends no CORS headers, so a cross-origin API URL will be blocked by the browser. Use '/api/v1' only if your own proxy serves both on one origin." MSG[domain_prompt]="Domain name (e.g. music.example.com)" MSG[acme_email_prompt]="Email for Let's Encrypt (optional, for expiry notices)" MSG[http_port_prompt]="HTTP port to publish" MSG[api_port_prompt]="Backend API port to publish" MSG[webui_port_prompt]="Web UI port to publish" MSG[public_api_prompt]="Browser-facing API base URL" # -- admin ----------------------------------------------------------------- MSG[step_admin]="First administrator" MSG[admin_q]="Create the first admin user now?" MSG[admin_user]="Admin username" MSG[admin_pass]="Admin password (min 8 chars)" MSG[admin_pass_confirm]="Confirm admin password" MSG[pass_mismatch]="Passwords do not match." MSG[pass_too_short]="Password must be at least 8 characters." MSG[admin_skip_note]="You can create an admin later with: make logs (see README)." # -- ml -------------------------------------------------------------------- MSG[step_ml]="Optional ML service" MSG[ml_prompt]="ML service URL (leave blank — backend degrades gracefully)" # -- enrichment / acoustid ------------------------------------------------- MSG[step_enrichment]="Metadata enrichment (optional)" MSG[enrichment_note]="Imported files are auto-tagged from their embedded tags. Add an AcoustID key to also identify untagged files by audio fingerprint (free: https://acoustid.org/new-application)." MSG[acoustid_prompt]="AcoustID API key (leave blank to use embedded tags only)" MSG[musicbrainz_note]="MusicBrainz/AcoustID require a contact email in their User-Agent or they may throttle requests." MSG[musicbrainz_email_prompt]="Contact email for MusicBrainz/AcoustID (leave blank to use the project's default)" # -- summary / run --------------------------------------------------------- MSG[summary_title]="Summary (secrets hidden)" MSG[summary_services]="Services" MSG[summary_tag]="Image tag" MSG[summary_db]="Database" MSG[summary_redis]="Redis" MSG[summary_storage]="Storage" MSG[summary_access]="Access" MSG[confirm_start]="Generate config and start now?" MSG[embedded]="built-in" MSG[external]="external" MSG[pull_images]="Pulling images (%s)..." MSG[pull_hint]="If pulls fail with 'unauthorized', run 'docker login git.ollyhearn.ru' first (private registry)." MSG[starting_deps]="Starting backing services..." MSG[waiting_health]="Waiting for %s to become healthy..." MSG[running_migrations]="Running database migrations..." MSG[creating_admin]="Creating the first admin..." MSG[starting_app]="Starting application services..." MSG[checking_health]="Verifying the API is healthy..." # -- done / errors --------------------------------------------------------- MSG[done_title]="MCMA is up." MSG[done_url]="Open" MSG[done_config]="Config (keep private)" MSG[done_admin_login]="Admin username" MSG[done_commands]="Manage with: make status | make logs | make update | make down" MSG[err_migrations_failed]="Migrations failed. The backend was NOT started over a broken database. Check 'make logs'." MSG[err_health_timeout]="The API did not become healthy in time. Check 'make logs' and 'make status'." MSG[hint_logs]="Run 'make logs' to see what went wrong." MSG[no_config]="No installation found. Run 'make deploy' first." MSG[clean_confirm]="Remove generated config files?" MSG[clean_volumes_confirm]="Also DELETE all data volumes (database, media)? This is irreversible." MSG[clean_done]="Cleaned up."