Merge branch 'develop' into feat/bulk-select-status-page-servers

This commit is contained in:
Virendra Jadhav
2025-06-18 22:07:49 +05:30
committed by GitHub
42 changed files with 3705 additions and 2326 deletions

View File

@@ -22,7 +22,7 @@ Checkmate also has an agent, called [Capture](https://github.com/bluewave-labs/c
Checkmate has been stress-tested with 1000+ active monitors without any particular issues or performance bottlenecks.
We **love** what we are building here, and we continuously learn a few things about Reactjs, Nodejs, MongoDB, and Docker while building Checkmate.
**If you would like to sponsor a feature, [see this link](https://checkmate.so/sponsored-features).**
## 📚 Table of contents
@@ -130,7 +130,7 @@ If you have any questions, suggestions or comments, please use our [Discord chan
We are [Alex](http://github.com/ajhollid) (team lead), [Vishnu](http://github.com/vishnusn77), [Mohadeseh](http://github.com/mohicody), [Gorkem](http://github.com/gorkem-bwl/), [Owaise](http://github.com/Owaiseimdad), [Aryaman](https://github.com/Br0wnHammer) and [Mert](https://github.com/mertssmnoglu) helping individuals and businesses monitor their infra and servers.
We pride ourselves on building strong connections with contributors at every level. Despite being a young project, Checkmate has already earned 5800+ stars and attracted 70+ contributors from around the globe.
We pride ourselves on building strong connections with contributors at every level. Despite being a young project, Checkmate has already earned 6000+ stars and attracted 80+ contributors from around the globe.
Our repo is starred by employees from **Google, Microsoft, Intel, Cisco, Tencent, Electronic Arts, ByteDance, JP Morgan Chase, Deloitte, Accenture, Foxconn, Broadcom, China Telecom, Barclays, Capgemini, Wipro, Cloudflare, Dassault Systèmes and NEC**, so dont hold back — jump in, contribute and learn with us!
@@ -148,11 +148,13 @@ Here's how you can contribute:
<img src="https://contrib.rocks/image?repo=bluewave-labs/checkmate" />
</a>
[![Star History Chart](https://api.star-history.com/svg?repos=bluewave-labs/checkmate&type=Date)](https://star-history.com/#bluewave-labs/bluewave-uptime&Date)
## 💰 Our sponsors
Thanks to [Gitbook](https://gitbook.io/) for giving us a free tier for their documentation platform, and [Poeditor](https://poeditor.com/) providing us a free account to use their i18n services. If you would like to sponsor Checkmate, please send an email to hello@bluewavelabs.ca
[![Star History Chart](https://api.star-history.com/svg?repos=bluewave-labs/checkmate&type=Date)](https://star-history.com/#bluewave-labs/bluewave-uptime&Date)
If you would like to sponsor a feature, [see this page](https://checkmate.so/sponsored-features).
Also check other developer and contributor-friendly projects of BlueWave:

View File

@@ -1,7 +1,7 @@
import PropTypes from "prop-types";
import { Box, Breadcrumbs as MUIBreadcrumbs } from "@mui/material";
import { useTheme } from "@emotion/react";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import ArrowRight from "../../assets/icons/right-arrow.svg?react";
import "./index.css";

View File

@@ -39,7 +39,11 @@ const Fallback = ({
const { t } = useTranslation();
const [settingsData, setSettingsData] = useState(undefined);
const [isLoading, error] = useFetchSettings({ setSettingsData });
const [isLoading, error] = useFetchSettings({
setSettingsData,
setIsApiKeySet: () => {},
setIsEmailPasswordSet: () => {},
});
// Custom warning message with clickable link
const renderWarningMessage = () => {
return (

View File

@@ -16,26 +16,27 @@ import "./index.css";
* size="small"
* />
*
* @param {Object} props - The component props.
* @param {string} props.id - The id of the radio button.
* @param {string} props.title - The title of the radio button.
* @param {string} [props.desc] - The description of the radio button.
* @param {string} [props.size="small"] - The size of the radio button.
* @param {Object} props - The component
* @param {string} id - The id of the radio button.
* @param {string} title - The title of the radio button.
* @param {string} [desc] - The description of the radio button.
* @param {string} [size="small"] - The size of the radio button.
* @returns {JSX.Element} - The rendered Radio component.
*/
const Radio = (props) => {
const Radio = ({ name, checked, value, id, size, title, desc, onChange }) => {
const theme = useTheme();
return (
<FormControlLabel
className="custom-radio-button"
checked={props.checked}
value={props.value}
name={name}
checked={checked}
value={value}
control={
<MUIRadio
id={props.id}
size={props.size}
id={id}
size={size}
checkedIcon={<RadioChecked />}
sx={{
color: "transparent",
@@ -49,16 +50,16 @@ const Radio = (props) => {
}}
/>
}
onChange={props.onChange}
onChange={onChange}
label={
<>
<Typography component="p">{props.title}</Typography>
<Typography component="p">{title}</Typography>
<Typography
component="h6"
mt={theme.spacing(1)}
color={theme.palette.primary.contrastTextSecondary}
>
{props.desc}
{desc}
</Typography>
</>
}
@@ -81,9 +82,14 @@ const Radio = (props) => {
};
Radio.propTypes = {
title: PropTypes.string.isRequired,
title: PropTypes.string,
desc: PropTypes.string,
size: PropTypes.string,
name: PropTypes.string,
checked: PropTypes.bool,
value: PropTypes.string,
id: PropTypes.string,
onChange: PropTypes.func,
};
export default Radio;

View File

@@ -3,7 +3,7 @@ import { networkService } from "../main";
import { createToast } from "../Utils/toastUtils";
import { useTranslation } from "react-i18next";
const useFetchSettings = ({ setSettingsData }) => {
const useFetchSettings = ({ setSettingsData, setIsApiKeySet, setIsEmailPasswordSet }) => {
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(undefined);
useEffect(() => {
@@ -12,6 +12,8 @@ const useFetchSettings = ({ setSettingsData }) => {
try {
const response = await networkService.getAppSettings();
setSettingsData(response?.data?.data);
setIsApiKeySet(response?.data?.data?.pagespeedKeySet);
setIsEmailPasswordSet(response?.data?.data?.emailPasswordSet);
} catch (error) {
createToast({ body: "Failed to fetch settings" });
setError(error);
@@ -20,12 +22,18 @@ const useFetchSettings = ({ setSettingsData }) => {
}
};
fetchSettings();
}, []);
}, [setSettingsData]);
return [isLoading, error];
};
const useSaveSettings = () => {
const useSaveSettings = ({
setSettingsData,
setIsApiKeySet,
setApiKeyHasBeenReset,
setIsEmailPasswordSet,
setEmailPasswordHasBeenReset,
}) => {
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(undefined);
const { t } = useTranslation();
@@ -39,7 +47,15 @@ const useSaveSettings = () => {
ttl: settings.checkTTL,
});
}
console.log({ settingsResponse });
setIsApiKeySet(settingsResponse.data.data.pagespeedKeySet);
setIsEmailPasswordSet(settingsResponse.data.data.emailPasswordSet);
if (settingsResponse.data.data.pagespeedKeySet === true) {
setApiKeyHasBeenReset(false);
}
if (settingsResponse.data.data.emailPasswordSet === true) {
setEmailPasswordHasBeenReset(false);
}
setSettingsData(settingsResponse.data.data);
createToast({ body: t("settingsSuccessSaved") });
} catch (error) {
createToast({ body: t("settingsFailedToSave") });

View File

@@ -1,6 +1,6 @@
import { useState } from "react";
import PropTypes from "prop-types";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import { useSelector } from "react-redux";
import { Box, Tab, useTheme } from "@mui/material";
import CustomTabList from "../../Components/Tab";

View File

@@ -2,7 +2,7 @@ import { Box, Button, Stack, Typography } from "@mui/material";
import { useEffect, useState } from "react";
import { useTheme } from "@emotion/react";
import { useDispatch } from "react-redux";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import { createToast } from "../../Utils/toastUtils";
import { forgotPassword } from "../../Features/Auth/authSlice";
import { Trans, useTranslation } from "react-i18next";

View File

@@ -1,6 +1,6 @@
import { Box, Button, Stack, Typography } from "@mui/material";
import { useTheme } from "@emotion/react";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import { useDispatch } from "react-redux";
import { clearAuthState } from "../../Features/Auth/authSlice";
import Background from "../../assets/Images/background-grid.svg?react";

View File

@@ -1,8 +1,7 @@
import React from "react";
import PropTypes from "prop-types";
import NotFoundSvg from "../../../src/assets/Images/sushi_404.svg";
import { Button, Stack, Typography } from "@mui/material";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import { useTheme } from "@emotion/react";
import { useTranslation } from "react-i18next";

View File

@@ -10,7 +10,6 @@ import TextInput from "../../../Components/Inputs/TextInput";
// Utils
import { useState } from "react";
import { useSelector } from "react-redux";
import { useTheme } from "@emotion/react";
import {
useCreateNotification,
@@ -44,7 +43,6 @@ const CreateNotifications = () => {
];
// Redux state
const { user } = useSelector((state) => state.auth);
// local state
const [notification, setNotification] = useState({
@@ -73,7 +71,7 @@ const CreateNotifications = () => {
type: NOTIFICATION_TYPES.find((type) => type._id === notification.type).value,
};
if (notification.type === 2) {
if (form.type === "slack" || form.type === "discord") {
form.type = "webhook";
}
@@ -128,27 +126,33 @@ const CreateNotifications = () => {
// Handle config/platform initialization if type is webhook
if (newNotification.type === 1) {
const type = NOTIFICATION_TYPES.find(
(type) => type._id === newNotification.type
).value;
if (type === "email") {
newNotification.config = null;
} else if (newNotification.type === 2) {
} else if (type === "slack" || type === "webhook" || type === "discord") {
newNotification.address = "";
newNotification.config = newNotification.config || {};
if (name === "config") {
newNotification.config = value;
}
newNotification.config.platform = "slack";
} else if (newNotification.type === 3) {
if (type === "webhook") {
newNotification.config.platform = "webhook";
}
if (type === "slack") {
newNotification.config.platform = "slack";
}
if (type === "discord") {
newNotification.config.platform = "discord";
}
} else if (type === "pager_duty") {
newNotification.config = newNotification.config || {};
if (name === "config") {
newNotification.config = value;
}
newNotification.config.platform = "pager_duty";
} else if (newNotification.type === 4) {
newNotification.config = newNotification.config || {};
if (name === "config") {
newNotification.config = value;
}
newNotification.config.platform = "webhook";
}
// Field-level validation
@@ -159,12 +163,15 @@ const CreateNotifications = () => {
fieldError = error?.message;
}
if (newNotification.type === 1 && name === "address") {
if (type === "email" && name === "address") {
const { error } = notificationEmailValidation.extract(name).validate(value);
fieldError = error?.message;
}
if (newNotification.type === 2 && name === "config") {
if (
(type === "slack" || type === "webhook" || type === "discord") &&
name === "config"
) {
// Validate only webhookUrl inside config
const { error } = notificationWebhookValidation.extract("config").validate(value);
fieldError = error?.message;
@@ -185,7 +192,7 @@ const CreateNotifications = () => {
type: NOTIFICATION_TYPES.find((type) => type._id === notification.type).value,
};
if (notification.type === 2) {
if (form.type === "slack" || form.type === "discord") {
form.type = "webhook";
}
@@ -405,6 +412,39 @@ const CreateNotifications = () => {
</Stack>
</ConfigBox>
)}
{notification.type === 5 && (
<ConfigBox>
<Box>
<Typography component="h2">
{t("createNotifications.discordSettings.title")}
</Typography>
<Typography component="p">
{t("createNotifications.discordSettings.description")}
</Typography>
</Box>
<Stack gap={theme.spacing(12)}>
<TextInput
label={t("createNotifications.discordSettings.webhookLabel")}
value={notification.config.webhookUrl || ""}
error={Boolean(errors.config)}
helperText={errors["config"]}
onChange={(e) => {
const updatedConfig = {
...notification.config,
webhookUrl: e.target.value,
};
onChange({
target: {
name: "config",
value: updatedConfig,
},
});
}}
/>
</Stack>
</ConfigBox>
)}
<Stack
direction="row"
justifyContent="flex-end"

View File

@@ -1,6 +1,7 @@
export const NOTIFICATION_TYPES = [
{ _id: 1, name: "E-mail", value: "email" },
{ _id: 2, name: "Slack", value: "webhook" },
{ _id: 2, name: "Slack", value: "slack" },
{ _id: 3, name: "PagerDuty", value: "pager_duty" },
{ _id: 4, name: "Webhook", value: "webhook" },
{ _id: 5, name: "Discord", value: "discord" },
];

View File

@@ -5,13 +5,8 @@ import { getHumanReadableDuration } from "../../../../../Utils/timeUtils";
import { useTranslation } from "react-i18next";
const PageSpeedStatusBoxes = ({ shouldRender, monitor }) => {
const { time: uptimeDuration, units: uptimeUnits } = getHumanReadableDuration(
monitor?.uptimeDuration
);
const { time: lastCheckTime, units: lastCheckUnits } = getHumanReadableDuration(
monitor?.lastChecked
);
const uptimeDuration = getHumanReadableDuration(monitor?.uptimeDuration);
const time = getHumanReadableDuration(monitor?.lastChecked);
const { t } = useTranslation();
@@ -22,7 +17,6 @@ const PageSpeedStatusBoxes = ({ shouldRender, monitor }) => {
subHeading={
<>
{uptimeDuration}
<Typography component="span">{uptimeUnits}</Typography>
<Typography component="span">{t("ago")}</Typography>
</>
}
@@ -31,8 +25,7 @@ const PageSpeedStatusBoxes = ({ shouldRender, monitor }) => {
heading="last check"
subHeading={
<>
{lastCheckTime}
<Typography component="span">{lastCheckUnits}</Typography>
{time}
<Typography component="span">{t("ago")}</Typography>
</>
}

View File

@@ -3,7 +3,7 @@ import PropTypes from "prop-types";
import PageSpeedIcon from "../../../../../assets/icons/page-speed.svg?react";
import { StatusLabel } from "../../../../../Components/Label";
import { Box, Grid, Stack, Typography } from "@mui/material";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import { useTheme } from "@emotion/react";
import { Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip } from "recharts";
import { useSelector } from "react-redux";

View File

@@ -1,7 +1,7 @@
import React, { useState } from "react";
import { Box, Typography, Button, Stack } from "@mui/material";
import { useTheme } from "@emotion/react";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import { networkService } from "../Utils/NetworkService";
import Alert from "../Components/Alert";
import { createToast } from "../Utils/toastUtils";

View File

@@ -7,7 +7,7 @@ import Stack from "@mui/material/Stack";
// Utils
import { useTheme } from "@emotion/react";
import { PropTypes } from "prop-types";
import { useState } from "react";
import { useState, useEffect } from "react";
import { useTranslation } from "react-i18next";
import { PasswordEndAdornment } from "../../Components/Inputs/TextInput/Adornments";
import { useSendTestEmail } from "../../Hooks/useSendTestEmail";
@@ -20,7 +20,9 @@ const SettingsEmail = ({
handleChange,
settingsData,
setSettingsData,
isPasswordSet,
isEmailPasswordSet,
emailPasswordHasBeenReset,
setEmailPasswordHasBeenReset,
}) => {
// Setup
const { t } = useTranslation();
@@ -43,7 +45,6 @@ const SettingsEmail = ({
} = settingsData?.settings || {};
// Local state
const [password, setPassword] = useState("");
const [hasBeenReset, setHasBeenReset] = useState(false);
// Network
const [isSending, , sendTestEmail] = useSendTestEmail(); // Using empty placeholder for unused error variable
@@ -152,7 +153,7 @@ const SettingsEmail = ({
onChange={handleChange}
/>
</Box>
{(isPasswordSet === false || hasBeenReset === true) && (
{(isEmailPasswordSet === false || emailPasswordHasBeenReset === true) && (
<Box>
<Typography>{t("settingsEmailPassword")}</Typography>
<TextInput
@@ -165,7 +166,8 @@ const SettingsEmail = ({
/>
</Box>
)}
{isPasswordSet === true && hasBeenReset === false && (
{isEmailPasswordSet === true && emailPasswordHasBeenReset === false && (
<Box>
<Typography>{t("settingsEmailFieldResetLabel")}</Typography>
<Button
@@ -175,7 +177,7 @@ const SettingsEmail = ({
...settingsData,
settings: { ...settingsData.settings, systemEmailPassword: "" },
});
setHasBeenReset(true);
setEmailPasswordHasBeenReset(true);
}}
variant="contained"
color="error"

View File

@@ -17,13 +17,14 @@ const SettingsPagespeed = ({
settingsData,
setSettingsData,
isApiKeySet,
apiKeyHasBeenReset,
setApiKeyHasBeenReset,
}) => {
const { t } = useTranslation();
const theme = useTheme();
// Local state
const [apiKey, setApiKey] = useState("");
const [hasBeenReset, setHasBeenReset] = useState(false);
// Handler
const handleChange = (e) => {
@@ -50,7 +51,7 @@ const SettingsPagespeed = ({
<Typography sx={HEADING_SX}>{t("pageSpeedApiKeyFieldDescription")}</Typography>
</Box>
<Stack gap={theme.spacing(20)}>
{(isApiKeySet === false || hasBeenReset === true) && (
{(isApiKeySet === false || apiKeyHasBeenReset === true) && (
<TextInput
name="pagespeedApiKey"
label={t("pageSpeedApiKeyFieldLabel")}
@@ -62,7 +63,7 @@ const SettingsPagespeed = ({
/>
)}
{isApiKeySet === true && hasBeenReset === false && (
{isApiKeySet === true && apiKeyHasBeenReset === false && (
<Box>
<Typography>{t("pageSpeedApiKeyFieldResetLabel")}</Typography>
<Button
@@ -72,7 +73,7 @@ const SettingsPagespeed = ({
...settingsData,
settings: { ...settingsData.settings, pagespeedApiKey: "" },
});
setHasBeenReset(true);
setApiKeyHasBeenReset(true);
}}
variant="contained"
color="error"
@@ -93,6 +94,9 @@ SettingsPagespeed.propTypes = {
settingsData: PropTypes.object,
setSettingsData: PropTypes.func,
isApiKeySet: PropTypes.bool,
setIsApiKeySet: PropTypes.func,
apiKeyHasBeenReset: PropTypes.bool,
setApiKeyHasBeenReset: PropTypes.func,
};
export default SettingsPagespeed;

View File

@@ -31,19 +31,32 @@ const BREADCRUMBS = [{ name: `Settings`, path: "/settings" }];
const Settings = () => {
// Redux state
const { mode, language, timezone, showURL } = useSelector((state) => state.ui);
const { user } = useSelector((state) => state.auth);
// Local state
const [settingsData, setSettingsData] = useState({});
const [errors, setErrors] = useState({});
const [isApiKeySet, setIsApiKeySet] = useState(settingsData?.pagespeedKeySet ?? false);
const [apiKeyHasBeenReset, setApiKeyHasBeenReset] = useState(false);
const [isEmailPasswordSet, setIsEmailPasswordSet] = useState(
settingsData?.emailPasswordSet ?? false
);
const [emailPasswordHasBeenReset, setEmailPasswordHasBeenReset] = useState(false);
// Network
const [isSettingsLoading, settingsError] = useFetchSettings({
setSettingsData,
setIsApiKeySet,
setIsEmailPasswordSet,
});
const [addDemoMonitors, isAddingDemoMonitors] = useAddDemoMonitors();
const [isSaving, saveError, saveSettings] = useSaveSettings();
const [isSaving, saveError, saveSettings] = useSaveSettings({
setSettingsData,
setIsApiKeySet,
setApiKeyHasBeenReset,
setIsEmailPasswordSet,
setEmailPasswordHasBeenReset,
});
const [deleteAllMonitors, isDeletingMonitors] = useDeleteAllMonitors();
const [deleteMonitorStats, isDeletingMonitorStats] = useDeleteMonitorStats();
@@ -53,7 +66,6 @@ const Settings = () => {
const HEADING_SX = { mt: theme.spacing(2), mb: theme.spacing(2) };
const { t } = useTranslation();
const dispatch = useDispatch();
// Handlers
const handleChange = async (e) => {
const { name, value, checked } = e.target;
@@ -79,30 +91,19 @@ const Settings = () => {
settings: { ...settingsData.settings, [name]: newValue ?? value },
};
// Validate
const { error } = settingsValidation.validate(newSettingsData.settings, {
abortEarly: false,
});
if (!error || error.details.length === 0) {
setErrors({});
} else {
const newErrors = {};
error.details.forEach((err) => {
newErrors[err.path[0]] = err.message;
});
setErrors(newErrors);
}
if (name === "timezone") {
dispatch(setTimezone({ timezone: value }));
return;
}
if (name === "mode") {
dispatch(setMode(value));
return;
}
if (name === "language") {
dispatch(setLanguage(value));
return;
}
if (name === "deleteStats") {
@@ -120,6 +121,20 @@ const Settings = () => {
return;
}
// Validate
const { error } = settingsValidation.validate(newSettingsData.settings, {
abortEarly: false,
});
if (!error || error.details.length === 0) {
setErrors({});
} else {
const newErrors = {};
error.details.forEach((err) => {
newErrors[err.path[0]] = err.message;
});
setErrors(newErrors);
}
setSettingsData(newSettingsData);
};
@@ -159,7 +174,9 @@ const Settings = () => {
HEADING_SX={HEADING_SX}
settingsData={settingsData}
setSettingsData={setSettingsData}
isApiKeySet={settingsData?.pagespeedKeySet ?? false}
isApiKeySet={isApiKeySet}
apiKeyHasBeenReset={apiKeyHasBeenReset}
setApiKeyHasBeenReset={setApiKeyHasBeenReset}
/>
<SettingsURL
HEADING_SX={HEADING_SX}
@@ -187,7 +204,9 @@ const Settings = () => {
handleChange={handleChange}
settingsData={settingsData}
setSettingsData={setSettingsData}
isPasswordSet={settingsData?.emailPasswordSet ?? false}
isEmailPasswordSet={isEmailPasswordSet}
emailPasswordHasBeenReset={emailPasswordHasBeenReset}
setEmailPasswordHasBeenReset={setEmailPasswordHasBeenReset}
/>
<SettingsAbout />
<Stack

View File

@@ -10,7 +10,7 @@ import Breadcrumbs from "../../../Components/Breadcrumbs";
import ConfigBox from "../../../Components/ConfigBox";
import UploadFile from "./Upload";
import { useSelector } from "react-redux";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import { Trans, useTranslation } from "react-i18next";
import { useCreateBulkMonitors } from "../../../Hooks/monitorHooks";

View File

@@ -147,6 +147,7 @@ const CreateMonitor = () => {
const onChange = (event) => {
const { name, value, checked } = event.target;
let newValue = value;
if (name === "ignoreTlsErrors") {
newValue = checked;

View File

@@ -24,30 +24,22 @@ const UptimeStatusBoxes = ({
const timeOfLastCheck = monitorStats?.lastCheckTimestamp;
const timeSinceLastCheck = Date.now() - timeOfLastCheck;
const { time: streakTime, units: streakUnits } =
getHumanReadableDuration(timeSinceLastFailure);
const streakTime = getHumanReadableDuration(timeSinceLastFailure);
const { time: lastCheckTime, units: lastCheckUnits } =
getHumanReadableDuration(timeSinceLastCheck);
const lastCheckTime = getHumanReadableDuration(timeSinceLastCheck);
return (
<StatusBoxes shouldRender={!isLoading}>
<StatBox
gradient={true}
status={determineState(monitor)}
heading={"active for"}
subHeading={
<>
{streakTime}
<Typography component="span">{streakUnits}</Typography>
</>
}
subHeading={streakTime}
/>
<StatBox
heading="last check"
subHeading={
<>
{lastCheckTime}
<Typography component="span">{lastCheckUnits}</Typography>
<Typography component="span">{"ago"}</Typography>
</>
}
@@ -80,7 +72,7 @@ const UptimeStatusBoxes = ({
};
UptimeStatusBoxes.propTypes = {
shouldRender: PropTypes.bool,
isLoading: PropTypes.bool,
monitor: PropTypes.object,
monitorStats: PropTypes.object,
certificateExpiry: PropTypes.string,

View File

@@ -1,5 +1,5 @@
import { useDispatch } from "react-redux";
import { useNavigate } from "react-router";
import { useNavigate } from "react-router-dom";
import { setNetworkService } from "./NetworkService";
import NetworkService, { networkService } from "./NetworkService";
import { store } from "../store";

View File

@@ -79,22 +79,35 @@ export const formatDurationSplit = (ms) => {
export const getHumanReadableDuration = (ms) => {
const durationObj = dayjs.duration(ms);
if (durationObj.asDays() >= 1) {
const days = Math.floor(durationObj.asDays());
return { time: days, units: days === 1 ? "day" : "days" };
} else if (durationObj.asHours() >= 1) {
const hoursRounded = Math.round(durationObj.asHours() * 10) / 10;
const hours = Number.isInteger(hoursRounded)
? Math.floor(hoursRounded)
: hoursRounded;
return { time: hours, units: hours <= 1 ? "hour" : "hours" };
} else if (durationObj.asMinutes() >= 1) {
const minutes = Math.floor(durationObj.asMinutes());
return { time: minutes, units: minutes === 1 ? "minute" : "minutes" };
} else {
const seconds = Math.floor(durationObj.asSeconds());
return { time: seconds, units: seconds === 1 ? "second" : "seconds" };
const parts = {
days: Math.floor(durationObj.asDays()),
hours: durationObj.hours(),
minutes: durationObj.minutes(),
seconds: durationObj.seconds(),
};
const result = [];
if (parts.days > 0) {
result.push(`${parts.days}d`);
}
if (parts.hours > 0) {
result.push(`${parts.hours}h`);
}
if (result.length < 2 && parts.minutes > 0) {
result.push(`${parts.minutes}m`);
}
if (result.length < 2 && parts.seconds > 0) {
result.push(`${parts.seconds}s`);
}
if (result.length === 0) {
// fallback for durations < 1s
return "0s";
}
return result.join(" ");
};
export const formatDate = (date, customOptions) => {

View File

@@ -7,7 +7,7 @@ const nameSchema = joi
.string()
.max(50)
.trim()
.pattern(/^[\p{L}\p{M}''\- ]+$/u)
.pattern(/^[\p{L}\p{M}''()\-\. ]+$/u)
.messages({
"string.empty": "auth.common.inputs.firstName.errors.empty",
"string.max": "auth.common.inputs.firstName.errors.length",
@@ -18,7 +18,7 @@ const lastnameSchema = joi
.string()
.max(50)
.trim()
.pattern(/^[\p{L}\p{M}''\- ]+$/u)
.pattern(/^[\p{L}\p{M}''()\-\. ]+$/u)
.messages({
"string.empty": "auth.common.inputs.lastName.errors.empty",
"string.max": "auth.common.inputs.lastName.errors.length",

744
client/src/locales/ar.json Normal file
View File

@@ -0,0 +1,744 @@
{
"submit": "",
"title": "",
"distributedStatusHeaderText": "",
"distributedStatusSubHeaderText": "",
"settingsGeneralSettings": "",
"settingsDisplayTimezone": "",
"settingsDisplayTimezoneDescription": "",
"settingsAppearance": "",
"settingsAppearanceDescription": "",
"settingsThemeMode": "",
"settingsLanguage": "",
"settingsEnabled": "",
"settingsDisabled": "",
"settingsHistoryAndMonitoring": "",
"settingsHistoryAndMonitoringDescription": "",
"settingsTTLLabel": "",
"settingsTTLOptionalLabel": "",
"settingsClearAllStats": "",
"settingsClearAllStatsButton": "",
"settingsClearAllStatsDialogTitle": "",
"settingsClearAllStatsDialogDescription": "",
"settingsClearAllStatsDialogConfirm": "",
"settingsDemoMonitors": "",
"settingsDemoMonitorsDescription": "",
"settingsAddDemoMonitors": "",
"settingsAddDemoMonitorsButton": "",
"settingsRemoveAllMonitors": "",
"settingsRemoveAllMonitorsButton": "",
"settingsRemoveAllMonitorsDialogTitle": "",
"settingsRemoveAllMonitorsDialogConfirm": "",
"settingsAbout": "",
"settingsDevelopedBy": "",
"settingsSave": "",
"settingsSuccessSaved": "",
"settingsFailedToSave": "",
"settingsStatsCleared": "",
"settingsFailedToClearStats": "",
"settingsDemoMonitorsAdded": "",
"settingsFailedToAddDemoMonitors": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
"starPromptTitle": "",
"starPromptDescription": "",
"https": "",
"http": "",
"monitor": "",
"aboutus": "",
"now": "",
"delete": "",
"configure": "",
"responseTime": "",
"ms": "",
"bar": "",
"area": "",
"country": "",
"city": "",
"response": "",
"monitorStatusUp": "",
"monitorStatusDown": "",
"webhookSendSuccess": "",
"webhookSendError": "",
"webhookUnsupportedPlatform": "",
"distributedRightCategoryTitle": "",
"distributedStatusServerMonitors": "",
"distributedStatusServerMonitorsDescription": "",
"distributedUptimeCreateSelectURL": "",
"distributedUptimeCreateChecks": "",
"distributedUptimeCreateChecksDescription": "",
"distributedUptimeCreateIncidentNotification": "",
"distributedUptimeCreateIncidentDescription": "",
"distributedUptimeCreateAdvancedSettings": "",
"distributedUptimeDetailsNoMonitorHistory": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "",
"notifications": {
"enableNotifications": "",
"testNotification": "",
"addOrEditNotifications": "",
"slack": {
"label": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": "",
"webhookRequired": ""
},
"discord": {
"label": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": "",
"webhookRequired": ""
},
"telegram": {
"label": "",
"description": "",
"tokenLabel": "",
"tokenPlaceholder": "",
"chatIdLabel": "",
"chatIdPlaceholder": "",
"fieldsRequired": ""
},
"webhook": {
"label": "",
"description": "",
"urlLabel": "",
"urlPlaceholder": "",
"urlRequired": ""
},
"testNotificationDevelop": "",
"integrationButton": "",
"testSuccess": "",
"testFailed": "",
"unsupportedType": "",
"networkError": "",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "",
"add": "",
"monitors": "",
"distributedUptimeStatusCreateStatusPage": "",
"distributedUptimeStatusCreateStatusPageAccess": "",
"distributedUptimeStatusCreateStatusPageReady": "",
"distributedUptimeStatusBasicInfoHeader": "",
"distributedUptimeStatusBasicInfoDescription": "",
"distributedUptimeStatusLogoHeader": "",
"distributedUptimeStatusLogoDescription": "",
"distributedUptimeStatusLogoUploadButton": "",
"distributedUptimeStatusStandardMonitorsHeader": "",
"distributedUptimeStatusStandardMonitorsDescription": "",
"distributedUptimeStatusCreateYour": "",
"distributedUptimeStatusEditYour": "",
"distributedUptimeStatusPublishedLabel": "",
"distributedUptimeStatusCompanyNameLabel": "",
"distributedUptimeStatusPageAddressLabel": "",
"distributedUptimeStatus30Days": "",
"distributedUptimeStatus60Days": "",
"distributedUptimeStatus90Days": "",
"distributedUptimeStatusPageNotSetUp": "",
"distributedUptimeStatusContactAdmin": "",
"distributedUptimeStatusPageNotPublic": "",
"distributedUptimeStatusPageDeleteDialog": "",
"distributedUptimeStatusPageDeleteConfirm": "",
"distributedUptimeStatusPageDeleteDescription": "",
"distributedUptimeStatusDevices": "",
"distributedUptimeStatusUpt": "",
"distributedUptimeStatusUptBurned": "",
"distributedUptimeStatusUptLogo": "",
"incidentsTableNoIncidents": "",
"incidentsTablePaginationLabel": "",
"incidentsTableMonitorName": "",
"incidentsTableStatus": "",
"incidentsTableDateTime": "",
"incidentsTableStatusCode": "",
"incidentsTableMessage": "",
"incidentsOptionsHeader": "",
"incidentsOptionsHeaderFilterBy": "",
"incidentsOptionsHeaderFilterAll": "",
"incidentsOptionsHeaderFilterDown": "",
"incidentsOptionsHeaderFilterCannotResolve": "",
"incidentsOptionsHeaderShow": "",
"incidentsOptionsHeaderLastHour": "",
"incidentsOptionsHeaderLastDay": "",
"incidentsOptionsHeaderLastWeek": "",
"incidentsOptionsPlaceholderAllServers": "",
"infrastructureCreateYour": "",
"infrastructureCreateGeneralSettingsDescription": "",
"infrastructureServerRequirement": "",
"infrastructureCustomizeAlerts": "",
"infrastructureAlertNotificationDescription": "",
"infrastructureCreateMonitor": "",
"infrastructureProtocol": "",
"infrastructureServerUrlLabel": "",
"infrastructureDisplayNameLabel": "",
"infrastructureAuthorizationSecretLabel": "",
"gb": "",
"mb": "",
"mem": "",
"memoryUsage": "",
"cpu": "",
"cpuUsage": "",
"cpuTemperature": "",
"diskUsage": "",
"used": "",
"total": "",
"cores": "",
"frequency": "",
"status": "",
"cpuPhysical": "",
"cpuLogical": "",
"cpuFrequency": "",
"avgCpuTemperature": "",
"memory": "",
"disk": "",
"uptime": "",
"os": "",
"host": "",
"actions": "",
"integrations": "",
"integrationsPrism": "",
"integrationsSlack": "",
"integrationsSlackInfo": "",
"integrationsDiscord": "",
"integrationsDiscordInfo": "",
"integrationsZapier": "",
"integrationsZapierInfo": "",
"commonSave": "",
"createYour": "",
"createMonitor": "",
"pause": "",
"resume": "",
"editing": "",
"url": "",
"access": "",
"timezone": "",
"features": "",
"administrator": "",
"loginHere": "",
"displayName": "",
"urlMonitor": "",
"portToMonitor": "",
"websiteMonitoring": "",
"websiteMonitoringDescription": "",
"pingMonitoring": "",
"pingMonitoringDescription": "",
"dockerContainerMonitoring": "",
"dockerContainerMonitoringDescription": "",
"portMonitoring": "",
"portMonitoringDescription": "",
"createMaintenanceWindow": "",
"createMaintenance": "",
"editMaintenance": "",
"maintenanceWindowName": "",
"friendlyNameInput": "",
"friendlyNamePlaceholder": "",
"maintenanceRepeat": "",
"maintenance": "",
"duration": "",
"addMonitors": "",
"window": "",
"cancel": "",
"message": "",
"low": "",
"high": "",
"statusCode": "",
"date&Time": "",
"type": "",
"statusPageName": "",
"publicURL": "",
"repeat": "",
"edit": "",
"createA": "",
"remove": "",
"maintenanceWindowDescription": "",
"startTime": "",
"timeZoneInfo": "",
"monitorsToApply": "",
"nextWindow": "",
"notFoundButton": "",
"pageSpeedConfigureSettingsDescription": "",
"monitorDisplayName": "",
"whenNewIncident": "",
"notifySMS": "",
"notifyEmails": "",
"seperateEmails": "",
"checkFrequency": "",
"matchMethod": "",
"expectedValue": "",
"deleteDialogTitle": "",
"deleteDialogDescription": "",
"pageSpeedMonitor": "",
"shown": "",
"ago": "",
"companyName": "",
"pageSpeedDetailsPerformanceReport": "",
"pageSpeedDetailsPerformanceReportCalculator": "",
"checkingEvery": "",
"statusPageCreateSettings": "",
"basicInformation": "",
"statusPageCreateBasicInfoDescription": "",
"statusPageCreateSelectTimeZoneDescription": "",
"statusPageCreateAppearanceDescription": "",
"statusPageCreateSettingsCheckboxLabel": "",
"statusPageCreateBasicInfoStatusPageAddress": "",
"statusPageCreateTabsContent": "",
"statusPageCreateTabsContentDescription": "",
"statusPageCreateTabsContentFeaturesDescription": "",
"showCharts": "",
"showUptimePercentage": "",
"removeLogo": "",
"statusPageStatus": "",
"statusPageStatusContactAdmin": "",
"statusPageStatusNotPublic": "",
"statusPageStatusNoPage": "",
"statusPageStatusServiceStatus": "",
"deleteStatusPage": "",
"deleteStatusPageConfirm": "",
"deleteStatusPageDescription": "",
"uptimeCreate": "",
"uptimeCreateJsonPath": "",
"uptimeCreateJsonPathQuery": "",
"maintenanceTableActionMenuDialogTitle": "",
"infrastructureEditYour": "",
"infrastructureEditMonitor": "",
"infrastructureMonitorCreated": "",
"infrastructureMonitorUpdated": "",
"errorInvalidTypeId": "",
"errorInvalidFieldId": "",
"inviteNoTokenFound": "",
"pageSpeedWarning": "",
"pageSpeedLearnMoreLink": "",
"pageSpeedAddApiKey": "",
"update": "",
"invalidFileFormat": "",
"invalidFileSize": "",
"ClickUpload": "",
"DragandDrop": "",
"MaxSize": "",
"SupportedFormats": "",
"FirstName": "",
"LastName": "",
"EmailDescriptionText": "",
"YourPhoto": "",
"PhotoDescriptionText": "",
"save": "",
"DeleteDescriptionText": "",
"DeleteAccountWarning": "",
"DeleteWarningTitle": "",
"bulkImport": {
"title": "",
"selectFileTips": "",
"selectFileDescription": "",
"selectFile": "",
"parsingFailed": "",
"uploadSuccess": "",
"validationFailed": "",
"noFileSelected": "",
"fallbackPage": ""
},
"settingsSystemReset": "",
"settingsSystemResetDescription": "",
"DeleteAccountTitle": "",
"DeleteAccountButton": "",
"publicLink": "",
"maskedPageSpeedKeyPlaceholder": "",
"pageSpeedApiKeyFieldTitle": "",
"pageSpeedApiKeyFieldLabel": "",
"pageSpeedApiKeyFieldDescription": "",
"pageSpeedApiKeyFieldResetLabel": "",
"reset": "",
"ignoreTLSError": "",
"tlsErrorIgnored": "",
"ignoreTLSErrorDescription": "",
"createNew": "",
"greeting": {
"prepend": "",
"append": "",
"overview": ""
},
"roles": {
"superAdmin": "",
"admin": "",
"teamMember": "",
"demoUser": ""
},
"teamPanel": {
"teamMembers": "",
"filter": {
"all": "",
"member": ""
},
"inviteTeamMember": "",
"inviteNewTeamMember": "",
"inviteDescription": "",
"email": "",
"selectRole": "",
"inviteLink": "",
"cancel": "",
"noMembers": "",
"getToken": "",
"emailToken": "",
"table": {
"name": "",
"email": "",
"role": "",
"created": ""
}
},
"monitorState": {
"paused": "",
"resumed": "",
"active": ""
},
"menu": {
"uptime": "",
"pagespeed": "",
"infrastructure": "",
"incidents": "",
"statusPages": "",
"maintenance": "",
"integrations": "",
"settings": "",
"support": "",
"discussions": "",
"docs": "",
"changelog": "",
"profile": "",
"password": "",
"team": "",
"logOut": "",
"notifications": ""
},
"settingsEmail": "",
"settingsEmailDescription": "",
"settingsEmailHost": "",
"settingsEmailPort": "",
"settingsEmailAddress": "",
"settingsEmailPassword": "",
"settingsEmailUser": "",
"settingsEmailFieldResetLabel": "",
"state": "",
"statusBreadCrumbsStatusPages": "",
"statusBreadCrumbsDetails": "",
"settingsThemeModeLight": "",
"settingsThemeModeDark": "",
"settingsClearAllStatsDialogCancel": "",
"commonSaving": "",
"navControls": "",
"incidentsPageTitle": "",
"passwordPanel": {
"passwordChangedSuccess": "",
"passwordInputIncorrect": "",
"currentPassword": "",
"enterCurrentPassword": "",
"newPassword": "",
"enterNewPassword": "",
"confirmNewPassword": "",
"passwordRequirements": "",
"saving": ""
},
"settingsEmailConnectionHost": "",
"emailSent": "",
"failedToSendEmail": "",
"settingsTestEmail": "",
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "",
"settingsEmailRequiredFields": "",
"statusMsg": {
"paused": "",
"up": "",
"down": "",
"pending": ""
},
"settingsURLTitle": "",
"settingsURLDescription": "",
"settingsURLSelectTitle": "",
"settingsURLEnabled": "",
"settingURLDisabled": "",
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
"docker": "",
"port": ""
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,203 +1,18 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": "Přepnout mezi světlým a tmavým motivem"
},
"toasts": {
"networkError": "Chyba připojení k síti",
"checkConnection": "Zkontrolujte prosím své připojení k síti",
"unknownError": "Nastala neznámá chyba"
}
},
"auth": {
"common": {
"navigation": {
"continue": "Pokračovat",
"back": "Zpět"
},
"inputs": {
"email": {
"label": "E-mail",
"placeholder": "jan.novak@domena.cz",
"errors": {
"empty": "Zadejte prosím e-mailovou adresu",
"invalid": "Překontrolujte si prosím správnost zadané e-mailové adresy"
}
},
"password": {
"label": "Heslo",
"rules": {
"length": {
"beginning": "Heslo musí být dlouhé alespoň",
"highlighted": "8 znaků"
},
"special": {
"beginning": "Heslo musí obsahovat alespoň",
"highlighted": "1 speciální znak"
},
"number": {
"beginning": "Heslo musí obsahovat alespoň",
"highlighted": "1 číslo"
},
"uppercase": {
"beginning": "Heslo musí obsahovat alespoň",
"highlighted": "1 velké písmeno"
},
"lowercase": {
"beginning": "Heslo musí obsahovat alespoň",
"highlighted": "1 malé písmeno"
},
"match": {
"beginning": "Obě hesla se",
"highlighted": "musí shodovat"
}
},
"errors": {
"empty": "Zadejte prosím heslo",
"length": "Heslo musí být dlouhé alespoň 8 znaků",
"uppercase": "Heslo musí obsahovat alespoň 1 velké písmeno",
"lowercase": "Heslo musí obsahovat alespoň 1 malé písmeno",
"number": "Heslo musí obsahovat alespoň 1 číslo",
"special": "Heslo musí obsahovat alespoň 1 speciální znak",
"incorrect": "Zadané heslo neodpovídá tomu, co bylo nastaveno"
}
},
"passwordConfirm": {
"label": "Potvrzení hesla",
"placeholder": "Pro ověření správnosti zadejte heslo ještě jednou",
"errors": {
"empty": "Zadejte prosím své heslo ještě jednou, aby mohla být potvrzena jeho správnost (odhalí překlepy)",
"different": "Zadaná hesla se liší, takže je nejspíše jedno z nich špatně zapsané"
}
},
"firstName": {
"label": "Jméno",
"placeholder": "Jan",
"errors": {
"empty": "Zadejte prosím své křestní jméno",
"length": "Jméno se musí vejít do 50 znaků",
"pattern": "Součástí jména mohou být pouze písmena, mezery apostrofy nebo spojovníky"
}
},
"lastName": {
"label": "Příjmení",
"placeholder": "Novák",
"errors": {
"empty": "Zadejte prosím své příjmení",
"length": "Příjmení se musí vejít do 50 znaků",
"pattern": "Součástí příjmení mohou být pouze písmena, mezery apostrofy nebo spojovníky"
}
}
},
"errors": {
"validation": "Nastala chyba při ověřování dat."
}
},
"login": {
"heading": "Přihlášení",
"subheadings": {
"stepOne": "Zadejte svůj e-mail",
"stepTwo": "Zadejte své heslo"
},
"links": {
"forgotPassword": "Zapomněli jste heslo? <a>Obnovte si ho</a>",
"register": "Ještě nemáte účet? <a>Zaregistrujte se</a>"
},
"toasts": {
"success": "Vítejte zpět",
"incorrectPassword": "Nesprávné heslo"
}
},
"registration": {
"heading": {
"superAdmin": "Vytvoření superadministrátora",
"user": "Registrace"
},
"subheadings": {
"stepOne": "Zadejte své osobní údaje",
"stepTwo": "Zadejte svůj e-mail",
"stepThree": "Nastavte si heslo"
},
"description": {
"superAdmin": "Pro začátek vytvořte účet superadministrátora",
"user": "Zaregistrujte se jako uživatel a požádejte svého superadministrátora, aby vám přidělil oprávnění k hlídačům"
},
"gettingStartedButton": {
"superAdmin": "Vytvořit účet superadministrátora",
"user": "Zaregistrovat se jako běžný uživatel"
},
"termsAndPolicies": "Vytvořením účtu souhlasíte s našimi <a1>Podmínkami použití</a1> (anglicky) a <a2>Podmínkami zpracování osobních údajů</a2> (anglicky).",
"links": {
"login": "Máte již vytvořený účet? <a>Přihlašte se</a>"
},
"toasts": {
"success": "Vítejte! Váš účet byl úspěšně vytvořen."
}
},
"forgotPassword": {
"heading": "Zapomenuté heslo",
"subheadings": {
"stepOne": "Nebojte se, zašleme vám pokyny pro obnovení hesla.",
"stepTwo": "Odkaz pro obnovení hesla byl odeslán na <email/>",
"stepThree": "Nové heslo se musí lišit od těch, které jste již použili.",
"stepFour": "Heslo bylo úspěšně obnoveno. Klepněte na tlačítko a dojde k čarovnému přihlášení."
},
"buttons": {
"openEmail": "Otevřít e-mailovou aplikaci",
"resetPassword": "Obnovit heslo"
},
"imageAlts": {
"passwordKey": "Ikonka přístupového klíče",
"email": "Ikonka e-mailu",
"lock": "Ikonka zámku",
"passwordConfirm": "Ikonka potvrzeného hesla"
},
"links": {
"login": "Vrátit se k <a>Přihlášení</a>",
"resend": "Nedorazil vám e-mail? <a>Klepněte pro opětovné zaslání</a>"
},
"toasts": {
"sent": "Instrukce vám dorazí na <email/>.",
"emailNotFound": "Nepodařilo se nalézt e-mailovou adresu.",
"redirect": "Přesměrování proběhne za <seconds/>...",
"success": "Heslo bylo úspěšně obnoveno.",
"error": "Obnova hesla se nepodařila. Zkuste to prosím znovu nebo kontaktujte podporu."
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "Podařilo se úspěšně obnovit spojení se serverem",
"stillUnreachable": "Server je stále nedosažitelný. Zkuste to prosím později."
},
"alertBox": "Chyba připojení k serveru",
"description": "Nepodařilo se připojit k serveru. Zkontrolujte si prosím internetové připojení a pokud problém přetrvává, ověřte konfiguraci aplikace Checkmate.",
"retryButton": {
"default": "Zkusit se znovu připojit",
"processing": "Probíhá připojování…"
}
}
},
"submit": "",
"submit": "Odeslat",
"title": "",
"createPassword": "",
"distributedStatusHeaderText": "",
"distributedStatusSubHeaderText": "",
"settingsGeneralSettings": "",
"settingsGeneralSettings": "Obecná nastavení",
"settingsDisplayTimezone": "",
"settingsDisplayTimezoneDescription": "",
"settingsAppearance": "",
"settingsAppearance": "Vzhled",
"settingsAppearanceDescription": "",
"settingsThemeMode": "",
"settingsLanguage": "",
"settingsDistributedUptime": "",
"settingsDistributedUptimeDescription": "",
"settingsEnabled": "",
"settingsDisabled": "",
"settingsHistoryAndMonitoring": "",
"settingsLanguage": "Jazyk",
"settingsEnabled": "Zapnuto",
"settingsDisabled": "Vypnuto",
"settingsHistoryAndMonitoring": "Historie a monitorování",
"settingsHistoryAndMonitoringDescription": "",
"settingsTTLLabel": "",
"settingsTTLOptionalLabel": "",
@@ -214,13 +29,11 @@
"settingsRemoveAllMonitorsButton": "",
"settingsRemoveAllMonitorsDialogTitle": "",
"settingsRemoveAllMonitorsDialogConfirm": "",
"settingsWallet": "",
"settingsWalletDescription": "",
"settingsAbout": "",
"settingsDevelopedBy": "",
"settingsSave": "",
"settingsSuccessSaved": "",
"settingsFailedToSave": "",
"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": "",
@@ -258,10 +71,6 @@
"distributedUptimeCreateIncidentDescription": "",
"distributedUptimeCreateAdvancedSettings": "",
"distributedUptimeDetailsNoMonitorHistory": "",
"distributedUptimeDetailsFooterHeading": "",
"distributedUptimeDetailsFooterBuilt": "",
"distributedUptimeDetailsFooterSolana": "",
"distributedUptimeDetailsMonitorHeader": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "",
"notifications": {
@@ -303,7 +112,33 @@
"testSuccess": "",
"testFailed": "",
"unsupportedType": "",
"networkError": ""
"networkError": "",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "",
"add": "",
@@ -547,11 +382,6 @@
"append": "",
"overview": ""
},
"monitorStatus": {
"up": "",
"down": "",
"paused": ""
},
"roles": {
"superAdmin": "",
"admin": "",
@@ -590,7 +420,6 @@
"uptime": "",
"pagespeed": "",
"infrastructure": "",
"distributedUptime": "",
"incidents": "",
"statusPages": "",
"maintenance": "",
@@ -603,7 +432,8 @@
"profile": "",
"password": "",
"team": "",
"logOut": ""
"logOut": "",
"notifications": ""
},
"settingsEmail": "",
"settingsEmailDescription": "",
@@ -634,7 +464,6 @@
"saving": ""
},
"settingsEmailConnectionHost": "",
"sendTestEmail": "",
"emailSent": "",
"failedToSendEmail": "",
"settingsTestEmail": "",
@@ -659,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": "Přepnout mezi světlým a tmavým motivem"
},
"toasts": {
"networkError": "Chyba připojení k síti",
"checkConnection": "Zkontrolujte prosím své připojení k síti",
"unknownError": "Nastala neznámá chyba"
}
},
"auth": {
"common": {
"navigation": {
"continue": "Pokračovat",
"back": "Zpět"
},
"inputs": {
"email": {
"label": "E-mail",
"placeholder": "jan.novak@domena.cz",
"errors": {
"empty": "Zadejte prosím e-mailovou adresu",
"invalid": "Překontrolujte si prosím správnost zadané e-mailové adresy"
}
},
"password": {
"label": "Heslo",
"rules": {
"length": {
"beginning": "Heslo musí být dlouhé alespoň",
"highlighted": "8 znaků"
},
"special": {
"beginning": "Heslo musí obsahovat alespoň",
"highlighted": "1 speciální znak"
},
"number": {
"beginning": "Heslo musí obsahovat alespoň",
"highlighted": "1 číslo"
},
"uppercase": {
"beginning": "Heslo musí obsahovat alespoň",
"highlighted": "1 velké písmeno"
},
"lowercase": {
"beginning": "Heslo musí obsahovat alespoň",
"highlighted": "1 malé písmeno"
},
"match": {
"beginning": "Obě hesla se",
"highlighted": "musí shodovat"
}
},
"errors": {
"empty": "Zadejte prosím heslo",
"length": "Heslo musí být dlouhé alespoň 8 znaků",
"uppercase": "Heslo musí obsahovat alespoň 1 velké písmeno",
"lowercase": "Heslo musí obsahovat alespoň 1 malé písmeno",
"number": "Heslo musí obsahovat alespoň 1 číslo",
"special": "Heslo musí obsahovat alespoň 1 speciální znak",
"incorrect": "Zadané heslo neodpovídá tomu, co bylo nastaveno"
}
},
"passwordConfirm": {
"label": "Potvrzení hesla",
"placeholder": "Pro ověření správnosti zadejte heslo ještě jednou",
"errors": {
"empty": "Zadejte prosím své heslo ještě jednou, aby mohla být potvrzena jeho správnost (odhalí překlepy)",
"different": "Zadaná hesla se liší, takže je nejspíše jedno z nich špatně zapsané"
}
},
"firstName": {
"label": "Jméno",
"placeholder": "Jan",
"errors": {
"empty": "Zadejte prosím své křestní jméno",
"length": "Jméno se musí vejít do 50 znaků",
"pattern": "Součástí jména mohou být pouze písmena, mezery apostrofy nebo spojovníky"
}
},
"lastName": {
"label": "Příjmení",
"placeholder": "Novák",
"errors": {
"empty": "Zadejte prosím své příjmení",
"length": "Příjmení se musí vejít do 50 znaků",
"pattern": "Součástí příjmení mohou být pouze písmena, mezery apostrofy nebo spojovníky"
}
}
},
"errors": {
"validation": "Nastala chyba při ověřování dat."
}
},
"login": {
"heading": "Přihlášení",
"subheadings": {
"stepOne": "Zadejte svůj e-mail",
"stepTwo": "Zadejte své heslo"
},
"links": {
"forgotPassword": "Zapomněli jste heslo? <a>Obnovte si ho</a>",
"register": "Ještě nemáte účet? <a>Zaregistrujte se</a>",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "Vítejte zpět",
"incorrectPassword": "Nesprávné heslo"
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "Vytvoření superadministrátora",
"user": "Registrace"
},
"subheadings": {
"stepOne": "Zadejte své osobní údaje",
"stepTwo": "Zadejte svůj e-mail",
"stepThree": "Nastavte si heslo"
},
"description": {
"superAdmin": "Pro začátek vytvořte účet superadministrátora",
"user": "Zaregistrujte se jako uživatel a požádejte svého superadministrátora, aby vám přidělil oprávnění k hlídačům"
},
"gettingStartedButton": {
"superAdmin": "Vytvořit účet superadministrátora",
"user": "Zaregistrovat se jako běžný uživatel"
},
"termsAndPolicies": "Vytvořením účtu souhlasíte s našimi <a1>Podmínkami použití</a1> (anglicky) a <a2>Podmínkami zpracování osobních údajů</a2> (anglicky).",
"links": {
"login": "Máte již vytvořený účet? <a>Přihlašte se</a>"
},
"toasts": {
"success": "Vítejte! Váš účet byl úspěšně vytvořen."
}
},
"forgotPassword": {
"heading": "Zapomenuté heslo",
"subheadings": {
"stepOne": "Nebojte se, zašleme vám pokyny pro obnovení hesla.",
"stepTwo": "Odkaz pro obnovení hesla byl odeslán na <email/>",
"stepThree": "Nové heslo se musí lišit od těch, které jste již použili.",
"stepFour": "Heslo bylo úspěšně obnoveno. Klepněte na tlačítko a dojde k čarovnému přihlášení."
},
"buttons": {
"openEmail": "Otevřít e-mailovou aplikaci",
"resetPassword": "Obnovit heslo"
},
"imageAlts": {
"passwordKey": "Ikonka přístupového klíče",
"email": "Ikonka e-mailu",
"lock": "Ikonka zámku",
"passwordConfirm": "Ikonka potvrzeného hesla"
},
"links": {
"login": "Vrátit se k <a>Přihlášení</a>",
"resend": "Nedorazil vám e-mail? <a>Klepněte pro opětovné zaslání</a>"
},
"toasts": {
"sent": "Instrukce vám dorazí na <email/>.",
"emailNotFound": "Nepodařilo se nalézt e-mailovou adresu.",
"redirect": "Přesměrování proběhne za <seconds/>...",
"success": "Heslo bylo úspěšně obnoveno.",
"error": "Obnova hesla se nepodařila. Zkuste to prosím znovu nebo kontaktujte podporu."
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "Podařilo se úspěšně obnovit spojení se serverem",
"stillUnreachable": "Server je stále nedosažitelný. Zkuste to prosím později."
},
"alertBox": "Chyba připojení k serveru",
"description": "Nepodařilo se připojit k serveru. Zkontrolujte si prosím internetové připojení a pokud problém přetrvává, ověřte konfiguraci aplikace Checkmate.",
"retryButton": {
"default": "Zkusit se znovu připojit",
"processing": "Probíhá připojování…"
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,200 +1,16 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "Weiter",
"back": "Zurück"
},
"inputs": {
"email": {
"label": "E-Mail",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "Passwort",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "Anmelden",
"subheadings": {
"stepOne": "",
"stepTwo": "Geben Sie Ihr Passwort ein"
},
"links": {
"forgotPassword": "Passwort vergessen? <a>Passwort zurücksetzen</a>",
"register": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": "Registrieren"
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "Erstelle dein Passwort"
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "Passwort zurücksetzen",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"submit": "Absenden",
"title": "Titel",
"distributedStatusHeaderText": "",
"distributedStatusSubHeaderText": "",
"settingsGeneralSettings": "",
"settingsDisplayTimezone": "",
"settingsGeneralSettings": "Einstellungen",
"settingsDisplayTimezone": "Zeitzone anzeigen",
"settingsDisplayTimezoneDescription": "",
"settingsAppearance": "",
"settingsAppearanceDescription": "",
"settingsThemeMode": "",
"settingsLanguage": "",
"settingsDistributedUptime": "",
"settingsDistributedUptimeDescription": "",
"settingsEnabled": "",
"settingsThemeMode": "Theme modus",
"settingsLanguage": "Sprache",
"settingsEnabled": "Aktiv",
"settingsDisabled": "",
"settingsHistoryAndMonitoring": "",
"settingsHistoryAndMonitoringDescription": "",
@@ -213,8 +29,6 @@
"settingsRemoveAllMonitorsButton": "",
"settingsRemoveAllMonitorsDialogTitle": "",
"settingsRemoveAllMonitorsDialogConfirm": "",
"settingsWallet": "",
"settingsWalletDescription": "",
"settingsAbout": "",
"settingsDevelopedBy": "",
"settingsSave": "",
@@ -257,10 +71,6 @@
"distributedUptimeCreateIncidentDescription": "",
"distributedUptimeCreateAdvancedSettings": "",
"distributedUptimeDetailsNoMonitorHistory": "",
"distributedUptimeDetailsFooterHeading": "",
"distributedUptimeDetailsFooterBuilt": "",
"distributedUptimeDetailsFooterSolana": "",
"distributedUptimeDetailsMonitorHeader": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "",
"notifications": {
@@ -302,7 +112,33 @@
"testSuccess": "",
"testFailed": "",
"unsupportedType": "",
"networkError": ""
"networkError": "",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "",
"add": "",
@@ -546,11 +382,6 @@
"append": "",
"overview": ""
},
"monitorStatus": {
"up": "",
"down": "",
"paused": ""
},
"roles": {
"superAdmin": "",
"admin": "",
@@ -589,7 +420,6 @@
"uptime": "",
"pagespeed": "",
"infrastructure": "",
"distributedUptime": "",
"incidents": "",
"statusPages": "",
"maintenance": "",
@@ -602,7 +432,8 @@
"profile": "",
"password": "",
"team": "",
"logOut": ""
"logOut": "",
"notifications": ""
},
"settingsEmail": "",
"settingsEmailDescription": "",
@@ -633,7 +464,6 @@
"saving": ""
},
"settingsEmailConnectionHost": "",
"sendTestEmail": "",
"emailSent": "",
"failedToSendEmail": "",
"settingsTestEmail": "",
@@ -658,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,193 +1,4 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": "Toggles light & dark"
},
"toasts": {
"networkError": "Network error",
"checkConnection": "Please check your connection",
"unknownError": "Unknown error"
}
},
"auth": {
"common": {
"navigation": {
"continue": "Continue",
"back": "Back"
},
"inputs": {
"email": {
"label": "Email",
"placeholder": "jordan.ellis@domain.com",
"errors": {
"empty": "To continue, please enter your email address",
"invalid": "Please recheck validity of entered email address"
}
},
"password": {
"label": "Password",
"rules": {
"length": {
"beginning": "Must be at least",
"highlighted": "8 characters long"
},
"special": {
"beginning": "Must contain at least",
"highlighted": "one special character"
},
"number": {
"beginning": "Must contain at least",
"highlighted": "one number"
},
"uppercase": {
"beginning": "Must contain at least",
"highlighted": "one upper character"
},
"lowercase": {
"beginning": "Must contain at least",
"highlighted": "one lower character"
},
"match": {
"beginning": "Confirm password and password",
"highlighted": "must match"
}
},
"errors": {
"empty": "Please enter your password",
"length": "Password must be at least 8 characters long",
"uppercase": "Password must contain at least 1 uppercase letter",
"lowercase": "Password must contain at least 1 lowercase letter",
"number": "Password must contain at least 1 number",
"special": "Password must contain at least 1 special character",
"incorrect": "The password you provided does not match our records"
}
},
"passwordConfirm": {
"label": "Confirm password",
"placeholder": "Re-enter password to confirm",
"errors": {
"empty": "Please enter your password again for confirmation (helps with typos)",
"different": "Entered passwords don't match, so one of them is probably mistyped"
}
},
"firstName": {
"label": "Name",
"placeholder": "Jordan",
"errors": {
"empty": "Please enter your name",
"length": "Name must be less than 50 characters",
"pattern": "Name must contain only letters, spaces, apostrophes, or hyphens"
}
},
"lastName": {
"label": "Surname",
"placeholder": "Ellis",
"errors": {
"empty": "Please enter your surname",
"length": "Surname must be less than 50 characters",
"pattern": "Surname must contain only letters, spaces, apostrophes, or hyphens"
}
}
},
"errors": {
"validation": "Error validating data."
}
},
"login": {
"heading": "Log In",
"subheadings": {
"stepOne": "Enter your email",
"stepTwo": "Enter your password"
},
"links": {
"forgotPassword": "Forgot password?",
"forgotPasswordLink": "Reset password",
"register": "Do not have an account?",
"registerLink": "Register here"
},
"toasts": {
"success": "Welcome back! You're successfully logged in.",
"incorrectPassword": "Incorrect password"
},
"errors": {
"password": {
"incorrect": "The password you provided does not match our records"
}
}
},
"registration": {
"heading": {
"superAdmin": "Create super admin",
"user": "Sign Up"
},
"subheadings": {
"stepOne": "Enter your personal details",
"stepTwo": "Enter your email",
"stepThree": "Create your password"
},
"description": {
"superAdmin": "Create your super admin account to get started",
"user": "Sign up as a user and ask super admin for access to your monitors"
},
"gettingStartedButton": {
"superAdmin": "Create super admin account",
"user": "Sign up regular user"
},
"termsAndPolicies": "By creating an account, you agree to our <a1>Terms of Service</a1> and <a2>Privacy Policy</a2>.",
"links": {
"login": "Already have an account? <a>Log In</a>"
},
"toasts": {
"success": "Welcome! Your account was created successfully."
}
},
"forgotPassword": {
"heading": "Forgot password?",
"subheadings": {
"stepOne": "No worries, we'll send you reset instructions.",
"stepTwo": "We sent a password reset link to <email/>",
"stepThree": "Your new password must be different from previously used passwords.",
"stepFour": "Your password has been successfully reset. Click below to log in magically."
},
"buttons": {
"openEmail": "Open email app",
"resetPassword": "Reset password"
},
"imageAlts": {
"passwordKey": "Password key icon",
"email": "Email icon",
"lock": "Lock icon",
"passwordConfirm": "Password confirm icon"
},
"links": {
"login": "Go back to <a>Log In</a>",
"resend": "Didn't receive the email? <a>Click to resend</a>"
},
"toasts": {
"sent": "Instructions sent to <email/>.",
"emailNotFound": "Email not found.",
"redirect": "Redirecting in <seconds/>...",
"success": "Your password was reset successfully.",
"error": "Unable to reset password. Please try again later or contact support."
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "Successfully reconnected to the server.",
"stillUnreachable": "Server is still unreachable. Please try again later."
},
"alertBox": "Server Connection Error",
"description": "We're unable to connect to the server. Please check your internet connection or verify your deployment configuration if the problem persists.",
"retryButton": {
"default": "Retry connection",
"processing": "Connecting..."
}
}
},
"submit": "Submit",
"title": "Title",
"distributedStatusHeaderText": "Real-time, real-device coverage",
@@ -262,60 +73,7 @@
"distributedUptimeDetailsNoMonitorHistory": "There is no check history for this monitor yet.",
"distributedUptimeDetailsStatusHeaderUptime": "Uptime:",
"distributedUptimeDetailsStatusHeaderLastUpdate": "Last updated",
"createNotifications": {
"title": "Create notification channel",
"nameSettings": {
"title": "Name",
"description": "A descriptive name for your integration.",
"nameLabel": "Name",
"namePlaceholder": "e.g. Slack notifications"
},
"typeSettings": {
"title": "Type",
"description": "Select the type of notification channel you want to create.",
"typeLabel": "Type"
},
"emailSettings": {
"title": "Email",
"description": "Destination email addresses.",
"emailLabel": "Email address",
"emailPlaceholder": "e.g. john@example.com"
},
"slackSettings": {
"title": "Slack",
"description": "Configure your Slack webhook here",
"webhookLabel": "Slack webhook URL",
"webhookPlaceholder": "https://hooks.slack.com/services/..."
},
"pagerdutySettings": {
"title": "PagerDuty",
"description": "Configure your PagerDuty integration here",
"integrationKeyLabel": "Integration key",
"integrationKeyPlaceholder": "1234567890"
},
"genericWebhookSettings": {
"title": "Webhook",
"description": "Configure your webhook here",
"webhookLabel": "Webhook URL",
"webhookPlaceholder": "https://your-server.com/webhook"
}
},
"notificationConfig": {
"title": "Notifications",
"description": "Select the notifications channels you want to use"
},
"notifications": {
"fallback": {
"title": "notification channel",
"checks": [
"Alert teams about downtime or performance issues",
"Let engineers know when incidents happen",
"Keep administrators informed of system changes"
]
},
"createButton": "Create notification channel",
"createTitle": "Notification channel",
"enableNotifications": "Enable {{platform}} notifications",
"testNotification": "Test notification",
"addOrEditNotifications": "Add or edit notifications",
@@ -355,6 +113,16 @@
"testFailed": "Failed to send test notification",
"unsupportedType": "Unsupported notification type",
"networkError": "Network error occurred",
"fallback": {
"title": "notification channel",
"checks": [
"Alert teams about downtime or performance issues",
"Let engineers know when incidents happen",
"Keep administrators informed of system changes"
]
},
"createButton": "Create notification channel",
"createTitle": "Notification channel",
"create": {
"success": "Notification created successfully",
"failed": "Failed to create notification"
@@ -525,7 +293,6 @@
"notifyEmails": "Also notify via email to multiple addresses (coming soon)",
"seperateEmails": "You can separate multiple emails with a comma",
"checkFrequency": "Check frequency",
"advancedMatching": "Advanced matching",
"matchMethod": "Match Method",
"expectedValue": "Expected value",
"deleteDialogTitle": "Do you really want to delete this monitor?",
@@ -619,13 +386,6 @@
"append": "The afternoon is your playground—let's make it epic!",
"overview": "Here's an overview of your {{type}} monitors."
},
"monitorStatus": {
"up": "up",
"down": "down",
"paused": "paused",
"checkingEvery": "Checking every {{interval}}",
"withCaptureAgent": "with Capture agent {{version}}"
},
"roles": {
"superAdmin": "Super admin",
"admin": "Admin",
@@ -663,7 +423,6 @@
"menu": {
"uptime": "Uptime",
"pagespeed": "Pagespeed",
"notifications": "Notifications",
"infrastructure": "Infrastructure",
"incidents": "Incidents",
"statusPages": "Status pages",
@@ -677,7 +436,8 @@
"profile": "Profile",
"password": "Password",
"team": "Team",
"logOut": "Log out"
"logOut": "Log out",
"notifications": "Notifications"
},
"settingsEmail": "Email",
"settingsEmailDescription": "Configure the email settings for your system. This is used to send notifications and alerts.",
@@ -687,12 +447,6 @@
"settingsEmailPassword": "Email password - Password for authentication",
"settingsEmailUser": "Email user - Username for authentication, overrides email address if specified",
"settingsEmailFieldResetLabel": "Password is set. Click Reset to change it.",
"settingsEmailTLSServername": "TLS Servername - Optional Hostname for TLS Validation when host is an IP",
"settingsEmailIgnoreTLS": "Ignore TLS - Disable STARTTLS",
"settingsEmailRequireTLS": "Require TLS - Force STARTTLS",
"settingsEmailRejectUnauthorized": "Reject Unauthorized",
"settingsEmailSecure": "Secure - Use SSL",
"settingsEmailPool": "Pool - Enable connection pooling",
"state": "State",
"statusBreadCrumbsStatusPages": "Status Pages",
"statusBreadCrumbsDetails": "Details",
@@ -714,7 +468,6 @@
"saving": "Saving..."
},
"settingsEmailConnectionHost": "Email connection host - Hostname to use in the HELO/EHLO greeting",
"sendTestNotifications": "Send test notifications",
"emailSent": "Email sent successfully",
"failedToSendEmail": "Failed to send email",
"settingsTestEmail": "Send test e-mail",
@@ -739,9 +492,6 @@
"ping": "Enter the IP address or hostname to ping (e.g., 192.168.1.100 or example.com) and add a clear display name that appears on the dashboard.",
"docker": "Enter the Docker ID of your container. Docker IDs must be the full 64 char Docker ID. You can run docker inspect <short_id> to get the full container ID.",
"port": "Enter the URL or IP of the server, the port number and a clear display name that appears on the dashboard."
<<<<<<< Updated upstream
}
=======
},
"common": {
"appName": "Checkmate",
@@ -995,6 +745,5 @@
"settingsEmailSecure": "Secure - Use SSL",
"settingsEmailPool": "Pool - Enable connection pooling",
"sendTestNotifications": "Send test notifications",
"selectAll": "Select all"
>>>>>>> Stashed changes
}
"selectAll": "Select all"
}

View File

@@ -1,186 +1,4 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "Continuar",
"back": "Atras"
},
"inputs": {
"email": {
"label": "Correo electronico",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "Contraseña",
"rules": {
"length": {
"beginning": "",
"highlighted": "8 caracteres de longitud"
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": "un numero"
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "Confirmar contraseña",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "Inicio de session",
"subheadings": {
"stepOne": "Introduce tu correo electronico",
"stepTwo": "Introduce tu contraseña"
},
"links": {
"forgotPassword": "¿Has olvidado tu contraseña? <a>Restablecer contraseña</a>",
"register": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": "Registrarse"
},
"subheadings": {
"stepOne": "",
"stepTwo": "Introduce tu correo electronico",
"stepThree": "Crear contraseña"
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "¿Has olvidado tu contraseña?",
"subheadings": {
"stepOne": "",
"stepTwo": "Hemos enviado un link para reiniciar la contraseña a <email/>",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": "Restablecer contraseña"
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "Volver a <a>Inicio de session</a>",
"resend": "No has recibido el correo electronico? <a>Presiona para reenviar</a>"
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"submit": "Enviar",
"title": "Titulo",
"distributedStatusHeaderText": "",
@@ -192,8 +10,6 @@
"settingsAppearanceDescription": "",
"settingsThemeMode": "",
"settingsLanguage": "",
"settingsDistributedUptime": "",
"settingsDistributedUptimeDescription": "",
"settingsEnabled": "",
"settingsDisabled": "",
"settingsHistoryAndMonitoring": "",
@@ -213,8 +29,6 @@
"settingsRemoveAllMonitorsButton": "",
"settingsRemoveAllMonitorsDialogTitle": "",
"settingsRemoveAllMonitorsDialogConfirm": "",
"settingsWallet": "",
"settingsWalletDescription": "",
"settingsAbout": "",
"settingsDevelopedBy": "",
"settingsSave": "",
@@ -257,10 +71,6 @@
"distributedUptimeCreateIncidentDescription": "",
"distributedUptimeCreateAdvancedSettings": "",
"distributedUptimeDetailsNoMonitorHistory": "",
"distributedUptimeDetailsFooterHeading": "",
"distributedUptimeDetailsFooterBuilt": "",
"distributedUptimeDetailsFooterSolana": "",
"distributedUptimeDetailsMonitorHeader": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "",
"notifications": {
@@ -302,7 +112,33 @@
"testSuccess": "",
"testFailed": "",
"unsupportedType": "",
"networkError": ""
"networkError": "",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "",
"add": "",
@@ -546,11 +382,6 @@
"append": "",
"overview": ""
},
"monitorStatus": {
"up": "",
"down": "",
"paused": ""
},
"roles": {
"superAdmin": "",
"admin": "",
@@ -589,7 +420,6 @@
"uptime": "",
"pagespeed": "",
"infrastructure": "",
"distributedUptime": "",
"incidents": "",
"statusPages": "",
"maintenance": "",
@@ -602,7 +432,8 @@
"profile": "",
"password": "",
"team": "",
"logOut": ""
"logOut": "",
"notifications": ""
},
"settingsEmail": "",
"settingsEmailDescription": "",
@@ -633,7 +464,6 @@
"saving": ""
},
"settingsEmailConnectionHost": "",
"sendTestEmail": "",
"emailSent": "",
"failedToSendEmail": "",
"settingsTestEmail": "",
@@ -658,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,186 +1,4 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "Verkkovirhe",
"checkConnection": "Tarkista yhteytesi",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "Jatka",
"back": "Takaisin"
},
"inputs": {
"email": {
"label": "Sähköposti",
"placeholder": "",
"errors": {
"empty": "Syötä sähköpostiosoitteesi jatkaaksesi",
"invalid": "Kirjoita kelvollinen sähköpostiosoite"
}
},
"password": {
"label": "Salasana",
"rules": {
"length": {
"beginning": "Vähintään",
"highlighted": "8 merkkiä pitkä"
},
"special": {
"beginning": "Tulee sisältää vähintään",
"highlighted": "yksi erikoismerkki"
},
"number": {
"beginning": "Tulee sisältää vähintään",
"highlighted": "yksi numero"
},
"uppercase": {
"beginning": "Tulee sisältää vähintään",
"highlighted": "yksi pieni kirjain"
},
"lowercase": {
"beginning": "Tulee sisältää vähintään",
"highlighted": "yksi iso kirjain"
},
"match": {
"beginning": "Vahvista salasana ja salasana",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "Vahvista salasana",
"placeholder": "Syötä salasana uudelleen",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "Nimi",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "Sukunimi",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "Kirjaudu",
"subheadings": {
"stepOne": "Syötä salasanasi",
"stepTwo": "Syötä salasanasi"
},
"links": {
"forgotPassword": "Unohditko salasanasi? <a>Nollaa salasana</a>",
"register": "Onko sinulla tili? <a>Rekisteröidy tästä</a>"
},
"toasts": {
"success": "Tervetuloa takaisin! Olet kirjautunut sisään.",
"incorrectPassword": ""
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": "Rekisteröidy"
},
"subheadings": {
"stepOne": "Syötä henkilökohtaiset tietosi",
"stepTwo": "Syötä salasanasi",
"stepThree": "Luo salasanasi"
},
"description": {
"superAdmin": "Luo pääkäyttäjän tili aloittaaksesi",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "Luo pääkäyttäjän tili",
"user": ""
},
"termsAndPolicies": "Luomalla tilin hyväksyt <a1>Käyttöehdot</a1> ja <a2>Tietosuojakäytännön</a2>.",
"links": {
"login": "Onko sinulla jo tili? <a>Kirjaudu</a>"
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "Unohditko salasanasi?",
"subheadings": {
"stepOne": "Ei hätää, lähetämme sinulle ohjeet salasanan palauttamiseen.",
"stepTwo": "Lähetimme salasanan nollauslinkin osoitteeseen <email/>",
"stepThree": "Uuden salasanan pitää olla eri kuin aiemmin käyttämäsi.",
"stepFour": "Salasanasi on onnistuneesti nollattu. Klikkaa alta kirjautuaksesi taianomaisesti."
},
"buttons": {
"openEmail": "Avaa sähköpostisovellus",
"resetPassword": "Nollaa salasana"
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "Palaa edelliseen <a>Kirjaudu</a>",
"resend": "Etkö saanut sähköpostia? <a>Klikkaa lähettääksesi uudelleen</a>"
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": "Yhdistetään..."
}
}
},
"submit": "Lähetä",
"title": "Otsikko",
"distributedStatusHeaderText": "Reaaliaikainen kattavuus oikeilla laitteilla",
@@ -192,8 +10,6 @@
"settingsAppearanceDescription": "Vaihda teema vaaleaksi tai tummaksi tai vaihda käyttöliittymän kieli",
"settingsThemeMode": "Teematila",
"settingsLanguage": "Kieli",
"settingsDistributedUptime": "Hajautettu käyttöaika",
"settingsDistributedUptimeDescription": "Ota käyttöön tai poista käytöstä hajautettu käyttöaikavalvonta.",
"settingsEnabled": "Käytössä",
"settingsDisabled": "Poistettu käytöstä",
"settingsHistoryAndMonitoring": "Valvonnan historia",
@@ -213,8 +29,6 @@
"settingsRemoveAllMonitorsButton": "",
"settingsRemoveAllMonitorsDialogTitle": "",
"settingsRemoveAllMonitorsDialogConfirm": "",
"settingsWallet": "Lompakko",
"settingsWalletDescription": "",
"settingsAbout": "Tietoja",
"settingsDevelopedBy": "Kehittänyt Bluewave Labs.",
"settingsSave": "Tallenna",
@@ -257,10 +71,6 @@
"distributedUptimeCreateIncidentDescription": "Jos ilmenee häiriö, ilmoita käyttäjille.",
"distributedUptimeCreateAdvancedSettings": "Lisäasetukset",
"distributedUptimeDetailsNoMonitorHistory": "Tälle valvontakohteelle ei ole vielä tarkistushistoriaa.",
"distributedUptimeDetailsFooterHeading": "Tehty ❤️:lla UpRockin ja Bluewave Labsin toimesta",
"distributedUptimeDetailsFooterBuilt": "",
"distributedUptimeDetailsFooterSolana": "Solana",
"distributedUptimeDetailsMonitorHeader": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "Viimeksi päivitetty",
"notifications": {
@@ -302,7 +112,33 @@
"testSuccess": "Testi ilmoituksen lähetys onnistui!",
"testFailed": "Testi ilmoituksen lähetys epäonnistui",
"unsupportedType": "",
"networkError": ""
"networkError": "",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "",
"add": "Lisää",
@@ -546,11 +382,6 @@
"append": "",
"overview": ""
},
"monitorStatus": {
"up": "Ylös",
"down": "Alas",
"paused": "Tauko"
},
"roles": {
"superAdmin": "Pääylläpitäjä",
"admin": "Ylläpitäjä",
@@ -589,7 +420,6 @@
"uptime": "",
"pagespeed": "",
"infrastructure": "Infrastruktuuri",
"distributedUptime": "",
"incidents": "",
"statusPages": "Tilasivut",
"maintenance": "Huolto",
@@ -602,7 +432,8 @@
"profile": "Profiili",
"password": "Salasana",
"team": "Tiimi",
"logOut": "Kirjaudu ulos"
"logOut": "Kirjaudu ulos",
"notifications": ""
},
"settingsEmail": "Sähköpostiasetukset",
"settingsEmailDescription": "Määritä sähköpostiasetukset",
@@ -633,7 +464,6 @@
"saving": "Tallennetaan..."
},
"settingsEmailConnectionHost": "",
"sendTestEmail": "Lähetä testi sähköposti",
"emailSent": "Sähköpostin lähetys onnistui",
"failedToSendEmail": "Sähköpostin lähetys epäonnistui",
"settingsTestEmail": "Lähetä testi sähköposti",
@@ -658,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,186 +1,4 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "Vérifiez votre connexion",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "Continuer",
"back": "Retour"
},
"inputs": {
"email": {
"label": "E-mail",
"placeholder": "",
"errors": {
"empty": "Pour continuer, veuillez saisir votre adresse e-mail",
"invalid": "Veuillez saisir une adresse e-mail valide"
}
},
"password": {
"label": "Mot de passe",
"rules": {
"length": {
"beginning": "Doit faire au moins",
"highlighted": "8 caractères"
},
"special": {
"beginning": "Doit contenir au moins",
"highlighted": "un caractère spécial"
},
"number": {
"beginning": "Doit contenir au moins",
"highlighted": "un nombre"
},
"uppercase": {
"beginning": "Doit contenir au moins",
"highlighted": "une lettre majuscule"
},
"lowercase": {
"beginning": "Doit contenir au moins",
"highlighted": "une lettre minuscule"
},
"match": {
"beginning": "Confirmer le mot de passe",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "Confirmer le mot de passe",
"placeholder": "Confirmez votre mot de passe",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "Prénom",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "Nom",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "Se connecter",
"subheadings": {
"stepOne": "Entrez votre e-mail",
"stepTwo": "Entrez votre mot de passe"
},
"links": {
"forgotPassword": "Mot de passe oublié ? <a>Réinitialiser le mot de passe</a>",
"register": ""
},
"toasts": {
"success": "Bienvenue ! Vous êtes connecté avec succès.",
"incorrectPassword": ""
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": "S'inscrire"
},
"subheadings": {
"stepOne": "Saisissez vos infos",
"stepTwo": "Entrez votre e-mail",
"stepThree": "Créez votre mot de passe"
},
"description": {
"superAdmin": "Créez votre compte Super admin pour commencer",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "S'inscrire avec E-mail",
"user": ""
},
"termsAndPolicies": "En vous inscrivant, vous acceptez nos",
"links": {
"login": "Vous avez un compte ? <a>Se connecter</a>"
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "Mot de passe oublié ?",
"subheadings": {
"stepOne": "Nous vous enverrons des instructions de réinitialisation.",
"stepTwo": "Nous avons envoyé un lien de réinitialisation à <email/>",
"stepThree": "Votre nouveau mot de passe doit être différent des anciens mots de passes utilisés.",
"stepFour": "Votre mot de passe a été réinitialisé avec succès. Cliquez ci-dessous pour vous connecter."
},
"buttons": {
"openEmail": "Ouvrir l'appli mail",
"resetPassword": "Réinitialiser le mot de passe"
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "Retourner à <a>Se connecter</a>",
"resend": "Vous n'avez pas reçu l'e-mail ? <a>Cliquez pour renvoyer</a>"
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "Reconnexion au serveur réussie.",
"stillUnreachable": "Le serveur est toujours inaccessible. Veuillez réessayer plus tard."
},
"alertBox": "Erreur de connexion au serveur",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"submit": "Envoyer",
"title": "Titre",
"distributedStatusHeaderText": "",
@@ -192,8 +10,6 @@
"settingsAppearanceDescription": "",
"settingsThemeMode": "",
"settingsLanguage": "Langue",
"settingsDistributedUptime": "",
"settingsDistributedUptimeDescription": "",
"settingsEnabled": "Activé",
"settingsDisabled": "Désactivé",
"settingsHistoryAndMonitoring": "",
@@ -213,8 +29,6 @@
"settingsRemoveAllMonitorsButton": "",
"settingsRemoveAllMonitorsDialogTitle": "",
"settingsRemoveAllMonitorsDialogConfirm": "",
"settingsWallet": "",
"settingsWalletDescription": "",
"settingsAbout": "",
"settingsDevelopedBy": "",
"settingsSave": "",
@@ -257,10 +71,6 @@
"distributedUptimeCreateIncidentDescription": "",
"distributedUptimeCreateAdvancedSettings": "Paramètres avancés",
"distributedUptimeDetailsNoMonitorHistory": "",
"distributedUptimeDetailsFooterHeading": "",
"distributedUptimeDetailsFooterBuilt": "",
"distributedUptimeDetailsFooterSolana": "",
"distributedUptimeDetailsMonitorHeader": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "",
"notifications": {
@@ -302,7 +112,33 @@
"testSuccess": "La notification de test a été envoyée avec succès !",
"testFailed": "Échec de l'envoi de la notification de test",
"unsupportedType": "",
"networkError": ""
"networkError": "",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "",
"add": "Ajouter",
@@ -546,11 +382,6 @@
"append": "L'après-midi est votre libre, rendons-le épique !",
"overview": ""
},
"monitorStatus": {
"up": "",
"down": "",
"paused": ""
},
"roles": {
"superAdmin": "",
"admin": "Admin",
@@ -589,7 +420,6 @@
"uptime": "",
"pagespeed": "",
"infrastructure": "",
"distributedUptime": "",
"incidents": "",
"statusPages": "",
"maintenance": "",
@@ -602,7 +432,8 @@
"profile": "",
"password": "",
"team": "",
"logOut": "Déconnexion"
"logOut": "Déconnexion",
"notifications": ""
},
"settingsEmail": "Email",
"settingsEmailDescription": "",
@@ -633,7 +464,6 @@
"saving": "Sauvegarde..."
},
"settingsEmailConnectionHost": "",
"sendTestEmail": "",
"emailSent": "",
"failedToSendEmail": "",
"settingsTestEmail": "",
@@ -658,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,186 +1,4 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "Erro de rede",
"checkConnection": "Verifique sua conexão",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "Continuar",
"back": "Voltar"
},
"inputs": {
"email": {
"label": "E-mail",
"placeholder": "",
"errors": {
"empty": "Para continuar, insira seu endereço de e-mail",
"invalid": "Por favor, insira um endereço de e-mail válido"
}
},
"password": {
"label": "Senha",
"rules": {
"length": {
"beginning": "Deve ser pelo menos",
"highlighted": "8 caracteres de comprimento"
},
"special": {
"beginning": "Deve conter pelo menos",
"highlighted": "um caractere especial"
},
"number": {
"beginning": "Deve conter pelo menos",
"highlighted": "um número"
},
"uppercase": {
"beginning": "Deve conter pelo menos",
"highlighted": "um caractere maiúsculo"
},
"lowercase": {
"beginning": "Deve conter pelo menos",
"highlighted": "um caractere minúsculo"
},
"match": {
"beginning": "Confirme a senha",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "Confirme sua senha",
"placeholder": "Digite a senha novamente para confirmar",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "Nome",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "Sobrenome",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "Login",
"subheadings": {
"stepOne": "Insira seu e-mail",
"stepTwo": "Digite sua senha"
},
"links": {
"forgotPassword": "Esqueceu a senha? <a>Redefinir a senha</a>",
"register": "Ainda não tem uma conta? <a>Registre-se aqui</a>"
},
"toasts": {
"success": "Bem-vindo de volta! Você fez login com sucesso.",
"incorrectPassword": ""
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": "Inscreva-se"
},
"subheadings": {
"stepOne": "Insira seus dados pessoais",
"stepTwo": "Insira seu e-mail",
"stepThree": "Criar sua senha"
},
"description": {
"superAdmin": "Crie sua conta de super admin para começar",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "Criar conta de super admin",
"user": ""
},
"termsAndPolicies": "Ao criar uma conta, você concorda com nossos <a1>Termos de Serviço</a1> e <a2>Política de Privacidade</a2>.",
"links": {
"login": "Já possui uma conta? <a>Login</a>"
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "Esqueceu a senha?",
"subheadings": {
"stepOne": "Não se preocupe, enviaremos instruções de redefinição.",
"stepTwo": "Enviamos um link para redefinir a senha para <email/>",
"stepThree": "Sua nova senha deve ser diferente das senhas usadas anteriormente.",
"stepFour": "Sua senha foi redefinida com sucesso. Clique abaixo para fazer login magicamente."
},
"buttons": {
"openEmail": "Abra o aplicativo de e-mail",
"resetPassword": "Redefinir senha"
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "Volte para <a>Login</a>",
"resend": "Não recebeu o e-mail? <a>Clique para reenviar</a>"
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "Reconectado ao servidor com sucesso.",
"stillUnreachable": "O servidor ainda está inacessível. Tente novamente mais tarde."
},
"alertBox": "Erro de conexão com o servidor",
"description": "Não conseguimos conectar ao servidor. Verifique sua conexão com a internet ou sua configuração de implantação se o problema persistir.",
"retryButton": {
"default": "Reconectar",
"processing": "Conectando..."
}
}
},
"submit": "Enviar",
"title": "Título",
"distributedStatusHeaderText": "Cobertura em tempo real e em dispositivos reais",
@@ -192,8 +10,6 @@
"settingsAppearanceDescription": "Alterne entre o modo claro e escuro ou altere o idioma da interface do usuário",
"settingsThemeMode": "Tema",
"settingsLanguage": "Linguagem",
"settingsDistributedUptime": "Disponibilidade distribuída",
"settingsDistributedUptimeDescription": "Habilitar/desabilitar o monitoramento de tempo de disponibilidade distribuído.",
"settingsEnabled": "Habilitado",
"settingsDisabled": "Desabilitado",
"settingsHistoryAndMonitoring": "Histórico de monitoramento",
@@ -213,7 +29,6 @@
"settingsRemoveAllMonitorsButton": "Remover todos os monitores",
"settingsRemoveAllMonitorsDialogTitle": "Você deseja remover todos os monitores?",
"settingsRemoveAllMonitorsDialogConfirm": "Sim, remova todos os monitores",
"settingsWallet": "Carteira",
"settingsAbout": "Sobre",
"settingsDevelopedBy": "Desenvolvido pela Bluewave Labs.",
"settingsSave": "Salvar",
@@ -256,10 +71,6 @@
"distributedUptimeCreateIncidentDescription": "Quando ocorrer um incidente, notifique os usuários.",
"distributedUptimeCreateAdvancedSettings": "Configurações avançadas",
"distributedUptimeDetailsNoMonitorHistory": "Ainda não há histórico de verificações para este monitor.",
"distributedUptimeDetailsFooterHeading": "Feito com ❤️ por UpRock e Bluewave Labs",
"distributedUptimeDetailsFooterBuilt": "Construído com",
"distributedUptimeDetailsFooterSolana": "Solana",
"distributedUptimeDetailsMonitorHeader": "Monitoramento de Uptime distribuído com tecnologia DePIN",
"distributedUptimeDetailsStatusHeaderUptime": "Uptime:",
"distributedUptimeDetailsStatusHeaderLastUpdate": "Última atualização",
"notifications": {
@@ -301,7 +112,33 @@
"testSuccess": "Notificação de teste enviada com sucesso!",
"testFailed": "Falha ao enviar notificação de teste",
"unsupportedType": "Tipo de notificação não suportado",
"networkError": "Ocorreu um erro de rede"
"networkError": "Ocorreu um erro de rede",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "testLocale",
"add": "Adicionar",
@@ -545,11 +382,6 @@
"append": "A tarde é seu playground — vamos torná-la épica!",
"overview": "Aqui está uma visão geral dos seus monitores {{type}}."
},
"monitorStatus": {
"up": "Online",
"down": "Offline",
"paused": "pausado"
},
"roles": {
"superAdmin": "Super Admin",
"admin": "Admin",
@@ -588,7 +420,6 @@
"uptime": "Uptime",
"pagespeed": "Pagespeed",
"infrastructure": "Infraestrutura",
"distributedUptime": "Uptime distribuído",
"incidents": "Incidentes",
"statusPages": "Pagina de status",
"maintenance": "Manutenção",
@@ -601,7 +432,8 @@
"profile": "Perfil",
"password": "Senha",
"team": "Equipe",
"logOut": "Sair"
"logOut": "Sair",
"notifications": ""
},
"settingsEmail": "E-mail",
"settingsEmailDescription": "Configurações de e-mail do seu sistema. Elas são usadas para enviar notificações e alertas.",
@@ -632,7 +464,6 @@
"saving": "Salvando..."
},
"settingsEmailConnectionHost": "Host de conexão de e-mail - Nome do host a ser usado na saudação HELO/EHLO",
"sendTestEmail": "Enviar e-mail de teste",
"emailSent": "E-mail enviado com sucesso",
"failedToSendEmail": "Falha ao enviar e-mail",
"settingsTestEmail": "Enviar e-mail de teste",
@@ -657,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,186 +1,4 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "Ошибка сети",
"checkConnection": "Пожалуйста, проверьте ваше соединение",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "Продолжить",
"back": "Назад"
},
"inputs": {
"email": {
"label": "Почта",
"placeholder": "",
"errors": {
"empty": "Чтобы продолжить, пожалуйста, введите свой адрес электронной почты",
"invalid": "Пожалуйста, введите действительный адрес электронной почты"
}
},
"password": {
"label": "пароль",
"rules": {
"length": {
"beginning": "Должно быть как минимум",
"highlighted": "длиной 8 символов"
},
"special": {
"beginning": "Должен содержать как минимум",
"highlighted": "один специальный символ"
},
"number": {
"beginning": "Должен содержать как минимум",
"highlighted": "одно число"
},
"uppercase": {
"beginning": "Должен содержать как минимум",
"highlighted": "один верхний символ"
},
"lowercase": {
"beginning": "Должен содержать как минимум",
"highlighted": "один нижний символ"
},
"match": {
"beginning": "Подтвердите пароль и пароль",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "Подтвердите пароль",
"placeholder": "Подтвердите ваш пароль",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "Имя",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "Фамилия",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "Войти",
"subheadings": {
"stepOne": "Введите свой email",
"stepTwo": "Введите свой пароль"
},
"links": {
"forgotPassword": "Забыли пароль? <a>Сбросить пароль</a>",
"register": "У вас нет учетной записи? <a>Зарегистрируйтесь здесь</a>"
},
"toasts": {
"success": "Добро пожаловать обратно! Вы успешно вошли в систему.",
"incorrectPassword": ""
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": "Зарегистрироваться"
},
"subheadings": {
"stepOne": "Введите свои личные данные",
"stepTwo": "Введите свой email",
"stepThree": "Создайте свой пароль"
},
"description": {
"superAdmin": "Создайте учетную запись суперадминистратора, чтобы начать работу",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "Зарегистрироваться по электронной почте",
"user": ""
},
"termsAndPolicies": "Регистрируясь, вы соглашаетесь с нашими",
"links": {
"login": "Уже есть аккаунт? <a>Войти</a>"
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "Забыли пароль?",
"subheadings": {
"stepOne": "Не беспокойтесь, мы вышлем вам инструкции по сбросу настроек.",
"stepTwo": "Мы отправили ссылку для сброса пароля <email/>",
"stepThree": "Ваш новый пароль должен отличаться от ранее использованных паролей.",
"stepFour": "Ваш пароль успешно сброшен. Нажмите ниже, чтобы войти в систему магическим образом."
},
"buttons": {
"openEmail": "Откройте приложение почты",
"resetPassword": "Сбросить пароль"
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "Назад к <a>Войти</a>",
"resend": "Не получили письмо? <a>Нажмите, чтобы отправить повторно</a>"
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "Успешно подключен к серверу.",
"stillUnreachable": "Сервер по-прежнему недоступен. Пожалуйста, повторите попытку позже."
},
"alertBox": "Ошибка подключения к серверу",
"description": "Нам не удается подключиться к серверу. Пожалуйста, проверьте подключение к Интернету или конфигурацию вашего развертывания, если проблема не устранена.",
"retryButton": {
"default": "Повторите попытку подключения",
"processing": "Подключение..."
}
}
},
"submit": "Подтвердить",
"title": "Название",
"distributedStatusHeaderText": "Охват реального времени и реального устройства",
@@ -253,9 +71,6 @@
"distributedUptimeCreateIncidentDescription": "В случае возникновения инцидента сообщите об этом пользователям.",
"distributedUptimeCreateAdvancedSettings": "Расширенные настройки",
"distributedUptimeDetailsNoMonitorHistory": "Для этого монитора пока нет истории проверок.",
"distributedUptimeDetailsFooterHeading": "Made with ❤️ by UpRock & Bluewave Labs",
"distributedUptimeDetailsFooterBuilt": "Built on",
"distributedUptimeDetailsFooterSolana": "Solana",
"distributedUptimeDetailsStatusHeaderUptime": "Аптайм:",
"distributedUptimeDetailsStatusHeaderLastUpdate": "Последнее обновление",
"notifications": {
@@ -297,7 +112,33 @@
"testSuccess": "Уведомление о тестировании отправлено успешно!",
"testFailed": "Не удалось отправить тестовое уведомление",
"unsupportedType": "Неподдерживаемый тип уведомления",
"networkError": "Произошла сетевая ошибка"
"networkError": "Произошла сетевая ошибка",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "testLocale",
"add": "Добавить",
@@ -541,11 +382,6 @@
"append": "Вторая половина дня — это ваша игровая площадка - давайте сделаем ее эпичной!",
"overview": "Вот обзор ваших мониторов {{type}}."
},
"monitorStatus": {
"up": "доступен",
"down": "недоступен",
"paused": "остановлен"
},
"roles": {
"superAdmin": "Главный админ",
"admin": "Админ",
@@ -584,7 +420,6 @@
"uptime": "Аптайм",
"pagespeed": "Pagespeed",
"infrastructure": "Инфраструктура",
"distributedUptime": "Распределенный Аптайм",
"incidents": "Инциденты",
"statusPages": "Страницы статуса",
"maintenance": "Обслуживание",
@@ -597,7 +432,8 @@
"profile": "Профиль",
"password": "Пароль",
"team": "Команда",
"logOut": "Выйти"
"logOut": "Выйти",
"notifications": ""
},
"settingsEmail": "Настройки Email",
"settingsEmailDescription": "Настройка параметров email",
@@ -628,7 +464,6 @@
"saving": "Сохранение..."
},
"settingsEmailConnectionHost": "",
"sendTestEmail": "",
"emailSent": "",
"failedToSendEmail": "",
"settingsTestEmail": "",
@@ -653,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,186 +1,4 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "Ağ hatası",
"checkConnection": "Lütfen bağlantınızı kontrol edin",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "Devam Et",
"back": "Geri"
},
"inputs": {
"email": {
"label": "E-posta",
"placeholder": "",
"errors": {
"empty": "Devam etmek için lütfen e-posta adresinizi girin",
"invalid": "Lütfen geçerli bir eposta hesabı girin"
}
},
"password": {
"label": "Parola",
"rules": {
"length": {
"beginning": "En az",
"highlighted": "8 karakter uzunluğunda olmalı"
},
"special": {
"beginning": "En az içermeli",
"highlighted": "bir özel karakter"
},
"number": {
"beginning": "En az içermeli",
"highlighted": "bir rakam"
},
"uppercase": {
"beginning": "En az içermeli",
"highlighted": "bir büyük harf"
},
"lowercase": {
"beginning": "En az içermeli",
"highlighted": "bir küçük harf"
},
"match": {
"beginning": "Onay şifresi ve şifre",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "Parolayı onayla",
"placeholder": "Parolanızı onaylayın",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "İsim",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "Soyisim",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "Giriş Yap",
"subheadings": {
"stepOne": "E-posta adresinizi girin",
"stepTwo": "Parolanızı girin"
},
"links": {
"forgotPassword": "Parolanızı mı unuttunuz? <a>Parola sıfırla</a>",
"register": "Bir hesabınız yok mu? <a>Buradan kayıt olun</a>"
},
"toasts": {
"success": "Tekrar hoş geldiniz! Başarıyla giriş yaptınız.",
"incorrectPassword": ""
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": "Kayıt Ol"
},
"subheadings": {
"stepOne": "Kişisel bilgilerinizi girin",
"stepTwo": "E-posta adresinizi girin",
"stepThree": "Parolanızı oluşturun"
},
"description": {
"superAdmin": "Super admin hesabınızı oluşturmak için devam edin",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "E-posta ile kayıt ol",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": "Zaten hesabınız var mı? <a>Giriş yap</a>"
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "Parolanızı mı unuttunuz?",
"subheadings": {
"stepOne": "Endişelenmeyin, size sıfırlama talimatlarını göndereceğiz.",
"stepTwo": "<email/> adresine şifre sıfırlama bağlantısı gönderdik",
"stepThree": "Yeni şifreniz daha önce kullanılan şifrelerden farklı olmalıdır.",
"stepFour": "Parolanız başarıyla sıfırlandı. Otomatik olarak giriş yapmak için aşağıya tıklayın."
},
"buttons": {
"openEmail": "Eposta uygulamasını aç",
"resetPassword": "Parola sıfırla"
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "Geri dön <a>Giriş Yap</a>",
"resend": "E-posta almadınız mı? <a>Yeniden göndermek için tıklayın</a>"
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "Sunucuya başarıyla yeniden bağlanıldı.",
"stillUnreachable": "Sunucuya hala ulaşılamıyor. Lütfen daha sonra tekrar deneyin."
},
"alertBox": "Sunucu bağlantı hatası",
"description": "Sunucuya bağlanamıyoruz. Lütfen internet bağlantınızı kontrol edin veya sorun devam ederse dağıtım yapılandırmanızı doğrulayın.",
"retryButton": {
"default": "Bağlantıyı yeniden deneyin",
"processing": "Bağlanıyor..."
}
}
},
"submit": "Gönder",
"title": "Başlık",
"distributedStatusHeaderText": "Gerçek zamanlı, Gerçek cihazlar kapsamı",
@@ -192,8 +10,6 @@
"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",
"settingsDistributedUptime": "Dağıtılmış çalışma süresi",
"settingsDistributedUptimeDescription": "Dağıtılmış çalışma süresi izlemeyi etkinleştirin/devre dışı bırakın.",
"settingsEnabled": "Etkin",
"settingsDisabled": "Devre dışı",
"settingsHistoryAndMonitoring": "Geçmiş ve izleme",
@@ -213,8 +29,6 @@
"settingsRemoveAllMonitorsButton": "Tüm monitörleri kaldır",
"settingsRemoveAllMonitorsDialogTitle": "Tüm monitörleri kaldırmak istiyor musunuz?",
"settingsRemoveAllMonitorsDialogConfirm": "Evet, tüm monitörleri temizle",
"settingsWallet": "Cüzdan",
"settingsWalletDescription": "Cüzdanınızı buradan bağlayın. Bu, Dağıtılmış Çalışma Süresi monitörünün küresel olarak birden çok düğüme bağlanması için gereklidir.",
"settingsAbout": "Hakkında",
"settingsDevelopedBy": "Bluewave Labs tarafından geliştirilmiştir.",
"settingsSave": "Kaydet",
@@ -257,10 +71,6 @@
"distributedUptimeCreateIncidentDescription": "Bir olay olduğunda kullanıcıları bilgilendir.",
"distributedUptimeCreateAdvancedSettings": "Gelişmiş ayarlar",
"distributedUptimeDetailsNoMonitorHistory": "Bu monitör için henüz bir denetim günlüğü oluşturulmadı.",
"distributedUptimeDetailsFooterHeading": "UpRock & Bluewave Labs tarafından geliştirildi",
"distributedUptimeDetailsFooterBuilt": "Altyapı",
"distributedUptimeDetailsFooterSolana": "Solana",
"distributedUptimeDetailsMonitorHeader": "Depin Destekli Dağıtık Kesintisizlik İzleme",
"distributedUptimeDetailsStatusHeaderUptime": "Erişilebilirlik",
"distributedUptimeDetailsStatusHeaderLastUpdate": "Son güncelleme",
"notifications": {
@@ -302,7 +112,33 @@
"testSuccess": "Test bildirimi başarıyla gönderildi",
"testFailed": "Test bildirimi gönderilemedi",
"unsupportedType": "Desteklenmeyen bildirim türü",
"networkError": "Ağ hatası oluştu"
"networkError": "Ağ hatası oluştu",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "TEST13 UPLOAD",
"add": "Ekle",
@@ -546,11 +382,6 @@
"append": "",
"overview": ""
},
"monitorStatus": {
"up": "",
"down": "",
"paused": ""
},
"roles": {
"superAdmin": "",
"admin": "",
@@ -589,7 +420,6 @@
"uptime": "",
"pagespeed": "",
"infrastructure": "",
"distributedUptime": "",
"incidents": "",
"statusPages": "",
"maintenance": "",
@@ -602,7 +432,8 @@
"profile": "",
"password": "",
"team": "",
"logOut": ıkış yap"
"logOut": ıkış yap",
"notifications": ""
},
"settingsEmail": "",
"settingsEmailDescription": "",
@@ -633,7 +464,6 @@
"saving": "Kaydediliyor..."
},
"settingsEmailConnectionHost": "E-posta bağlantı ana bilgisayarı - HELO/EHLO selamlamasında kullanılacak ana bilgisayar adı",
"sendTestEmail": "Test maili gönder",
"emailSent": "E-posta başarı ile gönderildi.",
"failedToSendEmail": "E-posta gönderimi başarısız.",
"settingsTestEmail": "Test E-postası gönder.",
@@ -658,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -1,188 +1,6 @@
{
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "繼續",
"back": "回去"
},
"inputs": {
"email": {
"label": "E-mail",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "密碼",
"rules": {
"length": {
"beginning": "必須至少",
"highlighted": "8 個字符長"
},
"special": {
"beginning": "必須至少包含",
"highlighted": "一個特殊字符"
},
"number": {
"beginning": "必須至少包含",
"highlighted": "一個數字"
},
"uppercase": {
"beginning": "必須至少包含",
"highlighted": "一個大寫字母"
},
"lowercase": {
"beginning": "必須至少包含",
"highlighted": "一個小寫字母"
},
"match": {
"beginning": "確認密碼",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "確認密碼",
"placeholder": "確認您的密碼",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "登入",
"subheadings": {
"stepOne": "輸入您的 E-mail",
"stepTwo": "輸入您的密碼"
},
"links": {
"forgotPassword": "",
"register": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": "註冊"
},
"subheadings": {
"stepOne": "",
"stepTwo": "輸入您的 E-mail",
"stepThree": ""
},
"description": {
"superAdmin": "建立您的超級管理員帳號開始使用",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "用 E-mail 註冊",
"user": ""
},
"termsAndPolicies": "註冊即表示您同意我們的",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "忘記密碼?",
"subheadings": {
"stepOne": "",
"stepTwo": "我們已將密碼重設連結發送至 <email/>",
"stepThree": "您的新密碼必須與之前使用過的密碼不同。",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": "重設密碼"
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "回去 <a>登入</a>",
"resend": "沒有受到 E-mail <a>點擊</a>"
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"submit": "",
"title": "",
"submit": "提交",
"title": "名稱",
"distributedStatusHeaderText": "實時、真實設備覆蓋",
"distributedStatusSubHeaderText": "由全球數百萬個設備提供支持,您可以按全球區域、國家或城市查看系統效能",
"settingsGeneralSettings": "一般設定",
@@ -190,11 +8,9 @@
"settingsDisplayTimezoneDescription": "您公開顯示的儀表板的時區。",
"settingsAppearance": "外觀",
"settingsAppearanceDescription": "",
"settingsThemeMode": "",
"settingsLanguage": "",
"settingsDistributedUptime": "",
"settingsDistributedUptimeDescription": "",
"settingsEnabled": "",
"settingsThemeMode": "主題",
"settingsLanguage": "語言",
"settingsEnabled": "啟動",
"settingsDisabled": "",
"settingsHistoryAndMonitoring": "",
"settingsHistoryAndMonitoringDescription": "",
@@ -213,8 +29,6 @@
"settingsRemoveAllMonitorsButton": "",
"settingsRemoveAllMonitorsDialogTitle": "",
"settingsRemoveAllMonitorsDialogConfirm": "",
"settingsWallet": "",
"settingsWalletDescription": "",
"settingsAbout": "",
"settingsDevelopedBy": "",
"settingsSave": "",
@@ -257,10 +71,6 @@
"distributedUptimeCreateIncidentDescription": "",
"distributedUptimeCreateAdvancedSettings": "",
"distributedUptimeDetailsNoMonitorHistory": "",
"distributedUptimeDetailsFooterHeading": "",
"distributedUptimeDetailsFooterBuilt": "",
"distributedUptimeDetailsFooterSolana": "",
"distributedUptimeDetailsMonitorHeader": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "",
"notifications": {
@@ -302,7 +112,33 @@
"testSuccess": "",
"testFailed": "",
"unsupportedType": "",
"networkError": ""
"networkError": "",
"fallback": {
"title": "",
"checks": [""]
},
"createButton": "",
"createTitle": "",
"create": {
"success": "",
"failed": ""
},
"fetch": {
"success": "",
"failed": ""
},
"delete": {
"success": "",
"failed": ""
},
"edit": {
"success": "",
"failed": ""
},
"test": {
"success": "",
"failed": ""
}
},
"testLocale": "",
"add": "",
@@ -546,11 +382,6 @@
"append": "",
"overview": ""
},
"monitorStatus": {
"up": "",
"down": "",
"paused": ""
},
"roles": {
"superAdmin": "",
"admin": "",
@@ -589,7 +420,6 @@
"uptime": "",
"pagespeed": "",
"infrastructure": "",
"distributedUptime": "",
"incidents": "",
"statusPages": "",
"maintenance": "",
@@ -602,7 +432,8 @@
"profile": "",
"password": "",
"team": "",
"logOut": ""
"logOut": "",
"notifications": ""
},
"settingsEmail": "",
"settingsEmailDescription": "",
@@ -633,7 +464,6 @@
"saving": ""
},
"settingsEmailConnectionHost": "",
"sendTestEmail": "",
"emailSent": "",
"failedToSendEmail": "",
"settingsTestEmail": "",
@@ -658,5 +488,257 @@
"ping": "",
"docker": "",
"port": ""
}
},
"common": {
"appName": "",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"invalid": ""
}
},
"password": {
"label": "",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
},
"special": {
"beginning": "",
"highlighted": ""
},
"number": {
"beginning": "",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"highlighted": ""
},
"match": {
"beginning": "",
"highlighted": ""
}
},
"errors": {
"empty": "",
"length": "",
"uppercase": "",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"different": ""
}
},
"firstName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
},
"lastName": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"length": "",
"pattern": ""
}
}
},
"errors": {
"validation": ""
}
},
"login": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": ""
},
"links": {
"forgotPassword": "",
"register": "",
"forgotPasswordLink": "",
"registerLink": ""
},
"toasts": {
"success": "",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"registration": {
"heading": {
"superAdmin": "",
"user": ""
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
},
"description": {
"superAdmin": "",
"user": ""
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
},
"termsAndPolicies": "",
"links": {
"login": ""
},
"toasts": {
"success": ""
}
},
"forgotPassword": {
"heading": "",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
},
"buttons": {
"openEmail": "",
"resetPassword": ""
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordConfirm": ""
},
"links": {
"login": "",
"resend": ""
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"retryButton": {
"default": "",
"processing": ""
}
}
},
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"genericWebhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
}
},
"notificationConfig": {
"title": "",
"description": ""
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
},
"advancedMatching": "",
"settingsEmailTLSServername": "",
"settingsEmailIgnoreTLS": "",
"settingsEmailRequireTLS": "",
"settingsEmailRejectUnauthorized": "",
"settingsEmailSecure": "",
"settingsEmailPool": "",
"sendTestNotifications": ""
}

View File

@@ -102,6 +102,7 @@ class NotificationController {
success =
await this.notificationService.sendTestPagerDutyNotification(notification);
}
if (!success) {
return res.error({
msg: "Sending notification failed",
@@ -128,7 +129,11 @@ class NotificationController {
}
try {
const notification = await this.db.createNotification(req.body);
const body = req.body;
const { _id, teamId } = req.user;
body.userId = _id;
body.teamId = teamId;
const notification = await this.db.createNotification(body);
return res.success({
msg: "Notification created successfully",
data: notification,

View File

@@ -11,8 +11,7 @@ class SettingsController {
this.emailService = emailService;
}
getAppSettings = async (req, res, next) => {
const dbSettings = await this.settingsService.getDBSettings();
buildAppSettings = (dbSettings) => {
const sanitizedSettings = { ...dbSettings };
delete sanitizedSettings.version;
@@ -30,6 +29,13 @@ class SettingsController {
delete sanitizedSettings.systemEmailPassword;
}
returnSettings.settings = sanitizedSettings;
return returnSettings;
};
getAppSettings = async (req, res, next) => {
const dbSettings = await this.settingsService.getDBSettings();
const returnSettings = this.buildAppSettings(dbSettings);
return res.success({
msg: this.stringService.getAppSettings,
data: returnSettings,
@@ -45,12 +51,11 @@ class SettingsController {
}
try {
await this.db.updateAppSettings(req.body);
const updatedSettings = { ...(await this.settingsService.reloadSettings()) };
delete updatedSettings.jwtSecret;
const updatedSettings = await this.db.updateAppSettings(req.body);
const returnSettings = this.buildAppSettings(updatedSettings);
return res.success({
msg: this.stringService.updateAppSettings,
data: updatedSettings,
data: returnSettings,
});
} catch (error) {
next(handleError(error, SERVICE_NAME, "updateAppSettings"));

View File

@@ -7,7 +7,7 @@ const configSchema = mongoose.Schema(
chatId: { type: String },
platform: {
type: String,
enum: ["slack", "pager_duty", "webhook"],
enum: ["slack", "pager_duty", "webhook", "discord"],
},
routingKey: { type: String },
},

View File

@@ -26,10 +26,12 @@ const updateAppSettings = async (newSettings) => {
delete update.$set.systemEmailPassword;
}
const settings = await AppSettings.findOneAndUpdate({}, update, {
new: true,
await AppSettings.findOneAndUpdate({}, update, {
upsert: true,
});
const settings = await AppSettings.findOne()
.select("-__v -_id -createdAt -updatedAt -singleton")
.lean();
return settings;
} catch (error) {
error.service = SERVICE_NAME;

View File

@@ -60,30 +60,30 @@ class NetworkService {
}
/**
* Sends a ping request to the specified URL and returns the response.
*
* @param {Object} job - The job object containing the data for the ping request.
* @param {Object} job.data - The data object within the job.
* @param {string} job.data.url - The URL to ping.
* @param {string} job.data._id - The monitor ID for the ping request.
* @returns {Promise<Object>} An object containing the ping response details.
* @property {string} monitorId - The monitor ID for the ping request.
* @property {string} type - The type of request, which is "ping".
* @property {number} responseTime - The time taken for the ping request to complete, in milliseconds.
* @property {Object} payload - The response payload from the ping request.
* @property {boolean} status - The status of the ping request (true if successful, false otherwise).
* @property {number} code - The response code (200 if successful, error code otherwise).
* @property {string} message - The message indicating the result of the ping request.
* Performs a ping check to a specified host to verify its availability.
* @async
* @param {Object} monitor - The monitor configuration object
* @param {string} monitor.url - The host URL to ping
* @param {string} monitor._id - The unique identifier of the monitor
* @returns {Promise<Object>} A promise that resolves to a ping response object
* @returns {string} pingResponse.monitorId - The ID of the monitor
* @returns {string} pingResponse.type - The type of monitor (always "ping")
* @returns {number} pingResponse.responseTime - The time taken for the ping
* @returns {Object} pingResponse.payload - The raw ping response data
* @returns {boolean} pingResponse.status - Whether the host is alive (true) or not (false)
* @returns {number} pingResponse.code - Status code (200 for success, PING_ERROR for failure)
* @returns {string} pingResponse.message - Success or failure message
* @throws {Error} If there's an error during the ping operation
*/
async requestPing(job) {
async requestPing(monitor) {
try {
const url = job.data.url;
const url = monitor.url;
const { response, responseTime, error } = await this.timeRequest(() =>
this.ping.promise.probe(url)
);
const pingResponse = {
monitorId: job.data._id,
monitorId: monitor._id,
type: "ping",
responseTime,
payload: response,
@@ -107,21 +107,29 @@ class NetworkService {
}
/**
* Sends an HTTP GET request to the specified URL and returns the response.
*
* @param {Object} job - The job object containing the data for the HTTP request.
* @param {Object} job.data - The data object within the job.
* @param {string} job.data.url - The URL to send the HTTP GET request to.
* @param {string} job.data._id - The monitor ID for the HTTP request.
* @param {string} [job.data.secret] - Secret for authorization if provided.
* @returns {Promise<Object>} An object containing the HTTP response details.
* @property {string} monitorId - The monitor ID for the HTTP request.
* @property {string} type - The type of request, which is "http".
* @property {number} responseTime - The time taken for the HTTP request to complete, in milliseconds.
* @property {Object} payload - The response payload from the HTTP request.
* @property {boolean} status - The status of the HTTP request (true if successful, false otherwise).
* @property {number} code - The response code (200 if successful, error code otherwise).
* @property {string} message - The message indicating the result of the HTTP request.
* Performs an HTTP GET request to a specified URL with optional validation of response data.
* @async
* @param {Object} monitor - The monitor configuration object
* @param {string} monitor.url - The URL to make the HTTP request to
* @param {string} [monitor.secret] - Optional Bearer token for authentication
* @param {string} monitor._id - The unique identifier of the monitor
* @param {string} monitor.name - The name of the monitor
* @param {string} monitor.teamId - The team ID associated with the monitor
* @param {string} monitor.type - The type of monitor
* @param {boolean} [monitor.ignoreTlsErrors] - Whether to ignore TLS certificate errors
* @param {string} [monitor.jsonPath] - Optional JMESPath expression to extract data from JSON response
* @param {string} [monitor.matchMethod] - Method to match response data ('include', 'regex', or exact match)
* @param {string} [monitor.expectedValue] - Expected value to match against response data
* @returns {Promise<Object>} A promise that resolves to an HTTP response object
* @returns {string} httpResponse.monitorId - The ID of the monitor
* @returns {string} httpResponse.teamId - The team ID
* @returns {string} httpResponse.type - The type of monitor
* @returns {number} httpResponse.responseTime - The time taken for the request
* @returns {Object} httpResponse.payload - The response data
* @returns {boolean} httpResponse.status - Whether the request was successful and matched expected value (if specified)
* @returns {number} httpResponse.code - HTTP status code or NETWORK_ERROR
* @returns {string} httpResponse.message - Success or failure message
* @throws {Error} If there's an error during the HTTP request or data validation
*/
async requestHttp(monitor) {
try {
@@ -231,20 +239,19 @@ class NetworkService {
}
/**
* Sends a request to the Google PageSpeed Insights API for the specified URL and returns the response.
*
* @param {Object} job - The job object containing the data for the PageSpeed request.
* @param {Object} job.data - The data object within the job.
* @param {string} job.data.url - The URL to analyze with PageSpeed Insights.
* @param {string} job.data._id - The monitor ID for the PageSpeed request.
* @returns {Promise<Object>} An object containing the PageSpeed response details.
* @property {string} monitorId - The monitor ID for the PageSpeed request.
* @property {string} type - The type of request, which is "pagespeed".
* @property {number} responseTime - The time taken for the PageSpeed request to complete, in milliseconds.
* @property {Object} payload - The response payload from the PageSpeed request.
* @property {boolean} status - The status of the PageSpeed request (true if successful, false otherwise).
* @property {number} code - The response code (200 if successful, error code otherwise).
* @property {string} message - The message indicating the result of the PageSpeed request.
* Checks the performance of a webpage using Google's PageSpeed Insights API.
* @async
* @param {Object} monitor - The monitor configuration object
* @param {string} monitor.url - The URL of the webpage to analyze
* @returns {Promise<Object|undefined>} A promise that resolves to a pagespeed response object or undefined if API key is missing
* @returns {string} response.monitorId - The ID of the monitor
* @returns {string} response.type - The type of monitor
* @returns {number} response.responseTime - The time taken for the analysis
* @returns {boolean} response.status - Whether the analysis was successful
* @returns {number} response.code - HTTP status code from the PageSpeed API
* @returns {string} response.message - Success or failure message
* @returns {Object} response.payload - The PageSpeed analysis results
* @throws {Error} If there's an error during the PageSpeed analysis
*/
async requestPagespeed(monitor) {
try {
@@ -273,23 +280,6 @@ class NetworkService {
}
}
/**
* Sends an HTTP request to check hardware status and returns the response.
*
* @param {Object} job - The job object containing the data for the hardware request.
* @param {Object} job.data - The data object within the job.
* @param {string} job.data.url - The URL to send the hardware status request to.
* @param {string} job.data._id - The monitor ID for the hardware request.
* @param {string} job.data.type - The type of request, which is "hardware".
* @returns {Promise<Object>} An object containing the hardware status response details.
* @property {string} monitorId - The monitor ID for the hardware request.
* @property {string} type - The type of request ("hardware").
* @property {number} responseTime - The time taken for the request to complete, in milliseconds.
* @property {Object} payload - The response payload from the hardware status request.
* @property {boolean} status - The status of the request (true if successful, false otherwise).
* @property {number} code - The response code (200 if successful, error code otherwise).
* @property {string} message - The message indicating the result of the hardware status request.
*/
async requestHardware(monitor) {
try {
return await this.requestHttp(monitor);
@@ -301,20 +291,20 @@ class NetworkService {
}
/**
* Sends a request to inspect a Docker container and returns its status.
*
* @param {Object} job - The job object containing the data for the Docker request.
* @param {Object} job.data - The data object within the job.
* @param {string} job.data.url - The container ID or name to inspect.
* @param {string} job.data._id - The monitor ID for the Docker request.
* @param {string} job.data.type - The type of request, which is "docker".
* @returns {Promise<Object>} An object containing the Docker container status details.
* @property {string} monitorId - The monitor ID for the Docker request.
* @property {string} type - The type of request ("docker").
* @property {number} responseTime - The time taken for the Docker inspection to complete, in milliseconds.
* @property {boolean} status - The status of the container (true if running, false otherwise).
* @property {number} code - The response code (200 if successful, error code otherwise).
* @property {string} message - The message indicating the result of the Docker inspection.
* Checks the status of a Docker container by its ID.
* @async
* @param {Object} monitor - The monitor configuration object
* @param {string} monitor.url - The Docker container ID to check
* @param {string} monitor._id - The unique identifier of the monitor
* @param {string} monitor.type - The type of monitor
* @returns {Promise<Object>} A promise that resolves to a docker response object
* @returns {string} dockerResponse.monitorId - The ID of the monitor
* @returns {string} dockerResponse.type - The type of monitor
* @returns {number} dockerResponse.responseTime - The time taken for the container inspection
* @returns {boolean} dockerResponse.status - Whether the container is running (true) or not (false)
* @returns {number} dockerResponse.code - HTTP-like status code (200 for success, NETWORK_ERROR for failure)
* @returns {string} dockerResponse.message - Success or failure message
* @throws {Error} If the container is not found or if there's an error inspecting the container
*/
async requestDocker(monitor) {
try {
@@ -358,6 +348,23 @@ class NetworkService {
}
}
/**
* Attempts to establish a TCP connection to a specified host and port.
* @async
* @param {Object} monitor - The monitor configuration object
* @param {string} monitor.url - The host URL to connect to
* @param {number} monitor.port - The port number to connect to
* @param {string} monitor._id - The unique identifier of the monitor
* @param {string} monitor.type - The type of monitor
* @returns {Promise<Object>} A promise that resolves to a port response object
* @returns {string} portResponse.monitorId - The ID of the monitor
* @returns {string} portResponse.type - The type of monitor
* @returns {number} portResponse.responseTime - The time taken for the connection attempt
* @returns {boolean} portResponse.status - Whether the connection was successful
* @returns {number} portResponse.code - HTTP-like status code (200 for success, NETWORK_ERROR for failure)
* @returns {string} portResponse.message - Success or failure message
* @throws {Error} If the connection times out or encounters an error
*/
async requestPort(monitor) {
try {
const { url, port } = monitor;

View File

@@ -95,6 +95,19 @@ class NotificationService {
return MESSAGE_FORMATTERS[platform](messageText, chatId);
}
formatHardwareNotificationMessage = (
monitor,
status,
platform,
chatId,
code,
timestamp,
alerts
) => {
const messageText = alerts.map((alert) => alert).join("\n");
return MESSAGE_FORMATTERS[platform](messageText, chatId);
};
sendTestWebhookNotification = async (notification) => {
const config = notification.config;
const response = await this.networkService.requestWebhook(
@@ -121,7 +134,7 @@ class NotificationService {
* @returns {Promise<boolean>} A promise that resolves to true if the notification was sent successfully, otherwise false.
*/
async sendWebhookNotification(networkResponse, notification) {
async sendWebhookNotification(networkResponse, notification, alerts = []) {
const { monitor, status, code } = networkResponse;
const { webhookUrl, platform, botToken, chatId } = notification.config;
@@ -152,14 +165,27 @@ class NotificationService {
url = `${TELEGRAM_API_BASE_URL}${botToken}/sendMessage`;
}
const message = this.formatNotificationMessage(
monitor,
status,
platform,
chatId,
code, // Pass the code field directly
networkResponse.timestamp
);
let message;
if (monitor.type === "hardware") {
message = this.formatHardwareNotificationMessage(
monitor,
status,
platform,
chatId,
code,
networkResponse.timestamp,
alerts
);
} else {
message = this.formatNotificationMessage(
monitor,
status,
platform,
chatId,
code, // Pass the code field directly
networkResponse.timestamp
);
}
try {
const response = await this.networkService.requestWebhook(platform, url, message);
@@ -247,19 +273,31 @@ class NotificationService {
return response;
}
async sendPagerDutyNotification(networkResponse, notification) {
async sendPagerDutyNotification(networkResponse, notification, alerts = []) {
const { monitor, status, code } = networkResponse;
const { routingKey, platform } = notification.config;
const message = this.formatNotificationMessage(
monitor,
status,
platform,
null,
code, // Pass the code field directly
networkResponse.timestamp
);
let message;
if (monitor.type === "hardware") {
message = this.formatHardwareNotificationMessage(
monitor,
status,
platform,
null,
code,
networkResponse.timestamp,
alerts
);
} else {
message = this.formatNotificationMessage(
monitor,
status,
platform,
null,
code, // Pass the code field directly
networkResponse.timestamp
);
}
try {
const response = await this.networkService.requestPagerDuty({
message,
@@ -350,9 +388,9 @@ class NotificationService {
) ?? false,
};
const notifications = await this.db.getNotificationsByMonitorId(
networkResponse.monitorId
);
const notificationIDs = networkResponse.monitor?.notifications ?? [];
const notifications = await this.db.getNotificationsByIds(notificationIDs);
for (const notification of notifications) {
const alertsToSend = [];
const alertTypes = ["cpu", "memory", "disk"];
@@ -388,7 +426,11 @@ class NotificationService {
if (alertsToSend.length === 0) continue; // No alerts to send, we're done
if (notification.type === "email") {
this.sendHardwareEmail(networkResponse, notification.address, alertsToSend);
await this.sendHardwareEmail(networkResponse, notification.address, alertsToSend);
} else if (notification.type === "webhook") {
await this.sendWebhookNotification(networkResponse, notification, alertsToSend);
} else if (notification.type === "pager_duty") {
await this.sendPagerDutyNotification(networkResponse, notification, alertsToSend);
}
}
return true;

View File

@@ -28,8 +28,8 @@ class SettingsService {
* Constructs a new SettingsService
* @constructor
* @throws {Error}
*/ constructor(appSettings) {
this.appSettings = appSettings;
*/ constructor(AppSettings) {
this.AppSettings = AppSettings;
this.settings = { ...envConfig };
}
/**
@@ -60,16 +60,14 @@ class SettingsService {
async getDBSettings() {
// Remove any old settings
await this.appSettings.deleteMany({ version: { $exists: false } });
await this.AppSettings.deleteMany({ version: { $exists: false } });
let settings = await this.appSettings
.findOne({ singleton: true })
let settings = await this.AppSettings.findOne({ singleton: true })
.select("-__v -_id -createdAt -updatedAt -singleton")
.lean();
if (settings === null) {
await this.appSettings.create({});
settings = await this.appSettings
.findOne({ singleton: true })
await this.AppSettings.create({});
settings = await this.AppSettings.findOne({ singleton: true })
.select("-__v -_id -createdAt -updatedAt -singleton")
.lean();
}

View File

@@ -29,12 +29,12 @@ const nameValidation = joi
.string()
.trim()
.max(50)
.pattern(/^(?=.*[\p{L}\p{Sc}])[\p{L}\p{Sc}\s']+$/u)
.pattern(/^(?=.*[\p{L}\p{Sc}])[\p{L}\p{Sc}\s'\-().]+$/u)
.messages({
"string.empty": "Name is required",
"string.max": "Name must be less than 50 characters",
"string.pattern.base":
"Name must contain at least 1 letter or currency symbol and only allow letters, spaces, apostrophes, and currency symbols",
"Names must contain at least 1 letter and may only include letters, currency symbols, spaces, apostrophes, hyphens (-), periods (.), and parentheses ().",
});
const registrationBodyValidation = joi.object({
@@ -558,14 +558,6 @@ const triggerNotificationBodyValidation = joi.object({
});
const createNotificationBodyValidation = joi.object({
userId: joi.string().required().messages({
"number.empty": "User ID is required",
"any.required": "User ID is required",
}),
teamId: joi.string().required().messages({
"string.empty": "Team ID is required",
"any.required": "Team ID is required",
}),
notificationName: joi.string().required().messages({
"string.empty": "Notification name is required",
"any.required": "Notification name is required",