chore(release): automatic release v1.40.0

This commit is contained in:
homarr-releases[bot]
2025-10-03 19:13:40 +00:00
committed by GitHub
94 changed files with 6606 additions and 3548 deletions

View File

@@ -33,6 +33,7 @@ body:
options: options:
# The below comment is used to insert a new version with on-release.yml # The below comment is used to insert a new version with on-release.yml
#NEXT_VERSION# #NEXT_VERSION#
- 1.39.0
- 1.38.0 - 1.38.0
- 1.37.0 - 1.37.0
- 1.36.1 - 1.36.1

View File

@@ -6,7 +6,7 @@ on:
- cron: "0 0 * * *" # every day at midnight - cron: "0 0 * * *" # every day at midnight
permissions: permissions:
contents: read # required for code checkout contents: write # required to push changes
jobs: jobs:
download-crowdin-translations: download-crowdin-translations:

View File

@@ -64,7 +64,7 @@ jobs:
- uses: actions/setup-node@v5 - uses: actions/setup-node@v5
if: env.SKIP_RELEASE == 'false' if: env.SKIP_RELEASE == 'false'
with: with:
node-version: 22.19.0 node-version: 22.20.0
cache: "pnpm" cache: "pnpm"
- run: npm i -g pnpm - run: npm i -g pnpm
if: env.SKIP_RELEASE == 'false' if: env.SKIP_RELEASE == 'false'

2
.nvmrc
View File

@@ -1 +1 @@
22.19.0 22.20.0

View File

@@ -1,4 +1,4 @@
FROM node:22.19.0-alpine AS base FROM node:22.20.0-alpine AS base
FROM base AS builder FROM base AS builder
RUN apk add --no-cache libc6-compat RUN apk add --no-cache libc6-compat

View File

@@ -50,21 +50,21 @@
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^8.3.1", "@mantine/colors-generator": "^8.3.2",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"@mantine/dropzone": "^8.3.1", "@mantine/dropzone": "^8.3.2",
"@mantine/hooks": "^8.3.1", "@mantine/hooks": "^8.3.2",
"@mantine/modals": "^8.3.1", "@mantine/modals": "^8.3.2",
"@mantine/tiptap": "^8.3.1", "@mantine/tiptap": "^8.3.2",
"@million/lint": "1.0.14", "@million/lint": "1.0.14",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"@tanstack/react-query": "^5.89.0", "@tanstack/react-query": "^5.90.2",
"@tanstack/react-query-devtools": "^5.89.0", "@tanstack/react-query-devtools": "^5.90.2",
"@tanstack/react-query-next-experimental": "^5.89.0", "@tanstack/react-query-next-experimental": "^5.90.2",
"@trpc/client": "^11.5.1", "@trpc/client": "^11.6.0",
"@trpc/next": "^11.5.1", "@trpc/next": "^11.6.0",
"@trpc/react-query": "^11.5.1", "@trpc/react-query": "^11.6.0",
"@trpc/server": "^11.5.1", "@trpc/server": "^11.6.0",
"@xterm/addon-canvas": "^0.7.0", "@xterm/addon-canvas": "^0.7.0",
"@xterm/addon-fit": "0.10.0", "@xterm/addon-fit": "0.10.0",
"@xterm/xterm": "^5.5.0", "@xterm/xterm": "^5.5.0",
@@ -74,16 +74,16 @@
"dotenv": "^17.2.2", "dotenv": "^17.2.2",
"flag-icons": "^7.5.0", "flag-icons": "^7.5.0",
"glob": "^11.0.3", "glob": "^11.0.3",
"jotai": "^2.14.0", "jotai": "^2.15.0",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "15.5.3", "next": "15.5.4",
"postcss-preset-mantine": "^1.18.0", "postcss-preset-mantine": "^1.18.0",
"prismjs": "^1.30.0", "prismjs": "^1.30.0",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"react-error-boundary": "^6.0.0", "react-error-boundary": "^6.0.0",
"react-simple-code-editor": "^0.14.1", "react-simple-code-editor": "^0.14.1",
"sass": "^1.93.0", "sass": "^1.93.2",
"superjson": "2.2.2", "superjson": "2.2.2",
"swagger-ui-react": "^5.29.0", "swagger-ui-react": "^5.29.0",
"use-deep-compare-effect": "^1.8.1", "use-deep-compare-effect": "^1.8.1",
@@ -94,9 +94,9 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/chroma-js": "3.1.1", "@types/chroma-js": "3.1.1",
"@types/node": "^22.18.6", "@types/node": "^22.18.7",
"@types/prismjs": "^1.26.5", "@types/prismjs": "^1.26.5",
"@types/react": "19.1.13", "@types/react": "19.1.15",
"@types/react-dom": "19.1.9", "@types/react-dom": "19.1.9",
"@types/swagger-ui-react": "^5.18.0", "@types/swagger-ui-react": "^5.18.0",
"concurrently": "^9.2.1", "concurrently": "^9.2.1",

View File

@@ -23,6 +23,7 @@ import { useRequiredBoard } from "@homarr/boards/context";
import { useEditMode } from "@homarr/boards/edit-mode"; import { useEditMode } from "@homarr/boards/edit-mode";
import { revalidatePathActionAsync } from "@homarr/common/client"; import { revalidatePathActionAsync } from "@homarr/common/client";
import { env } from "@homarr/common/env"; import { env } from "@homarr/common/env";
import { hotkeys } from "@homarr/definitions";
import { useConfirmModal, useModalAction } from "@homarr/modals"; import { useConfirmModal, useModalAction } from "@homarr/modals";
import { AppSelectModal } from "@homarr/modals-collection"; import { AppSelectModal } from "@homarr/modals-collection";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
@@ -165,7 +166,7 @@ const EditModeMenu = () => {
open(); open();
}, [board, isEditMode, saveBoard, open]); }, [board, isEditMode, saveBoard, open]);
useHotkeys([["mod+e", toggle]]); useHotkeys([[hotkeys.toggleBoardEdit, toggle]]);
usePreventLeaveWithDirty(isEditMode); usePreventLeaveWithDirty(isEditMode);
return ( return (

View File

@@ -120,11 +120,14 @@ export const BackgroundSettingsContent = ({ board }: Props) => {
/> />
{session?.user.permissions.includes("media-upload") && ( {session?.user.permissions.includes("media-upload") && (
<UploadMedia <UploadMedia
onSuccess={({ url }) => onSuccess={(medias) => {
const first = medias.at(0);
if (!first) return;
startTransition(() => { startTransition(() => {
form.setFieldValue("backgroundImageUrl", url); form.setFieldValue("backgroundImageUrl", first.url);
}) });
} }}
> >
{({ onClick, loading }) => ( {({ onClick, loading }) => (
<ActionIcon onClick={onClick} loading={loading} mt={24} size={36} variant="default"> <ActionIcon onClick={onClick} loading={loading} mt={24} size={36} variant="default">

View File

@@ -23,6 +23,7 @@ import type { SupportedLanguage } from "@homarr/translation";
import { isLocaleRTL, isLocaleSupported } from "@homarr/translation"; import { isLocaleRTL, isLocaleSupported } from "@homarr/translation";
import { Analytics } from "~/components/layout/analytics"; import { Analytics } from "~/components/layout/analytics";
import { CrowdinLiveTranslation } from "~/components/layout/crowdin-live-translation";
import { SearchEngineOptimization } from "~/components/layout/search-engine-optimization"; import { SearchEngineOptimization } from "~/components/layout/search-engine-optimization";
import { getCurrentColorSchemeAsync } from "~/theme/color-scheme"; import { getCurrentColorSchemeAsync } from "~/theme/color-scheme";
import { DayJsLoader } from "./_client-providers/dayjs-loader"; import { DayJsLoader } from "./_client-providers/dayjs-loader";
@@ -118,10 +119,12 @@ export default async function Layout(props: {
(innerProps) => <SpotlightProvider {...innerProps} />, (innerProps) => <SpotlightProvider {...innerProps} />,
]); ]);
const { locale } = await props.params;
return ( return (
// Instead of ColorSchemScript we use data-mantine-color-scheme to prevent flickering // Instead of ColorSchemScript we use data-mantine-color-scheme to prevent flickering
<html <html
lang={(await props.params).locale} lang={locale}
dir={direction} dir={direction}
data-mantine-color-scheme={colorScheme} data-mantine-color-scheme={colorScheme}
style={{ style={{
@@ -132,6 +135,7 @@ export default async function Layout(props: {
<head> <head>
<Analytics /> <Analytics />
<SearchEngineOptimization /> <SearchEngineOptimization />
<CrowdinLiveTranslation locale={locale} />
</head> </head>
<body className={["font-sans", fontSans.variable].join(" ")}> <body className={["font-sans", fontSans.variable].join(" ")}>
<StackedProvider> <StackedProvider>

View File

@@ -11,14 +11,23 @@ import {
Center, Center,
Flex, Flex,
Group, Group,
Kbd,
List, List,
ListItem, ListItem,
Stack, Stack,
Table,
TableTbody,
TableTd,
TableTh,
TableThead,
TableTr,
Text, Text,
Title, Title,
} from "@mantine/core"; } from "@mantine/core";
import { IconLanguage, IconLibrary, IconUsers } from "@tabler/icons-react"; import { IconKeyboard, IconLanguage, IconLibrary, IconUsers } from "@tabler/icons-react";
import { capitalize, objectEntries } from "@homarr/common";
import { hotkeys } from "@homarr/definitions";
import { getScopedI18n } from "@homarr/translation/server"; import { getScopedI18n } from "@homarr/translation/server";
import { homarrLogoPath } from "~/components/layout/logo/homarr-logo"; import { homarrLogoPath } from "~/components/layout/logo/homarr-logo";
@@ -149,6 +158,45 @@ export default async function AboutPage() {
</List> </List>
</AccordionPanel> </AccordionPanel>
</AccordionItem> </AccordionItem>
<AccordionItem value="hotkeys">
<AccordionControl icon={<IconKeyboard size="1rem" />}>
<Stack gap={0}>
<Text>{t("accordion.hotkeys.title")}</Text>
<Text size="sm" c="dimmed">
{t("accordion.hotkeys.subtitle")}
</Text>
</Stack>
</AccordionControl>
<AccordionPanel>
<Table>
<TableThead>
<TableTr>
<TableTh>{t("accordion.hotkeys.field.shortcut")}</TableTh>
<TableTh>{t("accordion.hotkeys.field.action")}</TableTh>
</TableTr>
</TableThead>
<TableTbody>
{objectEntries(hotkeys).map(([key, shortcut]) => (
<TableTr key={key}>
<TableTd>
<Kbd size="md">
{shortcut
.split("+")
.map((key) => capitalize(key.trim()))
.join(" + ")}
</Kbd>
</TableTd>
<TableTd>{t(`accordion.hotkeys.action.${key}`)}</TableTd>
</TableTr>
))}
</TableTbody>
</Table>
<Text size="sm" c="dimmed">
{t("accordion.hotkeys.note")}
</Text>
</AccordionPanel>
</AccordionItem>
</Accordion> </Accordion>
</div> </div>
); );

View File

@@ -14,7 +14,7 @@ export const UploadMediaButton = () => {
}; };
return ( return (
<UploadMedia onSettled={onSettledAsync}> <UploadMedia onSettled={onSettledAsync} multiple>
{({ onClick, loading }) => ( {({ onClick, loading }) => (
<Button onClick={onClick} loading={loading} rightSection={<IconUpload size={16} stroke={1.5} />}> <Button onClick={onClick} loading={loading} rightSection={<IconUpload size={16} stroke={1.5} />}>
{t("media.action.upload.label")} {t("media.action.upload.label")}

View File

@@ -1,3 +0,0 @@
.flagIcon {
border-radius: 4px;
}

View File

@@ -6,8 +6,7 @@ import { IconCheck } from "@tabler/icons-react";
import type { SupportedLanguage } from "@homarr/translation"; import type { SupportedLanguage } from "@homarr/translation";
import { localeConfigurations, supportedLanguages } from "@homarr/translation"; import { localeConfigurations, supportedLanguages } from "@homarr/translation";
import { LanguageIcon } from "@homarr/ui";
import classes from "./language-combobox.module.css";
import "flag-icons/css/flag-icons.min.css"; import "flag-icons/css/flag-icons.min.css";
@@ -84,7 +83,7 @@ const OptionItem = ({
return ( return (
<Group wrap="nowrap" justify="space-between"> <Group wrap="nowrap" justify="space-between">
<Group wrap="nowrap"> <Group wrap="nowrap">
<span className={`fi fi-${localeConfigurations[localeKey].flagIcon} ${classes.flagIcon}`}></span> <LanguageIcon icon={localeConfigurations[localeKey].icon} />
<Group wrap="nowrap" gap="xs"> <Group wrap="nowrap" gap="xs">
<Text>{localeConfigurations[localeKey].name}</Text> <Text>{localeConfigurations[localeKey].name}</Text>
<Text size="xs" c="dimmed" inherit> <Text size="xs" c="dimmed" inherit>

View File

@@ -0,0 +1,17 @@
import Script from "next/script";
import type { SupportedLanguage } from "@homarr/translation";
export const CrowdinLiveTranslation = (props: { locale: SupportedLanguage }) => {
if (props.locale !== "cr") return null;
return (
<>
<Script type="text/javascript" src="//cdn.crowdin.com/jipt/jipt.js"></Script>
<Script type="text/javascript" id="crowdin-configuration">
{`var _jipt = []; _jipt.push(['project', 'homarr_labs']);`}
</Script>
</>
);
};

View File

@@ -19,6 +19,7 @@ import {
import type { RouterOutputs } from "@homarr/api"; import type { RouterOutputs } from "@homarr/api";
import { signOut, useSession } from "@homarr/auth/client"; import { signOut, useSession } from "@homarr/auth/client";
import { hotkeys } from "@homarr/definitions";
import { createModal, useModalAction } from "@homarr/modals"; import { createModal, useModalAction } from "@homarr/modals";
import { useScopedI18n } from "@homarr/translation/client"; import { useScopedI18n } from "@homarr/translation/client";
@@ -34,7 +35,7 @@ interface UserAvatarMenuProps {
export const UserAvatarMenu = ({ children, availableUpdatesPromise }: UserAvatarMenuProps) => { export const UserAvatarMenu = ({ children, availableUpdatesPromise }: UserAvatarMenuProps) => {
const t = useScopedI18n("common.userAvatar.menu"); const t = useScopedI18n("common.userAvatar.menu");
const { colorScheme, toggleColorScheme } = useMantineColorScheme(); const { colorScheme, toggleColorScheme } = useMantineColorScheme();
useHotkeys([["mod+J", toggleColorScheme]]); useHotkeys([[hotkeys.toggleColorScheme, toggleColorScheme]]);
const ColorSchemeIcon = colorScheme === "dark" ? IconSun : IconMoon; const ColorSchemeIcon = colorScheme === "dark" ? IconSun : IconMoon;

View File

@@ -39,7 +39,7 @@
"@homarr/widgets": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0",
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"dotenv": "^17.2.2", "dotenv": "^17.2.2",
"fastify": "^5.6.0", "fastify": "^5.6.1",
"superjson": "2.2.2", "superjson": "2.2.2",
"undici": "7.16.0" "undici": "7.16.0"
}, },
@@ -47,7 +47,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node": "^22.18.6", "@types/node": "^22.18.7",
"dotenv-cli": "^10.0.0", "dotenv-cli": "^10.0.0",
"esbuild": "^0.25.10", "esbuild": "^0.25.10",
"eslint": "^9.36.0", "eslint": "^9.36.0",

View File

@@ -43,8 +43,8 @@
"@semantic-release/npm": "^12.0.2", "@semantic-release/npm": "^12.0.2",
"@semantic-release/release-notes-generator": "^14.1.0", "@semantic-release/release-notes-generator": "^14.1.0",
"@testcontainers/redis": "^11.6.0", "@testcontainers/redis": "^11.6.0",
"@turbo/gen": "^2.5.6", "@turbo/gen": "^2.5.8",
"@vitejs/plugin-react": "^5.0.3", "@vitejs/plugin-react": "^5.0.4",
"@vitest/coverage-v8": "^3.2.4", "@vitest/coverage-v8": "^3.2.4",
"@vitest/ui": "^3.2.4", "@vitest/ui": "^3.2.4",
"conventional-changelog-conventionalcommits": "^9.1.0", "conventional-changelog-conventionalcommits": "^9.1.0",
@@ -53,14 +53,14 @@
"prettier": "^3.6.2", "prettier": "^3.6.2",
"semantic-release": "^24.2.9", "semantic-release": "^24.2.9",
"testcontainers": "^11.6.0", "testcontainers": "^11.6.0",
"turbo": "^2.5.6", "turbo": "^2.5.8",
"typescript": "^5.9.2", "typescript": "^5.9.2",
"vite-tsconfig-paths": "^5.1.4", "vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4" "vitest": "^3.2.4"
}, },
"packageManager": "pnpm@10.17.0", "packageManager": "pnpm@10.17.1",
"engines": { "engines": {
"node": ">=22.19.0" "node": ">=22.20.0"
}, },
"pnpm": { "pnpm": {
"onlyBuiltDependencies": [ "onlyBuiltDependencies": [
@@ -82,13 +82,13 @@
"brace-expansion@>=1.0.0 <=1.1.11": ">=4.0.1", "brace-expansion@>=1.0.0 <=1.1.11": ">=4.0.1",
"esbuild@<=0.24.2": ">=0.25.10", "esbuild@<=0.24.2": ">=0.25.10",
"form-data@>=4.0.0 <4.0.4": ">=4.0.4", "form-data@>=4.0.0 <4.0.4": ">=4.0.4",
"hono@<4.6.5": ">=4.9.8", "hono@<4.6.5": ">=4.9.9",
"linkifyjs@<4.3.2": ">=4.3.2", "linkifyjs@<4.3.2": ">=4.3.2",
"nanoid@>=4.0.0 <5.0.9": ">=5.1.5", "nanoid@>=4.0.0 <5.0.9": ">=5.1.6",
"prismjs@<1.30.0": ">=1.30.0", "prismjs@<1.30.0": ">=1.30.0",
"proxmox-api>undici": "7.16.0", "proxmox-api>undici": "7.16.0",
"react-is": "^19.1.1", "react-is": "^19.1.1",
"rollup@>=4.0.0 <4.22.4": ">=4.52.2", "rollup@>=4.0.0 <4.22.4": ">=4.52.3",
"sha.js@<=2.4.11": ">=2.4.12", "sha.js@<=2.4.11": ">=2.4.12",
"tar-fs@>=3.0.0 <3.0.9": ">=3.1.1", "tar-fs@>=3.0.0 <3.0.9": ">=3.1.1",
"tar-fs@>=2.0.0 <2.1.3": ">=3.1.1", "tar-fs@>=2.0.0 <2.1.3": ">=3.1.1",

View File

@@ -42,13 +42,13 @@
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.3.0", "@kubernetes/client-node": "^1.3.0",
"@tanstack/react-query": "^5.89.0", "@tanstack/react-query": "^5.90.2",
"@trpc/client": "^11.5.1", "@trpc/client": "^11.6.0",
"@trpc/react-query": "^11.5.1", "@trpc/react-query": "^11.6.0",
"@trpc/server": "^11.5.1", "@trpc/server": "^11.6.0",
"@trpc/tanstack-react-query": "^11.5.1", "@trpc/tanstack-react-query": "^11.6.0",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "^4.5.0",
"next": "15.5.3", "next": "15.5.4",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"superjson": "2.2.2", "superjson": "2.2.2",

View File

@@ -55,34 +55,47 @@ export const mediaRouter = createTRPCRouter({
.requiresPermission("media-upload") .requiresPermission("media-upload")
.input(mediaUploadSchema) .input(mediaUploadSchema)
.mutation(async ({ ctx, input }) => { .mutation(async ({ ctx, input }) => {
const content = Buffer.from(await input.file.arrayBuffer()); const files = await Promise.all(
const id = createId(); input.files.map(async (file) => ({
const media = { id: createId(),
id, meta: file,
creatorId: ctx.session.user.id, content: Buffer.from(await file.arrayBuffer()),
content, })),
size: input.file.size, );
contentType: input.file.type, const insertMedias = files.map(
name: input.file.name, (file): InferInsertModel<typeof medias> => ({
} satisfies InferInsertModel<typeof medias>; id: file.id,
await ctx.db.insert(medias).values(media); creatorId: ctx.session.user.id,
content: file.content,
size: file.meta.size,
contentType: file.meta.type,
name: file.meta.name,
}),
);
await ctx.db.insert(medias).values(insertMedias);
const localIconRepository = await ctx.db.query.iconRepositories.findFirst({ const localIconRepository = await ctx.db.query.iconRepositories.findFirst({
where: eq(iconRepositories.slug, LOCAL_ICON_REPOSITORY_SLUG), where: eq(iconRepositories.slug, LOCAL_ICON_REPOSITORY_SLUG),
}); });
if (!localIconRepository) return id; const ids = files.map((file) => file.id);
if (!localIconRepository) return ids;
const icon = mapMediaToIcon(media); await ctx.db.insert(icons).values(
await ctx.db.insert(icons).values({ insertMedias.map((media) => {
id: createId(), const icon = mapMediaToIcon(media);
checksum: icon.checksum,
name: icon.fileNameWithExtension,
url: icon.imageUrl,
iconRepositoryId: localIconRepository.id,
});
return id; return {
id: createId(),
checksum: icon.checksum,
name: icon.fileNameWithExtension,
url: icon.imageUrl,
iconRepositoryId: localIconRepository.id,
};
}),
);
return ids;
}), }),
deleteMedia: protectedProcedure.input(byIdSchema).mutation(async ({ ctx, input }) => { deleteMedia: protectedProcedure.input(byIdSchema).mutation(async ({ ctx, input }) => {
const dbMedia = await ctx.db.query.medias.findFirst({ const dbMedia = await ctx.db.query.medias.findFirst({

View File

@@ -1,4 +1,7 @@
import { observable } from "@trpc/server/observable";
import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { getIntegrationKindsByCategory } from "@homarr/definitions";
import type { MediaTranscoding } from "@homarr/request-handler/media-transcoding";
import { mediaTranscodingRequestHandler } from "@homarr/request-handler/media-transcoding"; import { mediaTranscodingRequestHandler } from "@homarr/request-handler/media-transcoding";
import { paginatedSchema } from "@homarr/validation/common"; import { paginatedSchema } from "@homarr/validation/common";
@@ -15,7 +18,7 @@ export const mediaTranscodingRouter = createTRPCRouter({
.input(paginatedSchema.pick({ page: true, pageSize: true })) .input(paginatedSchema.pick({ page: true, pageSize: true }))
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
const innerHandler = mediaTranscodingRequestHandler.handler(ctx.integration, { const innerHandler = mediaTranscodingRequestHandler.handler(ctx.integration, {
pageOffset: input.page, pageOffset: (input.page - 1) * input.pageSize,
pageSize: input.pageSize, pageSize: input.pageSize,
}); });
const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false });
@@ -25,4 +28,19 @@ export const mediaTranscodingRouter = createTRPCRouter({
data, data,
}; };
}), }),
subscribeData: publicProcedure
.concat(createIndexerManagerIntegrationMiddleware("query"))
.input(paginatedSchema.pick({ page: true, pageSize: true }))
.subscription(({ ctx, input }) => {
return observable<{ integrationId: string; data: MediaTranscoding }>((emit) => {
const innerHandler = mediaTranscodingRequestHandler.handler(ctx.integration, {
pageOffset: (input.page - 1) * input.pageSize,
pageSize: input.pageSize,
});
const unsubscribe = innerHandler.subscribe((data) => {
emit.next({ integrationId: input.integrationId, data });
});
return unsubscribe;
});
}),
}); });

View File

@@ -35,7 +35,7 @@
"bcrypt": "^6.0.0", "bcrypt": "^6.0.0",
"cookies": "^0.9.1", "cookies": "^0.9.1",
"ldapts": "8.0.9", "ldapts": "8.0.9",
"next": "15.5.3", "next": "15.5.4",
"next-auth": "5.0.0-beta.29", "next-auth": "5.0.0-beta.29",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",

View File

@@ -32,7 +32,7 @@
"@paralleldrive/cuid2": "^2.2.2", "@paralleldrive/cuid2": "^2.2.2",
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"dns-caching": "^0.2.7", "dns-caching": "^0.2.7",
"next": "15.5.3", "next": "15.5.4",
"octokit": "^5.0.3", "octokit": "^5.0.3",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",

View File

@@ -25,7 +25,7 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@t3-oss/env-nextjs": "^0.13.8", "@t3-oss/env-nextjs": "^0.13.8",
"ioredis": "5.7.0", "ioredis": "5.8.0",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -29,10 +29,10 @@
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
"@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/cron-jobs": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@tanstack/react-query": "^5.89.0", "@tanstack/react-query": "^5.90.2",
"@trpc/client": "^11.5.1", "@trpc/client": "^11.6.0",
"@trpc/server": "^11.5.1", "@trpc/server": "^11.6.0",
"@trpc/tanstack-react-query": "^11.5.1", "@trpc/tanstack-react-query": "^11.6.0",
"node-cron": "^4.2.1", "node-cron": "^4.2.1",
"react": "19.1.1", "react": "19.1.1",
"zod": "^4.1.11" "zod": "^4.1.11"
@@ -42,7 +42,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"@types/react": "19.1.13", "@types/react": "19.1.15",
"eslint": "^9.36.0", "eslint": "^9.36.0",
"typescript": "^5.9.2" "typescript": "^5.9.2"
} }

View File

@@ -49,16 +49,16 @@
"@homarr/definitions": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"@paralleldrive/cuid2": "^2.2.2", "@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.6.0", "@testcontainers/mysql": "^11.6.0",
"@testcontainers/postgresql": "^11.6.0", "@testcontainers/postgresql": "^11.6.0",
"better-sqlite3": "^12.2.0", "better-sqlite3": "^12.4.1",
"dotenv": "^17.2.2", "dotenv": "^17.2.2",
"drizzle-kit": "^0.31.4", "drizzle-kit": "^0.31.5",
"drizzle-orm": "^0.44.5", "drizzle-orm": "^0.44.5",
"drizzle-zod": "^0.8.3", "drizzle-zod": "^0.8.3",
"mysql2": "3.15.0", "mysql2": "3.15.1",
"pg": "^8.16.3", "pg": "^8.16.3",
"superjson": "2.2.2" "superjson": "2.2.2"
}, },

View File

@@ -0,0 +1,6 @@
export const hotkeys = {
toggleBoardEdit: "mod+e",
toggleColorScheme: "mod+j",
saveNotebook: "mod+s",
openSpotlight: "mod+k",
};

View File

@@ -13,3 +13,4 @@ export * from "./cookie";
export * from "./search-engine"; export * from "./search-engine";
export * from "./onboarding"; export * from "./onboarding";
export * from "./emptysuperjson"; export * from "./emptysuperjson";
export * from "./hotkeys";

View File

@@ -26,7 +26,7 @@
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/form": "^8.3.1", "@mantine/form": "^8.3.2",
"mantine-form-zod-resolver": "^1.3.0", "mantine-form-zod-resolver": "^1.3.0",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },

View File

@@ -29,7 +29,7 @@
"@homarr/notifications": "workspace:^0.1.0", "@homarr/notifications": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"react": "19.1.1", "react": "19.1.1",
"zod": "^4.1.11" "zod": "^4.1.11"
}, },

View File

@@ -165,11 +165,14 @@ export const IconPicker = ({
/> />
{session?.user.permissions.includes("media-upload") && ( {session?.user.permissions.includes("media-upload") && (
<UploadMedia <UploadMedia
onSuccess={({ url }) => { onSuccess={(medias) => {
const first = medias.at(0);
if (!first) return;
startTransition(() => { startTransition(() => {
setValue(url); setValue(first.url);
setPreviewUrl(url); setPreviewUrl(first.url);
setSearch(url); setSearch(first.url);
}); });
}} }}
> >

View File

@@ -9,27 +9,31 @@ import { supportedMediaUploadFormats } from "@homarr/validation/media";
interface UploadMediaProps { interface UploadMediaProps {
children: (props: { onClick: () => void; loading: boolean }) => JSX.Element; children: (props: { onClick: () => void; loading: boolean }) => JSX.Element;
multiple?: boolean;
onSettled?: () => MaybePromise<void>; onSettled?: () => MaybePromise<void>;
onSuccess?: (media: { id: string; url: string }) => MaybePromise<void>; onSuccess?: (media: { id: string; url: string }[]) => MaybePromise<void>;
} }
export const UploadMedia = ({ children, onSettled, onSuccess }: UploadMediaProps) => { export const UploadMedia = ({ children, onSettled, onSuccess, multiple = false }: UploadMediaProps) => {
const t = useI18n(); const t = useI18n();
const { mutateAsync, isPending } = clientApi.media.uploadMedia.useMutation(); const { mutateAsync, isPending } = clientApi.media.uploadMedia.useMutation();
const handleFileUploadAsync = async (file: File | null) => { const handleFileUploadAsync = async (files: File[] | File | null) => {
if (!file) return; if (!files || (Array.isArray(files) && files.length === 0)) return;
const filesArray: File[] = Array.isArray(files) ? files : [files];
const formData = new FormData(); const formData = new FormData();
formData.append("file", file); filesArray.forEach((file) => formData.append("files", file));
await mutateAsync(formData, { await mutateAsync(formData, {
async onSuccess(mediaId) { async onSuccess(mediaIds) {
showSuccessNotification({ showSuccessNotification({
message: t("media.action.upload.notification.success.message"), message: t("media.action.upload.notification.success.message"),
}); });
await onSuccess?.({ await onSuccess?.(
id: mediaId, mediaIds.map((id) => ({
url: `/api/user-medias/${mediaId}`, id,
}); url: `/api/user-medias/${id}`,
})),
);
}, },
onError() { onError() {
showErrorNotification({ showErrorNotification({
@@ -43,7 +47,7 @@ export const UploadMedia = ({ children, onSettled, onSuccess }: UploadMediaProps
}; };
return ( return (
<FileButton onChange={handleFileUploadAsync} accept={supportedMediaUploadFormats.join(",")}> <FileButton onChange={handleFileUploadAsync} accept={supportedMediaUploadFormats.join(",")} multiple={multiple}>
{({ onClick }) => children({ onClick, loading: isPending })} {({ onClick }) => children({ onClick, loading: isPending })}
</FileButton> </FileButton>
); );

View File

@@ -117,6 +117,7 @@ export class EmbyIntegration extends Integration implements IMediaServerIntegrat
episodeName: sessionInfo.NowPlayingItem.EpisodeTitle, episodeName: sessionInfo.NowPlayingItem.EpisodeTitle,
albumName: sessionInfo.NowPlayingItem.Album ?? "", albumName: sessionInfo.NowPlayingItem.Album ?? "",
episodeCount: sessionInfo.NowPlayingItem.EpisodeCount, episodeCount: sessionInfo.NowPlayingItem.EpisodeCount,
metadata: null,
}; };
} }

View File

@@ -13,6 +13,30 @@ export interface StreamSession {
episodeName?: string | null; episodeName?: string | null;
albumName?: string | null; albumName?: string | null;
episodeCount?: number | null; episodeCount?: number | null;
metadata: {
video: {
resolution: {
width: number;
height: number;
} | null;
frameRate: number | null;
};
audio: {
channelCount: number | null;
codec: string | null;
};
transcoding: {
container: string | null;
resolution: {
width: number;
height: number;
} | null;
target: {
audioCodec: string | null;
videoCodec: string | null;
};
};
} | null;
} | null; } | null;
} }

View File

@@ -57,6 +57,36 @@ export class JellyfinIntegration extends Integration implements IMediaServerInte
episodeName: sessionInfo.NowPlayingItem.EpisodeTitle, episodeName: sessionInfo.NowPlayingItem.EpisodeTitle,
albumName: sessionInfo.NowPlayingItem.Album ?? "", albumName: sessionInfo.NowPlayingItem.Album ?? "",
episodeCount: sessionInfo.NowPlayingItem.EpisodeCount, episodeCount: sessionInfo.NowPlayingItem.EpisodeCount,
metadata: {
video: {
resolution:
sessionInfo.NowPlayingItem.Width && sessionInfo.NowPlayingItem.Height
? {
width: sessionInfo.NowPlayingItem.Width,
height: sessionInfo.NowPlayingItem.Height,
}
: null,
frameRate: sessionInfo.TranscodingInfo?.Framerate ?? null,
},
audio: {
channelCount: sessionInfo.TranscodingInfo?.AudioChannels ?? null,
codec: sessionInfo.TranscodingInfo?.AudioCodec ?? null,
},
transcoding: {
resolution:
sessionInfo.TranscodingInfo?.Width && sessionInfo.TranscodingInfo.Height
? {
width: sessionInfo.TranscodingInfo.Width,
height: sessionInfo.TranscodingInfo.Height,
}
: null,
target: {
audioCodec: sessionInfo.TranscodingInfo?.AudioCodec ?? null,
videoCodec: sessionInfo.TranscodingInfo?.VideoCodec ?? null,
},
container: sessionInfo.TranscodingInfo?.Container ?? null,
},
},
}; };
} }

View File

@@ -28,6 +28,7 @@ export class MediaServerMockService implements IMediaServerIntegration {
episodeName: null, episodeName: null,
albumName: null, albumName: null,
episodeCount: null, episodeCount: null,
metadata: null,
} }
: null, : null,
}; };

View File

@@ -61,6 +61,7 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
episodeName: mediaElement.$.title ?? null, episodeName: mediaElement.$.title ?? null,
albumName: mediaElement.$.type === "track" ? (mediaElement.$.parentTitle ?? null) : null, albumName: mediaElement.$.type === "track" ? (mediaElement.$.parentTitle ?? null) : null,
episodeCount: mediaElement.$.index ?? null, episodeCount: mediaElement.$.index ?? null,
metadata: null,
}, },
}; };
}) })

View File

@@ -33,10 +33,10 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"next": "15.5.3", "next": "15.5.4",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"zod": "^4.1.11" "zod": "^4.1.11"

View File

@@ -24,8 +24,8 @@
"dependencies": { "dependencies": {
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"@mantine/hooks": "^8.3.1", "@mantine/hooks": "^8.3.2",
"react": "19.1.1" "react": "19.1.1"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -24,7 +24,7 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/notifications": "^8.3.1", "@mantine/notifications": "^8.3.2",
"@tabler/icons-react": "^3.35.0" "@tabler/icons-react": "^3.35.0"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -37,10 +37,10 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"@mantine/hooks": "^8.3.1", "@mantine/hooks": "^8.3.2",
"adm-zip": "0.5.16", "adm-zip": "0.5.16",
"next": "15.5.3", "next": "15.5.4",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"superjson": "2.2.2", "superjson": "2.2.2",

View File

@@ -27,7 +27,7 @@
"@homarr/db": "workspace:^", "@homarr/db": "workspace:^",
"@homarr/definitions": "workspace:^", "@homarr/definitions": "workspace:^",
"@homarr/log": "workspace:^", "@homarr/log": "workspace:^",
"ioredis": "5.7.0", "ioredis": "5.8.0",
"superjson": "2.2.2" "superjson": "2.2.2"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -7,7 +7,7 @@ import type { TdarrQueue, TdarrStatistics, TdarrWorker } from "@homarr/integrati
import { createCachedIntegrationRequestHandler } from "./lib/cached-integration-request-handler"; import { createCachedIntegrationRequestHandler } from "./lib/cached-integration-request-handler";
export const mediaTranscodingRequestHandler = createCachedIntegrationRequestHandler< export const mediaTranscodingRequestHandler = createCachedIntegrationRequestHandler<
{ queue: TdarrQueue; workers: TdarrWorker[]; statistics: TdarrStatistics }, MediaTranscoding,
IntegrationKindByCategory<"mediaTranscoding">, IntegrationKindByCategory<"mediaTranscoding">,
{ pageOffset: number; pageSize: number } { pageOffset: number; pageSize: number }
>({ >({
@@ -22,3 +22,9 @@ export const mediaTranscodingRequestHandler = createCachedIntegrationRequestHand
}; };
}, },
}); });
export interface MediaTranscoding {
queue: TdarrQueue;
workers: TdarrWorker[];
statistics: TdarrStatistics;
}

View File

@@ -26,8 +26,8 @@
"@homarr/api": "workspace:^0.1.0", "@homarr/api": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@mantine/dates": "^8.3.1", "@mantine/dates": "^8.3.2",
"next": "15.5.3", "next": "15.5.4",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1" "react-dom": "19.1.1"
}, },

View File

@@ -33,12 +33,12 @@
"@homarr/settings": "workspace:^0.1.0", "@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"@mantine/hooks": "^8.3.1", "@mantine/hooks": "^8.3.2",
"@mantine/spotlight": "^8.3.1", "@mantine/spotlight": "^8.3.2",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"jotai": "^2.14.0", "jotai": "^2.15.0",
"next": "15.5.3", "next": "15.5.4",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"use-deep-compare-effect": "^1.8.1" "use-deep-compare-effect": "^1.8.1"

View File

@@ -6,6 +6,7 @@ import { ActionIcon, Center, Group, Kbd } from "@mantine/core";
import { Spotlight as MantineSpotlight } from "@mantine/spotlight"; import { Spotlight as MantineSpotlight } from "@mantine/spotlight";
import { IconQuestionMark, IconSearch, IconX } from "@tabler/icons-react"; import { IconQuestionMark, IconSearch, IconX } from "@tabler/icons-react";
import { hotkeys } from "@homarr/definitions";
import type { TranslationObject } from "@homarr/translation"; import type { TranslationObject } from "@homarr/translation";
import { useI18n } from "@homarr/translation/client"; import { useI18n } from "@homarr/translation/client";
@@ -49,6 +50,7 @@ const SpotlightWithActiveMode = ({ modeState, activeMode }: SpotlightWithActiveM
return ( return (
<MantineSpotlight.Root <MantineSpotlight.Root
shortcut={hotkeys.openSpotlight}
yOffset={8} yOffset={8}
onSpotlightClose={() => { onSpotlightClose={() => {
setMode(defaultMode); setMode(defaultMode);

View File

@@ -3,6 +3,7 @@ import { IconCheck } from "@tabler/icons-react";
import { localeConfigurations, supportedLanguages } from "@homarr/translation"; import { localeConfigurations, supportedLanguages } from "@homarr/translation";
import { useChangeLocale, useCurrentLocale, useI18n } from "@homarr/translation/client"; import { useChangeLocale, useCurrentLocale, useI18n } from "@homarr/translation/client";
import { LanguageIcon } from "@homarr/ui";
import { createChildrenOptions } from "../../../lib/children"; import { createChildrenOptions } from "../../../lib/children";
@@ -34,7 +35,7 @@ export const languageChildrenOptions = createChildrenOptions<Record<string, unkn
return ( return (
<Group mx="md" my="sm" wrap="nowrap" justify="space-between" w="100%"> <Group mx="md" my="sm" wrap="nowrap" justify="space-between" w="100%">
<Group wrap="nowrap"> <Group wrap="nowrap">
<span className={`fi fi-${configuration.flagIcon}`} style={{ borderRadius: 4 }}></span> <LanguageIcon icon={localeConfigurations[localeKey].icon} />
<Group wrap="nowrap" gap="xs"> <Group wrap="nowrap" gap="xs">
<Text>{configuration.name}</Text> <Text>{configuration.name}</Text>
<Text size="xs" c="dimmed" inherit> <Text size="xs" c="dimmed" inherit>

View File

@@ -32,7 +32,7 @@
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"deepmerge": "4.3.1", "deepmerge": "4.3.1",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "15.5.3", "next": "15.5.4",
"next-intl": "4.3.9", "next-intl": "4.3.9",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1" "react-dom": "19.1.1"

View File

@@ -6,7 +6,7 @@ export const localeConfigurations = {
ca: { ca: {
name: "Català", name: "Català",
translatedName: "Catalan", translatedName: "Catalan",
flagIcon: "es-ct", icon: flagIcon("es-ct"),
importMrtLocalization() { importMrtLocalization() {
return import("./mantine-react-table/ca.json"); return import("./mantine-react-table/ca.json");
}, },
@@ -17,7 +17,7 @@ export const localeConfigurations = {
cn: { cn: {
name: "中文", name: "中文",
translatedName: "Chinese (Simplified)", translatedName: "Chinese (Simplified)",
flagIcon: "cn", icon: flagIcon("cn"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/zh-Hans/index.esm.mjs").then( return import("mantine-react-table/locales/zh-Hans/index.esm.mjs").then(
(module) => module.MRT_Localization_ZH_HANS, (module) => module.MRT_Localization_ZH_HANS,
@@ -27,10 +27,24 @@ export const localeConfigurations = {
return import("dayjs/locale/zh-cn").then((module) => module.default); return import("dayjs/locale/zh-cn").then((module) => module.default);
}, },
}, },
cr: {
name: "Crowdin",
translatedName: "Live translation",
icon: {
type: "custom" as const,
url: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/crowdin.svg",
},
importMrtLocalization() {
return import("mantine-react-table/locales/en/index.esm.mjs").then((module) => module.MRT_Localization_EN);
},
importDayJsLocale() {
return import("dayjs/locale/en-gb").then((module) => module.default);
},
},
cs: { cs: {
name: "Čeština", name: "Čeština",
translatedName: "Czech", translatedName: "Czech",
flagIcon: "cz", icon: flagIcon("cz"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/cs/index.esm.mjs").then((module) => module.MRT_Localization_CS); return import("mantine-react-table/locales/cs/index.esm.mjs").then((module) => module.MRT_Localization_CS);
}, },
@@ -41,7 +55,7 @@ export const localeConfigurations = {
da: { da: {
name: "Dansk", name: "Dansk",
translatedName: "Danish", translatedName: "Danish",
flagIcon: "dk", icon: flagIcon("dk"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/da/index.esm.mjs").then((module) => module.MRT_Localization_DA); return import("mantine-react-table/locales/da/index.esm.mjs").then((module) => module.MRT_Localization_DA);
}, },
@@ -52,7 +66,7 @@ export const localeConfigurations = {
de: { de: {
name: "Deutsch", name: "Deutsch",
translatedName: "German", translatedName: "German",
flagIcon: "de", icon: flagIcon("de"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/de/index.esm.mjs").then((module) => module.MRT_Localization_DE); return import("mantine-react-table/locales/de/index.esm.mjs").then((module) => module.MRT_Localization_DE);
}, },
@@ -63,7 +77,7 @@ export const localeConfigurations = {
"de-CH": { "de-CH": {
name: "Deutsch (Schweiz)", name: "Deutsch (Schweiz)",
translatedName: "German (Swiss)", translatedName: "German (Swiss)",
flagIcon: "ch", icon: flagIcon("ch"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/de/index.esm.mjs").then((module) => module.MRT_Localization_DE); return import("mantine-react-table/locales/de/index.esm.mjs").then((module) => module.MRT_Localization_DE);
}, },
@@ -74,7 +88,7 @@ export const localeConfigurations = {
"en-gb": { "en-gb": {
name: "English (UK)", name: "English (UK)",
translatedName: "English (UK)", translatedName: "English (UK)",
flagIcon: "gb", icon: flagIcon("gb"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/en/index.esm.mjs").then((module) => module.MRT_Localization_EN); return import("mantine-react-table/locales/en/index.esm.mjs").then((module) => module.MRT_Localization_EN);
}, },
@@ -85,7 +99,7 @@ export const localeConfigurations = {
en: { en: {
name: "English (US)", name: "English (US)",
translatedName: "English (US)", translatedName: "English (US)",
flagIcon: "us", icon: flagIcon("us"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/en/index.esm.mjs").then((module) => module.MRT_Localization_EN); return import("mantine-react-table/locales/en/index.esm.mjs").then((module) => module.MRT_Localization_EN);
}, },
@@ -96,7 +110,7 @@ export const localeConfigurations = {
el: { el: {
name: "Ελληνικά", name: "Ελληνικά",
translatedName: "Greek", translatedName: "Greek",
flagIcon: "gr", icon: flagIcon("gr"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/el/index.esm.mjs").then((module) => module.MRT_Localization_EL); return import("mantine-react-table/locales/el/index.esm.mjs").then((module) => module.MRT_Localization_EL);
}, },
@@ -107,7 +121,7 @@ export const localeConfigurations = {
es: { es: {
name: "Español", name: "Español",
translatedName: "Spanish", translatedName: "Spanish",
flagIcon: "es", icon: flagIcon("es"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/es/index.esm.mjs").then((module) => module.MRT_Localization_ES); return import("mantine-react-table/locales/es/index.esm.mjs").then((module) => module.MRT_Localization_ES);
}, },
@@ -118,7 +132,7 @@ export const localeConfigurations = {
et: { et: {
name: "Eesti", name: "Eesti",
translatedName: "Estonian", translatedName: "Estonian",
flagIcon: "ee", icon: flagIcon("ee"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/et/index.esm.mjs").then((module) => module.MRT_Localization_ET); return import("mantine-react-table/locales/et/index.esm.mjs").then((module) => module.MRT_Localization_ET);
}, },
@@ -129,7 +143,7 @@ export const localeConfigurations = {
fr: { fr: {
name: "Français", name: "Français",
translatedName: "French", translatedName: "French",
flagIcon: "fr", icon: flagIcon("fr"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/fr/index.esm.mjs").then((module) => module.MRT_Localization_FR); return import("mantine-react-table/locales/fr/index.esm.mjs").then((module) => module.MRT_Localization_FR);
}, },
@@ -140,7 +154,7 @@ export const localeConfigurations = {
he: { he: {
name: "עברית", name: "עברית",
translatedName: "Hebrew", translatedName: "Hebrew",
flagIcon: "il", icon: flagIcon("il"),
isRTL: true, isRTL: true,
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/he/index.esm.mjs").then((module) => module.MRT_Localization_HE); return import("mantine-react-table/locales/he/index.esm.mjs").then((module) => module.MRT_Localization_HE);
@@ -152,7 +166,7 @@ export const localeConfigurations = {
hr: { hr: {
name: "Hrvatski", name: "Hrvatski",
translatedName: "Croatian", translatedName: "Croatian",
flagIcon: "hr", icon: flagIcon("hr"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/hr/index.esm.mjs").then((module) => module.MRT_Localization_HR); return import("mantine-react-table/locales/hr/index.esm.mjs").then((module) => module.MRT_Localization_HR);
}, },
@@ -163,7 +177,7 @@ export const localeConfigurations = {
hu: { hu: {
name: "Magyar", name: "Magyar",
translatedName: "Hungarian", translatedName: "Hungarian",
flagIcon: "hu", icon: flagIcon("hu"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/hu/index.esm.mjs").then((module) => module.MRT_Localization_HU); return import("mantine-react-table/locales/hu/index.esm.mjs").then((module) => module.MRT_Localization_HU);
}, },
@@ -174,7 +188,7 @@ export const localeConfigurations = {
it: { it: {
name: "Italiano", name: "Italiano",
translatedName: "Italian", translatedName: "Italian",
flagIcon: "it", icon: flagIcon("it"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/it/index.esm.mjs").then((module) => module.MRT_Localization_IT); return import("mantine-react-table/locales/it/index.esm.mjs").then((module) => module.MRT_Localization_IT);
}, },
@@ -185,7 +199,7 @@ export const localeConfigurations = {
ja: { ja: {
name: "日本語", name: "日本語",
translatedName: "Japanese", translatedName: "Japanese",
flagIcon: "jp", icon: flagIcon("jp"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/ja/index.esm.mjs").then((module) => module.MRT_Localization_JA); return import("mantine-react-table/locales/ja/index.esm.mjs").then((module) => module.MRT_Localization_JA);
}, },
@@ -196,7 +210,7 @@ export const localeConfigurations = {
ko: { ko: {
name: "한국어", name: "한국어",
translatedName: "Korean", translatedName: "Korean",
flagIcon: "kr", icon: flagIcon("kr"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/ko/index.esm.mjs").then((module) => module.MRT_Localization_KO); return import("mantine-react-table/locales/ko/index.esm.mjs").then((module) => module.MRT_Localization_KO);
}, },
@@ -207,7 +221,7 @@ export const localeConfigurations = {
lt: { lt: {
name: "Lietuvių", name: "Lietuvių",
translatedName: "Lithuanian", translatedName: "Lithuanian",
flagIcon: "lt", icon: flagIcon("lt"),
importMrtLocalization() { importMrtLocalization() {
return import("./mantine-react-table/lt.json"); return import("./mantine-react-table/lt.json");
}, },
@@ -218,7 +232,7 @@ export const localeConfigurations = {
lv: { lv: {
name: "Latviešu", name: "Latviešu",
translatedName: "Latvian", translatedName: "Latvian",
flagIcon: "lv", icon: flagIcon("lv"),
importMrtLocalization() { importMrtLocalization() {
return import("./mantine-react-table/lv.json"); return import("./mantine-react-table/lv.json");
}, },
@@ -229,7 +243,7 @@ export const localeConfigurations = {
nl: { nl: {
name: "Nederlands", name: "Nederlands",
translatedName: "Dutch", translatedName: "Dutch",
flagIcon: "nl", icon: flagIcon("nl"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/nl/index.esm.mjs").then((module) => module.MRT_Localization_NL); return import("mantine-react-table/locales/nl/index.esm.mjs").then((module) => module.MRT_Localization_NL);
}, },
@@ -240,7 +254,7 @@ export const localeConfigurations = {
no: { no: {
name: "Norsk", name: "Norsk",
translatedName: "Norwegian", translatedName: "Norwegian",
flagIcon: "no", icon: flagIcon("no"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/no/index.esm.mjs").then((module) => module.MRT_Localization_NO); return import("mantine-react-table/locales/no/index.esm.mjs").then((module) => module.MRT_Localization_NO);
}, },
@@ -251,7 +265,7 @@ export const localeConfigurations = {
pl: { pl: {
name: "Polski", name: "Polski",
translatedName: "Polish", translatedName: "Polish",
flagIcon: "pl", icon: flagIcon("pl"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/pl/index.esm.mjs").then((module) => module.MRT_Localization_PL); return import("mantine-react-table/locales/pl/index.esm.mjs").then((module) => module.MRT_Localization_PL);
}, },
@@ -262,7 +276,7 @@ export const localeConfigurations = {
pt: { pt: {
name: "Português", name: "Português",
translatedName: "Portuguese", translatedName: "Portuguese",
flagIcon: "pt", icon: flagIcon("pt"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/pt/index.esm.mjs").then((module) => module.MRT_Localization_PT); return import("mantine-react-table/locales/pt/index.esm.mjs").then((module) => module.MRT_Localization_PT);
}, },
@@ -273,7 +287,7 @@ export const localeConfigurations = {
ro: { ro: {
name: "Românesc", name: "Românesc",
translatedName: "Romanian", translatedName: "Romanian",
flagIcon: "ro", icon: flagIcon("ro"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/ro/index.esm.mjs").then((module) => module.MRT_Localization_RO); return import("mantine-react-table/locales/ro/index.esm.mjs").then((module) => module.MRT_Localization_RO);
}, },
@@ -284,7 +298,7 @@ export const localeConfigurations = {
ru: { ru: {
name: "Русский", name: "Русский",
translatedName: "Russian", translatedName: "Russian",
flagIcon: "ru", icon: flagIcon("ru"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/ru/index.esm.mjs").then((module) => module.MRT_Localization_RU); return import("mantine-react-table/locales/ru/index.esm.mjs").then((module) => module.MRT_Localization_RU);
}, },
@@ -295,7 +309,7 @@ export const localeConfigurations = {
sk: { sk: {
name: "Slovenčina", name: "Slovenčina",
translatedName: "Slovak", translatedName: "Slovak",
flagIcon: "sk", icon: flagIcon("sk"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/sk/index.esm.mjs").then((module) => module.MRT_Localization_SK); return import("mantine-react-table/locales/sk/index.esm.mjs").then((module) => module.MRT_Localization_SK);
}, },
@@ -306,7 +320,7 @@ export const localeConfigurations = {
sl: { sl: {
name: "Slovenščina", name: "Slovenščina",
translatedName: "Slovenian", translatedName: "Slovenian",
flagIcon: "si", icon: flagIcon("si"),
importMrtLocalization() { importMrtLocalization() {
return import("./mantine-react-table/sl.json"); return import("./mantine-react-table/sl.json");
}, },
@@ -317,7 +331,7 @@ export const localeConfigurations = {
sv: { sv: {
name: "Svenska", name: "Svenska",
translatedName: "Swedish", translatedName: "Swedish",
flagIcon: "se", icon: flagIcon("se"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/sv/index.esm.mjs").then((module) => module.MRT_Localization_SV); return import("mantine-react-table/locales/sv/index.esm.mjs").then((module) => module.MRT_Localization_SV);
}, },
@@ -328,7 +342,7 @@ export const localeConfigurations = {
tr: { tr: {
name: "Türkçe", name: "Türkçe",
translatedName: "Turkish", translatedName: "Turkish",
flagIcon: "tr", icon: flagIcon("tr"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/tr/index.esm.mjs").then((module) => module.MRT_Localization_TR); return import("mantine-react-table/locales/tr/index.esm.mjs").then((module) => module.MRT_Localization_TR);
}, },
@@ -339,7 +353,7 @@ export const localeConfigurations = {
zh: { zh: {
name: "中文", name: "中文",
translatedName: "Chinese (Traditional)", translatedName: "Chinese (Traditional)",
flagIcon: "tw", icon: flagIcon("tw"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/zh-Hant/index.esm.mjs").then( return import("mantine-react-table/locales/zh-Hant/index.esm.mjs").then(
(module) => module.MRT_Localization_ZH_HANT, (module) => module.MRT_Localization_ZH_HANT,
@@ -352,7 +366,7 @@ export const localeConfigurations = {
uk: { uk: {
name: "Українська", name: "Українська",
translatedName: "Ukrainian", translatedName: "Ukrainian",
flagIcon: "ua", icon: flagIcon("ua"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/uk/index.esm.mjs").then((module) => module.MRT_Localization_UK); return import("mantine-react-table/locales/uk/index.esm.mjs").then((module) => module.MRT_Localization_UK);
}, },
@@ -363,7 +377,7 @@ export const localeConfigurations = {
vi: { vi: {
name: "Tiếng Việt", name: "Tiếng Việt",
translatedName: "Vietnamese", translatedName: "Vietnamese",
flagIcon: "vn", icon: flagIcon("vn"),
importMrtLocalization() { importMrtLocalization() {
return import("mantine-react-table/locales/vi/index.esm.mjs").then((module) => module.MRT_Localization_VI); return import("mantine-react-table/locales/vi/index.esm.mjs").then((module) => module.MRT_Localization_VI);
}, },
@@ -376,13 +390,27 @@ export const localeConfigurations = {
{ {
name: string; name: string;
translatedName: string; translatedName: string;
flagIcon: string; icon: LanguageIconDefinition;
importMrtLocalization: () => Promise<MRT_Localization>; importMrtLocalization: () => Promise<MRT_Localization>;
importDayJsLocale: () => Promise<ILocale>; importDayJsLocale: () => Promise<ILocale>;
isRTL?: boolean; isRTL?: boolean;
} }
>; >;
function flagIcon<TCode extends string>(flag: TCode) {
return { type: "flag" as const, flag };
}
export type LanguageIconDefinition =
| {
type: "flag";
flag: string;
}
| {
type: "custom";
url: string;
};
export const supportedLanguages = objectKeys(localeConfigurations); export const supportedLanguages = objectKeys(localeConfigurations);
export type SupportedLanguage = (typeof supportedLanguages)[number]; export type SupportedLanguage = (typeof supportedLanguages)[number];

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "", "width": "",
"height": "" "height": ""
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "", "name": "",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "", "label": "",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,25 +945,29 @@
"label": "主题", "label": "主题",
"newLabel": "新主题" "newLabel": "新主题"
}, },
"url": {
"label": "网址",
"newLabel": "新网址"
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "API 密钥 (Key)",
"newLabel": "" "newLabel": "新 API 密钥 (Key)"
}, },
"opnsenseApiSecret": { "opnsenseApiSecret": {
"label": "", "label": "API 密钥 (保密)",
"newLabel": "" "newLabel": "新 API 密钥 (保密)"
}, },
"githubAppId": { "githubAppId": {
"label": "", "label": "应用ID",
"newLabel": "" "newLabel": "新应用ID"
}, },
"githubInstallationId": { "githubInstallationId": {
"label": "", "label": "安装 ID",
"newLabel": "" "newLabel": "新安装 ID"
}, },
"privateKey": { "privateKey": {
"label": "", "label": "私人密钥",
"newLabel": "" "newLabel": "新私人密钥"
} }
} }
}, },
@@ -1015,7 +1019,7 @@
} }
}, },
"common": { "common": {
"success": "", "success": "成功",
"beta": "测试版", "beta": "测试版",
"error": "错误", "error": "错误",
"action": { "action": {
@@ -1282,21 +1286,21 @@
"label": "启用状态检查" "label": "启用状态检查"
}, },
"layout": { "layout": {
"label": "", "label": "界面",
"option": { "option": {
"row": "", "row": "横向",
"row-reverse": "", "row-reverse": "横向 (反转)",
"column": "", "column": "垂直",
"column-reverse": "" "column-reverse": "垂直 (反转)"
} }
}, },
"descriptionDisplayMode": { "descriptionDisplayMode": {
"label": "", "label": "描述信息显示模式",
"description": "", "description": "选择应用描述的显示方式",
"option": { "option": {
"normal": "", "normal": "窗口组件内",
"tooltip": "", "tooltip": "显示为悬停提示",
"hidden": "" "hidden": "隐藏"
} }
} }
}, },
@@ -1543,7 +1547,15 @@
"width": "宽度", "width": "宽度",
"height": "高度" "height": "高度"
}, },
"placeholder": "开始写笔记" "placeholder": "开始写笔记",
"dismiss": {
"title": "是否放弃修改?",
"message": "仍有未保存的更改,确定要丢弃吗?",
"action": {
"discard": "放弃修改",
"keepEditing": "继续编辑"
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "日历", "name": "日历",
"description": "在日历视图中显示某个相对时间段内的集成事件", "description": "在日历视图中显示某个相对时间段内的集成事件",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr 发布类型", "label": "Radarr 发布类型",
@@ -2273,7 +2288,7 @@
"label": "帖子数量限制" "label": "帖子数量限制"
}, },
"hideDescription": { "hideDescription": {
"label": "" "label": "隐藏描述"
} }
} }
}, },
@@ -2488,9 +2503,31 @@
"option": {} "option": {}
}, },
"systemResources": { "systemResources": {
"name": "", "name": "系统资源",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "CPU", "cpu": "CPU",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "防火墙接口" "label": "防火墙接口"
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {
@@ -3303,7 +3343,7 @@
}, },
"field": { "field": {
"name": { "name": {
"label": "" "label": "名称"
}, },
"interval": { "interval": {
"label": "计划时间间隔" "label": "计划时间间隔"

File diff suppressed because it is too large Load Diff

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Šířka", "width": "Šířka",
"height": "Výška" "height": "Výška"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalendář", "name": "Kalendář",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Typ vydání filmu pro Radarr", "label": "Typ vydání filmu pro Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "Emne", "label": "Emne",
"newLabel": "Nyt emne" "newLabel": "Nyt emne"
}, },
"url": {
"label": "Url",
"newLabel": "Ny Url"
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "API-nøgle (Key)", "label": "API-nøgle (Key)",
"newLabel": "Ny API-nøgle (Key)" "newLabel": "Ny API-nøgle (Key)"
@@ -954,16 +958,16 @@
"newLabel": "Ny API-nøgle (Key)" "newLabel": "Ny API-nøgle (Key)"
}, },
"githubAppId": { "githubAppId": {
"label": "", "label": "App Id",
"newLabel": "" "newLabel": "Nyt App Id"
}, },
"githubInstallationId": { "githubInstallationId": {
"label": "", "label": "Installations Id",
"newLabel": "" "newLabel": "Nyt Installations Id"
}, },
"privateKey": { "privateKey": {
"label": "", "label": "Privat nøgle",
"newLabel": "" "newLabel": "Ny privat nøgle"
} }
} }
}, },
@@ -1543,7 +1547,15 @@
"width": "Bredde", "width": "Bredde",
"height": "Højde" "height": "Højde"
}, },
"placeholder": "Begynd at skrive dine noter" "placeholder": "Begynd at skrive dine noter",
"dismiss": {
"title": "Annuller ændringer?",
"message": "Du har ugemte ændringer i din notesbog. Er du sikker på, at du vil kassere dem?",
"action": {
"discard": "Fortryd ændringer",
"keepEditing": "Fortsæt redigering"
}
}
}, },
"iframe": { "iframe": {
"name": "indlejret dokument (iframe)", "name": "indlejret dokument (iframe)",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalender", "name": "Kalender",
"description": "Vis begivenheder fra dine integrationer i en kalendervisning inden for en vis relativ tidsperiode", "description": "Vis begivenheder fra dine integrationer i en kalendervisning inden for en vis relativ tidsperiode",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr udgivelsestype", "label": "Radarr udgivelsestype",
@@ -2273,7 +2288,7 @@
"label": "Grænse for antal indlæg" "label": "Grænse for antal indlæg"
}, },
"hideDescription": { "hideDescription": {
"label": "" "label": "Skjul beskrivelse"
} }
} }
}, },
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "Systemressourcer", "name": "Systemressourcer",
"description": "CPU, Hukommelse, Disk og andet hardwareforbrug af dit system", "description": "CPU, Hukommelse, Disk og andet hardwareforbrug af dit system",
"option": {}, "option": {
"hasShadow": {
"label": "Aktiver diagramskygge"
},
"visibleCharts": {
"label": "Synlige diagrammer",
"description": "Vælg de diagrammer, du ønsker at være synlige.",
"option": {
"cpu": "CPU",
"memory": "Hukommelse",
"network": "Netværk"
}
},
"labelDisplayMode": {
"label": "Label visningstilstand",
"option": {
"textWithIcon": "Vis tekst med ikon",
"text": "Vis kun tekst",
"icon": "Vis kun ikonet",
"hidden": "Skjul etiket"
}
}
},
"card": { "card": {
"cpu": "CPU", "cpu": "CPU",
"memory": "MEM", "memory": "MEM",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "Firewall Grænseflader" "label": "Firewall Grænseflader"
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Breite", "width": "Breite",
"height": "Höhe" "height": "Höhe"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalender", "name": "Kalender",
"description": "Zeigt Ereignisse aus Ihren Integrationen in einer Kalenderansicht innerhalb eines bestimmten Zeitraums an", "description": "Zeigt Ereignisse aus Ihren Integrationen in einer Kalenderansicht innerhalb eines bestimmten Zeitraums an",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr Veröffentlichungs Typ", "label": "Radarr Veröffentlichungs Typ",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "Thema", "label": "Thema",
"newLabel": "Neues Thema erstellen" "newLabel": "Neues Thema erstellen"
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Breite", "width": "Breite",
"height": "Höhe" "height": "Höhe"
}, },
"placeholder": "Mit dem Schreiben von Notizen beginnen" "placeholder": "Mit dem Schreiben von Notizen beginnen",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalender", "name": "Kalender",
"description": "Zeigt Ereignisse aus Ihren Integrationen in einer Kalenderansicht innerhalb eines bestimmten Zeitraums an", "description": "Zeigt Ereignisse aus Ihren Integrationen in einer Kalenderansicht innerhalb eines bestimmten Zeitraums an",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr Veröffentlichungs Typ", "label": "Radarr Veröffentlichungs Typ",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "Systemressourcen", "name": "Systemressourcen",
"description": "CPU, Arbeitsspeicher, Festplatte und andere Hardware-Nutzung Ihres Systems", "description": "CPU, Arbeitsspeicher, Festplatte und andere Hardware-Nutzung Ihres Systems",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "CPU", "cpu": "CPU",
"memory": "Arbeitsspeicher", "memory": "Arbeitsspeicher",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "Firewall Schnittstellen" "label": "Firewall Schnittstellen"
},
"weather": {
"label": "Wetter"
} }
}, },
"interval": { "interval": {
@@ -3303,24 +3343,24 @@
}, },
"field": { "field": {
"name": { "name": {
"label": "" "label": "Name"
}, },
"interval": { "interval": {
"label": "Intervall des Zeitplans" "label": "Intervall des Zeitplans"
}, },
"lastExecution": { "lastExecution": {
"label": "" "label": "Letzte Ausführung"
}, },
"actions": { "actions": {
"label": "" "label": "Aktionen"
} }
}, },
"table": { "table": {
"search": "" "search": "{count} Aufgaben suchen..."
}, },
"action": { "action": {
"refresh": { "refresh": {
"label": "" "label": "Neu laden"
} }
}, },
"refresh": { "refresh": {
@@ -3861,7 +3901,7 @@
"tools": { "tools": {
"label": "Werkzeuge", "label": "Werkzeuge",
"tasks": { "tasks": {
"label": "" "label": "Aufgaben"
}, },
"docker": { "docker": {
"label": "Docker" "label": "Docker"

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Πλάτος", "width": "Πλάτος",
"height": "Ύψος" "height": "Ύψος"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iframe", "name": "iframe",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Ημερολόγιο", "name": "Ημερολόγιο",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Τύπος κυκλοφορίας Radarr", "label": "Τύπος κυκλοφορίας Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "", "width": "",
"height": "" "height": ""
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "", "name": "",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "", "label": "",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -1980,7 +1980,25 @@
"currentlyPlaying": "Currently playing", "currentlyPlaying": "Currently playing",
"user": "User", "user": "User",
"name": "Name", "name": "Name",
"id": "Id" "id": "Id",
"metadata": {
"title": "Stats for nerds",
"video": {
"title": "Video",
"resolution": "Resolution"
},
"audio": {
"title": "Audio",
"channelCount": "Audio channels",
"codec": "Audio codec"
},
"transcoding": {
"title": "Transcoding",
"container": "Container",
"resolution": "Resolution",
"target": "Target codec"
}
}
} }
}, },
"downloads": { "downloads": {
@@ -3446,6 +3464,21 @@
"libraries": { "libraries": {
"title": "Libraries", "title": "Libraries",
"subtitle": "{count} used in the Code of Homarr" "subtitle": "{count} used in the Code of Homarr"
},
"hotkeys": {
"title": "Hotkeys",
"subtitle": "Keyboard shortcuts to enhance your workflow",
"field": {
"shortcut": "Shortcut",
"action": "Action"
},
"action": {
"toggleBoardEdit": "Toggle board edit mode",
"toggleColorScheme": "Toggle light/dark mode",
"saveNotebook": "Save notebook (only inside notebook widget)",
"openSpotlight": "Open search"
},
"note": "Tip: Mod refers to both Ctrl key and ⌘ key on macOS"
} }
} }
} }

View File

@@ -945,6 +945,10 @@
"label": "Tema", "label": "Tema",
"newLabel": "Nuevo tema" "newLabel": "Nuevo tema"
}, },
"url": {
"label": "URL",
"newLabel": "Nueva URL"
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "Clave API (Clave)", "label": "Clave API (Clave)",
"newLabel": "Nueva clave API (Clave)" "newLabel": "Nueva clave API (Clave)"
@@ -1543,7 +1547,15 @@
"width": "Ancho", "width": "Ancho",
"height": "Alto" "height": "Alto"
}, },
"placeholder": "Comienza a escribir tus notas" "placeholder": "Comienza a escribir tus notas",
"dismiss": {
"title": "¿Descartar los cambios?",
"message": "Tienes cambios sin guardar en tu bloc de notas. ¿Estás seguro de que quieres descartarlos?",
"action": {
"discard": "Descartar cambios",
"keepEditing": "Seguir editando"
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Calendario", "name": "Calendario",
"description": "Mostrar los eventos de tus integraciones en una vista de calendario dentro de un cierto período de tiempo", "description": "Mostrar los eventos de tus integraciones en una vista de calendario dentro de un cierto período de tiempo",
"duration": {
"allDay": "Todo el día"
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Tipo de lanzamiento de Radarr", "label": "Tipo de lanzamiento de Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "Recursos del sistema", "name": "Recursos del sistema",
"description": "CPU, Memoria, Disco y otro uso de hardware de su sistema", "description": "CPU, Memoria, Disco y otro uso de hardware de su sistema",
"option": {}, "option": {
"hasShadow": {
"label": "Activar sombreado de gráfico"
},
"visibleCharts": {
"label": "Gráficos visibles",
"description": "Selecciona los gráficos que quieres que sean visibles.",
"option": {
"cpu": "CPU",
"memory": "Memoria",
"network": "Red"
}
},
"labelDisplayMode": {
"label": "Modo de visualización de etiqueta",
"option": {
"textWithIcon": "Mostrar texto con icono",
"text": "Mostrar solo el texto",
"icon": "Mostrar solo el icono",
"hidden": "Ocultar etiqueta"
}
}
},
"card": { "card": {
"cpu": "CPU", "cpu": "CPU",
"memory": "MEM", "memory": "MEM",
@@ -2925,7 +2962,7 @@
"boards": "Tableros", "boards": "Tableros",
"resources": "Recursos", "resources": "Recursos",
"authentication": "Autenticación", "authentication": "Autenticación",
"authorization": "Autorización" "authorization": "Autenticación"
} }
}, },
"board": { "board": {
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "Interfaces del Firewall" "label": "Interfaces del Firewall"
},
"weather": {
"label": "Tiempo"
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "", "width": "",
"height": "" "height": ""
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "", "name": "",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "", "label": "",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "Sujet", "label": "Sujet",
"newLabel": "Nouveau sujet" "newLabel": "Nouveau sujet"
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Largeur", "width": "Largeur",
"height": "Hauteur" "height": "Hauteur"
}, },
"placeholder": "Commencer à écrire vos notes" "placeholder": "Commencer à écrire vos notes",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Calendrier", "name": "Calendrier",
"description": "Afficher les événements de vos intégrations dans une vue calendrier pendant une certaine période de temps relative", "description": "Afficher les événements de vos intégrations dans une vue calendrier pendant une certaine période de temps relative",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Type de sortie Radarr", "label": "Type de sortie Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -938,32 +938,36 @@
"newLabel": "תחום חדש" "newLabel": "תחום חדש"
}, },
"personalAccessToken": { "personalAccessToken": {
"label": "", "label": "טוקן גישה אישי",
"newLabel": "" "newLabel": "טוקן גישה אישי חדש"
}, },
"topic": { "topic": {
"label": "נושא", "label": "נושא",
"newLabel": "נושא חדש" "newLabel": "נושא חדש"
}, },
"opnsenseApiKey": { "url": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"opnsenseApiKey": {
"label": "מפתח API (מפתח)",
"newLabel": "מפתח API חדש (מפתח)"
},
"opnsenseApiSecret": { "opnsenseApiSecret": {
"label": "", "label": "מפתח API (סודי)",
"newLabel": "" "newLabel": "מפתח API חדש (סודי)"
}, },
"githubAppId": { "githubAppId": {
"label": "", "label": "מזהה אפליקציה",
"newLabel": "" "newLabel": "מזהה אפליקציה חדש"
}, },
"githubInstallationId": { "githubInstallationId": {
"label": "", "label": "מזהה התקנה",
"newLabel": "" "newLabel": "מזהה התקנה חדש"
}, },
"privateKey": { "privateKey": {
"label": "", "label": "מפתח פרטי",
"newLabel": "" "newLabel": "מפתח פרטי חדש"
} }
} }
}, },
@@ -1015,7 +1019,7 @@
} }
}, },
"common": { "common": {
"success": "", "success": "הצלחה",
"beta": "בטא", "beta": "בטא",
"error": "שגיאה", "error": "שגיאה",
"action": { "action": {
@@ -1282,21 +1286,21 @@
"label": "אפשר בדיקת מצב" "label": "אפשר בדיקת מצב"
}, },
"layout": { "layout": {
"label": "", "label": "פריסה",
"option": { "option": {
"row": "", "row": "אופקי",
"row-reverse": "", "row-reverse": "אופקי (היפוך)",
"column": "", "column": "אנכי",
"column-reverse": "" "column-reverse": "אנכי (היפוך)"
} }
}, },
"descriptionDisplayMode": { "descriptionDisplayMode": {
"label": "", "label": "מצב תצוגת תיאור",
"description": "", "description": "בחר כיצד להציג את תיאור האפליקציה",
"option": { "option": {
"normal": "", "normal": "בתוך הווידג'ט",
"tooltip": "", "tooltip": "כתיאור כלים",
"hidden": "" "hidden": "מוסתר"
} }
} }
}, },
@@ -1543,7 +1547,15 @@
"width": "רוחב", "width": "רוחב",
"height": "גובה" "height": "גובה"
}, },
"placeholder": "התחל לכתוב את ההערות שלך" "placeholder": "התחל לכתוב את ההערות שלך",
"dismiss": {
"title": "לבטל שינויים?",
"message": "יש לך שינויים שלא נשמרו במחברת שלך. האם אתה בטוח שברצונך למחוק אותם?",
"action": {
"discard": "בטל שינויים",
"keepEditing": "המשך לערוך"
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "לוח שנה", "name": "לוח שנה",
"description": "הצג אירועים מהאינטגרציות שלך בתצוגת לוח שנה בתוך פרק זמן יחסי מסוים", "description": "הצג אירועים מהאינטגרציות שלך בתצוגת לוח שנה בתוך פרק זמן יחסי מסוים",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "סוג שחרור של Radarr", "label": "סוג שחרור של Radarr",
@@ -2116,32 +2131,32 @@
"globalRatio": "יחס גלובלי" "globalRatio": "יחס גלובלי"
}, },
"mediaReleases": { "mediaReleases": {
"name": "", "name": "מדיה משוחררת",
"description": "", "description": "הצגת מדיה שנוספה לאחרונה או מהדורות עתידיות מאינטגרציות שונות",
"option": { "option": {
"layout": { "layout": {
"label": "", "label": "פריסה",
"option": { "option": {
"backdrop": { "backdrop": {
"label": "" "label": "רקע"
}, },
"poster": { "poster": {
"label": "" "label": "פוסטר"
} }
} }
}, },
"showDescriptionTooltip": { "showDescriptionTooltip": {
"label": "" "label": "הצג תיאור קצר"
}, },
"showType": { "showType": {
"label": "" "label": "הצג תג סוג מדיה"
}, },
"showSource": { "showSource": {
"label": "" "label": "הצג שילוב מקורות"
} }
}, },
"length": { "length": {
"duration": "" "duration": "דקות {length}"
} }
}, },
"mediaRequests-requestList": { "mediaRequests-requestList": {
@@ -2273,7 +2288,7 @@
"label": "הגבלת כמות הודעות" "label": "הגבלת כמות הודעות"
}, },
"hideDescription": { "hideDescription": {
"label": "" "label": "הסתר תיאור"
} }
} }
}, },
@@ -2297,7 +2312,7 @@
"label": "הצג פרטים" "label": "הצג פרטים"
}, },
"showOnlyIcon": { "showOnlyIcon": {
"label": "" "label": "הצג רק אייקון"
}, },
"topReleases": { "topReleases": {
"label": "מהדורות מובילות", "label": "מהדורות מובילות",
@@ -2316,8 +2331,8 @@
"listAlreadyImportedImages": "רשימת התמונות שכבר יובאו", "listAlreadyImportedImages": "רשימת התמונות שכבר יובאו",
"allImagesAlreadyImported": "כל התמונות כבר יובאו", "allImagesAlreadyImported": "כל התמונות כבר יובאו",
"onlyAdminCanImport": "רק מנהלים יכולים לייבא מדוקר", "onlyAdminCanImport": "רק מנהלים יכולים לייבא מדוקר",
"selectAll": "", "selectAll": "בחר הכל",
"deselectAll": "" "deselectAll": "בטל בחירה של הכל"
}, },
"provider": { "provider": {
"label": "ספק" "label": "ספק"
@@ -2367,8 +2382,8 @@
}, },
"invalid": "הגדרת מאגר לא חוקית, אנא בדוק את הערכים", "invalid": "הגדרת מאגר לא חוקית, אנא בדוק את הערכים",
"noProvider": { "noProvider": {
"label": "", "label": "ללא ספק",
"tooltip": "" "tooltip": "לא ניתן היה לנתח את הספק, אנא הגדר אותו ידנית לאחר ייבוא ​​התמונות"
} }
} }
}, },
@@ -2379,20 +2394,20 @@
"starsCount": "כוכבים", "starsCount": "כוכבים",
"forksCount": "פיצולים", "forksCount": "פיצולים",
"issuesCount": "תקלות פתוחות", "issuesCount": "תקלות פתוחות",
"markViewed": "", "markViewed": "סמן כנצפה",
"openProjectPage": "פתח את דף הפרויקט", "openProjectPage": "פתח את דף הפרויקט",
"openReleasePage": "פתח את דף הגרסאות", "openReleasePage": "פתח את דף הגרסאות",
"releaseDescription": "תיאור הגרסה", "releaseDescription": "תיאור הגרסה",
"projectDescription": "", "projectDescription": "תיאור הפרויקט",
"created": "נוצר", "created": "נוצר",
"error": { "error": {
"label": "שגיאה", "label": "שגיאה",
"messages": { "messages": {
"invalidIdentifier": "", "invalidIdentifier": "מזהה לא חוקי",
"noMatchingVersion": "לא נמצאה גרסה תואמת", "noMatchingVersion": "לא נמצאה גרסה תואמת",
"noReleasesFound": "", "noReleasesFound": "לא נמצאו שיחרורים",
"noProviderSeleceted": "", "noProviderSeleceted": "לא נבחר ספק",
"noProviderResponse": "" "noProviderResponse": "אין תשובה מהספק"
} }
} }
}, },
@@ -2453,31 +2468,31 @@
} }
}, },
"firewall": { "firewall": {
"name": "", "name": "ניטור חומת אש",
"description": "", "description": "מציג סיכום של חומות אש",
"tab": { "tab": {
"system": "", "system": "מערכת",
"interfaces": "" "interfaces": "ממשקים"
}, },
"error": { "error": {
"internalServerError": "" "internalServerError": "לא ניתן לקבל נתונים מחומת האש"
}, },
"option": { "option": {
"interfaces": "" "interfaces": "ממשקי רשת לתצוגה"
}, },
"widget": { "widget": {
"fwname": "", "fwname": "שם",
"version": "", "version": "גרסה",
"versiontitle": "", "versiontitle": "גרסאות",
"cputitle": "", "cputitle": "ניצול מעבד",
"memorytitle": "", "memorytitle": "ניצול זיכרון",
"cpu": "", "cpu": "מעבד",
"memory": "", "memory": "זיכרון",
"interfaces": { "interfaces": {
"name": "", "name": "שם",
"trans": "", "trans": "משודר",
"recv": "", "recv": "התקבל",
"title": "" "title": "ממשקי רשת"
} }
} }
}, },
@@ -2488,15 +2503,37 @@
"option": {} "option": {}
}, },
"systemResources": { "systemResources": {
"name": "", "name": "משאבי מערכת",
"description": "", "description": "שימוש במעבד, זיכרון, דיסק וחומרה אחרת של המערכת שלך",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "תרשימים גלויים",
"description": "בחר את התרשימים שברצונך שיהיו גלויים.",
"option": {
"cpu": "מעבד",
"memory": "זיכרון",
"network": "רשת"
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "מעבד",
"memory": "", "memory": "זיכרון",
"network": "", "network": "רשת",
"up": "", "up": "העלאה",
"down": "" "down": "הורדה"
} }
} }
}, },
@@ -2685,7 +2722,7 @@
"label": "צבע סמל" "label": "צבע סמל"
}, },
"clearColor": { "clearColor": {
"label": "" "label": "ניקוי צבע"
}, },
"customCss": { "customCss": {
"label": "עיצוב מותאם אישית עבור הלוח הזה", "label": "עיצוב מותאם אישית עבור הלוח הזה",
@@ -3271,15 +3308,18 @@
"label": "מכולות דוקר" "label": "מכולות דוקר"
}, },
"firewallCpu": { "firewallCpu": {
"label": "" "label": "מעבד חומת האש"
}, },
"firewallMemory": { "firewallMemory": {
"label": "" "label": "זיכרון חומת אש"
}, },
"firewallVersion": { "firewallVersion": {
"label": "" "label": "גרסת חומת אש"
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "ממשקי חומת אש"
},
"weather": {
"label": "" "label": ""
} }
}, },
@@ -3291,10 +3331,10 @@
"weeklyMonday": "כל שבוע ביום שני", "weeklyMonday": "כל שבוע ביום שני",
"update": { "update": {
"success": { "success": {
"message": "" "message": "המרווח עודכן בהצלחה"
}, },
"error": { "error": {
"message": "" "message": "נכשל בעדכון מרווח"
} }
} }
}, },
@@ -3303,55 +3343,55 @@
}, },
"field": { "field": {
"name": { "name": {
"label": "" "label": "שם"
}, },
"interval": { "interval": {
"label": "מרווח זמן לתזמון" "label": "מרווח זמן לתזמון"
}, },
"lastExecution": { "lastExecution": {
"label": "" "label": "הרצה אחרונה"
}, },
"actions": { "actions": {
"label": "" "label": "פעולות"
} }
}, },
"table": { "table": {
"search": "" "search": "חפש {count} משימות..."
}, },
"action": { "action": {
"refresh": { "refresh": {
"label": "" "label": "רענן"
} }
}, },
"refresh": { "refresh": {
"success": { "success": {
"message": "" "message": "המשימות רעננו בהצלחה"
}, },
"error": { "error": {
"message": "" "message": "רענון המשימות נכשל"
} }
}, },
"trigger": { "trigger": {
"success": { "success": {
"message": "" "message": "המשימה הופעלה בהצלחה"
}, },
"error": { "error": {
"message": "" "message": "הפעלת המשימה נכשלה"
} }
}, },
"enable": { "enable": {
"success": { "success": {
"message": "" "message": "המשימה הופעלה בהצלחה"
} }
}, },
"disable": { "disable": {
"success": { "success": {
"message": "" "message": "המשימה הושבתה בהצלחה"
} }
}, },
"toggle": { "toggle": {
"error": { "error": {
"message": "" "message": "נכשל בהחלפת סטטוס המשימה"
} }
} }
}, },
@@ -3861,7 +3901,7 @@
"tools": { "tools": {
"label": "כלים", "label": "כלים",
"tasks": { "tasks": {
"label": "" "label": "משימות"
}, },
"docker": { "docker": {
"label": "דוקר" "label": "דוקר"
@@ -4391,10 +4431,10 @@
"log": { "log": {
"level": { "level": {
"option": { "option": {
"debug": "", "debug": "ניפוי באגים",
"info": "", "info": "מידע",
"warn": "", "warn": "אזהרה",
"error": "" "error": "שגיאה"
} }
} }
} }

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Širina", "width": "Širina",
"height": "Visina" "height": "Visina"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalendar", "name": "Kalendar",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Vrsta izdanja u Radarr-u", "label": "Vrsta izdanja u Radarr-u",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Szélesség", "width": "Szélesség",
"height": "Magasság" "height": "Magasság"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "Beágyazott keret (iFrame)", "name": "Beágyazott keret (iFrame)",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Naptár", "name": "Naptár",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr kiadás típusa", "label": "Radarr kiadás típusa",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

File diff suppressed because it is too large Load Diff

View File

@@ -945,6 +945,10 @@
"label": "トピック", "label": "トピック",
"newLabel": "新規トピック" "newLabel": "新規トピック"
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "API キー (キー)", "label": "API キー (キー)",
"newLabel": "新しいAPIキーキー" "newLabel": "新しいAPIキーキー"
@@ -1543,7 +1547,15 @@
"width": "幅", "width": "幅",
"height": "高さ" "height": "高さ"
}, },
"placeholder": "あなたのノートを書き始めましょう" "placeholder": "あなたのノートを書き始めましょう",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "カレンダー", "name": "カレンダー",
"description": "カレンダービューで、特定の相対的な期間内に、連携機能からのイベントを表示します", "description": "カレンダービューで、特定の相対的な期間内に、連携機能からのイベントを表示します",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr リリースタイプ", "label": "Radarr リリースタイプ",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "システムリソース", "name": "システムリソース",
"description": "CPU、メモリ、ディスクなどのシステムハードウェアの使用", "description": "CPU、メモリ、ディスクなどのシステムハードウェアの使用",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "CPU", "cpu": "CPU",
"memory": "MEM", "memory": "MEM",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "ファイアウォールのインターフェース" "label": "ファイアウォールのインターフェース"
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "너비", "width": "너비",
"height": "높이" "height": "높이"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "캘린더", "name": "캘린더",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "레이더 릴리스 유형", "label": "레이더 릴리스 유형",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Plotis", "width": "Plotis",
"height": "Aukštis" "height": "Aukštis"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalendorius", "name": "Kalendorius",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "\"Radarr\" išleidimo tipas", "label": "\"Radarr\" išleidimo tipas",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Platums", "width": "Platums",
"height": "Augstums" "height": "Augstums"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalendārs", "name": "Kalendārs",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr laiduma tips", "label": "Radarr laiduma tips",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Breedte", "width": "Breedte",
"height": "Hoogte" "height": "Hoogte"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalender", "name": "Kalender",
"description": "Gebeurtenissen van je integraties weergeven in een kalenderweergave binnen een bepaalde relatieve tijdsperiode", "description": "Gebeurtenissen van je integraties weergeven in een kalenderweergave binnen een bepaalde relatieve tijdsperiode",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr uitgavetype", "label": "Radarr uitgavetype",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Bredde", "width": "Bredde",
"height": "Høyde" "height": "Høyde"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalender", "name": "Kalender",
"description": "Vis hendelser fra integrasjonene dine i en kalendervisning innenfor en bestemt relativ tidsperiode", "description": "Vis hendelser fra integrasjonene dine i en kalendervisning innenfor en bestemt relativ tidsperiode",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr utgivelsestype", "label": "Radarr utgivelsestype",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "Temat", "label": "Temat",
"newLabel": "Nowy temat" "newLabel": "Nowy temat"
}, },
"url": {
"label": "Adres URL",
"newLabel": "Nowy adres URL"
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "Klucz API", "label": "Klucz API",
"newLabel": "Nowy klucz API" "newLabel": "Nowy klucz API"
@@ -954,16 +958,16 @@
"newLabel": "Nowy klucz API (Secret)" "newLabel": "Nowy klucz API (Secret)"
}, },
"githubAppId": { "githubAppId": {
"label": "", "label": "Identyfikator aplikacji",
"newLabel": "" "newLabel": "Nowy identyfikator aplikacji"
}, },
"githubInstallationId": { "githubInstallationId": {
"label": "", "label": "Identyfikator instalacji",
"newLabel": "" "newLabel": "Nowy identyfikator instalacji"
}, },
"privateKey": { "privateKey": {
"label": "", "label": "Klucz prywatny",
"newLabel": "" "newLabel": "Nowy klucz prywatny"
} }
} }
}, },
@@ -1543,7 +1547,15 @@
"width": "Szerokość", "width": "Szerokość",
"height": "Wysokość" "height": "Wysokość"
}, },
"placeholder": "Zacznij pisać swoje notatki" "placeholder": "Zacznij pisać swoje notatki",
"dismiss": {
"title": "Odrzucić zmiany?",
"message": "Masz niezapisane zmiany w notatniku. Czy na pewno chcesz je odrzucić?",
"action": {
"discard": "Odrzuć zmiany",
"keepEditing": "Kontynuuj edycję"
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalendarz", "name": "Kalendarz",
"description": "Wyświetlaj zdarzenia z integracji w widoku kalendarza w określonym okresie czasowym", "description": "Wyświetlaj zdarzenia z integracji w widoku kalendarza w określonym okresie czasowym",
"duration": {
"allDay": "Cały dzień"
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Rodzaj premiery w Radarr", "label": "Rodzaj premiery w Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "Zasoby systemowe", "name": "Zasoby systemowe",
"description": "Wykorzystanie CPU, pamięci, dysku i innych zasobów sprzętowych system", "description": "Wykorzystanie CPU, pamięci, dysku i innych zasobów sprzętowych system",
"option": {}, "option": {
"hasShadow": {
"label": "Włącz cieniowanie wykresu"
},
"visibleCharts": {
"label": "Widoczne wykresy",
"description": "Wybierz wykresy, które chcesz, aby były widoczne.",
"option": {
"cpu": "Procesor",
"memory": "Pamięć",
"network": "Sieć"
}
},
"labelDisplayMode": {
"label": "Tryb wyświetlania etykiet",
"option": {
"textWithIcon": "Pokaż tekst z ikoną",
"text": "Pokaż tylko tekst",
"icon": "Pokaż tylko ikonę",
"hidden": "Ukryj etykietę"
}
}
},
"card": { "card": {
"cpu": "Procesor", "cpu": "Procesor",
"memory": "Pamięć", "memory": "Pamięć",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "Interfejsy firewalla" "label": "Interfejsy firewalla"
},
"weather": {
"label": "Pogoda"
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Largura", "width": "Largura",
"height": "Altura" "height": "Altura"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Calendário", "name": "Calendário",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Tipo de libertação de Radarr", "label": "Tipo de libertação de Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Lățime", "width": "Lățime",
"height": "Înălțime" "height": "Înălțime"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "", "name": "",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Tip de evenimente ale Radarr", "label": "Tip de evenimente ale Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Ширина", "width": "Ширина",
"height": "Высота" "height": "Высота"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Календарь", "name": "Календарь",
"description": "Отображает события из ваших интеграций в календаре в определённом временном периоде", "description": "Отображает события из ваших интеграций в календаре в определённом временном периоде",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Тип релиза Radarr", "label": "Тип релиза Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Šírka", "width": "Šírka",
"height": "Výška" "height": "Výška"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalendár", "name": "Kalendár",
"description": "Zobrazte udalosti z vašich integrácií v zobrazení kalendára za určité relatívne časové obdobie", "description": "Zobrazte udalosti z vašich integrácií v zobrazení kalendára za určité relatívne časové obdobie",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Typ Radarr releasu", "label": "Typ Radarr releasu",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Širina", "width": "Širina",
"height": "Višina" "height": "Višina"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Koledar", "name": "Koledar",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Tip sprostitve Radarr", "label": "Tip sprostitve Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Bredd", "width": "Bredd",
"height": "Höjd" "height": "Höjd"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Kalender", "name": "Kalender",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr - händelse att visa i kalendern", "label": "Radarr - händelse att visa i kalendern",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "Konu", "label": "Konu",
"newLabel": "Yeni konu" "newLabel": "Yeni konu"
}, },
"url": {
"label": "Url",
"newLabel": "Yeni url"
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "API Anahtarı (Anahtar)", "label": "API Anahtarı (Anahtar)",
"newLabel": "Yeni API Anahtarı (Anahtar)" "newLabel": "Yeni API Anahtarı (Anahtar)"
@@ -1543,7 +1547,15 @@
"width": "Genişlik", "width": "Genişlik",
"height": "Yükseklik" "height": "Yükseklik"
}, },
"placeholder": "Not almaya başlayın" "placeholder": "Not almaya başlayın",
"dismiss": {
"title": "Değişikliklerden vazgeçilsin mi?",
"message": "Defterinizde kaydedilmemiş değişiklikleriniz var. Bunları silmek istediğinizden emin misiniz?",
"action": {
"discard": "Değişiklileri at",
"keepEditing": "Düzenlemeyi sürdür"
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Takvim", "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", "description": "Entegrasyonlarınızdaki etkinlikleri belirli bir göreli zaman dilimi içinde bir takvim görünümünde görüntüleyin",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr yayın türü", "label": "Radarr yayın türü",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "Sistem kaynakları", "name": "Sistem kaynakları",
"description": "Sisteminizin CPU, Bellek, Disk ve diğer donanım kullanımları", "description": "Sisteminizin CPU, Bellek, Disk ve diğer donanım kullanımları",
"option": {}, "option": {
"hasShadow": {
"label": "Grafik gölgelendirmesini etkinleştir"
},
"visibleCharts": {
"label": "Görünür grafikler",
"description": "Görünür olmasını istediğiniz grafikleri seçin.",
"option": {
"cpu": "İşlemci",
"memory": "Bellek",
"network": "Ağ"
}
},
"labelDisplayMode": {
"label": "Etiket görüntüleme modu",
"option": {
"textWithIcon": "Simge ile metni göster",
"text": "Yalnızca metni göster",
"icon": "Yalnızca simge göster",
"hidden": "Etiketi gizle"
}
}
},
"card": { "card": {
"cpu": "İşlemci", "cpu": "İşlemci",
"memory": "BELLEK", "memory": "BELLEK",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "Güvenlik Duvarı Arayüzleri" "label": "Güvenlik Duvarı Arayüzleri"
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Ширина", "width": "Ширина",
"height": "Висота" "height": "Висота"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Календар", "name": "Календар",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr - тип релізів", "label": "Radarr - тип релізів",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "Chủ đề mới" "newLabel": "Chủ đề mới"
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "Chiều rộng", "width": "Chiều rộng",
"height": "Chiều cao" "height": "Chiều cao"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "", "name": "",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "Lịch", "name": "Lịch",
"description": "", "description": "",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Loại phát hành Radarr", "label": "Loại phát hành Radarr",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -945,6 +945,10 @@
"label": "", "label": "",
"newLabel": "" "newLabel": ""
}, },
"url": {
"label": "",
"newLabel": ""
},
"opnsenseApiKey": { "opnsenseApiKey": {
"label": "", "label": "",
"newLabel": "" "newLabel": ""
@@ -1543,7 +1547,15 @@
"width": "寬度", "width": "寬度",
"height": "高度" "height": "高度"
}, },
"placeholder": "" "placeholder": "",
"dismiss": {
"title": "",
"message": "",
"action": {
"discard": "",
"keepEditing": ""
}
}
}, },
"iframe": { "iframe": {
"name": "iFrame", "name": "iFrame",
@@ -1695,6 +1707,9 @@
"calendar": { "calendar": {
"name": "日曆", "name": "日曆",
"description": "在特定的相對時間範圍內,將來自您的集成事件以日曆視圖顯示", "description": "在特定的相對時間範圍內,將來自您的集成事件以日曆視圖顯示",
"duration": {
"allDay": ""
},
"option": { "option": {
"releaseType": { "releaseType": {
"label": "Radarr 發行類型", "label": "Radarr 發行類型",
@@ -2490,7 +2505,29 @@
"systemResources": { "systemResources": {
"name": "", "name": "",
"description": "", "description": "",
"option": {}, "option": {
"hasShadow": {
"label": ""
},
"visibleCharts": {
"label": "",
"description": "",
"option": {
"cpu": "",
"memory": "",
"network": ""
}
},
"labelDisplayMode": {
"label": "",
"option": {
"textWithIcon": "",
"text": "",
"icon": "",
"hidden": ""
}
}
},
"card": { "card": {
"cpu": "", "cpu": "",
"memory": "", "memory": "",
@@ -3281,6 +3318,9 @@
}, },
"firewallInterfaces": { "firewallInterfaces": {
"label": "" "label": ""
},
"weather": {
"label": ""
} }
}, },
"interval": { "interval": {

View File

@@ -30,12 +30,12 @@
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"@mantine/dates": "^8.3.1", "@mantine/dates": "^8.3.2",
"@mantine/hooks": "^8.3.1", "@mantine/hooks": "^8.3.2",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "15.5.3", "next": "15.5.4",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"svgson": "^5.3.1" "svgson": "^5.3.1"

View File

@@ -14,3 +14,4 @@ export { IntegrationAvatar } from "./integration-avatar";
export { BetaBadge } from "./beta-badge"; export { BetaBadge } from "./beta-badge";
export { MaskedImage } from "./masked-image"; export { MaskedImage } from "./masked-image";
export { MaskedOrNormalImage } from "./masked-or-normal-image"; export { MaskedOrNormalImage } from "./masked-or-normal-image";
export { LanguageIcon } from "./language-icon";

View File

@@ -0,0 +1,11 @@
import { Image } from "@mantine/core";
import type { LanguageIconDefinition } from "@homarr/translation";
export const LanguageIcon = ({ icon }: { icon: LanguageIconDefinition }) => {
if (icon.type === "flag") {
return <span className={`fi fi-${icon.flag}`} style={{ borderRadius: 4 }}></span>;
}
return <Image src={icon.url} style={{ width: "1.3333em", height: "1.3333em" }} fit="contain" alt="Language icon" />;
};

View File

@@ -1,3 +1,4 @@
import z from "zod";
import { zfd } from "zod-form-data"; import { zfd } from "zod-form-data";
import { createCustomErrorParams } from "./form/i18n"; import { createCustomErrorParams } from "./form/i18n";
@@ -5,30 +6,34 @@ import { createCustomErrorParams } from "./form/i18n";
export const supportedMediaUploadFormats = ["image/png", "image/jpeg", "image/webp", "image/gif", "image/svg+xml"]; export const supportedMediaUploadFormats = ["image/png", "image/jpeg", "image/webp", "image/gif", "image/svg+xml"];
export const mediaUploadSchema = zfd.formData({ export const mediaUploadSchema = zfd.formData({
file: zfd.file().check((context) => { files: zfd.repeatable(
if (!supportedMediaUploadFormats.includes(context.value.type)) { z.array(
context.issues.push({ zfd.file().check((context) => {
code: "custom", if (!supportedMediaUploadFormats.includes(context.value.type)) {
params: createCustomErrorParams({ context.issues.push({
key: "invalidFileType", code: "custom",
params: { expected: `one of ${supportedMediaUploadFormats.join(", ")}` }, params: createCustomErrorParams({
}), key: "invalidFileType",
input: context.value.type, params: { expected: `one of ${supportedMediaUploadFormats.join(", ")}` },
}); }),
return; input: context.value.type,
} });
return;
}
if (context.value.size > 1024 * 1024 * 32) { if (context.value.size > 1024 * 1024 * 32) {
// Don't forget to update the limit in nginx.conf (client_max_body_size) // Don't forget to update the limit in nginx.conf (client_max_body_size)
context.issues.push({ context.issues.push({
code: "custom", code: "custom",
params: createCustomErrorParams({ params: createCustomErrorParams({
key: "fileTooLarge", key: "fileTooLarge",
params: { maxSize: "32 MB" }, params: { maxSize: "32 MB" },
}), }),
input: context.value.size, input: context.value.size,
}); });
return; return;
} }
}), }),
),
),
}); });

View File

@@ -48,31 +48,31 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/charts": "^8.3.1", "@mantine/charts": "^8.3.2",
"@mantine/core": "^8.3.1", "@mantine/core": "^8.3.2",
"@mantine/hooks": "^8.3.1", "@mantine/hooks": "^8.3.2",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"@tiptap/extension-color": "2.26.1", "@tiptap/extension-color": "2.26.2",
"@tiptap/extension-highlight": "2.26.1", "@tiptap/extension-highlight": "2.26.2",
"@tiptap/extension-image": "2.26.1", "@tiptap/extension-image": "2.26.2",
"@tiptap/extension-link": "^2.26.1", "@tiptap/extension-link": "^2.26.2",
"@tiptap/extension-placeholder": "^2.26.1", "@tiptap/extension-placeholder": "^2.26.2",
"@tiptap/extension-table": "2.26.1", "@tiptap/extension-table": "2.26.2",
"@tiptap/extension-table-cell": "2.26.1", "@tiptap/extension-table-cell": "2.26.2",
"@tiptap/extension-table-header": "2.26.1", "@tiptap/extension-table-header": "2.26.2",
"@tiptap/extension-table-row": "2.26.1", "@tiptap/extension-table-row": "2.26.2",
"@tiptap/extension-task-item": "2.26.1", "@tiptap/extension-task-item": "2.26.2",
"@tiptap/extension-task-list": "2.26.1", "@tiptap/extension-task-list": "2.26.2",
"@tiptap/extension-text-align": "2.26.1", "@tiptap/extension-text-align": "2.26.2",
"@tiptap/extension-text-style": "2.26.1", "@tiptap/extension-text-style": "2.26.2",
"@tiptap/extension-underline": "2.26.1", "@tiptap/extension-underline": "2.26.2",
"@tiptap/react": "^2.26.1", "@tiptap/react": "^2.26.2",
"@tiptap/starter-kit": "^2.26.1", "@tiptap/starter-kit": "^2.26.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"mantine-form-zod-resolver": "^1.3.0", "mantine-form-zod-resolver": "^1.3.0",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "15.5.3", "next": "15.5.4",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"react-markdown": "^10.1.0", "react-markdown": "^10.1.0",

View File

@@ -1,13 +1,14 @@
"use client"; "use client";
import type { ReactNode } from "react"; import type { ReactNode } from "react";
import { useMemo } from "react"; import { Fragment, useMemo } from "react";
import { Avatar, Flex, Group, Stack, Text, Title } from "@mantine/core"; import { Avatar, Divider, Flex, Group, Stack, Text, Title } from "@mantine/core";
import { IconDeviceTv, IconHeadphones, IconMovie, IconVideo } from "@tabler/icons-react"; import { IconDeviceTv, IconHeadphones, IconMovie, IconVideo } from "@tabler/icons-react";
import type { MRT_ColumnDef } from "mantine-react-table"; import type { MRT_ColumnDef } from "mantine-react-table";
import { MantineReactTable } from "mantine-react-table"; import { MantineReactTable } from "mantine-react-table";
import { clientApi } from "@homarr/api/client"; import { clientApi } from "@homarr/api/client";
import { objectEntries } from "@homarr/common";
import { getIconUrl, integrationDefs } from "@homarr/definitions"; import { getIconUrl, integrationDefs } from "@homarr/definitions";
import type { StreamSession } from "@homarr/integrations"; import type { StreamSession } from "@homarr/integrations";
import { createModal, useModalAction } from "@homarr/modals"; import { createModal, useModalAction } from "@homarr/modals";
@@ -123,7 +124,7 @@ export default function MediaServerWidget({
[currentStreams], [currentStreams],
); );
const { openModal } = useModalAction(itemInfoModal); const { openModal } = useModalAction(ItemInfoModal);
const table = useTranslatedMantineReactTable({ const table = useTranslatedMantineReactTable({
columns, columns,
data: flatSessions, data: flatSessions,
@@ -219,10 +220,16 @@ export default function MediaServerWidget({
); );
} }
const itemInfoModal = createModal<{ item: StreamSession }>(({ innerProps }) => { const ItemInfoModal = createModal<{ item: StreamSession }>(({ innerProps }) => {
const t = useScopedI18n("widget.mediaServer.items"); const t = useScopedI18n("widget.mediaServer.items");
const Icon = innerProps.item.currentlyPlaying ? mediaTypeIconMap[innerProps.item.currentlyPlaying.type] : null; const Icon = innerProps.item.currentlyPlaying ? mediaTypeIconMap[innerProps.item.currentlyPlaying.type] : null;
const metadata = useMemo(() => {
return innerProps.item.currentlyPlaying?.metadata
? constructMetadata(innerProps.item.currentlyPlaying.metadata)
: null;
}, [innerProps.item.currentlyPlaying?.metadata]);
return ( return (
<Stack align="center"> <Stack align="center">
<Flex direction="column" gap="xs" align="center"> <Flex direction="column" gap="xs" align="center">
@@ -255,6 +262,32 @@ const itemInfoModal = createModal<{ item: StreamSession }>(({ innerProps }) => {
/> />
<NormalizedLine itemKey={t("name")} value={<Text>{innerProps.item.sessionName}</Text>} /> <NormalizedLine itemKey={t("name")} value={<Text>{innerProps.item.sessionName}</Text>} />
<NormalizedLine itemKey={t("id")} value={<Text>{innerProps.item.sessionId}</Text>} /> <NormalizedLine itemKey={t("id")} value={<Text>{innerProps.item.sessionId}</Text>} />
{metadata ? (
<Stack w="100%" gap={0}>
<Divider label={t("metadata.title")} labelPosition="center" mt="lg" mb="sm" />
<Group align="flex-start">
{objectEntries(metadata).map(([key, value], index) => (
<Fragment key={key}>
{index !== 0 && <Divider key={index} orientation="vertical" />}
<Stack gap={4}>
<Text fw="bold">{t(`metadata.${key}.title`)}</Text>
{Object.entries(value)
.filter(([_, value]) => Boolean(value))
.map(([innerKey, value]) => (
<Group justify="space-between" w="100%" key={innerKey} wrap="nowrap">
<Text>{t(`metadata.${key}.${innerKey}` as never)}</Text>
<Text>{value}</Text>
</Group>
))}
</Stack>
</Fragment>
))}
</Group>
</Stack>
) : null}
</Stack> </Stack>
); );
}).withOptions({ }).withOptions({
@@ -280,3 +313,23 @@ const mediaTypeIconMap = {
video: IconVideo, video: IconVideo,
audio: IconHeadphones, audio: IconHeadphones,
} satisfies Record<Exclude<StreamSession["currentlyPlaying"], null>["type"], TablerIcon>; } satisfies Record<Exclude<StreamSession["currentlyPlaying"], null>["type"], TablerIcon>;
const constructMetadata = (metadata: Exclude<Exclude<StreamSession["currentlyPlaying"], null>["metadata"], null>) => ({
video: {
resolution: metadata.video.resolution
? `${metadata.video.resolution.width}x${metadata.video.resolution.height}`
: null,
frameRate: metadata.video.frameRate,
},
audio: {
channelCount: metadata.audio.channelCount,
codec: metadata.audio.codec,
},
transcoding: {
container: metadata.transcoding.container,
resolution: metadata.transcoding.resolution
? `${metadata.transcoding.resolution.width}x${metadata.transcoding.resolution.height}`
: null,
target: `${metadata.transcoding.target.videoCodec} ${metadata.transcoding.target.audioCodec}`.trim(),
},
});

View File

@@ -30,18 +30,23 @@ export default function MediaTranscodingWidget({
}: WidgetComponentProps<"mediaTranscoding">) { }: WidgetComponentProps<"mediaTranscoding">) {
const [queuePage, setQueuePage] = useState(1); const [queuePage, setQueuePage] = useState(1);
const queuePageSize = 10; const queuePageSize = 10;
const [transcodingData] = clientApi.widget.mediaTranscoding.getDataAsync.useSuspenseQuery( const input = {
{ integrationId: integrationIds[0] ?? "",
integrationId: integrationIds[0] ?? "", pageSize: queuePageSize,
pageSize: queuePageSize, page: queuePage,
page: queuePage, };
const [transcodingData] = clientApi.widget.mediaTranscoding.getDataAsync.useSuspenseQuery(input, {
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
});
const utils = clientApi.useUtils();
clientApi.widget.mediaTranscoding.subscribeData.useSubscription(input, {
onData(data) {
utils.widget.mediaTranscoding.getDataAsync.setData(input, data);
}, },
{ });
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
},
);
const [view, setView] = useState<View>(options.defaultView); const [view, setView] = useState<View>(options.defaultView);
const totalQueuePages = Math.ceil((transcodingData.data.queue.totalCount || 1) / queuePageSize); const totalQueuePages = Math.ceil((transcodingData.data.queue.totalCount || 1) / queuePageSize);

View File

@@ -72,6 +72,7 @@ import "./notebook.css";
import { useSession } from "@homarr/auth/client"; import { useSession } from "@homarr/auth/client";
import { constructBoardPermissions } from "@homarr/auth/shared"; import { constructBoardPermissions } from "@homarr/auth/shared";
import { useRequiredBoard } from "@homarr/boards/context"; import { useRequiredBoard } from "@homarr/boards/context";
import { hotkeys } from "@homarr/definitions";
import { useConfirmModal } from "@homarr/modals"; import { useConfirmModal } from "@homarr/modals";
const iconProps = { const iconProps = {
@@ -266,7 +267,7 @@ export function Notebook({ options, setOptions, isEditMode, boardId, itemId }: W
p={0} p={0}
mt={0} mt={0}
h="100%" h="100%"
onKeyDown={isEditing ? getHotkeyHandler([["mod+s", handleEditToggle]]) : undefined} onKeyDown={isEditing ? getHotkeyHandler([[hotkeys.saveNotebook, handleEditToggle]]) : undefined}
editor={editor} editor={editor}
styles={(theme) => ({ styles={(theme) => ({
root: { root: {

1390
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -17,14 +17,14 @@
}, },
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@next/eslint-plugin-next": "15.5.3", "@next/eslint-plugin-next": "15.5.4",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-config-turbo": "^2.5.6", "eslint-config-turbo": "^2.5.8",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5", "eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"typescript-eslint": "^8.44.0" "typescript-eslint": "^8.44.1"
}, },
"devDependencies": { "devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",

View File

@@ -7,7 +7,7 @@ runs:
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v4
- uses: actions/setup-node@v5 - uses: actions/setup-node@v5
with: with:
node-version: 22.19.0 node-version: 22.20.0
cache: "pnpm" cache: "pnpm"
- shell: bash - shell: bash