chore(release): automatic release v1.12.0

This commit is contained in:
homarr-releases[bot]
2025-03-21 19:14:11 +00:00
committed by GitHub
52 changed files with 4414 additions and 1409 deletions

View File

@@ -31,6 +31,7 @@ body:
label: Version
description: What version of Homarr are you running?
options:
- 1.11.0
- 1.10.0
- 1.9.0
- 1.8.0

View File

@@ -56,13 +56,13 @@
"@mantine/tiptap": "^7.17.2",
"@million/lint": "1.0.14",
"@tabler/icons-react": "^3.31.0",
"@tanstack/react-query": "^5.68.0",
"@tanstack/react-query-devtools": "^5.68.0",
"@tanstack/react-query-next-experimental": "^5.68.0",
"@trpc/client": "next",
"@trpc/next": "next",
"@trpc/react-query": "next",
"@trpc/server": "next",
"@tanstack/react-query": "^5.69.0",
"@tanstack/react-query-devtools": "^5.69.0",
"@tanstack/react-query-next-experimental": "^5.69.0",
"@trpc/client": "^11.0.0",
"@trpc/next": "^11.0.0",
"@trpc/react-query": "^11.0.0",
"@trpc/server": "^11.0.0",
"@xterm/addon-canvas": "^0.7.0",
"@xterm/addon-fit": "0.10.0",
"@xterm/xterm": "^5.5.0",
@@ -81,7 +81,7 @@
"react-dom": "19.0.0",
"react-error-boundary": "^5.0.0",
"react-simple-code-editor": "^0.14.1",
"sass": "^1.85.1",
"sass": "^1.86.0",
"superjson": "2.2.2",
"swagger-ui-react": "^5.20.1",
"use-deep-compare-effect": "^1.8.1",
@@ -92,9 +92,9 @@
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/chroma-js": "3.1.1",
"@types/node": "^22.13.10",
"@types/node": "^22.13.11",
"@types/prismjs": "^1.26.5",
"@types/react": "19.0.10",
"@types/react": "19.0.12",
"@types/react-dom": "19.0.4",
"@types/swagger-ui-react": "^5.18.0",
"concurrently": "^9.1.2",

View File

@@ -7,11 +7,11 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
import { ReactQueryStreamedHydration } from "@tanstack/react-query-next-experimental";
import {
createWSClient,
httpBatchStreamLink,
httpLink,
isNonJsonSerializable,
loggerLink,
splitLink,
unstable_httpBatchStreamLink,
wsLink,
} from "@trpc/client";
import superjson from "superjson";
@@ -90,7 +90,7 @@ export function TRPCReactProvider(props: PropsWithChildren) {
url: getTrpcUrl(),
headers: createHeadersCallbackForSource("nextjs-react (form-data)"),
}),
false: unstable_httpBatchStreamLink({
false: httpBatchStreamLink({
transformer: superjson,
url: getTrpcUrl(),
maxURLLength: 2083, // Suggested by tRPC: https://trpc.io/docs/client/links/httpBatchLink#setting-a-maximum-url-length

View File

@@ -44,7 +44,7 @@
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/node": "^22.13.10",
"@types/node": "^22.13.11",
"dotenv-cli": "^8.0.0",
"eslint": "^9.22.0",
"prettier": "^3.5.3",

View File

@@ -40,20 +40,20 @@
"@semantic-release/release-notes-generator": "^14.0.3",
"@turbo/gen": "^2.4.4",
"@vitejs/plugin-react": "^4.3.4",
"@vitest/coverage-v8": "^3.0.8",
"@vitest/ui": "^3.0.8",
"@vitest/coverage-v8": "^3.0.9",
"@vitest/ui": "^3.0.9",
"conventional-changelog-conventionalcommits": "^8.0.0",
"cross-env": "^7.0.3",
"jsdom": "^26.0.0",
"prettier": "^3.5.3",
"semantic-release": "^24.2.3",
"testcontainers": "^10.20.0",
"testcontainers": "^10.21.0",
"turbo": "^2.4.4",
"typescript": "^5.8.2",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.0.8"
"vitest": "^3.0.9"
},
"packageManager": "pnpm@10.6.3",
"packageManager": "pnpm@10.6.5",
"engines": {
"node": ">=22.14.0"
},

View File

@@ -41,9 +41,9 @@
"@homarr/server-settings": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.1.0",
"@trpc/client": "next",
"@trpc/react-query": "next",
"@trpc/server": "next",
"@trpc/client": "^11.0.0",
"@trpc/react-query": "^11.0.0",
"@trpc/server": "^11.0.0",
"lodash.clonedeep": "^4.5.0",
"next": "15.1.7",
"pretty-print-error": "^1.1.2",

View File

@@ -13,6 +13,7 @@ import { notebookRouter } from "./notebook";
import { optionsRouter } from "./options";
import { rssFeedRouter } from "./rssFeed";
import { smartHomeRouter } from "./smart-home";
import { stockPriceRouter } from "./stocks";
import { weatherRouter } from "./weather";
export const widgetRouter = createTRPCRouter({
@@ -21,6 +22,7 @@ export const widgetRouter = createTRPCRouter({
app: appRouter,
dnsHole: dnsHoleRouter,
smartHome: smartHomeRouter,
stockPrice: stockPriceRouter,
mediaServer: mediaServerRouter,
calendar: calendarRouter,
downloads: downloadsRouter,

View File

@@ -0,0 +1,23 @@
import { z } from "zod";
import { fetchStockPriceHandler } from "@homarr/request-handler/stock-price";
import { stockPriceTimeFrames } from "../../../../widgets/src/stocks";
import { createTRPCRouter, publicProcedure } from "../../trpc";
const stockPriceInputSchema = z.object({
stock: z.string().nonempty(),
timeRange: z.enum(stockPriceTimeFrames.range),
timeInterval: z.enum(stockPriceTimeFrames.interval),
});
export const stockPriceRouter = createTRPCRouter({
getPriceHistory: publicProcedure.input(stockPriceInputSchema).query(async ({ input }) => {
const innerHandler = fetchStockPriceHandler.handler({
stock: input.stock,
timeRange: input.timeRange,
timeInterval: input.timeInterval,
});
return await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false });
}),
});

View File

@@ -25,11 +25,15 @@ export const constructBoardPermissions = (board: BoardPermissionsProps, session:
const creatorId = "creator" in board ? board.creator?.id : board.creatorId;
return {
hasFullAccess: session?.user.id === creatorId || (session?.user.permissions.includes("board-full-all") ?? false),
hasFullAccess:
session?.user.id === creatorId ||
board.userPermissions.some(({ permission }) => permission === "full") ||
board.groupPermissions.some(({ permission }) => permission === "full") ||
(session?.user.permissions.includes("board-full-all") ?? false),
hasChangeAccess:
session?.user.id === creatorId ||
board.userPermissions.some(({ permission }) => permission === "modify") ||
board.groupPermissions.some(({ permission }) => permission === "modify") ||
board.userPermissions.some(({ permission }) => permission === "modify" || permission === "full") ||
board.groupPermissions.some(({ permission }) => permission === "modify" || permission === "full") ||
(session?.user.permissions.includes("board-modify-all") ?? false) ||
(session?.user.permissions.includes("board-full-all") ?? false),
hasViewAccess:

View File

@@ -19,7 +19,7 @@ export const fixUsernames = command({
for (const user of credentialUsers) {
if (!user.name) continue;
if (user.name !== user.name.toLowerCase()) continue;
if (user.name === user.name.toLowerCase()) continue;
await db
.update(users)

View File

@@ -46,13 +46,13 @@
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^7.17.2",
"@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^10.20.0",
"better-sqlite3": "^11.9.0",
"@testcontainers/mysql": "^10.21.0",
"better-sqlite3": "^11.9.1",
"dotenv": "^16.4.7",
"drizzle-kit": "^0.30.5",
"drizzle-orm": "^0.40.0",
"drizzle-orm": "^0.41.0",
"drizzle-zod": "^0.7.0",
"mysql2": "3.13.0"
"mysql2": "3.14.0"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -37,6 +37,176 @@ export type HomarrDocumentationPath =
| "/blog/tags/version"
| "/blog/translations"
| "/search"
| "/docs/1.10.0/tags"
| "/docs/1.10.0/tags/active-directory"
| "/docs/1.10.0/tags/ad-guard"
| "/docs/1.10.0/tags/ad-guard-home"
| "/docs/1.10.0/tags/administration"
| "/docs/1.10.0/tags/advanced"
| "/docs/1.10.0/tags/analytics"
| "/docs/1.10.0/tags/api"
| "/docs/1.10.0/tags/apps"
| "/docs/1.10.0/tags/banner"
| "/docs/1.10.0/tags/blocking"
| "/docs/1.10.0/tags/boards"
| "/docs/1.10.0/tags/bookmark"
| "/docs/1.10.0/tags/bookmarks"
| "/docs/1.10.0/tags/caddy"
| "/docs/1.10.0/tags/certificates"
| "/docs/1.10.0/tags/checklist"
| "/docs/1.10.0/tags/code"
| "/docs/1.10.0/tags/community"
| "/docs/1.10.0/tags/configuration"
| "/docs/1.10.0/tags/connections"
| "/docs/1.10.0/tags/customization"
| "/docs/1.10.0/tags/data-sources"
| "/docs/1.10.0/tags/database"
| "/docs/1.10.0/tags/developer"
| "/docs/1.10.0/tags/development"
| "/docs/1.10.0/tags/dns"
| "/docs/1.10.0/tags/docker"
| "/docs/1.10.0/tags/donation"
| "/docs/1.10.0/tags/edit-mode"
| "/docs/1.10.0/tags/env"
| "/docs/1.10.0/tags/environment-variables"
| "/docs/1.10.0/tags/feeds"
| "/docs/1.10.0/tags/getting-started"
| "/docs/1.10.0/tags/google"
| "/docs/1.10.0/tags/grafana"
| "/docs/1.10.0/tags/groups"
| "/docs/1.10.0/tags/hardware"
| "/docs/1.10.0/tags/health"
| "/docs/1.10.0/tags/help"
| "/docs/1.10.0/tags/icon-picker"
| "/docs/1.10.0/tags/icon-repositories"
| "/docs/1.10.0/tags/icons"
| "/docs/1.10.0/tags/iframe"
| "/docs/1.10.0/tags/images"
| "/docs/1.10.0/tags/installation"
| "/docs/1.10.0/tags/integrade"
| "/docs/1.10.0/tags/integration"
| "/docs/1.10.0/tags/integrations"
| "/docs/1.10.0/tags/interface"
| "/docs/1.10.0/tags/jellyserr"
| "/docs/1.10.0/tags/layout"
| "/docs/1.10.0/tags/ldap"
| "/docs/1.10.0/tags/links"
| "/docs/1.10.0/tags/lists"
| "/docs/1.10.0/tags/management"
| "/docs/1.10.0/tags/media"
| "/docs/1.10.0/tags/minecraft"
| "/docs/1.10.0/tags/monitoring"
| "/docs/1.10.0/tags/news"
| "/docs/1.10.0/tags/notebook"
| "/docs/1.10.0/tags/notes"
| "/docs/1.10.0/tags/oidc"
| "/docs/1.10.0/tags/open-collective"
| "/docs/1.10.0/tags/open-media-vault"
| "/docs/1.10.0/tags/overseerr"
| "/docs/1.10.0/tags/permissions"
| "/docs/1.10.0/tags/pgid"
| "/docs/1.10.0/tags/pi-hole"
| "/docs/1.10.0/tags/ping"
| "/docs/1.10.0/tags/programming"
| "/docs/1.10.0/tags/proxmox"
| "/docs/1.10.0/tags/proxy"
| "/docs/1.10.0/tags/puid"
| "/docs/1.10.0/tags/responsive"
| "/docs/1.10.0/tags/roles"
| "/docs/1.10.0/tags/rss"
| "/docs/1.10.0/tags/search"
| "/docs/1.10.0/tags/search-engines"
| "/docs/1.10.0/tags/security"
| "/docs/1.10.0/tags/self-signed"
| "/docs/1.10.0/tags/seo"
| "/docs/1.10.0/tags/server"
| "/docs/1.10.0/tags/settings"
| "/docs/1.10.0/tags/sinkhole"
| "/docs/1.10.0/tags/sso"
| "/docs/1.10.0/tags/system"
| "/docs/1.10.0/tags/table"
| "/docs/1.10.0/tags/technical-documentation"
| "/docs/1.10.0/tags/text"
| "/docs/1.10.0/tags/torrent"
| "/docs/1.10.0/tags/traefik"
| "/docs/1.10.0/tags/translations"
| "/docs/1.10.0/tags/unraid"
| "/docs/1.10.0/tags/uploads"
| "/docs/1.10.0/tags/usenet"
| "/docs/1.10.0/tags/users"
| "/docs/1.10.0/tags/variables"
| "/docs/1.10.0/tags/widgets"
| "/docs/1.10.0/advanced/command-line"
| "/docs/1.10.0/advanced/command-line/fix-usernames"
| "/docs/1.10.0/advanced/command-line/password-recovery"
| "/docs/1.10.0/advanced/development/getting-started"
| "/docs/1.10.0/advanced/environment-variables"
| "/docs/1.10.0/advanced/icons"
| "/docs/1.10.0/advanced/keyboard-shortcuts"
| "/docs/1.10.0/advanced/proxy"
| "/docs/1.10.0/advanced/running-as-different-user"
| "/docs/1.10.0/advanced/single-sign-on"
| "/docs/1.10.0/category/advanced"
| "/docs/1.10.0/category/community"
| "/docs/1.10.0/category/developer-guides"
| "/docs/1.10.0/category/getting-started"
| "/docs/1.10.0/category/installation"
| "/docs/1.10.0/category/installation-1"
| "/docs/1.10.0/category/integrations"
| "/docs/1.10.0/category/management"
| "/docs/1.10.0/category/widgets"
| "/docs/1.10.0/community/donate"
| "/docs/1.10.0/community/faq"
| "/docs/1.10.0/community/get-in-touch"
| "/docs/1.10.0/community/license"
| "/docs/1.10.0/community/translations"
| "/docs/1.10.0/getting-started"
| "/docs/1.10.0/getting-started/after-the-installation"
| "/docs/1.10.0/getting-started/glossary"
| "/docs/1.10.0/getting-started/installation/docker"
| "/docs/1.10.0/getting-started/installation/easy-panel"
| "/docs/1.10.0/getting-started/installation/helm"
| "/docs/1.10.0/getting-started/installation/home-assistant"
| "/docs/1.10.0/getting-started/installation/portainer"
| "/docs/1.10.0/getting-started/installation/qnap"
| "/docs/1.10.0/getting-started/installation/railway"
| "/docs/1.10.0/getting-started/installation/saltbox"
| "/docs/1.10.0/getting-started/installation/source"
| "/docs/1.10.0/getting-started/installation/synology"
| "/docs/1.10.0/getting-started/installation/unraid"
| "/docs/1.10.0/integrations/containers"
| "/docs/1.10.0/integrations/dns"
| "/docs/1.10.0/integrations/hardware"
| "/docs/1.10.0/integrations/media-requester"
| "/docs/1.10.0/integrations/media-server"
| "/docs/1.10.0/integrations/servarr"
| "/docs/1.10.0/integrations/torrent"
| "/docs/1.10.0/integrations/usenet"
| "/docs/1.10.0/management/api"
| "/docs/1.10.0/management/apps"
| "/docs/1.10.0/management/boards"
| "/docs/1.10.0/management/certificates"
| "/docs/1.10.0/management/integrations"
| "/docs/1.10.0/management/media"
| "/docs/1.10.0/management/search-engines"
| "/docs/1.10.0/management/settings"
| "/docs/1.10.0/management/users"
| "/docs/1.10.0/widgets/bookmarks"
| "/docs/1.10.0/widgets/calendar"
| "/docs/1.10.0/widgets/clock"
| "/docs/1.10.0/widgets/dns-hole"
| "/docs/1.10.0/widgets/downloads"
| "/docs/1.10.0/widgets/health-monitoring"
| "/docs/1.10.0/widgets/home-assistant"
| "/docs/1.10.0/widgets/iframe"
| "/docs/1.10.0/widgets/indexer-manager"
| "/docs/1.10.0/widgets/media-requests"
| "/docs/1.10.0/widgets/media-server"
| "/docs/1.10.0/widgets/minecraft-server-status"
| "/docs/1.10.0/widgets/notebook"
| "/docs/1.10.0/widgets/rss"
| "/docs/1.10.0/widgets/video"
| "/docs/1.10.0/widgets/weather"
| "/docs/next/tags"
| "/docs/next/tags/active-directory"
| "/docs/next/tags/ad-guard"
@@ -169,6 +339,7 @@ export type HomarrDocumentationPath =
| "/docs/next/getting-started/installation/helm"
| "/docs/next/getting-started/installation/home-assistant"
| "/docs/next/getting-started/installation/portainer"
| "/docs/next/getting-started/installation/proxmox"
| "/docs/next/getting-started/installation/qnap"
| "/docs/next/getting-started/installation/railway"
| "/docs/next/getting-started/installation/saltbox"
@@ -312,6 +483,7 @@ export type HomarrDocumentationPath =
| "/docs/advanced/command-line/fix-usernames"
| "/docs/advanced/command-line/password-recovery"
| "/docs/advanced/development/getting-started"
| "/docs/advanced/development/kubernetes"
| "/docs/advanced/environment-variables"
| "/docs/advanced/icons"
| "/docs/advanced/keyboard-shortcuts"
@@ -349,6 +521,7 @@ export type HomarrDocumentationPath =
| "/docs/integrations/containers"
| "/docs/integrations/dns"
| "/docs/integrations/hardware"
| "/docs/integrations/kubernetes"
| "/docs/integrations/media-requester"
| "/docs/integrations/media-server"
| "/docs/integrations/servarr"

View File

@@ -9,6 +9,7 @@ export const widgetKinds = [
"dnsHoleControls",
"smartHome-entityState",
"smartHome-executeAutomation",
"stockPrice",
"mediaServer",
"calendar",
"downloads",

View File

@@ -0,0 +1,58 @@
import dayjs from "dayjs";
import { z } from "zod";
import { fetchWithTimeout } from "@homarr/common";
import { createCachedWidgetRequestHandler } from "./lib/cached-widget-request-handler";
export const fetchStockPriceHandler = createCachedWidgetRequestHandler({
queryKey: "fetchStockPriceResult",
widgetKind: "stockPrice",
async requestAsync(input: { stock: string; timeRange: string; timeInterval: string }) {
const response = await fetchWithTimeout(
`https://query1.finance.yahoo.com/v8/finance/chart/${input.stock}?range=${input.timeRange}&interval=${input.timeInterval}`,
);
const data = dataSchema.parse(await response.json());
if ("error" in data) {
throw new Error(data.error.description);
}
if (data.chart.result.length !== 1) {
throw new Error("Received multiple results");
}
if (!data.chart.result[0]) {
throw new Error("Received invalid data");
}
return data.chart.result[0];
},
cacheDuration: dayjs.duration(5, "minutes"),
});
const dataSchema = z
.object({
error: z.object({
description: z.string(),
}),
})
.or(
z.object({
chart: z.object({
result: z.array(
z.object({
indicators: z.object({
quote: z.array(
z.object({
close: z.array(z.number()),
}),
),
}),
meta: z.object({
symbol: z.string(),
shortName: z.string(),
}),
}),
),
}),
}),
);

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": "运行 {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "日历",
"description": "在日历视图中显示某个相对时间段内的集成事件",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalendář",
"description": "",

View File

@@ -677,11 +677,11 @@
"description": "Integration \"{kind}\" kan bruges med søgemaskinerne. Markér dette for automatisk at konfigurere søgemaskinen."
},
"createApp": {
"label": "",
"description": ""
"label": "Opret app",
"description": "Opret en app med samme navn og ikon som integrationen. Lad input-feltet være tomt for at oprette app'en med integrations-URL'en."
},
"appHref": {
"placeholder": ""
"placeholder": "Brugerdefineret app URL"
}
},
"action": {
@@ -1079,7 +1079,7 @@
"label": "Brugerdefinerede CSS-klasser"
},
"borderColor": {
"label": ""
"label": "Kantfarve"
}
}
},
@@ -1136,12 +1136,12 @@
"label": "Gitter"
},
"gridHorizontal": {
"label": ""
"label": "Vandret gitter"
}
}
},
"hideTitle": {
"label": ""
"label": "Skjul titel"
},
"hideIcon": {
"label": "Skjul ikoner"
@@ -1424,6 +1424,82 @@
"run": "Kør {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalender",
"description": "Vis begivenheder fra dine integrationer i en kalendervisning inden for en vis relativ tidsperiode",
@@ -1443,7 +1519,7 @@
"label": "Slut kl"
},
"showUnmonitored": {
"label": ""
"label": "Vis uovervåget"
}
}
},
@@ -1675,7 +1751,7 @@
"description": "Vis de aktuelle streams på dine medieservere",
"option": {},
"items": {
"currentlyPlaying": "",
"currentlyPlaying": "Afspiller lige nu",
"user": "Bruger",
"name": "Navn",
"id": "Id"
@@ -1900,10 +1976,10 @@
"statistics": {
"empty": "Tom",
"transcodes": "Transkoder",
"transcodesCount": "Transkodninger: {value}",
"healthChecksCount": "Sundhedstjek: {value}",
"filesCount": "Filer: {value}",
"savedSpace": "Gemt plads: {value}",
"transcodesCount": "Transkodninger",
"healthChecksCount": "Sundhedstjek",
"filesCount": "Filer",
"savedSpace": "Gemt plads",
"healthChecks": "Sundhedstjek",
"videoCodecs": "Kodeks",
"videoContainers": "Containere",
@@ -2332,7 +2408,7 @@
"label": "Værktøjer",
"items": {
"docker": "Docker",
"kubernetes": "",
"kubernetes": "Kubernetes",
"logs": "Logfiler",
"api": "API",
"certificates": "Certifikater",
@@ -2881,242 +2957,242 @@
},
"kubernetes": {
"cluster": {
"title": "",
"label": "",
"providers": "",
"version": "",
"architecture": "",
"title": "Cluster Kontrolpanel",
"label": "Cluster",
"providers": "Udbydere",
"version": "Version",
"architecture": "Arkitektur",
"capacity": {
"title": "",
"title": "Kapacitet",
"resource": {
"reserved": "",
"used": ""
"reserved": "Reserveret",
"used": "Brugt"
}
},
"resources": {
"title": "",
"nodes": "",
"namespaces": "",
"ingresses": "",
"services": "",
"pods": "",
"configmaps": "",
"secrets": "",
"volumes": ""
"title": "Ressourcer",
"nodes": "Noder",
"namespaces": "Navnerum",
"ingresses": "Ingresses",
"services": "Tjenester",
"pods": "Pods",
"configmaps": "ConfigMaps",
"secrets": "Hemmeligheder",
"volumes": "Volumer"
}
},
"nodes": {
"label": "",
"label": "Noder",
"field": {
"name": {
"label": ""
"label": "Navn"
},
"state": {
"label": "",
"label": "Tilstand",
"option": {
"ready": "",
"NotReady": ""
"ready": "Klar",
"NotReady": "Ikke Klar"
}
},
"cpu": {
"label": ""
"label": "CPU"
},
"memory": {
"label": ""
"label": "RAM"
},
"pods": {
"label": ""
"label": "Pods"
},
"operatingSystem": {
"label": ""
"label": "OS"
},
"architecture": {
"label": ""
"label": "Arkitektur"
},
"kubernetesVersion": {
"label": ""
"label": "Kubernetes version"
},
"creationTimestamp": {
"label": ""
"label": "Oprettet"
}
},
"table": {
"search": ""
"search": "Søg i {count} noder"
}
},
"namespaces": {
"label": "",
"label": "Navnerum",
"field": {
"name": {
"label": ""
"label": "Navn"
},
"state": {
"label": "",
"label": "Tilstand",
"option": {
"active": "",
"terminating": ""
"active": "Aktiv",
"terminating": "Afslutter"
}
},
"creationTimestamp": {
"label": ""
"label": "Oprettet"
}
},
"table": {
"search": ""
"search": "Søg i {count} navneområder"
}
},
"ingresses": {
"label": "",
"label": "Ingresses",
"field": {
"name": {
"label": ""
"label": "Navn"
},
"namespace": {
"label": ""
"label": "Navnerum"
},
"className": {
"label": ""
"label": "Klassens navn"
},
"rulesAndPaths": {
"label": ""
"label": "Regler & stier"
},
"creationTimestamp": {
"label": ""
"label": "Oprettet"
}
},
"table": {
"search": ""
"search": "Søg i {count} ingresses"
}
},
"services": {
"label": "",
"label": "Tjenester",
"field": {
"name": {
"label": ""
"label": "Navn"
},
"namespace": {
"label": ""
"label": "Navnerum"
},
"type": {
"label": ""
"label": "Type"
},
"ports": {
"label": ""
"label": "Porte"
},
"targetPorts": {
"label": ""
"label": "Målporte"
},
"clusterIP": {
"label": ""
"label": "Cluster IP"
},
"creationTimestamp": {
"label": ""
"label": "Oprettet"
}
},
"table": {
"search": ""
"search": "Søg i {count} tjenester"
}
},
"pods": {
"label": "",
"label": "Pods",
"field": {
"name": {
"label": ""
"label": "Navn"
},
"namespace": {
"label": ""
"label": "Navnerum"
},
"image": {
"label": ""
"label": "Billede"
},
"applicationType": {
"label": ""
"label": "Applikationstype"
},
"status": {
"label": ""
"label": "Status"
},
"creationTimestamp": {
"label": ""
"label": "Oprettet"
}
},
"table": {
"search": ""
"search": "Søg i {count} pods"
}
},
"secrets": {
"label": "",
"label": "Hemmeligheder",
"field": {
"name": {
"label": ""
"label": "Navn"
},
"namespace": {
"label": ""
"label": "navnerum"
},
"type": {
"label": ""
"label": "type"
},
"creationTimestamp": {
"label": ""
"label": "Oprettet"
}
},
"table": {
"search": ""
"search": "Søg i {count} hemmeligheder"
}
},
"configmaps": {
"label": "",
"label": "ConfigMaps",
"field": {
"name": {
"label": ""
"label": "Navn"
},
"namespace": {
"label": ""
"label": "navnerum"
},
"creationTimestamp": {
"label": ""
"label": "Oprettet"
}
},
"table": {
"search": ""
"search": "Søg i {count} configMaps"
}
},
"volumes": {
"label": "",
"label": "Volumer",
"field": {
"name": {
"label": ""
"label": "Navn"
},
"namespace": {
"label": ""
"label": "Navnerum"
},
"accessModes": {
"label": ""
"label": "Adgangstilstande"
},
"storage": {
"label": ""
"label": "Lager"
},
"storageClassName": {
"label": ""
"label": "Lagerklasse Navn"
},
"volumeMode": {
"label": ""
"label": "Volume Mode"
},
"volumeName": {
"label": ""
"label": "Volumens Navn"
},
"status": {
"label": ""
"label": "Status"
},
"creationTimestamp": {
"label": ""
"label": "Oprettet"
}
},
"table": {
"search": ""
"search": "Søg i {count} volumes"
}
},
"error": {
"internalServerError": ""
"internalServerError": "Kunne ikke hente Kubernetes-data"
}
},
"permission": {
@@ -3205,30 +3281,30 @@
"label": "Docker"
},
"kubernetes": {
"label": "",
"label": "Kubernetes",
"nodes": {
"label": ""
"label": "Noder"
},
"namespaces": {
"label": ""
"label": "Navnerum"
},
"ingresses": {
"label": ""
"label": "Ingresses"
},
"services": {
"label": ""
"label": "Tjenester"
},
"pods": {
"label": ""
"label": "pods"
},
"configmaps": {
"label": ""
"label": "ConfigMaps"
},
"secrets": {
"label": ""
"label": "Hemmeligheder"
},
"volumes": {
"label": ""
"label": "Volumer"
}
},
"logs": {

View File

@@ -307,12 +307,12 @@
"name": "Name",
"members": "Mitglieder",
"homeBoard": {
"label": "",
"description": ""
"label": "Home Board",
"description": "Nur Boards welche für die Gruppe zugänglich sind, können ausgewählt werden"
},
"mobileBoard": {
"label": "",
"description": ""
"label": "Mobiles Board",
"description": "Nur Boards welche für die Gruppe zugänglich sind, können ausgewählt werden"
}
},
"permission": {
@@ -514,12 +514,12 @@
"board": {
"notification": {
"success": {
"title": "",
"message": ""
"title": "Einstellungen gespeichert",
"message": "Board Einstellungen erfolgreich gespeichert"
},
"error": {
"title": "",
"message": ""
"title": "Einstellungen konnten nicht gespeichert werden",
"message": "Board Einstellungen konnten nicht gespeichert werden"
}
}
}
@@ -527,17 +527,17 @@
"changePosition": {
"notification": {
"success": {
"message": ""
"message": "Position erfolgreich geändert"
},
"error": {
"message": ""
"message": "Position konnte nicht geändert werden"
}
}
}
},
"defaultGroup": {
"name": "",
"description": ""
"name": "Standardgruppe",
"description": "{name} - Alle angemeldeten Benutzer"
}
},
"app": {
@@ -603,8 +603,8 @@
},
"useDifferentUrlForPing": {
"checkbox": {
"label": "",
"description": ""
"label": "Eine andere URL für Ping verwenden",
"description": "Nützlich, wenn Homarr direkt auf einen internen Hostnamen oder Netzwerk zugreifen kann, um die Bandbreitennutzung des ISP zu minimieren"
}
}
},
@@ -677,11 +677,11 @@
"description": "Integration \"{kind}\" kann mit den Suchmaschinen verwendet werden. Wählen Sie dies, um die Suchmaschine automatisch zu konfigurieren."
},
"createApp": {
"label": "",
"description": ""
"label": "Anwendung erstellen",
"description": "Erstelle eine App mit dem gleichen Namen und Symbol wie die Integration. Lassen Sie das Eingabefeld unter leer, um die App mit der Integrations URL zu erstellen."
},
"appHref": {
"placeholder": ""
"placeholder": "Benutzerdefinierte App URL"
}
},
"action": {
@@ -937,7 +937,7 @@
},
"dangerZone": "Gefahrenbereich",
"noResults": "Die Suche ergab keine Treffer",
"unsavedChanges": "",
"unsavedChanges": "Sie haben ungespeicherte Änderungen!",
"preview": {
"show": "Vorschau ansehen",
"hide": "Vorschau ausblenden"
@@ -981,7 +981,7 @@
},
"option": {
"borderColor": {
"label": ""
"label": "Rahmenfarbe"
}
},
"remove": {
@@ -1079,7 +1079,7 @@
"label": "Benutzerdefinierte CSS Klassen"
},
"borderColor": {
"label": ""
"label": "Rahmenfarbe"
}
}
},
@@ -1136,12 +1136,12 @@
"label": "Raster"
},
"gridHorizontal": {
"label": ""
"label": "Gitter horizontal"
}
}
},
"hideTitle": {
"label": ""
"label": "Titel ausblenden"
},
"hideIcon": {
"label": "Symbole verbergen"
@@ -1424,6 +1424,82 @@
"run": "{name} ausführen"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalender",
"description": "Zeigt Ereignisse aus Ihren Integrationen in einer Kalenderansicht innerhalb eines bestimmten Zeitraums an",
@@ -1443,7 +1519,7 @@
"label": "Endet am"
},
"showUnmonitored": {
"label": ""
"label": "Nicht überwachte anzeigen"
}
}
},
@@ -1639,7 +1715,7 @@
"app": {
"noData": "Keine App gefunden",
"description": "Klicken Sie <here></here> um eine neue App zu erstellen",
"quickCreate": ""
"quickCreate": "Jetzt eine App erstellen"
},
"error": {
"noIntegration": "Keine Integration ausgewählt",
@@ -1675,7 +1751,7 @@
"description": "Zeige die aktuellen Streams auf deinen Medienservern an",
"option": {},
"items": {
"currentlyPlaying": "",
"currentlyPlaying": "Aktuelle Wiedergabe",
"user": "Benutzer",
"name": "Name",
"id": "Id"
@@ -1842,10 +1918,10 @@
"available": "Verfügbar"
},
"status": {
"pending": "",
"approved": "",
"declined": "",
"failed": ""
"pending": "Ausstehend",
"approved": "Bestätigt",
"declined": "Abgelehnt",
"failed": "Fehlgeschlagen"
},
"toBeDetermined": "Noch Festzulegen"
},
@@ -1900,10 +1976,10 @@
"statistics": {
"empty": "Leer",
"transcodes": "Transkodieren",
"transcodesCount": "Transkodierung: {value}",
"healthChecksCount": "Gesundheitscheck: {value}",
"filesCount": "Dateien: {value}",
"savedSpace": "Gespeicherter Speicherplatz: {value}",
"transcodesCount": "Transkodierungen",
"healthChecksCount": "Health Check",
"filesCount": "Dateien",
"savedSpace": "Belegter Speicherplatz",
"healthChecks": "Gesundheitscheck",
"videoCodecs": "Codecs",
"videoContainers": "Container",
@@ -2048,8 +2124,8 @@
},
"quickCreateApp": {
"modal": {
"title": "",
"createAndUse": ""
"title": "Jetzt eine App erstellen",
"createAndUse": "Erstellen und verwenden"
}
}
},
@@ -2126,7 +2202,7 @@
"label": "Transparenz"
},
"iconColor": {
"label": ""
"label": "Symbolfarbe"
},
"customCss": {
"label": "Benutzerdefinierte css für dieses Board",
@@ -2144,14 +2220,14 @@
"label": "Anzahl der Spalten"
},
"itemRadius": {
"label": "",
"description": "",
"label": "Elementradius",
"description": "Ändert den Grad der Rundung ihrer Kacheln auf dem Board",
"option": {
"xs": "",
"sm": "",
"md": "",
"lg": "",
"xl": ""
"xs": "Sehr klein",
"sm": "Klein",
"md": "Mittel",
"lg": "Groß",
"xl": "Sehr groß"
}
},
"name": {
@@ -2175,9 +2251,9 @@
"layout": {
"title": "Ansicht",
"responsive": {
"title": "",
"title": "Reaktive Layouts",
"action": {
"add": ""
"add": "Layout hinzufügen"
}
}
},
@@ -2185,7 +2261,7 @@
"title": "Hintergrund"
},
"appearance": {
"title": ""
"title": "Aussehen"
},
"customCss": {
"title": "Benutzerdefiniertes CSS"
@@ -2290,14 +2366,14 @@
"layout": {
"field": {
"name": {
"label": ""
"label": "Name"
},
"columnCount": {
"label": ""
"label": "Anzahl der Spalten"
},
"breakpoint": {
"label": "",
"description": ""
"label": "Breakpoint",
"description": "Das Layout wird auf allen Bildschirmen, die größer als dieser breakpoint sind, bis zum nächsten größeren breakpoint verwendet."
}
}
},
@@ -2332,7 +2408,7 @@
"label": "Werkzeuge",
"items": {
"docker": "Docker",
"kubernetes": "",
"kubernetes": "Kubernetes",
"logs": "Logs",
"api": "API",
"certificates": "Zertifikate",
@@ -2531,10 +2607,10 @@
"ownerOfGroupDeleted": "Der Eigentümer dieser Gruppe wurde gelöscht. Derzeit hat sie keinen Besitzer."
},
"setting": {
"title": "",
"alert": "",
"title": "Einstellungen",
"alert": "Gruppeneinstellungen werden nach der Reihenfolge der Gruppen in der Liste priorisiert. Die oberen Einstellungen überschreiben die unteren Einstellungen.",
"board": {
"title": ""
"title": "Boards"
}
},
"members": {
@@ -2766,7 +2842,7 @@
"title": "Container",
"table": {
"updated": "Aktualisiert {when}",
"search": "Seach {count} Container",
"search": "{count} Container durchsuchen",
"selected": "{selectCount} von {totalCount} ausgewählten Containern"
},
"field": {
@@ -2881,242 +2957,242 @@
},
"kubernetes": {
"cluster": {
"title": "",
"label": "",
"providers": "",
"version": "",
"architecture": "",
"title": "Cluster Dashboard",
"label": "Cluster",
"providers": "Anbieter",
"version": "Version",
"architecture": "Architektur",
"capacity": {
"title": "",
"title": "Kapazität",
"resource": {
"reserved": "",
"used": ""
"reserved": "Reserviert",
"used": "Benutzt"
}
},
"resources": {
"title": "",
"nodes": "",
"namespaces": "",
"ingresses": "",
"services": "",
"pods": "",
"configmaps": "",
"secrets": "",
"volumes": ""
"title": "Ressourcen",
"nodes": "Nodes",
"namespaces": "Namensräume",
"ingresses": "Ingresse",
"services": "Dienste",
"pods": "Pods",
"configmaps": "ConfigMaps",
"secrets": "Secrets",
"volumes": "Laufwerke"
}
},
"nodes": {
"label": "",
"label": "Nodes",
"field": {
"name": {
"label": ""
"label": "Name"
},
"state": {
"label": "",
"label": "Zustand",
"option": {
"ready": "",
"NotReady": ""
"ready": "Bereit",
"NotReady": "Nicht Bereit"
}
},
"cpu": {
"label": ""
"label": "CPU"
},
"memory": {
"label": ""
"label": "RAM"
},
"pods": {
"label": ""
"label": "Pods"
},
"operatingSystem": {
"label": ""
"label": "OS"
},
"architecture": {
"label": ""
"label": "Architektur"
},
"kubernetesVersion": {
"label": ""
"label": "Kubernetes Version"
},
"creationTimestamp": {
"label": ""
"label": "Erstellt"
}
},
"table": {
"search": ""
"search": "{count} Nodes durchsuchen"
}
},
"namespaces": {
"label": "",
"label": "Namensräume",
"field": {
"name": {
"label": ""
"label": "Name"
},
"state": {
"label": "",
"label": "Zustand",
"option": {
"active": "",
"terminating": ""
"active": "Aktiv",
"terminating": "Beendet"
}
},
"creationTimestamp": {
"label": ""
"label": "Erstellt"
}
},
"table": {
"search": ""
"search": "{count} Namensräume durchsuchen"
}
},
"ingresses": {
"label": "",
"label": "Ingresse",
"field": {
"name": {
"label": ""
"label": "Name"
},
"namespace": {
"label": ""
"label": "Namensraum"
},
"className": {
"label": ""
"label": "Klassenname"
},
"rulesAndPaths": {
"label": ""
"label": "Regeln & Pfade"
},
"creationTimestamp": {
"label": ""
"label": "Erstellt"
}
},
"table": {
"search": ""
"search": "{count} Ingresse durchsuchen"
}
},
"services": {
"label": "",
"label": "Dienste",
"field": {
"name": {
"label": ""
"label": "Name"
},
"namespace": {
"label": ""
"label": "Namensraum"
},
"type": {
"label": ""
"label": "Typ"
},
"ports": {
"label": ""
"label": "Ports"
},
"targetPorts": {
"label": ""
"label": "Zielports"
},
"clusterIP": {
"label": ""
"label": "Cluster IP"
},
"creationTimestamp": {
"label": ""
"label": "Erstellt"
}
},
"table": {
"search": ""
"search": "{count} Services durchsuchen"
}
},
"pods": {
"label": "",
"label": "Pods",
"field": {
"name": {
"label": ""
"label": "Name"
},
"namespace": {
"label": ""
"label": "Namensraum"
},
"image": {
"label": ""
"label": "Image"
},
"applicationType": {
"label": ""
"label": "Typ der Anwendung"
},
"status": {
"label": ""
"label": "Status"
},
"creationTimestamp": {
"label": ""
"label": "Erstellt"
}
},
"table": {
"search": ""
"search": "{count} Pods durchsuchen"
}
},
"secrets": {
"label": "",
"label": "Secrets",
"field": {
"name": {
"label": ""
"label": "Name"
},
"namespace": {
"label": ""
"label": "namensraum"
},
"type": {
"label": ""
"label": "typ"
},
"creationTimestamp": {
"label": ""
"label": "Erstellt"
}
},
"table": {
"search": ""
"search": "{count} Secrets durchsuchen"
}
},
"configmaps": {
"label": "",
"label": "ConfigMaps",
"field": {
"name": {
"label": ""
"label": "Name"
},
"namespace": {
"label": ""
"label": "namensraum"
},
"creationTimestamp": {
"label": ""
"label": "Erstellt"
}
},
"table": {
"search": ""
"search": "{count} configMaps durchsuchen"
}
},
"volumes": {
"label": "",
"label": "Laufwerke",
"field": {
"name": {
"label": ""
"label": "Name"
},
"namespace": {
"label": ""
"label": "Namensraum"
},
"accessModes": {
"label": ""
"label": "Zugriffsmodi"
},
"storage": {
"label": ""
"label": "Speicher"
},
"storageClassName": {
"label": ""
"label": "Name der Speicherklasse"
},
"volumeMode": {
"label": ""
"label": "Laufwerksmodus"
},
"volumeName": {
"label": ""
"label": "Laufwerkname"
},
"status": {
"label": ""
"label": "Status"
},
"creationTimestamp": {
"label": ""
"label": "Erstellt"
}
},
"table": {
"search": ""
"search": "{count} Laufwerke durchsuchen"
}
},
"error": {
"internalServerError": ""
"internalServerError": "Fehler beim Abrufen der Kubernetes Daten"
}
},
"permission": {
@@ -3205,30 +3281,30 @@
"label": "Docker"
},
"kubernetes": {
"label": "",
"label": "Kubernetes",
"nodes": {
"label": ""
"label": "Nodes"
},
"namespaces": {
"label": ""
"label": "Namensräume"
},
"ingresses": {
"label": ""
"label": "Ingresse"
},
"services": {
"label": ""
"label": "Dienste"
},
"pods": {
"label": ""
"label": "pods"
},
"configmaps": {
"label": ""
"label": "ConfigMaps"
},
"secrets": {
"label": ""
"label": "Secrets"
},
"volumes": {
"label": ""
"label": "Laufwerke"
}
},
"logs": {
@@ -3601,7 +3677,7 @@
},
"delete": {
"title": "Suchmaschine löschen",
"message": "Sind Sie sicher, dass Sie die Suchmaschine '{name} ' löschen möchten?",
"message": "Sind Sie sicher, dass Sie die Suchmaschine {name} löschen möchten?",
"notification": {
"success": {
"title": "Suchmaschine gelöscht",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Ημερολόγιο",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": "Run {name}"
}
},
"stockPrice": {
"name": "Stock Price",
"description": "Displays the current stock price of a company",
"option": {
"stock": {
"label": "Stock symbol"
},
"timeRange": {
"label": "Time Range",
"option": {
"1d": {
"label": "1 Day"
},
"5d": {
"label": "5 Day"
},
"1mo": {
"label": "1 Month"
},
"3mo": {
"label": "3 Months"
},
"6mo": {
"label": "6 Months"
},
"ytd": {
"label": "Year to Date"
},
"1y": {
"label": "1 Year"
},
"2y": {
"label": "2 Years"
},
"5y": {
"label": "5 Years"
},
"10y": {
"label": "10 Years"
},
"max": {
"label": "Max"
}
}
},
"timeInterval": {
"label": "Time Interval",
"option": {
"5m": {
"label": "5 Minutes"
},
"15m": {
"label": "15 Minutes"
},
"30m": {
"label": "30 Minutes"
},
"1h": {
"label": "1 Hour"
},
"1d": {
"label": "1 Day"
},
"5d": {
"label": "5 Days"
},
"1wk": {
"label": "1 Week"
},
"1mo": {
"label": "1 Month"
}
}
}
}
},
"calendar": {
"name": "Calendar",
"description": "Display events from your integrations in a calendar view within a certain relative time period",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Calendario",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "",
"description": "",

File diff suppressed because it is too large Load Diff

View File

@@ -677,11 +677,11 @@
"description": "אינטגרציה {kind} יכולה לשמש עם מנועי חיפוש. סמן עבור הגדרה אוטומטית של מנוע חיפוש."
},
"createApp": {
"label": "",
"description": ""
"label": "יצירת אפליקציה",
"description": "יצירת אפליקציה עם אותו שם וסמל כמו האינטגרציה. יש להשאיר את שדה הקלט למטה ריק כדי ליצור את האפליקציה עם כתובת האתר לאינטגרציה."
},
"appHref": {
"placeholder": ""
"placeholder": "כתובת אתר מותאמת אישית של אפליקציה"
}
},
"action": {
@@ -1079,7 +1079,7 @@
"label": "מחלקות עיצוב מותאמות אישית"
},
"borderColor": {
"label": ""
"label": "צבע מסגרת"
}
}
},
@@ -1136,12 +1136,12 @@
"label": "רשת"
},
"gridHorizontal": {
"label": ""
"label": "רשת אופקית"
}
}
},
"hideTitle": {
"label": ""
"label": "הסתר כותרת"
},
"hideIcon": {
"label": "הסתרת אייקונים"
@@ -1424,6 +1424,82 @@
"run": "הפעל {name}"
}
},
"stockPrice": {
"name": "מחיר המניה",
"description": "מציג את מחיר המניה הנוכחי של חברה",
"option": {
"stock": {
"label": "סמל מניה"
},
"timeRange": {
"label": "טווח זמן",
"option": {
"1d": {
"label": "יום אחד"
},
"5d": {
"label": "חמישה ימים"
},
"1mo": {
"label": "חודש אחד"
},
"3mo": {
"label": "שלושה חודשים"
},
"6mo": {
"label": "שישה חודשים"
},
"ytd": {
"label": "שנה עד היום"
},
"1y": {
"label": "שנה אחת"
},
"2y": {
"label": "שנתיים"
},
"5y": {
"label": "חמש שנים"
},
"10y": {
"label": "עשר שנים"
},
"max": {
"label": "מקסימום"
}
}
},
"timeInterval": {
"label": "מרווח זמן",
"option": {
"5m": {
"label": "5 דקות"
},
"15m": {
"label": "15 דקות"
},
"30m": {
"label": "30 דקות"
},
"1h": {
"label": "שעה אחת"
},
"1d": {
"label": "יום אחד"
},
"5d": {
"label": "חמישה ימים"
},
"1wk": {
"label": "שבוע אחד"
},
"1mo": {
"label": "חודש אחד"
}
}
}
}
},
"calendar": {
"name": "לוח שנה",
"description": "הצג אירועים מהאינטגרציות שלך בתצוגת לוח שנה בתוך פרק זמן יחסי מסוים",
@@ -1443,7 +1519,7 @@
"label": "סיים ב"
},
"showUnmonitored": {
"label": ""
"label": "הצג ללא פיקוח"
}
}
},
@@ -1675,7 +1751,7 @@
"description": "הצג את הזרמים הנוכחיים בשרתי המדיה שלך",
"option": {},
"items": {
"currentlyPlaying": "",
"currentlyPlaying": "מתנגן כרגע",
"user": "משתמש",
"name": "שם",
"id": "מזהה"
@@ -1900,10 +1976,10 @@
"statistics": {
"empty": "ריק",
"transcodes": "קידודים",
"transcodesCount": "קידודים: {value}",
"healthChecksCount": "בדיקות בריאות: {value}",
"filesCount": "קבצים: {value}",
"savedSpace": "שטח שמור: {value}",
"transcodesCount": "קידודים",
"healthChecksCount": "בדיקות בריאות",
"filesCount": "קבצים",
"savedSpace": "שטח שמור",
"healthChecks": "בדיקות בריאות",
"videoCodecs": "קודקים",
"videoContainers": "מיכלים",
@@ -2332,7 +2408,7 @@
"label": "כלים",
"items": {
"docker": "דוקר",
"kubernetes": "",
"kubernetes": "Kubernetes",
"logs": "קובצי לוג",
"api": "ממשק API",
"certificates": "אישורי אבטחה",
@@ -2881,242 +2957,242 @@
},
"kubernetes": {
"cluster": {
"title": "",
"label": "",
"providers": "",
"version": "",
"architecture": "",
"title": "לוח המחוונים של אשכול",
"label": "אשכול",
"providers": "ספקים",
"version": "גרסה",
"architecture": "ארכיטקטורה",
"capacity": {
"title": "",
"title": "קיבולת",
"resource": {
"reserved": "",
"used": ""
"reserved": "שמור",
"used": "בשימוש"
}
},
"resources": {
"title": "",
"nodes": "",
"namespaces": "",
"ingresses": "",
"services": "",
"pods": "",
"configmaps": "",
"secrets": "",
"volumes": ""
"title": "מקורות",
"nodes": "קונטיינרים",
"namespaces": "מרחב שמות",
"ingresses": "כרטיסים",
"services": "שירותים",
"pods": "תרמילים",
"configmaps": "ConfigMaps",
"secrets": "נתוני גישה",
"volumes": "כוננים"
}
},
"nodes": {
"label": "",
"label": "קונטיינרים",
"field": {
"name": {
"label": ""
"label": "שם"
},
"state": {
"label": "",
"label": "מצב",
"option": {
"ready": "",
"NotReady": ""
"ready": "מוכן",
"NotReady": "לא מוכן"
}
},
"cpu": {
"label": ""
"label": "מעבד"
},
"memory": {
"label": ""
"label": "זכרון פנימי"
},
"pods": {
"label": ""
"label": "תרמילים"
},
"operatingSystem": {
"label": ""
"label": "מערכת הפעלה"
},
"architecture": {
"label": ""
"label": "ארכיטקטורה"
},
"kubernetesVersion": {
"label": ""
"label": "גרסת Kubernetes"
},
"creationTimestamp": {
"label": ""
"label": "נוצר"
}
},
"table": {
"search": ""
"search": "חפש {count} קונטיינרים"
}
},
"namespaces": {
"label": "",
"label": "מרחב שמות",
"field": {
"name": {
"label": ""
"label": "שם"
},
"state": {
"label": "",
"label": "מצב",
"option": {
"active": "",
"terminating": ""
"active": "פעיל",
"terminating": "מסתיים"
}
},
"creationTimestamp": {
"label": ""
"label": "נוצר"
}
},
"table": {
"search": ""
"search": "חפש ב-{count} מרחבי שמות"
}
},
"ingresses": {
"label": "",
"label": "כרטיסים",
"field": {
"name": {
"label": ""
"label": "שם"
},
"namespace": {
"label": ""
"label": "מרחב שמות"
},
"className": {
"label": ""
"label": "שם קלאס"
},
"rulesAndPaths": {
"label": ""
"label": "כללים ונתיבים"
},
"creationTimestamp": {
"label": ""
"label": "נוצר"
}
},
"table": {
"search": ""
"search": "חפש {count} כניסות"
}
},
"services": {
"label": "",
"label": "שירותים",
"field": {
"name": {
"label": ""
"label": "שם"
},
"namespace": {
"label": ""
"label": "מרחב שמות"
},
"type": {
"label": ""
"label": "סוג"
},
"ports": {
"label": ""
"label": "יציאות"
},
"targetPorts": {
"label": ""
"label": "יציאות יעד"
},
"clusterIP": {
"label": ""
"label": "כתובת אשכול"
},
"creationTimestamp": {
"label": ""
"label": "נוצר"
}
},
"table": {
"search": ""
"search": "חפש {count} שירותים"
}
},
"pods": {
"label": "",
"label": "תרמילים",
"field": {
"name": {
"label": ""
"label": "שם"
},
"namespace": {
"label": ""
"label": "מרחב שמות"
},
"image": {
"label": ""
"label": "תמונה"
},
"applicationType": {
"label": ""
"label": "סוג יישום"
},
"status": {
"label": ""
"label": "מצב"
},
"creationTimestamp": {
"label": ""
"label": "נוצר"
}
},
"table": {
"search": ""
"search": "חפש {count} תרמילים"
}
},
"secrets": {
"label": "",
"label": "נתוני גישה",
"field": {
"name": {
"label": ""
"label": "שם"
},
"namespace": {
"label": ""
"label": "מרחב שמות"
},
"type": {
"label": ""
"label": "סוג"
},
"creationTimestamp": {
"label": ""
"label": "נוצר"
}
},
"table": {
"search": ""
"search": "חפש {count} נתוני גישה"
}
},
"configmaps": {
"label": "",
"label": "configMaps",
"field": {
"name": {
"label": ""
"label": "שם"
},
"namespace": {
"label": ""
"label": "מרחב שמות"
},
"creationTimestamp": {
"label": ""
"label": "נוצר"
}
},
"table": {
"search": ""
"search": "חפש {count} configMaps"
}
},
"volumes": {
"label": "",
"label": "כרכים",
"field": {
"name": {
"label": ""
"label": "שם"
},
"namespace": {
"label": ""
"label": "מרחב שמות"
},
"accessModes": {
"label": ""
"label": "מצבי גישה"
},
"storage": {
"label": ""
"label": "אחסון"
},
"storageClassName": {
"label": ""
"label": "שם מחלקת אחסון"
},
"volumeMode": {
"label": ""
"label": "מצב כרך"
},
"volumeName": {
"label": ""
"label": "שם כרך"
},
"status": {
"label": ""
"label": "מצב"
},
"creationTimestamp": {
"label": ""
"label": "נוצר"
}
},
"table": {
"search": ""
"search": "חפש {count} כרכים"
}
},
"error": {
"internalServerError": ""
"internalServerError": "אחזור נתוני Kubernetes נכשל"
}
},
"permission": {
@@ -3205,30 +3281,30 @@
"label": "דוקר"
},
"kubernetes": {
"label": "",
"label": "Kubernetes",
"nodes": {
"label": ""
"label": "צמתים"
},
"namespaces": {
"label": ""
"label": "מרחב שמות"
},
"ingresses": {
"label": ""
"label": "כרטיסים"
},
"services": {
"label": ""
"label": "שירותים"
},
"pods": {
"label": ""
"label": "תרמילים"
},
"configmaps": {
"label": ""
"label": "ConfigMaps"
},
"secrets": {
"label": ""
"label": "נתוני גישה"
},
"volumes": {
"label": ""
"label": "כוננים"
}
},
"logs": {

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalendar",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Naptár",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Calendario",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "カレンダー",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "캘린더",
"description": "",

View File

@@ -19,7 +19,7 @@
},
"fileInfo": {
"action": {
"change": ""
"change": "Pakeisti failą"
}
},
"importSettings": {
@@ -113,7 +113,7 @@
"subtitle": ""
},
"invite": {
"title": "",
"title": "Prisijungti prie Homarr",
"subtitle": "",
"description": ""
},
@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalendorius",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalendārs",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": "{name} uitvoeren"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalender",
"description": "Gebeurtenissen van je integraties weergeven in een kalenderweergave binnen een bepaalde relatieve tijdsperiode",

View File

@@ -1424,6 +1424,82 @@
"run": "Kjør {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalender",
"description": "Vis hendelser fra integrasjonene dine i en kalendervisning innenfor en bestemt relativ tidsperiode",

View File

@@ -1424,6 +1424,82 @@
"run": "Uruchom {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalendarz",
"description": "Wyświetlaj zdarzenia z integracji w widoku kalendarza w określonym okresie czasowym",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Calendário",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": "Запустить {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Календарь",
"description": "Отображает события из ваших интеграций в календаре в определённом временном периоде",

View File

@@ -1424,6 +1424,82 @@
"run": "Spustite {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalendár",
"description": "Zobrazte udalosti z vašich integrácií v zobrazení kalendára za určité relatívne časové obdobie",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Koledar",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Kalender",
"description": "",

View File

@@ -677,11 +677,11 @@
"description": "\"{kind}\" entegrasyonu arama motorlarıyla kullanılabilir. Arama motorunu otomatik olarak yapılandırmak için bunu işaretleyin."
},
"createApp": {
"label": "",
"description": ""
"label": "Uygulama oluştur",
"description": "Entegrasyon ile aynı adı ve simgeyi taşıyan bir uygulama oluşturun. Uygulamayı entegrasyon URL'si ile oluşturmak için aşağıdaki alanını boş bırakın."
},
"appHref": {
"placeholder": ""
"placeholder": "Özel Uygulama URL'si"
}
},
"action": {
@@ -1424,6 +1424,82 @@
"run": "Çalıştır {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Takvim",
"description": "Entegrasyonlarınızdaki etkinlikleri belirli bir göreli zaman dilimi içinde bir takvim görünümünde görüntüleyin",

View File

@@ -1424,6 +1424,82 @@
"run": "Запустити {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Календар",
"description": "",

View File

@@ -1424,6 +1424,82 @@
"run": ""
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "Lịch",
"description": "",

View File

@@ -677,11 +677,11 @@
"description": "集成 {kind} 可以與搜尋引擎共同使用,勾選此選項可自動設定搜尋引擎"
},
"createApp": {
"label": "",
"description": ""
"label": "創建應用程式",
"description": "建立一個與集成相同名稱和圖示的應用程式,將下方輸入欄位留空,以使用集成網址創建應用程式"
},
"appHref": {
"placeholder": ""
"placeholder": "自訂應用程式網址"
}
},
"action": {
@@ -1424,6 +1424,82 @@
"run": "執行 {name}"
}
},
"stockPrice": {
"name": "",
"description": "",
"option": {
"stock": {
"label": ""
},
"timeRange": {
"label": "",
"option": {
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1mo": {
"label": ""
},
"3mo": {
"label": ""
},
"6mo": {
"label": ""
},
"ytd": {
"label": ""
},
"1y": {
"label": ""
},
"2y": {
"label": ""
},
"5y": {
"label": ""
},
"10y": {
"label": ""
},
"max": {
"label": ""
}
}
},
"timeInterval": {
"label": "",
"option": {
"5m": {
"label": ""
},
"15m": {
"label": ""
},
"30m": {
"label": ""
},
"1h": {
"label": ""
},
"1d": {
"label": ""
},
"5d": {
"label": ""
},
"1wk": {
"label": ""
},
"1mo": {
"label": ""
}
}
}
}
},
"calendar": {
"name": "日曆",
"description": "在特定的相對時間範圍內,將來自您的集成事件以日曆視圖顯示",

View File

@@ -22,7 +22,7 @@ const boardNameSchema = z
.string()
.min(1)
.max(255)
.regex(/^[A-Za-z0-9-\\._]*$/);
.regex(/^[A-Za-z0-9-\\_]*$/);
const byNameSchema = z.object({
name: boardNameSchema,

View File

@@ -44,6 +44,7 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/charts": "^7.17.2",
"@mantine/core": "^7.17.2",
"@mantine/hooks": "^7.17.2",
"@tabler/icons-react": "^3.31.0",
@@ -68,6 +69,7 @@
"next": "15.1.7",
"react": "19.0.0",
"react-dom": "19.0.0",
"recharts": "^2.15.1",
"video.js": "^8.22.0",
"zod": "^3.24.2"
},

View File

@@ -29,6 +29,7 @@ import type { WidgetOptionDefinition } from "./options";
import * as rssFeed from "./rssFeed";
import * as smartHomeEntityState from "./smart-home/entity-state";
import * as smartHomeExecuteAutomation from "./smart-home/execute-automation";
import * as stockPrice from "./stocks";
import * as video from "./video";
import * as weather from "./weather";
@@ -46,6 +47,7 @@ export const widgetImports = {
dnsHoleControls,
"smartHome-entityState": smartHomeEntityState,
"smartHome-executeAutomation": smartHomeExecuteAutomation,
stockPrice,
mediaServer,
calendar,
downloads,

View File

@@ -0,0 +1,102 @@
"use client";
import { Sparkline } from "@mantine/charts";
import { Flex, Stack, Text, Title, useMantineTheme } from "@mantine/core";
import { IconTrendingDown, IconTrendingUp } from "@tabler/icons-react";
import { clientApi } from "@homarr/api/client";
import { useScopedI18n } from "@homarr/translation/client";
import type { WidgetComponentProps } from "../definition";
function round(value: number) {
return Math.round(value * 100) / 100;
}
function calculateChange(valueA: number, valueB: number) {
return valueA - valueB;
}
function calculateChangePercentage(valueA: number, valueB: number) {
return 100 * ((valueA - valueB) / valueA);
}
export default function StockPriceWidget({ options, width, height }: WidgetComponentProps<"stockPrice">) {
const t = useScopedI18n("widget.stockPrice");
const theme = useMantineTheme();
const [{ data }] = clientApi.widget.stockPrice.getPriceHistory.useSuspenseQuery(options);
const stockValues = data.indicators.quote[0]?.close ?? [];
const stockValuesChange = round(calculateChange(stockValues[stockValues.length - 1] ?? 0, stockValues[0] ?? 0));
const stockValuesChangePercentage = round(
calculateChangePercentage(stockValues[stockValues.length - 1] ?? 0, stockValues[0] ?? 0),
);
const stockValuesMin = Math.min(...stockValues);
const stockGraphValues = stockValues.map((value) => value - stockValuesMin + 50);
return (
<Flex h="100%" w="100%">
<Sparkline
pos="absolute"
bottom={10}
w="100%"
h={height > 280 ? "75%" : "50%"}
data={stockGraphValues}
curveType="linear"
trendColors={{ positive: "green.7", negative: "red.7", neutral: "gray.6" }}
fillOpacity={0.6}
strokeWidth={2.5}
/>
<Stack pos="absolute" top={10} left={10}>
<Text size="xl" fw={700} lh="0.715">
{stockValuesChange > 0 ? (
<IconTrendingUp size="1.5rem" color={theme.colors.green[7]} />
) : (
<IconTrendingDown size="1.5rem" color={theme.colors.red[7]} />
)}
{data.meta.symbol}
</Text>
{width > 280 && height > 280 && (
<Text size="md" lh="1">
{data.meta.shortName}
</Text>
)}
</Stack>
<Title pos="absolute" bottom={10} right={10} order={width > 280 ? 1 : 2} fw={700}>
{round(stockValues[stockValues.length - 1] ?? 0)}
</Title>
{width > 280 && (
<Text pos="absolute" top={10} right={10} size="xl" fw={700}>
{Math.abs(stockValuesChange)} ({Math.abs(stockValuesChangePercentage)}%)
</Text>
)}
{width > 280 && (
<Text pos="absolute" bottom={10} left={10} fw={700}>
{t(`option.timeRange.option.${options.timeRange}.label`)}
</Text>
)}
<Stack pos="absolute" top={10} left={10}>
<Text size="xl" fw={700} lh="0.715">
{stockValuesChange > 0 ? (
<IconTrendingUp size="1.5rem" color={theme.colors.green[7]} />
) : (
<IconTrendingDown size="1.5rem" color={theme.colors.red[7]} />
)}
{data.meta.symbol}
</Text>
{width > 280 && height > 280 && (
<Text size="md" lh="1">
{data.meta.shortName}
</Text>
)}
</Stack>
</Flex>
);
}

View File

@@ -0,0 +1,37 @@
import { IconBuildingBank } from "@tabler/icons-react";
import { createWidgetDefinition } from "../definition";
import { optionsBuilder } from "../options";
export const stockPriceTimeFrames = {
range: ["1d", "5d", "1mo", "3mo", "6mo", "ytd", "1y", "2y", "5y", "10y", "max"] as const,
interval: ["5m", "15m", "30m", "1h", "1d", "5d", "1wk", "1mo"] as const,
};
const timeRangeOptions = stockPriceTimeFrames.range;
const timeIntervalOptions = stockPriceTimeFrames.interval;
export const { definition, componentLoader } = createWidgetDefinition("stockPrice", {
icon: IconBuildingBank,
createOptions() {
return optionsBuilder.from((factory) => ({
stock: factory.text({
defaultValue: "AAPL",
}),
timeRange: factory.select({
defaultValue: "1mo",
options: timeRangeOptions.map((value) => ({
value,
label: (t) => t(`widget.stockPrice.option.timeRange.option.${value}.label`),
})),
}),
timeInterval: factory.select({
defaultValue: "1d",
options: timeIntervalOptions.map((value) => ({
value,
label: (t) => t(`widget.stockPrice.option.timeInterval.option.${value}.label`),
})),
}),
}));
},
}).withDynamicImport(() => import("./component"));

996
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -24,7 +24,7 @@
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.2.0",
"typescript-eslint": "^8.26.1"
"typescript-eslint": "^8.27.0"
},
"devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0",