mirror of
https://github.com/rajnandan1/kener.git
synced 2026-06-23 04:10:22 +00:00
changes
This commit is contained in:
+8
-9
@@ -2,24 +2,23 @@
|
||||
> kener@4.0.0 check
|
||||
> svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
|
||||
|
||||
[dotenv@17.2.3] injecting env (18) from .env -- tip: 🔄 add secrets lifecycle management: https://dotenvx.com/ops
|
||||
[dotenv@17.2.3] injecting env (18) from .env -- tip: ⚙️ enable debug logging with { debug: true }
|
||||
Loading svelte-check in workspace: /Users/rajnandan1/Code/kener
|
||||
Getting Svelte diagnostics...
|
||||
|
||||
[dotenv@17.2.3] injecting env (18) from .env -- tip: 👥 sync secrets across teammates & machines: https://dotenvx.com/ops
|
||||
[dotenv@17.2.3] injecting env (0) from .env -- tip: ⚙️ specify custom .env file path with { path: '/custom/path/.env' }
|
||||
[dotenv@17.2.3] injecting env (0) from .env -- tip: ⚙️ override existing env vars with { override: true }
|
||||
[dotenv@17.2.3] injecting env (18) from .env -- tip: 🔐 prevent committing .env to code: https://dotenvx.com/precommit
|
||||
[dotenv@17.2.3] injecting env (0) from .env -- tip: 🔐 prevent building .env in docker: https://dotenvx.com/prebuild
|
||||
[dotenv@17.2.3] injecting env (0) from .env -- tip: 🔑 add access controls to secrets: https://dotenvx.com/ops
|
||||
/Users/rajnandan1/Code/kener/src/lib/components/ui/chart/chart-container.svelte:20:28
|
||||
Warn: This reference only captures the initial value of `id`. Did you mean to reference it inside a closure instead?
|
||||
https://svelte.dev/e/state_referenced_locally (svelte)
|
||||
|
||||
const chartId = `chart-${id || uid.replace(/:/g, "")}`;
|
||||
|
||||
/Users/rajnandan1/Code/kener/src/lib/server/api-server/monitor-data/post.ts:6:10
|
||||
Error: Module '"$lib/server/controllers/monitorsController"' has no exported member 'CalculateUptimeByTags'.
|
||||
import { ParseUptime } from "$lib/server/tool";
|
||||
import { CalculateUptimeByTags, GetLatestMonitoringData } from "$lib/server/controllers/monitorsController";
|
||||
import GC from "$lib/global-constants";
|
||||
/Users/rajnandan1/Code/kener/src/routes/(manage)/+layout.server.ts:1:18
|
||||
Error: Cannot find module '$lib/i18n/server' or its corresponding type declarations.
|
||||
import i18n from "$lib/i18n/server";
|
||||
import { redirect } from "@sveltejs/kit";
|
||||
|
||||
/Users/rajnandan1/Code/kener/src/routes/(docs)/docs/DocsNavbar.svelte:126:3
|
||||
Warn: Unused CSS selector ".active"
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
// import { handler } from "./build/handler.js";
|
||||
import { apiReference } from "@scalar/express-api-reference";
|
||||
import dotenv from "dotenv";
|
||||
dotenv.config();
|
||||
import express from "express";
|
||||
import Startup from "./src/lib/server/startup.ts";
|
||||
import shutdownSchedulers from "./src/lib/server/schedulers/shutdown.ts";
|
||||
import shutdownQueues from "./src/lib/server/queues/shutdown.ts";
|
||||
import dbInstance from "./src/lib/server/db/db.ts";
|
||||
import fs from "fs-extra";
|
||||
import knex from "knex";
|
||||
import knexOb from "./knexfile.js";
|
||||
|
||||
const PORT = process.env.PORT || 3000;
|
||||
const base = process.env.KENER_BASE_PATH || "";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const app: any = express();
|
||||
const db = knex(knexOb);
|
||||
|
||||
if (process.env.ORIGIN) {
|
||||
process.env.SVELTEKIT_ORIGIN = process.env.ORIGIN;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
app.use((req: any, res: any, next: any) => {
|
||||
if (req.path.startsWith("/embed")) {
|
||||
res.setHeader("Content-Security-Policy", "frame-ancestors *");
|
||||
}
|
||||
res.setHeader("X-Powered-By", "Kener");
|
||||
next();
|
||||
});
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
app.get(base + "/healthcheck", (req: any, res: any) => {
|
||||
res.end("ok");
|
||||
});
|
||||
|
||||
//part /uploads server static files from static/uploads
|
||||
|
||||
//set env variable for upload path
|
||||
process.env.UPLOAD_PATH = "./uploads";
|
||||
|
||||
app.use(base + "/uploads", express.static("uploads"));
|
||||
|
||||
try {
|
||||
const openapiJSON = fs.readFileSync("./openapi.json", "utf-8");
|
||||
app.use(
|
||||
"/api-reference",
|
||||
apiReference({
|
||||
spec: {
|
||||
content: openapiJSON,
|
||||
},
|
||||
theme: "alternate",
|
||||
hideModels: true,
|
||||
hideTestRequestButton: true,
|
||||
darkMode: true,
|
||||
metaData: {
|
||||
title: "Kener API Reference",
|
||||
description: "Kener free open source status page API Reference",
|
||||
ogDescription: "Kener free open source status page API Reference",
|
||||
ogTitle: "Kener API Reference",
|
||||
ogImage: "https://kener.ing/newbg.png",
|
||||
twitterCard: "summary_large_image",
|
||||
twitterTitle: "Kener API Reference",
|
||||
twitterDescription: "Kener free open source status page API Reference",
|
||||
twitterImage: "https://kener.ing/newbg.png",
|
||||
},
|
||||
favicon: "https://kener.ing/logo96.png",
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
} as any),
|
||||
);
|
||||
} catch (e) {
|
||||
console.warn("Error loading openapi.json, but that is okay.");
|
||||
}
|
||||
|
||||
// app.use(handler);
|
||||
|
||||
//migrations
|
||||
async function runMigrations() {
|
||||
try {
|
||||
console.log("Running migrations...");
|
||||
await db.migrate.latest(); // Runs migrations to the latest state
|
||||
console.log("Migrations completed successfully!");
|
||||
} catch (err) {
|
||||
console.error("Error running migrations:", err);
|
||||
}
|
||||
}
|
||||
|
||||
//seed
|
||||
async function runSeed() {
|
||||
try {
|
||||
console.log("Running seed...");
|
||||
await db.seed.run(); // Runs seed to the latest state
|
||||
console.log("Seed completed successfully!");
|
||||
} catch (err) {
|
||||
console.error("Error running seed:", err);
|
||||
}
|
||||
}
|
||||
|
||||
app.listen(PORT, async () => {
|
||||
await runMigrations();
|
||||
await runSeed();
|
||||
await db.destroy();
|
||||
Startup();
|
||||
console.log("Kener is running on port " + PORT + "!");
|
||||
});
|
||||
|
||||
// Graceful shutdown handler
|
||||
async function gracefulShutdown(signal: string) {
|
||||
console.log(`\nReceived ${signal}. Starting graceful shutdown...`);
|
||||
|
||||
try {
|
||||
console.log("Shutting down schedulers...");
|
||||
await shutdownSchedulers();
|
||||
console.log("Schedulers shut down successfully.");
|
||||
|
||||
console.log("Shutting down queues...");
|
||||
await shutdownQueues();
|
||||
console.log("Queues shut down successfully.");
|
||||
|
||||
console.log("Closing database connection...");
|
||||
await dbInstance.close();
|
||||
console.log("Database connection closed successfully.");
|
||||
|
||||
console.log("Graceful shutdown completed.");
|
||||
process.exit(0);
|
||||
} catch (err) {
|
||||
console.error("Error during graceful shutdown:", err);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Handle termination signals
|
||||
process.on("SIGTERM", () => gracefulShutdown("SIGTERM"));
|
||||
process.on("SIGINT", () => gracefulShutdown("SIGINT"));
|
||||
+6
-2
@@ -28,7 +28,10 @@
|
||||
"url": "https://github.com/rajnandan1/kener.git"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "vite build",
|
||||
"build": "node scripts/build-sveltekit.js && node scripts/build-server.js",
|
||||
"build-with-docs": "node scripts/build-sveltekit.js --with-docs && node scripts/build-server.js",
|
||||
"build:sveltekit": "vite build",
|
||||
"build:server": "node scripts/build-server.js",
|
||||
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
||||
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
||||
"configure": "node build.js",
|
||||
@@ -36,6 +39,7 @@
|
||||
"development": "vite dev",
|
||||
"devschedule": "vite-node src/lib/server/startup.ts",
|
||||
"generate-readme": "node scripts/generate-readme.js",
|
||||
"index-docs": "vite-node scripts/index-docs.ts",
|
||||
"migrate": "npx knex migrate:latest",
|
||||
"predev": "npm run seed",
|
||||
"prepare": "svelte-kit sync || echo ''",
|
||||
@@ -44,7 +48,7 @@
|
||||
"preview": "vite preview",
|
||||
"schedule": "vite-node src/lib/server/startup.ts",
|
||||
"seed": "npx knex seed:run",
|
||||
"start": "npx tsx main.ts"
|
||||
"start": "node build/main.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@internationalized/date": "^3.10.0",
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
import * as esbuild from "esbuild";
|
||||
import { readFileSync } from "fs";
|
||||
|
||||
const pkg = JSON.parse(readFileSync("./package.json", "utf8"));
|
||||
|
||||
// Collect all dependency names to externalize, except CJS packages
|
||||
// that need to be bundled for ESM compatibility
|
||||
const CJS_PACKAGES_TO_BUNDLE = ["rrule"];
|
||||
|
||||
const externalDeps = [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {})].filter(
|
||||
(dep) => !CJS_PACKAGES_TO_BUNDLE.includes(dep),
|
||||
);
|
||||
|
||||
await esbuild.build({
|
||||
entryPoints: ["scripts/main.ts"],
|
||||
bundle: true,
|
||||
platform: "node",
|
||||
target: "node20",
|
||||
format: "esm",
|
||||
outfile: "build/main.js",
|
||||
// Externalize all node_modules except CJS packages that break ESM named imports
|
||||
external: externalDeps,
|
||||
alias: {
|
||||
// Map SvelteKit's $lib alias so server code resolves correctly
|
||||
$lib: "./src/lib",
|
||||
},
|
||||
define: {
|
||||
// Inject version at build time so src/lib/version.ts resolves it
|
||||
// without relying on vite-plugin-package-version at runtime
|
||||
"import.meta.env.PACKAGE_VERSION": JSON.stringify(pkg.version),
|
||||
},
|
||||
plugins: [
|
||||
{
|
||||
name: "rewrite-build-imports",
|
||||
setup(build) {
|
||||
// Since the output lives in build/, rewrite ../build/X → ./X
|
||||
// so that handler.js (SvelteKit output) resolves correctly
|
||||
build.onResolve({ filter: /^\.\.\/build\// }, (args) => {
|
||||
return {
|
||||
path: args.path.replace(/^\.\.\/build\//, "./"),
|
||||
external: true,
|
||||
};
|
||||
});
|
||||
},
|
||||
},
|
||||
],
|
||||
banner: {
|
||||
js: "// Kener production server – built with esbuild",
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`Server build completed: build/main.js (v${pkg.version})`);
|
||||
@@ -0,0 +1,51 @@
|
||||
/**
|
||||
* SvelteKit build script that optionally excludes docs routes.
|
||||
*
|
||||
* Usage:
|
||||
* node scripts/build-sveltekit.js # build WITHOUT docs
|
||||
* node scripts/build-sveltekit.js --with-docs # build WITH docs
|
||||
*/
|
||||
import { execSync } from "child_process";
|
||||
import { renameSync, existsSync, rmSync } from "fs";
|
||||
import { resolve, dirname } from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const rootDir = resolve(__dirname, "..");
|
||||
|
||||
const withDocs = process.argv.includes("--with-docs");
|
||||
|
||||
const docsDir = resolve(rootDir, "src/routes/(docs)");
|
||||
const docsHiddenDir = resolve(rootDir, ".docs-excluded");
|
||||
|
||||
function moveDocs(from, to) {
|
||||
if (existsSync(from)) {
|
||||
renameSync(from, to);
|
||||
}
|
||||
}
|
||||
|
||||
function build() {
|
||||
if (!withDocs) {
|
||||
console.log("[build] Excluding docs routes from build...");
|
||||
moveDocs(docsDir, docsHiddenDir);
|
||||
// Clean generated route types so stale docs routes don't persist
|
||||
const svelteKitDir = resolve(rootDir, ".svelte-kit");
|
||||
if (existsSync(svelteKitDir)) {
|
||||
rmSync(svelteKitDir, { recursive: true, force: true });
|
||||
}
|
||||
} else {
|
||||
console.log("[build] Including docs routes in build...");
|
||||
}
|
||||
|
||||
try {
|
||||
execSync("npx vite build", { cwd: rootDir, stdio: "inherit" });
|
||||
} finally {
|
||||
// Always restore docs folder, even if build fails
|
||||
if (!withDocs) {
|
||||
moveDocs(docsHiddenDir, docsDir);
|
||||
console.log("[build] Restored docs routes.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
build();
|
||||
@@ -0,0 +1,159 @@
|
||||
/**
|
||||
* Standalone script to index documentation content into Redis for full-text search.
|
||||
*
|
||||
* This script reads docs.json and all markdown files from disk, converts them
|
||||
* to plain text, and stores the search documents in Redis. It should be run
|
||||
* manually whenever documentation content changes.
|
||||
*
|
||||
* Usage: npm run index-docs
|
||||
*/
|
||||
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
import fm from "front-matter";
|
||||
import IORedis from "ioredis";
|
||||
import dotenv from "dotenv";
|
||||
import { marked } from "marked";
|
||||
import plaintify from "marked-plaintify";
|
||||
import { mdToText } from "../src/lib/marked";
|
||||
|
||||
dotenv.config();
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
const DOCS_JSON_PATH = path.join(__dirname, "../src/routes/(docs)/docs.json");
|
||||
const CONTENT_DIR = path.join(__dirname, "../src/routes/(docs)/docs/content");
|
||||
const REDIS_DOCS_KEY = "kener-docs:search:documents";
|
||||
|
||||
interface DocsPage {
|
||||
title: string;
|
||||
slug: string;
|
||||
pages?: DocsPage[];
|
||||
}
|
||||
|
||||
interface DocsSidebarGroup {
|
||||
group: string;
|
||||
pages: DocsPage[];
|
||||
}
|
||||
|
||||
interface DocsConfig {
|
||||
sidebar: DocsSidebarGroup[];
|
||||
}
|
||||
|
||||
interface DocsSearchDocument {
|
||||
id: string;
|
||||
title: string;
|
||||
slug: string;
|
||||
group: string;
|
||||
content: string;
|
||||
rawContent: string;
|
||||
}
|
||||
|
||||
interface DocsSearchIndexData {
|
||||
documents: DocsSearchDocument[];
|
||||
lastUpdated: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read markdown content for a slug (body only, without frontmatter)
|
||||
*/
|
||||
function getMarkdownContent(slug: string): string | null {
|
||||
const directPath = path.join(CONTENT_DIR, `${slug}.md`);
|
||||
|
||||
try {
|
||||
let rawContent: string | null = null;
|
||||
|
||||
if (fs.existsSync(directPath)) {
|
||||
rawContent = fs.readFileSync(directPath, "utf-8");
|
||||
} else {
|
||||
const indexPath = path.join(CONTENT_DIR, slug, "index.md");
|
||||
if (fs.existsSync(indexPath)) {
|
||||
rawContent = fs.readFileSync(indexPath, "utf-8");
|
||||
}
|
||||
}
|
||||
|
||||
if (!rawContent) return null;
|
||||
|
||||
const parsed = fm(rawContent);
|
||||
return parsed.body;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively collect all pages from sidebar groups (including nested pages)
|
||||
*/
|
||||
function collectPages(pages: DocsPage[], group: string, result: Array<{ page: DocsPage; group: string }>): void {
|
||||
for (const page of pages) {
|
||||
result.push({ page, group });
|
||||
if (page.pages && page.pages.length > 0) {
|
||||
collectPages(page.pages, group, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function main(): Promise<void> {
|
||||
// Validate Redis URL
|
||||
if (!process.env.REDIS_URL) {
|
||||
console.error("Error: REDIS_URL environment variable is not set.");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Read docs.json
|
||||
if (!fs.existsSync(DOCS_JSON_PATH)) {
|
||||
console.error(`Error: docs.json not found at ${DOCS_JSON_PATH}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const config: DocsConfig = JSON.parse(fs.readFileSync(DOCS_JSON_PATH, "utf-8"));
|
||||
const documents: DocsSearchDocument[] = [];
|
||||
|
||||
// Collect all pages from sidebar
|
||||
const allPages: Array<{ page: DocsPage; group: string }> = [];
|
||||
for (const sidebarGroup of config.sidebar) {
|
||||
collectPages(sidebarGroup.pages, sidebarGroup.group, allPages);
|
||||
}
|
||||
|
||||
console.log(`[index-docs] Found ${allPages.length} pages to index`);
|
||||
|
||||
for (const { page, group } of allPages) {
|
||||
const markdownContent = getMarkdownContent(page.slug);
|
||||
if (markdownContent) {
|
||||
const plainContent = mdToText(markdownContent);
|
||||
documents.push({
|
||||
id: page.slug,
|
||||
title: page.title,
|
||||
slug: page.slug,
|
||||
group,
|
||||
content: plainContent,
|
||||
rawContent: markdownContent,
|
||||
});
|
||||
} else {
|
||||
console.warn(`[index-docs] No content found for slug: ${page.slug}`);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`[index-docs] Indexed ${documents.length} documents`);
|
||||
|
||||
// Store in Redis
|
||||
const redis = new IORedis(process.env.REDIS_URL, { maxRetriesPerRequest: null });
|
||||
|
||||
const indexData: DocsSearchIndexData = {
|
||||
documents,
|
||||
lastUpdated: Date.now(),
|
||||
};
|
||||
|
||||
await redis.set(REDIS_DOCS_KEY, JSON.stringify(indexData));
|
||||
console.log(`[index-docs] Stored ${documents.length} documents in Redis (key: ${REDIS_DOCS_KEY})`);
|
||||
|
||||
await redis.quit();
|
||||
console.log("[index-docs] Done.");
|
||||
}
|
||||
|
||||
main().catch((err) => {
|
||||
console.error("[index-docs] Fatal error:", err);
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -0,0 +1,83 @@
|
||||
import { handler } from "../build/handler.js";
|
||||
import { apiReference } from "@scalar/express-api-reference";
|
||||
import dotenv from "dotenv";
|
||||
dotenv.config();
|
||||
import express from "express";
|
||||
import Startup from "../src/lib/server/startup.ts";
|
||||
import shutdownSchedulers from "../src/lib/server/schedulers/shutdown.ts";
|
||||
import shutdownQueues from "../src/lib/server/queues/shutdown.ts";
|
||||
import dbInstance from "../src/lib/server/db/db.ts";
|
||||
import fs from "fs-extra";
|
||||
import knex from "knex";
|
||||
import knexOb from "../knexfile.js";
|
||||
|
||||
const PORT = process.env.PORT || 3000;
|
||||
const base = process.env.KENER_BASE_PATH || "";
|
||||
|
||||
const app: any = express();
|
||||
const db = knex(knexOb);
|
||||
|
||||
app.get(base + "/healthcheck", (req: any, res: any) => {
|
||||
res.end("ok");
|
||||
});
|
||||
|
||||
app.use(handler);
|
||||
|
||||
//migrations
|
||||
async function runMigrations() {
|
||||
try {
|
||||
console.log("Running migrations...");
|
||||
await db.migrate.latest(); // Runs migrations to the latest state
|
||||
console.log("Migrations completed successfully!");
|
||||
} catch (err) {
|
||||
console.error("Error running migrations:", err);
|
||||
}
|
||||
}
|
||||
|
||||
//seed
|
||||
async function runSeed() {
|
||||
try {
|
||||
console.log("Running seed...");
|
||||
await db.seed.run(); // Runs seed to the latest state
|
||||
console.log("Seed completed successfully!");
|
||||
} catch (err) {
|
||||
console.error("Error running seed:", err);
|
||||
}
|
||||
}
|
||||
|
||||
app.listen(PORT, async () => {
|
||||
await runMigrations();
|
||||
await runSeed();
|
||||
await db.destroy();
|
||||
Startup();
|
||||
console.log("Kener is running on port " + PORT + "!");
|
||||
});
|
||||
|
||||
// Graceful shutdown handler
|
||||
async function gracefulShutdown(signal: string) {
|
||||
console.log(`\nReceived ${signal}. Starting graceful shutdown...`);
|
||||
|
||||
try {
|
||||
console.log("Shutting down schedulers...");
|
||||
await shutdownSchedulers();
|
||||
console.log("Schedulers shut down successfully.");
|
||||
|
||||
console.log("Shutting down queues...");
|
||||
await shutdownQueues();
|
||||
console.log("Queues shut down successfully.");
|
||||
|
||||
console.log("Closing database connection...");
|
||||
await dbInstance.close();
|
||||
console.log("Database connection closed successfully.");
|
||||
|
||||
console.log("Graceful shutdown completed.");
|
||||
process.exit(0);
|
||||
} catch (err) {
|
||||
console.error("Error during graceful shutdown:", err);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Handle termination signals
|
||||
process.on("SIGTERM", () => gracefulShutdown("SIGTERM"));
|
||||
process.on("SIGINT", () => gracefulShutdown("SIGINT"));
|
||||
@@ -2,12 +2,8 @@ import { json, type Handle } from "@sveltejs/kit";
|
||||
import { VerifyAPIKey } from "$lib/server/controllers/apiController";
|
||||
import db from "$lib/server/db/db";
|
||||
import type { UnauthorizedResponse, NotFoundResponse } from "$lib/types/api";
|
||||
import { initializeSearchIndex } from "$lib/server/docs-search";
|
||||
import { GetMonitorsParsed } from "$lib/server/controllers/monitorsController";
|
||||
|
||||
// Initialize documentation search index at server startup
|
||||
initializeSearchIndex();
|
||||
|
||||
const API_PATH_PREFIX = "/api/";
|
||||
|
||||
// Paths that don't require authentication
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<script lang="ts">
|
||||
import { Badge } from "$lib/components/ui/badge/index.js";
|
||||
import Clock from "lucide-svelte/icons/clock";
|
||||
import CalendarClock from "lucide-svelte/icons/calendar-clock";
|
||||
import Timer from "lucide-svelte/icons/timer";
|
||||
import Clock from "@lucide/svelte/icons/clock";
|
||||
import CalendarClock from "@lucide/svelte/icons/calendar-clock";
|
||||
import Timer from "@lucide/svelte/icons/timer";
|
||||
import { t } from "$lib/stores/i18n";
|
||||
import { formatDate, formatDuration } from "$lib/stores/datetime";
|
||||
import { resolve } from "$app/paths";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import * as Select from "$lib/components/ui/select/index.js";
|
||||
import { i18n, t } from "$lib/stores/i18n";
|
||||
import Languages from "lucide-svelte/icons/languages";
|
||||
import Languages from "@lucide/svelte/icons/languages";
|
||||
|
||||
// Get the current locale from the store
|
||||
let selectedLang = $state($i18n.currentLocale);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { onMount } from "svelte";
|
||||
import { mode } from "mode-watcher";
|
||||
import { page } from "$app/state";
|
||||
import TrendingUp from "lucide-svelte/icons/trending-up";
|
||||
import TrendingUp from "@lucide/svelte/icons/trending-up";
|
||||
import { t } from "$lib/stores/i18n";
|
||||
import { formatDate } from "$lib/stores/datetime";
|
||||
import * as Tooltip from "$lib/components/ui/tooltip/index.js";
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
import { format } from "date-fns";
|
||||
import { resolve } from "$app/paths";
|
||||
import TrendingUp from "lucide-svelte/icons/trending-up";
|
||||
import Clock from "lucide-svelte/icons/clock";
|
||||
import Activity from "lucide-svelte/icons/activity";
|
||||
import TrendingUp from "@lucide/svelte/icons/trending-up";
|
||||
import Clock from "@lucide/svelte/icons/clock";
|
||||
import Activity from "@lucide/svelte/icons/activity";
|
||||
import { Button } from "$lib/components/ui/button/index.js";
|
||||
import * as Dialog from "$lib/components/ui/dialog/index.js";
|
||||
import { Badge } from "$lib/components/ui/badge/index.js";
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
import Share from "@lucide/svelte/icons/share-2";
|
||||
import Code from "@lucide/svelte/icons/code";
|
||||
import Sticker from "@lucide/svelte/icons/sticker";
|
||||
import Languages from "lucide-svelte/icons/languages";
|
||||
import Globe from "lucide-svelte/icons/globe";
|
||||
import Languages from "@lucide/svelte/icons/languages";
|
||||
import Globe from "@lucide/svelte/icons/globe";
|
||||
import ChevronDown from "@lucide/svelte/icons/chevron-down";
|
||||
import type { PageNavItem } from "$lib/server/controllers/dashboardController.js";
|
||||
import ChevronLeft from "@lucide/svelte/icons/chevron-left";
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
import { format, formatDistance, formatDistanceToNow, formatDuration, type Duration } from "date-fns";
|
||||
import {
|
||||
ru,
|
||||
enUS,
|
||||
hi,
|
||||
de,
|
||||
zhCN,
|
||||
vi,
|
||||
ja,
|
||||
nl,
|
||||
da,
|
||||
fr,
|
||||
ko,
|
||||
ptBR,
|
||||
tr,
|
||||
nb,
|
||||
pl,
|
||||
es,
|
||||
it,
|
||||
faIR,
|
||||
type Locale,
|
||||
} from "date-fns/locale";
|
||||
import { formatInTimeZone } from "date-fns-tz";
|
||||
|
||||
type LocaleKey =
|
||||
| "ru"
|
||||
| "en"
|
||||
| "hi"
|
||||
| "de"
|
||||
| "zh-CN"
|
||||
| "vi"
|
||||
| "ja"
|
||||
| "nl"
|
||||
| "dk"
|
||||
| "fr"
|
||||
| "ko"
|
||||
| "pt-BR"
|
||||
| "tr"
|
||||
| "nb-NO"
|
||||
| "pl"
|
||||
| "es"
|
||||
| "it"
|
||||
| "fa";
|
||||
|
||||
const locales: Record<LocaleKey, Locale> = {
|
||||
ru,
|
||||
en: enUS,
|
||||
hi,
|
||||
de,
|
||||
"zh-CN": zhCN,
|
||||
vi,
|
||||
ja,
|
||||
nl,
|
||||
dk: da,
|
||||
fr,
|
||||
ko,
|
||||
"pt-BR": ptBR,
|
||||
tr,
|
||||
"nb-NO": nb,
|
||||
pl,
|
||||
es,
|
||||
it,
|
||||
fa: faIR,
|
||||
};
|
||||
|
||||
const f = function (date: Date | number | string, formatStr: string, locale: string, tz: string): string {
|
||||
return formatInTimeZone(date, tz, formatStr, {
|
||||
locale: locales[locale as LocaleKey] || enUS,
|
||||
});
|
||||
};
|
||||
|
||||
const fd = function (start: Date | number, end: Date | number, locale: string): string {
|
||||
return formatDistance(start, end, { addSuffix: false, locale: locales[locale as LocaleKey] });
|
||||
};
|
||||
const fdn = function (start: Date | number, locale: string): string {
|
||||
return formatDistanceToNow(start, { addSuffix: true, locale: locales[locale as LocaleKey] });
|
||||
};
|
||||
const fdm = function (duration: Duration, locale: string): string {
|
||||
return formatDuration(duration, {
|
||||
format: ["days", "hours", "minutes"],
|
||||
zero: false,
|
||||
delimiter: " ",
|
||||
locale: locales[locale as LocaleKey],
|
||||
});
|
||||
};
|
||||
|
||||
const l = function (sessionLangMap: Record<string, string>, key: string, args: Record<string, string> = {}): string {
|
||||
try {
|
||||
let obj = sessionLangMap[key];
|
||||
|
||||
// Replace placeholders in the string using the args object
|
||||
if (obj && typeof obj === "string") {
|
||||
obj = obj.replace(/%\w+/g, (placeholder) => {
|
||||
const argKey = placeholder.slice(1); // Remove the `%` to get the key
|
||||
return args[argKey] !== undefined ? args[argKey] : placeholder;
|
||||
});
|
||||
}
|
||||
return obj || key;
|
||||
} catch (e) {
|
||||
return key;
|
||||
}
|
||||
};
|
||||
const summaryTime = function (summaryStatus: string): string {
|
||||
if (summaryStatus == "No Data") {
|
||||
return "No Data";
|
||||
}
|
||||
if (summaryStatus == "UP") {
|
||||
return "Status OK";
|
||||
}
|
||||
|
||||
return "%status for %duration";
|
||||
};
|
||||
|
||||
export { l, summaryTime, f, formatDistance, fd, fdn, fdm };
|
||||
@@ -1,23 +0,0 @@
|
||||
const l = function (sessionLangMap: Record<string, string>, key: string, args: Record<string, string> = {}): string {
|
||||
try {
|
||||
let obj = sessionLangMap[key];
|
||||
|
||||
// Replace placeholders in the string using the args object
|
||||
if (obj && typeof obj === "string") {
|
||||
obj = obj.replace(/%\w+/g, (placeholder) => {
|
||||
const argKey = placeholder.slice(1); // Remove the `%` to get the key
|
||||
return args[argKey] !== undefined ? args[argKey] : placeholder;
|
||||
});
|
||||
}
|
||||
if (obj && typeof obj === "string") {
|
||||
return obj;
|
||||
}
|
||||
console.warn(`Missing localization for key: ${key}`);
|
||||
return key;
|
||||
} catch (e) {
|
||||
console.error("Error in localization function:", e);
|
||||
return key;
|
||||
}
|
||||
};
|
||||
|
||||
export { l };
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"Under Maintenance": "Under Maintenance",
|
||||
"All Systems Operational": "All Systems Operational",
|
||||
"Degraded Performance": "Degraded Performance",
|
||||
"Partial Degraded Performance": "Partial Degraded Performance",
|
||||
"Partial System Outage": "Partial System Outage",
|
||||
"Major System Outage": "Major System Outage",
|
||||
"No Status Available": "No Status Available"
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
//read $lib/locales/locales.json and dynamic import all the locales
|
||||
|
||||
type LangMap = Record<string, Record<string, string>>;
|
||||
|
||||
const langMap: LangMap = {};
|
||||
import localesStr from "$lib/locales/locales.json?raw";
|
||||
|
||||
interface LocaleConfig {
|
||||
code: string;
|
||||
name?: string;
|
||||
}
|
||||
|
||||
const locales: LocaleConfig[] = JSON.parse(localesStr);
|
||||
locales.forEach((locale: LocaleConfig) => {
|
||||
import(`$lib/locales/${locale.code}.json`).then((data) => {
|
||||
langMap[locale.code] = data.default;
|
||||
});
|
||||
});
|
||||
|
||||
function mergeEnglish(language: Record<string, unknown>, english: Record<string, unknown>): void {
|
||||
for (let key in english) {
|
||||
if (language[key] === undefined) {
|
||||
language[key] = english[key];
|
||||
}
|
||||
if (typeof language[key] === "object" && language[key] !== null) {
|
||||
mergeEnglish(language[key] as Record<string, unknown>, english[key] as Record<string, unknown>);
|
||||
}
|
||||
}
|
||||
}
|
||||
const defaultLang = "en";
|
||||
|
||||
const init = (lang: string): Record<string, string> => {
|
||||
let english = langMap[defaultLang] as Record<string, string>;
|
||||
let language = langMap[lang] as Record<string, string>;
|
||||
|
||||
if (language === undefined) {
|
||||
return english;
|
||||
}
|
||||
|
||||
mergeEnglish(language, english);
|
||||
|
||||
return language;
|
||||
};
|
||||
|
||||
export default init;
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status für %duration",
|
||||
"120 Days": "120 Tage",
|
||||
"14 Days": "14 Tage",
|
||||
"150 Days": "150 Tage",
|
||||
"180 Days": "180 Tage",
|
||||
"30 Days": "30 Tage",
|
||||
"60 Days": "60 Tage",
|
||||
"7 Days": "7 Tage",
|
||||
"90 Days": "90 Tage",
|
||||
"Availability per Component": "Verfügbarkeit pro Komponente",
|
||||
"All Systems are Degraded": "Alle Systeme sind eingeschränkt",
|
||||
"All Systems are Down": "Alle Systeme sind ausgefallen",
|
||||
"All Systems are Operational": "Alle Systeme sind betriebsbereit",
|
||||
"All Systems are in Maintenance": "Alle Systeme sind in Wartung",
|
||||
"Back": "Zurück",
|
||||
"Badge Copied": "Abzeichen kopiert",
|
||||
"Badge": "Abzeichen",
|
||||
"Browse Events": "Ereignisse durchsuchen",
|
||||
"Change Email": "E-Mail ändern",
|
||||
"Code Copied": "Code kopiert",
|
||||
"Confirm Login": "Login bestätigen",
|
||||
"Copy Code": "Code kopieren",
|
||||
"Copy Link": "Link kopieren",
|
||||
"DEGRADED": "EINGESCHRÄNKT",
|
||||
"DOWN": "AUSGEFALLEN",
|
||||
"Dark": "Dunkel",
|
||||
"Days": "Tage",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Binden Sie diesen Monitor mit <script> oder <iframe> in Ihre App ein.",
|
||||
"Embed": "Einbetten",
|
||||
"Enter the code": "Code eingeben",
|
||||
"Enter your email": "E-Mail-Adresse eingeben",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Geben Sie Ihre E-Mail-Adresse ein, um sich anzumelden. Wenn Sie nicht abonniert haben, werden Sie zum Abonnieren aufgefordert.",
|
||||
"Get SVG badge for this monitor": "SVG-Abzeichen für diesen Monitor erhalten",
|
||||
"Get a LIVE Status for this monitor": "LIVE-Status für diesen Monitor erhalten",
|
||||
"IDENTIFIED": "IDENTIFIZIERT",
|
||||
"INVESTIGATING": "UNTERSUCHUNG",
|
||||
"Incident Updates": "Vorfall-Updates",
|
||||
"LIVE Status": "LIVE-Status",
|
||||
"Lasted for about %lastedFor": "Dauerte etwa %lastedFor",
|
||||
"Light": "Hell",
|
||||
"Link Copied": "Link kopiert",
|
||||
"Login": "Anmelden",
|
||||
"MAINTENANCE": "WARTUNG",
|
||||
"MONITORING": "ÜBERWACHUNG",
|
||||
"Maintenance Completed": "Wartung abgeschlossen",
|
||||
"Maintenance in Progress": "Wartung läuft",
|
||||
"Manage Subscription": "Abonnement verwalten",
|
||||
"Mode": "Modus",
|
||||
"No Data": "Keine Daten",
|
||||
"No Incident in %date": "Kein Vorfall am %date",
|
||||
"No Incidents": "Keine Vorfälle",
|
||||
"No Monitor Found": "Kein Monitor gefunden",
|
||||
"No Updates Yet": "Noch keine Updates",
|
||||
"Ongoing Incidents": "Laufende Vorfälle",
|
||||
"Pinging": "Pingen",
|
||||
"Please select specific monitors to receive updates from.": "Bitte wählen Sie bestimmte Monitore aus, von denen Sie Updates erhalten möchten.",
|
||||
"RESOLVED": "GELÖST",
|
||||
"Recent Incidents": "Kürzliche Vorfälle",
|
||||
"Recent Maintenances": "Kürzliche Wartungen",
|
||||
"Share this monitor using a link with others": "Teilen Sie diesen Monitor mit einem Link mit anderen",
|
||||
"Share": "Teilen",
|
||||
"Some Systems are not working as expected": "Einige Systeme funktionieren nicht wie erwartet",
|
||||
"Some Systems Degraded": "Einige Systeme eingeschränkt",
|
||||
"Some Systems Down": "Einige Systeme ausgefallen",
|
||||
"Some Systems in Maintenance": "Einige Systeme sind in Wartung",
|
||||
"Standard": "Standard",
|
||||
"Started %startedAt, lasted for %lastedFor": "Begann vor etwa %startedAt und dauerte etwa %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Begann vor etwa %startedAt und dauert noch an",
|
||||
"Started %startedAt, will last for %lastedFor more": "Begann vor etwa %startedAt und wird noch etwa %lastedFor dauern",
|
||||
"Starts %startedAt, will last for %lastedFor": "Beginnt in %startedAt und wird etwa %lastedFor dauern",
|
||||
"Starts %startedAt": "Beginnt in %startedAt",
|
||||
"Status OK": "Status OK",
|
||||
"Status": "Status",
|
||||
"Subscribe": "Abonnieren",
|
||||
"Subscribe to Updates": "Updates abonnieren",
|
||||
"Subscribe to all monitors": "Alle Monitore abonnieren",
|
||||
"Switch to your timezone": "Wechseln Sie zu Ihrer Zeitzone",
|
||||
"Theme": "Thema",
|
||||
"There are no upcoming maintenances": "Es gibt keine bevorstehenden Wartungen",
|
||||
"Timezone set to %tz": "Zeitzone auf %tz gesetzt",
|
||||
"Today": "Heute",
|
||||
"UP": "VERFÜGBAR",
|
||||
"Update Subscription": "Abonnement aktualisieren",
|
||||
"Upcoming Maintenance": "Bevorstehende Wartung",
|
||||
"Upcoming Maintenances": "Bevorstehende Wartungen",
|
||||
"Updates": "Updates",
|
||||
"Uptime": "Verfügbarkeit",
|
||||
"View in detail": "Details anzeigen",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Wir haben einen Code an Ihre E-Mail-Adresse gesendet. Bitte geben Sie ihn unten ein, um Ihren Login zu bestätigen",
|
||||
"You are logged in as %email": "Sie sind angemeldet als %email"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status i %duration",
|
||||
"14 Days": "14 Dage",
|
||||
"30 Days": "30 Dage",
|
||||
"60 Days": "60 Dage",
|
||||
"7 Days": "7 Dage",
|
||||
"90 Days": "90 Dage",
|
||||
"120 Days": "120 Dage",
|
||||
"150 Days": "150 Dage",
|
||||
"180 Days": "180 Dage",
|
||||
"Availability per Component": "Tilgængelighed pr. Komponent",
|
||||
"All Systems are Degraded": "Alle Systemer er Forringet",
|
||||
"All Systems are Down": "Alle Systemer er Nede",
|
||||
"All Systems are Operational": "Alle Systemer er Operationelle",
|
||||
"All Systems are in Maintenance": "Alle systemer er i vedligeholdelse",
|
||||
"Back": "Tilbage",
|
||||
"Badge Copied": "Mærke Kopieret",
|
||||
"Badge": "Mærke",
|
||||
"Browse Events": "Gennemse begivenheder",
|
||||
"Change Email": "Skift Email",
|
||||
"Code Copied": "Kode Kopieret",
|
||||
"Confirm Login": "Bekræft Login",
|
||||
"Copy Code": "Kopier Kode",
|
||||
"Copy Link": "Kopier Link",
|
||||
"DEGRADED": "FORRINGET",
|
||||
"DOWN": "NEDE",
|
||||
"Dark": "Mørk",
|
||||
"Days": "Dage",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Integrer denne monitor ved at bruge <script> eller <iframe> i din app.",
|
||||
"Embed": "Integrer",
|
||||
"Enter the code": "Indtast koden",
|
||||
"Enter your email": "Indtast din email",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Indtast din email for at logge ind. Hvis du ikke er abonnent, vil du blive bedt om at abonnere.",
|
||||
"Get SVG badge for this monitor": "Hent SVG-mærke til denne monitor",
|
||||
"Get a LIVE Status for this monitor": "Hent en LIVE-status for denne monitor",
|
||||
"IDENTIFIED": "IDENTIFICERET",
|
||||
"INVESTIGATING": "UNDERSØGER",
|
||||
"Incident Updates": "Hændelsesopdateringer",
|
||||
"LIVE Status": "LIVE-status",
|
||||
"Lasted for about %lastedFor": "Varede i cirka %lastedFor",
|
||||
"Light": "Lys",
|
||||
"Link Copied": "Link Kopieret",
|
||||
"Login": "Log ind",
|
||||
"MAINTENANCE": "VEDLIGEHOLDELSE",
|
||||
"MONITORING": "OVERVÅGNING",
|
||||
"Maintenance Completed": "Vedligeholdelse afsluttet",
|
||||
"Maintenance in Progress": "Vedligeholdelse i gang",
|
||||
"Manage Subscription": "Administrer Abonnement",
|
||||
"Mode": "Tilstand",
|
||||
"No Data": "Ingen Data",
|
||||
"No Incident in %date": "Ingen Hændelse Den %date",
|
||||
"No Incidents": "Ingen Hændelser",
|
||||
"No Monitor Found": "Ingen Monitor Fundet",
|
||||
"No Updates Yet": "Ingen Opdateringer Endnu",
|
||||
"Ongoing Incidents": "Igangværende Hændelser",
|
||||
"Pinging": "Pinger",
|
||||
"Please select specific monitors to receive updates from.": "Vælg venligst specifikke monitorer for at modtage opdateringer fra.",
|
||||
"RESOLVED": "LØST",
|
||||
"Recent Incidents": "Seneste Hændelser",
|
||||
"Recent Maintenances": "Seneste Vedligeholdelser",
|
||||
"Share this monitor using a link with others": "Del denne monitor ved hjælp af et link med andre",
|
||||
"Share": "Del",
|
||||
"Some Systems are not working as expected": "Nogle Systemer fungerer ikke som forventet",
|
||||
"Some Systems Degraded": "Nogle Systemer er Forringet",
|
||||
"Some Systems Down": "Nogle Systemer er Nede",
|
||||
"Some Systems in Maintenance": "Nogle Systemer er i Vedligeholdelse",
|
||||
"Standard": "Standard",
|
||||
"Started %startedAt, lasted for %lastedFor": "Startede for cirka %startedAt siden, varede i cirka %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Startede for cirka %startedAt siden, stadig igangværende",
|
||||
"Started %startedAt, will last for %lastedFor more": "Startede for cirka %startedAt siden, vil vare i cirka %lastedFor mere",
|
||||
"Starts %startedAt, will last for %lastedFor": "Starter om %startedAt, vil vare i cirka %lastedFor",
|
||||
"Starts %startedAt": "Starter om %startedAt",
|
||||
"Status OK": "Status OK",
|
||||
"Status": "Status",
|
||||
"Subscribe": "Abonner",
|
||||
"Subscribe to Updates": "Abonner på opdateringer",
|
||||
"Subscribe to all monitors": "Abonner på alle monitorer",
|
||||
"Switch to your timezone": "Skift til din tidszone",
|
||||
"Theme": "Tema",
|
||||
"There are no upcoming maintenances": "Der er ingen kommende vedligeholdelser",
|
||||
"Timezone set to %tz": "Tidszone sat til %tz",
|
||||
"Today": "I dag",
|
||||
"UP": "OPPE",
|
||||
"Update Subscription": "Opdater Abonnement",
|
||||
"Upcoming Maintenance": "Kommende vedligeholdelse",
|
||||
"Upcoming Maintenances": "Kommende vedligeholdelser",
|
||||
"Updates": "Opdateringer",
|
||||
"Uptime": "Oppetid",
|
||||
"View in detail": "Vis i detaljer",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Vi har sendt en kode til din email. Indtast den venligst nedenfor for at bekræfte dit login",
|
||||
"You are logged in as %email": "Du er logget ind som %email"
|
||||
}
|
||||
+121
-90
@@ -1,92 +1,123 @@
|
||||
{
|
||||
"%status for %duration": "%status for %duration",
|
||||
"120 Days": "120 Days",
|
||||
"14 Days": "14 Days",
|
||||
"150 Days": "150 Days",
|
||||
"180 Days": "180 Days",
|
||||
"30 Days": "30 Days",
|
||||
"60 Days": "60 Days",
|
||||
"7 Days": "7 Days",
|
||||
"90 Days": "90 Days",
|
||||
"Availability per Component": "Availability per Component",
|
||||
"All Systems are Degraded": "All Systems are Degraded",
|
||||
"All Systems are Down": "All Systems are Down",
|
||||
"All Systems are Operational": "All Systems are Operational",
|
||||
"All Systems are in Maintenance": "All Systems are in Maintenance",
|
||||
"Back": "Back",
|
||||
"Badge Copied": "Badge Copied",
|
||||
"Badge": "Badge",
|
||||
"Browse Events": "Browse Events",
|
||||
"Change Email": "Change Email",
|
||||
"Code Copied": "Code Copied",
|
||||
"Confirm Login": "Confirm Login",
|
||||
"Copy Code": "Copy Code",
|
||||
"Copy Link": "Copy Link",
|
||||
"DEGRADED": "DEGRADED",
|
||||
"DOWN": "DOWN",
|
||||
"Dark": "Dark",
|
||||
"Days": "Days",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Embed this monitor using <script> or <iframe> in your app.",
|
||||
"Embed": "Embed",
|
||||
"Enter the code": "Enter the code",
|
||||
"Enter your email": "Enter your email",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.",
|
||||
"Get SVG badge for this monitor": "Get SVG badge for this monitor",
|
||||
"Get a LIVE Status for this monitor": "Get a LIVE Status for this monitor",
|
||||
"IDENTIFIED": "IDENTIFIED",
|
||||
"INVESTIGATING": "INVESTIGATING",
|
||||
"Incident Updates": "Incident Updates",
|
||||
"LIVE Status": "LIVE Status",
|
||||
"Lasted for about %lastedFor": "Lasted for about %lastedFor",
|
||||
"Light": "Light",
|
||||
"Link Copied": "Link Copied",
|
||||
"Login": "Login",
|
||||
"MAINTENANCE": "MAINTENANCE",
|
||||
"MONITORING": "MONITORING",
|
||||
"Maintenance Completed": "Maintenance Completed",
|
||||
"Maintenance in Progress": "Maintenance in Progress",
|
||||
"Manage Subscription": "Manage Subscription",
|
||||
"Mode": "Mode",
|
||||
"No Data": "No Data",
|
||||
"No Incident in %date": "No Incident in %date",
|
||||
"No Incidents": "No Incidents",
|
||||
"No Monitor Found": "No Monitor Found",
|
||||
"No Updates Yet": "No Updates Yet",
|
||||
"Ongoing Incidents": "Ongoing Incidents",
|
||||
"Pinging": "Pinging",
|
||||
"Please select specific monitors to receive updates from.": "Please select specific monitors to receive updates from.",
|
||||
"RESOLVED": "RESOLVED",
|
||||
"Recent Incidents": "Recent Incidents",
|
||||
"Recent Maintenances": "Recent Maintenances",
|
||||
"Share this monitor using a link with others": "Share this monitor using a link with others",
|
||||
"Share": "Share",
|
||||
"Some Systems are not working as expected": "Some Systems are not working as expected",
|
||||
"Some Systems Degraded": "Some Systems Degraded",
|
||||
"Some Systems Down": "Some Systems Down",
|
||||
"Some Systems in Maintenance": "Some Systems in Maintenance",
|
||||
"Standard": "Standard",
|
||||
"Started %startedAt, lasted for %lastedFor": "Started %startedAt, lasted for %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Started %startedAt, still ongoing",
|
||||
"Started %startedAt, will last for %lastedFor more": "Started %startedAt, will last for %lastedFor more",
|
||||
"Starts %startedAt, will last for %lastedFor": "Starts %startedAt, will last for %lastedFor",
|
||||
"Starts %startedAt": "Starts %startedAt",
|
||||
"Status OK": "Status OK",
|
||||
"Status": "Status",
|
||||
"Subscribe": "Subscribe",
|
||||
"Subscribe to Updates": "Subscribe to Updates",
|
||||
"Subscribe to all monitors": "Subscribe to all monitors",
|
||||
"Switch to your timezone": "Switch to your timezone",
|
||||
"Theme": "Theme",
|
||||
"There are no upcoming maintenances": "There are no upcoming maintenances",
|
||||
"Timezone set to %tz": "Timezone set to %tz",
|
||||
"Today": "Today",
|
||||
"UP": "UP",
|
||||
"Update Subscription": "Update Subscription",
|
||||
"Upcoming Maintenance": "Upcoming Maintenance",
|
||||
"Upcoming Maintenances": "Upcoming Maintenances",
|
||||
"Updates": "Updates",
|
||||
"Uptime": "Uptime",
|
||||
"View in detail": "View in detail",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "We have sent a code to your email. Please enter it below to confirm your login",
|
||||
"You are logged in as %email": "You are logged in as %email"
|
||||
"name": "English",
|
||||
"mappings": {
|
||||
"Under Maintenance": "Under Maintenance",
|
||||
"All Systems Operational": "All Systems Operational",
|
||||
"Degraded Performance": "Degraded Performance",
|
||||
"Partial Degraded Performance": "Partial Degraded Performance",
|
||||
"Partial System Outage": "Partial System Outage",
|
||||
"Major System Outage": "Major System Outage",
|
||||
"No Status Available": "No Status Available",
|
||||
"Maintenances": "Maintenances",
|
||||
"Events": "Events",
|
||||
"Select Language": "Select Language",
|
||||
"Incidents": "Incidents",
|
||||
"Ongoing": "Ongoing",
|
||||
"Upcoming": "Upcoming",
|
||||
"Past": "Past",
|
||||
"Back": "Back",
|
||||
"Subscribe": "Subscribe",
|
||||
"Available Components": "Available Components",
|
||||
"Minute-by-minute status data for this day": "Minute-by-minute status data for this day",
|
||||
"Recent Incidents": "Recent Incidents",
|
||||
"Home": "Home",
|
||||
"Status": "Status",
|
||||
"Latency": "Latency",
|
||||
"Failed to load latency data": "Failed to load latency data",
|
||||
"No incidents for this day": "No incidents for this day",
|
||||
"No maintenances for this day": "No maintenances for this day",
|
||||
"No latency data available for this day": "No latency data available for this day",
|
||||
"Latency Over Time": "Latency Over Time",
|
||||
"Average Latency": "Average Latency",
|
||||
"Failed to load status data for this day": "Failed to load status data for this day",
|
||||
"Per-Minute Status": "Per-Minute Status",
|
||||
"Day Uptime": "Day Uptime",
|
||||
"Last Updated": "Last Updated",
|
||||
"Latest Status": "Latest Status",
|
||||
"Latest Latency": "Latest Latency",
|
||||
"Ongoing Incidents": "Ongoing Incidents",
|
||||
"Latency Trend": "Latency Trend",
|
||||
"Avg Latency": "Avg Latency",
|
||||
"Uptime": "Uptime",
|
||||
"Select Range": "Select Range",
|
||||
"Status history and latency trend": "Status history and latency trend",
|
||||
"Timeline": "Timeline",
|
||||
"Start Time": "Start Time",
|
||||
"End Time": "End Time",
|
||||
"Duration": "Duration",
|
||||
"UP": "UP",
|
||||
"DOWN": "DOWN",
|
||||
"MAINTENANCE": "MAINTENANCE",
|
||||
"NO_DATA": "NO DATA",
|
||||
"DEGRADED": "DEGRADED",
|
||||
"INVESTIGATING": "INVESTIGATING",
|
||||
"IDENTIFIED": "IDENTIFIED",
|
||||
"MONITORING": "MONITORING",
|
||||
"RESOLVED": "RESOLVED",
|
||||
"No updates yet": "No updates yet",
|
||||
"Affected Monitors (%count)": "Affected Monitors (%count)",
|
||||
"No monitors affected": "No monitors affected",
|
||||
"Unknown impact": "Unknown impact",
|
||||
"Updates (%count)": "Updates (%count)",
|
||||
"Impact": "Impact",
|
||||
"One-time": "One-time",
|
||||
"In Progress": "In Progress",
|
||||
"Maintenance": "Maintenance",
|
||||
"Total <br /> Maintenances": "Total <br /> Maintenances",
|
||||
"Total <br /> Incidents": "Total <br /> Incidents",
|
||||
"There are no incidents or maintenances scheduled for this month.": "There are no incidents or maintenances scheduled for this month.",
|
||||
"No Events in %currentMonth": "No Events in %currentMonth",
|
||||
"Ongoing <br /> Incidents": "Ongoing <br /> Incidents",
|
||||
"Ongoing <br /> Maintenances": "Ongoing <br /> Maintenances",
|
||||
"Upcoming <br /> Maintenances": "Upcoming <br /> Maintenances",
|
||||
"Copied": "Copied",
|
||||
"Badges": "Badges",
|
||||
"Get badges for this monitor": "Get badges for this monitor",
|
||||
"Status Badge": "Status Badge",
|
||||
"Uptime Badge": "Uptime Badge",
|
||||
"Live Status": "Live Status",
|
||||
"Standard": "Standard",
|
||||
"Pinging": "Pinging",
|
||||
"Embed Monitor": "Embed Monitor",
|
||||
"Embed this monitor in your website or app": "Embed this monitor in your website or app",
|
||||
"Status Embed": "Status Embed",
|
||||
"Latency Embed": "Latency Embed",
|
||||
"Theme": "Theme",
|
||||
"Light": "Light",
|
||||
"Dark": "Dark",
|
||||
"Format": "Format",
|
||||
"iFrame": "iFrame",
|
||||
"Script": "Script",
|
||||
"Failed to load data": "Failed to load data",
|
||||
"90 Days": "90 Days",
|
||||
"30 Days": "30 Days",
|
||||
"7 Days": "7 Days",
|
||||
"24 Hours": "24 Hours",
|
||||
"Incident": "Incident",
|
||||
"Subscribe to Updates": "Subscribe to Updates",
|
||||
"Get notified about incidents and scheduled maintenance.": "Get notified about incidents and scheduled maintenance.",
|
||||
"Enter the verification code sent to your email.": "Enter the verification code sent to your email.",
|
||||
"Manage your notification preferences.": "Manage your notification preferences.",
|
||||
"Loading your preferences...": "Loading your preferences...",
|
||||
"Email address": "Email address",
|
||||
"Please enter a valid email address": "Please enter a valid email address",
|
||||
"Failed to send verification code": "Failed to send verification code",
|
||||
"Network error. Please try again.": "Network error. Please try again.",
|
||||
"Sending...": "Sending...",
|
||||
"Continue": "Continue",
|
||||
"We sent a 6-digit code to": "We sent a 6-digit code to",
|
||||
"Please enter the 6-digit verification code": "Please enter the 6-digit verification code",
|
||||
"Verification failed": "Verification failed",
|
||||
"Didn't receive the code? Resend": "Didn't receive the code? Resend",
|
||||
"Incident Updates": "Incident Updates",
|
||||
"Get notified about incidents updates": "Get notified about incidents updates",
|
||||
"Maintenance Updates": "Maintenance Updates",
|
||||
"Get notified about scheduled maintenance": "Get notified about scheduled maintenance",
|
||||
"Failed to update preference": "Failed to update preference",
|
||||
"No ongoing maintenances": "No ongoing maintenances",
|
||||
"No upcoming maintenances": "No upcoming maintenances",
|
||||
"No past maintenances": "No past maintenances",
|
||||
"Read more": "Read more",
|
||||
"Read less": "Read less"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status durante %duration",
|
||||
"120 Days": "120 Días",
|
||||
"14 Days": "14 Días",
|
||||
"150 Days": "150 Días",
|
||||
"180 Days": "180 Días",
|
||||
"30 Days": "30 Días",
|
||||
"60 Days": "60 Días",
|
||||
"7 Days": "7 Días",
|
||||
"90 Days": "90 Días",
|
||||
"Availability per Component": "Disponibilidad por componente",
|
||||
"All Systems are Degraded": "Todos los sistemas están degradados",
|
||||
"All Systems are Down": "Todos los sistemas están caídos",
|
||||
"All Systems are Operational": "Todos los sistemas están operativos",
|
||||
"Back": "Volver",
|
||||
"Badge Copied": "Distintivo copiado",
|
||||
"Badge": "Distintivo",
|
||||
"Browse Events": "Ver eventos",
|
||||
"Change Email": "Cambiar correo electrónico",
|
||||
"Code Copied": "Código copiado",
|
||||
"Confirm Login": "Confirmar inicio de sesión",
|
||||
"Copy Code": "Copiar código",
|
||||
"Copy Link": "Copiar enlace",
|
||||
"DEGRADED": "DEGRADADO",
|
||||
"DOWN": "CAÍDO",
|
||||
"Dark": "Oscuro",
|
||||
"Days": "Días",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Incrusta este monitor usando <script> o <iframe> en tu aplicación.",
|
||||
"Embed": "Incrustar",
|
||||
"Enter the code": "Ingresa el código",
|
||||
"Enter your email": "Ingresa tu correo electrónico",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Ingresa tu correo electrónico para iniciar sesión. Si no estás suscrito, se te pedirá que te suscribas.",
|
||||
"Get SVG badge for this monitor": "Obtener distintivo SVG para este monitor",
|
||||
"Get a LIVE Status for this monitor": "Obtener estado EN VIVO para este monitor",
|
||||
"IDENTIFIED": "IDENTIFICADO",
|
||||
"INVESTIGATING": "INVESTIGANDO",
|
||||
"Incident Updates": "Actualizaciones de incidentes",
|
||||
"LIVE Status": "Estado EN VIVO",
|
||||
"Lasted for about %lastedFor": "Duró aproximadamente %lastedFor",
|
||||
"Light": "Claro",
|
||||
"Link Copied": "Enlace copiado",
|
||||
"Login": "Iniciar sesión",
|
||||
"MAINTENANCE": "MANTENIMIENTO",
|
||||
"MONITORING": "MONITOREANDO",
|
||||
"Maintenance Completed": "Mantenimiento completado",
|
||||
"Maintenance in Progress": "Mantenimiento en progreso",
|
||||
"Manage Subscription": "Gestionar suscripción",
|
||||
"Mode": "Modo",
|
||||
"No Data": "Sin datos",
|
||||
"No Incident in %date": "Sin incidentes en %date",
|
||||
"No Incidents": "Sin incidentes",
|
||||
"No Monitor Found": "No se encontró monitor",
|
||||
"No Updates Yet": "Aún no hay actualizaciones",
|
||||
"Ongoing Incidents": "Incidentes en curso",
|
||||
"Pinging": "Haciendo ping",
|
||||
"Please select specific monitors to receive updates from.": "Por favor selecciona monitores específicos para recibir actualizaciones.",
|
||||
"RESOLVED": "RESUELTO",
|
||||
"Recent Incidents": "Incidentes recientes",
|
||||
"Recent Maintenances": "Mantenimientos recientes",
|
||||
"Share this monitor using a link with others": "Comparte este monitor mediante un enlace con otros",
|
||||
"Share": "Compartir",
|
||||
"Some Systems are not working as expected": "Algunos sistemas no funcionan como se espera",
|
||||
"Some Systems Degraded": "Algunos sistemas degradados",
|
||||
"Some Systems Down": "Algunos sistemas caídos",
|
||||
"Standard": "Estándar",
|
||||
"Started %startedAt, lasted for %lastedFor": "Comenzó el %startedAt, duró %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Comenzó el %startedAt, aún en curso",
|
||||
"Started %startedAt, will last for %lastedFor more": "Comenzó el %startedAt, durará %lastedFor más",
|
||||
"Starts %startedAt, will last for %lastedFor": "Empieza el %startedAt, durará %lastedFor",
|
||||
"Starts %startedAt": "Empieza el %startedAt",
|
||||
"Status OK": "Estado OK",
|
||||
"Status": "Estado",
|
||||
"Subscribe": "Suscribirse",
|
||||
"Subscribe to Updates": "Suscribirse a actualizaciones",
|
||||
"Subscribe to all monitors": "Suscribirse a todos los monitores",
|
||||
"Switch to your timezone": "Cambiar a tu zona horaria",
|
||||
"Theme": "Tema",
|
||||
"There are no upcoming maintenances": "No hay mantenimientos próximos",
|
||||
"Timezone set to %tz": "Zona horaria configurada a %tz",
|
||||
"Today": "Hoy",
|
||||
"UP": "ACTIVO",
|
||||
"Update Subscription": "Actualizar suscripción",
|
||||
"Upcoming Maintenance": "Mantenimiento próximo",
|
||||
"Upcoming Maintenances": "Mantenimientos próximos",
|
||||
"Updates": "Actualizaciones",
|
||||
"Uptime": "Tiempo en línea",
|
||||
"View in detail": "Ver en detalle",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Hemos enviado un código a tu correo. Por favor, ingrésalo abajo para confirmar tu inicio de sesión",
|
||||
"You are logged in as %email": "Has iniciado sesión como %email"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status به مدت %duration",
|
||||
"120 Days": "۱۲۰ روزه",
|
||||
"14 Days": "۱۴ روزه",
|
||||
"150 Days": "۱۵۰ روزه",
|
||||
"180 Days": "۱۸۰ روزه",
|
||||
"30 Days": "۳۰ روزه",
|
||||
"60 Days": "۶۰ روزه",
|
||||
"7 Days": "۷ روزه",
|
||||
"90 Days": "۹۰ روزه",
|
||||
"Availability per Component": "دسترسپذیری هر کامپوننت",
|
||||
"All Systems are Degraded": "همه سامانهها دچار اختلالاند",
|
||||
"All Systems are Down": "همه سامانهها از کار افتادهاند",
|
||||
"All Systems are Operational": "همه سامانهها در حال کار هستند",
|
||||
"All Systems are in Maintenance": "همه سامانهها در حال تعمیر هستند",
|
||||
"Back": "بازگشت",
|
||||
"Badge Copied": "نشان کپی شد",
|
||||
"Badge": "نشان",
|
||||
"Browse Events": "مشاهده رویدادها",
|
||||
"Change Email": "تغییر ایمیل",
|
||||
"Code Copied": "کد کپی شد",
|
||||
"Confirm Login": "تأیید ورود",
|
||||
"Copy Code": "کپی کد",
|
||||
"Copy Link": "کپی لینک",
|
||||
"DEGRADED": "اختلال",
|
||||
"DOWN": "از کار افتاده",
|
||||
"Dark": "تاریک",
|
||||
"Days": "روزها",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "این مانیتور را با استفاده از <script> یا <iframe> در برنامهتان قرار دهید.",
|
||||
"Embed": "درج",
|
||||
"Enter the code": "کد را وارد کنید",
|
||||
"Enter your email": "ایمیل خود را وارد کنید",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "برای ورود، ایمیل خود را وارد کنید. اگر عضو نیستید، از شما خواسته میشود عضو شوید.",
|
||||
"Get SVG badge for this monitor": "دریافت نشان SVG برای این مانیتور",
|
||||
"Get a LIVE Status for this monitor": "دریافت وضعیت زنده این مانیتور",
|
||||
"IDENTIFIED": "شناسایی شده",
|
||||
"INVESTIGATING": "در حال بررسی",
|
||||
"Incident Updates": "بهروزرسانیهای حادثه",
|
||||
"LIVE Status": "وضعیت زنده",
|
||||
"Lasted for about %lastedFor": "حدوداً به مدت %lastedFor ادامه داشت",
|
||||
"Light": "روشن",
|
||||
"Link Copied": "لینک کپی شد",
|
||||
"Login": "ورود",
|
||||
"MAINTENANCE": "تعمیر و نگهداری",
|
||||
"MONITORING": "در حال پایش",
|
||||
"Maintenance Completed": "تعمیرات به پایان رسید",
|
||||
"Maintenance in Progress": "تعمیرات در حال انجام است",
|
||||
"Manage Subscription": "مدیریت اشتراک",
|
||||
"Mode": "حالت",
|
||||
"No Data": "بدون داده",
|
||||
"No Incident in %date": "هیچ حادثهای در %date وجود ندارد",
|
||||
"No Incidents": "هیچ حادثهای وجود ندارد",
|
||||
"No Monitor Found": "هیچ مانیتوری یافت نشد",
|
||||
"No Updates Yet": "هنوز بهروزرسانیای وجود ندارد",
|
||||
"Ongoing Incidents": "حوادث در حال وقوع",
|
||||
"Pinging": "در حال پینگ گرفتن",
|
||||
"Please select specific monitors to receive updates from.": "لطفاً مانیتورهای خاصی را برای دریافت بهروزرسانی انتخاب کنید.",
|
||||
"RESOLVED": "حل شده",
|
||||
"Recent Incidents": "حوادث اخیر",
|
||||
"Recent Maintenances": "تعمیرات اخیر",
|
||||
"Share this monitor using a link with others": "این مانیتور را با لینک با دیگران به اشتراک بگذارید",
|
||||
"Share": "اشتراکگذاری",
|
||||
"Some Systems are not working as expected": "برخی سامانهها بهدرستی کار نمیکنند",
|
||||
"Some Systems Degraded": "برخی سامانهها دچار اختلالاند",
|
||||
"Some Systems Down": "برخی سامانهها از کار افتادهاند",
|
||||
"Some Systems in Maintenance": "برخی سامانهها در حال تعمیر هستند",
|
||||
"Standard": "معمولی",
|
||||
"Started %startedAt, lasted for %lastedFor": "شروع در %startedAt، به مدت %lastedFor ادامه داشت",
|
||||
"Started %startedAt, still ongoing": "شروع در %startedAt، هنوز ادامه دارد",
|
||||
"Started %startedAt, will last for %lastedFor more": "شروع در %startedAt، تا %lastedFor دیگر ادامه خواهد داشت",
|
||||
"Starts %startedAt, will last for %lastedFor": "شروع در %startedAt، به مدت %lastedFor ادامه دارد",
|
||||
"Starts %startedAt": "شروع در %startedAt",
|
||||
"Status OK": "وضعیت خوب",
|
||||
"Status": "وضعیت",
|
||||
"Subscribe": "اشتراک",
|
||||
"Subscribe to Updates": "مشترک شدن در بهروزرسانیها",
|
||||
"Subscribe to all monitors": "اشتراک همه مانیتورها",
|
||||
"Switch to your timezone": "تغییر به منطقه زمانی شما",
|
||||
"Theme": "تم",
|
||||
"There are no upcoming maintenances": "هیچ تعمیر آیندهای وجود ندارد",
|
||||
"Timezone set to %tz": "منطقه زمانی روی %tz تنظیم شد",
|
||||
"Today": "امروز",
|
||||
"UP": "فعال",
|
||||
"Update Subscription": "بهروزرسانی اشتراک",
|
||||
"Upcoming Maintenance": "تعمیر آینده",
|
||||
"Upcoming Maintenances": "تعمیرات آینده",
|
||||
"Updates": "بهروزرسانیها",
|
||||
"Uptime": "زمان کارکرد",
|
||||
"View in detail": "مشاهده جزئیات",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "کدی به ایمیل شما ارسال کردیم. لطفاً برای تأیید ورود آن را وارد کنید.",
|
||||
"You are logged in as %email": "شما با ایمیل %email وارد شدهاید"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status pendant %duration",
|
||||
"14 Days": "14 jours",
|
||||
"30 Days": "30 jours",
|
||||
"60 Days": "60 jours",
|
||||
"7 Days": "7 jours",
|
||||
"90 Days": "90 jours",
|
||||
"120 Days": "120 jours",
|
||||
"150 Days": "150 jours",
|
||||
"180 Days": "180 jours",
|
||||
"Availability per Component": "Disponibilité par composant",
|
||||
"All Systems are Degraded": "Tous les systèmes sont dégradés",
|
||||
"All Systems are Down": "Tous les systèmes sont hors ligne",
|
||||
"All Systems are Operational": "Tous les systèmes sont opérationnels",
|
||||
"All Systems are in Maintenance": "Tous les systèmes sont en maintenance",
|
||||
"Back": "Retour",
|
||||
"Badge Copied": "Badge copié",
|
||||
"Badge": "Badge",
|
||||
"Browse Events": "Parcourir les événements",
|
||||
"Change Email": "Changer l'e-mail",
|
||||
"Code Copied": "Code copié",
|
||||
"Confirm Login": "Confirmer la connexion",
|
||||
"Copy Code": "Copier le code",
|
||||
"Copy Link": "Copier le lien",
|
||||
"DEGRADED": "Dégradé",
|
||||
"DOWN": "Hors ligne",
|
||||
"Dark": "Sombre",
|
||||
"Days": "Jours",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Intégrez ce moniteur dans votre application en utilisant <script> ou <iframe>.",
|
||||
"Embed": "Intégrer",
|
||||
"Enter the code": "Entrez le code",
|
||||
"Enter your email": "Entrez votre e-mail",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Entrez votre e-mail pour vous connecter. Si vous n'êtes pas abonné, vous serez invité à vous abonner.",
|
||||
"Get SVG badge for this monitor": "Obtenez un badge SVG pour ce moniteur",
|
||||
"Get a LIVE Status for this monitor": "Obtenez un statut LIVE pour ce moniteur",
|
||||
"IDENTIFIED": "Identifié",
|
||||
"INVESTIGATING": "En cours d'investigation",
|
||||
"Incident Updates": "Mises à jour des incidents",
|
||||
"LIVE Status": "Statut LIVE",
|
||||
"Lasted for about %lastedFor": "A duré environ %lastedFor",
|
||||
"Light": "Clair",
|
||||
"Link Copied": "Lien copié",
|
||||
"Login": "Connexion",
|
||||
"MAINTENANCE": "Maintenance",
|
||||
"MONITORING": "En surveillance",
|
||||
"Maintenance Completed": "Maintenance terminée",
|
||||
"Maintenance in Progress": "Maintenance en cours",
|
||||
"Manage Subscription": "Gérer l'abonnement",
|
||||
"Mode": "Mode",
|
||||
"No Data": "Pas de données",
|
||||
"No Incident in %date": "Pas d'incident le %date",
|
||||
"No Incidents": "Pas d'incidents",
|
||||
"No Monitor Found": "Aucun moniteur trouvé",
|
||||
"No Updates Yet": "Pas encore de mises à jour",
|
||||
"Ongoing Incidents": "Incidents en cours",
|
||||
"Pinging": "Ping en cours",
|
||||
"Please select specific monitors to receive updates from.": "Veuillez sélectionner les moniteurs spécifiques dont vous souhaitez recevoir des mises à jour.",
|
||||
"RESOLVED": "Résolu",
|
||||
"Recent Incidents": "Incidents récents",
|
||||
"Recent Maintenances": "Maintenances récentes",
|
||||
"Share this monitor using a link with others": "Partagez ce moniteur avec un lien à d'autres personnes",
|
||||
"Share": "Partager",
|
||||
"Some Systems are not working as expected": "Certains systèmes ne fonctionnent pas comme prévu",
|
||||
"Some Systems Degraded": "Certains systèmes sont dégradés",
|
||||
"Some Systems Down": "Certains systèmes sont hors ligne",
|
||||
"Some Systems in Maintenance": "Certains systèmes sont en maintenance",
|
||||
"Standard": "Standard",
|
||||
"Started %startedAt, lasted for %lastedFor": "Commencé il y a environ %startedAt, a duré environ %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Commencé il y a environ %startedAt, toujours en cours",
|
||||
"Started %startedAt, will last for %lastedFor more": "Commencé il y a environ %startedAt, durera environ %lastedFor de plus",
|
||||
"Starts %startedAt, will last for %lastedFor": "Commence dans %startedAt, durera environ %lastedFor",
|
||||
"Starts %startedAt": "Commence dans %startedAt",
|
||||
"Status OK": "Statut OK",
|
||||
"Status": "Statut",
|
||||
"Subscribe": "S'abonner",
|
||||
"Subscribe to Updates": "S'abonner aux mises à jour",
|
||||
"Subscribe to all monitors": "S'abonner à tous les moniteurs",
|
||||
"Switch to your timezone": "Passer à votre fuseau horaire",
|
||||
"Theme": "Thème",
|
||||
"There are no upcoming maintenances": "Il n'y a pas de maintenances à venir",
|
||||
"Timezone set to %tz": "Fuseau horaire défini sur %tz",
|
||||
"Today": "Aujourd'hui",
|
||||
"UP": "En ligne",
|
||||
"Update Subscription": "Mettre à jour l'abonnement",
|
||||
"Upcoming Maintenance": "Maintenance à venir",
|
||||
"Upcoming Maintenances": "Maintenances à venir",
|
||||
"Updates": "Mises à jour",
|
||||
"Uptime": "Temps de fonctionnement",
|
||||
"View in detail": "Voir en détail",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Nous avons envoyé un code à votre e-mail. Veuillez l'entrer ci-dessous pour confirmer votre connexion",
|
||||
"You are logged in as %email": "Vous êtes connecté en tant que %email"
|
||||
}
|
||||
+121
-90
@@ -1,92 +1,123 @@
|
||||
{
|
||||
"%status for %duration": "%duration के लिए %status",
|
||||
"14 Days": "14 दिन",
|
||||
"30 Days": "30 दिन",
|
||||
"60 Days": "60 दिन",
|
||||
"7 Days": "7 दिन",
|
||||
"90 Days": "90 दिन",
|
||||
"120 Days": "120 दिन",
|
||||
"150 Days": "150 दिन",
|
||||
"180 Days": "180 दिन",
|
||||
"Availability per Component": "प्रत्येक घटक की उपलब्धता",
|
||||
"All Systems are Degraded": "सभी सिस्टम क्षीण हैं",
|
||||
"All Systems are Down": "सभी सिस्टम डाउन हैं",
|
||||
"All Systems are Operational": "सभी सिस्टम कार्यरत हैं",
|
||||
"All Systems are in Maintenance": "सभी सिस्टम रखरखाव में हैं",
|
||||
"Back": "वापस",
|
||||
"Badge Copied": "बैज कॉपी किया गया",
|
||||
"Badge": "बैज",
|
||||
"Browse Events": "ईवेंट ब्राउज़ करें",
|
||||
"Change Email": "ईमेल बदलें",
|
||||
"Code Copied": "कोड कॉपी किया गया",
|
||||
"Confirm Login": "लॉगिन पुष्टि करें",
|
||||
"Copy Code": "कोड कॉपी करें",
|
||||
"Copy Link": "लिंक कॉपी करें",
|
||||
"DEGRADED": "क्षीण",
|
||||
"DOWN": "डाउन",
|
||||
"Dark": "डार्क",
|
||||
"Days": "दिन",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "इस मॉनिटर को अपनी ऐप में <script> या <iframe> का उपयोग करके एम्बेड करें।",
|
||||
"Embed": "एम्बेड",
|
||||
"Enter the code": "कोड दर्ज करें",
|
||||
"Enter your email": "अपना ईमेल दर्ज करें",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "लॉगिन करने के लिए अपना ईमेल दर्ज करें। यदि आप सब्सक्राइब नहीं हैं, तो आपको सब्सक्राइब करने के लिए कहा जाएगा।",
|
||||
"Get SVG badge for this monitor": "इस मॉनिटर के लिए SVG बैज प्राप्त करें",
|
||||
"Get a LIVE Status for this monitor": "इस मॉनिटर के लिए लाइव स्टेटस प्राप्त करें",
|
||||
"IDENTIFIED": "पहचाना गया",
|
||||
"INVESTIGATING": "जांच चल रही है",
|
||||
"Incident Updates": "घटना अपडेट",
|
||||
"LIVE Status": "लाइव स्टेटस",
|
||||
"Lasted for about %lastedFor": "%lastedFor तक चला",
|
||||
"Light": "लाइट",
|
||||
"Link Copied": "लिंक कॉपी किया गया",
|
||||
"Login": "लॉगिन",
|
||||
"MAINTENANCE": "मेंटेनेंस",
|
||||
"MONITORING": "निगरानी",
|
||||
"Maintenance Completed": "मेंटेनेंस पूर्ण हुआ",
|
||||
"Maintenance in Progress": "मेंटेनेंस जारी है",
|
||||
"Manage Subscription": "सब्सक्रिप्शन प्रबंधित करें",
|
||||
"Mode": "मोड",
|
||||
"No Data": "कोई डेटा नहीं",
|
||||
"No Incident in %date": "%date को कोई घटना नहीं",
|
||||
"No Incidents": "कोई घटना नहीं",
|
||||
"No Monitor Found": "कोई मॉनिटर नहीं मिला",
|
||||
"No Updates Yet": "अभी तक कोई अपडेट नहीं",
|
||||
"Ongoing Incidents": "चल रही घटनाएँ",
|
||||
"Pinging": "पिंगिंग",
|
||||
"Please select specific monitors to receive updates from.": "अपडेट प्राप्त करने के लिए विशिष्ट मॉनिटर चुनें।",
|
||||
"RESOLVED": "सुलझाया गया",
|
||||
"Recent Incidents": "हाल की घटनाएँ",
|
||||
"Recent Maintenances": "हाल की मेंटेनेंस",
|
||||
"Share this monitor using a link with others": "इस मॉनिटर को दूसरों के साथ लिंक के माध्यम से साझा करें",
|
||||
"Share": "साझा करें",
|
||||
"Some Systems are not working as expected": "कुछ सिस्टम अपेक्षित रूप से काम नहीं कर रहे हैं",
|
||||
"Some Systems Degraded": "कुछ सिस्टम क्षीण हैं",
|
||||
"Some Systems Down": "कुछ सिस्टम डाउन हैं",
|
||||
"Some Systems in Maintenance": "कुछ सिस्टम रखरखाव में हैं",
|
||||
"Standard": "मानक",
|
||||
"Started %startedAt, lasted for %lastedFor": "%startedAt शुरू हुआ, %lastedFor तक चला",
|
||||
"Started %startedAt, still ongoing": "%startedAt शुरू हुआ, अभी भी जारी है",
|
||||
"Started %startedAt, will last for %lastedFor more": "%startedAt शुरू होगा, %lastedFor और चलेगा",
|
||||
"Starts %startedAt, will last for %lastedFor": "%startedAt में शुरू होगा, %lastedFor तक चलेगा",
|
||||
"Starts %startedAt": "%startedAt में शुरू होगा",
|
||||
"Status OK": "स्थिति ठीक है",
|
||||
"Status": "स्थिति",
|
||||
"Subscribe": "सब्सक्राइब करें",
|
||||
"Subscribe to Updates": "अपडेट्स के लिए सब्सक्राइब करें",
|
||||
"Subscribe to all monitors": "सभी मॉनिटर को सब्सक्राइब करें",
|
||||
"Switch to your timezone": "अपने समय क्षेत्र में स्विच करें",
|
||||
"Theme": "थीम",
|
||||
"There are no upcoming maintenances": "कोई आगामी मेंटेनेंस नहीं है",
|
||||
"Timezone set to %tz": "समय क्षेत्र सेट किया गया %tz",
|
||||
"Today": "आज",
|
||||
"UP": "अप",
|
||||
"Update Subscription": "सब्सक्रिप्शन अपडेट करें",
|
||||
"Upcoming Maintenance": "आगामी मेंटेनेंस",
|
||||
"Upcoming Maintenances": "आगामी मेंटेनेंस सूची",
|
||||
"Updates": "अपडेट्स",
|
||||
"Uptime": "अपटाइम",
|
||||
"View in detail": "विस्तार में देखें",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "हमने आपके ईमेल पर एक कोड भेजा है। लॉगिन की पुष्टि करने के लिए इसे नीचे दर्ज करें",
|
||||
"You are logged in as %email": "आप %email के रूप में लॉग इन हैं"
|
||||
"name": "हिन्दी",
|
||||
"mappings": {
|
||||
"Under Maintenance": "रखरखाव जारी है",
|
||||
"All Systems Operational": "सभी सिस्टम चालू हैं",
|
||||
"Degraded Performance": "प्रदर्शन घटा हुआ है",
|
||||
"Partial Degraded Performance": "आंशिक रूप से प्रदर्शन घटा हुआ है",
|
||||
"Partial System Outage": "आंशिक सिस्टम आउटेज",
|
||||
"Major System Outage": "मुख्य सिस्टम आउटेज",
|
||||
"No Status Available": "कोई स्थिति उपलब्ध नहीं",
|
||||
"Maintenances": "रखरखाव",
|
||||
"Events": "घटनाएँ",
|
||||
"Select Language": "भाषा चुनें",
|
||||
"Incidents": "घटनाएँ",
|
||||
"Ongoing": "चल रहा है",
|
||||
"Upcoming": "आने वाला",
|
||||
"Past": "बीता हुआ",
|
||||
"Back": "वापस",
|
||||
"Subscribe": "सब्सक्राइब करें",
|
||||
"Available Components": "उपलब्ध घटक",
|
||||
"Minute-by-minute status data for this day": "इस दिन के लिए मिनट-दर-मिनट स्थिति डेटा",
|
||||
"Recent Incidents": "हालिया घटनाएँ",
|
||||
"Home": "होम",
|
||||
"Status": "स्थिति",
|
||||
"Latency": "लेटेंसी",
|
||||
"Failed to load latency data": "लेटेंसी डेटा लोड करने में विफल",
|
||||
"No incidents for this day": "इस दिन के लिए कोई घटना नहीं",
|
||||
"No maintenances for this day": "इस दिन के लिए कोई रखरखाव नहीं",
|
||||
"No latency data available for this day": "इस दिन के लिए कोई लेटेंसी डेटा उपलब्ध नहीं",
|
||||
"Latency Over Time": "समय के साथ लेटेंसी",
|
||||
"Average Latency": "औसत लेटेंसी",
|
||||
"Failed to load status data for this day": "इस दिन के लिए स्थिति डेटा लोड करने में विफल",
|
||||
"Per-Minute Status": "प्रति मिनट स्थिति",
|
||||
"Day Uptime": "दिन का अपटाइम",
|
||||
"Last Updated": "अंतिम अपडेट",
|
||||
"Latest Status": "नवीनतम स्थिति",
|
||||
"Latest Latency": "नवीनतम लेटेंसी",
|
||||
"Ongoing Incidents": "चल रही घटनाएँ",
|
||||
"Latency Trend": "लेटेंसी प्रवृत्ति",
|
||||
"Avg Latency": "औसत लेटेंसी",
|
||||
"Uptime": "अपटाइम",
|
||||
"Select Range": "रेंज चुनें",
|
||||
"Status history and latency trend": "स्थिति इतिहास और लेटेंसी प्रवृत्ति",
|
||||
"Timeline": "समयरेखा",
|
||||
"Start Time": "प्रारंभ समय",
|
||||
"End Time": "समाप्ति समय",
|
||||
"Duration": "अवधि",
|
||||
"UP": "चालू",
|
||||
"DOWN": "बंद",
|
||||
"MAINTENANCE": "रखरखाव",
|
||||
"NO_DATA": "कोई डेटा नहीं",
|
||||
"DEGRADED": "घटा हुआ",
|
||||
"INVESTIGATING": "जांच जारी",
|
||||
"IDENTIFIED": "पहचाना गया",
|
||||
"MONITORING": "निगरानी जारी",
|
||||
"RESOLVED": "हल हो गया",
|
||||
"No updates yet": "अभी तक कोई अपडेट नहीं",
|
||||
"Affected Monitors (%count)": "प्रभावित मॉनिटर (%count)",
|
||||
"No monitors affected": "कोई मॉनिटर प्रभावित नहीं",
|
||||
"Unknown impact": "अज्ञात प्रभाव",
|
||||
"Updates (%count)": "अपडेट (%count)",
|
||||
"Impact": "प्रभाव",
|
||||
"One-time": "एक बार",
|
||||
"In Progress": "प्रगति में",
|
||||
"Maintenance": "रखरखाव",
|
||||
"Total <br /> Maintenances": "कुल <br /> रखरखाव",
|
||||
"Total <br /> Incidents": "कुल <br /> घटनाएँ",
|
||||
"There are no incidents or maintenances scheduled for this month.": "इस महीने के लिए कोई घटना या रखरखाव निर्धारित नहीं है।",
|
||||
"No Events in %currentMonth": "%currentMonth में कोई घटना नहीं",
|
||||
"Ongoing <br /> Incidents": "चल रही <br /> घटनाएँ",
|
||||
"Ongoing <br /> Maintenances": "चल रहा <br /> रखरखाव",
|
||||
"Upcoming <br /> Maintenances": "आने वाला <br /> रखरखाव",
|
||||
"Copied": "कॉपी किया गया",
|
||||
"Badges": "बैज",
|
||||
"Get badges for this monitor": "इस मॉनिटर के लिए बैज प्राप्त करें",
|
||||
"Status Badge": "स्थिति बैज",
|
||||
"Uptime Badge": "अपटाइम बैज",
|
||||
"Live Status": "लाइव स्थिति",
|
||||
"Standard": "मानक",
|
||||
"Pinging": "पिंग हो रहा है",
|
||||
"Embed Monitor": "मॉनिटर एम्बेड करें",
|
||||
"Embed this monitor in your website or app": "इस मॉनिटर को अपनी वेबसाइट या ऐप में एम्बेड करें",
|
||||
"Status Embed": "स्थिति एम्बेड",
|
||||
"Latency Embed": "लेटेंसी एम्बेड",
|
||||
"Theme": "थीम",
|
||||
"Light": "लाइट",
|
||||
"Dark": "डार्क",
|
||||
"Format": "फॉर्मेट",
|
||||
"iFrame": "iFrame",
|
||||
"Script": "स्क्रिप्ट",
|
||||
"Failed to load data": "डेटा लोड करने में विफल",
|
||||
"90 Days": "90 दिन",
|
||||
"30 Days": "30 दिन",
|
||||
"7 Days": "7 दिन",
|
||||
"24 Hours": "24 घंटे",
|
||||
"Incident": "घटना",
|
||||
"Subscribe to Updates": "अपडेट के लिए सब्सक्राइब करें",
|
||||
"Get notified about incidents and scheduled maintenance.": "घटनाओं और निर्धारित रखरखाव के बारे में सूचित हों।",
|
||||
"Enter the verification code sent to your email.": "अपने ईमेल पर भेजा गया सत्यापन कोड दर्ज करें।",
|
||||
"Manage your notification preferences.": "अपनी सूचना प्राथमिकताएँ प्रबंधित करें।",
|
||||
"Loading your preferences...": "आपकी प्राथमिकताएँ लोड हो रही हैं...",
|
||||
"Email address": "ईमेल पता",
|
||||
"Please enter a valid email address": "कृपया एक मान्य ईमेल पता दर्ज करें",
|
||||
"Failed to send verification code": "सत्यापन कोड भेजने में विफल",
|
||||
"Network error. Please try again.": "नेटवर्क त्रुटि। कृपया पुनः प्रयास करें।",
|
||||
"Sending...": "भेजा जा रहा है...",
|
||||
"Continue": "जारी रखें",
|
||||
"We sent a 6-digit code to": "हमने 6 अंकों का कोड भेजा है",
|
||||
"Please enter the 6-digit verification code": "कृपया 6 अंकों का सत्यापन कोड दर्ज करें",
|
||||
"Verification failed": "सत्यापन विफल रहा",
|
||||
"Didn't receive the code? Resend": "कोड नहीं मिला? फिर से भेजें",
|
||||
"Incident Updates": "घटना अपडेट",
|
||||
"Get notified about incidents updates": "घटना अपडेट के बारे में सूचित हों",
|
||||
"Maintenance Updates": "रखरखाव अपडेट",
|
||||
"Get notified about scheduled maintenance": "निर्धारित रखरखाव के बारे में सूचित हों",
|
||||
"Failed to update preference": "प्राथमिकता अपडेट करने में विफल",
|
||||
"No ongoing maintenances": "कोई चल रहा रखरखाव नहीं",
|
||||
"No upcoming maintenances": "कोई आने वाला रखरखाव नहीं",
|
||||
"No past maintenances": "कोई बीता हुआ रखरखाव नहीं",
|
||||
"Read more": "और पढ़ें",
|
||||
"Read less": "कम पढ़ें"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status per %duration",
|
||||
"120 Days": "120 Giorni",
|
||||
"14 Days": "14 Giorni",
|
||||
"150 Days": "150 Giorni",
|
||||
"180 Days": "180 Giorni",
|
||||
"30 Days": "30 Giorni",
|
||||
"60 Days": "60 Giorni",
|
||||
"7 Days": "7 Giorni",
|
||||
"90 Days": "90 Giorni",
|
||||
"Availability per Component": "Disponibilità per componente",
|
||||
"All Systems are Degraded": "Tutti i sistemi sono degradati",
|
||||
"All Systems are Down": "Tutti i sistemi sono inattivi",
|
||||
"All Systems are Operational": "Tutti i sistemi sono operativi",
|
||||
"All Systems are in Maintenance": "Tutti i sistemi sono in manutenzione",
|
||||
"Back": "Indietro",
|
||||
"Badge Copied": "Badge copiato",
|
||||
"Badge": "Badge",
|
||||
"Browse Events": "Sfoglia eventi",
|
||||
"Change Email": "Cambia email",
|
||||
"Code Copied": "Codice copiato",
|
||||
"Confirm Login": "Conferma accesso",
|
||||
"Copy Code": "Copia codice",
|
||||
"Copy Link": "Copia link",
|
||||
"DEGRADED": "DEGRADATO",
|
||||
"DOWN": "NON DISPONIBILE",
|
||||
"Dark": "Scuro",
|
||||
"Days": "Giorni",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Incorpora questo monitor usando <script> o <iframe> nella tua app.",
|
||||
"Embed": "Incorpora",
|
||||
"Enter the code": "Inserisci il codice",
|
||||
"Enter your email": "Inserisci la tua email",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Inserisci la tua email per accedere. Se non sei iscritto, ti verrà chiesto di iscriverti.",
|
||||
"Get SVG badge for this monitor": "Ottieni badge SVG per questo monitor",
|
||||
"Get a LIVE Status for this monitor": "Ottieni lo stato LIVE per questo monitor",
|
||||
"IDENTIFIED": "IDENTIFICATO",
|
||||
"INVESTIGATING": "IN ANALISI",
|
||||
"Incident Updates": "Aggiornamenti incidenti",
|
||||
"LIVE Status": "Stato LIVE",
|
||||
"Lasted for about %lastedFor": "Durato circa %lastedFor",
|
||||
"Light": "Chiaro",
|
||||
"Link Copied": "Link copiato",
|
||||
"Login": "Accedi",
|
||||
"MAINTENANCE": "MANUTENZIONE",
|
||||
"MONITORING": "MONITORAGGIO",
|
||||
"Maintenance Completed": "Manutenzione completata",
|
||||
"Maintenance in Progress": "Manutenzione in corso",
|
||||
"Manage Subscription": "Gestisci iscrizione",
|
||||
"Mode": "Modalità",
|
||||
"No Data": "Nessun dato",
|
||||
"No Incident in %date": "Nessun incidente in %date",
|
||||
"No Incidents": "Nessun incidente",
|
||||
"No Monitor Found": "Nessun monitor trovato",
|
||||
"No Updates Yet": "Nessun aggiornamento ancora",
|
||||
"Ongoing Incidents": "Incidenti in corso",
|
||||
"Pinging": "Ping in corso",
|
||||
"Please select specific monitors to receive updates from.": "Seleziona i monitor specifici da cui ricevere aggiornamenti.",
|
||||
"RESOLVED": "RISOLTO",
|
||||
"Recent Incidents": "Incidenti recenti",
|
||||
"Recent Maintenances": "Manutenzioni recenti",
|
||||
"Share this monitor using a link with others": "Condividi questo monitor tramite un link con altri",
|
||||
"Share": "Condividi",
|
||||
"Some Systems are not working as expected": "Alcuni sistemi non funzionano come previsto",
|
||||
"Some Systems Degraded": "Alcuni sistemi degradati",
|
||||
"Some Systems Down": "Alcuni sistemi inattivi",
|
||||
"Some Systems in Maintenance": "Alcuni sistemi in manutenzione",
|
||||
"Standard": "Standard",
|
||||
"Started %startedAt, lasted for %lastedFor": "Iniziato il %startedAt, durato %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Iniziato il %startedAt, ancora in corso",
|
||||
"Started %startedAt, will last for %lastedFor more": "Iniziato il %startedAt, durerà ancora %lastedFor",
|
||||
"Starts %startedAt, will last for %lastedFor": "Inizia il %startedAt, durerà %lastedFor",
|
||||
"Starts %startedAt": "Inizia il %startedAt",
|
||||
"Status OK": "Stato OK",
|
||||
"Status": "Stato",
|
||||
"Subscribe": "Iscriviti",
|
||||
"Subscribe to Updates": "Iscriviti agli aggiornamenti",
|
||||
"Subscribe to all monitors": "Iscriviti a tutti i monitor",
|
||||
"Switch to your timezone": "Passa al tuo fuso orario",
|
||||
"Theme": "Tema",
|
||||
"There are no upcoming maintenances": "Non ci sono manutenzioni imminenti",
|
||||
"Timezone set to %tz": "Fuso orario impostato su %tz",
|
||||
"Today": "Oggi",
|
||||
"UP": "ATTIVO",
|
||||
"Update Subscription": "Aggiorna iscrizione",
|
||||
"Upcoming Maintenance": "Manutenzione imminente",
|
||||
"Upcoming Maintenances": "Manutenzioni imminenti",
|
||||
"Updates": "Aggiornamenti",
|
||||
"Uptime": "Tempo di attività",
|
||||
"View in detail": "Visualizza nel dettaglio",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Abbiamo inviato un codice alla tua email. Inseriscilo qui sotto per confermare l'accesso",
|
||||
"You are logged in as %email": "Sei connesso come %email"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%duration の間 %status",
|
||||
"120 Days": "120日間",
|
||||
"14 Days": "14日間",
|
||||
"150 Days": "150日間",
|
||||
"180 Days": "180日間",
|
||||
"30 Days": "30日間",
|
||||
"60 Days": "60日間",
|
||||
"7 Days": "7日間",
|
||||
"90 Days": "90日間",
|
||||
"Availability per Component": "コンポーネントごとの可用性",
|
||||
"All Systems are Degraded": "すべてのシステムが劣化しています",
|
||||
"All Systems are Down": "すべてのシステムがダウンしています",
|
||||
"All Systems are Operational": "すべてのシステムが正常に稼働しています",
|
||||
"All Systems are in Maintenance": "すべてのシステムがメンテナンス中です",
|
||||
"Back": "戻る",
|
||||
"Badge Copied": "バッジがコピーされました",
|
||||
"Badge": "バッジ",
|
||||
"Browse Events": "イベントを閲覧",
|
||||
"Change Email": "メールを変更",
|
||||
"Code Copied": "コードがコピーされました",
|
||||
"Confirm Login": "ログインを確認",
|
||||
"Copy Code": "コードをコピー",
|
||||
"Copy Link": "リンクをコピー",
|
||||
"DEGRADED": "劣化",
|
||||
"DOWN": "ダウン",
|
||||
"Dark": "ダーク",
|
||||
"Days": "日間",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "このモニターをアプリに <script> または <iframe> を使用して埋め込む。",
|
||||
"Embed": "埋め込み",
|
||||
"Enter the code": "コードを入力してください",
|
||||
"Enter your email": "メールアドレスを入力してください",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "ログインするにはメールアドレスを入力してください。登録されていない場合は、購読を促されます。",
|
||||
"Get SVG badge for this monitor": "このモニターのSVGバッジを取得",
|
||||
"Get a LIVE Status for this monitor": "このモニターのライブステータスを取得",
|
||||
"IDENTIFIED": "識別済み",
|
||||
"INVESTIGATING": "調査中",
|
||||
"Incident Updates": "インシデント更新",
|
||||
"LIVE Status": "ライブステータス",
|
||||
"Lasted for about %lastedFor": "約 %lastedFor 続きました",
|
||||
"Light": "ライト",
|
||||
"Link Copied": "リンクがコピーされました",
|
||||
"Login": "ログイン",
|
||||
"MAINTENANCE": "メンテナンス",
|
||||
"MONITORING": "モニタリング中",
|
||||
"Maintenance Completed": "メンテナンス完了",
|
||||
"Maintenance in Progress": "メンテナンス中",
|
||||
"Manage Subscription": "購読を管理",
|
||||
"Mode": "モード",
|
||||
"No Data": "データなし",
|
||||
"No Incident in %date": "%date にインシデントなし",
|
||||
"No Incidents": "インシデントなし",
|
||||
"No Monitor Found": "モニターが見つかりません",
|
||||
"No Updates Yet": "まだ更新はありません",
|
||||
"Ongoing Incidents": "進行中のインシデント",
|
||||
"Pinging": "ピング中",
|
||||
"Please select specific monitors to receive updates from.": "更新を受け取る特定のモニターを選択してください。",
|
||||
"RESOLVED": "解決済み",
|
||||
"Recent Incidents": "最近のインシデント",
|
||||
"Recent Maintenances": "最近のメンテナンス",
|
||||
"Share this monitor using a link with others": "このモニターをリンクで他の人と共有",
|
||||
"Share": "共有",
|
||||
"Some Systems are not working as expected": "一部のシステムが期待通りに動作していません",
|
||||
"Some Systems Degraded": "一部のシステムが劣化しています",
|
||||
"Some Systems Down": "一部のシステムがダウンしています",
|
||||
"Some Systems in Maintenance": "いくつかのシステムがメンテナンス中です",
|
||||
"Standard": "標準",
|
||||
"Started %startedAt, lasted for %lastedFor": "%startedAt 前に開始し、約 %lastedFor 続きました",
|
||||
"Started %startedAt, still ongoing": "%startedAt 前に開始し、まだ進行中です",
|
||||
"Started %startedAt, will last for %lastedFor more": "%startedAt 前に開始し、さらに %lastedFor 続きます",
|
||||
"Starts %startedAt, will last for %lastedFor": "%startedAt 後に開始し、約 %lastedFor 続きます",
|
||||
"Starts %startedAt": "%startedAt 後に開始",
|
||||
"Status OK": "ステータス正常",
|
||||
"Status": "ステータス",
|
||||
"Subscribe": "購読する",
|
||||
"Subscribe to Updates": "更新を購読する",
|
||||
"Subscribe to all monitors": "すべてのモニターを購読する",
|
||||
"Switch to your timezone": "あなたのタイムゾーンに切り替え",
|
||||
"Theme": "テーマ",
|
||||
"There are no upcoming maintenances": "予定されているメンテナンスはありません",
|
||||
"Timezone set to %tz": "タイムゾーンを %tz に設定",
|
||||
"Today": "今日",
|
||||
"UP": "稼働中",
|
||||
"Update Subscription": "購読を更新する",
|
||||
"Upcoming Maintenance": "今後のメンテナンス",
|
||||
"Upcoming Maintenances": "今後のメンテナンス一覧",
|
||||
"Updates": "更新",
|
||||
"Uptime": "稼働時間",
|
||||
"View in detail": "詳細を表示",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "メールにコードを送信しました。ログインを確認するには、以下に入力してください",
|
||||
"You are logged in as %email": "%email としてログインしています"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%duration 동안 %status 상태",
|
||||
"120 Days": "120일",
|
||||
"14 Days": "14일",
|
||||
"150 Days": "150일",
|
||||
"180 Days": "180일",
|
||||
"30 Days": "30일",
|
||||
"60 Days": "60일",
|
||||
"7 Days": "7일",
|
||||
"90 Days": "90일",
|
||||
"Availability per Component": "항목 당 가용성",
|
||||
"All Systems are Degraded": "모든 시스템이 성능 저하 상태입니다",
|
||||
"All Systems are Down": "모든 시스템이 중단되었습니다",
|
||||
"All Systems are Operational": "모든 시스템이 정상 작동 중입니다",
|
||||
"All Systems are in Maintenance": "모든 시스템이 유지 보수 중입니다",
|
||||
"Back": "뒤로",
|
||||
"Badge Copied": "배지 복사 됨",
|
||||
"Badge": "배지",
|
||||
"Browse Events": "이벤트 찾아보기",
|
||||
"Change Email": "이메일 변경",
|
||||
"Code Copied": "소스 코드 복사됨",
|
||||
"Confirm Login": "로그인 확인",
|
||||
"Copy Code": "소스 코드 복사",
|
||||
"Copy Link": "링크 복사",
|
||||
"DEGRADED": "성능 저하됨",
|
||||
"DOWN": "중단",
|
||||
"Dark": "다크",
|
||||
"Days": "일",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "<script> 나 <iframe> 태그를 사용하여 내 앱에 이 모니터링을 임베딩 해보세요.",
|
||||
"Embed": "임베드",
|
||||
"Enter the code": "코드를 입력하세요",
|
||||
"Enter your email": "이메일을 입력하세요",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "로그인하려면 이메일을 입력하세요. 구독하지 않은 경우 구독 요청이 표시됩니다.",
|
||||
"Get SVG badge for this monitor": "이 모니터링 항목에 대한 SVG 배지를 얻어보세요.",
|
||||
"Get a LIVE Status for this monitor": "이 모니터링 항목에 대한 실시간 상태를 얻어보세요.",
|
||||
"IDENTIFIED": "확인 됨",
|
||||
"INVESTIGATING": "조사 중",
|
||||
"Incident Updates": "사건 보고서",
|
||||
"LIVE Status": "실시간 상태",
|
||||
"Lasted for about %lastedFor": "%lastedFor 동안 지속",
|
||||
"Light": "밝게",
|
||||
"Link Copied": "링크 복사 됨",
|
||||
"Login": "로그인",
|
||||
"MAINTENANCE": "유지보수",
|
||||
"MONITORING": "감시 중",
|
||||
"Maintenance Completed": "유지 보수 완료",
|
||||
"Maintenance in Progress": "유지 보수 진행 중",
|
||||
"Manage Subscription": "구독 관리",
|
||||
"Mode": "모드",
|
||||
"No Data": "데이터 없음",
|
||||
"No Incident in %date": "%date에는 아무 사건도 없었음",
|
||||
"No Incidents": "사건 없음",
|
||||
"No Monitor Found": "모니터링 항목을 찾을 수 없음",
|
||||
"No Updates Yet": "아직 아무 업데이트도 없음",
|
||||
"Ongoing Incidents": "진행 중 사건",
|
||||
"Pinging": "핑 요청",
|
||||
"Please select specific monitors to receive updates from.": "업데이트를 받을 특정 모니터를 선택하세요.",
|
||||
"RESOLVED": "해결 됨",
|
||||
"Recent Incidents": "최근 사건",
|
||||
"Recent Maintenances": "최근 유지 보수",
|
||||
"Share this monitor using a link with others": "링크를 사용하여 다른 사람들과 이 모니터링 데이터를 공유해보세요",
|
||||
"Share": "공유",
|
||||
"Some Systems are not working as expected": "일부 시스템이 예상대로 작동하지 않습니다",
|
||||
"Some Systems Degraded": "일부 시스템이 성능 저하 상태입니다",
|
||||
"Some Systems Down": "일부 시스템이 중단되었습니다",
|
||||
"Some Systems in Maintenance": "일부 시스템이 유지 보수 중입니다",
|
||||
"Standard": "기본",
|
||||
"Started %startedAt, lasted for %lastedFor": "%startedAt에 시작되었으며, %lastedFor 동안 지속되고 있습니다",
|
||||
"Started %startedAt, still ongoing": "%startedAt에 시작되었으며, 아직 진행 중입니다",
|
||||
"Started %startedAt, will last for %lastedFor more": "%startedAt에 시작되었으며, %lastedFor 간 더 지속될 예정입니다",
|
||||
"Starts %startedAt, will last for %lastedFor": "%startedAt에 시작되며, %lastedFor 간 지속될 예정입니다",
|
||||
"Starts %startedAt": "%startedAt에 시작되었습니다",
|
||||
"Status OK": "양호",
|
||||
"Status": "상태",
|
||||
"Subscribe": "구독",
|
||||
"Subscribe to Updates": "업데이트 구독하기",
|
||||
"Subscribe to all monitors": "모든 모니터 구독",
|
||||
"Switch to your timezone": "내 시간대로 변경",
|
||||
"Theme": "테마",
|
||||
"There are no upcoming maintenances": "예정된 유지 보수가 없습니다",
|
||||
"Timezone set to %tz": "%tz(으)로 시간대 설정",
|
||||
"Today": "오늘",
|
||||
"UP": "작동 중",
|
||||
"Update Subscription": "구독 업데이트",
|
||||
"Upcoming Maintenance": "예정된 유지 보수",
|
||||
"Upcoming Maintenances": "예정된 유지 보수 목록",
|
||||
"Updates": "업데이트",
|
||||
"Uptime": "업타임",
|
||||
"View in detail": "자세히 보기",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "이메일로 코드를 보냈습니다. 로그인을 확인하려면 아래에 입력하세요",
|
||||
"You are logged in as %email": "%email로 로그인했습니다"
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
[
|
||||
{
|
||||
"code": "en",
|
||||
"name": "English"
|
||||
},
|
||||
{
|
||||
"code": "hi",
|
||||
"name": "हिन्दी"
|
||||
},
|
||||
{
|
||||
"code": "zh-CN",
|
||||
"name": "中文"
|
||||
},
|
||||
{
|
||||
"code": "ja",
|
||||
"name": "日本語"
|
||||
},
|
||||
{
|
||||
"code": "vi",
|
||||
"name": "Tiếng Việt"
|
||||
},
|
||||
{
|
||||
"code": "fr",
|
||||
"name": "Français"
|
||||
},
|
||||
{
|
||||
"code": "de",
|
||||
"name": "Deutsch"
|
||||
},
|
||||
{
|
||||
"code": "ru",
|
||||
"name": "Русский"
|
||||
},
|
||||
{
|
||||
"code": "dk",
|
||||
"name": "Dansk"
|
||||
},
|
||||
{
|
||||
"code": "nl",
|
||||
"name": "Nederlands"
|
||||
},
|
||||
{
|
||||
"code": "ko",
|
||||
"name": "한국어"
|
||||
},
|
||||
{
|
||||
"code": "pt-BR",
|
||||
"name": "Português Brasileiro"
|
||||
},
|
||||
{
|
||||
"code": "tr",
|
||||
"name": "Türkçe"
|
||||
},
|
||||
{
|
||||
"code": "nb-NO",
|
||||
"name": "Norsk Bokmål"
|
||||
},
|
||||
{
|
||||
"code": "pl",
|
||||
"name": "Polski"
|
||||
},
|
||||
{
|
||||
"code": "es",
|
||||
"name": "Español"
|
||||
},
|
||||
{
|
||||
"code": "it",
|
||||
"name": "Italiano"
|
||||
},
|
||||
{
|
||||
"code": "fa",
|
||||
"name": "Persian (فارسی)"
|
||||
}
|
||||
]
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status i %duration",
|
||||
"14 Days": "14 dager",
|
||||
"30 Days": "30 dager",
|
||||
"60 Days": "60 dager",
|
||||
"7 Days": "7 dager",
|
||||
"90 Days": "90 dager",
|
||||
"120 Days": "120 dager",
|
||||
"150 Days": "150 dager",
|
||||
"180 Days": "180 dager",
|
||||
"Availability per Component": "Tilgjengelighet per komponent",
|
||||
"All Systems are Degraded": "Alle systemer har nedsatt ytelse",
|
||||
"All Systems are Down": "Alle systemer er nede",
|
||||
"All Systems are Operational": "Alle systemer er operative",
|
||||
"All Systems are in Maintenance": "Alle systemer er til vedlikehold",
|
||||
"Back": "Tilbake",
|
||||
"Badge Copied": "Merke kopiert",
|
||||
"Badge": "Merke",
|
||||
"Browse Events": "Bla gjennom hendelser",
|
||||
"Change Email": "Endre e-post",
|
||||
"Code Copied": "Kode kopiert",
|
||||
"Confirm Login": "Bekreft pålogging",
|
||||
"Copy Code": "Kopier kode",
|
||||
"Copy Link": "Kopier lenke",
|
||||
"DEGRADED": "NEDSATT",
|
||||
"DOWN": "NEDE",
|
||||
"Dark": "Mørk",
|
||||
"Days": "Dager",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Bygg inn denne monitoren ved å bruke <script> eller <iframe> i appen din.",
|
||||
"Embed": "Bygg inn",
|
||||
"Enter the code": "Skriv inn koden",
|
||||
"Enter your email": "Skriv inn din e-post",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Skriv inn din e-post for å logge inn. Hvis du ikke er abonnent, vil du bli bedt om å abonnere.",
|
||||
"Get SVG badge for this monitor": "Hent SVG-merke for denne monitoren",
|
||||
"Get a LIVE Status for this monitor": "Få en LIVE-status for denne monitoren",
|
||||
"IDENTIFIED": "IDENTIFISERT",
|
||||
"INVESTIGATING": "UNDERSØKER",
|
||||
"Incident Updates": "Hendelsesoppdateringer",
|
||||
"LIVE Status": "LIVE-status",
|
||||
"Lasted for about %lastedFor": "Varte i omtrent %lastedFor",
|
||||
"Light": "Lys",
|
||||
"Link Copied": "Lenke kopiert",
|
||||
"Login": "Logg inn",
|
||||
"MAINTENANCE": "VEDLIKEHOLD",
|
||||
"MONITORING": "OVERVÅKER",
|
||||
"Maintenance Completed": "Vedlikehold fullført",
|
||||
"Maintenance in Progress": "Vedlikehold pågår",
|
||||
"Manage Subscription": "Administrer abonnement",
|
||||
"Mode": "Modus",
|
||||
"No Data": "Ingen data",
|
||||
"No Incident in %date": "Ingen hendelser på %date",
|
||||
"No Incidents": "Ingen hendelser",
|
||||
"No Monitor Found": "Ingen monitor funnet",
|
||||
"No Updates Yet": "Ingen oppdateringer ennå",
|
||||
"Ongoing Incidents": "Pågående hendelser",
|
||||
"Pinging": "Pinger",
|
||||
"Please select specific monitors to receive updates from.": "Vennligst velg spesifikke monitorer å motta oppdateringer fra.",
|
||||
"RESOLVED": "LØST",
|
||||
"Recent Incidents": "Nylige hendelser",
|
||||
"Recent Maintenances": "Nylige vedlikehold",
|
||||
"Share this monitor using a link with others": "Del denne monitoren med andre via lenke",
|
||||
"Share": "Del",
|
||||
"Some Systems are not working as expected": "Noen systemer fungerer ikke som forventet",
|
||||
"Some Systems Degraded": "Noen systemer har nedsatt ytelse",
|
||||
"Some Systems Down": "Noen systemer er nede",
|
||||
"Some Systems in Maintenance": "Noen systemer er til vedlikehold",
|
||||
"Standard": "Standard",
|
||||
"Started %startedAt, lasted for %lastedFor": "Startet %startedAt, varte i %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Startet %startedAt, fortsatt pågår",
|
||||
"Started %startedAt, will last for %lastedFor more": "Startet %startedAt, vil vare i %lastedFor til",
|
||||
"Starts %startedAt, will last for %lastedFor": "Starter %startedAt, vil vare i %lastedFor",
|
||||
"Starts %startedAt": "Starter %startedAt",
|
||||
"Status OK": "Status OK",
|
||||
"Status": "Status",
|
||||
"Subscribe": "Abonner",
|
||||
"Subscribe to Updates": "Abonner på oppdateringer",
|
||||
"Subscribe to all monitors": "Abonner på alle monitorer",
|
||||
"Switch to your timezone": "Bytt til din tidssone",
|
||||
"Theme": "Tema",
|
||||
"There are no upcoming maintenances": "Det er ingen kommende vedlikeholdsperioder",
|
||||
"Timezone set to %tz": "Tidssone satt til %tz",
|
||||
"Today": "I dag",
|
||||
"UP": "OPPE",
|
||||
"Update Subscription": "Oppdater abonnement",
|
||||
"Upcoming Maintenance": "Kommende vedlikehold",
|
||||
"Upcoming Maintenances": "Kommende vedlikeholdsperioder",
|
||||
"Updates": "Oppdateringer",
|
||||
"Uptime": "Oppetid",
|
||||
"View in detail": "Vis detaljer",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Vi har sendt en kode til din e-post. Vennligst skriv den inn nedenfor for å bekrefte påloggingen",
|
||||
"You are logged in as %email": "Du er logget inn som %email"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status voor %duration",
|
||||
"120 Days": "120 dagen",
|
||||
"14 Days": "14 dagen",
|
||||
"150 Days": "150 dagen",
|
||||
"180 Days": "180 dagen",
|
||||
"30 Days": "30 dagen",
|
||||
"60 Days": "60 dagen",
|
||||
"7 Days": "7 dagen",
|
||||
"90 Days": "90 dagen",
|
||||
"Availability per Component": "Beschikbaarheid per component",
|
||||
"All Systems are Degraded": "Alle systemen werken met beperkte functionaliteit",
|
||||
"All Systems are Down": "Alle systemen zijn niet bereikbaar",
|
||||
"All Systems are Operational": "Alle systemen zijn operationeel",
|
||||
"All Systems are in Maintenance": "Alle systemen zijn in onderhoud",
|
||||
"Back": "Terug",
|
||||
"Badge Copied": "Badge gekopieerd",
|
||||
"Badge": "Badge",
|
||||
"Browse Events": "Evenementen bekijken",
|
||||
"Change Email": "E-mail wijzigen",
|
||||
"Code Copied": "Code gekopieerd",
|
||||
"Confirm Login": "Inloggen bevestigen",
|
||||
"Copy Code": "Kopieer code",
|
||||
"Copy Link": "Kopieer link",
|
||||
"DEGRADED": "BEPERKT",
|
||||
"DOWN": "NIET BEREIKBAAR",
|
||||
"Dark": "Donker",
|
||||
"Days": "Dagen",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Sluit deze monitor in met behulp van <script> of <iframe> in je app.",
|
||||
"Embed": "Insluiten",
|
||||
"Enter the code": "Voer de code in",
|
||||
"Enter your email": "Voer je e-mailadres in",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Voer je e-mailadres in om in te loggen. Als je nog niet geabonneerd bent, word je gevraagd om je te abonneren.",
|
||||
"Get SVG badge for this monitor": "SVG-badge ophalen voor deze monitor",
|
||||
"Get a LIVE Status for this monitor": "LIVE-status ophalen voor deze monitor",
|
||||
"IDENTIFIED": "GEIDENTIFICEERD",
|
||||
"INVESTIGATING": "ONDERZOEK BEZIG",
|
||||
"Incident Updates": "Incident updates",
|
||||
"LIVE Status": "LIVE status",
|
||||
"Lasted for about %lastedFor": "Duurde ongeveer %lastedFor",
|
||||
"Light": "Licht",
|
||||
"Link Copied": "Link gekopieerd",
|
||||
"Login": "Inloggen",
|
||||
"MAINTENANCE": "ONDERHOUD",
|
||||
"MONITORING": "MONITOREN",
|
||||
"Maintenance Completed": "Onderhoud voltooid",
|
||||
"Maintenance in Progress": "Onderhoud bezig",
|
||||
"Manage Subscription": "Abonnement beheren",
|
||||
"Mode": "Modus",
|
||||
"No Data": "Geen gegevens",
|
||||
"No Incident in %date": "Geen incident op %date",
|
||||
"No Incidents": "Geen incidenten",
|
||||
"No Monitor Found": "Geen monitor gevonden",
|
||||
"No Updates Yet": "Nog geen updates",
|
||||
"Ongoing Incidents": "Lopende incidenten",
|
||||
"Pinging": "Pingen",
|
||||
"Please select specific monitors to receive updates from.": "Selecteer specifieke monitoren waarvan je updates wilt ontvangen.",
|
||||
"RESOLVED": "OPGELOST",
|
||||
"Recent Incidents": "Recente incidenten",
|
||||
"Recent Maintenances": "Recente onderhoudsbeurten",
|
||||
"Share this monitor using a link with others": "Deel deze monitor met anderen via een link",
|
||||
"Share": "Delen",
|
||||
"Some Systems are not working as expected": "Sommige systemen werken niet zoals verwacht",
|
||||
"Some Systems Degraded": "Sommige systemen werken met beperkte functionaliteit",
|
||||
"Some Systems Down": "Sommige systemen zijn niet bereikbaar",
|
||||
"Some Systems in Maintenance": "Sommige systemen zijn in onderhoud",
|
||||
"Standard": "Standaard",
|
||||
"Started %startedAt, lasted for %lastedFor": "Begonnen ongeveer %startedAt geleden, duurde ongeveer %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Begonnen ongeveer %startedAt geleden, nog steeds bezig",
|
||||
"Started %startedAt, will last for %lastedFor more": "Begint %startedAt, zal nog ongeveer %lastedFor duren",
|
||||
"Starts %startedAt, will last for %lastedFor": "Begint over %startedAt, zal ongeveer %lastedFor duren",
|
||||
"Starts %startedAt": "Begint over %startedAt",
|
||||
"Status OK": "Status OK",
|
||||
"Status": "Status",
|
||||
"Subscribe": "Abonneren",
|
||||
"Subscribe to Updates": "Abonneren op updates",
|
||||
"Subscribe to all monitors": "Abonneren op alle monitoren",
|
||||
"Switch to your timezone": "Schakel over naar je tijdzone",
|
||||
"Theme": "Thema",
|
||||
"There are no upcoming maintenances": "Er zijn geen geplande onderhoudsperiodes",
|
||||
"Timezone set to %tz": "Tijdzone ingesteld op %tz",
|
||||
"Today": "Vandaag",
|
||||
"UP": "BEREIKBAAR",
|
||||
"Update Subscription": "Abonnement bijwerken",
|
||||
"Upcoming Maintenance": "Aankomend onderhoud",
|
||||
"Upcoming Maintenances": "Aankomende onderhoudsperiodes",
|
||||
"Updates": "Updates",
|
||||
"Uptime": "Uptime",
|
||||
"View in detail": "Bekijk in detail",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "We hebben een code naar je e-mailadres gestuurd. Voer deze hieronder in om je login te bevestigen",
|
||||
"You are logged in as %email": "Je bent ingelogd als %email"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status przez %duration",
|
||||
"120 Days": "120 dni",
|
||||
"14 Days": "14 dni",
|
||||
"150 Days": "150 dni",
|
||||
"180 Days": "180 dni",
|
||||
"30 Days": "30 dni",
|
||||
"60 Days": "60 dni",
|
||||
"7 Days": "7 dni",
|
||||
"90 Days": "90 dni",
|
||||
"Availability per Component": "Dostępność według komponentu",
|
||||
"All Systems are Degraded": "Wszystkie systemy działają z ograniczeniami",
|
||||
"All Systems are Down": "Wszystkie systemy są niedostępne",
|
||||
"All Systems are Operational": "Wszystkie systemy działają poprawnie",
|
||||
"All Systems are in Maintenance": "Wszystkie systemy są w konserwacji",
|
||||
"Back": "Wstecz",
|
||||
"Badge Copied": "Odznaka skopiowana",
|
||||
"Badge": "Odznaka",
|
||||
"Browse Events": "Przeglądaj zdarzenia",
|
||||
"Change Email": "Zmień email",
|
||||
"Code Copied": "Kod skopiowany",
|
||||
"Confirm Login": "Potwierdź logowanie",
|
||||
"Copy Code": "Skopiuj kod",
|
||||
"Copy Link": "Skopiuj link",
|
||||
"DEGRADED": "OGRANICZONA",
|
||||
"DOWN": "NIEDOSTĘPNY",
|
||||
"Dark": "Ciemny",
|
||||
"Days": "Dni",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Osadź ten monitor za pomocą <script> lub <iframe> w swojej aplikacji.",
|
||||
"Embed": "Osadź",
|
||||
"Enter the code": "Wprowadź kod",
|
||||
"Enter your email": "Wprowadź swój email",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Wprowadź swój email, aby się zalogować. Jeśli nie masz subskrypcji, zostaniesz poproszony o jej utworzenie.",
|
||||
"Get SVG badge for this monitor": "Pobierz odznakę SVG dla tego monitora",
|
||||
"Get a LIVE Status for this monitor": "Uzyskaj STATUS NA ŻYWO tego monitora",
|
||||
"IDENTIFIED": "ZIDENTYFIKOWANE",
|
||||
"INVESTIGATING": "BADANE",
|
||||
"Incident Updates": "Aktualizacje incydentu",
|
||||
"LIVE Status": "Status NA ŻYWO",
|
||||
"Lasted for about %lastedFor": "Trwało około %lastedFor",
|
||||
"Light": "Jasny",
|
||||
"Link Copied": "Link skopiowany",
|
||||
"Login": "Zaloguj się",
|
||||
"MAINTENANCE": "KONSERWACJA",
|
||||
"MONITORING": "MONITOROWANE",
|
||||
"Maintenance Completed": "Konserwacja zakończona",
|
||||
"Maintenance in Progress": "Trwa konserwacja",
|
||||
"Manage Subscription": "Zarządzaj subskrypcją",
|
||||
"Mode": "Tryb",
|
||||
"No Data": "Brak danych",
|
||||
"No Incident in %date": "Brak incydentów w dniu %date",
|
||||
"No Incidents": "Brak incydentów",
|
||||
"No Monitor Found": "Nie znaleziono monitora",
|
||||
"No Updates Yet": "Brak aktualizacji",
|
||||
"Ongoing Incidents": "Trwające incydenty",
|
||||
"Pinging": "Pingowanie",
|
||||
"Please select specific monitors to receive updates from.": "Wybierz konkretne monitory, z których chcesz otrzymywać aktualizacje.",
|
||||
"RESOLVED": "ROZWIĄZANE",
|
||||
"Recent Incidents": "Ostatnie incydenty",
|
||||
"Recent Maintenances": "Ostatnie konserwacje",
|
||||
"Share this monitor using a link with others": "Udostępnij ten monitor za pomocą linku innym osobom",
|
||||
"Share": "Udostępnij",
|
||||
"Some Systems are not working as expected": "Niektóre systemy nie działają zgodnie z oczekiwaniami",
|
||||
"Some Systems Degraded": "Niektóre systemy działają z ograniczeniami",
|
||||
"Some Systems Down": "Niektóre systemy są niedostępne",
|
||||
"Some Systems in Maintenance": "Niektóre systemy są w konserwacji",
|
||||
"Standard": "Standardowy",
|
||||
"Started %startedAt, lasted for %lastedFor": "Rozpoczęto %startedAt, trwało %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Rozpoczęto %startedAt, nadal trwa",
|
||||
"Started %startedAt, will last for %lastedFor more": "Rozpoczęto %startedAt, potrwa jeszcze %lastedFor",
|
||||
"Starts %startedAt, will last for %lastedFor": "Rozpocznie się %startedAt, potrwa %lastedFor",
|
||||
"Starts %startedAt": "Rozpocznie się %startedAt",
|
||||
"Status OK": "Status OK",
|
||||
"Status": "Status",
|
||||
"Subscribe": "Subskrybuj",
|
||||
"Subscribe to Updates": "Subskrybuj aktualizacje",
|
||||
"Subscribe to all monitors": "Subskrybuj wszystkie monitory",
|
||||
"Switch to your timezone": "Przełącz na swoją strefę czasową",
|
||||
"Theme": "Motyw",
|
||||
"There are no upcoming maintenances": "Nie ma nadchodzących konserwacji",
|
||||
"Timezone set to %tz": "Strefa czasowa ustawiona na %tz",
|
||||
"Today": "Dzisiaj",
|
||||
"UP": "DOSTĘPNY",
|
||||
"Update Subscription": "Aktualizuj subskrypcję",
|
||||
"Upcoming Maintenance": "Nadchodząca konserwacja",
|
||||
"Upcoming Maintenances": "Nadchodzące konserwacje",
|
||||
"Updates": "Aktualizacje",
|
||||
"Uptime": "Czas działania",
|
||||
"View in detail": "Zobacz szczegóły",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Wysłaliśmy kod na Twój adres email. Wprowadź go poniżej, aby potwierdzić logowanie",
|
||||
"You are logged in as %email": "Jesteś zalogowany jako %email"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status por %duration",
|
||||
"120 Days": "120 Dias",
|
||||
"14 Days": "14 Dias",
|
||||
"150 Days": "150 Dias",
|
||||
"180 Days": "180 Dias",
|
||||
"30 Days": "30 Dias",
|
||||
"60 Days": "60 Dias",
|
||||
"7 Days": "7 Dias",
|
||||
"90 Days": "90 Dias",
|
||||
"Availability per Component": "Disponibilidade por Componente",
|
||||
"All Systems are Degraded": "Todos os Sistemas estão com Falhas",
|
||||
"All Systems are Down": "Todos os Sistemas estão Indisponíveis",
|
||||
"All Systems are Operational": "Todos os Sistemas estão Operacionais",
|
||||
"All Systems are in Maintenance": "Todos os Sistemas estão em Manutenção",
|
||||
"Back": "Voltar",
|
||||
"Badge Copied": "Emblema Copiado",
|
||||
"Badge": "Emblema",
|
||||
"Browse Events": "Navegar Eventos",
|
||||
"Change Email": "Alterar E-mail",
|
||||
"Code Copied": "Código Copiado",
|
||||
"Confirm Login": "Confirmar Login",
|
||||
"Copy Code": "Copiar Código",
|
||||
"Copy Link": "Copiar Link",
|
||||
"DEGRADED": "FALHA",
|
||||
"DOWN": "INDISPONÍVEL",
|
||||
"Dark": "Escuro",
|
||||
"Days": "Dias",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Incorporar este monitor ao seu aplicativo utilizando <script> ou <iframe>.",
|
||||
"Embed": "Incorporar",
|
||||
"Enter the code": "Digite o código",
|
||||
"Enter your email": "Digite seu e-mail",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Digite seu e-mail para fazer login. Se você não estiver inscrito, você será solicitado a se inscrever.",
|
||||
"Get SVG badge for this monitor": "Obter emblema SVG deste monitor",
|
||||
"Get a LIVE Status for this monitor": "Obter indicador de status AO VIVO",
|
||||
"IDENTIFIED": "IDENTIFICADO",
|
||||
"INVESTIGATING": "INVESTIGANDO",
|
||||
"Incident Updates": "Atualizações do Incidente",
|
||||
"LIVE Status": "Status AO VIVO",
|
||||
"Lasted for about %lastedFor": "Durou aproximadamente %lastedFor",
|
||||
"Light": "Claro",
|
||||
"Link Copied": "Link Copiado",
|
||||
"Login": "Entrar",
|
||||
"MAINTENANCE": "MANUTENÇÃO",
|
||||
"MONITORING": "MONITORANDO",
|
||||
"Maintenance Completed": "Manutenção Concluída",
|
||||
"Maintenance in Progress": "Manutenção em Progresso",
|
||||
"Manage Subscription": "Gerenciar Inscrição",
|
||||
"Mode": "Modo",
|
||||
"No Data": "Sem dados",
|
||||
"No Incident in %date": "Nenhum incidente em %date",
|
||||
"No Incidents": "Sem Incidentes",
|
||||
"No Monitor Found": "Nenhum monitor encontrado",
|
||||
"No Updates Yet": "Nenhuma atualização ainda",
|
||||
"Ongoing Incidents": "Incidentes em Andamento",
|
||||
"Pinging": "Animado",
|
||||
"Please select specific monitors to receive updates from.": "Por favor, selecione monitores específicos para receber atualizações.",
|
||||
"RESOLVED": "RESOLVIDO",
|
||||
"Recent Incidents": "Incidentes Recentes",
|
||||
"Recent Maintenances": "Manutenções Recentes",
|
||||
"Share this monitor using a link with others": "Compartilhar este monitor através do link",
|
||||
"Share": "Compartilhar",
|
||||
"Some Systems are not working as expected": "Alguns Sistemas não estão funcionando como esperado",
|
||||
"Some Systems Degraded": "Alguns Sistemas estão com Falhas",
|
||||
"Some Systems Down": "Alguns Sistemas estão Indisponíveis",
|
||||
"Some Systems in Maintenance": "Alguns Sistemas estão em Manutenção",
|
||||
"Standard": "Padrão",
|
||||
"Started %startedAt, lasted for %lastedFor": "Ocorreu faz %startedAt e durou %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Iniciou faz %startedAt, ainda em andamento",
|
||||
"Started %startedAt, will last for %lastedFor more": "Iniciará em %startedAt, durará mais %lastedFor",
|
||||
"Starts %startedAt, will last for %lastedFor": "Terá início em %startedAt, com duração de %lastedFor",
|
||||
"Starts %startedAt": "Inicia em %startedAt",
|
||||
"Status OK": "Status OK",
|
||||
"Status": "Status",
|
||||
"Subscribe": "Inscrever-se",
|
||||
"Subscribe to Updates": "Inscrever-se para atualizações",
|
||||
"Subscribe to all monitors": "Inscrever-se em todos os monitores",
|
||||
"Switch to your timezone": "Mudar para o seu fuso horário",
|
||||
"Theme": "Tema",
|
||||
"There are no upcoming maintenances": "Não há manutenções agendadas",
|
||||
"Timezone set to %tz": "Fuso horário definido para %tz",
|
||||
"Today": "Hoje",
|
||||
"UP": "OPERACIONAL",
|
||||
"Update Subscription": "Atualizar Inscrição",
|
||||
"Upcoming Maintenance": "Manutenção Agendada",
|
||||
"Upcoming Maintenances": "Manutenções Agendadas",
|
||||
"Updates": "Atualizações",
|
||||
"Uptime": "Tempo de Atividade",
|
||||
"View in detail": "Ver em detalhes",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Enviamos um código para seu e-mail. Por favor, digite-o abaixo para confirmar seu login",
|
||||
"You are logged in as %email": "Você está logado como %email"
|
||||
}
|
||||
+121
-90
@@ -1,92 +1,123 @@
|
||||
{
|
||||
"%status for %duration": "%status в течение %duration",
|
||||
"120 Days": "120 дней",
|
||||
"14 Days": "14 дней",
|
||||
"150 Days": "150 дней",
|
||||
"180 Days": "180 дней",
|
||||
"30 Days": "30 дней",
|
||||
"60 Days": "60 дней",
|
||||
"7 Days": "7 дней",
|
||||
"90 Days": "90 дней",
|
||||
"Availability per Component": "Доступность по компонентам",
|
||||
"All Systems are Degraded": "Системы работают нестабильно",
|
||||
"All Systems are Down": "Системы не работают",
|
||||
"All Systems are Operational": "Системы работают нормально",
|
||||
"All Systems are in Maintenance": "Системы на обслуживании",
|
||||
"Back": "Назад",
|
||||
"Badge Copied": "Значок скопирован",
|
||||
"Badge": "Значок",
|
||||
"Browse Events": "Просмотр событий",
|
||||
"Change Email": "Изменить электронную почту",
|
||||
"Code Copied": "Код скопирован",
|
||||
"Confirm Login": "Подтвердите вход",
|
||||
"Copy Code": "Скопировать код",
|
||||
"Copy Link": "Скопировать ссылку",
|
||||
"DEGRADED": "НЕСТАБИЛЬНО",
|
||||
"DOWN": "НЕ РАБОТАЕТ",
|
||||
"Dark": "Тёмная",
|
||||
"Days": "дней",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Встройте этот монитор с помощью <script> или <iframe> в ваше приложение.",
|
||||
"Embed": "Вставить",
|
||||
"Enter the code": "Введите код",
|
||||
"Enter your email": "Введите ваш email",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Введите ваш email для входа. Если вы не подписаны, вам будет предложено подписаться.",
|
||||
"Get SVG badge for this monitor": "Получить SVG значок для этого монитора",
|
||||
"Get a LIVE Status for this monitor": "Получить текущий статус для этого монитора",
|
||||
"IDENTIFIED": "ВЫЯВЛЕНО",
|
||||
"INVESTIGATING": "ИЗУЧАЕТСЯ",
|
||||
"Incident Updates": "Обновления инцидентов",
|
||||
"LIVE Status": "Текущий статус",
|
||||
"Lasted for about %lastedFor": "Продолжалось около %lastedFor",
|
||||
"Light": "Светлая",
|
||||
"Link Copied": "Ссылка скопирована",
|
||||
"Login": "Войти",
|
||||
"MAINTENANCE": "ОБСЛУЖИВАНИЕ",
|
||||
"MONITORING": "МОНИТОРИНГ",
|
||||
"Maintenance Completed": "Обслуживание завершено",
|
||||
"Maintenance in Progress": "Обслуживание в процессе",
|
||||
"Manage Subscription": "Управление подпиской",
|
||||
"Mode": "Режим",
|
||||
"No Data": "Нет данных",
|
||||
"No Incident in %date": "Нет инцидентов за %date",
|
||||
"No Incidents": "Инцидентов нет",
|
||||
"No Monitor Found": "Монитор не найден",
|
||||
"No Updates Yet": "Обновлений пока нет",
|
||||
"Ongoing Incidents": "Текущие инциденты",
|
||||
"Pinging": "Проверка доступности",
|
||||
"Please select specific monitors to receive updates from.": "Пожалуйста, выберите мониторы для получения обновлений.",
|
||||
"RESOLVED": "РЕШЕНО",
|
||||
"Recent Incidents": "Недавние инциденты",
|
||||
"Recent Maintenances": "Последние обслуживания",
|
||||
"Share this monitor using a link with others": "Поделитесь этим монитором с другими по ссылке",
|
||||
"Share": "Поделиться",
|
||||
"Some Systems are not working as expected": "Некоторые системы работают нестабильно",
|
||||
"Some Systems Degraded": "Некоторые системы работают нестабильно",
|
||||
"Some Systems Down": "Некоторые системы недоступны",
|
||||
"Some Systems in Maintenance": "Некоторые системы на обслуживании",
|
||||
"Standard": "Стандартная",
|
||||
"Started %startedAt, lasted for %lastedFor": "Началось %startedAt, продолжалось %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Началось %startedAt, всё ещё продолжается",
|
||||
"Started %startedAt, will last for %lastedFor more": "Началось %startedAt, продлится ещё около %lastedFor",
|
||||
"Starts %startedAt, will last for %lastedFor": "Начнётся %startedAt, продлится %lastedFor",
|
||||
"Starts %startedAt": "Начнётся %startedAt",
|
||||
"Status OK": "Статус ОК",
|
||||
"Status": "Статус",
|
||||
"Subscribe": "Подписаться",
|
||||
"Subscribe to Updates": "Подписаться на обновления",
|
||||
"Subscribe to all monitors": "Подписаться на все мониторы",
|
||||
"Switch to your timezone": "Переключиться на ваш часовой пояс",
|
||||
"Theme": "Тема",
|
||||
"There are no upcoming maintenances": "Предстоящих обслуживаний нет",
|
||||
"Timezone set to %tz": "Часовой пояс установлен: %tz",
|
||||
"Today": "Сегодня",
|
||||
"UP": "РАБОТАЕТ",
|
||||
"Update Subscription": "Обновить подписку",
|
||||
"Upcoming Maintenance": "Предстоящее обслуживание",
|
||||
"Upcoming Maintenances": "Предстоящие обслуживания",
|
||||
"Updates": "Обновления",
|
||||
"Uptime": "Время безотказной работы",
|
||||
"View in detail": "Подробнее",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Мы отправили код на вашу почту. Введите его ниже для подтверждения входа",
|
||||
"You are logged in as %email": "Вы вошли как %email"
|
||||
"name": "Русский",
|
||||
"mappings": {
|
||||
"Under Maintenance": "На обслуживании",
|
||||
"All Systems Operational": "Все системы работают",
|
||||
"Degraded Performance": "Сниженная производительность",
|
||||
"Partial Degraded Performance": "Частично снижена производительность",
|
||||
"Partial System Outage": "Частичный сбой системы",
|
||||
"Major System Outage": "Крупный сбой системы",
|
||||
"No Status Available": "Статус недоступен",
|
||||
"Maintenances": "Обслуживание",
|
||||
"Events": "События",
|
||||
"Select Language": "Выберите язык",
|
||||
"Incidents": "Инциденты",
|
||||
"Ongoing": "Текущие",
|
||||
"Upcoming": "Предстоящие",
|
||||
"Past": "Прошедшие",
|
||||
"Back": "Назад",
|
||||
"Subscribe": "Подписаться",
|
||||
"Available Components": "Доступные компоненты",
|
||||
"Minute-by-minute status data for this day": "Поминутные данные о статусе за этот день",
|
||||
"Recent Incidents": "Недавние инциденты",
|
||||
"Home": "Главная",
|
||||
"Status": "Статус",
|
||||
"Latency": "Задержка",
|
||||
"Failed to load latency data": "Не удалось загрузить данные о задержке",
|
||||
"No incidents for this day": "Нет инцидентов за этот день",
|
||||
"No maintenances for this day": "Нет обслуживания за этот день",
|
||||
"No latency data available for this day": "Нет данных о задержке за этот день",
|
||||
"Latency Over Time": "Задержка во времени",
|
||||
"Average Latency": "Средняя задержка",
|
||||
"Failed to load status data for this day": "Не удалось загрузить данные о статусе за этот день",
|
||||
"Per-Minute Status": "Статус по минутам",
|
||||
"Day Uptime": "Время работы за день",
|
||||
"Last Updated": "Последнее обновление",
|
||||
"Latest Status": "Последний статус",
|
||||
"Latest Latency": "Последняя задержка",
|
||||
"Ongoing Incidents": "Текущие инциденты",
|
||||
"Latency Trend": "Тренд задержки",
|
||||
"Avg Latency": "Средняя задержка",
|
||||
"Uptime": "Время работы",
|
||||
"Select Range": "Выберите диапазон",
|
||||
"Status history and latency trend": "История статусов и тренд задержки",
|
||||
"Timeline": "Временная шкала",
|
||||
"Start Time": "Время начала",
|
||||
"End Time": "Время окончания",
|
||||
"Duration": "Продолжительность",
|
||||
"UP": "РАБОТАЕТ",
|
||||
"DOWN": "НЕ РАБОТАЕТ",
|
||||
"MAINTENANCE": "ОБСЛУЖИВАНИЕ",
|
||||
"NO_DATA": "НЕТ ДАННЫХ",
|
||||
"DEGRADED": "СНИЖЕНА",
|
||||
"INVESTIGATING": "РАССЛЕДУЕТСЯ",
|
||||
"IDENTIFIED": "ОБНАРУЖЕНО",
|
||||
"MONITORING": "МОНИТОРИНГ",
|
||||
"RESOLVED": "РЕШЕНО",
|
||||
"No updates yet": "Обновлений пока нет",
|
||||
"Affected Monitors (%count)": "Затронутые мониторы (%count)",
|
||||
"No monitors affected": "Мониторы не затронуты",
|
||||
"Unknown impact": "Неизвестное влияние",
|
||||
"Updates (%count)": "Обновления (%count)",
|
||||
"Impact": "Влияние",
|
||||
"One-time": "Одноразовое",
|
||||
"In Progress": "В процессе",
|
||||
"Maintenance": "Обслуживание",
|
||||
"Total <br /> Maintenances": "Всего <br /> обслуживаний",
|
||||
"Total <br /> Incidents": "Всего <br /> инцидентов",
|
||||
"There are no incidents or maintenances scheduled for this month.": "На этот месяц не запланировано инцидентов или обслуживания.",
|
||||
"No Events in %currentMonth": "Нет событий в %currentMonth",
|
||||
"Ongoing <br /> Incidents": "Текущие <br /> инциденты",
|
||||
"Ongoing <br /> Maintenances": "Текущее <br /> обслуживание",
|
||||
"Upcoming <br /> Maintenances": "Предстоящее <br /> обслуживание",
|
||||
"Copied": "Скопировано",
|
||||
"Badges": "Значки",
|
||||
"Get badges for this monitor": "Получить значки для этого монитора",
|
||||
"Status Badge": "Значок статуса",
|
||||
"Uptime Badge": "Значок времени работы",
|
||||
"Live Status": "Статус в реальном времени",
|
||||
"Standard": "Стандартный",
|
||||
"Pinging": "Проверка связи",
|
||||
"Embed Monitor": "Встроить монитор",
|
||||
"Embed this monitor in your website or app": "Встройте этот монитор на ваш сайт или в приложение",
|
||||
"Status Embed": "Встроенный статус",
|
||||
"Latency Embed": "Встроенная задержка",
|
||||
"Theme": "Тема",
|
||||
"Light": "Светлая",
|
||||
"Dark": "Темная",
|
||||
"Format": "Формат",
|
||||
"iFrame": "iFrame",
|
||||
"Script": "Скрипт",
|
||||
"Failed to load data": "Не удалось загрузить данные",
|
||||
"90 Days": "90 дней",
|
||||
"30 Days": "30 дней",
|
||||
"7 Days": "7 дней",
|
||||
"24 Hours": "24 часа",
|
||||
"Incident": "Инцидент",
|
||||
"Subscribe to Updates": "Подписаться на обновления",
|
||||
"Get notified about incidents and scheduled maintenance.": "Получайте уведомления об инцидентах и плановом обслуживании.",
|
||||
"Enter the verification code sent to your email.": "Введите код подтверждения, отправленный на вашу почту.",
|
||||
"Manage your notification preferences.": "Управляйте настройками уведомлений.",
|
||||
"Loading your preferences...": "Загрузка настроек...",
|
||||
"Email address": "Адрес электронной почты",
|
||||
"Please enter a valid email address": "Пожалуйста, введите действительный адрес электронной почты",
|
||||
"Failed to send verification code": "Не удалось отправить код подтверждения",
|
||||
"Network error. Please try again.": "Ошибка сети. Пожалуйста, попробуйте снова.",
|
||||
"Sending...": "Отправка...",
|
||||
"Continue": "Продолжить",
|
||||
"We sent a 6-digit code to": "Мы отправили 6-значный код на",
|
||||
"Please enter the 6-digit verification code": "Пожалуйста, введите 6-значный код подтверждения",
|
||||
"Verification failed": "Проверка не удалась",
|
||||
"Didn't receive the code? Resend": "Не получили код? Отправить повторно",
|
||||
"Incident Updates": "Обновления инцидентов",
|
||||
"Get notified about incidents updates": "Получайте уведомления об обновлениях инцидентов",
|
||||
"Maintenance Updates": "Обновления обслуживания",
|
||||
"Get notified about scheduled maintenance": "Получайте уведомления о плановом обслуживании",
|
||||
"Failed to update preference": "Не удалось обновить настройки",
|
||||
"No ongoing maintenances": "Нет текущих обслуживаний",
|
||||
"No upcoming maintenances": "Нет предстоящих обслуживаний",
|
||||
"No past maintenances": "Нет прошедших обслуживаний",
|
||||
"Read more": "Читать далее",
|
||||
"Read less": "Читать меньше"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%duration boyunca %status",
|
||||
"14 Days": "14 Gün",
|
||||
"30 Days": "30 Gün",
|
||||
"60 Days": "60 Gün",
|
||||
"7 Days": "7 Gün",
|
||||
"90 Days": "90 Gün",
|
||||
"120 Days": "120 Gün",
|
||||
"150 Days": "150 Gün",
|
||||
"180 Days": "180 Gün",
|
||||
"Availability per Component": "Bileşen Kullanılabilirliği",
|
||||
"All Systems are Degraded": "Tüm Sistemler Bozuk Durumda",
|
||||
"All Systems are Down": "Tüm Sistemler Çalışmıyor",
|
||||
"All Systems are Operational": "Tüm Sistemler Çalışıyor",
|
||||
"All Systems are in Maintenance": "Tüm Sistemler Bakımda",
|
||||
"Back": "Geri",
|
||||
"Badge Copied": "Rozet Kopyalandı",
|
||||
"Badge": "Rozet",
|
||||
"Browse Events": "Etkinliklere Göz At",
|
||||
"Change Email": "E-postayı Değiştir",
|
||||
"Code Copied": "Kod Kopyalandı",
|
||||
"Confirm Login": "Girişi Onayla",
|
||||
"Copy Code": "Kodu Kopyala",
|
||||
"Copy Link": "Bağlantıyı Kopyala",
|
||||
"DEGRADED": "BOZUK",
|
||||
"DOWN": "ÇALIŞMIYOR",
|
||||
"Dark": "Koyu",
|
||||
"Days": "Günler",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Uygulamanıza <script> veya <iframe> kullanarak bu hizmeti yerleştirin.",
|
||||
"Embed": "Yerleştir",
|
||||
"Enter the code": "Kodu girin",
|
||||
"Enter your email": "E-posta adresinizi girin",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Giriş yapmak için e-posta adresinizi girin. Abone değilseniz, abone olmanız istenecektir.",
|
||||
"Get SVG badge for this monitor": "Bu servis için SVG rozet alın",
|
||||
"Get a LIVE Status for this monitor": "Bu servis için CANLI Durum alın",
|
||||
"IDENTIFIED": "TANIMLANDI",
|
||||
"INVESTIGATING": "İNCELENİYOR",
|
||||
"Incident Updates": "Olay Güncellemeleri",
|
||||
"LIVE Status": "CANLI Durum",
|
||||
"Lasted for about %lastedFor": "%lastedFor sürdü",
|
||||
"Light": "Açık",
|
||||
"Link Copied": "Bağlantı Kopyalandı",
|
||||
"Login": "Giriş Yap",
|
||||
"MAINTENANCE": "BAKIM",
|
||||
"MONITORING": "İZLEME",
|
||||
"Maintenance Completed": "Bakım Tamamlandı",
|
||||
"Maintenance in Progress": "Bakım Devam Ediyor",
|
||||
"Manage Subscription": "Aboneliği Yönet",
|
||||
"Mode": "Mod",
|
||||
"No Data": "Veri Yok",
|
||||
"No Incident in %date": "%date Tarihinde Olay Yok",
|
||||
"No Incidents": "Olay Yok",
|
||||
"No Monitor Found": "Servis Bulunamadı",
|
||||
"No Updates Yet": "Henüz Güncelleme Yok",
|
||||
"Ongoing Incidents": "Devam Eden Olaylar",
|
||||
"Pinging": "Pinging",
|
||||
"Please select specific monitors to receive updates from.": "Lütfen güncellemeleri almak istediğiniz belirli servisleri seçin.",
|
||||
"RESOLVED": "ÇÖZÜLDÜ",
|
||||
"Recent Incidents": "Son Olaylar",
|
||||
"Recent Maintenances": "Son Bakımlar",
|
||||
"Share this monitor using a link with others": "Bu servisi bir bağlantı kullanarak başkalarıyla paylaşın",
|
||||
"Share": "Paylaş",
|
||||
"Some Systems are not working as expected": "Bazı Sistemler Beklendiği Gibi Çalışmıyor",
|
||||
"Some Systems Degraded": "Bazı Sistemler Bozuk Durumda",
|
||||
"Some Systems Down": "Bazı Sistemler Çalışmıyor",
|
||||
"Some Systems in Maintenance": "Bazı Sistemler Bakımda",
|
||||
"Standard": "Standart",
|
||||
"Started %startedAt, lasted for %lastedFor": "%startedAt başladı, %lastedFor sürdü",
|
||||
"Started %startedAt, still ongoing": "%startedAt başladı, devam ediyor",
|
||||
"Started %startedAt, will last for %lastedFor more": "%startedAt başladı, %lastedFor daha sürecek",
|
||||
"Starts %startedAt, will last for %lastedFor": "%startedAt başlıyor, %lastedFor sürecek",
|
||||
"Starts %startedAt": "%startedAt başlıyor",
|
||||
"Status OK": "Durum UYGUN",
|
||||
"Status": "Durum",
|
||||
"Subscribe": "Abone Ol",
|
||||
"Subscribe to Updates": "Güncellemelere Abone Ol",
|
||||
"Subscribe to all monitors": "Tüm servislere abone ol",
|
||||
"Switch to your timezone": "Saat diliminize geçin",
|
||||
"Theme": "Tema",
|
||||
"There are no upcoming maintenances": "Yaklaşan bakım bulunmamaktadır",
|
||||
"Timezone set to %tz": "Saat dilimi %tz olarak ayarlandı",
|
||||
"Today": "Bugün",
|
||||
"UP": "ÇALIŞIYOR",
|
||||
"Update Subscription": "Aboneliği Güncelle",
|
||||
"Upcoming Maintenance": "Yaklaşan Bakım",
|
||||
"Upcoming Maintenances": "Yaklaşan Bakımlar",
|
||||
"Updates": "Güncellemeler",
|
||||
"Uptime": "Çalışma Süresi",
|
||||
"View in detail": "Detaylı Görüntüle",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "E-posta adresinize bir kod gönderdik. Girişinizi onaylamak için lütfen aşağıya girin",
|
||||
"You are logged in as %email": "%email olarak giriş yaptınız"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%status trong %duration",
|
||||
"14 Days": "14 ngày",
|
||||
"30 Days": "30 ngày",
|
||||
"60 Days": "60 ngày",
|
||||
"7 Days": "7 ngày",
|
||||
"90 Days": "90 ngày",
|
||||
"120 Days": "120 ngày",
|
||||
"150 Days": "150 ngày",
|
||||
"180 Days": "180 ngày",
|
||||
"Availability per Component": "Tính khả dụng theo thành phần",
|
||||
"All Systems are Degraded": "Tất cả hệ thống đang suy giảm hiệu suất",
|
||||
"All Systems are Down": "Tất cả hệ thống đang ngừng hoạt động",
|
||||
"All Systems are Operational": "Tất cả hệ thống đang hoạt động bình thường",
|
||||
"All Systems are in Maintenance": "Tất cả hệ thống đang bảo trì",
|
||||
"Back": "Quay lại",
|
||||
"Badge Copied": "Huy hiệu đã được sao chép",
|
||||
"Badge": "Huy hiệu",
|
||||
"Browse Events": "Duyệt sự kiện",
|
||||
"Change Email": "Thay đổi email",
|
||||
"Code Copied": "Mã đã được sao chép",
|
||||
"Confirm Login": "Xác nhận đăng nhập",
|
||||
"Copy Code": "Sao chép mã",
|
||||
"Copy Link": "Sao chép liên kết",
|
||||
"DEGRADED": "Suy giảm",
|
||||
"DOWN": "Ngừng hoạt động",
|
||||
"Dark": "Tối",
|
||||
"Days": "Ngày",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "Nhúng trình theo dõi này vào ứng dụng của bạn bằng <script> hoặc <iframe>.",
|
||||
"Embed": "Nhúng",
|
||||
"Enter the code": "Nhập mã",
|
||||
"Enter your email": "Nhập email của bạn",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "Nhập email của bạn để đăng nhập. Nếu bạn chưa đăng ký, bạn sẽ được nhắc đăng ký.",
|
||||
"Get SVG badge for this monitor": "Lấy huy hiệu SVG cho trình theo dõi này",
|
||||
"Get a LIVE Status for this monitor": "Lấy trạng thái TRỰC TIẾP cho trình theo dõi này",
|
||||
"IDENTIFIED": "Đã xác định",
|
||||
"INVESTIGATING": "Đang điều tra",
|
||||
"Incident Updates": "Cập nhật sự cố",
|
||||
"LIVE Status": "Trạng thái TRỰC TIẾP",
|
||||
"Lasted for about %lastedFor": "Kéo dài khoảng %lastedFor",
|
||||
"Light": "Sáng",
|
||||
"Link Copied": "Liên kết đã được sao chép",
|
||||
"Login": "Đăng nhập",
|
||||
"MAINTENANCE": "Bảo trì",
|
||||
"MONITORING": "Đang giám sát",
|
||||
"Maintenance Completed": "Bảo trì đã hoàn thành",
|
||||
"Maintenance in Progress": "Bảo trì đang diễn ra",
|
||||
"Manage Subscription": "Quản lý đăng ký",
|
||||
"Mode": "Chế độ",
|
||||
"No Data": "Không có dữ liệu",
|
||||
"No Incident in %date": "Không có sự cố vào %date",
|
||||
"No Incidents": "Không có sự cố",
|
||||
"No Monitor Found": "Không tìm thấy trình theo dõi",
|
||||
"No Updates Yet": "Chưa có cập nhật",
|
||||
"Ongoing Incidents": "Sự cố đang diễn ra",
|
||||
"Pinging": "Đang kiểm tra",
|
||||
"Please select specific monitors to receive updates from.": "Vui lòng chọn các trình theo dõi cụ thể để nhận cập nhật.",
|
||||
"RESOLVED": "Đã giải quyết",
|
||||
"Recent Incidents": "Sự cố gần đây",
|
||||
"Recent Maintenances": "Bảo trì gần đây",
|
||||
"Share this monitor using a link with others": "Chia sẻ trình theo dõi này với người khác bằng liên kết",
|
||||
"Share": "Chia sẻ",
|
||||
"Some Systems are not working as expected": "Một số hệ thống không hoạt động như mong đợi",
|
||||
"Some Systems Degraded": "Một số hệ thống đang suy giảm hiệu suất",
|
||||
"Some Systems Down": "Một số hệ thống đang ngừng hoạt động",
|
||||
"Some Systems in Maintenance": "Một số hệ thống đang bảo trì",
|
||||
"Standard": "Tiêu chuẩn",
|
||||
"Started %startedAt, lasted for %lastedFor": "Bắt đầu khoảng %startedAt trước, kéo dài khoảng %lastedFor",
|
||||
"Started %startedAt, still ongoing": "Bắt đầu khoảng %startedAt trước, vẫn đang diễn ra",
|
||||
"Started %startedAt, will last for %lastedFor more": "Bắt đầu khoảng %startedAt trước, sẽ kéo dài thêm khoảng %lastedFor",
|
||||
"Starts %startedAt, will last for %lastedFor": "Bắt đầu trong %startedAt, sẽ kéo dài khoảng %lastedFor",
|
||||
"Starts %startedAt": "Bắt đầu trong %startedAt",
|
||||
"Status OK": "Trạng thái OK",
|
||||
"Status": "Trạng thái",
|
||||
"Subscribe": "Đăng ký",
|
||||
"Subscribe to Updates": "Đăng ký nhận cập nhật",
|
||||
"Subscribe to all monitors": "Đăng ký tất cả trình theo dõi",
|
||||
"Switch to your timezone": "Chuyển sang múi giờ của bạn",
|
||||
"Theme": "Giao diện",
|
||||
"There are no upcoming maintenances": "Không có bảo trì sắp tới nào",
|
||||
"Timezone set to %tz": "Đã đặt múi giờ %tz",
|
||||
"Today": "Hôm nay",
|
||||
"UP": "Hoạt động",
|
||||
"Update Subscription": "Cập nhật đăng ký",
|
||||
"Upcoming Maintenance": "Bảo trì sắp tới",
|
||||
"Upcoming Maintenances": "Các bảo trì sắp tới",
|
||||
"Updates": "Cập nhật",
|
||||
"Uptime": "Thời gian hoạt động",
|
||||
"View in detail": "Xem chi tiết",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "Chúng tôi đã gửi một mã đến email của bạn. Vui lòng nhập mã đó dưới đây để xác nhận đăng nhập",
|
||||
"You are logged in as %email": "Bạn đã đăng nhập với tư cách %email"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
{
|
||||
"%status for %duration": "%duration 内的 %status",
|
||||
"120 Days": "120天",
|
||||
"14 Days": "14天",
|
||||
"150 Days": "150天",
|
||||
"180 Days": "180天",
|
||||
"30 Days": "30天",
|
||||
"60 Days": "60天",
|
||||
"7 Days": "7天",
|
||||
"90 Days": "90天",
|
||||
"Availability per Component": "每个组件的可用性",
|
||||
"All Systems are Degraded": "所有系统性能下降",
|
||||
"All Systems are Down": "所有系统不可用",
|
||||
"All Systems are Operational": "所有系统运行正常",
|
||||
"All Systems are in Maintenance": "所有系统正在维护",
|
||||
"Back": "返回",
|
||||
"Badge Copied": "徽章已复制",
|
||||
"Badge": "徽章",
|
||||
"Browse Events": "浏览事件",
|
||||
"Change Email": "更改邮箱",
|
||||
"Code Copied": "代码已复制",
|
||||
"Confirm Login": "确认登录",
|
||||
"Copy Code": "复制代码",
|
||||
"Copy Link": "复制链接",
|
||||
"DEGRADED": "性能下降",
|
||||
"DOWN": "不可用",
|
||||
"Dark": "深色",
|
||||
"Days": "天",
|
||||
"Embed this monitor using <script> or <iframe> in your app.": "使用 <script> 或 <iframe> 将此监控嵌入您的应用。",
|
||||
"Embed": "嵌入",
|
||||
"Enter the code": "输入验证码",
|
||||
"Enter your email": "输入您的邮箱",
|
||||
"Enter your email to log in. If you are not subscribed, you will be prompted to subscribe.": "输入您的邮箱进行登录。如果您尚未订阅,将会提示您进行订阅。",
|
||||
"Get SVG badge for this monitor": "获取此监控的SVG徽章",
|
||||
"Get a LIVE Status for this monitor": "获取此监控的实时状态",
|
||||
"IDENTIFIED": "已识别",
|
||||
"INVESTIGATING": "正在调查",
|
||||
"Incident Updates": "事件更新",
|
||||
"LIVE Status": "实时状态",
|
||||
"Lasted for about %lastedFor": "持续了约 %lastedFor",
|
||||
"Light": "浅色",
|
||||
"Link Copied": "链接已复制",
|
||||
"Login": "登录",
|
||||
"MAINTENANCE": "维护",
|
||||
"MONITORING": "正在监控",
|
||||
"Maintenance Completed": "维护已完成",
|
||||
"Maintenance in Progress": "维护进行中",
|
||||
"Manage Subscription": "管理订阅",
|
||||
"Mode": "模式",
|
||||
"No Data": "无数据",
|
||||
"No Incident in %date": "%date 无事件",
|
||||
"No Incidents": "无事件",
|
||||
"No Monitor Found": "未找到监控",
|
||||
"No Updates Yet": "尚无更新",
|
||||
"Ongoing Incidents": "正在处理的事件",
|
||||
"Pinging": "正在测试",
|
||||
"Please select specific monitors to receive updates from.": "请选择您希望接收更新的特定监控。",
|
||||
"RESOLVED": "已解决",
|
||||
"Recent Incidents": "最近的事件",
|
||||
"Recent Maintenances": "最近的维护",
|
||||
"Share this monitor using a link with others": "通过链接与他人分享此监控",
|
||||
"Share": "分享",
|
||||
"Some Systems are not working as expected": "部分系统运行异常",
|
||||
"Some Systems Degraded": "部分系统性能下降",
|
||||
"Some Systems Down": "部分系统不可用",
|
||||
"Some Systems in Maintenance": "部分系统正在维护",
|
||||
"Standard": "标准",
|
||||
"Started %startedAt, lasted for %lastedFor": "大约 %startedAt 前开始,持续了约 %lastedFor",
|
||||
"Started %startedAt, still ongoing": "大约 %startedAt 前开始,目前仍在进行中",
|
||||
"Started %startedAt, will last for %lastedFor more": "大约 %startedAt 前开始,将持续约 %lastedFor",
|
||||
"Starts %startedAt, will last for %lastedFor": "%startedAt 后开始,将持续约 %lastedFor",
|
||||
"Starts %startedAt": "%startedAt 后开始",
|
||||
"Status OK": "状态正常",
|
||||
"Status": "状态",
|
||||
"Subscribe": "订阅",
|
||||
"Subscribe to Updates": "订阅更新",
|
||||
"Subscribe to all monitors": "订阅所有监控",
|
||||
"Switch to your timezone": "切换到您的时区",
|
||||
"Theme": "主题",
|
||||
"There are no upcoming maintenances": "没有即将进行的维护",
|
||||
"Timezone set to %tz": "时区设置为 %tz",
|
||||
"Today": "今天",
|
||||
"UP": "可用",
|
||||
"Update Subscription": "更新订阅",
|
||||
"Upcoming Maintenance": "即将进行的维护",
|
||||
"Upcoming Maintenances": "即将进行的维护列表",
|
||||
"Updates": "更新",
|
||||
"Uptime": "正常运行时间",
|
||||
"View in detail": "详细查看",
|
||||
"We have sent a code to your email. Please enter it below to confirm your login": "我们已向您的邮箱发送了验证码。请在下方输入以确认您的登录",
|
||||
"You are logged in as %email": "您已作为 %email 登录"
|
||||
}
|
||||
@@ -1,13 +1,12 @@
|
||||
/**
|
||||
* Documentation Search Service using FlexSearch
|
||||
* Provides full-text search across all documentation pages
|
||||
* Provides full-text search across all documentation pages.
|
||||
* Search index is populated from Redis (use `npm run index-docs` to build it).
|
||||
*/
|
||||
|
||||
import FlexSearch from "flexsearch";
|
||||
import { redisConnection } from "$lib/server/redisConnector";
|
||||
import { mdToText } from "$lib/marked";
|
||||
import type { DocsSearchDocument, DocsSearchResult, DocsSearchIndexData } from "$lib/types/docs-search";
|
||||
import { getDocsConfig, getMarkdownContent, getAllPages } from "../../routes/(docs)/docs/docs-utils.server";
|
||||
|
||||
const REDIS_DOCS_KEY = "kener-docs:search:documents";
|
||||
|
||||
@@ -40,9 +39,17 @@ function createExcerpt(content: string, query: string, maxLength: number = 150):
|
||||
}
|
||||
|
||||
/**
|
||||
* Create slug from heading text (same logic as marked-gfm-heading-id)
|
||||
* Create slug from heading text.
|
||||
* If the heading contains a custom ID like {#my-id}, use that directly.
|
||||
* Otherwise, generate a slug from the text (same as marked-gfm-heading-id).
|
||||
*/
|
||||
function createHeadingSlug(text: string): string {
|
||||
// Check for custom heading ID syntax: ## Heading {#custom-id}
|
||||
const customIdMatch = text.match(/\{#([^}]+)\}\s*$/);
|
||||
if (customIdMatch) {
|
||||
return customIdMatch[1].trim();
|
||||
}
|
||||
|
||||
return text
|
||||
.toLowerCase()
|
||||
.trim()
|
||||
@@ -124,55 +131,8 @@ function getSearchIndex(): any {
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the search index from all documentation pages
|
||||
*/
|
||||
export async function buildSearchIndex(): Promise<void> {
|
||||
const index = getSearchIndex();
|
||||
const config = getDocsConfig();
|
||||
const documents: DocsSearchDocument[] = [];
|
||||
|
||||
// Clear existing index
|
||||
documentsMap.clear();
|
||||
|
||||
for (const group of config.sidebar) {
|
||||
for (const page of group.pages) {
|
||||
const markdownContent = getMarkdownContent(page.slug);
|
||||
if (markdownContent) {
|
||||
const plainContent = mdToText(markdownContent);
|
||||
const doc: DocsSearchDocument = {
|
||||
id: page.slug,
|
||||
title: page.title,
|
||||
slug: page.slug,
|
||||
group: group.group,
|
||||
content: plainContent,
|
||||
rawContent: markdownContent, // Store raw for section detection
|
||||
};
|
||||
|
||||
documents.push(doc);
|
||||
documentsMap.set(page.slug, doc);
|
||||
index.add(doc);
|
||||
} else {
|
||||
console.warn(`[docs-search] No content found for slug: ${page.slug}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Store in Redis for persistence
|
||||
try {
|
||||
const redis = redisConnection();
|
||||
const indexData: DocsSearchIndexData = {
|
||||
documents,
|
||||
lastUpdated: Date.now(),
|
||||
};
|
||||
await redis.set(REDIS_DOCS_KEY, JSON.stringify(indexData));
|
||||
console.log(`[docs-search] Stored ${documents.length} documents in Redis`);
|
||||
} catch (error) {
|
||||
console.warn("[docs-search] Failed to persist search index to Redis:", error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the search index from Redis if available
|
||||
* Load the search index from Redis.
|
||||
* The index must be built beforehand using `npm run index-docs`.
|
||||
*/
|
||||
export async function loadSearchIndex(): Promise<boolean> {
|
||||
try {
|
||||
@@ -201,13 +161,13 @@ export async function loadSearchIndex(): Promise<boolean> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure the search index is initialized
|
||||
* Ensure the search index is loaded from Redis
|
||||
*/
|
||||
export async function ensureSearchIndex(): Promise<void> {
|
||||
if (documentsMap.size === 0) {
|
||||
const loaded = await loadSearchIndex();
|
||||
if (!loaded) {
|
||||
await buildSearchIndex();
|
||||
console.warn("[docs-search] No search index found in Redis. Run `npm run index-docs` to build it.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -266,30 +226,6 @@ export async function searchDocs(query: string, limit: number = 10): Promise<Doc
|
||||
return searchResults.slice(0, limit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuild the search index (for internal use during server startup)
|
||||
*/
|
||||
export async function rebuildSearchIndex(): Promise<void> {
|
||||
// Reset the index
|
||||
searchIndex = null;
|
||||
documentsMap.clear();
|
||||
|
||||
await buildSearchIndex();
|
||||
console.log(`[docs-search] Search index built with ${documentsMap.size} documents`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the search index at server startup
|
||||
* Always rebuilds to ensure fresh content
|
||||
*/
|
||||
export async function initializeSearchIndex(): Promise<void> {
|
||||
try {
|
||||
await rebuildSearchIndex();
|
||||
} catch (error) {
|
||||
console.error("[docs-search] Failed to initialize search index:", error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all indexed documents (for debugging)
|
||||
*/
|
||||
|
||||
+37
-26
@@ -1,5 +1,26 @@
|
||||
import { writable, derived, get } from "svelte/store";
|
||||
import { asset } from "$app/paths";
|
||||
|
||||
// Pre-import locale JSON files at build time for SSR (avoids fetch during SSR)
|
||||
const localeModules = import.meta.glob("/src/lib/locales/*.json", {
|
||||
eager: true,
|
||||
import: "default",
|
||||
}) as Record<string, { name: string; mappings: Record<string, string> }>;
|
||||
|
||||
/**
|
||||
* List of available locales derived from the locale files in src/lib/locales/.
|
||||
* Each entry has a code and human-readable name (read from the JSON file itself).
|
||||
*/
|
||||
export const availableLocalesList: { code: string; name: string }[] = Object.keys(localeModules)
|
||||
.map((key) => {
|
||||
const code = key.replace("/src/lib/locales/", "").replace(".json", "");
|
||||
return { code, name: localeModules[key]?.name || code };
|
||||
})
|
||||
.sort((a, b) => a.name.localeCompare(b.name));
|
||||
|
||||
function getLocaleFromModules(locale: string): Record<string, string> | null {
|
||||
const key = `/src/lib/locales/${locale}.json`;
|
||||
return localeModules[key]?.mappings ?? null;
|
||||
}
|
||||
|
||||
const LOCALE_STORAGE_KEY = "kener_preferred_locale";
|
||||
|
||||
@@ -71,34 +92,24 @@ function createI18nStore() {
|
||||
update((state) => ({ ...state, isLoading: true }));
|
||||
|
||||
try {
|
||||
const response = await storedFetch(asset(`/locales/${locale}.json`));
|
||||
if (!response.ok) {
|
||||
// Use pre-imported locale modules (works for both SSR and client)
|
||||
let translations = getLocaleFromModules(locale);
|
||||
if (!translations && locale !== "en") {
|
||||
console.error(`Failed to load locale ${locale}, falling back to en`);
|
||||
// Try to load English as fallback
|
||||
if (locale !== "en") {
|
||||
const fallbackResponse = await storedFetch("/locales/en.json");
|
||||
if (fallbackResponse.ok) {
|
||||
const translations = await fallbackResponse.json();
|
||||
update((state) => ({
|
||||
...state,
|
||||
currentLocale: "en",
|
||||
translations,
|
||||
isLoading: false,
|
||||
}));
|
||||
return;
|
||||
}
|
||||
}
|
||||
update((state) => ({ ...state, isLoading: false }));
|
||||
return;
|
||||
translations = getLocaleFromModules("en");
|
||||
locale = "en";
|
||||
}
|
||||
|
||||
const translations = await response.json();
|
||||
update((state) => ({
|
||||
...state,
|
||||
currentLocale: locale,
|
||||
translations,
|
||||
isLoading: false,
|
||||
}));
|
||||
if (translations) {
|
||||
update((state) => ({
|
||||
...state,
|
||||
currentLocale: locale,
|
||||
translations,
|
||||
isLoading: false,
|
||||
}));
|
||||
} else {
|
||||
update((state) => ({ ...state, isLoading: false }));
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error loading translations for ${locale}:`, error);
|
||||
update((state) => ({ ...state, isLoading: false }));
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
{
|
||||
"title": "Installation",
|
||||
"slug": "installation"
|
||||
},
|
||||
{
|
||||
"title": "Architecture",
|
||||
"slug": "architecture"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -5,9 +5,10 @@
|
||||
import { Copy, Check, ExternalLink } from "@lucide/svelte";
|
||||
import { Button } from "$lib/components/ui/button/index.js";
|
||||
import * as ButtonGroup from "$lib/components/ui/button-group/index.js";
|
||||
import { ChevronDown } from "lucide-svelte";
|
||||
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
|
||||
import ChevronDown from "@lucide/svelte/icons/chevron-down";
|
||||
|
||||
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
|
||||
import { afterNavigate } from "$app/navigation";
|
||||
interface Props {
|
||||
data: {
|
||||
title: string;
|
||||
@@ -75,7 +76,8 @@
|
||||
}
|
||||
|
||||
// Add copy buttons to code blocks after content is rendered
|
||||
$effect(() => {
|
||||
$effect(() => {});
|
||||
afterNavigate(() => {
|
||||
if (!contentEl) return;
|
||||
|
||||
const codeBlocks = contentEl.querySelectorAll("pre");
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
<script lang="ts">
|
||||
import type { DocsConfig } from "$lib/types/docs";
|
||||
import { base } from "$app/paths";
|
||||
import { ArrowRight, Book, Code, Zap, Shield, Github, Moon, Sun } from "lucide-svelte";
|
||||
import ArrowRight from "@lucide/svelte/icons/arrow-right";
|
||||
import Book from "@lucide/svelte/icons/book";
|
||||
import Code from "@lucide/svelte/icons/code";
|
||||
import Zap from "@lucide/svelte/icons/zap";
|
||||
import Shield from "@lucide/svelte/icons/shield";
|
||||
import Github from "@lucide/svelte/icons/github";
|
||||
import Moon from "@lucide/svelte/icons/moon";
|
||||
import Sun from "@lucide/svelte/icons/sun";
|
||||
import { toggleMode, mode } from "mode-watcher";
|
||||
|
||||
interface Props {
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
<script lang="ts">
|
||||
import type { DocsConfig } from "$lib/types/docs";
|
||||
import { base } from "$app/paths";
|
||||
import { Sun, Moon, Menu, X, Search } from "lucide-svelte";
|
||||
import Sun from "@lucide/svelte/icons/sun";
|
||||
import Moon from "@lucide/svelte/icons/moon";
|
||||
import Menu from "@lucide/svelte/icons/menu";
|
||||
import X from "@lucide/svelte/icons/x";
|
||||
import Search from "@lucide/svelte/icons/search";
|
||||
|
||||
import { toggleMode, mode } from "mode-watcher";
|
||||
import DocsSearch from "./DocsSearch.svelte";
|
||||
import { Button } from "$lib/components/ui/button";
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<script lang="ts">
|
||||
import type { DocsPage } from "$lib/types/docs";
|
||||
import { base } from "$app/paths";
|
||||
import { ChevronLeft, ChevronRight } from "lucide-svelte";
|
||||
|
||||
import ChevronLeft from "@lucide/svelte/icons/chevron-left";
|
||||
import ChevronRight from "@lucide/svelte/icons/chevron-right";
|
||||
interface Props {
|
||||
prevPage: DocsPage | null;
|
||||
nextPage: DocsPage | null;
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
<script lang="ts">
|
||||
import { goto } from "$app/navigation";
|
||||
import * as Command from "$lib/components/ui/command/index.js";
|
||||
import { Search, FileText, Loader2 } from "lucide-svelte";
|
||||
import Search from "@lucide/svelte/icons/search";
|
||||
import FileText from "@lucide/svelte/icons/file-text";
|
||||
import Loader2 from "@lucide/svelte/icons/loader-2";
|
||||
|
||||
import { onMount, onDestroy } from "svelte";
|
||||
import type { DocsSearchResult } from "$lib/types/docs-search";
|
||||
import clientResolver from "$lib/client/resolver.js";
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
<script lang="ts">
|
||||
import type { DocsConfig, DocsSidebarGroup, DocsPage } from "$lib/types/docs";
|
||||
import { ChevronDown, ChevronRight } from "lucide-svelte";
|
||||
import ChevronDown from "@lucide/svelte/icons/chevron-down";
|
||||
import ChevronRight from "@lucide/svelte/icons/chevron-right";
|
||||
|
||||
import { base } from "$app/paths";
|
||||
|
||||
interface Props {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<script lang="ts">
|
||||
import type { DocsTableOfContentsItem } from "$lib/types/docs";
|
||||
import { onMount } from "svelte";
|
||||
|
||||
interface Props {
|
||||
items: DocsTableOfContentsItem[];
|
||||
@@ -10,7 +9,10 @@
|
||||
|
||||
let activeId = $state<string>("");
|
||||
|
||||
onMount(() => {
|
||||
$effect(() => {
|
||||
// Re-run whenever items changes (e.g. on soft navigation)
|
||||
const currentItems = items;
|
||||
|
||||
const observer = new IntersectionObserver(
|
||||
(entries) => {
|
||||
for (const entry of entries) {
|
||||
@@ -25,15 +27,20 @@
|
||||
}
|
||||
);
|
||||
|
||||
// Observe all headings
|
||||
for (const item of items) {
|
||||
const element = document.getElementById(item.id);
|
||||
if (element) {
|
||||
observer.observe(element);
|
||||
// Wait a tick for the DOM to update with new content
|
||||
const timeout = setTimeout(() => {
|
||||
for (const item of currentItems) {
|
||||
const element = document.getElementById(item.id);
|
||||
if (element) {
|
||||
observer.observe(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, 50);
|
||||
|
||||
return () => observer.disconnect();
|
||||
return () => {
|
||||
clearTimeout(timeout);
|
||||
observer.disconnect();
|
||||
};
|
||||
});
|
||||
|
||||
function scrollToHeading(id: string) {
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
---
|
||||
title: Architecture
|
||||
description: Technical architecture overview of Kener — how the server, schedulers, queues, database, and build system fit together
|
||||
---
|
||||
|
||||
Kener is a SvelteKit application powered by an Express server, background schedulers, and BullMQ queues. In production, everything runs as a single Node.js process.
|
||||
|
||||
## High-Level Overview {#high-level-overview}
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Node.js Process │
|
||||
│ │
|
||||
│ ┌───────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||||
│ │ Express │───▶│ SvelteKit │ │ Schedulers │ │
|
||||
│ │ Server │ │ Handler │ │ (BullMQ) │ │
|
||||
│ └───────────┘ └──────────────┘ └──────┬───────┘ │
|
||||
│ │ │
|
||||
│ ┌──────▼───────┐ │
|
||||
│ │ Queues │ │
|
||||
│ │ (BullMQ) │ │
|
||||
│ └──────┬───────┘ │
|
||||
│ │ │
|
||||
│ ┌──────────────────────────────────────────▼────────┐ │
|
||||
│ │ Database (Knex.js) │ │
|
||||
│ │ SQLite │ PostgreSQL │ MySQL │ │
|
||||
│ └───────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌───────────────────────────────────────────────────┐ │
|
||||
│ │ Redis (BullMQ backend) │ │
|
||||
│ └───────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
The Express server handles HTTP requests and delegates to SvelteKit for all page rendering and API routes. Background schedulers poll monitors on a cron schedule and push results through a pipeline of queues for processing, storage, and alerting.
|
||||
|
||||
## Production Entry Point {#production-entry-point}
|
||||
|
||||
The production server is defined in `scripts/main.ts` and bundled into `build/main.js` at build time. On startup it:
|
||||
|
||||
1. Creates an Express app
|
||||
2. Mounts a `/healthcheck` endpoint
|
||||
3. Mounts the SvelteKit handler for all other routes
|
||||
4. Listens on `PORT` (default 3000)
|
||||
5. Runs database migrations and seeds
|
||||
6. Starts the background schedulers via `Startup()`
|
||||
7. Registers graceful shutdown handlers for `SIGTERM` and `SIGINT`
|
||||
|
||||
## Development vs Production {#dev-vs-prod}
|
||||
|
||||
| Aspect | Development | Production |
|
||||
| :-------------- | :------------------------------- | :--------------------------------------------- |
|
||||
| SvelteKit | `vite dev` with HMR | Pre-built `build/handler.js` served by Express |
|
||||
| Background jobs | Separate process via `vite-node` | Same process, bundled into `build/main.js` |
|
||||
| TypeScript | JIT compiled | Pre-compiled to JavaScript by esbuild |
|
||||
| Start command | `npm run dev` | `npm start` → `node build/main.js` |
|
||||
|
||||
## Route Groups {#route-groups}
|
||||
|
||||
SvelteKit routes are organized into groups under `src/routes/`:
|
||||
|
||||
| Route Group | Purpose | Example Routes |
|
||||
| :----------- | :---------------------------------- | :------------------------------------------------- |
|
||||
| `(kener)/` | Public status pages | `/`, `/[page_path]`, `/badge/`, `/incidents/` |
|
||||
| `(manage)/` | Admin dashboard (authenticated) | `/manage/app/monitors/`, `/manage/app/incidents/` |
|
||||
| `(api)/` | REST API for external consumers | `/api/monitors/`, `/api/incidents/`, `/api/pages/` |
|
||||
| `(embed)/` | Embeddable status widgets | `/embed/monitor-[tag]/`, `/embed/latency-[tag]/` |
|
||||
| `(docs)/` | Documentation site (Markdown-based) | `/docs/`, `/docs/monitors/api` |
|
||||
| `(account)/` | Authentication pages | `/account/signin/`, `/account/logout/` |
|
||||
| `(assets)/` | Uploaded asset serving | `/assets/images/` |
|
||||
|
||||
## Server Architecture {#server-architecture}
|
||||
|
||||
### Services {#services}
|
||||
|
||||
Monitor execution logic lives in `src/lib/server/services/`. Each monitor type has a dedicated service class:
|
||||
|
||||
| Service | Monitor Type | Description |
|
||||
| :----------------- | :----------- | :---------------------------------- |
|
||||
| `apiCall.ts` | API | HTTP/HTTPS endpoint monitoring |
|
||||
| `pingCall.ts` | PING | ICMP ping checks |
|
||||
| `tcpCall.ts` | TCP | TCP port connectivity |
|
||||
| `dnsCall.ts` | DNS | DNS record resolution |
|
||||
| `sslCall.ts` | SSL | SSL certificate validity/expiry |
|
||||
| `sqlCall.ts` | SQL | Database query monitoring |
|
||||
| `heartbeatCall.ts` | HEARTBEAT | Passive push-based monitoring |
|
||||
| `gamedigCall.ts` | GAMEDIG | Game server monitoring |
|
||||
| `groupCall.ts` | GROUP | Aggregates status of child monitors |
|
||||
|
||||
The `service.ts` factory dispatches to the correct implementation based on the monitor's `monitor_type` field.
|
||||
|
||||
### Schedulers {#schedulers}
|
||||
|
||||
Schedulers live in `src/lib/server/schedulers/` and use BullMQ repeatable jobs:
|
||||
|
||||
| Scheduler | Interval | Responsibility |
|
||||
| :------------------------ | :--------------- | :------------------------------------------------------------------------------------------------------------ |
|
||||
| `appScheduler.ts` | Every 10 seconds | Orchestrates per-monitor schedulers — adds, removes, or updates them based on active monitors in the database |
|
||||
| `monitorSchedulers.ts` | Per-monitor cron | Triggers monitor execution using each monitor's configured cron expression |
|
||||
| `maintenanceScheduler.ts` | Every 60 seconds | Generates upcoming maintenance events from RRULE patterns for the next 7 days |
|
||||
|
||||
### Queues {#queues}
|
||||
|
||||
Queues live in `src/lib/server/queues/` and form a processing pipeline backed by Redis via BullMQ:
|
||||
|
||||
```
|
||||
Scheduler (cron trigger)
|
||||
│
|
||||
▼
|
||||
monitorExecuteQueue ─── Runs the monitor service (API, Ping, etc.)
|
||||
│
|
||||
▼
|
||||
monitorResponseQueue ── Stores results in DB, updates cache
|
||||
│
|
||||
▼
|
||||
alertingQueue ────────── Evaluates alert rules, creates/resolves incidents
|
||||
│
|
||||
▼
|
||||
subscriberQueue ──────── Fans out notifications to subscribers
|
||||
│
|
||||
▼
|
||||
emailQueue ───────────── Sends individual emails
|
||||
```
|
||||
|
||||
Each queue has configurable retries (3 attempts with exponential backoff) and deduplication to prevent duplicate processing.
|
||||
|
||||
### Middleware {#middleware}
|
||||
|
||||
The SvelteKit `handle` hook in `src/hooks.server.ts` runs on every request and provides:
|
||||
|
||||
1. **API authentication** — validates Bearer tokens on all `/api/*` routes (except public endpoints)
|
||||
2. **Resource loading** — fetches monitors, incidents, maintenances, or pages from the database and attaches them to `event.locals` for downstream handlers
|
||||
3. **Search index** — initializes the documentation full-text search index on startup
|
||||
|
||||
## Database Layer {#database-layer}
|
||||
|
||||
Kener uses **Knex.js** as a query builder with support for three database backends:
|
||||
|
||||
| Database | Connection Prefix | Driver |
|
||||
| :--------- | :---------------- | :--------------- |
|
||||
| SQLite | `sqlite://` | `better-sqlite3` |
|
||||
| PostgreSQL | `postgresql://` | `pg` |
|
||||
| MySQL | `mysql://` | `mysql2` |
|
||||
|
||||
### Repository Pattern {#repository-pattern}
|
||||
|
||||
The database layer follows a repository pattern:
|
||||
|
||||
- **`src/lib/server/db/repositories/`** — domain-specific repository classes (monitors, incidents, alerts, users, etc.)
|
||||
- **`src/lib/server/db/dbimpl.ts`** — facade that composes all repositories and exposes their methods through a single interface
|
||||
- **`src/lib/server/db/db.ts`** — exports a singleton `DbImpl` instance used throughout the application
|
||||
|
||||
All database access goes through the singleton: `import db from "$lib/server/db/db"`.
|
||||
|
||||
### Migrations {#migrations}
|
||||
|
||||
Migrations are stored in `migrations/` and run automatically on startup via `db.migrate.latest()`. They cover schema changes for monitors, incidents, subscriptions, maintenances, alerting, and more.
|
||||
|
||||
## Build System {#build-system}
|
||||
|
||||
The build process has two stages:
|
||||
|
||||
### Stage 1: SvelteKit Build {#sveltekit-build}
|
||||
|
||||
`vite build` compiles the SvelteKit application into `build/`:
|
||||
|
||||
- `build/handler.js` — the SvelteKit request handler
|
||||
- `build/server/` — SSR chunks
|
||||
- `build/client/` — static assets
|
||||
|
||||
### Stage 2: Server Build {#server-build}
|
||||
|
||||
`node scripts/build-server.js` uses **esbuild** to bundle `main.ts` and all its server dependencies into `build/main.js`:
|
||||
|
||||
- Bundles all project TypeScript into a single ESM file
|
||||
- Externalizes `node_modules` (resolved at runtime) except CJS packages that need ESM conversion
|
||||
- Resolves the `$lib` path alias so SvelteKit imports work outside the Vite context
|
||||
- Injects the package version at build time
|
||||
|
||||
### Build Commands {#build-commands}
|
||||
|
||||
| Command | What It Does |
|
||||
| :------------------------ | :------------------------------------------- |
|
||||
| `npm run build` | Full production build (SvelteKit + server) |
|
||||
| `npm run build:sveltekit` | SvelteKit build only |
|
||||
| `npm run build:server` | Server build only |
|
||||
| `npm start` | Run production server (`node build/main.js`) |
|
||||
|
||||
## Graceful Shutdown {#graceful-shutdown}
|
||||
|
||||
When the process receives `SIGTERM` or `SIGINT`, the shutdown handler:
|
||||
|
||||
1. Stops all schedulers (app, monitor, maintenance)
|
||||
2. Drains and closes all queues (execute, response, alerting, subscriber, email)
|
||||
3. Closes the database connection
|
||||
4. Exits the process
|
||||
|
||||
This ensures in-flight jobs complete and no data is lost during deployments or restarts.
|
||||
|
||||
## Next Steps {#next-steps}
|
||||
|
||||
- [Environment Variables](/docs/setup/environment-variables) — required and optional configuration
|
||||
- [Database Setup](/docs/setup/database-setup) — choosing and configuring your database
|
||||
- [Redis Setup](/docs/setup/redis-setup) — configuring Redis for BullMQ queues
|
||||
- [Monitors](/docs/monitors/overview) — understanding monitor types and configuration
|
||||
@@ -1,6 +1,3 @@
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
import fm from "front-matter";
|
||||
import type { DocsConfig, DocsTableOfContentsItem, DocsPage, DocsPageData } from "$lib/types/docs";
|
||||
|
||||
@@ -10,19 +7,22 @@ interface DocsFrontMatter {
|
||||
description?: string;
|
||||
}
|
||||
|
||||
// Use __dirname equivalent for ES modules to get correct path
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
// Import docs.json directly as a module — bundled at build time
|
||||
import docsConfigJson from "../docs.json";
|
||||
|
||||
const DOCS_DIR = path.join(__dirname, "content");
|
||||
const DOCS_CONFIG_PATH = path.join(__dirname, "../docs.json");
|
||||
// Import all markdown files at build time using Vite's import.meta.glob
|
||||
// Keys are like: ./content/introduction.md, ./content/monitors/api.md, etc.
|
||||
const markdownFiles = import.meta.glob("./content/**/*.md", {
|
||||
query: "?raw",
|
||||
eager: true,
|
||||
import: "default",
|
||||
}) as Record<string, string>;
|
||||
|
||||
/**
|
||||
* Get the docs configuration
|
||||
*/
|
||||
export function getDocsConfig(): DocsConfig {
|
||||
const configContent = fs.readFileSync(DOCS_CONFIG_PATH, "utf-8");
|
||||
return JSON.parse(configContent) as DocsConfig;
|
||||
return docsConfigJson as DocsConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -84,23 +84,22 @@ export function getAdjacentPages(slug: string): { prev: DocsPage | null; next: D
|
||||
|
||||
/**
|
||||
* Read markdown file content for a given slug (raw, with front-matter)
|
||||
* Uses Vite's import.meta.glob so content is bundled at build time
|
||||
*/
|
||||
export function getRawMarkdownContent(slug: string): string | null {
|
||||
const filePath = path.join(DOCS_DIR, `${slug}.md`);
|
||||
|
||||
try {
|
||||
if (fs.existsSync(filePath)) {
|
||||
return fs.readFileSync(filePath, "utf-8");
|
||||
}
|
||||
// Try with index.md for nested folders
|
||||
const indexPath = path.join(DOCS_DIR, slug, "index.md");
|
||||
if (fs.existsSync(indexPath)) {
|
||||
return fs.readFileSync(indexPath, "utf-8");
|
||||
}
|
||||
return null;
|
||||
} catch {
|
||||
return null;
|
||||
// Try direct path first: ./content/{slug}.md
|
||||
const directKey = `./content/${slug}.md`;
|
||||
if (markdownFiles[directKey]) {
|
||||
return markdownFiles[directKey];
|
||||
}
|
||||
|
||||
// Try index path: ./content/{slug}/index.md
|
||||
const indexKey = `./content/${slug}/index.md`;
|
||||
if (markdownFiles[indexKey]) {
|
||||
return markdownFiles[indexKey];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<script lang="ts">
|
||||
import { resolve } from "$app/paths";
|
||||
import ChevronLeft from "lucide-svelte/icons/chevron-left";
|
||||
import Clock from "lucide-svelte/icons/clock";
|
||||
import AlertTriangle from "lucide-svelte/icons/alert-triangle";
|
||||
import MessageSquare from "lucide-svelte/icons/message-square";
|
||||
import Monitor from "lucide-svelte/icons/monitor";
|
||||
import ChevronLeft from "@lucide/svelte/icons/chevron-left";
|
||||
import Clock from "@lucide/svelte/icons/clock";
|
||||
import AlertTriangle from "@lucide/svelte/icons/alert-triangle";
|
||||
import MessageSquare from "@lucide/svelte/icons/message-square";
|
||||
import Monitor from "@lucide/svelte/icons/monitor";
|
||||
import ArrowRight from "@lucide/svelte/icons/arrow-right";
|
||||
import * as Item from "$lib/components/ui/item/index.js";
|
||||
import { Button } from "$lib/components/ui/button/index.js";
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<script lang="ts">
|
||||
import { resolve } from "$app/paths";
|
||||
import { onMount } from "svelte";
|
||||
import Clock from "lucide-svelte/icons/clock";
|
||||
import Calendar from "lucide-svelte/icons/calendar";
|
||||
import Monitor from "lucide-svelte/icons/monitor";
|
||||
import Clock from "@lucide/svelte/icons/clock";
|
||||
import Calendar from "@lucide/svelte/icons/calendar";
|
||||
import Monitor from "@lucide/svelte/icons/monitor";
|
||||
import ArrowRight from "@lucide/svelte/icons/arrow-right";
|
||||
import Repeat from "@lucide/svelte/icons/repeat";
|
||||
import * as Item from "$lib/components/ui/item/index.js";
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import i18n from "$lib/i18n/server";
|
||||
import { redirect } from "@sveltejs/kit";
|
||||
import MobileDetect from "mobile-detect";
|
||||
import type { LayoutServerLoad } from "./$types";
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
import GlobeIcon from "@lucide/svelte/icons/globe";
|
||||
import ClockIcon from "@lucide/svelte/icons/clock";
|
||||
import { toast } from "svelte-sonner";
|
||||
import localesData from "$lib/locales/locales.json";
|
||||
import { availableLocalesList } from "$lib/stores/i18n";
|
||||
import { resolve } from "$app/paths";
|
||||
import clientResolver from "$lib/client/resolver.js";
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
let tzToggle = $state("NO");
|
||||
let i18n = $state<I18nConfig>({
|
||||
defaultLocale: "en",
|
||||
locales: localesData.map((el) => ({
|
||||
locales: availableLocalesList.map((el) => ({
|
||||
code: el.code,
|
||||
name: el.name,
|
||||
selected: el.code === "en",
|
||||
@@ -66,7 +66,7 @@
|
||||
const existingLocales = result.i18n.locales || [];
|
||||
i18n = {
|
||||
defaultLocale: result.i18n.defaultLocale || "en",
|
||||
locales: localesData.map((el) => {
|
||||
locales: availableLocalesList.map((el) => {
|
||||
const existing = existingLocales.find((l: Locale) => l.code === el.code);
|
||||
return {
|
||||
code: el.code,
|
||||
|
||||
@@ -1,120 +0,0 @@
|
||||
{
|
||||
"Under Maintenance": "Under Maintenance",
|
||||
"All Systems Operational": "All Systems Operational",
|
||||
"Degraded Performance": "Degraded Performance",
|
||||
"Partial Degraded Performance": "Partial Degraded Performance",
|
||||
"Partial System Outage": "Partial System Outage",
|
||||
"Major System Outage": "Major System Outage",
|
||||
"No Status Available": "No Status Available",
|
||||
"Maintenances": "Maintenances",
|
||||
"Events": "Events",
|
||||
"Select Language": "Select Language",
|
||||
"Incidents": "Incidents",
|
||||
"Ongoing": "Ongoing",
|
||||
"Upcoming": "Upcoming",
|
||||
"Past": "Past",
|
||||
"Back": "Back",
|
||||
"Subscribe": "Subscribe",
|
||||
"Available Components": "Available Components",
|
||||
"Minute-by-minute status data for this day": "Minute-by-minute status data for this day",
|
||||
"Recent Incidents": "Recent Incidents",
|
||||
"Home": "Home",
|
||||
"Status": "Status",
|
||||
"Latency": "Latency",
|
||||
"Failed to load latency data": "Failed to load latency data",
|
||||
"No incidents for this day": "No incidents for this day",
|
||||
"No maintenances for this day": "No maintenances for this day",
|
||||
"No latency data available for this day": "No latency data available for this day",
|
||||
"Latency Over Time": "Latency Over Time",
|
||||
"Average Latency": "Average Latency",
|
||||
"Failed to load status data for this day": "Failed to load status data for this day",
|
||||
"Per-Minute Status": "Per-Minute Status",
|
||||
"Day Uptime": "Day Uptime",
|
||||
"Last Updated": "Last Updated",
|
||||
"Latest Status": "Latest Status",
|
||||
"Latest Latency": "Latest Latency",
|
||||
"Ongoing Incidents": "Ongoing Incidents",
|
||||
"Latency Trend": "Latency Trend",
|
||||
"Avg Latency": "Avg Latency",
|
||||
"Uptime": "Uptime",
|
||||
"Select Range": "Select Range",
|
||||
"Status history and latency trend": "Status history and latency trend",
|
||||
"Timeline": "Timeline",
|
||||
"Start Time": "Start Time",
|
||||
"End Time": "End Time",
|
||||
"Duration": "Duration",
|
||||
"UP": "UP",
|
||||
"DOWN": "DOWN",
|
||||
"MAINTENANCE": "MAINTENANCE",
|
||||
"NO_DATA": "NO DATA",
|
||||
"DEGRADED": "DEGRADED",
|
||||
"INVESTIGATING": "INVESTIGATING",
|
||||
"IDENTIFIED": "IDENTIFIED",
|
||||
"MONITORING": "MONITORING",
|
||||
"RESOLVED": "RESOLVED",
|
||||
"No updates yet": "No updates yet",
|
||||
"Affected Monitors (%count)": "Affected Monitors (%count)",
|
||||
"No monitors affected": "No monitors affected",
|
||||
"Unknown impact": "Unknown impact",
|
||||
"Updates (%count)": "Updates (%count)",
|
||||
"Impact": "Impact",
|
||||
"One-time": "One-time",
|
||||
"In Progress": "In Progress",
|
||||
"Maintenance": "Maintenance",
|
||||
"Total <br /> Maintenances": "Total <br /> Maintenances",
|
||||
"Total <br /> Incidents": "Total <br /> Incidents",
|
||||
"There are no incidents or maintenances scheduled for this month.": "There are no incidents or maintenances scheduled for this month.",
|
||||
"No Events in %currentMonth": "No Events in %currentMonth",
|
||||
"Ongoing <br /> Incidents": "Ongoing <br /> Incidents",
|
||||
"Ongoing <br /> Maintenances": "Ongoing <br /> Maintenances",
|
||||
"Upcoming <br /> Maintenances": "Upcoming <br /> Maintenances",
|
||||
"Copied": "Copied",
|
||||
"Badges": "Badges",
|
||||
"Get badges for this monitor": "Get badges for this monitor",
|
||||
"Status Badge": "Status Badge",
|
||||
"Uptime Badge": "Uptime Badge",
|
||||
"Live Status": "Live Status",
|
||||
"Standard": "Standard",
|
||||
"Pinging": "Pinging",
|
||||
"Embed Monitor": "Embed Monitor",
|
||||
"Embed this monitor in your website or app": "Embed this monitor in your website or app",
|
||||
"Status Embed": "Status Embed",
|
||||
"Latency Embed": "Latency Embed",
|
||||
"Theme": "Theme",
|
||||
"Light": "Light",
|
||||
"Dark": "Dark",
|
||||
"Format": "Format",
|
||||
"iFrame": "iFrame",
|
||||
"Script": "Script",
|
||||
"Failed to load data": "Failed to load data",
|
||||
"90 Days": "90 Days",
|
||||
"30 Days": "30 Days",
|
||||
"7 Days": "7 Days",
|
||||
"24 Hours": "24 Hours",
|
||||
"Incident": "Incident",
|
||||
"Subscribe to Updates": "Subscribe to Updates",
|
||||
"Get notified about incidents and scheduled maintenance.": "Get notified about incidents and scheduled maintenance.",
|
||||
"Enter the verification code sent to your email.": "Enter the verification code sent to your email.",
|
||||
"Manage your notification preferences.": "Manage your notification preferences.",
|
||||
"Loading your preferences...": "Loading your preferences...",
|
||||
"Email address": "Email address",
|
||||
"Please enter a valid email address": "Please enter a valid email address",
|
||||
"Failed to send verification code": "Failed to send verification code",
|
||||
"Network error. Please try again.": "Network error. Please try again.",
|
||||
"Sending...": "Sending...",
|
||||
"Continue": "Continue",
|
||||
"We sent a 6-digit code to": "We sent a 6-digit code to",
|
||||
"Please enter the 6-digit verification code": "Please enter the 6-digit verification code",
|
||||
"Verification failed": "Verification failed",
|
||||
"Didn't receive the code? Resend": "Didn't receive the code? Resend",
|
||||
"Incident Updates": "Incident Updates",
|
||||
"Get notified about incidents updates": "Get notified about incidents updates",
|
||||
"Maintenance Updates": "Maintenance Updates",
|
||||
"Get notified about scheduled maintenance": "Get notified about scheduled maintenance",
|
||||
"Failed to update preference": "Failed to update preference",
|
||||
"No ongoing maintenances": "No ongoing maintenances",
|
||||
"No upcoming maintenances": "No upcoming maintenances",
|
||||
"No past maintenances": "No past maintenances",
|
||||
"Read more": "Read more",
|
||||
"Read less": "Read less"
|
||||
}
|
||||
@@ -1,120 +0,0 @@
|
||||
{
|
||||
"Under Maintenance": "रखरखाव जारी है",
|
||||
"All Systems Operational": "सभी सिस्टम चालू हैं",
|
||||
"Degraded Performance": "प्रदर्शन घटा हुआ है",
|
||||
"Partial Degraded Performance": "आंशिक रूप से प्रदर्शन घटा हुआ है",
|
||||
"Partial System Outage": "आंशिक सिस्टम आउटेज",
|
||||
"Major System Outage": "मुख्य सिस्टम आउटेज",
|
||||
"No Status Available": "कोई स्थिति उपलब्ध नहीं",
|
||||
"Maintenances": "रखरखाव",
|
||||
"Events": "घटनाएँ",
|
||||
"Select Language": "भाषा चुनें",
|
||||
"Incidents": "घटनाएँ",
|
||||
"Ongoing": "चल रहा है",
|
||||
"Upcoming": "आने वाला",
|
||||
"Past": "बीता हुआ",
|
||||
"Back": "वापस",
|
||||
"Subscribe": "सब्सक्राइब करें",
|
||||
"Available Components": "उपलब्ध घटक",
|
||||
"Minute-by-minute status data for this day": "इस दिन के लिए मिनट-दर-मिनट स्थिति डेटा",
|
||||
"Recent Incidents": "हालिया घटनाएँ",
|
||||
"Home": "होम",
|
||||
"Status": "स्थिति",
|
||||
"Latency": "लेटेंसी",
|
||||
"Failed to load latency data": "लेटेंसी डेटा लोड करने में विफल",
|
||||
"No incidents for this day": "इस दिन के लिए कोई घटना नहीं",
|
||||
"No maintenances for this day": "इस दिन के लिए कोई रखरखाव नहीं",
|
||||
"No latency data available for this day": "इस दिन के लिए कोई लेटेंसी डेटा उपलब्ध नहीं",
|
||||
"Latency Over Time": "समय के साथ लेटेंसी",
|
||||
"Average Latency": "औसत लेटेंसी",
|
||||
"Failed to load status data for this day": "इस दिन के लिए स्थिति डेटा लोड करने में विफल",
|
||||
"Per-Minute Status": "प्रति मिनट स्थिति",
|
||||
"Day Uptime": "दिन का अपटाइम",
|
||||
"Last Updated": "अंतिम अपडेट",
|
||||
"Latest Status": "नवीनतम स्थिति",
|
||||
"Latest Latency": "नवीनतम लेटेंसी",
|
||||
"Ongoing Incidents": "चल रही घटनाएँ",
|
||||
"Latency Trend": "लेटेंसी प्रवृत्ति",
|
||||
"Avg Latency": "औसत लेटेंसी",
|
||||
"Uptime": "अपटाइम",
|
||||
"Select Range": "रेंज चुनें",
|
||||
"Status history and latency trend": "स्थिति इतिहास और लेटेंसी प्रवृत्ति",
|
||||
"Timeline": "समयरेखा",
|
||||
"Start Time": "प्रारंभ समय",
|
||||
"End Time": "समाप्ति समय",
|
||||
"Duration": "अवधि",
|
||||
"UP": "चालू",
|
||||
"DOWN": "बंद",
|
||||
"MAINTENANCE": "रखरखाव",
|
||||
"NO_DATA": "कोई डेटा नहीं",
|
||||
"DEGRADED": "घटा हुआ",
|
||||
"INVESTIGATING": "जांच जारी",
|
||||
"IDENTIFIED": "पहचाना गया",
|
||||
"MONITORING": "निगरानी जारी",
|
||||
"RESOLVED": "हल हो गया",
|
||||
"No updates yet": "अभी तक कोई अपडेट नहीं",
|
||||
"Affected Monitors (%count)": "प्रभावित मॉनिटर (%count)",
|
||||
"No monitors affected": "कोई मॉनिटर प्रभावित नहीं",
|
||||
"Unknown impact": "अज्ञात प्रभाव",
|
||||
"Updates (%count)": "अपडेट (%count)",
|
||||
"Impact": "प्रभाव",
|
||||
"One-time": "एक बार",
|
||||
"In Progress": "प्रगति में",
|
||||
"Maintenance": "रखरखाव",
|
||||
"Total <br /> Maintenances": "कुल <br /> रखरखाव",
|
||||
"Total <br /> Incidents": "कुल <br /> घटनाएँ",
|
||||
"There are no incidents or maintenances scheduled for this month.": "इस महीने के लिए कोई घटना या रखरखाव निर्धारित नहीं है।",
|
||||
"No Events in %currentMonth": "%currentMonth में कोई घटना नहीं",
|
||||
"Ongoing <br /> Incidents": "चल रही <br /> घटनाएँ",
|
||||
"Ongoing <br /> Maintenances": "चल रहा <br /> रखरखाव",
|
||||
"Upcoming <br /> Maintenances": "आने वाला <br /> रखरखाव",
|
||||
"Copied": "कॉपी किया गया",
|
||||
"Badges": "बैज",
|
||||
"Get badges for this monitor": "इस मॉनिटर के लिए बैज प्राप्त करें",
|
||||
"Status Badge": "स्थिति बैज",
|
||||
"Uptime Badge": "अपटाइम बैज",
|
||||
"Live Status": "लाइव स्थिति",
|
||||
"Standard": "मानक",
|
||||
"Pinging": "पिंग हो रहा है",
|
||||
"Embed Monitor": "मॉनिटर एम्बेड करें",
|
||||
"Embed this monitor in your website or app": "इस मॉनिटर को अपनी वेबसाइट या ऐप में एम्बेड करें",
|
||||
"Status Embed": "स्थिति एम्बेड",
|
||||
"Latency Embed": "लेटेंसी एम्बेड",
|
||||
"Theme": "थीम",
|
||||
"Light": "लाइट",
|
||||
"Dark": "डार्क",
|
||||
"Format": "फॉर्मेट",
|
||||
"iFrame": "iFrame",
|
||||
"Script": "स्क्रिप्ट",
|
||||
"Failed to load data": "डेटा लोड करने में विफल",
|
||||
"90 Days": "90 दिन",
|
||||
"30 Days": "30 दिन",
|
||||
"7 Days": "7 दिन",
|
||||
"24 Hours": "24 घंटे",
|
||||
"Incident": "घटना",
|
||||
"Subscribe to Updates": "अपडेट के लिए सब्सक्राइब करें",
|
||||
"Get notified about incidents and scheduled maintenance.": "घटनाओं और निर्धारित रखरखाव के बारे में सूचित हों।",
|
||||
"Enter the verification code sent to your email.": "अपने ईमेल पर भेजा गया सत्यापन कोड दर्ज करें।",
|
||||
"Manage your notification preferences.": "अपनी सूचना प्राथमिकताएँ प्रबंधित करें।",
|
||||
"Loading your preferences...": "आपकी प्राथमिकताएँ लोड हो रही हैं...",
|
||||
"Email address": "ईमेल पता",
|
||||
"Please enter a valid email address": "कृपया एक मान्य ईमेल पता दर्ज करें",
|
||||
"Failed to send verification code": "सत्यापन कोड भेजने में विफल",
|
||||
"Network error. Please try again.": "नेटवर्क त्रुटि। कृपया पुनः प्रयास करें।",
|
||||
"Sending...": "भेजा जा रहा है...",
|
||||
"Continue": "जारी रखें",
|
||||
"We sent a 6-digit code to": "हमने 6 अंकों का कोड भेजा है",
|
||||
"Please enter the 6-digit verification code": "कृपया 6 अंकों का सत्यापन कोड दर्ज करें",
|
||||
"Verification failed": "सत्यापन विफल रहा",
|
||||
"Didn't receive the code? Resend": "कोड नहीं मिला? फिर से भेजें",
|
||||
"Incident Updates": "घटना अपडेट",
|
||||
"Get notified about incidents updates": "घटना अपडेट के बारे में सूचित हों",
|
||||
"Maintenance Updates": "रखरखाव अपडेट",
|
||||
"Get notified about scheduled maintenance": "निर्धारित रखरखाव के बारे में सूचित हों",
|
||||
"Failed to update preference": "प्राथमिकता अपडेट करने में विफल",
|
||||
"No ongoing maintenances": "कोई चल रहा रखरखाव नहीं",
|
||||
"No upcoming maintenances": "कोई आने वाला रखरखाव नहीं",
|
||||
"No past maintenances": "कोई बीता हुआ रखरखाव नहीं",
|
||||
"Read more": "और पढ़ें",
|
||||
"Read less": "कम पढ़ें"
|
||||
}
|
||||
@@ -1,120 +0,0 @@
|
||||
{
|
||||
"Under Maintenance": "На обслуживании",
|
||||
"All Systems Operational": "Все системы работают",
|
||||
"Degraded Performance": "Сниженная производительность",
|
||||
"Partial Degraded Performance": "Частично снижена производительность",
|
||||
"Partial System Outage": "Частичный сбой системы",
|
||||
"Major System Outage": "Крупный сбой системы",
|
||||
"No Status Available": "Статус недоступен",
|
||||
"Maintenances": "Обслуживание",
|
||||
"Events": "События",
|
||||
"Select Language": "Выберите язык",
|
||||
"Incidents": "Инциденты",
|
||||
"Ongoing": "Текущие",
|
||||
"Upcoming": "Предстоящие",
|
||||
"Past": "Прошедшие",
|
||||
"Back": "Назад",
|
||||
"Subscribe": "Подписаться",
|
||||
"Available Components": "Доступные компоненты",
|
||||
"Minute-by-minute status data for this day": "Поминутные данные о статусе за этот день",
|
||||
"Recent Incidents": "Недавние инциденты",
|
||||
"Home": "Главная",
|
||||
"Status": "Статус",
|
||||
"Latency": "Задержка",
|
||||
"Failed to load latency data": "Не удалось загрузить данные о задержке",
|
||||
"No incidents for this day": "Нет инцидентов за этот день",
|
||||
"No maintenances for this day": "Нет обслуживания за этот день",
|
||||
"No latency data available for this day": "Нет данных о задержке за этот день",
|
||||
"Latency Over Time": "Задержка во времени",
|
||||
"Average Latency": "Средняя задержка",
|
||||
"Failed to load status data for this day": "Не удалось загрузить данные о статусе за этот день",
|
||||
"Per-Minute Status": "Статус по минутам",
|
||||
"Day Uptime": "Время работы за день",
|
||||
"Last Updated": "Последнее обновление",
|
||||
"Latest Status": "Последний статус",
|
||||
"Latest Latency": "Последняя задержка",
|
||||
"Ongoing Incidents": "Текущие инциденты",
|
||||
"Latency Trend": "Тренд задержки",
|
||||
"Avg Latency": "Средняя задержка",
|
||||
"Uptime": "Время работы",
|
||||
"Select Range": "Выберите диапазон",
|
||||
"Status history and latency trend": "История статусов и тренд задержки",
|
||||
"Timeline": "Временная шкала",
|
||||
"Start Time": "Время начала",
|
||||
"End Time": "Время окончания",
|
||||
"Duration": "Продолжительность",
|
||||
"UP": "РАБОТАЕТ",
|
||||
"DOWN": "НЕ РАБОТАЕТ",
|
||||
"MAINTENANCE": "ОБСЛУЖИВАНИЕ",
|
||||
"NO_DATA": "НЕТ ДАННЫХ",
|
||||
"DEGRADED": "СНИЖЕНА",
|
||||
"INVESTIGATING": "РАССЛЕДУЕТСЯ",
|
||||
"IDENTIFIED": "ОБНАРУЖЕНО",
|
||||
"MONITORING": "МОНИТОРИНГ",
|
||||
"RESOLVED": "РЕШЕНО",
|
||||
"No updates yet": "Обновлений пока нет",
|
||||
"Affected Monitors (%count)": "Затронутые мониторы (%count)",
|
||||
"No monitors affected": "Мониторы не затронуты",
|
||||
"Unknown impact": "Неизвестное влияние",
|
||||
"Updates (%count)": "Обновления (%count)",
|
||||
"Impact": "Влияние",
|
||||
"One-time": "Одноразовое",
|
||||
"In Progress": "В процессе",
|
||||
"Maintenance": "Обслуживание",
|
||||
"Total <br /> Maintenances": "Всего <br /> обслуживаний",
|
||||
"Total <br /> Incidents": "Всего <br /> инцидентов",
|
||||
"There are no incidents or maintenances scheduled for this month.": "На этот месяц не запланировано инцидентов или обслуживания.",
|
||||
"No Events in %currentMonth": "Нет событий в %currentMonth",
|
||||
"Ongoing <br /> Incidents": "Текущие <br /> инциденты",
|
||||
"Ongoing <br /> Maintenances": "Текущее <br /> обслуживание",
|
||||
"Upcoming <br /> Maintenances": "Предстоящее <br /> обслуживание",
|
||||
"Copied": "Скопировано",
|
||||
"Badges": "Значки",
|
||||
"Get badges for this monitor": "Получить значки для этого монитора",
|
||||
"Status Badge": "Значок статуса",
|
||||
"Uptime Badge": "Значок времени работы",
|
||||
"Live Status": "Статус в реальном времени",
|
||||
"Standard": "Стандартный",
|
||||
"Pinging": "Проверка связи",
|
||||
"Embed Monitor": "Встроить монитор",
|
||||
"Embed this monitor in your website or app": "Встройте этот монитор на ваш сайт или в приложение",
|
||||
"Status Embed": "Встроенный статус",
|
||||
"Latency Embed": "Встроенная задержка",
|
||||
"Theme": "Тема",
|
||||
"Light": "Светлая",
|
||||
"Dark": "Темная",
|
||||
"Format": "Формат",
|
||||
"iFrame": "iFrame",
|
||||
"Script": "Скрипт",
|
||||
"Failed to load data": "Не удалось загрузить данные",
|
||||
"90 Days": "90 дней",
|
||||
"30 Days": "30 дней",
|
||||
"7 Days": "7 дней",
|
||||
"24 Hours": "24 часа",
|
||||
"Incident": "Инцидент",
|
||||
"Subscribe to Updates": "Подписаться на обновления",
|
||||
"Get notified about incidents and scheduled maintenance.": "Получайте уведомления об инцидентах и плановом обслуживании.",
|
||||
"Enter the verification code sent to your email.": "Введите код подтверждения, отправленный на вашу почту.",
|
||||
"Manage your notification preferences.": "Управляйте настройками уведомлений.",
|
||||
"Loading your preferences...": "Загрузка настроек...",
|
||||
"Email address": "Адрес электронной почты",
|
||||
"Please enter a valid email address": "Пожалуйста, введите действительный адрес электронной почты",
|
||||
"Failed to send verification code": "Не удалось отправить код подтверждения",
|
||||
"Network error. Please try again.": "Ошибка сети. Пожалуйста, попробуйте снова.",
|
||||
"Sending...": "Отправка...",
|
||||
"Continue": "Продолжить",
|
||||
"We sent a 6-digit code to": "Мы отправили 6-значный код на",
|
||||
"Please enter the 6-digit verification code": "Пожалуйста, введите 6-значный код подтверждения",
|
||||
"Verification failed": "Проверка не удалась",
|
||||
"Didn't receive the code? Resend": "Не получили код? Отправить повторно",
|
||||
"Incident Updates": "Обновления инцидентов",
|
||||
"Get notified about incidents updates": "Получайте уведомления об обновлениях инцидентов",
|
||||
"Maintenance Updates": "Обновления обслуживания",
|
||||
"Get notified about scheduled maintenance": "Получайте уведомления о плановом обслуживании",
|
||||
"Failed to update preference": "Не удалось обновить настройки",
|
||||
"No ongoing maintenances": "Нет текущих обслуживаний",
|
||||
"No upcoming maintenances": "Нет предстоящих обслуживаний",
|
||||
"No past maintenances": "Нет прошедших обслуживаний",
|
||||
"Read more": "Читать далее",
|
||||
"Read less": "Читать меньше"
|
||||
}
|
||||
Reference in New Issue
Block a user