mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-06 12:54:20 +00:00
9e13b32c34
* fix(script): download the live x-ui.sh script atomically before replacing it
update_menu(), update_shell(), and update.sh's update_x-ui() all overwrote
/usr/bin/x-ui in place via `curl -o`, truncating and rewriting the same
inode a currently-running x-ui process may still be reading from. A
network hiccup or slow write during that overwrite leaves a
half-old/half-new script on disk, which then fails with bogus syntax
errors on the next run. Download to /usr/bin/x-ui-temp and `mv -f` into
place instead, matching the atomic pattern install.sh already uses.
Also fixes update_menu() checking chmod's exit code instead of curl's,
which meant a failed download could still report "Update successful."
* fix(script): close remaining gaps in the atomic script-update path
Code review of the previous commit found the atomic mv fix was itself
incomplete:
- None of the mv -f calls checked their exit status, so a failed move
fell through to chmod and "success" messaging while /usr/bin/x-ui
stayed on the old file.
- update_shell()'s `[[ -s x-ui-temp ]]` guard couldn't tell "curl -z
got a 304, nothing to do" from "a stale temp file survived an
earlier crashed run" -- the latter could get moved into place with
no freshness check.
- update_menu(), update_shell(), and update_x-ui() all hardcoded the
same /usr/bin/x-ui-temp path, so two concurrent updates (e.g. a
cron auto-update racing an interactive menu update) could collide.
- update.sh's update_x-ui() was missing the non-empty-file guard
update_shell() already had.
x-ui.sh's update_menu() and update_shell() now share a
replace_xui_script() helper that uses a PID-suffixed temp path
(/usr/bin/x-ui-temp.$$), pre-cleans it before every attempt, and
checks the exit status of curl, the non-empty test, and mv before
treating the update as successful. update.sh's update_x-ui() gets the
same sequence inlined (it's fetched as a standalone script and can't
call x-ui.sh's function), closing the missing-guard gap and using its
own unique temp path.
* fix(script,panel): harden the remaining self-update download paths
install.sh had the same unguarded /usr/bin/x-ui-temp overwrite the two
already-fixed scripts had: no exit-status check on mv, and a fixed temp
name shared with x-ui.sh/update.sh's (now-unique) temp files. Give it
its own PID-suffixed temp path, an empty-file guard, and an mv
exit-status check, matching the pattern used there.
Audited the web dashboard's Go-native updater (panel.go) for the same
bug class: it already uses os.CreateTemp for a genuinely unique temp
file and cleans up via both a deferred Remove and a shell EXIT trap, so
it was never exposed to the fixed-path race. It was missing a check
for a zero-byte download (a 200 OK with an empty body would chmod +x
and exec an empty script) -- added that alongside the existing size
cap.
Not addressed here: once startUpdate()'s child process starts, the Go
service releases it and returns success immediately. If update.sh
fails partway through, the still-running old panel keeps answering
/status, so the frontend's poll can report success with no update
having happened. Fixing that needs update.sh to signal completion
status back and the frontend to check it -- a separate follow-up.
* feat(panel): report real completion status for the web self-update
Fixes the fire-and-forget gap flagged in the atomic-overwrite fix: once
startUpdate() launches update.sh detached, the Go service had no way to
learn whether it actually succeeded. If update.sh failed partway
(network drop, disk full, permission denied), the still-running old
panel kept answering /status, so the frontend's poll reported success
with nothing having changed.
update.sh now writes its outcome to a small JSON status file
(/etc/x-ui/update-status.json by default) via `trap ... EXIT`, which
covers every exit path in the script -- including the two bare `exit 1`
call sites that don't go through the existing _fail() helper. The Go
service generates a run ID before launching, passes it and the status
path to update.sh via XUI_UPDATE_RUN_ID/XUI_UPDATE_STATUS_FILE, and a
new GET /panel/api/server/getUpdateStatus endpoint reports it back. The
frontend now polls that instead of blindly trusting HTTP reachability,
and shows a distinct error or "couldn't confirm" message instead of
silently reloading into a false success.
Adversarial review of this surfaced three more issues, fixed here:
- No lock stopped two concurrent /updatePanel calls from launching two
update.sh runs that would race each other on the actual update work
(tar extraction, service unit swap). Added an in-memory guard with a
5-minute self-expiring window, so a run that never reaches a terminal
state doesn't lock out retries indefinitely.
- XUI_UPDATE_RUN_ID is read from the environment and was interpolated
unquoted into the status JSON; a malformed value would produce
invalid JSON. Now validated as digits-only before use.
- The run ID is a UnixNano timestamp (19 digits), sent as a raw JSON
number it would lose precision in JavaScript (past
Number.MAX_SAFE_INTEGER), letting two different runs round to the
same value on the wire and defeat the whole comparison. It's now a
decimal string end to end (Go, the status file, and the generated
frontend type).
install.sh's equivalent temp-file/mv path and the Go-native
downloadPanelUpdater() path were audited for the same bug classes
during this work; findings from that audit were addressed separately.
* fix(panel): release the update lock as soon as the run finishes
An exhaustive multi-angle review of the whole branch (12 finder angles,
3-vote adversarial verification, a fresh-eyes sweep) surfaced a real
bug in the concurrency guard added in the previous commit, plus several
smaller issues; this fixes what's actionable now.
The bug: acquireUpdateSlot only ever released on the 5-minute stale
timeout or if launching itself failed. If update.sh launched fine but
failed fast (bad GitHub API response, "x-ui not installed", any of its
early exit paths), the status file correctly reported "failed" within
seconds, but a retry was still rejected with "a panel update is
already in progress" for up to 5 more minutes -- the guard never
looked at the very status file this branch built to know a run was
done. It now tracks which run ID currently holds the slot and checks
that run's own status before falling back to the timeout, so a fast
failure clears the way for an immediate retry. Added a regression test
for this, plus one confirming a stale, unrelated runID can't be
mistaken for the current run finishing.
Also:
- Added a genuinely concurrent test for the guard: 200 goroutines
racing acquireUpdateSlot, asserting exactly one wins. The previous
tests only ever called it from one goroutine, so they gave no signal
if the mutex's check-then-set were silently broken -- verified this
by temporarily removing the lock and confirming the old tests still
passed while the new one caught it immediately under -race.
- Removed the redundant upfront "pending" status write: GetUpdateStatus
already defaults a missing/stale file to pending, and the frontend
matches by run ID regardless, so the write changed no observable
behavior. Deleted writeUpdateStatus entirely since that was its only
caller.
- Renamed replace_xui_script()'s unclear "conditional" parameter to
use_if_modified_since, matching what it actually controls.
- Added HTTP-level tests for the new getUpdateStatus endpoint,
including a regression test that the runId wire format is a JSON
string (decoding into a Go string field fails outright if it were
ever a bare number). updatePanel's actual launch path is not
covered: on a Linux test runner it would make a real network call
and could exec a real update.sh, so only its non-Linux guard path is
safely testable without mocking.
Not fixed here, tracked separately: the same unsafe-overwrite pattern
this branch eliminated for /usr/bin/x-ui is still present for the
systemd unit file install in update.sh and install.sh (lower severity
since systemd only reads it on daemon-reload, not continuously); and
startUpdate's systemd-run-vs-detached-fallback branching has no test
coverage since testing it safely needs dependency injection this fix
doesn't warrant bundling in.
* fix(script): make systemd unit file installation atomic
Same anti-pattern as the /usr/bin/x-ui overwrite fixed earlier: every
site that lands the systemd unit at ${xui_service}/x-ui.service --
copying it from the extracted release tarball, or falling back to a
GitHub download per distro family -- wrote straight onto the live
path via cp/curl, no temp file, no verification. A network drop
mid-download or an interrupted cp leaves the unit file truncated;
systemd then fails to parse it on the next daemon-reload/start,
leaving the panel unable to come up until an operator manually
re-copies a good unit file.
Lower severity than the /usr/bin/x-ui case (systemd only reads this
file on demand at daemon-reload time, not continuously the way bash
interprets a running script line by line), but it's the identical
gap, just left uncovered when that fix landed.
Added a small shared helper in both update.sh and install.sh --
_install_xui_service_unit() -- covering both source types (cp from
the tarball, curl from GitHub): write to a PID-suffixed temp file,
verify the copy/download succeeded and the result is non-empty, then
mv -f into place and check that exit status too, matching the pattern
already used for /usr/bin/x-ui. All 4 cp sites and the 3-way curl
fallback in each file now go through it; verified no other site
writes new content to the unit path (the remaining ${xui_service}
references are a pre-install existence check, an rm during old-version
cleanup, and the chown/chmod that already ran after the file is safely
in place -- none of those need atomicity).
Verified with bash -n on both files, plus a standalone scratch test
exercising cp-success, cp-with-missing-source, cp-with-empty-source,
and curl-failure paths: on every failure the previous, good unit file
content is left untouched and no temp file is leaked behind.
* fix(script): make Alpine's OpenRC init script install atomic; drop a stray comment
A final maximum-rigor review of the whole PR (12 finder angles including
a repo-wide sweep for any remaining instance of the bug class this PR
fixes) found two more real issues:
- Alpine's /etc/init.d/x-ui startup script is downloaded via a bare
`curl -fLRo` straight onto the live path in both update.sh and
install.sh -- the exact same unguarded-overwrite pattern already
fixed for /usr/bin/x-ui and the systemd unit file, just left
uncovered on the OpenRC side. A network drop mid-download truncates
the live init script; OpenRC then fails to source/execute it on the
next start, leaving the panel unable to come up. Fixed with the same
temp-file + non-empty check + mv -f (with its own exit-status check)
pattern used everywhere else in this PR. Verified with bash -n and a
standalone scratch-script test covering success, empty-download, and
destination-preserved-on-failure paths.
- internal/web/service/panel/panel_test.go had one line-level `//`
comment on a call site, which the root CLAUDE.md's hard rule ("No //
line comments in committed Go/TS... rename instead of annotating")
explicitly prohibits. The comment duplicated context already stated
in the test's own doc comment two lines above, so it's simply
removed rather than reworded.
Also flagged, deliberately not bundled here since it's a different
subsystem: x-ui.sh's update_geofiles() downloads Xray's live
geoip.dat/geosite.dat with the same unguarded curl -o pattern. Tracked
as its own follow-up.
* fix(script): make geo-data file downloads atomic
Same anti-pattern as /usr/bin/x-ui, the systemd unit file, and the
Alpine init script fixed in prior PRs: update_geofiles() downloaded
Xray's live geoip.dat/geosite.dat (and the IR/RU variants) with curl
writing straight onto the exact path Xray reads at runtime
(internal/xray/process.go's GetGeoipPath/GetGeositePath), no temp
file, no verification. The existing check only inspected the reported
HTTP status via -w '%{http_code}', not file integrity, so a network
drop mid-download could leave a truncated .dat file on disk that
passes the status check. Xray then fails to parse it on the next
restart/reload, breaking any routing rules that reference geoip:/
geosite:.
The -z conditional-GET usage needed care here: the original code
pointed both -z and -o at the same live path. Fixed by pointing -z at
the live file (to keep the "already current" freshness check) while
-o writes to a PID-suffixed temp file, matching the pattern already
proven in x-ui.sh's replace_xui_script(). Verified with a local HTTP
server that a 304 response leaves the temp file untouched/nonexistent
(so the existing "already up to date" branch still works unchanged),
and added a non-empty check plus a checked mv -f before treating a
download as installed.
Verified with bash -n and an end-to-end scratch test against a local
server covering: fresh download, 304-not-modified, empty response
body, and a 404 -- confirming a failure at any stage leaves the
previous good .dat file completely untouched and no temp file behind.
* fix(script): verify the release tarball extraction, not just the download
The final maximum-rigor review found the most significant remaining gap
in this whole effort: update.sh and install.sh check the tarball
download's exit status, but never check tar's exit status, and never
verify the extracted x-ui binary actually exists before continuing.
Worse, by the time extraction runs, the previous installation has
already been stopped and deleted -- there's no rollback. A truncated
download that still passes curl's own check, or a tar failure (disk
full, killed process), left the panel silently in a broken half-state:
chmod/config/service-install all continued to run against a missing or
empty binary, with no error surfaced anywhere. This is the same bug
class as everything else in this PR (unverified write to a path
something then depends on), just for the tarball itself rather than a
single file -- and it also covers the geo-data files this PR already
fixed once for the interactive/cron path, since they ship inside this
same tarball on every panel update.
Added: a non-empty check on the downloaded archive (both files, both
install.sh call sites) and a check that tar succeeded and produced a
non-empty x-ui binary before proceeding, failing loudly with a message
that explicitly says the previous install is already gone, since
silently continuing here is worse than anywhere else in this PR.
This doesn't make the multi-file extraction fully atomic (that would
mean extracting to a temp directory and atomically swapping the whole
install tree into place, a materially larger restructuring than
anything else in this PR) -- but it closes the "fails silently, user
discovers it days later when Xray can't start" gap, which was the
actual reported problem this whole effort traces back to.
Also fixed, all much smaller:
- replace_xui_script() in x-ui.sh implicitly returned chmod's exit
status instead of success, so a successful atomic install could be
reported as failed if chmod transiently failed after the mv already
landed the new script. Added an explicit `return 0`.
- update_geofiles() had no default case branch; an unrecognized
argument would silently reuse whatever dat_files/dat_source values a
previous call left in the un-scoped globals instead of failing.
Currently unreachable (all three call sites pass fixed literals) but
cheap, defensive, and worth having.
- internal/web/controller/server.go's updatePanel has one branch (an
unparseable "dev" form value) that's both untested and safe to test
on any platform, since it's rejected before any real exec/network
call. Added the missing test case.
Verified: bash -n on all three scripts; an empirical scratch test
covering an empty downloaded archive, a corrupt (non-gzip) archive,
and a successfully-extracting-but-empty archive, confirming each is
caught before the script proceeds; full go build/vet/test -race
across the whole module; frontend generation confirmed still in sync.
* fix(panel): base the update-slot staleness fallback on process liveness
Addresses the automated review on the upstream PR (MHSanaei/3x-ui#5711).
Blocking finding: acquireUpdateSlot's staleness fallback freed the
update slot purely on elapsed wall-clock time (5 minutes), with no
check on whether the update.sh process it launched was actually still
running. update.sh runs install_base() (apt-get/dnf/pacman update and
install) before update_x-ui even starts, plus several GitHub
downloads (release tarball, x-ui.sh, and possibly a service unit or
x-ui.rc) -- on a slow or throttled host, a small VPS being the typical
deployment target for this project, that alone can plausibly exceed 5
minutes with nothing wrong. A second /updatePanel call arriving in
that window (an admin retrying after the frontend's 90s poll times
out, or overlapping master-node bulk-update calls) would launch a
second update.sh, racing the exact rm/tar/mv/systemctl sequence this
whole PR exists to make safe.
Fixed by recording the launched process's PID (detached-fallback path
only; the systemd-run path's own process has already exited by the
time startUpdate returns, so it never learns update.sh's real PID) and
checking it via the standard POSIX kill(pid, 0) liveness probe before
treating a run as stale, following the existing panel_unix.go /
panel_other.go platform-split pattern already used for
setDetachedProcess. A confirmed-alive process now keeps the slot held
past updateStaleAfter (raised from 5 to 20 minutes as a safer baseline
for the systemd-run path, which still has no way to check liveness
directly). updateHardCeiling (2 hours) is an absolute backstop so a
genuinely wedged run can never lock out retries permanently even on
the PID-tracked path.
Added two regression tests exercising the new logic (gated to Linux,
since processAlive is a no-op stub elsewhere): a live PID keeps the
slot held past the stale window, and the hard ceiling overrides
liveness. Traced both by hand against the new acquireUpdateSlot logic;
could not execute-verify processAlive itself on this Windows dev
machine (no WSL distro installed, and installing one felt
disproportionate to validate kill(pid, 0), an extremely well-established
POSIX primitive), but cross-compiled clean for linux/amd64 and this
repo's CI runs the real test suite on Linux.
Also fixed, both suggestions from the same review:
- install.sh: two failure paths right after tarball extraction were
exiting without cleaning up the already-downloaded x-ui.sh temp file
(xui_script_temp), leaving it behind. Every other new failure branch
in this PR removes its temp file before exiting; these two now do
too.
- frontend/src/pages/api-docs/endpoints.ts: updatePanel's doc entry
did not reflect that a successful response now carries an obj with
runId. Added an inline response example matching the existing
pattern used for other ad hoc (non-schema-backed) responses like
getWebCertFiles.
Verified: go build/vet clean on both windows (native) and a linux/amd64
cross-compile; full go test ./... clean; go test -race on the panel
and controller packages; bash -n on all three shell scripts; npm run
gen confirms the openapi.json diff is exactly the new response example
with no stray changes to src/generated; TestAPIRoutesDocumented still
passes.
2191 lines
156 KiB
JSON
2191 lines
156 KiB
JSON
{
|
||
"username": "نامکاربری",
|
||
"password": "رمزعبور",
|
||
"login": "ورود",
|
||
"confirm": "تایید",
|
||
"cancel": "انصراف",
|
||
"close": "بستن",
|
||
"save": "ذخیره",
|
||
"logout": "خروج",
|
||
"create": "ایجاد",
|
||
"add": "افزودن",
|
||
"remove": "حذف",
|
||
"update": "بهروزرسانی",
|
||
"copy": "کپی",
|
||
"copied": "کپی شد",
|
||
"more": "بیشتر",
|
||
"download": "دانلود",
|
||
"regenerate": "تولید مجدد",
|
||
"jsonEditor": "ویرایشگر JSON",
|
||
"downloadImage": "دانلود تصویر",
|
||
"sort": "مرتبسازی",
|
||
"remark": "نام",
|
||
"enable": "فعال",
|
||
"protocol": "پروتکل",
|
||
"search": "جستجو",
|
||
"filter": "فیلتر",
|
||
"all": "همه",
|
||
"from": "از",
|
||
"to": "تا",
|
||
"done": "انجام شد",
|
||
"loading": "...در حال بارگذاری",
|
||
"refresh": "تازهسازی",
|
||
"clear": "پاک کردن",
|
||
"second": "ثانیه",
|
||
"minute": "دقیقه",
|
||
"hour": "ساعت",
|
||
"day": "روز",
|
||
"check": "چک کردن",
|
||
"indefinite": "نامحدود",
|
||
"unlimited": "نامحدود",
|
||
"none": "هیچ",
|
||
"qrCode": "QRکد",
|
||
"info": "اطلاعات بیشتر",
|
||
"edit": "ویرایش",
|
||
"delete": "حذف",
|
||
"reset": "بازنشانی",
|
||
"noData": "دادهای وجود ندارد.",
|
||
"copySuccess": "باموفقیت کپیشد",
|
||
"sure": "مطمئن",
|
||
"encryption": "رمزگذاری",
|
||
"useIPv4ForHost": "از IPv4 برای میزبان استفاده کنید",
|
||
"transmission": "راهاتصال",
|
||
"host": "میزبان",
|
||
"path": "مسیر",
|
||
"camouflage": "مبهمسازی",
|
||
"status": "وضعیت",
|
||
"enabled": "فعال",
|
||
"disabled": "غیرفعال",
|
||
"depleted": "منقضی",
|
||
"depletingSoon": "درحالانقضا",
|
||
"offline": "آفلاین",
|
||
"online": "آنلاین",
|
||
"domainName": "آدرس دامنه",
|
||
"monitor": "آیپی اتصال",
|
||
"certificate": "گواهی دیجیتال",
|
||
"fail": "ناموفق",
|
||
"comment": "توضیحات",
|
||
"success": "موفق",
|
||
"lastOnline": "آخرین فعالیت",
|
||
"getVersion": "دریافت نسخه",
|
||
"install": "نصب",
|
||
"clients": "کاربران",
|
||
"usage": "استفاده",
|
||
"twoFactorCode": "کد",
|
||
"remained": "باقیمانده",
|
||
"security": "امنیت",
|
||
"secAlertTitle": "هشدارامنیتی",
|
||
"secAlertSsl": "ایناتصالامن نیست. لطفا تازمانیکه تیالاس برای محافظت از دادهها فعال نشدهاست، از وارد کردن اطلاعات حساس خودداری کنید",
|
||
"secAlertConf": "تنظیمات خاصی در برابر حملات آسیب پذیر هستند. توصیه میشود پروتکلهای امنیتی را برای جلوگیری از نفوذ احتمالی تقویت کنید",
|
||
"secAlertSSL": "پنل فاقد ارتباط امن است. لطفاً یک گواهینامه تیالاس برای محافظت از دادهها نصب کنید",
|
||
"secAlertPanelPort": "استفاده از پورت پیشفرض پنل ناامن است. لطفاً یک پورت تصادفی یا خاص تنظیم کنید",
|
||
"secAlertPanelURI": "مسیر پیشفرض لینک پنل ناامن است. لطفاً یک مسیر پیچیده تنظیم کنید",
|
||
"secAlertSubURI": "مسیر پیشفرض لینک سابسکریپشن ناامن است. لطفاً یک مسیر پیچیده تنظیم کنید",
|
||
"secAlertSubJsonURI": "مسیر پیشفرض لینک سابسکریپشن جیسون ناامن است. لطفاً یک مسیر پیچیده تنظیم کنید",
|
||
"emptyDnsDesc": "هیچ سرور DNS اضافه نشده است.",
|
||
"emptyFakeDnsDesc": "هیچ سرور Fake DNS اضافه نشده است.",
|
||
"emptyBalancersDesc": "هیچ بالانسر اضافه نشده است.",
|
||
"emptyReverseDesc": "هیچ پروکسی معکوس اضافه نشده است.",
|
||
"somethingWentWrong": "مشکلی پیش آمد",
|
||
"subscription": {
|
||
"title": "اطلاعات سابسکریپشن",
|
||
"subId": "شناسه اشتراک",
|
||
"email": "ایمیل",
|
||
"status": "وضعیت",
|
||
"downloaded": "دانلود",
|
||
"uploaded": "آپلود",
|
||
"expiry": "تاریخ پایان",
|
||
"totalQuota": "حجم کلی",
|
||
"individualLinks": "لینکهای تکی",
|
||
"active": "فعال",
|
||
"inactive": "غیرفعال",
|
||
"unlimited": "نامحدود",
|
||
"noExpiry": "بدون انقضا",
|
||
"copyAllConfigs": "کپی همه کانفیگها",
|
||
"copyAllConfigsCopied": "همه کانفیگها کپی شدند"
|
||
},
|
||
"menu": {
|
||
"theme": "تم",
|
||
"dark": "تیره",
|
||
"ultraDark": "فوق تیره",
|
||
"dashboard": "نمای کلی",
|
||
"inbounds": "ورودیها",
|
||
"clients": "کلاینتها",
|
||
"groups": "گروهها",
|
||
"nodes": "نودها",
|
||
"settings": "تنظیمات پنل",
|
||
"xray": "پیکربندی Xray",
|
||
"routing": "مسیریابی",
|
||
"outbounds": "خروجیها",
|
||
"apiDocs": "مستندات API",
|
||
"logout": "خروج",
|
||
"link": "مدیریت",
|
||
"donate": "حمایت مالی",
|
||
"hosts": "میزبانها",
|
||
"docs": "مستندات",
|
||
"openMenu": "باز کردن منو"
|
||
},
|
||
"pages": {
|
||
"login": {
|
||
"hello": "سلام",
|
||
"title": "خوشآمدید",
|
||
"loginAgain": "مدت زمان استفاده بهاتمامرسیده، لطفا دوباره وارد شوید",
|
||
"toasts": {
|
||
"invalidFormData": "اطلاعات بهدرستی وارد نشدهاست",
|
||
"emptyUsername": "لطفا یک نامکاربری وارد کنید",
|
||
"emptyPassword": "لطفا یک رمزعبور وارد کنید",
|
||
"wrongUsernameOrPassword": "نام کاربری، رمز عبور یا کد دو مرحلهای نامعتبر است.",
|
||
"successLogin": "شما با موفقیت به حساب کاربری خود وارد شدید."
|
||
}
|
||
},
|
||
"index": {
|
||
"title": "نمای کلی",
|
||
"cpu": "پردازنده",
|
||
"logicalProcessors": "پردازندههای منطقی",
|
||
"frequency": "فرکانس",
|
||
"swap": "سواپ",
|
||
"storage": "ذخیرهسازی",
|
||
"memory": "حافظه",
|
||
"threads": "نخها",
|
||
"xrayStatus": "Xray",
|
||
"stopXray": "توقف",
|
||
"restartXray": "راهاندازی مجدد",
|
||
"xraySwitch": "نسخه",
|
||
"xrayUpdates": "بهروزرسانیهای Xray",
|
||
"xraySwitchClick": "نسخه مورد نظر را انتخاب کنید",
|
||
"xraySwitchClickDesk": "لطفا بادقت انتخاب کنید. درصورت انتخاب نسخه قدیمیتر، امکان ناهماهنگی با پیکربندی فعلی وجود دارد",
|
||
"updatePanel": "بهروزرسانی پنل",
|
||
"panelUpdateDesc": "این عملیات 3X-UI را به آخرین نسخه بهروزرسانی میکند و سرویس پنل را مجدداً راهاندازی میکند.",
|
||
"currentPanelVersion": "نسخه فعلی پنل",
|
||
"latestPanelVersion": "آخرین نسخه پنل",
|
||
"panelUpToDate": "پنل بهروز است",
|
||
"devChannel": "کانال توسعه (Dev)",
|
||
"devChannelWarning": "بیلدهای توسعه هر کامیت روی main را دنبال میکنند و نسخهٔ پایدار نیستند — بازگشت خودکار به نسخهٔ قبلی وجود ندارد.",
|
||
"currentCommit": "کامیت فعلی",
|
||
"latestCommit": "آخرین کامیت",
|
||
"updateChannelChanged": "کانال بهروزرسانی تغییر کرد",
|
||
"upToDate": "بهروز",
|
||
"xrayStatusUnknown": "ناشناخته",
|
||
"xrayStatusRunning": "در حال اجرا",
|
||
"xrayStatusStop": "متوقف",
|
||
"xrayStatusError": "خطا",
|
||
"xrayErrorPopoverTitle": "خطا در هنگام اجرای Xray رخ داد",
|
||
"operationHours": "مدتکارکرد",
|
||
"systemHistoryTitle": "تاریخچه سیستم",
|
||
"historyTitleCpu": "مصرف پردازنده",
|
||
"historyTitleMem": "مصرف حافظه",
|
||
"historyTitleNetwork": "پهنای باند شبکه",
|
||
"historyTitlePackets": "بستههای شبکه",
|
||
"historyTitleDisk": "ورودی/خروجی دیسک",
|
||
"historyTitleOnline": "کاربران آنلاین",
|
||
"historyTitleLoad": "میانگین بار سیستم (۱ / ۵ / ۱۵ دقیقه)",
|
||
"historyTitleConnections": "اتصالات فعال (TCP / UDP)",
|
||
"historyTitleDiskUsage": "مصرف فضای دیسک",
|
||
"historyTabBandwidth": "پهنای باند",
|
||
"historyTabPackets": "بستهها",
|
||
"historyTabDisk": "دیسک I/O",
|
||
"historyTabOnline": "آنلاین",
|
||
"historyTabLoad": "بار",
|
||
"historyTabConnections": "اتصالات",
|
||
"historyTabDiskUsage": "مصرف دیسک",
|
||
"charts": "نمودارها",
|
||
"xrayMetricsTitle": "متریکهای Xray",
|
||
"xrayTitleHeap": "حافظهی Heap تخصیصیافته",
|
||
"xrayTitleSys": "حافظهی رزروشده از سیستمعامل",
|
||
"xrayTitleObjects": "اشیای زندهی Heap",
|
||
"xrayTitleGcCount": "چرخههای کاملشدهی GC",
|
||
"xrayTitleGcPause": "مدت مکث GC",
|
||
"xrayTitleObservatory": "سلامت اتصال خروجی",
|
||
"xrayTabHeap": "Heap",
|
||
"xrayTabSys": "Sys",
|
||
"xrayTabObjects": "اشیا",
|
||
"xrayTabGcCount": "تعداد GC",
|
||
"xrayTabGcPause": "مکث GC",
|
||
"xrayTabObservatory": "رصدخانه",
|
||
"xrayMetricsDisabled": "نقطه پایانی متریکهای Xray پیکربندی نشده",
|
||
"xrayMetricsHint": "یک بلاک metrics در سطح بالای پیکربندی xray با tag برابر metrics_out و listen برابر 127.0.0.1:11111 اضافه کنید، سپس xray را راهاندازی مجدد کنید.",
|
||
"xrayObservatoryEmpty": "هنوز دادهای از Observatory دریافت نشده",
|
||
"xrayObservatoryHint": "یک بلاک observatory در پیکربندی xray اضافه کنید و outbound tagهایی که میخواهید بررسی شوند را لیست کنید، سپس xray را راهاندازی مجدد کنید.",
|
||
"xrayObservatoryTagPlaceholder": "انتخاب outbound",
|
||
"xrayObservatoryAlive": "فعال",
|
||
"xrayObservatoryDead": "غیرفعال",
|
||
"xrayObservatoryLastSeen": "آخرین مشاهده",
|
||
"xrayObservatoryLastTry": "آخرین تلاش",
|
||
"trendLast2Min": "۲ دقیقه اخیر",
|
||
"systemLoad": "بارسیستم",
|
||
"systemLoadDesc": "میانگین بار سیستم برای 1، 5 و 15 دقیقه گذشته",
|
||
"connectionCount": "تعداد کانکشن ها",
|
||
"ipAddresses": "آدرسهای IP",
|
||
"toggleIpVisibility": "تغییر وضعیت نمایش IP",
|
||
"overallSpeed": "سرعت کلی",
|
||
"upload": "آپلود",
|
||
"download": "دانلود",
|
||
"totalData": "دادههای کل",
|
||
"sent": "ارسال شده",
|
||
"received": "دریافت شده",
|
||
"documentation": "مستندات",
|
||
"xraySwitchVersionDialog": "آیا واقعاً میخواهید نسخه Xray را تغییر دهید؟",
|
||
"xraySwitchVersionDialogDesc": "این کار نسخه Xray را به #version# تغییر میدهد.",
|
||
"xraySwitchVersionPopover": "Xray با موفقیت بهروز شد",
|
||
"panelUpdateDialog": "آیا مطمئن هستید که میخواهید پنل را بهروزرسانی کنید؟",
|
||
"panelUpdateDialogDesc": "این 3X-UI را به نسخه #version# بهروزرسانی کرده و سرویس پنل را مجدداً راهاندازی میکند.",
|
||
"panelUpdateCheckPopover": "خطا در بررسی بهروزرسانی پنل",
|
||
"panelUpdateStartedPopover": "بهروزرسانی پنل آغاز شد",
|
||
"panelUpdateFailedTitle": "بهروزرسانی پنل ناموفق بود",
|
||
"panelUpdateFailedDesc": "بهروزرسانی با موفقیت به پایان نرسید. گزارشهای سرور را بررسی کنید یا دستور «x-ui update» را از خط فرمان اجرا کنید.",
|
||
"panelUpdateUnknownTitle": "تأیید نشد که بهروزرسانی به پایان رسیده باشد",
|
||
"panelUpdateUnknownDesc": "پنل بهموقع نتیجهای گزارش نکرد. صفحه را بارگذاری مجدد کنید تا نسخه فعلی را بررسی کنید یا گزارشهای سرور را بررسی کنید.",
|
||
"geofileUpdateDialog": "آیا واقعاً میخواهید فایل جغرافیایی را بهروز کنید؟",
|
||
"geofileUpdateDialogDesc": "این عمل فایل #filename# را بهروز میکند.",
|
||
"geofilesUpdateDialogDesc": "با این کار همه فایلها بهروزرسانی میشوند.",
|
||
"geofilesUpdateAll": "همه را بهروزرسانی کنید",
|
||
"geofileUpdatePopover": "فایل جغرافیایی با موفقیت بهروز شد",
|
||
"geodataTitle": "بهروزرسانی خودکار Geodata",
|
||
"geodataHint": "Xray این فایلها را طبق زمانبندی دانلود کرده و بدون ریاستارت بارگذاری مجدد میکند. آدرسها باید HTTPS باشند. هر فایل باید از قبل در پوشه bin موجود باشد تا Xray بتواند آن را بهروزرسانی کند.",
|
||
"geodataCron": "زمانبندی (cron)",
|
||
"geodataOutbound": "دانلود از طریق خروجی (اختیاری)",
|
||
"geodataFile": "نام فایل",
|
||
"geodataAddFile": "افزودن فایل",
|
||
"geodataSaveRestart": "ذخیره و ریاستارت Xray",
|
||
"geodataConfirmTitle": "تنظیمات geodata ذخیره شود؟",
|
||
"geodataConfirmContent": "قالب پیکربندی Xray بهروزرسانی و Xray ریاستارت میشود.",
|
||
"geodataInvalidUrl": "هر فایل به یک آدرس HTTPS نیاز دارد.",
|
||
"geodataInvalidFile": "نام فایل باید ساده باشد، مانند geosite_custom.dat (بدون مسیر).",
|
||
"geodataInvalidCron": "Cron باید ۵ بخش داشته باشد، مثل 0 4 * * *",
|
||
"geodataEmpty": "فایلی پیکربندی نشده است. در قوانین مسیریابی فایلها به صورت ext:geosite_custom.dat:category استفاده میشوند.",
|
||
"dontRefresh": "در حال نصب، لطفا صفحه را رفرش نکنید",
|
||
"logs": "لاگها",
|
||
"accessLogs": "لاگهای دسترسی",
|
||
"autoUpdate": "بهروزرسانی خودکار",
|
||
"config": "پیکربندی",
|
||
"backup": "پشتیبانگیری",
|
||
"backupTitle": "پشتیبانگیری و بازیابی",
|
||
"exportDatabase": "پشتیبانگیری",
|
||
"exportDatabaseDesc": "برای دانلود یک فایل .db حاوی پشتیبان از پایگاه داده فعلی خود به دستگاهتان کلیک کنید.",
|
||
"importDatabase": "بازیابی",
|
||
"importDatabaseDesc": "برای انتخاب و آپلود یک فایل .db از دستگاهتان و بازیابی پایگاه داده از یک پشتیبان کلیک کنید.",
|
||
"importDatabaseSuccess": "پایگاه داده با موفقیت وارد شد",
|
||
"importDatabaseError": "خطا در وارد کردن پایگاه داده",
|
||
"readDatabaseError": "خطا در خواندن پایگاه داده",
|
||
"getDatabaseError": "خطا در دریافت پایگاه داده",
|
||
"getConfigError": "خطا در دریافت فایل پیکربندی",
|
||
"backupPostgresNote": "این پنل روی PostgreSQL اجرا میشود. «پشتیبانگیری» یک آرشیو pg_dump (.dump) دانلود میکند و «بازیابی» آن را با pg_restore بازمیگرداند. سرور باید ابزارهای کلاینت PostgreSQL (pg_dump و pg_restore) را نصب داشته باشد.",
|
||
"exportDatabasePgDesc": "برای دانلود یک دامپ PostgreSQL (.dump) از پایگاه داده فعلی روی دستگاهتان کلیک کنید.",
|
||
"importDatabasePgDesc": "برای انتخاب و بارگذاری یک فایل .dump جهت بازیابی پایگاه داده PostgreSQL کلیک کنید. این کار همه دادههای فعلی را جایگزین میکند.",
|
||
"migrationDownload": "دانلود فایل مهاجرت",
|
||
"migrationDownloadDesc": "برای دانلود یک خروجی قابلحمل .dump (متن SQL) از پایگاهدادهٔ SQLite خود کلیک کنید.",
|
||
"migrationDownloadPgDesc": "برای دانلود یک پایگاهدادهٔ SQLite با پسوند .db که از دادههای PostgreSQL شما ساخته میشود کلیک کنید؛ آمادهٔ اجرای این پنل روی SQLite."
|
||
},
|
||
"inbounds": {
|
||
"title": "ورودیها",
|
||
"totalDownUp": "دریافت/ارسال کل",
|
||
"totalUsage": "مصرف کل",
|
||
"inboundCount": "کل ورودیها",
|
||
"operate": "منو",
|
||
"enable": "فعال",
|
||
"remark": "نام",
|
||
"node": "نود",
|
||
"deployTo": "استقرار روی",
|
||
"localPanel": "پنل لوکال",
|
||
"fallbacks": {
|
||
"title": "Fallbackها",
|
||
"help": "وقتی اتصالی روی این اینباند با هیچ کلاینتی تطبیق پیدا نمیکند، به جای دیگری ارجاع داده میشود. یک اینباند فرزند از پایین انتخاب کنید تا فیلدهای مسیریابی (SNI / ALPN / Path / xver) خودکار از روی transport آن پر شود، یا انتخابگر را خالی بگذارید و مقدار Dest را مستقیم تنظیم کنید (مثلاً 8080 یا 127.0.0.1:8080) تا به یک سرور بیرونی مانند Nginx ارجاع شود. هر اینباند فرزند باید روی 127.0.0.1 با security=none گوش بدهد.",
|
||
"empty": "هنوز فالبکی اضافه نشده",
|
||
"add": "افزودن فالبک",
|
||
"pickInbound": "یک اینباند انتخاب کنید",
|
||
"matchAny": "همه",
|
||
"destPlaceholder": "خودکار (listen:port فرزند)",
|
||
"rederive": "پر کردن مجدد از فرزند",
|
||
"rederived": "از فرزند پر شد",
|
||
"editAdvanced": "ویرایش فیلدهای مسیریابی",
|
||
"hideAdvanced": "بستن پیشرفته",
|
||
"quickAddAll": "افزودن سریع همهی موارد واجد شرایط",
|
||
"quickAdded": "{n} فالبک افزوده شد",
|
||
"quickAddedNone": "اینباند جدیدی برای افزودن وجود ندارد",
|
||
"routesWhen": "هدایت میشود وقتی",
|
||
"defaultCatchAll": "پیشفرض — همهی موارد دیگر را میگیرد",
|
||
"needsTls": "فالبکها پس از انتخاب TLS یا Reality در برگهی امنیت در دسترس میشوند (فقط VLESS/Trojan روی RAW)."
|
||
},
|
||
"protocol": "پروتکل",
|
||
"port": "پورت",
|
||
"portMap": "نگاشت پورت",
|
||
"traffic": "ترافیک",
|
||
"speed": "سرعت",
|
||
"details": "توضیحات",
|
||
"transportConfig": "انتقال",
|
||
"expireDate": "مدت زمان",
|
||
"createdAt": "ایجاد",
|
||
"updatedAt": "بهروزرسانی",
|
||
"resetTraffic": "بازنشانی ترافیک",
|
||
"addInbound": "افزودن ورودی",
|
||
"generalActions": "عملیات کلی",
|
||
"modifyInbound": "ویرایش ورودی",
|
||
"deleteInbound": "حذف ورودی",
|
||
"deleteInboundContent": "آیا مطمئن به حذف ورودی هستید؟",
|
||
"deleteConfirmTitle": "اینباند «{remark}» حذف شود؟",
|
||
"deleteConfirmContent": "این اینباند و تمام کلاینتهای آن حذف میشود. این عمل غیرقابل بازگشت است.",
|
||
"resetConfirmTitle": "ترافیک اینباند «{remark}» صفر شود؟",
|
||
"resetConfirmContent": "شمارندههای ارسال/دریافت این اینباند به صفر برمیگردد.",
|
||
"selectedCount": "{count} انتخابشده",
|
||
"selectAll": "انتخاب همه",
|
||
"bulkDeleteConfirmTitle": "حذف {count} اینباند؟",
|
||
"bulkDeleteConfirmContent": "اینباندهای انتخابشده و تمام کلاینتهای آنها حذف میشوند. این عمل غیرقابل بازگشت است.",
|
||
"cloneConfirmTitle": "اینباند «{remark}» کپی شود؟",
|
||
"cloneConfirmContent": "یک نسخه با پورت جدید و لیست کلاینت خالی ساخته میشود.",
|
||
"delAllClients": "حذف همه کلاینتها",
|
||
"delAllClientsConfirmTitle": "حذف هر {count} کلاینت اینباند «{remark}»؟",
|
||
"delAllClientsConfirmContent": "تمام کلاینتهای این اینباند به همراه رکوردهای ترافیکشان حذف میشوند. خود اینباند باقی میماند. این عمل غیرقابل بازگشت است.",
|
||
"attachClients": "الصاق کاربران به…",
|
||
"addClientsToGroup": "افزودن کاربران به گروه…",
|
||
"attachClientsTitle": "الصاق کاربران از «{remark}»",
|
||
"attachClientsDesc": "همان {count} کاربر (با UUID/رمز یکسان و ترافیک مشترک) را به ورودی(های) انتخابی الصاق میکند. در این ورودی هم باقی میمانند.",
|
||
"attachClientsTargets": "ورودیهای مقصد",
|
||
"attachClientsNoTargets": "هیچ ورودی سازگار دیگری برای الصاق در دسترس نیست.",
|
||
"attachClientsResult": "الصاق شد {attached}، نادیده {skipped}.",
|
||
"attachClientsResultMixed": "الصاق شد {attached}، نادیده {skipped}، خطا {errors}.",
|
||
"attachClientsSelectLabel": "کاربران برای الصاق",
|
||
"attachClientsSearchPlaceholder": "جستجوی ایمیل یا توضیح",
|
||
"attachClientsStatusDisabled": "غیرفعال",
|
||
"attachClientsSelectedCount": "{selected} از {total} انتخابشده",
|
||
"attachExistingClients": "الصاق کاربران موجود…",
|
||
"attachExistingTitle": "الصاق کاربران موجود به «{remark}»",
|
||
"attachExistingDesc": "کاربران موجود ({count} کاربر در دسترس) را به این ورودی الصاق میکند — با همان UUID/رمز و ترافیک مشترک. کاربرانی که از قبل روی این ورودی هستند نادیده گرفته میشوند.",
|
||
"attachExistingNoClients": "هنوز هیچ کاربری وجود ندارد. ابتدا کاربر بسازید، سپس اینجا الصاق کنید.",
|
||
"attachExistingStatusAttached": "از قبل الصاقشده",
|
||
"detachClients": "جداسازی کاربران",
|
||
"detachClientsTitle": "جداسازی کاربران از «{remark}»",
|
||
"detachClientsDesc": "کاربر(های) انتخابی را تنها از این ورودی حذف میکند. خود رکورد کاربر حفظ میشود (برای حذف کامل از Delete استفاده کنید). مبدا در مجموع {count} کاربر دارد.",
|
||
"detachClientsResult": "جدا شد {detached}، نادیده {skipped}.",
|
||
"detachClientsResultMixed": "جدا شد {detached}، نادیده {skipped}، خطا {errors}.",
|
||
"detachClientsSelectLabel": "کاربران برای جداسازی",
|
||
"exportLinksTitle": "خروجی لینکهای اینباند",
|
||
"exportSubsTitle": "خروجی لینکهای ساب",
|
||
"exportAllLinksTitle": "خروجی لینکهای همه اینباندها",
|
||
"exportAllSubsTitle": "خروجی لینکهای ساب همه اینباندها",
|
||
"exportAllLinksFileName": "همه-ورودیها",
|
||
"exportAllSubsFileName": "همه-ورودیها-Subs",
|
||
"inboundJsonTitle": "JSON ورودی",
|
||
"deleteClient": "حذف کاربر",
|
||
"deleteClientContent": "آیا مطمئن به حذف کاربر هستید؟",
|
||
"resetTrafficContent": "آیا مطمئن به ریست ترافیک هستید؟",
|
||
"copyLink": "کپی لینک",
|
||
"address": "آدرس",
|
||
"network": "شبکه",
|
||
"destinationPort": "پورت مقصد",
|
||
"targetAddress": "آدرس مقصد",
|
||
"monitorDesc": "بهطور پیشفرض خالیبگذارید",
|
||
"meansNoLimit": "= نامحدود. (واحد: GB)",
|
||
"totalFlow": "ترافیک کل",
|
||
"leaveBlankToNeverExpire": "برای منقضینشدن خالیبگذارید",
|
||
"noRecommendKeepDefault": "توصیهمیشود بهطور پیشفرض حفظشود",
|
||
"certificatePath": "مسیر فایل",
|
||
"certificateContent": "محتوای فایل",
|
||
"publicKey": "کلید عمومی",
|
||
"privatekey": "کلید خصوصی",
|
||
"clickOnQRcode": "برای کپی بر روی کدتصویری کلیک کنید",
|
||
"client": "کاربر",
|
||
"export": "استخراج لینکها",
|
||
"clone": "شبیهسازی",
|
||
"cloneInbound": "شبیهسازی ورودی",
|
||
"cloneInboundContent": "همه موارد این ورودی بجز پورت، آیپی و کاربرها شبیهسازی خواهند شد",
|
||
"cloneInboundOk": "ساختن شبیه ساز",
|
||
"resetAllTraffic": "ریست ترافیک کل ورودیها",
|
||
"resetAllTrafficTitle": "ریست ترافیک کل ورودیها",
|
||
"resetAllTrafficContent": "آیا مطمئن به ریست ترافیک تمام ورودیها هستید؟",
|
||
"resetInboundClientTraffics": "ریست ترافیک کاربران",
|
||
"resetInboundClientTrafficTitle": "ریست ترافیک کاربران",
|
||
"resetInboundClientTrafficContent": "آیا مطمئن به ریست ترافیک تمام کاربران این ورودی هستید؟",
|
||
"resetAllClientTraffics": "ریست ترافیک کل کاربران",
|
||
"resetAllClientTrafficTitle": "ریست ترافیک کل کاربران",
|
||
"resetAllClientTrafficContent": "آیا مطمئن به ریست ترافیک تمام کاربران هستید؟",
|
||
"delDepletedClients": "حذف کاربران منقضی",
|
||
"delDepletedClientsTitle": "حذف کاربران منقضی",
|
||
"delDepletedClientsContent": "آیا مطمئن به حذف تمام کاربران منقضیشده هستید؟",
|
||
"email": "ایمیل",
|
||
"emailDesc": "باید یک ایمیل یکتا باشد",
|
||
"IPLimit": "محدودیت آیپی",
|
||
"IPLimitDesc": "(اگر تعداد از مقدار تنظیم شده بیشتر شود، ورودی را غیرفعال می کند. (0 = غیرفعال",
|
||
"IPLimitlog": "گزارشها",
|
||
"IPLimitlogDesc": "گزارش تاریخچه آیپی. برای فعال کردن ورودی پس از غیرفعال شدن، گزارش را پاک کنید",
|
||
"IPLimitlogclear": "پاک کردن گزارشها",
|
||
"setDefaultCert": "استفاده از گواهی پنل",
|
||
"setDefaultCertEmpty": "هیچ گواهیای برای پنل پیکربندی نشده. ابتدا از تنظیمات یکی تعیین کنید.",
|
||
"streamTab": "انتقال",
|
||
"securityTab": "امنیت",
|
||
"sniffingTab": "شنود",
|
||
"sniffingMetadataOnly": "فقط متادیتا",
|
||
"sniffingRouteOnly": "فقط مسیریابی",
|
||
"sniffingIpsExcluded": "IPهای مستثنا",
|
||
"sniffingDomainsExcluded": "دامنههای مستثنا",
|
||
"decryption": "رمزگشایی",
|
||
"encryption": "رمزنگاری",
|
||
"vlessAuthX25519": "X25519 (native)",
|
||
"vlessAuthMlkem768": "ML-KEM-768 (native)",
|
||
"vlessAuthX25519Xorpub": "X25519 (xorpub)",
|
||
"vlessAuthX25519Random": "X25519 (random)",
|
||
"vlessAuthMlkem768Xorpub": "ML-KEM-768 (xorpub)",
|
||
"vlessAuthMlkem768Random": "ML-KEM-768 (random)",
|
||
"vlessAuthCustom": "سفارشی",
|
||
"vlessAuthSelected": "انتخابشده: {auth}",
|
||
"vlessAuthGenerate": "تولید کلیدها",
|
||
"vlessAuthGenerateButton": "تولید",
|
||
"advanced": {
|
||
"title": "بخشهای JSON اینباند",
|
||
"subtitle": "JSON کامل اینباند و ویرایشگرهای جداگانه برای settings، sniffing و streamSettings.",
|
||
"all": "همه",
|
||
"allHelp": "شیء کامل اینباند با همه فیلدها در یک ویرایشگر.",
|
||
"settings": "تنظیمات",
|
||
"settingsHelp": "ساختار بلوک settings در Xray:",
|
||
"sniffing": "Sniffing",
|
||
"sniffingHelp": "ساختار بلوک sniffing در Xray:",
|
||
"stream": "Stream",
|
||
"streamHelp": "ساختار بلوک stream در Xray:",
|
||
"jsonErrorPrefix": "JSON پیشرفته"
|
||
},
|
||
"telegramDesc": "لطفا شناسه گفتگوی تلگرام را وارد کنید. (از دستور '/id' در ربات استفاده کنید) یا ({'@'}userinfobot)",
|
||
"subscriptionDesc": "شما میتوانید لینک سابسکربپشن خودرا در 'جزئیات' پیدا کنید، همچنین میتوانید از همین نام برای چندین کاربر استفادهکنید",
|
||
"subSortIndex": "ترتیب اشتراک",
|
||
"same": "همسان",
|
||
"inboundInfo": "اطلاعات ورودی",
|
||
"exportInbound": "استخراج ورودی",
|
||
"import": "افزودن",
|
||
"importInbound": "افزودن یک ورودی",
|
||
"periodicTrafficResetTitle": "بازنشانی ترافیک",
|
||
"periodicTrafficResetDesc": "بازنشانی خودکار شمارنده ترافیک در فواصل زمانی مشخص",
|
||
"lastReset": "آخرین بازنشانی",
|
||
"periodicTrafficReset": {
|
||
"never": "هرگز",
|
||
"daily": "روزانه",
|
||
"weekly": "هفتگی",
|
||
"monthly": "ماهانه",
|
||
"hourly": "هر ساعت"
|
||
},
|
||
"toasts": {
|
||
"obtain": "فراهمسازی",
|
||
"updateSuccess": "بروزرسانی با موفقیت انجام شد",
|
||
"logCleanSuccess": "لاگ پاکسازی شد",
|
||
"inboundsUpdateSuccess": "ورودیها با موفقیت بهروزرسانی شدند",
|
||
"inboundUpdateSuccess": "ورودی با موفقیت بهروزرسانی شد",
|
||
"inboundCreateSuccess": "ورودی با موفقیت ایجاد شد",
|
||
"bulkDeleted": "{count} اینباند حذف شد",
|
||
"bulkDeletedMixed": "{ok} حذف، {failed} ناموفق",
|
||
"inboundDeleteSuccess": "ورودی با موفقیت حذف شد",
|
||
"inboundClientAddSuccess": "کلاینت(های) ورودی اضافه شدند",
|
||
"inboundClientDeleteSuccess": "کلاینت ورودی حذف شد",
|
||
"inboundClientUpdateSuccess": "کلاینت ورودی بهروزرسانی شد",
|
||
"savedNodeOfflineWillSync": "بهصورت محلی ذخیره شد. یک نود پشتیبان آفلاین یا غیرفعال است — تغییر پس از اتصال مجدد همگامسازی میشود.",
|
||
"delDepletedClientsSuccess": "تمام کلاینتهای مصرف شده حذف شدند",
|
||
"resetAllClientTrafficSuccess": "تمام ترافیک کلاینت بازنشانی شد",
|
||
"resetAllTrafficSuccess": "تمام ترافیکها بازنشانی شدند",
|
||
"resetInboundClientTrafficSuccess": "ترافیک بازنشانی شد",
|
||
"resetInboundTrafficSuccess": "ترافیک ورودی بازنشانی شد",
|
||
"trafficGetError": "خطا در دریافت ترافیکها",
|
||
"getNewX25519CertError": "خطا در دریافت گواهی X25519.",
|
||
"getNewmldsa65Error": "خطا در دریافت گواهی mldsa65.",
|
||
"getNewVlessEncError": "خطا در دریافت گواهی VlessEnc.",
|
||
"scanRealityTargetError": "اسکن هدف REALITY ناموفق بود.",
|
||
"scanRealityTargetFeasible": "هدف مناسب است — هدف و SNI پر شد.",
|
||
"scanRealityTargetNotFeasible": "هدف در دسترس است اما برای REALITY مناسب نیست.",
|
||
"invalidClientField": "کلاینت {client}: فیلد {field} — {reason}",
|
||
"invalidField": "{field} — {reason}",
|
||
"moreIssues": "{message} (+{count} مورد دیگر)"
|
||
},
|
||
"form": {
|
||
"moveUp": "بالا",
|
||
"moveDown": "پایین",
|
||
"addAll": "افزودن همه",
|
||
"addAllFallbackTooltip": "برای هر ورودی واجد شرایط که هنوز متصل نشده یک ردیف fallback اضافه میکند",
|
||
"peers": "Peers",
|
||
"addPeer": "افزودن peer",
|
||
"keepAlive": "Keep-alive",
|
||
"autoSystemRoutesTooltip": "فقط ویندوز. CIDRها بهصورت خودکار به جدول مسیریابی سیستم اضافه میشوند تا ترافیک مطابق از TUN عبور کند.",
|
||
"autoOutboundsInterface": "رابط خروجی خودکار",
|
||
"autoOutboundsInterfaceTooltip": "رابط فیزیکی برای ترافیک خروجی. از auto برای تشخیص استفاده کنید؛ زمانی که Auto system routes فعال باشد، بهصورت خودکار فعال میشود.",
|
||
"rewriteAddress": "بازنویسی آدرس",
|
||
"rewritePort": "بازنویسی پورت",
|
||
"allowedNetwork": "شبکه مجاز",
|
||
"followRedirect": "دنبالکردن Redirect",
|
||
"accounts": "حسابها",
|
||
"allowTransparent": "اجازه شفاف",
|
||
"encryptionMethod": "روش رمزنگاری",
|
||
"fakeTlsDomain": "دامنه FakeTLS (SNI)",
|
||
"mtprotoSecret": "کلید مخفی",
|
||
"mtgDomainFrontingIp": "آیپی Domain fronting",
|
||
"mtgDomainFrontingPort": "پورت Domain fronting",
|
||
"mtgDomainFrontingProxyProtocol": "پروتکل PROXY برای Domain fronting",
|
||
"mtgDomainFrontingHint": "جایی که mtg ترافیک غیرتلگرامی را به آن ارسال میکند — مثلاً سایت جعلی NGINX شما. برای استفاده از دامنهٔ FakeTLS از طریق DNS، فیلد IP را خالی بگذارید؛ پورت پیشفرض 443 است.",
|
||
"mtgProxyProtocolListener": "پذیرش پروتکل PROXY (شنونده)",
|
||
"mtgPreferIp": "ترجیح IP",
|
||
"mtgDebug": "گزارش اشکالزدایی",
|
||
"mtgRouteThroughXray": "مسیریابی از طریق Xray",
|
||
"mtgRouteThroughXrayHint": "ترافیک تلگرام این پراکسی را از طریق Xray بفرستید تا از قوانین مسیریابی شما پیروی کند. سرویس جانبی mtg از طریق یک پل SOCKS محلی که با تگ همین ورودی نشانهگذاری شده خارج میشود؛ برای قوانین پیشرفته در تب مسیریابی به همان تگ ارجاع دهید.",
|
||
"mtgRouteOutbound": "خروجی",
|
||
"mtgRouteOutboundHint": "اختیاری. ترافیک تلگرام را وادار کنید از این خروجی (یا متعادلکننده) خارج شود. برای اینکه قوانین مسیریابی تصمیم بگیرند، خالی بگذارید.",
|
||
"mtgRouteOutboundPlaceholder": "استفاده از قوانین مسیریابی",
|
||
"visionTestseed": "Vision testseed",
|
||
"version": "نسخه",
|
||
"udpIdleTimeout": "UDP idle timeout (s)",
|
||
"masquerade": "استتار",
|
||
"type": "نوع",
|
||
"upstreamUrl": "آدرس Upstream",
|
||
"rewriteHost": "بازنویسی Host",
|
||
"skipTlsVerify": "رد تایید TLS",
|
||
"directory": "دایرکتوری",
|
||
"statusCode": "کد وضعیت",
|
||
"body": "Body",
|
||
"headers": "هدرها",
|
||
"proxyProtocol": "Proxy Protocol",
|
||
"requestVersion": "نسخه درخواست",
|
||
"requestMethod": "متد درخواست",
|
||
"requestPath": "مسیر درخواست",
|
||
"requestHeaders": "هدرهای درخواست",
|
||
"responseVersion": "نسخه پاسخ",
|
||
"responseStatus": "وضعیت پاسخ",
|
||
"responseReason": "دلیل پاسخ",
|
||
"responseHeaders": "هدرهای پاسخ",
|
||
"heartbeatPeriod": "دوره Heartbeat",
|
||
"serviceName": "نام سرویس",
|
||
"authority": "Authority",
|
||
"multiMode": "حالت چندگانه",
|
||
"maxBufferedUpload": "حداکثر آپلود بافرشده",
|
||
"maxUploadSize": "حداکثر اندازه آپلود (بایت)",
|
||
"streamUpServer": "سرور Stream-Up",
|
||
"serverMaxHeaderBytes": "حداکثر بایت هدر سرور",
|
||
"paddingBytes": "بایتهای Padding",
|
||
"uplinkHttpMethod": "متد HTTP آپلینک",
|
||
"paddingObfsMode": "حالت ابهام Padding",
|
||
"paddingKey": "کلید Padding",
|
||
"paddingHeader": "هدر Padding",
|
||
"paddingPlacement": "محل Padding",
|
||
"paddingMethod": "روش Padding",
|
||
"sessionPlacement": "محل نشست",
|
||
"sessionKey": "کلید نشست",
|
||
"sessionIDTable": "جدول شناسه نشست",
|
||
"sessionIDTableHint": "مجموعه نویسهها برای تولید شناسه نشست: یک نام از پیشتعریفشده (ALPHABET، Base62، hex، number، …) یا یک رشته ASCII. برای مقدار پیشفرض xray-core خالی بگذارید.",
|
||
"sessionIDLength": "طول شناسه نشست",
|
||
"sessionIDLengthHint": "طول یا بازه (مثلاً 8-16) شناسه نشست تولیدشده. فقط وقتی جدول شناسه نشست تنظیم شده باشد استفاده میشود؛ کمینه باید بزرگتر از 0 باشد.",
|
||
"sequencePlacement": "محل Sequence",
|
||
"sequenceKey": "Sequence Key",
|
||
"uplinkDataPlacement": "محل داده Uplink",
|
||
"uplinkDataKey": "کلید داده Uplink",
|
||
"noSseHeader": "بدون هدر SSE",
|
||
"ttiMs": "TTI (ms)",
|
||
"uplinkMbps": "آپلود (MB/s)",
|
||
"downlinkMbps": "دانلود (MB/s)",
|
||
"cwndMultiplier": "ضریب CWND",
|
||
"maxSendingWindow": "حداکثر پنجره ارسال",
|
||
"externalProxy": "پراکسی خارجی",
|
||
"forceTls": "اجبار TLS",
|
||
"fingerprint": "اثرانگشت",
|
||
"defaultOption": "پیشفرض",
|
||
"routeMark": "علامت مسیر",
|
||
"tcpKeepAliveInterval": "بازه TCP Keep Alive",
|
||
"tcpKeepAliveIdle": "TCP Keep Alive Idle",
|
||
"tcpMaxSeg": "TCP Max Seg",
|
||
"tcpUserTimeout": "TCP User Timeout",
|
||
"tcpWindowClamp": "TCP Window Clamp",
|
||
"tcpWindowClampHint": "برای استفاده از پیشفرض سیستمعامل، مقدار را 0 بگذارید. مقادیر غیرصفر پنجرهٔ دریافت TCP اعلامشده را محدود میکنند؛ مقادیری مانند 600 (از مثال مستندات Xray) میتوانند نرخ عبور را روی لینکهای با تأخیر بالا بهشدت کاهش دهند.",
|
||
"tcpFastOpen": "TCP Fast Open",
|
||
"multipathTcp": "Multipath TCP",
|
||
"penetrate": "Penetrate",
|
||
"v6Only": "فقط IPv6",
|
||
"tcpCongestion": "تراکم TCP",
|
||
"dialerProxy": "Dialer Proxy",
|
||
"trustedXForwardedFor": "X-Forwarded-For مورد اعتماد",
|
||
"trustedXForwardedForHint": "این هدر درخواست برای گرفتن IP واقعی کاربر مورد اعتماد قرار میگیرد (مثلاً CF-Connecting-IP پشت CDN کلودفلر). فقط روی ترنسپورتهای WebSocket، HTTPUpgrade، XHTTP و gRPC اعمال میشود. برای نادیدهگرفتن هدرها خالی بگذارید.",
|
||
"proxyProtocolHint": "پذیرش هدر PROXY protocol برای گرفتن IP واقعی کاربر از یک تونل/رله L4 بالادست (HAProxy، gost، nginx-stream، Xray dokodemo-door) یا Cloudflare Spectrum. بالادست باید PROXY protocol را ارسال کند. روی TCP، WebSocket، HTTPUpgrade و gRPC کار میکند؛ روی mKCP خیر.",
|
||
"realClientIp": "IP واقعی کاربر",
|
||
"realClientIpHint": "وقتی ترافیک از طریق CDN یا رله به این ورودی میرسد، بهجای ثبت آدرس واسط، IP واقعی کاربر گرفته میشود. یک پریست انتخاب کنید تا فیلدهای sockopt مربوطه پایین تکمیل شوند. این فیلدها هرگز در اشتراکها به کلاینتها ارسال نمیشوند.",
|
||
"realClientIpPresetOff": "خاموش / مستقیم",
|
||
"realClientIpPresetCloudflare": "Cloudflare CDN",
|
||
"realClientIpPresetProxyProtocol": "رله L4 / Spectrum (PROXY)",
|
||
"realClientIpTrustedHeaderTransportWarn": "Trusted X-Forwarded-For فقط روی WebSocket، HTTPUpgrade و XHTTP اعمال میشود. روی ترنسپورت فعلی این هدر نادیده گرفته میشود.",
|
||
"realClientIpProxyProtocolTransportWarn": "PROXY protocol روی این ترنسپورت (mKCP) پشتیبانی نمیشود. از TCP/RAW، WebSocket، HTTPUpgrade، gRPC یا XHTTP استفاده کنید.",
|
||
"addressPortStrategy": "استراتژی آدرس+پورت",
|
||
"tryDelayMs": "تأخیر تلاش (ms)",
|
||
"prioritizeIPv6": "اولویت IPv6",
|
||
"interleave": "Interleave",
|
||
"maxConcurrentTry": "حداکثر تلاش همزمان",
|
||
"customSockopt": "Sockopt دلخواه",
|
||
"addCustomOption": "افزودن گزینه دلخواه",
|
||
"serverNameIndication": "SNI",
|
||
"cipherSuites": "مجموعههای رمز",
|
||
"autoOption": "خودکار",
|
||
"minMaxVersion": "نسخه حداقل/حداکثر",
|
||
"rejectUnknownSni": "رد SNI ناشناخته",
|
||
"disableSystemRoot": "غیرفعالسازی System Root",
|
||
"sessionResumption": "ازسرگیری نشست",
|
||
"oneTimeLoading": "بارگذاری یکبار",
|
||
"usageOption": "گزینه استفاده",
|
||
"buildChain": "ساخت زنجیره",
|
||
"echKey": "کلید ECH",
|
||
"echConfig": "پیکربندی ECH",
|
||
"echSockopt": "Sockopt مربوط به ECH",
|
||
"echSockoptTip": "تنظیمات سوکت برای اتصالی که Xray برای دریافت لیست پیکربندی ECH استفاده میکند (مثلاً عبور این درخواست از یک dialerProxy). برای استفاده از پیشفرض غیرفعال بگذارید.",
|
||
"curvePreferences": "ترجیح منحنیها",
|
||
"curvePreferencesTip": "منحنیهای تبادل کلید TLS که سرور ارائه میدهد را بهترتیب اولویت محدود میکند (مثلاً X25519MLKEM768، X25519). خالی بگذارید تا پیشفرض Xray استفاده شود.",
|
||
"masterKeyLog": "لاگ کلید اصلی",
|
||
"masterKeyLogTip": "مسیر نوشتن کلیدهای اصلی TLS (قالب SSLKEYLOGFILE) برای دیباگ با Wireshark. در محیط عملیاتی خالی بگذارید — هرکس به این فایل دسترسی داشته باشد میتواند ترافیک را رمزگشایی کند.",
|
||
"pinFromCert": "پرکردن از گواهی همین ورودی",
|
||
"pinFromRemote": "گرفتن هش با پینگکردن SNI (xray tls ping)",
|
||
"pinFromRemoteNoSni": "ابتدا SNI (serverName) را تنظیم کنید تا گواهی راهدور پینگ شود.",
|
||
"pinFromRemoteFailed": "گرفتن هشِ گواهی راهدور ممکن نشد.",
|
||
"verifyPeerCertByName": "تأیید گواهی همتا با نام",
|
||
"verifyPeerCertByNameTip": "به کلاینتها میگوید گواهی سرور را بهجای SNI با این نام تأیید کنند. نامها با کاما جدا شوند. فقط در پنل — در لینکهای اشتراکگذاری گنجانده میشود (vcn). جایگزین مدرن allowInsecure که xray بعد از ۲۰۲۶-۰۶-۰۱ حذفش کرد.",
|
||
"pinnedPeerCertSha256": "SHA-256 پینشدهٔ گواهی همتا",
|
||
"pinnedPeerCertSha256Tip": "هشهای SHA-256 گواهی همتا بهصورت رشتهٔ هگزادسیمال (مثل e8e2d3…)، با کاما جدا شوند. فقط در پنل — در پیکربندی xray سرور نوشته نمیشود، اما در لینکهای اشتراکگذاری گنجانده میشود تا کلاینتها بتوانند گواهی را پین کنند.",
|
||
"pinnedPeerCertSha256Placeholder": "هش(های) هگزادسیمال، با کاما جدا شوند",
|
||
"getNewEchCert": "دریافت گواهی ECH جدید",
|
||
"show": "نمایش",
|
||
"xver": "Xver",
|
||
"target": "هدف",
|
||
"maxTimeDiff": "حداکثر اختلاف زمان (ms)",
|
||
"minClientVer": "حداقل نسخه کلاینت",
|
||
"maxClientVer": "حداکثر نسخه کلاینت",
|
||
"shortIds": "Short IDها",
|
||
"realityTargetHint": "الزامی است. باید شامل پورت باشد (مثلاً example.com:443). بدون پورت، Xray-core اجرا نمیشود.",
|
||
"realityTargetRequired": "هدف REALITY الزامی است",
|
||
"realityTargetNeedsPort": "هدف REALITY باید شامل پورت باشد (مثلاً example.com:443)",
|
||
"realityTargetInvalidPort": "پورت هدف REALITY نامعتبر است",
|
||
"scan": "اسکن",
|
||
"findTargets": "یافتن هدفها",
|
||
"scanModalTitle": "اسکنر هدف REALITY",
|
||
"scanModalDesc": "یک دامنه را اعتبارسنجی کنید، یا یک محدودهی IP/CIDR را اسکن کنید تا هدفهای جدید REALITY از روی گواهیهایشان کشف شوند. برای بررسی کاندیدهای پیشفرض، کادر را خالی بگذارید.",
|
||
"scanDiscoverPlaceholder": "آیپی، CIDR یا دامنه — برای کاندیدهای پیشفرض خالی بگذارید",
|
||
"scanStatus": "وضعیت",
|
||
"scanFeasible": "مناسب",
|
||
"scanNotFeasible": "نامناسب",
|
||
"scanCurve": "تبادل کلید",
|
||
"scanCert": "گواهی",
|
||
"scanCertInvalid": "نامعتبر",
|
||
"scanLatency": "تأخیر",
|
||
"scanUse": "استفاده",
|
||
"scanRescan": "اسکن مجدد",
|
||
"spiderX": "SpiderX",
|
||
"spiderXHint": "دانهی هر کاربر — پنل از روی آن مسیر spx یکتا برای هر کاربر میسازد؛ برای چرخش مسیر همه، دوباره تولید کنید",
|
||
"getNewCert": "دریافت گواهی جدید",
|
||
"mldsa65Seed": "mldsa65 Seed",
|
||
"mldsa65Verify": "mldsa65 Verify",
|
||
"getNewSeed": "دریافت Seed جدید",
|
||
"limitFallback": "محدودیت فالبک",
|
||
"limitFallbackUpload": "محدودیت فالبک آپلود",
|
||
"limitFallbackDownload": "محدودیت فالبک دانلود",
|
||
"afterBytes": "پس از (بایت)",
|
||
"afterBytesTip": "اجازه بده فالبک برای این تعداد بایت با سرعت کامل اجرا شود، سپس محدودسازی شروع شود. مقدار ۰ یعنی از همان بایت اول محدود شود.",
|
||
"bytesPerSec": "بایت بر ثانیه",
|
||
"bytesPerSecTip": "سقف سرعت (بایت بر ثانیه) که بعد از آستانه روی ترافیک فالبک اعمال میشود تا پروبها نتوانند سرورت را بهعنوان پهنایباند رایگان به مقصد استفاده کنند. مقدار ۰ یعنی بدون محدودیت (این جهت غیرفعال میشود).",
|
||
"burstBytesPerSec": "بایت انفجاری بر ثانیه",
|
||
"burstBytesPerSecTip": "سهمیه برای انفجارهای کوتاه بالاتر از نرخ ثابت (اندازهٔ token-bucket). اگر کمتر از «بایت بر ثانیه» باشد، به همان مقدار افزایش مییابد.",
|
||
"listenHelp": "میتوانید بهجای پورت TCP یک مسیر سوکت یونیکس وارد کنید (مثلاً /run/xray/in.sock)، یا یک نام سوکت انتزاعی با پیشوند @ (مثلاً @xray/in.sock)، تا روی سوکت گوش داده شود — در این حالت پورت را روی ۰ بگذارید.",
|
||
"shareAddrStrategy": "راهبرد آدرس اشتراکگذاری",
|
||
"shareAddrStrategyHelp": "مشخص میکند کدام آدرس در لینکهای اشتراکگذاری خروجی، کدهای QR و خروجی اشتراک نوشته شود.",
|
||
"shareAddr": "آدرس اشتراکگذاری سفارشی",
|
||
"shareAddrHelp": "فقط زمانی استفاده میشود که راهبرد آدرس اشتراکگذاری روی سفارشی باشد. میزبان یا IP را بدون طرح و پورت وارد کنید.",
|
||
"subSortIndex": "ترتیب در اشتراک",
|
||
"subSortIndexHelp": "جایگاه لینکهای این ورودی در خروجی اشتراک (صفحه اشتراک و برنامههای کلاینت). مقدار کمتر اول میآید و مقدارهای برابر ترتیب ایجاد را حفظ میکنند. روی فهرست ورودیهای پنل تأثیری ندارد.",
|
||
"shareAddrStrategyOptions": {
|
||
"node": "آدرس نود",
|
||
"listen": "آدرس شنود ورودی",
|
||
"custom": "سفارشی"
|
||
}
|
||
},
|
||
"info": {
|
||
"mode": "حالت",
|
||
"grpcServiceName": "grpc serviceName",
|
||
"grpcMultiMode": "grpc multiMode",
|
||
"interfaceName": "نام رابط",
|
||
"mtu": "MTU",
|
||
"gateway": "Gateway",
|
||
"dns": "DNS",
|
||
"outboundsInterface": "رابط خروجی",
|
||
"autoSystemRoutes": "مسیریابی خودکار سیستم",
|
||
"followRedirect": "FollowRedirect",
|
||
"auth": "احراز",
|
||
"noKernelTun": "TUN غیرکرنل",
|
||
"keepAlive": "Keep alive",
|
||
"peerNumber": "Peer {n}",
|
||
"peerNumberConfig": "پیکربندی Peer {n}"
|
||
},
|
||
"stream": {
|
||
"general": {
|
||
"request": "درخواست",
|
||
"response": "پاسخ",
|
||
"name": "نام",
|
||
"value": "مقدار"
|
||
},
|
||
"tcp": {
|
||
"version": "نسخه",
|
||
"method": "متد",
|
||
"path": "مسیر",
|
||
"status": "وضعیت",
|
||
"statusDescription": "توضیحات وضعیت",
|
||
"requestHeader": "سربرگ درخواست",
|
||
"responseHeader": "سربرگ پاسخ"
|
||
}
|
||
},
|
||
"sniffingDestOverride": "بازنویسی مقصد"
|
||
},
|
||
"clients": {
|
||
"tabBasics": "پایه",
|
||
"tabCredentials": "اطلاعات اتصال",
|
||
"tabLinks": "لینکها",
|
||
"wireguardConfig": "پیکربندی WireGuard",
|
||
"config": "پیکربندی",
|
||
"linksHint": "لینکهای اشتراک شخصثالث و آدرس سابسکریپشنهای خارجی را اضافه کنید تا در سابسکریپشن این کاربر قرار گیرند.",
|
||
"addExternalLink": "افزودن لینک خارجی",
|
||
"addExternalSubscription": "افزودن سابسکریپشن خارجی",
|
||
"noExternalLinks": "هنوز لینک خارجیای اضافه نشده.",
|
||
"noExternalSubscriptions": "هنوز سابسکریپشن خارجیای اضافه نشده.",
|
||
"add": "افزودن کلاینت",
|
||
"edit": "ویرایش کلاینت",
|
||
"submitAdd": "افزودن کلاینت",
|
||
"submitEdit": "ذخیره تغییرات",
|
||
"clientCount": "تعداد کلاینتها",
|
||
"bulk": "افزودن گروهی",
|
||
"copyFromInbound": "کپی کلاینتها از اینباند",
|
||
"copyToInbound": "کپی کلاینتها به",
|
||
"copySelected": "کپی انتخابشدهها",
|
||
"copySource": "منبع",
|
||
"copyEmailPreview": "پیشنمایش ایمیل خروجی",
|
||
"copySelectSourceFirst": "ابتدا یک اینباند مبدأ انتخاب کنید.",
|
||
"copyResult": "نتیجه کپی",
|
||
"copyResultSuccess": "با موفقیت کپی شد",
|
||
"copyResultNone": "چیزی برای کپی نیست: کلاینتی انتخاب نشده یا منبع خالی است",
|
||
"copyResultErrors": "خطاهای کپی",
|
||
"copyFlowLabel": "Flow برای کلاینتهای جدید (VLESS)",
|
||
"copyFlowHint": "روی همه کلاینتهای کپیشده اعمال میشود. خالی بگذارید تا رد شود.",
|
||
"selectAll": "انتخاب همه",
|
||
"clearAll": "پاک کردن همه",
|
||
"method": "روش",
|
||
"first": "اول",
|
||
"last": "آخر",
|
||
"ipLog": "گزارش IP",
|
||
"prefix": "پیشوند",
|
||
"postfix": "پسوند",
|
||
"delayedStart": "شروع پس از اولین استفاده",
|
||
"expireDays": "مدت اعتبار (روز)",
|
||
"days": "روز",
|
||
"renew": "تمدید خودکار",
|
||
"renewDesc": "تمدید خودکار پس از انقضا. (۰ = غیرفعال) (واحد: روز)",
|
||
"renewDays": "تمدید خودکار (روز)",
|
||
"searchPlaceholder": "جستجوی ایمیل، توضیح، Sub ID، UUID، رمز، احراز...",
|
||
"filterTitle": "فیلتر کاربران",
|
||
"clearAllFilters": "پاک کردن همه",
|
||
"filters": {
|
||
"nodes": "نودها",
|
||
"localPanel": "محلی (همین پنل)"
|
||
},
|
||
"showingCount": "نمایش {shown} از {total}",
|
||
"sortOldest": "قدیمیترین",
|
||
"sortNewest": "جدیدترین",
|
||
"sortRecentlyUpdated": "اخیراً بهروزشده",
|
||
"sortRecentlyOnline": "اخیراً آنلاین",
|
||
"sortEmailAZ": "ایمیل ا→ی",
|
||
"sortEmailZA": "ایمیل ی→ا",
|
||
"sortMostTraffic": "بیشترین ترافیک",
|
||
"sortHighestRemaining": "بیشترین باقیمانده",
|
||
"sortExpiringSoonest": "نزدیکترین انقضا",
|
||
"has": "دارد",
|
||
"hasNot": "ندارد",
|
||
"title": "کلاینتها",
|
||
"actions": "عملیات",
|
||
"totalGB": "سقف حجم (گیگابایت)",
|
||
"totalGBDesc": "سهمیهی حجم مصرفی کلاینت. ۰ = نامحدود",
|
||
"expiryTime": "انقضا",
|
||
"addClients": "افزودن کلاینتها",
|
||
"limitIp": "محدودیت IP",
|
||
"limitIpDesc": "حداکثر تعداد IP همزمان. ۰ = نامحدود",
|
||
"limitIpFail2banMissing": "Fail2ban نصب نشده است، بنابراین محدودیت IP اعمال نمیشود. برای فعالسازی این گزینه، Fail2ban را از منوی بش x-ui نصب کنید.",
|
||
"limitIpFail2banWindows": "Fail2ban روی ویندوز در دسترس نیست، بنابراین محدودیت IP قابل اعمال نیست.",
|
||
"limitIpDisabled": "قابلیت محدودیت IP روی این سرور غیرفعال است.",
|
||
"password": "رمز عبور",
|
||
"subId": "شناسه اشتراک",
|
||
"online": "آنلاین",
|
||
"email": "ایمیل",
|
||
"emailInvalidChars": "ایمیل نمیتواند شامل فاصله، '/'، '\\' یا کاراکترهای کنترلی باشد",
|
||
"subIdInvalidChars": "شناسهی اشتراک نمیتواند شامل فاصله، '/'، '\\' یا کاراکترهای کنترلی باشد",
|
||
"group": "گروه",
|
||
"groupDesc": "برچسبی منطقی برای دستهبندی کاربران مرتبط (مثل تیم، مشتری، منطقه). از نوار ابزار قابل فیلتر است.",
|
||
"groupPlaceholder": "مثلاً customer-a",
|
||
"comment": "توضیحات",
|
||
"traffic": "ترافیک",
|
||
"offline": "آفلاین",
|
||
"addClient": "افزودن کلاینت",
|
||
"qrCode": "کد QR",
|
||
"clientInfo": "اطلاعات کلاینت",
|
||
"delete": "حذف",
|
||
"reset": "بازنشانی ترافیک",
|
||
"editClient": "ویرایش کلاینت",
|
||
"client": "کلاینت",
|
||
"enabled": "فعال",
|
||
"remaining": "باقیمانده",
|
||
"duration": "مدت",
|
||
"attachedInbounds": "اینباندهای متصل",
|
||
"selectInbound": "یک یا چند اینباند انتخاب کنید",
|
||
"selectAllInbounds": "انتخاب همه",
|
||
"clearAllInbounds": "پاک کردن همه",
|
||
"noSubId": "این کلاینت subId ندارد، لینک اشتراکگذاری وجود ندارد.",
|
||
"noLinks": "لینکی برای اشتراکگذاری نیست — ابتدا این کلاینت را به یک اینباند با پروتکل سازگار متصل کنید.",
|
||
"link": "لینک",
|
||
"resetNotPossible": "ابتدا این کلاینت را به یک اینباند متصل کنید.",
|
||
"general": "عمومی",
|
||
"resetAllTraffics": "بازنشانی ترافیک همه کلاینتها",
|
||
"resetAllTrafficsTitle": "بازنشانی ترافیک همه کلاینتها؟",
|
||
"resetAllTrafficsContent": "شمارنده ارسال/دریافت همه کلاینتها به صفر میرسد. سهمیه و تاریخ انقضا تغییری نمیکند. این عمل غیرقابل بازگشت است.",
|
||
"deleteConfirmTitle": "حذف کلاینت {email}؟",
|
||
"deleteConfirmContent": "این کلاینت از تمام اینباندهای متصل حذف و سابقه ترافیک آن پاک میشود. این عمل غیرقابل بازگشت است.",
|
||
"deleteSelected": "حذف ({count})",
|
||
"adjustSelected": "تنظیم ({count})",
|
||
"subLinksSelected": "لینکهای اشتراک ({count})",
|
||
"addToGroupTitle": "افزودن {count} کاربر به یک گروه",
|
||
"addToGroupTooltip": "یک گروه موجود را انتخاب کنید یا نام جدیدی تایپ کنید. برای حذف کاربران از گروه فعلی، از Ungroup استفاده کنید.",
|
||
"groupName": "نام گروه",
|
||
"addToGroupSuccessToast": "{count} کاربر به {group} اضافه شد",
|
||
"ungroupSuccessToast": "گروه از {count} کاربر پاک شد",
|
||
"ungroup": "خارج از گروه",
|
||
"ungroupConfirmTitle": "حذف {count} کاربر از گروهشان؟",
|
||
"ungroupConfirmContent": "برچسب گروه را روی هر کاربر انتخابی پاک میکند. کاربران حفظ میشوند (برای حذف کامل از Delete استفاده کنید).",
|
||
"addToGroup": "افزودن به گروه",
|
||
"attach": "الصاق",
|
||
"adjust": "تنظیم",
|
||
"subLinks": "لینکهای اشتراک",
|
||
"enable": "فعالسازی",
|
||
"disable": "غیرفعالسازی",
|
||
"bulkEnableConfirmTitle": "{count} کلاینت فعال شوند؟",
|
||
"bulkEnableConfirmContent": "هر کلاینت انتخابشده روی تمام اینباندهای متصل فعال میشود. کلاینتهایی که سهمیه آنها تمام شده یا تاریخ انقضایشان گذشته، بهطور خودکار دوباره غیرفعال میشوند.",
|
||
"bulkDisableConfirmTitle": "{count} کلاینت غیرفعال شوند؟",
|
||
"bulkDisableConfirmContent": "هر کلاینت انتخابشده روی تمام اینباندهای متصل غیرفعال میشود. دسترسی آنها بلافاصله قطع میشود اما رکورد و ترافیکشان حفظ میگردد.",
|
||
"selectedCount": "{count} انتخابشده",
|
||
"attachSelected": "الصاق ({count})",
|
||
"attachToInboundsTitle": "الصاق {count} کاربر به ورودی(ها)",
|
||
"attachToInboundsDesc": "{count} کاربر انتخابشده (همان UUID/رمز و ترافیک مشترک) را به ورودیهای انتخابی الصاق میکند. الصاقهای قبلی حفظ میشوند.",
|
||
"attachToInboundsTargets": "ورودیهای مقصد",
|
||
"attachToInboundsNoTargets": "هیچ ورودی چندکاربرهای برای الصاق در دسترس نیست.",
|
||
"detachSelected": "جداسازی ({count})",
|
||
"detach": "جداسازی",
|
||
"detachFromInboundsTitle": "جداسازی {count} کاربر از ورودی(ها)",
|
||
"detachFromInboundsDesc": "{count} کاربر انتخابشده را از ورودیهای انتخابی حذف میکند. در مواردی که کاربر الصاق نبوده، نادیده گرفته میشود. رکورد کاربر حفظ میشود (برای حذف کامل از Delete استفاده کنید).",
|
||
"detachFromInboundsTargets": "ورودیهایی برای جداسازی",
|
||
"detachFromInboundsNoTargets": "هیچ ورودی چندکاربرهای در دسترس نیست.",
|
||
"detachFromInboundsResult": "جدا شد {detached}، نادیده گرفته شد {skipped}.",
|
||
"detachFromInboundsResultMixed": "جدا شد {detached}، نادیده {skipped}، خطا {errors}.",
|
||
"subLinksTitle": "لینکهای اشتراک ({count})",
|
||
"subLinkColumn": "آدرس اشتراک",
|
||
"subJsonLinkColumn": "آدرس JSON اشتراک",
|
||
"subLinksCopyAll": "کپی همه",
|
||
"subLinksCopiedAll": "{count} لینک کپی شد",
|
||
"subLinksEmpty": "هیچکدام از کاربران انتخابی شناسه اشتراک ندارند.",
|
||
"subLinksDisabled": "سرویس اشتراک غیرفعال است.",
|
||
"subLinksDisabledHint": "برای ساخت لینک، اشتراک را در تنظیمات پنل ← اشتراک فعال کنید.",
|
||
"bulkDeleteConfirmTitle": "حذف {count} کلاینت؟",
|
||
"bulkDeleteConfirmContent": "هر کلاینت انتخابشده از تمام اینباندهای متصل حذف و سابقه ترافیک آن پاک میشود. این عمل غیرقابل بازگشت است.",
|
||
"bulkAdjustTitle": "تنظیم {count} کلاینت",
|
||
"bulkAdjustHint": "مقادیر مثبت اضافه و منفی کم میکنند. کلاینتهایی که زمان یا ترافیک نامحدود دارند برای همان فیلد رد میشوند.",
|
||
"bulkAdjustNothing": "قبل از اعمال، روز یا ترافیک را تنظیم کنید.",
|
||
"addDays": "افزودن روز",
|
||
"addTrafficGB": "افزودن ترافیک (گیگابایت)",
|
||
"bulkFlow": "تنظیم flow",
|
||
"bulkFlowNoChange": "بدون تغییر",
|
||
"bulkFlowDisable": "غیرفعال (پاک کردن flow)",
|
||
"delDepleted": "حذف اتمامیافتهها",
|
||
"delDepletedConfirmTitle": "حذف کلاینتهای اتمامیافته؟",
|
||
"delDepletedConfirmContent": "هر کلاینتی که سهمیه ترافیکاش تمام شده یا تاریخ انقضایش گذشته است حذف میشود. این عمل غیرقابل بازگشت است.",
|
||
"exportClients": "خروجی گرفتن از کلاینتها",
|
||
"importClients": "ورود کلاینتها",
|
||
"import": "ورود",
|
||
"delOrphans": "حذف کلاینتهای بدون اینباند",
|
||
"delOrphansConfirmTitle": "حذف کلاینتهای بدون اینباند؟",
|
||
"delOrphansConfirmContent": "هر کلاینتی که به هیچ اینباندی متصل نیست، همراه با رکورد ترافیکاش حذف میشود. این عمل غیرقابل بازگشت است.",
|
||
"auth": "احراز",
|
||
"hysteriaAuth": "احراز Hysteria",
|
||
"uuid": "UUID",
|
||
"flow": "Flow",
|
||
"vmessSecurity": "امنیت VMess",
|
||
"wireguardPrivateKey": "کلید خصوصی وایرگارد",
|
||
"wireguardPublicKey": "کلید عمومی وایرگارد",
|
||
"wireguardPreSharedKey": "کلید پیشاشتراکی وایرگارد",
|
||
"wireguardAllowedIPs": "آیپیهای مجاز وایرگارد",
|
||
"wireguardAllowedIPsHint": "برای تخصیص خودکار خالی بگذارید؛ ورودیها را با کاما جدا کنید",
|
||
"reverseTag": "تگ معکوس",
|
||
"reverseTagPlaceholder": "Reverse tag اختیاری",
|
||
"telegramId": "شناسه کاربر تلگرام",
|
||
"telegramIdPlaceholder": "شناسه عددی کاربر تلگرام (۰ = هیچ)",
|
||
"created": "ساختهشده",
|
||
"updated": "بهروزشده",
|
||
"ipLimit": "محدودیت IP",
|
||
"toasts": {
|
||
"deleted": "کلاینت حذف شد",
|
||
"trafficReset": "ترافیک بازنشانی شد",
|
||
"allTrafficsReset": "ترافیک همه کلاینتها بازنشانی شد",
|
||
"bulkDeleted": "{count} کلاینت حذف شد",
|
||
"bulkDeletedMixed": "{ok} حذف، {failed} ناموفق",
|
||
"bulkEnabled": "{count} کلاینت فعال شد",
|
||
"bulkEnabledMixed": "{ok} فعال، {failed} ناموفق",
|
||
"bulkDisabled": "{count} کلاینت غیرفعال شد",
|
||
"bulkDisabledMixed": "{ok} غیرفعال، {failed} ناموفق",
|
||
"bulkCreated": "{count} کلاینت ساخته شد",
|
||
"bulkCreatedMixed": "{ok} ساخته شد، {failed} ناموفق",
|
||
"bulkAdjusted": "{count} کلاینت تنظیم شد",
|
||
"bulkAdjustedMixed": "{ok} تنظیم، {skipped} رد شد",
|
||
"delDepleted": "{count} کلاینت اتمامیافته حذف شد",
|
||
"delOrphans": "{count} کلاینت بدون اینباند حذف شد",
|
||
"imported": "{count} کلاینت وارد شد",
|
||
"importedMixed": "{ok} وارد شد، {failed} رد شد"
|
||
}
|
||
},
|
||
"groups": {
|
||
"title": "گروهها",
|
||
"name": "نام",
|
||
"clientCount": "کاربران",
|
||
"totalGroups": "تعداد گروهها",
|
||
"totalGroupedClients": "کاربران دارای گروه",
|
||
"trafficUsed": "ترافیک مصرفشده",
|
||
"upload": "آپلود",
|
||
"download": "دانلود",
|
||
"totalTraffic": "مجموع ترافیک",
|
||
"totalUpDown": "مجموع آپلود / دانلود",
|
||
"addGroup": "افزودن گروه",
|
||
"createSuccess": "گروه «{name}» ایجاد شد.",
|
||
"rename": "تغییر نام",
|
||
"renameTitle": "تغییر نام {name}",
|
||
"renameCollision": "گروهی به نام «{name}» از قبل وجود دارد.",
|
||
"renameSuccess": "گروه روی {count} کاربر تغییر نام داده شد.",
|
||
"deleteConfirmTitle": "حذف گروه {name}؟",
|
||
"deleteConfirmContent": "این عمل گروه را حذف میکند و برچسب آن را از {count} کاربر پاک میکند. خود کاربران حذف نمیشوند.",
|
||
"deleteSuccess": "گروه از {count} کاربر پاک شد.",
|
||
"resetTraffic": "بازنشانی ترافیک",
|
||
"resetConfirmTitle": "بازنشانی ترافیک گروه {name}؟",
|
||
"resetConfirmContent": "این فقط شمارندهی ترافیک گروه را صفر میکند؛ شمارندهی تکتک کاربران دستنخورده میماند.",
|
||
"resetSuccess": "ترافیک گروه {name} صفر شد.",
|
||
"adjustSuccess": "{count} کاربر در {name} تنظیم شد.",
|
||
"emptyForAction": "این گروه هنوز کاربری ندارد.",
|
||
"deleteGroupOnly": "حذف گروه (نگه داشتن کاربران)",
|
||
"deleteClients": "حذف کاربران گروه",
|
||
"deleteClientsConfirmTitle": "حذف همه کاربران در {name}؟",
|
||
"deleteClientsConfirmContent": "این عمل {count} کاربر را به همراه رکورد ترافیکشان برای همیشه حذف میکند. برچسب گروه نیز پاک میشود. این عمل قابل بازگشت نیست.",
|
||
"deleteClientsSuccess": "{count} کاربر حذف شد.",
|
||
"deleteClientsMixed": "{ok} حذف شد، {failed} نادیده گرفته شد",
|
||
"addToGroup": "افزودن کاربران…",
|
||
"addToGroupTitle": "افزودن کاربران به گروه «{name}»",
|
||
"addToGroupDesc": "کاربرانی را برای افزودن به این گروه انتخاب کنید. الصاقهای ورودی فعلی حفظ میشود؛ تنها برچسب گروه تغییر میکند. کاربرانی که از قبل در این گروه هستند نشان داده نمیشوند.",
|
||
"addToGroupEmpty": "کاربر دیگری برای افزودن در دسترس نیست.",
|
||
"addToGroupResult": "{count} کاربر به {name} اضافه شد.",
|
||
"removeFromGroup": "حذف کاربران…",
|
||
"removeFromGroupTitle": "حذف کاربران از گروه «{name}»",
|
||
"removeFromGroupDesc": "اعضایی را برای حذف از این گروه انتخاب کنید. خود کاربران حفظ میشوند (برای حذف کامل از «حذف کاربران گروه» استفاده کنید).",
|
||
"removeFromGroupResult": "{count} کاربر از {name} حذف شد."
|
||
},
|
||
"nodes": {
|
||
"title": "نودها",
|
||
"addNode": "افزودن نود",
|
||
"editNode": "ویرایش نود",
|
||
"totalNodes": "کل نودها",
|
||
"onlineNodes": "آنلاین",
|
||
"offlineNodes": "آفلاین",
|
||
"avgLatency": "میانگین تاخیر",
|
||
"name": "نام",
|
||
"namePlaceholder": "مثلاً de-frankfurt-1",
|
||
"addressPlaceholder": "panel.example.com یا 1.2.3.4",
|
||
"remark": "توضیحات",
|
||
"scheme": "پروتکل",
|
||
"address": "آدرس",
|
||
"port": "پورت",
|
||
"basePath": "مسیر پایه",
|
||
"apiToken": "توکن API",
|
||
"apiTokenPlaceholder": "توکن از صفحه تنظیمات پنل ریموت",
|
||
"apiTokenHint": "پنل ریموت توکن API خودش را در بخش احرازهویت → توکن API نمایش میدهد.",
|
||
"regenerate": "تولید مجدد توکن",
|
||
"regenerateConfirm": "تولید مجدد، توکن فعلی را باطل میکند. هر پنل مرکزیای که از این توکن استفاده میکند تا زمان بهروزرسانی، دسترسیاش قطع میشود. ادامه میدهید؟",
|
||
"allowPrivateAddress": "اجازه آدرس خصوصی",
|
||
"allowPrivateAddressHint": "فقط برای نودهای روی شبکه خصوصی یا VPN فعال شود.",
|
||
"outboundTag": "خروجی اتصال",
|
||
"outboundTagHint": "ترافیک API پنل این نود را از طریق خروجی Xray انتخابشده مسیریابی کنید. یک inbound پل loopback بهصورت خودکار به پیکربندی در حال اجرا اضافه شده و بهصورت زنده اعمال میشود. برای اتصال مستقیم خالی بگذارید.",
|
||
"outboundTagPlaceholder": "اتصال مستقیم",
|
||
"inboundSyncMode": "وارد کردن اینباندها",
|
||
"inboundSyncModeHint": "اینباندهای قابل وارد کردن از این نود را انتخاب کنید. نودهای موجود بهطور پیشفرض همه را وارد میکنند.",
|
||
"allInbounds": "همه اینباندها",
|
||
"selectedInbounds": "اینباندهای انتخابشده",
|
||
"inboundTags": "اینباندها",
|
||
"inboundTagsHint": "انتخاب بر اساس تگ اینباند تطبیق داده میشود. انتخاب خالی چیزی وارد نمیکند.",
|
||
"inboundTagsPlaceholder": "اینباندها را بارگیری و انتخاب کنید",
|
||
"loadInbounds": "بارگیری اینباندها از نود",
|
||
"inboundsLoaded": "{{count}} اینباند بارگیری شد",
|
||
"inboundsLoadFailed": "بارگیری اینباندها ناموفق بود",
|
||
"enable": "فعال",
|
||
"status": "وضعیت",
|
||
"cpu": "CPU",
|
||
"mem": "حافظه",
|
||
"netUp": "آپلود شبکه (KB/s)",
|
||
"netDown": "دانلود شبکه (KB/s)",
|
||
"uptime": "مدت فعالیت",
|
||
"latency": "تاخیر",
|
||
"lastHeartbeat": "آخرین ضربان",
|
||
"xrayVersion": "نسخه Xray",
|
||
"panelVersion": "نسخه پنل",
|
||
"actions": "عملیات",
|
||
"probe": "بررسی فوری",
|
||
"updatePanel": "بهروزرسانی پنل",
|
||
"updateSelected": "بهروزرسانی انتخابشدهها ({count})",
|
||
"updateAvailable": "بهروزرسانی موجود",
|
||
"upToDate": "بهروز",
|
||
"updateConfirmTitle": "{count} نود به آخرین نسخه بهروزرسانی شوند؟",
|
||
"updateConfirmContent": "هر نود انتخابشده آخرین نسخه را دانلود و روی آن ریاستارت میشود. فقط نودهای فعال و آنلاین بهروزرسانی میشوند.",
|
||
"updateDevChannel": "بهروزرسانی به کانال دِو (آخرین کامیت)",
|
||
"testConnection": "تست اتصال",
|
||
"connectionOk": "اتصال موفق ({ms} میلیثانیه)",
|
||
"connectionFailed": "اتصال ناموفق",
|
||
"never": "هرگز",
|
||
"justNow": "هماکنون",
|
||
"subNode": "نود فرعی",
|
||
"subNodeTip": "فقطخواندنی: یک نود پاییندستی که از طریق {parent} در دسترس است. آن را از پنل خودِ {parent} مدیریت کنید.",
|
||
"deleteConfirmTitle": "نود «{name}» حذف شود؟",
|
||
"deleteConfirmContent": "نظارت روی این نود متوقف میشود. خود پنل ریموت تغییری نمیکند.",
|
||
"statusValues": {
|
||
"online": "آنلاین",
|
||
"offline": "آفلاین",
|
||
"unknown": "نامشخص",
|
||
"xrayError": "خطای Xray",
|
||
"xrayStopped": "متوقف"
|
||
},
|
||
"toasts": {
|
||
"list": "بارگذاری نودها ناموفق",
|
||
"obtain": "بارگذاری نود ناموفق",
|
||
"add": "افزودن نود",
|
||
"update": "بهروزرسانی نود",
|
||
"delete": "حذف نود",
|
||
"deleted": "نود حذف شد",
|
||
"test": "تست اتصال",
|
||
"fillRequired": "نام، آدرس، پورت و توکن API الزامی است",
|
||
"probeFailed": "بررسی ناموفق",
|
||
"updateStarted": "بهروزرسانی پنل آغاز شد",
|
||
"updateResult": "بهروزرسانی روی {ok} نود آغاز شد، {failed} ناموفق",
|
||
"updateNoneEligible": "حداقل یک نود آنلاین و فعال انتخاب کنید",
|
||
"saveMtls": "ذخیره mTLS نود"
|
||
},
|
||
"tlsVerifyMode": "اعتبارسنجی TLS",
|
||
"tlsVerifyModeHint": "اینکه پنل گواهی HTTPS نود را چطور بررسی کند. Pin یا Skip برای گواهیهای self-signed است (فقط نودهای https).",
|
||
"tlsVerify": "اعتبارسنجی (CA پیشفرض)",
|
||
"tlsPin": "Pin گواهی (SHA-256)",
|
||
"tlsSkip": "رد کردن اعتبارسنجی",
|
||
"tlsMtls": "TLS متقابل (گواهی کلاینت)",
|
||
"mtlsFormHint": "این نود با یک گواهی کلاینت، پنل را احراز هویت میکند. CA این پنل را از بخش mTLS نود به نود کپی کنید، CA مورد اعتماد آن را تنظیم کنید و سپس آن را راهاندازی مجدد کنید.",
|
||
"mtls": {
|
||
"title": "mTLS نود",
|
||
"intro": "TLS متقابل علاوه بر توکن API، یک عامل گواهی کلاینت برای ارتباط بین نودها اضافه میکند. اختیاری است: برای استفاده فقط از احراز هویت با توکن، آن را خالی بگذارید.",
|
||
"copyCa": "کپی CA این پنل",
|
||
"copyCaHint": "این CA را به نودهایی که این پنل مدیریت میکند بدهید، سپس حالت اعتبارسنجی TLS آنها را روی TLS متقابل تنظیم کنید.",
|
||
"caCopied": "گواهی CA در کلیپبورد کپی شد",
|
||
"caFailed": "دریافت گواهی CA ناموفق بود",
|
||
"trustLabel": "CA مورد اعتماد (پنل والد)",
|
||
"trustHint": "وقتی این پنل خود یک نود است، CA پنل مدیریتکننده را اینجا بچسبانید تا گواهی کلاینت آن الزامی شود. برای اعمال، پنل را راهاندازی مجدد کنید.",
|
||
"trustPlaceholder": "-----BEGIN CERTIFICATE-----",
|
||
"save": "ذخیره CA مورد اعتماد",
|
||
"saved": "CA مورد اعتماد ذخیره شد — برای اعمال، پنل را راهاندازی مجدد کنید"
|
||
},
|
||
"tlsSkipWarning": "رد کردن اعتبارسنجی محافظت در برابر حملهٔ مرد میانی را از بین میبرد و توکن API ممکن است شنود شود. ترجیحاً بهجای آن گواهی را Pin کنید.",
|
||
"pinnedCert": "SHA-256 گواهیِ Pinشده",
|
||
"pinnedCertHint": "SHA-256 گواهیِ نود بهصورت base64 یا hex. برای خواندنِ همین حالا از نود، از دکمهٔ Fetch استفاده کنید.",
|
||
"pinnedCertPlaceholder": "SHA-256 بهصورت base64 یا hex",
|
||
"fetchPin": "دریافت",
|
||
"pinFetched": "گواهیِ فعلیِ نود دریافت شد",
|
||
"pinFetchFailed": "دریافت گواهی ممکن نشد"
|
||
},
|
||
"settings": {
|
||
"title": "تنظیمات پنل",
|
||
"save": "ذخیره",
|
||
"infoDesc": "برای اعمال تغییرات در این بخش باید پس از ذخیره کردن، پنل را ریستارت کنید",
|
||
"restartPanel": "راهاندازی مجدد پنل",
|
||
"restartPanelDesc": "آیا مطمئن به ریستارت پنل هستید؟ اگر پساز ریستارت نمیتوانید به پنل دسترسی پیدا کنید، لطفاً گزارشهای موجود در اسکریپت پنل را بررسی کنید",
|
||
"restartPanelSuccess": "پنل با موفقیت راهاندازی مجدد شد",
|
||
"actions": "عملیات ها",
|
||
"resetDefaultConfig": "برگشت به پیشفرض",
|
||
"panelSettings": "پیکربندی",
|
||
"securitySettings": "احرازهویت",
|
||
"securityWarnings": "هشدارهای امنیتی",
|
||
"panelExposed": "ممکن است پنل شما در معرض خطر باشد:",
|
||
"warnHttp": "پنل از طریق HTTP ساده ارائه میشود — برای محیط عملیاتی TLS فعال کنید.",
|
||
"warnDefaultPort": "پورت پیشفرض 2053 شناختهشده است — آن را به یک پورت تصادفی تغییر دهید.",
|
||
"warnDefaultBasePath": "مسیر پایه پیشفرض «/» شناختهشده است — آن را به یک مسیر تصادفی تغییر دهید.",
|
||
"warnDefaultSubPath": "مسیر ساب پیشفرض «/sub/» شناختهشده است — تغییرش دهید.",
|
||
"warnDefaultJsonPath": "مسیر JSON ساب پیشفرض «/json/» شناختهشده است — تغییرش دهید.",
|
||
"TGBotSettings": "ربات تلگرام",
|
||
"panelListeningIP": "آدرس آیپی",
|
||
"panelListeningIPDesc": "آدرس آیپی برای وب پنل. برای گوشدادن بهتمام آیپیها خالیبگذارید",
|
||
"panelListeningDomain": "نام دامنه",
|
||
"panelListeningDomainDesc": "آدرس دامنه برای وب پنل. برای گوش دادن بهتمام دامنهها و آیپیها خالیبگذارید",
|
||
"panelPort": "پورت",
|
||
"panelPortDesc": "شماره پورت برای وب پنل. باید پورت استفاده نشدهباشد",
|
||
"publicKeyPath": "مسیر کلید عمومی",
|
||
"publicKeyPathDesc": "مسیر فایل کلیدعمومی برای وب پنل. با '/' شروعمیشود",
|
||
"privateKeyPath": "مسیر کلید خصوصی",
|
||
"privateKeyPathDesc": "مسیر فایل کلیدخصوصی برای وب پنل. با '/' شروعمیشود",
|
||
"panelUrlPath": "مسیر URI",
|
||
"panelUrlPathDesc": "برای وب پنل. با '/' شروع و با '/' خاتمه مییابد URI مسیر",
|
||
"pageSize": "اندازه صفحه بندی جدول",
|
||
"pageSizeDesc": "(اندازه صفحه برای جدول ورودیها.(0 = غیرفعال",
|
||
"panelOutbound": "اوتباند ترافیک پنل",
|
||
"panelOutboundDesc": "درخواستهای خود پنل — بررسی نسخه و دانلود پنل/Xray، تلگرام، و بهروزرسانی معمولی فایلهای geo — را از این اوتباند Xray عبور میدهد تا فیلترینگ GitHub/تلگرام در سمت سرور دور زده شود. یک ورودی پل لوکال بهصورت خودکار به کانفیگ در حال اجرا اضافه و زنده اعمال میشود. روی Geodata Auto-Update نِیتیو Xray اثری ندارد؛ آن اوتباند دانلود مخصوص خودش را دارد. برای اتصال مستقیم خالی بگذارید.",
|
||
"panelOutboundPh": "اتصال مستقیم",
|
||
"remarkTemplate": "قالب ریمارک",
|
||
"remarkTemplateDesc": "اگر پر شود، جای مدلِ ریمارک را برای همهی لینکهای اشتراک میگیرد — فرمت دلخواهت را با توکنهای متغیر بنویس (از دکمه برای درج استفاده کن). خالی = استفاده از مدلِ بالا.",
|
||
"datepicker": "نوع تقویم",
|
||
"datepickerPlaceholder": "انتخاب تاریخ",
|
||
"datepickerDescription": "وظایف برنامه ریزی شده بر اساس این تقویم اجرا میشود",
|
||
"oldUsername": "نامکاربری فعلی",
|
||
"currentPassword": "رمزعبور فعلی",
|
||
"newUsername": "نامکاربری جدید",
|
||
"newPassword": "رمزعبور جدید",
|
||
"telegramBotEnable": "فعالسازی ربات تلگرام",
|
||
"telegramBotEnableDesc": "ربات تلگرام را فعال میکند",
|
||
"telegramToken": "توکن تلگرام",
|
||
"telegramTokenDesc": "دریافت کنید {'@'}botfather توکن را میتوانید از",
|
||
"telegramProxy": "پراکسی SOCKS",
|
||
"telegramProxyDesc": "را برای اتصال به تلگرام فعال می کند SOCKS5 پراکسی",
|
||
"telegramAPIServer": "سرور API تلگرام",
|
||
"telegramAPIServerDesc": "API سرور تلگرام برای اتصال را تغییر میدهد. برای استفاده از سرور پیش فرض خالی بگذارید",
|
||
"telegramChatId": "آیدی چت مدیر",
|
||
"telegramChatIdDesc": "دریافت کنید ('/id'یا (دستور ({'@'}userinfobot) آیدی(های) چت تلگرام مدیر، از",
|
||
"telegramNotifyTime": "زمان نوتیفیکیشن",
|
||
"telegramNotifyTimeDesc": "هر چند وقت یکبار ربات تلگرام گزارش دورهای بفرستد. یک بازهٔ آماده انتخاب کنید یا گزینهٔ سفارشی را بزنید تا عبارت crontab وارد کنید.",
|
||
"notifyTime": {
|
||
"every": "@every — تکرار در یک بازه",
|
||
"hourly": "@hourly — هر ساعت",
|
||
"daily": "@daily — هر روز ساعت ۰۰:۰۰",
|
||
"weekly": "@weekly — هر هفته",
|
||
"monthly": "@monthly — هر ماه",
|
||
"custom": "سفارشی (crontab)",
|
||
"seconds": "ثانیه",
|
||
"minutes": "دقیقه",
|
||
"hours": "ساعت",
|
||
"interval": "بازه زمانی",
|
||
"unit": "واحد"
|
||
},
|
||
"tgNotifyBackup": "پشتیبانگیری از دیتابیس",
|
||
"tgNotifyBackupDesc": "فایل پشتیباندیتابیس را بههمراه گزارش ارسال میکند",
|
||
"tgNotifyLogin": "اعلان ورود",
|
||
"tgNotifyLoginDesc": "نامکاربری، آدرس آیپی، و زمان ورود، فردی که سعی میکند وارد پنل شود را نمایش میدهد",
|
||
"sessionMaxAge": "بیشینه زمان جلسه وب",
|
||
"sessionMaxAgeDesc": "(بیشینه زمانی که میتوانید لاگین بمانید. (واحد: دقیقه",
|
||
"expireTimeDiff": "آستانه زمان باقی مانده",
|
||
"expireTimeDiffDesc": "(فاصله زمانی هشدار تا رسیدن به زمان انقضا. (واحد: روز",
|
||
"trafficDiff": "آستانه ترافیک باقی مانده",
|
||
"trafficDiffDesc": "(فاصله زمانی هشدار تا رسیدن به اتمام ترافیک. (واحد: گیگابایت",
|
||
"tgNotifyCpu": "آستانه هشدار بار پردازنده",
|
||
"tgNotifyCpuDesc": "(اگر بار روی پردازنده ازاین آستانه فراتر رفت، برای شما پیام ارسال میشود. (واحد: درصد",
|
||
"timeZone": "منطقه زمانی",
|
||
"timeZoneDesc": "وظایف برنامه ریزی شده بر اساس این منطقهزمانی اجرا میشود",
|
||
"subSettings": "سابسکریپشن",
|
||
"subEnable": "فعالسازی سرویس سابسکریپشن",
|
||
"subEnableDesc": "سرویس سابسکریپشن را فعالمیکند",
|
||
"subJsonEnable": "فعال/غیرفعالسازی مستقل نقطه دسترسی سابسکریپشن JSON.",
|
||
"subJsonEnableTitle": "اشتراک JSON",
|
||
"subClashEnableTitle": "اشتراک Clash / Mihomo",
|
||
"subTitle": "عنوان اشتراک",
|
||
"subTitleDesc": "عنوان نمایش داده شده در کلاینت VPN",
|
||
"subSupportUrl": "آدرس پشتیبانی",
|
||
"subSupportUrlDesc": "لینک پشتیبانی فنی که در کلاینت VPN نمایش داده میشود",
|
||
"subProfileUrl": "آدرس پروفایل",
|
||
"subProfileUrlDesc": "لینک وبسایت شما که در کلاینت VPN نمایش داده میشود",
|
||
"subAnnounce": "اعلان",
|
||
"subAnnounceDesc": "متن اعلانی که در کلاینت VPN نمایش داده میشود",
|
||
"subThemeDir": "پوشه قالب صفحه اشتراک",
|
||
"subThemeDirDesc": "مسیر مطلق پوشهای که شامل یک قالب سفارشی (index.html/sub.html) برای صفحه اشتراک است (مثلاً /etc/3x-ui/sub_templates/my-theme/). برای استفاده از صفحه پیشفرض خالی بگذارید.",
|
||
"subThemeDirDocs": "راهنمای قالب ↗",
|
||
"subEnableRouting": "فعالسازی مسیریابی",
|
||
"subEnableRoutingDesc": "تنظیمات سراسری برای فعالسازی مسیریابی در کلاینت VPN. (فقط برای Happ)",
|
||
"subRoutingRules": "قوانین مسیریابی",
|
||
"subRoutingRulesDesc": "قوانین مسیریابی سراسری برای کلاینت VPN. (فقط برای Happ)",
|
||
"subHideSettings": "پنهان کردن تنظیمات سرور",
|
||
"subHideSettingsDesc": "پنهان کردن توانایی مشاهده و ویرایش پیکربندی سرور در کلاینت VPN. (فقط برای Happ)",
|
||
"subIncyEnableRouting": "فعالسازی مسیریابی",
|
||
"subIncyEnableRoutingDesc": "تزریق پروفایل مسیریابی به بدنه اشتراک برای کلاینت Incy. (فقط برای Incy)",
|
||
"subIncyRoutingRules": "قوانین مسیریابی",
|
||
"subIncyRoutingRulesDesc": "لینک مسیریابی Incy که به بدنه اشتراک افزوده میشود، مثلاً incy://routing/onadd/<base64>. (فقط برای Incy)",
|
||
"subClashEnableRouting": "فعالسازی مسیریابی",
|
||
"subClashEnableRoutingDesc": "قوانین مسیریابی سراسری Clash/Mihomo را در اشتراکهای YAML تولیدشده وارد کن.",
|
||
"subClashRoutingRules": "قوانین مسیریابی سراسری",
|
||
"subClashRoutingRulesDesc": "قوانین Clash/Mihomo که پیش از MATCH,PROXY به ابتدای هر اشتراک YAML افزوده میشوند.",
|
||
"subListen": "آدرس آیپی",
|
||
"subListenDesc": "آدرس آیپی برای سرویس سابسکریپشن. برای گوش دادن بهتمام آیپیها خالیبگذارید",
|
||
"subPort": "پورت",
|
||
"subPortDesc": "شماره پورت برای سرویس سابسکریپشن. باید پورت استفاده نشدهباشد",
|
||
"subCertPath": "مسیر کلید عمومی",
|
||
"subCertPathDesc": "مسیر فایل کلیدعمومی برای سرویس سابیکریپشن. با '/' شروعمیشود",
|
||
"subKeyPath": "مسیر کلید خصوصی",
|
||
"subKeyPathDesc": "مسیر فایل کلیدخصوصی برای سرویس سابسکریپشن. با '/' شروعمیشود",
|
||
"subPath": "مسیر URI",
|
||
"subPathDesc": "برای سرویس سابسکریپشن. با '/' شروع و با '/' خاتمه مییابد URI مسیر",
|
||
"subDomain": "نام دامنه",
|
||
"subDomainDesc": "آدرس دامنه برای سرویس سابسکریپشن. برای گوش دادن به تمام دامنهها و آیپیها خالیبگذارید",
|
||
"subUpdates": "فاصله بروزرسانی سابسکریپشن",
|
||
"subUpdatesDesc": "(فاصله مابین بروزرسانی در برنامههای کاربری. (واحد: ساعت",
|
||
"subEncrypt": "انکود",
|
||
"subEncryptDesc": "کدگذاری خواهدشد Base64 محتوای برگشتی سرویس سابسکریپشن برپایه",
|
||
"subURI": "پروکسی معکوس URI مسیر",
|
||
"subURIDesc": "سابسکریپشن را برای استفاده در پشت پراکسیها تغییر میدهد URI مسیر",
|
||
"externalTrafficInformEnable": "اطلاع رسانی خارجی مصرف ترافیک",
|
||
"externalTrafficInformEnableDesc": "به API خارجی در هر بهروزرسانی ترافیک اطلاع بده.",
|
||
"externalTrafficInformURI": "لینک اطلاع رسانی خارجی مصرف ترافیک",
|
||
"externalTrafficInformURIDesc": "ترافیک های مصرفی به این لینک هم ارسال می شود",
|
||
"restartXrayOnClientDisable": "ریاستارت Xray بعد از غیرفعالسازی خودکار",
|
||
"restartXrayOnClientDisableDesc": "وقتی کاربر بهصورت خودکار بهدلیل اتمام زمان یا ترافیک غیرفعال میشود، Xray ریاستارت شود.",
|
||
"fragment": "فرگمنت",
|
||
"fragmentDesc": "فعال کردن فرگمنت برای بستهی نخست تیالاس",
|
||
"fragmentSett": "تنظیمات فرگمنت",
|
||
"noisesDesc": "فعال کردن Noises.",
|
||
"noisesSett": "تنظیمات Noises",
|
||
"trustedProxyCidrs": "CIDRهای پراکسی مورد اعتماد",
|
||
"trustedProxyCidrsDesc": "IPها/CIDRها (با کاما) که مجازند هدرهای host، proto و client IP فوروارد را تنظیم کنند.",
|
||
"ldap": {
|
||
"enable": "فعالسازی همگامسازی LDAP",
|
||
"host": "میزبان LDAP",
|
||
"port": "پورت LDAP",
|
||
"useTls": "استفاده از TLS (LDAPS)",
|
||
"skipTlsVerify": "رد کردن تأیید گواهی TLS",
|
||
"skipTlsVerifyDesc": "ناامن — اعتبارسنجی گواهی سرور را غیرفعال میکند. فقط برای CAهای داخلی/غیرمعتبر استفاده کنید.",
|
||
"bindDn": "Bind DN",
|
||
"passwordConfigured": "تنظیمشده؛ برای حفظ رمز فعلی خالی بگذارید.",
|
||
"passwordUnconfigured": "تنظیم نشده.",
|
||
"passwordPlaceholder": "تنظیمشده – برای جایگزینی مقدار جدید وارد کنید",
|
||
"baseDn": "Base DN",
|
||
"userFilter": "فیلتر کاربر",
|
||
"userAttr": "صفت کاربر (username/email)",
|
||
"vlessField": "صفت پرچم VLESS",
|
||
"flagField": "صفت پرچم عمومی (اختیاری)",
|
||
"flagFieldDesc": "اگر تعیین شود، پرچم VLESS را override میکند — مثل shadowInactive.",
|
||
"truthyValues": "مقادیر صحیح",
|
||
"truthyValuesDesc": "با کاما جدا شده؛ پیشفرض: true,1,yes,on",
|
||
"invertFlag": "وارونگی پرچم",
|
||
"invertFlagDesc": "وقتی صفت به معنی «غیرفعال» است فعال کنید (مثل shadowInactive).",
|
||
"syncSchedule": "زمانبندی همگامسازی",
|
||
"syncScheduleDesc": "رشته شبیه cron، مثل @every 1m",
|
||
"inboundTags": "تگهای ورودی",
|
||
"inboundTagsDesc": "ورودیهایی که همگامسازی LDAP اجازه دارد روی آنها کاربر بسازد یا حذف کند.",
|
||
"noInbounds": "هیچ ورودی یافت نشد. ابتدا از بخش ورودیها یکی بسازید.",
|
||
"autoCreate": "ساخت خودکار کاربران",
|
||
"autoDelete": "حذف خودکار کاربران",
|
||
"defaultTotalGb": "حجم پیشفرض (GB)",
|
||
"defaultExpiryDays": "انقضای پیشفرض (روز)",
|
||
"defaultIpLimit": "محدودیت IP پیشفرض"
|
||
},
|
||
"subFormats": {
|
||
"finalMask": "Final Mask",
|
||
"finalMaskDesc": "ماسکهای finalmask ایکسری (TCP/UDP) و تنظیمات QUIC که داخل همهی stream های اشتراک JSON تزریق میشوند. به نسخهی جدید هستهی xray در کلاینت نیاز دارد.",
|
||
"packets": "بستهها",
|
||
"length": "طول",
|
||
"interval": "بازه",
|
||
"maxSplit": "حداکثر تقسیم",
|
||
"noises": "نویزها",
|
||
"noiseItem": "نویز №{n}",
|
||
"type": "نوع",
|
||
"packet": "بسته",
|
||
"delayMs": "تأخیر (ms)",
|
||
"applyTo": "اعمال بر",
|
||
"addNoise": "+ نویز",
|
||
"concurrency": "همزمانی",
|
||
"xudpConcurrency": "همزمانی xudp",
|
||
"xudpUdp443": "xudp UDP 443"
|
||
},
|
||
"mux": "Mux",
|
||
"muxDesc": "چندین جریان داده مستقل را در یک جریان داده ثابت منتقل می کند",
|
||
"muxSett": "تنظیمات ماکس",
|
||
"direct": "اتصال مستقیم",
|
||
"directDesc": "به طور مستقیم با دامنه ها یا محدوده آیپی یک کشور خاص ارتباط برقرار می کند",
|
||
"notifications": "اعلانها",
|
||
"certs": "گواهیها",
|
||
"externalTraffic": "ترافیک خارجی",
|
||
"dateAndTime": "تاریخ و زمان",
|
||
"proxyAndServer": "پراکسی و سرور",
|
||
"intervals": "فواصل",
|
||
"information": "اطلاعات",
|
||
"profile": "پروفایل",
|
||
"language": "زبان",
|
||
"telegramBotLanguage": "زبان ربات تلگرام",
|
||
"security": {
|
||
"admin": "اعتبارنامههای ادمین",
|
||
"twoFactor": "احراز هویت دو مرحلهای",
|
||
"twoFactorEnable": "فعالسازی 2FA",
|
||
"twoFactorEnableDesc": "یک لایه اضافی امنیتی برای احراز هویت فراهم میکند.",
|
||
"twoFactorModalSetTitle": "فعالسازی احراز هویت دو مرحلهای",
|
||
"twoFactorModalDeleteTitle": "غیرفعالسازی احراز هویت دو مرحلهای",
|
||
"twoFactorModalSteps": "برای راهاندازی احراز هویت دو مرحلهای، مراحل زیر را انجام دهید:",
|
||
"twoFactorModalFirstStep": "1. این کد QR را در برنامه احراز هویت اسکن کنید یا توکن کنار کد QR را کپی کرده و در برنامه بچسبانید",
|
||
"twoFactorModalSecondStep": "2. کد را از برنامه وارد کنید",
|
||
"twoFactorModalRemoveStep": "برای حذف احراز هویت دو مرحلهای، کد را از برنامه وارد کنید.",
|
||
"twoFactorModalChangeCredentialsTitle": "تغییر اعتبارنامهها",
|
||
"twoFactorModalChangeCredentialsStep": "برای تغییر اعتبارنامههای مدیر، کد را از برنامه وارد کنید.",
|
||
"twoFactorModalSetSuccess": "احراز هویت دو مرحلهای با موفقیت برقرار شد",
|
||
"twoFactorModalDeleteSuccess": "احراز هویت دو مرحلهای با موفقیت حذف شد",
|
||
"twoFactorModalError": "کد نادرست",
|
||
"show": "نمایش",
|
||
"hide": "پنهان",
|
||
"apiTokenNew": "توکن جدید",
|
||
"apiTokenName": "نام",
|
||
"apiTokenNamePlaceholder": "مثلاً central-panel-a",
|
||
"apiTokenNameRequired": "نام الزامی است",
|
||
"apiTokenEmpty": "هنوز توکنی وجود ندارد — برای احراز هویت رباتها یا پنلهای راه دور یکی بسازید.",
|
||
"apiTokenDeleteWarning": "هر کلاینتی که از این توکن استفاده میکند بلافاصله احراز هویتش قطع میشود.",
|
||
"apiTokenCreatedTitle": "توکن ساخته شد",
|
||
"apiTokenCreatedNotice": "اکنون این توکن را کپی کنید. بهدلیل امنیتی بهصورت قابلخواندن ذخیره نمیشود و دوباره نمایش داده نخواهد شد."
|
||
},
|
||
"toasts": {
|
||
"modifySettings": "پارامترها تغییر کردهاند.",
|
||
"getSettings": "خطا در دریافت پارامترها",
|
||
"modifyUserError": "خطا در تغییر اعتبارنامههای مدیر سیستم.",
|
||
"modifyUser": "شما با موفقیت اعتبارنامههای مدیر سیستم را تغییر دادید.",
|
||
"originalUserPassIncorrect": "نامکاربری یا رمزعبور فعلی اشتباهاست",
|
||
"userPassMustBeNotEmpty": "نامکاربری یا رمزعبور جدید خالیاست",
|
||
"getOutboundTrafficError": "خطا در دریافت ترافیک خروجی",
|
||
"resetOutboundTrafficError": "خطا در بازنشانی ترافیک خروجی"
|
||
},
|
||
"smtpSettings": "تنظیمات SMTP",
|
||
"smtpEnable": "فعالسازی اعلانهای ایمیلی",
|
||
"smtpEnableDesc": "فعالسازی اعلانهای ایمیلی از طریق SMTP",
|
||
"smtpHost": "میزبان SMTP",
|
||
"smtpHostDesc": "نام میزبان سرور SMTP (مثلاً smtp.gmail.com)",
|
||
"smtpPort": "پورت SMTP",
|
||
"smtpPortDesc": "پورت سرور SMTP (پیشفرض: ۵۸۷)",
|
||
"smtpUsername": "نامکاربری SMTP",
|
||
"smtpUsernameDesc": "نامکاربری احراز هویت SMTP",
|
||
"smtpPassword": "رمز عبور SMTP",
|
||
"smtpPasswordDesc": "رمز عبور احراز هویت SMTP",
|
||
"smtpTo": "گیرندگان",
|
||
"smtpToDesc": "آدرسهای ایمیل گیرندگان، جداشده با کاما",
|
||
"emailSettings": "ایمیل",
|
||
"emailNotifications": "اعلانها",
|
||
"smtpEventBusNotify": "اعلانهای رویداد ایمیلی",
|
||
"smtpEventBusNotifyDesc": "انتخاب کنید کدام رویدادها اعلان ایمیلی را فعال میکنند",
|
||
"tgEventBusNotify": "اعلانهای رویداد تلگرام",
|
||
"tgEventBusNotifyDesc": "انتخاب کنید کدام رویدادها اعلان تلگرام را فعال میکنند",
|
||
"testSmtp": "ارسال ایمیل آزمایشی",
|
||
"testTgBot": "ارسال پیام آزمایشی",
|
||
"eventGroupOutbound": "خروجی",
|
||
"eventGroupXray": "هسته Xray",
|
||
"eventGroupSystem": "سیستم",
|
||
"eventGroupSecurity": "امنیت",
|
||
"eventGroupNode": "نودها",
|
||
"eventOutboundDown": "قطع",
|
||
"eventOutboundUp": "وصل",
|
||
"eventXrayCrash": "کرش",
|
||
"eventNodeDown": "قطع",
|
||
"eventNodeUp": "وصل",
|
||
"eventCPUHigh": "بالا بودن CPU (٪)",
|
||
"requestFailed": "درخواست ناموفق بود",
|
||
"smtpEncryption": "رمزنگاری",
|
||
"smtpEncryptionDesc": "روش رمزنگاری اتصال SMTP",
|
||
"smtpEncryptionNone": "هیچکدام (متن ساده)",
|
||
"smtpEncryptionStartTLS": "STARTTLS",
|
||
"smtpEncryptionTLS": "TLS (ضمنی)",
|
||
"smtpStageConnect": "اتصال",
|
||
"smtpStageAuth": "احراز هویت",
|
||
"smtpStageSend": "ارسال",
|
||
"smtpTestSuccess": "ایمیل آزمایشی با موفقیت ارسال شد",
|
||
"smtpHostNotConfigured": "میزبان SMTP پیکربندی نشده است",
|
||
"smtpNoRecipients": "هیچ گیرندهای پیکربندی نشده است",
|
||
"eventLoginAttempt": "تلاش برای ورود",
|
||
"telegramTokenConfigured": "پیکربندی شده؛ برای حفظ توکن فعلی خالی بگذارید.",
|
||
"telegramTokenPlaceholder": "پیکربندی شده - برای جایگزینی، توکن جدید وارد کنید",
|
||
"smtpPasswordConfigured": "پیکربندی شده؛ برای حفظ رمز عبور فعلی خالی بگذارید.",
|
||
"smtpPasswordPlaceholder": "پیکربندی شده - برای جایگزینی، رمز عبور جدید وارد کنید",
|
||
"smtpNotInitialized": "SMTP مقداردهی اولیه نشده است",
|
||
"tgBotNotEnabled": "ربات تلگرام فعال نیست",
|
||
"tgTestFailed": "آزمایش تلگرام ناموفق بود",
|
||
"tgTestSuccess": "پیام آزمایشی به تلگرام ارسال شد",
|
||
"tgBotNotRunning": "ربات تلگرام در حال اجرا نیست",
|
||
"smtpErrorAuth": "احراز هویت ناموفق بود — نامکاربری و رمز عبور را بررسی کنید",
|
||
"smtpErrorStarttls": "سرور به STARTTLS نیاز دارد — نوع رمزنگاری را تغییر دهید",
|
||
"smtpErrorTls": "سرور به TLS نیاز دارد — نوع رمزنگاری را تغییر دهید",
|
||
"smtpErrorRefused": "اتصال رد شد — میزبان و پورت را بررسی کنید",
|
||
"smtpErrorTimeout": "مهلت اتصال به پایان رسید — میزبان در دسترس نیست",
|
||
"smtpErrorRelay": "سرور ارسال از این آدرس را رد میکند",
|
||
"smtpErrorEof": "اتصال توسط سرور بسته شد",
|
||
"smtpErrorUnknown": "خطای SMTP: {{ .Error }}",
|
||
"eventMemoryHigh": "مصرف حافظه بالا (%)",
|
||
"validation": {
|
||
"pathLeadingSlash": "مسیر باید با / شروع شود"
|
||
},
|
||
"secretClear": "پاک کردن",
|
||
"secretClearUndo": "لغو پاک کردن"
|
||
},
|
||
"xray": {
|
||
"title": "پیکربندی ایکسری",
|
||
"save": "ذخیره",
|
||
"restart": "راهاندازی مجدد Xray",
|
||
"restartSuccess": "Xray با موفقیت راهاندازی مجدد شد",
|
||
"restartOutputTitle": "خروجی راهاندازی مجدد Xray",
|
||
"restartConfirmTitle": "راهاندازی مجدد xray؟",
|
||
"restartConfirmContent": "سرویس xray با پیکربندی ذخیرهشده دوباره بارگذاری میشود.",
|
||
"stopSuccess": "Xray با موفقیت متوقف شد",
|
||
"restartError": "خطا در راهاندازی مجدد Xray.",
|
||
"stopError": "خطا در توقف Xray.",
|
||
"basicTemplate": "پایه",
|
||
"advancedTemplate": "پیشرفته",
|
||
"generalConfigs": "استراتژی کلی",
|
||
"generalConfigsDesc": "این گزینهها استراتژی کلی ترافیک را تعیین میکنند",
|
||
"logConfigs": "لاگ",
|
||
"logConfigsDesc": "گزارشها ممکن است بر کارایی سرور شما تأثیر بگذارد. توصیه می شود فقط در صورت نیاز آن را عاقلانه فعال کنید",
|
||
"blockConfigsDesc": "این گزینهها ترافیک را بر اساس پروتکلهای درخواستی خاص، و وب سایتها مسدود میکند",
|
||
"basicRouting": "مسیریابی پایه",
|
||
"blockConnectionsConfigsDesc": "این گزینهها ترافیک را بر اساس کشور درخواستشده خاص مسدود میکنند.",
|
||
"directConnectionsConfigsDesc": "یک اتصال مستقیم تضمین میکند که ترافیک خاص از طریق سرور دیگری مسیریابی نشود.",
|
||
"blockips": "مسدود کردن آیپیها",
|
||
"blockdomains": "مسدود کردن دامنهها",
|
||
"directips": "آیپیهای مستقیم",
|
||
"directdomains": "دامنههای مستقیم",
|
||
"ipv4Routing": "IPv4 مسیریابی",
|
||
"ipv4RoutingDesc": "این گزینهها ترافیک را از طریق آیپی نسخه4 سرور، به مقصد هدایت میکند",
|
||
"warpRouting": "WARP مسیریابی",
|
||
"warpRoutingDesc": "این گزینهها ترافیک را از طریق وارپ کلادفلر به مقصد هدایت میکند",
|
||
"nordRouting": "مسیریابی NordVPN",
|
||
"nordRoutingDesc": "این گزینهها ترافیک را بر اساس مقصد خاص از طریق NordVPN مسیریابی میکنند.",
|
||
"Template": "پیکربندی پیشرفته الگو ایکسری",
|
||
"TemplateDesc": "فایل پیکربندی نهایی ایکسری بر اساس این الگو ایجاد میشود",
|
||
"FreedomStrategy": "Freedom استراتژی پروتکل",
|
||
"FreedomStrategyDesc": "تعیین میکند Freedom استراتژی خروجی شبکه را برای پروتکل",
|
||
"FreedomHappyEyeballs": "Freedom Happy Eyeballs (IPv4/IPv6)",
|
||
"FreedomHappyEyeballsDesc": "اتصال دوپشتهای برای خروجی مستقیم (freedom) — برای سرورهای خروج دارای هر دو IPv4 و IPv6 مفید است.",
|
||
"FreedomHappyEyeballsTryDelayDesc": "تعداد میلیثانیه پیش از امتحان خانوادهٔ آدرس دیگر. مقدار 150 تا 250 میلیثانیه نقطهٔ شروع خوبی است.",
|
||
"RoutingStrategy": "استراتژی کلی مسیریابی",
|
||
"RoutingStrategyDesc": "استراتژی کلی مسیریابی برای حل تمام درخواستها را تعیین میکند",
|
||
"outboundTestUrl": "آدرس تست خروجی",
|
||
"outboundTestUrlDesc": "آدرسی که برای تست اتصال خروجی استفاده میشود.",
|
||
"Torrent": "مسدودسازی پروتکل بیتتورنت",
|
||
"Inbounds": "ورودیها",
|
||
"InboundsDesc": "پذیرش کلاینت خاص",
|
||
"Outbounds": "خروجیها",
|
||
"OutboundSubscriptions": "سابسکریپشنهای خروجی",
|
||
"OutboundSubscriptionsDesc": "خروجیها را از آدرسهای سابسکریپشن راهدور (vmess/vless/trojan/ss/...) وارد کنید. تگها ثابت میمانند تا در بالانسرها و قوانین مسیریابی قابل استفاده باشند. بهروزرسانیها بهصورت خودکار انجام میشوند.",
|
||
"Balancers": "بالانسرها",
|
||
"balancerTagRequired": "تگ الزامی است",
|
||
"balancerSelectorRequired": "حداقل یک خروجی انتخاب کنید",
|
||
"balancerLive": "هدف زنده",
|
||
"balancerOverride": "اجبار مسیر",
|
||
"balancerOverridePh": "خودکار (استراتژی)",
|
||
"balancerLiveRefresh": "بهروزرسانی وضعیت زنده بالانسر",
|
||
"balancerNotRunning": "این بالانسر در Xray در حال اجرا فعال نیست — ابتدا تغییرات را ذخیره کنید یا Xray را روشن کنید",
|
||
"routeTester": "آزمایش مسیر",
|
||
"routeTesterDesc": "از Xray در حال اجرا بپرسید یک اتصال از کدام خروجی عبور میکند. هیچ ترافیکی ارسال نمیشود — پاسخ مستقیماً از موتور مسیریابی زنده میآید.",
|
||
"routeTesterDest": "دامنه یا IP",
|
||
"routeTesterPort": "پورت",
|
||
"routeTesterInbound": "ورودی",
|
||
"routeTesterProtocol": "پروتکل تشخیصی",
|
||
"routeTesterTest": "آزمایش مسیر",
|
||
"routeTesterMatchedOutbound": "خروجی منطبق",
|
||
"routeTesterViaBalancer": "از طریق بالانسر",
|
||
"routeTesterDefaultOutbound": "هیچ قانونی منطبق نشد — ترافیک به خروجی پیشفرض (اولین خروجی) میرود.",
|
||
"OutboundsDesc": "مسیر ترافیک خروجی را تنظیم کنید",
|
||
"Routings": "قوانین مسیریابی",
|
||
"RoutingsDesc": "اولویت هر قانون مهم است",
|
||
"importRules": "ورود قوانین",
|
||
"exportRules": "خروج قوانین",
|
||
"importOutbounds": "ورود خروجیها",
|
||
"exportOutbounds": "خروج خروجیها",
|
||
"importInvalidJson": "JSON نامعتبر — یک آرایه یا یک شیء با کلید متناظر انتظار میرود.",
|
||
"completeTemplate": "همه",
|
||
"logLevel": "سطح گزارش",
|
||
"logLevelDesc": "سطح گزارش برای گزارش های خطا، نشان دهنده اطلاعاتی است که باید ثبت شوند.",
|
||
"accessLog": "مسیر گزارش",
|
||
"accessLogDesc": "مسیر فایل برای گزارش دسترسی. مقدار ویژه «هیچ» گزارشهای دسترسی را غیرفعال میکند.",
|
||
"errorLog": "گزارش خطا",
|
||
"errorLogDesc": "مسیر فایل برای ورود به سیستم خطا. مقدار ویژه «هیچ» گزارش های خطا را غیرفعال میکند",
|
||
"dnsLog": "گزارش DNS",
|
||
"dnsLogDesc": "آیا ثبتهای درخواست DNS را فعال کنید",
|
||
"maskAddress": "پنهان کردن آدرس",
|
||
"maskAddressDesc": "پوشش آدرس IP، هنگامی که فعال میشود، به طور خودکار آدرس IP که در لاگ ظاهر میشود را جایگزین میکند.",
|
||
"statistics": "آمار",
|
||
"statsInboundUplink": "آمار آپلود ورودی",
|
||
"statsInboundUplinkDesc": "جمعآوری آمار برای ترافیک بالارو (آپلود) تمام پروکسیهای ورودی را فعال میکند.",
|
||
"statsInboundDownlink": "آمار دانلود ورودی",
|
||
"statsInboundDownlinkDesc": "جمعآوری آمار برای ترافیک پایینرو (دانلود) تمام پروکسیهای ورودی را فعال میکند.",
|
||
"statsOutboundUplink": "آمار آپلود خروجی",
|
||
"statsOutboundUplinkDesc": "جمعآوری آمار برای ترافیک بالارو (آپلود) تمام پروکسیهای خروجی را فعال میکند.",
|
||
"statsOutboundDownlink": "آمار دانلود خروجی",
|
||
"statsOutboundDownlinkDesc": "جمعآوری آمار برای ترافیک پایینرو (دانلود) تمام پروکسیهای خروجی را فعال میکند.",
|
||
"metricsListen": "نقطه پایانی متریک",
|
||
"metricsListenDesc": "متریکهای Xray (سبک Prometheus) را روی این آدرس:پورت در دسترس قرار میدهد (مثلاً 127.0.0.1:11111). برای غیرفعالکردن خالی بگذارید. روی localhost ببندید و با ریورسپروکسی ارائه دهید — احراز هویت ندارد.",
|
||
"metricsTag": "تگ متریک",
|
||
"connectionLimits": "محدودیت اتصال",
|
||
"connectionLimitsDesc": "سیاستهای سطح اتصال برای کاربرانِ سطح ۰. هر فیلد را خالی بگذارید تا مقدار پیشفرض Xray استفاده شود.",
|
||
"connIdle": "مهلت بیکاری",
|
||
"connIdleDesc": "اتصال را پس از این تعداد ثانیه بیکار ماندن میبندد. کمکردن آن، روی سرورهای شلوغ حافظه و file descriptor را زودتر آزاد میکند (پیشفرض Xray: ۳۰۰).",
|
||
"bufferSize": "اندازهٔ بافر",
|
||
"bufferSizeDesc": "اندازهٔ بافر داخلی هر اتصال بر حسب کیلوبایت. برای کمکردن مصرف حافظه روی سرورهای کمرم روی ۰ بگذارید (پیشفرض Xray به پلتفرم بستگی دارد).",
|
||
"bufferSizePlaceholder": "خودکار",
|
||
"seconds": "ثانیه",
|
||
"rules": {
|
||
"first": "اولین",
|
||
"last": "آخرین",
|
||
"up": "بالا",
|
||
"down": "پایین",
|
||
"source": "مبدا",
|
||
"dest": "مقصد",
|
||
"inbound": "ورودی",
|
||
"outbound": "خروجی",
|
||
"balancer": "بالانسر",
|
||
"info": "اطلاعات",
|
||
"add": "افزودن قانون",
|
||
"edit": "ویرایش قانون",
|
||
"useComma": "موارد جدا شده با کاما"
|
||
},
|
||
"routing": {
|
||
"dragToReorder": "برای تغییر ترتیب بکشید"
|
||
},
|
||
"ruleForm": {
|
||
"sourceIps": "IPهای مبدا",
|
||
"sourcePort": "پورت مبدا",
|
||
"vlessRoute": "مسیر VLESS",
|
||
"attributes": "صفتها",
|
||
"value": "مقدار",
|
||
"user": "کاربر",
|
||
"inboundTags": "تگهای ورودی",
|
||
"outboundTag": "تگ خروجی",
|
||
"balancerTag": "تگ بالانسر",
|
||
"balancerTagTooltip": "ترافیک را از یکی از بالانسرهای پیکربندیشده عبور میدهد"
|
||
},
|
||
"outboundForm": {
|
||
"tagDuplicate": "این تگ توسط خروجی دیگری استفاده شده است",
|
||
"tagRequired": "تگ الزامی است",
|
||
"tagPlaceholder": "تگ-منحصربهفرد",
|
||
"localIpPlaceholder": "IP محلی",
|
||
"dialerProxyPlaceholder": "یک خروجی برای زنجیره کردن انتخاب کنید",
|
||
"dialerProxyHint": "این خروجی را از طریق خروجی دیگری (با تگ) برقرار کن تا یک زنجیره پروکسی ساخته شود. برای اتصال مستقیم خالی بگذار.",
|
||
"addressRequired": "آدرس الزامی است",
|
||
"portRequired": "پورت الزامی است",
|
||
"optional": "اختیاری",
|
||
"udpOverTcp": "UDP over TCP",
|
||
"uotVersion": "نسخه UoT",
|
||
"inboundTag": "تگ ورودی",
|
||
"inboundTagPlaceholder": "تگ ورودی استفادهشده در قوانین مسیریابی",
|
||
"responseType": "نوع پاسخ",
|
||
"rewriteNetwork": "بازنویسی شبکه",
|
||
"unchanged": "(بدون تغییر)",
|
||
"unchangedAddress": "(بدون تغییر) مثل 1.1.1.1",
|
||
"rules": "قوانین",
|
||
"ruleN": "قانون {n}",
|
||
"action": "عمل",
|
||
"redirect": "بازهدایت",
|
||
"fragment": "Fragment",
|
||
"finalRules": "قوانین نهایی",
|
||
"overrideXrayPrivateIp": "override بلاک پیشفرض IP خصوصی Xray",
|
||
"blockDelay": "تأخیر بلاک (ms)",
|
||
"reverseSniffing": "Sniffing معکوس",
|
||
"reserved": "رزرو شده",
|
||
"minUploadInterval": "حداقل بازه آپلود (ms)",
|
||
"maxUploadSizeBytes": "حداکثر اندازه آپلود (بایت)",
|
||
"uplinkChunkSize": "اندازه قطعه آپلینک",
|
||
"noGrpcHeader": "بدون هدر gRPC",
|
||
"maxConcurrency": "حداکثر همزمانی",
|
||
"maxConnections": "حداکثر اتصالها",
|
||
"maxReuseTimes": "حداکثر استفاده مجدد",
|
||
"maxRequestTimes": "حداکثر تعداد درخواست",
|
||
"maxReusableSecs": "حداکثر ثانیه قابل استفاده مجدد",
|
||
"keepAlivePeriod": "دوره Keep alive",
|
||
"authPassword": "رمز احراز",
|
||
"visionTestpre": "Vision testpre",
|
||
"serverNamePlaceholder": "نام سرور",
|
||
"verifyPeerName": "تایید نام Peer",
|
||
"pinnedSha256": "SHA256 پینشده",
|
||
"shortId": "Short ID",
|
||
"sockopts": "Sockopts",
|
||
"keepAliveInterval": "بازه Keep alive",
|
||
"markFwmark": "علامت (fwmark)",
|
||
"interface": "رابط",
|
||
"ipv6Only": "فقط IPv6",
|
||
"acceptProxyProtocol": "پذیرش Proxy Protocol",
|
||
"proxyProtocol": "Proxy Protocol",
|
||
"tcpUserTimeoutMs": "TCP user timeout (ms)",
|
||
"tcpKeepAliveIdleS": "TCP keep-alive idle (s)"
|
||
},
|
||
"outbound": {
|
||
"addOutbound": "افزودن خروجی",
|
||
"addReverse": "افزودن معکوس",
|
||
"editOutbound": "ویرایش خروجی",
|
||
"editReverse": "ویرایش معکوس",
|
||
"reverseTag": "تگ معکوس",
|
||
"reverseTagDesc": "تگ خروجی پروکسی معکوس ساده VLESS. برای غیرفعال کردن خالی بگذارید. در صورت تنظیم، اتصالات این کلاینت میتوانند به عنوان تونل پروکسی معکوس استفاده شوند.",
|
||
"reverseTagPlaceholder": "تگ خروجی (خالی = غیرفعال)",
|
||
"tag": "تگ",
|
||
"tagDesc": "برچسب یگانه",
|
||
"address": "آدرس",
|
||
"reverse": "معکوس",
|
||
"domain": "دامنه",
|
||
"type": "نوع",
|
||
"bridge": "پل",
|
||
"portal": "پورتال",
|
||
"link": "لینک",
|
||
"intercon": "اتصال میانی",
|
||
"settings": "تنظیمات",
|
||
"accountInfo": "اطلاعات حساب",
|
||
"outboundStatus": "وضعیت خروجی",
|
||
"sendThrough": "ارسال با",
|
||
"test": "تست",
|
||
"testResult": "نتیجه تست",
|
||
"testing": "در حال تست اتصال...",
|
||
"testSuccess": "تست موفقیتآمیز",
|
||
"testFailed": "تست ناموفق",
|
||
"testError": "خطا در تست خروجی",
|
||
"testModeTooltip": "TCP: فقط dial سریع. HTTP: درخواست کامل از طریق xray.",
|
||
"testAll": "تست همه",
|
||
"httpStatus": "وضعیت HTTP",
|
||
"breakdownConnect": "اتصال پروکسی",
|
||
"breakdownTls": "TLS از طریق خروجی",
|
||
"breakdownTtfb": "اولین بایت",
|
||
"nordvpn": "NordVPN",
|
||
"accessToken": "توکن دسترسی",
|
||
"country": "کشور",
|
||
"server": "سرور",
|
||
"city": "شهر",
|
||
"allCities": "همه شهرها",
|
||
"privateKey": "کلید خصوصی",
|
||
"load": "فشار سرور",
|
||
"moveToTop": "انتقال به بالا"
|
||
},
|
||
"outboundSub": {
|
||
"manage": "سابسکریپشنها",
|
||
"title": "سابسکریپشنهای خروجی",
|
||
"remark": "نام (اختیاری)",
|
||
"remarkPlaceholder": "مثلاً نودهای هنگکنگ",
|
||
"url": "آدرس سابسکریپشن",
|
||
"urlPlaceholder": "https://... (فهرست base64 از لینکها)",
|
||
"tagPrefix": "پیشوند تگ",
|
||
"tagPrefixPlaceholder": "hk-",
|
||
"interval": "بازه بهروزرسانی",
|
||
"hours": "ساعت",
|
||
"minutes": "دقیقه",
|
||
"intervalHint": "پیشفرض ۱۰ دقیقه. وظیفهٔ پسزمینه بهطور مکرر بررسی میکند؛ هر سابسکریپشن فقط زمانی دوباره دریافت میشود که بازهٔ خودش سپری شده باشد.",
|
||
"enabled": "فعال",
|
||
"allowPrivate": "اجازهٔ آدرس خصوصی",
|
||
"allowPrivateHint": "اجازه به localhost / شبکهٔ محلی (LAN) / IPهای خصوصی برای آدرس این سابسکریپشن. بهدلایل امنیتی بهطور پیشفرض غیرفعال است؛ فقط برای یک منبع محلی مورد اعتماد فعال کنید.",
|
||
"prepend": "پیش از خروجیهای دستی",
|
||
"prependHint": "خروجیهای این سابسکریپشن را پیش از خروجیهای دستی شما قرار میدهد تا یکی از آنها بتواند پیشفرض شود.",
|
||
"preview": "پیشنمایش",
|
||
"previewEmpty": "هیچ خروجیای در این آدرس یافت نشد.",
|
||
"refreshAll": "تازهسازی همه",
|
||
"statusOk": "موفق",
|
||
"toastUpdated": "سابسکریپشن بهروزرسانی شد",
|
||
"addButton": "افزودن",
|
||
"active": "سابسکریپشنهای فعال",
|
||
"empty": "هنوز سابسکریپشنی وجود ندارد. از بالا یکی اضافه کنید.",
|
||
"colRemark": "نام",
|
||
"colPrefix": "پیشوند",
|
||
"colInterval": "بازه",
|
||
"colLastFetch": "آخرین دریافت",
|
||
"colEnabled": "فعال",
|
||
"auto": "خودکار",
|
||
"never": "هرگز",
|
||
"yes": "بله",
|
||
"no": "خیر",
|
||
"refreshNow": "تازهسازی اکنون",
|
||
"lastError": "آخرین خطا",
|
||
"deleteConfirm": "این سابسکریپشن حذف شود؟",
|
||
"restartHint": "پس از افزودن یا تازهسازی، برای فعالشدن خروجیها Xray را راهاندازی مجدد کنید (یا منتظر بارگذاری مجدد خودکار بعدی بمانید).",
|
||
"fromSubsTitle": "از سابسکریپشنهای خروجی (فقطخواندنی)",
|
||
"fromSubsDesc": "از سابسکریپشنهای فعال شما وارد شدهاند. آنها را از پنل سابسکریپشنها در بالا مدیریت کنید.",
|
||
"toastLoadFailed": "بارگذاری سابسکریپشنها ناموفق بود",
|
||
"toastUrlRequired": "آدرس سابسکریپشن الزامی است",
|
||
"toastAdded": "سابسکریپشن افزوده شد",
|
||
"toastAddFailed": "افزودن سابسکریپشن ناموفق بود",
|
||
"toastRefreshed": "تازهسازی شد",
|
||
"toastRefreshFailed": "تازهسازی ناموفق بود",
|
||
"toastDeleted": "حذف شد",
|
||
"toastDeleteFailed": "حذف ناموفق بود"
|
||
},
|
||
"tabBalancerSettings": "تنظیمات بالانسر",
|
||
"tabObservatory": "رصدخانه",
|
||
"observatory": {
|
||
"title": "رصدخانه",
|
||
"burstTitle": "رصدخانه Burst",
|
||
"autoManaged": "رصدگرها بهصورت خودکار از روی بالانسرهای شما مدیریت میشوند. در ادامه میتوانید نحوهٔ پروبزدن را تنظیم کنید؛ خروجیهای تحت نظر از سلکتورهای بالانسر پیروی میکنند.",
|
||
"emptyHint": "هیچ رصدگر اتصالی فعال نیست. وقتی یک بالانسر Least Ping یا Least Load بسازید — یا یک بالانسر Random / Round-robin همراه با fallback — بهصورت خودکار یکی اضافه میشود تا بالانسرهای متکی به رصدگر بتوانند پیش از انتخاب مقصد، سلامت خروجیها را بررسی کنند.",
|
||
"mixedLegacy": "این پیکربندی هم Observatory و هم Burst Observatory دارد. Xray فقط از یک رصدگر سراسری استفاده میکند، بنابراین این حالت قدیمیِ ترکیبی پشتیبانی نمیشود؛ ذخیرهٔ بالانسرها آن را به یک رصدگر عادیسازی میکند.",
|
||
"subjectSelector": "خروجیهای تحت نظر",
|
||
"subjectSelectorDesc": "تگ خروجیهایی که این رصدگر پروب میکند. بهصورت خودکار از روی بالانسرهای شما مدیریت میشود.",
|
||
"probeURL": "آدرس پروب (URL)",
|
||
"probeURLDesc": "آدرسی که برای سنجش هر خروجی فراخوانی میشود. باید HTTP 204 برگرداند.",
|
||
"probeInterval": "بازهٔ پروب",
|
||
"probeIntervalDesc": "هر چند وقت یکبار هر خروجی پروب شود، مثلاً 30s یا 1m یا 2h45m.",
|
||
"enableConcurrency": "پروب همزمان",
|
||
"enableConcurrencyDesc": "همهٔ خروجیهای تحت نظر را بهجای یکییکی، همزمان پروب کن. سریعتر است اما در شبکه نمایانتر.",
|
||
"destination": "مقصد پروب",
|
||
"destinationDesc": "آدرسی که برای سنجش هر خروجی فراخوانی میشود. باید HTTP 204 برگرداند.",
|
||
"connectivity": "بررسی اتصال",
|
||
"connectivityDesc": "آدرس اختیاری برای بررسی شبکهٔ محلی که فقط پس از شکست مقصد امتحان میشود. برای نادیدهگرفتن خالی بگذارید.",
|
||
"interval": "بازهٔ پروب",
|
||
"intervalDesc": "میانگین فاصلهٔ زمانی بین پروبها برای هر خروجی، مثلاً 1m. کمینه 10s.",
|
||
"timeout": "مهلت پروب",
|
||
"timeoutDesc": "چه مدت برای پاسخ یک پروب صبر شود تا ناموفق بهحساب بیاید، مثلاً 5s.",
|
||
"sampling": "تعداد نمونهگیری",
|
||
"samplingDesc": "تعداد نتایج اخیر پروب که برای امتیازدهی به هر خروجی نگه داشته میشود.",
|
||
"httpMethod": "متد HTTP",
|
||
"httpMethodDesc": "متد HTTP که برای پروبها استفاده میشود.",
|
||
"deleteAlsoObservatory": "این آخرین بالانسری است که از Observatory استفاده میکند، بنابراین آن هم حذف خواهد شد.",
|
||
"deleteAlsoBurst": "این آخرین بالانسری است که از Burst Observatory استفاده میکند، بنابراین آن هم حذف خواهد شد."
|
||
},
|
||
"refCleanup": {
|
||
"header": "حذف این مورد مسیریابی شما را هم بهروز میکند:",
|
||
"ruleRemoved": "قاعده {label} — حذف شد (مقصدی باقی نماند)",
|
||
"ruleModified": "قاعده {label} — حفظ شد (اکنون از {keeps} استفاده میکند)",
|
||
"balancerRemoved": "بالانسر {tag} — حذف شد (هدفی باقی نماند)"
|
||
},
|
||
"balancer": {
|
||
"addBalancer": "افزودن بالانسر",
|
||
"editBalancer": "ویرایش بالانسر",
|
||
"balancerStrategy": "استراتژی",
|
||
"balancerSelectors": "انتخابگرها",
|
||
"tag": "تگ",
|
||
"tagDesc": "برچسب یگانه",
|
||
"tagDuplicate": "این تگ توسط بالانسر دیگری استفاده شده است",
|
||
"tagPlaceholder": "تگ منحصربهفرد بالانسر",
|
||
"selector": "انتخابگر",
|
||
"fallback": "Fallback",
|
||
"expected": "مورد انتظار",
|
||
"expectedPlaceholder": "تعداد نود بهینه",
|
||
"maxRtt": "حداکثر RTT",
|
||
"tolerance": "تحمل",
|
||
"baselines": "خطوط پایه",
|
||
"costs": "هزینهها",
|
||
"balancerDesc": "امکان استفاده همزمان balancerTag و outboundTag باهم وجود ندارد. درصورت استفاده همزمان فقط outboundTag عمل خواهد کرد.",
|
||
"costMatch": "الگوی برچسب",
|
||
"costValue": "وزن",
|
||
"costRegexp": "تطبیق با عبارت باقاعده"
|
||
},
|
||
"wireguard": {
|
||
"secretKey": "کلید شخصی",
|
||
"publicKey": "کلید عمومی",
|
||
"allowedIPs": "آیپیهای مجاز",
|
||
"endpoint": "نقطه پایانی",
|
||
"psk": "کلید مشترک",
|
||
"domainStrategy": "استراتژی حل دامنه"
|
||
},
|
||
"tun": {
|
||
"nameDesc": "نام رابط TUN. مقدار پیشفرض 'xray0' است",
|
||
"mtuDesc": "واحد انتقال حداکثر. بیشترین اندازه بستههای داده. مقدار پیشفرض 1500 است",
|
||
"userLevel": "سطح کاربر",
|
||
"userLevelDesc": "تمام اتصالات انجامشده از طریق این ورودی از این سطح کاربری استفاده خواهند کرد. مقدار پیشفرض 0 است"
|
||
},
|
||
"nord": {
|
||
"accessToken": "توکن دسترسی",
|
||
"privateKey": "کلید خصوصی",
|
||
"noServers": "سروری برای کشور انتخابی پیدا نشد",
|
||
"noPublicKey": "سرور انتخابی کلید عمومی NordLynx اعلام نمیکند.",
|
||
"outboundAdded": "خروجی NordVPN اضافه شد",
|
||
"outboundUpdated": "خروجی NordVPN بهروزرسانی شد"
|
||
},
|
||
"warp": {
|
||
"changeIp": "تغییر IP",
|
||
"changeIpSuccess": "آدرس IP وارپ با موفقیت تغییر کرد!",
|
||
"autoUpdateIp": "بهروزرسانی خودکار آدرس IP",
|
||
"intervalDays": "بازه (روز)",
|
||
"intervalDesc": "برای غیرفعالسازی ۰ بگذارید. آدرس IP را بهصورت خودکار تغییر میدهد.",
|
||
"licenseError": "تنظیم لایسنس WARP ناموفق بود.",
|
||
"fetchFirst": "ابتدا پیکربندی WARP را دریافت کنید.",
|
||
"createAccount": "ایجاد حساب WARP",
|
||
"accessToken": "توکن دسترسی",
|
||
"deviceId": "شناسه دستگاه",
|
||
"licenseKey": "کلید لایسنس",
|
||
"privateKey": "کلید خصوصی",
|
||
"deleteAccount": "حذف حساب",
|
||
"settings": "تنظیمات",
|
||
"licenseKeyLabel": "کلید لایسنس WARP / WARP+",
|
||
"key": "کلید",
|
||
"keyPlaceholder": "کلید ۲۶ کاراکتری WARP+",
|
||
"accountInfo": "اطلاعات حساب",
|
||
"deviceName": "نام دستگاه",
|
||
"deviceModel": "مدل دستگاه",
|
||
"deviceEnabled": "دستگاه فعال",
|
||
"accountType": "نوع حساب",
|
||
"role": "نقش",
|
||
"warpPlusData": "داده WARP+",
|
||
"quota": "سهمیه",
|
||
"usage": "مصرف",
|
||
"addOutbound": "افزودن خروجی"
|
||
},
|
||
"dns": {
|
||
"enable": "فعال کردن حل دامنه",
|
||
"enableDesc": "سرور حل دامنه داخلی را فعال کنید",
|
||
"tag": "برچسب",
|
||
"tagDesc": "این برچسب در قوانین مسیریابی به عنوان یک برچسب ورودی قابل استفاده خواهد بود",
|
||
"clientIp": "آیپی کلاینت",
|
||
"clientIpDesc": "برای اطلاعرسانی به سرور درباره مکان IP مشخصشده در طول درخواستهای DNS استفاده میشود",
|
||
"disableCache": "غیرفعالسازی کش",
|
||
"disableCacheDesc": "کش DNS را غیرفعال میکند",
|
||
"disableFallback": "غیرفعالسازی Fallback",
|
||
"disableFallbackDesc": "درخواستهای DNS Fallback را غیرفعال میکند",
|
||
"disableFallbackIfMatch": "غیرفعالسازی Fallback در صورت تطابق",
|
||
"disableFallbackIfMatchDesc": "درخواستهای DNS Fallback را زمانی که لیست دامنههای مطابقتیافته سرور DNS فعال است، غیرفعال میکند",
|
||
"enableParallelQuery": "فعالسازی پرسوجوی موازی",
|
||
"enableParallelQueryDesc": "فعالسازی پرسوجوهای DNS موازی به چندین سرور برای وضوح سریعتر",
|
||
"strategy": "استراتژی پرسوجو",
|
||
"strategyDesc": "استراتژی کلی برای حل نام دامنه",
|
||
"add": "افزودن سرور",
|
||
"edit": "ویرایش سرور",
|
||
"domains": "دامنهها",
|
||
"expectIPs": "آیپیهای مورد انتظار",
|
||
"unexpectIPs": "آیپیهای غیرمنتظره",
|
||
"useSystemHosts": "استفاده از Hosts سیستم",
|
||
"useSystemHostsDesc": "استفاده از فایل hosts یک سیستم نصبشده",
|
||
"serveStale": "ارائه نتایج منقضی",
|
||
"serveStaleDesc": "بازگرداندن نتایج منقضی کش هنگام بروزرسانی در پسزمینه",
|
||
"serveExpiredTTL": "TTL نتایج منقضی",
|
||
"serveExpiredTTLDesc": "مدت اعتبار نتایج منقضی به ثانیه؛ ۰ یعنی هرگز منقضی نمیشود",
|
||
"timeoutMs": "زمان انتظار (میلیثانیه)",
|
||
"skipFallback": "رد کردن Fallback",
|
||
"finalQuery": "پرسوجوی نهایی",
|
||
"hosts": "Hosts",
|
||
"hostsAdd": "افزودن Host",
|
||
"hostsEmpty": "هیچ Host تعریف نشده",
|
||
"hostsDomain": "دامنه (مثلاً domain:example.com)",
|
||
"hostsValues": "آیپی یا دامنه — تایپ کنید و Enter بزنید",
|
||
"usePreset": "استفاده از پیشتنظیم",
|
||
"dnsPresetTitle": "پیشتنظیمهای DNS",
|
||
"dnsPresetFamily": "خانوادگی",
|
||
"clearAll": "حذف همه",
|
||
"clearAllTitle": "حذف همه سرورهای DNS؟",
|
||
"clearAllConfirm": "این کار همه سرورهای DNS را از لیست حذف میکند و قابل بازگشت نیست."
|
||
},
|
||
"fakedns": {
|
||
"add": "افزودن دیاناس جعلی",
|
||
"edit": "ویرایش دیاناس جعلی",
|
||
"ipPool": "زیرشبکه استخر آیپی",
|
||
"poolSize": "اندازه استخر"
|
||
}
|
||
},
|
||
"hosts": {
|
||
"addHost": "افزودن میزبان",
|
||
"editHost": "ویرایش میزبان",
|
||
"selectInbound": "یک اینباند انتخاب کنید",
|
||
"selectedCount": "{count} انتخابشده",
|
||
"summary": {
|
||
"total": "کل",
|
||
"enabled": "فعال",
|
||
"disabled": "غیرفعال"
|
||
},
|
||
"moveUp": "انتقال به بالا",
|
||
"moveDown": "انتقال به پایین",
|
||
"bulkEnable": "فعالسازی",
|
||
"bulkDisable": "غیرفعالسازی",
|
||
"bulkDelete": "حذف",
|
||
"bulkDeleteConfirm": "{count} میزبان انتخابشده حذف شود؟",
|
||
"deleteConfirmTitle": "میزبان «{name}» حذف شود؟",
|
||
"sections": {
|
||
"basic": "پایه",
|
||
"security": "امنیت",
|
||
"advanced": "پیشرفته",
|
||
"general": "عمومی",
|
||
"clash": "Clash (mihomo)"
|
||
},
|
||
"fields": {
|
||
"remark": "نام",
|
||
"serverDescription": "توضیحات",
|
||
"inbound": "اینباند",
|
||
"address": "آدرس",
|
||
"port": "پورت",
|
||
"endpoint": "نقطه پایانی",
|
||
"enable": "فعال",
|
||
"actions": "عملیات",
|
||
"security": "امنیت",
|
||
"sni": "SNI",
|
||
"overrideSniFromAddress": "استفاده از آدرس بهعنوان SNI",
|
||
"keepSniBlank": "SNI خالی بماند",
|
||
"hostHeader": "هدر Host",
|
||
"path": "مسیر",
|
||
"alpn": "ALPN",
|
||
"fingerprint": "اثرانگشت",
|
||
"pins": "SHA-256 پینشدهٔ گواهی",
|
||
"verifyPeerCertByName": "بررسی گواهی همتا بر اساس نام",
|
||
"allowInsecure": "اجازهٔ اتصال ناامن",
|
||
"echConfigList": "فهرست پیکربندی ECH",
|
||
"muxParams": "Mux",
|
||
"sockoptParams": "Sockopt",
|
||
"finalMask": "ماسک نهایی",
|
||
"vlessRoute": "مسیر VLESS",
|
||
"mihomoIpVersion": "نسخه IP",
|
||
"mihomoX25519": "Mihomo X25519",
|
||
"shuffleHost": "درهمسازی میزبان",
|
||
"tags": "برچسبها",
|
||
"nodeGuids": "نودها",
|
||
"excludeFromSubTypes": "حذف از فرمتها"
|
||
},
|
||
"hints": {
|
||
"address": "برای ارثبری آدرس خودِ اینباند خالی بگذارید.",
|
||
"port": "مقدار ۰ پورت اینباند را به ارث میبرد.",
|
||
"tags": "برای کاربران نهایی قابل مشاهده نیست؛ فقط با اشتراک RAW ارسال میشود. تنها حروف بزرگ، ارقام، _ و : مجاز است.",
|
||
"nodeGuids": "نودهایی را که از این میزبان resolve میشوند انتخاب کنید. صرفاً انتساب نمایشی است.",
|
||
"serverDescription": "یادداشت اختیاری که زیر نام نمایش داده میشود.",
|
||
"allowInsecure": "رد کردن بررسی گواهی TLS (allowInsecure / skip-cert-verify).",
|
||
"vlessRoute": "یک مقدار مسیر VLESS (0 تا 65535) که در UUID جاسازی میشود، مثلاً 443. برای هیچکدام خالی بگذارید.",
|
||
"remark": "یک برچسب ساده برای این میزبان. تنها زمانی بهعنوان نام کانفیگ نمایش داده میشود که اینباند نام مخصوص خود را نداشته باشد."
|
||
},
|
||
"remarkVars": {
|
||
"title": "متغیرهای قالب",
|
||
"intro": "برای افزودن یک متغیر روی آن کلیک کنید. هنگام ساخت اشتراک، برای هر کاربر جایگزین میشود.",
|
||
"preview": "پیشنمایش",
|
||
"groups": {
|
||
"client": "کاربر",
|
||
"traffic": "ترافیک",
|
||
"time": "زمان و وضعیت",
|
||
"connection": "اتصال"
|
||
},
|
||
"descEMAIL": "ایمیل کاربر",
|
||
"descINBOUND": "نام خود اینباند (نام کانفیگ)",
|
||
"descHOST": "نام میزبان",
|
||
"descID": "UUID کاربر",
|
||
"descSHORT_ID": "۸ کاراکتر اول UUID",
|
||
"descTELEGRAM_ID": "شناسهٔ تلگرام کاربر (در صورت عدم تنظیم خالی)",
|
||
"descSUB_ID": "شناسهٔ اشتراک",
|
||
"descCOMMENT": "توضیحات کاربر",
|
||
"descTRAFFIC_USED": "ترافیک مصرفشده (قابل خواندن برای انسان)",
|
||
"descTRAFFIC_LEFT": "ترافیک باقیمانده (در صورت نامحدود بودن پنهان میشود)",
|
||
"descTRAFFIC_TOTAL": "ترافیک کل (در صورت نامحدود بودن پنهان میشود)",
|
||
"descTRAFFIC_USED_BYTES": "ترافیک مصرفشده به بایت",
|
||
"descTRAFFIC_LEFT_BYTES": "ترافیک باقیمانده به بایت",
|
||
"descTRAFFIC_TOTAL_BYTES": "ترافیک کل به بایت",
|
||
"descUP": "ترافیک آپلود",
|
||
"descDOWN": "ترافیک دانلود",
|
||
"descSTATUS": "فعال / منقضیشده / غیرفعال / مصرفشده",
|
||
"descSTATUS_EMOJI": "وضعیت بهصورت ایموجی (✅ ⏳ 🚫)",
|
||
"descDAYS_LEFT": "روزهای باقیمانده تا انقضا (در صورت نامحدود بودن پنهان میشود)",
|
||
"descTIME_LEFT": "زمان باقیمانده (مثلاً 12d 4h 30m)",
|
||
"descUSAGE_PERCENTAGE": "ترافیک مصرفشده به درصد (در صورت نامحدود بودن پنهان میشود)",
|
||
"descEXPIRE_DATE": "تاریخ انقضا (YYYY-MM-DD)",
|
||
"descJALALI_EXPIRE_DATE": "تاریخ انقضا در تقویم جلالی (YYYY/MM/DD)",
|
||
"descEXPIRE_UNIX": "انقضا بهصورت مهر زمانی Unix (ثانیه)",
|
||
"descCREATED_UNIX": "زمان ایجاد بهصورت مهر زمانی Unix (ثانیه)",
|
||
"descRESET_DAYS": "دورهٔ بازنشانی ترافیک به روز",
|
||
"descPROTOCOL": "پروتکل اینباند (VLESS، VMess، Trojan، …)",
|
||
"descTRANSPORT": "شبکهٔ انتقال (tcp، ws، grpc، …)",
|
||
"descSECURITY": "امنیت انتقال (TLS، REALITY، NONE)"
|
||
},
|
||
"toasts": {
|
||
"list": "بارگذاری میزبانها ناموفق",
|
||
"obtain": "بارگذاری میزبان ناموفق",
|
||
"add": "افزودن میزبان",
|
||
"update": "بهروزرسانی میزبان",
|
||
"delete": "حذف میزبان",
|
||
"badTag": "برچسب نامعتبر",
|
||
"badVlessRoute": "یک عدد بین 0 تا 65535 وارد کنید"
|
||
}
|
||
}
|
||
},
|
||
"tgbot": {
|
||
"keyboardClosed": "❌ صفحه کلید بسته شد!",
|
||
"noResult": "❗ نتیجه ای یافت نشد!",
|
||
"noQuery": "❌ درخواست یافت نشد! لطفا دوباره تلاش کنید!",
|
||
"wentWrong": "❌ مشکلی پیش آمد!",
|
||
"noIpRecord": "❗ رکورد آی پی وجود ندارد!",
|
||
"noInbounds": "❗ هیچ ورودی یافت نشد!",
|
||
"unlimited": "♾ نامحدود(ریست)",
|
||
"add": "افزودن",
|
||
"month": "ماه",
|
||
"months": "ماه",
|
||
"day": "روز",
|
||
"days": "روز",
|
||
"hours": "ساعت",
|
||
"minutes": "دقیقه",
|
||
"unknown": "نامشخص",
|
||
"inbounds": "ورودیها",
|
||
"clients": "کاربران",
|
||
"offline": "🔴 آفلاین",
|
||
"online": "🟢 آنلاین",
|
||
"commands": {
|
||
"unknown": "❗ دستور ناشناخته",
|
||
"pleaseChoose": "👇 لطفاً انتخاب کنید:\r\n",
|
||
"help": "🤖 به این ربات خوش آمدید! این ربات برای ارائه دادههای خاص از سرور طراحی شده است و به شما امکان تغییرات لازم را میدهد.\r\n\r\n",
|
||
"start": "👋 سلام <i>{{ .Firstname }}</i>.\r\n",
|
||
"welcome": "🤖 به ربات مدیریت <b>{{ .Hostname }}</b> خوش آمدید.\r\n",
|
||
"status": "✅ ربات در حالت عادی است!",
|
||
"usage": "❗ لطفاً یک متن برای جستجو وارد کنید!",
|
||
"getID": "🆔 شناسه شما: <code>{{ .ID }}</code>",
|
||
"helpAdminCommands": "برای راهاندازی مجدد Xray Core:\r\n<code>/restart</code>\r\n\r\nبرای جستجوی ایمیل مشتری:\r\n<code>/usage [ایمیل]</code>\r\n\r\nبرای جستجوی ورودیها (با آمار مشتری):\r\n<code>/inbound [توضیحات]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>",
|
||
"helpClientCommands": "برای جستجوی آمار، از دستور زیر استفاده کنید:\r\n<code>/usage [ایمیل]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>",
|
||
"restartUsage": "\r\n\r\n<code>/restart</code>",
|
||
"restartSuccess": "✅ عملیات با موفقیت انجام شد!",
|
||
"restartFailed": "❗ خطا در عملیات.\r\n\r\n<code>خطا: {{ .Error }}</code>.",
|
||
"xrayNotRunning": "❗ Xray Core در حال اجرا نیست.",
|
||
"startDesc": "نمایش منوی اصلی",
|
||
"helpDesc": "راهنمای ربات",
|
||
"statusDesc": "بررسی وضعیت ربات",
|
||
"idDesc": "نمایش شناسه تلگرام شما"
|
||
},
|
||
"messages": {
|
||
"cpuThreshold": "بار پردازنده {{ .Percent }}% بیشتر از آستانه است {{ .Threshold }}%",
|
||
"selectUserFailed": "❌ خطا در انتخاب کاربر!",
|
||
"userSaved": "✅ کاربر تلگرام ذخیره شد.",
|
||
"loginSuccess": "✅ با موفقیت به پنل وارد شدید.\r\n",
|
||
"loginFailed": "❗️ ورود به پنل ناموفقبود \r\n",
|
||
"2faFailed": "خطای 2FA",
|
||
"report": "🕰 گزارشاتزمانبندیشده: {{ .RunTime }}\r\n",
|
||
"datetime": "⏰ تاریخوزمان: {{ .DateTime }}\r\n",
|
||
"hostname": "💻 میزبان: {{ .Hostname }}\r\n",
|
||
"version": "🚀 نسخهپنل: {{ .Version }}\r\n",
|
||
"xrayVersion": "📡 نسخههسته: {{ .XrayVersion }}\r\n",
|
||
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
|
||
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
|
||
"ip": "🌐 IP: {{ .IP }}\r\n",
|
||
"ips": "🔢 IPها:\r\n{{ .IPs }}\r\n",
|
||
"serverUpTime": "⏳ مدتکارکردسیستم: {{ .UpTime }} {{ .Unit }}\r\n",
|
||
"serverLoad": "📈 بارسیستم: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n",
|
||
"serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n",
|
||
"tcpCount": "🔹 TCP: {{ .Count }}\r\n",
|
||
"udpCount": "🔸 UDP: {{ .Count }}\r\n",
|
||
"traffic": "🚦 ترافیک: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n",
|
||
"xrayStatus": "ℹ️ وضعیت: {{ .State }}\r\n",
|
||
"username": "👤 نامکاربری: {{ .Username }}\r\n",
|
||
"reason": "❗️ دلیل: {{ .Reason }}\r\n",
|
||
"time": "⏰ زمان: {{ .Time }}\r\n",
|
||
"inbound": "📍 ورودی: {{ .Remark }}\r\n",
|
||
"port": "🔌 پورت: {{ .Port }}\r\n",
|
||
"expire": "📅 تاریخانقضا: {{ .Time }}\r\n\r\n",
|
||
"expireIn": "📅 باقی مانده تا انقضا: {{ .Time }}\r\n\r\n",
|
||
"active": "💡 فعال: {{ .Enable }}\r\n",
|
||
"enabled": "🚨 وضعیت: {{ .Enable }}\r\n",
|
||
"online": "🌐 وضعیت اتصال: {{ .Status }}\r\n",
|
||
"lastOnline": "🔙 آخرین فعالیت: {{ .Time }}\r\n",
|
||
"email": "📧 ایمیل: {{ .Email }}\r\n",
|
||
"upload": "🔼 آپلود: ↑{{ .Upload }}\r\n",
|
||
"download": "🔽 دانلود: ↓{{ .Download }}\r\n",
|
||
"total": "📊 کل: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
|
||
"TGUser": "👤 کاربر تلگرام: {{ .TelegramID }}\r\n",
|
||
"exhaustedMsg": "🚨 {{ .Type }} بهاتمامرسیدهاست:\r\n",
|
||
"exhaustedCount": "🚨 تعداد {{ .Type }} بهاتمامرسیدهاست:\r\n",
|
||
"onlinesCount": "🌐 کاربرانآنلاین: {{ .Count }}\r\n",
|
||
"disabled": "🛑 غیرفعال: {{ .Disabled }}\r\n",
|
||
"depleteSoon": "🔜 بهزودیبهپایانخواهدرسید: {{ .Deplete }}\r\n\r\n",
|
||
"backupTime": "🗄 زمانپشتیبانگیری: {{ .Time }}\r\n",
|
||
"refreshedOn": "\r\n📋🔄 تازهسازی شده در: {{ .Time }}\r\n\r\n",
|
||
"yes": "✅ بله",
|
||
"no": "❌ خیر",
|
||
"received_id": "🔑📥 شناسه بهروزرسانی شد.",
|
||
"received_password": "🔑📥 رمز عبور بهروزرسانی شد.",
|
||
"received_email": "📧📥 ایمیل بهروزرسانی شد.",
|
||
"received_comment": "💬📥 نظر بهروزرسانی شد.",
|
||
"id_prompt": "🔑 شناسه پیشفرض: {{ .ClientId }}\n\nشناسه خود را وارد کنید.",
|
||
"pass_prompt": "🔑 رمز عبور پیشفرض: {{ .ClientPassword }}\n\nرمز عبور خود را وارد کنید.",
|
||
"email_prompt": "📧 ایمیل پیشفرض: {{ .ClientEmail }}\n\nایمیل خود را وارد کنید.",
|
||
"comment_prompt": "💬 نظر پیشفرض: {{ .ClientComment }}\n\nنظر خود را وارد کنید.",
|
||
"inbound_client_data_id": "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n📊 ترافیک: {{ .ClientTraffic }}\n📅 تاریخ انقضا: {{ .ClientExp }}\n🌐 محدودیت IP: {{ .IpLimit }}\n💬 توضیح: {{ .ClientComment }}\n\nاکنون میتونی مشتری را به ورودی اضافه کنی!",
|
||
"inbound_client_data_pass": "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n📊 ترافیک: {{ .ClientTraffic }}\n📅 تاریخ انقضا: {{ .ClientExp }}\n🌐 محدودیت IP: {{ .IpLimit }}\n💬 توضیح: {{ .ClientComment }}\n\nاکنون میتونی مشتری را به ورودی اضافه کنی!",
|
||
"cancel": "❌ فرآیند لغو شد! \n\nمیتوانید هر زمان که خواستید /start را دوباره اجرا کنید. 🔄",
|
||
"error_add_client": "⚠️ خطا:\n\n {{ .error }}",
|
||
"using_default_value": "باشه، از مقدار پیشفرض استفاده میکنم. 😊",
|
||
"incorrect_input": "ورودی شما معتبر نیست.\nعبارتها باید بدون فاصله باشند.\nمثال صحیح: aaaaaa\nمثال نادرست: aaa aaa 🚫",
|
||
"AreYouSure": "مطمئنی؟ 🤔",
|
||
"SuccessResetTraffic": "📧 ایمیل: {{ .ClientEmail }}\n🏁 نتیجه: ✅ موفقیتآمیز",
|
||
"FailedResetTraffic": "📧 ایمیل: {{ .ClientEmail }}\n🏁 نتیجه: ❌ ناموفق \n\n🛠️ خطا: [ {{ .ErrorMessage }} ]",
|
||
"FinishProcess": "🔚 فرآیند بازنشانی ترافیک برای همه مشتریان به پایان رسید.",
|
||
"eventOutboundDown": "خروجی {{ .Tag }} قطع است",
|
||
"eventOutboundUp": "خروجی {{ .Tag }} وصل است",
|
||
"eventErrorDetail": "خطا: {{ .Error }}",
|
||
"eventDelayDetail": "تأخیر: {{ .Delay }} میلیثانیه",
|
||
"eventXrayCrash": "Xray کرش کرد",
|
||
"eventXrayCrashError": "خطا: {{ .Error }}",
|
||
"eventNodeDown": "نود {{ .Name }} قطع است",
|
||
"eventNodeUp": "نود {{ .Name }} وصل است",
|
||
"eventCPUHigh": "بالا بودن CPU",
|
||
"eventCPUHighDetail": "CPU: {{ .Detail }}",
|
||
"eventLoginFallback": "ورود ناموفق از {{ .Source }}",
|
||
"memoryThreshold": "مصرف حافظه {{ .Percent }}% از حد آستانه {{ .Threshold }}% فراتر رفته است"
|
||
},
|
||
"buttons": {
|
||
"closeKeyboard": "❌ بستن کیبورد",
|
||
"cancel": "❌ لغو",
|
||
"cancelReset": "❌ لغو تنظیم مجدد",
|
||
"cancelIpLimit": "❌ لغو محدودیت آیپی",
|
||
"confirmResetTraffic": "✅ تأیید تنظیم مجدد ترافیک؟",
|
||
"confirmClearIps": "✅ تأیید پاکسازی آدرسهای آیپی؟",
|
||
"confirmRemoveTGUser": "✅ تأیید حذف کاربر تلگرام؟",
|
||
"confirmToggle": "✅ تایید فعال/غیرفعال کردن کاربر؟",
|
||
"dbBackup": "دریافت پشتیبان",
|
||
"serverUsage": "استفاده از سیستم",
|
||
"getInbounds": "دریافت ورودیها",
|
||
"depleteSoon": "بهزودی به پایان خواهد رسید",
|
||
"clientUsage": "دریافت آمار کاربر",
|
||
"onlines": "کاربران آنلاین",
|
||
"commands": "دستورات",
|
||
"refresh": "🔄 تازهسازی",
|
||
"clearIPs": "❌ پاکسازی آدرسها",
|
||
"removeTGUser": "❌ حذف کاربر تلگرام",
|
||
"selectTGUser": "👤 انتخاب کاربر تلگرام",
|
||
"selectOneTGUser": "👤 یک کاربر تلگرام را انتخاب کنید:",
|
||
"resetTraffic": "📈 تنظیم مجدد ترافیک",
|
||
"resetExpire": "📅 تنظیم مجدد تاریخ انقضا",
|
||
"ipLog": "🔢 لاگ آدرسهای IP",
|
||
"ipLimit": "🔢 محدودیت IP",
|
||
"setTGUser": "👤 تنظیم کاربر تلگرام",
|
||
"toggle": "🔘 فعال / غیرفعال",
|
||
"custom": "🔢 سفارشی",
|
||
"confirmNumber": "✅ تایید: {{ .Num }}",
|
||
"confirmNumberAdd": "✅ تایید اضافه کردن: {{ .Num }}",
|
||
"limitTraffic": "🚧 محدودیت ترافیک",
|
||
"getBanLogs": "گزارش های بلوک را دریافت کنید",
|
||
"allClients": "همه مشتریان",
|
||
"addClient": "افزودن مشتری",
|
||
"submitDisable": "ارسال به عنوان غیرفعال ☑️",
|
||
"submitEnable": "ارسال به عنوان فعال ✅",
|
||
"use_default": "🏷️ استفاده از پیشفرض",
|
||
"change_id": "⚙️🔑 ID",
|
||
"change_password": "⚙️🔑 گذرواژه",
|
||
"change_email": "⚙️📧 ایمیل",
|
||
"change_comment": "⚙️💬 نظر",
|
||
"change_flow": "⚙️🚦 Flow",
|
||
"ResetAllTraffics": "بازنشانی همه ترافیکها",
|
||
"SortedTrafficUsageReport": "گزارش استفاده از ترافیک مرتبشده"
|
||
},
|
||
"answers": {
|
||
"successfulOperation": "✅ انجام شد!",
|
||
"errorOperation": "❗ خطا در عملیات.",
|
||
"getInboundsFailed": "❌ دریافت ورودیها با خطا مواجه شد.",
|
||
"getClientsFailed": "❌ دریافت مشتریان با شکست مواجه شد.",
|
||
"canceled": "❌ {{ .Email }} : عملیات لغو شد.",
|
||
"clientRefreshSuccess": "✅ {{ .Email }} : کلاینت با موفقیت تازهسازی شد.",
|
||
"IpRefreshSuccess": "✅ {{ .Email }} : آدرسها با موفقیت تازهسازی شدند.",
|
||
"TGIdRefreshSuccess": "✅ {{ .Email }} : کاربر تلگرام کلاینت با موفقیت تازهسازی شد.",
|
||
"resetTrafficSuccess": "✅ {{ .Email }} : ترافیک با موفقیت تنظیم مجدد شد.",
|
||
"setTrafficLimitSuccess": "✅ {{ .Email }} : محدودیت ترافیک با موفقیت ذخیره شد.",
|
||
"expireResetSuccess": "✅ {{ .Email }} : تاریخ انقضا با موفقیت تنظیم مجدد شد.",
|
||
"resetIpSuccess": "✅ {{ .Email }} : محدودیت آدرس IP {{ .Count }} با موفقیت ذخیره شد.",
|
||
"clearIpSuccess": "✅ {{ .Email }} : آدرسها با موفقیت پاکسازی شدند.",
|
||
"getIpLog": "✅ {{ .Email }} : دریافت لاگ آدرسهای IP.",
|
||
"getUserInfo": "✅ {{ .Email }} : دریافت اطلاعات کاربر تلگرام.",
|
||
"removedTGUserSuccess": "✅ {{ .Email }} : کاربر تلگرام با موفقیت حذف شد.",
|
||
"enableSuccess": "✅ {{ .Email }} : با موفقیت فعال شد.",
|
||
"disableSuccess": "✅ {{ .Email }} : با موفقیت غیرفعال شد.",
|
||
"askToAddUserId": "پیکربندی شما یافت نشد!\r\nلطفاً از مدیر خود بخواهید که شناسه کاربر تلگرام خود را در پیکربندی (های) خود استفاده کند.\r\n\r\nشناسه کاربری شما: <code>{{ .TgUserID }}</code>",
|
||
"chooseClient": "یک مشتری برای ورودی {{ .Inbound }} انتخاب کنید",
|
||
"chooseInbound": "یک ورودی انتخاب کنید"
|
||
}
|
||
},
|
||
"email": {
|
||
"subjectOutboundDown": "خروجی {{ .Tag }} قطع است",
|
||
"subjectOutboundUp": "خروجی {{ .Tag }} وصل است",
|
||
"subjectXrayCrash": "Xray کرش کرد",
|
||
"subjectCPUHigh": "بالا بودن CPU",
|
||
"subjectLoginSuccess": "ورود موفق",
|
||
"subjectLoginFailed": "ورود ناموفق",
|
||
"titleOutboundDown": "خروجی قطع شد",
|
||
"titleOutboundUp": "خروجی وصل شد",
|
||
"titleXrayCrash": "Xray کرش کرد",
|
||
"titleCPUHigh": "بالا بودن CPU",
|
||
"titleLoginSuccess": "ورود موفق",
|
||
"titleLoginFailed": "ورود ناموفق",
|
||
"labelStatus": "وضعیت",
|
||
"labelOutbound": "خروجی",
|
||
"labelNode": "نود",
|
||
"labelError": "خطا",
|
||
"labelDelay": "تأخیر",
|
||
"labelDetail": "جزئیات",
|
||
"labelUsername": "نامکاربری",
|
||
"labelIP": "IP",
|
||
"labelReason": "دلیل",
|
||
"labelSource": "مبدأ",
|
||
"labelTime": "زمان",
|
||
"statusCrashed": "کرش کرد",
|
||
"statusRunning": "در حال اجرا",
|
||
"statusHigh": "بالا",
|
||
"statusSuccess": "موفق",
|
||
"statusFailed": "ناموفق",
|
||
"statusDown": "قطع",
|
||
"statusUp": "وصل"
|
||
}
|
||
}
|