mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-05-31 18:24:10 +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
57 KiB
JSON
1093 lines
No EOL
57 KiB
JSON
{
|
||
"username": "Kullanıcı Adı",
|
||
"password": "Şifre",
|
||
"login": "Giriş Yap",
|
||
"confirm": "Onayla",
|
||
"cancel": "İptal",
|
||
"close": "Kapat",
|
||
"save": "Kaydet",
|
||
"logout": "Çıkış Yap",
|
||
"create": "Oluştur",
|
||
"update": "Güncelle",
|
||
"copy": "Kopyala",
|
||
"copied": "Kopyalandı",
|
||
"download": "İndir",
|
||
"remark": "Açıklama",
|
||
"enable": "Etkin",
|
||
"protocol": "Protokol",
|
||
"search": "Ara",
|
||
"filter": "Filtrele",
|
||
"loading": "Yükleniyor...",
|
||
"refresh": "Yenile",
|
||
"clear": "Temizle",
|
||
"second": "Saniye",
|
||
"minute": "Dakika",
|
||
"hour": "Saat",
|
||
"day": "Gün",
|
||
"check": "Kontrol Et",
|
||
"indefinite": "Belirsiz",
|
||
"unlimited": "Sınırsız",
|
||
"none": "Hiçbiri",
|
||
"qrCode": "QR Kod",
|
||
"info": "Daha Fazla Bilgi",
|
||
"edit": "Düzenle",
|
||
"delete": "Sil",
|
||
"reset": "Sıfırla",
|
||
"noData": "Veri yok.",
|
||
"copySuccess": "Başarıyla Kopyalandı",
|
||
"sure": "Emin misiniz",
|
||
"encryption": "Şifreleme",
|
||
"useIPv4ForHost": "Ana bilgisayar için IPv4 kullan",
|
||
"transmission": "İletim",
|
||
"host": "Sunucu",
|
||
"path": "Yol",
|
||
"camouflage": "Kandırma",
|
||
"status": "Durum",
|
||
"enabled": "Etkin",
|
||
"disabled": "Devre Dışı",
|
||
"depleted": "Bitti",
|
||
"depletingSoon": "Bitmek Üzere",
|
||
"offline": "Çevrimdışı",
|
||
"online": "Çevrimiçi",
|
||
"domainName": "Alan Adı",
|
||
"monitor": "Dinleme IP",
|
||
"certificate": "Dijital Sertifika",
|
||
"fail": "Başarısız",
|
||
"comment": "Yorum",
|
||
"success": "Başarılı",
|
||
"lastOnline": "Son çevrimiçi",
|
||
"getVersion": "Sürümü Al",
|
||
"install": "Yükle",
|
||
"clients": "Müşteriler",
|
||
"usage": "Kullanım",
|
||
"twoFactorCode": "Kod",
|
||
"remained": "Kalan",
|
||
"security": "Güvenlik",
|
||
"secAlertTitle": "Güvenlik Uyarısı",
|
||
"secAlertSsl": "Bu bağlantı güvenli değil. Verilerin korunması için TLS etkinleştirilene kadar hassas bilgiler girmekten kaçının.",
|
||
"secAlertConf": "Bazı ayarlar saldırılara açıktır. Olası ihlalleri önlemek için güvenlik protokollerini güçlendirmeniz önerilir.",
|
||
"secAlertSSL": "Panelde güvenli bağlantı yok. Verilerin korunması için TLS sertifikası yükleyin.",
|
||
"secAlertPanelPort": "Panel varsayılan portu savunmasız. Rastgele veya belirli bir port yapılandırın.",
|
||
"secAlertPanelURI": "Panel varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.",
|
||
"secAlertSubURI": "Abonelik varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.",
|
||
"secAlertSubJsonURI": "Abonelik JSON varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.",
|
||
"emptyDnsDesc": "Eklenmiş DNS sunucusu yok.",
|
||
"emptyFakeDnsDesc": "Eklenmiş Fake DNS sunucusu yok.",
|
||
"emptyBalancersDesc": "Eklenmiş dengeleyici yok.",
|
||
"emptyReverseDesc": "Eklenmiş ters proxy yok.",
|
||
"somethingWentWrong": "Bir şeyler yanlış gitti",
|
||
"subscription": {
|
||
"title": "Abonelik Bilgisi",
|
||
"subId": "Abonelik Kimliği",
|
||
"status": "Durum",
|
||
"downloaded": "İndirilen",
|
||
"uploaded": "Yüklenen",
|
||
"expiry": "Son Kullanma",
|
||
"totalQuota": "Toplam Kota",
|
||
"individualLinks": "Bireysel Bağlantılar",
|
||
"active": "Aktif",
|
||
"inactive": "Pasif",
|
||
"unlimited": "Sınırsız",
|
||
"noExpiry": "Süresiz"
|
||
},
|
||
"menu": {
|
||
"theme": "Tema",
|
||
"dark": "Koyu",
|
||
"ultraDark": "Ultra Koyu",
|
||
"dashboard": "Genel Bakış",
|
||
"inbounds": "Gelenler",
|
||
"clients": "İstemciler",
|
||
"nodes": "Düğümler",
|
||
"settings": "Panel Ayarları",
|
||
"xray": "Xray Yapılandırmaları",
|
||
"apiDocs": "API Belgeleri",
|
||
"logout": "Çıkış Yap",
|
||
"link": "Yönet",
|
||
"donate": "Bağış Yap"
|
||
},
|
||
"pages": {
|
||
"login": {
|
||
"hello": "Merhaba",
|
||
"title": "Hoş Geldiniz",
|
||
"loginAgain": "Oturum süreniz doldu, lütfen tekrar giriş yapın",
|
||
"toasts": {
|
||
"invalidFormData": "Girdi verisi formatı geçersiz.",
|
||
"emptyUsername": "Kullanıcı adı gerekli",
|
||
"emptyPassword": "Şifre gerekli",
|
||
"wrongUsernameOrPassword": "Geçersiz kullanıcı adı, şifre veya iki adımlı doğrulama kodu.",
|
||
"successLogin": "Hesabınıza başarıyla giriş yaptınız."
|
||
}
|
||
},
|
||
"index": {
|
||
"title": "Genel Bakış",
|
||
"cpu": "İşlemci",
|
||
"logicalProcessors": "Mantıksal işlemciler",
|
||
"frequency": "Frekans",
|
||
"swap": "Takas",
|
||
"storage": "Depolama",
|
||
"memory": "RAM",
|
||
"threads": "İş parçacıkları",
|
||
"xrayStatus": "Xray",
|
||
"stopXray": "Durdur",
|
||
"restartXray": "Yeniden Başlat",
|
||
"xraySwitch": "Sürüm",
|
||
"xrayUpdates": "Xray Güncellemeleri",
|
||
"xraySwitchClick": "Geçiş yapmak istediğiniz sürümü seçin.",
|
||
"xraySwitchClickDesk": "Dikkatli seçin, eski sürümler mevcut yapılandırmalarla uyumlu olmayabilir.",
|
||
"updatePanel": "Paneli Güncelle",
|
||
"panelUpdateDesc": "Bu, 3X-UI'yi en son sürüme güncelleyecek ve panel servisini yeniden başlatacaktır.",
|
||
"currentPanelVersion": "Mevcut panel sürümü",
|
||
"latestPanelVersion": "Panelin en son sürümü",
|
||
"panelUpToDate": "Panel güncel",
|
||
"upToDate": "Güncel",
|
||
"xrayStatusUnknown": "Bilinmiyor",
|
||
"xrayStatusRunning": "Çalışıyor",
|
||
"xrayStatusStop": "Durduruldu",
|
||
"xrayStatusError": "Hata",
|
||
"xrayErrorPopoverTitle": "Xray çalıştırılırken bir hata oluştu",
|
||
"operationHours": "Çalışma Süresi",
|
||
"systemHistoryTitle": "Sistem Geçmişi",
|
||
"charts": "Grafikler",
|
||
"xrayMetricsTitle": "Xray Metrikleri",
|
||
"xrayMetricsDisabled": "Xray metrik uç noktası yapılandırılmadı",
|
||
"xrayMetricsHint": "xray yapılandırmasına tag metrics_out ve listen 127.0.0.1:11111 olan üst düzey bir metrics bloğu ekleyin, sonra xray'i yeniden başlatın.",
|
||
"xrayObservatoryEmpty": "Henüz Observatory verisi yok",
|
||
"xrayObservatoryHint": "xray yapılandırmasına test edilecek outbound etiketlerini listeleyen bir observatory bloğu ekleyin, sonra xray'i yeniden başlatın.",
|
||
"xrayObservatoryTagPlaceholder": "Outbound seç",
|
||
"xrayObservatoryAlive": "Aktif",
|
||
"xrayObservatoryDead": "Kapalı",
|
||
"xrayObservatoryLastSeen": "Son görülme",
|
||
"xrayObservatoryLastTry": "Son deneme",
|
||
"trendLast2Min": "Son 2 dakika",
|
||
"systemLoad": "Sistem Yükü",
|
||
"systemLoadDesc": "Geçmiş 1, 5 ve 15 dakika için sistem yük ortalaması",
|
||
"connectionCount": "Bağlantı İstatistikleri",
|
||
"ipAddresses": "IP adresleri",
|
||
"toggleIpVisibility": "IP görünürlüğünü değiştir",
|
||
"overallSpeed": "Genel hız",
|
||
"upload": "Yükleme",
|
||
"download": "İndirme",
|
||
"totalData": "Toplam veri",
|
||
"sent": "Gönderilen",
|
||
"received": "Alınan",
|
||
"documentation": "Dokümantasyon",
|
||
"xraySwitchVersionDialog": "Xray sürümünü gerçekten değiştirmek istiyor musunuz?",
|
||
"xraySwitchVersionDialogDesc": "Bu işlem Xray sürümünü #version# olarak değiştirecektir.",
|
||
"xraySwitchVersionPopover": "Xray başarıyla güncellendi",
|
||
"panelUpdateDialog": "Gerçekten paneli güncellemek istiyor musunuz?",
|
||
"panelUpdateDialogDesc": "Bu, 3X-UI'yi #version# sürümüne güncelleyecek ve panel servisini yeniden başlatacaktır.",
|
||
"panelUpdateCheckPopover": "Panel güncelleme kontrolü başarısız oldu",
|
||
"panelUpdateStartedPopover": "Panel güncellemesi başlatıldı",
|
||
"geofileUpdateDialog": "Geofile'ı gerçekten güncellemek istiyor musunuz?",
|
||
"geofileUpdateDialogDesc": "Bu işlem #filename# dosyasını güncelleyecektir.",
|
||
"geofilesUpdateDialogDesc": "Bu, tüm dosyaları güncelleyecektir.",
|
||
"geofilesUpdateAll": "Tümünü güncelle",
|
||
"geofileUpdatePopover": "Geofile başarıyla güncellendi",
|
||
"customGeoTitle": "Özel GeoSite / GeoIP",
|
||
"customGeoAdd": "Ekle",
|
||
"customGeoType": "Tür",
|
||
"customGeoAlias": "Takma ad",
|
||
"customGeoUrl": "URL",
|
||
"customGeoEnabled": "Etkin",
|
||
"customGeoLastUpdated": "Son güncelleme",
|
||
"customGeoExtColumn": "Yönlendirme (ext:…)",
|
||
"customGeoToastUpdateAll": "Tüm özel kaynaklar güncellendi",
|
||
"customGeoActions": "İşlemler",
|
||
"customGeoEdit": "Düzenle",
|
||
"customGeoDelete": "Sil",
|
||
"customGeoDownload": "Şimdi güncelle",
|
||
"customGeoModalAdd": "Özel geo ekle",
|
||
"customGeoModalEdit": "Özel geo düzenle",
|
||
"customGeoModalSave": "Kaydet",
|
||
"customGeoDeleteConfirm": "Bu özel geo kaynağını silinsin mi?",
|
||
"customGeoRoutingHint": "Yönlendirme kurallarında değer sütununu ext:dosya.dat:etiket olarak kullanın (etiketi değiştirin).",
|
||
"customGeoInvalidId": "Geçersiz kaynak kimliği",
|
||
"customGeoAliasesError": "Özel geo takma adları yüklenemedi",
|
||
"customGeoValidationAlias": "Takma ad yalnızca küçük harf, rakam, - ve _ içerebilir",
|
||
"customGeoValidationUrl": "URL http:// veya https:// ile başlamalıdır",
|
||
"customGeoAliasPlaceholder": "a-z 0-9 _ -",
|
||
"customGeoAliasLabelSuffix": " (özel)",
|
||
"customGeoToastList": "Özel geo listesi",
|
||
"customGeoToastAdd": "Özel geo ekle",
|
||
"customGeoToastUpdate": "Özel geo güncelle",
|
||
"customGeoToastDelete": "Özel geofile \"{{ .fileName }}\" silindi",
|
||
"customGeoToastDownload": "\"{{ .fileName }}\" geofile güncellendi",
|
||
"customGeoErrInvalidType": "Tür geosite veya geoip olmalıdır",
|
||
"customGeoErrAliasRequired": "Takma ad gerekli",
|
||
"customGeoErrAliasPattern": "Takma ad izin verilmeyen karakterler içeriyor",
|
||
"customGeoErrAliasReserved": "Bu takma ad ayrılmış",
|
||
"customGeoErrUrlRequired": "URL gerekli",
|
||
"customGeoErrInvalidUrl": "URL geçersiz",
|
||
"customGeoErrUrlScheme": "URL http veya https kullanmalıdır",
|
||
"customGeoErrUrlHost": "URL ana bilgisayarı geçersiz",
|
||
"customGeoErrDuplicateAlias": "Bu takma ad bu tür için zaten kullanılıyor",
|
||
"customGeoErrNotFound": "Özel geo kaynağı bulunamadı",
|
||
"customGeoErrDownload": "İndirme başarısız",
|
||
"customGeoErrUpdateAllIncomplete": "Bir veya daha fazla özel geo kaynağı güncellenemedi",
|
||
"customGeoEmpty": "Henüz özel geo kaynağı yok — oluşturmak için Ekle'ye tıklayın",
|
||
"dontRefresh": "Kurulum devam ediyor, lütfen bu sayfayı yenilemeyin",
|
||
"logs": "Günlükler",
|
||
"config": "Yapılandırma",
|
||
"backup": "Yedek",
|
||
"backupTitle": "Yedekleme & Geri Yükleme",
|
||
"exportDatabase": "Yedekle",
|
||
"exportDatabaseDesc": "Mevcut veritabanınızın yedeğini içeren bir .db dosyasını cihazınıza indirmek için tıklayın.",
|
||
"importDatabase": "Geri Yükle",
|
||
"importDatabaseDesc": "Cihazınızdan bir .db dosyası seçip yükleyerek veritabanınızı yedekten geri yüklemek için tıklayın.",
|
||
"importDatabaseSuccess": "Veritabanı başarıyla içe aktarıldı",
|
||
"importDatabaseError": "Veritabanı içe aktarılırken bir hata oluştu",
|
||
"readDatabaseError": "Veritabanı okunurken bir hata oluştu",
|
||
"getDatabaseError": "Veritabanı alınırken bir hata oluştu",
|
||
"getConfigError": "Yapılandırma dosyası alınırken bir hata oluştu"
|
||
},
|
||
"inbounds": {
|
||
"title": "Gelenler",
|
||
"totalDownUp": "Toplam Gönderilen/Alınan",
|
||
"totalUsage": "Toplam Kullanım",
|
||
"inboundCount": "Toplam Gelen",
|
||
"operate": "Menü",
|
||
"enable": "Etkin",
|
||
"remark": "Açıklama",
|
||
"node": "Düğüm",
|
||
"deployTo": "Şuraya dağıt",
|
||
"localPanel": "Yerel panel",
|
||
"fallbacks": {
|
||
"title": "Fallback'ler",
|
||
"help": "Bu inbound üzerindeki bir bağlantı hiçbir client ile eşleşmediğinde, başka bir inbound'a yönlendirilir. Aşağıdan bir child seçin; yönlendirme alanları (SNI / ALPN / Path / xver) onun transport'undan otomatik dolar — çoğu kurulum için ek ayar gerekmez. Her child 127.0.0.1 üzerinde security=none ile dinlemelidir.",
|
||
"empty": "Henüz fallback yok",
|
||
"add": "Fallback ekle",
|
||
"pickInbound": "Bir inbound seç",
|
||
"matchAny": "herhangi",
|
||
"rederive": "Child'dan yeniden doldur",
|
||
"rederived": "Child'dan yeniden dolduruldu",
|
||
"editAdvanced": "Yönlendirme alanlarını düzenle",
|
||
"hideAdvanced": "Gelişmişi gizle",
|
||
"quickAddAll": "Uygun olan tümünü hızlı ekle",
|
||
"quickAdded": "{n} fallback eklendi",
|
||
"quickAddedNone": "Eklenecek yeni uygun inbound yok",
|
||
"routesWhen": "Şu durumda yönlendirir",
|
||
"defaultCatchAll": "Varsayılan — başka her şeyi yakalar"
|
||
},
|
||
"protocol": "Protokol",
|
||
"port": "Port",
|
||
"portMap": "Port Atama",
|
||
"traffic": "Trafik",
|
||
"details": "Detaylar",
|
||
"transportConfig": "Taşıma",
|
||
"expireDate": "Süre",
|
||
"createdAt": "Oluşturuldu",
|
||
"updatedAt": "Güncellendi",
|
||
"resetTraffic": "Trafiği Sıfırla",
|
||
"addInbound": "Gelen Ekle",
|
||
"generalActions": "Genel Eylemler",
|
||
"modifyInbound": "Geleni Düzenle",
|
||
"deleteInbound": "Geleni Sil",
|
||
"deleteInboundContent": "Geleni silmek istediğinizden emin misiniz?",
|
||
"deleteClient": "Müşteriyi Sil",
|
||
"deleteClientContent": "Müşteriyi silmek istediğinizden emin misiniz?",
|
||
"resetTrafficContent": "Trafiği sıfırlamak istediğinizden emin misiniz?",
|
||
"copyLink": "URL'yi Kopyala",
|
||
"address": "Adres",
|
||
"network": "Ağ",
|
||
"destinationPort": "Hedef Port",
|
||
"targetAddress": "Hedef Adres",
|
||
"monitorDesc": "Tüm IP'leri dinlemek için boş bırakın",
|
||
"meansNoLimit": "= Sınırsız. (birim: GB)",
|
||
"totalFlow": "Toplam Akış",
|
||
"leaveBlankToNeverExpire": "Hiçbir zaman sona ermemesi için boş bırakın",
|
||
"noRecommendKeepDefault": "Varsayılanı korumanız önerilir",
|
||
"certificatePath": "Dosya Yolu",
|
||
"certificateContent": "Dosya İçeriği",
|
||
"publicKey": "Genel Anahtar",
|
||
"privatekey": "Özel Anahtar",
|
||
"clickOnQRcode": "Kopyalamak için QR Kodu Tıklayın",
|
||
"client": "Müşteri",
|
||
"export": "Tüm URL'leri Dışa Aktar",
|
||
"clone": "Klonla",
|
||
"cloneInbound": "Klonla",
|
||
"cloneInboundContent": "Bu gelenin tüm ayarları, Port, Dinleme IP ve Müşteriler hariç, klona uygulanacaktır.",
|
||
"cloneInboundOk": "Klonla",
|
||
"resetAllTraffic": "Tüm Gelen Trafiğini Sıfırla",
|
||
"resetAllTrafficTitle": "Tüm Gelen Trafiğini Sıfırla",
|
||
"resetAllTrafficContent": "Tüm gelenlerin trafiğini sıfırlamak istediğinizden emin misiniz?",
|
||
"resetInboundClientTraffics": "Müşteri Trafiklerini Sıfırla",
|
||
"resetInboundClientTrafficTitle": "Müşteri Trafiklerini Sıfırla",
|
||
"resetInboundClientTrafficContent": "Bu gelenin müşterilerinin trafiğini sıfırlamak istediğinizden emin misiniz?",
|
||
"resetAllClientTraffics": "Tüm Müşteri Trafiklerini Sıfırla",
|
||
"resetAllClientTrafficTitle": "Tüm Müşteri Trafiklerini Sıfırla",
|
||
"resetAllClientTrafficContent": "Tüm müşterilerin trafiğini sıfırlamak istediğinizden emin misiniz?",
|
||
"delDepletedClients": "Bitmiş Müşterileri Sil",
|
||
"delDepletedClientsTitle": "Bitmiş Müşterileri Sil",
|
||
"delDepletedClientsContent": "Tüm bitmiş müşterileri silmek istediğinizden emin misiniz?",
|
||
"email": "E-posta",
|
||
"emailDesc": "Lütfen benzersiz bir e-posta adresi sağlayın.",
|
||
"IPLimit": "IP Limiti",
|
||
"IPLimitDesc": "Sayının aşılması durumunda gelen devre dışı bırakılır. (0 = devre dışı)",
|
||
"IPLimitlog": "IP Günlüğü",
|
||
"IPLimitlogDesc": "IP geçmiş günlüğü. (devre dışı bırakıldıktan sonra gelini etkinleştirmek için günlüğü temizleyin)",
|
||
"IPLimitlogclear": "Günlüğü Temizle",
|
||
"setDefaultCert": "Panelden Sertifikayı Ayarla",
|
||
"streamTab": "Akış",
|
||
"securityTab": "Güvenlik",
|
||
"sniffingTab": "Sniffing",
|
||
"sniffingMetadataOnly": "Yalnızca üst veri",
|
||
"sniffingRouteOnly": "Yalnızca yönlendirme",
|
||
"sniffingIpsExcluded": "Hariç tutulan IP'ler",
|
||
"sniffingDomainsExcluded": "Hariç tutulan alan adları",
|
||
"decryption": "Şifre çözme",
|
||
"encryption": "Şifreleme",
|
||
"vlessAuthX25519": "X25519 kimlik doğrulama",
|
||
"vlessAuthMlkem768": "ML-KEM-768 kimlik doğrulama",
|
||
"vlessAuthCustom": "Özel",
|
||
"vlessAuthSelected": "Seçili: {auth}",
|
||
"advanced": {
|
||
"title": "Inbound JSON bölümleri",
|
||
"subtitle": "Tam inbound JSON'u ve settings, sniffing, streamSettings için odaklanmış düzenleyiciler.",
|
||
"all": "Tümü",
|
||
"allHelp": "Tüm alanları tek bir düzenleyicide içeren tam inbound nesnesi.",
|
||
"settings": "Ayarlar",
|
||
"settingsHelp": "Xray settings bloğunun sarmalayıcısı:",
|
||
"sniffing": "Sniffing",
|
||
"sniffingHelp": "Xray sniffing bloğunun sarmalayıcısı:",
|
||
"stream": "Akış",
|
||
"streamHelp": "Xray stream bloğunun sarmalayıcısı:",
|
||
"jsonErrorPrefix": "Gelişmiş JSON"
|
||
},
|
||
"telegramDesc": "Lütfen Telegram Sohbet Kimliği sağlayın. (botta '/id' komutunu kullanın) veya ({'@'}userinfobot)",
|
||
"subscriptionDesc": "Abonelik URL'inizi bulmak için 'Detaylar'a gidin. Ayrıca, aynı adı birden fazla müşteri için kullanabilirsiniz.",
|
||
"info": "Bilgi",
|
||
"same": "Aynı",
|
||
"inboundData": "Gelenin Verileri",
|
||
"exportInbound": "Geleni Dışa Aktar",
|
||
"import": "İçe Aktar",
|
||
"importInbound": "Bir Gelen İçe Aktar",
|
||
"periodicTrafficResetTitle": "Trafik Sıfırlama",
|
||
"periodicTrafficResetDesc": "Belirtilen aralıklarla trafik sayacını otomatik olarak sıfırla",
|
||
"lastReset": "Son Sıfırlama",
|
||
"periodicTrafficReset": {
|
||
"never": "Asla",
|
||
"daily": "Günlük",
|
||
"weekly": "Haftalık",
|
||
"monthly": "Aylık",
|
||
"hourly": "Saatlik"
|
||
},
|
||
"toasts": {
|
||
"obtain": "Elde Et",
|
||
"updateSuccess": "Güncelleme başarılı oldu",
|
||
"logCleanSuccess": "Günlük temizlendi",
|
||
"inboundsUpdateSuccess": "Gelen bağlantılar başarıyla güncellendi",
|
||
"inboundUpdateSuccess": "Gelen bağlantı başarıyla güncellendi",
|
||
"inboundCreateSuccess": "Gelen bağlantı başarıyla oluşturuldu",
|
||
"inboundDeleteSuccess": "Gelen bağlantı başarıyla silindi",
|
||
"inboundClientAddSuccess": "Gelen bağlantı istemci(leri) eklendi",
|
||
"inboundClientDeleteSuccess": "Gelen bağlantı istemcisi silindi",
|
||
"inboundClientUpdateSuccess": "Gelen bağlantı istemcisi güncellendi",
|
||
"delDepletedClientsSuccess": "Tüm tükenmiş istemciler silindi",
|
||
"resetAllClientTrafficSuccess": "İstemcinin tüm trafiği sıfırlandı",
|
||
"resetAllTrafficSuccess": "Tüm trafik sıfırlandı",
|
||
"resetInboundClientTrafficSuccess": "Trafik sıfırlandı",
|
||
"resetInboundTrafficSuccess": "Gelen trafik sıfırlandı",
|
||
"trafficGetError": "Trafik bilgisi alınırken hata oluştu",
|
||
"getNewX25519CertError": "X25519 sertifikası alınırken hata oluştu.",
|
||
"getNewmldsa65Error": "mldsa65 sertifikası alınırken hata oluştu.",
|
||
"getNewVlessEncError": "VlessEnc sertifikası alınırken hata oluştu."
|
||
},
|
||
"stream": {
|
||
"general": {
|
||
"request": "İstek",
|
||
"response": "Yanıt",
|
||
"name": "Ad",
|
||
"value": "Değer"
|
||
},
|
||
"tcp": {
|
||
"version": "Sürüm",
|
||
"method": "Yöntem",
|
||
"path": "Yol",
|
||
"status": "Durum",
|
||
"statusDescription": "Durum Açıklaması",
|
||
"requestHeader": "İstek Başlığı",
|
||
"responseHeader": "Yanıt Başlığı"
|
||
}
|
||
}
|
||
},
|
||
"clients": {
|
||
"add": "İstemci ekle",
|
||
"edit": "İstemciyi düzenle",
|
||
"submitAdd": "İstemci ekle",
|
||
"submitEdit": "Değişiklikleri kaydet",
|
||
"clientCount": "İstemci sayısı",
|
||
"bulk": "Toplu ekle",
|
||
"copyFromInbound": "Inbound'dan istemcileri kopyala",
|
||
"copyToInbound": "İstemcileri kopyalanacak yer",
|
||
"copySelected": "Seçileni kopyala",
|
||
"copySource": "Kaynak",
|
||
"copyEmailPreview": "Oluşacak e-posta önizlemesi",
|
||
"copySelectSourceFirst": "Önce bir kaynak inbound seçin.",
|
||
"copyResult": "Kopya sonucu",
|
||
"copyResultSuccess": "Başarıyla kopyalandı",
|
||
"copyResultNone": "Kopyalanacak bir şey yok: istemci seçilmemiş veya kaynak boş",
|
||
"copyResultErrors": "Kopyalama hataları",
|
||
"copyFlowLabel": "Yeni istemciler için Flow (VLESS)",
|
||
"copyFlowHint": "Kopyalanan tüm istemcilere uygulanır. Atlamak için boş bırakın.",
|
||
"selectAll": "Tümünü seç",
|
||
"clearAll": "Tümünü temizle",
|
||
"method": "Yöntem",
|
||
"first": "İlk",
|
||
"last": "Son",
|
||
"ipLog": "IP günlüğü",
|
||
"prefix": "Önek",
|
||
"postfix": "Sonek",
|
||
"delayedStart": "İlk kullanımdan sonra başla",
|
||
"expireDays": "Süre",
|
||
"days": "Gün",
|
||
"renew": "Otomatik yenileme",
|
||
"renewDesc": "Süre dolduktan sonra otomatik yenileme. (0 = devre dışı) (birim: gün)",
|
||
"title": "İstemciler",
|
||
"actions": "Eylemler",
|
||
"totalGB": "Toplam Gönderilen/Alınan (GB)",
|
||
"expiryTime": "Son kullanma",
|
||
"addClients": "İstemci ekle",
|
||
"limitIp": "IP limiti",
|
||
"password": "Şifre",
|
||
"subId": "Abonelik ID'si",
|
||
"online": "Çevrimiçi",
|
||
"email": "E-posta",
|
||
"comment": "Yorum",
|
||
"traffic": "Trafik",
|
||
"offline": "Çevrimdışı",
|
||
"addTitle": "İstemci ekle",
|
||
"qrCode": "QR kodu",
|
||
"moreInformation": "Daha fazla bilgi",
|
||
"delete": "Sil",
|
||
"reset": "Trafiği sıfırla",
|
||
"editTitle": "İstemciyi düzenle",
|
||
"client": "İstemci",
|
||
"enabled": "Etkin",
|
||
"remaining": "Kalan",
|
||
"duration": "Süre",
|
||
"attachedInbounds": "Bağlı inbound'lar",
|
||
"selectInbound": "Bir veya daha fazla inbound seçin",
|
||
"noSubId": "Bu istemcinin subId'si yok, paylaşılabilir bağlantı yok.",
|
||
"noLinks": "Paylaşılabilir bağlantı yok — önce bu istemciyi protokol destekli bir inbound'a bağlayın.",
|
||
"link": "Bağlantı",
|
||
"resetNotPossible": "Önce bu istemciyi bir inbound'a bağlayın.",
|
||
"general": "Genel",
|
||
"resetAllTraffics": "Tüm istemcilerin trafiğini sıfırla",
|
||
"resetAllTrafficsTitle": "Tüm istemcilerin trafiği sıfırlansın mı?",
|
||
"resetAllTrafficsContent": "Her istemcinin yükleme/indirme sayaçları sıfırlanır. Kotalar ve son kullanma tarihleri etkilenmez. Geri alınamaz.",
|
||
"empty": "Henüz istemci yok — başlamak için bir tane ekleyin.",
|
||
"deleteConfirmTitle": "{email} istemcisi silinsin mi?",
|
||
"deleteConfirmContent": "Bu işlem istemciyi bağlı tüm inbound'lardan kaldırır ve trafik kaydını siler. Geri alınamaz.",
|
||
"deleteSelected": "Sil ({count})",
|
||
"bulkDeleteConfirmTitle": "{count} istemci silinsin mi?",
|
||
"bulkDeleteConfirmContent": "Seçili her istemci bağlı tüm inbound'lardan kaldırılır ve trafik kaydı silinir. Geri alınamaz.",
|
||
"delDepleted": "Tükenmişleri sil",
|
||
"delDepletedConfirmTitle": "Tükenmiş istemciler silinsin mi?",
|
||
"delDepletedConfirmContent": "Trafik kotası dolan veya süresi geçen tüm istemciler silinir. Geri alınamaz.",
|
||
"auth": "Auth",
|
||
"hysteriaAuth": "Hysteria Auth",
|
||
"uuid": "UUID",
|
||
"flow": "Flow",
|
||
"reverseTag": "Reverse tag",
|
||
"reverseTagPlaceholder": "İsteğe bağlı Reverse tag",
|
||
"telegramId": "Telegram kullanıcı ID'si",
|
||
"telegramIdPlaceholder": "Sayısal Telegram kullanıcı ID'si (0 = yok)",
|
||
"created": "Oluşturuldu",
|
||
"updated": "Güncellendi",
|
||
"ipLimit": "IP limiti",
|
||
"toasts": {
|
||
"deleted": "İstemci silindi",
|
||
"trafficReset": "Trafik sıfırlandı",
|
||
"allTrafficsReset": "Tüm istemcilerin trafiği sıfırlandı",
|
||
"bulkDeleted": "{count} istemci silindi",
|
||
"bulkDeletedMixed": "{ok} silindi, {failed} başarısız",
|
||
"bulkCreated": "{count} istemci oluşturuldu",
|
||
"bulkCreatedMixed": "{ok} oluşturuldu, {failed} başarısız",
|
||
"delDepleted": "{count} tükenmiş istemci silindi"
|
||
}
|
||
},
|
||
"nodes": {
|
||
"title": "Düğümler",
|
||
"addNode": "Düğüm Ekle",
|
||
"editNode": "Düğümü Düzenle",
|
||
"totalNodes": "Toplam Düğüm",
|
||
"onlineNodes": "Çevrimiçi",
|
||
"offlineNodes": "Çevrimdışı",
|
||
"avgLatency": "Ortalama Gecikme",
|
||
"name": "Ad",
|
||
"namePlaceholder": "ör. de-frankfurt-1",
|
||
"addressPlaceholder": "panel.example.com veya 1.2.3.4",
|
||
"remark": "Açıklama",
|
||
"scheme": "Şema",
|
||
"address": "Adres",
|
||
"port": "Port",
|
||
"basePath": "Temel Yol",
|
||
"apiToken": "API Token",
|
||
"apiTokenPlaceholder": "Uzak panelin Ayarlar sayfasındaki token",
|
||
"apiTokenHint": "Uzak panel API token'ını Ayarlar → API Token altında gösterir.",
|
||
"regenerate": "Token'ı Yeniden Oluştur",
|
||
"regenerateConfirm": "Yeniden oluşturmak mevcut token'ı geçersiz kılar. Onu kullanan tüm merkezi paneller, güncellenene kadar erişimini kaybeder. Devam edilsin mi?",
|
||
"allowPrivateAddress": "Özel adrese izin ver",
|
||
"allowPrivateAddressHint": "Yalnızca özel ağ veya VPN üzerindeki düğümler için etkinleştir.",
|
||
"enable": "Etkin",
|
||
"status": "Durum",
|
||
"cpu": "CPU",
|
||
"mem": "Bellek",
|
||
"uptime": "Çalışma Süresi",
|
||
"latency": "Gecikme",
|
||
"lastHeartbeat": "Son Sinyal",
|
||
"xrayVersion": "Xray Sürümü",
|
||
"panelVersion": "Panel sürümü",
|
||
"actions": "İşlemler",
|
||
"probe": "Şimdi Test Et",
|
||
"testConnection": "Bağlantıyı Test Et",
|
||
"connectionOk": "Bağlantı tamam ({ms} ms)",
|
||
"connectionFailed": "Bağlantı başarısız",
|
||
"never": "asla",
|
||
"justNow": "şimdi",
|
||
"deleteConfirmTitle": "\"{name}\" düğümü silinsin mi?",
|
||
"deleteConfirmContent": "Bu, düğüm izlemeyi durdurur. Uzak panelin kendisi etkilenmez.",
|
||
"statusValues": {
|
||
"online": "Çevrimiçi",
|
||
"offline": "Çevrimdışı",
|
||
"unknown": "Bilinmiyor"
|
||
},
|
||
"toasts": {
|
||
"list": "Düğümler yüklenemedi",
|
||
"obtain": "Düğüm yüklenemedi",
|
||
"add": "Düğüm ekle",
|
||
"update": "Düğümü güncelle",
|
||
"delete": "Düğümü sil",
|
||
"deleted": "Düğüm silindi",
|
||
"test": "Bağlantıyı test et",
|
||
"fillRequired": "Ad, adres, port ve API token gereklidir",
|
||
"probeFailed": "Test başarısız"
|
||
}
|
||
},
|
||
"settings": {
|
||
"title": "Panel Ayarları",
|
||
"save": "Kaydet",
|
||
"infoDesc": "Burada yapılan her değişikliğin kaydedilmesi gerekir. Değişikliklerin uygulanması için paneli yeniden başlatın.",
|
||
"restartPanel": "Paneli Yeniden Başlat",
|
||
"restartPanelDesc": "Paneli yeniden başlatmak istediğinizden emin misiniz? Yeniden başlattıktan sonra panele erişemezseniz, sunucudaki panel günlük bilgilerini görüntüleyin.",
|
||
"restartPanelSuccess": "Panel başarıyla yeniden başlatıldı",
|
||
"actions": "Eylemler",
|
||
"resetDefaultConfig": "Varsayılana Sıfırla",
|
||
"panelSettings": "Genel",
|
||
"securitySettings": "Kimlik Doğrulama",
|
||
"TGBotSettings": "Telegram Bot",
|
||
"panelListeningIP": "Dinleme IP",
|
||
"panelListeningIPDesc": "Web paneli için IP adresi. (tüm IP'leri dinlemek için boş bırakın)",
|
||
"panelListeningDomain": "Dinleme Alan Adı",
|
||
"panelListeningDomainDesc": "Web paneli için alan adı. (tüm alan adlarını ve IP'leri dinlemek için boş bırakın)",
|
||
"panelPort": "Dinleme Portu",
|
||
"panelPortDesc": "Web paneli için port numarası. (kullanılmayan bir port olmalıdır)",
|
||
"publicKeyPath": "Genel Anahtar Yolu",
|
||
"publicKeyPathDesc": "Web paneli için genel anahtar dosya yolu. ('/' ile başlar)",
|
||
"privateKeyPath": "Özel Anahtar Yolu",
|
||
"privateKeyPathDesc": "Web paneli için özel anahtar dosya yolu. ('/' ile başlar)",
|
||
"panelUrlPath": "URI Yolu",
|
||
"panelUrlPathDesc": "Web paneli için URI yolu. ('/' ile başlar ve '/' ile biter)",
|
||
"pageSize": "Sayfa Boyutu",
|
||
"pageSizeDesc": "Gelenler tablosu için sayfa boyutunu belirleyin. (0 = devre dışı)",
|
||
"remarkModel": "Açıklama Modeli & Ayırma Karakteri",
|
||
"datepicker": "Takvim Türü",
|
||
"datepickerPlaceholder": "Tarih Seçin",
|
||
"datepickerDescription": "Planlanmış görevler bu takvime göre çalışacaktır.",
|
||
"sampleRemark": "Örnek Açıklama",
|
||
"oldUsername": "Mevcut Kullanıcı Adı",
|
||
"currentPassword": "Mevcut Şifre",
|
||
"newUsername": "Yeni Kullanıcı Adı",
|
||
"newPassword": "Yeni Şifre",
|
||
"telegramBotEnable": "Telegram Botunu Etkinleştir",
|
||
"telegramBotEnableDesc": "Telegram botunu etkinleştirir.",
|
||
"telegramToken": "Telegram Token",
|
||
"telegramTokenDesc": "'{'@'}BotFather'dan alınan Telegram bot token.",
|
||
"telegramProxy": "SOCKS Proxy",
|
||
"telegramProxyDesc": "Telegram'a bağlanmak için SOCKS5 proxy'sini etkinleştirir. (ayarları kılavuzda belirtilen şekilde ayarlayın)",
|
||
"telegramAPIServer": "Telegram API Server",
|
||
"telegramAPIServerDesc": "Kullanılacak Telegram API sunucusu. Varsayılan sunucuyu kullanmak için boş bırakın.",
|
||
"telegramChatId": "Yönetici Sohbet Kimliği",
|
||
"telegramChatIdDesc": "Telegram Yönetici Sohbet Kimliği(leri). (virgülle ayrılmış)(buradan alın {'@'}userinfobot) veya (botta '/id' komutunu kullanın)",
|
||
"telegramNotifyTime": "Bildirim Zamanı",
|
||
"telegramNotifyTimeDesc": "Periyodik raporlar için ayarlanan Telegram bot bildirim zamanı. (crontab zaman formatını kullanın)",
|
||
"tgNotifyBackup": "Veritabanı Yedeği",
|
||
"tgNotifyBackupDesc": "Bir rapor ile birlikte veritabanı yedek dosyasını gönder.",
|
||
"tgNotifyLogin": "Giriş Bildirimi",
|
||
"tgNotifyLoginDesc": "Birisi web panelinize giriş yapmaya çalıştığında kullanıcı adı, IP adresi ve zaman hakkında bildirim alın.",
|
||
"sessionMaxAge": "Oturum Süresi",
|
||
"sessionMaxAgeDesc": "Giriş yaptıktan sonra oturum süresi. (birim: dakika)",
|
||
"expireTimeDiff": "Son Kullanma Tarihi Bildirimi",
|
||
"expireTimeDiffDesc": "Bu eşik seviyesine ulaşıldığında son kullanma tarihi hakkında bildirim alın. (birim: gün)",
|
||
"trafficDiff": "Trafik Sınırı Bildirimi",
|
||
"trafficDiffDesc": "Bu eşik seviyesine ulaşıldığında trafik sınırı hakkında bildirim alın. (birim: GB)",
|
||
"tgNotifyCpu": "CPU Yükü Bildirimi",
|
||
"tgNotifyCpuDesc": "CPU yükü bu eşik seviyesini aşarsa bildirim alın. (birim: %)",
|
||
"timeZone": "Saat Dilimi",
|
||
"timeZoneDesc": "Planlanmış görevler bu saat dilimine göre çalışacaktır.",
|
||
"subSettings": "Abonelik",
|
||
"subEnable": "Abonelik Hizmetini Etkinleştir",
|
||
"subEnableDesc": "Abonelik hizmetini etkinleştirir.",
|
||
"subJsonEnable": "JSON abonelik uç noktasını bağımsız olarak Etkinleştir/Devre Dışı bırak.",
|
||
"subTitle": "Abonelik Başlığı",
|
||
"subTitleDesc": "VPN istemcisinde gösterilen başlık",
|
||
"subSupportUrl": "Destek URL'si",
|
||
"subSupportUrlDesc": "VPN istemcisinde gösterilen teknik destek bağlantısı",
|
||
"subProfileUrl": "Profil URL'si",
|
||
"subProfileUrlDesc": "VPN istemcisinde görüntülenen web sitenize giden bağlantı",
|
||
"subAnnounce": "Duyuru",
|
||
"subAnnounceDesc": "VPN istemcisinde görüntülenen duyuru metni",
|
||
"subEnableRouting": "Yönlendirmeyi etkinleştir",
|
||
"subEnableRoutingDesc": "VPN istemcisinde yönlendirmeyi etkinleştirmek için genel ayar. (Yalnızca Happ için)",
|
||
"subRoutingRules": "Yönlendirme kuralları",
|
||
"subRoutingRulesDesc": "VPN istemcisi için genel yönlendirme kuralları. (Yalnızca Happ için)",
|
||
"subListen": "Dinleme IP",
|
||
"subListenDesc": "Abonelik hizmeti için IP adresi. (tüm IP'leri dinlemek için boş bırakın)",
|
||
"subPort": "Dinleme Portu",
|
||
"subPortDesc": "Abonelik hizmeti için port numarası. (kullanılmayan bir port olmalıdır)",
|
||
"subCertPath": "Genel Anahtar Yolu",
|
||
"subCertPathDesc": "Abonelik hizmeti için genel anahtar dosya yolu. ('/' ile başlar)",
|
||
"subKeyPath": "Özel Anahtar Yolu",
|
||
"subKeyPathDesc": "Abonelik hizmeti için özel anahtar dosya yolu. ('/' ile başlar)",
|
||
"subPath": "URI Yolu",
|
||
"subPathDesc": "Abonelik hizmeti için URI yolu. ('/' ile başlar ve '/' ile biter)",
|
||
"subDomain": "Dinleme Alan Adı",
|
||
"subDomainDesc": "Abonelik hizmeti için alan adı. (tüm alan adlarını ve IP'leri dinlemek için boş bırakın)",
|
||
"subUpdates": "Güncelleme Aralıkları",
|
||
"subUpdatesDesc": "Müşteri uygulamalarındaki abonelik URL'sinin güncelleme aralıkları. (birim: saat)",
|
||
"subEncrypt": "Şifrele",
|
||
"subEncryptDesc": "Abonelik hizmetinin döndürülen içeriği Base64 ile şifrelenir.",
|
||
"subShowInfo": "Kullanım Bilgisini Göster",
|
||
"subShowInfoDesc": "Kalan trafik ve tarih müşteri uygulamalarında görüntülenir.",
|
||
"subEmailInRemark": "Ada Email Ekle",
|
||
"subEmailInRemarkDesc": "Abonelik profil adına istemcinin e-postasını dahil edin.",
|
||
"subURI": "Ters Proxy URI",
|
||
"subURIDesc": "Proxy arkasında kullanılacak abonelik URL'sinin URI yolu.",
|
||
"externalTrafficInformEnable": "Harici Trafik Bilgisi",
|
||
"externalTrafficInformEnableDesc": "Her trafik güncellemesinde harici API'yi bilgilendirin.",
|
||
"externalTrafficInformURI": "Harici Trafik Bilgisi URI'si",
|
||
"externalTrafficInformURIDesc": "Trafik güncellemeleri bu URI'ye gönderildi.",
|
||
"restartXrayOnClientDisable": "Otomatik Devre Dışı Sonrası Xray'i Yeniden Başlat",
|
||
"restartXrayOnClientDisableDesc": "Bir istemci süre dolumu veya trafik limiti nedeniyle otomatik devre dışı bırakıldığında Xray'i yeniden başlat.",
|
||
"fragment": "Parçalama",
|
||
"fragmentDesc": "TLS merhaba paketinin parçalanmasını etkinleştir.",
|
||
"fragmentSett": "Parçalama Ayarları",
|
||
"noisesDesc": "Noises'i Etkinleştir.",
|
||
"noisesSett": "Noises Ayarları",
|
||
"mux": "Mux",
|
||
"muxDesc": "Kurulmuş bir veri akışında birden çok bağımsız veri akışını iletir.",
|
||
"muxSett": "Mux Ayarları",
|
||
"direct": "Doğrudan Bağlantı",
|
||
"directDesc": "Belirli bir ülkenin alan adları veya IP aralıkları ile doğrudan bağlantı kurar.",
|
||
"notifications": "Bildirimler",
|
||
"certs": "Sertifikalar",
|
||
"externalTraffic": "Harici Trafik",
|
||
"dateAndTime": "Tarih ve Saat",
|
||
"proxyAndServer": "Proxy ve Sunucu",
|
||
"intervals": "Aralıklar",
|
||
"information": "Bilgi",
|
||
"language": "Dil",
|
||
"telegramBotLanguage": "Telegram Bot Dili",
|
||
"security": {
|
||
"admin": "Yönetici kimlik bilgileri",
|
||
"twoFactor": "İki adımlı doğrulama",
|
||
"twoFactorEnable": "2FA'yı Etkinleştir",
|
||
"twoFactorEnableDesc": "Daha fazla güvenlik için ek bir doğrulama katmanı ekler.",
|
||
"twoFactorModalSetTitle": "İki adımlı doğrulamayı etkinleştir",
|
||
"twoFactorModalDeleteTitle": "İki adımlı doğrulamayı devre dışı bırak",
|
||
"twoFactorModalSteps": "İki adımlı doğrulamayı ayarlamak için şu adımları izleyin:",
|
||
"twoFactorModalFirstStep": "1. Bu QR kodunu doğrulama uygulamasında tarayın veya QR kodunun yanındaki token'ı kopyalayıp uygulamaya yapıştırın",
|
||
"twoFactorModalSecondStep": "2. Uygulamadaki kodu girin",
|
||
"twoFactorModalRemoveStep": "İki adımlı doğrulamayı kaldırmak için uygulamadaki kodu girin.",
|
||
"twoFactorModalChangeCredentialsTitle": "Kimlik bilgilerini değiştir",
|
||
"twoFactorModalChangeCredentialsStep": "Yönetici kimlik bilgilerini değiştirmek için uygulamadaki kodu girin.",
|
||
"twoFactorModalSetSuccess": "İki faktörlü kimlik doğrulama başarıyla kuruldu",
|
||
"twoFactorModalDeleteSuccess": "İki faktörlü kimlik doğrulama başarıyla silindi",
|
||
"twoFactorModalError": "Yanlış kod",
|
||
"show": "Göster",
|
||
"hide": "Gizle",
|
||
"apiTokenNew": "Yeni token",
|
||
"apiTokenName": "Ad",
|
||
"apiTokenNamePlaceholder": "örn. central-panel-a",
|
||
"apiTokenNameRequired": "Ad zorunludur",
|
||
"apiTokenEmpty": "Henüz token yok — bot veya uzak panelleri doğrulamak için bir tane oluşturun.",
|
||
"apiTokenDeleteWarning": "Bu tokenı kullanan tüm istemciler anında kimlik doğrulamasını kaybeder."
|
||
},
|
||
"toasts": {
|
||
"modifySettings": "Parametreler değiştirildi.",
|
||
"getSettings": "Parametreler alınırken bir hata oluştu.",
|
||
"modifyUserError": "Yönetici kimlik bilgileri değiştirilirken bir hata oluştu.",
|
||
"modifyUser": "Yönetici kimlik bilgilerini başarıyla değiştirdiniz.",
|
||
"originalUserPassIncorrect": "Mevcut kullanıcı adı veya şifre geçersiz",
|
||
"userPassMustBeNotEmpty": "Yeni kullanıcı adı ve şifre boş olamaz",
|
||
"getOutboundTrafficError": "Giden trafik alınırken hata",
|
||
"resetOutboundTrafficError": "Giden trafik sıfırlanırken hata"
|
||
}
|
||
},
|
||
"xray": {
|
||
"title": "Xray Yapılandırmaları",
|
||
"save": "Kaydet",
|
||
"restart": "Xray'i Yeniden Başlat",
|
||
"restartSuccess": "Xray başarıyla yeniden başlatıldı",
|
||
"stopSuccess": "Xray başarıyla durduruldu",
|
||
"restartError": "Xray yeniden başlatılırken bir hata oluştu.",
|
||
"stopError": "Xray durdurulurken bir hata oluştu.",
|
||
"basicTemplate": "Temeller",
|
||
"advancedTemplate": "Gelişmiş",
|
||
"generalConfigs": "Genel",
|
||
"generalConfigsDesc": "Bu seçenekler genel ayarlamaları belirler.",
|
||
"logConfigs": "Günlük",
|
||
"logConfigsDesc": "Günlükler sunucunuzun verimliliğini etkileyebilir. Yalnızca ihtiyaç durumunda akıllıca etkinleştirmeniz önerilir",
|
||
"blockConfigsDesc": "Bu seçenekler belirli istek protokolleri ve web siteleri temelinde trafiği engeller.",
|
||
"basicRouting": "Temel Yönlendirme",
|
||
"blockConnectionsConfigsDesc": "Bu seçenekler belirli bir istenen ülkeye göre trafiği engelleyecektir.",
|
||
"directConnectionsConfigsDesc": "Doğrudan bağlantı, belirli bir trafiğin başka bir sunucu üzerinden yönlendirilmediğini sağlar.",
|
||
"blockips": "IP'leri Engelle",
|
||
"blockdomains": "Alan Adlarını Engelle",
|
||
"directips": "Doğrudan IP'ler",
|
||
"directdomains": "Doğrudan Alan Adları",
|
||
"ipv4Routing": "IPv4 Yönlendirme",
|
||
"ipv4RoutingDesc": "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir.",
|
||
"warpRouting": "WARP Yönlendirme",
|
||
"warpRoutingDesc": "Bu seçenekler belirli bir varış yerine WARP üzerinden trafiği yönlendirir.",
|
||
"nordRouting": "NordVPN Yönlendirme",
|
||
"nordRoutingDesc": "Bu seçenekler belirli bir varış yerine NordVPN üzerinden trafiği yönlendirir.",
|
||
"Template": "Gelişmiş Xray Yapılandırma Şablonu",
|
||
"TemplateDesc": "Nihai Xray yapılandırma dosyası bu şablona göre oluşturulacaktır.",
|
||
"FreedomStrategy": "Freedom Protokol Stratejisi",
|
||
"FreedomStrategyDesc": "Freedom Protokolünde ağın çıkış stratejisini ayarlayın.",
|
||
"RoutingStrategy": "Genel Yönlendirme Stratejisi",
|
||
"RoutingStrategyDesc": "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın.",
|
||
"outboundTestUrl": "Outbound test URL",
|
||
"outboundTestUrlDesc": "Outbound bağlantı testinde kullanılan URL",
|
||
"Torrent": "BitTorrent Protokolünü Engelle",
|
||
"Inbounds": "Gelenler",
|
||
"InboundsDesc": "Belirli müşterileri kabul eder.",
|
||
"Outbounds": "Gidenler",
|
||
"Balancers": "Dengeler",
|
||
"OutboundsDesc": "Giden trafiğin yolunu ayarlayın.",
|
||
"Routings": "Yönlendirme Kuralları",
|
||
"RoutingsDesc": "Her kuralın önceliği önemlidir!",
|
||
"completeTemplate": "Tümü",
|
||
"logLevel": "Günlük Seviyesi",
|
||
"logLevelDesc": "Hata günlükleri için günlük seviyesi, kaydedilmesi gereken bilgileri belirtir.",
|
||
"accessLog": "Erişim Günlüğü",
|
||
"accessLogDesc": "Erişim günlüğü için dosya yolu. 'none' özel değeri erişim günlüklerini devre dışı bırakır",
|
||
"errorLog": "Hata Günlüğü",
|
||
"errorLogDesc": "Hata günlüğü için dosya yolu. 'none' özel değeri hata günlüklerini devre dışı bırakır",
|
||
"dnsLog": "DNS Günlüğü",
|
||
"dnsLogDesc": "DNS sorgu günlüklerini etkinleştirin",
|
||
"maskAddress": "Adres Maskesi",
|
||
"maskAddressDesc": "IP adresi maskesi, etkinleştirildiğinde, günlükte görünen IP adresini otomatik olarak değiştirecektir.",
|
||
"statistics": "İstatistikler",
|
||
"statsInboundUplink": "Gelen Yükleme İstatistikleri",
|
||
"statsInboundUplinkDesc": "Tüm gelen proxy'lerin yükleme trafiği için istatistik toplamayı etkinleştirir.",
|
||
"statsInboundDownlink": "Gelen İndirme İstatistikleri",
|
||
"statsInboundDownlinkDesc": "Tüm gelen proxy'lerin indirme trafiği için istatistik toplamayı etkinleştirir.",
|
||
"statsOutboundUplink": "Giden Yükleme İstatistikleri",
|
||
"statsOutboundUplinkDesc": "Tüm giden proxy'lerin yükleme trafiği için istatistik toplamayı etkinleştirir.",
|
||
"statsOutboundDownlink": "Giden İndirme İstatistikleri",
|
||
"statsOutboundDownlinkDesc": "Tüm giden proxy'lerin indirme trafiği için istatistik toplamayı etkinleştirir.",
|
||
"rules": {
|
||
"first": "İlk",
|
||
"last": "Son",
|
||
"up": "Yukarı",
|
||
"down": "Aşağı",
|
||
"source": "Kaynak",
|
||
"dest": "Hedef",
|
||
"inbound": "Gelen",
|
||
"outbound": "Giden",
|
||
"balancer": "Dengeler",
|
||
"info": "Bilgi",
|
||
"add": "Kural Ekle",
|
||
"edit": "Kuralı Düzenle",
|
||
"useComma": "Virgülle ayrılmış öğeler"
|
||
},
|
||
"outbound": {
|
||
"addOutbound": "Giden Ekle",
|
||
"addReverse": "Ters Ekle",
|
||
"editOutbound": "Gideni Düzenle",
|
||
"editReverse": "Tersi Düzenle",
|
||
"reverseTag": "Ters Etiket",
|
||
"reverseTagDesc": "VLESS basit ters proxy çıkış etiketi. Devre dışı bırakmak için boş bırakın.",
|
||
"reverseTagPlaceholder": "çıkış etiketi (boş = devre dışı)",
|
||
"tag": "Etiket",
|
||
"tagDesc": "Benzersiz Etiket",
|
||
"address": "Adres",
|
||
"reverse": "Ters",
|
||
"domain": "Alan Adı",
|
||
"type": "Tür",
|
||
"bridge": "Köprü",
|
||
"portal": "Portal",
|
||
"link": "Bağlantı",
|
||
"intercon": "Bağlantı",
|
||
"settings": "Ayarlar",
|
||
"accountInfo": "Hesap Bilgileri",
|
||
"outboundStatus": "Giden Durumu",
|
||
"sendThrough": "Üzerinden Gönder",
|
||
"test": "Test",
|
||
"testResult": "Test Sonucu",
|
||
"testing": "Bağlantı test ediliyor...",
|
||
"testSuccess": "Test başarılı",
|
||
"testFailed": "Test başarısız",
|
||
"testError": "Giden test edilemedi",
|
||
"nordvpn": "NordVPN",
|
||
"accessToken": "Erişim Jetonu",
|
||
"country": "Ülke",
|
||
"server": "Sunucu",
|
||
"city": "Şehir",
|
||
"allCities": "Tüm Şehirler",
|
||
"privateKey": "Özel Anahtar",
|
||
"load": "Yük"
|
||
},
|
||
"balancer": {
|
||
"addBalancer": "Dengeleyici Ekle",
|
||
"editBalancer": "Dengeleyiciyi Düzenle",
|
||
"balancerStrategy": "Strateji",
|
||
"balancerSelectors": "Seçiciler",
|
||
"tag": "Etiket",
|
||
"tagDesc": "Benzersiz Etiket",
|
||
"balancerDesc": "Dengeleyici Etiketi ve Giden Etiketi aynı anda kullanılamaz. Aynı anda kullanıldığında yalnızca giden etiketi çalışır."
|
||
},
|
||
"wireguard": {
|
||
"secretKey": "Gizli Anahtar",
|
||
"publicKey": "Genel Anahtar",
|
||
"allowedIPs": "İzin Verilen IP'ler",
|
||
"endpoint": "Uç Nokta",
|
||
"psk": "Ön Paylaşılan Anahtar",
|
||
"domainStrategy": "Alan Adı Stratejisi"
|
||
},
|
||
"tun": {
|
||
"nameDesc": "TUN arabiriminin adı. Varsayılan değer 'xray0'dir",
|
||
"mtuDesc": "Maksimum İletim Birimi. Veri paketlerinin maksimum boyutu. Varsayılan değer 1500'dür",
|
||
"userLevel": "Kullanıcı Seviyesi",
|
||
"userLevelDesc": "Bu giriş yoluyla yapılan tüm bağlantılar bu kullanıcı seviyesini kullanacaktır. Varsayılan değer 0'dır"
|
||
},
|
||
"dns": {
|
||
"enable": "DNS'yi Etkinleştir",
|
||
"enableDesc": "Dahili DNS sunucusunu etkinleştir",
|
||
"tag": "DNS Gelen Etiketi",
|
||
"tagDesc": "Bu etiket, yönlendirme kurallarında Gelen etiketi olarak kullanılabilir.",
|
||
"clientIp": "İstemci IP",
|
||
"clientIpDesc": "DNS sorguları sırasında belirtilen IP konumunu sunucuya bildirmek için kullanılır",
|
||
"disableCache": "Önbelleği devre dışı bırak",
|
||
"disableCacheDesc": "DNS önbelleğini devre dışı bırakır",
|
||
"disableFallback": "Yedeklemeyi devre dışı bırak",
|
||
"disableFallbackDesc": "Yedek DNS sorgularını devre dışı bırakır",
|
||
"disableFallbackIfMatch": "Eşleşirse Yedeklemeyi Devre Dışı Bırak",
|
||
"disableFallbackIfMatchDesc": "DNS sunucusunun eşleşen alan adı listesi vurulduğunda yedek DNS sorgularını devre dışı bırakır",
|
||
"enableParallelQuery": "Paralel Sorguyu Etkinleştir",
|
||
"enableParallelQueryDesc": "Daha hızlı çözümleme için birden fazla sunucuya paralel DNS sorgularını etkinleştir",
|
||
"strategy": "Sorgu Stratejisi",
|
||
"strategyDesc": "Alan adlarını çözmek için genel strateji",
|
||
"add": "Sunucu Ekle",
|
||
"edit": "Sunucuyu Düzenle",
|
||
"domains": "Alan Adları",
|
||
"expectIPs": "Beklenen IP'ler",
|
||
"unexpectIPs": "Beklenmeyen IP'ler",
|
||
"useSystemHosts": "Sistem Hosts'larını Kullan",
|
||
"useSystemHostsDesc": "Yüklü bir sistemden hosts dosyasını kullan",
|
||
"serveStale": "Süresi Dolmuş Sonuçları Sun",
|
||
"serveStaleDesc": "Arka planda yenilenirken süresi dolmuş önbellek sonuçlarını döndür",
|
||
"serveExpiredTTL": "Süresi Dolmuş TTL",
|
||
"serveExpiredTTLDesc": "Süresi dolmuş önbellek girdilerinin geçerlilik süresi (saniye); 0 = asla",
|
||
"timeoutMs": "Zaman aşımı (ms)",
|
||
"skipFallback": "Yedekleri Atla",
|
||
"finalQuery": "Son Sorgu",
|
||
"hosts": "Hosts",
|
||
"hostsAdd": "Host Ekle",
|
||
"hostsEmpty": "Tanımlı Host yok",
|
||
"hostsDomain": "Alan adı (ör. domain:example.com)",
|
||
"hostsValues": "IP veya alan adı — yazıp Enter'a basın",
|
||
"usePreset": "Şablon kullan",
|
||
"dnsPresetTitle": "DNS Şablonları",
|
||
"dnsPresetFamily": "Aile",
|
||
"clearAll": "Tümünü Sil",
|
||
"clearAllTitle": "Tüm DNS sunucularını sil?",
|
||
"clearAllConfirm": "Bu, tüm DNS sunucularını listeden kaldırır. Geri alınamaz."
|
||
},
|
||
"fakedns": {
|
||
"add": "Sahte DNS Ekle",
|
||
"edit": "Sahte DNS'i Düzenle",
|
||
"ipPool": "IP Havuzu Alt Ağı",
|
||
"poolSize": "Havuz Boyutu"
|
||
}
|
||
}
|
||
},
|
||
"tgbot": {
|
||
"keyboardClosed": "❌ Klavye kapatıldı!",
|
||
"noResult": "❗ Sonuç yok!",
|
||
"noQuery": "❌ Sorgu bulunamadı! Lütfen komutu tekrar kullanın!",
|
||
"wentWrong": "❌ Bir şeyler yanlış gitti!",
|
||
"noIpRecord": "❗ IP Kaydı Yok!",
|
||
"noInbounds": "❗ Gelen bağlantı bulunamadı!",
|
||
"unlimited": "♾ Sınırsız (Sıfırla)",
|
||
"add": "Ekle",
|
||
"month": "Ay",
|
||
"months": "Aylar",
|
||
"day": "Gün",
|
||
"days": "Günler",
|
||
"hours": "Saatler",
|
||
"minutes": "Dakika",
|
||
"unknown": "Bilinmeyen",
|
||
"inbounds": "Gelenler",
|
||
"clients": "İstemciler",
|
||
"offline": "🔴 Çevrimdışı",
|
||
"online": "🟢 Çevrimiçi",
|
||
"commands": {
|
||
"unknown": "❗ Bilinmeyen komut.",
|
||
"pleaseChoose": "👇 Lütfen seçin:\r\n",
|
||
"help": "🤖 Bu bota hoş geldiniz! Web panelinden belirli verileri sunmak ve gerektiğinde değişiklik yapmanıza olanak tanımak için tasarlanmıştır.\r\n\r\n",
|
||
"start": "👋 Merhaba <i>{{ .Firstname }}</i>.\r\n",
|
||
"welcome": "🤖 <b>{{ .Hostname }}</b> yönetim botuna hoş geldiniz.\r\n",
|
||
"status": "✅ Bot çalışıyor!",
|
||
"usage": "❗ Lütfen aramak için bir metin sağlayın!",
|
||
"getID": "🆔 Kimliğiniz: <code>{{ .ID }}</code>",
|
||
"helpAdminCommands": "Xray Core'u yeniden başlatmak için:\r\n<code>/restart</code>\r\n\r\nBir müşteri e-postasını aramak için:\r\n<code>/usage [E-posta]</code>\r\n\r\nGelenleri aramak için (müşteri istatistikleri ile):\r\n<code>/inbound [Açıklama]</code>\r\n\r\nTelegram Sohbet Kimliği:\r\n<code>/id</code>",
|
||
"helpClientCommands": "İstatistikleri aramak için şu komutu kullanın:\r\n\r\n<code>/usage [E-posta]</code>\r\n\r\nTelegram Sohbet Kimliği:\r\n<code>/id</code>",
|
||
"restartUsage": "\r\n\r\n<code>/restart</code>",
|
||
"restartSuccess": "✅ İşlem başarılı!",
|
||
"restartFailed": "❗ İşlem hatası.\r\n\r\n<code>Hata: {{ .Error }}</code>.",
|
||
"xrayNotRunning": "❗ Xray Core çalışmıyor.",
|
||
"startDesc": "Ana menüyü göster",
|
||
"helpDesc": "Bot yardımı",
|
||
"statusDesc": "Bot durumunu kontrol et",
|
||
"idDesc": "Telegram ID'nizi göster"
|
||
},
|
||
"messages": {
|
||
"cpuThreshold": "🔴 CPU Yükü {{ .Percent }}% eşiği {{ .Threshold }}%'yi aşıyor",
|
||
"selectUserFailed": "❌ Kullanıcı seçiminde hata!",
|
||
"userSaved": "✅ Telegram Kullanıcısı kaydedildi.",
|
||
"loginSuccess": "✅ Panele başarıyla giriş yapıldı.\r\n",
|
||
"loginFailed": "❗️Panele giriş denemesi başarısız oldu.\r\n",
|
||
"2faFailed": "2FA Hatası",
|
||
"report": "🕰 Planlanmış Raporlar: {{ .RunTime }}\r\n",
|
||
"datetime": "⏰ Tarih&Zaman: {{ .DateTime }}\r\n",
|
||
"hostname": "💻 Sunucu: {{ .Hostname }}\r\n",
|
||
"version": "🚀 3X-UI Sürümü: {{ .Version }}\r\n",
|
||
"xrayVersion": "📡 Xray Sürümü: {{ .XrayVersion }}\r\n",
|
||
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
|
||
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
|
||
"ip": "🌐 IP: {{ .IP }}\r\n",
|
||
"ips": "🔢 IP'ler:\r\n{{ .IPs }}\r\n",
|
||
"serverUpTime": "⏳ Çalışma Süresi: {{ .UpTime }} {{ .Unit }}\r\n",
|
||
"serverLoad": "📈 Sistem Yükü: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n",
|
||
"serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n",
|
||
"tcpCount": "🔹 TCP: {{ .Count }}\r\n",
|
||
"udpCount": "🔸 UDP: {{ .Count }}\r\n",
|
||
"traffic": "🚦 Trafik: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n",
|
||
"xrayStatus": "ℹ️ Durum: {{ .State }}\r\n",
|
||
"username": "👤 Kullanıcı Adı: {{ .Username }}\r\n",
|
||
"reason": "❗️ Sebep: {{ .Reason }}\r\n",
|
||
"time": "⏰ Zaman: {{ .Time }}\r\n",
|
||
"inbound": "📍 Gelen: {{ .Remark }}\r\n",
|
||
"port": "🔌 Port: {{ .Port }}\r\n",
|
||
"expire": "📅 Son Kullanma Tarihi: {{ .Time }}\r\n",
|
||
"expireIn": "📅 Sona Erecek: {{ .Time }}\r\n",
|
||
"active": "💡 Aktif: {{ .Enable }}\r\n",
|
||
"enabled": "🚨 Etkin: {{ .Enable }}\r\n",
|
||
"online": "🌐 Bağlantı durumu: {{ .Status }}\r\n",
|
||
"lastOnline": "🔙 Son çevrimiçi: {{ .Time }}\r\n",
|
||
"email": "📧 E-posta: {{ .Email }}\r\n",
|
||
"upload": "🔼 Yükleme: ↑{{ .Upload }}\r\n",
|
||
"download": "🔽 İndirme: ↓{{ .Download }}\r\n",
|
||
"total": "📊 Toplam: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
|
||
"TGUser": "👤 Telegram Kullanıcısı: {{ .TelegramID }}\r\n",
|
||
"exhaustedMsg": "🚨 Tükenmiş {{ .Type }}:\r\n",
|
||
"exhaustedCount": "🚨 Tükenmiş {{ .Type }} sayısı:\r\n",
|
||
"onlinesCount": "🌐 Çevrimiçi Müşteriler: {{ .Count }}\r\n",
|
||
"disabled": "🛑 Devre Dışı: {{ .Disabled }}\r\n",
|
||
"depleteSoon": "🔜 Yakında Tükenecek: {{ .Deplete }}\r\n\r\n",
|
||
"backupTime": "🗄 Yedekleme Zamanı: {{ .Time }}\r\n",
|
||
"refreshedOn": "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n",
|
||
"yes": "✅ Evet",
|
||
"no": "❌ Hayır",
|
||
"received_id": "🔑📥 Kimlik güncellendi.",
|
||
"received_password": "🔑📥 Şifre güncellendi.",
|
||
"received_email": "📧📥 E-posta güncellendi.",
|
||
"received_comment": "💬📥 Yorum güncellendi.",
|
||
"id_prompt": "🔑 Varsayılan Kimlik: {{ .ClientId }}\n\nKimliğinizi girin.",
|
||
"pass_prompt": "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi girin.",
|
||
"email_prompt": "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-postanızı girin.",
|
||
"comment_prompt": "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin.",
|
||
"inbound_client_data_id": "🔄 Giriş: {{ .InboundRemark }}\n\n🔑 Kimlik: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Trafik: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık bu müşteriyi girişe ekleyebilirsin!",
|
||
"inbound_client_data_pass": "🔄 Giriş: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Trafik: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık bu müşteriyi girişe ekleyebilirsin!",
|
||
"cancel": "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start ile yeniden başlayabilirsiniz. 🔄",
|
||
"error_add_client": "⚠️ Hata:\n\n {{ .error }}",
|
||
"using_default_value": "Tamam, varsayılan değeri kullanacağım. 😊",
|
||
"incorrect_input": "Girdiğiniz değer geçerli değil.\nKelime öbekleri boşluk olmadan devam etmelidir.\nDoğru örnek: aaaaaa\nYanlış örnek: aaa aaa 🚫",
|
||
"AreYouSure": "Emin misin? 🤔",
|
||
"SuccessResetTraffic": "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ✅ Başarılı",
|
||
"FailedResetTraffic": "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ❌ Başarısız \n\n🛠️ Hata: [ {{ .ErrorMessage }} ]",
|
||
"FinishProcess": "🔚 Tüm müşteriler için trafik sıfırlama işlemi tamamlandı."
|
||
},
|
||
"buttons": {
|
||
"closeKeyboard": "❌ Klavyeyi Kapat",
|
||
"cancel": "❌ İptal",
|
||
"cancelReset": "❌ Sıfırlamayı İptal Et",
|
||
"cancelIpLimit": "❌ IP Limitini İptal Et",
|
||
"confirmResetTraffic": "✅ Trafiği Sıfırlamayı Onayla?",
|
||
"confirmClearIps": "✅ IP'leri Temizlemeyi Onayla?",
|
||
"confirmRemoveTGUser": "✅ Telegram Kullanıcısını Kaldırmayı Onayla?",
|
||
"confirmToggle": "✅ Kullanıcıyı Etkinleştirme/Devre Dışı Bırakmayı Onayla?",
|
||
"dbBackup": "Veritabanı Yedeği Al",
|
||
"serverUsage": "Sunucu Kullanımı",
|
||
"getInbounds": "Gelenleri Al",
|
||
"depleteSoon": "Yakında Tükenecek",
|
||
"clientUsage": "Kullanımı Al",
|
||
"onlines": "Çevrimiçi Müşteriler",
|
||
"commands": "Komutlar",
|
||
"refresh": "🔄 Yenile",
|
||
"clearIPs": "❌ IP'leri Temizle",
|
||
"removeTGUser": "❌ Telegram Kullanıcısını Kaldır",
|
||
"selectTGUser": "👤 Telegram Kullanıcısını Seç",
|
||
"selectOneTGUser": "👤 Bir Telegram Kullanıcısını Seçin:",
|
||
"resetTraffic": "📈 Trafiği Sıfırla",
|
||
"resetExpire": "📅 Son Kullanma Tarihini Değiştir",
|
||
"ipLog": "🔢 IP Günlüğü",
|
||
"ipLimit": "🔢 IP Limiti",
|
||
"setTGUser": "👤 Telegram Kullanıcısını Ayarla",
|
||
"toggle": "🔘 Etkinleştir / Devre Dışı Bırak",
|
||
"custom": "🔢 Özel",
|
||
"confirmNumber": "✅ Onayla: {{ .Num }}",
|
||
"confirmNumberAdd": "✅ Ekleme onayı: {{ .Num }}",
|
||
"limitTraffic": "🚧 Trafik Sınırı",
|
||
"getBanLogs": "Yasak Günlüklerini Al",
|
||
"allClients": "Tüm Müşteriler",
|
||
"addClient": "Müşteri Ekle",
|
||
"submitDisable": "Devre Dışı Olarak Gönder ☑️",
|
||
"submitEnable": "Etkin Olarak Gönder ✅",
|
||
"use_default": "🏷️ Varsayılanı Kullan",
|
||
"change_id": "⚙️🔑 Kimlik",
|
||
"change_password": "⚙️🔑 Şifre",
|
||
"change_email": "⚙️📧 E-posta",
|
||
"change_comment": "⚙️💬 Yorum",
|
||
"change_flow": "⚙️🚦 Akış",
|
||
"ResetAllTraffics": "Tüm Trafikleri Sıfırla",
|
||
"SortedTrafficUsageReport": "Sıralı Trafik Kullanım Raporu"
|
||
},
|
||
"answers": {
|
||
"successfulOperation": "✅ İşlem başarılı!",
|
||
"errorOperation": "❗ İşlemde hata.",
|
||
"getInboundsFailed": "❌ Gelenler alınamadı.",
|
||
"getClientsFailed": "❌ Müşteriler alınamadı.",
|
||
"canceled": "❌ {{ .Email }}: İşlem iptal edildi.",
|
||
"clientRefreshSuccess": "✅ {{ .Email }}: Müşteri başarıyla yenilendi.",
|
||
"IpRefreshSuccess": "✅ {{ .Email }}: IP'ler başarıyla yenilendi.",
|
||
"TGIdRefreshSuccess": "✅ {{ .Email }}: Müşterinin Telegram Kullanıcısı başarıyla yenilendi.",
|
||
"resetTrafficSuccess": "✅ {{ .Email }}: Trafik başarıyla sıfırlandı.",
|
||
"setTrafficLimitSuccess": "✅ {{ .Email }}: Trafik limiti başarıyla kaydedildi.",
|
||
"expireResetSuccess": "✅ {{ .Email }}: Son kullanma günleri başarıyla sıfırlandı.",
|
||
"resetIpSuccess": "✅ {{ .Email }}: IP limiti {{ .Count }} başarıyla kaydedildi.",
|
||
"clearIpSuccess": "✅ {{ .Email }}: IP'ler başarıyla temizlendi.",
|
||
"getIpLog": "✅ {{ .Email }}: IP Günlüğü alındı.",
|
||
"getUserInfo": "✅ {{ .Email }}: Telegram Kullanıcı Bilgisi alındı.",
|
||
"removedTGUserSuccess": "✅ {{ .Email }}: Telegram Kullanıcısı başarıyla kaldırıldı.",
|
||
"enableSuccess": "✅ {{ .Email }}: Başarıyla etkinleştirildi.",
|
||
"disableSuccess": "✅ {{ .Email }}: Başarıyla devre dışı bırakıldı.",
|
||
"askToAddUserId": "Yapılandırmanız bulunamadı!\r\nLütfen yöneticinizden yapılandırmalarınıza Telegram ChatID'nizi eklemesini isteyin.\r\n\r\nKullanıcı ChatID'niz: <code>{{ .TgUserID }}</code>",
|
||
"chooseClient": "Gelen {{ .Inbound }} için bir Müşteri Seçin",
|
||
"chooseInbound": "Bir Gelen Seçin"
|
||
}
|
||
}
|
||
} |