mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-09 06:06:08 +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
146 KiB
JSON
2191 lines
146 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": "المسمع IP",
|
||
"certificate": "شهادة رقمية",
|
||
"fail": "فشل",
|
||
"comment": "تعليق",
|
||
"success": "تم بنجاح",
|
||
"lastOnline": "آخر متصل",
|
||
"getVersion": "جيب النسخة",
|
||
"install": "تثبيت",
|
||
"clients": "عملاء",
|
||
"usage": "استخدام",
|
||
"twoFactorCode": "الكود",
|
||
"remained": "المتبقي",
|
||
"security": "أمان",
|
||
"secAlertTitle": "تنبيه أمني",
|
||
"secAlertSsl": "الاتصال ده مش آمن. ابعد عن إدخال معلومات حساسة لغاية ما تشغل TLS لحماية البيانات.",
|
||
"secAlertConf": "بعض الإعدادات معرضة لهجمات. ينصح بتعزيز بروتوكولات الأمان عشان تمنع الاختراقات المحتملة.",
|
||
"secAlertSSL": "البانل مش مؤمن. حمّل شهادة TLS لحماية البيانات.",
|
||
"secAlertPanelPort": "بورت البانل الافتراضي معرض للخطر. ياريت تغير لبورت عشوائي أو محدد.",
|
||
"secAlertPanelURI": "مسار URI الافتراضي للبانل مش آمن. ياريت تضبط مسار URI معقد.",
|
||
"secAlertSubURI": "مسار URI الافتراضي للاشتراك مش آمن. ياريت تضبط مسار URI معقد.",
|
||
"secAlertSubJsonURI": "مسار URI الافتراضي لاشتراك JSON مش آمن. ياريت تضبط مسار URI معقد.",
|
||
"emptyDnsDesc": "مفيش سيرفر DNS مضاف.",
|
||
"emptyFakeDnsDesc": "مفيش سيرفر Fake DNS مضاف.",
|
||
"emptyBalancersDesc": "مفيش موازن تحميل مضاف.",
|
||
"emptyReverseDesc": "مفيش بروكسي عكسي مضاف.",
|
||
"somethingWentWrong": "حدث خطأ ما",
|
||
"subscription": {
|
||
"title": "معلومات الاشتراك",
|
||
"subId": "معرّف الاشتراك",
|
||
"status": "الحالة",
|
||
"downloaded": "التنزيل",
|
||
"uploaded": "الرفع",
|
||
"expiry": "تاريخ الانتهاء",
|
||
"totalQuota": "الحصة الإجمالية",
|
||
"individualLinks": "روابط فردية",
|
||
"active": "نشط",
|
||
"inactive": "غير نشط",
|
||
"unlimited": "غير محدود",
|
||
"noExpiry": "بدون انتهاء",
|
||
"copyAllConfigs": "نسخ جميع الإعدادات",
|
||
"copyAllConfigsCopied": "تم نسخ جميع الإعدادات",
|
||
"email": "البريد"
|
||
},
|
||
"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": "قناة التطوير",
|
||
"devChannelWarning": "تتابع نسخ التطوير كل كومِت على main وليست إصدارات مستقرة — لا يوجد رجوع تلقائي لإصدار أقدم.",
|
||
"currentCommit": "الكومِت الحالي",
|
||
"latestCommit": "أحدث كومِت",
|
||
"updateChannelChanged": "تم تغيير قناة التحديث",
|
||
"upToDate": "محدث",
|
||
"xrayStatusUnknown": "مش معروف",
|
||
"xrayStatusRunning": "شغالة",
|
||
"xrayStatusStop": "متوقفة",
|
||
"xrayStatusError": "خطأ",
|
||
"xrayErrorPopoverTitle": "حصل خطأ أثناء تشغيل Xray",
|
||
"operationHours": "مدة التشغيل",
|
||
"systemHistoryTitle": "تاريخ النظام",
|
||
"historyTitleCpu": "استخدام المعالج",
|
||
"historyTitleMem": "استخدام الذاكرة",
|
||
"historyTitleNetwork": "عرض النطاق الترددي للشبكة",
|
||
"historyTitlePackets": "حزم الشبكة",
|
||
"historyTitleDisk": "إدخال/إخراج القرص",
|
||
"historyTitleOnline": "العملاء المتصلون",
|
||
"historyTitleLoad": "متوسط حمل النظام (1 / 5 / 15 دقيقة)",
|
||
"historyTitleConnections": "الاتصالات النشطة (TCP / UDP)",
|
||
"historyTitleDiskUsage": "استخدام مساحة القرص",
|
||
"historyTabBandwidth": "عرض النطاق",
|
||
"historyTabPackets": "الحزم",
|
||
"historyTabDisk": "قرص I/O",
|
||
"historyTabOnline": "متصل",
|
||
"historyTabLoad": "الحِمل",
|
||
"historyTabConnections": "الاتصالات",
|
||
"historyTabDiskUsage": "استخدام القرص",
|
||
"charts": "الرسوم البيانية",
|
||
"xrayMetricsTitle": "مقاييس Xray",
|
||
"xrayTitleHeap": "ذاكرة الكومة المخصصة",
|
||
"xrayTitleSys": "الذاكرة المحجوزة من نظام التشغيل",
|
||
"xrayTitleObjects": "كائنات الكومة النشطة",
|
||
"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 للفحص، ثم أعد تشغيل 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": "التنزيل عبر outbound (اختياري)",
|
||
"geodataFile": "اسم الملف",
|
||
"geodataAddFile": "إضافة ملف",
|
||
"geodataSaveRestart": "حفظ وإعادة تشغيل Xray",
|
||
"geodataConfirmTitle": "حفظ إعدادات geodata؟",
|
||
"geodataConfirmContent": "سيتم تحديث قالب إعدادات Xray وإعادة تشغيل Xray.",
|
||
"geodataInvalidUrl": "كل ملف يحتاج إلى رابط HTTPS.",
|
||
"geodataInvalidFile": "يجب أن يكون اسم الملف اسماً بسيطاً مثل geosite_custom.dat (بدون مسارات).",
|
||
"geodataInvalidCron": "يجب أن يتكون cron من 5 حقول، مثل 0 4 * * *",
|
||
"geodataEmpty": "لا توجد ملفات مهيأة. في قواعد التوجيه يُشار إلى الملفات بالشكل ext:geosite_custom.dat:category.",
|
||
"dontRefresh": "التثبيت شغال، متعملش Refresh للصفحة",
|
||
"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": "Fallbacks",
|
||
"help": "عند وصول اتصال إلى هذا الـ inbound لا يطابق أي عميل، يتم توجيهه إلى مكان آخر. اختر inbound فرعيًا أدناه لملء حقول التوجيه (SNI / ALPN / Path / xver) تلقائيًا من نقله، أو اترك القائمة فارغة واضبط Dest مباشرةً (مثل 8080 أو 127.0.0.1:8080) للتوجيه إلى خادم خارجي مثل Nginx. يجب أن يستمع كل inbound فرعي على 127.0.0.1 مع security=none.",
|
||
"empty": "لا توجد fallbacks بعد",
|
||
"add": "إضافة fallback",
|
||
"pickInbound": "اختر inbound",
|
||
"matchAny": "أي",
|
||
"destPlaceholder": "تلقائي (listen:port للفرع)",
|
||
"rederive": "إعادة الملء من الفرع",
|
||
"rederived": "تم إعادة الملء من الفرع",
|
||
"editAdvanced": "تحرير حقول التوجيه",
|
||
"hideAdvanced": "إخفاء المتقدم",
|
||
"quickAddAll": "إضافة سريعة لكل الـ inbounds المؤهلة",
|
||
"quickAdded": "تمت إضافة {n} fallback",
|
||
"quickAddedNone": "لا توجد inbounds جديدة مؤهلة للإضافة",
|
||
"routesWhen": "يوجَّه عندما",
|
||
"defaultCatchAll": "افتراضي — يلتقط أي شيء آخر",
|
||
"needsTls": "تصبح الـ Fallbacks متاحة بعد اختيار 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": "يعيد عدادات الإرسال/الاستقبال لهذا الإدخال إلى 0.",
|
||
"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": "سيبها فاضية لو عايز تستمع على كل الـ IPs",
|
||
"meansNoLimit": "= غير محدود. (الوحدة: GB)",
|
||
"totalFlow": "إجمالي التدفق",
|
||
"leaveBlankToNeverExpire": "سيبها فاضية عشان ماتنتهيش",
|
||
"noRecommendKeepDefault": "ننصح باستخدام الافتراضي",
|
||
"certificatePath": "مسار الملف",
|
||
"certificateContent": "محتوى الملف",
|
||
"publicKey": "المفتاح العام",
|
||
"privatekey": "المفتاح الخاص",
|
||
"clickOnQRcode": "اضغط على كود QR للنسخ",
|
||
"client": "عميل",
|
||
"export": "تصدير كل الروابط",
|
||
"clone": "استنساخ",
|
||
"cloneInbound": "استنساخ الإدخال",
|
||
"cloneInboundContent": "كل إعدادات الإدخال ده، غير البورت، IP الاستماع، والعملاء، هتتطبق على الاستنساخ.",
|
||
"cloneInboundOk": "استنساخ",
|
||
"resetAllTraffic": "إعادة ضبط ترافيك كل الإدخالات",
|
||
"resetAllTrafficTitle": "إعادة ضبط ترافيك كل الإدخالات",
|
||
"resetAllTrafficContent": "متأكد إنك عايز تعيد ضبط الترافيك لكل الإدخالات؟",
|
||
"resetInboundClientTraffics": "إعادة ضبط ترافيك العملاء",
|
||
"resetInboundClientTrafficTitle": "إعادة ضبط ترافيك العملاء",
|
||
"resetInboundClientTrafficContent": "متأكد إنك عايز تعيد ضبط ترافيك عملاء الإدخال ده؟",
|
||
"resetAllClientTraffics": "إعادة ضبط ترافيك كل العملاء",
|
||
"resetAllClientTrafficTitle": "إعادة ضبط ترافيك كل العملاء",
|
||
"resetAllClientTrafficContent": "متأكد إنك عايز تعيد ضبط ترافيك كل العملاء؟",
|
||
"delDepletedClients": "حذف العملاء اللي خلصت",
|
||
"delDepletedClientsTitle": "حذف العملاء اللي خلصت",
|
||
"delDepletedClientsContent": "متأكد إنك عايز تحذف كل العملاء اللي خلصت؟",
|
||
"email": "البريد",
|
||
"emailDesc": "ادخل إيميل فريد.",
|
||
"IPLimit": "تحديد IP",
|
||
"IPLimitDesc": "بيعطل الإدخال لو العدد زاد عن القيمة المحددة. (0 = تعطيل)",
|
||
"IPLimitlog": "سجل IP",
|
||
"IPLimitlogDesc": "سجل تاريخ الـ IPs. (عشان تفعل الإدخال بعد التعطيل، امسح السجل)",
|
||
"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 شات Telegram. (استخدم '/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": "اتبع إعادة التوجيه",
|
||
"accounts": "الحسابات",
|
||
"allowTransparent": "السماح بالشفاف",
|
||
"encryptionMethod": "طريقة التشفير",
|
||
"fakeTlsDomain": "نطاق FakeTLS (SNI)",
|
||
"mtprotoSecret": "المفتاح السري",
|
||
"mtgDomainFrontingIp": "عنوان IP لـ Domain fronting",
|
||
"mtgDomainFrontingPort": "منفذ Domain fronting",
|
||
"mtgDomainFrontingProxyProtocol": "بروتوكول PROXY لـ Domain fronting",
|
||
"mtgDomainFrontingHint": "المكان الذي يرسل إليه mtg حركة المرور غير الخاصة بتيليجرام — مثل موقع NGINX الوهمي لديك. اترك حقل IP فارغًا لاستخدام نطاق FakeTLS عبر DNS؛ المنفذ الافتراضي هو 443.",
|
||
"mtgProxyProtocolListener": "قبول بروتوكول PROXY (المستمع)",
|
||
"mtgPreferIp": "تفضيل IP",
|
||
"mtgDebug": "سجل التصحيح",
|
||
"mtgRouteThroughXray": "التوجيه عبر Xray",
|
||
"mtgRouteThroughXrayHint": "أرسل حركة Telegram لهذا البروكسي عبر Xray ليتبع قواعد التوجيه لديك. يتصل وسيط mtg عبر جسر SOCKS محلي يحمل وسم هذا الاتصال الوارد؛ استخدم ذلك الوسم في تبويب التوجيه للقواعد المتقدمة.",
|
||
"mtgRouteOutbound": "الصادر",
|
||
"mtgRouteOutboundHint": "اختياري. إجبار حركة Telegram على الخروج عبر هذا الصادر (أو الموازِن). اتركه فارغًا لتقرر قواعد التوجيه.",
|
||
"mtgRouteOutboundPlaceholder": "استخدام قواعد التوجيه",
|
||
"visionTestseed": "Vision testseed",
|
||
"version": "الإصدار",
|
||
"udpIdleTimeout": "UDP idle timeout (ثانية)",
|
||
"masquerade": "Masquerade",
|
||
"type": "النوع",
|
||
"upstreamUrl": "Upstream URL",
|
||
"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": "Multi Mode",
|
||
"maxBufferedUpload": "الحد الأقصى للرفع المخزن",
|
||
"maxUploadSize": "حجم الرفع الأقصى (بايت)",
|
||
"streamUpServer": "Stream-Up Server",
|
||
"serverMaxHeaderBytes": "أقصى بايت ترويسة الخادم",
|
||
"paddingBytes": "بايتات Padding",
|
||
"uplinkHttpMethod": "Uplink HTTP method",
|
||
"paddingObfsMode": "وضع تشويش Padding",
|
||
"paddingKey": "Padding Key",
|
||
"paddingHeader": "Padding Header",
|
||
"paddingPlacement": "موضع Padding",
|
||
"paddingMethod": "طريقة Padding",
|
||
"sessionPlacement": "Session Placement",
|
||
"sessionKey": "Session Key",
|
||
"sessionIDTable": "جدول معرّف الجلسة",
|
||
"sessionIDTableHint": "مجموعة الأحرف لتوليد معرّف الجلسة: اسم معرّف مسبقًا (ALPHABET، Base62، hex، number، …) أو سلسلة ASCII. اتركه فارغًا لاستخدام الإعداد الافتراضي لـ xray-core.",
|
||
"sessionIDLength": "طول معرّف الجلسة",
|
||
"sessionIDLengthHint": "طول أو نطاق (مثل 8-16) لمعرّف الجلسة المُولَّد. يُستخدم فقط عند تعيين جدول معرّف الجلسة؛ يجب أن يكون الحد الأدنى أكبر من 0.",
|
||
"sequencePlacement": "Sequence Placement",
|
||
"sequenceKey": "Sequence Key",
|
||
"uplinkDataPlacement": "Uplink Data Placement",
|
||
"uplinkDataKey": "Uplink Data Key",
|
||
"noSseHeader": "بدون ترويسة SSE",
|
||
"ttiMs": "TTI (ms)",
|
||
"uplinkMbps": "رفع (MB/s)",
|
||
"downlinkMbps": "تنزيل (MB/s)",
|
||
"cwndMultiplier": "معامل CWND",
|
||
"maxSendingWindow": "أقصى نافذة إرسال",
|
||
"externalProxy": "وكيل خارجي",
|
||
"forceTls": "فرض TLS",
|
||
"fingerprint": "بصمة",
|
||
"defaultOption": "افتراضي",
|
||
"routeMark": "Route Mark",
|
||
"tcpKeepAliveInterval": "TCP Keep Alive Interval",
|
||
"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": "V6 فقط",
|
||
"tcpCongestion": "TCP Congestion",
|
||
"dialerProxy": "Dialer Proxy",
|
||
"trustedXForwardedFor": "X-Forwarded-For موثوق",
|
||
"trustedXForwardedForHint": "ثِق بترويسة الطلب هذه للحصول على IP الحقيقي للعميل (مثل CF-Connecting-IP خلف CDN الخاص بـ Cloudflare). تعمل فقط على وسائل النقل 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": "احصل على IP الحقيقي للزائر عندما يصل المرور إلى هذا الـ inbound عبر CDN أو مُرحِّل، بدلاً من تسجيل عنوان الوسيط. اختر إعدادًا مسبقًا لملء حقول 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": "Cipher Suites",
|
||
"autoOption": "تلقائي",
|
||
"minMaxVersion": "إصدار أدنى/أقصى",
|
||
"rejectUnknownSni": "رفض SNI غير معروف",
|
||
"disableSystemRoot": "تعطيل System Root",
|
||
"sessionResumption": "استئناف الجلسة",
|
||
"oneTimeLoading": "تحميل لمرة واحدة",
|
||
"usageOption": "خيار الاستخدام",
|
||
"buildChain": "بناء السلسلة",
|
||
"echKey": "ECH key",
|
||
"echConfig": "تكوين ECH",
|
||
"pinnedPeerCertSha256": "SHA-256 لشهادة النظير المثبَّتة",
|
||
"pinnedPeerCertSha256Tip": "تجزئات SHA-256 لشهادة النظير كسلسلة سداسية عشرية (مثل e8e2d3…)، مفصولة بفواصل. للوحة فقط — لا تُكتب في إعدادات xray على الخادم، لكنها تُضمَّن في روابط المشاركة ليتمكَّن العملاء من تثبيت الشهادة.",
|
||
"pinnedPeerCertSha256Placeholder": "تجزئة (تجزئات) سداسية عشرية، مفصولة بفواصل",
|
||
"getNewEchCert": "احصل على شهادة ECH جديدة",
|
||
"show": "عرض",
|
||
"xver": "Xver",
|
||
"target": "الهدف",
|
||
"maxTimeDiff": "أقصى فرق زمن (ms)",
|
||
"minClientVer": "أدنى إصدار للعميل",
|
||
"maxClientVer": "أقصى إصدار للعميل",
|
||
"shortIds": "Short IDs",
|
||
"realityTargetHint": "مطلوب. يجب أن يتضمّن منفذًا (مثل example.com:443). بدون منفذ يرفض Xray-core البدء.",
|
||
"realityTargetRequired": "هدف REALITY مطلوب",
|
||
"realityTargetNeedsPort": "يجب أن يتضمّن هدف REALITY منفذًا (مثل example.com:443)",
|
||
"realityTargetInvalidPort": "هدف REALITY يحتوي على منفذ غير صالح",
|
||
"scan": "فحص",
|
||
"findTargets": "البحث عن أهداف",
|
||
"scanModalTitle": "ماسح أهداف REALITY",
|
||
"scanModalDesc": "تحقق من نطاق، أو افحص نطاق IP / CIDR لاكتشاف أهداف REALITY جديدة من شهاداتها. اترك الحقل فارغًا لفحص المرشحين الشائعين.",
|
||
"scanDiscoverPlaceholder": "IP أو CIDR أو نطاق — اتركه فارغًا للمرشحين الشائعين",
|
||
"scanStatus": "الحالة",
|
||
"scanFeasible": "مناسب",
|
||
"scanNotFeasible": "غير مناسب",
|
||
"scanCurve": "تبادل المفاتيح",
|
||
"scanCert": "الشهادة",
|
||
"scanCertInvalid": "غير موثوق",
|
||
"scanLatency": "زمن الاستجابة",
|
||
"scanUse": "استخدام",
|
||
"scanRescan": "إعادة الفحص",
|
||
"spiderX": "SpiderX",
|
||
"spiderXHint": "بذرة لكل عميل — تشتق اللوحة مسار spx فريدًا لكل عميل منها؛ أعد التوليد لتدوير مسارات الجميع",
|
||
"getNewCert": "احصل على شهادة جديدة",
|
||
"mldsa65Seed": "mldsa65 Seed",
|
||
"mldsa65Verify": "mldsa65 Verify",
|
||
"getNewSeed": "احصل على Seed جديد",
|
||
"listenHelp": "يمكنك أيضًا إدخال مسار Unix socket (مثل /run/xray/in.sock)، أو اسم socket مجرد مسبوقًا بـ @ (مثل @xray/in.sock)، للاستماع على socket بدلاً من منفذ TCP — في هذه الحالة اضبط المنفذ على 0.",
|
||
"shareAddrStrategy": "استراتيجية عنوان المشاركة",
|
||
"shareAddrStrategyHelp": "تحدد العنوان الذي يُكتب في روابط المشاركة المصدّرة ورموز QR ومخرجات الاشتراك.",
|
||
"shareAddr": "عنوان مشاركة مخصص",
|
||
"shareAddrHelp": "يُستخدم فقط عندما تكون استراتيجية عنوان المشاركة مخصصة. أدخل اسم مضيف أو عنوان IP بدون بروتوكول أو منفذ.",
|
||
"subSortIndex": "ترتيب الروابط في الاشتراك",
|
||
"subSortIndexHelp": "موضع روابط هذا الوارد في مخرجات الاشتراك (صفحة الاشتراك وتطبيقات العملاء). القيم الأقل تظهر أولاً، والقيم المتساوية تحافظ على ترتيب الإنشاء. لا يؤثر على قائمة الواردات في اللوحة.",
|
||
"shareAddrStrategyOptions": {
|
||
"node": "عنوان العقدة",
|
||
"listen": "عنوان استماع الوارد",
|
||
"custom": "مخصص"
|
||
},
|
||
"echSockopt": "ECH Sockopt",
|
||
"echSockoptTip": "خيارات السوكيت للاتصال اللي Xray بتستخدمه عشان تجيب قائمة إعدادات ECH (مثلاً توجيه الاستعلام عبر صادر dialerProxy). سيبه متعطّل عشان تستخدم الإعدادات الافتراضية.",
|
||
"curvePreferences": "تفضيلات المنحنى",
|
||
"curvePreferencesTip": "بتقصر منحنيات تبادل مفاتيح TLS اللي السيرفر بيعرضها، بترتيب الأفضلية (مثلاً X25519MLKEM768, X25519). سيبه فاضي عشان تستخدم الإعدادات الافتراضية لـ Xray-core.",
|
||
"masterKeyLog": "سجل المفتاح الرئيسي",
|
||
"masterKeyLogTip": "المسار اللي هتتكتب فيه مفاتيح TLS الرئيسية (بصيغة SSLKEYLOGFILE) عشان التصحيح باستخدام Wireshark. سيبه فاضي في الإنتاج — لإنه بيخلي أي حد عنده الملف يقدر يفك تشفير المرور.",
|
||
"verifyPeerCertByName": "التحقق من شهادة النظير بالاسم",
|
||
"verifyPeerCertByNameTip": "بيقول للعملاء يتحققوا من شهادة السيرفر مقابل الاسم ده بدل الـ SNI. الأسماء بتتفصل بفاصلة. للوحة بس — بيتضاف في روابط المشاركة (vcn). ده البديل الحديث لـ allowInsecure اللي شالته Xray بعد 2026-06-01.",
|
||
"pinFromCert": "املأ من شهادة الوارد ده",
|
||
"pinFromRemote": "اجلب الهاش عبر ping على الـ SNI (xray tls ping)",
|
||
"pinFromRemoteNoSni": "حدّد الـ SNI (serverName) الأول عشان تعمل ping للشهادة البعيدة.",
|
||
"pinFromRemoteFailed": "تعذّر جلب هاش الشهادة البعيدة.",
|
||
"limitFallback": "تحديد الـ Fallback",
|
||
"limitFallbackUpload": "تحديد رفع الـ Fallback",
|
||
"limitFallbackDownload": "تحديد تنزيل الـ Fallback",
|
||
"afterBytes": "بعد البايتات",
|
||
"afterBytesTip": "خلي الـ fallback يشتغل بالسرعة الكاملة لعدد البايتات ده، وبعدين يبدأ التحجيم. 0 = حجّم من أول بايت.",
|
||
"bytesPerSec": "بايت في الثانية",
|
||
"bytesPerSecTip": "حد السرعة (بايت/ثانية) المطبّق على مرور الـ fallback بعد العتبة، عشان الفحوصات ماتقدرش تستخدم سيرفرك كنطاق ترددي مجاني للهدف. 0 = بلا حد (بيعطّل الاتجاه ده).",
|
||
"burstBytesPerSec": "بايت في الثانية للدفقة",
|
||
"burstBytesPerSecTip": "السماح بدفقات قصيرة فوق المعدل الثابت (حجم token-bucket). لو أقل من بايت في الثانية بيترفع ليطابقه."
|
||
},
|
||
"info": {
|
||
"mode": "الوضع",
|
||
"grpcServiceName": "grpc serviceName",
|
||
"grpcMultiMode": "grpc multiMode",
|
||
"interfaceName": "اسم الواجهة",
|
||
"mtu": "MTU",
|
||
"gateway": "Gateway",
|
||
"dns": "DNS",
|
||
"outboundsInterface": "واجهة الصادر",
|
||
"autoSystemRoutes": "توجيهات نظام تلقائية",
|
||
"followRedirect": "FollowRedirect",
|
||
"auth": "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": "تجديد تلقائي بعد انتهاء الصلاحية. (0 = تعطيل) (الوحدة: يوم)",
|
||
"renewDays": "تجديد تلقائي (أيام)",
|
||
"searchPlaceholder": "ابحث بالبريد، التعليق، sub ID، UUID، كلمة المرور، auth…",
|
||
"filterTitle": "تصفية العملاء",
|
||
"clearAllFilters": "مسح الكل",
|
||
"filters": {
|
||
"nodes": "النودز",
|
||
"localPanel": "محلي (هذه اللوحة)"
|
||
},
|
||
"showingCount": "عرض {shown} من {total}",
|
||
"sortOldest": "الأقدم أولاً",
|
||
"sortNewest": "الأحدث أولاً",
|
||
"sortRecentlyUpdated": "محدّث مؤخراً",
|
||
"sortRecentlyOnline": "متصل مؤخراً",
|
||
"sortEmailAZ": "بريد A→Z",
|
||
"sortEmailZA": "بريد Z→A",
|
||
"sortMostTraffic": "الأكثر استهلاكاً",
|
||
"sortHighestRemaining": "الأعلى متبقياً",
|
||
"sortExpiringSoonest": "الأقرب انتهاءً",
|
||
"has": "يملك",
|
||
"hasNot": "لا يملك",
|
||
"title": "العملاء",
|
||
"actions": "الإجراءات",
|
||
"totalGB": "حد البيانات (جيجابايت)",
|
||
"totalGBDesc": "حصة البيانات لهذا العميل. 0 = غير محدود.",
|
||
"expiryTime": "انتهاء الصلاحية",
|
||
"addClients": "إضافة عملاء",
|
||
"limitIp": "حد عناوين IP",
|
||
"limitIpDesc": "الحد الأقصى لعناوين IP المتزامنة. 0 = غير محدود.",
|
||
"limitIpFail2banMissing": "Fail2ban غير مثبّت، لذا لا يمكن تطبيق حد عناوين IP. ثبّت Fail2ban من قائمة x-ui النصية لتفعيل هذا الخيار.",
|
||
"limitIpFail2banWindows": "Fail2ban غير متوفّر على نظام Windows، لذا لا يمكن تطبيق حد عناوين 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": "إضافة ترافيك (GB)",
|
||
"bulkFlow": "تعيين التدفق",
|
||
"bulkFlowNoChange": "بدون تغيير",
|
||
"bulkFlowDisable": "تعطيل (مسح التدفق)",
|
||
"delDepleted": "حذف المنتهية",
|
||
"delDepletedConfirmTitle": "حذف العملاء المنتهية حصصهم؟",
|
||
"delDepletedConfirmContent": "يُحذف كل عميل استُنفِدت حصة حركة مروره أو انتهت صلاحيته. لا يمكن التراجع.",
|
||
"exportClients": "تصدير العملاء",
|
||
"importClients": "استيراد العملاء",
|
||
"import": "استيراد",
|
||
"delOrphans": "حذف العملاء غير المرتبطين",
|
||
"delOrphansConfirmTitle": "حذف العملاء بلا اتصال وارد؟",
|
||
"delOrphansConfirmContent": "يزيل كل عميل غير مرتبط بأي اتصال وارد مع سجل حركة مروره. لا يمكن التراجع.",
|
||
"auth": "Auth",
|
||
"hysteriaAuth": "Hysteria Auth",
|
||
"uuid": "UUID",
|
||
"flow": "Flow",
|
||
"vmessSecurity": "أمان VMess",
|
||
"wireguardPrivateKey": "مفتاح وايرغارد الخاص",
|
||
"wireguardPublicKey": "مفتاح وايرغارد العام",
|
||
"wireguardPreSharedKey": "مفتاح وايرغارد المشترك مسبقًا",
|
||
"wireguardAllowedIPs": "عناوين IP المسموحة لوايرغارد",
|
||
"wireguardAllowedIPsHint": "اتركه فارغًا للتعيين التلقائي؛ افصل بين الإدخالات بفواصل",
|
||
"reverseTag": "وسم عكسي",
|
||
"reverseTagPlaceholder": "Reverse tag اختياري",
|
||
"telegramId": "معرّف مستخدم تلغرام",
|
||
"telegramIdPlaceholder": "معرّف مستخدم تلغرام رقمي (0 = لا شيء)",
|
||
"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 اللوحة لهذه العقدة عبر outbound 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} 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 الخاصة بالعقدة. التثبيت أو التخطّي مخصّصان للشهادات الموقّعة ذاتيًا (عُقد https فقط).",
|
||
"tlsVerify": "تحقّق (CA الافتراضية)",
|
||
"tlsPin": "تثبيت الشهادة (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. يُفضَّل تثبيت الشهادة بدلاً من ذلك.",
|
||
"pinnedCert": "SHA-256 للشهادة المثبّتة",
|
||
"pinnedCertHint": "SHA-256 لشهادة العقدة بصيغة base64 أو hex. استخدم \"جلب\" لقراءتها من العقدة الآن.",
|
||
"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": "IP الاستماع",
|
||
"panelListeningIPDesc": "عنوان IP للبانل. (سيبه فاضي عشان يستمع على كل الـ IPs)",
|
||
"panelListeningDomain": "دومين الاستماع",
|
||
"panelListeningDomainDesc": "اسم الدومين للبانل. (سيبه فاضي عشان يستمع على كل الدومينات والـ IPs)",
|
||
"panelPort": "بورت الاستماع",
|
||
"panelPortDesc": "رقم البورت للبانل. (لازم يكون بورت فاضي)",
|
||
"publicKeyPath": "مسار المفتاح العام",
|
||
"publicKeyPathDesc": "مسار ملف المفتاح العام للبانل. (يبدأ بـ '/')",
|
||
"privateKeyPath": "مسار المفتاح الخاص",
|
||
"privateKeyPathDesc": "مسار ملف المفتاح الخاص للبانل. (يبدأ بـ '/')",
|
||
"panelUrlPath": "مسار URI",
|
||
"panelUrlPathDesc": "مسار URI للبانل. (يبدأ بـ '/' وبينتهي بـ '/')",
|
||
"pageSize": "حجم الصفحة",
|
||
"pageSizeDesc": "حدد حجم الصفحة لجدول الإدخالات. (0 = تعطيل)",
|
||
"panelOutbound": "صادر ترافيك اللوحة",
|
||
"panelOutboundDesc": "بيوجه طلبات اللوحة نفسها — فحص إصدارات وتنزيلات اللوحة/Xray، تيليجرام، وتحديث ملفات geo العادي — عبر صادر Xray ده لتجاوز فلترة GitHub/تيليجرام على الخادم. وارد جسر محلي بيتضاف تلقائياً للإعداد الشغال وبيتطبق مباشرة. تحديث Geodata التلقائي الأصلي في Xray مش متأثر؛ ليه صادر تنزيل خاص بيه. اتركه فارغاً للاتصال المباشر.",
|
||
"panelOutboundPh": "اتصال مباشر",
|
||
"datepicker": "نوع التقويم",
|
||
"datepickerPlaceholder": "اختار التاريخ",
|
||
"datepickerDescription": "المهام المجدولة هتشتغل بناءً على التقويم ده.",
|
||
"oldUsername": "اسم المستخدم الحالي",
|
||
"currentPassword": "الباسورد الحالي",
|
||
"newUsername": "اسم المستخدم الجديد",
|
||
"newPassword": "الباسورد الجديد",
|
||
"telegramBotEnable": "تفعيل بوت Telegram",
|
||
"telegramBotEnableDesc": "يفعل بوت Telegram.",
|
||
"telegramToken": "رمز تيليجرام",
|
||
"telegramTokenDesc": "توكن البوت اللي جبت من '{'@'}BotFather'.",
|
||
"telegramProxy": "وكيل SOCKS",
|
||
"telegramProxyDesc": "يفعل بروكسي SOCKS5 للاتصال بـ Telegram. (اضبط الإعدادات حسب الدليل)",
|
||
"telegramAPIServer": "خادم API لتيليجرام",
|
||
"telegramAPIServerDesc": "سيرفر Telegram API المستخدم. سيبه فاضي لاستخدام الافتراضي.",
|
||
"telegramChatId": "ID شات الأدمن",
|
||
"telegramChatIdDesc": "ID شات الأدمن في Telegram. (مفصول بفواصل)(تقدر تجيبه من {'@'}userinfobot) أو (استخدم '/id' في البوت)",
|
||
"telegramNotifyTime": "وقت الإشعار",
|
||
"telegramNotifyTimeDesc": "عدد مرات إرسال البوت للتقارير الدورية. اختر فترة جاهزة، أو اختر «مخصص» لإدخال تعبير crontab.",
|
||
"notifyTime": {
|
||
"every": "@every — التكرار ضمن فترة",
|
||
"hourly": "@hourly — كل ساعة",
|
||
"daily": "@daily — كل يوم الساعة 00:00",
|
||
"weekly": "@weekly — كل أسبوع",
|
||
"monthly": "@monthly — كل شهر",
|
||
"custom": "مخصص (crontab)",
|
||
"seconds": "ثوانٍ",
|
||
"minutes": "دقائق",
|
||
"hours": "ساعات",
|
||
"interval": "الفاصل الزمني",
|
||
"unit": "الوحدة"
|
||
},
|
||
"tgNotifyBackup": "نسخة احتياطية لقاعدة البيانات",
|
||
"tgNotifyBackupDesc": "ابعت ملف النسخة الاحتياطية لقاعدة البيانات مع التقرير.",
|
||
"tgNotifyLogin": "إشعار بتسجيل الدخول",
|
||
"tgNotifyLoginDesc": "استقبل إشعار بكل محاولة تسجيل دخول للبانل مع اسم المستخدم، الـ IP، والوقت.",
|
||
"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": "إعداد عام لتمكين التوجيه (Routing) في عميل 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 التي تُضاف في بداية كل اشتراك YAML قبل MATCH,PROXY.",
|
||
"subListen": "IP الاستماع",
|
||
"subListenDesc": "عنوان IP لخدمة الاشتراك. (سيبه فاضي عشان يستمع على كل الـ IPs)",
|
||
"subPort": "بورت الاستماع",
|
||
"subPortDesc": "رقم البورت لخدمة الاشتراك. (لازم يكون بورت فاضي)",
|
||
"subCertPath": "مسار المفتاح العام",
|
||
"subCertPathDesc": "مسار ملف المفتاح العام لخدمة الاشتراك. (يبدأ بـ '/')",
|
||
"subKeyPath": "مسار المفتاح الخاص",
|
||
"subKeyPathDesc": "مسار ملف المفتاح الخاص لخدمة الاشتراك. (يبدأ بـ '/')",
|
||
"subPath": "مسار URI",
|
||
"subPathDesc": "مسار URI لخدمة الاشتراك. (يبدأ بـ '/' وبينتهي بـ '/')",
|
||
"subDomain": "دومين الاستماع",
|
||
"subDomainDesc": "اسم الدومين لخدمة الاشتراك. (سيبه فاضي عشان يستمع على كل الدومينات والـ IPs)",
|
||
"subUpdates": "فترات التحديث",
|
||
"subUpdatesDesc": "فترات تحديث رابط الاشتراك في تطبيقات العملاء. (الوحدة: ساعة)",
|
||
"subEncrypt": "تشفير",
|
||
"subEncryptDesc": "المحتوى اللي هيترجع من خدمة الاشتراك هيكون مشفر بـ Base64.",
|
||
"subURI": "مسار البروكسي العكسي",
|
||
"subURIDesc": "مسار URI لرابط الاشتراك عشان تستخدمه ورا البروكسي.",
|
||
"externalTrafficInformEnable": "تنبيه الترافيك الخارجي",
|
||
"externalTrafficInformEnableDesc": "إخطار واجهة API خارجية بكل تحديث لحركة المرور.",
|
||
"externalTrafficInformURI": "مسار تنبيه الترافيك الخارجي",
|
||
"externalTrafficInformURIDesc": "تحديثات الترافيك هتتبعت للمسار ده.",
|
||
"restartXrayOnClientDisable": "إعادة تشغيل Xray بعد التعطيل التلقائي",
|
||
"restartXrayOnClientDisableDesc": "عند تعطيل العميل تلقائيا بسبب انتهاء الصلاحية أو حد حركة المرور، أعد تشغيل Xray.",
|
||
"fragment": "تجزئة",
|
||
"fragmentDesc": "يفعل تجزئة لحزمة TLS hello.",
|
||
"fragmentSett": "إعدادات التجزئة",
|
||
"noisesDesc": "يفعل التشويش.",
|
||
"noisesSett": "إعدادات التشويش",
|
||
"trustedProxyCidrs": "CIDR وكلاء موثوقين",
|
||
"trustedProxyCidrsDesc": "IPs/CIDRs مفصولة بفواصل يُسمح لها بتعيين ترويسات 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 flag",
|
||
"flagField": "خاصية flag عامة (اختياري)",
|
||
"flagFieldDesc": "إذا تم تعيينها، تتجاوز VLESS flag — مثل shadowInactive.",
|
||
"truthyValues": "قيم Truthy",
|
||
"truthyValuesDesc": "مفصولة بفواصل؛ الافتراضي: true,1,yes,on",
|
||
"invertFlag": "عكس flag",
|
||
"invertFlagDesc": "فعّل عندما تعني الخاصية «معطل» (مثل shadowInactive).",
|
||
"syncSchedule": "جدول المزامنة",
|
||
"syncScheduleDesc": "سلسلة شبيهة بـ cron، مثل @every 1m",
|
||
"inboundTags": "وسوم الواردات",
|
||
"inboundTagsDesc": "الواردات التي يمكن لمزامنة LDAP إنشاء/حذف العملاء فيها تلقائياً.",
|
||
"noInbounds": "لم يتم العثور على واردات. أنشئ واحداً في الواردات أولاً.",
|
||
"autoCreate": "إنشاء عملاء تلقائياً",
|
||
"autoDelete": "حذف عملاء تلقائياً",
|
||
"defaultTotalGb": "الإجمالي الافتراضي (GB)",
|
||
"defaultExpiryDays": "الانتهاء الافتراضي (أيام)",
|
||
"defaultIpLimit": "حد IP الافتراضي"
|
||
},
|
||
"subFormats": {
|
||
"finalMask": "Final Mask",
|
||
"finalMaskDesc": "أقنعة finalmask في xray (TCP/UDP) وضبط QUIC تُضاف إلى كل تدفق اشتراك 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": "إعدادات MUX",
|
||
"direct": "اتصال مباشر",
|
||
"directDesc": "ينشئ اتصال مباشر مع الدومينات أو نطاقات IP لدولة معينة.",
|
||
"notifications": "الإشعارات",
|
||
"certs": "الشهادات",
|
||
"externalTraffic": "الترافيك الخارجي",
|
||
"dateAndTime": "التاريخ والوقت",
|
||
"proxyAndServer": "البروكسي والسيرفر",
|
||
"intervals": "الفترات",
|
||
"information": "المعلومات",
|
||
"profile": "الملف الشخصي",
|
||
"language": "اللغة",
|
||
"telegramBotLanguage": "لغة بوت Telegram",
|
||
"security": {
|
||
"admin": "بيانات الأدمن",
|
||
"twoFactor": "المصادقة الثنائية",
|
||
"twoFactorEnable": "تفعيل المصادقة الثنائية",
|
||
"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 (الافتراضي: 587)",
|
||
"smtpUsername": "اسم مستخدم SMTP",
|
||
"smtpUsernameDesc": "اسم المستخدم للمصادقة على SMTP",
|
||
"smtpPassword": "كلمة مرور SMTP",
|
||
"smtpPasswordDesc": "كلمة المرور للمصادقة على SMTP",
|
||
"smtpTo": "المستلمون",
|
||
"smtpToDesc": "عناوين البريد الإلكتروني للمستلمين مفصولة بفواصل",
|
||
"emailSettings": "البريد الإلكتروني",
|
||
"emailNotifications": "الإشعارات",
|
||
"smtpEventBusNotify": "إشعارات الأحداث بالبريد الإلكتروني",
|
||
"smtpEventBusNotifyDesc": "اختر الأحداث التي تُطلق إشعارات البريد الإلكتروني",
|
||
"tgEventBusNotify": "إشعارات الأحداث عبر Telegram",
|
||
"tgEventBusNotifyDesc": "اختر الأحداث التي تُطلق إشعارات Telegram",
|
||
"testSmtp": "إرسال بريد تجريبي",
|
||
"testTgBot": "إرسال رسالة تجريبية",
|
||
"eventGroupOutbound": "الصادر",
|
||
"eventGroupXray": "نواة Xray",
|
||
"eventGroupSystem": "النظام",
|
||
"eventGroupSecurity": "الأمان",
|
||
"eventGroupNode": "العقد",
|
||
"eventOutboundDown": "غير متصل",
|
||
"eventOutboundUp": "متصل",
|
||
"eventXrayCrash": "تعطّل",
|
||
"eventNodeDown": "غير متصلة",
|
||
"eventNodeUp": "متصلة",
|
||
"eventCPUHigh": "ارتفاع استخدام المعالج (%)",
|
||
"requestFailed": "فشل الطلب",
|
||
"smtpEncryption": "التشفير",
|
||
"smtpEncryptionDesc": "طريقة تشفير اتصال SMTP",
|
||
"smtpEncryptionNone": "بدون (نص عادي)",
|
||
"smtpEncryptionStartTLS": "STARTTLS",
|
||
"smtpEncryptionTLS": "TLS (ضمني)",
|
||
"smtpStageConnect": "الاتصال",
|
||
"smtpStageAuth": "المصادقة",
|
||
"smtpStageSend": "الإرسال",
|
||
"smtpTestSuccess": "تم إرسال البريد التجريبي بنجاح",
|
||
"smtpHostNotConfigured": "خادم SMTP غير مهيأ",
|
||
"smtpNoRecipients": "لا يوجد مستلمون مهيؤون",
|
||
"eventLoginAttempt": "محاولة تسجيل دخول",
|
||
"telegramTokenConfigured": "مهيأ؛ اتركه فارغاً للاحتفاظ بالتوكن الحالي.",
|
||
"telegramTokenPlaceholder": "مهيأ — أدخل توكن جديد لاستبداله",
|
||
"smtpPasswordConfigured": "مهيأة؛ اتركها فارغة للاحتفاظ بكلمة المرور الحالية.",
|
||
"smtpPasswordPlaceholder": "مهيأة — أدخل كلمة مرور جديدة لاستبدالها",
|
||
"smtpNotInitialized": "لم تتم تهيئة SMTP",
|
||
"tgBotNotEnabled": "بوت Telegram غير مفعّل",
|
||
"tgTestFailed": "فشل اختبار Telegram",
|
||
"tgTestSuccess": "تم إرسال رسالة تجريبية إلى Telegram",
|
||
"tgBotNotRunning": "بوت Telegram لا يعمل",
|
||
"smtpErrorAuth": "فشلت المصادقة — تحقق من اسم المستخدم وكلمة المرور",
|
||
"smtpErrorStarttls": "الخادم يتطلب STARTTLS — غيّر نوع التشفير",
|
||
"smtpErrorTls": "الخادم يتطلب TLS — غيّر نوع التشفير",
|
||
"smtpErrorRefused": "تم رفض الاتصال — تحقق من الخادم والمنفذ",
|
||
"smtpErrorTimeout": "انتهت مهلة الاتصال — تعذّر الوصول إلى الخادم",
|
||
"smtpErrorRelay": "الخادم يرفض الإرسال من هذا العنوان",
|
||
"smtpErrorEof": "تم إغلاق الاتصال من قبل الخادم",
|
||
"smtpErrorUnknown": "خطأ SMTP: {{ .Error }}",
|
||
"eventMemoryHigh": "ارتفاع استخدام الذاكرة (%)",
|
||
"remarkTemplate": "قالب الملاحظة",
|
||
"remarkTemplateDesc": "عند تعيينه، يحل هذا محل نموذج الملاحظة لكل رابط اشتراك — اكتب صيغتك الخاصة باستخدام رموز المتغيرات (استخدم الزر لإدراجها). اتركه فارغاً لاستخدام النموذج أعلاه.",
|
||
"validation": {
|
||
"pathLeadingSlash": "يجب أن يبدأ المسار بالرمز /"
|
||
},
|
||
"secretClear": "مسح",
|
||
"secretClearUndo": "تراجع عن المسح"
|
||
},
|
||
"xray": {
|
||
"title": "إعدادات Xray",
|
||
"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": "حظر IPs",
|
||
"blockdomains": "حظر دومينات",
|
||
"directips": "اتصالات مباشرة لـ IPs",
|
||
"directdomains": "اتصالات مباشرة للدومينات",
|
||
"ipv4Routing": "توجيه IPv4",
|
||
"ipv4RoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر IPv4.",
|
||
"warpRouting": "توجيه WARP",
|
||
"warpRoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر WARP.",
|
||
"nordRouting": "توجيه NordVPN",
|
||
"nordRoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر NordVPN.",
|
||
"Template": "قالب إعدادات Xray المتقدم",
|
||
"TemplateDesc": "ملف إعدادات Xray النهائي هيتولد بناءً على القالب ده.",
|
||
"FreedomStrategy": "استراتيجية بروتوكول الحرية",
|
||
"FreedomStrategyDesc": "اختار استراتيجية المخرجات للشبكة في بروتوكول الحرية.",
|
||
"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/...). الوسوم بتفضل ثابتة عشان تستخدمها في موازنات التحميل وقواعد التوجيه. التحديثات بتتم تلقائياً.",
|
||
"importRules": "استيراد القواعد",
|
||
"exportRules": "تصدير القواعد",
|
||
"importOutbounds": "استيراد الصادرات",
|
||
"exportOutbounds": "تصدير الصادرات",
|
||
"importInvalidJson": "JSON غير صالح — المتوقع مصفوفة أو كائن بمفتاح مطابق.",
|
||
"metricsListen": "نقطة نهاية المقاييس",
|
||
"metricsListenDesc": "بتعرض مقاييس Xray بنمط Prometheus على العنوان:المنفذ ده (مثلاً 127.0.0.1:11111). سيبه فاضي عشان تعطّله. اربطه بـ localhost وحطّ قدامه reverse-proxy — لإنه من غير مصادقة.",
|
||
"metricsTag": "وسم المقاييس",
|
||
"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": "أولوية كل قاعدة مهمة جداً!",
|
||
"completeTemplate": "الكل",
|
||
"logLevel": "مستوى السجلات",
|
||
"logLevelDesc": "مستوى السجل الخاص بالأخطاء، اللي بيوضح المعلومات المطلوبة للتسجيل.",
|
||
"accessLog": "سجل الوصول",
|
||
"accessLogDesc": "مسار ملف سجل الوصول. القيمة الخاصة 'none' بتعطل سجل الوصول.",
|
||
"errorLog": "سجل الأخطاء",
|
||
"errorLogDesc": "مسار ملف سجل الأخطاء. القيمة الخاصة 'none' بتعطل سجل الأخطاء.",
|
||
"dnsLog": "سجل DNS",
|
||
"dnsLogDesc": "لو هتسجل استعلامات DNS.",
|
||
"maskAddress": "إخفاء العنوان",
|
||
"maskAddressDesc": "إخفاء عنوان الـ IP؛ لو مفعل، هيستبدل تلقائياً عنوان IP اللي بيظهر في السجل.",
|
||
"statistics": "إحصائيات",
|
||
"statsInboundUplink": "إحصائيات رفع الإدخال",
|
||
"statsInboundUplinkDesc": "تفعيل جمع الإحصائيات لترافيك الرفع لكل بروكسي من الإدخالات.",
|
||
"statsInboundDownlink": "إحصائيات تنزيل الإدخال",
|
||
"statsInboundDownlinkDesc": "تفعيل جمع الإحصائيات لترافيك التنزيل لكل بروكسي من الإدخالات.",
|
||
"statsOutboundUplink": "إحصائيات رفع المخرجات",
|
||
"statsOutboundUplinkDesc": "تفعيل جمع الإحصائيات لترافيك الرفع لكل بروكسي من المخرجات.",
|
||
"statsOutboundDownlink": "إحصائيات تنزيل المخرجات",
|
||
"statsOutboundDownlinkDesc": "تفعيل جمع الإحصائيات لترافيك التنزيل لكل بروكسي من المخرجات.",
|
||
"connectionLimits": "حدود الاتصال",
|
||
"connectionLimitsDesc": "سياسات على مستوى الاتصال لمستوى المستخدم 0. اترك الحقل فارغًا لاستخدام القيمة الافتراضية لـ Xray.",
|
||
"connIdle": "مهلة الخمول",
|
||
"connIdleDesc": "يغلق الاتصال بعد بقائه خاملًا لهذا العدد من الثواني. خفضه يحرر الذاكرة وواصفات الملفات بشكل أسرع على الخوادم المزدحمة (الافتراضي في Xray: 300).",
|
||
"bufferSize": "حجم المخزن المؤقت",
|
||
"bufferSizeDesc": "حجم المخزن المؤقت الداخلي لكل اتصال بالكيلوبايت. اضبطه على 0 لتقليل استهلاك الذاكرة على الخوادم منخفضة الذاكرة (الافتراضي في Xray يعتمد على المنصة).",
|
||
"bufferSizePlaceholder": "تلقائي",
|
||
"seconds": "ثانية",
|
||
"rules": {
|
||
"first": "أول",
|
||
"last": "آخر",
|
||
"up": "فوق",
|
||
"down": "تحت",
|
||
"source": "المصدر",
|
||
"dest": "الوجهة",
|
||
"inbound": "إدخال",
|
||
"outbound": "مخرج",
|
||
"balancer": "موازن",
|
||
"info": "معلومات",
|
||
"add": "أضف قاعدة",
|
||
"edit": "عدل القاعدة",
|
||
"useComma": "عناصر مفصولة بفواصل"
|
||
},
|
||
"routing": {
|
||
"dragToReorder": "اسحب لإعادة الترتيب"
|
||
},
|
||
"ruleForm": {
|
||
"sourceIps": "IPs المصدر",
|
||
"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": "Redirect",
|
||
"fragment": "Fragment",
|
||
"finalRules": "القواعد النهائية",
|
||
"overrideXrayPrivateIp": "تجاوز حظر IP الخاص الافتراضي في Xray",
|
||
"blockDelay": "تأخير الحظر (ms)",
|
||
"reverseSniffing": "Sniffing عكسي",
|
||
"reserved": "محجوز",
|
||
"minUploadInterval": "أدنى فاصل رفع (ms)",
|
||
"maxUploadSizeBytes": "حجم الرفع الأقصى (بايت)",
|
||
"uplinkChunkSize": "حجم chunk الرفع",
|
||
"noGrpcHeader": "بدون ترويسة gRPC",
|
||
"maxConcurrency": "أقصى تزامن",
|
||
"maxConnections": "أقصى اتصالات",
|
||
"maxReuseTimes": "أقصى مرات إعادة استخدام",
|
||
"maxRequestTimes": "أقصى طلبات",
|
||
"maxReusableSecs": "أقصى ثوانٍ قابلة لإعادة الاستخدام",
|
||
"keepAlivePeriod": "فترة keep alive",
|
||
"authPassword": "كلمة مرور Auth",
|
||
"visionTestpre": "Vision testpre",
|
||
"serverNamePlaceholder": "اسم الخادم",
|
||
"verifyPeerName": "التحقق من اسم peer",
|
||
"pinnedSha256": "SHA256 مثبت",
|
||
"shortId": "Short ID",
|
||
"sockopts": "Sockopts",
|
||
"keepAliveInterval": "فاصل keep alive",
|
||
"markFwmark": "Mark (fwmark)",
|
||
"interface": "الواجهة",
|
||
"ipv6Only": "IPv6 فقط",
|
||
"acceptProxyProtocol": "قبول proxy protocol",
|
||
"proxyProtocol": "Proxy protocol",
|
||
"tcpUserTimeoutMs": "TCP user timeout (ms)",
|
||
"tcpKeepAliveIdleS": "TCP keep-alive idle (ثانية)"
|
||
},
|
||
"outbound": {
|
||
"addOutbound": "أضف مخرج",
|
||
"addReverse": "أضف عكسي",
|
||
"editOutbound": "عدل المخرج",
|
||
"editReverse": "عدل العكسي",
|
||
"reverseTag": "وسم العكسي",
|
||
"reverseTagDesc": "وسم الخروج لبروكسي VLESS العكسي البسيط. اتركه فارغاً لتعطيله.",
|
||
"reverseTagPlaceholder": "وسم الخروج (اتركه فارغاً للتعطيل)",
|
||
"tag": "الوسم",
|
||
"tagDesc": "تاج فريد",
|
||
"address": "العنوان",
|
||
"reverse": "عكسي",
|
||
"domain": "النطاق",
|
||
"type": "النوع",
|
||
"bridge": "Bridge",
|
||
"portal": "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": "الافتراضي 10 دقايق. المهمة اللي بتشتغل في الخلفية بتشيك بشكل متكرر؛ كل اشتراك بيعيد الجلب لما يعدّي الفاصل الخاص بيه بس.",
|
||
"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": "Baselines",
|
||
"costs": "Costs",
|
||
"balancerDesc": "ماينفعش تستخدم balancerTag و outboundTag مع بعض. لو اتستخدموا مع بعض، outboundTag هو اللي هيشتغل.",
|
||
"costMatch": "نمط الوسم",
|
||
"costValue": "الوزن",
|
||
"costRegexp": "مطابقة تعبير نمطي"
|
||
},
|
||
"wireguard": {
|
||
"secretKey": "المفتاح السري",
|
||
"publicKey": "المفتاح العام",
|
||
"allowedIPs": "عناوين IP المسموح بها",
|
||
"endpoint": "النهاية",
|
||
"psk": "المفتاح المشترك",
|
||
"domainStrategy": "استراتيجية الدومين"
|
||
},
|
||
"tun": {
|
||
"nameDesc": "اسم واجهة TUN. القيمة الافتراضية هي 'xray0'",
|
||
"mtuDesc": "وحدة النقل الأقصى. الحد الأقصى لحجم حزم البيانات. القيمة الافتراضية هي 1500",
|
||
"userLevel": "مستوى المستخدم",
|
||
"userLevelDesc": "ستستخدم جميع الاتصالات المُرسلة عبر هذا الإدخال مستوى المستخدم هذا. القيمة الافتراضية هي 0"
|
||
},
|
||
"nord": {
|
||
"accessToken": "Access token",
|
||
"privateKey": "المفتاح الخاص",
|
||
"noServers": "لم يتم العثور على خوادم للدولة المحددة",
|
||
"noPublicKey": "الخادم المحدد لا يُعلن عن مفتاح NordLynx العام.",
|
||
"outboundAdded": "تمت إضافة صادر NordVPN",
|
||
"outboundUpdated": "تم تحديث صادر NordVPN"
|
||
},
|
||
"warp": {
|
||
"changeIp": "تغيير الـ IP",
|
||
"changeIpSuccess": "تم تغيير عنوان IP الخاص بـ WARP بنجاح!",
|
||
"autoUpdateIp": "التحديث التلقائي لعنوان IP",
|
||
"intervalDays": "الفاصل الزمني (أيام)",
|
||
"intervalDesc": "0 للتعطيل. يغيّر عنوان IP تلقائيًا.",
|
||
"licenseError": "فشل تعيين رخصة WARP.",
|
||
"fetchFirst": "احصل على تكوين WARP أولاً.",
|
||
"createAccount": "إنشاء حساب WARP",
|
||
"accessToken": "Access token",
|
||
"deviceId": "معرف الجهاز",
|
||
"licenseKey": "مفتاح الرخصة",
|
||
"privateKey": "المفتاح الخاص",
|
||
"deleteAccount": "حذف الحساب",
|
||
"settings": "الإعدادات",
|
||
"licenseKeyLabel": "مفتاح رخصة WARP / WARP+",
|
||
"key": "المفتاح",
|
||
"keyPlaceholder": "مفتاح WARP+ مكوّن من 26 حرفاً",
|
||
"accountInfo": "معلومات الحساب",
|
||
"deviceName": "اسم الجهاز",
|
||
"deviceModel": "طراز الجهاز",
|
||
"deviceEnabled": "الجهاز مفعّل",
|
||
"accountType": "نوع الحساب",
|
||
"role": "الدور",
|
||
"warpPlusData": "بيانات WARP+",
|
||
"quota": "الحصة",
|
||
"usage": "الاستخدام",
|
||
"addOutbound": "إضافة صادر"
|
||
},
|
||
"dns": {
|
||
"enable": "فعل DNS",
|
||
"enableDesc": "فعل سيرفر DNS المدمج",
|
||
"tag": "تاج إدخال DNS",
|
||
"tagDesc": "التاج ده هيبقى متاح كإدخال في قواعد التوجيه.",
|
||
"clientIp": "IP العميل",
|
||
"clientIpDesc": "بيحدد موقع العميل خلال استعلامات DNS",
|
||
"disableCache": "تعطيل الكاش",
|
||
"disableCacheDesc": "بيعطل تخزين نتائج DNS مؤقتاً",
|
||
"disableFallback": "تعطيل النسخ الاحتياطي",
|
||
"disableFallbackDesc": "بيعطل استعلامات DNS الاحتياطية",
|
||
"disableFallbackIfMatch": "تعطيل النسخ الاحتياطي عند التطابق",
|
||
"disableFallbackIfMatchDesc": "بيعطل استعلامات DNS الاحتياطية لما يتحقق تطابق مع قائمة الدومينات",
|
||
"enableParallelQuery": "تفعيل الاستعلام المتوازي",
|
||
"enableParallelQueryDesc": "تفعيل استعلامات DNS المتوازية لعدة خوادم لحل أسرع",
|
||
"strategy": "استراتيجية الاستعلام",
|
||
"strategyDesc": "الاستراتيجية العامة لحل أسماء الدومين",
|
||
"add": "أضف سيرفر",
|
||
"edit": "عدل السيرفر",
|
||
"domains": "النطاقات",
|
||
"expectIPs": "العناوين المتوقعة",
|
||
"unexpectIPs": "عناوين IP غير متوقعة",
|
||
"useSystemHosts": "استخدام ملف Hosts الخاص بالنظام",
|
||
"useSystemHostsDesc": "استخدام ملف hosts من نظام مثبت",
|
||
"serveStale": "تقديم النتائج المنتهية",
|
||
"serveStaleDesc": "إرجاع نتائج الكاش المنتهية الصلاحية أثناء التحديث في الخلفية",
|
||
"serveExpiredTTL": "مدة صلاحية النتائج المنتهية",
|
||
"serveExpiredTTLDesc": "مدة صلاحية إدخالات الكاش المنتهية بالثواني؛ 0 = لا تنتهي أبدًا",
|
||
"timeoutMs": "المهلة (مللي ثانية)",
|
||
"skipFallback": "تخطي الاحتياطي",
|
||
"finalQuery": "الاستعلام النهائي",
|
||
"hosts": "Hosts",
|
||
"hostsAdd": "إضافة Host",
|
||
"hostsEmpty": "لم يتم تعريف أي Host",
|
||
"hostsDomain": "النطاق (مثل domain:example.com)",
|
||
"hostsValues": "عنوان IP أو نطاق — اكتب واضغط Enter",
|
||
"usePreset": "استخدام النموذج",
|
||
"dnsPresetTitle": "قوالب DNS",
|
||
"dnsPresetFamily": "العائلي",
|
||
"clearAll": "حذف الكل",
|
||
"clearAllTitle": "حذف جميع خوادم DNS؟",
|
||
"clearAllConfirm": "سيؤدي هذا إلى إزالة جميع خوادم DNS من القائمة. لا يمكن التراجع عن هذا الإجراء."
|
||
},
|
||
"fakedns": {
|
||
"add": "أضف Fake DNS",
|
||
"edit": "عدل Fake DNS",
|
||
"ipPool": "نطاق IP Pool",
|
||
"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 للشهادة المثبّتة",
|
||
"allowInsecure": "السماح بغير الآمن",
|
||
"echConfigList": "قائمة إعدادات ECH",
|
||
"muxParams": "Mux",
|
||
"sockoptParams": "Sockopt",
|
||
"finalMask": "Final Mask",
|
||
"vlessRoute": "مسار VLESS",
|
||
"mihomoIpVersion": "إصدار IP",
|
||
"mihomoX25519": "Mihomo X25519",
|
||
"shuffleHost": "خلط المضيف",
|
||
"tags": "وسوم",
|
||
"nodeGuids": "النودز",
|
||
"excludeFromSubTypes": "استبعاد من الصيغ",
|
||
"verifyPeerCertByName": "التحقق من شهادة النظير بالاسم"
|
||
},
|
||
"hints": {
|
||
"address": "اتركه فارغاً ليرث عنوان الوارد نفسه.",
|
||
"port": "0 يرث منفذ الوارد.",
|
||
"tags": "غير مرئي للمستخدمين النهائيين؛ يُرسل مع اشتراك RAW فقط. أحرف كبيرة وأرقام و _ و : فقط.",
|
||
"nodeGuids": "اختر النودز التي تم تحليلها من هذا المضيف. تعيين بصري فقط.",
|
||
"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": "أول 8 أحرف من الـ 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": "❗ لا يوجد سجل IP!",
|
||
"noInbounds": "❗ لم يتم العثور على أي وارد!",
|
||
"unlimited": "♾ غير محدود (إعادة تعيين)",
|
||
"add": "إضافة",
|
||
"month": "شهر",
|
||
"months": "أشهر",
|
||
"day": "يوم",
|
||
"days": "أيام",
|
||
"hours": "ساعات",
|
||
"minutes": "دقائق",
|
||
"unknown": "غير معروف",
|
||
"inbounds": "الواردات",
|
||
"clients": "العملاء",
|
||
"offline": "🔴 غير متصل",
|
||
"online": "🟢 متصل",
|
||
"commands": {
|
||
"unknown": "❗ أمر مش معروف.",
|
||
"pleaseChoose": "👇 من فضلك اختار:\r\n",
|
||
"help": "🤖 أهلا بيك في البوت! البوت ده معمول عشان يديك بيانات معينة من البانل ويسمحلك بالتعديلات.",
|
||
"start": "👋 أهلا <i>{{ .Firstname }}</i>.\r\n",
|
||
"welcome": "🤖 أهلا بيك في بوت إدارة <b>{{ .Hostname }}</b>.\r\n",
|
||
"status": "✅ البوت شغال!",
|
||
"usage": "❗ من فضلك ادخل نص للتبحث عنه!",
|
||
"getID": "🆔 الـ ID بتاعك: <code>{{ .ID }}</code>",
|
||
"helpAdminCommands": "عشان تعيد تشغيل Xray Core:\r\n<code>/restart</code>\r\n\r\nعشان تدور على إيميل عميل:\r\n<code>/usage [Email]</code>\r\n\r\nعشان تدور على إدخالات (مع إحصائيات العملاء):\r\n<code>/inbound [Remark]</code>\r\n\r\nID شات Telegram:\r\n<code>/id</code>",
|
||
"helpClientCommands": "عشان تدور على الإحصائيات، استخدم الأمر ده:\r\n\r\n<code>/usage [Email]</code>\r\n\r\nID شات Telegram:\r\n<code>/id</code>",
|
||
"restartUsage": "\r\n\r\n<code>/restart</code>",
|
||
"restartSuccess": "✅ العملية نجحت!",
|
||
"restartFailed": "❗ حصل خطأ في العملية.\r\n\r\n<code>Error: {{ .Error }}</code>.",
|
||
"xrayNotRunning": "❗ Xray Core مش شغال.",
|
||
"startDesc": "عرض القائمة الرئيسية",
|
||
"helpDesc": "مساعدة البوت",
|
||
"statusDesc": "التحقق من حالة البوت",
|
||
"idDesc": "عرض معرف Telegram الخاص بك"
|
||
},
|
||
"messages": {
|
||
"cpuThreshold": "حمل المعالج {{ .Percent }}% عدى الحد المسموح ({{ .Threshold }}%)",
|
||
"selectUserFailed": "❌ حصل خطأ في اختيار المستخدم!",
|
||
"userSaved": "✅ حفظت بيانات مستخدم Telegram.",
|
||
"loginSuccess": "✅ تسجيل الدخول للبانل تم بنجاح.\r\n",
|
||
"loginFailed": "❗️فشل محاولة تسجيل الدخول للبانل.\r\n",
|
||
"2faFailed": "فشل 2FA",
|
||
"report": "🕰 التقارير المجدولة: {{ .RunTime }}\r\n",
|
||
"datetime": "⏰ التاريخ والوقت: {{ .DateTime }}\r\n",
|
||
"hostname": "💻 المضيف: {{ .Hostname }}\r\n",
|
||
"version": "🚀 نسخة 3X-UI: {{ .Version }}\r\n",
|
||
"xrayVersion": "📡 نسخة Xray: {{ .XrayVersion }}\r\n",
|
||
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
|
||
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
|
||
"ip": "🌐 IP: {{ .IP }}\r\n",
|
||
"ips": "🔢 IPs:\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",
|
||
"expireIn": "📅 هيخلص بعد: {{ .Time }}\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": "👤 مستخدم Telegram: {{ .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": "🔑📥 الـ ID اتحدث.",
|
||
"received_password": "🔑📥 الباسورد اتحدث.",
|
||
"received_email": "📧📥 الإيميل اتحدث.",
|
||
"received_comment": "💬📥 التعليق اتحدث.",
|
||
"id_prompt": "🔑 الـ ID الافتراضي: {{ .ClientId }}\n\nادخل الـ ID بتاعك.",
|
||
"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": "ارتفاع استخدام المعالج",
|
||
"eventCPUHighDetail": "المعالج: {{ .Detail }}",
|
||
"eventLoginFallback": "فشل تسجيل الدخول من {{ .Source }}",
|
||
"memoryThreshold": "استخدام الذاكرة {{ .Percent }}% يتجاوز الحد {{ .Threshold }}%"
|
||
},
|
||
"buttons": {
|
||
"closeKeyboard": "❌ اقفل الكيبورد",
|
||
"cancel": "❌ إلغاء",
|
||
"cancelReset": "❌ إلغاء إعادة الضبط",
|
||
"cancelIpLimit": "❌ إلغاء حد الـ IP",
|
||
"confirmResetTraffic": "✅ تأكيد إعادة ضبط الترافيك؟",
|
||
"confirmClearIps": "✅ تأكيد مسح الـ IPs؟",
|
||
"confirmRemoveTGUser": "✅ تأكيد حذف مستخدم Telegram؟",
|
||
"confirmToggle": "✅ تأكيد تفعيل/تعطيل المستخدم؟",
|
||
"dbBackup": "احصل على نسخة DB",
|
||
"serverUsage": "استخدام السيرفر",
|
||
"getInbounds": "احصل على الإدخالات",
|
||
"depleteSoon": "هينتهي قريب",
|
||
"clientUsage": "استخدام العميل",
|
||
"onlines": "العملاء الأونلاين",
|
||
"commands": "الأوامر",
|
||
"refresh": "🔄 تجديد",
|
||
"clearIPs": "❌ مسح الـ IPs",
|
||
"removeTGUser": "❌ حذف مستخدم Telegram",
|
||
"selectTGUser": "👤 اختار مستخدم Telegram",
|
||
"selectOneTGUser": "👤 اختار مستخدم Telegram:",
|
||
"resetTraffic": "📈 إعادة ضبط الترافيك",
|
||
"resetExpire": "📅 تغيير تاريخ الانتهاء",
|
||
"ipLog": "🔢 سجل الـ IP",
|
||
"ipLimit": "🔢 حد الـ IP",
|
||
"setTGUser": "👤 ضبط مستخدم Telegram",
|
||
"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 }}: الـ IPs اتحدثت بنجاح.",
|
||
"TGIdRefreshSuccess": "✅ {{ .Email }}: مستخدم Telegram اتحدث بنجاح.",
|
||
"resetTrafficSuccess": "✅ {{ .Email }}: الترافيك اتظبط بنجاح.",
|
||
"setTrafficLimitSuccess": "✅ {{ .Email }}: حد الترافيك اتسجل بنجاح.",
|
||
"expireResetSuccess": "✅ {{ .Email }}: أيام الانتهاء اتظبطت بنجاح.",
|
||
"resetIpSuccess": "✅ {{ .Email }}: حد الـ IP ({{ .Count }}) اتسجل بنجاح.",
|
||
"clearIpSuccess": "✅ {{ .Email }}: الـ IPs اتمسحت بنجاح.",
|
||
"getIpLog": "✅ {{ .Email }}: سجل الـ IP اتجاب.",
|
||
"getUserInfo": "✅ {{ .Email }}: بيانات مستخدم Telegram اتجاب.",
|
||
"removedTGUserSuccess": "✅ {{ .Email }}: مستخدم Telegram اتحذف بنجاح.",
|
||
"enableSuccess": "✅ {{ .Email }}: اتفعل بنجاح.",
|
||
"disableSuccess": "✅ {{ .Email }}: اتعطل بنجاح.",
|
||
"askToAddUserId": "مافيش إعدادات ليك!\r\nاطلب من الأدمن يضيف الـ Telegram ChatID الخاص بيك في إعداداتك.\r\n\r\nالـ ChatID بتاعك: <code>{{ .TgUserID }}</code>",
|
||
"chooseClient": "اختار عميل للإدخال {{ .Inbound }}",
|
||
"chooseInbound": "اختار الإدخال"
|
||
}
|
||
},
|
||
"email": {
|
||
"subjectOutboundDown": "الصادر {{ .Tag }} غير متصل",
|
||
"subjectOutboundUp": "الصادر {{ .Tag }} متصل",
|
||
"subjectXrayCrash": "تعطّل Xray",
|
||
"subjectCPUHigh": "ارتفاع استخدام المعالج",
|
||
"subjectLoginSuccess": "نجح تسجيل الدخول",
|
||
"subjectLoginFailed": "فشل تسجيل الدخول",
|
||
"titleOutboundDown": "الصادر غير متصل",
|
||
"titleOutboundUp": "الصادر متصل",
|
||
"titleXrayCrash": "تعطّل Xray",
|
||
"titleCPUHigh": "ارتفاع استخدام المعالج",
|
||
"titleLoginSuccess": "نجح تسجيل الدخول",
|
||
"titleLoginFailed": "فشل تسجيل الدخول",
|
||
"labelStatus": "الحالة",
|
||
"labelOutbound": "الصادر",
|
||
"labelNode": "العقدة",
|
||
"labelError": "الخطأ",
|
||
"labelDelay": "التأخير",
|
||
"labelDetail": "التفاصيل",
|
||
"labelUsername": "اسم المستخدم",
|
||
"labelIP": "IP",
|
||
"labelReason": "السبب",
|
||
"labelSource": "المصدر",
|
||
"labelTime": "الوقت",
|
||
"statusCrashed": "متعطّل",
|
||
"statusRunning": "يعمل",
|
||
"statusHigh": "مرتفع",
|
||
"statusSuccess": "نجاح",
|
||
"statusFailed": "فشل",
|
||
"statusDown": "غير متصل",
|
||
"statusUp": "متصل"
|
||
}
|
||
}
|