mirror of
https://github.com/PRVTPRO/Amnezia-Web-Panel.git
synced 2026-10-23 03:37:36 +09:00
The panel could already show a user their configuration, put it behind a share link or push it through the Telegram bot. Email was the one channel missing, and the one most admins fall back to a hand-written script for. Adds an SMTP block to /settings (host, port, none/STARTTLS/SSL, credentials, sender, Reply-To, timeout) with a one-click test message, a "send by email" action on every user card, and a mass send from the Users toolbar. What travels: AmneziaWG / WireGuard peers as .conf attachments plus the vpn:// key, Xray and Telemt as links -- their config *is* the link, so a .conf would be a file no client can import. Files and links are independent switches. The config text comes from the same manager call the share page and the bot already use, so a protocol that renders in the UI renders in the mail. The mass send runs in a worker thread over a single SMTP session (a fresh connection per message is what gets a sending account throttled) and the dialog polls its progress: sent, skipped -- no address, disabled, no connections yet -- and failed, each with the reason next to the name. One unreachable node costs that one connection, not the message and not the run. Details worth knowing: - The stored SMTP password is never echoed back to the page; an empty field on save keeps it, a blank one clears it. - Messages are text plus an HTML alternative styled with the panel's own light-theme tokens and appearance title/logo -- no third-party branding. - A multi-line subject is folded instead of raising: EmailMessage refuses linefeeds in headers. - If the SMTP settings go bad between the click and the worker thread, the job finishes with an error rather than staying "running" forever and blocking every later run with a 409. tests/test_mail_service.py covers the settings merge, the transport (STARTTLS, login, reconnect after a dropped session), message shape and attachment naming, the single send and every branch of the bulk counters, plus the API surface (auth, password round-trip, translated errors). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
677 lines
36 KiB
JSON
677 lines
36 KiB
JSON
{
|
|
"nav_servers": "Servers",
|
|
"nav_users": "Users",
|
|
"nav_settings": "Settings",
|
|
"nav_connections": "Connections",
|
|
"nav_logout": "Logout",
|
|
"theme_dark": "Dark",
|
|
"theme_light": "Light",
|
|
"back_to_servers": "← Back to servers",
|
|
"server_check": "Check",
|
|
"server_checking": "Checking...",
|
|
"protocols": "Protocols",
|
|
"install": "Install",
|
|
"uninstall": "Uninstall",
|
|
"run": "Running",
|
|
"stop": "Stopped",
|
|
"not_installed": "Not installed",
|
|
"installed": "Installed",
|
|
"add_server": "Add Server",
|
|
"no_servers": "No servers added",
|
|
"name": "Name",
|
|
"host": "Host",
|
|
"port": "Port",
|
|
"status": "Status",
|
|
"actions": "Actions",
|
|
"edit": "Edit",
|
|
"delete": "Delete",
|
|
"save": "Save",
|
|
"cancel": "Cancel",
|
|
"loading": "Loading...",
|
|
"copy": "Copy",
|
|
"download": "Download",
|
|
"config": "Configuration",
|
|
"qr_code": "QR code",
|
|
"vpn_key": "VPN key",
|
|
"clients": "Clients",
|
|
"traffic": "Traffic",
|
|
"limit": "Limit",
|
|
"manage": "Manage",
|
|
"no_protocols": "No protocols",
|
|
"add_server_desc": "Add your first VPN server to get started. You'll need SSH credentials to connect.",
|
|
"ssh_host": "Host / IP",
|
|
"ssh_port": "SSH Port",
|
|
"ssh_user": "User",
|
|
"ssh_password": "Password",
|
|
"ssh_key": "SSH Key",
|
|
"ssh_key_placeholder": "Private SSH Key",
|
|
"ssh_key_hint": "Paste the content of your id_rsa or id_ed25519 file",
|
|
"connect": "Connect",
|
|
"connecting": "Connecting...",
|
|
"server_added": "Server added successfully",
|
|
"server_deleted": "Server deleted",
|
|
"delete_confirm": "Are you sure you want to delete this server?",
|
|
"success": "Success",
|
|
"error": "Error",
|
|
"info": "Info",
|
|
"login_title": "Login to Panel",
|
|
"username": "Username",
|
|
"password": "Password",
|
|
"captcha": "Captcha",
|
|
"captcha_placeholder": "Enter characters from image",
|
|
"captcha_hint": "Click to refresh image",
|
|
"login": "Login",
|
|
"logging_in": "Logging in...",
|
|
"login_error": "Login failed",
|
|
"check_done": "Check complete",
|
|
"check_error": "Connection error",
|
|
"ssh_ok": "SSH Connection",
|
|
"docker_ok": "Docker",
|
|
"docker_not_installed": "Docker not installed",
|
|
"awg_desc": "A newer version of the protocol based on awg-go. Supports advanced obfuscation with S3, S4 parameters.",
|
|
"awg3_desc": "Builds on 2.0 with header protection and content padding. Handshake and rekey timings are randomized, leaving no fixed timing signature.",
|
|
"awg_mtu": "MTU",
|
|
"awg_mtu_hint": "Goes into generated client configs. Amnezia's own clients use 1376.",
|
|
"awg_settings_btn": "AWG",
|
|
"awg_settings_title": "AmneziaWG settings",
|
|
"awg_settings_desc": "Applied to configs generated from now on. Clients that already imported a config keep their old values until they import it again.",
|
|
"awg_settings_saved": "AmneziaWG settings saved",
|
|
"awg_special_junk": "Special junk packets (I1-I5)",
|
|
"awg_special_junk_hint": "Sent right before the handshake, so a session starts with bytes that look like another protocol. The default I1 imitates a DNS response.",
|
|
"awg_special_junk_syntax": "Tags: <b 0xHEX> fixed bytes, <r N> random bytes, <rc N> letters, <rd N> digits, <c> packet counter, <t> unix time.",
|
|
"awg_special_junk_reset": "Default",
|
|
"awg_legacy_desc": "Original AWG version based on WireGuard kernel. Compatible with older client versions.",
|
|
"xray_desc": "Modern protocol that masks traffic as regular web traffic (XTLS-Reality). Resistant to deep packet analysis.",
|
|
"wireguard_desc": "Standard and fastest VPN protocol. Supported natively on all modern OS, but easily detected by DPI.",
|
|
"not_checked": "Not checked",
|
|
"connections": "Connections",
|
|
"add": "Add",
|
|
"loading_connections": "Loading connections...",
|
|
"no_connections": "No connections",
|
|
"no_connections_desc": "Add your first connection to generate a VPN configuration",
|
|
"install_protocol": "Install protocol",
|
|
"port_default_hint": "Default port: 55424. Make sure it's not busy",
|
|
"port_xray_hint": "Default port: 443 (recommended for Xray). Make sure it's not taken by another web server.",
|
|
"reinstall": "Reinstall",
|
|
"uninstall_confirm": "Uninstall {}? All connections and configurations will be lost.",
|
|
"stop_container_confirm": "Stop container {}?",
|
|
"start_container_confirm": "Start container {}?",
|
|
"stopping": "Stopping",
|
|
"starting": "Starting",
|
|
"stopped": "stopped",
|
|
"started": "started",
|
|
"server_config": "Server configuration",
|
|
"add_connection": "Add connection",
|
|
"connection_name": "Connection name",
|
|
"connection_name_placeholder": "Example: iPhone, Laptop",
|
|
"assign_to_user": "Assign to user (optional)",
|
|
"no_assign": "— No assignment —",
|
|
"select_search_placeholder": "Search...",
|
|
"select_search_empty": "No matches",
|
|
"create": "Create",
|
|
"creating": "Creating...",
|
|
"connection_created": "Connection \"{}\" created",
|
|
"delete_connection_confirm": "Delete this connection? The configuration will stop working.",
|
|
"connection_deleted": "Connection deleted",
|
|
"self_service_title": "Self-Service",
|
|
"self_service_enabled": "Enable self-service",
|
|
"self_service_enabled_desc": "Allow users to create and manage their own VPN connections",
|
|
"self_service_web": "Enable web self-service",
|
|
"self_service_telegram": "Enable Telegram self-service",
|
|
"self_service_max_conns": "Max connections per user",
|
|
"self_service_rate_limit": "Rate limit (creations)",
|
|
"self_service_rate_window": "Rate window (seconds)",
|
|
"self_service_protocols": "Allowed protocols",
|
|
"server_self_service_enabled": "Allow self-service",
|
|
"server_self_service_enabled_desc": "Users can create connections on this server",
|
|
"create_connection": "Create connection",
|
|
"delete_connection": "Delete",
|
|
"connections_counter": "Connections: {0} / {1}",
|
|
"device_name": "Device name",
|
|
"self_service_disabled": "Self-service is not enabled.",
|
|
"config_tab": "📄 Config",
|
|
"vpn_key_tab": "🔑 VPN-key",
|
|
"qr_code_tab": "📱 QR-code",
|
|
"copy_config": "📋 Copy",
|
|
"download_conf": "⬇ Download .conf",
|
|
"copy_key": "📋 Copy key",
|
|
"vpn_link_hint": "Paste this link into the AmneziaVPN app for automatic configuration",
|
|
"qr_hint": "Scan the QR code in the AmneziaVPN app",
|
|
"qr_format_amnezia": "Amnezia",
|
|
"qr_format_wireguard": "Plain",
|
|
"qr_format_amnezia_hint": "Animated series for AmneziaVPN, carries the server name. Hold the camera until every frame is read —",
|
|
"qr_format_wireguard_hint": "The config or link as it is, for AmneziaWG, wg-quick and other clients. The server name is not passed on.",
|
|
"no_data": "No data",
|
|
"start_btn": "▶ Start",
|
|
"stop_btn": "⏹ Stop",
|
|
"config_btn": "⚙️ Config",
|
|
"done": "Done",
|
|
"installing": "Installing...",
|
|
"start_install": "Starting installation...",
|
|
"check_docker": "Checking Docker...",
|
|
"prepare_host": "Preparing host...",
|
|
"build_container": "Building container...",
|
|
"install_success": "Protocol installed successfully!",
|
|
"install_error": "Installation error: ",
|
|
"qr_error": "Failed to generate QR code",
|
|
"users_title": "Users",
|
|
"search_placeholder": "Search by name, email or Telegram...",
|
|
"add_user": "Add User",
|
|
"prev_page": "← Back",
|
|
"next_page": "Next →",
|
|
"page_info": "Page {} of {}",
|
|
"loading_users": "Loading users...",
|
|
"nothing_found": "Nothing found",
|
|
"search_empty_desc": "Try changing your query or create a new user",
|
|
"username_label": "Username",
|
|
"password_label": "Password",
|
|
"role_label": "Role",
|
|
"role_user_desc": "User — view only own connections",
|
|
"role_support_desc": "Support — server management",
|
|
"role_admin_desc": "Admin — full access",
|
|
"tg_id_label": "Telegram ID (opt.)",
|
|
"email_label": "Email (opt.)",
|
|
"traffic_limit_label": "Traffic limit (GB) (opt., 0 = ∞)",
|
|
"expiration_date_label": "Expiration date",
|
|
"description_label": "Description (opt.)",
|
|
"auto_conn_title": "Automatic connection creation (optional)",
|
|
"server_label": "Server",
|
|
"no_create_conn": "— Do not create connection —",
|
|
"protocol_label": "Protocol",
|
|
"edit_user_title": "Edit user: {}",
|
|
"edit_user_tg": "Telegram ID (optional)",
|
|
"edit_user_email": "Email (optional)",
|
|
"edit_user_limit": "Traffic limit (GB) (0 = ∞)",
|
|
"new_password_hint": "New password (leave empty if no change needed)",
|
|
"op_type_label": "Operation type",
|
|
"create_new_conn": "Create new connection",
|
|
"link_existing_conn": "Link existing",
|
|
"select_existing_conn": "Select existing connection",
|
|
"existing_conn_hint": "Only connections not linked to users will be shown. Hold Ctrl to select several",
|
|
"conn_name_panel": "Connection name (in panel)",
|
|
"user_conns_title": "User connections",
|
|
"no_free_conns": "No free connections",
|
|
"linking": "Linking...",
|
|
"conn_linked": "Connection linked",
|
|
"enabling": "Enabling",
|
|
"disabling": "Disabling",
|
|
"user_enabled": "User enabled",
|
|
"user_disabled": "User disabled",
|
|
"delete_user_confirm": "Delete user? All their connections will be deleted.",
|
|
"share_access": "Share access",
|
|
"enable_public_access": "Enable public access",
|
|
"share_password_label": "Password (optional)",
|
|
"share_password_hint": "If set, user must enter it",
|
|
"public_link_label": "Public link",
|
|
"disabled": "Disabled",
|
|
"out_of": "Of",
|
|
"settings_title": "Panel Settings",
|
|
"appearance": "🎨 Appearance",
|
|
"title_label": "Title",
|
|
"logo_label": "Logo (Emoji or symbol)",
|
|
"subtitle_label": "Subtitle",
|
|
"captcha_title": "🔐 Captcha",
|
|
"enable_captcha": "Enable captcha (multicolorcaptcha)",
|
|
"telegram_bot_title": "🤖 Telegram Bot",
|
|
"bot_token_label": "Bot Token (from @BotFather)",
|
|
"bot_status": "Status",
|
|
"bot_running": "✅ Running",
|
|
"bot_stopped": "⏹ Stopped",
|
|
"bot_stop_btn": "⏹ Stop",
|
|
"bot_start_btn": "▶️ Start",
|
|
"bot_hint": "After changing the token, save the settings — the bot will restart automatically. Users must have a Telegram ID in their profile.",
|
|
"api_docs_title": "🔌 API Documentation",
|
|
"api_docs_hint": "Use these interfaces to explore the panel's API capabilities",
|
|
"tunnels_title": "Tunnels",
|
|
"local_server": "Local Server",
|
|
"tunnel_install_enable": "Install & Enable",
|
|
"tunnel_enable": "Enable Tunnel",
|
|
"tunnel_running": "Tunnel running",
|
|
"tunnel_stop": "Stop",
|
|
"tunnel_stopping": "Stopping...",
|
|
"tunnel_stopped": "Tunnel stopped",
|
|
"tunnel_delete": "Delete",
|
|
"tunnel_deleted": "Tunnel deleted",
|
|
"tunnel_delete_confirm": "Stop and delete this panel-managed tunnel binary?",
|
|
"tunnel_starting": "Starting tunnel...",
|
|
"tunnel_started": "Tunnel started",
|
|
"tunnel_waiting_url": "Tunnel started. Waiting for public URL...",
|
|
"tunnel_no_public_url": "Public URL will appear here after the tunnel starts.",
|
|
"tunnels_hint": "Quick tunnels expose this local panel to the internet. Keep admin credentials strong and share public URLs only with trusted users.",
|
|
"ngrok_authtoken_placeholder": "ngrok authtoken (optional for some accounts)",
|
|
"import_users_title": "📤 Import Users",
|
|
"import_source_label": "Import / Sync Source",
|
|
"remnawave_url_label": "Remnawave URL",
|
|
"api_key_label": "API Key",
|
|
"enable_sync": "Enable synchronization",
|
|
"sync_hint": "Users will be created, disabled, and deleted automatically based on Remnawave data",
|
|
"sync_now_btn": "🔄 Sync now",
|
|
"delete_sync_btn": "🗑 Delete synchronization",
|
|
"auto_create_conns": "Create connections automatically",
|
|
"sync_server_label": "Server for new connections",
|
|
"save_changes": "💾 Save changes",
|
|
"sync_success": "Sync completed: {} users",
|
|
"sync_deleted": "Deleted {} synced users",
|
|
"delete_sync_confirm": "Are you sure you want to delete ALL synced users and their connections? This action is irreversible.",
|
|
"settings_saved": "Settings saved successfully",
|
|
"bot_started": "Bot started",
|
|
"bot_stopped_msg": "Bot stopped",
|
|
"sync_running": "Syncing...",
|
|
"deleting": "Deleting...",
|
|
"my_connections_title": "My Connections",
|
|
"show_config": "📄 Show config",
|
|
"no_connections_user_desc": "Contact administrator to create a VPN connection",
|
|
"share_title": "Connection Access",
|
|
"vpn_access": "VPN Access",
|
|
"user_label_share": "User",
|
|
"share_protected_desc": "This access is password protected. Please enter it to continue.",
|
|
"auth_success": "Auth success",
|
|
"loading_share_conns": "Loading connections...",
|
|
"no_active_conns": "You have no active connections yet.",
|
|
"show_settings_btn": "🔑 Show settings",
|
|
"copied": "Copied!",
|
|
"active": "Active",
|
|
"site_description": "Amnezia Web Panel — management of VPN servers and protocols AmneziaWG",
|
|
"toggle_theme": "Change theme",
|
|
"copied_to_clipboard": "Copied to clipboard",
|
|
"share_not_found": "404 Not Found",
|
|
"share_not_found_desc": "Either the link is incorrect or access has been disabled.",
|
|
"invalid_captcha": "Invalid captcha",
|
|
"account_disabled": "Account disabled",
|
|
"invalid_login": "Invalid login or password",
|
|
"user_exists": "User with this name already exists",
|
|
"cannot_delete_self": "You cannot delete yourself",
|
|
"wrong_share_password": "Wrong password",
|
|
"saving": "Saving...",
|
|
"select_lang": "Select Language",
|
|
"lang_ru": "Русский",
|
|
"lang_en": "English",
|
|
"lang_fr": "Français",
|
|
"lang_zh": "中文 (Chinese)",
|
|
"lang_fa": "فارسی (Persian)",
|
|
"backup_title": "Simple Backup",
|
|
"download_backup": "Download data.json",
|
|
"restore_backup": "Restore from file",
|
|
"restore_confirm": "Are you sure? Current data will be overwritten and the application will restart.",
|
|
"restore_success": "Backup restored successfully!",
|
|
"auto_backup_title": "Auto backup",
|
|
"enable_auto_backup": "Enable server auto backups",
|
|
"auto_backup_interval_label": "Creation interval",
|
|
"auto_backup_hint": "The panel will create backups of installed protocols on every server at the selected interval.",
|
|
"auto_backup_last_run": "Last run",
|
|
"auto_backup_last_status": "Status",
|
|
"auto_backup_created_count": "Backups created",
|
|
"hours_suffix": "h",
|
|
"invalid_backup_file": "Invalid backup file or structure",
|
|
"config_unavailable": "Configuration unavailable",
|
|
"config_unavailable_desc": "This client was created via the native Amnezia app.\\nThe private key is stored only on the user's device and cannot be recovered by the server.",
|
|
"client_public_key": "Client public key:",
|
|
"telemt_desc": "MTProxy-based Telegram proxy with advanced obfuscation and TLS emulation support.",
|
|
"tls_emulation": "TLS Emulation",
|
|
"tls_domain": "Masking Domain",
|
|
"max_connections_limit": "Max Connections",
|
|
"max_connections_hint": "0 for unlimited. Limits total concurrent users.",
|
|
"traffic_reset_strategy_label": "Traffic reset strategy",
|
|
"traffic_reset_never": "Never reset",
|
|
"traffic_reset_daily": "Daily reset",
|
|
"traffic_reset_weekly": "Weekly reset",
|
|
"traffic_reset_monthly": "Monthly reset",
|
|
"traffic_reset_hint": "How often should user traffic be reset",
|
|
"traffic_used_total": "Total spent",
|
|
"traffic_reset_info": "Next reset: {}",
|
|
"services": "Services",
|
|
"dns_desc": "Personal DNS server to block ads and protect the privacy of your queries.",
|
|
"dns_internal_hint": "The service runs on the internal network (172.29.172.254) without binding to host ports.",
|
|
"telemt_port_hint": "Port for the Telegram proxy (typically 443).",
|
|
"socks5_desc": "Single-account SOCKS5 proxy (3proxy) with username/password authentication.",
|
|
"socks5_username": "Username",
|
|
"socks5_password": "Password",
|
|
"socks5_password_placeholder": "Leave empty to auto-generate",
|
|
"socks5_password_hint": "If left empty, a random 16-character password will be generated.",
|
|
"socks5_port_hint": "TCP port the proxy will listen on. The default in the official Amnezia client is 38080.",
|
|
"socks5_change_settings": "Change settings",
|
|
"socks5_settings_title": "SOCKS5 — Connection settings",
|
|
"socks5_port_change_hint": "Changing the port recreates the container; existing sessions will be dropped.",
|
|
"socks5_settings_saved": "SOCKS5 settings saved",
|
|
"adguard_desc": "AdGuard Home — DNS-based ad blocker with a web admin UI.",
|
|
"adguard_mode": "Installation mode",
|
|
"adguard_mode_sidebyside": "Side-by-side",
|
|
"adguard_mode_sidebyside_hint": "runs alongside AmneziaDNS on a separate internal IP (172.29.172.253)",
|
|
"adguard_mode_replace": "Replace AmneziaDNS",
|
|
"adguard_mode_replace_hint": "removes amnezia-dns and takes its IP — VPN clients use AdGuard immediately",
|
|
"adguard_dns_port": "DNS port (53)",
|
|
"adguard_dns_port_hint": "Internal DNS port served to VPN clients via the docker network.",
|
|
"adguard_web_port": "Web UI port",
|
|
"adguard_dot_port": "DoT port",
|
|
"adguard_doh_port": "DoH port",
|
|
"adguard_expose_web": "Expose to internet",
|
|
"adguard_expose": "Expose to host",
|
|
"adguard_install_hint": "Initial AdGuard setup runs through its built-in wizard via the web UI after install.",
|
|
"adguard_internal_ip": "Internal IP",
|
|
"adguard_web_ui": "Admin URL",
|
|
"adguard_open_ui": "Open Web UI",
|
|
"edit_server_title": "Edit server",
|
|
"edit_keep_credential": "Leave empty to keep the current value",
|
|
"server_saved": "Server settings saved",
|
|
"servers_reordered": "Servers reordered",
|
|
"ping_checking": "Checking connectivity...",
|
|
"offline": "offline",
|
|
"api_tokens_title": "API tokens",
|
|
"api_tokens_hint": "Bearer tokens for external integrations. Send the token in the `Authorization: Bearer <token>` header. Tokens have admin-equivalent rights and stop working if their owner is disabled or demoted.",
|
|
"api_tokens_empty": "No API tokens yet. Create one to integrate the panel with an external service.",
|
|
"api_tokens_create": "Create token",
|
|
"api_tokens_create_title": "Create API token",
|
|
"api_tokens_name_label": "Name",
|
|
"api_tokens_name_placeholder": "e.g. Linear integration, CI bot, monitoring",
|
|
"api_tokens_name_hint": "Used to identify this token in the list. The token value itself is generated for you.",
|
|
"api_tokens_name_required": "Token name is required",
|
|
"api_tokens_created_title": "Token created",
|
|
"api_tokens_value_label": "Token value",
|
|
"api_tokens_warning_title": "This is the only time you'll see this token.",
|
|
"api_tokens_warning_body": "Copy it now and store it in your integration's secret manager. The panel keeps only a hash — if you lose this value you'll need to revoke and recreate the token.",
|
|
"api_tokens_revoke": "Revoke",
|
|
"api_tokens_revoke_confirm": "Revoke token \"{}\"? Any integration using it will stop working.",
|
|
"api_tokens_revoked": "Token revoked",
|
|
"api_tokens_created": "Created",
|
|
"api_tokens_last_used": "Last used",
|
|
"api_tokens_owner": "Owner",
|
|
"api_tokens_never": "never",
|
|
"coming_soon": "Coming soon",
|
|
"promo_star_cta": "Star us on GitHub",
|
|
"aivpn_subtitle": "AI-driven protocol selection that picks the right tunnel for the moment. Land it sooner — drop a star.",
|
|
"revproxy_title": "Reverse Proxy",
|
|
"revproxy_subtitle": "High-performance traffic obfuscation: hide your VPN endpoint behind a polished public-facing site, drop the DPI footprint.",
|
|
"management": "Management",
|
|
"server_management": "Server Management",
|
|
"server_management_desc": "Perform system-level actions on your machine.",
|
|
"check_server_services": "Check the server services",
|
|
"reboot_server": "Reboot server",
|
|
"clear_server": "Clear server",
|
|
"remove_server": "Remove server from panel",
|
|
"ssl_title": "SSL / HTTPS Settings",
|
|
"enable_https": "Enable HTTPS",
|
|
"panel_port_label": "Panel Port",
|
|
"domain_label": "Domain name",
|
|
"cert_path_label": "SSL Certificate path (.pem)",
|
|
"key_path_label": "Private Key path (.pem)",
|
|
"or_paste_text": "OR paste certificate text",
|
|
"cert_text_label": "Certificate content (CRT)",
|
|
"key_text_label": "Private Key content (KEY)",
|
|
"ssl_hint": "After enabling, the panel will be accessible via https:// on the specified domain. Make sure the file paths or text data are correct.",
|
|
"about_title": "About & Updates",
|
|
"current_version": "Current version",
|
|
"check_updates": "Check for updates",
|
|
"checking_updates": "Checking...",
|
|
"update_available": "New version available",
|
|
"download_update": "Download update",
|
|
"up_to_date": "You have the latest version",
|
|
"warp_hint": "WARP routes this host outbound through Cloudflare. It does not create a public panel URL like Quick Tunnel or ngrok.",
|
|
"warp_install_hint": "Install the official Cloudflare WARP client first, then restart the panel.",
|
|
"warp_install_required": "Install WARP first",
|
|
"warp_connect": "Connect WARP",
|
|
"warp_disconnect": "Disconnect",
|
|
"warp_connected": "WARP connected",
|
|
"warp_disconnected": "WARP disconnected",
|
|
"warp_status_unknown": "WARP status is unknown.",
|
|
"warp_status_not_installed": "Cloudflare WARP CLI is not installed on this host.",
|
|
"warp_status_connected": "Cloudflare WARP is connected.",
|
|
"warp_status_connecting": "Cloudflare WARP is connecting.",
|
|
"warp_status_disconnected": "Cloudflare WARP is disconnected.",
|
|
"warp_status_not_registered": "Cloudflare WARP is installed but not registered yet. Connect will try to register automatically.",
|
|
"warp_status_service_unavailable": "Cloudflare WARP service is not available. Make sure warp-svc is running.",
|
|
"warp_status_error": "Cloudflare WARP returned an error.",
|
|
"install_starting": "Starting installation...",
|
|
"server_check_complete": "Check completed",
|
|
"server_connection_error": "Connection error",
|
|
"connections_load_error": "Error loading connections",
|
|
"connection_updated": "Connection updated",
|
|
"edit_connection": "Edit connection",
|
|
"enable_connection_progress": "Enabling connection...",
|
|
"disable_connection_progress": "Disabling connection...",
|
|
"connection_enabled": "Connection enabled",
|
|
"connection_disabled": "Connection disabled",
|
|
"gb": "GB",
|
|
"marketplace": "Templates",
|
|
"open_marketplace": "Open Templates",
|
|
"marketplace_desc": "Install protocol and service templates available for this server.",
|
|
"installed_apps": "Installed applications",
|
|
"installed_apps_hint": "Only installed protocols and services are shown here. Use Templates to add more.",
|
|
"no_installed_apps": "No installed applications yet",
|
|
"no_installed_apps_desc": "Open Templates to install protocols or services on this server.",
|
|
"install_another": "Install another",
|
|
"new_instance": "new instance",
|
|
"port_next_instance_hint": "Choose a free UDP port for the additional instance.",
|
|
"checking_server": "Checking server services...",
|
|
"web_servers": "Web servers",
|
|
"nginx_desc": "NGINX web server with Let's Encrypt HTTPS certificate and editable index.html.",
|
|
"nginx_domain": "Domain",
|
|
"nginx_email": "Let's Encrypt email",
|
|
"nginx_port_hint": "HTTPS port exposed on the server. Port 80/TCP must be free and reachable for Let's Encrypt validation.",
|
|
"nginx_install_hint": "The domain must already point to this server. Port 80/TCP is used temporarily/permanently for HTTP-01 certificate validation.",
|
|
"site": "Site",
|
|
"site_editor": "Site editor",
|
|
"site_saved": "Site saved",
|
|
"nginx_dns_hint": "Create this DNS record before installation:",
|
|
"backup": "Backup",
|
|
"backups": "Backups",
|
|
"backup_desc": "Backups are created on the server and contain valuable protocol files needed to restore or recreate it later.",
|
|
"create_backup": "Create backup",
|
|
"creating_backup": "Creating backup...",
|
|
"backup_created": "Backup created",
|
|
"no_backups": "No backups yet",
|
|
"no_backups_desc": "Create the first backup for this protocol.",
|
|
"refresh": "Refresh",
|
|
"rename": "Rename",
|
|
"connection_renamed": "Connection renamed",
|
|
"enter_connection_name": "Enter a new connection name",
|
|
"config_saved": "Config saved",
|
|
"reset_traffic": "Reset traffic",
|
|
"resetting": "Resetting...",
|
|
"reset_traffic_confirm": "Reset this user's current traffic? Total statistics will be kept.",
|
|
"traffic_reset_success": "Traffic reset",
|
|
"host_tuning": "Host tuning",
|
|
"conn_warning_text": "⚠️ Warning: {count} connections opened at {time} on {date}!",
|
|
"clear_warnings": "Clear warnings",
|
|
"warnings_cleared": "Warnings cleared",
|
|
"max_speed": "Max speed (Mbps)",
|
|
"speed_limit_unlim": "Speed limit (0 = unlim.)",
|
|
"port_in_use_by": "Port {port} is already used by {owner}. Choose another port.",
|
|
"exit_desc": "Exit node: a transit endpoint for other panel servers. Client traffic that enters elsewhere leaves to the internet from this server.",
|
|
"exit_port_hint": "UDP port the transit link listens on. Only other panel servers connect here, never end users. Open it in the server's firewall for the entry nodes.",
|
|
"exit_subnet": "Transit subnet",
|
|
"exit_subnet_hint": "Private IPv4 /24 shared between this exit and its entry nodes. Must not overlap the client subnets (10.8.x.x).",
|
|
"exit_obfuscation": "Obfuscate the inter-node link (AmneziaWG)",
|
|
"exit_obfuscation_short": "Obfuscation",
|
|
"exit_obfuscation_hint": "Enable when the hop between the nodes crosses DPI. Plain WireGuard otherwise. AmneziaWG Legacy entries can only use a non-obfuscated exit.",
|
|
"exit_peers": "Peers",
|
|
"exit_peers_title": "Exit node — linked entry nodes",
|
|
"exit_peer_name": "Entry node",
|
|
"exit_transit_ip": "Transit IP",
|
|
"exit_public_key": "Public key",
|
|
"exit_handshake": "Handshake",
|
|
"exit_transfer": "Transfer",
|
|
"exit_peer_external": "not managed by this panel",
|
|
"exit_peer_remove_confirm": "Remove this peer? The entry node behind it loses its route through this exit.",
|
|
"exit_peer_removed": "Peer removed",
|
|
"exit_no_peers": "No entry nodes are linked to this exit yet.",
|
|
"exit_stop_confirm": "Entry nodes route their clients through this exit. Stopping it puts those clients on the kill-switch (no traffic). Stop anyway?",
|
|
"exit_in_use": "Entry nodes route through this exit node",
|
|
"exit_link_title": "Exit node",
|
|
"exit_link_desc": "Route all clients of this instance through another panel server. The link between the nodes is encrypted; clients keep their configs. IPv4 only: while linked, client IPv6 is refused rather than leaking from this server.",
|
|
"exit_link_select": "Exit node",
|
|
"exit_link_none": "Traffic leaves directly from this server.",
|
|
"exit_link_current": "Linked to {name} (transit {ip})",
|
|
"exit_link_via": "Exit node",
|
|
"exit_link_btn": "Link",
|
|
"exit_unlink_btn": "Unlink",
|
|
"exit_unlink_confirm": "Unlink from the exit node? Clients will leave to the internet from this server again.",
|
|
"exit_link_saved": "Exit node linked",
|
|
"exit_unlinked": "Exit node unlinked",
|
|
"exit_link_stale": "The exit node is unreachable or was removed. Clients are blocked by the kill-switch until you unlink or repair the link.",
|
|
"exit_link_repair": "Repair link",
|
|
"exit_no_exit_nodes": "No exit nodes installed yet. Install the Exit Node service on the server that should be the egress.",
|
|
"exit_no_handshake": "No handshake from the exit node within 15 s — is the transit UDP port reachable? The link was rolled back.",
|
|
"exit_apply_failed": "The routing could not be applied on this server; the link was rolled back.",
|
|
"exit_not_found": "Exit node not found or not installed.",
|
|
"not_linked": "This instance is not linked to an exit node.",
|
|
"exit_mtu_too_big": "The client MTU of this instance exceeds the link MTU (1420). Lower it in the AWG settings (1376 is the default).",
|
|
"exit_link_force": "Link anyway",
|
|
"exit_self": "A server cannot be its own exit node.",
|
|
"exit_legacy_obfuscation": "AmneziaWG Legacy can only link to a non-obfuscated exit node.",
|
|
"exit_link_ipv6_warning": "This instance is dual-stack. While linked, client IPv6 is refused so nothing leaks from this server; clients fall back to IPv4 automatically.",
|
|
"exit_link_ipv6_confirm": "Client IPv6 will be refused while linked. Continue?",
|
|
"exit_link_mtu_warning": "Client MTU {mtu} exceeds the link MTU {exit_mtu}. Lower it in the AWG settings before linking.",
|
|
"exit_status_up": "up",
|
|
"exit_status_stale": "no handshake",
|
|
"exit_status_down": "down",
|
|
"exit_handshake_ago": "handshake {s}s ago",
|
|
"no_handshake_yet": "No handshake yet — the link stays up, check the exit's firewall.",
|
|
"old_exit_unreachable_orphan_peer": "The previous exit node was unreachable; its peer entry was left behind.",
|
|
"exit_unreachable_orphan_peer": "The exit node was unreachable; its peer entry was left behind.",
|
|
"exit_egress_check": "Check egress",
|
|
"exit_egress_checking": "Checking the egress IP…",
|
|
"exit_egress_match": "✓ Clients leave from {ip} — the exit node {name}.",
|
|
"exit_egress_mismatch": "⚠ Clients leave from {ip}, the exit node address is {expected}. Expected when the exit is behind NAT.",
|
|
"exit_egress_direct": "✗ Clients still leave from this server ({ip}) — their traffic is not going through the link.",
|
|
"exit_egress_unknown": "Could not determine the egress IP: the check services did not answer.",
|
|
"exit_egress_failed": "The egress check could not run on this server.",
|
|
"exit_dns_via_exit": "Resolve client DNS at the exit node",
|
|
"exit_dns_via_exit_hint": "Off by default: DNS queries stay on this server. On, they follow the link and are answered by the AmneziaDNS of the exit node, so a resolver never sees this server's country. Requires AmneziaDNS on the exit node.",
|
|
"exit_dns_via_exit_on": "Client DNS now resolves at the exit node",
|
|
"exit_dns_via_exit_off": "Client DNS resolves on this server again",
|
|
"exit_dns_needs_dns": "Install AmneziaDNS on the exit node before routing client DNS through it.",
|
|
"awg_mtu_exit_hint": "This instance is linked to an exit node: the link carries at most {exit_mtu}, so keep the client MTU at or below it.",
|
|
"exit_dns_disabled_no_dns": "The exit node has no AmneziaDNS any more — client DNS was brought back to this server.",
|
|
"exit_defaults_title": "Exit nodes",
|
|
"exit_default_node": "Default exit node",
|
|
"exit_default_none": "None — new instances keep their own egress",
|
|
"exit_default_hint": "Every AmneziaWG instance installed from now on is linked to this exit node right after the install. Existing instances are left alone, and an install still succeeds if the link fails.",
|
|
"exit_default_cleared": "The default exit node no longer exists and was cleared.",
|
|
"exit_restore_entries_relinked": "Restored the exit-node peers of {n} linked entry node(s).",
|
|
"exit_restore_entries_failed": "{n} entry node(s) could not be re-registered on this exit — repair them from their own page.",
|
|
"exit_restore_relinked": "The exit-node link of this instance was re-established after the restore.",
|
|
"exit_restore_stale": "The exit-node link could not be re-established after the restore — clients stay on the kill-switch until you repair or remove it.",
|
|
"exit_restore_removed": "The archive carried an exit-node link this panel does not track; it was removed and clients leave from this server again.",
|
|
"exit_restore_orphan": "The archive carried an unknown exit-node link and it could not be removed — check this instance manually.",
|
|
"on": "on",
|
|
"off": "off",
|
|
"restore": "Restore",
|
|
"restore_confirm_protocol": "Are you sure? The current protocol configuration will be overwritten with this backup.",
|
|
"delete_backup_confirm": "Delete this backup from the server? This cannot be undone.",
|
|
"backup_deleted": "Backup deleted",
|
|
"upload_backup": "Upload",
|
|
"uploading_backup": "Uploading...",
|
|
"backup_uploaded": "Backup uploaded",
|
|
"wgeasy_import": "Import from wg-easy",
|
|
"wgeasy_import_title": "Import from wg-easy / amnezia-wg-easy",
|
|
"wgeasy_web_port": "wg-easy web UI port (on this server)",
|
|
"wgeasy_password": "wg-easy admin password",
|
|
"wgeasy_username": "Username (v15 only)",
|
|
"wgeasy_fetch": "Load clients",
|
|
"wgeasy_import_btn": "Import",
|
|
"wgeasy_import_warning": "The old wg-easy container will be stopped (not deleted). User configs keep working unchanged.",
|
|
"wgeasy_no_clients": "No clients selected",
|
|
"wgeasy_confirm": "Import selected clients? The old wg-easy container will be stopped.",
|
|
"wgeasy_importing": "Importing, this may take a few minutes...",
|
|
"wgeasy_target_wg": "target: WireGuard (no obfuscation)",
|
|
"wgeasy_target_awg": "obfuscation detected → target: AmneziaWG 2.0",
|
|
"rename_instance": "Rename instance",
|
|
"instance_name": "Instance name",
|
|
"rename_instance_hint": "Leave empty to restore the default name.",
|
|
"no_expiry": "No expiry",
|
|
"telemt_secret_label": "Secret (hex)",
|
|
"telemt_ad_tag_label": "AD tag (hex)",
|
|
"telemt_max_conns_label": "Max TCP connections",
|
|
"telemt_quota_label": "Quota (bytes)",
|
|
"telemt_max_ips_label": "Max unique IPs",
|
|
"telemt_expiry_label": "Expiration (ISO 8601)",
|
|
"optional": "Optional",
|
|
"role_none_desc": "No role — record only, cannot log in",
|
|
"role_none_badge": "No role",
|
|
"password_optional_no_role": "No password needed for the “No role” role",
|
|
"password_required_for_role": "A password is required for the selected role",
|
|
"username_empty": "Username must not be empty",
|
|
"invalid_role": "Invalid role",
|
|
"awg_dns6_hint": "Used in client keys when the tunnel is dual-stack (IPv4+IPv6)",
|
|
"unlink_key_title": "Unlink key {} from user \"{}\"?",
|
|
"unlink_confirm": "Really unlink?!",
|
|
"conn_unlinked": "Connection unlinked",
|
|
"peer_already_linked": "This peer is already linked to user {}",
|
|
"peer_already_linked_self": "This peer is already linked to this user",
|
|
"select_connection": "Select a connection",
|
|
"name_required": "Name is required",
|
|
"no_servers_available": "No servers available",
|
|
"assign_user": "User",
|
|
"no_user_option": "— do not link —",
|
|
"stop_peer_title": "Stop",
|
|
"start_peer_title": "Enable",
|
|
"ssh_cooldown_title": "SSH cooldown (sec)",
|
|
"ssh_cooldown_hint": "Initial delay before reconnecting to an unreachable server. Do not change if the server works fine.",
|
|
"mail_title": "Email delivery (SMTP)",
|
|
"mail_hint": "Configs and proxy links are sent from this mailbox. The password is stored in data.json, so use a dedicated account or an app password.",
|
|
"mail_enabled_label": "Enable email delivery",
|
|
"mail_host_label": "SMTP server",
|
|
"mail_port_label": "Port",
|
|
"mail_security_label": "Encryption",
|
|
"mail_security_none": "None",
|
|
"mail_security_starttls": "STARTTLS",
|
|
"mail_security_ssl": "SSL/TLS",
|
|
"mail_username_label": "Username",
|
|
"mail_password_label": "Password",
|
|
"mail_password_hint": "Leave empty to keep the stored password; type a space to clear it.",
|
|
"mail_from_label": "Sender address",
|
|
"mail_from_name_label": "Sender name",
|
|
"mail_reply_to_label": "Reply-To (opt.)",
|
|
"mail_timeout_label": "Timeout (sec)",
|
|
"mail_test_btn": "Send test message",
|
|
"mail_test_recipient_label": "Test recipient",
|
|
"mail_test_sent": "Test message sent to {}",
|
|
"mail_send_btn": "Send by email",
|
|
"mail_send_title": "Send configurations by email",
|
|
"mail_send_all_btn": "Email all users",
|
|
"mail_send_all_title": "Email every user",
|
|
"mail_recipient_label": "Recipient",
|
|
"mail_include_configs": "Attach configuration files",
|
|
"mail_include_links": "Include connection links",
|
|
"mail_subject_label": "Subject",
|
|
"mail_subject_placeholder": "Leave empty for the default subject",
|
|
"mail_message_label": "Message (optional)",
|
|
"mail_message_placeholder": "A few words shown above the connections",
|
|
"mail_only_enabled": "Skip disabled users",
|
|
"mail_skip_empty": "Skip users without connections",
|
|
"mail_send_action": "Send",
|
|
"mail_sent_ok": "Sent to {}",
|
|
"mail_bulk_started": "Mass send started",
|
|
"mail_bulk_targets": "Recipients: every user with an email address",
|
|
"mail_bulk_progress": "{} of {} processed",
|
|
"mail_bulk_summary": "Sent: {}, skipped: {}, errors: {}",
|
|
"mail_bulk_running_note": "You can close this window — the send keeps running.",
|
|
"mail_no_email_hint": "This user has no email address",
|
|
"mail_status_sent": "sent",
|
|
"mail_status_skipped": "skipped",
|
|
"mail_status_failed": "error",
|
|
"mail_greeting": "Hello, {}!",
|
|
"mail_default_subject": "Your VPN access",
|
|
"mail_intro_connections": "Below are your connections. Import the attached file into the VPN client, or open the link on your device.",
|
|
"mail_link_label": "Link",
|
|
"mail_file_label": "Attached file",
|
|
"mail_no_connections_note": "There are no connections on your account yet — please contact your administrator.",
|
|
"mail_footer": "Sent automatically by the VPN panel. Please do not reply to this message.",
|
|
"mail_test_subject": "Test message from the VPN panel",
|
|
"mail_test_body": "The SMTP settings work: this test message was sent by the VPN panel.",
|
|
"mail_error_disabled": "Email delivery is disabled in settings",
|
|
"mail_error_no_host": "SMTP server is not set",
|
|
"mail_error_no_sender": "Sender address is missing or invalid",
|
|
"mail_error_bad_security": "Unknown encryption mode",
|
|
"mail_error_no_recipient": "No valid recipient address",
|
|
"mail_error_no_recipients": "No users with an email address",
|
|
"mail_error_no_connections": "This user has no connections to send",
|
|
"mail_error_user_not_found": "User not found",
|
|
"mail_error_nothing_to_send": "Choose files, links, or both",
|
|
"mail_error_bulk_running": "A mass send is already running",
|
|
"mail_skip_no_email": "no email address",
|
|
"mail_skip_bad_email": "invalid email address",
|
|
"mail_skip_disabled": "user disabled",
|
|
"mail_test_hint": "The test uses the saved settings — press Save first."
|
|
}
|