mirror of
https://github.com/anten-ka/gotelegram_pro.git
synced 2026-05-19 21:56:05 +00:00
- i18n engine (lib/i18n.sh, lib/lang/en.sh, lib/lang/ru.sh)
- first-run language picker, persisted to .language + config.json
- install.sh, common.sh, backup.sh, templates_catalog.sh wired through t()/tf()
- backup.sh preserves .language marker and records language in metadata.json
- custom git template feature (first item in pro template picker)
* validates HTTPS URLs, rejects shell metachars
* 100MB size guard, 90s clone timeout
* auto-detects index.html in dist/public/build/_site/site/docs/out/www
- bot v2.4.0: i18n.py + lang/{en,ru}.json, /lang command, language toggle button
- bot: custom git template via text input with waiter gating
376 lines
20 KiB
Bash
Executable File
376 lines
20 KiB
Bash
Executable File
#!/bin/bash
|
||
# GoTelegram v2.4 — English translations
|
||
# shellcheck disable=SC2034,SC2148
|
||
|
||
# ── Common words ────────────────────────────────────────────────────────
|
||
I18N[yes]="Yes"
|
||
I18N[no]="No"
|
||
I18N[ok]="OK"
|
||
I18N[cancel]="Cancel"
|
||
I18N[back]="« Back"
|
||
I18N[exit]="Exit"
|
||
I18N[skip]="Skip"
|
||
I18N[choose]="Choose"
|
||
I18N[press_enter]="Press Enter..."
|
||
I18N[press_enter_to_return]="Press Enter to return to menu..."
|
||
I18N[invalid_choice]="Invalid choice"
|
||
I18N[running]="running"
|
||
I18N[stopped]="stopped"
|
||
I18N[not_installed]="not installed"
|
||
I18N[unknown]="unknown"
|
||
I18N[error]="Error"
|
||
I18N[warning]="Warning"
|
||
I18N[info]="Info"
|
||
I18N[success]="Done"
|
||
I18N[wait]="Please wait..."
|
||
|
||
# ── Banner ──────────────────────────────────────────────────────────────
|
||
I18N[banner_title]="GoTelegram v%s"
|
||
I18N[banner_subtitle]="MTProxy powered by telemt (Rust + Tokio)"
|
||
I18N[banner_features]="Anti-DPI • Fake TLS • TCP Splice • JA3/JA4"
|
||
I18N[credits_title]="Credits / Thanks"
|
||
|
||
# ── Main menu (dashboard) ───────────────────────────────────────────────
|
||
I18N[dashboard_title]="Control panel"
|
||
I18N[svc_proxy]="Proxy"
|
||
I18N[svc_nginx]="nginx"
|
||
I18N[svc_site]="Site"
|
||
I18N[svc_ssl]="SSL"
|
||
I18N[svc_bot]="Bot"
|
||
I18N[ssl_until]="until %s"
|
||
I18N[net_ip]="IP:"
|
||
I18N[net_port]="Port:"
|
||
I18N[net_mode]="Mode:"
|
||
I18N[net_domain]="Domain:"
|
||
I18N[connection_link]="Telegram connection link:"
|
||
I18N[proxy_not_configured]="Proxy is not configured. Select option 1."
|
||
I18N[menu_proxy]="Proxy ▸"
|
||
I18N[menu_stats]="Statistics ▸"
|
||
I18N[menu_manage]="Management ▸"
|
||
I18N[menu_telegram_bot]="Telegram bot ▸"
|
||
I18N[menu_about]="About ▸"
|
||
I18N[auto_refresh_30s]="Refresh in 30 sec"
|
||
|
||
# ── Submenu: Proxy ──────────────────────────────────────────────────────
|
||
I18N[submenu_proxy_title]="🚀 PROXY"
|
||
I18N[proxy_install_update]="Install / Update"
|
||
I18N[proxy_status_detail]="Detailed status"
|
||
I18N[proxy_copy_link]="Copy link"
|
||
I18N[proxy_share]="Share key"
|
||
I18N[proxy_restart]="Restart"
|
||
I18N[proxy_logs]="Logs"
|
||
I18N[proxy_change_mode]="Change mode / template"
|
||
|
||
# ── Submenu: Manage ─────────────────────────────────────────────────────
|
||
I18N[submenu_manage_title]="⚙️ MANAGEMENT"
|
||
I18N[manage_backup]="Backup"
|
||
I18N[manage_restore]="Restore"
|
||
I18N[manage_update_telemt]="Update telemt"
|
||
I18N[manage_site_ssl]="Site / SSL"
|
||
I18N[manage_remove]="Remove"
|
||
I18N[manage_language]="Language / Язык"
|
||
|
||
# ── Submenu: About ──────────────────────────────────────────────────────
|
||
I18N[submenu_about_title]="ℹ️ ABOUT"
|
||
I18N[about_version_info]="Version info"
|
||
I18N[about_promo]="Promo / Donate"
|
||
I18N[version_title]="🔍 Information"
|
||
I18N[version_label]="GoTelegram:"
|
||
I18N[version_engine]="Engine:"
|
||
I18N[version_tech]="Technology:"
|
||
I18N[version_license]="License:"
|
||
|
||
# ── Install flow ────────────────────────────────────────────────────────
|
||
I18N[install_select_mode]="🎭 Select masquerade mode:"
|
||
I18N[install_lite_title]="⚡ Lite — masquerade as popular website"
|
||
I18N[install_lite_desc1]="Fast, no domain needed. telemt disguises traffic"
|
||
I18N[install_lite_desc2]="as the chosen site (google.com etc.)"
|
||
I18N[install_pro_title]="🛡 Pro — your own site + full masquerade"
|
||
I18N[install_pro_desc1]="nginx + SSL + HTML template + telemt."
|
||
I18N[install_pro_desc2]="DPI sees a real website with a real certificate."
|
||
I18N[install_pro_desc3]="Requires: a domain pointing to this server."
|
||
I18N[install_mode_choice]="Choice (1/2):"
|
||
I18N[install_bad_choice]="Invalid choice: %s"
|
||
I18N[install_lite_step]="Installing Lite mode"
|
||
I18N[install_pro_step]="Installing Pro mode"
|
||
I18N[install_enter_domain]="Enter your domain (e.g. example.com):"
|
||
I18N[install_bad_domain]="Invalid domain: %s"
|
||
I18N[install_dns_mismatch]="Domain %s points to %s, not to %s"
|
||
I18N[install_continue_anyway]="Continue anyway?"
|
||
I18N[install_enter_email]="Email for SSL (Enter = no email):"
|
||
I18N[install_config_title]="📋 Configuration:"
|
||
I18N[install_cfg_ip]="IP:"
|
||
I18N[install_cfg_port]="Port:"
|
||
I18N[install_cfg_mask]="Masquerade:"
|
||
I18N[install_cfg_mode]="Mode:"
|
||
I18N[install_cfg_domain]="Domain:"
|
||
I18N[install_confirm_proxy]="Install proxy?"
|
||
I18N[install_confirm_proxy_site]="Install proxy + website?"
|
||
I18N[install_done]="GoTelegram v%s installed! (%s mode)"
|
||
I18N[install_arch_desc1]="telemt accepts all traffic on 443 (HTTPS masquerade)"
|
||
I18N[install_arch_desc2]="nginx serves the site on internal port %s"
|
||
I18N[install_arch_desc3]="ISP only sees HTTPS traffic to %s:443"
|
||
|
||
# ── Change mode/template ────────────────────────────────────────────────
|
||
I18N[change_current_mode]="Current mode:"
|
||
I18N[change_template]="Change site template (pro only)"
|
||
I18N[change_mode_switch]="Switch mode (lite ↔ pro)"
|
||
I18N[change_only_pro]="Template change is available in pro mode only"
|
||
I18N[change_requires_reinstall]="Mode switch requires reinstall."
|
||
I18N[change_reinstall_confirm]="Reinstall proxy?"
|
||
|
||
# ── Logs ────────────────────────────────────────────────────────────────
|
||
I18N[logs_telemt_title]="📋 telemt logs (last %s lines):"
|
||
|
||
# ── Link / Share ────────────────────────────────────────────────────────
|
||
I18N[link_title]="🔗 Connection link:"
|
||
I18N[share_title]="📤 Forward this message:"
|
||
I18N[share_line1]="🔐 MTProxy for Telegram (GoTelegram v%s)"
|
||
I18N[share_server]="🌍 Server: %s"
|
||
I18N[share_port]="🔌 Port: %s"
|
||
I18N[share_connect_cta]="👉 Connect with one tap:"
|
||
I18N[share_footer]="Just tap the link or configure manually."
|
||
|
||
# ── Website ─────────────────────────────────────────────────────────────
|
||
I18N[website_title]="🌐 Website management"
|
||
I18N[website_domain]="Domain:"
|
||
I18N[website_ssl_until]="SSL until:"
|
||
I18N[website_only_pro]="Website management is available in pro mode only"
|
||
I18N[website_renew_ssl]="Renew SSL certificate"
|
||
I18N[website_restart_nginx]="Restart nginx"
|
||
I18N[website_change_template]="Change template"
|
||
|
||
# ── Remove ──────────────────────────────────────────────────────────────
|
||
I18N[remove_title]="🗑 Remove GoTelegram"
|
||
I18N[remove_proxy_only]="Remove proxy only (telemt)"
|
||
I18N[remove_bot_only]="Remove Telegram bot only"
|
||
I18N[remove_all]="Remove everything (proxy + bot + settings)"
|
||
I18N[remove_warn_proxy]="This will remove the proxy and all its settings."
|
||
I18N[remove_confirm_proxy]="Remove proxy?"
|
||
I18N[remove_backup_before]="Create a backup before removal?"
|
||
I18N[remove_warn_all]="This will remove EVERYTHING: proxy, bot, site, settings."
|
||
I18N[remove_confirm_all]="Are you absolutely sure?"
|
||
I18N[remove_proxy_done]="Proxy removed"
|
||
I18N[remove_all_done]="GoTelegram fully removed (proxy + bot)"
|
||
|
||
# ── Telegram bot submenu ────────────────────────────────────────────────
|
||
I18N[bot_title]="🤖 Telegram bot"
|
||
I18N[bot_status_running]="● Running"
|
||
I18N[bot_status_stopped]="○ Stopped"
|
||
I18N[bot_status_not_installed]="✗ Not installed"
|
||
I18N[bot_menu_status]="📊 Bot status"
|
||
I18N[bot_menu_logs]="📋 Bot logs"
|
||
I18N[bot_menu_restart]="🔄 Restart bot"
|
||
I18N[bot_menu_stop]="⏹ Stop bot"
|
||
I18N[bot_menu_start]="▶️ Start bot"
|
||
I18N[bot_menu_settings]="⚙️ Settings (.env)"
|
||
I18N[bot_menu_remove]="🗑 Remove bot"
|
||
I18N[bot_menu_install]="🔧 Install bot"
|
||
I18N[bot_intro1]="The bot lets you manage the proxy from Telegram:"
|
||
I18N[bot_intro2]="status, restart, change mode, backup, QR code."
|
||
I18N[bot_install_step]="Installing Telegram bot"
|
||
I18N[bot_install_python]="Installing Python3..."
|
||
I18N[bot_files_not_found]="Bot files not found in %s"
|
||
I18N[bot_create_venv]="Creating virtual environment..."
|
||
I18N[bot_install_deps]="Installing dependencies..."
|
||
I18N[bot_enter_token]="Enter BOT_TOKEN from @BotFather:"
|
||
I18N[bot_token_empty]="Token cannot be empty"
|
||
I18N[bot_token]="Token:"
|
||
I18N[bot_add_admin_how]="How to add the administrator?"
|
||
I18N[bot_admin_auto]="Auto — bot will capture the ID on first /start"
|
||
I18N[bot_admin_manual]="Manual — enter the ID now"
|
||
I18N[bot_admin_ids_prompt]="Admin IDs (space or comma separated):"
|
||
I18N[bot_env_created]=".env created"
|
||
I18N[bot_env_exists]=".env already exists, settings preserved"
|
||
I18N[bot_wait_admin_title]="Waiting for administrator"
|
||
I18N[bot_wait_admin_msg1]="Open the bot in Telegram and send"
|
||
I18N[bot_wait_admin_msg2]="The bot will automatically make you an admin"
|
||
I18N[bot_wait_admin_skip]="Press Ctrl+C to skip"
|
||
I18N[bot_wait_spinner]="Waiting... send /start to the bot (%d sec)"
|
||
I18N[bot_admin_assigned]="Administrator assigned!"
|
||
I18N[bot_wait_skipped]="Skipped. Add admin later via: menu → Telegram bot → Settings"
|
||
I18N[bot_wait_timeout]="Timeout (5 min). Add admin via: menu → Telegram bot → Settings"
|
||
I18N[bot_installed]="Bot installed and running!"
|
||
I18N[bot_status_title]="📊 Telegram bot status"
|
||
I18N[bot_token_configured]="configured"
|
||
I18N[bot_access_open]="all users"
|
||
I18N[bot_logs_title]="📋 Bot logs (last 30 lines):"
|
||
I18N[bot_settings_title]="⚙️ Bot settings"
|
||
I18N[bot_current_env]="Current .env:"
|
||
I18N[bot_change_token]="Change BOT_TOKEN"
|
||
I18N[bot_change_allowed]="Change ALLOWED_IDS"
|
||
I18N[bot_new_token]="New BOT_TOKEN:"
|
||
I18N[bot_token_empty_err]="Empty token"
|
||
I18N[bot_token_updated]="Token updated, bot restarted"
|
||
I18N[bot_allowed_prompt]="ALLOWED_IDS (space or comma separated, empty = auto):"
|
||
I18N[bot_access_updated]="Access updated, bot restarted"
|
||
I18N[bot_remove_warn]="This will remove the Telegram bot and all its settings."
|
||
I18N[bot_remove_confirm]="Remove bot?"
|
||
I18N[bot_removed]="Bot fully removed"
|
||
I18N[bot_restarted]="Bot restarted"
|
||
I18N[bot_stopped]="Bot stopped"
|
||
I18N[bot_started]="Bot started"
|
||
I18N[bot_status_colon]="Status:"
|
||
I18N[bot_access_colon]="Access:"
|
||
I18N[bot_access_ids_fmt]="ID: %s"
|
||
|
||
# ── Promo / Donate ──────────────────────────────────────────────────────
|
||
I18N[promo_host1_title]="💰 HOSTING #1 — UP TO 60% OFF"
|
||
I18N[promo_host2_title]="💰 HOSTING #2 — UP TO 60% OFF"
|
||
I18N[promo_tips_title]="☕ Donate / Tips"
|
||
I18N[promo_link_label]="Link:"
|
||
I18N[promo_off60]="60%% discount on the first month"
|
||
I18N[promo_ant20]="20%% + 3%% when paid for 3 months"
|
||
I18N[promo_ant6]="15%% + 5%% when paid for 6 months"
|
||
I18N[promo_qr_host1]="── QR: Hosting #1 ──"
|
||
I18N[promo_qr_host2]="── QR: Hosting #2 ──"
|
||
I18N[promo_qr_tips]="── QR: Donate / Tips ──"
|
||
I18N[promo_menu_in]="Menu in %d sec..."
|
||
|
||
# ── Stats ───────────────────────────────────────────────────────────────
|
||
I18N[stats_title]="📊 Traffic statistics"
|
||
I18N[stats_module_missing]="Statistics module not loaded."
|
||
I18N[stats_file_missing]="File lib/stats.sh not found."
|
||
I18N[stats_toggle]="Toggle counter (now: %s)"
|
||
I18N[stats_install_collector]="Install/update stats collector"
|
||
I18N[stats_auto_refresh]="Refresh every 3 sec"
|
||
I18N[stats_on]="on"
|
||
I18N[stats_off]="off"
|
||
|
||
# ── Templates catalog ───────────────────────────────────────────────────
|
||
I18N[templates_categories]="📂 Site template categories:"
|
||
I18N[templates_custom_git]="📎 Custom template from git URL"
|
||
I18N[templates_random]="🎲 Random template"
|
||
I18N[templates_count_fmt]="(%d templates)"
|
||
I18N[templates_list]="📋 %s — available templates:"
|
||
I18N[templates_preview_title]="🔍 Template preview:"
|
||
I18N[templates_name]="Name:"
|
||
I18N[templates_source]="Source:"
|
||
I18N[templates_description]="Description:"
|
||
I18N[templates_preview]="👁 Preview:"
|
||
I18N[templates_preview_hint]="Open the link in a browser to preview the template"
|
||
I18N[templates_repo]="📦 Repo:"
|
||
I18N[templates_thanks]="💜 Thanks to the authors of %s for the open source code!"
|
||
I18N[templates_install_this]="Install this template?"
|
||
I18N[templates_cat_empty]="No templates in this category"
|
||
I18N[templates_downloading]="Downloading template \"%s\"..."
|
||
I18N[templates_downloaded]="Template \"%s\" downloaded"
|
||
I18N[templates_downloaded_subfolder]="Template \"%s\" downloaded (from subfolder)"
|
||
I18N[templates_no_index]="Template does not contain index.html"
|
||
I18N[templates_path]="Path: %s"
|
||
I18N[templates_catalog_not_found]="Templates catalog not found: %s"
|
||
|
||
# ── Custom git template ─────────────────────────────────────────────────
|
||
I18N[custom_git_title]="📎 CUSTOM TEMPLATE FROM GIT URL"
|
||
I18N[custom_git_help_1]="You can use ANY public static HTML repository as a template."
|
||
I18N[custom_git_help_2]="The repository must be public and contain a ready-made"
|
||
I18N[custom_git_help_3]="index.html (build via npm is NOT performed)."
|
||
I18N[custom_git_formats]="Supported URL formats:"
|
||
I18N[custom_git_fmt_github]=" • https://github.com/user/repo"
|
||
I18N[custom_git_fmt_gitlab]=" • https://gitlab.com/user/repo"
|
||
I18N[custom_git_fmt_gitext]=" • https://example.com/user/repo.git"
|
||
I18N[custom_git_fmt_branch]=" • https://github.com/user/repo@branch (branch after @)"
|
||
I18N[custom_git_auto_detect]="Repository structure (auto-detection):"
|
||
I18N[custom_git_auto_1]=" 1. index.html in repo root"
|
||
I18N[custom_git_auto_2]=" 2. dist/index.html (StartBootstrap, Vite, webpack)"
|
||
I18N[custom_git_auto_3]=" 3. public/ or build/ or _site/ or site/ or docs/"
|
||
I18N[custom_git_auto_4]=" 4. Fallback: search index.html across whole repo"
|
||
I18N[custom_git_requirements]="Requirements:"
|
||
I18N[custom_git_req_1]=" • HTTPS only (ssh:// and git:// are blocked)"
|
||
I18N[custom_git_req_2]=" • Public repositories only"
|
||
I18N[custom_git_req_3]=" • Repo size up to 100 MB"
|
||
I18N[custom_git_req_4]=" • Static HTML (no PHP/Python/Node server code)"
|
||
I18N[custom_git_examples]="Tested example repos:"
|
||
I18N[custom_git_ex_1]=" • https://github.com/html5up-collective/strata"
|
||
I18N[custom_git_ex_2]=" • https://github.com/StartBootstrap/startbootstrap-landing-page"
|
||
I18N[custom_git_enter_url]="Paste git URL (or Enter to cancel):"
|
||
I18N[custom_git_empty]="No URL provided, cancelled"
|
||
I18N[custom_git_bad_url]="Invalid URL. Only https:// addresses are accepted"
|
||
I18N[custom_git_cloning]="Cloning repository..."
|
||
I18N[custom_git_clone_failed]="Failed to clone repository: %s"
|
||
I18N[custom_git_too_big]="Repository is too large: %s (limit 100MB)"
|
||
I18N[custom_git_scanning]="Scanning for index.html..."
|
||
I18N[custom_git_found_at]="✓ Found index.html in: %s"
|
||
I18N[custom_git_no_index]="index.html not found in the repository"
|
||
I18N[custom_git_installed]="Custom template installed from %s"
|
||
I18N[custom_git_saved]="Template URL saved in config (menu → Site → Update from git)"
|
||
|
||
# ── First-run language picker ───────────────────────────────────────────
|
||
I18N[lang_picker_title]="Select language / Выберите язык"
|
||
I18N[lang_english]="English"
|
||
I18N[lang_russian]="Русский"
|
||
I18N[lang_saved]="Language saved: %s"
|
||
I18N[lang_change_prompt]="Select a new language:"
|
||
|
||
# ── Backup ──────────────────────────────────────────────────────────────
|
||
I18N[backup_title]="💾 Backup"
|
||
I18N[backup_creating]="Creating backup..."
|
||
I18N[backup_created]="Backup created: %s"
|
||
I18N[backup_failed]="Backup creation failed"
|
||
I18N[backup_restore_title]="↩️ Restore from backup"
|
||
I18N[backup_no_files]="No backup files"
|
||
I18N[backup_select]="Select a backup to restore:"
|
||
I18N[backup_restoring]="Restoring..."
|
||
I18N[backup_restored]="Backup restored"
|
||
I18N[backup_collecting]="Collecting configuration..."
|
||
I18N[backup_site_included]="Website template included"
|
||
I18N[backup_archive_err]="Archive creation failed"
|
||
I18N[backup_archive_missing]="Archive not created"
|
||
I18N[backup_encrypt_err]="Encryption failed"
|
||
I18N[backup_encrypted]="Backup encrypted (AES-256-CBC)"
|
||
I18N[backup_created_fmt]="Backup created: %s (%s)"
|
||
I18N[backup_file_not_found_fmt]="File not found: %s"
|
||
I18N[backup_enter_pass]="Enter backup password"
|
||
I18N[backup_bad_pass]="Wrong password or corrupted file"
|
||
I18N[backup_extract_err]="Archive extraction failed"
|
||
I18N[backup_label]="Backup"
|
||
I18N[backup_version_label]="Version"
|
||
I18N[backup_mode_label]="Mode"
|
||
I18N[backup_lang_label]="Language"
|
||
I18N[backup_date_label]="Date"
|
||
I18N[backup_confirm_restore]="Restore configuration? Current settings will be overwritten."
|
||
I18N[backup_restored_telemt]="telemt config restored"
|
||
I18N[backup_restored_gotelegram]="GoTelegram config restored"
|
||
I18N[backup_restored_lang]="Interface language restored"
|
||
I18N[backup_restored_nginx]="nginx config restored"
|
||
I18N[backup_restored_ssl]="SSL certificates restored"
|
||
I18N[backup_restored_site]="Website template restored"
|
||
I18N[backup_restore_done]="Restore completed!"
|
||
I18N[backup_none]="No backups"
|
||
I18N[backup_list_title]="Available backups"
|
||
I18N[backup_cleanup_fmt]="Removed %s old backups (kept %s)"
|
||
I18N[backup_create_title]="Create backup"
|
||
I18N[backup_encrypt_prompt]="Encrypt backup with a password?"
|
||
I18N[backup_repeat_pass]="Repeat password"
|
||
I18N[backup_pass_mismatch]="Passwords do not match"
|
||
I18N[backup_pass_short]="Password too short (minimum 6 characters)"
|
||
I18N[backup_pick_prompt]="Backup number (or path to file)"
|
||
I18N[backup_not_found]="Backup not found"
|
||
|
||
# ── Errors / misc ───────────────────────────────────────────────────────
|
||
I18N[err_need_root]="Run the script with sudo / as root"
|
||
I18N[err_os_unknown]="Failed to detect OS. Linux is required."
|
||
I18N[err_low_disk]="Low disk space: %sMB (need %sMB+)"
|
||
I18N[err_bad_pkg_mgr]="Unknown package manager"
|
||
I18N[err_unexpected]="Unexpected error"
|
||
I18N[bye]="See you later! 👋"
|
||
I18N[auto_refresh]="Refresh in 30 sec"
|
||
|
||
# ── Deps ────────────────────────────────────────────────────────────────
|
||
I18N[deps_installing]="Installing dependencies: %s"
|
||
|
||
# ── Migration ───────────────────────────────────────────────────────────
|
||
I18N[v1_detected]="⚠️ GoTelegram v1 (mtg) installation detected"
|
||
I18N[v1_container]="Container: %s"
|
||
I18N[v1_migration_step]="Migrating from v1 (mtg) to v2 (telemt)"
|
||
I18N[v1_found_title]="Found v1 (mtg) installation:"
|
||
I18N[v1_port]="Port: %s"
|
||
I18N[v1_secret]="Secret: %s..."
|
||
I18N[v1_incompatible]="mtg secret is NOT directly compatible with telemt."
|
||
I18N[v1_new_link]="Clients will need a new link."
|
||
I18N[v1_stop_migrate]="Stop v1 container and migrate to v2? [Y/n]:"
|
||
I18N[v1_migration_cancelled]="Migration cancelled. v1 left intact."
|
||
I18N[v1_stopping]="Stopping v1 container..."
|
||
I18N[v1_config_saved]="v1 config saved to %s"
|
||
I18N[v1_port_freed]="v1 stopped. Port %s freed."
|