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", }, };