diff --git a/.github/workflows/check-format.yml b/.github/workflows/check-format.yml
index d3d4c0d6b..76cb300f1 100644
--- a/.github/workflows/check-format.yml
+++ b/.github/workflows/check-format.yml
@@ -59,4 +59,4 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh pr close "$PR_NUMBER" --delete-branch --comment "❌ Formatting check failed — PR auto-closed.
- Please run \`npm run format\` and push again."
+ Please run \`npm run format\` in both `client` and `server` directories and push again."
diff --git a/.github/workflows/deploy-images-on-release.yml b/.github/workflows/deploy-images-on-release.yml
index f1d0dd7ce..cf06f7840 100644
--- a/.github/workflows/deploy-images-on-release.yml
+++ b/.github/workflows/deploy-images-on-release.yml
@@ -11,6 +11,9 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
- name: Extract version from tag
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
@@ -93,6 +96,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -119,12 +124,16 @@ jobs:
platforms: linux/amd64,linux/arm64
labels: |
org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate
+ build-args: |
+ VITE_APP_VERSION=${{ steps.extract_tag.outputs.version }}
docker-build-and-push-server-mono:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
- name: Extract version
id: extract_tag
@@ -143,6 +152,7 @@ jobs:
-t ghcr.io/bluewave-labs/checkmate-backend-mono:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist-mono/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
+ --build-arg VITE_APP_VERSION=${{ steps.extract_tag.outputs.version }} \
.
- name: Push Server Docker image
diff --git a/.github/workflows/deploy-images.yml b/.github/workflows/deploy-images.yml
index d3d70b90b..fa39fed85 100644
--- a/.github/workflows/deploy-images.yml
+++ b/.github/workflows/deploy-images.yml
@@ -10,6 +10,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
@@ -18,12 +20,16 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
+ - name: Get version
+ id: vars
+ run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-client:latest \
-f ./docker/dist/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
+ --build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
@@ -85,6 +91,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -96,6 +104,10 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
+ - name: Get version
+ id: vars
+ run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
+
- name: Build and push multi-arch Docker image
uses: docker/build-push-action@v5
with:
@@ -107,12 +119,16 @@ jobs:
platforms: linux/amd64,linux/arm64
labels: |
org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate
+ build-args: |
+ VITE_APP_VERSION=${{ env.VERSION }}
docker-build-and-push-server-mono:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
@@ -121,12 +137,17 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
+ - name: Get version
+ id: vars
+ run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
+
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend-mono:latest \
-f ./docker/dist-mono/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
+ --build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Server Docker image
diff --git a/.github/workflows/production-deploy.yml b/.github/workflows/production-deploy.yml
index 6956f5caa..7764c488b 100644
--- a/.github/workflows/production-deploy.yml
+++ b/.github/workflows/production-deploy.yml
@@ -10,6 +10,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
@@ -18,12 +20,16 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
+ - name: Get version
+ id: vars
+ run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:frontend-demo \
-f ./docker/prod/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
+ --build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
diff --git a/.github/workflows/staging-deploy.yml b/.github/workflows/staging-deploy.yml
index 34fa243c6..ea5477815 100644
--- a/.github/workflows/staging-deploy.yml
+++ b/.github/workflows/staging-deploy.yml
@@ -10,6 +10,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
@@ -18,12 +20,16 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
+ - name: Get version
+ id: vars
+ run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:frontend-staging \
-f ./docker/staging/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
+ --build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
diff --git a/client/.eslintrc.cjs b/client/.eslintrc.cjs
index 7d6029d4b..86d523a6f 100644
--- a/client/.eslintrc.cjs
+++ b/client/.eslintrc.cjs
@@ -16,4 +16,8 @@ module.exports = {
"react-refresh/only-export-components": ["warn", { allowConstantExport: true }],
"react/no-unescaped-entities": "off",
},
+ globals: {
+ __APP_VERSION__: "readonly",
+ process: "readonly",
+ },
};
diff --git a/client/src/Components/MonitorDetailsControlHeader/index.jsx b/client/src/Components/MonitorDetailsControlHeader/index.jsx
index 5ad665069..1d253e3d5 100644
--- a/client/src/Components/MonitorDetailsControlHeader/index.jsx
+++ b/client/src/Components/MonitorDetailsControlHeader/index.jsx
@@ -83,23 +83,24 @@ const MonitorDetailsControlHeader = ({
>
{t("menu.incidents")}
- :
- }
- onClick={() => {
- pauseMonitor({
- monitorId: monitor?._id,
- triggerUpdate,
- });
- }}
- >
- {monitor?.isActive ? "Pause" : "Resume"}
-
-
+ {isAdmin && (
+ :
+ }
+ onClick={() => {
+ pauseMonitor({
+ monitorId: monitor?._id,
+ triggerUpdate,
+ });
+ }}
+ >
+ {monitor?.isActive ? "Pause" : "Resume"}
+
+ )}
{isAdmin && (
+ {/* */}
diff --git a/client/src/Pages/Notifications/components/ActionMenu.jsx b/client/src/Pages/Notifications/components/ActionMenu.jsx
index bd719bfee..e19ccecae 100644
--- a/client/src/Pages/Notifications/components/ActionMenu.jsx
+++ b/client/src/Pages/Notifications/components/ActionMenu.jsx
@@ -18,6 +18,7 @@ const ActionMenu = ({ notification, onDelete }) => {
// Handlers
const handleClick = (event) => {
+ event.stopPropagation();
setAnchorEl(event.currentTarget);
};
@@ -25,7 +26,8 @@ const ActionMenu = ({ notification, onDelete }) => {
setAnchorEl(null);
};
- const handleRemove = () => {
+ const handleRemove = (e) => {
+ e.stopPropagation();
onDelete(notification._id);
handleClose();
};
diff --git a/client/src/Pages/PageSpeed/Details/Components/Charts/PieChart.jsx b/client/src/Pages/PageSpeed/Details/Components/Charts/PieChart.jsx
index c9204c38a..eec075684 100644
--- a/client/src/Pages/PageSpeed/Details/Components/Charts/PieChart.jsx
+++ b/client/src/Pages/PageSpeed/Details/Components/Charts/PieChart.jsx
@@ -221,7 +221,15 @@ const PieChart = ({ audits }) => {
const colorMap = getColors(performance);
return (
- setExpand(false)}>
+ setExpand(false)}
+ sx={{
+ display: "flex",
+ justifyContent: "center",
+ alignItems: "center",
+ width: "100%",
+ }}
+ >
{expand ? (
{
{t("pageSpeedDetailsPerformanceReport")}{" "}
{
component="h1"
variant="h2"
>
- {t("settingsAbout")}
+ {t("settingsPage.aboutSettings.title")}
- {t("common.appName")} {2.1}
+ {t("common.appName")} {__APP_VERSION__}
- {t("settingsDevelopedBy")}
+ {t("settingsPage.aboutSettings.labelDevelopedBy")}
- {t("settingsDemoMonitors")}
+ {t("settingsPage.demoMonitorsSettings.title")}
+
+
+ {t("settingsPage.demoMonitorsSettings.description")}
- {t("settingsDemoMonitorsDescription")}
@@ -56,10 +58,10 @@ const SettingsDemoMonitors = ({ isAdmin, HEADER_SX, handleChange, isLoading }) =
component="h1"
variant="h2"
>
- {t("settingsSystemReset")}
+ {t("settingsPage.systemResetSettings.title")}
- {t("settingsSystemResetDescription")}
+ {t("settingsPage.systemResetSettings.description")}
@@ -70,15 +72,15 @@ const SettingsDemoMonitors = ({ isAdmin, HEADER_SX, handleChange, isLoading }) =
onClick={() => setIsOpen(true)}
sx={{ mt: theme.spacing(4) }}
>
- {t("settingsRemoveAllMonitorsButton")}
+ {t("settingsPage.systemResetSettings.buttonRemoveAllMonitors")}
diff --git a/client/src/Pages/StatusPage/Status/index.jsx b/client/src/Pages/StatusPage/Status/index.jsx
index af5eedeab..7903b097b 100644
--- a/client/src/Pages/StatusPage/Status/index.jsx
+++ b/client/src/Pages/StatusPage/Status/index.jsx
@@ -53,7 +53,7 @@ const PublicStatus = () => {
return ;
}
- if (monitors.length === 0) {
+ if (monitors?.length === 0) {
return (
{
}
+ element={
+
+
+
+ }
/>
diff --git a/client/src/Utils/NetworkService.js b/client/src/Utils/NetworkService.js
index 714268b0b..414c45a22 100644
--- a/client/src/Utils/NetworkService.js
+++ b/client/src/Utils/NetworkService.js
@@ -549,6 +549,7 @@ class NetworkService {
* @param {number} config.limit - The maximum number of checks to retrieve.
* @param {string} config.dateRange - The range of dates for which to retrieve checks.
* @param {string} config.filter - The filter to apply to the checks.
+ * @param {boolean} config.ack - The acknowledgment status to apply to the checks.
* @param {number} config.page - The page number to retrieve in a paginated list.
* @param {number} config.rowsPerPage - The number of rows per page in a paginated list.
* @returns {Promise} The response from the axios GET request.
@@ -562,6 +563,7 @@ class NetworkService {
if (config.limit) params.append("limit", config.limit);
if (config.dateRange) params.append("dateRange", config.dateRange);
if (config.filter) params.append("filter", config.filter);
+ if (config.ack !== undefined) params.append("ack", config.ack);
if (config.page) params.append("page", config.page);
if (config.rowsPerPage) params.append("rowsPerPage", config.rowsPerPage);
if (config.status !== undefined) params.append("status", config.status);
@@ -581,6 +583,7 @@ class NetworkService {
* @param {number} config.limit - The maximum number of checks to retrieve.
* @param {string} config.dateRange - The range of dates for which to retrieve checks.
* @param {string} config.filter - The filter to apply to the checks.
+ * @param {boolean} config.ack - The acknowledgment status to apply to the checks.
* @param {number} config.page - The page number to retrieve in a paginated list.
* @param {number} config.rowsPerPage - The number of rows per page in a paginated list.
* @returns {Promise} The response from the axios GET request.
@@ -592,12 +595,30 @@ class NetworkService {
if (config.limit) params.append("limit", config.limit);
if (config.dateRange) params.append("dateRange", config.dateRange);
if (config.filter) params.append("filter", config.filter);
+ if (config.ack !== undefined) params.append("ack", config.ack);
if (config.page) params.append("page", config.page);
if (config.rowsPerPage) params.append("rowsPerPage", config.rowsPerPage);
- if (config.status !== undefined) params.append("status", config.status);
return this.axiosInstance.get(`/checks/team?${params.toString()}`);
};
+ /**
+ * ************************************
+ * Update the status of a check
+ * ************************************
+ *
+ * @async
+ * @param {Object} config - The configuration object.
+ * @param {string} config.checkId - The ID of the check to update.
+ * @param {boolean} config.ack - The acknowledgment to update the check to.
+ * @returns {Promise} The response from the axios PUT request.
+ *
+ */
+ async updateCheckStatus(config) {
+ return this.axiosInstance.put(`/checks/check/${config.checkId}`, {
+ ack: config.ack,
+ });
+ }
+
/**
* ************************************
* Get all checks for a given user
diff --git a/client/src/Utils/Theme/globalTheme.js b/client/src/Utils/Theme/globalTheme.js
index ae014432d..eb827a907 100644
--- a/client/src/Utils/Theme/globalTheme.js
+++ b/client/src/Utils/Theme/globalTheme.js
@@ -36,6 +36,11 @@ const baseTheme = (palette) => ({
color: palette.primary.contrastTextTertiary,
fontWeight: 400,
},
+ label: {
+ fontSize: "var(--env-var-font-size-medium)",
+ color: palette.primary.contrastTextSecondary,
+ fontWeight: 500,
+ },
},
/* TODO change to 4 */
spacing: 2,
diff --git a/client/src/locales/ar.json b/client/src/locales/ar.json
index 81a2bb05f..a7b64dd80 100644
--- a/client/src/locales/ar.json
+++ b/client/src/locales/ar.json
@@ -3,38 +3,11 @@
"title": "",
"distributedStatusHeaderText": "",
"distributedStatusSubHeaderText": "",
- "settingsGeneralSettings": "",
- "settingsDisplayTimezone": "",
- "settingsDisplayTimezoneDescription": "",
- "settingsAppearance": "",
- "settingsAppearanceDescription": "",
- "settingsThemeMode": "",
- "settingsLanguage": "",
- "settingsEnabled": "",
"settingsDisabled": "",
- "settingsHistoryAndMonitoring": "",
- "settingsHistoryAndMonitoringDescription": "",
- "settingsTTLLabel": "",
- "settingsTTLOptionalLabel": "",
- "settingsClearAllStats": "",
- "settingsClearAllStatsButton": "",
- "settingsClearAllStatsDialogTitle": "",
- "settingsClearAllStatsDialogDescription": "",
- "settingsClearAllStatsDialogConfirm": "",
- "settingsDemoMonitors": "",
- "settingsDemoMonitorsDescription": "",
- "settingsAddDemoMonitorsButton": "",
- "settingsRemoveAllMonitorsButton": "",
- "settingsRemoveAllMonitorsDialogTitle": "",
- "settingsRemoveAllMonitorsDialogConfirm": "",
- "settingsAbout": "",
- "settingsDevelopedBy": "",
- "settingsSave": "",
"settingsSuccessSaved": "",
"settingsFailedToSave": "",
"settingsStatsCleared": "",
"settingsFailedToClearStats": "",
- "settingsDemoMonitorsAdded": "",
"settingsFailedToAddDemoMonitors": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
@@ -360,16 +333,10 @@
"noFileSelected": "",
"fallbackPage": ""
},
- "settingsSystemReset": "",
- "settingsSystemResetDescription": "",
"DeleteAccountTitle": "",
"DeleteAccountButton": "",
"publicLink": "",
"maskedPageSpeedKeyPlaceholder": "",
- "pageSpeedApiKeyFieldTitle": "",
- "pageSpeedApiKeyFieldLabel": "",
- "pageSpeedApiKeyFieldDescription": "",
- "pageSpeedApiKeyFieldResetLabel": "",
"reset": "",
"ignoreTLSError": "",
"tlsErrorIgnored": "",
@@ -431,22 +398,13 @@
"password": "",
"team": "",
"logOut": "",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "",
- "settingsEmailDescription": "",
- "settingsEmailHost": "",
- "settingsEmailPort": "",
- "settingsEmailAddress": "",
- "settingsEmailPassword": "",
"settingsEmailUser": "",
- "settingsEmailFieldResetLabel": "",
"state": "",
"statusBreadCrumbsStatusPages": "",
"statusBreadCrumbsDetails": "",
- "settingsThemeModeLight": "",
- "settingsThemeModeDark": "",
- "settingsClearAllStatsDialogCancel": "",
"commonSaving": "",
"navControls": "",
"incidentsPageTitle": "",
@@ -461,26 +419,18 @@
"passwordRequirements": "",
"saving": ""
},
- "settingsEmailConnectionHost": "",
"emailSent": "",
"failedToSendEmail": "",
- "settingsTestEmail": "",
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "",
- "settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "",
"up": "",
"down": "",
"pending": ""
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/cs.json b/client/src/locales/cs.json
index 4e1170ee7..a5249ebbd 100644
--- a/client/src/locales/cs.json
+++ b/client/src/locales/cs.json
@@ -3,38 +3,11 @@
"title": "",
"distributedStatusHeaderText": "",
"distributedStatusSubHeaderText": "",
- "settingsGeneralSettings": "Obecná nastavení",
- "settingsDisplayTimezone": "",
- "settingsDisplayTimezoneDescription": "",
- "settingsAppearance": "Vzhled",
- "settingsAppearanceDescription": "",
- "settingsThemeMode": "",
- "settingsLanguage": "Jazyk",
- "settingsEnabled": "Zapnuto",
"settingsDisabled": "Vypnuto",
- "settingsHistoryAndMonitoring": "Historie a monitorování",
- "settingsHistoryAndMonitoringDescription": "",
- "settingsTTLLabel": "",
- "settingsTTLOptionalLabel": "",
- "settingsClearAllStats": "",
- "settingsClearAllStatsButton": "",
- "settingsClearAllStatsDialogTitle": "",
- "settingsClearAllStatsDialogDescription": "",
- "settingsClearAllStatsDialogConfirm": "",
- "settingsDemoMonitors": "",
- "settingsDemoMonitorsDescription": "",
- "settingsAddDemoMonitorsButton": "",
- "settingsRemoveAllMonitorsButton": "",
- "settingsRemoveAllMonitorsDialogTitle": "",
- "settingsRemoveAllMonitorsDialogConfirm": "",
- "settingsAbout": "",
- "settingsDevelopedBy": "Vyvinuto společností Bluewave Labs.",
- "settingsSave": "Uložit",
"settingsSuccessSaved": "Nastavení bylo úspěšně uloženo",
"settingsFailedToSave": "Nepodařilo se uložit nastavení",
"settingsStatsCleared": "",
"settingsFailedToClearStats": "",
- "settingsDemoMonitorsAdded": "",
"settingsFailedToAddDemoMonitors": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
@@ -360,16 +333,10 @@
"noFileSelected": "",
"fallbackPage": ""
},
- "settingsSystemReset": "",
- "settingsSystemResetDescription": "",
"DeleteAccountTitle": "",
"DeleteAccountButton": "",
"publicLink": "",
"maskedPageSpeedKeyPlaceholder": "",
- "pageSpeedApiKeyFieldTitle": "",
- "pageSpeedApiKeyFieldLabel": "",
- "pageSpeedApiKeyFieldDescription": "",
- "pageSpeedApiKeyFieldResetLabel": "",
"reset": "",
"ignoreTLSError": "",
"tlsErrorIgnored": "",
@@ -431,22 +398,13 @@
"password": "",
"team": "",
"logOut": "",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "",
- "settingsEmailDescription": "",
- "settingsEmailHost": "",
- "settingsEmailPort": "",
- "settingsEmailAddress": "",
- "settingsEmailPassword": "",
"settingsEmailUser": "",
- "settingsEmailFieldResetLabel": "",
"state": "",
"statusBreadCrumbsStatusPages": "",
"statusBreadCrumbsDetails": "",
- "settingsThemeModeLight": "",
- "settingsThemeModeDark": "",
- "settingsClearAllStatsDialogCancel": "",
"commonSaving": "",
"navControls": "",
"incidentsPageTitle": "",
@@ -461,26 +419,18 @@
"passwordRequirements": "",
"saving": ""
},
- "settingsEmailConnectionHost": "",
"emailSent": "",
"failedToSendEmail": "",
- "settingsTestEmail": "",
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "",
- "settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "",
"up": "",
"down": "",
"pending": ""
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/de.json b/client/src/locales/de.json
index e33adab68..948c384d8 100644
--- a/client/src/locales/de.json
+++ b/client/src/locales/de.json
@@ -3,57 +3,30 @@
"title": "Titel",
"distributedStatusHeaderText": "",
"distributedStatusSubHeaderText": "",
- "settingsGeneralSettings": "Einstellungen",
- "settingsDisplayTimezone": "Zeitzone anzeigen",
- "settingsDisplayTimezoneDescription": "",
- "settingsAppearance": "",
- "settingsAppearanceDescription": "",
- "settingsThemeMode": "Theme modus",
- "settingsLanguage": "Sprache",
- "settingsEnabled": "Aktiv",
- "settingsDisabled": "",
- "settingsHistoryAndMonitoring": "",
- "settingsHistoryAndMonitoringDescription": "",
- "settingsTTLLabel": "",
- "settingsTTLOptionalLabel": "",
- "settingsClearAllStats": "",
- "settingsClearAllStatsButton": "",
- "settingsClearAllStatsDialogTitle": "",
- "settingsClearAllStatsDialogDescription": "",
- "settingsClearAllStatsDialogConfirm": "",
- "settingsDemoMonitors": "",
- "settingsDemoMonitorsDescription": "",
- "settingsAddDemoMonitorsButton": "",
- "settingsRemoveAllMonitorsButton": "",
- "settingsRemoveAllMonitorsDialogTitle": "",
- "settingsRemoveAllMonitorsDialogConfirm": "",
- "settingsAbout": "",
- "settingsDevelopedBy": "",
- "settingsSave": "",
- "settingsSuccessSaved": "",
- "settingsFailedToSave": "",
- "settingsStatsCleared": "",
- "settingsFailedToClearStats": "",
- "settingsDemoMonitorsAdded": "",
+ "settingsDisabled": "Inaktiv",
+ "settingsSuccessSaved": "Einstellungen erfolgreich gespeichert",
+ "settingsFailedToSave": "Fehler beim Speichern der Einstellungen",
+ "settingsStatsCleared": "Statistiken gelöscht",
+ "settingsFailedToClearStats": "Fehler beim löschen der Statistiken",
"settingsFailedToAddDemoMonitors": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
"starPromptTitle": "",
"starPromptDescription": "",
- "https": "",
- "http": "",
+ "https": "HTTPS",
+ "http": "HTTP",
"monitor": "",
- "aboutus": "",
- "now": "",
- "delete": "",
- "configure": "",
- "responseTime": "",
- "ms": "",
+ "aboutus": "Über uns",
+ "now": "Jetzt",
+ "delete": "Löschen",
+ "configure": "Einstellungen",
+ "responseTime": "Antwortzeit",
+ "ms": "ms",
"bar": "",
"area": "",
- "country": "",
- "city": "",
- "response": "",
+ "country": "Land",
+ "city": "Stadt",
+ "response": "Antwort",
"monitorStatusUp": "",
"monitorStatusDown": "",
"webhookSendSuccess": "",
@@ -67,7 +40,7 @@
"distributedUptimeCreateChecksDescription": "",
"distributedUptimeCreateIncidentNotification": "",
"distributedUptimeCreateIncidentDescription": "",
- "distributedUptimeCreateAdvancedSettings": "",
+ "distributedUptimeCreateAdvancedSettings": "Erweiterte Einstellungen",
"distributedUptimeDetailsNoMonitorHistory": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "",
@@ -76,33 +49,33 @@
"testNotification": "",
"addOrEditNotifications": "",
"slack": {
- "label": "",
+ "label": "Slack",
"description": "",
- "webhookLabel": "",
+ "webhookLabel": "Webhook URL",
"webhookPlaceholder": "",
"webhookRequired": ""
},
"discord": {
- "label": "",
+ "label": "Discord",
"description": "",
- "webhookLabel": "",
+ "webhookLabel": "Discord Webhook URL",
"webhookPlaceholder": "",
"webhookRequired": ""
},
"telegram": {
- "label": "",
+ "label": "Telegram",
"description": "",
"tokenLabel": "",
- "tokenPlaceholder": "",
+ "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"chatIdLabel": "",
- "chatIdPlaceholder": "",
+ "chatIdPlaceholder": "-1001234567890",
"fieldsRequired": ""
},
"webhook": {
- "label": "",
+ "label": "Webhooks",
"description": "",
- "urlLabel": "",
- "urlPlaceholder": "",
+ "urlLabel": "Webhook URL",
+ "urlPlaceholder": "https://your-server.com/webhook",
"urlRequired": ""
},
"testNotificationDevelop": "",
@@ -151,14 +124,14 @@
"distributedUptimeStatusLogoUploadButton": "",
"distributedUptimeStatusStandardMonitorsHeader": "",
"distributedUptimeStatusStandardMonitorsDescription": "",
- "distributedUptimeStatusCreateYour": "",
- "distributedUptimeStatusEditYour": "",
+ "distributedUptimeStatusCreateYour": "Erstelle Dein",
+ "distributedUptimeStatusEditYour": "Ändere Dein",
"distributedUptimeStatusPublishedLabel": "",
- "distributedUptimeStatusCompanyNameLabel": "",
+ "distributedUptimeStatusCompanyNameLabel": "Firmenname",
"distributedUptimeStatusPageAddressLabel": "",
- "distributedUptimeStatus30Days": "",
- "distributedUptimeStatus60Days": "",
- "distributedUptimeStatus90Days": "",
+ "distributedUptimeStatus30Days": "30 Tage",
+ "distributedUptimeStatus60Days": "60 Tage",
+ "distributedUptimeStatus90Days": "90 Tage",
"distributedUptimeStatusPageNotSetUp": "",
"distributedUptimeStatusContactAdmin": "",
"distributedUptimeStatusPageNotPublic": "",
@@ -360,16 +333,10 @@
"noFileSelected": "",
"fallbackPage": ""
},
- "settingsSystemReset": "",
- "settingsSystemResetDescription": "",
"DeleteAccountTitle": "",
"DeleteAccountButton": "",
"publicLink": "",
"maskedPageSpeedKeyPlaceholder": "",
- "pageSpeedApiKeyFieldTitle": "",
- "pageSpeedApiKeyFieldLabel": "",
- "pageSpeedApiKeyFieldDescription": "",
- "pageSpeedApiKeyFieldResetLabel": "",
"reset": "",
"ignoreTLSError": "",
"tlsErrorIgnored": "",
@@ -431,22 +398,13 @@
"password": "",
"team": "",
"logOut": "",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "",
- "settingsEmailDescription": "",
- "settingsEmailHost": "",
- "settingsEmailPort": "",
- "settingsEmailAddress": "",
- "settingsEmailPassword": "",
"settingsEmailUser": "",
- "settingsEmailFieldResetLabel": "",
"state": "",
"statusBreadCrumbsStatusPages": "",
"statusBreadCrumbsDetails": "",
- "settingsThemeModeLight": "",
- "settingsThemeModeDark": "",
- "settingsClearAllStatsDialogCancel": "",
"commonSaving": "",
"navControls": "",
"incidentsPageTitle": "",
@@ -461,26 +419,18 @@
"passwordRequirements": "",
"saving": ""
},
- "settingsEmailConnectionHost": "",
"emailSent": "",
"failedToSendEmail": "",
- "settingsTestEmail": "",
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "",
- "settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "",
"up": "",
"down": "",
"pending": ""
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/en.json b/client/src/locales/en.json
index 5c81a6e14..aad4c1359 100644
--- a/client/src/locales/en.json
+++ b/client/src/locales/en.json
@@ -387,6 +387,7 @@
"incidentsOptionsHeaderFilterBy": "Filter by:",
"incidentsOptionsHeaderFilterCannotResolve": "Cannot resolve",
"incidentsOptionsHeaderFilterDown": "Down",
+ "incidentsOptionsHeaderFilterResolved": "Resolved",
"incidentsOptionsHeaderLastDay": "Last day",
"incidentsOptionsHeaderLastHour": "Last hour",
"incidentsOptionsHeaderLastWeek": "Last week",
@@ -587,10 +588,6 @@
"now": "Now",
"os": "OS",
"pageSpeedAddApiKey": "to add your API key.",
- "pageSpeedApiKeyFieldDescription": "Enter your Google PageSpeed API key to enable pagespeed monitoring. Click Reset to update the key.",
- "pageSpeedApiKeyFieldLabel": "PageSpeed API key",
- "pageSpeedApiKeyFieldResetLabel": "API key is set. Click Reset to change it.",
- "pageSpeedApiKeyFieldTitle": "Google PageSpeed API key",
"pageSpeedConfigureSettingsDescription": "Here you can select the URL of the host, together with the type of monitor.",
"pageSpeedDetailsPerformanceReport": "Values are estimated and may vary.",
"pageSpeedDetailsPerformanceReportCalculator": "See calculator",
@@ -664,74 +661,98 @@
"selectAll": "Select all",
"sendTestNotifications": "Send test notifications",
"seperateEmails": "You can separate multiple emails with a comma",
- "settingURLDisabled": "Disabled",
- "settingsAbout": "About",
- "settingsAddDemoMonitorsButton": "Add demo monitors",
- "settingsAppearance": "Appearance",
- "settingsAppearanceDescription": "Switch between light and dark mode, or change user interface language",
- "settingsClearAllStats": "Clear all stats. This is irreversible.",
- "settingsClearAllStatsButton": "Clear all stats",
- "settingsClearAllStatsDialogCancel": "Cancel",
- "settingsClearAllStatsDialogConfirm": "Yes, clear all stats",
- "settingsClearAllStatsDialogDescription": "Once removed, the monitoring history and stats cannot be retrieved.",
- "settingsClearAllStatsDialogTitle": "Do you want to clear all stats?",
- "settingsDemoMonitors": "Demo monitors",
- "settingsDemoMonitorsAdded": "Successfully added demo monitors",
- "settingsDemoMonitorsDescription": "Add sample monitors for demonstration purposes.",
- "settingsDevelopedBy": "Developed by Bluewave Labs.",
"settingsDisabled": "Disabled",
- "settingsDisplayTimezone": "Display timezone",
- "settingsDisplayTimezoneDescription": "Select the timezone used to display dates and times throughout the application.",
- "settingsEmail": "Email",
- "settingsEmailAddress": "Email address - Used for authentication",
- "settingsEmailConnectionHost": "Email connection host - Hostname to use in the HELO/EHLO greeting",
- "settingsEmailDescription": "Configure the email settings for your system. This is used to send notifications and alerts.",
- "settingsEmailFieldResetLabel": "Password is set. Click Reset to change it.",
- "settingsEmailHost": "Email host - Hostname or IP address to connect to",
- "settingsEmailIgnoreTLS": "Ignore TLS - Disable STARTTLS",
- "settingsEmailPassword": "Email password - Password for authentication",
- "settingsEmailPool": "Pool - Enable connection pooling",
- "settingsEmailPort": "Email port - Port to connect to",
- "settingsEmailRejectUnauthorized": "Reject Unauthorized",
- "settingsEmailRequireTLS": "Require TLS - Force STARTTLS",
- "settingsEmailRequiredFields": "Email address, host, port and password are required",
- "settingsEmailSecure": "Secure - Use SSL",
- "settingsEmailTLSServername": "TLS Servername - Optional Hostname for TLS Validation when host is an IP",
- "settingsEmailTransportLinkDescription": "This builds an SMTP transport for NodeMailer",
- "settingsEmailTransportLinkText": "See specifications here",
"settingsEmailUser": "Email user - Username for authentication, overrides email address if specified",
- "settingsEnabled": "Enabled",
"settingsFailedToAddDemoMonitors": "Failed to add demo monitors",
"settingsFailedToClearStats": "Failed to clear stats",
"settingsFailedToDeleteMonitors": "Failed to delete all monitors",
"settingsFailedToSave": "Failed to save settings",
- "settingsGeneralSettings": "General settings",
- "settingsHistoryAndMonitoring": "History of monitoring",
- "settingsHistoryAndMonitoringDescription": "Define how long you want to retain historical data. You can also clear all existing data.",
- "settingsLanguage": "Language",
"settingsMonitorsDeleted": "Successfully deleted all monitors",
- "settingsRemoveAllMonitorsButton": "Remove all monitors",
- "settingsRemoveAllMonitorsDialogConfirm": "Yes, remove all monitors",
- "settingsRemoveAllMonitorsDialogTitle": "Do you want to remove all monitors?",
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "Developed by Bluewave Labs",
+ "labelVersion": "Version",
+ "title": "About"
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "Add demo monitors",
+ "description": "Add sample monitors for demonstration purposes.",
+ "title": "Demo monitors"
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "Send test e-mail",
+ "description": "Configure the email settings for your system. This is used to send notifications and alerts.",
+ "descriptionTransport": "This builds an SMTP transport for NodeMailer",
+ "labelAddress": "Email address - Used for authentication",
+ "labelConnectionHost": "Email connection host - Hostname to use in the HELO/EHLO greeting",
+ "labelHost": "Email host - Hostname or IP address to connect to",
+ "labelIgnoreTLS": "Disable STARTTLS: Don't use TLS even if the server supports it",
+ "labelPassword": "Email password - Password for authentication",
+ "labelPasswordSet": "Password is set. Click Reset to change it.",
+ "labelPool": "Enable connection pooling: Reuse existing connections to improve performance",
+ "labelPort": "Email port - Port to connect to",
+ "labelRejectUnauthorized": "Reject invalid certificates: Reject connections with self-signed or untrusted certificates",
+ "labelRequireTLS": "Force STARTTLS: Require TLS upgrade, fail if not supported",
+ "labelSecure": "Use SSL (recommended): Encrypt the connection using SSL/TLS",
+ "labelTLSServername": "TLS Servername - Optional Hostname for TLS Validation when host is an IP",
+ "labelUser": "Email user - Username for authentication, overrides email address if specified",
+ "linkTransport": "See specifications here",
+ "placeholderUser": "Leave empty if not required",
+ "title": "Email"
+ },
+ "pageSpeedSettings": {
+ "description": "Enter your Google PageSpeed API key to enable Google PageSpeed monitoring. Click Reset to update the key.",
+ "labelApiKey": "PageSpeed API key",
+ "labelApiKeySet": "API key is set. Click Reset to change it.",
+ "title": "Google PageSpeed API key"
+ },
+ "saveButtonLabel": "Save",
+ "statsSettings": {
+ "clearAllStatsButton": "Clear all stats",
+ "clearAllStatsDescription": "Clear all stats. This is irreversible.",
+ "clearAllStatsDialogConfirm": "Yes, clear all stats",
+ "clearAllStatsDialogDescription": "Once removed, the monitoring history and stats cannot be retrieved.",
+ "clearAllStatsDialogTitle": "Do you want to clear all stats?",
+ "description": "Define how long you want to retain historical data. You can also clear all existing data.",
+ "labelTTL": "The days you want to keep monitoring history.",
+ "labelTTLOptional": "0 for infinite",
+ "title": "Monitor history"
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "Remove all monitors",
+ "description": "Remove all monitors from your system.",
+ "dialogConfirm": "Yes, remove all monitors",
+ "dialogDescription": "Once removed, the monitors cannot be retrieved.",
+ "dialogTitle": "Do you want to remove all monitors?",
+ "title": "System reset"
+ },
+ "timezoneSettings": {
+ "description": "Select the timezone used to display dates and times throughout the application.",
+ "label": "Display timezone",
+ "title": "Display timezone"
+ },
+ "title": "Settings",
+ "uiSettings": {
+ "description": "Switch between light and dark mode, or change user interface language.",
+ "labelLanguage": "Language",
+ "labelTheme": "Theme mode",
+ "title": "Appearance"
+ },
+ "urlSettings": {
+ "description": "Display the IP address or URL of monitor on the public Status page. If it's disabled, only the monitor name will be shown to protect sensitive information.",
+ "label": "Display IP/URL on status page",
+ "selectDisabled": "Disabled",
+ "selectEnabled": "Enabled",
+ "title": "Monitor IP/URL on Status Page"
+ }
+ },
"settingsSave": "Save",
"settingsStatsCleared": "Stats cleared successfully",
"settingsSuccessSaved": "Settings saved successfully",
- "settingsSystemReset": "System reset",
- "settingsSystemResetDescription": "Remove all monitors from your system.",
- "settingsTTLLabel": "The days you want to keep monitoring history.",
- "settingsTTLOptionalLabel": "0 for infinite",
- "settingsTestEmail": "Send test e-mail",
"settingsTestEmailFailed": "Failed to send test email",
"settingsTestEmailFailedWithReason": "Failed to send test email: {{reason}}",
"settingsTestEmailSuccess": "Test email sent successfully",
"settingsTestEmailUnknownError": "Unknown error",
- "settingsThemeMode": "Theme Mode",
- "settingsThemeModeDark": "Dark",
- "settingsThemeModeLight": "Light",
- "settingsURLDescription": "Display the IP address or URL of monitor on the public Status page. If it's disabled, only the monitor name will be shown to protect sensitive information.",
- "settingsURLEnabled": "Enabled",
- "settingsURLSelectTitle": "Display IP/URL on status page",
- "settingsURLTitle": "Monitor IP/URL on Status Page",
"showAdminLoginLink": "Show \"Administrator? Login Here\" link on the status page",
"showCharts": "Show charts",
"showUptimePercentage": "Show uptime percentage",
@@ -750,7 +771,11 @@
"pending": "Pending...",
"up": "Your site is up."
},
+ "statusPageCreate": {
+ "buttonSave": "Save"
+ },
"statusPageCreateAppearanceDescription": "Define the default look and feel of your public status page.",
+ "statusPageCreateAppearanceTitle": "Appearance",
"statusPageCreateBasicInfoDescription": "Define company name and the subdomain that your status page points to.",
"statusPageCreateBasicInfoStatusPageAddress": "Your status page address",
"statusPageCreateSelectTimeZoneDescription": "Select the timezone that your status page will be displayed in.",
diff --git a/client/src/locales/es.json b/client/src/locales/es.json
index 3579117ae..4cbd91336 100644
--- a/client/src/locales/es.json
+++ b/client/src/locales/es.json
@@ -3,38 +3,11 @@
"title": "Titulo",
"distributedStatusHeaderText": "",
"distributedStatusSubHeaderText": "",
- "settingsGeneralSettings": "",
- "settingsDisplayTimezone": "",
- "settingsDisplayTimezoneDescription": "",
- "settingsAppearance": "",
- "settingsAppearanceDescription": "",
- "settingsThemeMode": "",
- "settingsLanguage": "",
- "settingsEnabled": "",
"settingsDisabled": "",
- "settingsHistoryAndMonitoring": "",
- "settingsHistoryAndMonitoringDescription": "",
- "settingsTTLLabel": "",
- "settingsTTLOptionalLabel": "",
- "settingsClearAllStats": "",
- "settingsClearAllStatsButton": "",
- "settingsClearAllStatsDialogTitle": "",
- "settingsClearAllStatsDialogDescription": "",
- "settingsClearAllStatsDialogConfirm": "",
- "settingsDemoMonitors": "",
- "settingsDemoMonitorsDescription": "",
- "settingsAddDemoMonitorsButton": "",
- "settingsRemoveAllMonitorsButton": "",
- "settingsRemoveAllMonitorsDialogTitle": "",
- "settingsRemoveAllMonitorsDialogConfirm": "",
- "settingsAbout": "",
- "settingsDevelopedBy": "",
- "settingsSave": "",
"settingsSuccessSaved": "",
"settingsFailedToSave": "",
"settingsStatsCleared": "",
"settingsFailedToClearStats": "",
- "settingsDemoMonitorsAdded": "",
"settingsFailedToAddDemoMonitors": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
@@ -360,16 +333,10 @@
"noFileSelected": "",
"fallbackPage": ""
},
- "settingsSystemReset": "",
- "settingsSystemResetDescription": "",
"DeleteAccountTitle": "",
"DeleteAccountButton": "",
"publicLink": "",
"maskedPageSpeedKeyPlaceholder": "",
- "pageSpeedApiKeyFieldTitle": "",
- "pageSpeedApiKeyFieldLabel": "",
- "pageSpeedApiKeyFieldDescription": "",
- "pageSpeedApiKeyFieldResetLabel": "",
"reset": "",
"ignoreTLSError": "",
"tlsErrorIgnored": "",
@@ -431,22 +398,13 @@
"password": "",
"team": "",
"logOut": "",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "",
- "settingsEmailDescription": "",
- "settingsEmailHost": "",
- "settingsEmailPort": "",
- "settingsEmailAddress": "",
- "settingsEmailPassword": "",
"settingsEmailUser": "",
- "settingsEmailFieldResetLabel": "",
"state": "",
"statusBreadCrumbsStatusPages": "",
"statusBreadCrumbsDetails": "",
- "settingsThemeModeLight": "",
- "settingsThemeModeDark": "",
- "settingsClearAllStatsDialogCancel": "",
"commonSaving": "",
"navControls": "",
"incidentsPageTitle": "",
@@ -461,26 +419,18 @@
"passwordRequirements": "",
"saving": ""
},
- "settingsEmailConnectionHost": "",
"emailSent": "",
"failedToSendEmail": "",
- "settingsTestEmail": "",
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "",
- "settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "",
"up": "",
"down": "",
"pending": ""
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/fi.json b/client/src/locales/fi.json
index d92fcf8db..1783f8a07 100644
--- a/client/src/locales/fi.json
+++ b/client/src/locales/fi.json
@@ -3,38 +3,11 @@
"title": "Otsikko",
"distributedStatusHeaderText": "Reaaliaikainen kattavuus oikeilla laitteilla",
"distributedStatusSubHeaderText": "Miljoonien laitteiden voimin ympäri maailman näet järjestelmän suorituskyvyn maailman alueittain, maittain tai kaupungeittain",
- "settingsGeneralSettings": "Yleiset asetukset",
- "settingsDisplayTimezone": "Näytä aikavyöhyke",
- "settingsDisplayTimezoneDescription": "Valitse sovelluksessa käytettävä aikavyöhyke päivämäärien ja aikojen näyttämiseen.",
- "settingsAppearance": "Ulkonäkö",
- "settingsAppearanceDescription": "Vaihda teema vaaleaksi tai tummaksi tai vaihda käyttöliittymän kieli",
- "settingsThemeMode": "Teematila",
- "settingsLanguage": "Kieli",
- "settingsEnabled": "Käytössä",
"settingsDisabled": "Poistettu käytöstä",
- "settingsHistoryAndMonitoring": "Valvonnan historia",
- "settingsHistoryAndMonitoringDescription": "Määritä, kuinka pitkään haluat säilyttää historiallisia tietoja. Voit myös tyhjentää kaikki olemassa olevat tiedot.",
- "settingsTTLLabel": "Kuinka monta päivää haluat säilyttää valvontahistorian.",
- "settingsTTLOptionalLabel": "0 on ääretön",
- "settingsClearAllStats": "Tyhjennä kaikki tilastot. Tämä on peruuttamaton.",
- "settingsClearAllStatsButton": "Tyhjennä kaikki tilastot",
- "settingsClearAllStatsDialogTitle": "Haluatko tyhjentää kaikki tilastot?",
- "settingsClearAllStatsDialogDescription": "Kun valvontahistoria ja tilastot on poistettu, niitä ei voi palauttaa.",
- "settingsClearAllStatsDialogConfirm": "",
- "settingsDemoMonitors": "",
- "settingsDemoMonitorsDescription": "",
- "settingsAddDemoMonitorsButton": "",
- "settingsRemoveAllMonitorsButton": "",
- "settingsRemoveAllMonitorsDialogTitle": "",
- "settingsRemoveAllMonitorsDialogConfirm": "",
- "settingsAbout": "Tietoja",
- "settingsDevelopedBy": "Kehittänyt Bluewave Labs.",
- "settingsSave": "Tallenna",
"settingsSuccessSaved": "",
"settingsFailedToSave": "",
"settingsStatsCleared": "",
"settingsFailedToClearStats": "",
- "settingsDemoMonitorsAdded": "",
"settingsFailedToAddDemoMonitors": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
@@ -360,16 +333,10 @@
"noFileSelected": "Ei valittua tiedostoa",
"fallbackPage": ""
},
- "settingsSystemReset": "Järjestelmän palautus",
- "settingsSystemResetDescription": "",
"DeleteAccountTitle": "Poista tili",
"DeleteAccountButton": "Poista tili",
"publicLink": "Julkinen linkki",
"maskedPageSpeedKeyPlaceholder": "*************************************",
- "pageSpeedApiKeyFieldTitle": "Google PageSpeed API-avain",
- "pageSpeedApiKeyFieldLabel": "PageSpeed API-avain",
- "pageSpeedApiKeyFieldDescription": "",
- "pageSpeedApiKeyFieldResetLabel": "",
"reset": "Palauta",
"ignoreTLSError": "",
"tlsErrorIgnored": "",
@@ -431,22 +398,13 @@
"password": "Salasana",
"team": "Tiimi",
"logOut": "Kirjaudu ulos",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "Sähköpostiasetukset",
- "settingsEmailDescription": "Määritä sähköpostiasetukset",
- "settingsEmailHost": "",
- "settingsEmailPort": "Sähköpostin portti - Portti johon yhdistetään",
- "settingsEmailAddress": "Sähköpostiosoite - Käytetään tunnistautumiseen",
- "settingsEmailPassword": "Sähköpostin salasana - Salasana tunnistautumiseen",
"settingsEmailUser": "",
- "settingsEmailFieldResetLabel": "Salasana on asetettu. Paina Palauta vaihtaaksesi sen.",
"state": "Tila",
"statusBreadCrumbsStatusPages": "Tilasivut",
"statusBreadCrumbsDetails": "Tiedot",
- "settingsThemeModeLight": "Vaalea",
- "settingsThemeModeDark": "Tumma",
- "settingsClearAllStatsDialogCancel": "Peruuta",
"commonSaving": "Tallennetaan...",
"navControls": "Ohjaimet",
"incidentsPageTitle": "Häiriöt",
@@ -461,26 +419,18 @@
"passwordRequirements": "Uuden salasanan on oltava vähintään 8 merkkiä pitkä ja sen on sisältävä vähintään yksi iso kirjain, yksi pieni kirjain, yksi numero sekä yksi erikoismerkki.",
"saving": "Tallennetaan..."
},
- "settingsEmailConnectionHost": "",
"emailSent": "Sähköpostin lähetys onnistui",
"failedToSendEmail": "Sähköpostin lähetys epäonnistui",
- "settingsTestEmail": "Lähetä testi sähköposti",
"settingsTestEmailSuccess": "Testisähköpostin lähetys onnistui",
"settingsTestEmailFailed": "Testisähköpostin lähetys epäonnistui",
"settingsTestEmailFailedWithReason": "Testisähköpostin lähetys epäonnistui: {{reason}}",
"settingsTestEmailUnknownError": "Tuntematon virhe",
- "settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "Valvonta on keskeytetty.",
"up": "Sivusi on ylhäällä.",
"down": "Sivusi on alhaalla.",
"pending": "Odottaa..."
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/fr.json b/client/src/locales/fr.json
index 729296216..5aabeb6e3 100644
--- a/client/src/locales/fr.json
+++ b/client/src/locales/fr.json
@@ -3,38 +3,11 @@
"title": "Titre",
"distributedStatusHeaderText": "",
"distributedStatusSubHeaderText": "",
- "settingsGeneralSettings": "Paramètres généraux",
- "settingsDisplayTimezone": "Fuseau horaire d'affichage",
- "settingsDisplayTimezoneDescription": "Le fuseau horaire du tableau de bord que vous affichez publiquement.",
- "settingsAppearance": "Apparence",
- "settingsAppearanceDescription": "",
- "settingsThemeMode": "",
- "settingsLanguage": "Langue",
- "settingsEnabled": "Activé",
"settingsDisabled": "Désactivé",
- "settingsHistoryAndMonitoring": "",
- "settingsHistoryAndMonitoringDescription": "",
- "settingsTTLLabel": "",
- "settingsTTLOptionalLabel": "0 pour infini",
- "settingsClearAllStats": "Effacer les stats. C'est irréversible.",
- "settingsClearAllStatsButton": "Effacer les stats",
- "settingsClearAllStatsDialogTitle": "Voulez-vous effacer toutes les stats ?",
- "settingsClearAllStatsDialogDescription": "",
- "settingsClearAllStatsDialogConfirm": "Oui, effacer les stats",
- "settingsDemoMonitors": "",
- "settingsDemoMonitorsDescription": "",
- "settingsAddDemoMonitorsButton": "",
- "settingsRemoveAllMonitorsButton": "",
- "settingsRemoveAllMonitorsDialogTitle": "",
- "settingsRemoveAllMonitorsDialogConfirm": "",
- "settingsAbout": "",
- "settingsDevelopedBy": "",
- "settingsSave": "",
"settingsSuccessSaved": "",
"settingsFailedToSave": "",
"settingsStatsCleared": "",
"settingsFailedToClearStats": "",
- "settingsDemoMonitorsAdded": "",
"settingsFailedToAddDemoMonitors": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
@@ -360,16 +333,10 @@
"noFileSelected": "",
"fallbackPage": ""
},
- "settingsSystemReset": "",
- "settingsSystemResetDescription": "",
"DeleteAccountTitle": "Supprimer le compte",
"DeleteAccountButton": "Supprimer le compte",
"publicLink": "",
"maskedPageSpeedKeyPlaceholder": "",
- "pageSpeedApiKeyFieldTitle": "",
- "pageSpeedApiKeyFieldLabel": "",
- "pageSpeedApiKeyFieldDescription": "",
- "pageSpeedApiKeyFieldResetLabel": "",
"reset": "",
"ignoreTLSError": "",
"tlsErrorIgnored": "",
@@ -431,22 +398,13 @@
"password": "",
"team": "",
"logOut": "Déconnexion",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "Email",
- "settingsEmailDescription": "",
- "settingsEmailHost": "",
- "settingsEmailPort": "",
- "settingsEmailAddress": "",
- "settingsEmailPassword": "",
"settingsEmailUser": "",
- "settingsEmailFieldResetLabel": "",
"state": "",
"statusBreadCrumbsStatusPages": "",
"statusBreadCrumbsDetails": "",
- "settingsThemeModeLight": "Clair",
- "settingsThemeModeDark": "Sombre",
- "settingsClearAllStatsDialogCancel": "Annuler",
"commonSaving": "Sauvegarde...",
"navControls": "",
"incidentsPageTitle": "Incidents",
@@ -461,26 +419,18 @@
"passwordRequirements": "Le nouveau mot de passe doit contenir au moins 8 caractères et au moins une lettre majuscule, une lettre minuscule, un chiffre et un caractère spécial.",
"saving": "Sauvegarde..."
},
- "settingsEmailConnectionHost": "",
"emailSent": "",
"failedToSendEmail": "",
- "settingsTestEmail": "",
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "Erreur inconnue",
- "settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "",
"up": "",
"down": "",
"pending": ""
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/pt-BR.json b/client/src/locales/pt-BR.json
index fa6197bb3..37604b53b 100644
--- a/client/src/locales/pt-BR.json
+++ b/client/src/locales/pt-BR.json
@@ -3,38 +3,11 @@
"title": "Título",
"distributedStatusHeaderText": "Cobertura em tempo real e em dispositivos reais",
"distributedStatusSubHeaderText": "Impulsionado por milhões de dispositivos em todo o mundo, visualize o desempenho do sistema por região global, país ou cidade",
- "settingsGeneralSettings": "Configurações gerais",
- "settingsDisplayTimezone": "Fuso horário",
- "settingsDisplayTimezoneDescription": "Selecione o fuso horário usado para exibir datas e horas em todo o aplicativo.",
- "settingsAppearance": "Aparência",
- "settingsAppearanceDescription": "Alterne entre o modo claro e escuro ou altere o idioma da interface do usuário",
- "settingsThemeMode": "Tema",
- "settingsLanguage": "Linguagem",
- "settingsEnabled": "Habilitado",
"settingsDisabled": "Desabilitado",
- "settingsHistoryAndMonitoring": "Histórico de monitoramento",
- "settingsHistoryAndMonitoringDescription": "Defina por quanto tempo você deseja manter os dados de histórico. Você também pode limpar todos os dados existentes.",
- "settingsTTLLabel": "Os dias em que você deseja manter os dados de histórico.",
- "settingsTTLOptionalLabel": "0 para infinito",
- "settingsClearAllStats": "Limpe todas as estatísticas. Isso é irreversível.",
- "settingsClearAllStatsButton": "Limpar todas as estatísticas",
- "settingsClearAllStatsDialogTitle": "Você quer limpar todas as estatísticas?",
- "settingsClearAllStatsDialogDescription": "Uma vez limpo, o histórico de monitoramento e as estatísticas não podem ser recuperados.",
- "settingsClearAllStatsDialogConfirm": "Sim, limpar todas as estatísticas",
- "settingsDemoMonitors": "Monitores de demonstração",
- "settingsDemoMonitorsDescription": "Adicione monitores de genéricos para fins de demonstração.",
- "settingsAddDemoMonitorsButton": "Adicionar monitores de demonstração",
- "settingsRemoveAllMonitorsButton": "Remover todos os monitores",
- "settingsRemoveAllMonitorsDialogTitle": "Você deseja remover todos os monitores?",
- "settingsRemoveAllMonitorsDialogConfirm": "Sim, remova todos os monitores",
- "settingsAbout": "Sobre",
- "settingsDevelopedBy": "Desenvolvido pela Bluewave Labs.",
- "settingsSave": "Salvar",
"settingsSuccessSaved": "Configurações salvas com sucesso",
"settingsFailedToSave": "Falha ao salvar as configurações",
"settingsStatsCleared": "Estatísticas limpas com sucesso",
"settingsFailedToClearStats": "Falha ao limpar estatísticas",
- "settingsDemoMonitorsAdded": "Monitores de demonstração adicionados com sucesso",
"settingsFailedToAddDemoMonitors": "Falha ao adicionar monitores de demonstração",
"settingsMonitorsDeleted": "Todos os monitores foram excluídos com sucesso",
"settingsFailedToDeleteMonitors": "Falha ao excluir todos os monitores",
@@ -310,7 +283,6 @@
"statusPageCreateTabsContentFeaturesDescription": "Mostrar mais detalhes na página de status",
"showCharts": "Mostrar gráficos",
"showUptimePercentage": "Mostrar porcentagem de Uptime",
- "showAdminLoginLink": "Mostrar o link \"Administrador? Efetue login aqui\" na página de status",
"removeLogo": "Remover logo",
"statusPageStatus": "Uma página de status pública não está configurada.",
"statusPageStatusContactAdmin": "Entre em contato com seu administrador",
@@ -361,16 +333,10 @@
"noFileSelected": "Nenhum arquivo selecionado",
"fallbackPage": "Importe um arquivo para enviar uma lista de servidores em massa"
},
- "settingsSystemReset": "Resetar sistema",
- "settingsSystemResetDescription": "Remova todos os monitores do seu sistema.",
"DeleteAccountTitle": "Remover conta",
"DeleteAccountButton": "Remover conta",
"publicLink": "Link publico",
"maskedPageSpeedKeyPlaceholder": "*************************************",
- "pageSpeedApiKeyFieldTitle": "Google PageSpeed API key",
- "pageSpeedApiKeyFieldLabel": "PageSpeed API key",
- "pageSpeedApiKeyFieldDescription": "Insira sua chave da API do Google PageSpeed para ativar o monitoramento de velocidade de página. Clique em Resetar para atualizar a chave.",
- "pageSpeedApiKeyFieldResetLabel": "A chave de API está definida. Clique em Resetar para alterá-la.",
"reset": "Resetar",
"ignoreTLSError": "Ignorar erro TLS/SSL",
"tlsErrorIgnored": "Erros TLS/SSL ignorados",
@@ -432,22 +398,13 @@
"password": "Senha",
"team": "Equipe",
"logOut": "Sair",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "E-mail",
- "settingsEmailDescription": "Configurações de e-mail do seu sistema. Elas são usadas para enviar notificações e alertas.",
- "settingsEmailHost": "Host de e-mail - Nome do host ou endereço IP do servidor SMTP",
- "settingsEmailPort": "Porta de e-mail - Porta para conectar",
- "settingsEmailAddress": "Endereço de e-mail - Usado para autenticação",
- "settingsEmailPassword": "Senha de e-mail - Senha para autenticação",
"settingsEmailUser": "Usuário de e-mail - Nome de usuário para autenticação, substitui o endereço de e-mail, se especificado",
- "settingsEmailFieldResetLabel": "A senha foi definida. Clique em Redefinir para alterá-la.",
"state": "Estado",
"statusBreadCrumbsStatusPages": "Pagina de status",
"statusBreadCrumbsDetails": "Detalhes",
- "settingsThemeModeLight": "Claro",
- "settingsThemeModeDark": "Escuro",
- "settingsClearAllStatsDialogCancel": "Cancelar",
"commonSaving": "Salvando...",
"navControls": "Controles",
"incidentsPageTitle": "Incidentes",
@@ -462,26 +419,18 @@
"passwordRequirements": "A nova senha deve conter pelo menos 8 caracteres e deve ter pelo menos uma letra maiúscula, uma letra minúscula, um número e um caractere especial.",
"saving": "Salvando..."
},
- "settingsEmailConnectionHost": "Host de conexão de e-mail - Nome do host a ser usado na saudação HELO/EHLO",
"emailSent": "E-mail enviado com sucesso",
"failedToSendEmail": "Falha ao enviar e-mail",
- "settingsTestEmail": "Enviar e-mail de teste",
"settingsTestEmailSuccess": "E-mail de teste enviado com sucesso",
"settingsTestEmailFailed": "Falha ao enviar e-mail de teste",
"settingsTestEmailFailedWithReason": "Falha ao enviar e-mail de teste: {{reason}}",
"settingsTestEmailUnknownError": "Erro desconhecido",
- "settingsEmailRequiredFields": "O host e a porta do e-mail são obrigatórios",
"statusMsg": {
"paused": "O monitoramento está pausado.",
"up": "Seu site está no ar.",
"down": "Seu site está fora do ar.",
"pending": "Pendente..."
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -740,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/ru.json b/client/src/locales/ru.json
index 908bc73e7..a4ec3290f 100644
--- a/client/src/locales/ru.json
+++ b/client/src/locales/ru.json
@@ -3,38 +3,11 @@
"title": "Название",
"distributedStatusHeaderText": "Охват реального времени и реального устройства",
"distributedStatusSubHeaderText": "Работает на миллионах устройств по всему миру, просматривайте производительность системы по глобальному региону, стране или городу",
- "settingsGeneralSettings": "Общие настройки",
- "settingsDisplayTimezone": "Отображать часовой пояс",
- "settingsDisplayTimezoneDescription": "Часовой пояс панели мониторинга, которую вы публично отображаете.",
- "settingsAppearance": "Внешний вид",
- "settingsAppearanceDescription": "Переключение между светлым и темным режимом или изменение языка пользовательского интерфейса",
- "settingsThemeMode": "Тема",
- "settingsLanguage": "Язык",
- "settingsEnabled": "Включено",
"settingsDisabled": "Выключено",
- "settingsHistoryAndMonitoring": "История и мониторинг",
- "settingsHistoryAndMonitoringDescription": "Определите здесь, как долго вы хотите хранить данные. Вы также можете удалить все прошлые данные.",
- "settingsTTLLabel": "Дни, за которыми вы хотите следить.",
- "settingsTTLOptionalLabel": "0 для бесконечности",
- "settingsClearAllStats": "Очистить всю статистику. Это необратимо.",
- "settingsClearAllStatsButton": "Очистить всю статистику",
- "settingsClearAllStatsDialogTitle": "Хотите очистить всю статистику?",
- "settingsClearAllStatsDialogDescription": "После удаления ваши мониторы не могут быть восстановлены.",
- "settingsClearAllStatsDialogConfirm": "Да, очистить всю статистику",
- "settingsDemoMonitors": "Демо мониторы",
- "settingsDemoMonitorsDescription": "Здесь вы можете добавлять и удалять демонстрационные мониторы.",
- "settingsAddDemoMonitorsButton": "Добавьте демонстрационные мониторы",
- "settingsRemoveAllMonitorsButton": "Удалить все демонстрационные мониторы",
- "settingsRemoveAllMonitorsDialogTitle": "Хотите удалить все мониторы?",
- "settingsRemoveAllMonitorsDialogConfirm": "Да, очистить все мониторы",
- "settingsAbout": "О",
- "settingsDevelopedBy": "Developed by Bluewave Labs.",
- "settingsSave": "Сохранить",
"settingsSuccessSaved": "Настройки успешно сохранены",
"settingsFailedToSave": "Не удалось сохранить настройки",
"settingsStatsCleared": "Статистика успешно очищена",
"settingsFailedToClearStats": "Не удалось очистить статистику",
- "settingsDemoMonitorsAdded": "Успешно добавлены демонстрационные мониторы",
"settingsFailedToAddDemoMonitors": "Не удалось добавить демонстрационные мониторы",
"settingsMonitorsDeleted": "Успешно удалены все мониторы",
"settingsFailedToDeleteMonitors": "Не удалось удалить все мониторы",
@@ -360,16 +333,10 @@
"noFileSelected": "Файл не выбран",
"fallbackPage": "Импортируйте файл для массовой загрузки списка серверов"
},
- "settingsSystemReset": "Сброс системы",
- "settingsSystemResetDescription": "Удалите все мониторы из вашей системы.",
"DeleteAccountTitle": "Удалить аккаунт",
"DeleteAccountButton": "Удалить аккаунт",
"publicLink": "Публичная ссылка",
"maskedPageSpeedKeyPlaceholder": "*************************************",
- "pageSpeedApiKeyFieldTitle": "Ключ API Google PageSpeed",
- "pageSpeedApiKeyFieldLabel": "Ключ API PageSpeed",
- "pageSpeedApiKeyFieldDescription": "Введите свой API-ключ Google PageSpeed, чтобы включить мониторинг скорости страницы. Нажмите \"Сброс\", чтобы обновить ключ.",
- "pageSpeedApiKeyFieldResetLabel": "Установлен ключ API. Нажмите \"Сброс\", чтобы изменить его.",
"reset": "Сброс",
"ignoreTLSError": "Игнорировать ошибку TLS/SSL",
"tlsErrorIgnored": "Ошибки TLS/SSL игнорируются",
@@ -431,22 +398,13 @@
"password": "Пароль",
"team": "Команда",
"logOut": "Выйти",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "Настройки Email",
- "settingsEmailDescription": "Настройка параметров email",
- "settingsEmailHost": "Email host",
- "settingsEmailPort": "Email port",
- "settingsEmailAddress": "Email address",
- "settingsEmailPassword": "Email пароль",
"settingsEmailUser": "Email пользователь",
- "settingsEmailFieldResetLabel": "Пароль установлен. Нажмите \"Сброс\", чтобы изменить его.",
"state": "Состояние",
"statusBreadCrumbsStatusPages": "Страницы статуса",
"statusBreadCrumbsDetails": "Подробности",
- "settingsThemeModeLight": "Светлая",
- "settingsThemeModeDark": "Тёмная",
- "settingsClearAllStatsDialogCancel": "Отменить",
"commonSaving": "Сохранение...",
"navControls": "Управления",
"incidentsPageTitle": "Инциденты",
@@ -461,26 +419,18 @@
"passwordRequirements": "Новый пароль должен содержать не менее 8 символов и содержать как минимум одну заглавную букву, одну строчную букву, одну цифру и один специальный символ.",
"saving": "Сохранение..."
},
- "settingsEmailConnectionHost": "",
"emailSent": "",
"failedToSendEmail": "",
- "settingsTestEmail": "",
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "",
- "settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "",
"up": "",
"down": "",
"pending": ""
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/tr.json b/client/src/locales/tr.json
index c9e224d63..e9b8f0850 100644
--- a/client/src/locales/tr.json
+++ b/client/src/locales/tr.json
@@ -3,38 +3,11 @@
"title": "Başlık",
"distributedStatusHeaderText": "Gerçek zamanlı, Gerçek cihazlar kapsamı",
"distributedStatusSubHeaderText": "Dünya çapında milyonlarca cihaz tarafından desteklenen sistem performansını küresel bölgeye, ülkeye veya şehre göre görüntüleyin",
- "settingsGeneralSettings": "Genel ayarlar",
- "settingsDisplayTimezone": "Görüntüleme saat dilimi",
- "settingsDisplayTimezoneDescription": "Herkese açık olarak görüntülediğiniz kontrol panelinin saat dilimi.",
- "settingsAppearance": "Görünüm",
- "settingsAppearanceDescription": "Açık ve koyu mod arasında geçiş yapın veya kullanıcı arayüzü dilini değiştirin",
- "settingsThemeMode": "Tema",
- "settingsLanguage": "Dil",
- "settingsEnabled": "Etkin",
"settingsDisabled": "Devre dışı",
- "settingsHistoryAndMonitoring": "Geçmiş ve izleme",
- "settingsHistoryAndMonitoringDescription": "Verileri ne kadar süreyle saklamak istediğinizi burada tanımlayın. Ayrıca tüm geçmiş verileri kaldırabilirsiniz.",
- "settingsTTLLabel": "İzleme geçmişini saklamak istediğiniz gün sayısı.",
- "settingsTTLOptionalLabel": "Sınırsız için 0",
- "settingsClearAllStats": "Tüm istatistikleri temizle. Bu geri alınamaz.",
- "settingsClearAllStatsButton": "Tüm istatistikleri temizle",
- "settingsClearAllStatsDialogTitle": "Tüm istatistikleri temizlemek istiyor musunuz?",
- "settingsClearAllStatsDialogDescription": "Silindikten sonra, monitörleriniz geri alınamaz.",
- "settingsClearAllStatsDialogConfirm": "Evet, tüm istatistikleri temizle",
- "settingsDemoMonitors": "Demo monitörler",
- "settingsDemoMonitorsDescription": "Burada demo monitörler ekleyebilir ve kaldırabilirsiniz.",
- "settingsAddDemoMonitorsButton": "Demo monitörler ekle",
- "settingsRemoveAllMonitorsButton": "Tüm monitörleri kaldır",
- "settingsRemoveAllMonitorsDialogTitle": "Tüm monitörleri kaldırmak istiyor musunuz?",
- "settingsRemoveAllMonitorsDialogConfirm": "Evet, tüm monitörleri temizle",
- "settingsAbout": "Hakkında",
- "settingsDevelopedBy": "Bluewave Labs tarafından geliştirilmiştir.",
- "settingsSave": "Kaydet",
"settingsSuccessSaved": "Ayarlar başarıyla kaydedildi",
"settingsFailedToSave": "Ayarlar kaydedilemedi",
"settingsStatsCleared": "İstatistikler başarıyla temizlendi",
"settingsFailedToClearStats": "İstatistikler temizlenemedi",
- "settingsDemoMonitorsAdded": "Demo monitörler başarıyla eklendi",
"settingsFailedToAddDemoMonitors": "Demo monitörler eklenemedi",
"settingsMonitorsDeleted": "Tüm monitörler başarıyla silindi",
"settingsFailedToDeleteMonitors": "Monitörler silinemedi",
@@ -360,16 +333,10 @@
"noFileSelected": "Hiçbir dosya seçilmedi",
"fallbackPage": "Toplu olarak sunucu listesini yüklemek için bir dosyayı içe aktarın"
},
- "settingsSystemReset": "Sistem sıfırla",
- "settingsSystemResetDescription": "Sistemdeki tüm monitörleri silin",
"DeleteAccountTitle": "Hesabı sil",
"DeleteAccountButton": "Hesabı sil",
"publicLink": "Herkese açık bağlantı",
"maskedPageSpeedKeyPlaceholder": "*************************************",
- "pageSpeedApiKeyFieldTitle": "Google PageSpeed API anahtarı",
- "pageSpeedApiKeyFieldLabel": "PageSpeed API anahtarı",
- "pageSpeedApiKeyFieldDescription": "Sayfa hızı izlemeyi etkinleştirmek için Google PageSpeed API anahtarınızı girin. Anahtarı güncellemek için Sıfırla'ya tıklayın.",
- "pageSpeedApiKeyFieldResetLabel": "API anahtarı ayarlandı. Değiştirmek için Sıfırla'ya tıklayın.",
"reset": "Sıfırla",
"ignoreTLSError": "TLS/SSL hatalarını gözardı et",
"tlsErrorIgnored": "TLS/SSL hataları gözardı ediliyor",
@@ -431,22 +398,13 @@
"password": "Parola",
"team": "Ekip",
"logOut": "Çıkış yap",
- "notifications": "Bildirimler"
+ "notifications": "Bildirimler",
+ "logs": ""
},
- "settingsEmail": "Eposta",
- "settingsEmailDescription": "Sistem için eposta ayarlarını düzenleyin. Bu işlem eposta üzerinden bildirim ve alarm almak için gereklidir.",
- "settingsEmailHost": "",
- "settingsEmailPort": "",
- "settingsEmailAddress": "",
- "settingsEmailPassword": "E-posta şifresi - Kimlik doğrulama şifresi.",
"settingsEmailUser": "E-posta kullanıcısı – Kimlik doğrulama için kullanıcı adı; belirtilirse e-posta adresinin yerine geçer.",
- "settingsEmailFieldResetLabel": "Şifre ayarlandı. Değiştirmek için \"Sıfırla\"ya tıklayın.",
"state": "Durum",
"statusBreadCrumbsStatusPages": "Durum sayfası",
"statusBreadCrumbsDetails": "Detaylar",
- "settingsThemeModeLight": "Aydınlat",
- "settingsThemeModeDark": "Karart",
- "settingsClearAllStatsDialogCancel": "İptal",
"commonSaving": "Kaydediliyor.",
"navControls": "Kontroller",
"incidentsPageTitle": "Olaylar",
@@ -461,26 +419,18 @@
"passwordRequirements": "Yeni şifreniz en az 8 karakterden oluşmalı ve en az bir büyük harf, bir küçük harf, bir rakam ve bir özel karakter içermelidir.",
"saving": "Kaydediliyor..."
},
- "settingsEmailConnectionHost": "E-posta bağlantı ana bilgisayarı - HELO/EHLO selamlamasında kullanılacak ana bilgisayar adı",
"emailSent": "E-posta başarı ile gönderildi.",
"failedToSendEmail": "E-posta gönderimi başarısız.",
- "settingsTestEmail": "Test E-postası gönder.",
"settingsTestEmailSuccess": "Test E-postası başarı ile gönderildi.",
"settingsTestEmailFailed": "Test E-postası gönderimi başarısız.",
"settingsTestEmailFailedWithReason": "Test E-postası gönderimi başarısız: {{reason}}",
"settingsTestEmailUnknownError": "Bilinmeyen hata.",
- "settingsEmailRequiredFields": "E-posta sunucusu ve portu gereklidir.",
"statusMsg": {
"paused": "İzleme duraklatıldı.",
"up": "Siteniz yayında.",
"down": "Siteniz kapalı.",
"pending": "Sırada.."
},
- "settingsURLTitle": "Durum Sayfasında IP/URL'yi İzle",
- "settingsURLDescription": "Genel Durum sayfasında monitörün IP adresini veya URL'sini görüntüleyin. Devre dışı bırakılırsa, hassas bilgileri korumak için yalnızca monitör adı gösterilecektir.",
- "settingsURLSelectTitle": "Durum sayfasında IP/URL'yi görüntüle",
- "settingsURLEnabled": "Etkinleştirilmiş",
- "settingURLDisabled": "Devre dışı bırakılmış",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": "beklemede"
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "Güvenli - SSL kullan",
- "settingsEmailPool": "",
"sendTestNotifications": "Bildirimleri dene",
- "selectAll": "Tümünü seç"
+ "selectAll": "Tümünü seç",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/src/locales/zh-TW.json b/client/src/locales/zh-TW.json
index 9dfd6effb..21f53a7bf 100644
--- a/client/src/locales/zh-TW.json
+++ b/client/src/locales/zh-TW.json
@@ -3,38 +3,11 @@
"title": "名稱",
"distributedStatusHeaderText": "實時、真實設備覆蓋",
"distributedStatusSubHeaderText": "由全球數百萬個設備提供支持,您可以按全球區域、國家或城市查看系統效能",
- "settingsGeneralSettings": "一般設定",
- "settingsDisplayTimezone": "顯示時區",
- "settingsDisplayTimezoneDescription": "您公開顯示的儀表板的時區。",
- "settingsAppearance": "外觀",
- "settingsAppearanceDescription": "",
- "settingsThemeMode": "主題",
- "settingsLanguage": "語言",
- "settingsEnabled": "啟動",
"settingsDisabled": "",
- "settingsHistoryAndMonitoring": "",
- "settingsHistoryAndMonitoringDescription": "",
- "settingsTTLLabel": "",
- "settingsTTLOptionalLabel": "",
- "settingsClearAllStats": "",
- "settingsClearAllStatsButton": "",
- "settingsClearAllStatsDialogTitle": "",
- "settingsClearAllStatsDialogDescription": "",
- "settingsClearAllStatsDialogConfirm": "",
- "settingsDemoMonitors": "",
- "settingsDemoMonitorsDescription": "",
- "settingsAddDemoMonitorsButton": "",
- "settingsRemoveAllMonitorsButton": "",
- "settingsRemoveAllMonitorsDialogTitle": "",
- "settingsRemoveAllMonitorsDialogConfirm": "",
- "settingsAbout": "",
- "settingsDevelopedBy": "",
- "settingsSave": "",
"settingsSuccessSaved": "",
"settingsFailedToSave": "",
"settingsStatsCleared": "",
"settingsFailedToClearStats": "",
- "settingsDemoMonitorsAdded": "",
"settingsFailedToAddDemoMonitors": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
@@ -360,16 +333,10 @@
"noFileSelected": "",
"fallbackPage": ""
},
- "settingsSystemReset": "",
- "settingsSystemResetDescription": "",
"DeleteAccountTitle": "",
"DeleteAccountButton": "",
"publicLink": "",
"maskedPageSpeedKeyPlaceholder": "",
- "pageSpeedApiKeyFieldTitle": "",
- "pageSpeedApiKeyFieldLabel": "",
- "pageSpeedApiKeyFieldDescription": "",
- "pageSpeedApiKeyFieldResetLabel": "",
"reset": "",
"ignoreTLSError": "",
"tlsErrorIgnored": "",
@@ -431,22 +398,13 @@
"password": "",
"team": "",
"logOut": "",
- "notifications": ""
+ "notifications": "",
+ "logs": ""
},
- "settingsEmail": "",
- "settingsEmailDescription": "",
- "settingsEmailHost": "",
- "settingsEmailPort": "",
- "settingsEmailAddress": "",
- "settingsEmailPassword": "",
"settingsEmailUser": "",
- "settingsEmailFieldResetLabel": "",
"state": "",
"statusBreadCrumbsStatusPages": "",
"statusBreadCrumbsDetails": "",
- "settingsThemeModeLight": "",
- "settingsThemeModeDark": "",
- "settingsClearAllStatsDialogCancel": "",
"commonSaving": "",
"navControls": "",
"incidentsPageTitle": "",
@@ -461,26 +419,18 @@
"passwordRequirements": "",
"saving": ""
},
- "settingsEmailConnectionHost": "",
"emailSent": "",
"failedToSendEmail": "",
- "settingsTestEmail": "",
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "",
- "settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "",
"up": "",
"down": "",
"pending": ""
},
- "settingsURLTitle": "",
- "settingsURLDescription": "",
- "settingsURLSelectTitle": "",
- "settingsURLEnabled": "",
- "settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
@@ -739,12 +689,147 @@
"paused": ""
},
"advancedMatching": "",
- "settingsEmailTLSServername": "",
- "settingsEmailIgnoreTLS": "",
- "settingsEmailRequireTLS": "",
- "settingsEmailRejectUnauthorized": "",
- "settingsEmailSecure": "",
- "settingsEmailPool": "",
"sendTestNotifications": "",
- "selectAll": ""
+ "selectAll": "",
+ "showAdminLoginLink": "",
+ "logsPage": {
+ "title": "",
+ "description": "",
+ "tabs": {
+ "queue": "",
+ "logs": ""
+ },
+ "toast": {
+ "fetchLogsSuccess": ""
+ },
+ "logLevelSelect": {
+ "title": "",
+ "values": {
+ "all": "",
+ "info": "",
+ "warn": "",
+ "error": "",
+ "debug": ""
+ }
+ }
+ },
+ "queuePage": {
+ "title": "",
+ "refreshButton": "",
+ "flushButton": "",
+ "jobTable": {
+ "title": "",
+ "idHeader": "",
+ "urlHeader": "",
+ "typeHeader": "",
+ "activeHeader": "",
+ "lockedAtHeader": "",
+ "runCountHeader": "",
+ "failCountHeader": "",
+ "lastRunHeader": "",
+ "lastFinishedAtHeader": "",
+ "lastRunTookHeader": ""
+ },
+ "metricsTable": {
+ "title": "",
+ "metricHeader": "",
+ "valueHeader": ""
+ },
+ "failedJobTable": {
+ "title": "",
+ "monitorIdHeader": "",
+ "monitorUrlHeader": "",
+ "failCountHeader": "",
+ "failedAtHeader": "",
+ "failReasonHeader": ""
+ }
+ },
+ "export": {
+ "title": "",
+ "success": "",
+ "failed": ""
+ },
+ "monitorActions": {
+ "title": "",
+ "import": "",
+ "export": ""
+ },
+ "settingsPage": {
+ "aboutSettings": {
+ "labelDevelopedBy": "",
+ "labelVersion": "",
+ "title": ""
+ },
+ "demoMonitorsSettings": {
+ "buttonAddMonitors": "",
+ "description": "",
+ "title": ""
+ },
+ "emailSettings": {
+ "buttonSendTestEmail": "",
+ "description": "",
+ "descriptionTransport": "",
+ "labelAddress": "",
+ "labelConnectionHost": "",
+ "labelHost": "",
+ "labelIgnoreTLS": "",
+ "labelPassword": "",
+ "labelPasswordSet": "",
+ "labelPool": "",
+ "labelPort": "",
+ "labelRejectUnauthorized": "",
+ "labelRequireTLS": "",
+ "labelSecure": "",
+ "labelTLSServername": "",
+ "labelUser": "",
+ "linkTransport": "",
+ "placeholderUser": "",
+ "title": ""
+ },
+ "pageSpeedSettings": {
+ "description": "",
+ "labelApiKeySet": "",
+ "labelApiKey": "",
+ "title": ""
+ },
+ "saveButtonLabel": "",
+ "statsSettings": {
+ "clearAllStatsButton": "",
+ "clearAllStatsDescription": "",
+ "clearAllStatsDialogConfirm": "",
+ "clearAllStatsDialogDescription": "",
+ "clearAllStatsDialogTitle": "",
+ "description": "",
+ "labelTTL": "",
+ "labelTTLOptional": "",
+ "title": ""
+ },
+ "systemResetSettings": {
+ "buttonRemoveAllMonitors": "",
+ "description": "",
+ "dialogConfirm": "",
+ "dialogDescription": "",
+ "dialogTitle": "",
+ "title": ""
+ },
+ "timezoneSettings": {
+ "description": "",
+ "label": "",
+ "title": ""
+ },
+ "title": "",
+ "uiSettings": {
+ "description": "",
+ "labelLanguage": "",
+ "labelTheme": "",
+ "title": ""
+ },
+ "urlSettings": {
+ "description": "",
+ "label": "",
+ "selectDisabled": "",
+ "selectEnabled": "",
+ "title": ""
+ }
+ }
}
diff --git a/client/vite.config.js b/client/vite.config.js
index dc84ce055..838cc5142 100644
--- a/client/vite.config.js
+++ b/client/vite.config.js
@@ -1,12 +1,20 @@
-import { defineConfig } from "vite";
+import { defineConfig, loadEnv } from "vite";
import react from "@vitejs/plugin-react";
import svgr from "vite-plugin-svgr";
+import { execSync } from "child_process";
-// https://vitejs.dev/config/
-export default defineConfig({
- base: "/",
- plugins: [svgr(), react()],
- optimizeDeps: {
- include: ["@mui/material/Tooltip", "@emotion/styled"],
- },
+export default defineConfig(({ mode }) => {
+ const env = loadEnv(mode, process.cwd(), "");
+ let version = 2.2;
+
+ return {
+ base: "/",
+ plugins: [svgr(), react()],
+ optimizeDeps: {
+ include: ["@mui/material/Tooltip", "@emotion/styled"],
+ },
+ define: {
+ __APP_VERSION__: JSON.stringify(version),
+ },
+ };
});
diff --git a/server/controllers/authController.js b/server/controllers/authController.js
index d517c50d9..1d8c2af0e 100755
--- a/server/controllers/authController.js
+++ b/server/controllers/authController.js
@@ -423,13 +423,6 @@ class AuthController {
await this.jobQueue.deleteJob(monitor);
})
));
-
- // 3. Delete team
- await this.db.deleteTeam(user.teamId);
- // 4. Delete all other team members
- await this.db.deleteAllOtherUsers();
- // 5. Delete each monitor
- await this.db.deleteMonitorsByUserId(user._id);
}
// 6. Delete the user by id
await this.db.deleteUser(user._id);
diff --git a/server/controllers/checkController.js b/server/controllers/checkController.js
index 387839beb..8f9d0fbb5 100755
--- a/server/controllers/checkController.js
+++ b/server/controllers/checkController.js
@@ -8,6 +8,9 @@ import {
deleteChecksParamValidation,
deleteChecksByTeamIdParamValidation,
updateChecksTTLBodyValidation,
+ ackCheckBodyValidation,
+ ackAllChecksParamValidation,
+ ackAllChecksBodyValidation,
} from "../validation/joi.js";
import jwt from "jsonwebtoken";
import { getTokenFromHeaders } from "../utils/utils.js";
@@ -55,13 +58,15 @@ class CheckController {
try {
const { monitorId } = req.params;
- let { type, sortOrder, dateRange, filter, page, rowsPerPage, status } = req.query;
+ let { type, sortOrder, dateRange, filter, ack, page, rowsPerPage, status } =
+ req.query;
const result = await this.db.getChecksByMonitor({
monitorId,
type,
sortOrder,
dateRange,
filter,
+ ack,
page,
rowsPerPage,
status,
@@ -85,13 +90,14 @@ class CheckController {
return;
}
try {
- let { sortOrder, dateRange, filter, page, rowsPerPage } = req.query;
+ let { sortOrder, dateRange, filter, ack, page, rowsPerPage } = req.query;
const { teamId } = req.user;
const checkData = await this.db.getChecksByTeam({
sortOrder,
dateRange,
filter,
+ ack,
page,
rowsPerPage,
teamId,
@@ -105,6 +111,55 @@ class CheckController {
}
};
+ ackCheck = async (req, res, next) => {
+ try {
+ await ackCheckBodyValidation.validateAsync(req.body);
+ } catch (error) {
+ next(handleValidationError(error, SERVICE_NAME));
+ return;
+ }
+
+ try {
+ const { checkId } = req.params;
+ const { ack } = req.body;
+ const { teamId } = req.user;
+
+ const updatedCheck = await this.db.ackCheck(checkId, teamId, ack);
+
+ return res.success({
+ msg: this.stringService.checkUpdateStatus,
+ data: updatedCheck,
+ });
+ } catch (error) {
+ next(handleError(error, SERVICE_NAME, "ackCheck"));
+ }
+ };
+
+ ackAllChecks = async (req, res, next) => {
+ try {
+ await ackAllChecksParamValidation.validateAsync(req.params);
+ await ackAllChecksBodyValidation.validateAsync(req.body);
+ } catch (error) {
+ next(handleValidationError(error, SERVICE_NAME));
+ return;
+ }
+
+ try {
+ const { monitorId, path } = req.params;
+ const { ack } = req.body;
+ const { teamId } = req.user;
+
+ const updatedChecks = await this.db.ackAllChecks(monitorId, teamId, ack, path);
+
+ return res.success({
+ msg: this.stringService.checkUpdateStatus,
+ data: updatedChecks,
+ });
+ } catch (error) {
+ next(handleError(error, SERVICE_NAME, "ackAllChecks"));
+ }
+ };
+
deleteChecks = async (req, res, next) => {
try {
await deleteChecksParamValidation.validateAsync(req.params);
diff --git a/server/controllers/inviteController.js b/server/controllers/inviteController.js
index 3b2212769..3799c58b9 100755
--- a/server/controllers/inviteController.js
+++ b/server/controllers/inviteController.js
@@ -77,11 +77,16 @@ class InviteController {
name: firstname,
link: `${clientHost}/register/${inviteToken.token}`,
});
- await this.emailService.sendEmail(
+ const result = await this.emailService.sendEmail(
req.body.email,
"Welcome to Uptime Monitor",
html
);
+ if (!result) {
+ return res.error({
+ msg: "Failed to send invite e-mail... Please verify your settings.",
+ });
+ }
} catch (error) {
logger.warn({
message: error.message,
diff --git a/server/db/models/Check.js b/server/db/models/Check.js
index 39c5281d2..8bb6cd028 100755
--- a/server/db/models/Check.js
+++ b/server/db/models/Check.js
@@ -64,6 +64,23 @@ const BaseCheckSchema = mongoose.Schema({
default: Date.now,
expires: 60 * 60 * 24 * 30, // 30 days
},
+ /**
+ * Acknowledgment of the check.
+ *
+ * @type {Boolean}
+ */
+ ack: {
+ type: Boolean,
+ default: false,
+ },
+ /**
+ * Resolution date of the check (when the check was resolved).
+ *
+ * @type {Date}
+ */
+ ackAt: {
+ type: Date,
+ },
});
/**
diff --git a/server/db/models/Monitor.js b/server/db/models/Monitor.js
index 38aeff0c3..c71ea5f18 100755
--- a/server/db/models/Monitor.js
+++ b/server/db/models/Monitor.js
@@ -147,6 +147,7 @@ MonitorSchema.pre("findOneAndDelete", async function (next) {
MonitorSchema.pre("deleteMany", async function (next) {
const filter = this.getFilter();
const monitors = await this.model.find(filter).select(["_id", "type"]).lean();
+
for (const monitor of monitors) {
if (monitor.type === "pagespeed") {
await PageSpeedCheck.deleteMany({ monitorId: monitor._id });
@@ -155,6 +156,10 @@ MonitorSchema.pre("deleteMany", async function (next) {
} else {
await Check.deleteMany({ monitorId: monitor._id });
}
+ await StatusPage.updateMany(
+ { monitors: monitor._id },
+ { $pull: { monitors: monitor._id } }
+ );
await MonitorStats.deleteMany({ monitorId: monitor._id.toString() });
}
next();
diff --git a/server/db/models/User.js b/server/db/models/User.js
index 74ee1166e..f180cfb86 100755
--- a/server/db/models/User.js
+++ b/server/db/models/User.js
@@ -1,6 +1,9 @@
import mongoose from "mongoose";
import bcrypt from "bcryptjs";
import logger from "../../utils/logger.js";
+import Monitor from "./Monitor.js";
+import Team from "./Team.js";
+import Notification from "./Notification.js";
const UserSchema = mongoose.Schema(
{
@@ -74,6 +77,25 @@ UserSchema.pre("findOneAndUpdate", function (next) {
next();
});
+UserSchema.pre("findOneAndDelete", async function (next) {
+ try {
+ const userToDelete = await this.model.findOne(this.getFilter());
+ if (!userToDelete) return next();
+ if (userToDelete.role.includes("superadmin")) {
+ await Team.deleteOne({ _id: userToDelete.teamId });
+ await Monitor.deleteMany({ userId: userToDelete._id });
+ await this.model.deleteMany({
+ teamId: userToDelete.teamId,
+ _id: { $ne: userToDelete._id },
+ });
+ await Notification.deleteMany({ teamId: userToDelete.teamId });
+ }
+ next();
+ } catch (error) {
+ next(error);
+ }
+});
+
UserSchema.methods.comparePassword = async function (submittedPassword) {
const res = await bcrypt.compare(submittedPassword, this.password);
return res;
diff --git a/server/db/mongo/modules/checkModule.js b/server/db/mongo/modules/checkModule.js
index f409fd3d2..b7d9f4fb2 100755
--- a/server/db/mongo/modules/checkModule.js
+++ b/server/db/mongo/modules/checkModule.js
@@ -63,18 +63,26 @@ const getChecksByMonitor = async ({
sortOrder,
dateRange,
filter,
+ ack,
page,
rowsPerPage,
status,
}) => {
try {
- status = typeof status !== "undefined" ? false : undefined;
+ status = status === "true" ? true : status === "false" ? false : undefined;
page = parseInt(page);
rowsPerPage = parseInt(rowsPerPage);
+
+ const ackStage =
+ ack === "true"
+ ? { ack: true }
+ : { $or: [{ ack: false }, { ack: { $exists: false } }] };
+
// Match
const matchStage = {
- monitorId: ObjectId.createFromHexString(monitorId),
+ monitorId: new ObjectId(monitorId),
...(typeof status !== "undefined" && { status }),
+ ...(typeof ack !== "undefined" && ackStage),
...(dateRangeLookup[dateRange] && {
createdAt: {
$gte: dateRangeLookup[dateRange],
@@ -153,6 +161,7 @@ const getChecksByTeam = async ({
sortOrder,
dateRange,
filter,
+ ack,
page,
rowsPerPage,
teamId,
@@ -160,9 +169,16 @@ const getChecksByTeam = async ({
try {
page = parseInt(page);
rowsPerPage = parseInt(rowsPerPage);
+
+ const ackStage =
+ ack === "true"
+ ? { ack: true }
+ : { $or: [{ ack: false }, { ack: { $exists: false } }] };
+
const matchStage = {
- teamId: ObjectId.createFromHexString(teamId),
+ teamId: new ObjectId(teamId),
status: false,
+ ...(typeof ack !== "undefined" && ackStage),
...(dateRangeLookup[dateRange] && {
createdAt: {
$gte: dateRangeLookup[dateRange],
@@ -236,6 +252,58 @@ const getChecksByTeam = async ({
}
};
+/**
+ * Update the acknowledgment status of a check
+ * @async
+ * @param {string} checkId - The ID of the check to update
+ * @param {string} teamId - The ID of the team
+ * @param {boolean} ack - The acknowledgment status to set
+ * @returns {Promise}
+ * @throws {Error}
+ */
+const ackCheck = async (checkId, teamId, ack) => {
+ try {
+ const updatedCheck = await Check.findOneAndUpdate(
+ { _id: checkId, teamId: teamId },
+ { $set: { ack, ackAt: new Date() } },
+ { new: true }
+ );
+
+ if (!updatedCheck) {
+ throw new Error("Check not found");
+ }
+
+ return updatedCheck;
+ } catch (error) {
+ error.service = SERVICE_NAME;
+ error.method = "ackCheck";
+ throw error;
+ }
+};
+
+/**
+ * Update the acknowledgment status of all checks for a monitor or team
+ * @async
+ * @param {string} id - The monitor ID or team ID
+ * @param {boolean} ack - The acknowledgment status to set
+ * @param {string} path - The path type ('monitor' or 'team')
+ * @returns {Promise}
+ * @throws {Error}
+ */
+const ackAllChecks = async (monitorId, teamId, ack, path) => {
+ try {
+ const updatedChecks = await Check.updateMany(
+ path === "monitor" ? { monitorId } : { teamId },
+ { $set: { ack, ackAt: new Date() } }
+ );
+ return updatedChecks.modifiedCount;
+ } catch (error) {
+ error.service = SERVICE_NAME;
+ error.method = "ackAllChecks";
+ throw error;
+ }
+};
+
/**
* Delete all checks for a monitor
* @async
@@ -317,6 +385,8 @@ export {
createChecks,
getChecksByMonitor,
getChecksByTeam,
+ ackCheck,
+ ackAllChecks,
deleteChecks,
deleteChecksByTeamId,
updateChecksTTL,
diff --git a/server/db/mongo/modules/diagnosticModule.js b/server/db/mongo/modules/diagnosticModule.js
index 7a51ad193..e59830518 100755
--- a/server/db/mongo/modules/diagnosticModule.js
+++ b/server/db/mongo/modules/diagnosticModule.js
@@ -19,7 +19,7 @@ const getMonitorsByTeamIdExecutionStats = async (req) => {
order = "asc";
}
// Build match stage
- const matchStage = { teamId: ObjectId.createFromHexString(req.params.teamId) };
+ const matchStage = { teamId: new ObjectId(req.params.teamId) };
if (type !== undefined) {
matchStage.type = Array.isArray(type) ? { $in: type } : type;
}
diff --git a/server/db/mongo/modules/monitorModule.js b/server/db/mongo/modules/monitorModule.js
index 32ed8b146..bc31915c2 100755
--- a/server/db/mongo/modules/monitorModule.js
+++ b/server/db/mongo/modules/monitorModule.js
@@ -523,7 +523,7 @@ const getMonitorsByTeamId = async ({
order = "asc";
}
// Build match stage
- const matchStage = { teamId: ObjectId.createFromHexString(teamId) };
+ const matchStage = { teamId: new ObjectId(teamId) };
if (type !== undefined) {
matchStage.type = Array.isArray(type) ? { $in: type } : type;
}
@@ -563,8 +563,7 @@ const getMonitorsByTeamId = async ({
const getMonitorsAndSummaryByTeamId = async ({ type, explain, teamId }) => {
try {
- const parsedTeamId = ObjectId.createFromHexString(teamId);
- const matchStage = { teamId: parsedTeamId };
+ const matchStage = { teamId: new ObjectId(teamId) };
if (type !== undefined) {
matchStage.type = Array.isArray(type) ? { $in: type } : type;
}
@@ -606,9 +605,8 @@ const getMonitorsWithChecksByTeamId = async ({
field = "name";
order = "asc";
}
- const parsedTeamId = ObjectId.createFromHexString(teamId);
// Build match stage
- const matchStage = { teamId: parsedTeamId };
+ const matchStage = { teamId: new ObjectId(teamId) };
if (type !== undefined) {
matchStage.type = Array.isArray(type) ? { $in: type } : type;
}
diff --git a/server/db/mongo/modules/monitorModuleQueries.js b/server/db/mongo/modules/monitorModuleQueries.js
index 35ddb8478..ab45eebb6 100755
--- a/server/db/mongo/modules/monitorModuleQueries.js
+++ b/server/db/mongo/modules/monitorModuleQueries.js
@@ -4,7 +4,7 @@ const buildUptimeDetailsPipeline = (monitorId, dates, dateString) => {
return [
{
$match: {
- monitorId: ObjectId.createFromHexString(monitorId),
+ monitorId: new ObjectId(monitorId),
createdAt: { $gte: dates.start, $lte: dates.end },
},
},
@@ -407,6 +407,16 @@ const buildHardwareDetailsPipeline = (monitor, dates, dateString) => {
],
},
},
+ { $unwind: "$checks" },
+ { $sort: { "checks._id": 1 } },
+ {
+ $group: {
+ _id: "$_id",
+ checks: { $push: "$checks" },
+ aggregateData: { $first: "$aggregateData" },
+ upChecks: { $first: "$upChecks" },
+ },
+ },
{
$project: {
aggregateData: {
@@ -415,12 +425,7 @@ const buildHardwareDetailsPipeline = (monitor, dates, dateString) => {
upChecks: {
$arrayElemAt: ["$upChecks", 0],
},
- checks: {
- $sortArray: {
- input: "$checks",
- sortBy: { _id: 1 },
- },
- },
+ checks: 1,
},
},
];
@@ -734,7 +739,7 @@ const buildGetMonitorsByTeamIdPipeline = (req) => {
order = "asc";
}
// Build the match stage
- const matchStage = { teamId: ObjectId.createFromHexString(req.params.teamId) };
+ const matchStage = { teamId: new ObjectId(req.params.teamId) };
if (type !== undefined) {
matchStage.type = Array.isArray(type) ? { $in: type } : type;
}
diff --git a/server/db/mongo/modules/statusPageModule.js b/server/db/mongo/modules/statusPageModule.js
index e94ffbd55..8a682d567 100755
--- a/server/db/mongo/modules/statusPageModule.js
+++ b/server/db/mongo/modules/statusPageModule.js
@@ -90,6 +90,45 @@ const getStatusPage = async (url) => {
const stringService = ServiceRegistry.get(StringService.SERVICE_NAME);
try {
+ const preliminaryStatusPage = await StatusPage.findOne({ url });
+ if (!preliminaryStatusPage) {
+ const error = new Error(stringService.statusPageNotFound);
+ error.status = 404;
+ throw error;
+ }
+
+ if (!preliminaryStatusPage.monitors || preliminaryStatusPage.monitors.length === 0) {
+ const {
+ _id,
+ color,
+ companyName,
+ isPublished,
+ logo,
+ originalMonitors,
+ showCharts,
+ showUptimePercentage,
+ timezone,
+ showAdminLoginLink,
+ url,
+ } = preliminaryStatusPage;
+ return {
+ statusPage: {
+ _id,
+ color,
+ companyName,
+ isPublished,
+ logo,
+ originalMonitors,
+ showCharts,
+ showUptimePercentage,
+ timezone,
+ showAdminLoginLink,
+ url,
+ },
+ monitors: [],
+ };
+ }
+
const statusPageQuery = await StatusPage.aggregate([
{ $match: { url: url } },
{
@@ -134,6 +173,9 @@ const getStatusPage = async (url) => {
},
},
},
+ { $match: { "monitors.orderIndex": { $ne: -1 } } },
+ { $sort: { "monitors.orderIndex": 1 } },
+
{
$group: {
_id: "$_id",
@@ -156,20 +198,7 @@ const getStatusPage = async (url) => {
showAdminLoginLink: 1,
url: 1,
},
- monitors: {
- $filter: {
- input: {
- $sortArray: {
- input: "$monitors",
- sortBy: { orderIndex: 1 },
- },
- },
- as: "monitor",
- cond: {
- $ne: ["$$monitor.orderIndex", -1],
- },
- },
- },
+ monitors: 1,
},
},
]);
diff --git a/server/routes/checkRoute.js b/server/routes/checkRoute.js
index aedca991a..7f91dbe31 100755
--- a/server/routes/checkRoute.js
+++ b/server/routes/checkRoute.js
@@ -1,7 +1,9 @@
import { Router } from "express";
import { verifyOwnership } from "../middleware/verifyOwnership.js";
+import { verifyTeamAccess } from "../middleware/verifyTeamAccess.js";
import { isAllowed } from "../middleware/isAllowed.js";
import Monitor from "../db/models/Monitor.js";
+import Check from "../db/models/Check.js";
class CheckRoutes {
constructor(checkController) {
@@ -20,6 +22,14 @@ class CheckRoutes {
this.router.get("/:monitorId", this.checkController.getChecksByMonitor);
+ this.router.put(
+ "/check/:checkId",
+ verifyTeamAccess(Check, "checkId"),
+ this.checkController.ackCheck
+ );
+
+ this.router.put("/:path/:monitorId?", this.checkController.ackAllChecks);
+
this.router.post(
"/:monitorId",
verifyOwnership(Monitor, "monitorId"),
diff --git a/server/service/emailService.js b/server/service/emailService.js
index 89bd4d50f..433fd0871 100755
--- a/server/service/emailService.js
+++ b/server/service/emailService.js
@@ -137,6 +137,17 @@ class EmailService {
};
this.transporter = this.nodemailer.createTransport(emailConfig);
+ try {
+ await this.transporter.verify();
+ } catch (error) {
+ this.logger.warn({
+ message: "Email transporter verification failed",
+ service: SERVICE_NAME,
+ method: "verifyTransporter",
+ });
+ return false;
+ }
+
try {
const info = await this.transporter.sendMail({
to: to,
diff --git a/server/service/stringService.js b/server/service/stringService.js
index 5ee17a5ef..6f9ad8cd8 100755
--- a/server/service/stringService.js
+++ b/server/service/stringService.js
@@ -444,6 +444,10 @@ class StringService {
get verifyOwnerUnauthorized() {
return this.translationService.getTranslation("verifyOwnerUnauthorized");
}
+
+ get dbUserNotFound() {
+ return this.translationService.getTranslation("dbUserNotFound");
+ }
}
export default StringService;
diff --git a/server/utils/logger.js b/server/utils/logger.js
index 0864176c5..49b875d96 100755
--- a/server/utils/logger.js
+++ b/server/utils/logger.js
@@ -76,7 +76,7 @@ class Logger {
info(config) {
const logEntry = this.buildLogEntry("info", config);
this.cacheLog(logEntry);
- this.logger.info(config.message, logEntry);
+ this.logger.info(logEntry);
}
/**
@@ -90,7 +90,7 @@ class Logger {
warn(config) {
const logEntry = this.buildLogEntry("warn", config);
this.cacheLog(logEntry);
- this.logger.warn(config.message, logEntry);
+ this.logger.warn(logEntry);
}
/**
@@ -104,7 +104,7 @@ class Logger {
error(config) {
const logEntry = this.buildLogEntry("error", config);
this.cacheLog(logEntry);
- this.logger.error(config.message, logEntry);
+ this.logger.error(logEntry);
}
/**
* Logs a debug message.
@@ -117,7 +117,7 @@ class Logger {
debug(config) {
const logEntry = this.buildLogEntry("debug", config);
this.cacheLog(logEntry);
- this.logger.debug(config.message, logEntry);
+ this.logger.debug(logEntry);
}
cacheLog(entry) {
diff --git a/server/validation/joi.js b/server/validation/joi.js
index e5c1d6e43..d44bb14eb 100755
--- a/server/validation/joi.js
+++ b/server/validation/joi.js
@@ -289,6 +289,19 @@ const createCheckBodyValidation = joi.object({
message: joi.string().required(),
});
+const ackCheckBodyValidation = joi.object({
+ ack: joi.boolean(),
+});
+
+const ackAllChecksParamValidation = joi.object({
+ monitorId: joi.string().optional(),
+ path: joi.string().valid("monitor", "team").required(),
+});
+
+const ackAllChecksBodyValidation = joi.object({
+ ack: joi.boolean(),
+});
+
const getChecksParamValidation = joi.object({
monitorId: joi.string().required(),
});
@@ -299,6 +312,7 @@ const getChecksQueryValidation = joi.object({
limit: joi.number(),
dateRange: joi.string().valid("recent", "hour", "day", "week", "month", "all"),
filter: joi.string().valid("all", "down", "resolve"),
+ ack: joi.boolean(),
page: joi.number(),
rowsPerPage: joi.number(),
status: joi.boolean(),
@@ -311,9 +325,9 @@ const getTeamChecksQueryValidation = joi.object({
limit: joi.number(),
dateRange: joi.string().valid("hour", "day", "week", "month", "all"),
filter: joi.string().valid("all", "down", "resolve"),
+ ack: joi.boolean(),
page: joi.number(),
rowsPerPage: joi.number(),
- status: joi.boolean(),
});
const deleteChecksParamValidation = joi.object({
@@ -654,6 +668,9 @@ export {
getChecksQueryValidation,
getTeamChecksParamValidation,
getTeamChecksQueryValidation,
+ ackCheckBodyValidation,
+ ackAllChecksParamValidation,
+ ackAllChecksBodyValidation,
deleteChecksParamValidation,
deleteChecksByTeamIdParamValidation,
updateChecksTTLBodyValidation,