mirror of
https://github.com/Buriburizaem0n/nezha-dash-v1.git
synced 2026-11-04 01:00:20 +00:00
* feat(server-detail): add online history tab Render per-server online periods from GET /api/v1/server/:id/online-history: summary card (current status, online rate, total in window, last active), daily online-time bars, and the raw period list. Window selector offers 1d/7d/30d and locks options beyond the server's max_days; guests hitting the 1d cap see a login hint. i18n keys added for all locales (zh-CN/zh-TW translated, others fall back to English for Weblate). * fix(online-history): keep selector pills above the sliding indicator The active-indicator overlay sits at z-10 and intercepted clicks on the day pills; wrap pills at z-20 like the existing PeriodSelector. * feat(online-history): render daily online as 24h timeline with hover tooltips 每日在线卡片从整日占比进度条改为 0:00–24:00 整轴时间条: 每个在线时段按当日时刻定位为高亮分段,hover 显示起止时间与时长; 进行中时段以亮色高亮。卡片顶部新增共享刻度(0:00 / 12:00 / 24:00)。 * feat(online-history): regroup periods by day as expandable chip wall Rework the Online tab per the chip-wall design: periods are grouped by panel-timezone day with per-day totals, defaulting to the latest day with "Expand more" revealing up to ten more groups per click, plus an Online/Offline switch that derives offline chips as the window complement. - respond to the backend panel timezone (timezone/tz_offset): dayjs 1.11 .tz(input, zone) ignores explicit offsets, so offset-bearing timestamps are parsed first and converted afterwards; naive date strings keep the zone-parse path (panelDay) - guests falling back automatically: a rejected days>1 request locks 7d/30d and retries at 1d instead of surfacing only a login prompt - fix day-selector indicator landing on the wrong pill: useActiveIndicator refs are stored by index, pass the map index not the day value - disable Node experimental webstorage in vitest workers: Node >=25 ships a broken global localStorage that shadows the jsdom one - 14 locales: tabSwitch.Online + serverOnlineHistory.* * feat(online-history): boxed summary stats with desktop/mobile layouts * fix(online-history): align offline gaps, DST coordinates and ongoing chips - extract pure timeline/grouping helpers into src/lib/online-history.ts - clamp offline complements to day and window boundaries, so a gap can no longer run into a later day's first online session - use wall-clock coordinates and true next-midnight boundaries on DST days - label only the segment ending at the live session end as Ongoing - keep group totals equal to the visible chips for cross-day sessions - keep period chips on one line and render next-midnight as 24:00 - add regression tests for multi-day offline gaps, window_start/window_end, spring-forward/fall-back geometry and ongoing clipping * style(online-history): lighten summary metrics and shorten rate bar * feat(online-history): refine UI and unify daily history rendering --------- Co-authored-by: Sam5440 <Sam5440@users.noreply.github.com> Co-authored-by: hamster1963 <1410514192@qq.com>
183 lines
5.6 KiB
JSON
183 lines
5.6 KiB
JSON
{
|
||
"map": {
|
||
"Servers": "сервера",
|
||
"Distributions": "Серверы распределены в",
|
||
"Regions": "Регионы"
|
||
},
|
||
"serverDetailChart": {
|
||
"disk": "Диск",
|
||
"download": "Скачивание",
|
||
"swap": "Swap",
|
||
"upload": "Загрузка",
|
||
"mem": "Mem",
|
||
"process": "Процесс",
|
||
"realtime": "Сейчас",
|
||
"period1d": "1 День",
|
||
"period7d": "7 Дней",
|
||
"period30d": "30 Дней"
|
||
},
|
||
"serverCard": {
|
||
"system": "Система",
|
||
"hours": "Часов",
|
||
"uptime": "Аптайм",
|
||
"download": "Скачать",
|
||
"mem": "MEM",
|
||
"stg": "STG",
|
||
"upload": "Загрузка",
|
||
"totalUpload": "Загружено",
|
||
"totalDownload": "Скачано",
|
||
"days": "Дней"
|
||
},
|
||
"tabSwitch": {
|
||
"Detail": "Детали",
|
||
"Network": "Сеть",
|
||
"Online": "Online"
|
||
},
|
||
"whereTheTimeIs": "Где время",
|
||
"theme": {
|
||
"dark": "Темная тема",
|
||
"light": "Светлая тема",
|
||
"system": "Как в Системе"
|
||
},
|
||
"login": "Логин",
|
||
"language": {
|
||
"zh-TW": "Традиционный китайский",
|
||
"zh-CN": "Упрощенный китайский",
|
||
"en-US": "Английский",
|
||
"de-DE": "Немецкий",
|
||
"ta-IN": "Тамильский",
|
||
"ru-RU": "Русский",
|
||
"es-ES": "Испанский"
|
||
},
|
||
"overview": "Обзор",
|
||
"info": {
|
||
"websocketConnecting": "WebSocket подключение",
|
||
"websocketConnected": "WebSocket подключен",
|
||
"websocketDisconnected": "WebSocket отключен",
|
||
"processing": "Обработка...",
|
||
"noServers": "Нет доступных серверов",
|
||
"noMatchingServers": "Нет серверов, соответствующих текущим фильтрам"
|
||
},
|
||
"cycleTransfer": {
|
||
"nextUpdate": "следующее обновление",
|
||
"used": "использовано",
|
||
"total": "всего"
|
||
},
|
||
"dashboard": "Панель",
|
||
"online": "Онлайн",
|
||
"refreshing": "Обновление",
|
||
"serverOverview": {
|
||
"totalServers": "Всего Серверов",
|
||
"totalBandwidth": "Общая пропускная способность",
|
||
"network": "Сеть",
|
||
"speed": "Скорость",
|
||
"onlineServers": "Серверы в сети",
|
||
"offlineServers": "Серверы не в сети"
|
||
},
|
||
"serviceTracker": {
|
||
"noService": "Нет данных о сервисе",
|
||
"delay": "Задержка",
|
||
"daysAgo": "Дней назад",
|
||
"today": "Сегодня",
|
||
"uptime": "Аптайм",
|
||
"loading": "Загрузка..."
|
||
},
|
||
"serverDetail": {
|
||
"status": "Статус",
|
||
"days": "Дней",
|
||
"hours": "Часов",
|
||
"offline": "Оффлайн",
|
||
"uptime": "Аптайм",
|
||
"arch": "Arch",
|
||
"mem": "Mem",
|
||
"disk": "Диск",
|
||
"system": "Система",
|
||
"lastActive": "Время последней активности",
|
||
"download": "Скачивание",
|
||
"unknown": "Неизвестно",
|
||
"version": "Версия",
|
||
"online": "В сети",
|
||
"region": "Регион",
|
||
"bootTime": "Время загрузки",
|
||
"upload": "Загрузка",
|
||
"temperature": "Температура"
|
||
},
|
||
"monitor": {
|
||
"noData": "Нет данных мониторинга сервера, пожалуйста, сначала добавьте монитор службы",
|
||
"avgDelay": "Задержка",
|
||
"monitorCount": "Сервисы",
|
||
"packetLoss": "Потеря пакетов",
|
||
"clearSelections": "Очистить",
|
||
"peakCut": "Peak cut",
|
||
"period1d": "1 день",
|
||
"period7d": "7 дней",
|
||
"period30d": "30 дней"
|
||
},
|
||
"pwa": {
|
||
"newContent": "Доступен новый контент",
|
||
"reload": "Обновить",
|
||
"offlineReady": "Приложение готово работать в офлайн-режиме"
|
||
},
|
||
"billingInfo": {
|
||
"remaining": "Осталось",
|
||
"error": "ошибка",
|
||
"indefinite": "Неопределено",
|
||
"expired": "Истекло",
|
||
"price": "Цена",
|
||
"free": "Бесплатно",
|
||
"days": "дней",
|
||
"usage-baseed": "Оплата по использованию"
|
||
},
|
||
"TypeCommand": "Введите команду или выполните поиск...",
|
||
"Servers": "Серверы",
|
||
"ToggleLightMode": "Переключить на светлую тему",
|
||
"Home": "Главная",
|
||
"offline": "Оффлайн",
|
||
"error": {
|
||
"pageNotFound": "Страница не найдена",
|
||
"backToHome": "Вернуться на главную"
|
||
},
|
||
"ToggleDarkMode": "Переключить на темную тему",
|
||
"Shortcuts": "Горячие клавиши",
|
||
"ToggleSystemMode": "Использовать системную тему",
|
||
"footer": {
|
||
"themeBy": "Тема от "
|
||
},
|
||
"NoResults": "Ничего не найдено.",
|
||
"nezha": "Nezha Monitoring",
|
||
"sort": {
|
||
"label": "Сортировка",
|
||
"types": {
|
||
"default": "По умолчанию",
|
||
"name": "Имя",
|
||
"uptime": "Аптайм",
|
||
"system": "Система",
|
||
"cpu": "CPU",
|
||
"mem": "Память",
|
||
"disk": "Диск",
|
||
"up": "Загрузка",
|
||
"down": "Скачивание",
|
||
"up_total": "Загружено",
|
||
"down_total": "Скачано"
|
||
}
|
||
},
|
||
"serverOnlineHistory": {
|
||
"days1": "1d",
|
||
"days7": "7d",
|
||
"days30": "30d",
|
||
"onlineRate": "Online rate",
|
||
"totalOnline": "Online in window",
|
||
"lastActive": "Last active",
|
||
"dailyOnline": "Daily online time",
|
||
"periods": "Online periods",
|
||
"ongoing": "Ongoing",
|
||
"noData": "No online records",
|
||
"loginRequired": "This window requires login; guests can switch to 1d",
|
||
"offlinePeriods": "Offline periods",
|
||
"periodsOnline": "Online",
|
||
"periodsOffline": "Offline",
|
||
"expandMore": "Expand more",
|
||
"today": "Today"
|
||
}
|
||
}
|