Files
Amnezia-Web-Panel/translations/fa.json
T
hellandClaude Opus 5 69893ba340 feat(exit): route client traffic through another panel server
Today a client leaves to the internet from the same server it connected to.
Exit nodes split the two: clients connect to an *entry* node (reachable,
possibly behind DPI) and egress from an *exit* node (clean IP, other country).
One exit serves many entries and keeps serving its own AWG clients.

    client --AWG--> [entry] amnezia-awg2 --WG/AWG link--> [exit] amnezia-exit --> internet
                    awg0 10.8.1.0/24                     transit0 10.9.0.0/24
                    exit0 10.9.0.N (Table=off)           one [Peer] per entry, /32

Exit side: a new protocol `exit` = container `amnezia-exit`, an AmneziaWG
listener on 55520/udp over the transit subnet 10.9.0.0/24. Peers are panel
nodes, never end users, and live in their own peersTable. ExitManager
subclasses AWGManager and closes every client-facing method.

Entry side: a second interface `exit0` inside the existing AWG container with
`Table = off`, plus policy routing - `from <client subnet> lookup 200`,
`default dev exit0` in table 200, and `blackhole default metric 1000` as a
kill-switch installed *before* the client tunnel comes up, so a container
restart cannot leak. Clients are MASQUERADEd into the entry's transit /32, so
the identical 10.8.1.0/24 of every instance can never collide at the exit.
TCP MSS is clamped, and rules 190/191 keep client<->client and AmneziaDNS
traffic local. State is file-driven: exit0.conf present means linked, and the
same shell block runs at container start and on a live (un)link.

Link crypto is WireGuard; AWG obfuscation is a per-exit-node property for hops
that cross DPI, and S3/S4 are deliberately not written on the transit - they
pad every transport packet and would eat the MTU budget of a tunnel inside a
tunnel. Private keys are generated inside the containers; the panel carries
public keys and a per-peer PSK only.

exit_link_service.py orchestrates linking with per-(entry, protocol) locks,
SSH off the event loop, a 15-second handshake gate that rolls back, and
lifecycle hooks for every way a link can go stale: exit uninstalled, stopped,
deleted, host cleared, entry reinstalled, container gone, backup restored.
Servers get a stable `uid` (already upstream) so reorder and delete cannot
break a link.

IPv4 only for now: while linked, client IPv6 is refused with `unreachable`
rather than leaking out of the entry.

Also included: an egress check that curls a public IP service bound to the
tunnel gateway (the client's exact path) and compares it with the direct one;
optional DNS resolution at the exit node; a default exit node applied to new
AWG installs; and reconciliation after a protocol restore.

244 tests pass. CURRENT_VERSION is untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 23:05:51 +07:00

558 lines
35 KiB
JSON

{
"nav_servers": "سرورها",
"nav_users": "کاربران",
"nav_settings": "تنظیمات",
"nav_connections": "اتصال‌ها",
"nav_logout": "خروج",
"theme_dark": "تاریک",
"theme_light": "روشن",
"back_to_servers": "← بازگشت به سرورها",
"server_check": "بررسی",
"server_checking": "در حال بررسی...",
"protocols": "پروتکل‌ها",
"install": "نصب",
"uninstall": "حذف نصب",
"run": "در حال اجرا",
"stop": "متوقف شده",
"not_installed": "نصب نشده",
"installed": "نصب شده",
"add_server": "افزودن سرور",
"no_servers": "هیچ سروری اضافه نشده است",
"name": "نام",
"host": "میزبان",
"port": "پورت",
"status": "وضعیت",
"actions": "عملکردها",
"edit": "ویرایش",
"delete": "حذف",
"save": "ذخیره",
"cancel": "لغو",
"loading": "در حال بارگذاری...",
"copy": "کپی",
"download": "دانلود",
"config": "پیکربندی",
"qr_code": "کد QR",
"vpn_key": "کلید VPN",
"clients": "کلاینت‌ها",
"traffic": "ترافیک",
"limit": "محدودیت",
"manage": "مدیریت",
"no_protocols": "بدون پروتکل",
"add_server_desc": "اولین سرور VPN خود را اضافه کنید. برای اتصال به اطلاعات SSH نیاز دارید.",
"ssh_host": "میزبان / IP",
"ssh_port": "پورت SSH",
"ssh_user": "نام کاربری",
"ssh_password": "رمز عبور",
"ssh_key": "کلید SSH",
"ssh_key_placeholder": "کلید خصوصی SSH",
"ssh_key_hint": "محتوای فایل id_rsa یا id_ed25519 خود را اینجا قرار دهید",
"connect": "اتصال",
"connecting": "در حال اتصال...",
"server_added": "سرور با موفقیت اضافه شد",
"server_deleted": "سرور حذف شد",
"delete_confirm": "آیا از حذف این سرور مطمئن هستید؟",
"success": "موفقیت",
"error": "خطا",
"info": "اطلاعات",
"login_title": "ورود به پنل",
"username": "نام کاربری",
"password": "رمز عبور",
"captcha": "کد امنیتی",
"captcha_placeholder": "کاراکترهای تصویر را وارد کنید",
"captcha_hint": "برای نوسازی تصویر کلیک کنید",
"login": "ورود",
"logging_in": "در حال ورود...",
"login_error": "ورود ناموفق بود",
"check_done": "بررسی کامل شد",
"check_error": "خطای اتصال",
"ssh_ok": "اتصال SSH برقرار است",
"docker_ok": "داکر نصب است",
"docker_not_installed": "داکر نصب نیست",
"awg_desc": "نسخه جدید پروتکل بر پایه awg-go. پشتیبانی از مبهم‌سازی پیشرفته (S3, S4).",
"awg3_desc": "افزون بر مبهم‌سازی ۲.۰، از محافظت سرآیند و لایه‌گذاری داده بهره می‌برد. زمان‌بندی دست‌دهی و تعویض کلید تصادفی است و امضای زمانی ثابتی بر جای نمی‌گذارد.",
"awg_mtu": "MTU",
"awg_mtu_hint": "در پیکربندی‌های تولیدشدهٔ کلاینت نوشته می‌شود. برنامه‌های Amnezia از ۱۳۷۶ استفاده می‌کنند.",
"awg_settings_btn": "AWG",
"awg_settings_title": "تنظیمات AmneziaWG",
"awg_settings_desc": "بر پیکربندی‌هایی که از این پس ساخته می‌شوند اعمال می‌شود. کلاینت‌هایی که پیکربندی را وارد کرده‌اند تا واردکردن دوباره مقادیر قبلی را نگه می‌دارند.",
"awg_settings_saved": "تنظیمات AmneziaWG ذخیره شد",
"awg_special_junk": "بسته‌های پوششی ویژه (I1-I5)",
"awg_special_junk_hint": "درست پیش از دست‌دادن ارسال می‌شوند تا نشست با بایت‌های پروتکلی دیگر آغاز شود. مقدار پیش‌فرض I1 پاسخ DNS را تقلید می‌کند.",
"awg_special_junk_syntax": "برچسب‌ها: <b 0xHEX> بایت ثابت، <r N> بایت تصادفی، <rc N> حرف، <rd N> رقم، <c> شمارندهٔ بسته، <t> زمان یونیکس.",
"awg_special_junk_reset": "پیش‌فرض",
"awg_legacy_desc": "نسخه اصلی AWG. سازگار با نسخه‌های قدیمی کلاینت.",
"xray_desc": "تغییر ظاهر ترافیک به ترافیک معمولی وب (XTLS-Reality). مقاوم در برابر فیلترینگ شدید.",
"not_checked": "بررسی نشده",
"connections": "اتصال‌ها",
"add": "افزودن",
"loading_connections": "در حال بارگذاری اتصال‌ها...",
"no_connections": "بدون اتصال",
"no_connections_desc": "اولین اتصال خود را برای ایجاد پیکربندی VPN اضافه کنید",
"install_protocol": "نصب پروتکل",
"port_default_hint": "پورت پیش‌فرض: 55424. مطمئن شوید این پورت آزاد است.",
"port_xray_hint": "پورت پیشنهادی: 443. مطمئن شوید توسط وب‌سرور دیگری اشغال نشده باشد.",
"reinstall": "نصب مجدد",
"uninstall_confirm": "حذف نصب {}؟ تمام اتصال‌ها و پیکربندی‌ها از بین خواهند رفت.",
"stop_container_confirm": "توقف کانتینر {}؟",
"start_container_confirm": "شروع کانتینر {}؟",
"stopping": "در حال توقف",
"starting": "در حال شروع",
"stopped": "متوقف شد",
"started": "شروع شد",
"server_config": "پیکربندی سرور",
"add_connection": "افزودن اتصال",
"connection_name": "نام اتصال",
"connection_name_placeholder": "مثال: iPhone, Laptop",
"assign_to_user": "تخصیص به کاربر (اختیاری)",
"no_assign": "— بدون تخصیص —",
"select_search_placeholder": "جستجو...",
"select_search_empty": "موردی یافت نشد",
"create": "ایجاد",
"creating": "در حال ایجاد...",
"connection_created": "اتصال \"{}\" ایجاد شد",
"delete_connection_confirm": "این اتصال حذف شود؟ پیکربندی دیگر کار نخواهد کرد.",
"connection_deleted": "اتصال حذف شد",
"self_service_title": "سرویس خودکار",
"self_service_enabled": "فعال‌سازی سرویس خودکار",
"self_service_enabled_desc": "به کاربران اجازه ایجاد و مدیریت اتصال‌های VPN خود را بدهید",
"self_service_web": "فعال‌سازی سرویس خودکار وب",
"self_service_telegram": "فعال‌سازی سرویس خودکار تلگرام",
"self_service_max_conns": "حداکثر اتصال برای هر کاربر",
"self_service_rate_limit": "محدودیت نرخ (ایجادها)",
"self_service_rate_window": "پنجره نرخ (ثانیه)",
"self_service_protocols": "پروتکل‌های مجاز",
"server_self_service_enabled": "اجازه سرویس خودکار",
"server_self_service_enabled_desc": "کاربران می‌توانند روی این سرور اتصال ایجاد کنند",
"create_connection": "ایجاد اتصال",
"delete_connection": "حذف",
"connections_counter": "اتصال‌ها: {0} / {1}",
"device_name": "نام دستگاه",
"self_service_disabled": "سرویس خودکار فعال نیست.",
"config_tab": "📄 فایل",
"vpn_key_tab": "🔑 کلید-VPN",
"qr_code_tab": "📱 کد-QR",
"copy_config": "📋 کپی",
"download_conf": "⬇ دانلود .conf",
"copy_key": "📋 کپی کلید",
"vpn_link_hint": "این لینک را برای تنظیم خودکار در برنامه AmneziaVPN وارد کنید",
"qr_hint": "کد QR را در برنامه AmneziaVPN اسکن کنید",
"qr_format_amnezia": "Amnezia",
"qr_format_wireguard": "ساده",
"qr_format_amnezia_hint": "مجموعه متحرک برای AmneziaVPN، نام سرور را منتقل می‌کند. دوربین را نگه دارید تا همه فریم‌ها خوانده شوند —",
"qr_format_wireguard_hint": "پیکربندی یا لینک به همان شکل، برای AmneziaWG، wg-quick و کلاینت‌های دیگر. نام سرور منتقل نمی‌شود.",
"no_data": "بدون داده",
"start_btn": "▶ شروع",
"stop_btn": "⏹ توقف",
"config_btn": "⚙️ تنظیم",
"done": "انجام شد",
"installing": "در حال نصب...",
"start_install": "شروع نصب...",
"check_docker": "بررسی داکر...",
"prepare_host": "آماده‌سازی میزبان...",
"build_container": "ساخت کانتینر...",
"install_success": "پروتکل با موفقیت نصب شد!",
"install_error": "خطا در نصب: ",
"qr_error": "ایجاد کد QR ناموفق بود",
"users_title": "کاربران",
"search_placeholder": "جستجو با نام، ایمیل یا تلگرام...",
"add_user": "افزودن کاربر",
"prev_page": "← قبلی",
"next_page": "بعدی →",
"page_info": "صفحه {} از {}",
"loading_users": "در حال بارگذاری کاربران...",
"nothing_found": "چیزی یافت نشد",
"search_empty_desc": "جستجوی دیگری را امتحان کنید یا کاربر جدید بسازید",
"username_label": "نام کاربری",
"password_label": "رمز عبور",
"role_label": "نقش",
"role_user_desc": "User — فقط مشاهده اتصال‌های خود",
"role_support_desc": "Support — مدیریت سرورها",
"role_admin_desc": "Admin — دسترسی کامل",
"tg_id_label": "آیدی تلگرام (اختیاری)",
"email_label": "ایمیل (اختیاری)",
"traffic_limit_label": "محدودیت ترافیک (گیگابایت) (0 = نامحدود)",
"description_label": "توضیحات (اختیاری)",
"auto_conn_title": "ایجاد خودکار اتصال (اختیاری)",
"server_label": "سرور",
"no_create_conn": "— عدم ایجاد اتصال —",
"protocol_label": "پروتکل",
"edit_user_title": "ویرایش کاربر: {}",
"edit_user_tg": "آیدی تلگرام (اختیاری)",
"edit_user_email": "ایمیل (اختیاری)",
"edit_user_limit": "محدودیت ترافیک (گیگابایت) (0 = نامحدود)",
"new_password_hint": "رمز عبور جدید (اگر تغییری نمی‌خواهید خالی بگذارید)",
"op_type_label": "نوع عملیات",
"create_new_conn": "ایجاد اتصال جدید",
"link_existing_conn": "اتصال به موجود",
"select_existing_conn": "انتخاب اتصال موجود",
"existing_conn_hint": "فقط اتصال‌های بدون کاربر نمایش داده می‌شوند",
"conn_name_panel": "نام اتصال (در پنل)",
"user_conns_title": "اتصال‌های کاربر",
"no_free_conns": "اتصال آزاد موجود نیست",
"linking": "در حال اتصال...",
"conn_linked": "اتصال برقرار شد",
"enabling": "در حال فعال‌سازی",
"disabling": "در حال غیرفعال‌سازی",
"user_enabled": "کاربر فعال شد",
"user_disabled": "کاربر غیرفعال شد",
"delete_user_confirm": "کاربر حذف شود؟ تمام اتصال‌های او حذف خواهند شد.",
"share_access": "اشتراک‌گذاری دسترسی",
"enable_public_access": "فعال‌سازی دسترسی عمومی",
"share_password_label": "رمز عبور (اختیاری)",
"share_password_hint": "در صورت تنظیم، کاربر باید آن را وارد کند",
"public_link_label": "لینک عمومی",
"disabled": "غیرفعال",
"out_of": "از",
"settings_title": "تنظیمات پنل",
"appearance": "🎨 ظاهر",
"title_label": "عنوان (Title)",
"logo_label": "لوگو (ایموجی یا نماد)",
"subtitle_label": "زیرعنوان (Subtitle)",
"captcha_title": "🔐 کد امنیتی",
"enable_captcha": "فعال‌سازی کد امنیتی",
"telegram_bot_title": "🤖 ربات تلگرام",
"bot_token_label": "توکن ربات (از @BotFather)",
"bot_status": "وضعیت",
"bot_running": "✅ در حال اجرا",
"bot_stopped": "⏹ متوقف شده",
"bot_stop_btn": "⏹ توقف",
"bot_start_btn": "▶️ شروع",
"bot_hint": "پس از تغییر توکن تنظیمات را ذخیره کنید تا ربات بازراه‌اندازی شود.",
"api_docs_title": "🔌 مستندات API",
"api_docs_hint": "از این رابط‌ها برای بررسی قابلیت‌های API استفاده کنید",
"tunnels_title": "Tunnels",
"local_server": "سرور محلی",
"tunnel_install_enable": "نصب و فعال‌سازی",
"tunnel_enable": "فعال‌سازی تونل",
"tunnel_running": "تونل در حال اجرا است",
"tunnel_stop": "توقف",
"tunnel_stopping": "در حال توقف...",
"tunnel_stopped": "تونل متوقف شد",
"tunnel_delete": "حذف",
"tunnel_deleted": "تونل حذف شد",
"tunnel_delete_confirm": "این فایل اجرایی تونل مدیریت‌شده توسط پنل متوقف و حذف شود؟",
"tunnel_starting": "در حال شروع تونل...",
"tunnel_started": "تونل شروع شد",
"tunnel_waiting_url": "تونل شروع شد. در انتظار آدرس عمومی...",
"tunnel_no_public_url": "آدرس عمومی پس از شروع تونل اینجا نمایش داده می‌شود.",
"tunnels_hint": "تونل‌های سریع این پنل محلی را در اینترنت منتشر می‌کنند. رمز مدیر را قوی نگه دارید و آدرس‌های عمومی را فقط با کاربران مورد اعتماد به اشتراک بگذارید.",
"ngrok_authtoken_placeholder": "ngrok authtoken (برای برخی حساب‌ها اختیاری است)",
"import_users_title": "📤 وارد کردن کاربران",
"import_source_label": "منبع وارد کردن / همگام‌سازی",
"remnawave_url_label": "آدرس Remnawave",
"api_key_label": "کلید API",
"enable_sync": "فعال‌سازی همگام‌سازی",
"sync_hint": "کاربران طبق داده‌های Remnawave به‌طور خودکار مدیریت می‌شوند",
"sync_now_btn": "🔄 همگام‌سازی اکنون",
"delete_sync_btn": "🗑 حذف همگام‌سازی",
"auto_create_conns": "ایجاد خودکار اتصال‌ها",
"sync_server_label": "سرور برای اتصال‌های جدید",
"save_changes": "💾 ذخیره تغییرات",
"sync_success": "همگام‌سازی انجام شد: {} کاربر",
"sync_deleted": "{} کاربر همگام‌سازی شده حذف شدند",
"delete_sync_confirm": "آیا از حذف تمام کاربران همگام‌سازی شده مطمئن هستید؟",
"settings_saved": "تنظیمات با موفقیت ذخیره شد",
"bot_started": "ربات شروع به کار کرد",
"bot_stopped_msg": "ربات متوقف شد",
"sync_running": "در حال همگام‌سازی...",
"deleting": "در حال حذف...",
"my_connections_title": "اتصال‌های من",
"show_config": "📄 نمایش پیکربندی",
"no_connections_user_desc": "برای ایجاد اتصال VPN با مدیر تماس بگیرید",
"share_title": "دسترسی به اتصال",
"vpn_access": "دسترسی VPN",
"user_label_share": "کاربر",
"share_protected_desc": "این دسترسی با رمز عبور محافظت شده است.",
"auth_success": "ورود موفقیت‌آمیز",
"loading_share_conns": "در حال بارگذاری...",
"no_active_conns": "هنوز هیچ اتصال فعالی ندارید.",
"show_settings_btn": "🔑 نمایش تنظیمات",
"copied": "کپی شد!",
"active": "فعال",
"site_description": "پنل وب آمنزیا — مدیریت سرورها و پروتکل‌های AmneziaWG",
"toggle_theme": "تغییر تم",
"copied_to_clipboard": "در حافظه کپی شد",
"share_not_found": "404 یافت نشد",
"share_not_found_desc": "لینک اشتباه است یا دسترسی غیرفعال شده است.",
"invalid_captcha": "کد امنیتی اشتباه است",
"account_disabled": "حساب کاربری غیرفعال است",
"invalid_login": "نام کاربری یا رمز عبور اشتباه است",
"user_exists": "کاربری با این نام قبلاً ثبت شده است",
"cannot_delete_self": "شما نمی‌توانید خودتان را حذف کنید",
"wrong_share_password": "رمز عبور اشتباه است",
"saving": "در حال ذخیره...",
"select_lang": "انتخاب زبان",
"lang_ru": "Русский",
"lang_en": "English",
"lang_fr": "Français",
"lang_zh": "中文 (Chinese)",
"lang_fa": "فارسی (Persian)",
"backup_title": "پشتیبان‌گیری ساده",
"download_backup": "دانلود data.json",
"restore_backup": "بازیابی از فایل",
"restore_confirm": "آیا مطمئن هستید؟ داده‌های فعلی بازنویسی می‌شوند و برنامه دوباره راه‌اندازی خواهد شد.",
"restore_success": "بازیابی موفق بود! در حال راهاندازی مجدد...",
"auto_backup_title": "Auto backup",
"enable_auto_backup": "فعالسازی پشتیبانگیری خودکار سرورها",
"auto_backup_interval_label": "فاصله زمانی ایجاد",
"auto_backup_hint": "پنل از پروتکلهای نصبشده روی هر سرور در بازه انتخابشده پشتیبان میگیرد.",
"auto_backup_last_run": "آخرین اجرا",
"auto_backup_last_status": "وضعیت",
"auto_backup_created_count": "پشتیبانهای ایجادشده",
"hours_suffix": "ساعت",
"invalid_backup_file": "فایل پشتیبان یا ساختار نامعتبر است",
"config_unavailable": "پیکربندی در دسترس نیست",
"config_unavailable_desc": "این کلاینت از طریق اپلیکیشن اصلی Amnezia ایجاد شده است.\\nکلید خصوصی فقط در دستگاه کاربر ذخیره می‌شود و توسط سرور قابل بازیابی نیست.",
"client_public_key": "کلید عمومی کلاینت:",
"management": "مدیریت",
"server_management": "مدیریت سرور",
"server_management_desc": "انجام اقدامات در سطح سیستم روی دستگاه شما.",
"check_server_services": "بررسی سرویس‌های سرور",
"reboot_server": "راه‌اندازی مجدد سرور",
"clear_server": "پاک‌سازی سرور",
"remove_server": "حذف سرور از پنل",
"telemt_desc": "پروکسی تلگرام بر پایه‌ی MTProxy با پوشش‌های پیشرفته.",
"dns_desc": "سرور DNS شخصی برای مسدود کردن تبلیغات و حفظ حریم خصوصی.",
"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.",
"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.",
"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 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": "تغییر نام",
"connection_renamed": "اتصال تغییر نام یافت",
"enter_connection_name": "نام جدید اتصال را وارد کنید",
"config_saved": "پیکربندی ذخیره شد",
"reset_traffic": "بازنشانی ترافیک",
"resetting": "در حال بازنشانی...",
"reset_traffic_confirm": "ترافیک فعلی این کاربر بازنشانی شود؟ آمار کل حفظ میشود.",
"traffic_reset_success": "ترافیک بازنشانی شد",
"host_tuning": "تنظیمات میزبان",
"conn_warning_text": "⚠️ هشدار: در {date} ساعت {time} تعداد {count} اتصال باز شد!",
"clear_warnings": "پاک کردن هشدارها",
"warnings_cleared": "هشدارها پاک شدند",
"max_speed": "حداکثر سرعت (Mbps)",
"speed_limit_unlim": "محدودیت سرعت (0 = نامحدود)",
"port_in_use_by": "پورت {port} قبلاً توسط {owner} استفاده شده است. پورت دیگری انتخاب کنید.",
"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_confirm_protocol": "آیا مطمئن هستید؟ پیکربندی فعلی پروتکل با این پشتیبان جایگزین خواهد شد.",
"restore_success": "بازیابی پشتیبان با موفقیت انجام شد!",
"delete_backup_confirm": "این پشتیبان از سرور حذف شود؟ این عمل قابل بازگشت نیست.",
"backup_deleted": "پشتیبان حذف شد",
"upload_backup": "بارگذاری",
"uploading_backup": "در حال بارگذاری...",
"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": "بدون انقضا",
"telemt_secret_label": "رمز (hex)",
"telemt_ad_tag_label": "تگ AD (hex)",
"telemt_max_conns_label": "حداکثر اتصالات TCP",
"telemt_quota_label": "سهمیه (بایت)",
"telemt_max_ips_label": "حداکثر IP یکتا",
"telemt_expiry_label": "انقضا (ISO 8601)",
"optional": "اختیاری"
}