mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-17 10:06:08 +00:00
5e1cb7693b
* fix(email): resolve a name-addr smtpFrom into bare envelope address and display name The save-time validator accepts any RFC 5322 address form, so a value like '3x-ui Panel <panel(at)example.com>' passes validation, but Send and TestConnection fed that raw string to MAIL FROM, which strict servers reject with 501, and buildMessage mangled it into a quoted local part. Parse the configured sender at the point of use: the envelope gets the bare address and, when no explicit sender name is set, the display name embedded in the setting is used for the From header. * fix(email): report a missing sender address from the SMTP connection test TestConnection skipped the empty-from guard that Send enforces, so with no sender and no username configured the test issued the null reverse-path and could report success against a lenient relay while every real notification send kept failing with the missing-sender error. Guard the test path the same way and surface a dedicated translated message. * fix(sub): fall back to the raw subscription when an auto-detected format has no content With format auto-detection enabled, a client whose User-Agent matched the Clash or JSON regex was routed straight to that format handler. For a subscription whose entries convert to neither format (an MTProto-only subscription, for example) the handler returns an empty document and the request ended as 404, breaking a URL that served the raw list before the toggle. The auto-detect branches now serve the detected format only when it produces content and otherwise continue to the raw response; the explicit format endpoints keep answering 404 for empty documents. * fix(node): match prefixed central tags when filtering a selected-mode node snapshot FilterNodeSnapshot compared a node snapshot's inbound tags against the raw selected-tag list with an exact match, while its two siblings (SnapshotHasUnadoptedInbounds and the reconcile tagToCentral map) expand each selected tag to both its bare node-side form and its n<id>- prefixed central form. A panel-created node inbound is recorded in the selected list under the central prefixed tag but reported by the node under the bare tag, so the exact match dropped it from every snapshot and the orphan sweep then deleted its central row one tick after creation. Expand the allowed set with the same prefix flip the siblings use. * fix(client): refuse a bulk quota reduction that would fall to or below zero BulkAdjust clamped a client's new traffic limit with max(total+addBytes, 0). Because 0 is the unlimited sentinel, reducing a client's quota by more than it had left silently granted that client unlimited traffic. The sibling expiry branch already refuses an over-reduction; mirror it for quota so the adjustment is skipped with a clear reason instead of crossing the sentinel. * fix(client): persist a bulk adjustment's applied field even when the sibling field is skipped In a mixed BulkAdjust (both a days delta and a bytes delta), a per-field planning skip such as "unlimited expiry" or "unlimited traffic" was recorded in the same map that gated the client_traffics write. The applied field was already written to the inbound JSON and the clients table, but the enforcement row was left untouched, so the depletion job cut the client on the old limit while the panel showed the new one. Gate the traffic-row write on an actual inbound-processing failure rather than on any planning-phase skip note. * fix(inbound): always create in AddInbound instead of overwriting a row whose id was posted The add controller binds the inbound model's id form field and never clears it, and AddInbound persisted with GORM Save, which updates in place when the primary key is non-zero. A client that reused an existing id (for instance by duplicating an inbound fetched from /get and changing the port) silently overwrote that stored row instead of creating a new inbound. Zero the id at the top of AddInbound, matching how it already zeroes the client-stat ids. * fix(inbound): accept WireGuard clients when creating an inbound AddInbound's per-client validation switch had cases for every protocol except WireGuard, so a WireGuard client fell through to the default branch that requires a non-empty id. WireGuard clients are keyed by their public key and carry no id, so importing a WireGuard inbound or re-adding one to a reconciling node was rejected with "empty client ID". Add a wireguard case that validates the client key, mirroring addInboundClient. * fix(client): stop holding the inbound-lock registry mutex while waiting on one inbound lockInbound acquired the global registry mutex and then blocked on the per-inbound mutex without releasing the registry first. A slow client operation holding one inbound's mutex (for example a bulk delete pushing to an unreachable node) made the next waiter park on that inbound while still holding the registry mutex, which in turn blocked lockInbound for every other inbound — freezing client mutations panel-wide. Release the registry mutex before taking the per-inbound lock. * fix(client): honor keepTraffic when deleting a client that is attached to inbounds Delete, DeleteByEmail and BulkDelete all pass keepTraffic to their final cleanup transaction, but each called the per-inbound delete helper with a hardcoded false. That helper purges the client's traffic, IP and stat rows before the gated cleanup runs, so keepTraffic=true still destroyed all traffic history for any client actually attached to an inbound (the pinned test only covered a record with no inbound mappings). Thread the caller's keepTraffic through to the per-inbound helper at all three call sites. * fix(inbound): defer a local MTProto inbound edit's sidecar push until after commit UpdateInbound applied a local MTProto inbound change by calling the runtime UpdateInbound (which stops/starts the mtg sidecar or talks to it) from inside runSerializedTx. That runs process and network I/O on the single traffic-writer goroutine while a DB transaction is open, so a slow sidecar stalls traffic accounting and every concurrent client mutation, and a later step failing the transaction leaves the sidecar ahead of the rolled-back row. Move the push into the post-commit hook, matching the xray branch. Adds a SetLocalRuntimeOverride test seam mirroring the existing node override so the deferral is regression tested. * fix(client): delete external-link rows when bulk-deleting clients The single-client Delete path removes a client's client_external_links rows, but BulkDelete (and the DelDepleted reaper that routes through it) deleted the record, mappings and traffic while leaving the external-link rows keyed by the now-dead client id, so they accumulated as orphans. Delete them in the same cleanup transaction, keyed by client id like the single path. * fix(inbound): request an xray restart when toggling a routed MTProto inbound AddInbound, DelInbound and UpdateInbound all flag needRestart when an inbound routes MTProto through xray, so the egress SOCKS bridge is regenerated. Only SetInboundEnable's local path omitted it, so toggling a routed MTProto inbound off then on left the bridge out of the running config while the sidecar dialed its loopback port, blackholing that inbound until an unrelated restart. Flag the restart on the local enable path too. * fix(client): apply enable-by-email to every inbound a client is attached to ToggleClientEnableByEmail (Telegram bot) and SetClientEnableByEmail (LDAP sync) resolved a single inbound via the legacy client_traffics pointer and flipped enable only there. A client attached to several inbounds kept connecting through the siblings' running Xray after being disabled, and the next edit could re-enable it everywhere from a stale sibling. Route both through the applyClientFieldByEmail fan-out (the #5039 fix path) so the whole multi-inbound identity is toggled at once, dropping the circular Set/Toggle dependency. * fix(traffic): commit a traffic tick even when a best-effort maintenance helper fails addTrafficLocked stages the inbound and client deltas, then runs three helpers (auto-renew, disable depleted clients, disable depleted inbounds) that are meant to log and continue. All three reused the function-scope err that the deferred commit/rollback inspects, so the last helper's error decided the whole tick: a failure in disableInvalidInbounds rolled back the already-staged traffic while AddTraffic reported success, and because xray had already advanced its counter baseline that traffic was lost for good. Give each best-effort helper its own error variable so only a genuine staging failure rolls the tick back. * fix(traffic): re-enable clients and serialize the write in Reset All Client Traffic ClientService.ResetAllTraffics zeroed up/down but, unlike every sibling reset path, never restored enable=true, so clients that had been auto-disabled for exceeding their quota stayed cut with zero usage after a reset. It also wrote client_traffics directly on the shared DB handle instead of through the serial traffic writer, reintroducing the cross-transaction lock-order deadlock the writer exists to prevent. Restore enable and run the reset inside submitTrafficWrite within one transaction. * fix(traffic): keep node reset propagation out of the serial traffic writer ResetAllTraffics and ResetInboundTraffic performed their remote-node reset HTTP calls inside submitTrafficWrite. Each call can block up to the remote timeout, and Reset All Traffics loops every node serially, so the single traffic-writer goroutine was held for seconds — long enough that the concurrent 5s traffic poll timed out submitting its own write and dropped the deltas it had already drained from xray. Do the DB reset inside the writer, then propagate to the nodes after it returns, matching how the mtproto quota reset is already sequenced. * fix(sub): stop the subscription from 500ing on valid-but-unusual stream settings The raw share-link generators used unchecked type assertions and unguarded array indexing: an empty Reality shortIds/serverNames array (random.Num(0) panics), a tcp-http header with no request block or an empty request.path, a grpc block missing its keys, empty stream settings, and a non-string Host header all panicked mid-generation. Because getSubs loops every client's link with no recover, one such client 500s the entire subscription for everyone. The sibling JSON, Clash and frontend generators already guard these; make the raw generators match with comma-ok assertions and length checks. * fix(sub): tolerate a hysteria inbound without hysteriaSettings in the JSON subscription genHy asserted stream["hysteriaSettings"].(map[string]any) without the comma-ok form, so a hysteria inbound whose StreamSettings omit the hysteriaSettings key (a valid, representable shape the raw generator renders fine) panicked and 500ed the entire JSON subscription. Use comma-ok; the downstream reads already guard each key, so a nil map degrades gracefully. * fix(sub): emit the pinned peer cert sha256 in Clash subscriptions The Clash stream builder computed tlsSettings["pin-sha256"] from the inbound's pinnedPeerCertSha256, but applySecurity's tls case never copied it onto the proxy, so it was written with no reader and silently dropped. Clash subscribers lost certificate pinning while JSON subscribers kept it. Surface pin-sha256 on the proxy in the tls case, matching the JSON emitter. * fix(link): parse the snake_case and extra-blob xhttp fields when importing a share link The panel's share-link emitters (Go and TS) carry advanced xhttp knobs as a snake_case x_padding_bytes plus an extra=<json> payload, but the Go parser's xhttp branch read only top-level camelCase params, so importing an xhttp link via the outbound-subscription feature dropped xPaddingBytes, scMaxEachPostBytes and the rest, silently reverting them to the stream defaults and producing a non-working outbound. Mirror the TS parser: read the snake_case alias, merge the extra JSON blob, then let explicit camelCase params win. * fix(frontend): decode URL-safe base64 when parsing an imported share link Base64.decode called window.atob directly, which rejects the base64url alphabet (- and _) and unpadded input. But the panel's own share-link emitter uses Base64.encode(x, true) (URL-safe, unpadded), and real SIP002 links do too, so importing a Shadowsocks link whose method:password encodes with a - or _ threw, fell back to the raw undecoded string, and produced a wrong method and garbage password (the vmess parser shared the same limitation). Normalize base64url and re-pad before atob so decode round-trips every emitted link. * fix(link): honor the vmess ws path and hysteria2 vcn params on import Two Go/TS parser parity gaps in the outbound share-link import path: parseVmess only applied a ws link's path when the inner JSON also carried a host key, so a generator that omits host dropped the path back to the default; and parseHysteria2 hardcoded verifyPeerCertByName to empty, ignoring the vcn param the panel emits, so a hysteria2 outbound with a decoy SNI and a distinct cert name failed TLS verification after import. The TS parser handles both; make the Go parser match. * fix(ui): stop the sniffing form island from clobbering unrendered fields antd's Form.useWatch only reports registered fields, so while the sniffing toggle was off the island emitted { enabled: false } upward and replaced the full Sniffing object in form state. Saving a VLESS reverse outbound then crashed in sniffingToWire on the missing ipsExcluded array; the loopback outbound and the inbound sniffing tab shared the same hole. Watch the store with preserve: true so unrendered fields keep their values, and seed a missing value from the schema defaults instead of an empty cast. * fix(sub): drop empty remark segments instead of leaving a stray separator expandSegment dropped a "|" segment only when its tokens rendered the unlimited mark, so a segment whose only token resolved to the empty string (a client with no comment, an unlimited client's expiry date) was kept as bare decoration, leaving a trailing "|" or a dangling emoji on every share link's remark. Drop a token-bearing segment whenever none of its tokens produce a real value, while still keeping pure-literal segments. * fix(xray): keep source- and domains-scoped routing rules when an inbound is deleted removeInboundTagFromRules drops a routing rule whose inboundTag list becomes empty only if the rule has no other matcher, but routingMatcherKeys omitted xray-core's canonical source and domains keys. A rule scoped by source or domains (common in hand-authored or imported configs) therefore lost its whole body — including a security-relevant block — when its single listed inbound was deleted, instead of just having the tag trimmed. Recognize source and domains as live matchers. * fix(xray): guard RemoveUser against an uninitialized handler client Every XrayAPI handler method returns an error when HandlerServiceClient is nil, except RemoveUser, which dereferenced it directly. A depletion sweep runs Init with the port ignored and, during a restart window where the fresh process's api port is still 0, Init fails and leaves the client nil — so RemoveUser panicked (recovered by the traffic writer, but re-thrown every poll) instead of returning an error. Add the same nil guard the siblings have. * fix(xray): do not revive a manually stopped Xray on a background restart RestartXray cleared isManuallyStopped unconditionally at its top, so the @30s pending-config cron (and warp/ldap/outbound reconcile jobs) that call RestartXray(false) resurrected an Xray the admin had deliberately stopped — unlike the crash-detector, which honors the manual-stop flag. Skip a non-forced restart while the stop flag is set; only an explicit forced restart clears it. * fix(xray): retry a failed pending-restart instead of dropping the config change The 30s cron consumed the need-restart flag with IsNeedRestartAndSetFalse before calling RestartXray and only logged a failure. If RestartXray failed early (a transient GetXrayConfig DB error) the old process kept running the old config, the crash detector saw a running process and never retried, and the flag stayed cleared — so an admin's saved change silently never reached the core. Move the consume/restart/retry into ApplyPendingRestart, which re-arms the flag on failure so the next tick retries. * fix(xray): synchronize the process version and apiPort fields Start writes p.version and p.apiPort (via refreshVersion/refreshAPIPort) after flipping the process to running, while GetXrayVersion and GetAPIPort read them lock-free from the status and traffic poll goroutines. The struct mutex deliberately excluded these fields, so a restart racing a poll was a real data race — a torn read of the version string header can crash. Extend the mutex to cover version and apiPort, doing the blocking version probe before taking the lock. * fix(settings): detect a wildcard listen collision between the web and sub ports The web/sub same-port check compared the two listen addresses as raw strings, so binding both on all interfaces with different spellings (webListen 0.0.0.0 vs an empty subListen) slipped past validation and only failed at startup with an opaque bind error. Treat any wildcard listen ('', 0.0.0.0, ::) as overlapping so the clash is reported up front, while still allowing two distinct specific addresses to share a port. * fix(db): mark the IP-limit cleanup seeder done on a fresh install ResetIpLimitNoFail2ban is a one-time migration that, on a host without fail2ban, zeroes every existing client's limitIp because the limit can't be enforced. It was missing from the fresh-install fast-path seeder list, so on a brand-new DB it did not run on the first boot but fired on the second — wiping any IP limits the admin had set in between. Add it to the fast-path so a truly fresh install marks it done up front (there is nothing to clean), leaving later admin-set limits intact. * fix(security): dial outbound subscriptions through the SSRF guard The outbound-subscription fetch validated the URL host once (resolving DNS and rejecting private targets) but then fetched with a plain HTTP client that re-resolves the host at dial time, so a subscription domain the attacker controls could pass validation as a public IP and rebind to 127.0.0.1 / a cloud metadata endpoint / an internal host for the actual dial — a blind SSRF into the panel's network. Route the direct fetch (and its redirects) through netsafe.SSRFGuardedDialContext, which resolves, checks and dials the same IP atomically, carrying the subscription's AllowPrivate flag on the request context; a configured egress proxy still dials its loopback bridge unguarded. * fix(security): bound the login-limiter attempts map The login rate limiter keys its records on the caller-supplied username and only evicted a record when that exact key was revisited or the login succeeded. An unauthenticated attacker replaying one CSRF token while rotating a fresh username per request seeded a record that was never revisited, growing the map without bound until the panel OOMs. Cap the map: before inserting a new record, reclaim records whose block has lapsed and whose failures aged out, and if the map is still at the ceiling under a broad flood, drop one so memory can never grow past the cap. * fix(tgbot): require admin for privileged callbacks, not just the first switch answerCallback wraps only its first callback switch in an isAdmin guard; the second switch (server usage, inbound/online enumeration, database backup export, ban logs, mass traffic reset, client creation) ran for every caller. Telegram delivers a callback with the tapping user's id, so a non-admin who can see an admin's inline keyboard — as when the bot runs in a group — could tap Backup and receive the full database and config, or reset all traffic. Default-deny before the second switch: a non-admin may only run the per-user client_* callbacks that resolve their own data from their Telegram id. * fix(eventbus): dispatch each subscriber in its own goroutine The fan-out loop called every subscriber's handler sequentially on the single dispatch goroutine. The email and Telegram notifiers block on network I/O for tens of seconds (or minutes when the remote is slow), so one slow subscriber stalled the whole loop: the 256-slot channel then filled and Publish silently dropped later events — including high-value xray.crash and node.down notifications unrelated to the slow handler. Hand each delivered event to every handler in its own goroutine so a blocking subscriber can no longer stall delivery to the others. safeCall already recovers panics, so a detached handler cannot take down the bus. * fix(integration): cap WARP API response body size doWarpRequest read the response with an unbounded io.ReadAll, unlike the sibling NordVPN client which already caps every read at maxResponseSize. A hostile panel egress proxy or a MITM on the Cloudflare WARP endpoint could stream an arbitrarily large body and force the panel into an unbounded allocation. Wrap the body in an io.LimitReader(maxResponseSize) to match the NordVPN client. * fix(email): bound every SMTP step with a connection deadline The "starttls"/"none" transport delivered through net/smtp.SendMail, which dials with an untimed net.Dial and never sets a socket deadline. When an SMTP server accepted the TCP connection but then stalled (or was a blackhole), the caller was released by Send's 30s select, but the sender goroutine and its socket stayed blocked until the OS TCP timeout — minutes per notification, leaking a goroutine and a connection each time. sendWithTLS dialed with a timeout but likewise armed no deadline on the protocol phase, and TestConnection (called synchronously from the settings handler, with no select guard) could hang the request indefinitely. Replace SendMail with sendPlain, which dials with smtpConnectTimeout and arms conn.SetDeadline(smtpDeadline) before the greeting read, preserving SendMail's opportunistic STARTTLS upgrade. Arm the same deadline in sendWithTLS and TestConnection so every SMTP step is bounded. * fix(server): guard access-log parser against malformed lines GetXrayLogs split each Xray access-log line on whitespace and then read fixed offsets — parts[1] for the timestamp and parts[i+1] after the "from", "accepted" and "email:" markers — without checking the line had that many fields. A truncated or malformed line (the logged destination is attacker-influenced) indexed past the slice and panicked; the panel handler returned a 500 via Gin's recovery. Extract the per-line field parsing into parseAccessLogFields and length guard every positional lookup so a short line yields a partial entry instead of panicking. * fix(server): guard xray key-generator output parsing GetNewX25519Cert, GetNewmldsa65 and GetNewmlkem768 parsed xray's stdout by reading lines[0], lines[1] and each line's second colon-separated field without any length check — unlike GetNewEchCert, which already guards its line count. If the xray binary printed fewer than two lines or reformatted its labels (a version change, or a silent failure that emitted nothing), the fixed slice index panicked and the handler 500'd. Extract the shared parsing into parseXrayKeyPairOutput, which length guards the line count and each label split and returns an error instead of panicking, then route all three generators through it. * fix(tgbot): stop auto-deleted messages from resetting wizard state SendMsgToTgbotDeleteAfter spawns a goroutine that, after the display delay, deleted the transient message and then unconditionally cleared the chat's conversation state. Every caller that ends a wizard step already clears the state synchronously, so that call was redundant — and harmful: if within the delay the user advanced to the next step (a callback sets a fresh awaiting_* state), the late goroutine wiped it, and the user's next message fell through unrecognized, silently dropping their input. Move the delayed deletion into deleteMessageAfterDelay, which only removes the message and no longer touches the conversation state. Guard deleteMessageTgBot against a nil bot so the deletion path is unit-testable. * fix(frontend): refetch a fresh CSRF token on 403 instead of reusing the stale meta tag On a 403 to an unsafe method the client cleared its cached CSRF token and called ensureCsrfToken to retry. But ensureCsrfToken prefers the <meta name="csrf-token"> tag baked into the page, which the production panel always injects, so the "refresh" re-read the same stale token and the /csrf-token refetch was never reached — the retry re-sent the token that had just been rejected and the save failed with an error toast. The token lives in the session and rotates when the session is regenerated (for example re-login in another tab), leaving the tab's baked-in meta token stale. Fetch the current token straight from /csrf-token in the 403 branch so the retry uses the authoritative server value. The existing tests only passed because they strip the meta tag; the new test keeps a stale tag present. * fix(frontend): surface backend error text from failed requests HttpUtil.get/post read the thrown HttpError body as response.data.message, but the backend error envelope (entity.Msg) serializes its text as msg. On any non-2xx JSON response the real reason was therefore dropped and the operator saw only the generic "Request failed with status N" toast. Read response.data.msg first (keeping message and the native error text as fallbacks). The sibling test had pinned the wrong body shape ({ message }); correct it to the real backend shape ({ success:false, msg }) so it exercises the actual envelope. * fix(frontend): share one WebSocket connection across bridge and hooks websocketBridge.ts and useWebSocket.ts each declared their own module-scoped sharedClient plus an identical getSharedClient, so the "shared" client was not shared between them: whenever a page using useWebSocket (Clients/Inbounds) mounted alongside the always-mounted bridge, the panel opened two sockets to /ws. The server then pushed every traffic/stats/nodes/inbounds snapshot to both, doubling WebSocket bandwidth and running two independent reconnect loops, and the hook's socket was never disconnected on unmount. Hoist a single getSharedWebSocketClient into api/websocket.ts and route both the bridge and the hook through it, so exactly one connection is opened. * fix(frontend): guard the outbounds WebSocket handler against non-array payloads onOutbounds wrote the raw WebSocket payload straight into the outboundsTraffic cache, unlike the sibling onNodes/onInbounds handlers which first check Array.isArray. A malformed non-array push (for example an object) would land in the cache with staleTime Infinity; consumers that call .find()/.map() on the outbounds list would then throw and crash the Outbounds tab. Add the same Array.isArray guard so a bad push is ignored. * fix(frontend): key the node table by the computed row key, not id The desktop node table used rowKey="id", but transitive sub-nodes (the read-only rows surfaced from downstream nodes) all carry id 0, so a topology with two or more transitive rows gave React duplicate keys. antd's rowKey prop overrides the row object's own computed `key` (`t-${guid}` for transitive rows, the numeric id otherwise), so the unique key the code already builds was ignored — causing row-state/DOM mis-association on any re-render (heartbeat refetch, address-eye toggle). The mobile card path already keyed by record.key. Key the table by "key" so transitive rows get their distinct t-${guid} identity; direct nodes keep key === id, so row selection (filtered to numeric keys) is unchanged. * fix(frontend): map routing row actions through the rule's real index The routing table hides balancer-loopback rules (`_bl_*`) but keeps each visible row's original index in `key`, then handed antd's positional row index straight to edit/delete/toggle/move/drag — all of which mutate the full, unfiltered routing.rules array. Once a hidden loopback rule precedes a visible one (e.g. a balancer whose fallback is another balancer, plus any rule added afterwards), the positional index no longer matches the array index, so deleting or editing a rule silently hit the wrong one — including destroying the loopback rule that keeps the balancer alive. Add originalRuleIndex to translate a positional row index back through the row's `key`, and route every mutating handler (openEdit, confirmDelete, toggleRule, moveUp/moveDown, drag) through it. When no loopback rows are hidden the mapping is the identity, so ordinary configs are unaffected. * fix(frontend): map outbound row actions through the outbound's real index The outbounds table hides balancer-loopback outbounds (`_bl_*`) but keeps each visible row's original index in `key`, then passed antd's positional row index to edit/delete/move and to the per-row probe (onTest) and its result lookup — all of which address the full, unfiltered outbounds array. Once a hidden loopback outbound precedes a visible one, the positional index diverges from the array index, so deleting or editing an outbound hit the wrong one (its deletion-impact plan and removal targeting the wrong entry), and the test button probed / showed results against the wrong outbound. Add originalOutboundIndex and route the mutating handlers through it; key the probe trigger and test-result columns by record.key. With no loopback rows hidden the mapping is the identity, so ordinary configs are unaffected. * fix(frontend): tolerate a malformed happyEyeballs value in the Xray Basics tab BasicsTab derived directHappyEyeballs by calling HappyEyeballsSchema.parse during render, guarding only against null/non-object. A wrong-typed field (e.g. happyEyeballs.tryDelayMs as a string) or any other shape mismatch — reachable via the Complete Template JSON editor or an imported config — threw straight out of render, white-screening the default Xray landing tab. Use safeParse and fall back to null so a bad value degrades to "no override" instead of crashing the page. * fix(frontend): preserve routing-rule fields the form does not surface The rule form rebuilt the rule from a fixed literal of only the fields it edits, and RoutingTab replaces the rule wholesale on confirm. Fields the form never exposes — localPort, localIP, process, ruleTag, webhook — are in the rule schema and can arrive via the advanced JSON editor or Import Rules; opening such a rule in the form and saving silently dropped them. Carry over every key of the original rule the form does not manage before applying the form-derived fields, so an edit only touches what it surfaces. * fix(frontend): re-sync the sniffing island when its value changes externally The sniffing config editor froze its seed value at mount and only watched its own inner AntD form, never reflecting a later change to the shared RHF `sniffing` path. Because the inbound form mounts every tab with forceRender, the friendly Sniffing tab and the Advanced JSON editor are live at once: editing sniffing in the JSON editor updated the RHF value but not the frozen island, so the next interaction with the friendly tab emitted the stale value and silently discarded the JSON edit. Add an effect that pushes an external value change into the inner form, guarded by the same lastEmitted marker the emit path uses so the island never re-seeds from its own echo and no update loop forms. * fix(frontend): don't drift a client's byte quota on a no-op save The quota field shows the total in GB rounded to two decimals; editing a client and saving converted that display value straight back to bytes. A byte total not aligned to 0.01 GB — one set via the API or an import — was therefore rewritten to the rounded value on any save that never touched the field, losing a few MB each time. Add resolveTotalBytes: keep the original byte total when the displayed GB still matches it, and only re-derive from GB when the user actually changed the field. * fix(eventbus): deliver events on a bounded per-subscriber worker The previous fix dispatched each event to every subscriber with a bare `go safeCall`. That unblocked the dispatch loop, but removed the bus's backpressure: under a login-attempt flood (which both notifier subscribers process without rate-limiting) with email/Telegram enabled, every attempt spawned handler goroutines that each block on network I/O for up to ~30s, with no bound — a goroutine and outbound-connection storm. It also let a subscriber's handler run concurrently with itself, racing the Telegram notifier's lazily-cached hostname. Give each subscriber its own bounded queue drained by a single worker goroutine. Dispatch does a non-blocking send per subscriber (dropping only that subscriber's event when its queue is full), so a slow subscriber still can't stall the others, concurrency is bounded to one in-flight handler per subscriber, per-subscriber event order is preserved, and Stop again waits for in-flight handlers to finish. * fix(frontend): map outbound mobile-card actions through the real index too The desktop outbounds table was keyed by the outbound's real index, but the mobile card list was left keying the probe trigger and every test-state lookup by the positional row index. With a hidden balancer-loopback outbound present, tapping Check on a mobile card probed the wrong outbound and the Test-All results landed on the wrong card. Key onTest and the testResult/isTesting reads by record.key, matching the desktop columns. * fix(frontend): meet WCAG AA contrast on the config-block link text The Storybook accessibility test flagged the share-link <code> block: with no explicit color it inherited a muted grey that renders as #888888 on the #f8f8f8 tertiary-fill background in CI's Chromium — a 3.33:1 contrast, below the 4.5:1 AA threshold. Set the text to the theme's primary text token so the colour is explicit and high-contrast in both light and dark themes instead of depending on an inherited value that varies by browser. * style(sub): simplify a negated conjunction to satisfy staticcheck QF1001 golangci-lint (staticcheck QF1001) flagged the `!(a && b)` guard in expandSegment. Rewrite it via De Morgan's law to the equivalent `!a || !b` form so the linter passes; behavior is unchanged. * fix: close panics and races the audit's own fixes left nearby Second-pass review of the 54-commit self-correcting audit. Each item below was confirmed by reading the surrounding source (and, where practical, the pre-fix code) before being changed; regression tests are included for every behavioral fix. Concurrency: - eventbus: Bus.Subscribe called wg.Add with no synchronization against a concurrent Bus.Stop's wg.Wait, a real "WaitGroup misuse" panic risk (e.g. a Telegram-bot settings save racing panel shutdown/restart). Stop now flips a mu-guarded `stopped` flag before waiting, and Subscribe checks it under the same lock, so Add and Wait can no longer race. Security: - login_limiter: evictForRoom's fallback eviction picked an arbitrary map key, including ones still under an active cooldown - an attacker flooding /login with fresh usernames could evict their own (or anyone's) blocked record and reset the lockout. The fallback now skips actively-blocked records, only falling back to an unconditional evict if the map is somehow entirely full of active blocks (preserves the hard memory cap). Subscription-endpoint panics (reachable by any client hitting /sub): - internal/sub/service.go: applyPathAndHostParams/Obj (ws/httpupgrade/xhttp with no path settings object) and the TLS alpn readers in three places used unchecked type assertions - exactly the bug classabab7cd0patched elsewhere in the same switch statements, just not these call sites. - internal/sub/json_service.go, clash_service.go: the externalProxy loops in the JSON and Clash generators used unchecked assertions on a legacy/admin-supplied field (missing "port", non-object entry, etc.). - internal/sub/json_service.go: realityData's shortId/serverName selection could assert a non-string array element. Other correctness: - client_traffic.go: ResetAllTraffics (touched by3eb214d0) still skipped clearing NodeClientTraffic node-sync baselines, unlike its sibling reset paths in the same file - a node's next sync would re-add pre-reset delta on top of the freshly-zeroed counter. - inbound_traffic.go: the traffic-tick tx's Commit/Rollback errors were silently discarded; now logged so a backend-level commit failure (e.g. an aborted Postgres tx from a best-effort helper) doesn't masquerade as a successful tick. - outbound_subscription.go: the new subscriptionFetchClient doc comment was wedged between fetchAndStore's existing comment and fetchAndStore itself, leaving fetchAndStore undocumented and the comment describing the wrong function. Convention cleanup: - Removed narrative // comments added by the audit that violate this repo's no-inline-comment rule (mostly narrating the specific bug/fix rather than a lasting contract, and mostly on new Test functions, which this repo's existing tests never comment) - calibrated against this exact codebase's own pre-existing comment style so legitimate godoc-style doc comments were left alone. --------- Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
2241 lines
134 KiB
JSON
2241 lines
134 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",
|
||
"add": "Ekle",
|
||
"remove": "Kaldır",
|
||
"update": "Güncelle",
|
||
"copy": "Kopyala",
|
||
"copied": "Kopyalandı",
|
||
"more": "Diğer",
|
||
"download": "İndir",
|
||
"regenerate": "Yeniden Oluştur",
|
||
"jsonEditor": "JSON Düzenleyici",
|
||
"downloadImage": "Resmi İndir",
|
||
"sort": "Sırala",
|
||
"remark": "Açıklama",
|
||
"enable": "Etkin",
|
||
"protocol": "Protokol",
|
||
"search": "Ara",
|
||
"filter": "Filtre",
|
||
"all": "Tümü",
|
||
"from": "Başlangıç",
|
||
"to": "Bitiş",
|
||
"done": "Tamam",
|
||
"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": "Yok",
|
||
"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": "Host",
|
||
"path": "Yol",
|
||
"camouflage": "Maskeleme",
|
||
"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": "Kullanıcılar",
|
||
"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 bilgi girmekten kaçının.",
|
||
"secAlertConf": "Bazı ayarlar saldırıya 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": "Panelin varsayılan portu savunmasız. Rastgele veya belirli bir port yapılandırın.",
|
||
"secAlertPanelURI": "Panelin varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.",
|
||
"secAlertSubURI": "Aboneliğin varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.",
|
||
"secAlertSubJsonURI": "Abonelik JSON dosyasının 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 hata oluştu",
|
||
"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",
|
||
"copyAllConfigs": "Tüm Yapılandırmaları Kopyala",
|
||
"copyAllConfigsCopied": "Tüm yapılandırmalar kopyalandı",
|
||
"email": "E-posta"
|
||
},
|
||
"menu": {
|
||
"theme": "Tema",
|
||
"dark": "Koyu",
|
||
"ultraDark": "Ultra Koyu",
|
||
"dashboard": "Genel Bakış",
|
||
"inbounds": "Gelen Bağlantılar",
|
||
"clients": "Kullanıcılar",
|
||
"groups": "Gruplar",
|
||
"nodes": "Düğümler",
|
||
"settings": "Panel Ayarları",
|
||
"xray": "Xray Yapılandırmaları",
|
||
"routing": "Yönlendirme",
|
||
"outbounds": "Giden Bağlantılar",
|
||
"apiDocs": "API Belgeleri",
|
||
"logout": "Çıkış Yap",
|
||
"link": "Yönet",
|
||
"donate": "Bağış Yap",
|
||
"hosts": "Host'lar",
|
||
"docs": "Belgeler",
|
||
"openMenu": "Menüyü aç"
|
||
},
|
||
"pages": {
|
||
"login": {
|
||
"hello": "Merhaba",
|
||
"title": "Hoş Geldiniz",
|
||
"loginAgain": "Oturum süreniz doldu, lütfen tekrar giriş yapın.",
|
||
"toasts": {
|
||
"invalidFormData": "Veri formatı geçersiz.",
|
||
"emptyUsername": "Kullanıcı adı zorunludur",
|
||
"emptyPassword": "Şifre zorunludur",
|
||
"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": "CPU",
|
||
"logicalProcessors": "Mantıksal İşlemciler",
|
||
"frequency": "Frekans",
|
||
"swap": "Takas",
|
||
"storage": "Depolama",
|
||
"memory": "RAM",
|
||
"threads": "İş Parçacığı",
|
||
"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 işlem 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",
|
||
"devChannel": "Geliştirme kanalı",
|
||
"devChannelWarning": "Geliştirme yapıları main üzerindeki her commit'i izler ve kararlı sürüm değildir — otomatik geri alma yoktur.",
|
||
"currentCommit": "Geçerli commit",
|
||
"latestCommit": "Son commit",
|
||
"updateChannelChanged": "Güncelleme kanalı değiştirildi",
|
||
"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",
|
||
"historyTitleCpu": "CPU Kullanımı",
|
||
"historyTitleMem": "Bellek Kullanımı",
|
||
"historyTitleNetwork": "Ağ Bant Genişliği",
|
||
"historyTitlePackets": "Ağ Paketleri",
|
||
"historyTitleDisk": "Disk G/Ç",
|
||
"historyTitleOnline": "Çevrimiçi Kullanıcılar",
|
||
"historyTitleLoad": "Sistem Yük Ortalaması (1dk / 5dk / 15dk)",
|
||
"historyTitleConnections": "Etkin Bağlantılar (TCP / UDP)",
|
||
"historyTitleDiskUsage": "Disk Alanı Kullanımı",
|
||
"historyTabBandwidth": "Bant Genişliği",
|
||
"historyTabPackets": "Paketler",
|
||
"historyTabDisk": "Disk G/Ç",
|
||
"historyTabOnline": "Çevrimiçi",
|
||
"historyTabLoad": "Yük",
|
||
"historyTabConnections": "Bağlantılar",
|
||
"historyTabDiskUsage": "Disk Kullanımı",
|
||
"charts": "Grafikler",
|
||
"xrayMetricsTitle": "Xray Metrikleri",
|
||
"xrayTitleHeap": "Ayrılan Yığın Belleği",
|
||
"xrayTitleSys": "İşletim Sisteminden Ayrılan Bellek",
|
||
"xrayTitleObjects": "Aktif Yığın Nesneleri",
|
||
"xrayTitleGcCount": "Tamamlanan GC Döngüleri",
|
||
"xrayTitleGcPause": "GC Duraklama Süresi",
|
||
"xrayTitleObservatory": "Giden Bağlantı Durumu",
|
||
"xrayTabHeap": "Heap",
|
||
"xrayTabSys": "Sys",
|
||
"xrayTabObjects": "Nesneler",
|
||
"xrayTabGcCount": "GC Sayısı",
|
||
"xrayTabGcPause": "GC Duraklaması",
|
||
"xrayTabObservatory": "Gözlemevi",
|
||
"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 Gözlemevi verisi yok",
|
||
"xrayObservatoryHint": "Xray yapılandırmasına test edilecek giden bağlantı etiketlerini listeleyen bir Gözlemevi bloğu ekleyin, sonra Xray'i yeniden başlatın.",
|
||
"xrayObservatoryTagPlaceholder": "Giden bağlantı seç",
|
||
"xrayObservatoryAlive": "Aktif",
|
||
"xrayObservatoryDead": "Kapalı",
|
||
"xrayObservatoryLastSeen": "Son görülme",
|
||
"xrayObservatoryLastTry": "Son deneme",
|
||
"trendLast2Min": "Son 2 dakika",
|
||
"systemLoad": "Sistem Yükü",
|
||
"systemLoadDesc": "Son 1, 5 ve 15 dakikanın 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 işlem 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ı",
|
||
"panelUpdateFailedTitle": "Panel güncellemesi başarısız oldu",
|
||
"panelUpdateFailedDesc": "Güncelleme başarıyla tamamlanamadı. Sunucu günlüklerini kontrol edin veya komut satırından 'x-ui update' çalıştırın.",
|
||
"panelUpdateUnknownTitle": "Güncellemenin tamamlandığı doğrulanamadı",
|
||
"panelUpdateUnknownDesc": "Panel zamanında bir sonuç bildirmedi. Geçerli sürümü kontrol etmek için sayfayı yenileyin veya sunucu günlüklerini kontrol edin.",
|
||
"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",
|
||
"geodataTitle": "Geodata Otomatik Güncelleme",
|
||
"geodataHint": "Xray bu dosyaları zamanlamaya göre indirir ve yeniden başlatmadan canlı yükler. URL'ler HTTPS olmalıdır. Xray'in güncelleyebilmesi için her dosyanın bin klasöründe önceden mevcut olması gerekir.",
|
||
"geodataCron": "Zamanlama (cron)",
|
||
"geodataOutbound": "Outbound üzerinden indir (isteğe bağlı)",
|
||
"geodataFile": "Dosya adı",
|
||
"geodataAddFile": "Dosya ekle",
|
||
"geodataSaveRestart": "Kaydet ve Xray'i Yeniden Başlat",
|
||
"geodataConfirmTitle": "Geodata ayarları kaydedilsin mi?",
|
||
"geodataConfirmContent": "Xray yapılandırma şablonu güncellenecek ve Xray yeniden başlatılacak.",
|
||
"geodataInvalidUrl": "Her dosya için bir HTTPS URL gerekir.",
|
||
"geodataInvalidFile": "Dosya adı yalnızca dosya adı olmalıdır, örn. geosite_custom.dat (yol içermemeli).",
|
||
"geodataInvalidCron": "Cron 5 alandan oluşmalıdır, örn. 0 4 * * *",
|
||
"geodataEmpty": "Yapılandırılmış dosya yok. Yönlendirme kurallarında dosyalar ext:geosite_custom.dat:category olarak kullanılır.",
|
||
"dontRefresh": "Kurulum devam ediyor, lütfen bu sayfayı yenilemeyin",
|
||
"logs": "Günlükler",
|
||
"accessLogs": "Erişim Günlükleri",
|
||
"autoUpdate": "Otomatik Güncelleme",
|
||
"config": "Yapılandırma",
|
||
"backup": "Yedek",
|
||
"backupTitle": "Yedekleme ve 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. Aynı dosya PostgreSQL üzerinde çalışan bir panele de geri yüklenebilir.",
|
||
"importDatabase": "Geri Yükle",
|
||
"importDatabaseDesc": "Cihazınızdan bir .db yedeği veya taşıma dökümü (.dump) seçip yükleyerek veritabanınızı 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.",
|
||
"backupPostgresNote": "Bu panel PostgreSQL üzerinde çalışıyor. 'Yedekle' bir pg_dump arşivi (.dump) indirir, 'Geri Yükle' ise onu pg_restore ile geri yükler. 'Geri Yükle' ayrıca bir SQLite veritabanını (.db) veya SQLite taşıma dökümünü kabul eder ve verilerini PostgreSQL'e aktarır. Sunucuda PostgreSQL istemci araçlarının (pg_dump ve pg_restore) kurulu olması gerekir.",
|
||
"exportDatabasePgDesc": "Mevcut veritabanınızın PostgreSQL dökümünü (.dump) cihazınıza indirmek için tıklayın.",
|
||
"importDatabasePgDesc": "Veritabanınızı geri yüklemek için bir PostgreSQL yedeği (.dump), SQLite veritabanı (.db) veya SQLite taşıma dökümü seçip yüklemek üzere tıklayın. Bu, tüm mevcut verilerin yerini alır.",
|
||
"migrationDownload": "Geçiş Dosyasını İndir",
|
||
"migrationDownloadPgDesc": "PostgreSQL verilerinizden oluşturulan ve bu paneli SQLite üzerinde çalıştırmaya hazır bir .db SQLite veritabanı indirmek için tıklayın."
|
||
},
|
||
"inbounds": {
|
||
"title": "Gelen Bağlantılar",
|
||
"totalDownUp": "Toplam Gönderilen/Alınan",
|
||
"totalUsage": "Toplam Kullanım",
|
||
"inboundCount": "Toplam Gelen Bağlantı",
|
||
"operate": "Menü",
|
||
"enable": "Etkin",
|
||
"remark": "Açıklama",
|
||
"node": "Düğüm",
|
||
"deployTo": "Şuraya Dağıt",
|
||
"localPanel": "Yerel Panel",
|
||
"fallbacks": {
|
||
"title": "Fallback'ler",
|
||
"help": "Bu gelen bağlantı üzerindeki bir istek hiçbir istemci ile eşleşmediğinde, başka bir yere yönlendirilir. Aşağıdan bir alt (child) gelen bağlantı seçerek yönlendirme alanlarını (SNI / ALPN / Path / xver) aktarım (transport) ayarlarından otomatik doldurun ya da seçimi boş bırakıp Hedef (Dest) değerini doğrudan girin (örn. 8080 veya 127.0.0.1:8080); böylece Nginx gibi harici bir sunucuya yönlendirebilirsiniz. Her alt gelen bağlantı 127.0.0.1 üzerinde security=none (güvenlik=yok) ile dinlemelidir.",
|
||
"empty": "Henüz fallback yok",
|
||
"add": "Fallback Ekle",
|
||
"pickInbound": "Bir Gelen Bağlantı Seç",
|
||
"matchAny": "herhangi",
|
||
"destPlaceholder": "otomatik (child listen:port)",
|
||
"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 gelen bağlantı yok",
|
||
"routesWhen": "Şu Durumda Yönlendirir",
|
||
"defaultCatchAll": "Varsayılan — başka her şeyi yakalar",
|
||
"needsTls": "Geri düşüşler (fallback), Güvenlik sekmesinde TLS veya Reality seçildiğinde kullanılabilir olur (yalnızca RAW üzerinde VLESS/Trojan)."
|
||
},
|
||
"protocol": "Protokol",
|
||
"port": "Port",
|
||
"portMap": "Port Eşlemesi",
|
||
"traffic": "Trafik",
|
||
"speed": "Hız",
|
||
"details": "Detaylar",
|
||
"transportConfig": "Aktarım",
|
||
"expireDate": "Süre",
|
||
"createdAt": "Oluşturuldu",
|
||
"updatedAt": "Güncellendi",
|
||
"resetTraffic": "Trafiği Sıfırla",
|
||
"addInbound": "Gelen Bağlantı Ekle",
|
||
"generalActions": "Genel İşlemler",
|
||
"modifyInbound": "Gelen Bağlantını Düzenle",
|
||
"deleteInbound": "Gelen Bağlantını Sil",
|
||
"deleteInboundContent": "Bu gelen bağlantıyı silmek istediğinizden emin misiniz?",
|
||
"deleteConfirmTitle": "\"{remark}\" gelen bağlantı silinsin mi?",
|
||
"deleteConfirmContent": "Bu işlem gelen bağlantıyı ve tüm kullanıcılarını siler. Geri alınamaz.",
|
||
"resetConfirmTitle": "\"{remark}\" trafiği sıfırlansın mı?",
|
||
"resetConfirmContent": "Bu gelen bağlantı için gönderme/alma sayaçlarını 0'a sıfırlar.",
|
||
"selectedCount": "{count} seçildi",
|
||
"selectAll": "Tümünü Seç",
|
||
"bulkDeleteConfirmTitle": "{count} gelen bağlantı silinsin mi?",
|
||
"bulkDeleteConfirmContent": "Bu işlem seçili gelen bağlantılarnı ve tüm kullanıcılarını siler. Geri alınamaz.",
|
||
"cloneConfirmTitle": "\"{remark}\" gelen bağlantı klonlansın mı?",
|
||
"cloneConfirmContent": "Yeni bir port ve boş kullanıcı listesiyle bir kopya oluşturur.",
|
||
"delAllClients": "Tüm Kullanıcıları Sil",
|
||
"delAllClientsConfirmTitle": "\"{remark}\" içindeki {count} kullanıcının tamamı silinsin mi?",
|
||
"delAllClientsConfirmContent": "Bu gelen bağlantıya ait tüm kullanıcıları ve trafik kayıtlarını siler. Gelen bağlantı silinmez. Bu işlem geri alınamaz.",
|
||
"attachClients": "Kullanıcıları Şuna Bağla…",
|
||
"addClientsToGroup": "Kullanıcıları Gruba Ekle…",
|
||
"attachClientsTitle": "\"{remark}\" gelen bağlantındaki kullanıcıları bağla",
|
||
"attachClientsDesc": "Aynı {count} kullanıcıyı (aynı UUID/parola ve paylaşılan trafik) seçilen gelen bağlantılarna bağlar. Bu gelen bağlantında da kalırlar.",
|
||
"attachClientsTargets": "Hedef Gelen Bağlantılar",
|
||
"attachClientsNoTargets": "Bağlanacak uyumlu başka gelen bağlantı yok.",
|
||
"attachClientsResult": "Bağlandı {attached}, atlandı {skipped}.",
|
||
"attachClientsResultMixed": "Bağlandı {attached}, atlandı {skipped}, hatalar {errors}.",
|
||
"attachClientsSelectLabel": "Bağlanacak Kullanıcılar",
|
||
"attachClientsSearchPlaceholder": "E-posta veya yorum ara",
|
||
"attachClientsStatusDisabled": "Devre Dışı",
|
||
"attachClientsSelectedCount": "{total} içinden {selected} seçildi",
|
||
"attachExistingClients": "Mevcut Kullanıcıları Bağla…",
|
||
"attachExistingTitle": "«{remark}» gelen bağlantıya mevcut kullanıcıları bağla",
|
||
"attachExistingDesc": "Mevcut kullanıcıları ({count} uygun) bu gelen bağlantıya bağlar — aynı UUID/şifre ve paylaşılan trafik. Halihazırda bu gelen bağlantıya bağlı olan kullanıcılar atlanır.",
|
||
"attachExistingNoClients": "Henüz kullanıcı yok. Önce kullanıcı oluşturun, ardından buraya bağlayın.",
|
||
"attachExistingStatusAttached": "Zaten Bağlı",
|
||
"detachClients": "Kullanıcıları Çöz",
|
||
"detachClientsTitle": "«{remark}» gelen bağlantındaki kullanıcıları çöz",
|
||
"detachClientsDesc": "Seçilen kullanıcıları yalnızca bu gelen bağlantıdan kaldırır. Kullanıcı kayıtları korunur (tamamen kaldırmak için Delete kullanın). Kaynakta toplam {count} kullanıcı var.",
|
||
"detachClientsResult": "Çözüldü {detached}, atlandı {skipped}.",
|
||
"detachClientsResultMixed": "Çözüldü {detached}, atlandı {skipped}, hatalar {errors}.",
|
||
"detachClientsSelectLabel": "Çözülecek Kullanıcılar",
|
||
"exportLinksTitle": "Gelen bağlantı bağlantılarını dışa aktar",
|
||
"exportSubsTitle": "Abonelik bağlantılarını dışa aktar",
|
||
"exportAllLinksTitle": "Tüm gelen bağlantı bağlantılarını dışa aktar",
|
||
"exportAllSubsTitle": "Tüm abonelik bağlantılarını dışa aktar",
|
||
"exportAllLinksFileName": "Tüm-BağlantıNoktaları",
|
||
"exportAllSubsFileName": "Tüm-BağlantıNoktaları-Subs",
|
||
"inboundJsonTitle": "Gelen Bağlantı JSON",
|
||
"deleteClient": "Kullanıcıyı Sil",
|
||
"deleteClientContent": "Kullanıcıyı 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": "Süresiz olması için boş bırakın",
|
||
"noRecommendKeepDefault": "Varsayılan ayarda bırakılması önerilir",
|
||
"certificatePath": "Dosya Yolu",
|
||
"certificateContent": "Dosya İçeriği",
|
||
"publicKey": "Genel Anahtar",
|
||
"privatekey": "Özel Anahtar",
|
||
"clickOnQRcode": "Kopyalamak İçin QR Koda Tıklayın",
|
||
"client": "Kullanıcı",
|
||
"export": "Tüm URL'leri Dışa Aktar",
|
||
"clone": "Klonla",
|
||
"cloneInbound": "Klonla",
|
||
"cloneInboundContent": "Bu gelen bağlantıyın tüm ayarları, Port, Dinleme IP ve Kullanıcılar hariç, klona uygulanacaktır.",
|
||
"cloneInboundOk": "Klonla",
|
||
"resetAllTraffic": "Tüm Gelen Trafiği Sıfırla",
|
||
"resetAllTrafficTitle": "Tüm Gelen Trafiği Sıfırla",
|
||
"resetAllTrafficContent": "Tüm gelen bağlantılarnın trafiğini sıfırlamak istediğinizden emin misiniz?",
|
||
"resetInboundClientTraffics": "Kullanıcıların Trafiğini Sıfırla",
|
||
"resetInboundClientTrafficTitle": "Kullanıcı Trafiklerini Sıfırla",
|
||
"resetInboundClientTrafficContent": "Bu gelen bağlantıya ait kullanıcıların trafiğini sıfırlamak istediğinizden emin misiniz?",
|
||
"resetAllClientTraffics": "Tüm Kullanıcıların Trafiğini Sıfırla",
|
||
"resetAllClientTrafficTitle": "Tüm Kullanıcı Trafiklerini Sıfırla",
|
||
"resetAllClientTrafficContent": "Tüm kullanıcıların trafiğini sıfırlamak istediğinizden emin misiniz?",
|
||
"delDepletedClients": "Kotası Dolan Kullanıcıları Sil",
|
||
"delDepletedClientsTitle": "Kotası Dolan Kullanıcıları Sil",
|
||
"delDepletedClientsContent": "Kotası dolan veya süresi biten tüm kullanıcıları 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 bağlantı 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 yeniden etkinleştirmek için günlüğü temizleyin)",
|
||
"IPLimitlogclear": "Günlüğü Temizle",
|
||
"setDefaultCert": "Panelden Sertifikayı Ayarla",
|
||
"setDefaultCertEmpty": "Panel için sertifika yapılandırılmamış. Önce Ayarlar'dan ayarlayın.",
|
||
"streamTab": "Akış",
|
||
"securityTab": "Güvenlik",
|
||
"sniffingTab": "Dinleme",
|
||
"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 (native)",
|
||
"vlessAuthMlkem768": "ML-KEM-768 (native)",
|
||
"vlessAuthX25519Xorpub": "X25519 (xorpub)",
|
||
"vlessAuthX25519Random": "X25519 (random)",
|
||
"vlessAuthMlkem768Xorpub": "ML-KEM-768 (xorpub)",
|
||
"vlessAuthMlkem768Random": "ML-KEM-768 (random)",
|
||
"vlessAuthCustom": "Özel",
|
||
"vlessAuthSelected": "Seçili: {auth}",
|
||
"vlessAuthGenerate": "Anahtar oluştur",
|
||
"vlessAuthGenerateButton": "Oluştur",
|
||
"advanced": {
|
||
"title": "Gelen Bağlantı JSON Bölümleri",
|
||
"subtitle": "Tam gelen bağlantı 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 gelen bağlantı nesnesi.",
|
||
"settings": "Ayarlar",
|
||
"settingsHelp": "Xray settings bloğunun sarmalayıcısı:",
|
||
"sniffing": "Sniffing",
|
||
"sniffingHelp": "Xray sniffing bloğunun sarmalayıcısı:",
|
||
"stream": "Stream",
|
||
"streamHelp": "Xray stream bloğunun sarmalayıcısı:",
|
||
"jsonErrorPrefix": "Gelişmiş JSON"
|
||
},
|
||
"telegramDesc": "Lütfen Telegram Sohbet Kimliği (Chat ID) sağlayın. ({'@'}userinfobot'tan öğrenebilir veya botta '/id' komutunu kullanabilirsiniz.)",
|
||
"subscriptionDesc": "Abonelik URL'nizi bulmak için 'Detaylar'a gidin. Aynı adı birden fazla kullanıcı için kullanabilirsiniz.",
|
||
"subSortIndex": "Sıralama",
|
||
"same": "Aynı",
|
||
"inboundInfo": "Gelen Bağlantı Bilgileri",
|
||
"exportInbound": "Gelen Bağlantını Dışa Aktar",
|
||
"import": "İçe Aktar",
|
||
"importInbound": "Gelen Bağlantı İç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": "Al",
|
||
"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.",
|
||
"bulkDeleted": "{count} gelen bağlantı silindi",
|
||
"bulkDeletedMixed": "{ok} silindi, {failed} başarısız",
|
||
"inboundDeleteSuccess": "Gelen bağlantı başarıyla silindi.",
|
||
"inboundClientAddSuccess": "Gelen bağlantı kullanıcı(lar)ı eklendi.",
|
||
"inboundClientDeleteSuccess": "Gelen bağlantı kullanıcısı silindi.",
|
||
"inboundClientUpdateSuccess": "Gelen bağlantı kullanıcısı güncellendi.",
|
||
"savedNodeOfflineWillSync": "Yerel olarak kaydedildi. Destekleyen bir düğüm çevrimdışı veya devre dışı — değişiklik yeniden bağlandığında senkronize edilecek.",
|
||
"delDepletedClientsSuccess": "Tüm tükenmiş kullanıcılar silindi.",
|
||
"resetAllClientTrafficSuccess": "Tüm kullanıcıların 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.",
|
||
"scanRealityTargetError": "REALITY hedefi taranamadı.",
|
||
"scanRealityTargetFeasible": "Hedef uygun — hedef ve SNI dolduruldu.",
|
||
"scanRealityTargetNotFeasible": "Hedefe ulaşılabiliyor ancak REALITY için uygun değil.",
|
||
"invalidClientField": "Kullanıcı {client}: {field} — {reason}",
|
||
"invalidField": "{field} — {reason}",
|
||
"moreIssues": "{message} (+{count} tane daha)"
|
||
},
|
||
"form": {
|
||
"moveUp": "Yukarı Taşı",
|
||
"moveDown": "Aşağı Taşı",
|
||
"addAll": "Tümünü Ekle",
|
||
"addAllFallbackTooltip": "Henüz bağlanmamış her uygun gelen bağlantı için bir fallback satırı ekler",
|
||
"peers": "Eşler (Peers)",
|
||
"addPeer": "Eş (Peer) Ekle",
|
||
"keepAlive": "Keep-alive",
|
||
"autoSystemRoutesTooltip": "Yalnızca Windows. CIDR'ler eşleşen trafiğin TUN üzerinden gitmesi için sistem yönlendirme tablosuna otomatik eklenir.",
|
||
"autoOutboundsInterface": "Otomatik Giden Arabirimi",
|
||
"autoOutboundsInterfaceTooltip": "Giden trafik için fiziksel arabirim. Tespit için 'auto' kullanın; Otomatik sistem yönlendirmeleri açıkken otomatik etkinleşir.",
|
||
"rewriteAddress": "Adresi Yeniden Yaz",
|
||
"rewritePort": "Port'u Yeniden Yaz",
|
||
"allowedNetwork": "İzin Verilen Ağ",
|
||
"followRedirect": "Yönlendirmeleri İzle",
|
||
"accounts": "Hesaplar",
|
||
"allowTransparent": "Şeffafa İzin Ver",
|
||
"encryptionMethod": "Şifreleme Yöntemi",
|
||
"fakeTlsDomain": "FakeTLS alan adı (SNI)",
|
||
"mtprotoSecret": "Gizli Anahtar (Secret)",
|
||
"mtgDomainFrontingIp": "Domain fronting IP",
|
||
"mtgDomainFrontingPort": "Domain fronting portu",
|
||
"mtgDomainFrontingProxyProtocol": "Domain fronting PROXY protokolü",
|
||
"mtgDomainFrontingHint": "mtg'nin Telegram dışı trafiği gönderdiği yer — örn. NGINX sahte siteniz. FakeTLS alan adını DNS üzerinden kullanmak için IP'yi boş bırakın; varsayılan port 443'tür.",
|
||
"mtgProxyProtocolListener": "PROXY protokolünü kabul et (dinleyici)",
|
||
"mtgPreferIp": "IP tercihi",
|
||
"mtgDebug": "Hata ayıklama günlüğü",
|
||
"mtgRouteThroughXray": "Xray üzerinden yönlendir",
|
||
"mtgRouteThroughXrayHint": "Bu proxy'nin Telegram trafiğini Xray üzerinden geçirerek yönlendirme kurallarınıza uymasını sağlayın. mtg yardımcı süreci, bu gelen bağlantının etiketini taşıyan bir loopback SOCKS köprüsü üzerinden çıkış yapar; gelişmiş kurallar için Yönlendirme sekmesinde bu etiketi kullanın.",
|
||
"mtgRouteOutbound": "Giden",
|
||
"mtgRouteOutboundHint": "İsteğe bağlı. Telegram trafiğini bu giden bağlantı (veya dengeleyici) üzerinden çıkmaya zorlar. Yönlendirme kurallarınızın karar vermesi için boş bırakın.",
|
||
"mtgRouteOutboundPlaceholder": "Yönlendirme kurallarını kullan",
|
||
"mtprotoFakeTlsDomainHint": "Yeni bir istemcinin sırrını oluştururken kullanılan varsayılan FakeTLS alan adı. Her istemci kendi alan adını kullanabilir.",
|
||
"mtgThrottleMaxConnections": "Maks. bağlantı",
|
||
"mtgThrottleMaxConnectionsHint": "Tüm kullanıcıların eşzamanlı bağlantılarını adil paylaşımla sınırlar. 0 devre dışı bırakır.",
|
||
"mtgAdTagInvalid": "Reklam etiketi tam olarak 32 onaltılık karakter olmalıdır.",
|
||
"mtgPublicIpv4": "Genel IPv4",
|
||
"mtgPublicIpv6": "Genel IPv6",
|
||
"mtgPublicIpHint": "Bu sunucunun erişilebilir genel adresi; reklam etiketi ara proxy'si tarafından kullanılır. mtg'nin otomatik algılaması için boş bırakın.",
|
||
"visionTestseed": "Vision Testseed",
|
||
"version": "Sürüm",
|
||
"udpIdleTimeout": "UDP Idle Timeout (s)",
|
||
"masquerade": "Masquerade",
|
||
"type": "Tip",
|
||
"upstreamUrl": "Upstream URL",
|
||
"rewriteHost": "Host'u Yeniden Yaz",
|
||
"skipTlsVerify": "TLS Doğrulamayı Atla",
|
||
"directory": "Dizin",
|
||
"statusCode": "Durum Kodu",
|
||
"body": "Body",
|
||
"headers": "Başlıklar",
|
||
"proxyProtocol": "Proxy Protocol",
|
||
"requestVersion": "İstek Sürümü",
|
||
"requestMethod": "İstek Yöntemi",
|
||
"requestPath": "İstek Yolu",
|
||
"requestHeaders": "İstek Başlıkları",
|
||
"responseVersion": "Yanıt Sürümü",
|
||
"responseStatus": "Yanıt Durumu",
|
||
"responseReason": "Yanıt Sebebi",
|
||
"responseHeaders": "Yanıt Başlıkları",
|
||
"heartbeatPeriod": "Heartbeat Periyodu",
|
||
"serviceName": "Servis Adı",
|
||
"authority": "Authority",
|
||
"multiMode": "Multi Mode",
|
||
"maxBufferedUpload": "Maks. Tamponlu Yükleme",
|
||
"maxUploadSize": "Maks. Yükleme Boyutu (Byte)",
|
||
"streamUpServer": "Stream-Up Sunucusu",
|
||
"serverMaxHeaderBytes": "Sunucu Maks. Başlık Byte'ı",
|
||
"paddingBytes": "Padding Byte'ı",
|
||
"uplinkHttpMethod": "Uplink HTTP Yöntemi",
|
||
"paddingObfsMode": "Padding Obfs Modu",
|
||
"paddingKey": "Padding Key",
|
||
"paddingHeader": "Padding Header",
|
||
"paddingPlacement": "Padding Konumu",
|
||
"paddingMethod": "Padding Yöntemi",
|
||
"sessionPlacement": "Session Placement",
|
||
"sessionKey": "Session Key",
|
||
"sessionIDTable": "Oturum Kimliği Tablosu",
|
||
"sessionIDTableHint": "Oturum kimliği üretmek için karakter kümesi: önceden tanımlı bir ad (ALPHABET, Base62, hex, number, …) veya düz ASCII dizesi. xray-core varsayılanı için boş bırakın.",
|
||
"sessionIDLength": "Oturum Kimliği Uzunluğu",
|
||
"sessionIDLengthHint": "Üretilen oturum kimliğinin uzunluğu veya aralığı (örn. 8-16). Yalnızca bir Oturum Kimliği Tablosu ayarlandığında kullanılır; en küçük değer 0'dan büyük olmalıdır.",
|
||
"sequencePlacement": "Sequence Placement",
|
||
"sequenceKey": "Sequence Key",
|
||
"uplinkDataPlacement": "Uplink Data Placement",
|
||
"uplinkDataKey": "Uplink Data Key",
|
||
"noSseHeader": "SSE Başlığı Yok",
|
||
"ttiMs": "TTI (ms)",
|
||
"uplinkMbps": "Uplink (MB/s)",
|
||
"downlinkMbps": "Downlink (MB/s)",
|
||
"cwndMultiplier": "CWND Çarpanı",
|
||
"maxSendingWindow": "Maks. Gönderme Penceresi",
|
||
"externalProxy": "Harici Proxy",
|
||
"forceTls": "TLS'ye Zorla",
|
||
"fingerprint": "Fingerprint",
|
||
"defaultOption": "Varsayılan",
|
||
"routeMark": "Route Mark",
|
||
"tcpKeepAliveInterval": "TCP Keep Alive Interval",
|
||
"tcpKeepAliveIdle": "TCP Keep Alive Idle",
|
||
"tcpMaxSeg": "TCP Max Seg",
|
||
"tcpUserTimeout": "TCP User Timeout",
|
||
"tcpWindowClamp": "TCP Window Clamp",
|
||
"tcpWindowClampHint": "İşletim sistemi varsayılanını kullanmak için 0 bırakın. Sıfır olmayan değerler ilan edilen TCP alım penceresini sınırlar; 600 gibi değerler (Xray belgelerindeki örnek) yüksek gecikmeli bağlantılarda verimi çökertebilir.",
|
||
"tcpFastOpen": "TCP Fast Open",
|
||
"multipathTcp": "Multipath TCP",
|
||
"penetrate": "Penetrate",
|
||
"v6Only": "Yalnızca IPv6",
|
||
"tcpCongestion": "TCP Congestion",
|
||
"dialerProxy": "Dialer Proxy",
|
||
"trustedXForwardedFor": "Güvenilir X-Forwarded-For",
|
||
"trustedXForwardedForHint": "Gerçek istemci IP'sini almak için bu istek başlığına güven (örn. Cloudflare CDN arkasındaki CF-Connecting-IP). Yalnızca WebSocket, HTTPUpgrade, XHTTP ve gRPC taşımalarında geçerlidir. İletilen başlıkları yok saymak için boş bırakın.",
|
||
"proxyProtocolHint": "Gerçek istemci IP'sini bir üst L4 tüneli veya rölesi (HAProxy, gost, nginx-stream, Xray dokodemo-door) ya da Cloudflare Spectrum üzerinden öğrenmek için PROXY protocol başlığını kabul et. Üst sunucu PROXY protocol göndermek ZORUNDADIR. TCP, WebSocket, HTTPUpgrade ve gRPC üzerinde çalışır; mKCP üzerinde çalışmaz.",
|
||
"realClientIp": "Gerçek istemci IP'si",
|
||
"realClientIpHint": "Trafik bu gelen bağlantıya bir CDN veya röle üzerinden ulaştığında, aracı adresini kaydetmek yerine ziyaretçinin gerçek IP'sini al. Aşağıdaki ilgili sockopt alanlarını doldurmak için bir hazır ayar seç. Bu alanlar aboneliklerde istemcilere asla gönderilmez.",
|
||
"realClientIpPresetOff": "Kapalı / doğrudan",
|
||
"realClientIpPresetCloudflare": "Cloudflare CDN",
|
||
"realClientIpPresetProxyProtocol": "L4 röle / Spectrum (PROXY)",
|
||
"realClientIpTrustedHeaderTransportWarn": "Trusted X-Forwarded-For yalnızca WebSocket, HTTPUpgrade ve XHTTP üzerinde geçerlidir. Mevcut taşımada bu başlık yok sayılır.",
|
||
"realClientIpProxyProtocolTransportWarn": "PROXY protocol bu taşımada (mKCP) desteklenmez. TCP/RAW, WebSocket, HTTPUpgrade, gRPC veya XHTTP kullanın.",
|
||
"addressPortStrategy": "Adres+Port Stratejisi",
|
||
"tryDelayMs": "Deneme Gecikmesi (ms)",
|
||
"prioritizeIPv6": "IPv6 Önceliği",
|
||
"interleave": "Interleave",
|
||
"maxConcurrentTry": "Maks. Eşzamanlı Deneme",
|
||
"customSockopt": "Özel Sockopt",
|
||
"addCustomOption": "Özel Seçenek Ekle",
|
||
"serverNameIndication": "Server Name Indication (SNI)",
|
||
"cipherSuites": "Cipher Suites",
|
||
"autoOption": "Otomatik",
|
||
"minMaxVersion": "Min/Maks Sürüm",
|
||
"rejectUnknownSni": "Bilinmeyen SNI Reddet",
|
||
"disableSystemRoot": "Sistem Root'u Devre Dışı Bırak",
|
||
"sessionResumption": "Oturum Sürdürme",
|
||
"oneTimeLoading": "Tek Seferlik Yükleme",
|
||
"usageOption": "Kullanım Seçeneği",
|
||
"buildChain": "Zincir Oluştur",
|
||
"echKey": "ECH Key",
|
||
"echConfig": "ECH Yapılandırması",
|
||
"pinnedPeerCertSha256": "Sabitlenmiş Peer Sertifikası SHA-256",
|
||
"pinnedPeerCertSha256Tip": "Peer sertifikasının SHA-256 hash'leri onaltılık (hex) dizge olarak (örn. e8e2d3…), virgülle ayrılmış. Sadece panel — sunucunun Xray yapılandırmasına yazılmaz, ancak kullanıcıların sertifikayı sabitleyebilmesi için paylaşım bağlantılarına eklenir.",
|
||
"pinnedPeerCertSha256Placeholder": "onaltılık (hex) hash(ler), virgülle ayrılmış",
|
||
"getNewEchCert": "Yeni ECH Sertifikası Al",
|
||
"show": "Göster",
|
||
"xver": "Xver",
|
||
"target": "Hedef",
|
||
"maxTimeDiff": "Maks. Zaman Farkı (ms)",
|
||
"minClientVer": "Min. Kullanıcı Sürümü",
|
||
"maxClientVer": "Maks. Kullanıcı Sürümü",
|
||
"shortIds": "Short IDs",
|
||
"realityTargetHint": "Zorunlu. Bir port içermelidir (ör. example.com:443). Port belirtilmezse Xray-core başlamaz.",
|
||
"realityTargetRequired": "REALITY hedefi zorunludur",
|
||
"realityTargetNeedsPort": "REALITY hedefi bir port içermelidir (ör. example.com:443)",
|
||
"realityTargetInvalidPort": "REALITY hedefinde geçersiz bir port var",
|
||
"scan": "Tara",
|
||
"findTargets": "Hedef bul",
|
||
"scanModalTitle": "REALITY Hedef Tarayıcı",
|
||
"scanModalDesc": "Bir alan adını doğrulayın veya sertifikalarından yeni REALITY hedefleri keşfetmek için bir IP / CIDR aralığını tarayın. Yaygın adayları taramak için kutuyu boş bırakın.",
|
||
"scanDiscoverPlaceholder": "IP, CIDR veya alan adı — yaygın adaylar için boş bırakın",
|
||
"scanStatus": "Durum",
|
||
"scanFeasible": "Uygun",
|
||
"scanNotFeasible": "Uygun değil",
|
||
"scanCurve": "Anahtar Değişimi",
|
||
"scanCert": "Sertifika",
|
||
"scanCertInvalid": "Güvenilmez",
|
||
"scanLatency": "Gecikme",
|
||
"scanUse": "Kullan",
|
||
"scanRescan": "Yeniden tara",
|
||
"spiderX": "SpiderX",
|
||
"spiderXHint": "İstemci başına tohum — panel bundan her istemci için benzersiz bir spx yolu türetir; herkesin yolunu döndürmek için yeniden üretin",
|
||
"getNewCert": "Yeni Sertifika Al",
|
||
"mldsa65Seed": "mldsa65 Seed",
|
||
"mldsa65Verify": "mldsa65 Verify",
|
||
"getNewSeed": "Yeni Seed Al",
|
||
"listenHelp": "TCP portu yerine bir Unix soket yolu (örn. /run/xray/in.sock) ya da @ ön ekli bir soyut soket adı (örn. @xray/in.sock) da girebilirsiniz — bu durumda Port'u 0 olarak ayarlayın.",
|
||
"shareAddrStrategy": "Paylaşım adresi stratejisi",
|
||
"shareAddrStrategyHelp": "Dışa aktarılan paylaşım bağlantılarına, QR kodlarına ve abonelik çıktısına hangi adresin yazılacağını belirler.",
|
||
"shareAddr": "Özel paylaşım adresi",
|
||
"shareAddrHelp": "Yalnızca paylaşım adresi stratejisi Özel olduğunda kullanılır. Şema veya port olmadan bir ana makine ya da IP girin.",
|
||
"subSortIndex": "Abonelikte sıralama",
|
||
"subSortIndexHelp": "Bu gelen bağlantının linklerinin abonelik çıktısındaki (abonelik sayfası ve istemci uygulamaları) konumu. Küçük değerler önce gelir; eşit değerlerde oluşturulma sırası korunur. Paneldeki gelen bağlantı listesini etkilemez.",
|
||
"shareAddrStrategyOptions": {
|
||
"node": "Düğüm adresi",
|
||
"listen": "Inbound dinleme adresi",
|
||
"custom": "Özel"
|
||
},
|
||
"echSockopt": "ECH Sockopt",
|
||
"echSockoptTip": "Xray'in ECH yapılandırma listesini almak için kullandığı bağlantının soket seçenekleri (ör. aramayı bir dialerProxy giden bağlantısı üzerinden yönlendirme). Varsayılanları kullanmak için devre dışı bırakın.",
|
||
"curvePreferences": "Eğri Tercihleri",
|
||
"curvePreferencesTip": "Sunucunun sunduğu TLS anahtar değişim eğrilerini tercih sırasına göre kısıtlayın (ör. X25519MLKEM768, X25519). Xray-core varsayılanlarını kullanmak için boş bırakın.",
|
||
"masterKeyLog": "Ana Anahtar Günlüğü",
|
||
"masterKeyLogTip": "Wireshark ile hata ayıklama için TLS ana anahtarlarının yazılacağı yol (SSLKEYLOGFILE biçimi). Üretimde boş bırakın — dosyaya erişimi olan herkesin trafiği çözmesine olanak tanır.",
|
||
"verifyPeerCertByName": "Peer sertifikasını ada göre doğrula",
|
||
"verifyPeerCertByNameTip": "İstemcilere sunucu sertifikasını SNI yerine bu ada göre doğrulamalarını söyler. Adları virgülle ayırın. Yalnızca panele özgü — paylaşım bağlantılarına eklenir (vcn). Xray'in 2026-06-01 sonrası kaldırdığı allowInsecure'un modern karşılığıdır.",
|
||
"pinFromCert": "Bu gelen bağlantının sertifikasından doldur",
|
||
"pinFromRemote": "SNI'ye ping atarak hash'i al (xray tls ping)",
|
||
"pinFromRemoteNoSni": "Uzak sertifikaya ping atmak için önce SNI'yi (serverName) ayarlayın.",
|
||
"pinFromRemoteFailed": "Uzak sertifika hash'i alınamadı.",
|
||
"limitFallback": "Fallback Sınırı",
|
||
"limitFallbackUpload": "Fallback Yükleme Sınırı",
|
||
"limitFallbackDownload": "Fallback İndirme Sınırı",
|
||
"afterBytes": "Bayttan Sonra",
|
||
"afterBytesTip": "Fallback'in bu kadar bayt boyunca tam hızda çalışmasına izin verin, ardından kısıtlamaya başlayın. 0 = ilk bayttan itibaren kısıtla.",
|
||
"bytesPerSec": "Saniye Başına Bayt",
|
||
"bytesPerSecTip": "Eşik aşıldıktan sonra fallback trafiğine uygulanan hız sınırı (bayt/sn); böylece sondalar sunucunuzu hedefe ücretsiz bant genişliği olarak kullanamaz. 0 = sınır yok (bu yönü devre dışı bırakır).",
|
||
"burstBytesPerSec": "Saniye Başına Patlama Baytı",
|
||
"burstBytesPerSecTip": "Sabit hızın üzerindeki kısa patlamalar için pay (token-bucket boyutu). Saniye Başına Bayt değerinden düşükse ona eşitlenecek şekilde yükseltilir."
|
||
},
|
||
"info": {
|
||
"mode": "Mod",
|
||
"grpcServiceName": "grpc serviceName",
|
||
"grpcMultiMode": "grpc multiMode",
|
||
"interfaceName": "Arabirim Adı",
|
||
"mtu": "MTU",
|
||
"gateway": "Gateway",
|
||
"dns": "DNS",
|
||
"outboundsInterface": "Giden Arabirimi",
|
||
"autoSystemRoutes": "Otomatik Sistem Yönlendirmeleri",
|
||
"followRedirect": "FollowRedirect",
|
||
"auth": "Auth",
|
||
"noKernelTun": "Çekirdeksiz TUN",
|
||
"keepAlive": "Keep alive",
|
||
"peerNumber": "Peer {n}",
|
||
"peerNumberConfig": "Peer {n} Yapılandırması"
|
||
},
|
||
"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ığı"
|
||
}
|
||
},
|
||
"sniffingDestOverride": "Hedef geçersiz kılma"
|
||
},
|
||
"clients": {
|
||
"tabBasics": "Temel",
|
||
"tabCredentials": "Kimlik Bilgileri",
|
||
"tabLinks": "Bağlantılar",
|
||
"wireguardConfig": "WireGuard yapılandırması",
|
||
"config": "Yapılandırma",
|
||
"linksHint": "Bu istemcinin aboneliğine dahil etmek için üçüncü taraf paylaşım bağlantıları ve uzak abonelik URL'leri ekleyin.",
|
||
"addExternalLink": "Harici Bağlantı Ekle",
|
||
"addExternalSubscription": "Harici Abonelik Ekle",
|
||
"noExternalLinks": "Henüz harici bağlantı yok.",
|
||
"noExternalSubscriptions": "Henüz harici abonelik yok.",
|
||
"add": "Kullanıcı Ekle",
|
||
"edit": "Kullanıcıyı Düzenle",
|
||
"submitAdd": "Kullanıcı Ekle",
|
||
"submitEdit": "Değişiklikleri Kaydet",
|
||
"clientCount": "Kullanıcı Sayısı",
|
||
"bulk": "Toplu Ekle",
|
||
"copyFromInbound": "Gelen Bağlantından Kullanıcıları Kopyala",
|
||
"copyToInbound": "Kullanıcıların Kopyalanacağı Yer",
|
||
"copySelected": "Seçileni Kopyala",
|
||
"copySource": "Kaynak",
|
||
"copyEmailPreview": "Oluşacak E-posta Önizlemesi",
|
||
"copySelectSourceFirst": "Önce bir kaynak gelen bağlantı seçin.",
|
||
"copyResult": "Kopya Sonucu",
|
||
"copyResultSuccess": "Başarıyla kopyalandı",
|
||
"copyResultNone": "Kopyalanacak bir şey yok: kullanıcı seçilmemiş veya kaynak boş.",
|
||
"copyResultErrors": "Kopyalama Hataları",
|
||
"copyFlowLabel": "Yeni Kullanıcılar İçin Flow (VLESS)",
|
||
"copyFlowHint": "Kopyalanan tüm kullanıcılara 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 (gün)",
|
||
"days": "Gün(ler)",
|
||
"renew": "Otomatik Yenileme",
|
||
"renewDesc": "Süre dolduktan sonra otomatik yeniler. (0 = devre dışı) (birim: gün)",
|
||
"renewDays": "Otomatik Yenileme (gün)",
|
||
"searchPlaceholder": "E-posta, yorum, sub ID, UUID, parola, auth, Telegram ID ara…",
|
||
"filterTitle": "Kullanıcıları Filtrele",
|
||
"clearAllFilters": "Tümünü Temizle",
|
||
"filters": {
|
||
"nodes": "Düğümler",
|
||
"localPanel": "Yerel (bu panel)"
|
||
},
|
||
"showingCount": "{total} içinden {shown} gösteriliyor",
|
||
"sortOldest": "Önce En Eski",
|
||
"sortNewest": "Önce En Yeni",
|
||
"sortRecentlyUpdated": "Son Güncellenen",
|
||
"sortRecentlyOnline": "Son Çevrimiçi",
|
||
"sortEmailAZ": "E-posta A→Z",
|
||
"sortEmailZA": "E-posta Z→A",
|
||
"sortMostTraffic": "En Çok Trafik",
|
||
"sortHighestRemaining": "En Çok Kalan",
|
||
"sortExpiringSoonest": "Yakında Biten",
|
||
"has": "Var",
|
||
"hasNot": "Yok",
|
||
"title": "Kullanıcılar",
|
||
"actions": "İşlemler",
|
||
"totalGB": "Trafik Limiti (GB)",
|
||
"totalGBDesc": "Bu kullanıcı için veri kotası. 0 = sınırsız.",
|
||
"expiryTime": "Son Kullanma",
|
||
"addClients": "Kullanıcı Ekle",
|
||
"limitIp": "IP Limiti",
|
||
"limitIpDesc": "Eş zamanlı en fazla IP sayısı. 0 = sınırsız.",
|
||
"limitIpFail2banMissing": "Fail2ban yüklü değil, bu nedenle IP sınırı uygulanamaz. Bu seçeneği etkinleştirmek için x-ui bash menüsünden Fail2ban'ı yükleyin.",
|
||
"limitIpFail2banWindows": "Fail2ban Windows'ta kullanılamadığından IP sınırı uygulanamaz.",
|
||
"limitIpDisabled": "IP sınırı özelliği bu sunucuda devre dışı.",
|
||
"password": "Şifre",
|
||
"passwordDesc": "Yalnızca Trojan ve Shadowsocks istemcileri tarafından kullanılır; VLESS, VMess, Hysteria ve WireGuard için yok sayılır.",
|
||
"subId": "Abonelik ID'si",
|
||
"online": "Çevrimiçi",
|
||
"email": "E-posta",
|
||
"emailInvalidChars": "E-posta boşluk, '/', '\\' veya kontrol karakterleri içeremez",
|
||
"subIdInvalidChars": "Abonelik kimliği boşluk, '/', '\\' veya kontrol karakterleri içeremez",
|
||
"group": "Grup",
|
||
"groupDesc": "İlgili kullanıcıları gruplamak için mantıksal etiket (ekip, müşteri, bölge). Araç çubuğundan filtrelenebilir.",
|
||
"groupPlaceholder": "örn. customer-a",
|
||
"comment": "Yorum",
|
||
"traffic": "Trafik",
|
||
"speed": "Hız",
|
||
"offline": "Çevrimdışı",
|
||
"addClient": "Kullanıcı Ekle",
|
||
"qrCode": "QR Kodu",
|
||
"clientInfo": "Kullanıcı Bilgileri",
|
||
"delete": "Sil",
|
||
"reset": "Trafiği Sıfırla",
|
||
"editClient": "Kullanıcıyı Düzenle",
|
||
"client": "Kullanıcı",
|
||
"enabled": "Etkin",
|
||
"remaining": "Kalan",
|
||
"duration": "Süre",
|
||
"attachedInbounds": "Bağlı Gelen Bağlantılar",
|
||
"selectInbound": "Bir veya Daha Fazla Gelen Bağlantı Seçin",
|
||
"selectAllInbounds": "Tümünü Seç",
|
||
"clearAllInbounds": "Tümünü Temizle",
|
||
"noSubId": "Bu kullanıcının subId'si yok, dolayısıyla paylaşılabilir bir bağlantısı bulunmuyor.",
|
||
"noLinks": "Paylaşılabilir bağlantı yok — önce bu kullanıcıyı bir protokole sahip olan gelen bağlantıya bağlayın.",
|
||
"link": "Bağlantı",
|
||
"resetNotPossible": "Önce bu kullanıcıyı bir gelen bağlantıya bağlayın.",
|
||
"general": "Genel",
|
||
"resetAllTraffics": "Tüm Kullanıcıların Trafiğini Sıfırla",
|
||
"resetAllTrafficsTitle": "Tüm Kullanıcıların Trafiği Sıfırlansın Mı?",
|
||
"resetAllTrafficsContent": "Her kullanıcının yükleme/indirme sayaçları sıfırlanır. Kotalar ve son kullanma tarihleri etkilenmez. Geri alınamaz.",
|
||
"deleteConfirmTitle": "{email} Kullanıcısı Silinsin Mi?",
|
||
"deleteConfirmContent": "Bu işlem kullanıcıyı bağlı tüm gelen bağlantılarndan kaldırır ve trafik kaydını siler. Geri alınamaz.",
|
||
"deleteSelected": "Sil ({count})",
|
||
"adjustSelected": "Ayarla ({count})",
|
||
"subLinksSelected": "Abonelik Bağlantıları ({count})",
|
||
"addToGroupTitle": "{count} Kullanıcıyı Bir Gruba Ekle",
|
||
"addToGroupTooltip": "Mevcut bir grubu seçin veya yeni ad girin. Kullanıcıları mevcut gruplarından çıkarmak için Gruptan Çıkar'ı kullanın.",
|
||
"groupName": "Grup Adı",
|
||
"addToGroupSuccessToast": "{count} kullanıcı {group} grubuna eklendi",
|
||
"ungroupSuccessToast": "{count} kullanıcının grubu temizlendi",
|
||
"ungroup": "Gruptan Çıkar",
|
||
"ungroupConfirmTitle": "{count} Kullanıcıyı Gruptan Çıkar?",
|
||
"ungroupConfirmContent": "Seçilen her kullanıcının grup etiketini temizler. Kullanıcılar korunur (tamamen kaldırmak için Sil'i kullanın).",
|
||
"addToGroup": "Gruba Ekle",
|
||
"attach": "Bağla",
|
||
"adjust": "Ayarla",
|
||
"subLinks": "Abonelik Bağlantıları",
|
||
"enable": "Etkinleştir",
|
||
"disable": "Devre Dışı Bırak",
|
||
"bulkEnableConfirmTitle": "{count} kullanıcı etkinleştirilsin mi?",
|
||
"bulkEnableConfirmContent": "Seçili her kullanıcıyı bağlı olduğu tüm gelen bağlantılarda etkinleştirir. Kotası dolmuş veya süresi geçmiş kullanıcılar otomatik olarak yeniden devre dışı bırakılır.",
|
||
"bulkDisableConfirmTitle": "{count} kullanıcı devre dışı bırakılsın mı?",
|
||
"bulkDisableConfirmContent": "Seçili her kullanıcıyı bağlı olduğu tüm gelen bağlantılarda devre dışı bırakır. Erişimlerini hemen kaybederler ancak kayıtları ve trafikleri korunur.",
|
||
"selectedCount": "{count} Seçildi",
|
||
"attachSelected": "Bağla ({count})",
|
||
"attachToInboundsTitle": "{count} Kullanıcıyı Gelen Bağlantına Bağla",
|
||
"attachToInboundsDesc": "Seçilen {count} kullanıcıyı (aynı UUID/şifre ve paylaşılan trafikle) seçilen gelen bağlantıya bağlar. Mevcut bağlantıları da korunur.",
|
||
"attachToInboundsTargets": "Hedef Gelen Bağlantılar",
|
||
"attachToInboundsNoTargets": "Bağlanacak çoklu kullanıcılı gelen bağlantı yok.",
|
||
"detachSelected": "Ayır ({count})",
|
||
"detach": "Ayır",
|
||
"detachFromInboundsTitle": "{count} Kullanıcıyı Gelen Bağlantından Ayır",
|
||
"detachFromInboundsDesc": "Seçilen {count} kullanıcıyı seçilen gelen bağlantıdan kaldırır. Kullanıcının zaten bağlı olmadığı gelen bağlantılar atlanır. Kullanıcı kayıtları korunur (tamamen kaldırmak için Sil'i kullanın).",
|
||
"detachFromInboundsTargets": "Çözülecek Gelen Bağlantılar",
|
||
"detachFromInboundsNoTargets": "Çoklu kullanıcılı gelen bağlantı yok.",
|
||
"detachFromInboundsResult": "Ayrıldı {detached}, atlandı {skipped}.",
|
||
"detachFromInboundsResultMixed": "Ayrıldı {detached}, atlandı {skipped}, hatalar {errors}.",
|
||
"subLinksTitle": "Abonelik Bağlantıları ({count})",
|
||
"subLinkColumn": "Abonelik URL",
|
||
"subJsonLinkColumn": "Abonelik JSON URL",
|
||
"subLinksCopyAll": "Tümünü Kopyala",
|
||
"subLinksCopiedAll": "{count} bağlantı kopyalandı",
|
||
"subLinksEmpty": "Seçilen kullanıcıların hiçbirinin abonelik ID'si yok.",
|
||
"subLinksDisabled": "Abonelik hizmeti devre dışı.",
|
||
"subLinksDisabledHint": "Bağlantı oluşturmak için Panel Ayarları → Abonelik'ten etkinleştirin.",
|
||
"bulkDeleteConfirmTitle": "{count} Kullanıcı Silinsin Mi?",
|
||
"bulkDeleteConfirmContent": "Seçili her kullanıcı bağlı tüm gelen bağlantılarndan kaldırılır ve trafik kaydı silinir. Geri alınamaz.",
|
||
"bulkAdjustTitle": "{count} Kullanıcıyı Ayarla",
|
||
"bulkAdjustHint": "Pozitif değerler ekler, negatif değerler azaltır. Sınırsız süreli veya trafikli kullanıcılar ilgili alan için atlanır.",
|
||
"bulkAdjustNothing": "Uygulamadan önce gün veya trafik belirleyin.",
|
||
"addDays": "Gün Ekle",
|
||
"addTrafficGB": "Trafik Ekle (GB)",
|
||
"bulkFlow": "Flow ayarla",
|
||
"bulkFlowNoChange": "Değişiklik yok",
|
||
"bulkFlowDisable": "Devre dışı bırak (flow temizle)",
|
||
"delDepleted": "Süresi/Kotası Bitenleri Sil",
|
||
"delDepletedConfirmTitle": "Tükenmiş Kullanıcılar Silinsin Mi?",
|
||
"delDepletedConfirmContent": "Trafik kotası dolan veya süresi geçen tüm kullanıcılar silinir. Geri alınamaz.",
|
||
"exportClients": "Kullanıcıları Dışa Aktar",
|
||
"importClients": "Kullanıcıları İçe Aktar",
|
||
"import": "İçe Aktar",
|
||
"delOrphans": "Bağsız Kullanıcıları Sil",
|
||
"delOrphansConfirmTitle": "Gelen Bağlantısı Olmayan Kullanıcılar Silinsin Mi?",
|
||
"delOrphansConfirmContent": "Hiçbir gelen bağlantıya bağlı olmayan her kullanıcı, trafik kaydıyla birlikte silinir. Geri alınamaz.",
|
||
"auth": "Auth",
|
||
"hysteriaAuth": "Hysteria Auth",
|
||
"hysteriaAuthDesc": "Yalnızca Hysteria istemcilerinin kullandığı kimlik bilgisi. Trojan ve Shadowsocks bunun yerine \"Şifre\" alanını kullanır.",
|
||
"uuid": "UUID",
|
||
"flow": "Flow",
|
||
"vmessSecurity": "VMess Güvenlik",
|
||
"wireguardPrivateKey": "WireGuard Özel Anahtarı",
|
||
"wireguardPublicKey": "WireGuard Genel Anahtarı",
|
||
"wireguardPreSharedKey": "WireGuard Ön Paylaşımlı Anahtar",
|
||
"wireguardAllowedIPs": "WireGuard İzin Verilen IP'ler",
|
||
"wireguardAllowedIPsHint": "Otomatik atama için boş bırakın; girişleri virgülle ayırın",
|
||
"mtprotoSecret": "MTProto sırrı",
|
||
"mtprotoSecretHint": "İstemcinin FakeTLS sırrı. Değiştirmek için yeniden oluşturun.",
|
||
"mtprotoAdTag": "Reklam etiketi (sponsorlu kanal)",
|
||
"mtprotoAdTagHint": "Telegram proxy kaydından alınan isteğe bağlı 32 karakterlik onaltılık etiket. Ayarlandığında bu istemci Telegram ara proxy'leri üzerinden yönlendirilir ve sohbet listesinin en üstünde sponsorlu bir kanal görünür.",
|
||
"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": "Kullanıcı silindi",
|
||
"trafficReset": "Trafik sıfırlandı",
|
||
"allTrafficsReset": "Tüm kullanıcıların trafiği sıfırlandı",
|
||
"bulkDeleted": "{count} kullanıcı silindi",
|
||
"bulkDeletedMixed": "{ok} silindi, {failed} başarısız",
|
||
"bulkEnabled": "{count} kullanıcı etkinleştirildi",
|
||
"bulkEnabledMixed": "{ok} etkinleştirildi, {failed} başarısız",
|
||
"bulkDisabled": "{count} kullanıcı devre dışı bırakıldı",
|
||
"bulkDisabledMixed": "{ok} devre dışı bırakıldı, {failed} başarısız",
|
||
"bulkCreated": "{count} kullanıcı oluşturuldu",
|
||
"bulkCreatedMixed": "{ok} oluşturuldu, {failed} başarısız",
|
||
"bulkAdjusted": "{count} kullanıcı ayarlandı",
|
||
"bulkAdjustedMixed": "{ok} ayarlandı, {skipped} atlandı",
|
||
"delDepleted": "{count} tükenmiş kullanıcı silindi",
|
||
"delOrphans": "{count} bağsız kullanıcı silindi",
|
||
"imported": "{count} kullanıcı içe aktarıldı",
|
||
"importedMixed": "{ok} içe aktarıldı, {failed} atlandı"
|
||
}
|
||
},
|
||
"groups": {
|
||
"title": "Gruplar",
|
||
"name": "İsim",
|
||
"clientCount": "Kullanıcılar",
|
||
"totalGroups": "Toplam grup",
|
||
"totalGroupedClients": "Grubu olan kullanıcılar",
|
||
"trafficUsed": "Kullanılan trafik",
|
||
"upload": "Yükleme",
|
||
"download": "İndirme",
|
||
"totalTraffic": "Toplam trafik",
|
||
"totalUpDown": "Toplam yükleme / indirme",
|
||
"addGroup": "Grup ekle",
|
||
"createSuccess": "«{name}» grubu oluşturuldu.",
|
||
"rename": "Yeniden adlandır",
|
||
"renameTitle": "{name} yeniden adlandır",
|
||
"renameCollision": "«{name}» adında bir grup zaten var.",
|
||
"renameSuccess": "{count} kullanıcının grubu yeniden adlandırıldı.",
|
||
"deleteConfirmTitle": "{name} Grubunu Sil?",
|
||
"deleteConfirmContent": "Bu işlem grubu siler ve etiketini {count} kullanıcıdan kaldırır. Kullanıcılar silinmez.",
|
||
"deleteSuccess": "{count} kullanıcının grubu temizlendi.",
|
||
"resetTraffic": "Trafiği Sıfırla",
|
||
"resetConfirmTitle": "{name} Grubunun Trafiğini Sıfırla?",
|
||
"resetConfirmContent": "Bu yalnızca grubun trafik sayacını sıfırlar. Tek tek kullanıcı sayaçları etkilenmez.",
|
||
"resetSuccess": "{name} grubunun trafiği sıfırlandı.",
|
||
"adjustSuccess": "{name} içinde {count} kullanıcı ayarlandı.",
|
||
"emptyForAction": "Bu grupta henüz kullanıcı yok.",
|
||
"deleteGroupOnly": "Grubu Sil (Kullanıcıları Tut)",
|
||
"deleteClients": "Gruptaki Kullanıcıları Sil",
|
||
"deleteClientsConfirmTitle": "{name} İçindeki Tüm Kullanıcıları Sil?",
|
||
"deleteClientsConfirmContent": "Bu işlem, {count} kullanıcıyı trafik kayıtlarıyla birlikte kalıcı olarak siler. Grup etiketi de temizlenir. Geri alınamaz.",
|
||
"deleteClientsSuccess": "{count} kullanıcı silindi.",
|
||
"deleteClientsMixed": "{ok} silindi, {failed} atlandı",
|
||
"addToGroup": "Kullanıcı Ekle…",
|
||
"addToGroupTitle": "«{name}» Grubuna Kullanıcı Ekle",
|
||
"addToGroupDesc": "Bu gruba eklemek için kullanıcıları seçin. Mevcut gelen bağlantılar korunur; yalnızca grup etiketi değişir. Halihazırda bu grupta olan kullanıcılar listelenmez.",
|
||
"addToGroupEmpty": "Eklenecek başka kullanıcı yok.",
|
||
"addToGroupResult": "{count} kullanıcı {name} grubuna eklendi.",
|
||
"removeFromGroup": "Kullanıcı Çıkar…",
|
||
"removeFromGroupTitle": "«{name}» Grubundan Kullanıcı Çıkar",
|
||
"removeFromGroupDesc": "Bu gruptan çıkarılacak üyeleri seçin. Kullanıcılar korunur (tamamen kaldırmak için «Gruptaki kullanıcıları sil» kullanın).",
|
||
"removeFromGroupResult": "{name} grubundan {count} kullanıcı çıkarıldı."
|
||
},
|
||
"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ı Kimlik Doğrulama → 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 İzin Ver",
|
||
"allowPrivateAddressHint": "Yalnızca özel ağ veya VPN üzerindeki düğümler için etkinleştirin.",
|
||
"outboundTag": "Bağlantı gideni",
|
||
"outboundTagHint": "Bu düğümün panel API trafiğini seçilen Xray gideni üzerinden yönlendirin. Geri döngü köprüsü inbound'ı çalışan yapılandırmaya otomatik olarak eklenir ve canlı uygulanır. Doğrudan bağlantı için boş bırakın.",
|
||
"outboundTagPlaceholder": "Doğrudan bağlantı",
|
||
"inboundSyncMode": "Inbound içe aktarma",
|
||
"inboundSyncModeHint": "Bu düğümden içe aktarılacak inbound'ları seçin. Mevcut düğümler varsayılan olarak tümünü içe aktarır.",
|
||
"allInbounds": "Tüm inbound'lar",
|
||
"selectedInbounds": "Seçili inbound'lar",
|
||
"inboundTags": "Inbound'lar",
|
||
"inboundTagsHint": "Seçim inbound etiketiyle eşleştirilir. Boş seçim hiçbir şeyi içe aktarmaz.",
|
||
"inboundTagsPlaceholder": "Inbound'ları yükleyip seçin",
|
||
"loadInbounds": "Inbound'ları düğümden yükle",
|
||
"inboundsLoaded": "{{count}} inbound yüklendi",
|
||
"inboundsLoadFailed": "Inbound'lar yüklenemedi",
|
||
"enable": "Etkin",
|
||
"status": "Durum",
|
||
"cpu": "CPU",
|
||
"mem": "Bellek",
|
||
"netUp": "Ağ Yükleme (KB/s)",
|
||
"netDown": "Ağ İndirme (KB/s)",
|
||
"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",
|
||
"updatePanel": "Paneli Güncelle",
|
||
"updateSelected": "Seçilenleri Güncelle ({count})",
|
||
"updateAvailable": "Güncelleme mevcut",
|
||
"upToDate": "Güncel",
|
||
"updateConfirmTitle": "{count} düğüm en son sürüme güncellensin mi?",
|
||
"updateConfirmContent": "Seçilen her düğüm en son sürümü indirir ve yeniden başlatılır. Yalnızca etkin ve çevrimiçi düğümler güncellenir.",
|
||
"updateDevChannel": "Dev kanalına güncelle (son commit)",
|
||
"testConnection": "Bağlantıyı Test Et",
|
||
"connectionOk": "Bağlantı tamam ({ms} ms)",
|
||
"connectionFailed": "Bağlantı başarısız",
|
||
"never": "Asla",
|
||
"justNow": "Şimdi",
|
||
"subNode": "Alt Düğüm",
|
||
"subNodeTip": "Salt okunur: {parent} üzerinden erişilen bir alt düğüm. Bunu {parent} panelinden yönetin.",
|
||
"deleteConfirmTitle": "\"{name}\" düğümü silinsin mi?",
|
||
"deleteConfirmContent": "Bu işlem düğüm izlemeyi durdurur. Uzak panelin kendisi etkilenmez.",
|
||
"statusValues": {
|
||
"online": "Çevrimiçi",
|
||
"offline": "Çevrimdışı",
|
||
"unknown": "Bilinmiyor",
|
||
"xrayError": "Xray Hatası",
|
||
"xrayStopped": "Durduruldu"
|
||
},
|
||
"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",
|
||
"updateStarted": "Panel güncellemesi başlatıldı",
|
||
"updateResult": "{ok} düğümde güncelleme başlatıldı, {failed} başarısız",
|
||
"updateNoneEligible": "En az bir çevrimiçi ve etkin düğüm seçin",
|
||
"saveMtls": "Düğüm mTLS kaydet"
|
||
},
|
||
"tlsVerifyMode": "TLS Doğrulaması",
|
||
"tlsVerifyModeHint": "Panelin düğümün HTTPS sertifikasını nasıl doğrulayacağını belirler. Sabitle veya Atla, kendinden imzalı sertifikalar içindir (yalnızca https düğümleri).",
|
||
"tlsVerify": "Doğrula (varsayılan CA)",
|
||
"tlsPin": "Sertifikayı Sabitle (SHA-256)",
|
||
"tlsSkip": "Doğrulamayı Atla",
|
||
"tlsMtls": "Karşılıklı TLS (istemci sertifikası)",
|
||
"mtlsFormHint": "Bu düğüm, paneli bir istemci sertifikasıyla doğrular. Düğüm mTLS bölümünden bu panelin CA’sını düğüme kopyalayın, güvenilen CA’sını ayarlayın ve ardından düğümü yeniden başlatın.",
|
||
"mtls": {
|
||
"title": "Düğüm mTLS",
|
||
"intro": "Karşılıklı TLS, düğümler arası çağrılarda API belirtecinin yanına bir istemci sertifikası faktörü ekler. İsteğe bağlıdır: yalnızca belirteçle kimlik doğrulamayı sürdürmek için boş bırakın.",
|
||
"copyCa": "Bu panelin CA’sını kopyala",
|
||
"copyCaHint": "Bu CA’yı bu panelin yönettiği düğümlere verin ve ardından TLS doğrulamalarını Karşılıklı TLS olarak ayarlayın.",
|
||
"caCopied": "CA sertifikası panoya kopyalandı",
|
||
"caFailed": "CA sertifikası alınamadı",
|
||
"trustLabel": "Güvenilen üst CA",
|
||
"trustHint": "Bu panel kendisi bir düğümse, istemci sertifikasını zorunlu kılmak için onu yöneten panelin CA’sını buraya yapıştırın. Uygulamak için paneli yeniden başlatın.",
|
||
"trustPlaceholder": "-----BEGIN CERTIFICATE-----",
|
||
"save": "Güvenilen CA’yı kaydet",
|
||
"saved": "Güvenilen CA kaydedildi — uygulamak için paneli yeniden başlatın"
|
||
},
|
||
"tlsSkipWarning": "Doğrulamayı atlamak, ortadaki adam (MITM) saldırılarına karşı korumayı kaldırır — API anahtarı ele geçirilebilir. Bunun yerine sertifikayı sabitlemeniz önerilir.",
|
||
"pinnedCert": "Sabitlenen Sertifika SHA-256",
|
||
"pinnedCertHint": "Düğüm sertifikasının base64 veya hex biçiminde SHA-256 değeri. Şimdi düğümden okumak için Getir'i kullanın.",
|
||
"pinnedCertPlaceholder": "base64 veya hex SHA-256",
|
||
"fetchPin": "Getir",
|
||
"pinFetched": "Düğümün geçerli sertifikası alındı",
|
||
"pinFetchFailed": "Sertifika alınamadı"
|
||
},
|
||
"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 loglarını kontrol edin.",
|
||
"restartPanelSuccess": "Panel başarıyla yeniden başlatıldı.",
|
||
"actions": "İşlemler",
|
||
"resetDefaultConfig": "Varsayılana Sıfırla",
|
||
"panelSettings": "Genel",
|
||
"securitySettings": "Kimlik Doğrulama",
|
||
"securityWarnings": "Güvenlik Uyarıları",
|
||
"panelExposed": "Paneliniz dışa açık olabilir:",
|
||
"warnHttp": "Panel düz HTTP üzerinden sunuluyor — üretim için TLS kurun.",
|
||
"warnDefaultPort": "Varsayılan 2053 portu yaygın olarak bilinmektedir — farklı bir portla değiştirin.",
|
||
"warnDefaultBasePath": "Varsayılan temel yol \"/\" yaygın olarak bilinmektedir — rastgele bir yol ile değiştirin.",
|
||
"warnDefaultSubPath": "Varsayılan abonelik yolu \"/sub/\" yaygın olarak bilinmektedir — değiştirin.",
|
||
"warnDefaultJsonPath": "Varsayılan JSON abonelik yolu \"/json/\" yaygın olarak bilinmektedir — değiştirin.",
|
||
"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": "Gelen Bağlantılar tablosu için sayfa boyutunu belirler. (0 = devre dışı)",
|
||
"panelOutbound": "Panel Trafiği Gideni",
|
||
"panelOutboundDesc": "Panelin kendi isteklerini — panel/Xray sürüm kontrolleri ve indirmeleri, Telegram ve normal geo dosyası güncellemesi — bu Xray gideni üzerinden yönlendirir; sunucu tarafındaki GitHub/Telegram filtrelemesini aşmak için. Yerel bir köprü gelen bağlantısı çalışan yapılandırmaya otomatik eklenir ve canlı uygulanır. Xray'in yerel Geodata Otomatik Güncellemesi etkilenmez; kendi indirme gidenine sahiptir. Doğrudan bağlantı için boş bırakın.",
|
||
"panelOutboundPh": "Doğrudan bağlantı",
|
||
"datepicker": "Takvim Türü",
|
||
"datepickerPlaceholder": "Tarih Seçin",
|
||
"datepickerDescription": "Planlanmış görevler bu takvime göre çalışacaktır.",
|
||
"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 Sunucusu",
|
||
"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 (Chat ID). Birden fazla ise virgülle ayırın. ({'@'}userinfobot'tan alabilirsiniz veya botta '/id' komutunu kullanabilirsiniz.)",
|
||
"telegramNotifyTime": "Bildirim Zamanı",
|
||
"telegramNotifyTimeDesc": "Telegram botunun periyodik raporları gönderme sıklığı. Hazır bir aralık seçin veya bir crontab ifadesi girmek için Özel'i seçin.",
|
||
"notifyTime": {
|
||
"every": "@every — bir aralıkla tekrarla",
|
||
"hourly": "@hourly — her saat",
|
||
"daily": "@daily — her gün 00:00'da",
|
||
"weekly": "@weekly — her hafta",
|
||
"monthly": "@monthly — her ay",
|
||
"custom": "Özel (crontab)",
|
||
"seconds": "Saniye",
|
||
"minutes": "Dakika",
|
||
"hours": "Saat",
|
||
"interval": "Aralık",
|
||
"unit": "Birim"
|
||
},
|
||
"tgNotifyBackup": "Veritabanı Yedeği",
|
||
"tgNotifyBackupDesc": "Bir rapor ile birlikte veritabanı yedek dosyasını gönderir.",
|
||
"tgNotifyLogin": "Giriş Bildirimi",
|
||
"tgNotifyLoginDesc": "Birisi web panelinize giriş yapmaya çalıştığında kullanıcı adı, IP adresi ve zaman hakkında bildirim almanızı sağlar.",
|
||
"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 almanızı sağlar. (birim: gün)",
|
||
"trafficDiff": "Trafik Sınırı Bildirimi",
|
||
"trafficDiffDesc": "Bu eşik seviyesine ulaşıldığında trafik sınırı hakkında bildirim almanızı sağlar. (birim: GB)",
|
||
"tgNotifyCpu": "CPU Yükü Bildirimi",
|
||
"tgNotifyCpuDesc": "CPU yükü bu eşik seviyesini aşarsa bildirim almanızı sağlar. (birim: %)",
|
||
"timeZone": "Saat Dilimi",
|
||
"timeZoneDesc": "Planlanmış görevler bu saat dilimine göre çalışacaktır.",
|
||
"subSettings": "Abonelik",
|
||
"subEnable": "Abonelik Hizmeti",
|
||
"subEnableDesc": "Abonelik hizmetini etkinleştirir/devre dışı bırakır.",
|
||
"subJsonEnable": "JSON abonelik uç noktasını bağımsız olarak etkinleştirir/devre dışı bırakır.",
|
||
"subJsonEnableTitle": "JSON Aboneliği",
|
||
"subClashEnableTitle": "Clash / Mihomo Aboneliği",
|
||
"subFormatsTipTitle": "Biçime özel abonelik ayarları",
|
||
"subFormatsTipDesc": "JSON ve Clash / Mihomo için URL yollarını, ters URL'leri ve otomatik istemci algılamayı ayrı ayrı yapılandırın.",
|
||
"subFormatsTipAction": "Abonelik Biçimlerini Aç",
|
||
"subJsonAutoDetect": "Xray JSON istemcilerini otomatik algıla",
|
||
"subJsonAutoDetectDesc": "Etkinleştirildiğinde, standart abonelik URL'sini isteyen tanınmış uyumlu istemciler otomatik olarak bir Xray JSON yapılandırma dizisi alır. Diğer istemciler ham/Base64 yanıtını almaya devam eder. JSON aboneliğinin etkinleştirilmesi ve panelin yeniden başlatılması gerekir.",
|
||
"subJsonAlwaysArray": "Her zaman JSON dizisi döndür",
|
||
"subJsonAlwaysArrayDesc": "Açık JSON abonelik uç noktasını tek profil olsa bile XTLS standardına uygun bir dizi olarak döndürür. Otomatik algılanan JSON yanıtları her zaman dizi kullanır. Eski tek nesne yanıtını korumak için devre dışı bırakın.",
|
||
"subJsonUserAgentRegex": "Xray JSON User-Agent düzenli ifadesi",
|
||
"subJsonUserAgentRegexDesc": "Standart abonelik URL'sinde Xray JSON biçimini otomatik seçmek için istemcinin User-Agent değeriyle eşleştirilen Go RE2 düzenli ifadesi. Varsayılan olarak boştur; bu nedenle hizmet vermek istediğiniz istemciler için bir desen belirleyene kadar otomatik algılama kapalı kalır. Diğer istemciler ham/Base64 yanıtını almaya devam eder. Değişiklikten sonra paneli yeniden başlatın.",
|
||
"subClashAutoDetect": "Clash/Mihomo istemcilerini otomatik algıla",
|
||
"subClashAutoDetectDesc": "Etkinleştirildiğinde, standart abonelik URL'sini isteyen tanınmış Clash/Mihomo istemcileri otomatik olarak Clash YAML alır. Tarayıcılar abonelik sayfasını göstermeye devam eder, diğer istemciler ham/Base64 yanıtını almaya devam eder ve açık JSON ile Clash URL'leri kullanılabilir kalır. Uygulanması için Clash/Mihomo aboneliğinin etkinleştirilmesi ve panelin yeniden başlatılması gerekir.",
|
||
"subClashUserAgentRegex": "Clash/Mihomo User-Agent düzenli ifadesi",
|
||
"subClashUserAgentRegexDesc": "Standart abonelik URL'sinde Clash/Mihomo istemcilerini tanımak için istemcinin User-Agent değeriyle eşleştirilen Go RE2 düzenli ifadesi. Varsayılan deseni kullanmak için boş bırakın. Değişiklikten sonra paneli yeniden başlatın.",
|
||
"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",
|
||
"subThemeDir": "Abonelik Tema Dizini",
|
||
"subThemeDirDesc": "Abonelik sayfası için özel bir şablon (index.html/sub.html) içeren klasörün mutlak yolu (örn. /etc/3x-ui/sub_templates/my-theme/). Varsayılan sayfayı kullanmak için boş bırakın.",
|
||
"subThemeDirDocs": "Şablon kılavuzu ↗",
|
||
"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)",
|
||
"subHideSettings": "Sunucu ayarlarını gizle",
|
||
"subHideSettingsDesc": "VPN istemcisinde sunucu yapılandırmalarını görüntüleme ve düzenleme özelliğini gizleyin. (Yalnızca Happ için)",
|
||
"subIncyEnableRouting": "Yönlendirmeyi etkinleştir",
|
||
"subIncyEnableRoutingDesc": "Incy istemcisi için abonelik gövdesine bir yönlendirme profili ekleyin. (Yalnızca Incy için)",
|
||
"subIncyRoutingRules": "Yönlendirme kuralları",
|
||
"subIncyRoutingRulesDesc": "Abonelik gövdesine eklenen Incy yönlendirme bağlantısı, örn. incy://routing/onadd/<base64>. (Yalnızca Incy için)",
|
||
"subClashEnableRouting": "Yönlendirmeyi Etkinleştir",
|
||
"subClashEnableRoutingDesc": "Oluşturulan YAML aboneliklerine genel Clash/Mihomo yönlendirme kurallarını ekler.",
|
||
"subClashRoutingRules": "Genel Yönlendirme Kuralları",
|
||
"subClashRoutingRulesDesc": "Her YAML aboneliğinin başına MATCH,PROXY öncesinde eklenen varsayılan Clash/Mihomo kuralları.",
|
||
"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). Ayrıca, aşağıdaki \"Ters Proxy URI\" boşsa panelde gösterilen abonelik bağlantısı/QR kodunu oluşturmak için de kullanılır — abonelik farklı bir portta ters proxy üzerinden erişiliyorsa bunun yerine \"Ters Proxy URI\"yi ayarlayın.",
|
||
"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). Ayrıca, \"Ters Proxy URI\" boşsa gösterilen abonelik bağlantısı için yedek alan adı olarak da kullanılır — panel ve abonelik farklı alan adları üzerinden erişiliyorsa (örneğin bir ters proxy arkasında) \"Ters Proxy URI\"yi ayarlayın.",
|
||
"subUpdates": "Güncelleme Aralıkları",
|
||
"subUpdatesDesc": "İstemci uygulamalarındaki abonelik URL'sinin güncellenme aralığı. (birim: saat)",
|
||
"subEncrypt": "Kodla",
|
||
"subEncryptDesc": "Abonelik hizmetinin döndürülen içeriğini Base64 ile şifreler.",
|
||
"subURI": "Ters Proxy URI",
|
||
"subURIDesc": "Abonelik bağlantısı ve QR kodu için Dinleme Alan Adı/Dinleme Portu yerine kullanılan tam temel URL (scheme://alanadi[:port]/yol/). Abonelik bir ters proxy üzerinden veya yukarıdakilerden farklı bir alan adı/port üzerinden erişildiğinde bunu ayarlayın.",
|
||
"externalTrafficInformEnable": "Harici Trafik Bilgisi",
|
||
"externalTrafficInformEnableDesc": "Her trafik güncellemesinde harici API'yi bilgilendirir.",
|
||
"externalTrafficInformURI": "Harici Trafik Bilgisi URI'si",
|
||
"externalTrafficInformURIDesc": "Trafik güncellemeleri bu URI'ye gönderilir.",
|
||
"restartXrayOnClientDisable": "Otomatik Devre Dışı Sonrası Xray'i Yeniden Başlat",
|
||
"restartXrayOnClientDisableDesc": "Bir kullanıcı süre dolumu veya trafik limiti nedeniyle otomatik devre dışı bırakıldığında Xray'i yeniden başlatır.",
|
||
"fragment": "Parçalama",
|
||
"fragmentDesc": "TLS merhaba paketinin parçalanmasını etkinleştirir.",
|
||
"fragmentSett": "Parçalama Ayarları",
|
||
"noisesDesc": "Noises'i etkinleştirir.",
|
||
"noisesSett": "Noises Ayarları",
|
||
"trustedProxyCidrs": "Güvenilir Proxy CIDR'leri",
|
||
"trustedProxyCidrsDesc": "İletilen host, proto ve istemci IP başlıklarını ayarlamasına izin verilen IP'ler/CIDR'ler (virgülle ayrılmış).",
|
||
"ldap": {
|
||
"enable": "LDAP senkronizasyonunu etkinleştir",
|
||
"host": "LDAP host",
|
||
"port": "LDAP port",
|
||
"useTls": "TLS kullan (LDAPS)",
|
||
"skipTlsVerify": "TLS sertifika doğrulamasını atla",
|
||
"skipTlsVerifyDesc": "Güvenli değil — sunucu sertifika doğrulamasını devre dışı bırakır. Yalnızca dahili/güvenilmeyen CA'larla kullanın.",
|
||
"bindDn": "Bind DN",
|
||
"passwordConfigured": "Yapılandırıldı; mevcut parolayı korumak için boş bırakın.",
|
||
"passwordUnconfigured": "Yapılandırılmadı.",
|
||
"passwordPlaceholder": "Yapılandırıldı — değiştirmek için yeni değer girin",
|
||
"baseDn": "Base DN",
|
||
"userFilter": "Kullanıcı filtresi",
|
||
"userAttr": "Kullanıcı özniteliği (username/email)",
|
||
"vlessField": "VLESS flag özniteliği",
|
||
"flagField": "Genel flag özniteliği (opsiyonel)",
|
||
"flagFieldDesc": "Ayarlanırsa VLESS flag'ini geçersiz kılar — örn. shadowInactive.",
|
||
"truthyValues": "Truthy değerler",
|
||
"truthyValuesDesc": "Virgülle ayrılmış; varsayılan: true,1,yes,on",
|
||
"invertFlag": "Flag'i tersine çevir",
|
||
"invertFlagDesc": "Öznitelik «devre dışı» anlamına geldiğinde etkinleştirin (örn. shadowInactive).",
|
||
"syncSchedule": "Senkronizasyon programı",
|
||
"syncScheduleDesc": "cron benzeri dize, örn. @every 1m",
|
||
"inboundTags": "Gelen bağlantı etiketleri",
|
||
"inboundTagsDesc": "LDAP senkronizasyonunun istemci otomatik oluşturup/silebileceği gelen bağlantılar.",
|
||
"noInbounds": "Gelen bağlantı bulunamadı. Önce Gelen Bağlantılar'nda bir tane oluşturun.",
|
||
"autoCreate": "Kullanıcıları otomatik oluştur",
|
||
"autoDelete": "Kullanıcıları otomatik sil",
|
||
"defaultTotalGb": "Varsayılan toplam (GB)",
|
||
"defaultExpiryDays": "Varsayılan son kullanma (gün)",
|
||
"defaultIpLimit": "Varsayılan IP limiti"
|
||
},
|
||
"subFormats": {
|
||
"finalMask": "Final Mask",
|
||
"finalMaskDesc": "Xray finalmask TCP/UDP maskelerini ve QUIC parametrelerini oluşturulan her Xray JSON profiline ekler. Xray JSON aboneliklerini destekleyen bir istemci uygulaması ve güncel bir Xray çekirdeği gerektirir.",
|
||
"packets": "Paketler",
|
||
"length": "Uzunluk",
|
||
"interval": "Aralık",
|
||
"maxSplit": "Maks. bölünme",
|
||
"noises": "Gürültüler",
|
||
"noiseItem": "Gürültü №{n}",
|
||
"type": "Tip",
|
||
"packet": "Paket",
|
||
"delayMs": "Gecikme (ms)",
|
||
"applyTo": "Şuna Uygula",
|
||
"addNoise": "+ Gürültü",
|
||
"concurrency": "Eşzamanlılık",
|
||
"xudpConcurrency": "xudp eşzamanlılık",
|
||
"xudpUdp443": "xudp UDP 443"
|
||
},
|
||
"mux": "Mux",
|
||
"muxDesc": "Mevcut bir veri akışı üzerinden 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",
|
||
"profile": "Profil",
|
||
"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 metni 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 — botları veya uzak panelleri doğrulamak için bir tane oluşturun.",
|
||
"apiTokenDeleteWarning": "Bu token'ı kullanan tüm bağlantılar anında kimlik doğrulamasını kaybeder.",
|
||
"apiTokenCreatedTitle": "Token Oluşturuldu",
|
||
"apiTokenCreatedNotice": "Bu token'ı şimdi kopyalayın. Güvenlik nedeniyle okunabilir biçimde saklanmaz ve tekrar gösterilmez."
|
||
},
|
||
"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 hatalı.",
|
||
"userPassMustBeNotEmpty": "Yeni kullanıcı adı ve şifre boş olamaz.",
|
||
"getOutboundTrafficError": "Giden trafik alınırken hata oluştu.",
|
||
"resetOutboundTrafficError": "Giden trafik sıfırlanırken hata oluştu."
|
||
},
|
||
"smtpSettings": "SMTP Ayarları",
|
||
"smtpEnable": "E-posta Bildirimlerini Etkinleştir",
|
||
"smtpEnableDesc": "SMTP üzerinden e-posta bildirimlerini etkinleştirin",
|
||
"smtpHost": "SMTP Sunucusu",
|
||
"smtpHostDesc": "SMTP sunucu ana bilgisayar adı (örn. smtp.gmail.com)",
|
||
"smtpPort": "SMTP Bağlantı Noktası",
|
||
"smtpPortDesc": "SMTP sunucu bağlantı noktası (varsayılan: 587)",
|
||
"smtpUsername": "SMTP Kullanıcı Adı",
|
||
"smtpUsernameDesc": "SMTP kimlik doğrulama kullanıcı adı",
|
||
"smtpFrom": "Gönderen Adresi (From)",
|
||
"smtpFromDesc": "E-postanın From başlığında kullanılan adres. Boş bırakılırsa kullanıcı adı kullanılır.",
|
||
"smtpFromName": "Gönderen Adı (From)",
|
||
"smtpFromNameDesc": "From başlığında adresten önce görünen isteğe bağlı ad.",
|
||
"smtpPassword": "SMTP Parolası",
|
||
"smtpPasswordDesc": "SMTP kimlik doğrulama parolası",
|
||
"smtpTo": "Alıcılar",
|
||
"smtpToDesc": "Virgülle ayrılmış alıcı e-posta adresleri",
|
||
"emailSettings": "E-posta",
|
||
"emailNotifications": "Bildirimler",
|
||
"smtpEventBusNotify": "E-posta Olay Bildirimleri",
|
||
"smtpEventBusNotifyDesc": "Hangi olayların e-posta bildirimi tetikleyeceğini seçin",
|
||
"tgEventBusNotify": "Telegram Olay Bildirimleri",
|
||
"tgEventBusNotifyDesc": "Hangi olayların Telegram bildirimi tetikleyeceğini seçin",
|
||
"testSmtp": "Test E-postası Gönder",
|
||
"testTgBot": "Test Mesajı Gönder",
|
||
"eventGroupOutbound": "Giden Bağlantı",
|
||
"eventGroupXray": "Xray Çekirdeği",
|
||
"eventGroupSystem": "Sistem",
|
||
"eventGroupSecurity": "Güvenlik",
|
||
"eventGroupNode": "Düğümler",
|
||
"eventOutboundDown": "Çevrimdışı",
|
||
"eventOutboundUp": "Çevrimiçi",
|
||
"eventXrayCrash": "Çökme",
|
||
"eventNodeDown": "Çevrimdışı",
|
||
"eventNodeUp": "Çevrimiçi",
|
||
"eventCPUHigh": "Yüksek CPU (%)",
|
||
"requestFailed": "İstek başarısız oldu",
|
||
"smtpEncryption": "Şifreleme",
|
||
"smtpEncryptionDesc": "SMTP bağlantı şifreleme yöntemi",
|
||
"smtpEncryptionNone": "Yok (düz metin)",
|
||
"smtpEncryptionStartTLS": "STARTTLS",
|
||
"smtpEncryptionTLS": "TLS (örtük)",
|
||
"smtpStageConnect": "Bağlantı",
|
||
"smtpStageAuth": "Kimlik Doğrulama",
|
||
"smtpStageSend": "Gönderim",
|
||
"smtpTestSuccess": "Test e-postası başarıyla gönderildi",
|
||
"smtpHostNotConfigured": "SMTP sunucusu yapılandırılmamış",
|
||
"smtpNoRecipients": "Yapılandırılmış alıcı yok",
|
||
"smtpFromNotConfigured": "SMTP gönderen adresi yapılandırılmamış",
|
||
"eventLoginAttempt": "Oturum açma denemesi",
|
||
"telegramTokenConfigured": "Yapılandırıldı; mevcut belirteci korumak için boş bırakın.",
|
||
"telegramTokenPlaceholder": "Yapılandırıldı - değiştirmek için yeni bir belirteç girin",
|
||
"smtpPasswordConfigured": "Yapılandırıldı; mevcut parolayı korumak için boş bırakın.",
|
||
"smtpPasswordPlaceholder": "Yapılandırıldı - değiştirmek için yeni bir parola girin",
|
||
"smtpNotInitialized": "SMTP başlatılmadı",
|
||
"tgBotNotEnabled": "Telegram botu etkin değil",
|
||
"tgTestFailed": "Telegram testi başarısız oldu",
|
||
"tgTestSuccess": "Test mesajı Telegram'a gönderildi",
|
||
"tgBotNotRunning": "Telegram botu çalışmıyor",
|
||
"smtpErrorAuth": "Kimlik doğrulama başarısız — kullanıcı adını ve parolayı kontrol edin",
|
||
"smtpErrorStarttls": "Sunucu STARTTLS gerektiriyor — şifreleme türünü değiştirin",
|
||
"smtpErrorTls": "Sunucu TLS gerektiriyor — şifreleme türünü değiştirin",
|
||
"smtpErrorRefused": "Bağlantı reddedildi — sunucuyu ve bağlantı noktasını kontrol edin",
|
||
"smtpErrorTimeout": "Bağlantı zaman aşımına uğradı — sunucuya ulaşılamıyor",
|
||
"smtpErrorRelay": "Sunucu bu adresten gönderimi reddediyor",
|
||
"smtpErrorEof": "Bağlantı sunucu tarafından kapatıldı",
|
||
"smtpErrorUnknown": "SMTP hatası: {{ .Error }}",
|
||
"eventMemoryHigh": "Bellek kullanımı yüksek (%)",
|
||
"remarkTemplate": "Açıklama Şablonu",
|
||
"remarkTemplateDesc": "Ayarlandığında, her abonelik bağlantısının açıklama modelinin yerini alır — değişken belirteçleriyle kendi formatınızı yazın (eklemek için düğmeyi kullanın). Yukarıdaki modeli kullanmak için boş bırakın.",
|
||
"validation": {
|
||
"pathLeadingSlash": "Yol / ile başlamalıdır"
|
||
},
|
||
"secretClear": "Temizle",
|
||
"secretClearUndo": "Temizlemeyi geri al"
|
||
},
|
||
"xray": {
|
||
"title": "Xray Yapılandırmaları",
|
||
"save": "Kaydet",
|
||
"restart": "Xray'i Yeniden Başlat",
|
||
"restartSuccess": "Xray başarıyla yeniden başlatıldı.",
|
||
"restartOutputTitle": "Xray yeniden başlatma çıktısı",
|
||
"restartConfirmTitle": "Xray'i Yeniden Başlat?",
|
||
"restartConfirmContent": "Xray hizmeti kaydedilmiş yapılandırma ile yeniden yüklenir.",
|
||
"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, istenen belirli ülkelere göre trafiği engelleyecektir.",
|
||
"directConnectionsConfigsDesc": "Doğrudan bağlantı, belirli bir trafiğin başka bir sunucu üzerinden yönlendirilmeden doğrudan hedefe gitmesini 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.",
|
||
"FreedomHappyEyeballs": "Freedom Happy Eyeballs (IPv4/IPv6)",
|
||
"FreedomHappyEyeballsDesc": "Doğrudan (freedom) çıkış için çift yığınlı (dual-stack) arama — hem IPv4 hem de IPv6 desteği olan çıkış sunucularında kullanışlıdır.",
|
||
"FreedomHappyEyeballsTryDelayDesc": "Diğer adres ailesini denemeden önceki milisaniye. 150–250 ms iyi bir başlangıç noktasıdır.",
|
||
"RoutingStrategy": "Genel Yönlendirme Stratejisi",
|
||
"RoutingStrategyDesc": "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın.",
|
||
"outboundTestUrl": "Giden Bağlantı Test URL'si",
|
||
"outboundTestUrlDesc": "Giden bağlantı bağlantı testinde kullanılan URL.",
|
||
"importRules": "Kuralları İçe Aktar",
|
||
"exportRules": "Kuralları Dışa Aktar",
|
||
"importOutbounds": "Giden Bağlantıları İçe Aktar",
|
||
"exportOutbounds": "Giden Bağlantıları Dışa Aktar",
|
||
"importInvalidJson": "Geçersiz JSON — bir dizi veya eşleşen anahtara sahip bir nesne bekleniyordu.",
|
||
"metricsListen": "Metrik Uç Noktası",
|
||
"metricsListenDesc": "Xray'in Prometheus tarzı metriklerini bu adres:port üzerinde sunar (ör. 127.0.0.1:11111). Devre dışı bırakmak için boş bırakın. localhost'a bağlayın ve ters proxy ile sunun — kimlik doğrulaması yoktur.",
|
||
"metricsTag": "Metrik Etiketi",
|
||
"Torrent": "BitTorrent Protokolünü Engelle",
|
||
"Inbounds": "Gelen Bağlantılar",
|
||
"InboundsDesc": "Belirtilen istemcileri (clients) kabul eder.",
|
||
"Outbounds": "Giden Bağlantılar",
|
||
"OutboundSubscriptions": "Giden Bağlantı Abonelikleri",
|
||
"OutboundSubscriptionsDesc": "Uzak abonelik URL'lerinden (vmess/vless/trojan/ss/...) giden bağlantılarnı içe aktarın. Etiketler dengeleyicilerde ve yönlendirme kurallarında kullanılabilmek için sabit tutulur. Güncellemeler otomatiktir.",
|
||
"Balancers": "Dengeleyiciler",
|
||
"balancerTagRequired": "Etiket zorunludur",
|
||
"balancerSelectorRequired": "En az bir giden bağlantı seçin",
|
||
"balancerLive": "Anlık Hedef",
|
||
"balancerOverride": "Hedef Zorla",
|
||
"balancerOverridePh": "Otomatik (strateji)",
|
||
"balancerLiveRefresh": "Dengeleyici durumunu yenile",
|
||
"balancerNotRunning": "Bu dengeleyici çalışan Xray'de etkin değil — değişikliklerinizi kaydedin veya önce Xray'i başlatın",
|
||
"routeTester": "Rota Testi",
|
||
"routeTesterDesc": "Çalışan Xray'e hangi giden bağlantının bir isteği işleyeceğini sorun. Gerçek trafik gönderilmez — karar doğrudan canlı yönlendirme motorundan gelir.",
|
||
"routeTesterDest": "Alan adı veya IP",
|
||
"routeTesterPort": "Port",
|
||
"routeTesterInbound": "Gelen",
|
||
"routeTesterProtocol": "Algılanan protokol",
|
||
"routeTesterTest": "Rotayı Test Et",
|
||
"routeTesterMatchedOutbound": "Eşleşen giden",
|
||
"routeTesterViaBalancer": "dengeleyici aracılığıyla",
|
||
"routeTesterDefaultOutbound": "Hiçbir yönlendirme kuralı eşleşmedi — trafik varsayılan (ilk) giden bağlantıya yönlendirilir.",
|
||
"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 kayıt seviyesi; hangi detayda bilginin kaydedileceğini belirler.",
|
||
"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ştirir.",
|
||
"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.",
|
||
"connectionLimits": "Bağlantı Sınırları",
|
||
"connectionLimitsDesc": "Kullanıcı seviyesi 0 için bağlantı düzeyi politikaları. Xray'in varsayılanını kullanmak için alanı boş bırakın.",
|
||
"connIdle": "Boşta Kalma Zaman Aşımı",
|
||
"connIdleDesc": "Bağlantı bu kadar saniye boşta kaldıktan sonra kapatılır. Değerin düşürülmesi, yoğun sunucularda belleği ve dosya tanımlayıcılarını daha hızlı serbest bırakır (Xray varsayılanı: 300).",
|
||
"bufferSize": "Arabellek Boyutu",
|
||
"bufferSizeDesc": "Bağlantı başına dahili arabellek boyutu (KB). Düşük RAM'li sunucularda bellek kullanımını en aza indirmek için 0 olarak ayarlayın (Xray varsayılanı platforma bağlıdır).",
|
||
"bufferSizePlaceholder": "otomatik",
|
||
"seconds": "saniye",
|
||
"rules": {
|
||
"first": "İlk",
|
||
"last": "Son",
|
||
"up": "Yukarı",
|
||
"down": "Aşağı",
|
||
"source": "Kaynak",
|
||
"dest": "Hedef",
|
||
"inbound": "Gelen Bağlantı",
|
||
"outbound": "Giden Bağlantı",
|
||
"balancer": "Dengeleyici",
|
||
"info": "Bilgi",
|
||
"add": "Kural Ekle",
|
||
"edit": "Kuralı Düzenle",
|
||
"useComma": "Virgülle ayrılmış öğeler"
|
||
},
|
||
"routing": {
|
||
"dragToReorder": "Yeniden sıralamak için sürükleyin"
|
||
},
|
||
"ruleForm": {
|
||
"sourceIps": "Kaynak IP'ler",
|
||
"sourcePort": "Kaynak Port",
|
||
"vlessRoute": "VLESS Rotası",
|
||
"attributes": "Öznitelikler",
|
||
"value": "Değer",
|
||
"user": "Kullanıcı",
|
||
"inboundTags": "Gelen Bağlantı Etiketleri",
|
||
"outboundTag": "Giden Bağlantı Etiketi",
|
||
"balancerTag": "Dengeleyici Etiketi",
|
||
"balancerTagTooltip": "Trafiği yapılandırılmış yük dengeleyicilerden biri üzerinden yönlendirir"
|
||
},
|
||
"outboundForm": {
|
||
"tagDuplicate": "Etiket başka bir giden bağlantı tarafından kullanılıyor",
|
||
"tagRequired": "Etiket zorunludur",
|
||
"tagPlaceholder": "benzersiz-etiket",
|
||
"localIpPlaceholder": "yerel IP",
|
||
"dialerProxyPlaceholder": "Zincirlemek için bir giden bağlantı seçin",
|
||
"dialerProxyHint": "Bir proxy zinciri oluşturmak için bu giden bağlantıyı başka bir giden bağlantı (etikete göre) üzerinden bağlayın. Doğrudan bağlanmak için boş bırakın.",
|
||
"targetStrategyHint": "Bağlanmadan önce hedef alan adının nasıl çözümleneceği: AsIs (varsayılan) olduğu gibi gönderir, UseIP… çözümler ve başarısızsa geri döner, ForceIP… çözümleme zorunludur.",
|
||
"addressRequired": "Adres zorunludur",
|
||
"portRequired": "Port zorunludur",
|
||
"optional": "opsiyonel",
|
||
"udpOverTcp": "UDP over TCP",
|
||
"uotVersion": "UoT Sürümü",
|
||
"inboundTag": "Gelen Bağlantı Etiketi",
|
||
"inboundTagPlaceholder": "yönlendirme kurallarında kullanılan gelen bağlantı etiketi",
|
||
"responseType": "Yanıt Tipi",
|
||
"rewriteNetwork": "Ağı Yeniden Yaz",
|
||
"unchanged": "(değişmedi)",
|
||
"unchangedAddress": "(değişmedi) örn. 1.1.1.1",
|
||
"rules": "Kurallar",
|
||
"ruleN": "Kural {n}",
|
||
"action": "Eylem",
|
||
"redirect": "Redirect",
|
||
"fragment": "Fragment",
|
||
"finalRules": "Nihai Kurallar",
|
||
"overrideXrayPrivateIp": "Xray'in varsayılan özel IP bloğunu geçersiz kıl",
|
||
"blockDelay": "Engelleme Gecikmesi (ms)",
|
||
"reverseSniffing": "Ters Sniffing",
|
||
"reserved": "Ayrılmış",
|
||
"minUploadInterval": "Min. Yükleme Aralığı (ms)",
|
||
"maxUploadSizeBytes": "Maks. Yükleme Boyutu (bayt)",
|
||
"uplinkChunkSize": "Uplink Chunk Boyutu",
|
||
"noGrpcHeader": "gRPC Başlığı Yok",
|
||
"maxConcurrency": "Maks. Eşzamanlılık",
|
||
"maxConnections": "Maks. Bağlantı",
|
||
"maxReuseTimes": "Maks. Yeniden Kullanım",
|
||
"maxRequestTimes": "Maks. İstek Sayısı",
|
||
"maxReusableSecs": "Maks. Yeniden Kullanılabilir Saniye",
|
||
"keepAlivePeriod": "Keep Alive Periyodu",
|
||
"authPassword": "Auth Parolası",
|
||
"visionTestpre": "Vision Testpre",
|
||
"serverNamePlaceholder": "sunucu adı",
|
||
"verifyPeerName": "Peer Adını Doğrula",
|
||
"pinnedSha256": "Pinned SHA256",
|
||
"shortId": "Short ID",
|
||
"sockopts": "Sockopts",
|
||
"keepAliveInterval": "Keep Alive Aralığı",
|
||
"markFwmark": "Mark (fwmark)",
|
||
"interface": "Arabirim",
|
||
"ipv6Only": "Yalnızca IPv6",
|
||
"acceptProxyProtocol": "Proxy Protocol Kabul Et",
|
||
"proxyProtocol": "Proxy Protocol",
|
||
"tcpUserTimeoutMs": "TCP User Timeout (ms)",
|
||
"tcpKeepAliveIdleS": "TCP keep-alive idle (s)"
|
||
},
|
||
"outbound": {
|
||
"addOutbound": "Giden Bağlantı Ekle",
|
||
"addReverse": "Ters Ekle",
|
||
"editOutbound": "Giden Bağlantını Düzenle",
|
||
"editReverse": "Tersi Düzenle",
|
||
"reverseTag": "Ters Etiket",
|
||
"reverseTagDesc": "VLESS basit ters proxy giden bağlantı etiketi. Devre dışı bırakmak için boş bırakın.",
|
||
"reverseTagPlaceholder": "çıkış etiketi (boş = devre dışı)",
|
||
"tag": "Etiket",
|
||
"tagDesc": "Benzersiz Etiket",
|
||
"address": "Adres",
|
||
"egress": "Egress",
|
||
"egressHint": "Run an HTTP test to show egress IP and country.",
|
||
"reverse": "Ters",
|
||
"domain": "Alan Adı",
|
||
"type": "Tür",
|
||
"bridge": "Bridge",
|
||
"portal": "Portal",
|
||
"link": "Bağlantı",
|
||
"intercon": "Bağlantı",
|
||
"settings": "Ayarlar",
|
||
"accountInfo": "Hesap Bilgileri",
|
||
"outboundStatus": "Giden Bağlantı Durumu",
|
||
"sendThrough": "Üzerinden Gönder",
|
||
"targetStrategy": "Hedef Stratejisi",
|
||
"test": "Test",
|
||
"testResult": "Test Sonucu",
|
||
"testing": "Bağlantı test ediliyor...",
|
||
"testSuccess": "Test başarılı",
|
||
"testFailed": "Test başarısız",
|
||
"testError": "Giden bağlantı test edilemedi",
|
||
"modeRealDelay": "Gerçek gecikme",
|
||
"testModeTooltip": "TCP: hızlı sadece arama (dial-only) testi. HTTP: Xray üzerinden tam istek. Gerçek gecikme: bağlantı kurulumu dahil toplam süre.",
|
||
"testAll": "Tümünü Test Et",
|
||
"httpStatus": "HTTP durumu",
|
||
"breakdownConnect": "Proxy bağlantısı",
|
||
"breakdownTls": "Giden üzerinden TLS",
|
||
"breakdownTtfb": "İlk bayt",
|
||
"nordvpn": "NordVPN",
|
||
"accessToken": "Erişim Jetonu",
|
||
"country": "Ülke",
|
||
"server": "Sunucu",
|
||
"city": "Şehir",
|
||
"allCities": "Tüm Şehirler",
|
||
"privateKey": "Özel Anahtar",
|
||
"load": "Yükle",
|
||
"moveToTop": "En üste taşı"
|
||
},
|
||
"outboundSub": {
|
||
"manage": "Abonelikler",
|
||
"title": "Giden Bağlantı Abonelikleri",
|
||
"remark": "Açıklama (isteğe bağlı)",
|
||
"remarkPlaceholder": "örn. HK düğümleri",
|
||
"url": "Abonelik URL'si",
|
||
"urlPlaceholder": "https://... (bağlantıların base64 listesi)",
|
||
"tagPrefix": "Etiket öneki",
|
||
"tagPrefixPlaceholder": "hk-",
|
||
"interval": "Güncelleme aralığı",
|
||
"hours": "sa",
|
||
"minutes": "dk",
|
||
"intervalHint": "Varsayılan 10 dakika. Arka plan görevi sık sık kontrol eder; her abonelik yalnızca kendi güncelleme süresi dolduğunda yeniden getirilir.",
|
||
"enabled": "Etkin",
|
||
"allowPrivate": "Özel ağ adreslerine izin ver",
|
||
"allowPrivateHint": "Bu aboneliğin URL'si için localhost / LAN / özel IP adreslerine izin verir. Güvenlik nedeniyle varsayılan olarak kapalıdır — yalnızca güvenilen bir yerel kaynak için etkinleştirin.",
|
||
"prepend": "Manuel giden bağlantılarndan önce",
|
||
"prependHint": "Bu aboneliğin giden bağlantılarnı manuel olanlarınızın öncesine ekler, böylece birisi varsayılan giden bağlantı olabilir.",
|
||
"preview": "Önizleme",
|
||
"previewEmpty": "Bu URL'de hiçbir giden bağlantı bulunamadı.",
|
||
"refreshAll": "Tümünü yenile",
|
||
"statusOk": "Tamam",
|
||
"toastUpdated": "Abonelik güncellendi",
|
||
"addButton": "Ekle",
|
||
"active": "Aktif abonelikler",
|
||
"empty": "Henüz hiç abonelik yok. Yukarıdan bir tane ekleyin.",
|
||
"colRemark": "Açıklama",
|
||
"colPrefix": "Önek",
|
||
"colInterval": "Aralık",
|
||
"colLastFetch": "Son getirme",
|
||
"colEnabled": "Etkin",
|
||
"auto": "otomatik",
|
||
"never": "asla",
|
||
"yes": "Evet",
|
||
"no": "Hayır",
|
||
"refreshNow": "Şimdi yenile",
|
||
"lastError": "Son hata",
|
||
"deleteConfirm": "Bu aboneliği silmek istiyor musunuz?",
|
||
"restartHint": "Ekledikten veya yeniledikten sonra giden bağlantılarnı aktif hale getirmek için Xray'i yeniden başlatın (veya bir sonraki otomatik yeniden yüklemeyi bekleyin).",
|
||
"fromSubsTitle": "Giden bağlantı aboneliklerinden (salt okunur)",
|
||
"fromSubsDesc": "Aktif aboneliklerinizden içe aktarıldı. Bunları yukarıdaki Abonelikler panelinden yönetin.",
|
||
"toastLoadFailed": "Abonelikler yüklenemedi",
|
||
"toastUrlRequired": "Abonelik URL'si gereklidir",
|
||
"toastAdded": "Abonelik eklendi",
|
||
"toastAddFailed": "Abonelik eklenemedi",
|
||
"toastRefreshed": "Yenilendi",
|
||
"toastRefreshFailed": "Yenileme başarısız",
|
||
"toastDeleted": "Silindi",
|
||
"toastDeleteFailed": "Silme işlemi başarısız"
|
||
},
|
||
"tabBalancerSettings": "Dengeleyici Ayarları",
|
||
"tabObservatory": "Gözlemci",
|
||
"observatory": {
|
||
"title": "Gözlemci",
|
||
"burstTitle": "Burst Gözlemci",
|
||
"autoManaged": "Gözlemciler dengeleyicilerinize göre otomatik yönetilir. Nasıl sınama yapacaklarını aşağıdan ayarlayın; izlenen çıkışlar dengeleyici seçicilerini izler.",
|
||
"emptyHint": "Etkin bir bağlantı gözlemcisi yok. Least Ping veya Least Load dengeleyici — ya da fallback içeren Random / Round-robin dengeleyici — oluşturduğunuzda otomatik olarak bir tane eklenir; böylece gözlemci kullanan dengeleyiciler hedef seçmeden önce çıkış sağlığını kontrol edebilir.",
|
||
"mixedLegacy": "Bu yapılandırmada hem Observatory hem de Burst Observatory var. Xray tek bir global gözlemci kullanır, bu nedenle bu eski karma durum desteklenmez; dengeleyiciler kaydedildiğinde tek bir gözlemciye normalleştirilir.",
|
||
"subjectSelector": "İzlenen Çıkışlar",
|
||
"subjectSelectorDesc": "Bu gözlemcinin sınadığı çıkış etiketleri. Dengeleyicilerinize göre otomatik yönetilir.",
|
||
"probeURL": "Sınama URL'si",
|
||
"probeURLDesc": "Her çıkışı ölçmek için istenen URL. HTTP 204 döndürmelidir.",
|
||
"probeInterval": "Sınama Aralığı",
|
||
"probeIntervalDesc": "Her çıkışın ne sıklıkta sınanacağı, örn. 30s, 1m, 2h45m.",
|
||
"enableConcurrency": "Eşzamanlı Sınama",
|
||
"enableConcurrencyDesc": "İzlenen tüm çıkışları tek tek yerine aynı anda sına. Daha hızlı ama ağda daha görünür.",
|
||
"destination": "Sınama Hedefi",
|
||
"destinationDesc": "Her çıkışı ölçmek için istenen URL. HTTP 204 döndürmelidir.",
|
||
"connectivity": "Bağlantı Denetimi",
|
||
"connectivityDesc": "İsteğe bağlı yerel ağ denetim URL'si; yalnızca hedef başarısız olduktan sonra denenir. Atlamak için boş bırakın.",
|
||
"interval": "Sınama Aralığı",
|
||
"intervalDesc": "Çıkış başına sınamalar arasındaki ortalama süre, örn. 1m. En az 10s.",
|
||
"timeout": "Sınama Zaman Aşımı",
|
||
"timeoutDesc": "Bir sınamanın başarısız sayılmadan önce ne kadar bekleneceği, örn. 5s.",
|
||
"sampling": "Örnekleme Sayısı",
|
||
"samplingDesc": "Her çıkışı puanlamak için tutulan son sınama sonucu sayısı.",
|
||
"httpMethod": "HTTP Yöntemi",
|
||
"httpMethodDesc": "Sınamalar için kullanılan HTTP yöntemi.",
|
||
"deleteAlsoObservatory": "Bu, Observatory kullanan son dengeleyici, bu yüzden o da kaldırılacak.",
|
||
"deleteAlsoBurst": "Bu, Burst Observatory kullanan son dengeleyici, bu yüzden o da kaldırılacak."
|
||
},
|
||
"refCleanup": {
|
||
"header": "Bunu silmek yönlendirmenizi de günceller:",
|
||
"ruleRemoved": "Kural {label} — kaldırıldı (hedef kalmadı)",
|
||
"ruleModified": "Kural {label} — korundu (artık {keeps} kullanıyor)",
|
||
"balancerRemoved": "Dengeleyici {tag} — kaldırıldı (hedef kalmadı)"
|
||
},
|
||
"balancer": {
|
||
"addBalancer": "Dengeleyici Ekle",
|
||
"editBalancer": "Dengeleyiciyi Düzenle",
|
||
"balancerStrategy": "Strateji",
|
||
"balancerSelectors": "Seçiciler",
|
||
"tag": "Etiket",
|
||
"tagDesc": "Benzersiz Etiket",
|
||
"tagDuplicate": "Etiket başka bir dengeleyici tarafından kullanılıyor",
|
||
"tagPlaceholder": "benzersiz dengeleyici etiketi",
|
||
"selector": "Seçici",
|
||
"fallback": "Fallback",
|
||
"cycleTooltip": "Döngü: {path} → ({start} adresine geri dön)",
|
||
"expected": "Beklenen",
|
||
"expectedPlaceholder": "optimal düğüm sayısı",
|
||
"maxRtt": "Maks. RTT",
|
||
"tolerance": "Tolerans",
|
||
"baselines": "Baselines",
|
||
"costs": "Costs",
|
||
"balancerDesc": "Dengeleyici Etiketi (balancerTag) ve Giden Bağlantı Etiketi (outboundTag) aynı anda kullanılamaz. Aynı anda kullanıldığında yalnızca giden bağlantı etiketi geçerli olur.",
|
||
"costMatch": "Etiket deseni",
|
||
"costValue": "Ağırlık",
|
||
"costRegexp": "Düzenli ifade eşleşmesi",
|
||
"balancerDeleteInUse": "Bu dengeleyici silinemez — şu dengeleyicilerin yedeği olarak kullanılmaktadır: {names}",
|
||
"balancerFallbackCycle": "Bu dengeleyiciyi yedek olarak ayarlayamazsınız — döngüsel bağımlılık oluşturur.",
|
||
"balancerFallbackInfo": "Trafik şu yoldan yönlendirilecektir: Dengeleyici → Loopback → Sunucu → Hedef dengeleyici → Bağlantı çıkışı. Bu, sunucu üzerinden ek bir atlama ekler ve hafif gecikmelere neden olabilir.",
|
||
"fallbackBalancerHint": "Yedek olarak başka bir dengeleyici seçin",
|
||
"reservedPrefix": " _bl_ ön eki dahili dengeleyici loopback nesneleri için ayrılmıştı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'dır.",
|
||
"mtuDesc": "Maksimum İletim Birimi. Veri paketlerinin maksimum boyutu. Varsayılan değer 1500'dür.",
|
||
"userLevel": "Kullanıcı Seviyesi",
|
||
"userLevelDesc": "Bu gelen bağlantı üzerinden yapılan tüm bağlantılar bu kullanıcı seviyesini kullanacaktır. Varsayılan değer 0'dır."
|
||
},
|
||
"nord": {
|
||
"accessToken": "Access Token",
|
||
"privateKey": "Özel Anahtar",
|
||
"noServers": "Seçilen ülke için sunucu bulunamadı.",
|
||
"noPublicKey": "Seçilen sunucu NordLynx genel anahtarı yayınlamıyor.",
|
||
"outboundAdded": "NordVPN giden bağlantı eklendi.",
|
||
"outboundUpdated": "NordVPN giden bağlantı güncellendi."
|
||
},
|
||
"warp": {
|
||
"changeIp": "IP Değiştir",
|
||
"changeIpSuccess": "WARP IP adresi başarıyla değiştirildi!",
|
||
"autoUpdateIp": "IP Adresini Otomatik Güncelle",
|
||
"intervalDays": "Aralık (Gün)",
|
||
"intervalDesc": "Devre dışı bırakmak için 0. IP adresini otomatik olarak değiştirir.",
|
||
"licenseError": "WARP lisansı ayarlanamadı.",
|
||
"fetchFirst": "Önce WARP yapılandırmasını alın.",
|
||
"createAccount": "WARP Hesabı Oluştur",
|
||
"accessToken": "Access Token",
|
||
"deviceId": "Cihaz ID",
|
||
"licenseKey": "Lisans Anahtarı",
|
||
"privateKey": "Özel Anahtar",
|
||
"deleteAccount": "Hesabı Sil",
|
||
"settings": "Ayarlar",
|
||
"licenseKeyLabel": "WARP / WARP+ Lisans Anahtarı",
|
||
"key": "Anahtar",
|
||
"keyPlaceholder": "26 karakterli WARP+ anahtarı",
|
||
"accountInfo": "Hesap Bilgisi",
|
||
"deviceName": "Cihaz Adı",
|
||
"deviceModel": "Cihaz Modeli",
|
||
"deviceEnabled": "Cihaz Etkin",
|
||
"accountType": "Hesap Tipi",
|
||
"role": "Rol",
|
||
"warpPlusData": "WARP+ Veri",
|
||
"quota": "Kota",
|
||
"usage": "Kullanım",
|
||
"addOutbound": "Giden Bağlantı Ekle"
|
||
},
|
||
"dns": {
|
||
"enable": "DNS'yi Etkinleştir",
|
||
"enableDesc": "Dahili DNS sunucusunu etkinleştirir.",
|
||
"tag": "DNS Gelen Bağlantı Etiketi",
|
||
"tagDesc": "Bu etiket, yönlendirme kurallarında gelen bağlantı 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": "Alan adı listesi eşleştiğinde 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ştirir.",
|
||
"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": "İşletim sisteminin hosts dosyasını kullanır.",
|
||
"serveStale": "Süresi Dolmuş Sonuçları Sun",
|
||
"serveStaleDesc": "Arka planda yenilenirken süresi dolmuş önbellek sonuçlarını döndürü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 işlem tüm DNS sunucularını listeden kaldırır. Geri alınamaz.",
|
||
"dnsLeakWarning": "DNS; localhost, düz UDP/TCP, yerel mod DoH/DoQ, fallback sorguları veya EDNS client IP üzerinden sızabilir. Gizlilik önemliyse yönlendirilmiş DoH, hosts sabitlemeleri ve kapalı fallback kullanın."
|
||
},
|
||
"fakedns": {
|
||
"add": "Sahte DNS Ekle",
|
||
"edit": "Sahte DNS'i Düzenle",
|
||
"ipPool": "IP Havuzu Alt Ağı",
|
||
"poolSize": "Havuz Boyutu"
|
||
},
|
||
"defaultOutbound": "Varsayılan giden",
|
||
"defaultOutboundDesc": "Yönlendirme kuralıyla eşleşmeyen trafik bu gideni kullanır (listedeki ilk giden)."
|
||
},
|
||
"hosts": {
|
||
"addHost": "Host Ekle",
|
||
"editHost": "Host'u Düzenle",
|
||
"selectInbound": "Bir gelen bağlantı seçin",
|
||
"selectedCount": "{count} seçildi",
|
||
"summary": {
|
||
"total": "Toplam",
|
||
"enabled": "Etkin",
|
||
"disabled": "Devre Dışı"
|
||
},
|
||
"moveUp": "Yukarı Taşı",
|
||
"moveDown": "Aşağı Taşı",
|
||
"bulkEnable": "Etkinleştir",
|
||
"bulkDisable": "Devre Dışı Bırak",
|
||
"bulkDelete": "Sil",
|
||
"bulkDeleteConfirm": "Seçili {count} host silinsin mi?",
|
||
"deleteConfirmTitle": "\"{name}\" host'u silinsin mi?",
|
||
"sections": {
|
||
"basic": "Temel",
|
||
"security": "Güvenlik",
|
||
"advanced": "Gelişmiş",
|
||
"general": "Genel",
|
||
"clash": "Clash (mihomo)"
|
||
},
|
||
"fields": {
|
||
"remark": "Açıklama",
|
||
"serverDescription": "Tanım",
|
||
"inbound": "Gelen Bağlantılar",
|
||
"address": "Adres",
|
||
"port": "Port",
|
||
"endpoint": "Uç Nokta",
|
||
"enable": "Etkin",
|
||
"actions": "İşlemler",
|
||
"security": "Güvenlik",
|
||
"sni": "SNI",
|
||
"overrideSniFromAddress": "Adresi SNI olarak kullan",
|
||
"keepSniBlank": "SNI'yi boş bırak",
|
||
"hostHeader": "Host başlığı",
|
||
"path": "Yol",
|
||
"alpn": "ALPN",
|
||
"fingerprint": "Fingerprint",
|
||
"pins": "Sabitlenmiş sertifika SHA-256",
|
||
"allowInsecure": "Güvensize izin ver",
|
||
"echConfigList": "ECH yapılandırma listesi",
|
||
"muxParams": "Mux",
|
||
"sockoptParams": "Sockopt",
|
||
"finalMask": "Final Mask",
|
||
"vlessRoute": "VLESS yönlendirme",
|
||
"mihomoIpVersion": "IP sürümü",
|
||
"mihomoX25519": "Mihomo X25519",
|
||
"shuffleHost": "Host'u karıştır",
|
||
"tags": "Etiketler",
|
||
"nodeGuids": "Düğümler",
|
||
"excludeFromSubTypes": "Formatlardan hariç tut",
|
||
"verifyPeerCertByName": "Peer sertifikasını ada göre doğrula",
|
||
"inheritAddress": "Adresi devralır"
|
||
},
|
||
"hints": {
|
||
"address": "Gelen bağlantının kendi adresini devralmak için boş bırakın.",
|
||
"port": "0 değeri gelen bağlantının portunu devralır.",
|
||
"tags": "Son kullanıcılara görünmez; yalnızca RAW abonelikle gönderilir. Yalnızca büyük harf, rakam, _ ve : kullanılabilir.",
|
||
"nodeGuids": "Bu host'tan çözümlenen düğümleri seçin. Yalnızca görsel atama.",
|
||
"serverDescription": "Açıklamanın altında gösterilen isteğe bağlı not.",
|
||
"allowInsecure": "TLS sertifika doğrulamasını atla (allowInsecure / skip-cert-verify).",
|
||
"vlessRoute": "UUID'ye gömülen tek bir VLESS rota değeri (0-65535), örn. 443. Hiçbiri için boş bırakın.",
|
||
"remark": "Bu host için düz bir etiket. Yalnızca gelen bağlantının kendi açıklaması yoksa yapılandırma adı olarak gösterilir."
|
||
},
|
||
"remarkVars": {
|
||
"title": "Şablon Değişkenleri",
|
||
"intro": "Eklemek için bir değişkene tıklayın. Abonelik oluşturulduğunda her kullanıcı için değiştirilir.",
|
||
"preview": "Önizleme",
|
||
"groups": {
|
||
"client": "Kullanıcı",
|
||
"traffic": "Trafik",
|
||
"time": "Zaman ve durum",
|
||
"connection": "Bağlantı"
|
||
},
|
||
"descEMAIL": "Kullanıcı e-postası",
|
||
"descINBOUND": "Gelen bağlantının kendi açıklaması (yapılandırma adı)",
|
||
"descHOST": "Host açıklaması",
|
||
"descID": "Kullanıcı UUID'si",
|
||
"descSHORT_ID": "UUID'nin ilk 8 karakteri",
|
||
"descTELEGRAM_ID": "Kullanıcının Telegram ID'si (ayarlı değilse boş)",
|
||
"descSUB_ID": "Abonelik kimliği",
|
||
"descCOMMENT": "Kullanıcı yorumu",
|
||
"descTRAFFIC_USED": "Kullanılan trafik (okunabilir biçim)",
|
||
"descTRAFFIC_LEFT": "Kalan trafik (sınırsızsa gizlenir)",
|
||
"descTRAFFIC_TOTAL": "Toplam trafik (sınırsızsa gizlenir)",
|
||
"descTRAFFIC_USED_BYTES": "Kullanılan trafik (byte)",
|
||
"descTRAFFIC_LEFT_BYTES": "Kalan trafik (byte)",
|
||
"descTRAFFIC_TOTAL_BYTES": "Toplam trafik (byte)",
|
||
"descUP": "Yükleme trafiği",
|
||
"descDOWN": "İndirme trafiği",
|
||
"descSTATUS": "aktif / süresi dolmuş / devre dışı / tükenmiş",
|
||
"descSTATUS_EMOJI": "Emoji olarak durum (✅ ⏳ 🚫)",
|
||
"descDAYS_LEFT": "Süre dolana kadar kalan gün (sınırsızsa gizlenir)",
|
||
"descTIME_LEFT": "Kalan süre (örn. 12d 4h 30m)",
|
||
"descUSAGE_PERCENTAGE": "Kullanılan trafik yüzde olarak (sınırsızsa gizlenir)",
|
||
"descEXPIRE_DATE": "Son kullanma tarihi (YYYY-AA-GG)",
|
||
"descJALALI_EXPIRE_DATE": "Celali takvimine göre son kullanma tarihi (YYYY/MM/DD)",
|
||
"descEXPIRE_UNIX": "Son kullanma Unix zaman damgası olarak (saniye)",
|
||
"descCREATED_UNIX": "Oluşturulma zamanı Unix zaman damgası olarak (saniye)",
|
||
"descRESET_DAYS": "Trafik sıfırlama periyodu (gün)",
|
||
"descPROTOCOL": "Gelen bağlantı protokolü (VLESS, VMess, Trojan, …)",
|
||
"descTRANSPORT": "Taşıma ağı (tcp, ws, grpc, …)",
|
||
"descSECURITY": "Taşıma güvenliği (TLS, REALITY, NONE)"
|
||
},
|
||
"toasts": {
|
||
"list": "Host'lar yüklenemedi",
|
||
"obtain": "Host yüklenemedi",
|
||
"add": "Host ekle",
|
||
"update": "Host'u güncelle",
|
||
"delete": "Host'u sil",
|
||
"badTag": "Geçersiz etiket",
|
||
"badVlessRoute": "0 ile 65535 arasında tek bir sayı girin"
|
||
}
|
||
}
|
||
},
|
||
"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": "Dakikalar",
|
||
"unknown": "Bilinmeyen",
|
||
"inbounds": "Gelen Bağlantılar",
|
||
"clients": "Kullanıcılar",
|
||
"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 kullanıcının istatistiklerini aramak için:\r\n<code>/usage [E-posta]</code>\r\n\r\nGelen bağlantılarnı aramak için (kullanıcı istatistikleri ile):\r\n<code>/inbound [Açıklama]</code>\r\n\r\nTelegram Sohbet Kimliği (Chat ID):\r\n<code>/id</code>",
|
||
"helpClientCommands": "İstatistiklerinizi görmek 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 Kimliğinizi gösterir",
|
||
"usageDesc": "İstemci kullanımını göster: /usage e-posta",
|
||
"inboundDesc": "Gelenleri ara: /inbound ad (yönetici)",
|
||
"restartDesc": "Xray çekirdeğini yeniden başlat (yönetici)",
|
||
"clearallDesc": "Tüm istemcilerin trafiğini sıfırla (yönetici)"
|
||
},
|
||
"messages": {
|
||
"cpuThreshold": "CPU Yükü ({{ .Percent }}%), {{ .Threshold }}% eşiğini 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 ve Saat: {{ .DateTime }}\r\n",
|
||
"hostname": "💻 Host: {{ .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 Bağlantı: {{ .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": "🚨 Limiti Dolanlar ({{ .Type }}):\r\n",
|
||
"exhaustedCount": "🚨 Limiti Dolan {{ .Type }} sayısı:\r\n",
|
||
"onlinesCount": "🌐 Çevrimiçi Kullanıcılar: {{ .Count }}\r\n",
|
||
"disabled": "🛑 Devre Dışı: {{ .Disabled }}\r\n",
|
||
"depleteSoon": "🔜 Kotası Dolmak Üzere: {{ .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 (ID) güncellendi.",
|
||
"received_password": "🔑📥 Şifre güncellendi.",
|
||
"received_email": "📧📥 E-posta güncellendi.",
|
||
"received_comment": "💬📥 Yorum güncellendi.",
|
||
"id_prompt": "🔑 Mevcut Kimlik (ID): {{ .ClientId }}\n\nYeni kimliğinizi (ID) 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": "🔄 Gelen Bağlantı: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Kota: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Açıklama: {{ .ClientComment }}\n\nArtık bu kullanıcıyı gelen bağlantıya ekleyebilirsiniz!",
|
||
"inbound_client_data_pass": "🔄 Gelen Bağlantı: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Kota: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Açıklama: {{ .ClientComment }}\n\nArtık bu kullanıcıyı gelen bağlantıya ekleyebilirsiniz!",
|
||
"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": "Geçersiz değer girdiniz.\nİfadeler arasında boşluk olmamalıdır.\nDoğru örnek: aaaaaa\nYanlış örnek: aaa aaa 🚫",
|
||
"AreYouSure": "Emin misiniz? 🤔",
|
||
"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 kullanıcılar için trafik sıfırlama işlemi tamamlandı.",
|
||
"eventOutboundDown": "{{ .Tag }} giden bağlantısı ÇEVRİMDIŞI",
|
||
"eventOutboundUp": "{{ .Tag }} giden bağlantısı ÇEVRİMİÇİ",
|
||
"eventErrorDetail": "Hata: {{ .Error }}",
|
||
"eventDelayDetail": "Gecikme: {{ .Delay }}ms",
|
||
"eventXrayCrash": "Xray ÇÖKTÜ",
|
||
"eventXrayCrashError": "Hata: {{ .Error }}",
|
||
"eventNodeDown": "{{ .Name }} düğümü ÇEVRİMDIŞI",
|
||
"eventNodeUp": "{{ .Name }} düğümü ÇEVRİMİÇİ",
|
||
"eventCPUHigh": "Yüksek CPU",
|
||
"eventCPUHighDetail": "CPU: {{ .Detail }}",
|
||
"eventLoginFallback": "{{ .Source }} adresinden oturum açma başarısız",
|
||
"memoryThreshold": "Bellek kullanımı {{ .Percent }}% eşiği {{ .Threshold }}% aşıyor"
|
||
},
|
||
"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": "Gelen Bağlantılarnı Al",
|
||
"depleteSoon": "Kotası Dolmak Üzere",
|
||
"clientUsage": "Kullanıcı İstatistikleri",
|
||
"onlines": "Çevrimiçi Kullanıcılar",
|
||
"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 Kullanıcılar",
|
||
"addClient": "Kullanıcı 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": "⚙️🚦 Flow",
|
||
"ResetAllTraffics": "Tüm Trafikleri Sıfırla",
|
||
"SortedTrafficUsageReport": "Sıralı Trafik Kullanım Raporu"
|
||
},
|
||
"answers": {
|
||
"successfulOperation": "✅ İşlem başarılı!",
|
||
"errorOperation": "❗ İşlemde hata.",
|
||
"getInboundsFailed": "❌ Gelen Bağlantılar alınamadı.",
|
||
"getClientsFailed": "❌ Kullanıcılar alınamadı.",
|
||
"canceled": "❌ {{ .Email }}: İşlem iptal edildi.",
|
||
"clientRefreshSuccess": "✅ {{ .Email }}: Kullanıcı başarıyla yenilendi.",
|
||
"IpRefreshSuccess": "✅ {{ .Email }}: IP'ler başarıyla yenilendi.",
|
||
"TGIdRefreshSuccess": "✅ {{ .Email }}: Kullanıcının Telegram Kimliği 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 Telegram Chat ID'nizi yapılandırmanıza eklemesini isteyin.\r\n\r\nSizin Chat ID'niz: <code>{{ .TgUserID }}</code>",
|
||
"chooseClient": "Gelen Bağlantı {{ .Inbound }} için bir Kullanıcı Seçin",
|
||
"chooseInbound": "Bir Gelen Bağlantı Seçin"
|
||
}
|
||
},
|
||
"email": {
|
||
"subjectOutboundDown": "{{ .Tag }} giden bağlantısı ÇEVRİMDIŞI",
|
||
"subjectOutboundUp": "{{ .Tag }} giden bağlantısı ÇEVRİMİÇİ",
|
||
"subjectXrayCrash": "Xray ÇÖKTÜ",
|
||
"subjectCPUHigh": "Yüksek CPU",
|
||
"subjectLoginSuccess": "Oturum açma başarılı",
|
||
"subjectLoginFailed": "Oturum açma başarısız",
|
||
"titleOutboundDown": "Giden Bağlantı ÇEVRİMDIŞI",
|
||
"titleOutboundUp": "Giden Bağlantı ÇEVRİMİÇİ",
|
||
"titleXrayCrash": "Xray ÇÖKTÜ",
|
||
"titleCPUHigh": "Yüksek CPU",
|
||
"titleLoginSuccess": "Oturum açma başarılı",
|
||
"titleLoginFailed": "Oturum açma başarısız",
|
||
"labelStatus": "Durum",
|
||
"labelOutbound": "Giden Bağlantı",
|
||
"labelNode": "Düğüm",
|
||
"labelError": "Hata",
|
||
"labelDelay": "Gecikme",
|
||
"labelDetail": "Ayrıntı",
|
||
"labelUsername": "Kullanıcı Adı",
|
||
"labelIP": "IP",
|
||
"labelReason": "Neden",
|
||
"labelSource": "Kaynak",
|
||
"labelTime": "Zaman",
|
||
"statusCrashed": "ÇÖKTÜ",
|
||
"statusRunning": "Çalışıyor",
|
||
"statusHigh": "YÜKSEK",
|
||
"statusSuccess": "BAŞARILI",
|
||
"statusFailed": "BAŞARISIZ",
|
||
"statusDown": "ÇEVRİMDIŞI",
|
||
"statusUp": "ÇEVRİMİÇİ"
|
||
}
|
||
}
|