This is an automated email from the ASF dual-hosted git repository.
tomsun28 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/master by this push:
new 4b217e7097 feat(status-page): add configurable time range for
component history (#4222)
4b217e7097 is described below
commit 4b217e70972ab3ab21bb07f14cd5f012d36e7149
Author: wy471x <[email protected]>
AuthorDate: Thu Jul 23 00:23:37 2026 +0800
feat(status-page): add configurable time range for component history (#4222)
Co-authored-by: Claude Opus 4.7 <[email protected]>
Co-authored-by: Duansg <[email protected]>
Co-authored-by: Tomsun28 <[email protected]>
---
.../controller/StatusPagePublicController.java | 13 +++-
.../manager/service/StatusPageService.java | 8 +-
.../service/impl/StatusPageServiceImpl.java | 28 ++++---
.../controller/StatusPagePublicControllerTest.java | 30 ++++++-
.../impl/StatusPageServiceImplTimeTest.java | 9 ++-
.../status-public/status-public.component.html | 9 ++-
.../status-public/status-public.component.less | 3 +-
.../status-public/status-public.component.ts | 91 ++++++++++++++--------
.../src/app/service/status-page-public.service.ts | 18 ++++-
web-app/src/assets/i18n/en-US.json | 4 +
web-app/src/assets/i18n/ja-JP.json | 4 +
web-app/src/assets/i18n/ko-KR.json | 4 +
web-app/src/assets/i18n/pt-BR.json | 4 +
web-app/src/assets/i18n/zh-CN.json | 4 +
web-app/src/assets/i18n/zh-TW.json | 4 +
15 files changed, 170 insertions(+), 63 deletions(-)
diff --git
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/StatusPagePublicController.java
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/StatusPagePublicController.java
index 9a13776012..a6af94f8f8 100644
---
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/StatusPagePublicController.java
+++
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/StatusPagePublicController.java
@@ -62,15 +62,20 @@ public class StatusPagePublicController {
@GetMapping("/component")
@Operation(summary = "Query Status Page Components")
- public ResponseEntity<Message<List<ComponentStatus>>>
queryStatusPageComponent() {
- List<ComponentStatus> componentStatusList =
statusPageService.queryComponentsStatus();
+ public ResponseEntity<Message<List<ComponentStatus>>>
queryStatusPageComponent(
+ @Parameter(description = "Number of days of history", example =
"30")
+ @RequestParam(defaultValue = "30") int days) {
+ List<ComponentStatus> componentStatusList =
statusPageService.queryComponentsStatus(days);
return ResponseEntity.ok(Message.success(componentStatusList));
}
@GetMapping("/component/{id}")
@Operation(summary = "Query Status Page Component")
- public ResponseEntity<Message<ComponentStatus>>
queryStatusPageComponent(@PathVariable("id") final long id) {
- ComponentStatus componentStatus =
statusPageService.queryComponentStatus(id);
+ public ResponseEntity<Message<ComponentStatus>> queryStatusPageComponent(
+ @PathVariable("id") final long id,
+ @Parameter(description = "Number of days of history", example =
"30")
+ @RequestParam(defaultValue = "30") int days) {
+ ComponentStatus componentStatus =
statusPageService.queryComponentStatus(id, days);
return ResponseEntity.ok(Message.success(componentStatus));
}
diff --git
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/StatusPageService.java
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/StatusPageService.java
index 19a64b5bb2..6f60c01314 100644
---
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/StatusPageService.java
+++
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/StatusPageService.java
@@ -83,17 +83,19 @@ public interface StatusPageService {
/**
* query status page components status.
*
+ * @param days number of days of history to return
* @return status page components status
*/
- List<ComponentStatus> queryComponentsStatus();
+ List<ComponentStatus> queryComponentsStatus(int days);
/**
* query status page component status.
*
- * @param id status page component id
+ * @param id status page component id
+ * @param days number of days of history to return
* @return status page component status
*/
- ComponentStatus queryComponentStatus(long id);
+ ComponentStatus queryComponentStatus(long id, int days);
/**
* query status page incidents.
diff --git
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/StatusPageServiceImpl.java
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/StatusPageServiceImpl.java
index a5d32aaf10..87dd8f56ad 100644
---
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/StatusPageServiceImpl.java
+++
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/StatusPageServiceImpl.java
@@ -58,8 +58,6 @@ import org.springframework.util.StringUtils;
@RequiredArgsConstructor
public class StatusPageServiceImpl implements StatusPageService {
- private static final int HISTORY_SPAN_DAYS = 29;
-
@Autowired
private StatusPageOrgDao statusPageOrgDao;
@@ -126,7 +124,12 @@ public class StatusPageServiceImpl implements
StatusPageService {
}
@Override
- public List<ComponentStatus> queryComponentsStatus() {
+ public List<ComponentStatus> queryComponentsStatus(int days) {
+ if (days < 1 || days > 90) {
+ throw new IllegalArgumentException("days must be between 1 and
90");
+ }
+
+ int historySpanDays = days - 1;
List<StatusPageComponent> components =
statusPageComponentDao.findAll();
List<ComponentStatus> componentStatusList = new LinkedList<>();
for (StatusPageComponent component : components) {
@@ -150,11 +153,11 @@ public class StatusPageServiceImpl implements
StatusPageService {
.findStatusPageHistoriesByComponentIdAndTimestampBetween(component.getId(),
todayStartTimestamp, nowTimestamp);
StatusPageHistory todayStatus =
combineOneDayStatusPageHistory(todayStatusPageHistoryList, component,
nowTimestamp);
histories.add(todayStatus);
- // query 30d component status history
+ // query component status history for the configured number of days
long preTimestamp = now
.atZone(zoneId)
.toLocalDate()
- .minusDays(HISTORY_SPAN_DAYS)
+ .minusDays(historySpanDays)
.atStartOfDay(zoneId)
.toInstant()
.toEpochMilli();
@@ -167,7 +170,7 @@ public class StatusPageServiceImpl implements
StatusPageService {
.atZone(zoneId)
.minusSeconds(1); // yesterday 23:59:59 local time
- for (int i = 0; i < HISTORY_SPAN_DAYS; i++) {
+ for (int i = 0; i < historySpanDays; i++) {
long endTimestamp = end.toInstant().toEpochMilli();
long startTimestamp = end.toLocalDate()
@@ -242,7 +245,12 @@ public class StatusPageServiceImpl implements
StatusPageService {
}
@Override
- public ComponentStatus queryComponentStatus(long id) {
+ public ComponentStatus queryComponentStatus(long id, int days) {
+ if (days < 1 || days > 90) {
+ throw new IllegalArgumentException("days must be between 1 and
90");
+ }
+
+ int historySpanDays = days - 1;
StatusPageComponent component = statusPageComponentDao.findById(id)
.orElseThrow(() -> new IllegalArgumentException("component not
found"));
@@ -272,11 +280,11 @@ public class StatusPageServiceImpl implements
StatusPageService {
histories.add(todayStatus);
- // Previous HISTORY_SPAN_DAYS days (excluding today)
+ // Previous historySpanDays days (excluding today)
long preTimestamp = now
.atZone(zoneId)
.toLocalDate()
- .minusDays(HISTORY_SPAN_DAYS)
+ .minusDays(historySpanDays)
.atStartOfDay(zoneId)
.toInstant()
.toEpochMilli();
@@ -292,7 +300,7 @@ public class StatusPageServiceImpl implements
StatusPageService {
.atZone(zoneId)
.minusSeconds(1); // yesterday 23:59:59 local time
- for (int i = 0; i < HISTORY_SPAN_DAYS; i++) {
+ for (int i = 0; i < historySpanDays; i++) {
long endTimestamp = end.toInstant().toEpochMilli();
long startTimestamp = end.toLocalDate()
diff --git
a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/controller/StatusPagePublicControllerTest.java
b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/controller/StatusPagePublicControllerTest.java
index 2c2d76873c..ae1c1ab3d3 100644
---
a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/controller/StatusPagePublicControllerTest.java
+++
b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/controller/StatusPagePublicControllerTest.java
@@ -88,7 +88,7 @@ class StatusPagePublicControllerTest {
public void testQueryStatusPageComponent() throws Exception {
List<ComponentStatus> componentStatusList =
Collections.singletonList(new ComponentStatus());
-
when(statusPageService.queryComponentsStatus()).thenReturn(componentStatusList);
+
when(statusPageService.queryComponentsStatus(30)).thenReturn(componentStatusList);
mockMvc.perform(get("/api/status/page/public/component")
.accept(MediaType.APPLICATION_JSON))
@@ -96,13 +96,39 @@ class StatusPagePublicControllerTest {
.andExpect(jsonPath("$.code").value((int)
CommonConstants.SUCCESS_CODE));
}
+ @Test
+ public void testQueryStatusPageComponentWithDays() throws Exception {
+
+ List<ComponentStatus> componentStatusList =
Collections.singletonList(new ComponentStatus());
+
when(statusPageService.queryComponentsStatus(7)).thenReturn(componentStatusList);
+
+ mockMvc.perform(get("/api/status/page/public/component")
+ .param("days", "7")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.code").value((int)
CommonConstants.SUCCESS_CODE));
+ }
+
@Test
public void testQueryStatusPageComponentById() throws Exception {
ComponentStatus componentStatus = new ComponentStatus();
-
when(statusPageService.queryComponentStatus(1L)).thenReturn(componentStatus);
+ when(statusPageService.queryComponentStatus(1L,
30)).thenReturn(componentStatus);
+
+ mockMvc.perform(get("/api/status/page/public/component/1")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.code").value((int)
CommonConstants.SUCCESS_CODE));
+ }
+
+ @Test
+ public void testQueryStatusPageComponentByIdWithDays() throws Exception {
+
+ ComponentStatus componentStatus = new ComponentStatus();
+ when(statusPageService.queryComponentStatus(1L,
7)).thenReturn(componentStatus);
mockMvc.perform(get("/api/status/page/public/component/1")
+ .param("days", "7")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value((int)
CommonConstants.SUCCESS_CODE));
diff --git
a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/impl/StatusPageServiceImplTimeTest.java
b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/impl/StatusPageServiceImplTimeTest.java
index 8ad87c638e..a8663886a1 100644
---
a/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/impl/StatusPageServiceImplTimeTest.java
+++
b/hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/impl/StatusPageServiceImplTimeTest.java
@@ -99,8 +99,9 @@ class StatusPageServiceImplTimeTest {
when(historyDao.findStatusPageHistoriesByComponentIdAndTimestampBetween(anyLong(),
anyLong(), anyLong()))
.thenReturn(List.of(before, after));
- List<ComponentStatus> result = service.queryComponentsStatus();
- assertEquals(30, result.get(0).getHistory().size());
+ assertEquals(30,
service.queryComponentsStatus(30).get(0).getHistory().size());
+ assertEquals(1,
service.queryComponentsStatus(1).get(0).getHistory().size());
+ assertEquals(90,
service.queryComponentsStatus(90).get(0).getHistory().size());
}
@Test
@@ -114,7 +115,7 @@ class StatusPageServiceImplTimeTest {
when(historyDao.findStatusPageHistoriesByComponentIdAndTimestampBetween(anyLong(),
anyLong(), anyLong()))
.thenReturn(List.of(history));
- List<ComponentStatus> result = service.queryComponentsStatus();
+ List<ComponentStatus> result = service.queryComponentsStatus(30);
assertEquals(30, result.get(0).getHistory().size());
}
@@ -128,7 +129,7 @@ class StatusPageServiceImplTimeTest {
when(historyDao.findStatusPageHistoriesByComponentIdAndTimestampBetween(anyLong(),
anyLong(), anyLong()))
.thenReturn(List.of(history));
- List<ComponentStatus> result = service.queryComponentsStatus();
+ List<ComponentStatus> result = service.queryComponentsStatus(30);
assertEquals(30, result.get(0).getHistory().size());
}
diff --git a/web-app/src/app/routes/status-public/status-public.component.html
b/web-app/src/app/routes/status-public/status-public.component.html
index 0eb2e27c63..18d58c6d84 100755
--- a/web-app/src/app/routes/status-public/status-public.component.html
+++ b/web-app/src/app/routes/status-public/status-public.component.html
@@ -92,6 +92,11 @@
</div>
</div>
<div style="margin-top: 20px">
+ <div style="width: 60%; margin: 0 auto 10px; display: flex; align-items:
center; justify-content: flex-end">
+ <nz-select style="width: 120px" [(ngModel)]="historyDays"
(ngModelChange)="onHistoryDaysChange()">
+ <nz-option *ngFor="let d of historyDaysOptions" [nzValue]="d"
[nzLabel]="getHistoryDaysLabel(d)"></nz-option>
+ </nz-select>
+ </div>
<div *ngFor="let component of componentStatus" class="component-status
br-8">
<div style="margin: 10px; display: flex; justify-content:
space-between">
<div style="font-weight: bold; font-size: 1rem">
@@ -119,7 +124,7 @@
<span nz-icon style="margin-left: 5px" nzType="stop"
nzTheme="outline"></span>
</div>
</div>
- <div style="margin-left: 10px; margin-top: 10px; margin-bottom: 10px;
display: flex">
+ <div style="margin-left: 10px; margin-top: 10px; margin-bottom: 10px;
display: flex; gap: 2px">
<div
*ngFor="let historyItem of component.history"
class="history-block br-8"
@@ -141,7 +146,7 @@
</div>
<div style="margin: 10px; display: flex; justify-content:
space-between; font-size: 0.75rem">
<span>{{ 'status.public.today' | i18n }}</span>
- <span>{{ 'status.public.30-day' | i18n }}</span>
+ <span>{{ getHistoryDaysAgoLabel() }}</span>
</div>
</div>
</div>
diff --git a/web-app/src/app/routes/status-public/status-public.component.less
b/web-app/src/app/routes/status-public/status-public.component.less
index eef92b166e..804e69ad23 100644
--- a/web-app/src/app/routes/status-public/status-public.component.less
+++ b/web-app/src/app/routes/status-public/status-public.component.less
@@ -64,9 +64,8 @@
}
.history-block {
- width: 2.33%;
+ flex: 1;
height: 60px;
- margin-right: 1%
}
.status-incident {
diff --git a/web-app/src/app/routes/status-public/status-public.component.ts
b/web-app/src/app/routes/status-public/status-public.component.ts
index 2b40257785..20cd255ff5 100644
--- a/web-app/src/app/routes/status-public/status-public.component.ts
+++ b/web-app/src/app/routes/status-public/status-public.component.ts
@@ -21,7 +21,6 @@ import { Component, Inject, OnInit } from '@angular/core';
import { I18NService } from '@core';
import { ALAIN_I18N_TOKEN, TitleService } from '@delon/theme';
import { NzNotificationService } from 'ng-zorro-antd/notification';
-import { switchMap } from 'rxjs';
import { Message } from '../../pojo/Message';
import { StatusPageComponentStatus } from
'../../pojo/StatusPageComponentStatus';
@@ -52,6 +51,9 @@ export class StatusPublicComponent implements OnInit {
// component or incident
showMode: string = 'component';
+ historyDays: number = 30;
+ historyDaysOptions: number[] = [1, 7, 30, 90];
+
pageIndex: number = 1;
pageSize: number = 9999;
incidentYear: Date = new Date();
@@ -63,40 +65,65 @@ export class StatusPublicComponent implements OnInit {
this.loadStatusPageOrg();
}
+ onHistoryDaysChange() {
+ this.loadComponentStatus();
+ }
+
+ getHistoryDaysLabel(days: number): string {
+ if (days === 1) {
+ return this.i18nSvc.fanyi('status.public.24-hour');
+ }
+ return `${days} ${this.i18nSvc.fanyi('status.public.days')}`;
+ }
+
+ getHistoryDaysAgoLabel(): string {
+ if (this.historyDays === 1) {
+ return this.i18nSvc.fanyi('status.public.24-hour-ago');
+ }
+ return `${this.historyDays}
${this.i18nSvc.fanyi('status.public.days-ago')}`;
+ }
+
+ loadComponentStatus() {
+ this.loading = true;
+ let componentLoad$ =
this.statusPagePublicService.getStatusPageComponents(this.historyDays).subscribe(
+ (message: Message<StatusPageComponentStatus[]>) => {
+ if (message.code !== 0) {
+ this.notifySvc.error(message.msg, '');
+ } else {
+ this.componentStatus = message.data;
+ }
+ this.loading = false;
+ componentLoad$.unsubscribe();
+ },
+ error => {
+ this.loading = false;
+ this.notifySvc.error(error.msg, '');
+ componentLoad$.unsubscribe();
+ }
+ );
+ }
+
loadStatusPageOrg() {
this.loading = true;
- let loadInit$ = this.statusPagePublicService
- .getStatusPageOrg()
- .pipe(
- switchMap((message: Message<StatusPageOrg>) => {
- if (message.code === 0) {
- this.statusOrg = message.data;
- this.titleService.setTitle(`${this.statusOrg.name}
${this.i18nSvc.fanyi('menu.advanced.status')}`);
- } else {
- this.statusOrg = new StatusPageOrg();
- console.log(message.msg);
- this.notifySvc.error(message.msg, '');
- throw new Error(message.msg);
- }
- return this.statusPagePublicService.getStatusPageComponents();
- })
- )
- .subscribe(
- (message: Message<StatusPageComponentStatus[]>) => {
- if (message.code !== 0) {
- this.notifySvc.error(message.msg, '');
- } else {
- this.componentStatus = message.data;
- }
- this.loading = false;
- loadInit$.unsubscribe();
- },
- error => {
- this.loading = false;
- this.notifySvc.error(error.msg, '');
- loadInit$.unsubscribe();
+ let loadInit$ = this.statusPagePublicService.getStatusPageOrg().subscribe(
+ (message: Message<StatusPageOrg>) => {
+ if (message.code === 0) {
+ this.statusOrg = message.data;
+ this.titleService.setTitle(`${this.statusOrg.name}
${this.i18nSvc.fanyi('menu.advanced.status')}`);
+ } else {
+ this.statusOrg = new StatusPageOrg();
+ console.log(message.msg);
+ this.notifySvc.error(message.msg, '');
}
- );
+ this.loadComponentStatus();
+ loadInit$.unsubscribe();
+ },
+ error => {
+ this.loading = false;
+ this.notifySvc.error(error.msg, '');
+ loadInit$.unsubscribe();
+ }
+ );
}
showIncident() {
diff --git a/web-app/src/app/service/status-page-public.service.ts
b/web-app/src/app/service/status-page-public.service.ts
index 26bb9703df..702198bfb9 100644
--- a/web-app/src/app/service/status-page-public.service.ts
+++ b/web-app/src/app/service/status-page-public.service.ts
@@ -43,12 +43,22 @@ export class StatusPagePublicService {
return this.http.get<Message<StatusPageOrg>>(status_page_org_public_uri);
}
- public getStatusPageComponents():
Observable<Message<StatusPageComponentStatus[]>> {
- return
this.http.get<Message<StatusPageComponentStatus[]>>(status_page_component_public_uri);
+ public getStatusPageComponents(days?: number):
Observable<Message<StatusPageComponentStatus[]>> {
+ let httpParams = new HttpParams();
+ if (days != null) {
+ httpParams = httpParams.append('days', days);
+ }
+ const options = { params: httpParams };
+ return
this.http.get<Message<StatusPageComponentStatus[]>>(status_page_component_public_uri,
options);
}
- public getStatusPageComponent(componentId: number):
Observable<Message<StatusPageComponentStatus>> {
- return
this.http.get<Message<StatusPageComponentStatus>>(`${status_page_component_public_uri}/${componentId}`);
+ public getStatusPageComponent(componentId: number, days?: number):
Observable<Message<StatusPageComponentStatus>> {
+ let httpParams = new HttpParams();
+ if (days != null) {
+ httpParams = httpParams.append('days', days);
+ }
+ const options = { params: httpParams };
+ return
this.http.get<Message<StatusPageComponentStatus>>(`${status_page_component_public_uri}/${componentId}`,
options);
}
public getStatusPageIncidents(
diff --git a/web-app/src/assets/i18n/en-US.json
b/web-app/src/assets/i18n/en-US.json
index 1ff8d2a299..c6b21da67f 100644
--- a/web-app/src/assets/i18n/en-US.json
+++ b/web-app/src/assets/i18n/en-US.json
@@ -1171,6 +1171,10 @@
"status.preview": "View Status Page",
"status.page": "Status Page",
"status.public.30-day": "30 days ago",
+ "status.public.24-hour": "24 hours",
+ "status.public.24-hour-ago": "24 hours ago",
+ "status.public.days": "days",
+ "status.public.days-ago": "days ago",
"status.public.feedback": "Feedback Issue",
"status.public.org.state.0": "All Systems Operational",
"status.public.org.state.1": "Some Systems Abnormal",
diff --git a/web-app/src/assets/i18n/ja-JP.json
b/web-app/src/assets/i18n/ja-JP.json
index 1ad22e0caa..ab8970d8bb 100644
--- a/web-app/src/assets/i18n/ja-JP.json
+++ b/web-app/src/assets/i18n/ja-JP.json
@@ -1090,6 +1090,10 @@
"status.preview": "ステータスページを表示",
"status.page": "ステータスページ",
"status.public.30-day": "30日前",
+ "status.public.24-hour": "24時間",
+ "status.public.24-hour-ago": "24時間前",
+ "status.public.days": "日",
+ "status.public.days-ago": "日前",
"status.public.feedback": "フィードバック問題",
"status.public.org.state.0": "すべてのシステムが正常に稼働",
"status.public.org.state.1": "一部のシステムが異常",
diff --git a/web-app/src/assets/i18n/ko-KR.json
b/web-app/src/assets/i18n/ko-KR.json
index a28d550a81..f267512bdf 100644
--- a/web-app/src/assets/i18n/ko-KR.json
+++ b/web-app/src/assets/i18n/ko-KR.json
@@ -1055,6 +1055,10 @@
"status.preview": "상태 페이지 보기",
"status.page": "상태 페이지",
"status.public.30-day": "30일 전",
+ "status.public.24-hour": "24시간",
+ "status.public.24-hour-ago": "24시간 전",
+ "status.public.days": "일",
+ "status.public.days-ago": "일 전",
"status.public.feedback": "피드백 제출",
"status.public.org.state.0": "모든 시스템 정상 운영 중",
"status.public.org.state.1": "일부 시스템 비정상",
diff --git a/web-app/src/assets/i18n/pt-BR.json
b/web-app/src/assets/i18n/pt-BR.json
index b15caf2f8c..119e33ec80 100644
--- a/web-app/src/assets/i18n/pt-BR.json
+++ b/web-app/src/assets/i18n/pt-BR.json
@@ -1071,6 +1071,10 @@
"status.public.org.state.2": "Todos os Sistemas Anormais",
"status.public.today": "Hoje",
"status.public.30-day": "30 dias atrás",
+ "status.public.24-hour": "24 horas",
+ "status.public.24-hour-ago": "24 horas atrás",
+ "status.public.days": "dias",
+ "status.public.days-ago": "dias atrás",
"status.public.power-by": "Desenvolvido por Apache HertzBeat™. Dê-nos uma
estrela!",
"status.public.to-incident": "Histórico de Incidentes",
"status.public.to-component": "Página de Status",
diff --git a/web-app/src/assets/i18n/zh-CN.json
b/web-app/src/assets/i18n/zh-CN.json
index 50ecad2344..222d5a91c6 100644
--- a/web-app/src/assets/i18n/zh-CN.json
+++ b/web-app/src/assets/i18n/zh-CN.json
@@ -1174,6 +1174,10 @@
"status.preview": "查看状态页",
"status.page": "状态页面",
"status.public.30-day": "30天前",
+ "status.public.24-hour": "24小时",
+ "status.public.24-hour-ago": "24小时前",
+ "status.public.days": "天",
+ "status.public.days-ago": "天前",
"status.public.feedback": "问题反馈",
"status.public.org.state.0": "所有系统正常运行",
"status.public.org.state.1": "部分系统运行异常",
diff --git a/web-app/src/assets/i18n/zh-TW.json
b/web-app/src/assets/i18n/zh-TW.json
index 8966c6212d..6d55e53bc7 100644
--- a/web-app/src/assets/i18n/zh-TW.json
+++ b/web-app/src/assets/i18n/zh-TW.json
@@ -1104,6 +1104,10 @@
"status.preview": "查看狀態頁",
"status.page": "狀態頁面",
"status.public.30-day": "30天前",
+ "status.public.24-hour": "24小時",
+ "status.public.24-hour-ago": "24小時前",
+ "status.public.days": "天",
+ "status.public.days-ago": "天前",
"status.public.feedback": "問題反饋",
"status.public.org.state.0": "所有系統正常運行",
"status.public.org.state.1": "部分系統運行異常",
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]