mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-05-31 10:14:15 +00:00
* chore(frontend): add react+typescript toolchain alongside vue
Step 0 of the planned vue->react migration. React 19, antd 5, i18next
+ react-i18next, typescript 5, and @vitejs/plugin-react 6 are added as
dev/runtime deps alongside the existing vue stack. Both frameworks
coexist in the build until the last entry flips.
* vite.config.js: react() plugin runs next to vue(); new manualChunks
for vendor-react / vendor-antd-react / vendor-icons-react /
vendor-i18next. Existing vue chunks unchanged.
* eslint.config.js: typescript-eslint + eslint-plugin-react-hooks
rules scoped to *.{ts,tsx}; vue config untouched for *.{js,vue}.
* tsconfig.json: strict, jsx: react-jsx, moduleResolution: bundler,
allowJs: true (lets .tsx files import the remaining .js modules
during incremental migration), @/* path alias.
* env.d.ts: Vite client types + window.X_UI_BASE_PATH typing +
SubPageData shape consumed by the subscription page.
Vite stays pinned at 8.0.13 per the existing project policy. No
existing .vue/.js source files touched in this step.
eslint-plugin-react (not -hooks) is not included because its latest
release does not yet support ESLint 10. react-hooks/purity covers
the safety-critical case; revisit when the plugin updates.
* refactor(frontend): port subpage to react+ts
Step 1 of the planned vue->react migration. The standalone
subscription page (sub/sub.go renders the HTML host; React mounts
into #app) is the first entry off vue.
Introduces two shared pieces both entries (and future ones) will
use:
* src/hooks/useTheme.tsx — React Context + useTheme hook + the
same buildAntdThemeConfig (dark/ultra-dark token overrides) and
pauseAnimationsUntilLeave helper the vue version exposes. Same
localStorage keys (dark-mode, isUltraDarkThemeEnabled) and DOM
side effects (body.className, html[data-theme]) so the two stay
in sync across the coexistence period.
* src/i18n/react.ts — i18next + react-i18next loader that reads
the same web/translation/*.json files via import.meta.glob. The
vue-i18n setup in src/i18n/index.js is untouched and still serves
the remaining vue entries.
SubPage.tsx mirrors the vue version's behavior: reads
window.__SUB_PAGE_DATA__ injected by the Go sub server, renders QR
codes / descriptions / Android+iOS deep-link dropdowns, supports
theme cycle and language switch. Uses AntD v5 idioms: Descriptions
items prop, Dropdown menu prop, Layout.Content.
* refactor(frontend): port login to react+ts
Step 2 of the planned vue->react migration. The login entry is the
first to exercise AntD React's Form API (Form + Form.Item with
name/rules + onFinish) and the existing axios/CSRF interceptors
under React.
* LoginPage.tsx: same form fields, conditional 2FA input,
rotating headline ("Hello" / "Welcome to..."), drifting blob
background, theme cycle + language popover. Headline transition
switches from vue's <Transition mode=out-in> to a CSS keyframe
animation keyed off the visible word.
* entries/login.tsx: setupAxios() + applyDocumentTitle() unchanged
from the vue entry — both are framework-agnostic in src/utils
and src/api/axios-init.js.
useTheme hook, ThemeProvider, and i18n/react.ts loader introduced
in step 1 are now shared across two entries; Vite extracts them as
a small chunk in the build output.
* refactor(frontend): port api-docs to react+ts
Step 3 of the planned vue->react migration. The five api-docs files
(ApiDocsPage, CodeBlock, EndpointRow, EndpointSection, plus the
data-only endpoints.js) all move to react+ts.
Also introduces components/AppSidebar.tsx — api-docs is the first
authenticated page to need it. AppSidebar.vue stays in place for the
six remaining vue entries (settings, inbounds, clients, xray, nodes,
index); each gets switched to AppSidebar.tsx as its entry migrates.
After the last entry flips, AppSidebar.vue is deleted.
Notable transformations:
* The scroll observer that highlights the active TOC link is a
useEffect keyed on sections — re-registers whenever the visible
set changes (search filter narrows it). Same behaviour as the vue
watchEffect.
* v-html="safeInlineHtml(...)" becomes
dangerouslySetInnerHTML={{ __html: safeInlineHtml(...) }}. The
helper still escapes everything except <code> tags.
* JSON syntax highlighter in CodeBlock is unchanged — pure regex on
the escaped string, then rendered via dangerouslySetInnerHTML.
* endpoints.js stays as JS (allowJs in tsconfig); only the consumer
signatures (Endpoint, Section) are typed at the React boundary.
* AppSidebar reuses pauseAnimationsUntilLeave + useTheme from
step 1. Drawer + Sider keyed off the same localStorage flag
(isSidebarCollapsed) and DOM theme attributes the vue version
uses, so the two stay in sync during coexistence.
* refactor(frontend): port nodes to react+ts
Step 4 of the planned vue->react migration. The nodes entry brings in
the largest shared-infrastructure batch so far — every authenticated
react page from here on can lean on these.
New shared pieces (live alongside their .vue counterparts during
coexistence):
* hooks/useMediaQuery.ts — useState + resize listener
* hooks/useWebSocket.ts — wraps WebSocketClient, subscribes on mount
and unsubscribes on unmount. The underlying client is a single
module-level instance so multiple components on the same page
share one socket.
* hooks/useNodes.ts — node list state + CRUD + probe/test, including
the totals memo (online/offline/avgLatency) used by the summary card.
applyNodesEvent is the entry point for the heartbeat-pushed list.
* components/CustomStatistic.tsx — thin Statistic wrapper, prefix +
suffix slots become props.
* components/Sparkline.tsx — the SVG line chart with measured-width
axis scaling, gradient fill, tooltip overlay, and per-instance
gradient id from React.useId. ResizeObserver lifecycle is in
useEffect; the math is unchanged.
Pages:
* NodesPage — wires hooks + WebSocket together, renders summary card
+ NodeList, hosts the form modal. Uses Modal.useModal() for the
delete confirm so the dialog inherits ConfigProvider theming.
* NodeList — desktop renders a Table with expandable history rows;
mobile flips to a vertical card list whose actions live in a
bottom-right Dropdown. The IP-blur eye toggle persists across both.
* NodeFormModal — controlled form (useState object, single setForm
per change). The reset-on-open effect computes the next state
once and applies it with eslint-disable to satisfy the new
react-hooks/set-state-in-effect rule on a legitimate pattern.
* NodeHistoryPanel — polls /panel/api/nodes/history/{id}/{metric}/
{bucket} every 15s, renders cpu+mem sparklines side-by-side.
* refactor(frontend): port settings to react+ts
Step 5 of the planned vue->react migration. Settings is the first
entry whose state model didn't translate to the Vue-style "parent
passes a reactive object, children mutate it in place" pattern, so
the React port flips it to lifted state + a typed updateSetting
patch function.
* models/setting.ts — typed AllSetting class with the same field
defaults and equals() behavior the vue version had. The .js
twin is deleted; nothing else imported it.
* hooks/useAllSetting.ts — owns allSetting + oldAllSetting state,
exposes updateSetting(patch), saveDisabled is derived via useMemo
off equals() (no more 1Hz dirty-check timer).
* components/SettingListItem.tsx — children-based wrapper instead
of named slots. The vue twin stays alive because xray (BasicsTab,
DnsTab) still imports it; deleted when xray migrates.
The five tab components and the TwoFactorModal each accept
{ allSetting, updateSetting } and render with AntD v5's Collapse
items[] API. Every v-model:value="x" became
value={...} onChange={(e) => updateSetting({ key: e.target.value })}
or onChange={(v) => updateSetting({ key: v })} for non-input
controls.
SubscriptionFormatsTab is the trickiest — fragment / noises[] /
mux / direct routing rules are stored as JSON-encoded strings on
the wire. Parsing them once via useMemo per field, mutating the
parsed object on edit, and stringifying back into the patch keeps
the round-trip identical to the vue version.
SettingsPage hosts the tab navigation (with hash sync), the
save / restart action bar, the security-warnings alert banner,
and the restart flow that rebuilds the panel URL after the new
host/port/cert settings take effect.
* refactor(frontend): port clients to react+ts
Step 6 of the planned vue->react migration. Clients is the biggest
data-CRUD page in the panel (1.1k-line ClientsPage, 4 modals, full
table + mobile card list, WebSocket-driven realtime traffic + online
updates).
New shared infra (lives alongside vue twins until inbounds migrates):
* hooks/useClients.ts — clients + inbounds list, CRUD + bulk delete +
attach/detach + traffic reset, with WebSocket event handlers
(traffic, client_stats, invalidate) and a small debounced refresh
on the invalidate event. State managed via setState; the live
client_stats event merges traffic snapshots row-by-row through a
ref to avoid stale closure issues.
* hooks/useDatepicker.ts — singleton "gregorian"/"jalalian" cache
with subscribe/notify so multiple components can read the panel's
Calendar Type without re-fetching. Mirrors useDatepicker.js.
* components/DateTimePicker.tsx — AntD DatePicker wrapper.
vue3-persian-datetime-picker has no React port; the Jalali UI
calendar is deferred (read-only Jalali display via IntlUtil
formatDate still works). The vue twin stays for inbounds.
* pages/inbounds/QrPanel.tsx — copy/download/copy-as-png QR helper
shared between clients (qr modal) and inbounds (still on vue).
Vue twin stays alive at QrPanel.vue.
* models/inbound.ts — slim port: only the TLS_FLOW_CONTROL constant
the clients form needs. The full inbound model stays as
inbound.js for now; inbounds will pull it in as inbound.ts.
The clients page itself uses Modal.useModal() for all confirm
dialogs (delete, bulk-delete, reset-traffic, delDepleted, reset-all)
so the dialogs render themed. Filter state persists to
localStorage under clientsFilterState. Sort + pagination state is
local; pageSize seeds from /panel/setting/defaultSettings.
The four modals share a controlled "open/onOpenChange" pattern
that replaces vue's v-model:open. ClientFormModal computes
attach/detach diffs from the inbound multi-select on submit; the
parent's onSave callback routes them through useClients's attach()/
detach() after the main update succeeds.
ESLint config: turned off four react-hooks v7 rules
(react-compiler, preserve-manual-memoization, set-state-in-effect,
purity). They're all React-Compiler-driven informational rules; we
don't run the compiler and the patterns they flag (initial-fetch
useEffect, derived computations using Date.now, inline arrow event
handlers) are all idiomatic React. Disabling globally instead of
per-line keeps the diff readable.
* refactor(frontend): port index dashboard to react+ts
Step 7 of the Vue→React migration. Ports the overview/index entry: dashboard
page, status + xray cards, panel-update / log / backup / system-history /
xray-metrics / xray-log / version modals, and the custom-geo subsection. Adds
the shared JsonEditor (CodeMirror 6) and useStatus hook used by the config
modal. Removes the unused react-hooks/set-state-in-effect disables now that
the rule is off globally.
* refactor(frontend): port xray to react+ts
Step 8 of the Vue→React migration. Ports the xray config entry: page shell,
basics/routing/outbounds/balancers/dns tabs, the rule + balancer + dns server
+ dns presets + warp + nord modals, the protocol-aware outbound form, and the
shared FinalMaskForm (TCP/UDP masks + QUIC params). Adds useXraySetting that
mirrors the legacy two-way sync between the JSON template string and the
parsed templateSettings tree. The outbound model itself stays in JS so the
class-driven form keeps its existing mutation API; instance access is typed
loosely inside the form to match.
The shared FinalMaskForm.vue and JsonEditor.vue stay alongside the new .tsx
versions until step 9 — InboundFormModal.vue still imports them.
Adds react-hooks/immutability and react-hooks/refs to the already-disabled
react-compiler rule set; both flag the outbound form's instance-mutation
pattern that doesn't run through useState.
* Upgrade frontend deps (antd v6, i18n, TS)
Bump frontend dependencies in package.json and regenerate package-lock.json. Notable updates: upgrade antd to v6, update i18next/react-i18next, axios, qs, vue-i18n, TypeScript and ESLint, plus related @rc-component packages and replacements (e.g. classnames/rc-util -> clsx/@rc-component/util). Lockfile changes reflect the new dependency tree required for Ant Design v6 and other package upgrades.
* refactor(frontend): port inbounds to react+ts and drop vue toolchain
Step 9 — the last entry. Ports the inbounds entry: page shell, list with
desktop table + mobile cards, info modal, qr-code modal, share-link
helpers, and the protocol-aware form modal (basics / protocol /
stream / security / sniffing / advanced JSON). useInbounds replaces
the Vue composable with WebSocket-driven traffic + client-stats merge.
Inbound and DBInbound models stay in JS so the class-driven form keeps
its mutation API; instance access is typed loosely inside the form to
match. FinalMaskForm/JsonEditor/TextModal/PromptModal/InfinityIcon are
the last shared bits to flip; their .vue counterparts go too.
Toolchain cleanup now that no entry needs Vue: drop plugin-vue from
vite.config, remove the .vue lint block + parser, prune vue / vue-i18n
/ ant-design-vue / @ant-design/icons-vue / vue3-persian-datetime-picker
/ moment-jalaali override from package.json, and switch utils/index.js
to import { message } from 'antd' instead of ant-design-vue.
* chore(frontend): adopt antd v6 api updates
Sweep deprecated props across the React tree:
- Modal: destroyOnClose -> destroyOnHidden, maskClosable -> mask.closable
- Space: direction -> orientation (or removed when redundant)
- Input.Group compact -> Space.Compact block
- Drawer: width -> size
- Spin: tip -> description
- Progress: trailColor -> railColor
- Alert: message -> title
- Popover: overlayClassName -> rootClassName
- BackTop -> FloatButton.BackTop
Also refresh dashboard theming for v6: rename dark/ultra Layout and Menu
tokens (siderBg, darkItemBg, darkSubMenuItemBg, darkPopupBg), tweak gauge
size/stroke, add font-size overrides for Statistic and Progress so the
overview numbers stay legible under v6 defaults.
* chore(frontend): antd v6 polish, theme + modal fixes
- adopt message.useMessage hook + messageBus bridge so HttpUtil messages
inherit ConfigProvider theme tokens
- replace deprecated antd APIs (List, Input addonBefore/After, Empty
imageStyle); introduce InputAddon helper + SettingListItem custom rows
- fix dark/ultra selectors in portaled modals (body.dark,
html[data-theme='ultra-dark']) instead of nonexistent .is-dark/.is-ultra
- add horizontal scroll to clients table; reorder node columns so
actions+enable sit at the left
- swap raw button for antd Button in NodeFormModal test connection
- fix FinalMaskForm nested-form by hoisting it outside OutboundFormModal's
parent Form
- fix advanced "all" JSON tab in InboundFormModal — useMemo on a mutated
ref was stale; compute on every render
- fix chart-on-open for SystemHistory + XrayMetrics modals by adding open
to effect deps (useRef.current doesn't trigger re-runs)
- switch i18next interpolation to single-brace {var} to match locale files
- drop residual Vue mentions in CI workflows and Go comments
* fix(frontend): qr code collapse — open only first panel, allow toggle
ClientQrModal and QrCodeModal both used activeKey without onChange,
forcing every panel open and blocking user toggle. Switch to controlled
state initialized to the first item's key on open, with onChange so
clicks update state.
Also remove unused AppBridge.tsx (superseded by per-page message.useMessage
hook).
* fix(frontend): hover cards, balancer load, routing dnd, modal a11y, outbound crash
- ClientsPage/SettingsPage/XrayPage: add hoverable to bottom card/tabs so
hover affordance matches the top card
- BalancerFormModal: lazy-init useState from props + destroyOnHidden so
the form mounts with saved values instead of relying on a useEffect
sync that could miss the first open
- RoutingTab: rewrite pointer drag — handlers are now defined inside the
pointerdown closure so addEventListener/removeEventListener match;
drag state lives on a ref (from/to/moved) so onUp reads the real
indices, not stale closure values. Adds setPointerCapture so Windows
and touch keep delivering events when the cursor leaves the handle.
- OutboundFormModal/InboundFormModal: blur the focused input before
switching tabs to silence the aria-hidden-on-focused-element warning
- utils.isArrEmpty: return true for undefined/null arrays — the old form
treated undefined as "not empty" which crashed VLESSSettings.fromJson
when json.vnext was missing
* fix(frontend): clipboard reliability + restyle login page
- ClipboardManager.copyText: prefer navigator.clipboard on secure
contexts, fall back to a focused on-screen textarea + execCommand.
Old path used left:-9999px which failed selection in some browsers
and swallowed execCommand's return value, so the "copied" toast
appeared even when nothing made it to the clipboard.
- LoginPage: richer gradient backdrop — five animated colour blobs,
glassmorphic card (backdrop-filter blur + saturate), gradient brand
text/accent, masked grid texture for depth, and a thin gradient
border on the card. Light/dark/ultra each get their own palette.
* Memoize compactAdvancedJson and update deps
Wrap compactAdvancedJson in useCallback (dependent on messageApi) and add it to the dependency array of applyAdvancedJsonToBasic. This ensures a stable function reference for correct dependency tracking and avoids stale closures/unnecessary re-renders in InboundFormModal.tsx.
* style(frontend): prettier charts, drop redundant frame, format net rates
- Sparkline: multi-stop gradient fill, soft drop-shadow under the line,
dashed grid, glowing pulse on the latest-point marker, pill-shaped
tooltip with dashed crosshair
- XrayMetricsModal: glow + pulse on the observatory alive dot,
monospace stamps/listen text
- SystemHistoryModal: keep just the modal's frame around the chart (the
inner wrapper I'd added stacked a second border on top); strip the
decimal from Net Up/Down (25.63 KB/s → 25 KB/s) only on this chart's
formatter
* style(frontend): refined dark/ultra palette + shared pro card frame
- Dark tokens shifted to a cooler, Linear-style palette: page #1a1b1f,
sidebar/header #15161a (recessed nav, darker than cards), card
#23252b, elevated #2d2f37
- Ultra dark: page pure #000 for OLED, sidebar #050507 disappears into
the frame, card #101013 with a clear step, elevated #1a1a1e
- New styles/page-cards.css holds the card border/shadow/hover rules so
all seven content pages (index, clients, inbounds, xray, settings,
nodes, api-docs) share one definition instead of duplicating in each
page CSS
- Dashboard typography: uppercase card titles with letter-spacing,
larger 17px stat values, subtle gradient divider between stat columns,
ellipsis on action labels so "Backup & Restore" doesn't break the
card height at mid widths
- Light --bg-page stays at #e6e8ec for the contrast against white cards
* fix(frontend): wireguard info alignment, blue login dark, embed gitkeep
- align WireGuard info-modal fields with Protocol/Address/Port by wrapping
values in Tag (matches the rest of the dl.info-list rows)
- swap login dark palette from purple to pure blue blobs/accent/brand
- pin web/dist/.gitkeep through gitignore so //go:embed all:dist never
fails on a fresh clone with an empty dist directory
* docs: refresh frontend docs for the React + TS + AntD 6 stack
Update CONTRIBUTING.md and frontend/README.md to describe the migrated
frontend accurately:
- replace Vue 3 / Ant Design Vue 4 references with React 19 / AntD 6 / TS
- swap composables -> hooks, vue-i18n -> react-i18next, createApp -> createRoot
- mention the typecheck step (tsc --noEmit) in the PR checklist
- document the Vite 8.0.13 pin and TypeScript strict mode in conventions
- list the nodes and api-docs entries that were missing from the layout
* style(frontend): improve readability and mobile polish
- bump statistic title/value contrast in dark and ultra-dark so totals
on the inbounds summary card stay legible
- give index card actions explicit colors per theme so links like Stop,
Logs, System History no longer fade into the card background
- show the panel version as a tag next to "3X-UI" on mobile, mirroring
the Xray version tag pattern, and turn it orange when an update is
available
- make the login settings button a proper circle by adding size="large"
+ an explicit border-radius fallback on .toolbar-btn
* feat: jalali calendar support and date formatting fixes
- Wire useDatepicker into IntlUtil and switch jalalian display locale
to fa-IR for clean "1405/07/03 12:00:00" output (drops the awkward
"AP" era suffix that "<lang>-u-ca-persian" produced)
- Drop in persian-calendar-suite for the jalali date picker, with a
light/dark/ultra theme map and CSS overrides so the inline-styled
input stays readable and bg matches the surrounding container
- Force LTR on the picker input so "1405/03/07 00:00" reads naturally
- Pass calendar setting through ClientInfoModal, ClientsPage Duration
tooltip, and ClientFormModal's expiry picker
- Heuristic toMs() in ClientInfoModal so GORM's autoUpdateTime seconds
render as a real date instead of "1348/11/01"
- Persist UpdatedAt on the ClientRecord row in client_service.Update;
previously only the inbound settings JSON was bumped, so the panel
never saw a fresh updated_at after editing a client
* feat(frontend): donate link, panel version label, login lang menu
- Sidebar: add heart donate link to https://donate.sanaei.dev and small panel version under 3X-UI brand
- Login: swap settings-cog for translation icon, drop title, render languages as a direct list
- Vite dev: inject window.X_UI_CUR_VER from config/version so dev mode matches prod
- Translations: add menu.donate across all locales
* fix(xray-update): respect XUI_BIN_FOLDER on Windows
The Windows update path hardcoded "bin/xray-windows-amd64.exe", ignoring
the configured XUI_BIN_FOLDER. In dev mode (folder set to x-ui) this
created a stray bin/ folder while the running binary stayed un-updated.
* Bump Xray to v26.5.9 and minor cleanup
Update Xray release URLs to v26.5.9 in the GitHub Actions workflow and DockerInit.sh. Remove the hardcoded skip for tagVersion "26.5.3" so it will be considered when collecting Xray versions. Apply small formatting fixes: remove an extra blank line in database/db.go, normalize spacing/alignment of Protocol constants in database/model/model.go, and trim a trailing blank line in web/controller/inbound.go.
* fix(frontend): route remaining copy buttons through ClipboardManager
Direct navigator.clipboard calls fail in non-secure contexts (HTTP on a
LAN IP), making the API-docs code copy and security-tab token copy
silently broken. Both now go through ClipboardManager which falls back
to document.execCommand('copy') when navigator.clipboard is unavailable.
* fix(db): store CreatedAt/UpdatedAt in milliseconds
GORM's autoCreateTime/autoUpdateTime tags default to Unix seconds on
int64 fields and overwrite the service-supplied UnixMilli value on
save. The frontend interprets these timestamps as JS Date inputs
(milliseconds), so created/updated columns rendered ~1970 dates. Adding
the :milli qualifier makes GORM match what the service code and UI
expect.
* Improve legacy clipboard copy handling
Refactor ClipboardManager._legacyCopy to better handle focus and selection when copying. The textarea is now appended to the active element's parent (or body) and placed off-screen with aria-hidden and readonly attributes. The code preserves and restores the previous document selection and active element, uses focus({preventScroll: true}) to avoid scrolling, and returns the execCommand('copy') result. This makes legacy copy behavior more robust and less disruptive to the page state.
* fix(lint): drop redundant ok=false in clipboard fallback catch
* chore(deps): bump golang.org/x/net to v0.55.0 for GO-2026-5026
1093 lines
No EOL
66 KiB
JSON
1093 lines
No EOL
66 KiB
JSON
{
|
||
"username": "ユーザー名",
|
||
"password": "パスワード",
|
||
"login": "ログイン",
|
||
"confirm": "確認",
|
||
"cancel": "キャンセル",
|
||
"close": "閉じる",
|
||
"save": "保存",
|
||
"logout": "ログアウト",
|
||
"create": "作成",
|
||
"update": "更新",
|
||
"copy": "コピー",
|
||
"copied": "コピー済み",
|
||
"download": "ダウンロード",
|
||
"remark": "備考",
|
||
"enable": "有効化",
|
||
"protocol": "プロトコル",
|
||
"search": "検索",
|
||
"filter": "フィルター",
|
||
"loading": "読み込み中...",
|
||
"refresh": "更新",
|
||
"clear": "クリア",
|
||
"second": "秒",
|
||
"minute": "分",
|
||
"hour": "時間",
|
||
"day": "日",
|
||
"check": "確認",
|
||
"indefinite": "無期限",
|
||
"unlimited": "無制限",
|
||
"none": "なし",
|
||
"qrCode": "QRコード",
|
||
"info": "詳細情報",
|
||
"edit": "編集",
|
||
"delete": "削除",
|
||
"reset": "リセット",
|
||
"noData": "データなし。",
|
||
"copySuccess": "コピー成功",
|
||
"sure": "確定",
|
||
"encryption": "暗号化",
|
||
"useIPv4ForHost": "ホストにIPv4を使用",
|
||
"transmission": "伝送",
|
||
"host": "ホスト",
|
||
"path": "パス",
|
||
"camouflage": "偽装",
|
||
"status": "ステータス",
|
||
"enabled": "有効",
|
||
"disabled": "無効",
|
||
"depleted": "消耗済み",
|
||
"depletingSoon": "間もなく消耗",
|
||
"offline": "オフライン",
|
||
"online": "オンライン",
|
||
"domainName": "ドメイン名",
|
||
"monitor": "監視",
|
||
"certificate": "証明書",
|
||
"fail": "失敗",
|
||
"comment": "コメント",
|
||
"success": "成功",
|
||
"lastOnline": "最終オンライン",
|
||
"getVersion": "バージョン取得",
|
||
"install": "インストール",
|
||
"clients": "クライアント",
|
||
"usage": "利用状況",
|
||
"twoFactorCode": "コード",
|
||
"remained": "残り",
|
||
"security": "セキュリティ",
|
||
"secAlertTitle": "セキュリティアラート",
|
||
"secAlertSsl": "この接続は安全ではありません。TLSを有効にしてデータ保護を行うまで、機密情報を入力しないでください。",
|
||
"secAlertConf": "一部の設定は脆弱です。潜在的な脆弱性を防ぐために、セキュリティプロトコルを強化することをお勧めします。",
|
||
"secAlertSSL": "セキュアな接続がありません。データ保護のためにTLS証明書をインストールしてください。",
|
||
"secAlertPanelPort": "デフォルトのポートにはセキュリティリスクがあります。ランダムなポートまたは特定のポートを設定してください。",
|
||
"secAlertPanelURI": "デフォルトのURIパスは安全ではありません。複雑なURIパスを設定してください。",
|
||
"secAlertSubURI": "サブスクリプションのデフォルトURIパスは安全ではありません。複雑なURIパスを設定してください。",
|
||
"secAlertSubJsonURI": "JSONサブスクリプションのデフォルトURIパスは安全ではありません。複雑なURIパスを設定してください。",
|
||
"emptyDnsDesc": "追加されたDNSサーバーはありません。",
|
||
"emptyFakeDnsDesc": "追加されたFake DNSサーバーはありません。",
|
||
"emptyBalancersDesc": "追加されたバランサーはありません。",
|
||
"emptyReverseDesc": "追加されたリバースプロキシはありません。",
|
||
"somethingWentWrong": "エラーが発生しました",
|
||
"subscription": {
|
||
"title": "サブスクリプション情報",
|
||
"subId": "サブスクリプションID",
|
||
"status": "ステータス",
|
||
"downloaded": "ダウンロード",
|
||
"uploaded": "アップロード",
|
||
"expiry": "有効期限",
|
||
"totalQuota": "合計クォータ",
|
||
"individualLinks": "個別リンク",
|
||
"active": "有効",
|
||
"inactive": "無効",
|
||
"unlimited": "無制限",
|
||
"noExpiry": "期限なし"
|
||
},
|
||
"menu": {
|
||
"theme": "テーマ",
|
||
"dark": "ダーク",
|
||
"ultraDark": "ウルトラダーク",
|
||
"dashboard": "ダッシュボード",
|
||
"inbounds": "インバウンド一覧",
|
||
"clients": "クライアント",
|
||
"nodes": "ノード",
|
||
"settings": "パネル設定",
|
||
"xray": "Xray設定",
|
||
"apiDocs": "API ドキュメント",
|
||
"logout": "ログアウト",
|
||
"link": "リンク管理",
|
||
"donate": "寄付"
|
||
},
|
||
"pages": {
|
||
"login": {
|
||
"hello": "こんにちは",
|
||
"title": "ようこそ",
|
||
"loginAgain": "ログインセッションが切れました。再度ログインしてください。",
|
||
"toasts": {
|
||
"invalidFormData": "データ形式エラー",
|
||
"emptyUsername": "ユーザー名を入力してください",
|
||
"emptyPassword": "パスワードを入力してください",
|
||
"wrongUsernameOrPassword": "ユーザー名、パスワード、または二段階認証コードが無効です。",
|
||
"successLogin": "アカウントに正常にログインしました。"
|
||
}
|
||
},
|
||
"index": {
|
||
"title": "システムステータス",
|
||
"cpu": "CPU",
|
||
"logicalProcessors": "論理プロセッサ",
|
||
"frequency": "周波数",
|
||
"swap": "スワップ",
|
||
"storage": "ストレージ",
|
||
"memory": "RAM",
|
||
"threads": "スレッド",
|
||
"xrayStatus": "Xray",
|
||
"stopXray": "停止",
|
||
"restartXray": "再起動",
|
||
"xraySwitch": "バージョン",
|
||
"xrayUpdates": "Xrayの更新",
|
||
"xraySwitchClick": "切り替えるバージョンを選択してください",
|
||
"xraySwitchClickDesk": "慎重に選択してください。古いバージョンは現在の設定と互換性がない可能性があります。",
|
||
"updatePanel": "パネルを更新",
|
||
"panelUpdateDesc": "これにより3X-UIが最新リリースに更新され、パネルサービスが再起動されます。",
|
||
"currentPanelVersion": "現在のパネルバージョン",
|
||
"latestPanelVersion": "最新のパネルバージョン",
|
||
"panelUpToDate": "パネルは最新です",
|
||
"upToDate": "最新",
|
||
"xrayStatusUnknown": "不明",
|
||
"xrayStatusRunning": "実行中",
|
||
"xrayStatusStop": "停止",
|
||
"xrayStatusError": "エラー",
|
||
"xrayErrorPopoverTitle": "Xrayの実行中にエラーが発生しました",
|
||
"operationHours": "システム稼働時間",
|
||
"systemHistoryTitle": "システム履歴",
|
||
"charts": "チャート",
|
||
"xrayMetricsTitle": "Xray メトリクス",
|
||
"xrayMetricsDisabled": "Xray メトリクスエンドポイントが設定されていません",
|
||
"xrayMetricsHint": "xray 設定にトップレベルの metrics ブロック(tag: metrics_out、listen: 127.0.0.1:11111)を追加し、xray を再起動してください。",
|
||
"xrayObservatoryEmpty": "Observatory データはまだありません",
|
||
"xrayObservatoryHint": "xray 設定に observatory ブロックを追加し、プローブする outbound タグを列挙してから xray を再起動してください。",
|
||
"xrayObservatoryTagPlaceholder": "Outbound を選択",
|
||
"xrayObservatoryAlive": "稼働中",
|
||
"xrayObservatoryDead": "停止",
|
||
"xrayObservatoryLastSeen": "最終確認",
|
||
"xrayObservatoryLastTry": "最終試行",
|
||
"trendLast2Min": "直近2分",
|
||
"systemLoad": "システム負荷",
|
||
"systemLoadDesc": "過去1、5、15分間のシステム平均負荷",
|
||
"connectionCount": "接続数",
|
||
"ipAddresses": "IPアドレス",
|
||
"toggleIpVisibility": "IPの表示を切り替える",
|
||
"overallSpeed": "全体の速度",
|
||
"upload": "アップロード",
|
||
"download": "ダウンロード",
|
||
"totalData": "総データ量",
|
||
"sent": "送信",
|
||
"received": "受信",
|
||
"documentation": "ドキュメント",
|
||
"xraySwitchVersionDialog": "Xrayのバージョンを本当に変更しますか?",
|
||
"xraySwitchVersionDialogDesc": "Xrayのバージョンが#version#に変更されます。",
|
||
"xraySwitchVersionPopover": "Xrayの更新が成功しました",
|
||
"panelUpdateDialog": "本当にパネルを更新しますか?",
|
||
"panelUpdateDialogDesc": "これにより3X-UIが#version#に更新され、パネルサービスが再起動されます。",
|
||
"panelUpdateCheckPopover": "パネルの更新確認に失敗しました",
|
||
"panelUpdateStartedPopover": "パネルの更新を開始しました",
|
||
"geofileUpdateDialog": "ジオファイルを本当に更新しますか?",
|
||
"geofileUpdateDialogDesc": "これにより#filename#ファイルが更新されます。",
|
||
"geofilesUpdateDialogDesc": "これにより、すべてのファイルが更新されます。",
|
||
"geofilesUpdateAll": "すべて更新",
|
||
"geofileUpdatePopover": "ジオファイルの更新が成功しました",
|
||
"customGeoTitle": "カスタム GeoSite / GeoIP",
|
||
"customGeoAdd": "追加",
|
||
"customGeoType": "種類",
|
||
"customGeoAlias": "エイリアス",
|
||
"customGeoUrl": "URL",
|
||
"customGeoEnabled": "有効",
|
||
"customGeoLastUpdated": "最終更新",
|
||
"customGeoExtColumn": "ルーティング (ext:…)",
|
||
"customGeoToastUpdateAll": "すべてのカスタムソースを更新しました",
|
||
"customGeoActions": "操作",
|
||
"customGeoEdit": "編集",
|
||
"customGeoDelete": "削除",
|
||
"customGeoDownload": "今すぐ更新",
|
||
"customGeoModalAdd": "カスタム geo を追加",
|
||
"customGeoModalEdit": "カスタム geo を編集",
|
||
"customGeoModalSave": "保存",
|
||
"customGeoDeleteConfirm": "このカスタム geo ソースを削除しますか?",
|
||
"customGeoRoutingHint": "ルーティングでは値を ext:ファイル.dat:タグ(タグを置換)として使います。",
|
||
"customGeoInvalidId": "無効なリソース ID",
|
||
"customGeoAliasesError": "カスタム geo エイリアスの読み込みに失敗しました",
|
||
"customGeoValidationAlias": "エイリアスは小文字・数字・- と _ のみ使用できます",
|
||
"customGeoValidationUrl": "URL は http:// または https:// で始めてください",
|
||
"customGeoAliasPlaceholder": "a-z 0-9 _ -",
|
||
"customGeoAliasLabelSuffix": "(カスタム)",
|
||
"customGeoToastList": "カスタム geo 一覧",
|
||
"customGeoToastAdd": "カスタム geo を追加",
|
||
"customGeoToastUpdate": "カスタム geo を更新",
|
||
"customGeoToastDelete": "カスタム geofile「{{ .fileName }}」を削除しました",
|
||
"customGeoToastDownload": "geofile「{{ .fileName }}」を更新しました",
|
||
"customGeoErrInvalidType": "種類は geosite または geoip である必要があります",
|
||
"customGeoErrAliasRequired": "エイリアスが必要です",
|
||
"customGeoErrAliasPattern": "エイリアスに使用できない文字が含まれています",
|
||
"customGeoErrAliasReserved": "このエイリアスは予約されています",
|
||
"customGeoErrUrlRequired": "URL が必要です",
|
||
"customGeoErrInvalidUrl": "URL が無効です",
|
||
"customGeoErrUrlScheme": "URL は http または https を使用してください",
|
||
"customGeoErrUrlHost": "URL のホストが無効です",
|
||
"customGeoErrDuplicateAlias": "この種類ですでにこのエイリアスが使われています",
|
||
"customGeoErrNotFound": "カスタム geo ソースが見つかりません",
|
||
"customGeoErrDownload": "ダウンロードに失敗しました",
|
||
"customGeoErrUpdateAllIncomplete": "カスタム geo ソースの 1 件以上を更新できませんでした",
|
||
"customGeoEmpty": "カスタム geo ソースはまだありません — 「追加」をクリックして作成してください",
|
||
"dontRefresh": "インストール中、このページをリロードしないでください",
|
||
"logs": "ログ",
|
||
"config": "設定",
|
||
"backup": "バックアップ",
|
||
"backupTitle": "バックアップと復元",
|
||
"exportDatabase": "バックアップ",
|
||
"exportDatabaseDesc": "クリックして、現在のデータベースのバックアップを含む .db ファイルをデバイスにダウンロードします。",
|
||
"importDatabase": "復元",
|
||
"importDatabaseDesc": "クリックして、デバイスから .db ファイルを選択し、アップロードしてバックアップからデータベースを復元します。",
|
||
"importDatabaseSuccess": "データベースのインポートに成功しました",
|
||
"importDatabaseError": "データベースのインポート中にエラーが発生しました",
|
||
"readDatabaseError": "データベースの読み取り中にエラーが発生しました",
|
||
"getDatabaseError": "データベースの取得中にエラーが発生しました",
|
||
"getConfigError": "設定ファイルの取得中にエラーが発生しました"
|
||
},
|
||
"inbounds": {
|
||
"title": "インバウンド一覧",
|
||
"totalDownUp": "総アップロード / ダウンロード",
|
||
"totalUsage": "総使用量",
|
||
"inboundCount": "インバウンド数",
|
||
"operate": "メニュー",
|
||
"enable": "有効化",
|
||
"remark": "備考",
|
||
"node": "ノード",
|
||
"deployTo": "デプロイ先",
|
||
"localPanel": "ローカルパネル",
|
||
"fallbacks": {
|
||
"title": "フォールバック",
|
||
"help": "このインバウンドへの接続がどのクライアントにも一致しない場合、別のインバウンドへルーティングします。下から子インバウンドを選ぶと、ルーティング項目(SNI / ALPN / Path / xver)はその子のトランスポートから自動的に埋められます — ほとんどの構成で追加の調整は不要です。各子インバウンドは 127.0.0.1 で security=none をリッスンする必要があります。",
|
||
"empty": "フォールバックはまだありません",
|
||
"add": "フォールバックを追加",
|
||
"pickInbound": "インバウンドを選択",
|
||
"matchAny": "任意",
|
||
"rederive": "子から再取得",
|
||
"rederived": "子から再取得しました",
|
||
"editAdvanced": "ルーティング項目を編集",
|
||
"hideAdvanced": "詳細を隠す",
|
||
"quickAddAll": "対象のインバウンドをすべて一括追加",
|
||
"quickAdded": "{n} 件のフォールバックを追加しました",
|
||
"quickAddedNone": "追加可能な新規インバウンドはありません",
|
||
"routesWhen": "次の条件でルーティング",
|
||
"defaultCatchAll": "デフォルト — その他すべてを捕捉"
|
||
},
|
||
"protocol": "プロトコル",
|
||
"port": "ポート",
|
||
"portMap": "ポートマッピング",
|
||
"traffic": "トラフィック",
|
||
"details": "詳細情報",
|
||
"transportConfig": "トランスポート設定",
|
||
"expireDate": "有効期限",
|
||
"createdAt": "作成",
|
||
"updatedAt": "更新",
|
||
"resetTraffic": "トラフィックリセット",
|
||
"addInbound": "インバウンド追加",
|
||
"generalActions": "一般操作",
|
||
"modifyInbound": "インバウンド修正",
|
||
"deleteInbound": "インバウンド削除",
|
||
"deleteInboundContent": "インバウンドを削除してもよろしいですか?",
|
||
"deleteClient": "クライアント削除",
|
||
"deleteClientContent": "クライアントを削除してもよろしいですか?",
|
||
"resetTrafficContent": "トラフィックをリセットしてもよろしいですか?",
|
||
"copyLink": "リンクをコピー",
|
||
"address": "アドレス",
|
||
"network": "ネットワーク",
|
||
"destinationPort": "宛先ポート",
|
||
"targetAddress": "宛先アドレス",
|
||
"monitorDesc": "空白にするとすべてのIPを監視",
|
||
"meansNoLimit": "= 無制限(単位:GB)",
|
||
"totalFlow": "総トラフィック",
|
||
"leaveBlankToNeverExpire": "空白にすると期限なし",
|
||
"noRecommendKeepDefault": "デフォルト値を保持することをお勧めします",
|
||
"certificatePath": "ファイルパス",
|
||
"certificateContent": "ファイル内容",
|
||
"publicKey": "公開鍵",
|
||
"privatekey": "秘密鍵",
|
||
"clickOnQRcode": "QRコードをクリックしてコピー",
|
||
"client": "クライアント",
|
||
"export": "リンクエクスポート",
|
||
"clone": "複製",
|
||
"cloneInbound": "複製",
|
||
"cloneInboundContent": "このインバウンドルールは、ポート(Port)、リスニングIP(Listening IP)、クライアント(Clients)を除くすべての設定がクローンされます",
|
||
"cloneInboundOk": "クローン作成",
|
||
"resetAllTraffic": "すべてのインバウンドトラフィックをリセット",
|
||
"resetAllTrafficTitle": "すべてのインバウンドトラフィックをリセット",
|
||
"resetAllTrafficContent": "すべてのインバウンドトラフィックをリセットしてもよろしいですか?",
|
||
"resetInboundClientTraffics": "クライアントトラフィックをリセット",
|
||
"resetInboundClientTrafficTitle": "すべてのクライアントトラフィックをリセット",
|
||
"resetInboundClientTrafficContent": "このインバウンドクライアントのすべてのトラフィックをリセットしてもよろしいですか?",
|
||
"resetAllClientTraffics": "すべてのクライアントトラフィックをリセット",
|
||
"resetAllClientTrafficTitle": "すべてのクライアントトラフィックをリセット",
|
||
"resetAllClientTrafficContent": "すべてのクライアントのトラフィックをリセットしてもよろしいですか?",
|
||
"delDepletedClients": "トラフィックが尽きたクライアントを削除",
|
||
"delDepletedClientsTitle": "トラフィックが尽きたクライアントを削除",
|
||
"delDepletedClientsContent": "トラフィックが尽きたすべてのクライアントを削除してもよろしいですか?",
|
||
"email": "メールアドレス",
|
||
"emailDesc": "メールアドレスは一意でなければなりません",
|
||
"IPLimit": "IP制限",
|
||
"IPLimitDesc": "設定値を超えるとインバウンドトラフィックが無効になります。(0 = 無効)",
|
||
"IPLimitlog": "IPログ",
|
||
"IPLimitlogDesc": "IP履歴ログ(無効なインバウンドトラフィックを有効にするには、ログをクリアしてください)",
|
||
"IPLimitlogclear": "ログをクリア",
|
||
"setDefaultCert": "パネル設定から証明書を設定",
|
||
"streamTab": "ストリーム",
|
||
"securityTab": "セキュリティ",
|
||
"sniffingTab": "スニッフィング",
|
||
"sniffingMetadataOnly": "メタデータのみ",
|
||
"sniffingRouteOnly": "ルーティングのみ",
|
||
"sniffingIpsExcluded": "除外する IP",
|
||
"sniffingDomainsExcluded": "除外するドメイン",
|
||
"decryption": "復号",
|
||
"encryption": "暗号化",
|
||
"vlessAuthX25519": "X25519 認証",
|
||
"vlessAuthMlkem768": "ML-KEM-768 認証",
|
||
"vlessAuthCustom": "カスタム",
|
||
"vlessAuthSelected": "選択中: {auth}",
|
||
"advanced": {
|
||
"title": "インバウンド JSON セクション",
|
||
"subtitle": "インバウンド全体の JSON と、settings、sniffing、streamSettings 用の専用エディター。",
|
||
"all": "すべて",
|
||
"allHelp": "すべてのフィールドを含むインバウンドオブジェクト全体を 1 つのエディターで編集します。",
|
||
"settings": "設定",
|
||
"settingsHelp": "Xray settings ブロックのラッパー:",
|
||
"sniffing": "スニッフィング",
|
||
"sniffingHelp": "Xray sniffing ブロックのラッパー:",
|
||
"stream": "ストリーム",
|
||
"streamHelp": "Xray stream ブロックのラッパー:",
|
||
"jsonErrorPrefix": "高度な JSON"
|
||
},
|
||
"telegramDesc": "TelegramチャットIDを提供してください。(ボットで'/id'コマンドを使用)または({'@'}userinfobot)",
|
||
"subscriptionDesc": "サブスクリプションURLを見つけるには、“詳細情報”に移動してください。また、複数のクライアントに同じ名前を使用することができます。",
|
||
"info": "情報",
|
||
"same": "同じ",
|
||
"inboundData": "インバウンドデータ",
|
||
"exportInbound": "インバウンドルールをエクスポート",
|
||
"import": "インポート",
|
||
"importInbound": "インバウンドルールをインポート",
|
||
"periodicTrafficResetTitle": "トラフィックリセット",
|
||
"periodicTrafficResetDesc": "指定された間隔でトラフィックカウンタを自動的にリセット",
|
||
"lastReset": "最後のリセット",
|
||
"periodicTrafficReset": {
|
||
"never": "なし",
|
||
"daily": "毎日",
|
||
"weekly": "毎週",
|
||
"monthly": "毎月",
|
||
"hourly": "毎時"
|
||
},
|
||
"toasts": {
|
||
"obtain": "取得",
|
||
"updateSuccess": "更新が成功しました",
|
||
"logCleanSuccess": "ログがクリアされました",
|
||
"inboundsUpdateSuccess": "インバウンドが正常に更新されました",
|
||
"inboundUpdateSuccess": "インバウンドが正常に更新されました",
|
||
"inboundCreateSuccess": "インバウンドが正常に作成されました",
|
||
"inboundDeleteSuccess": "インバウンドが正常に削除されました",
|
||
"inboundClientAddSuccess": "インバウンドクライアントが追加されました",
|
||
"inboundClientDeleteSuccess": "インバウンドクライアントが削除されました",
|
||
"inboundClientUpdateSuccess": "インバウンドクライアントが更新されました",
|
||
"delDepletedClientsSuccess": "すべての枯渇したクライアントが削除されました",
|
||
"resetAllClientTrafficSuccess": "クライアントのすべてのトラフィックがリセットされました",
|
||
"resetAllTrafficSuccess": "すべてのトラフィックがリセットされました",
|
||
"resetInboundClientTrafficSuccess": "トラフィックがリセットされました",
|
||
"resetInboundTrafficSuccess": "受信トラフィックがリセットされました",
|
||
"trafficGetError": "トラフィックの取得中にエラーが発生しました",
|
||
"getNewX25519CertError": "X25519証明書の取得中にエラーが発生しました。",
|
||
"getNewmldsa65Error": "mldsa65証明書の取得中にエラーが発生しました。",
|
||
"getNewVlessEncError": "VlessEnc証明書の取得中にエラーが発生しました。"
|
||
},
|
||
"stream": {
|
||
"general": {
|
||
"request": "リクエスト",
|
||
"response": "レスポンス",
|
||
"name": "名前",
|
||
"value": "値"
|
||
},
|
||
"tcp": {
|
||
"version": "バージョン",
|
||
"method": "方法",
|
||
"path": "パス",
|
||
"status": "ステータス",
|
||
"statusDescription": "ステータス説明",
|
||
"requestHeader": "リクエストヘッダー",
|
||
"responseHeader": "レスポンスヘッダー"
|
||
}
|
||
}
|
||
},
|
||
"clients": {
|
||
"add": "クライアントを追加",
|
||
"edit": "クライアントを編集",
|
||
"submitAdd": "クライアントを追加",
|
||
"submitEdit": "変更を保存",
|
||
"clientCount": "クライアント数",
|
||
"bulk": "一括追加",
|
||
"copyFromInbound": "インバウンドからクライアントをコピー",
|
||
"copyToInbound": "コピー先",
|
||
"copySelected": "選択をコピー",
|
||
"copySource": "コピー元",
|
||
"copyEmailPreview": "生成されるメールのプレビュー",
|
||
"copySelectSourceFirst": "まずコピー元のインバウンドを選択してください。",
|
||
"copyResult": "コピー結果",
|
||
"copyResultSuccess": "コピーに成功しました",
|
||
"copyResultNone": "コピーする対象がありません。クライアントが選択されていないか、コピー元が空です",
|
||
"copyResultErrors": "コピーエラー",
|
||
"copyFlowLabel": "新規クライアントの Flow (VLESS)",
|
||
"copyFlowHint": "コピーされる全クライアントに適用されます。空欄でスキップします。",
|
||
"selectAll": "すべて選択",
|
||
"clearAll": "すべてクリア",
|
||
"method": "メソッド",
|
||
"first": "最初",
|
||
"last": "最後",
|
||
"ipLog": "IP ログ",
|
||
"prefix": "プレフィックス",
|
||
"postfix": "サフィックス",
|
||
"delayedStart": "初回使用から開始",
|
||
"expireDays": "期間",
|
||
"days": "日",
|
||
"renew": "自動更新",
|
||
"renewDesc": "有効期限切れ後に自動更新します。(0 = 無効) (単位: 日)",
|
||
"title": "クライアント",
|
||
"actions": "操作",
|
||
"totalGB": "送受信合計 (GB)",
|
||
"expiryTime": "有効期限",
|
||
"addClients": "クライアントを追加",
|
||
"limitIp": "IP 制限",
|
||
"password": "パスワード",
|
||
"subId": "サブスクリプション ID",
|
||
"online": "オンライン",
|
||
"email": "メール",
|
||
"comment": "コメント",
|
||
"traffic": "トラフィック",
|
||
"offline": "オフライン",
|
||
"addTitle": "クライアントを追加",
|
||
"qrCode": "QR コード",
|
||
"moreInformation": "詳細情報",
|
||
"delete": "削除",
|
||
"reset": "トラフィックをリセット",
|
||
"editTitle": "クライアントを編集",
|
||
"client": "クライアント",
|
||
"enabled": "有効",
|
||
"remaining": "残量",
|
||
"duration": "期間",
|
||
"attachedInbounds": "関連付けされたインバウンド",
|
||
"selectInbound": "1 つ以上のインバウンドを選択",
|
||
"noSubId": "このクライアントには subId がなく、共有可能なリンクはありません。",
|
||
"noLinks": "共有可能なリンクがありません — まずこのクライアントを対応するプロトコルのインバウンドに関連付けてください。",
|
||
"link": "リンク",
|
||
"resetNotPossible": "まずこのクライアントをインバウンドに関連付けてください。",
|
||
"general": "一般",
|
||
"resetAllTraffics": "すべてのクライアントのトラフィックをリセット",
|
||
"resetAllTrafficsTitle": "すべてのクライアントのトラフィックをリセットしますか?",
|
||
"resetAllTrafficsContent": "すべてのクライアントの送受信カウンターがゼロにリセットされます。クォータと有効期限には影響しません。元に戻せません。",
|
||
"empty": "クライアントはまだいません — 1 つ追加して始めましょう。",
|
||
"deleteConfirmTitle": "クライアント {email} を削除しますか?",
|
||
"deleteConfirmContent": "クライアントを関連付けされたすべてのインバウンドから削除し、トラフィック記録も破棄します。元に戻せません。",
|
||
"deleteSelected": "削除 ({count})",
|
||
"bulkDeleteConfirmTitle": "{count} 件のクライアントを削除しますか?",
|
||
"bulkDeleteConfirmContent": "選択された各クライアントを関連付けされたすべてのインバウンドから削除し、トラフィック記録も破棄します。元に戻せません。",
|
||
"delDepleted": "使い切ったクライアントを削除",
|
||
"delDepletedConfirmTitle": "使い切ったクライアントを削除しますか?",
|
||
"delDepletedConfirmContent": "トラフィック上限に達したか有効期限が切れたクライアントをすべて削除します。元に戻せません。",
|
||
"auth": "Auth",
|
||
"hysteriaAuth": "Auth (Hysteria)",
|
||
"uuid": "UUID",
|
||
"flow": "Flow",
|
||
"reverseTag": "Reverse tag",
|
||
"reverseTagPlaceholder": "任意の Reverse tag",
|
||
"telegramId": "Telegram ユーザー ID",
|
||
"telegramIdPlaceholder": "数値の Telegram ユーザー ID (0 = なし)",
|
||
"created": "作成日",
|
||
"updated": "更新日",
|
||
"ipLimit": "IP 制限",
|
||
"toasts": {
|
||
"deleted": "クライアントを削除しました",
|
||
"trafficReset": "トラフィックをリセットしました",
|
||
"allTrafficsReset": "すべてのクライアントのトラフィックをリセットしました",
|
||
"bulkDeleted": "{count} 件のクライアントを削除しました",
|
||
"bulkDeletedMixed": "{ok} 件削除、{failed} 件失敗",
|
||
"bulkCreated": "{count} 件のクライアントを作成しました",
|
||
"bulkCreatedMixed": "{ok} 件作成、{failed} 件失敗",
|
||
"delDepleted": "使い切った {count} 件のクライアントを削除しました"
|
||
}
|
||
},
|
||
"nodes": {
|
||
"title": "ノード",
|
||
"addNode": "ノードを追加",
|
||
"editNode": "ノードを編集",
|
||
"totalNodes": "ノード総数",
|
||
"onlineNodes": "オンライン",
|
||
"offlineNodes": "オフライン",
|
||
"avgLatency": "平均レイテンシ",
|
||
"name": "名前",
|
||
"namePlaceholder": "例: de-frankfurt-1",
|
||
"addressPlaceholder": "panel.example.com または 1.2.3.4",
|
||
"remark": "備考",
|
||
"scheme": "スキーム",
|
||
"address": "アドレス",
|
||
"port": "ポート",
|
||
"basePath": "ベースパス",
|
||
"apiToken": "APIトークン",
|
||
"apiTokenPlaceholder": "リモートパネルの設定ページから取得したトークン",
|
||
"apiTokenHint": "リモートパネルでは、設定 → APIトークン でAPIトークンを確認できます。",
|
||
"regenerate": "トークンを再生成",
|
||
"regenerateConfirm": "再生成すると現在のトークンは無効になります。これを使用しているすべての中央パネルは更新されるまでアクセスできなくなります。続行しますか?",
|
||
"allowPrivateAddress": "プライベートアドレスを許可",
|
||
"allowPrivateAddressHint": "プライベートネットワークまたはVPN上のノードにのみ有効にします。",
|
||
"enable": "有効",
|
||
"status": "ステータス",
|
||
"cpu": "CPU",
|
||
"mem": "メモリ",
|
||
"uptime": "稼働時間",
|
||
"latency": "レイテンシ",
|
||
"lastHeartbeat": "最後のハートビート",
|
||
"xrayVersion": "Xrayバージョン",
|
||
"panelVersion": "パネルのバージョン",
|
||
"actions": "操作",
|
||
"probe": "今すぐプローブ",
|
||
"testConnection": "接続テスト",
|
||
"connectionOk": "接続OK ({ms} ms)",
|
||
"connectionFailed": "接続に失敗しました",
|
||
"never": "なし",
|
||
"justNow": "たった今",
|
||
"deleteConfirmTitle": "ノード「{name}」を削除しますか?",
|
||
"deleteConfirmContent": "ノードの監視を停止します。リモートパネル自体には影響しません。",
|
||
"statusValues": {
|
||
"online": "オンライン",
|
||
"offline": "オフライン",
|
||
"unknown": "不明"
|
||
},
|
||
"toasts": {
|
||
"list": "ノードの読み込みに失敗しました",
|
||
"obtain": "ノードの読み込みに失敗しました",
|
||
"add": "ノードを追加",
|
||
"update": "ノードを更新",
|
||
"delete": "ノードを削除",
|
||
"deleted": "ノードを削除しました",
|
||
"test": "接続テスト",
|
||
"fillRequired": "名前、アドレス、ポート、APIトークンは必須です",
|
||
"probeFailed": "プローブに失敗しました"
|
||
}
|
||
},
|
||
"settings": {
|
||
"title": "パネル設定",
|
||
"save": "保存",
|
||
"infoDesc": "ここでのすべての変更は、保存してパネルを再起動する必要があります",
|
||
"restartPanel": "パネル再起動",
|
||
"restartPanelDesc": "パネルを再起動してもよろしいですか?再起動後にパネルにアクセスできない場合は、サーバーでパネルログを確認してください",
|
||
"restartPanelSuccess": "パネルの再起動に成功しました",
|
||
"actions": "操作",
|
||
"resetDefaultConfig": "デフォルト設定にリセット",
|
||
"panelSettings": "一般",
|
||
"securitySettings": "セキュリティ設定",
|
||
"TGBotSettings": "Telegramボット設定",
|
||
"panelListeningIP": "パネル監視IP",
|
||
"panelListeningIPDesc": "デフォルトではすべてのIPを監視する",
|
||
"panelListeningDomain": "パネル監視ドメイン",
|
||
"panelListeningDomainDesc": "デフォルトで空白の場合、すべてのドメインとIPアドレスを監視する",
|
||
"panelPort": "パネル監視ポート",
|
||
"panelPortDesc": "再起動で有効",
|
||
"publicKeyPath": "パネル証明書公開鍵ファイルパス",
|
||
"publicKeyPathDesc": "'/'で始まる絶対パスを入力",
|
||
"privateKeyPath": "パネル証明書秘密鍵ファイルパス",
|
||
"privateKeyPathDesc": "'/'で始まる絶対パスを入力",
|
||
"panelUrlPath": "パネルURLルートパス",
|
||
"panelUrlPathDesc": "'/'で始まり、'/'で終わる必要があります",
|
||
"pageSize": "ページサイズ",
|
||
"pageSizeDesc": "インバウンドテーブルのページサイズを定義します。0を設定すると無効化されます",
|
||
"remarkModel": "備考モデルと区切り記号",
|
||
"datepicker": "日付ピッカー",
|
||
"datepickerPlaceholder": "日付を選択",
|
||
"datepickerDescription": "日付選択カレンダーで有効期限を指定する",
|
||
"sampleRemark": "備考の例",
|
||
"oldUsername": "旧ユーザー名",
|
||
"currentPassword": "旧パスワード",
|
||
"newUsername": "新しいユーザー名",
|
||
"newPassword": "新しいパスワード",
|
||
"telegramBotEnable": "Telegramボットを有効にする",
|
||
"telegramBotEnableDesc": "Telegramボット機能を有効にする",
|
||
"telegramToken": "Telegramボットトークン",
|
||
"telegramTokenDesc": "'{'@'}BotFather'から取得したTelegramボットトークン",
|
||
"telegramProxy": "SOCKS5プロキシ",
|
||
"telegramProxyDesc": "SOCKS5プロキシを有効にしてTelegramに接続する(ガイドに従って設定を調整)",
|
||
"telegramAPIServer": "Telegram APIサーバー",
|
||
"telegramAPIServerDesc": "使用するTelegram APIサーバー。空白の場合はデフォルトサーバーを使用する",
|
||
"telegramChatId": "管理者チャットID",
|
||
"telegramChatIdDesc": "Telegram管理者チャットID(複数の場合はカンマで区切る){'@'}userinfobotで取得するか、ボットで'/id'コマンドを使用して取得する",
|
||
"telegramNotifyTime": "通知時間",
|
||
"telegramNotifyTimeDesc": "定期的なTelegramボット通知時間を設定する(crontab時間形式を使用)",
|
||
"tgNotifyBackup": "データベースバックアップ",
|
||
"tgNotifyBackupDesc": "レポート付きのデータベースバックアップファイルを送信",
|
||
"tgNotifyLogin": "ログイン通知",
|
||
"tgNotifyLoginDesc": "誰かがパネルにログインしようとしたときに、ユーザー名、IPアドレス、時間を表示する",
|
||
"sessionMaxAge": "セッション期間",
|
||
"sessionMaxAgeDesc": "ログイン状態を保持する期間(単位:分)",
|
||
"expireTimeDiff": "有効期限通知のしきい値",
|
||
"expireTimeDiffDesc": "このしきい値に達した場合、有効期限に関する通知を受け取る(単位:日)",
|
||
"trafficDiff": "トラフィック消耗しきい値",
|
||
"trafficDiffDesc": "このしきい値に達した場合、トラフィック消耗に関する通知を受け取る(単位:GB)",
|
||
"tgNotifyCpu": "CPU負荷通知しきい値",
|
||
"tgNotifyCpuDesc": "CPU負荷がこのしきい値を超えた場合、通知を受け取る(単位:%)",
|
||
"timeZone": "タイムゾーン",
|
||
"timeZoneDesc": "定時タスクはこのタイムゾーンの時間に従って実行される",
|
||
"subSettings": "サブスクリプション設定",
|
||
"subEnable": "サブスクリプションサービスを有効にする",
|
||
"subEnableDesc": "サブスクリプションサービス機能を有効にする",
|
||
"subJsonEnable": "JSON サブスクリプションのエンドポイントを個別に有効/無効にする。",
|
||
"subTitle": "サブスクリプションタイトル",
|
||
"subTitleDesc": "VPNクライアントに表示されるタイトル",
|
||
"subSupportUrl": "サポートURL",
|
||
"subSupportUrlDesc": "VPNクライアントに表示されるテクニカルサポートへのリンク",
|
||
"subProfileUrl": "プロフィールURL",
|
||
"subProfileUrlDesc": "VPNクライアントに表示されるWebサイトへのリンク",
|
||
"subAnnounce": "お知らせ",
|
||
"subAnnounceDesc": "VPNクライアントに表示されるお知らせのテキスト",
|
||
"subEnableRouting": "ルーティングを有効化",
|
||
"subEnableRoutingDesc": "VPNクライアントでルーティングを有効にするためのグローバル設定。(Happのみ)",
|
||
"subRoutingRules": "ルーティングルール",
|
||
"subRoutingRulesDesc": "VPNクライアントのグローバルルーティングルール。(Happのみ)",
|
||
"subListen": "監視IP",
|
||
"subListenDesc": "サブスクリプションサービスが監視するIPアドレス(空白にするとすべてのIPを監視)",
|
||
"subPort": "監視ポート",
|
||
"subPortDesc": "サブスクリプションサービスが監視するポート番号(使用されていないポートである必要があります)",
|
||
"subCertPath": "公開鍵パス",
|
||
"subCertPathDesc": "サブスクリプションサービスで使用する公開鍵ファイルのパス('/'で始まる)",
|
||
"subKeyPath": "秘密鍵パス",
|
||
"subKeyPathDesc": "サブスクリプションサービスで使用する秘密鍵ファイルのパス('/'で始まる)",
|
||
"subPath": "URIパス",
|
||
"subPathDesc": "サブスクリプションサービスで使用するURIパス('/'で始まり、'/'で終わる)",
|
||
"subDomain": "監視ドメイン",
|
||
"subDomainDesc": "サブスクリプションサービスが監視するドメイン(空白にするとすべてのドメインとIPを監視)",
|
||
"subUpdates": "更新間隔",
|
||
"subUpdatesDesc": "クライアントアプリケーションでサブスクリプションURLの更新間隔(単位:時間)",
|
||
"subEncrypt": "エンコード",
|
||
"subEncryptDesc": "サブスクリプションサービスが返す内容をBase64エンコードする",
|
||
"subShowInfo": "利用情報を表示",
|
||
"subShowInfoDesc": "クライアントアプリで残りのトラフィックと日付情報を表示する",
|
||
"subEmailInRemark": "名前にメールを含める",
|
||
"subEmailInRemarkDesc": "サブスクリプションプロファイル名にクライアントのメールアドレスを含めます。",
|
||
"subURI": "リバースプロキシURI",
|
||
"subURIDesc": "プロキシ後ろのサブスクリプションURLのURIパスに使用する",
|
||
"externalTrafficInformEnable": "外部トラフィック情報",
|
||
"externalTrafficInformEnableDesc": "トラフィックの更新ごとに外部 API に通知します。",
|
||
"externalTrafficInformURI": "外部トラフィック通知 URI",
|
||
"externalTrafficInformURIDesc": "トラフィックの更新ごとに外部 API に通知します。",
|
||
"restartXrayOnClientDisable": "自動無効化後に Xray を再起動",
|
||
"restartXrayOnClientDisableDesc": "有効期限切れまたはトラフィック上限でクライアントが自動的に無効化されたとき、Xray を再起動します。",
|
||
"fragment": "フラグメント",
|
||
"fragmentDesc": "TLS helloパケットのフラグメントを有効にする",
|
||
"fragmentSett": "設定",
|
||
"noisesDesc": "Noisesを有効にする",
|
||
"noisesSett": "Noises設定",
|
||
"mux": "マルチプレクサ",
|
||
"muxDesc": "確立されたストリーム内で複数の独立したストリームを伝送する",
|
||
"muxSett": "マルチプレクサ設定",
|
||
"direct": "直接接続",
|
||
"directDesc": "特定の国のドメインまたはIP範囲に直接接続する",
|
||
"notifications": "通知",
|
||
"certs": "証明書",
|
||
"externalTraffic": "外部トラフィック",
|
||
"dateAndTime": "日付と時刻",
|
||
"proxyAndServer": "プロキシとサーバー",
|
||
"intervals": "間隔",
|
||
"information": "情報",
|
||
"language": "言語",
|
||
"telegramBotLanguage": "Telegram Botの言語",
|
||
"security": {
|
||
"admin": "管理者の資格情報",
|
||
"twoFactor": "二段階認証",
|
||
"twoFactorEnable": "2FAを有効化",
|
||
"twoFactorEnableDesc": "セキュリティを強化するために追加の認証層を追加します。",
|
||
"twoFactorModalSetTitle": "二段階認証を有効にする",
|
||
"twoFactorModalDeleteTitle": "二段階認証を無効にする",
|
||
"twoFactorModalSteps": "二段階認証を設定するには、次の手順を実行してください:",
|
||
"twoFactorModalFirstStep": "1. 認証アプリでこのQRコードをスキャンするか、QRコード近くのトークンをコピーしてアプリに貼り付けます",
|
||
"twoFactorModalSecondStep": "2. アプリからコードを入力してください",
|
||
"twoFactorModalRemoveStep": "二段階認証を削除するには、アプリからコードを入力してください。",
|
||
"twoFactorModalChangeCredentialsTitle": "認証情報の変更",
|
||
"twoFactorModalChangeCredentialsStep": "管理者の認証情報を変更するには、アプリケーションからコードを入力してください。",
|
||
"twoFactorModalSetSuccess": "二要素認証が正常に設定されました",
|
||
"twoFactorModalDeleteSuccess": "二要素認証が正常に削除されました",
|
||
"twoFactorModalError": "コードが間違っています",
|
||
"show": "表示",
|
||
"hide": "非表示",
|
||
"apiTokenNew": "新規トークン",
|
||
"apiTokenName": "名前",
|
||
"apiTokenNamePlaceholder": "例: central-panel-a",
|
||
"apiTokenNameRequired": "名前は必須です",
|
||
"apiTokenEmpty": "トークンがまだありません — ボットやリモートパネルを認証するために作成してください。",
|
||
"apiTokenDeleteWarning": "このトークンを使用しているクライアントは直ちに認証できなくなります。"
|
||
},
|
||
"toasts": {
|
||
"modifySettings": "パラメーターが変更されました。",
|
||
"getSettings": "パラメーターの取得中にエラーが発生しました",
|
||
"modifyUserError": "管理者認証情報の変更中にエラーが発生しました。",
|
||
"modifyUser": "管理者の認証情報を正常に変更しました。",
|
||
"originalUserPassIncorrect": "旧ユーザー名または旧パスワードが間違っています",
|
||
"userPassMustBeNotEmpty": "新しいユーザー名と新しいパスワードは空にできません",
|
||
"getOutboundTrafficError": "送信トラフィックの取得エラー",
|
||
"resetOutboundTrafficError": "送信トラフィックのリセットエラー"
|
||
}
|
||
},
|
||
"xray": {
|
||
"title": "Xray 設定",
|
||
"save": "保存",
|
||
"restart": "Xray 再起動",
|
||
"restartSuccess": "Xrayの再起動に成功しました",
|
||
"stopSuccess": "Xrayが正常に停止しました",
|
||
"restartError": "Xrayの再起動中にエラーが発生しました。",
|
||
"stopError": "Xrayの停止中にエラーが発生しました。",
|
||
"basicTemplate": "基本設定",
|
||
"advancedTemplate": "高度な設定",
|
||
"generalConfigs": "一般設定",
|
||
"generalConfigsDesc": "これらのオプションは一般設定を決定します",
|
||
"logConfigs": "ログ",
|
||
"logConfigsDesc": "ログはサーバーのパフォーマンスに影響を与える可能性があるため、必要な場合にのみ有効にすることをお勧めします",
|
||
"blockConfigsDesc": "これらのオプションは、特定のプロトコルやウェブサイトへのユーザー接続をブロックします",
|
||
"basicRouting": "基本ルーティング",
|
||
"blockConnectionsConfigsDesc": "これらのオプションにより、特定のリクエスト元の国に基づいてトラフィックをブロックします。",
|
||
"directConnectionsConfigsDesc": "直接接続により、特定のトラフィックが他のサーバーを経由しないようにします。",
|
||
"blockips": "IPをブロック",
|
||
"blockdomains": "ドメインをブロック",
|
||
"directips": "直接IP",
|
||
"directdomains": "直接ドメイン",
|
||
"ipv4Routing": "IPv4 ルーティング",
|
||
"ipv4RoutingDesc": "このオプションはIPv4のみを介してターゲットドメインへルーティングします",
|
||
"warpRouting": "WARP ルーティング",
|
||
"warpRoutingDesc": "注意:これらのオプションを使用する前に、パネルのGitHubの手順に従って、サーバーにsocks5プロキシモードでWARPをインストールしてください。WARPはCloudflareサーバー経由でトラフィックをウェブサイトにルーティングします。",
|
||
"nordRouting": "NordVPN ルーティング",
|
||
"nordRoutingDesc": "これらのオプションはNordVPN経由で特定の宛先にトラフィックをルーティングします。",
|
||
"Template": "高度なXray設定テンプレート",
|
||
"TemplateDesc": "最終的なXray設定ファイルはこのテンプレートに基づいて生成されます",
|
||
"FreedomStrategy": "Freedom プロトコル戦略",
|
||
"FreedomStrategyDesc": "Freedomプロトコル内のネットワークの出力戦略を設定する",
|
||
"RoutingStrategy": "ルーティングドメイン戦略設定",
|
||
"RoutingStrategyDesc": "DNS解決の全体的なルーティング戦略を設定する",
|
||
"outboundTestUrl": "アウトバウンドテスト URL",
|
||
"outboundTestUrlDesc": "アウトバウンド接続テストに使用する URL。既定値",
|
||
"Torrent": "BitTorrent プロトコルをブロック",
|
||
"Inbounds": "インバウンドルール",
|
||
"InboundsDesc": "特定のクライアントからのトラフィックを受け入れる",
|
||
"Outbounds": "アウトバウンドルール",
|
||
"Balancers": "負荷分散",
|
||
"OutboundsDesc": "アウトバウンドトラフィックの送信方法を設定する",
|
||
"Routings": "ルーティングルール",
|
||
"RoutingsDesc": "各ルールの優先順位が重要です",
|
||
"completeTemplate": "すべて",
|
||
"logLevel": "ログレベル",
|
||
"logLevelDesc": "エラーログのレベルを指定し、記録する情報を示します",
|
||
"accessLog": "アクセスログ",
|
||
"accessLogDesc": "アクセスログのファイルパス。特殊値 'none' はアクセスログを無効にします",
|
||
"errorLog": "エラーログ",
|
||
"errorLogDesc": "エラーログのファイルパス。特殊値 'none' はエラーログを無効にします",
|
||
"dnsLog": "DNS ログ",
|
||
"dnsLogDesc": "DNSクエリのログを有効にするかどうか",
|
||
"maskAddress": "アドレスをマスク",
|
||
"maskAddressDesc": "IPアドレスをマスクし、有効にするとログに表示されるIPアドレスを自動的に置き換えます",
|
||
"statistics": "統計",
|
||
"statsInboundUplink": "インバウンドアップロード統計",
|
||
"statsInboundUplinkDesc": "すべてのインバウンドプロキシのアップストリームトラフィックの統計収集を有効にします。",
|
||
"statsInboundDownlink": "インバウンドダウンロード統計",
|
||
"statsInboundDownlinkDesc": "すべてのインバウンドプロキシのダウンストリームトラフィックの統計収集を有効にします。",
|
||
"statsOutboundUplink": "アウトバウンドアップロード統計",
|
||
"statsOutboundUplinkDesc": "すべてのアウトバウンドプロキシのアップストリームトラフィックの統計収集を有効にします。",
|
||
"statsOutboundDownlink": "アウトバウンドダウンロード統計",
|
||
"statsOutboundDownlinkDesc": "すべてのアウトバウンドプロキシのダウンストリームトラフィックの統計収集を有効にします。",
|
||
"rules": {
|
||
"first": "最初",
|
||
"last": "最後",
|
||
"up": "上へ",
|
||
"down": "下へ",
|
||
"source": "ソース",
|
||
"dest": "宛先アドレス",
|
||
"inbound": "インバウンド",
|
||
"outbound": "アウトバウンド",
|
||
"balancer": "負荷分散",
|
||
"info": "情報",
|
||
"add": "ルール追加",
|
||
"edit": "ルール編集",
|
||
"useComma": "カンマ区切りの項目"
|
||
},
|
||
"outbound": {
|
||
"addOutbound": "アウトバウンド追加",
|
||
"addReverse": "リバース追加",
|
||
"editOutbound": "アウトバウンド編集",
|
||
"editReverse": "リバース編集",
|
||
"reverseTag": "リバースタグ",
|
||
"reverseTagDesc": "VLESSシンプルリバースプロキシのアウトバウンドタグ。無効にするには空欄にしてください。",
|
||
"reverseTagPlaceholder": "アウトバウンドタグ(空欄で無効)",
|
||
"tag": "タグ",
|
||
"tagDesc": "一意のタグ",
|
||
"address": "アドレス",
|
||
"reverse": "リバース",
|
||
"domain": "ドメイン",
|
||
"type": "タイプ",
|
||
"bridge": "ブリッジ",
|
||
"portal": "ポータル",
|
||
"link": "リンク",
|
||
"intercon": "インターコネクション",
|
||
"settings": "設定",
|
||
"accountInfo": "アカウント情報",
|
||
"outboundStatus": "アウトバウンドステータス",
|
||
"sendThrough": "送信経路",
|
||
"test": "テスト",
|
||
"testResult": "テスト結果",
|
||
"testing": "接続をテスト中...",
|
||
"testSuccess": "テスト成功",
|
||
"testFailed": "テスト失敗",
|
||
"testError": "アウトバウンドのテストに失敗しました",
|
||
"nordvpn": "NordVPN",
|
||
"accessToken": "アクセストークン",
|
||
"country": "国",
|
||
"server": "サーバー",
|
||
"city": "都市",
|
||
"allCities": "すべての都市",
|
||
"privateKey": "秘密鍵",
|
||
"load": "負荷"
|
||
},
|
||
"balancer": {
|
||
"addBalancer": "負荷分散追加",
|
||
"editBalancer": "負荷分散編集",
|
||
"balancerStrategy": "戦略",
|
||
"balancerSelectors": "セレクター",
|
||
"tag": "タグ",
|
||
"tagDesc": "一意のタグ",
|
||
"balancerDesc": "balancerTagとoutboundTagは同時に使用できません。同時に使用された場合、outboundTagのみが有効になります。"
|
||
},
|
||
"wireguard": {
|
||
"secretKey": "シークレットキー",
|
||
"publicKey": "公開鍵",
|
||
"allowedIPs": "許可されたIP",
|
||
"endpoint": "エンドポイント",
|
||
"psk": "共有キー",
|
||
"domainStrategy": "ドメイン戦略"
|
||
},
|
||
"tun": {
|
||
"nameDesc": "TUN インターフェースの名前。デフォルトは 'xray0' です",
|
||
"mtuDesc": "最大伝送単位。データパケットの最大サイズ。デフォルトは 1500 です",
|
||
"userLevel": "ユーザーレベル",
|
||
"userLevelDesc": "このインバウンドを通じて確立されたすべての接続は、このユーザーレベルを使用します。デフォルトは 0 です"
|
||
},
|
||
"dns": {
|
||
"enable": "DNSを有効にする",
|
||
"enableDesc": "組み込みDNSサーバーを有効にする",
|
||
"tag": "DNSインバウンドタグ",
|
||
"tagDesc": "このタグはルーティングルールでインバウンドタグとして使用できます",
|
||
"clientIp": "クライアントIP",
|
||
"clientIpDesc": "DNSクエリ中に指定されたIPの位置をサーバーに通知するために使用されます",
|
||
"disableCache": "キャッシュを無効にする",
|
||
"disableCacheDesc": "DNSキャッシュを無効にします",
|
||
"disableFallback": "フォールバックを無効にする",
|
||
"disableFallbackDesc": "フォールバックDNSクエリを無効にします",
|
||
"disableFallbackIfMatch": "一致した場合にフォールバックを無効にする",
|
||
"disableFallbackIfMatchDesc": "DNSサーバーの一致するドメインリストにヒットした場合、フォールバックDNSクエリを無効にします",
|
||
"enableParallelQuery": "並列クエリを有効にする",
|
||
"enableParallelQueryDesc": "複数のサーバーへの並列DNSクエリを有効にして、より高速な解決を実現",
|
||
"strategy": "クエリ戦略",
|
||
"strategyDesc": "ドメイン名解決の全体的な戦略",
|
||
"add": "サーバー追加",
|
||
"edit": "サーバー編集",
|
||
"domains": "ドメイン",
|
||
"expectIPs": "期待されるIP",
|
||
"unexpectIPs": "予期しないIP",
|
||
"useSystemHosts": "システムのHostsを使用",
|
||
"useSystemHostsDesc": "インストール済みシステムのhostsファイルを使用する",
|
||
"serveStale": "期限切れキャッシュを使用",
|
||
"serveStaleDesc": "バックグラウンドで更新中に期限切れキャッシュ結果を返す",
|
||
"serveExpiredTTL": "期限切れTTL",
|
||
"serveExpiredTTLDesc": "期限切れキャッシュエントリの有効期間(秒)。0 = 無期限",
|
||
"timeoutMs": "タイムアウト (ms)",
|
||
"skipFallback": "フォールバックをスキップ",
|
||
"finalQuery": "最終クエリ",
|
||
"hosts": "Hosts",
|
||
"hostsAdd": "Host を追加",
|
||
"hostsEmpty": "Host が定義されていません",
|
||
"hostsDomain": "ドメイン (例: domain:example.com)",
|
||
"hostsValues": "IP またはドメイン — 入力して Enter",
|
||
"usePreset": "テンプレートを使用",
|
||
"dnsPresetTitle": "DNSテンプレート",
|
||
"dnsPresetFamily": "ファミリー",
|
||
"clearAll": "すべて削除",
|
||
"clearAllTitle": "すべての DNS サーバを削除しますか?",
|
||
"clearAllConfirm": "リストからすべての DNS サーバが削除されます。この操作は元に戻せません。"
|
||
},
|
||
"fakedns": {
|
||
"add": "フェイクDNS追加",
|
||
"edit": "フェイクDNS編集",
|
||
"ipPool": "IPプールサブネット",
|
||
"poolSize": "プールサイズ"
|
||
}
|
||
}
|
||
},
|
||
"tgbot": {
|
||
"keyboardClosed": "❌ キーボードを閉じました!",
|
||
"noResult": "❗ 結果がありません!",
|
||
"noQuery": "❌ クエリが見つかりません!コマンドを再利用してください!",
|
||
"wentWrong": "❌ 何かがうまくいかなかった!",
|
||
"noIpRecord": "❗ IPレコードがありません!",
|
||
"noInbounds": "❗ インバウンドが見つかりません!",
|
||
"unlimited": "♾ 無制限(リセット)",
|
||
"add": "追加",
|
||
"month": "月",
|
||
"months": "ヶ月",
|
||
"day": "日",
|
||
"days": "日間",
|
||
"hours": "時間",
|
||
"minutes": "分",
|
||
"unknown": "不明",
|
||
"inbounds": "インバウンド",
|
||
"clients": "クライアント",
|
||
"offline": "🔴 オフライン",
|
||
"online": "🟢 オンライン",
|
||
"commands": {
|
||
"unknown": "❗ 不明なコマンド",
|
||
"pleaseChoose": "👇 選択してください:\r\n",
|
||
"help": "🤖 このボットをご利用いただきありがとうございます!サーバーから特定のデータを提供し、必要な変更を行うことができます。\r\n\r\n",
|
||
"start": "👋 こんにちは、<i>{{ .Firstname }}</i>。\r\n",
|
||
"welcome": "🤖 <b>{{ .Hostname }}</b> 管理ボットへようこそ。\r\n",
|
||
"status": "✅ ボットは正常に動作しています!",
|
||
"usage": "❗ 検索するテキストを入力してください!",
|
||
"getID": "🆔 あなたのIDは:<code>{{ .ID }}</code>",
|
||
"helpAdminCommands": "Xray Coreを再起動するには:\r\n<code>/restart</code>\r\n\r\nクライアントの電子メールを検索するには:\r\n<code>/usage [電子メール]</code>\r\n\r\nインバウンド(クライアントの統計情報を含む)を検索するには:\r\n<code>/inbound [備考]</code>\r\n\r\nTelegramチャットID:\r\n<code>/id</code>",
|
||
"helpClientCommands": "統計情報を検索するには、次のコマンドを使用してください:\r\n<code>/usage [電子メール]</code>\r\n\r\nTelegramチャットID:\r\n<code>/id</code>",
|
||
"restartUsage": "\r\n\r\n<code>/restart</code>",
|
||
"restartSuccess": "✅ 操作成功!",
|
||
"restartFailed": "❗ 操作エラー。\r\n\r\n<code>エラー: {{ .Error }}</code>",
|
||
"xrayNotRunning": "❗ Xray Core は動作していません。",
|
||
"startDesc": "メインメニューを表示",
|
||
"helpDesc": "ボットのヘルプ",
|
||
"statusDesc": "ボットの状態を確認",
|
||
"idDesc": "Telegram IDを表示"
|
||
},
|
||
"messages": {
|
||
"cpuThreshold": "🔴 CPU使用率は{{ .Percent }}%、しきい値{{ .Threshold }}%を超えました",
|
||
"selectUserFailed": "❌ ユーザーの選択に失敗しました!",
|
||
"userSaved": "✅ Telegramユーザーが保存されました。",
|
||
"loginSuccess": "✅ パネルに正常にログインしました。\r\n",
|
||
"loginFailed": "❗️ パネルのログインに失敗しました。\r\n",
|
||
"2faFailed": "2FAエラー",
|
||
"report": "🕰 定期報告:{{ .RunTime }}\r\n",
|
||
"datetime": "⏰ 日時:{{ .DateTime }}\r\n",
|
||
"hostname": "💻 ホスト名:{{ .Hostname }}\r\n",
|
||
"version": "🚀 X-UI バージョン:{{ .Version }}\r\n",
|
||
"xrayVersion": "📡 Xray バージョン: {{ .XrayVersion }}\r\n",
|
||
"ipv6": "🌐 IPv6:{{ .IPv6 }}\r\n",
|
||
"ipv4": "🌐 IPv4:{{ .IPv4 }}\r\n",
|
||
"ip": "🌐 IP:{{ .IP }}\r\n",
|
||
"ips": "🔢 IPアドレス:\r\n{{ .IPs }}\r\n",
|
||
"serverUpTime": "⏳ サーバー稼働時間:{{ .UpTime }} {{ .Unit }}\r\n",
|
||
"serverLoad": "📈 サーバー負荷:{{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n",
|
||
"serverMemory": "📋 サーバーメモリ:{{ .Current }}/{{ .Total }}\r\n",
|
||
"tcpCount": "🔹 TCP接続数:{{ .Count }}\r\n",
|
||
"udpCount": "🔸 UDP接続数:{{ .Count }}\r\n",
|
||
"traffic": "🚦 トラフィック:{{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n",
|
||
"xrayStatus": "ℹ️ Xrayステータス:{{ .State }}\r\n",
|
||
"username": "👤 ユーザー名:{{ .Username }}\r\n",
|
||
"reason": "❗️ 理由:{{ .Reason }}\r\n",
|
||
"time": "⏰ 時間:{{ .Time }}\r\n",
|
||
"inbound": "📍 インバウンド:{{ .Remark }}\r\n",
|
||
"port": "🔌 ポート:{{ .Port }}\r\n",
|
||
"expire": "📅 有効期限:{{ .Time }}\r\n",
|
||
"expireIn": "📅 残り時間:{{ .Time }}\r\n",
|
||
"active": "💡 有効:{{ .Enable }}\r\n",
|
||
"enabled": "🚨 有効化済み:{{ .Enable }}\r\n",
|
||
"online": "🌐 接続ステータス:{{ .Status }}\r\n",
|
||
"lastOnline": "🔙 最終オンライン: {{ .Time }}\r\n",
|
||
"email": "📧 メール:{{ .Email }}\r\n",
|
||
"upload": "🔼 アップロード↑:{{ .Upload }}\r\n",
|
||
"download": "🔽 ダウンロード↓:{{ .Download }}\r\n",
|
||
"total": "📊 合計:{{ .UpDown }} / {{ .Total }}\r\n",
|
||
"TGUser": "👤 Telegramユーザー:{{ .TelegramID }}\r\n",
|
||
"exhaustedMsg": "🚨 消耗済みの {{ .Type }}:\r\n",
|
||
"exhaustedCount": "🚨 消耗済みの {{ .Type }} 数量:\r\n",
|
||
"onlinesCount": "🌐 オンラインクライアント:{{ .Count }}\r\n",
|
||
"disabled": "🛑 無効化:{{ .Disabled }}\r\n",
|
||
"depleteSoon": "🔜 間もなく消耗:{{ .Deplete }}\r\n\r\n",
|
||
"backupTime": "🗄 バックアップ時間:{{ .Time }}\r\n",
|
||
"refreshedOn": "\r\n📋🔄 更新時間:{{ .Time }}\r\n\r\n",
|
||
"yes": "✅ はい",
|
||
"no": "❌ いいえ",
|
||
"received_id": "🔑📥 IDが更新されました。",
|
||
"received_password": "🔑📥 パスワードが更新されました。",
|
||
"received_email": "📧📥 メールが更新されました。",
|
||
"received_comment": "💬📥 コメントが更新されました。",
|
||
"id_prompt": "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。",
|
||
"pass_prompt": "🔑 デフォルトパスワード: {{ .ClientPassword }}\n\nパスワードを入力してください。",
|
||
"email_prompt": "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールを入力してください。",
|
||
"comment_prompt": "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。",
|
||
"inbound_client_data_id": "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n📊 トラフィック: {{ .ClientTraffic }}\n📅 有効期限: {{ .ClientExp }}\n🌐 IP制限: {{ .IpLimit }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐこのクライアントをインバウンドに追加できます!",
|
||
"inbound_client_data_pass": "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n📊 トラフィック: {{ .ClientTraffic }}\n📅 有効期限: {{ .ClientExp }}\n🌐 IP制限: {{ .IpLimit }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐこのクライアントをインバウンドに追加できます!",
|
||
"cancel": "❌ プロセスがキャンセルされました!\n\nいつでも /start で再開できます。 🔄",
|
||
"error_add_client": "⚠️ エラー:\n\n {{ .error }}",
|
||
"using_default_value": "わかりました、デフォルト値を使用します。 😊",
|
||
"incorrect_input": "入力が無効です。\nフレーズはスペースなしで続けて入力してください。\n正しい例: aaaaaa\n間違った例: aaa aaa 🚫",
|
||
"AreYouSure": "本当にいいですか?🤔",
|
||
"SuccessResetTraffic": "📧 メール: {{ .ClientEmail }}\n🏁 結果: ✅ 成功",
|
||
"FailedResetTraffic": "📧 メール: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ エラー: [ {{ .ErrorMessage }} ]",
|
||
"FinishProcess": "🔚 すべてのクライアントのトラフィックリセットが完了しました。"
|
||
},
|
||
"buttons": {
|
||
"closeKeyboard": "❌ キーボードを閉じる",
|
||
"cancel": "❌ キャンセル",
|
||
"cancelReset": "❌ リセットをキャンセル",
|
||
"cancelIpLimit": "❌ IP制限をキャンセル",
|
||
"confirmResetTraffic": "✅ トラフィックをリセットしますか?",
|
||
"confirmClearIps": "✅ IPをクリアしますか?",
|
||
"confirmRemoveTGUser": "✅ Telegramユーザーを削除しますか?",
|
||
"confirmToggle": "✅ ユーザーを有効/無効にしますか?",
|
||
"dbBackup": "データベースバックアップを取得",
|
||
"serverUsage": "サーバーの使用状況",
|
||
"getInbounds": "インバウンド情報を取得",
|
||
"depleteSoon": "間もなく消耗",
|
||
"clientUsage": "使用状況を取得",
|
||
"onlines": "オンラインクライアント",
|
||
"commands": "コマンド",
|
||
"refresh": "🔄 更新",
|
||
"clearIPs": "❌ IPをクリア",
|
||
"removeTGUser": "❌ Telegramユーザーを削除",
|
||
"selectTGUser": "👤 Telegramユーザーを選択",
|
||
"selectOneTGUser": "👤 1人のTelegramユーザーを選択:",
|
||
"resetTraffic": "📈 トラフィックをリセット",
|
||
"resetExpire": "📅 有効期限を変更",
|
||
"ipLog": "🔢 IPログ",
|
||
"ipLimit": "🔢 IP制限",
|
||
"setTGUser": "👤 Telegramユーザーを設定",
|
||
"toggle": "🔘 有効/無効",
|
||
"custom": "🔢 カスタム",
|
||
"confirmNumber": "✅ 確認: {{ .Num }}",
|
||
"confirmNumberAdd": "✅ 追加を確認:{{ .Num }}",
|
||
"limitTraffic": "🚧 トラフィック制限",
|
||
"getBanLogs": "禁止ログ",
|
||
"allClients": "すべてのクライアント",
|
||
"addClient": "クライアントを追加",
|
||
"submitDisable": "無効として送信 ☑️",
|
||
"submitEnable": "有効として送信 ✅",
|
||
"use_default": "🏷️ デフォルトを使用",
|
||
"change_id": "⚙️🔑 ID",
|
||
"change_password": "⚙️🔑 パスワード",
|
||
"change_email": "⚙️📧 メールアドレス",
|
||
"change_comment": "⚙️💬 コメント",
|
||
"change_flow": "⚙️🚦 フロー",
|
||
"ResetAllTraffics": "すべてのトラフィックをリセット",
|
||
"SortedTrafficUsageReport": "ソートされたトラフィック使用レポート"
|
||
},
|
||
"answers": {
|
||
"successfulOperation": "✅ 成功!",
|
||
"errorOperation": "❗ 操作エラー。",
|
||
"getInboundsFailed": "❌ インバウンド情報の取得に失敗しました。",
|
||
"getClientsFailed": "❌ クライアントの取得に失敗しました。",
|
||
"canceled": "❌ {{ .Email }}:操作がキャンセルされました。",
|
||
"clientRefreshSuccess": "✅ {{ .Email }}:クライアントが正常に更新されました。",
|
||
"IpRefreshSuccess": "✅ {{ .Email }}:IPが正常に更新されました。",
|
||
"TGIdRefreshSuccess": "✅ {{ .Email }}:クライアントのTelegramユーザーが正常に更新されました。",
|
||
"resetTrafficSuccess": "✅ {{ .Email }}:トラフィックが正常にリセットされました。",
|
||
"setTrafficLimitSuccess": "✅ {{ .Email }}:トラフィック制限が正常に保存されました。",
|
||
"expireResetSuccess": "✅ {{ .Email }}:有効期限の日数が正常にリセットされました。",
|
||
"resetIpSuccess": "✅ {{ .Email }}:IP制限数が正常に保存されました:{{ .Count }}。",
|
||
"clearIpSuccess": "✅ {{ .Email }}:IPが正常にクリアされました。",
|
||
"getIpLog": "✅ {{ .Email }}:IPログの取得。",
|
||
"getUserInfo": "✅ {{ .Email }}:Telegramユーザー情報の取得。",
|
||
"removedTGUserSuccess": "✅ {{ .Email }}:Telegramユーザーが正常に削除されました。",
|
||
"enableSuccess": "✅ {{ .Email }}:正常に有効化されました。",
|
||
"disableSuccess": "✅ {{ .Email }}:正常に無効化されました。",
|
||
"askToAddUserId": "設定が見つかりませんでした!\r\n管理者に問い合わせて、設定にTelegramユーザーのChatIDを使用してください。\r\n\r\nあなたのユーザーChatID:<code>{{ .TgUserID }}</code>",
|
||
"chooseClient": "インバウンド {{ .Inbound }} のクライアントを選択",
|
||
"chooseInbound": "インバウンドを選択"
|
||
}
|
||
}
|
||
} |