mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-05-31 10:14:15 +00:00
* chore(frontend): add react+typescript toolchain alongside vue
Step 0 of the planned vue->react migration. React 19, antd 5, i18next
+ react-i18next, typescript 5, and @vitejs/plugin-react 6 are added as
dev/runtime deps alongside the existing vue stack. Both frameworks
coexist in the build until the last entry flips.
* vite.config.js: react() plugin runs next to vue(); new manualChunks
for vendor-react / vendor-antd-react / vendor-icons-react /
vendor-i18next. Existing vue chunks unchanged.
* eslint.config.js: typescript-eslint + eslint-plugin-react-hooks
rules scoped to *.{ts,tsx}; vue config untouched for *.{js,vue}.
* tsconfig.json: strict, jsx: react-jsx, moduleResolution: bundler,
allowJs: true (lets .tsx files import the remaining .js modules
during incremental migration), @/* path alias.
* env.d.ts: Vite client types + window.X_UI_BASE_PATH typing +
SubPageData shape consumed by the subscription page.
Vite stays pinned at 8.0.13 per the existing project policy. No
existing .vue/.js source files touched in this step.
eslint-plugin-react (not -hooks) is not included because its latest
release does not yet support ESLint 10. react-hooks/purity covers
the safety-critical case; revisit when the plugin updates.
* refactor(frontend): port subpage to react+ts
Step 1 of the planned vue->react migration. The standalone
subscription page (sub/sub.go renders the HTML host; React mounts
into #app) is the first entry off vue.
Introduces two shared pieces both entries (and future ones) will
use:
* src/hooks/useTheme.tsx — React Context + useTheme hook + the
same buildAntdThemeConfig (dark/ultra-dark token overrides) and
pauseAnimationsUntilLeave helper the vue version exposes. Same
localStorage keys (dark-mode, isUltraDarkThemeEnabled) and DOM
side effects (body.className, html[data-theme]) so the two stay
in sync across the coexistence period.
* src/i18n/react.ts — i18next + react-i18next loader that reads
the same web/translation/*.json files via import.meta.glob. The
vue-i18n setup in src/i18n/index.js is untouched and still serves
the remaining vue entries.
SubPage.tsx mirrors the vue version's behavior: reads
window.__SUB_PAGE_DATA__ injected by the Go sub server, renders QR
codes / descriptions / Android+iOS deep-link dropdowns, supports
theme cycle and language switch. Uses AntD v5 idioms: Descriptions
items prop, Dropdown menu prop, Layout.Content.
* refactor(frontend): port login to react+ts
Step 2 of the planned vue->react migration. The login entry is the
first to exercise AntD React's Form API (Form + Form.Item with
name/rules + onFinish) and the existing axios/CSRF interceptors
under React.
* LoginPage.tsx: same form fields, conditional 2FA input,
rotating headline ("Hello" / "Welcome to..."), drifting blob
background, theme cycle + language popover. Headline transition
switches from vue's <Transition mode=out-in> to a CSS keyframe
animation keyed off the visible word.
* entries/login.tsx: setupAxios() + applyDocumentTitle() unchanged
from the vue entry — both are framework-agnostic in src/utils
and src/api/axios-init.js.
useTheme hook, ThemeProvider, and i18n/react.ts loader introduced
in step 1 are now shared across two entries; Vite extracts them as
a small chunk in the build output.
* refactor(frontend): port api-docs to react+ts
Step 3 of the planned vue->react migration. The five api-docs files
(ApiDocsPage, CodeBlock, EndpointRow, EndpointSection, plus the
data-only endpoints.js) all move to react+ts.
Also introduces components/AppSidebar.tsx — api-docs is the first
authenticated page to need it. AppSidebar.vue stays in place for the
six remaining vue entries (settings, inbounds, clients, xray, nodes,
index); each gets switched to AppSidebar.tsx as its entry migrates.
After the last entry flips, AppSidebar.vue is deleted.
Notable transformations:
* The scroll observer that highlights the active TOC link is a
useEffect keyed on sections — re-registers whenever the visible
set changes (search filter narrows it). Same behaviour as the vue
watchEffect.
* v-html="safeInlineHtml(...)" becomes
dangerouslySetInnerHTML={{ __html: safeInlineHtml(...) }}. The
helper still escapes everything except <code> tags.
* JSON syntax highlighter in CodeBlock is unchanged — pure regex on
the escaped string, then rendered via dangerouslySetInnerHTML.
* endpoints.js stays as JS (allowJs in tsconfig); only the consumer
signatures (Endpoint, Section) are typed at the React boundary.
* AppSidebar reuses pauseAnimationsUntilLeave + useTheme from
step 1. Drawer + Sider keyed off the same localStorage flag
(isSidebarCollapsed) and DOM theme attributes the vue version
uses, so the two stay in sync during coexistence.
* refactor(frontend): port nodes to react+ts
Step 4 of the planned vue->react migration. The nodes entry brings in
the largest shared-infrastructure batch so far — every authenticated
react page from here on can lean on these.
New shared pieces (live alongside their .vue counterparts during
coexistence):
* hooks/useMediaQuery.ts — useState + resize listener
* hooks/useWebSocket.ts — wraps WebSocketClient, subscribes on mount
and unsubscribes on unmount. The underlying client is a single
module-level instance so multiple components on the same page
share one socket.
* hooks/useNodes.ts — node list state + CRUD + probe/test, including
the totals memo (online/offline/avgLatency) used by the summary card.
applyNodesEvent is the entry point for the heartbeat-pushed list.
* components/CustomStatistic.tsx — thin Statistic wrapper, prefix +
suffix slots become props.
* components/Sparkline.tsx — the SVG line chart with measured-width
axis scaling, gradient fill, tooltip overlay, and per-instance
gradient id from React.useId. ResizeObserver lifecycle is in
useEffect; the math is unchanged.
Pages:
* NodesPage — wires hooks + WebSocket together, renders summary card
+ NodeList, hosts the form modal. Uses Modal.useModal() for the
delete confirm so the dialog inherits ConfigProvider theming.
* NodeList — desktop renders a Table with expandable history rows;
mobile flips to a vertical card list whose actions live in a
bottom-right Dropdown. The IP-blur eye toggle persists across both.
* NodeFormModal — controlled form (useState object, single setForm
per change). The reset-on-open effect computes the next state
once and applies it with eslint-disable to satisfy the new
react-hooks/set-state-in-effect rule on a legitimate pattern.
* NodeHistoryPanel — polls /panel/api/nodes/history/{id}/{metric}/
{bucket} every 15s, renders cpu+mem sparklines side-by-side.
* refactor(frontend): port settings to react+ts
Step 5 of the planned vue->react migration. Settings is the first
entry whose state model didn't translate to the Vue-style "parent
passes a reactive object, children mutate it in place" pattern, so
the React port flips it to lifted state + a typed updateSetting
patch function.
* models/setting.ts — typed AllSetting class with the same field
defaults and equals() behavior the vue version had. The .js
twin is deleted; nothing else imported it.
* hooks/useAllSetting.ts — owns allSetting + oldAllSetting state,
exposes updateSetting(patch), saveDisabled is derived via useMemo
off equals() (no more 1Hz dirty-check timer).
* components/SettingListItem.tsx — children-based wrapper instead
of named slots. The vue twin stays alive because xray (BasicsTab,
DnsTab) still imports it; deleted when xray migrates.
The five tab components and the TwoFactorModal each accept
{ allSetting, updateSetting } and render with AntD v5's Collapse
items[] API. Every v-model:value="x" became
value={...} onChange={(e) => updateSetting({ key: e.target.value })}
or onChange={(v) => updateSetting({ key: v })} for non-input
controls.
SubscriptionFormatsTab is the trickiest — fragment / noises[] /
mux / direct routing rules are stored as JSON-encoded strings on
the wire. Parsing them once via useMemo per field, mutating the
parsed object on edit, and stringifying back into the patch keeps
the round-trip identical to the vue version.
SettingsPage hosts the tab navigation (with hash sync), the
save / restart action bar, the security-warnings alert banner,
and the restart flow that rebuilds the panel URL after the new
host/port/cert settings take effect.
* refactor(frontend): port clients to react+ts
Step 6 of the planned vue->react migration. Clients is the biggest
data-CRUD page in the panel (1.1k-line ClientsPage, 4 modals, full
table + mobile card list, WebSocket-driven realtime traffic + online
updates).
New shared infra (lives alongside vue twins until inbounds migrates):
* hooks/useClients.ts — clients + inbounds list, CRUD + bulk delete +
attach/detach + traffic reset, with WebSocket event handlers
(traffic, client_stats, invalidate) and a small debounced refresh
on the invalidate event. State managed via setState; the live
client_stats event merges traffic snapshots row-by-row through a
ref to avoid stale closure issues.
* hooks/useDatepicker.ts — singleton "gregorian"/"jalalian" cache
with subscribe/notify so multiple components can read the panel's
Calendar Type without re-fetching. Mirrors useDatepicker.js.
* components/DateTimePicker.tsx — AntD DatePicker wrapper.
vue3-persian-datetime-picker has no React port; the Jalali UI
calendar is deferred (read-only Jalali display via IntlUtil
formatDate still works). The vue twin stays for inbounds.
* pages/inbounds/QrPanel.tsx — copy/download/copy-as-png QR helper
shared between clients (qr modal) and inbounds (still on vue).
Vue twin stays alive at QrPanel.vue.
* models/inbound.ts — slim port: only the TLS_FLOW_CONTROL constant
the clients form needs. The full inbound model stays as
inbound.js for now; inbounds will pull it in as inbound.ts.
The clients page itself uses Modal.useModal() for all confirm
dialogs (delete, bulk-delete, reset-traffic, delDepleted, reset-all)
so the dialogs render themed. Filter state persists to
localStorage under clientsFilterState. Sort + pagination state is
local; pageSize seeds from /panel/setting/defaultSettings.
The four modals share a controlled "open/onOpenChange" pattern
that replaces vue's v-model:open. ClientFormModal computes
attach/detach diffs from the inbound multi-select on submit; the
parent's onSave callback routes them through useClients's attach()/
detach() after the main update succeeds.
ESLint config: turned off four react-hooks v7 rules
(react-compiler, preserve-manual-memoization, set-state-in-effect,
purity). They're all React-Compiler-driven informational rules; we
don't run the compiler and the patterns they flag (initial-fetch
useEffect, derived computations using Date.now, inline arrow event
handlers) are all idiomatic React. Disabling globally instead of
per-line keeps the diff readable.
* refactor(frontend): port index dashboard to react+ts
Step 7 of the Vue→React migration. Ports the overview/index entry: dashboard
page, status + xray cards, panel-update / log / backup / system-history /
xray-metrics / xray-log / version modals, and the custom-geo subsection. Adds
the shared JsonEditor (CodeMirror 6) and useStatus hook used by the config
modal. Removes the unused react-hooks/set-state-in-effect disables now that
the rule is off globally.
* refactor(frontend): port xray to react+ts
Step 8 of the Vue→React migration. Ports the xray config entry: page shell,
basics/routing/outbounds/balancers/dns tabs, the rule + balancer + dns server
+ dns presets + warp + nord modals, the protocol-aware outbound form, and the
shared FinalMaskForm (TCP/UDP masks + QUIC params). Adds useXraySetting that
mirrors the legacy two-way sync between the JSON template string and the
parsed templateSettings tree. The outbound model itself stays in JS so the
class-driven form keeps its existing mutation API; instance access is typed
loosely inside the form to match.
The shared FinalMaskForm.vue and JsonEditor.vue stay alongside the new .tsx
versions until step 9 — InboundFormModal.vue still imports them.
Adds react-hooks/immutability and react-hooks/refs to the already-disabled
react-compiler rule set; both flag the outbound form's instance-mutation
pattern that doesn't run through useState.
* Upgrade frontend deps (antd v6, i18n, TS)
Bump frontend dependencies in package.json and regenerate package-lock.json. Notable updates: upgrade antd to v6, update i18next/react-i18next, axios, qs, vue-i18n, TypeScript and ESLint, plus related @rc-component packages and replacements (e.g. classnames/rc-util -> clsx/@rc-component/util). Lockfile changes reflect the new dependency tree required for Ant Design v6 and other package upgrades.
* refactor(frontend): port inbounds to react+ts and drop vue toolchain
Step 9 — the last entry. Ports the inbounds entry: page shell, list with
desktop table + mobile cards, info modal, qr-code modal, share-link
helpers, and the protocol-aware form modal (basics / protocol /
stream / security / sniffing / advanced JSON). useInbounds replaces
the Vue composable with WebSocket-driven traffic + client-stats merge.
Inbound and DBInbound models stay in JS so the class-driven form keeps
its mutation API; instance access is typed loosely inside the form to
match. FinalMaskForm/JsonEditor/TextModal/PromptModal/InfinityIcon are
the last shared bits to flip; their .vue counterparts go too.
Toolchain cleanup now that no entry needs Vue: drop plugin-vue from
vite.config, remove the .vue lint block + parser, prune vue / vue-i18n
/ ant-design-vue / @ant-design/icons-vue / vue3-persian-datetime-picker
/ moment-jalaali override from package.json, and switch utils/index.js
to import { message } from 'antd' instead of ant-design-vue.
* chore(frontend): adopt antd v6 api updates
Sweep deprecated props across the React tree:
- Modal: destroyOnClose -> destroyOnHidden, maskClosable -> mask.closable
- Space: direction -> orientation (or removed when redundant)
- Input.Group compact -> Space.Compact block
- Drawer: width -> size
- Spin: tip -> description
- Progress: trailColor -> railColor
- Alert: message -> title
- Popover: overlayClassName -> rootClassName
- BackTop -> FloatButton.BackTop
Also refresh dashboard theming for v6: rename dark/ultra Layout and Menu
tokens (siderBg, darkItemBg, darkSubMenuItemBg, darkPopupBg), tweak gauge
size/stroke, add font-size overrides for Statistic and Progress so the
overview numbers stay legible under v6 defaults.
* chore(frontend): antd v6 polish, theme + modal fixes
- adopt message.useMessage hook + messageBus bridge so HttpUtil messages
inherit ConfigProvider theme tokens
- replace deprecated antd APIs (List, Input addonBefore/After, Empty
imageStyle); introduce InputAddon helper + SettingListItem custom rows
- fix dark/ultra selectors in portaled modals (body.dark,
html[data-theme='ultra-dark']) instead of nonexistent .is-dark/.is-ultra
- add horizontal scroll to clients table; reorder node columns so
actions+enable sit at the left
- swap raw button for antd Button in NodeFormModal test connection
- fix FinalMaskForm nested-form by hoisting it outside OutboundFormModal's
parent Form
- fix advanced "all" JSON tab in InboundFormModal — useMemo on a mutated
ref was stale; compute on every render
- fix chart-on-open for SystemHistory + XrayMetrics modals by adding open
to effect deps (useRef.current doesn't trigger re-runs)
- switch i18next interpolation to single-brace {var} to match locale files
- drop residual Vue mentions in CI workflows and Go comments
* fix(frontend): qr code collapse — open only first panel, allow toggle
ClientQrModal and QrCodeModal both used activeKey without onChange,
forcing every panel open and blocking user toggle. Switch to controlled
state initialized to the first item's key on open, with onChange so
clicks update state.
Also remove unused AppBridge.tsx (superseded by per-page message.useMessage
hook).
* fix(frontend): hover cards, balancer load, routing dnd, modal a11y, outbound crash
- ClientsPage/SettingsPage/XrayPage: add hoverable to bottom card/tabs so
hover affordance matches the top card
- BalancerFormModal: lazy-init useState from props + destroyOnHidden so
the form mounts with saved values instead of relying on a useEffect
sync that could miss the first open
- RoutingTab: rewrite pointer drag — handlers are now defined inside the
pointerdown closure so addEventListener/removeEventListener match;
drag state lives on a ref (from/to/moved) so onUp reads the real
indices, not stale closure values. Adds setPointerCapture so Windows
and touch keep delivering events when the cursor leaves the handle.
- OutboundFormModal/InboundFormModal: blur the focused input before
switching tabs to silence the aria-hidden-on-focused-element warning
- utils.isArrEmpty: return true for undefined/null arrays — the old form
treated undefined as "not empty" which crashed VLESSSettings.fromJson
when json.vnext was missing
* fix(frontend): clipboard reliability + restyle login page
- ClipboardManager.copyText: prefer navigator.clipboard on secure
contexts, fall back to a focused on-screen textarea + execCommand.
Old path used left:-9999px which failed selection in some browsers
and swallowed execCommand's return value, so the "copied" toast
appeared even when nothing made it to the clipboard.
- LoginPage: richer gradient backdrop — five animated colour blobs,
glassmorphic card (backdrop-filter blur + saturate), gradient brand
text/accent, masked grid texture for depth, and a thin gradient
border on the card. Light/dark/ultra each get their own palette.
* Memoize compactAdvancedJson and update deps
Wrap compactAdvancedJson in useCallback (dependent on messageApi) and add it to the dependency array of applyAdvancedJsonToBasic. This ensures a stable function reference for correct dependency tracking and avoids stale closures/unnecessary re-renders in InboundFormModal.tsx.
* style(frontend): prettier charts, drop redundant frame, format net rates
- Sparkline: multi-stop gradient fill, soft drop-shadow under the line,
dashed grid, glowing pulse on the latest-point marker, pill-shaped
tooltip with dashed crosshair
- XrayMetricsModal: glow + pulse on the observatory alive dot,
monospace stamps/listen text
- SystemHistoryModal: keep just the modal's frame around the chart (the
inner wrapper I'd added stacked a second border on top); strip the
decimal from Net Up/Down (25.63 KB/s → 25 KB/s) only on this chart's
formatter
* style(frontend): refined dark/ultra palette + shared pro card frame
- Dark tokens shifted to a cooler, Linear-style palette: page #1a1b1f,
sidebar/header #15161a (recessed nav, darker than cards), card
#23252b, elevated #2d2f37
- Ultra dark: page pure #000 for OLED, sidebar #050507 disappears into
the frame, card #101013 with a clear step, elevated #1a1a1e
- New styles/page-cards.css holds the card border/shadow/hover rules so
all seven content pages (index, clients, inbounds, xray, settings,
nodes, api-docs) share one definition instead of duplicating in each
page CSS
- Dashboard typography: uppercase card titles with letter-spacing,
larger 17px stat values, subtle gradient divider between stat columns,
ellipsis on action labels so "Backup & Restore" doesn't break the
card height at mid widths
- Light --bg-page stays at #e6e8ec for the contrast against white cards
* fix(frontend): wireguard info alignment, blue login dark, embed gitkeep
- align WireGuard info-modal fields with Protocol/Address/Port by wrapping
values in Tag (matches the rest of the dl.info-list rows)
- swap login dark palette from purple to pure blue blobs/accent/brand
- pin web/dist/.gitkeep through gitignore so //go:embed all:dist never
fails on a fresh clone with an empty dist directory
* docs: refresh frontend docs for the React + TS + AntD 6 stack
Update CONTRIBUTING.md and frontend/README.md to describe the migrated
frontend accurately:
- replace Vue 3 / Ant Design Vue 4 references with React 19 / AntD 6 / TS
- swap composables -> hooks, vue-i18n -> react-i18next, createApp -> createRoot
- mention the typecheck step (tsc --noEmit) in the PR checklist
- document the Vite 8.0.13 pin and TypeScript strict mode in conventions
- list the nodes and api-docs entries that were missing from the layout
* style(frontend): improve readability and mobile polish
- bump statistic title/value contrast in dark and ultra-dark so totals
on the inbounds summary card stay legible
- give index card actions explicit colors per theme so links like Stop,
Logs, System History no longer fade into the card background
- show the panel version as a tag next to "3X-UI" on mobile, mirroring
the Xray version tag pattern, and turn it orange when an update is
available
- make the login settings button a proper circle by adding size="large"
+ an explicit border-radius fallback on .toolbar-btn
* feat: jalali calendar support and date formatting fixes
- Wire useDatepicker into IntlUtil and switch jalalian display locale
to fa-IR for clean "1405/07/03 12:00:00" output (drops the awkward
"AP" era suffix that "<lang>-u-ca-persian" produced)
- Drop in persian-calendar-suite for the jalali date picker, with a
light/dark/ultra theme map and CSS overrides so the inline-styled
input stays readable and bg matches the surrounding container
- Force LTR on the picker input so "1405/03/07 00:00" reads naturally
- Pass calendar setting through ClientInfoModal, ClientsPage Duration
tooltip, and ClientFormModal's expiry picker
- Heuristic toMs() in ClientInfoModal so GORM's autoUpdateTime seconds
render as a real date instead of "1348/11/01"
- Persist UpdatedAt on the ClientRecord row in client_service.Update;
previously only the inbound settings JSON was bumped, so the panel
never saw a fresh updated_at after editing a client
* feat(frontend): donate link, panel version label, login lang menu
- Sidebar: add heart donate link to https://donate.sanaei.dev and small panel version under 3X-UI brand
- Login: swap settings-cog for translation icon, drop title, render languages as a direct list
- Vite dev: inject window.X_UI_CUR_VER from config/version so dev mode matches prod
- Translations: add menu.donate across all locales
* fix(xray-update): respect XUI_BIN_FOLDER on Windows
The Windows update path hardcoded "bin/xray-windows-amd64.exe", ignoring
the configured XUI_BIN_FOLDER. In dev mode (folder set to x-ui) this
created a stray bin/ folder while the running binary stayed un-updated.
* Bump Xray to v26.5.9 and minor cleanup
Update Xray release URLs to v26.5.9 in the GitHub Actions workflow and DockerInit.sh. Remove the hardcoded skip for tagVersion "26.5.3" so it will be considered when collecting Xray versions. Apply small formatting fixes: remove an extra blank line in database/db.go, normalize spacing/alignment of Protocol constants in database/model/model.go, and trim a trailing blank line in web/controller/inbound.go.
* fix(frontend): route remaining copy buttons through ClipboardManager
Direct navigator.clipboard calls fail in non-secure contexts (HTTP on a
LAN IP), making the API-docs code copy and security-tab token copy
silently broken. Both now go through ClipboardManager which falls back
to document.execCommand('copy') when navigator.clipboard is unavailable.
* fix(db): store CreatedAt/UpdatedAt in milliseconds
GORM's autoCreateTime/autoUpdateTime tags default to Unix seconds on
int64 fields and overwrite the service-supplied UnixMilli value on
save. The frontend interprets these timestamps as JS Date inputs
(milliseconds), so created/updated columns rendered ~1970 dates. Adding
the :milli qualifier makes GORM match what the service code and UI
expect.
* Improve legacy clipboard copy handling
Refactor ClipboardManager._legacyCopy to better handle focus and selection when copying. The textarea is now appended to the active element's parent (or body) and placed off-screen with aria-hidden and readonly attributes. The code preserves and restores the previous document selection and active element, uses focus({preventScroll: true}) to avoid scrolling, and returns the execCommand('copy') result. This makes legacy copy behavior more robust and less disruptive to the page state.
* fix(lint): drop redundant ok=false in clipboard fallback catch
* chore(deps): bump golang.org/x/net to v0.55.0 for GO-2026-5026
1093 lines
No EOL
71 KiB
JSON
1093 lines
No EOL
71 KiB
JSON
{
|
||
"username": "نامکاربری",
|
||
"password": "رمزعبور",
|
||
"login": "ورود",
|
||
"confirm": "تایید",
|
||
"cancel": "انصراف",
|
||
"close": "بستن",
|
||
"save": "ذخیره",
|
||
"logout": "خروج",
|
||
"create": "ایجاد",
|
||
"update": "بهروزرسانی",
|
||
"copy": "کپی",
|
||
"copied": "کپی شد",
|
||
"download": "دانلود",
|
||
"remark": "نام",
|
||
"enable": "فعال",
|
||
"protocol": "پروتکل",
|
||
"search": "جستجو",
|
||
"filter": "فیلتر",
|
||
"loading": "...در حال بارگذاری",
|
||
"refresh": "تازهسازی",
|
||
"clear": "پاک کردن",
|
||
"second": "ثانیه",
|
||
"minute": "دقیقه",
|
||
"hour": "ساعت",
|
||
"day": "روز",
|
||
"check": "چک کردن",
|
||
"indefinite": "نامحدود",
|
||
"unlimited": "نامحدود",
|
||
"none": "هیچ",
|
||
"qrCode": "QRکد",
|
||
"info": "اطلاعات بیشتر",
|
||
"edit": "ویرایش",
|
||
"delete": "حذف",
|
||
"reset": "ریست",
|
||
"noData": "دادهای وجود ندارد.",
|
||
"copySuccess": "باموفقیت کپیشد",
|
||
"sure": "مطمئن",
|
||
"encryption": "رمزگذاری",
|
||
"useIPv4ForHost": "از IPv4 برای میزبان استفاده کنید",
|
||
"transmission": "راهاتصال",
|
||
"host": "آدرس",
|
||
"path": "مسیر",
|
||
"camouflage": "مبهمسازی",
|
||
"status": "وضعیت",
|
||
"enabled": "فعال",
|
||
"disabled": "غیرفعال",
|
||
"depleted": "منقضی",
|
||
"depletingSoon": "درحالانقضا",
|
||
"offline": "آفلاین",
|
||
"online": "آنلاین",
|
||
"domainName": "آدرس دامنه",
|
||
"monitor": "آیپی اتصال",
|
||
"certificate": "گواهی دیجیتال",
|
||
"fail": "ناموفق",
|
||
"comment": "توضیحات",
|
||
"success": "موفق",
|
||
"lastOnline": "آخرین فعالیت",
|
||
"getVersion": "دریافت نسخه",
|
||
"install": "نصب",
|
||
"clients": "کاربران",
|
||
"usage": "استفاده",
|
||
"twoFactorCode": "کد",
|
||
"remained": "باقیمانده",
|
||
"security": "امنیت",
|
||
"secAlertTitle": "هشدارامنیتی",
|
||
"secAlertSsl": "ایناتصالامن نیست. لطفا تازمانیکه تیالاس برای محافظت از دادهها فعال نشدهاست، از وارد کردن اطلاعات حساس خودداری کنید",
|
||
"secAlertConf": "تنظیمات خاصی در برابر حملات آسیب پذیر هستند. توصیه میشود پروتکلهای امنیتی را برای جلوگیری از نفوذ احتمالی تقویت کنید",
|
||
"secAlertSSL": "پنل فاقد ارتباط امن است. لطفاً یک گواهینامه تیالاس برای محافظت از دادهها نصب کنید",
|
||
"secAlertPanelPort": "استفاده از پورت پیشفرض پنل ناامن است. لطفاً یک پورت تصادفی یا خاص تنظیم کنید",
|
||
"secAlertPanelURI": "مسیر پیشفرض لینک پنل ناامن است. لطفاً یک مسیر پیچیده تنظیم کنید",
|
||
"secAlertSubURI": "مسیر پیشفرض لینک سابسکریپشن ناامن است. لطفاً یک مسیر پیچیده تنظیم کنید",
|
||
"secAlertSubJsonURI": "مسیر پیشفرض لینک سابسکریپشن جیسون ناامن است. لطفاً یک مسیر پیچیده تنظیم کنید",
|
||
"emptyDnsDesc": "هیچ سرور DNS اضافه نشده است.",
|
||
"emptyFakeDnsDesc": "هیچ سرور Fake DNS اضافه نشده است.",
|
||
"emptyBalancersDesc": "هیچ بالانسر اضافه نشده است.",
|
||
"emptyReverseDesc": "هیچ پروکسی معکوس اضافه نشده است.",
|
||
"somethingWentWrong": "مشکلی پیش آمد",
|
||
"subscription": {
|
||
"title": "اطلاعات سابسکریپشن",
|
||
"subId": "شناسه اشتراک",
|
||
"status": "وضعیت",
|
||
"downloaded": "دانلود",
|
||
"uploaded": "آپلود",
|
||
"expiry": "تاریخ پایان",
|
||
"totalQuota": "حجم کلی",
|
||
"individualLinks": "لینکهای تکی",
|
||
"active": "فعال",
|
||
"inactive": "غیرفعال",
|
||
"unlimited": "نامحدود",
|
||
"noExpiry": "بدون انقضا"
|
||
},
|
||
"menu": {
|
||
"theme": "تم",
|
||
"dark": "تیره",
|
||
"ultraDark": "فوق تیره",
|
||
"dashboard": "نمای کلی",
|
||
"inbounds": "ورودیها",
|
||
"clients": "کلاینتها",
|
||
"nodes": "نودها",
|
||
"settings": "تنظیمات پنل",
|
||
"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": "ایکسری",
|
||
"stopXray": "توقف",
|
||
"restartXray": "شروعمجدد",
|
||
"xraySwitch": "نسخه",
|
||
"xrayUpdates": "بهروزرسانیهای Xray",
|
||
"xraySwitchClick": "نسخه مورد نظر را انتخاب کنید",
|
||
"xraySwitchClickDesk": "لطفا بادقت انتخاب کنید. درصورت انتخاب نسخه قدیمیتر، امکان ناهماهنگی با پیکربندی فعلی وجود دارد",
|
||
"updatePanel": "بهروزرسانی پنل",
|
||
"panelUpdateDesc": "این عملیات 3X-UI را به آخرین نسخه بهروزرسانی میکند و سرویس پنل را مجدداً راهاندازی میکند.",
|
||
"currentPanelVersion": "نسخه فعلی پنل",
|
||
"latestPanelVersion": "آخرین نسخه پنل",
|
||
"panelUpToDate": "پنل بهروز است",
|
||
"upToDate": "بهروز",
|
||
"xrayStatusUnknown": "ناشناخته",
|
||
"xrayStatusRunning": "در حال اجرا",
|
||
"xrayStatusStop": "متوقف",
|
||
"xrayStatusError": "خطا",
|
||
"xrayErrorPopoverTitle": "خطا در هنگام اجرای Xray رخ داد",
|
||
"operationHours": "مدتکارکرد",
|
||
"systemHistoryTitle": "تاریخچه سیستم",
|
||
"charts": "نمودارها",
|
||
"xrayMetricsTitle": "متریکهای Xray",
|
||
"xrayMetricsDisabled": "نقطه پایانی متریکهای Xray پیکربندی نشده",
|
||
"xrayMetricsHint": "یک بلاک metrics در سطح بالای پیکربندی xray با tag برابر metrics_out و listen برابر 127.0.0.1:11111 اضافه کنید، سپس xray را راهاندازی مجدد کنید.",
|
||
"xrayObservatoryEmpty": "هنوز دادهای از Observatory دریافت نشده",
|
||
"xrayObservatoryHint": "یک بلاک observatory در پیکربندی xray اضافه کنید و outbound tagهایی که میخواهید بررسی شوند را لیست کنید، سپس xray را راهاندازی مجدد کنید.",
|
||
"xrayObservatoryTagPlaceholder": "انتخاب outbound",
|
||
"xrayObservatoryAlive": "فعال",
|
||
"xrayObservatoryDead": "غیرفعال",
|
||
"xrayObservatoryLastSeen": "آخرین مشاهده",
|
||
"xrayObservatoryLastTry": "آخرین تلاش",
|
||
"trendLast2Min": "۲ دقیقه اخیر",
|
||
"systemLoad": "بارسیستم",
|
||
"systemLoadDesc": "میانگین بار سیستم برای 1، 5 و 15 دقیقه گذشته",
|
||
"connectionCount": "تعداد کانکشن ها",
|
||
"ipAddresses": "آدرسهای IP",
|
||
"toggleIpVisibility": "تغییر وضعیت نمایش IP",
|
||
"overallSpeed": "سرعت کلی",
|
||
"upload": "آپلود",
|
||
"download": "دانلود",
|
||
"totalData": "دادههای کل",
|
||
"sent": "ارسال شده",
|
||
"received": "دریافت شده",
|
||
"documentation": "مستندات",
|
||
"xraySwitchVersionDialog": "آیا واقعاً میخواهید نسخه Xray را تغییر دهید؟",
|
||
"xraySwitchVersionDialogDesc": "این کار نسخه Xray را به #version# تغییر میدهد.",
|
||
"xraySwitchVersionPopover": "Xray با موفقیت بهروز شد",
|
||
"panelUpdateDialog": "آیا مطمئن هستید که میخواهید پنل را بهروزرسانی کنید؟",
|
||
"panelUpdateDialogDesc": "این 3X-UI را به نسخه #version# بهروزرسانی کرده و سرویس پنل را مجدداً راهاندازی میکند.",
|
||
"panelUpdateCheckPopover": "خطا در بررسی بهروزرسانی پنل",
|
||
"panelUpdateStartedPopover": "بهروزرسانی پنل آغاز شد",
|
||
"geofileUpdateDialog": "آیا واقعاً میخواهید فایل جغرافیایی را بهروز کنید؟",
|
||
"geofileUpdateDialogDesc": "این عمل فایل #filename# را بهروز میکند.",
|
||
"geofilesUpdateDialogDesc": "با این کار همه فایلها بهروزرسانی میشوند.",
|
||
"geofilesUpdateAll": "همه را بهروزرسانی کنید",
|
||
"geofileUpdatePopover": "فایل جغرافیایی با موفقیت بهروز شد",
|
||
"customGeoTitle": "GeoSite / GeoIP سفارشی",
|
||
"customGeoAdd": "افزودن",
|
||
"customGeoType": "نوع",
|
||
"customGeoAlias": "نام مستعار",
|
||
"customGeoUrl": "URL",
|
||
"customGeoEnabled": "فعال",
|
||
"customGeoLastUpdated": "آخرین بهروزرسانی",
|
||
"customGeoExtColumn": "مسیریابی (ext:…)",
|
||
"customGeoToastUpdateAll": "همه منابع سفارشی بهروزرسانی شدند",
|
||
"customGeoActions": "اقدامات",
|
||
"customGeoEdit": "ویرایش",
|
||
"customGeoDelete": "حذف",
|
||
"customGeoDownload": "بهروزرسانی اکنون",
|
||
"customGeoModalAdd": "افزودن geo سفارشی",
|
||
"customGeoModalEdit": "ویرایش geo سفارشی",
|
||
"customGeoModalSave": "ذخیره",
|
||
"customGeoDeleteConfirm": "این منبع geo سفارشی حذف شود؟",
|
||
"customGeoRoutingHint": "در قوانین مسیریابی مقدار را به صورت ext:file.dat:tag استفاده کنید (tag را جایگزین کنید).",
|
||
"customGeoInvalidId": "شناسه منبع نامعتبر است",
|
||
"customGeoAliasesError": "بارگذاری نام مستعارهای geo سفارشی ناموفق بود",
|
||
"customGeoValidationAlias": "نام مستعار فقط حروف کوچک، اعداد، - و _",
|
||
"customGeoValidationUrl": "URL باید با http:// یا https:// شروع شود",
|
||
"customGeoAliasPlaceholder": "a-z 0-9 _ -",
|
||
"customGeoAliasLabelSuffix": " (سفارشی)",
|
||
"customGeoToastList": "فهرست geo سفارشی",
|
||
"customGeoToastAdd": "افزودن geo سفارشی",
|
||
"customGeoToastUpdate": "بهروزرسانی geo سفارشی",
|
||
"customGeoToastDelete": "geofile سفارشی «{{ .fileName }}» حذف شد",
|
||
"customGeoToastDownload": "geofile «{{ .fileName }}» بهروزرسانی شد",
|
||
"customGeoErrInvalidType": "نوع باید geosite یا geoip باشد",
|
||
"customGeoErrAliasRequired": "نام مستعار لازم است",
|
||
"customGeoErrAliasPattern": "نام مستعار دارای نویسه نامجاز است",
|
||
"customGeoErrAliasReserved": "این نام مستعار رزرو است",
|
||
"customGeoErrUrlRequired": "URL لازم است",
|
||
"customGeoErrInvalidUrl": "URL نامعتبر است",
|
||
"customGeoErrUrlScheme": "URL باید http یا https باشد",
|
||
"customGeoErrUrlHost": "میزبان URL نامعتبر است",
|
||
"customGeoErrDuplicateAlias": "این نام مستعار برای این نوع قبلاً استفاده شده است",
|
||
"customGeoErrNotFound": "منبع geo سفارشی یافت نشد",
|
||
"customGeoErrDownload": "بارگیری ناموفق بود",
|
||
"customGeoErrUpdateAllIncomplete": "بهروزرسانی یک یا چند منبع geo سفارشی ناموفق بود",
|
||
"customGeoEmpty": "هنوز منبع geo سفارشیای ثبت نشده — برای ایجاد روی «افزودن» کلیک کنید",
|
||
"dontRefresh": "در حال نصب، لطفا صفحه را رفرش نکنید",
|
||
"logs": "گزارشها",
|
||
"config": "پیکربندی",
|
||
"backup": "پشتیبانگیری",
|
||
"backupTitle": "پشتیبانگیری و بازیابی",
|
||
"exportDatabase": "پشتیبانگیری",
|
||
"exportDatabaseDesc": "برای دانلود یک فایل .db حاوی پشتیبان از پایگاه داده فعلی خود به دستگاهتان کلیک کنید.",
|
||
"importDatabase": "بازیابی",
|
||
"importDatabaseDesc": "برای انتخاب و آپلود یک فایل .db از دستگاهتان و بازیابی پایگاه داده از یک پشتیبان کلیک کنید.",
|
||
"importDatabaseSuccess": "پایگاه داده با موفقیت وارد شد",
|
||
"importDatabaseError": "خطا در وارد کردن پایگاه داده",
|
||
"readDatabaseError": "خطا در خواندن پایگاه داده",
|
||
"getDatabaseError": "خطا در دریافت پایگاه داده",
|
||
"getConfigError": "خطا در دریافت فایل پیکربندی"
|
||
},
|
||
"inbounds": {
|
||
"title": "کاربران",
|
||
"totalDownUp": "دریافت/ارسال کل",
|
||
"totalUsage": "مصرف کل",
|
||
"inboundCount": "کل ورودیها",
|
||
"operate": "عملیات",
|
||
"enable": "فعال",
|
||
"remark": "نام",
|
||
"node": "نود",
|
||
"deployTo": "استقرار روی",
|
||
"localPanel": "پنل لوکال",
|
||
"fallbacks": {
|
||
"title": "فالبکها",
|
||
"help": "وقتی اتصالی روی این اینباند با هیچ کلاینتی تطبیق پیدا نمیکند، به یک اینباند دیگر ارجاع داده میشود. یک فرزند انتخاب کنید، فیلدهای مسیریابی (SNI / ALPN / Path / xver) خودکار از روی transport آن پر میشود — برای بیشتر تنظیمات نیازی به ویرایش نیست. هر فرزند باید روی 127.0.0.1 با security=none گوش بدهد.",
|
||
"empty": "هنوز فالبکی اضافه نشده",
|
||
"add": "افزودن فالبک",
|
||
"pickInbound": "یک اینباند انتخاب کنید",
|
||
"matchAny": "همه",
|
||
"rederive": "پر کردن مجدد از فرزند",
|
||
"rederived": "از فرزند پر شد",
|
||
"editAdvanced": "ویرایش فیلدهای مسیریابی",
|
||
"hideAdvanced": "بستن پیشرفته",
|
||
"quickAddAll": "افزودن سریع همهی موارد واجد شرایط",
|
||
"quickAdded": "{n} فالبک افزوده شد",
|
||
"quickAddedNone": "اینباند جدیدی برای افزودن وجود ندارد",
|
||
"routesWhen": "هدایت میشود وقتی",
|
||
"defaultCatchAll": "پیشفرض — همهی موارد دیگر را میگیرد"
|
||
},
|
||
"protocol": "پروتکل",
|
||
"port": "پورت",
|
||
"portMap": "پورتهای نظیر",
|
||
"traffic": "ترافیک",
|
||
"details": "توضیحات",
|
||
"transportConfig": "نحوه اتصال",
|
||
"expireDate": "مدت زمان",
|
||
"createdAt": "ایجاد",
|
||
"updatedAt": "بهروزرسانی",
|
||
"resetTraffic": "ریست ترافیک",
|
||
"addInbound": "افزودن ورودی",
|
||
"generalActions": "عملیات کلی",
|
||
"modifyInbound": "ویرایش ورودی",
|
||
"deleteInbound": "حذف ورودی",
|
||
"deleteInboundContent": "آیا مطمئن به حذف ورودی هستید؟",
|
||
"deleteClient": "حذف کاربر",
|
||
"deleteClientContent": "آیا مطمئن به حذف کاربر هستید؟",
|
||
"resetTrafficContent": "آیا مطمئن به ریست ترافیک هستید؟",
|
||
"copyLink": "کپی لینک",
|
||
"address": "آدرس",
|
||
"network": "شبکه",
|
||
"destinationPort": "پورت مقصد",
|
||
"targetAddress": "آدرس مقصد",
|
||
"monitorDesc": "بهطور پیشفرض خالیبگذارید",
|
||
"meansNoLimit": "0 = واحد: گیگابایت) نامحدود)",
|
||
"totalFlow": "ترافیک کل",
|
||
"leaveBlankToNeverExpire": "برای منقضینشدن خالیبگذارید",
|
||
"noRecommendKeepDefault": "توصیهمیشود بهطور پیشفرض حفظشود",
|
||
"certificatePath": "مسیر فایل",
|
||
"certificateContent": "محتوای فایل",
|
||
"publicKey": "کلید عمومی",
|
||
"privatekey": "کلید خصوصی",
|
||
"clickOnQRcode": "برای کپی بر روی کدتصویری کلیک کنید",
|
||
"client": "کاربر",
|
||
"export": "استخراج لینکها",
|
||
"clone": "شبیهسازی",
|
||
"cloneInbound": "شبیهسازی ورودی",
|
||
"cloneInboundContent": "همه موارد این ورودی بجز پورت، آیپی و کاربرها شبیهسازی خواهند شد",
|
||
"cloneInboundOk": "ساختن شبیه ساز",
|
||
"resetAllTraffic": "ریست ترافیک کل ورودیها",
|
||
"resetAllTrafficTitle": "ریست ترافیک کل ورودیها",
|
||
"resetAllTrafficContent": "آیا مطمئن به ریست ترافیک تمام ورودیها هستید؟",
|
||
"resetInboundClientTraffics": "ریست ترافیک کاربران",
|
||
"resetInboundClientTrafficTitle": "ریست ترافیک کاربران",
|
||
"resetInboundClientTrafficContent": "آیا مطمئن به ریست ترافیک تمام کاربران این ورودی هستید؟",
|
||
"resetAllClientTraffics": "ریست ترافیک کل کاربران",
|
||
"resetAllClientTrafficTitle": "ریست ترافیک کل کاربران",
|
||
"resetAllClientTrafficContent": "آیا مطمئن به ریست ترافیک تمام کاربران هستید؟",
|
||
"delDepletedClients": "حذف کاربران منقضی",
|
||
"delDepletedClientsTitle": "حذف کاربران منقضی",
|
||
"delDepletedClientsContent": "آیا مطمئن به حذف تمام کاربران منقضیشده هستید؟",
|
||
"email": "ایمیل",
|
||
"emailDesc": "باید یک ایمیل یکتا باشد",
|
||
"IPLimit": "محدودیت آیپی",
|
||
"IPLimitDesc": "(اگر تعداد از مقدار تنظیم شده بیشتر شود، ورودی را غیرفعال می کند. (0 = غیرفعال",
|
||
"IPLimitlog": "گزارشها",
|
||
"IPLimitlogDesc": "گزارش تاریخچه آیپی. برای فعال کردن ورودی پس از غیرفعال شدن، گزارش را پاک کنید",
|
||
"IPLimitlogclear": "پاک کردن گزارشها",
|
||
"setDefaultCert": "استفاده از گواهی پنل",
|
||
"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": "اسنیفینگ",
|
||
"sniffingHelp": "ساختار بلوک sniffing در Xray:",
|
||
"stream": "استریم",
|
||
"streamHelp": "ساختار بلوک stream در Xray:",
|
||
"jsonErrorPrefix": "JSON پیشرفته"
|
||
},
|
||
"telegramDesc": "لطفا شناسه گفتگوی تلگرام را وارد کنید. (از دستور '/id' در ربات استفاده کنید) یا ({'@'}userinfobot)",
|
||
"subscriptionDesc": "شما میتوانید لینک سابسکربپشن خودرا در 'جزئیات' پیدا کنید، همچنین میتوانید از همین نام برای چندین کاربر استفادهکنید",
|
||
"info": "اطلاعات",
|
||
"same": "همسان",
|
||
"inboundData": "دادههای ورودی",
|
||
"exportInbound": "استخراج ورودی",
|
||
"import": "افزودن",
|
||
"importInbound": "افزودن یک ورودی",
|
||
"periodicTrafficResetTitle": "بازنشانی ترافیک",
|
||
"periodicTrafficResetDesc": "بازنشانی خودکار شمارنده ترافیک در فواصل زمانی مشخص",
|
||
"lastReset": "آخرین بازنشانی",
|
||
"periodicTrafficReset": {
|
||
"never": "هرگز",
|
||
"daily": "روزانه",
|
||
"weekly": "هفتگی",
|
||
"monthly": "ماهانه",
|
||
"hourly": "هر ساعت"
|
||
},
|
||
"toasts": {
|
||
"obtain": "فراهمسازی",
|
||
"updateSuccess": "بروزرسانی با موفقیت انجام شد",
|
||
"logCleanSuccess": "لاگ پاکسازی شد",
|
||
"inboundsUpdateSuccess": "ورودیها با موفقیت بهروزرسانی شدند",
|
||
"inboundUpdateSuccess": "ورودی با موفقیت بهروزرسانی شد",
|
||
"inboundCreateSuccess": "ورودی با موفقیت ایجاد شد",
|
||
"inboundDeleteSuccess": "ورودی با موفقیت حذف شد",
|
||
"inboundClientAddSuccess": "کلاینت(های) ورودی اضافه شدند",
|
||
"inboundClientDeleteSuccess": "کلاینت ورودی حذف شد",
|
||
"inboundClientUpdateSuccess": "کلاینت ورودی بهروزرسانی شد",
|
||
"delDepletedClientsSuccess": "تمام کلاینتهای مصرف شده حذف شدند",
|
||
"resetAllClientTrafficSuccess": "تمام ترافیک کلاینت بازنشانی شد",
|
||
"resetAllTrafficSuccess": "تمام ترافیکها بازنشانی شدند",
|
||
"resetInboundClientTrafficSuccess": "ترافیک بازنشانی شد",
|
||
"resetInboundTrafficSuccess": "ترافیک ورودی بازنشانی شد",
|
||
"trafficGetError": "خطا در دریافت ترافیکها",
|
||
"getNewX25519CertError": "خطا در دریافت گواهی X25519.",
|
||
"getNewmldsa65Error": "خطا در دریافت گواهی mldsa65.",
|
||
"getNewVlessEncError": "خطا در دریافت گواهی VlessEnc."
|
||
},
|
||
"stream": {
|
||
"general": {
|
||
"request": "درخواست",
|
||
"response": "پاسخ",
|
||
"name": "نام",
|
||
"value": "مقدار"
|
||
},
|
||
"tcp": {
|
||
"version": "نسخه",
|
||
"method": "متد",
|
||
"path": "مسیر",
|
||
"status": "وضعیت",
|
||
"statusDescription": "توضیحات وضعیت",
|
||
"requestHeader": "سربرگ درخواست",
|
||
"responseHeader": "سربرگ پاسخ"
|
||
}
|
||
}
|
||
},
|
||
"clients": {
|
||
"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": "تمدید خودکار پس از انقضا. (۰ = غیرفعال) (واحد: روز)",
|
||
"title": "کلاینتها",
|
||
"actions": "عملیات",
|
||
"totalGB": "مجموع ارسال/دریافت (گیگابایت)",
|
||
"expiryTime": "انقضا",
|
||
"addClients": "افزودن کلاینتها",
|
||
"limitIp": "محدودیت IP",
|
||
"password": "رمز عبور",
|
||
"subId": "شناسه اشتراک",
|
||
"online": "آنلاین",
|
||
"email": "ایمیل",
|
||
"comment": "توضیحات",
|
||
"traffic": "ترافیک",
|
||
"offline": "آفلاین",
|
||
"addTitle": "افزودن کلاینت",
|
||
"qrCode": "کد QR",
|
||
"moreInformation": "اطلاعات بیشتر",
|
||
"delete": "حذف",
|
||
"reset": "بازنشانی ترافیک",
|
||
"editTitle": "ویرایش کلاینت",
|
||
"client": "کلاینت",
|
||
"enabled": "فعال",
|
||
"remaining": "باقیمانده",
|
||
"duration": "مدت",
|
||
"attachedInbounds": "اینباندهای متصل",
|
||
"selectInbound": "یک یا چند اینباند انتخاب کنید",
|
||
"noSubId": "این کلاینت subId ندارد، لینک اشتراکگذاری وجود ندارد.",
|
||
"noLinks": "لینکی برای اشتراکگذاری نیست — ابتدا این کلاینت را به یک اینباند با پروتکل سازگار متصل کنید.",
|
||
"link": "لینک",
|
||
"resetNotPossible": "ابتدا این کلاینت را به یک اینباند متصل کنید.",
|
||
"general": "عمومی",
|
||
"resetAllTraffics": "بازنشانی ترافیک همه کلاینتها",
|
||
"resetAllTrafficsTitle": "بازنشانی ترافیک همه کلاینتها؟",
|
||
"resetAllTrafficsContent": "شمارنده ارسال/دریافت همه کلاینتها به صفر میرسد. سهمیه و تاریخ انقضا تغییری نمیکند. این عمل غیرقابل بازگشت است.",
|
||
"empty": "هنوز کلاینتی نیست — برای شروع یکی اضافه کنید.",
|
||
"deleteConfirmTitle": "حذف کلاینت {email}؟",
|
||
"deleteConfirmContent": "این کلاینت از تمام اینباندهای متصل حذف و سابقه ترافیک آن پاک میشود. این عمل غیرقابل بازگشت است.",
|
||
"deleteSelected": "حذف ({count})",
|
||
"bulkDeleteConfirmTitle": "حذف {count} کلاینت؟",
|
||
"bulkDeleteConfirmContent": "هر کلاینت انتخابشده از تمام اینباندهای متصل حذف و سابقه ترافیک آن پاک میشود. این عمل غیرقابل بازگشت است.",
|
||
"delDepleted": "حذف اتمامیافتهها",
|
||
"delDepletedConfirmTitle": "حذف کلاینتهای اتمامیافته؟",
|
||
"delDepletedConfirmContent": "هر کلاینتی که سهمیه ترافیکاش تمام شده یا تاریخ انقضایش گذشته است حذف میشود. این عمل غیرقابل بازگشت است.",
|
||
"auth": "Auth",
|
||
"hysteriaAuth": "Auth (هیستریا)",
|
||
"uuid": "UUID",
|
||
"flow": "Flow",
|
||
"reverseTag": "Reverse tag",
|
||
"reverseTagPlaceholder": "Reverse tag اختیاری",
|
||
"telegramId": "شناسه کاربر تلگرام",
|
||
"telegramIdPlaceholder": "شناسه عددی کاربر تلگرام (۰ = هیچ)",
|
||
"created": "ساختهشده",
|
||
"updated": "بهروزشده",
|
||
"ipLimit": "محدودیت IP",
|
||
"toasts": {
|
||
"deleted": "کلاینت حذف شد",
|
||
"trafficReset": "ترافیک بازنشانی شد",
|
||
"allTrafficsReset": "ترافیک همه کلاینتها بازنشانی شد",
|
||
"bulkDeleted": "{count} کلاینت حذف شد",
|
||
"bulkDeletedMixed": "{ok} حذف، {failed} ناموفق",
|
||
"bulkCreated": "{count} کلاینت ساخته شد",
|
||
"bulkCreatedMixed": "{ok} ساخته شد، {failed} ناموفق",
|
||
"delDepleted": "{count} کلاینت اتمامیافته حذف شد"
|
||
}
|
||
},
|
||
"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 فعال شود.",
|
||
"enable": "فعال",
|
||
"status": "وضعیت",
|
||
"cpu": "پردازنده",
|
||
"mem": "حافظه",
|
||
"uptime": "زمان کارکرد",
|
||
"latency": "تاخیر",
|
||
"lastHeartbeat": "آخرین ضربان",
|
||
"xrayVersion": "نسخه Xray",
|
||
"panelVersion": "نسخه پنل",
|
||
"actions": "عملیات",
|
||
"probe": "بررسی فوری",
|
||
"testConnection": "تست اتصال",
|
||
"connectionOk": "اتصال موفق ({ms} میلیثانیه)",
|
||
"connectionFailed": "اتصال ناموفق",
|
||
"never": "هرگز",
|
||
"justNow": "هماکنون",
|
||
"deleteConfirmTitle": "نود «{name}» حذف شود؟",
|
||
"deleteConfirmContent": "نظارت روی این نود متوقف میشود. خود پنل ریموت تغییری نمیکند.",
|
||
"statusValues": {
|
||
"online": "آنلاین",
|
||
"offline": "آفلاین",
|
||
"unknown": "نامشخص"
|
||
},
|
||
"toasts": {
|
||
"list": "بارگذاری نودها ناموفق",
|
||
"obtain": "بارگذاری نود ناموفق",
|
||
"add": "افزودن نود",
|
||
"update": "بهروزرسانی نود",
|
||
"delete": "حذف نود",
|
||
"deleted": "نود حذف شد",
|
||
"test": "تست اتصال",
|
||
"fillRequired": "نام، آدرس، پورت و توکن API الزامی است",
|
||
"probeFailed": "بررسی ناموفق"
|
||
}
|
||
},
|
||
"settings": {
|
||
"title": "تنظیمات پنل",
|
||
"save": "ذخیره",
|
||
"infoDesc": "برای اعمال تغییرات در این بخش باید پس از ذخیره کردن، پنل را ریستارت کنید",
|
||
"restartPanel": "ریستارت پنل",
|
||
"restartPanelDesc": "آیا مطمئن به ریستارت پنل هستید؟ اگر پساز ریستارت نمیتوانید به پنل دسترسی پیدا کنید، لطفاً گزارشهای موجود در اسکریپت پنل را بررسی کنید",
|
||
"restartPanelSuccess": "پنل با موفقیت راهاندازی مجدد شد",
|
||
"actions": "عملیات ها",
|
||
"resetDefaultConfig": "برگشت به پیشفرض",
|
||
"panelSettings": "پیکربندی",
|
||
"securitySettings": "احرازهویت",
|
||
"TGBotSettings": "ربات تلگرام",
|
||
"panelListeningIP": "آدرس آیپی",
|
||
"panelListeningIPDesc": "آدرس آیپی برای وب پنل. برای گوشدادن بهتمام آیپیها خالیبگذارید",
|
||
"panelListeningDomain": "نام دامنه",
|
||
"panelListeningDomainDesc": "آدرس دامنه برای وب پنل. برای گوش دادن بهتمام دامنهها و آیپیها خالیبگذارید",
|
||
"panelPort": "پورت",
|
||
"panelPortDesc": "شماره پورت برای وب پنل. باید پورت استفاده نشدهباشد",
|
||
"publicKeyPath": "مسیر کلید عمومی",
|
||
"publicKeyPathDesc": "مسیر فایل کلیدعمومی برای وب پنل. با '/' شروعمیشود",
|
||
"privateKeyPath": "مسیر کلید خصوصی",
|
||
"privateKeyPathDesc": "مسیر فایل کلیدخصوصی برای وب پنل. با '/' شروعمیشود",
|
||
"panelUrlPath": "URI مسیر",
|
||
"panelUrlPathDesc": "برای وب پنل. با '/' شروع و با '/' خاتمه مییابد URI مسیر",
|
||
"pageSize": "اندازه صفحه بندی جدول",
|
||
"pageSizeDesc": "(اندازه صفحه برای جدول ورودیها.(0 = غیرفعال",
|
||
"remarkModel": "نامکانفیگ و جداکننده",
|
||
"datepicker": "نوع تقویم",
|
||
"datepickerPlaceholder": "انتخاب تاریخ",
|
||
"datepickerDescription": "وظایف برنامه ریزی شده بر اساس این تقویم اجرا میشود",
|
||
"sampleRemark": "نمونهنام",
|
||
"oldUsername": "نامکاربری فعلی",
|
||
"currentPassword": "رمزعبور فعلی",
|
||
"newUsername": "نامکاربری جدید",
|
||
"newPassword": "رمزعبور جدید",
|
||
"telegramBotEnable": "فعالسازی ربات تلگرام",
|
||
"telegramBotEnableDesc": "ربات تلگرام را فعال میکند",
|
||
"telegramToken": "توکن تلگرام",
|
||
"telegramTokenDesc": "دریافت کنید {'@'}botfather توکن را میتوانید از",
|
||
"telegramProxy": "SOCKS پراکسی",
|
||
"telegramProxyDesc": "را برای اتصال به تلگرام فعال می کند SOCKS5 پراکسی",
|
||
"telegramAPIServer": "سرور API تلگرام",
|
||
"telegramAPIServerDesc": "API سرور تلگرام برای اتصال را تغییر میدهد. برای استفاده از سرور پیش فرض خالی بگذارید",
|
||
"telegramChatId": "آیدی چت مدیر",
|
||
"telegramChatIdDesc": "دریافت کنید ('/id'یا (دستور ({'@'}userinfobot) آیدی(های) چت تلگرام مدیر، از",
|
||
"telegramNotifyTime": "زمان نوتیفیکیشن",
|
||
"telegramNotifyTimeDesc": "زماناطلاعرسانی ربات تلگرام برای گزارش های دورهای. از فرمت زمانبندی لینوکس استفادهکنید",
|
||
"tgNotifyBackup": "پشتیبانگیری از دیتابیس",
|
||
"tgNotifyBackupDesc": "فایل پشتیباندیتابیس را بههمراه گزارش ارسال میکند",
|
||
"tgNotifyLogin": "اعلان ورود",
|
||
"tgNotifyLoginDesc": "نامکاربری، آدرس آیپی، و زمان ورود، فردی که سعی میکند وارد پنل شود را نمایش میدهد",
|
||
"sessionMaxAge": "بیشینه زمان جلسه وب",
|
||
"sessionMaxAgeDesc": "(بیشینه زمانی که میتوانید لاگین بمانید. (واحد: دقیقه",
|
||
"expireTimeDiff": "آستانه زمان باقی مانده",
|
||
"expireTimeDiffDesc": "(فاصله زمانی هشدار تا رسیدن به زمان انقضا. (واحد: روز",
|
||
"trafficDiff": "آستانه ترافیک باقی مانده",
|
||
"trafficDiffDesc": "(فاصله زمانی هشدار تا رسیدن به اتمام ترافیک. (واحد: گیگابایت",
|
||
"tgNotifyCpu": "آستانه هشدار بار پردازنده",
|
||
"tgNotifyCpuDesc": "(اگر بار روی پردازنده ازاین آستانه فراتر رفت، برای شما پیام ارسال میشود. (واحد: درصد",
|
||
"timeZone": "منطقه زمانی",
|
||
"timeZoneDesc": "وظایف برنامه ریزی شده بر اساس این منطقهزمانی اجرا میشود",
|
||
"subSettings": "سابسکریپشن",
|
||
"subEnable": "فعالسازی سرویس سابسکریپشن",
|
||
"subEnableDesc": "سرویس سابسکریپشن را فعالمیکند",
|
||
"subJsonEnable": "فعال/غیرفعالسازی مستقل نقطه دسترسی سابسکریپشن JSON.",
|
||
"subTitle": "عنوان اشتراک",
|
||
"subTitleDesc": "عنوان نمایش داده شده در کلاینت VPN",
|
||
"subSupportUrl": "آدرس پشتیبانی",
|
||
"subSupportUrlDesc": "لینک پشتیبانی فنی که در کلاینت VPN نمایش داده میشود",
|
||
"subProfileUrl": "آدرس پروفایل",
|
||
"subProfileUrlDesc": "لینک وبسایت شما که در کلاینت VPN نمایش داده میشود",
|
||
"subAnnounce": "اعلان",
|
||
"subAnnounceDesc": "متن اعلانی که در کلاینت VPN نمایش داده میشود",
|
||
"subEnableRouting": "فعالسازی مسیریابی",
|
||
"subEnableRoutingDesc": "تنظیمات سراسری برای فعالسازی مسیریابی در کلاینت VPN. (فقط برای Happ)",
|
||
"subRoutingRules": "قوانین مسیریابی",
|
||
"subRoutingRulesDesc": "قوانین مسیریابی سراسری برای کلاینت VPN. (فقط برای Happ)",
|
||
"subListen": "آدرس آیپی",
|
||
"subListenDesc": "آدرس آیپی برای سرویس سابسکریپشن. برای گوش دادن بهتمام آیپیها خالیبگذارید",
|
||
"subPort": "پورت",
|
||
"subPortDesc": "شماره پورت برای سرویس سابسکریپشن. باید پورت استفاده نشدهباشد",
|
||
"subCertPath": "مسیر کلید عمومی",
|
||
"subCertPathDesc": "مسیر فایل کلیدعمومی برای سرویس سابیکریپشن. با '/' شروعمیشود",
|
||
"subKeyPath": "مسیر کلید خصوصی",
|
||
"subKeyPathDesc": "مسیر فایل کلیدخصوصی برای سرویس سابسکریپشن. با '/' شروعمیشود",
|
||
"subPath": "URI مسیر",
|
||
"subPathDesc": "برای سرویس سابسکریپشن. با '/' شروع و با '/' خاتمه مییابد URI مسیر",
|
||
"subDomain": "نام دامنه",
|
||
"subDomainDesc": "آدرس دامنه برای سرویس سابسکریپشن. برای گوش دادن به تمام دامنهها و آیپیها خالیبگذارید",
|
||
"subUpdates": "فاصله بروزرسانی سابسکریپشن",
|
||
"subUpdatesDesc": "(فاصله مابین بروزرسانی در برنامههای کاربری. (واحد: ساعت",
|
||
"subEncrypt": "کدگذاری",
|
||
"subEncryptDesc": "کدگذاری خواهدشد Base64 محتوای برگشتی سرویس سابسکریپشن برپایه",
|
||
"subShowInfo": "نمایش اطلاعات مصرف",
|
||
"subShowInfoDesc": "ترافیک و زمان باقیمانده را در برنامههای کاربری نمایش میدهد",
|
||
"subEmailInRemark": "گنجاندن ایمیل در نام",
|
||
"subEmailInRemarkDesc": "ایمیل کاربر در نام پروفایل اشتراک گنجانده میشود.",
|
||
"subURI": "پروکسی معکوس URI مسیر",
|
||
"subURIDesc": "سابسکریپشن را برای استفاده در پشت پراکسیها تغییر میدهد URI مسیر",
|
||
"externalTrafficInformEnable": "اطلاع رسانی خارجی مصرف ترافیک",
|
||
"externalTrafficInformEnableDesc": "مصرف ترافیک به سرویس خارجی ارسال می شود",
|
||
"externalTrafficInformURI": "لینک اطلاع رسانی خارجی مصرف ترافیک",
|
||
"externalTrafficInformURIDesc": "ترافیک های مصرفی به این لینک هم ارسال می شود",
|
||
"restartXrayOnClientDisable": "ریاستارت Xray بعد از غیرفعالسازی خودکار",
|
||
"restartXrayOnClientDisableDesc": "وقتی کاربر بهصورت خودکار بهدلیل اتمام زمان یا ترافیک غیرفعال میشود، Xray ریاستارت شود.",
|
||
"fragment": "فرگمنت",
|
||
"fragmentDesc": "فعال کردن فرگمنت برای بستهی نخست تیالاس",
|
||
"fragmentSett": "تنظیمات فرگمنت",
|
||
"noisesDesc": "فعال کردن Noises.",
|
||
"noisesSett": "تنظیمات Noises",
|
||
"mux": "ماکس",
|
||
"muxDesc": "چندین جریان داده مستقل را در یک جریان داده ثابت منتقل می کند",
|
||
"muxSett": "تنظیمات ماکس",
|
||
"direct": "اتصال مستقیم",
|
||
"directDesc": "به طور مستقیم با دامنه ها یا محدوده آیپی یک کشور خاص ارتباط برقرار می کند",
|
||
"notifications": "اعلانها",
|
||
"certs": "گواهیها",
|
||
"externalTraffic": "ترافیک خارجی",
|
||
"dateAndTime": "تاریخ و زمان",
|
||
"proxyAndServer": "پراکسی و سرور",
|
||
"intervals": "فواصل",
|
||
"information": "اطلاعات",
|
||
"language": "زبان",
|
||
"telegramBotLanguage": "زبان ربات تلگرام",
|
||
"security": {
|
||
"admin": "اعتبارنامههای ادمین",
|
||
"twoFactor": "احراز هویت دو مرحلهای",
|
||
"twoFactorEnable": "فعالسازی 2FA",
|
||
"twoFactorEnableDesc": "یک لایه اضافی امنیتی برای احراز هویت فراهم میکند.",
|
||
"twoFactorModalSetTitle": "فعالسازی احراز هویت دو مرحلهای",
|
||
"twoFactorModalDeleteTitle": "غیرفعالسازی احراز هویت دو مرحلهای",
|
||
"twoFactorModalSteps": "برای راهاندازی احراز هویت دو مرحلهای، مراحل زیر را انجام دهید:",
|
||
"twoFactorModalFirstStep": "1. این کد QR را در برنامه احراز هویت اسکن کنید یا توکن کنار کد QR را کپی کرده و در برنامه بچسبانید",
|
||
"twoFactorModalSecondStep": "2. کد را از برنامه وارد کنید",
|
||
"twoFactorModalRemoveStep": "برای حذف احراز هویت دو مرحلهای، کد را از برنامه وارد کنید.",
|
||
"twoFactorModalChangeCredentialsTitle": "تغییر اعتبارنامهها",
|
||
"twoFactorModalChangeCredentialsStep": "برای تغییر اعتبارنامههای مدیر، کد را از برنامه وارد کنید.",
|
||
"twoFactorModalSetSuccess": "احراز هویت دو مرحلهای با موفقیت برقرار شد",
|
||
"twoFactorModalDeleteSuccess": "احراز هویت دو مرحلهای با موفقیت حذف شد",
|
||
"twoFactorModalError": "کد نادرست",
|
||
"show": "نمایش",
|
||
"hide": "پنهان",
|
||
"apiTokenNew": "توکن جدید",
|
||
"apiTokenName": "نام",
|
||
"apiTokenNamePlaceholder": "مثلاً central-panel-a",
|
||
"apiTokenNameRequired": "نام الزامی است",
|
||
"apiTokenEmpty": "هنوز توکنی وجود ندارد — برای احراز هویت رباتها یا پنلهای راه دور یکی بسازید.",
|
||
"apiTokenDeleteWarning": "هر کلاینتی که از این توکن استفاده میکند بلافاصله احراز هویتش قطع میشود."
|
||
},
|
||
"toasts": {
|
||
"modifySettings": "پارامترها تغییر کردهاند.",
|
||
"getSettings": "خطا در دریافت پارامترها",
|
||
"modifyUserError": "خطا در تغییر اعتبارنامههای مدیر سیستم.",
|
||
"modifyUser": "شما با موفقیت اعتبارنامههای مدیر سیستم را تغییر دادید.",
|
||
"originalUserPassIncorrect": "نامکاربری یا رمزعبور فعلی اشتباهاست",
|
||
"userPassMustBeNotEmpty": "نامکاربری یا رمزعبور جدید خالیاست",
|
||
"getOutboundTrafficError": "خطا در دریافت ترافیک خروجی",
|
||
"resetOutboundTrafficError": "خطا در بازنشانی ترافیک خروجی"
|
||
}
|
||
},
|
||
"xray": {
|
||
"title": "پیکربندی ایکسری",
|
||
"save": "ذخیره",
|
||
"restart": "ریستارت ایکسری",
|
||
"restartSuccess": "Xray با موفقیت راهاندازی مجدد شد",
|
||
"stopSuccess": "Xray با موفقیت متوقف شد",
|
||
"restartError": "خطا در راهاندازی مجدد Xray.",
|
||
"stopError": "خطا در توقف Xray.",
|
||
"basicTemplate": "پایه",
|
||
"advancedTemplate": "پیشرفته",
|
||
"generalConfigs": "استراتژی کلی",
|
||
"generalConfigsDesc": "این گزینهها استراتژی کلی ترافیک را تعیین میکنند",
|
||
"logConfigs": "گزارش",
|
||
"logConfigsDesc": "گزارشها ممکن است بر کارایی سرور شما تأثیر بگذارد. توصیه می شود فقط در صورت نیاز آن را عاقلانه فعال کنید",
|
||
"blockConfigsDesc": "این گزینهها ترافیک را بر اساس پروتکلهای درخواستی خاص، و وب سایتها مسدود میکند",
|
||
"basicRouting": "مسیریابی پایه",
|
||
"blockConnectionsConfigsDesc": "این گزینهها ترافیک را بر اساس کشور درخواستشده خاص مسدود میکنند.",
|
||
"directConnectionsConfigsDesc": "یک اتصال مستقیم تضمین میکند که ترافیک خاص از طریق سرور دیگری مسیریابی نشود.",
|
||
"blockips": "مسدود کردن آیپیها",
|
||
"blockdomains": "مسدود کردن دامنهها",
|
||
"directips": "آیپیهای مستقیم",
|
||
"directdomains": "دامنههای مستقیم",
|
||
"ipv4Routing": "IPv4 مسیریابی",
|
||
"ipv4RoutingDesc": "این گزینهها ترافیک را از طریق آیپی نسخه4 سرور، به مقصد هدایت میکند",
|
||
"warpRouting": "WARP مسیریابی",
|
||
"warpRoutingDesc": "این گزینهها ترافیک را از طریق وارپ کلادفلر به مقصد هدایت میکند",
|
||
"nordRouting": "مسیریابی NordVPN",
|
||
"nordRoutingDesc": "این گزینهها ترافیک را بر اساس مقصد خاص از طریق NordVPN مسیریابی میکنند.",
|
||
"Template": "پیکربندی پیشرفته الگو ایکسری",
|
||
"TemplateDesc": "فایل پیکربندی نهایی ایکسری بر اساس این الگو ایجاد میشود",
|
||
"FreedomStrategy": "Freedom استراتژی پروتکل",
|
||
"FreedomStrategyDesc": "تعیین میکند Freedom استراتژی خروجی شبکه را برای پروتکل",
|
||
"RoutingStrategy": "استراتژی کلی مسیریابی",
|
||
"RoutingStrategyDesc": "استراتژی کلی مسیریابی برای حل تمام درخواستها را تعیین میکند",
|
||
"outboundTestUrl": "آدرس تست خروجی",
|
||
"outboundTestUrlDesc": "آدرسی که برای تست اتصال خروجی استفاده میشود.",
|
||
"Torrent": "مسدودسازی پروتکل بیتتورنت",
|
||
"Inbounds": "ورودیها",
|
||
"InboundsDesc": "پذیرش کلاینت خاص",
|
||
"Outbounds": "خروجیها",
|
||
"Balancers": "بالانسرها",
|
||
"OutboundsDesc": "مسیر ترافیک خروجی را تنظیم کنید",
|
||
"Routings": "قوانین مسیریابی",
|
||
"RoutingsDesc": "اولویت هر قانون مهم است",
|
||
"completeTemplate": "کامل",
|
||
"logLevel": "سطح گزارش",
|
||
"logLevelDesc": "سطح گزارش برای گزارش های خطا، نشان دهنده اطلاعاتی است که باید ثبت شوند.",
|
||
"accessLog": "مسیر گزارش",
|
||
"accessLogDesc": "مسیر فایل برای گزارش دسترسی. مقدار ویژه «هیچ» گزارشهای دسترسی را غیرفعال میکند.",
|
||
"errorLog": "گزارش خطا",
|
||
"errorLogDesc": "مسیر فایل برای ورود به سیستم خطا. مقدار ویژه «هیچ» گزارش های خطا را غیرفعال میکند",
|
||
"dnsLog": "گزارش DNS",
|
||
"dnsLogDesc": "آیا ثبتهای درخواست DNS را فعال کنید",
|
||
"maskAddress": "پنهان کردن آدرس",
|
||
"maskAddressDesc": "پوشش آدرس IP، هنگامی که فعال میشود، به طور خودکار آدرس IP که در لاگ ظاهر میشود را جایگزین میکند.",
|
||
"statistics": "آمار",
|
||
"statsInboundUplink": "آمار آپلود ورودی",
|
||
"statsInboundUplinkDesc": "جمعآوری آمار برای ترافیک بالارو (آپلود) تمام پروکسیهای ورودی را فعال میکند.",
|
||
"statsInboundDownlink": "آمار دانلود ورودی",
|
||
"statsInboundDownlinkDesc": "جمعآوری آمار برای ترافیک پایینرو (دانلود) تمام پروکسیهای ورودی را فعال میکند.",
|
||
"statsOutboundUplink": "آمار آپلود خروجی",
|
||
"statsOutboundUplinkDesc": "جمعآوری آمار برای ترافیک بالارو (آپلود) تمام پروکسیهای خروجی را فعال میکند.",
|
||
"statsOutboundDownlink": "آمار دانلود خروجی",
|
||
"statsOutboundDownlinkDesc": "جمعآوری آمار برای ترافیک پایینرو (دانلود) تمام پروکسیهای خروجی را فعال میکند.",
|
||
"rules": {
|
||
"first": "اولین",
|
||
"last": "آخرین",
|
||
"up": "بالا",
|
||
"down": "پایین",
|
||
"source": "مبدا",
|
||
"dest": "مقصد",
|
||
"inbound": "ورودی",
|
||
"outbound": "خروجی",
|
||
"balancer": "بالانسر",
|
||
"info": "اطلاعات",
|
||
"add": "افزودن قانون",
|
||
"edit": "ویرایش قانون",
|
||
"useComma": "موارد جدا شده با کاما"
|
||
},
|
||
"outbound": {
|
||
"addOutbound": "افزودن خروجی",
|
||
"addReverse": "افزودن معکوس",
|
||
"editOutbound": "ویرایش خروجی",
|
||
"editReverse": "ویرایش معکوس",
|
||
"reverseTag": "تگ معکوس",
|
||
"reverseTagDesc": "تگ خروجی پروکسی معکوس ساده VLESS. برای غیرفعال کردن خالی بگذارید. در صورت تنظیم، اتصالات این کلاینت میتوانند به عنوان تونل پروکسی معکوس استفاده شوند.",
|
||
"reverseTagPlaceholder": "تگ خروجی (خالی = غیرفعال)",
|
||
"tag": "برچسب",
|
||
"tagDesc": "برچسب یگانه",
|
||
"address": "آدرس",
|
||
"reverse": "معکوس",
|
||
"domain": "دامنه",
|
||
"type": "نوع",
|
||
"bridge": "پل",
|
||
"portal": "پورتال",
|
||
"link": "لینک",
|
||
"intercon": "اتصال میانی",
|
||
"settings": "تنظیمات",
|
||
"accountInfo": "اطلاعات حساب",
|
||
"outboundStatus": "وضعیت خروجی",
|
||
"sendThrough": "ارسال با",
|
||
"test": "تست",
|
||
"testResult": "نتیجه تست",
|
||
"testing": "در حال تست اتصال...",
|
||
"testSuccess": "تست موفقیتآمیز",
|
||
"testFailed": "تست ناموفق",
|
||
"testError": "خطا در تست خروجی",
|
||
"nordvpn": "NordVPN",
|
||
"accessToken": "توکن دسترسی",
|
||
"country": "کشور",
|
||
"server": "سرور",
|
||
"city": "شهر",
|
||
"allCities": "همه شهرها",
|
||
"privateKey": "کلید خصوصی",
|
||
"load": "فشار سرور"
|
||
},
|
||
"balancer": {
|
||
"addBalancer": "افزودن بالانسر",
|
||
"editBalancer": "ویرایش بالانسر",
|
||
"balancerStrategy": "استراتژی",
|
||
"balancerSelectors": "انتخابگرها",
|
||
"tag": "برچسب",
|
||
"tagDesc": "برچسب یگانه",
|
||
"balancerDesc": "امکان استفاده همزمان balancerTag و outboundTag باهم وجود ندارد. درصورت استفاده همزمان فقط outboundTag عمل خواهد کرد."
|
||
},
|
||
"wireguard": {
|
||
"secretKey": "کلید شخصی",
|
||
"publicKey": "کلید عمومی",
|
||
"allowedIPs": "آیپیهای مجاز",
|
||
"endpoint": "نقطه پایانی",
|
||
"psk": "کلید مشترک",
|
||
"domainStrategy": "استراتژی حل دامنه"
|
||
},
|
||
"tun": {
|
||
"nameDesc": "نام رابط TUN. مقدار پیشفرض 'xray0' است",
|
||
"mtuDesc": "واحد انتقال حداکثر. بیشترین اندازه بستههای داده. مقدار پیشفرض 1500 است",
|
||
"userLevel": "سطح کاربر",
|
||
"userLevelDesc": "تمام اتصالات انجامشده از طریق این ورودی از این سطح کاربری استفاده خواهند کرد. مقدار پیشفرض 0 است"
|
||
},
|
||
"dns": {
|
||
"enable": "فعال کردن حل دامنه",
|
||
"enableDesc": "سرور حل دامنه داخلی را فعال کنید",
|
||
"tag": "برچسب",
|
||
"tagDesc": "این برچسب در قوانین مسیریابی به عنوان یک برچسب ورودی قابل استفاده خواهد بود",
|
||
"clientIp": "آیپی کلاینت",
|
||
"clientIpDesc": "برای اطلاعرسانی به سرور درباره مکان IP مشخصشده در طول درخواستهای DNS استفاده میشود",
|
||
"disableCache": "غیرفعالسازی کش",
|
||
"disableCacheDesc": "کش DNS را غیرفعال میکند",
|
||
"disableFallback": "غیرفعالسازی Fallback",
|
||
"disableFallbackDesc": "درخواستهای DNS Fallback را غیرفعال میکند",
|
||
"disableFallbackIfMatch": "غیرفعالسازی Fallback در صورت تطابق",
|
||
"disableFallbackIfMatchDesc": "درخواستهای DNS Fallback را زمانی که لیست دامنههای مطابقتیافته سرور DNS فعال است، غیرفعال میکند",
|
||
"enableParallelQuery": "فعالسازی پرسوجوی موازی",
|
||
"enableParallelQueryDesc": "فعالسازی پرسوجوهای DNS موازی به چندین سرور برای وضوح سریعتر",
|
||
"strategy": "استراتژی پرسوجو",
|
||
"strategyDesc": "استراتژی کلی برای حل نام دامنه",
|
||
"add": "افزودن سرور",
|
||
"edit": "ویرایش سرور",
|
||
"domains": "دامنهها",
|
||
"expectIPs": "آیپیهای مورد انتظار",
|
||
"unexpectIPs": "آیپیهای غیرمنتظره",
|
||
"useSystemHosts": "استفاده از Hosts سیستم",
|
||
"useSystemHostsDesc": "استفاده از فایل hosts یک سیستم نصبشده",
|
||
"serveStale": "ارائه نتایج منقضی",
|
||
"serveStaleDesc": "بازگرداندن نتایج منقضی کش هنگام بروزرسانی در پسزمینه",
|
||
"serveExpiredTTL": "TTL نتایج منقضی",
|
||
"serveExpiredTTLDesc": "مدت اعتبار نتایج منقضی به ثانیه؛ ۰ یعنی هرگز منقضی نمیشود",
|
||
"timeoutMs": "زمان انتظار (میلیثانیه)",
|
||
"skipFallback": "رد کردن Fallback",
|
||
"finalQuery": "پرسوجوی نهایی",
|
||
"hosts": "Hosts",
|
||
"hostsAdd": "افزودن Host",
|
||
"hostsEmpty": "هیچ Host تعریف نشده",
|
||
"hostsDomain": "دامنه (مثلاً domain:example.com)",
|
||
"hostsValues": "آیپی یا دامنه — تایپ کنید و Enter بزنید",
|
||
"usePreset": "استفاده از پیشتنظیم",
|
||
"dnsPresetTitle": "پیشتنظیمهای DNS",
|
||
"dnsPresetFamily": "خانوادگی",
|
||
"clearAll": "حذف همه",
|
||
"clearAllTitle": "حذف همه سرورهای DNS؟",
|
||
"clearAllConfirm": "این کار همه سرورهای DNS را از لیست حذف میکند و قابل بازگشت نیست."
|
||
},
|
||
"fakedns": {
|
||
"add": "افزودن دیاناس جعلی",
|
||
"edit": "ویرایش دیاناس جعلی",
|
||
"ipPool": "زیرشبکه استخر آیپی",
|
||
"poolSize": "اندازه استخر"
|
||
}
|
||
}
|
||
},
|
||
"tgbot": {
|
||
"keyboardClosed": "❌ صفحه کلید بسته شد!",
|
||
"noResult": "❗ نتیجه ای یافت نشد!",
|
||
"noQuery": "❌ درخواست یافت نشد! لطفا دوباره تلاش کنید!",
|
||
"wentWrong": "❌ مشکلی پیش آمد!",
|
||
"noIpRecord": "❗ رکورد آی پی وجود ندارد!",
|
||
"noInbounds": "❗ هیچ ورودی یافت نشد!",
|
||
"unlimited": "♾ نامحدود(ریست)",
|
||
"add": "افزودن",
|
||
"month": "ماه",
|
||
"months": "ماه",
|
||
"day": "روز",
|
||
"days": "روز",
|
||
"hours": "ساعت",
|
||
"minutes": "دقیقه",
|
||
"unknown": "نامشخص",
|
||
"inbounds": "ورودی ها",
|
||
"clients": "کاربران",
|
||
"offline": "🔴 آفلاین",
|
||
"online": "🟢 آنلاین",
|
||
"commands": {
|
||
"unknown": "❗ دستور ناشناخته",
|
||
"pleaseChoose": "👇 لطفاً انتخاب کنید:\r\n",
|
||
"help": "🤖 به این ربات خوش آمدید! این ربات برای ارائه دادههای خاص از سرور طراحی شده است و به شما امکان تغییرات لازم را میدهد.\r\n\r\n",
|
||
"start": "👋 سلام <i>{{ .Firstname }}</i>.\r\n",
|
||
"welcome": "🤖 به ربات مدیریت <b>{{ .Hostname }}</b> خوش آمدید.\r\n",
|
||
"status": "✅ ربات در حالت عادی است!",
|
||
"usage": "❗ لطفاً یک متن برای جستجو وارد کنید!",
|
||
"getID": "🆔 شناسه شما: <code>{{ .ID }}</code>",
|
||
"helpAdminCommands": "برای راهاندازی مجدد Xray Core:\r\n<code>/restart</code>\r\n\r\nبرای جستجوی ایمیل مشتری:\r\n<code>/usage [ایمیل]</code>\r\n\r\nبرای جستجوی ورودیها (با آمار مشتری):\r\n<code>/inbound [توضیحات]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>",
|
||
"helpClientCommands": "برای جستجوی آمار، از دستور زیر استفاده کنید:\r\n<code>/usage [ایمیل]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>",
|
||
"restartUsage": "\r\n\r\n<code>/restart</code>",
|
||
"restartSuccess": "✅ عملیات با موفقیت انجام شد!",
|
||
"restartFailed": "❗ خطا در عملیات.\r\n\r\n<code>خطا: {{ .Error }}</code>.",
|
||
"xrayNotRunning": "❗ Xray Core در حال اجرا نیست.",
|
||
"startDesc": "نمایش منوی اصلی",
|
||
"helpDesc": "راهنمای ربات",
|
||
"statusDesc": "بررسی وضعیت ربات",
|
||
"idDesc": "نمایش شناسه تلگرام شما"
|
||
},
|
||
"messages": {
|
||
"cpuThreshold": "🔴 بار پردازنده {{ .Percent }}% بیشتر از آستانه است {{ .Threshold }}%",
|
||
"selectUserFailed": "❌ خطا در انتخاب کاربر!",
|
||
"userSaved": "✅ کاربر تلگرام ذخیره شد.",
|
||
"loginSuccess": "✅ با موفقیت به پنل وارد شدید.\r\n",
|
||
"loginFailed": "❗️ ورود به پنل ناموفقبود \r\n",
|
||
"2faFailed": "خطای 2FA",
|
||
"report": "🕰 گزارشاتزمانبندیشده: {{ .RunTime }}\r\n",
|
||
"datetime": "⏰ تاریخوزمان: {{ .DateTime }}\r\n",
|
||
"hostname": "💻 ناممیزبان: {{ .Hostname }}\r\n",
|
||
"version": "🚀 نسخهپنل: {{ .Version }}\r\n",
|
||
"xrayVersion": "📡 نسخههسته: {{ .XrayVersion }}\r\n",
|
||
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
|
||
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
|
||
"ip": "🌐 آدرسآیپی: {{ .IP }}\r\n",
|
||
"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\r\n",
|
||
"expireIn": "📅 باقی مانده تا انقضا: {{ .Time }}\r\n\r\n",
|
||
"active": "💡 فعال: {{ .Enable }}\r\n",
|
||
"enabled": "🚨 وضعیت: {{ .Enable }}\r\n",
|
||
"online": "🌐 وضعیت اتصال: {{ .Status }}\r\n",
|
||
"lastOnline": "🔙 آخرین فعالیت: {{ .Time }}\r\n",
|
||
"email": "📧 ایمیل: {{ .Email }}\r\n",
|
||
"upload": "🔼 آپلود↑: {{ .Upload }}\r\n",
|
||
"download": "🔽 دانلود↓: {{ .Download }}\r\n",
|
||
"total": "🔄 کل: {{ .UpDown }} / {{ .Total }}\r\n",
|
||
"TGUser": "👤 کاربر تلگرام: {{ .TelegramID }}\r\n",
|
||
"exhaustedMsg": "🚨 {{ .Type }} بهاتمامرسیدهاست:\r\n",
|
||
"exhaustedCount": "🚨 تعداد {{ .Type }} بهاتمامرسیدهاست:\r\n",
|
||
"onlinesCount": "🌐 کاربرانآنلاین: {{ .Count }}\r\n",
|
||
"disabled": "🛑 غیرفعال: {{ .Disabled }}\r\n",
|
||
"depleteSoon": "🔜 بهزودیبهپایانخواهدرسید: {{ .Deplete }}\r\n\r\n",
|
||
"backupTime": "🗄 زمانپشتیبانگیری: {{ .Time }}\r\n",
|
||
"refreshedOn": "\r\n📋🔄 تازهسازی شده در: {{ .Time }}\r\n\r\n",
|
||
"yes": "✅ بله",
|
||
"no": "❌ خیر",
|
||
"received_id": "🔑📥 شناسه بهروزرسانی شد.",
|
||
"received_password": "🔑📥 رمز عبور بهروزرسانی شد.",
|
||
"received_email": "📧📥 ایمیل بهروزرسانی شد.",
|
||
"received_comment": "💬📥 نظر بهروزرسانی شد.",
|
||
"id_prompt": "🔑 شناسه پیشفرض: {{ .ClientId }}\n\nشناسه خود را وارد کنید.",
|
||
"pass_prompt": "🔑 رمز عبور پیشفرض: {{ .ClientPassword }}\n\nرمز عبور خود را وارد کنید.",
|
||
"email_prompt": "📧 ایمیل پیشفرض: {{ .ClientEmail }}\n\nایمیل خود را وارد کنید.",
|
||
"comment_prompt": "💬 نظر پیشفرض: {{ .ClientComment }}\n\nنظر خود را وارد کنید.",
|
||
"inbound_client_data_id": "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n📊 ترافیک: {{ .ClientTraffic }}\n📅 تاریخ انقضا: {{ .ClientExp }}\n🌐 محدودیت IP: {{ .IpLimit }}\n💬 توضیح: {{ .ClientComment }}\n\nاکنون میتونی مشتری را به ورودی اضافه کنی!",
|
||
"inbound_client_data_pass": "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n📊 ترافیک: {{ .ClientTraffic }}\n📅 تاریخ انقضا: {{ .ClientExp }}\n🌐 محدودیت IP: {{ .IpLimit }}\n💬 توضیح: {{ .ClientComment }}\n\nاکنون میتونی مشتری را به ورودی اضافه کنی!",
|
||
"cancel": "❌ فرآیند لغو شد! \n\nمیتوانید هر زمان که خواستید /start را دوباره اجرا کنید. 🔄",
|
||
"error_add_client": "⚠️ خطا:\n\n {{ .error }}",
|
||
"using_default_value": "باشه، از مقدار پیشفرض استفاده میکنم. 😊",
|
||
"incorrect_input": "ورودی شما معتبر نیست.\nعبارتها باید بدون فاصله باشند.\nمثال صحیح: aaaaaa\nمثال نادرست: aaa aaa 🚫",
|
||
"AreYouSure": "مطمئنی؟ 🤔",
|
||
"SuccessResetTraffic": "📧 ایمیل: {{ .ClientEmail }}\n🏁 نتیجه: ✅ موفقیتآمیز",
|
||
"FailedResetTraffic": "📧 ایمیل: {{ .ClientEmail }}\n🏁 نتیجه: ❌ ناموفق \n\n🛠️ خطا: [ {{ .ErrorMessage }} ]",
|
||
"FinishProcess": "🔚 فرآیند بازنشانی ترافیک برای همه مشتریان به پایان رسید."
|
||
},
|
||
"buttons": {
|
||
"closeKeyboard": "❌ بستن کیبورد",
|
||
"cancel": "❌ لغو",
|
||
"cancelReset": "❌ لغو تنظیم مجدد",
|
||
"cancelIpLimit": "❌ لغو محدودیت آیپی",
|
||
"confirmResetTraffic": "✅ تأیید تنظیم مجدد ترافیک؟",
|
||
"confirmClearIps": "✅ تأیید پاکسازی آدرسهای آیپی؟",
|
||
"confirmRemoveTGUser": "✅ تأیید حذف کاربر تلگرام؟",
|
||
"confirmToggle": "✅ تایید فعال/غیرفعال کردن کاربر؟",
|
||
"dbBackup": "دریافت پشتیبان",
|
||
"serverUsage": "استفاده از سیستم",
|
||
"getInbounds": "دریافت ورودیها",
|
||
"depleteSoon": "بهزودی به پایان خواهد رسید",
|
||
"clientUsage": "دریافت آمار کاربر",
|
||
"onlines": "کاربران آنلاین",
|
||
"commands": "دستورات",
|
||
"refresh": "🔄 تازهسازی",
|
||
"clearIPs": "❌ پاکسازی آدرسها",
|
||
"removeTGUser": "❌ حذف کاربر تلگرام",
|
||
"selectTGUser": "👤 انتخاب کاربر تلگرام",
|
||
"selectOneTGUser": "👤 یک کاربر تلگرام را انتخاب کنید:",
|
||
"resetTraffic": "📈 تنظیم مجدد ترافیک",
|
||
"resetExpire": "📅 تنظیم مجدد تاریخ انقضا",
|
||
"ipLog": "🔢 لاگ آدرسهای IP",
|
||
"ipLimit": "🔢 محدودیت IP",
|
||
"setTGUser": "👤 تنظیم کاربر تلگرام",
|
||
"toggle": "🔘 فعال / غیرفعال",
|
||
"custom": "🔢 سفارشی",
|
||
"confirmNumber": "✅ تایید: {{ .Num }}",
|
||
"confirmNumberAdd": "✅ تایید اضافه کردن: {{ .Num }}",
|
||
"limitTraffic": "🚧 محدودیت ترافیک",
|
||
"getBanLogs": "گزارش های بلوک را دریافت کنید",
|
||
"allClients": "همه مشتریان",
|
||
"addClient": "افزودن مشتری",
|
||
"submitDisable": "ارسال به عنوان غیرفعال ☑️",
|
||
"submitEnable": "ارسال به عنوان فعال ✅",
|
||
"use_default": "🏷️ استفاده از پیشفرض",
|
||
"change_id": "⚙️🔑 شناسه",
|
||
"change_password": "⚙️🔑 گذرواژه",
|
||
"change_email": "⚙️📧 ایمیل",
|
||
"change_comment": "⚙️💬 نظر",
|
||
"change_flow": "⚙️🚦 جریان",
|
||
"ResetAllTraffics": "بازنشانی همه ترافیکها",
|
||
"SortedTrafficUsageReport": "گزارش استفاده از ترافیک مرتبشده"
|
||
},
|
||
"answers": {
|
||
"successfulOperation": "✅ انجام شد!",
|
||
"errorOperation": "❗ خطا در عملیات.",
|
||
"getInboundsFailed": "❌ دریافت ورودیها با خطا مواجه شد.",
|
||
"getClientsFailed": "❌ دریافت مشتریان با شکست مواجه شد.",
|
||
"canceled": "❌ {{ .Email }} : عملیات لغو شد.",
|
||
"clientRefreshSuccess": "✅ {{ .Email }} : کلاینت با موفقیت تازهسازی شد.",
|
||
"IpRefreshSuccess": "✅ {{ .Email }} : آدرسها با موفقیت تازهسازی شدند.",
|
||
"TGIdRefreshSuccess": "✅ {{ .Email }} : کاربر تلگرام کلاینت با موفقیت تازهسازی شد.",
|
||
"resetTrafficSuccess": "✅ {{ .Email }} : ترافیک با موفقیت تنظیم مجدد شد.",
|
||
"setTrafficLimitSuccess": "✅ {{ .Email }} : محدودیت ترافیک با موفقیت ذخیره شد.",
|
||
"expireResetSuccess": "✅ {{ .Email }} : تاریخ انقضا با موفقیت تنظیم مجدد شد.",
|
||
"resetIpSuccess": "✅ {{ .Email }} : محدودیت آدرس IP {{ .Count }} با موفقیت ذخیره شد.",
|
||
"clearIpSuccess": "✅ {{ .Email }} : آدرسها با موفقیت پاکسازی شدند.",
|
||
"getIpLog": "✅ {{ .Email }} : دریافت لاگ آدرسهای IP.",
|
||
"getUserInfo": "✅ {{ .Email }} : دریافت اطلاعات کاربر تلگرام.",
|
||
"removedTGUserSuccess": "✅ {{ .Email }} : کاربر تلگرام با موفقیت حذف شد.",
|
||
"enableSuccess": "✅ {{ .Email }} : با موفقیت فعال شد.",
|
||
"disableSuccess": "✅ {{ .Email }} : با موفقیت غیرفعال شد.",
|
||
"askToAddUserId": "پیکربندی شما یافت نشد!\r\nلطفاً از مدیر خود بخواهید که شناسه کاربر تلگرام خود را در پیکربندی (های) خود استفاده کند.\r\n\r\nشناسه کاربری شما: <code>{{ .TgUserID }}</code>",
|
||
"chooseClient": "یک مشتری برای ورودی {{ .Inbound }} انتخاب کنید",
|
||
"chooseInbound": "یک ورودی انتخاب کنید"
|
||
}
|
||
}
|
||
} |