Files
3x-ui/internal/web/translation/ar-EG.json
T
Sanaei 709b332d17 feat(hosts): managed Hosts for per-host subscription link overrides (#5409)
* test(sub): characterize current link output (externalProxy + single-link baselines)

Phase 0 of the Hosts feature. Locks current subscription-link output for the
externalProxy paths (vless/vmess/trojan/ss exact, reality/hysteria by Contains)
so the upcoming ShareEndpoint refactor can be proven behavior-preserving. These
must stay green and unedited through every later phase.

* refactor(sub): unify external-proxy link building behind ShareEndpoint (TDD, snapshot-locked)

Phase 1 of the Hosts feature. Collapse the duplicated externalProxy link
builders (param-form for vless/trojan/ss, object-form for vmess) onto a single
ShareEndpoint abstraction so Phase 4 can add Host-driven links with ~zero new
branching.

Design: an externalProxy-derived endpoint carries the original entry map and
applies it through the UNCHANGED applyExternalProxyTLS{Params,Obj} helpers, so
output is provably byte-identical. buildExternalProxyURLLinks /
buildVmessExternalProxyLinks become thin adapters; the genVless/Trojan/SS/Vmess
call sites are untouched. genHysteriaLink is deliberately left on its own path
(hex pinSHA256, not pcs). The no-externalProxy default tails are unchanged.

TDD: N1-N4 (externalProxyToEndpoint, inboundDefaultEndpoint, buildEndpointLinks,
buildEndpointVmessLinks) written failing-first against stubs, then implemented.

Mutation sanity (performed + reverted): dropping the ep-carry in
externalProxyToEndpoint makes the Phase-0 C1/C2 characterization snapshots go
red (TLS overrides vanish), proving the snapshots guard the emitted output.

Gate: go test ./internal/sub/... and go test ./... green with ZERO edits to the
Phase-0 snapshots; go build ./... green on linux and windows; go vet clean.

* feat(model): Host entity + automigrate + openapi codegen (TDD)

Phase 2 of the Hosts feature. Adds the Host GORM model: an override endpoint
attached to an inbound (address/port + TLS/transport/clash overrides + sub
scoping), superseding the legacy externalProxy array functionally while leaving
it intact.

- model.Host with snake_case column tags, json serializer for slices, text for
  free-JSON (mux/sockopt/xhttp), validate tags (remark 1-40, port 0-65535,
  security + mihomoIpVersion enums); TableName "hosts". NodeGuids column is added
  now but unused (host->node scoping deferred to v2).
- Registered in BOTH initModels() (db.go) and migrationModels() (migrate_data.go);
  the latter is required for cross-DB migration and is easy to miss. PG sequence
  resync iterates the initModels slice, so it is covered automatically.
- pruneOrphanedHosts() deletes hosts whose inbound_id has no inbound, called
  alongside pruneOrphanedClientInbounds().
- openapigen manifest: Host added to StructAllow with MuxParams/SockoptParams/
  XhttpExtraParams -> KindAny; regenerated frontend/src/generated/* + openapi.json.

TDD: TestHostTableName, TestHostValidation, TestHostAutoMigrateCreatesColumns
(+ _Postgres), TestPruneOrphanedHosts written failing-first against a wrong-name,
untagged, unregistered stub, then implemented.

Gate: go test ./... green on SQLite AND a real Postgres DSN (local container);
go build/vet/gofmt clean; npm run gen succeeds with the new Host type/schema/
example/zod; npm run typecheck + npm run test (542) green.

* feat(api): Host CRUD service + controller + routes (TDD)

Phase 3 of the Hosts feature.

- service/host.go (HostService, empty struct + database.GetDB() like
  ClientService): GetHosts, GetHostsByInbound, GetHost, AddHost (verifies the
  inbound exists — no hard FK), UpdateHost (inbound + sort order immutable here),
  DeleteHost, SetHostEnable, SetHostsEnable, DeleteHosts, ReorderHosts (single
  driver-safe transaction), GetAllTags.
- controller/host.go mirrors NodeController: routes under /panel/api/hosts
  (list/get/byInbound/tags + add/update/del/setEnable/reorder + bulk/setEnable,
  bulk/del), binds via middleware.BindAndValidate so the model validate tags are
  enforced, {success,msg,obj} envelopes.
- Wired the hosts group into api.go after nodes (inherits checkAPIAuth + CSRF).
- DelInbound now cascades: deleting an inbound deletes its hosts.
- Documented all 11 routes in api-docs endpoints.ts (referencing the generated
  Host schema) and regenerated openapi.json; extended TestAPIRoutesDocumented's
  controller->basePath switch for host.go. Backend en toast keys added.

TDD: service tests (Add/GetByInbound, RejectsUnknownInbound, Reorder, Set/Bulk
enable, DeleteHosts, DeleteInboundCascadesHosts, GetAllTags) written failing-
first against a nil-returning stub; controller test (AddListGetDelete envelope
round-trip + AuthInherited 401) added.

Gate: go test ./internal/web/... + go test ./... green; npm run gen + typecheck
+ lint + test (542) + build green.

* feat(sub): render subscription links from hosts; legacy fallback when none (TDD, mutation-checked)

Phase 4 of the Hosts feature. Inserts host resolution between inbound and link
across all three subscription formats.

Mechanism: hostEndpoints(inbound, format) loads the inbound's enabled hosts
(filtered by ExcludeFromSubTypes, ordered by sort_order then id) and projects
each onto the externalProxy entry shape the raw/json/clash renderers already
consume. So a host fans out one link/proxy reusing the exact existing rendering
(address/port/security/sni/fp/alpn/pins/ech) with zero new TLS code. Host header
and path overrides are applied additively in the raw builders (no-op for legacy
externalProxy, which never carries those keys — characterization snapshots stay
green). Clash ip-version (MihomoIpVersion) is set last on the proxy.

Integration points:
- getSubs (raw): per inbound, hostEndpoints AFTER projectThroughFallbackMaster;
  len>0 -> linkFromHosts (renders only the hosts), else legacy GetLink.
- GetJson/GetClash: inject the host endpoints into the inbound's externalProxy
  before the existing getConfig/getProxies loop.
- Precedence: hosts win over any legacy externalProxy (injection replaces it).

Backward compat: a zero-host inbound takes the legacy path -> byte-identical
output (all Phase-0 characterization snapshots unchanged).

TDD: 9 cycles (zero-hosts identical, N-links-ordered with host/path override,
disabled skipped, host-vs-externalProxy precedence, no-dedup, sort composes with
SubSortIndex, host-over-fallback, resolve-via-client-inbounds, ExcludeFromSubTypes
per format) written failing-first against unwired helpers, then wired green.

Mutation sanity (performed + reverted, documented here):
- zero-hosts fallback: flipping the len(hostEps)>0 guard to >=0 makes
  TestSub_ZeroHosts_IdenticalOutput go red (host path yields "" for no hosts).
- no-dedup: adding a remark-dedup in hostEndpoints makes TestSub_NHosts_NoDedup
  go red (two distinct hosts collapse to one link).

Gate: go test ./internal/sub/... + go test ./... green with ZERO edits to the
Phase-0 snapshots; go build green on linux and windows; go vet + gofmt clean.

* feat(migration): seed hosts from inbound externalProxy (TDD, idempotent, dual-driver)

Phase 5 of the Hosts feature. One-time migration so existing installs surface
their legacy externalProxy entries as first-class Host rows.

- seedHostsFromExternalProxy() is self-gated on a HistoryOfSeeders
  "HostsFromExternalProxy" row (run-once) and wired into runSeeders. For each
  inbound it parses StreamSettings, reads externalProxy[], and creates one Host
  per entry: forceTls->Security (unknown->same), dest->Address, port->Port,
  remark->Remark (generated when blank, capped at 40), sni/fingerprint/alpn/
  pinnedPeerCertSha256/echConfigList copied; SortOrder=index; InboundId set.
- Additive: externalProxy is left intact in StreamSettings (rollback-safe; the
  sub layer prefers hosts when present, §Phase 4).
- Postgres: GORM db.Create advances hosts_id_seq via the sequence, so no extra
  resync is needed beyond the existing startup resync.

TDD: field-mapping, idempotency (second run no-op), no-externalProxy->no-hosts,
externalProxy-kept-intact written failing-first against a stub; plus a
Postgres counterpart that skips without XUI_DB_DSN.

Gate: go test ./internal/web/service/... ./internal/database/... green on SQLite;
the *_Postgres tests green against a real Postgres container; go build green on
linux and windows; go vet + gofmt clean. (Running the whole database package
under XUI_DB_TYPE=postgres is not supported — the SQLite-path tests share the one
DSN — so only the t.Skip-gated *_Postgres tests run with the env set.)

* feat(ui): Hosts page + schema + query hooks + link preview helper (TDD on schema/helpers)

Phase 6 of the Hosts feature — the admin UI.

- schemas/api/host.ts: HostFormSchema (validation: remark 1-40, tags ^[A-Z0-9_:]+$
  ≤10×≤36, port 0-65535, security/mihomoIpVersion enums, alpn/fingerprint reused
  from the shared primitives) + a loose HostRecordSchema/HostListSchema for reads.
- lib/hosts/host-link.ts: hostToExternalProxyEntry — the frontend mirror of the
  backend hostToExternalProxyMap (security->forceTls, sni override rules, port
  inherit), for share-link previews.
- api/queries/useHostsQuery.ts + useHostMutations.ts (mirror the node hooks):
  list/get + add/update/del/setEnable/reorder/bulk; queryKeys.hosts.* added;
  mutations invalidate keys.hosts.root().
- pages/hosts/{HostsPage,HostList,HostFormModal}.tsx (+CSS) mirroring pages/nodes:
  list with remark · address:port · inbound · security · tags · enable Switch ·
  per-inbound move up/down (reorder) · bulk enable/disable/delete; form grouped
  into Basic / Advanced / Clash / Subscription-scope sections.
- Route '/hosts' + sidebar item (Global icon); menu.hosts + pages.hosts.* added to
  the en-US bundle (other locales fall back to English until translated).

TDD: HostFormSchema (10 cases) and hostToExternalProxyEntry (6 cases) written
failing-first, then implemented. UI verified by lint/typecheck/test/build.

Deferred (documented enhancement): the live in-form share-link preview (needs
inbound+client context) and a per-host host/path override in JSON/Clash output
(raw already overrides; JSON/Clash inherit the inbound's host/path).

Gate: cd frontend && npm run lint && npm run typecheck && npm run test (557) &&
npm run build all green; go build ./... + go test ./... still green.

* refactor(ui): remove the External Proxy form from the inbound stream settings

Hosts supersede the legacy externalProxy: the subscription renders from hosts
(hosts win when both exist) and the migration converts existing externalProxy
entries to hosts. externalProxy's only real consumers were the subscription
(now covered) and this form's preview — the backend per-client copy-link never
used it — so removing the editor has no functional regression.

- Drop ExternalProxyForm + toggleExternalProxy from InboundFormModal and delete
  the orphaned form component + its export; remove its block test + snapshot.
- KEEP the externalProxy schema field and backend parsing/link-generation: an
  existing inbound's externalProxy still round-trips through the form (not
  silently destroyed on edit) and still renders if a host was removed.

Gate: cd frontend && npm run typecheck + lint + test (556) + build green.

* fix(ui): use Alert `title` instead of deprecated `message` (antd 6)

Ant Design 6 deprecated <Alert message=> in favor of <Alert title=>; the panel
was mid-migration (21 Alerts already on title). Renamed the 7 remaining stragglers
across 5 files (SubLinksModal, InboundFormModal, sockopt, EmailTab, TelegramTab),
silencing the runtime deprecation warning. description= is unchanged.

Pre-existing warning, surfaced while testing Hosts — not introduced by it.

Gate: npm run typecheck + lint + test (556) + build green.

* style(ui): align Hosts page with Clients/Inbounds cards + reorder columns

- page-shell.css never listed .hosts-page, so the Hosts page got no content
  padding / transparent-layout / summary-card spacing. Add a .hosts-page shell
  block (background, dark/ultra vars, content-area + summary-card padding). This
  is the actual "card spacing" bug.
- HostList: match the Clients/Inbounds list card — hoverable + the toolbar moved
  into the card title as a .card-toolbar (Add when nothing selected; selected
  count + bulk enable/disable/delete on selection). Re-declare .card-toolbar in
  HostList.css since the shared rule lives in a lazily-loaded page stylesheet.
- Reorder table columns as requested: Actions, Enable, then Remark, Endpoint,
  Inbound, Security, Tags. Added scroll x for narrow screens.
- HostsPage: add a summary card (Total / Enabled / Disabled) like the other
  pages. New i18n keys: pages.hosts.selectedCount + pages.hosts.summary.*.

Gate: npm run typecheck + lint + test (556) + build green.

* style(ui): use Tabs instead of Collapse in the Add/Edit Host form

The Basic / Advanced / Clash / Subscription-scope sections are now tabs. Each
pane sets forceRender so all fields stay mounted — required because the form
uses preserve=false, so an unmounted tab's values would otherwise be dropped on
submit (and a required field on a hidden tab still blocks submit).

Gate: npm run typecheck + lint + test (556) + build green.

* style(ui): split Host form into Security + Advanced tabs; drop unused JSON fields

- Remove the Mux/Sockopt/XHTTP raw-JSON fields from the Host form: they were not
  wired into link generation and the inbound's structured editors are inbound-
  specific (not reusable). The DB columns + read schema + generated type stay, so
  they can get proper editors later. (HostFormSchema drops them; HostRecordSchema
  keeps them.)
- Reorganize tabs to Basic / Security / Advanced / Clash / Subscription scope:
  Security holds the TLS/cert fields (security, sni, sni-overrides, alpn,
  fingerprint, pins, verify-by-name, ech); Advanced now holds the transport
  overrides (host header, path).
- i18n: add pages.hosts.sections.security; drop the 3 unused field labels.

Gate: npm run typecheck + lint + test (556) + build green.

* style(ui): restore Mux/Sockopt/XHTTP fields in the Host Advanced tab

Put the three free-JSON override fields back, in the Advanced tab next to host
header / path (as JSON inputs — the inbound's structured editors aren't reusable
here). Re-added to HostFormSchema + defaults + the i18n labels.

Gate: npm run typecheck + lint + test (556) + build green.

* feat(hosts): add allowInsecure (rendered) + serverDescription/mihomoX25519/vlessRouteId fields

Closes most of the Remnawave-host gap analysis.

- model.Host: + allowInsecure, serverDescription (≤64), vlessRouteId (0-65535),
  mihomoX25519. Auto-migrated (SQLite + Postgres verified); openapi regenerated.
- allowInsecure is fully RENDERED into subscription output (TDD):
  - raw link: allowInsecure=1 (TLS/Reality, skipped for none) via the endpoint
    builder;
  - JSON/Clash: applyExternalProxyTLSToStream writes tlsSettings.settings.
    allowInsecure, and clash applySecurity now emits skip-cert-verify for the tls
    case (it previously only did so for Hysteria — a pre-existing gap, so inbound
    allowInsecure now renders for vless/trojan/ss clash too).
- Frontend: the four fields added to the Host form (allowInsecure → Security,
  serverDescription → Basic, vlessRouteId → Advanced, mihomoX25519 → Clash);
  serverDescription shown under the remark in the list. Schema + i18n updated.

serverDescription / vlessRouteId / mihomoX25519 are stored + editable; their
deeper rendering (and per-host mux/sockopt/xhttp into JSON/Clash, plus a per-host
xray JSON template) are tracked as follow-ups.

Gate: go test ./... green (SQLite + Postgres for the host schema/migration);
go build linux+windows; go vet + gofmt clean; npm run gen + typecheck + lint +
test (556) + build green; generated files in sync.

* feat(sub): render host sockopt + xhttp-extra params into JSON/Clash output (TDD)

A host's sockoptParams and xhttpExtraParams (free-JSON) now take effect:
applyHostStreamOverrides injects sockopt into the per-host stream (re-added since
the base stream strips it) and merges xhttpExtraParams into xhttpSettings, called
in both getConfig (JSON) and getProxies (Clash) right after the per-host TLS
apply. No-op for legacy externalProxy entries (keys absent) — characterization
snapshots unchanged.

mux rendering is outbound-level (overrides outbound.Mux) and needs a genVless/
genVnext/genServer signature change — deferred, along with the per-host xray
JSON template.

Gate: go test ./internal/sub/... + go test ./... green (snapshots unchanged);
go build + vet + gofmt clean.

* feat(sub): render host muxParams as a per-host JSON outbound mux override (TDD)

genVnext/genVless/genServer take a muxOverride: a host's muxParams (when valid
JSON) overrides the global mux on its JSON outbound; empty falls back to the
panel mux (behavior unchanged for non-host configs). Completes the host
mux/sockopt/xhttp trio. Test call sites updated for the new signature.

Gate: go test ./internal/sub/... + go test ./... green (snapshots unchanged);
go build + gofmt clean.

* style(ui): show Host security fields conditionally per security (like externalProxy)

* feat(sub): apply host SNI + fingerprint override for reality (TDD)

A reality host now overrides SNI and fingerprint while inheriting publicKey/
shortId from the inbound (reality keys can't be host-supplied). Previously the
reality link kept the inbound's serverName because the TLS appliers are gated to
security=="tls".

- raw: applyEndpointRealityParams sets sni/fp on the params for reality;
- JSON/Clash: applyHostStreamOverrides sets realitySettings.serverName +
  serverNames from the host SNI.

Gated to host endpoints via an isHost marker on the synthesized ep, so the legacy
externalProxy path stays byte-identical (characterization snapshots unchanged).
The marker is internal and never emitted.

Gate: go test ./internal/sub/... + go test ./... green; go build + vet + gofmt clean.

* fix(ui): start the Host inbound select unselected instead of showing 0

A new host left inboundId defaulting to 0, so the Select rendered "0". inboundId
is now optional in the form (undefined until chosen), so it shows its
placeholder ("Select an inbound"); the required rule still enforces a choice on
save. Port keeps 0 (means "inherit the inbound's port").

Gate: npm run typecheck + lint + build green.

* fix(ui): drop redundant :port suffix from the Host inbound select label

The inbound tag (e.g. in-59303-tcp) already carries the port, so the appended
":59303" was duplicated. Show just the remark/tag.

Gate: npm run typecheck + lint + build green.

* style(ui): apply the shared card hover shadows to the Hosts page

page-cards.css scoped its card styling + hover shadows to each page class but
not .hosts-page, so Hosts fell back to antd's default hoverable (a larger/blurry
shadow + pointer cursor). Add a .hosts-page block matching the other pages.

Gate: npm run build green.

* feat(hosts): move Tags to Basic tab, add Nodes field, accept VLESS route ranges

- Move the Tags field into the Host form's Basic tab and add a Nodes
  multi-select (visual-only assignment, backed by the existing node_guids
  column) so the Basic tab matches the reference layout.
- Replace the single-port vlessRouteId integer with a free-form vlessRoute
  string that accepts comma-separated ports/ranges (e.g. 53,443,1000-2000);
  format-validated on the frontend, stored verbatim on the backend.
- Regenerated frontend types/openapi from the changed model.

* feat(hosts): structured editors for Mux/Sockopt/XHTTP + new Final Mask

Replace the raw JSON textareas in the Host form's Advanced tab with the same
structured editors used elsewhere, under a nested tabbed layout (General / Mux /
Sockopt / XHTTP / Final Mask), mirroring the Sub-JSON settings tab:

- Mux: the Sub-JSON mux editor (enable + concurrency/xudpConcurrency/xudp443).
- Sockopt + XHTTP: reuse the outbound SockoptForm / XhttpForm, wrapped in an
  isolated form that serializes the edited subtree back to the host's JSON
  string (pruned so the override stays sparse).
- Final Mask: new host field (model + column + JSON-render wiring that merges
  the masks into the host's JSON-subscription stream), edited via the shared
  FinalMaskForm like the Sub-JSON Final Mask editor.

Each editor stays a controlled value/onChange component bound to its existing
host JSON string field; backend rendering of mux/sockopt/xhttp is unchanged.

* feat(hosts): drop XHTTP + Xray-JSON-template overrides; fix mobile form layout

Remove the host's XHTTP extra-params and Xray-JSON-template overrides entirely
(model fields + columns, JSON-subscription render paths incl. hostTemplateOutbound,
schema, form tab/field, i18n, openapi codegen, and their tests) — they did not
fit the host model. Mux, Sockopt and Final Mask stay as structured editors.

Mobile fixes for the Edit Host modal:
- responsive width (95vw on mobile, was a fixed 760px that overflowed the
  viewport and clipped the tabs/labels) + a scrollable body so the footer stays
  on screen;
- Mux fields use responsive Row/Col (stack on mobile) instead of a fixed-width
  label grid.

* fix(hosts): hide the spurious horizontal scrollbar in the Edit Host modal

Setting overflowY:auto on the modal body forced overflow-x to auto too (CSS
rule), so antd Row's negative gutter margins triggered a horizontal scrollbar.
Pin overflowX:hidden.

* feat(hosts): inbound-style responsive field layout + icon empty state

- Host form (main form + Mux/Sockopt/Final Mask editors) now use the inbound
  form's label layout: label beside the input on desktop (labelCol sm span 8 /
  wrapperCol sm span 14, right-aligned), stacked label-above-input on mobile.
  Rewrote HostMuxForm onto an internal antd Form so it follows the same layout
  instead of a manual grid.
- Empty hosts table now shows the host icon + the shared 'Nothing here yet'
  (noData) text, matching Nodes/Inbounds/Clients, replacing the bespoke
  'No hosts yet…' string.

* fix(hosts): avoid nested <form> in the Edit Host modal

The Mux/Sockopt/Final Mask editors each render their own antd Form inside the
host's main Form, producing an invalid nested <form> DOM node (hydration
warning). Render those inner forms with component={false} so they keep the form
instance/context but emit no <form> element.

* fix(hosts): make the Mux enable toggle work

The Switch's checked state came from Form.useWatch('mux'), but the mux object
field had no registered Form.Item while disabled, so setFieldValue never
notified the watcher and the toggle stayed off. Bind the Switch to a real
name='enabled' field (antd drives its checked state directly) and keep the
sub-fields registered via hidden={!enabled}, serialized to the flat mux JSON.

* refactor(hosts): reuse the outbound MuxForm instead of a bespoke Mux editor

The Mux fields duplicated the outbound MuxForm. Reuse it through the same
wrapper as Sockopt: generalize OutboundSubtreeJsonForm with defaultSubtree
(pre-fill on enable) and a serialize hook, and have HostMuxForm render MuxForm
at the ['mux'] path. The host keeps its inherit-when-off semantics by storing ''
unless mux.enabled. Also drops the now-unused enableSwitch path from the
wrapper (only the removed XHTTP editor used it).

* style(hosts): use default-width Port input like the inbound form

The host Port used width:100% (full width); the inbound's numeric inputs use
antd's default width. Drop the override so Port matches. The Mux number inputs
already use the default width via the reused MuxForm.

* refactor(sockopt): readable customSockopt editor as a shared component

The customSockopt rows were a single cramped Space.Compact line and duplicated
verbatim in the inbound and outbound sockopt forms. Extract a shared
CustomSockoptList that renders each entry as a titled group of labeled fields
(System / Level / Opt / Type / Value), matching the rest of the form, and use it
in both (and thus the host Sockopt editor).

* fix(finalmask): drop the empty Custom Tables tag on a new sudoku mask

The sudoku TCP-mask default seeded customTables: [''] (one empty string), which
rendered as a blank removable tag. Seed [] instead.

* fix(sockopt): make the outbound (and host) Sockopt client-only

Per the XTLS sockopt docs, tproxy / acceptProxyProtocol / V6Only /
trustedXForwardedFor only apply to an inbound (listening socket); they are
meaningless on an outbound/dialer. Drop them from the outbound SockoptForm
(which the host reuses). The Sockopt default object still seeds those keys, so
the host also strips them on serialize, keeping its override honest to the
server/client split. The inbound SockoptForm is left unchanged.

* fix(sockopt): make the inbound Sockopt server-only

Complete the server/client split: drop the outbound/dialer-only fields from the
inbound SockoptForm — dialerProxy, domainStrategy, interface, addressPortStrategy,
happyEyeballs, tcpMptcp (client-only since Go 1.24 auto-enables MPTCP on listen).
mark stays (xray applies SO_MARK on inbound sockets too). Update the form-blocks
snapshot to the server-side field set (intentional spec change).

* feat(hosts): populate Sockopt dialerProxy with the panel's outbound tags

The host Sockopt editor reused the outbound SockoptForm with outboundTags=[],
so the dialerProxy dropdown was empty. Feed it the panel's outbound tags via
the existing useOutboundTags hook (shares the cached xray-config query;
blackhole excluded), so a host can chain through a subscription outbound by tag.

* fix(hosts): empty-state styling on direct load + exclude balancers from dialerProxy

- .card-empty was only defined in lazily-loaded Clients/Inbounds/Nodes
  stylesheets, so a direct /hosts refresh rendered the empty table state
  unstyled (faint + uncentered) until another page was visited. Re-declare it
  in HostList.css so it's correct on first load.
- The Sockopt dialerProxy dropdown listed balancer tags (useOutboundTags merges
  them in for mtproto egress). dialerProxy chains a single outbound, so balancers
  aren't valid — switch to useOutboundTagGroups and use only the outbound group.

* fix(outbounds): icon + 'Nothing here yet' empty state; stop fading other pages

The Outbounds empty state was a faint '—', and OutboundsTab.css set the global
.card-empty to opacity:0.4 — which leaked onto whichever page's empty state was
shown after the Outbounds CSS had loaded (e.g. Hosts went faint after visiting
Outbounds). Render the icon + noData ('Nothing here yet') like the other lists,
and align .card-empty to the shared centered/secondary style (no opacity).

* fix(outbounds): custom empty state on the desktop table too

The desktop Outbounds Table had no locale.emptyText, so it showed antd's
default 'No data' box. Add the same ExportOutlined + noData empty state as the
card (mobile) view.

* style(sidebar): use ExportOutlined for the Outbounds nav item

The Outbounds sidebar item used UploadOutlined (an upload tray). Switch to
ExportOutlined, matching the outbound icon now used in the routing target and
the outbounds empty states.

* feat(hosts): icons on the form tabs (icon-only on mobile)

Wrap every Host form tab label (Basic/Security/Advanced/Clash/Subscription
scope and the nested General/Mux/Sockopt/Final Mask) with catTabLabel, so the
tabs show icon + text on desktop and just the icon (with a tooltip) on mobile,
matching the Settings/Xray tab bars.

* refactor(hosts): fold Exclude-from-formats into Advanced, drop the one-field tab

The Subscription scope tab held only excludeFromSubTypes after Tags moved to
Basic — a niche per-format scoping knob. Move it into the Advanced > General
sub-tab and remove the standalone tab (and its now-unused subScope label/icon).

* feat(sub): per-client remark template variables; drop the remark model & Show Usage Info

* fix(migration): cap seeded host remark at the model's 256-char limit, not 40
2026-06-17 12:06:55 +02:00

1904 lines
124 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"username": "اسم المستخدم",
"password": "الباسورد",
"login": "تسجيل الدخول",
"confirm": "تأكيد",
"cancel": "إلغاء",
"close": "إغلاق",
"save": "حفظ",
"logout": "تسجيل خروج",
"create": "إنشاء",
"add": "إضافة",
"remove": "إزالة",
"update": "تحديث",
"copy": "نسخ",
"copied": "اتنسخ",
"more": "المزيد",
"download": "تحميل",
"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": "تم نسخ جميع الإعدادات"
},
"menu": {
"theme": "الثيم",
"dark": "داكن",
"ultraDark": "داكن جدًا",
"dashboard": "نظرة عامة",
"inbounds": "الواردات",
"clients": "العملاء",
"groups": "المجموعات",
"nodes": "النودز",
"settings": "إعدادات اللوحة",
"xray": "إعدادات Xray",
"apiDocs": "توثيق API",
"logout": "تسجيل خروج",
"link": "إدارة",
"donate": "تبرع"
},
"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": "البانل محدث لآخر إصدار",
"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": "بدأ تحديث البانل",
"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": "السجلات",
"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",
"vlessAuthMlkem768": "مصادقة ML-KEM-768",
"vlessAuthCustom": "مخصص",
"vlessAuthSelected": "المحدد: {auth}",
"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.",
"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",
"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. اتركها فارغة لتجاهل ترويسات التمرير.",
"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": "تجزئة (تجزئات) سداسية عشرية، مفصولة بفواصل",
"generateRandomPin": "إنشاء تجزئة عشوائية",
"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 يحتوي على منفذ غير صالح",
"spiderX": "SpiderX",
"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": "مخصص"
}
},
"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": "رأس الرد"
}
}
},
"clients": {
"tabBasics": "أساسي",
"tabCredentials": "بيانات الاعتماد",
"tabLinks": "الروابط",
"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 = غير محدود.",
"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": "روابط الاشتراك",
"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)",
"delDepleted": "حذف المنتهية",
"delDepletedConfirmTitle": "حذف العملاء المنتهية حصصهم؟",
"delDepletedConfirmContent": "يُحذف كل عميل استُنفِدت حصة حركة مروره أو انتهت صلاحيته. لا يمكن التراجع.",
"auth": "Auth",
"hysteriaAuth": "Hysteria Auth",
"uuid": "UUID",
"flow": "Flow",
"vmessSecurity": "أمان VMess",
"reverseTag": "وسم عكسي",
"reverseTagPlaceholder": "Reverse tag اختياري",
"telegramId": "معرّف مستخدم تلغرام",
"telegramIdPlaceholder": "معرّف مستخدم تلغرام رقمي (0 = لا شيء)",
"created": "تاريخ الإنشاء",
"updated": "تاريخ التحديث",
"ipLimit": "حد IP",
"toasts": {
"deleted": "تم حذف العميل",
"trafficReset": "تمت إعادة ضبط حركة المرور",
"allTrafficsReset": "تمت إعادة ضبط حركة مرور كل العملاء",
"bulkDeleted": "تم حذف {count} عميل",
"bulkDeletedMixed": "تم حذف {ok}, وفشل {failed}",
"bulkCreated": "تم إنشاء {count} عميل",
"bulkCreatedMixed": "تم إنشاء {ok}, وفشل {failed}",
"bulkAdjusted": "تم تعديل {count} عميل",
"bulkAdjustedMixed": "{ok} تم تعديلهم، {skipped} تم تخطيهم",
"delDepleted": "تم حذف {count} عميل منتهٍ"
}
},
"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": "يصفر up/down لجميع {count} عميل في هذه المجموعة.",
"resetSuccess": "تمت إعادة تعيين حركة المرور لـ {count} عميل.",
"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": "كل عقدة محددة ستنزّل أحدث إصدار وتعيد التشغيل عليه. يتم تحديث العقد المفعّلة والمتصلة فقط.",
"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": "ساعات"
},
"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)",
"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)",
"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 }}"
},
"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/...). الوسوم بتفضل ثابتة عشان تستخدمها في موازنات التحميل وقواعد التوجيه. التحديثات بتتم تلقائياً.",
"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 عكسي",
"workers": "Workers",
"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": "الحمل"
},
"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": "فشل الحذف"
},
"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 هو اللي هيشتغل."
},
"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": "حجم المجموعة"
}
}
},
"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 }}"
},
"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": "متصل"
}
}