351 lines
14 KiB
Go
351 lines
14 KiB
Go
export default {
|
||
// МаршрутЛокализация
|
||
route: {
|
||
dashboard: "Dashboard",
|
||
peer: "Peers",
|
||
peerList: "Peer Management",
|
||
hysteria: "Hysteria",
|
||
hysteriaList: "Hysteria Manage",
|
||
config: "System",
|
||
configList: "System Config",
|
||
monitor: "Monitor",
|
||
monitorSystem: "System Monitor",
|
||
log: "Log",
|
||
logSystem: "System Log",
|
||
logHysteria: "Hysteria Log",
|
||
},
|
||
// Локализация страницы входа
|
||
login: {
|
||
title: "HY2XS admin",
|
||
username: "Username",
|
||
password: "Password",
|
||
login: "Login",
|
||
capsLockOn: "Caps lock is On",
|
||
},
|
||
// Требования к учётным данным администратора: общие для формы входа и формы
|
||
// смены пароля. См. комментарий в ru.ts.
|
||
credentials: {
|
||
usernameFormat: "Username: {min} to {max} characters from {charset}",
|
||
passwordFormat:
|
||
"Password: {min} to {max} characters and at most {maxBytes} UTF-8 bytes, no control characters or U+FEFF",
|
||
},
|
||
dashboard: {
|
||
stale: "Dashboard data is stale. Retrying automatically...",
|
||
topPeers24h: "Top peers (24h)",
|
||
topPeersRange: "Top peers ({range})",
|
||
refreshFailed: "Failed to refresh dashboard data",
|
||
cpu: "CPU",
|
||
ram: "RAM",
|
||
disk: "Disk",
|
||
peers: "Peers",
|
||
onlinePeers: "Online peers",
|
||
onlineDevices: "Online devices",
|
||
todayDownload: "Today download",
|
||
todayUpload: "Today upload",
|
||
trafficChart: "Traffic & System Timeseries",
|
||
trafficSeriesChart: "Traffic: download/upload",
|
||
noTrafficData: "No traffic data for the selected period",
|
||
systemSeriesChart: "System: CPU/RAM",
|
||
download: "Download",
|
||
upload: "Upload",
|
||
total: "Total",
|
||
serviceStateLabel: "Hysteria service",
|
||
serviceState: {
|
||
active: "Running",
|
||
inactive: "Stopped",
|
||
unknown: "State unknown",
|
||
},
|
||
trafficApiLabel: "Traffic Stats API",
|
||
trafficApiReachable: "Reachable",
|
||
trafficApiUnreachable: "Unreachable",
|
||
security: {
|
||
hysteriaStopped: "Hysteria2 is stopped",
|
||
hysteriaStateUnknown: "Hysteria2 service state is unknown: systemd did not answer",
|
||
trafficApiUnavailable: "Traffic API is unavailable",
|
||
},
|
||
error: {
|
||
trafficApiUnavailable: "Traffic API is unavailable",
|
||
collectorStale: "Collector data is stale",
|
||
},
|
||
},
|
||
admin: {
|
||
changePasswordTitle: "Change password",
|
||
oldPassword: "Old password",
|
||
newPassword: "New password",
|
||
forcePasswordChangeNotice:
|
||
"You must change your password before continuing.",
|
||
changedSuccess: "Password updated",
|
||
},
|
||
// Локализация навигационной панели
|
||
navbar: {
|
||
logout: "Logout",
|
||
},
|
||
common: {
|
||
id: "ID",
|
||
createTime: "Create Time",
|
||
operate: "Operate",
|
||
edit: "Edit",
|
||
delete: "Delete",
|
||
deleted: "Status",
|
||
all: "All",
|
||
enable: "Enable",
|
||
disable: "Disable",
|
||
search: "Search",
|
||
reset: "Reset",
|
||
add: "Add",
|
||
confirm: "Confirm",
|
||
cancel: "Cancel",
|
||
close: "Close",
|
||
copySuccess: "Copy successful",
|
||
nodeUrl: "Node URL",
|
||
nodeQrCode: "Node QR Code",
|
||
resetTraffic: "Reset traffic",
|
||
import: "Import",
|
||
export: "Export",
|
||
save: "Save",
|
||
update: "Update",
|
||
downloadSuccess: "Download successful",
|
||
// `wait`, `enableSuccess` and `disableSuccess` are gone together with the
|
||
// operations the panel does not have: starting, stopping and changing the
|
||
// version of Hysteria. That lifecycle belongs to systemd and the orchestrator.
|
||
success: "Success",
|
||
refresh: "Refresh",
|
||
yes: "Yes",
|
||
no: "No",
|
||
securityRisk: "Security Risks",
|
||
required: "Required",
|
||
warning: "Warning",
|
||
fileFormatUnsupported: "File format not supported",
|
||
fileTooLarge: "The file is too big, less than 2 MB",
|
||
weekLater: "A week later",
|
||
monthLater: "A month later",
|
||
yearLater: "A year later",
|
||
hourLater: "A hour later",
|
||
dayLater: "A day later",
|
||
deleteConfirm: "Are you sure to delete peer \u300c{username}\u300d?",
|
||
resetTrafficConfirm: "Are you sure to reset peer traffic?",
|
||
invalid: "Invalid value",
|
||
switchLanguageSuccess: "Language switched successfully",
|
||
logoutConfirm: "Are you sure you want to log out?",
|
||
sessionExpired: "Your session has expired. Sign in again to continue.",
|
||
signInRequired: "Signing in is required.",
|
||
signIn: "Sign in",
|
||
systemError: "System error",
|
||
networkError: "The server is not responding. Check the connection.",
|
||
},
|
||
error: {
|
||
field: {
|
||
name: "Peer name",
|
||
secret: "Secret",
|
||
remark: "Remark",
|
||
quotaBytes: "Quota",
|
||
expiresAt: "Expiry",
|
||
maxDevices: "Max devices",
|
||
disabled: "State",
|
||
bannedUntil: "Banned until",
|
||
file: "File",
|
||
id: "Identifier",
|
||
username: "Username",
|
||
pass: "Password",
|
||
oldPassword: "Old password",
|
||
newPassword: "New password",
|
||
key: "Setting key",
|
||
value: "Setting value",
|
||
numLine: "Line count",
|
||
pageNum: "Page number",
|
||
pageSize: "Page size",
|
||
},
|
||
code: {
|
||
required: "“{field}”: required",
|
||
min: "“{field}”: must not be less than {min}",
|
||
max: "“{field}”: must not be greater than {max}",
|
||
min_length: "“{field}”: at least {min} characters",
|
||
max_length: "“{field}”: at most {max} characters",
|
||
len: "“{field}”: length must be exactly {len}",
|
||
oneof: "“{field}”: allowed values are {values}",
|
||
gt: "“{field}”: must be greater than {gt}",
|
||
peer_name:
|
||
"“{field}”: {min} to {max} characters from {charset}. Spaces, non-latin letters and / : ; . are not allowed",
|
||
credential_format: "“{field}”: {min} to {max} characters from {charset}",
|
||
admin_password_format:
|
||
"“{field}”: {min} to {max} characters and at most {maxBytes} UTF-8 bytes, no control characters or U+FEFF",
|
||
rule_violated: "“{field}”: value is not acceptable",
|
||
validation_failed: "Validation failed",
|
||
body_invalid:
|
||
"Request could not be parsed: check field formats and types",
|
||
peer_name_taken: "A peer with this name already exists",
|
||
peer_name_reserved: "This name is reserved for the installer peer",
|
||
peer_bootstrap_identity_locked:
|
||
"The installer peer's name and secret are mirrored in a file on the server and cannot be changed from the panel. Delete the bootstrap peer entirely if it is no longer needed.",
|
||
invalid_credentials: "Wrong username or password",
|
||
// The phrase must open with what has ALREADY been applied, otherwise it
|
||
// reads as "the operation failed" and the operator repeats an action
|
||
// that in fact went through.
|
||
//
|
||
// It also names no specific operation. This code is reported by
|
||
// disabling a peer, a temporary ban, secret rotation, quota and expiry
|
||
// reductions, a lower device limit, a batch import and peer deletion;
|
||
// the previous "new connections for this peer are now refused" held only
|
||
// for the first case and is meaningless for a deleted peer.
|
||
peer_disconnect_failed:
|
||
"The changes were saved, but the related active sessions could not be terminated: the Hysteria Traffic Stats API is unreachable. Established connections may keep working until the client reconnects. Check the hysteria-server service and retry.",
|
||
import_file_extension: "Import accepts .json files only",
|
||
unauthorized: "Signing in is required",
|
||
session_expired: "Session expired",
|
||
token_invalid: "Session is not valid",
|
||
account_disabled: "Account is disabled",
|
||
},
|
||
},
|
||
sidebar: {
|
||
developedBy: "Made at {brand}",
|
||
},
|
||
info: {
|
||
expireTime: "y-M-d H:m:s",
|
||
greeting1: "The cool and fresh air awakens your energy for the day🌅!",
|
||
greeting2: "Good morning,",
|
||
greeting3: "Good afternoon,",
|
||
greeting4: "Good evening,",
|
||
greeting5:
|
||
"I want to be a shooting star, cutting through the darkness, just to illuminate your dreams, good night🌛!",
|
||
},
|
||
peer: {
|
||
name: "Peer",
|
||
remark: "Remark",
|
||
secret: "Secret",
|
||
form: {
|
||
namePlaceholder: "client-01",
|
||
// The character set is stated as service.IsValidPeerName accepts it. The
|
||
// previous wording described the rule that was in force before EX-03.
|
||
nameHint:
|
||
"Peer identifier: 6 to 32 characters — latin letters, digits and !@#$%^&*()_+-=. The name becomes part of the auto-generated secret and is shown to the client as the profile name.",
|
||
remarkPlaceholder: "laptop",
|
||
remarkHint: "Optional operator note. It is never shown to the client.",
|
||
secretPlaceholder: "leave empty to generate one",
|
||
secretHint:
|
||
"Client connection password. Leave empty to generate one automatically. If set manually: 6 to 128 characters.",
|
||
quotaHint: "Traffic limit in bytes. Use -1 for unlimited.",
|
||
},
|
||
maxDevices: "Max devices",
|
||
disabled: "Disabled",
|
||
status: "Status",
|
||
traffic: "Traffic",
|
||
devices: "Devices",
|
||
lastConnectionAt: "Last connection",
|
||
overview: "Overview",
|
||
authId: "Auth ID",
|
||
clientUri: "Client URI",
|
||
clientQr: "Client QR",
|
||
unlimited: "Unlimited",
|
||
secretRotateConfirm:
|
||
"Rotate peer secret? Existing client configurations will stop working until updated.",
|
||
exportSettings: "Export settings",
|
||
exportBackup: "Backup",
|
||
exportSettingsHint:
|
||
"Peer list without secrets. Safe to store and share, but after importing on another server the peers get new secrets, so existing client links stop working.",
|
||
exportBackupConfirm:
|
||
"A backup contains the LIVE connection secrets of every peer in plain text: anyone who gets this file gets VPN access. Treat it like a password and delete it once the migration is done. Only this kind of copy keeps existing client links working after moving to another server.",
|
||
exportBackupConfirmButton: "I understand, download with secrets",
|
||
quota: "Quota",
|
||
download: "Download",
|
||
upload: "Upload",
|
||
expireTime: "Expire Time",
|
||
kickUtilTimeLast: "Offline Remaining Time",
|
||
kickUtilTime: "Offline Time",
|
||
deviceNo: "Limit Devices",
|
||
onlineStatus: "Online Status",
|
||
online: "Online",
|
||
offline: "Offline",
|
||
onlineUnknown: "Online unknown",
|
||
onlineUnavailable: "Live connection state is currently unavailable",
|
||
onlineUnavailableHint:
|
||
"The Hysteria Traffic Stats API did not answer, so online status and device counts are unknown. Stored peer state in the table is accurate.",
|
||
device: "Online Devices",
|
||
loginAt: "Last login time",
|
||
conAt: "Last connection time",
|
||
createTime: "Create Time",
|
||
releaseSuccess: "Release successful",
|
||
kick: "Ban temporarily",
|
||
kickTip:
|
||
"Drop the session and refuse new connections until the ban expires",
|
||
kickConfirm:
|
||
"Ban peer “{name}” until {until}? The current session will be dropped and new connections refused until then.",
|
||
kickSuccess: "Peer banned temporarily",
|
||
releaseKick: "Lift ban",
|
||
releaseKickTip: "Lift the temporary ban early",
|
||
// Disabling and the temporary ban are separate mechanisms: the ban expires
|
||
// on its own, disabling is only undone by hand.
|
||
enablePeer: "Enable peer",
|
||
disablePeer: "Disable peer",
|
||
disableConfirm:
|
||
"Disable peer “{name}”? The current session will be dropped and new connections refused until the peer is enabled again.",
|
||
enableSuccess: "Peer enabled",
|
||
disableSuccess: "Peer disabled",
|
||
createdAt: "Created at",
|
||
bannedUntil: "Banned until",
|
||
totalTraffic: "Total traffic",
|
||
copyUri: "Copy URI",
|
||
more: "More",
|
||
},
|
||
config: {
|
||
orchestratorManaged: "Managed by hy2xs-orchestrator reconfigure",
|
||
resetTrafficCron: "Reset traffic schedule task",
|
||
resetTrafficCronTip:
|
||
"Scheduled task expression, reference: https://pkg.go.dev/github.com/robfig/cron/v3. An empty value disables the automatic reset",
|
||
resetTrafficMonth: "Run once a month, midnight, first of month",
|
||
resetTrafficWeek: "Run once a week, midnight between Sat/Sun",
|
||
},
|
||
// The `monitor` section is gone together with its only consumer — the
|
||
// "Hysteria2 Status" tag on the config page. The service state has three
|
||
// values, not two, and its phrases live in `dashboard.serviceState`.
|
||
log: {
|
||
numLine: "Number of lines",
|
||
level: "Level",
|
||
message: "Message",
|
||
time: "Time",
|
||
exportFailed: "Could not export the log",
|
||
},
|
||
errorPage: {
|
||
back: "Back",
|
||
oops: "Oops!",
|
||
forbiddenTitle: "You do not have permission to access this page",
|
||
forbiddenGo: "Or you can go:",
|
||
backHome: "Back to Home",
|
||
forbiddenImageAlt: "Girl has dropped her ice cream.",
|
||
notFoundHeadline: "The webmaster said that you can not enter this page...",
|
||
notFoundInfo:
|
||
"Please check that the URL you entered is correct, or click the button below to return to the homepage.",
|
||
notFoundBackHome: "Back to home",
|
||
},
|
||
hysteria: {
|
||
hysteria2Version: "Hysteria2 Version",
|
||
ownedByOrchestrator: "The Hysteria configuration is owned by the installer",
|
||
ownedByOrchestratorHint:
|
||
"The panel shows /etc/hysteria/config.yaml read-only. Changes are applied by `hy2xs-orchestrator reconfigure`.",
|
||
listen: "Listen address",
|
||
auth: "Peer authentication",
|
||
tls: "TLS",
|
||
obfs: "Obfuscation",
|
||
quic: "QUIC parameters",
|
||
bandwidth: "Bandwidth",
|
||
congestion: "Congestion control",
|
||
trafficStats: "Traffic Stats API",
|
||
notSet: "not set",
|
||
sectionMissing: "The section is absent from the configuration",
|
||
tlsMissing: "Neither tls nor acme is configured",
|
||
valuesHidden: "values are not shown",
|
||
secretSet: "set",
|
||
secretMissing: "not set",
|
||
obfsPasswordHint: "handed out in the peer share link",
|
||
driftTitle: "Configuration drift",
|
||
driftHint:
|
||
"The file contains sections outside the HY2XS production profile. The orchestrator neither creates nor supports them: the configuration was most likely edited by hand.",
|
||
trafficStatsMissing: "Traffic Stats API is not configured",
|
||
trafficStatsMissingHint:
|
||
"Without the trafficStats section the device limit, traffic accounting and forced disconnect do not work: the panel reaches Hysteria only through this API.",
|
||
trafficStatsUnreachable:
|
||
"the panel cannot reach this address: the Traffic Stats API is queried through 127.0.0.1 only. While the addresses differ, the device limit, traffic accounting and forced disconnect do not work",
|
||
trafficStatsWildcard:
|
||
"the API is reachable but listens on every interface. The HY2XS production profile uses 127.0.0.1: run hy2xs-orchestrator reconfigure",
|
||
},
|
||
};
|