chore(release): automatic release v1.42.0

This commit is contained in:
homarr-releases[bot]
2025-10-17 19:14:09 +00:00
committed by GitHub
76 changed files with 1640 additions and 939 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.41.0
- 1.40.0 - 1.40.0
- 1.39.0 - 1.39.0
- 1.38.0 - 1.38.0

View File

@@ -50,12 +50,12 @@
"@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.3", "@mantine/colors-generator": "^8.3.4",
"@mantine/core": "^8.3.3", "@mantine/core": "^8.3.4",
"@mantine/dropzone": "^8.3.3", "@mantine/dropzone": "^8.3.4",
"@mantine/hooks": "^8.3.3", "@mantine/hooks": "^8.3.4",
"@mantine/modals": "^8.3.3", "@mantine/modals": "^8.3.4",
"@mantine/tiptap": "^8.3.3", "@mantine/tiptap": "^8.3.4",
"@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.90.2", "@tanstack/react-query": "^5.90.2",
@@ -85,19 +85,19 @@
"react-simple-code-editor": "^0.14.1", "react-simple-code-editor": "^0.14.1",
"sass": "^1.93.2", "sass": "^1.93.2",
"superjson": "2.2.2", "superjson": "2.2.2",
"swagger-ui-react": "^5.29.3", "swagger-ui-react": "^5.29.4",
"use-deep-compare-effect": "^1.8.1", "use-deep-compare-effect": "^1.8.1",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@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/chroma-js": "3.1.1", "@types/chroma-js": "3.1.1",
"@types/node": "^22.18.8", "@types/node": "^22.18.10",
"@types/prismjs": "^1.26.5", "@types/prismjs": "^1.26.5",
"@types/react": "19.2.0", "@types/react": "19.2.2",
"@types/react-dom": "19.2.0", "@types/react-dom": "19.2.1",
"@types/swagger-ui-react": "^5.18.0", "@types/swagger-ui-react": "^5.18.0",
"concurrently": "^9.2.1", "concurrently": "^9.2.1",
"eslint": "^9.37.0", "eslint": "^9.37.0",

View File

@@ -2,6 +2,7 @@ import { Box, Grid, GridCol, Group, Image, Stack, Title } from "@mantine/core";
import { splitToNChunks } from "@homarr/common"; import { splitToNChunks } from "@homarr/common";
import { integrationDefs } from "@homarr/definitions"; import { integrationDefs } from "@homarr/definitions";
import { getScopedI18n } from "@homarr/translation/server";
import classes from "./hero-banner.module.css"; import classes from "./hero-banner.module.css";
@@ -12,19 +13,20 @@ const icons = Object.values(integrationDefs)
const countIconGroups = 3; const countIconGroups = 3;
const animationDurationInSeconds = icons.length; const animationDurationInSeconds = icons.length;
const arrayInChunks = splitToNChunks(icons, countIconGroups); const arrayInChunks = splitToNChunks(icons, countIconGroups);
const gridSpan = 12 / countIconGroups;
export const HeroBanner = () => { export const HeroBanner = async () => {
const gridSpan = 12 / countIconGroups; const t = await getScopedI18n("management.page.home");
return ( return (
<Box className={classes.bannerContainer} p={{ base: "lg", md: "3rem" }} bg="dark.6" pos="relative"> <Box className={classes.bannerContainer} p={{ base: "lg", md: "3rem" }} bg="dark.6" pos="relative">
<Stack gap={0}> <Stack gap={0}>
<Title fz={{ base: "h4", md: "h2" }} c="dimmed"> <Title fz={{ base: "h4", md: "h2" }} c="dimmed">
Welcome back to your {t("heroBanner.title")}
</Title> </Title>
<Group gap="xs" wrap="nowrap"> <Group gap="xs" wrap="nowrap">
<Image src="/logo/logo.png" w={{ base: 32, md: 40 }} h={{ base: 32, md: 40 }} /> <Image src="/logo/logo.png" w={{ base: 32, md: 40 }} h={{ base: 32, md: 40 }} />
<Title fz={{ base: "h3", md: "h1" }}>Homarr Board</Title> <Title fz={{ base: "h3", md: "h1" }}>{t("heroBanner.subtitle", { app: "Homarr" })}</Title>
</Group> </Group>
</Stack> </Stack>
<Box visibleFrom="md" className={classes.scrollContainer} w={"30%"} top={0} right={0} pos="absolute"> <Box visibleFrom="md" className={classes.scrollContainer} w={"30%"} top={0} right={0} pos="absolute">

View File

@@ -1,25 +1,16 @@
import type { Metadata } from "next";
import Link from "next/link"; import Link from "next/link";
import { Card, Group, SimpleGrid, Space, Stack, Text } from "@mantine/core"; import { Card, Group, SimpleGrid, Space, Stack, Text } from "@mantine/core";
import { IconArrowRight } from "@tabler/icons-react"; import { IconArrowRight } from "@tabler/icons-react";
import { api } from "@homarr/api/server"; import { api } from "@homarr/api/server";
import { auth } from "@homarr/auth/next";
import { isProviderEnabled } from "@homarr/auth/server";
import { getScopedI18n } from "@homarr/translation/server"; import { getScopedI18n } from "@homarr/translation/server";
import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb"; import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb";
import { createMetaTitle } from "~/metadata"; import { createMetaTitle } from "~/metadata";
import { HeroBanner } from "./_components/hero-banner"; import { HeroBanner } from "./_components/hero-banner";
interface LinkProps { export async function generateMetadata(): Promise<Metadata> {
title: string;
subtitle: string;
count: number;
href: string;
hidden?: boolean;
}
export async function generateMetadata() {
const t = await getScopedI18n("management"); const t = await getScopedI18n("management");
return { return {
@@ -29,78 +20,32 @@ export async function generateMetadata() {
export default async function ManagementPage() { export default async function ManagementPage() {
const statistics = await api.home.getStats(); const statistics = await api.home.getStats();
const session = await auth();
const t = await getScopedI18n("management.page.home"); const t = await getScopedI18n("management.page.home");
const links: LinkProps[] = [
{
count: statistics.countBoards,
href: "/manage/boards",
subtitle: t("statisticLabel.boards"),
title: t("statistic.board"),
},
{
count: statistics.countUsers,
href: "/manage/users",
subtitle: t("statisticLabel.authentication"),
title: t("statistic.user"),
hidden: !session?.user.permissions.includes("admin"),
},
{
count: statistics.countInvites,
href: "/manage/users/invites",
subtitle: t("statisticLabel.authentication"),
title: t("statistic.invite"),
hidden: !isProviderEnabled("credentials") || !session?.user.permissions.includes("admin"),
},
{
count: statistics.countIntegrations,
href: "/manage/integrations",
subtitle: t("statisticLabel.resources"),
title: t("statistic.integration"),
},
{
count: statistics.countApps,
href: "/manage/apps",
subtitle: t("statisticLabel.resources"),
title: t("statistic.app"),
hidden: !session?.user,
},
{
count: statistics.countGroups,
href: "/manage/users/groups",
subtitle: t("statisticLabel.authorization"),
title: t("statistic.group"),
hidden: !session?.user.permissions.includes("admin"),
},
];
return ( return (
<> <>
<DynamicBreadcrumb /> <DynamicBreadcrumb />
<HeroBanner /> <HeroBanner />
<Space h="md" /> <Space h="md" />
<SimpleGrid cols={{ xs: 1, sm: 2, md: 3 }}> <SimpleGrid cols={{ xs: 1, sm: 2, md: 3 }}>
{links.map( {statistics.map((statistic) => (
(link) => <Card component={Link} href={statistic.path} key={statistic.path} radius="lg">
!link.hidden && ( <Group justify="space-between" wrap="nowrap">
<Card component={Link} href={link.href} key={link.href} radius="lg"> <Group wrap="nowrap">
<Group justify="space-between" wrap="nowrap"> <Text size="2.4rem" fw="bolder">
<Group wrap="nowrap"> {statistic.count}
<Text size="2.4rem" fw="bolder"> </Text>
{link.count} <Stack gap={0}>
</Text> <Text c="red" size="xs">
<Stack gap={0}> {t(`statisticLabel.${statistic.subtitleKey}`)}
<Text c="red" size="xs"> </Text>
{link.subtitle} <Text fw="bold">{t(`statistic.${statistic.titleKey}`)}</Text>
</Text> </Stack>
<Text fw="bold">{link.title}</Text> </Group>
</Stack> <IconArrowRight />
</Group> </Group>
<IconArrowRight /> </Card>
</Group> ))}
</Card>
),
)}
</SimpleGrid> </SimpleGrid>
</> </>
); );

View File

@@ -92,38 +92,24 @@ export const UserProfileAvatarForm = ({ user }: UserProfileAvatarForm) => {
}); });
}, [mutate, user.id, openConfirmModal, tManageAvatar]); }, [mutate, user.id, openConfirmModal, tManageAvatar]);
const isCredentialsUser = user.provider === "credentials";
return ( return (
<Box pos="relative"> <Box pos="relative">
<Menu <Menu opened={opened} keepMounted onChange={toggle} position="bottom-start" withArrow>
opened={opened}
keepMounted
onChange={isCredentialsUser ? toggle : undefined}
position="bottom-start"
withArrow
>
<Menu.Target> <Menu.Target>
<UnstyledButton <UnstyledButton onClick={toggle}>
component={isCredentialsUser ? undefined : "div"}
style={{ cursor: !isCredentialsUser ? "default" : undefined }}
onClick={isCredentialsUser ? toggle : undefined}
>
<UserAvatar user={user} size={200} /> <UserAvatar user={user} size={200} />
{isCredentialsUser && ( <Button
<Button component="div"
component="div" pos="absolute"
pos="absolute" bottom={0}
bottom={0} left={0}
left={0} size="compact-md"
size="compact-md" fw="normal"
fw="normal" variant="default"
variant="default" leftSection={<IconPencil size={18} stroke={1.5} />}
leftSection={<IconPencil size={18} stroke={1.5} />} >
> {t("common.action.edit")}
{t("common.action.edit")} </Button>
</Button>
)}
</UnstyledButton> </UnstyledButton>
</Menu.Target> </Menu.Target>
<Menu.Dropdown> <Menu.Dropdown>

View File

@@ -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.8", "@types/node": "^22.18.10",
"dotenv-cli": "^10.0.0", "dotenv-cli": "^10.0.0",
"esbuild": "^0.25.10", "esbuild": "^0.25.10",
"eslint": "^9.37.0", "eslint": "^9.37.0",

View File

@@ -58,7 +58,7 @@
"vite-tsconfig-paths": "^5.1.4", "vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4" "vitest": "^3.2.4"
}, },
"packageManager": "pnpm@10.18.0", "packageManager": "pnpm@10.18.2",
"engines": { "engines": {
"node": ">=22.20.0" "node": ">=22.20.0"
}, },
@@ -82,7 +82,7 @@
"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.10", "hono@<4.6.5": ">=4.9.11",
"linkifyjs@<4.3.2": ">=4.3.2", "linkifyjs@<4.3.2": ">=4.3.2",
"nanoid@>=4.0.0 <5.0.9": ">=5.1.6", "nanoid@>=4.0.0 <5.0.9": ">=5.1.6",
"prismjs@<1.30.0": ">=1.30.0", "prismjs@<1.30.0": ">=1.30.0",

View File

@@ -40,6 +40,7 @@
"@homarr/redis": "workspace:^0.1.0", "@homarr/redis": "workspace:^0.1.0",
"@homarr/request-handler": "workspace:^0.1.0", "@homarr/request-handler": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.4.0", "@kubernetes/client-node": "^1.4.0",
"@tanstack/react-query": "^5.90.2", "@tanstack/react-query": "^5.90.2",
@@ -52,8 +53,8 @@
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"superjson": "2.2.2", "superjson": "2.2.2",
"trpc-to-openapi": "^3.0.1", "trpc-to-openapi": "^3.1.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -1,31 +1,147 @@
import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
import { isProviderEnabled } from "@homarr/auth/server"; import { isProviderEnabled } from "@homarr/auth/server";
import type { Database } from "@homarr/db"; import { db, eq, inArray, or } from "@homarr/db";
import { apps, boards, groups, integrations, invites, users } from "@homarr/db/schema"; import {
apps,
boards,
boardUserPermissions,
groupMembers,
groups,
integrations,
invites,
medias,
searchEngines,
users,
} from "@homarr/db/schema";
import type { TranslationObject } from "@homarr/translation";
import { createTRPCRouter, publicProcedure } from "../trpc"; import { createTRPCRouter, publicProcedure } from "../trpc";
interface HomeStatistic {
titleKey: keyof TranslationObject["management"]["page"]["home"]["statistic"];
subtitleKey: keyof TranslationObject["management"]["page"]["home"]["statisticLabel"];
count: number;
path: string;
}
export const homeRouter = createTRPCRouter({ export const homeRouter = createTRPCRouter({
getStats: publicProcedure.query(async ({ ctx }) => { getStats: publicProcedure.query(async ({ ctx }) => {
const isAdmin = ctx.session?.user.permissions.includes("admin") ?? false; const isAdmin = ctx.session?.user.permissions.includes("admin") ?? false;
const isCredentialsEnabled = isProviderEnabled("credentials"); const isCredentialsEnabled = isProviderEnabled("credentials");
return { const statistics: HomeStatistic[] = [];
countBoards: await getCountForTableAsync(ctx.db, boards, true),
countUsers: await getCountForTableAsync(ctx.db, users, isAdmin), const boardIds: string[] = [];
countGroups: await getCountForTableAsync(ctx.db, groups, true), if (ctx.session?.user && !ctx.session.user.permissions.includes("board-view-all")) {
countInvites: await getCountForTableAsync(ctx.db, invites, isAdmin), const permissionsOfCurrentUserWhenPresent = await ctx.db.query.boardUserPermissions.findMany({
countIntegrations: await getCountForTableAsync(ctx.db, integrations, isCredentialsEnabled && isAdmin), where: eq(boardUserPermissions.userId, ctx.session.user.id),
countApps: await getCountForTableAsync(ctx.db, apps, true), });
};
const permissionsOfCurrentUserGroupsWhenPresent = await ctx.db.query.groupMembers.findMany({
where: eq(groupMembers.userId, ctx.session.user.id),
with: {
group: {
with: {
boardPermissions: {},
},
},
},
});
boardIds.push(
...permissionsOfCurrentUserWhenPresent
.map((permission) => permission.boardId)
.concat(
permissionsOfCurrentUserGroupsWhenPresent
.map((groupMember) => groupMember.group.boardPermissions.map((permission) => permission.boardId))
.flat(),
),
);
}
statistics.push({
titleKey: "board",
subtitleKey: "boards",
count: await db.$count(
boards,
ctx.session?.user.permissions.includes("board-view-all")
? undefined
: or(
eq(boards.isPublic, true),
eq(boards.creatorId, ctx.session?.user.id ?? ""),
boardIds.length > 0 ? inArray(boards.id, boardIds) : undefined,
),
),
path: "/manage/boards",
});
if (isAdmin) {
statistics.push({
titleKey: "user",
subtitleKey: "authentication",
count: await db.$count(users),
path: "/manage/users",
});
}
if (isAdmin && isCredentialsEnabled) {
statistics.push({
titleKey: "invite",
subtitleKey: "authentication",
count: await db.$count(invites),
path: "/manage/users/invites",
});
}
if (ctx.session?.user.permissions.includes("integration-create")) {
statistics.push({
titleKey: "integration",
subtitleKey: "resources",
count: await db.$count(integrations),
path: "/manage/integrations",
});
}
if (ctx.session?.user) {
statistics.push({
titleKey: "app",
subtitleKey: "resources",
count: await db.$count(apps),
path: "/manage/apps",
});
}
if (isAdmin) {
statistics.push({
titleKey: "group",
subtitleKey: "authorization",
count: await db.$count(groups),
path: "/manage/users/groups",
});
}
if (ctx.session?.user.permissions.includes("search-engine-create")) {
statistics.push({
titleKey: "searchEngine",
subtitleKey: "resources",
count: await db.$count(searchEngines),
path: "/manage/search-engines",
});
}
if (ctx.session?.user.permissions.includes("media-upload")) {
statistics.push({
titleKey: "media",
subtitleKey: "resources",
count: await db.$count(
medias,
ctx.session.user.permissions.includes("media-view-all")
? undefined
: eq(medias.creatorId, ctx.session.user.id),
),
path: "/manage/medias",
});
}
return statistics;
}), }),
}); });
const getCountForTableAsync = async (db: Database, table: AnySQLiteTable, canView: boolean) => {
if (!canView) {
return 0;
}
return await db.$count(table);
};

View File

@@ -114,11 +114,10 @@ export const userRouter = createTRPCRouter({
.input( .input(
z.object({ z.object({
userId: z.string(), userId: z.string(),
// Max image size of 256KB, only png and jpeg are allowed
image: z image: z
.string() .string()
.regex(/^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9/+]+=*$/g) .regex(/^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9/+]+=*$/g)
.max(262144) .max(350000) // approximately 256KB in base64 (256 * 1024 * 4 / 3 + prefixes)
.nullable(), .nullable(),
}), }),
) )
@@ -147,13 +146,6 @@ export const userRouter = createTRPCRouter({
}); });
} }
if (user.provider !== "credentials") {
throw new TRPCError({
code: "FORBIDDEN",
message: "Profile image can not be changed for users with external providers",
});
}
await ctx.db await ctx.db
.update(users) .update(users)
.set({ .set({

View File

@@ -20,6 +20,7 @@ export const createSignInEventHandler = (db: Database): Exclude<NextAuthConfig["
where: eq(users.id, user.id), where: eq(users.id, user.id),
columns: { columns: {
name: true, name: true,
image: true,
colorScheme: true, colorScheme: true,
}, },
}); });
@@ -59,6 +60,15 @@ export const createSignInEventHandler = (db: Database): Exclude<NextAuthConfig["
`Username for user of oidc provider has changed. user=${user.id} old='${dbUser.name}' new='${profileUsername}'`, `Username for user of oidc provider has changed. user=${user.id} old='${dbUser.name}' new='${profileUsername}'`,
); );
} }
if (
typeof profile.picture === "string" &&
dbUser.image !== profile.picture &&
!dbUser.image?.startsWith("data:")
) {
await db.update(users).set({ image: profile.picture }).where(eq(users.id, user.id));
logger.info(`Profile picture for user of oidc provider has changed. user=${user.id}'`);
}
} }
logger.info(`User '${dbUser.name}' logged in at ${dayjs().format()}`); logger.info(`User '${dbUser.name}' logged in at ${dayjs().format()}`);

View File

@@ -23,8 +23,8 @@
}, },
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@auth/core": "^0.40.0", "@auth/core": "^0.41.0",
"@auth/drizzle-adapter": "^1.10.0", "@auth/drizzle-adapter": "^1.11.0",
"@homarr/certificates": "workspace:^0.1.0", "@homarr/certificates": "workspace:^0.1.0",
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
@@ -39,7 +39,7 @@
"next-auth": "5.0.0-beta.29", "next-auth": "5.0.0-beta.29",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -61,6 +61,7 @@ export const OidcProvider = (headers: ReadonlyHeaders | null): OIDCConfig<Profil
id: profile.sub, id: profile.sub,
name, name,
email: profile.email, email: profile.email,
image: typeof profile.picture === "string" ? profile.picture : null,
provider: "oidc", provider: "oidc",
}; };
}, },

View File

@@ -37,7 +37,7 @@
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"undici": "7.16.0", "undici": "7.16.0",
"zod": "^4.1.11", "zod": "^4.1.12",
"zod-validation-error": "^4.0.2" "zod-validation-error": "^4.0.2"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -25,8 +25,8 @@
"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.8.0", "ioredis": "5.8.1",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -35,14 +35,14 @@
"@trpc/tanstack-react-query": "^11.6.0", "@trpc/tanstack-react-query": "^11.6.0",
"node-cron": "^4.2.1", "node-cron": "^4.2.1",
"react": "19.2.0", "react": "19.2.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@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-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"@types/react": "19.2.0", "@types/react": "19.2.2",
"eslint": "^9.37.0", "eslint": "^9.37.0",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }

View File

@@ -43,13 +43,13 @@
}, },
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@auth/core": "^0.40.0", "@auth/core": "^0.41.0",
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
"@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.3", "@mantine/core": "^8.3.4",
"@paralleldrive/cuid2": "^2.2.2", "@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.7.1", "@testcontainers/mysql": "^11.7.1",
"@testcontainers/postgresql": "^11.7.1", "@testcontainers/postgresql": "^11.7.1",
@@ -58,7 +58,7 @@
"drizzle-kit": "^0.31.5", "drizzle-kit": "^0.31.5",
"drizzle-orm": "^0.44.6", "drizzle-orm": "^0.44.6",
"drizzle-zod": "^0.8.3", "drizzle-zod": "^0.8.3",
"mysql2": "3.15.1", "mysql2": "3.15.2",
"pg": "^8.16.3", "pg": "^8.16.3",
"superjson": "2.2.2" "superjson": "2.2.2"
}, },

View File

@@ -25,7 +25,7 @@
"dependencies": { "dependencies": {
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"fast-xml-parser": "^5.3.0", "fast-xml-parser": "^5.3.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -26,9 +26,9 @@
"@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.3", "@mantine/form": "^8.3.4",
"mantine-form-zod-resolver": "^1.3.0", "mantine-form-zod-resolver": "^1.3.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -29,9 +29,9 @@
"@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.3", "@mantine/core": "^8.3.4",
"react": "19.2.0", "react": "19.2.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -26,7 +26,7 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@ctrl/deluge": "^7.4.0", "@ctrl/deluge": "^7.4.0",
"@ctrl/qbittorrent": "^9.9.0", "@ctrl/qbittorrent": "^9.9.1",
"@ctrl/transmission": "^7.4.0", "@ctrl/transmission": "^7.4.0",
"@gitbeaker/rest": "^43.5.0", "@gitbeaker/rest": "^43.5.0",
"@homarr/certificates": "workspace:^0.1.0", "@homarr/certificates": "workspace:^0.1.0",
@@ -49,7 +49,7 @@
"tsdav": "^2.1.5", "tsdav": "^2.1.5",
"undici": "7.16.0", "undici": "7.16.0",
"xml2js": "^0.6.2", "xml2js": "^0.6.2",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -1,4 +1,7 @@
import type { Agent } from "https"; import type { Agent } from "https";
import dayjs from "dayjs";
import timezone from "dayjs/plugin/timezone";
import utc from "dayjs/plugin/utc";
import type { RequestInit as NodeFetchRequestInit } from "node-fetch"; import type { RequestInit as NodeFetchRequestInit } from "node-fetch";
import * as ical from "node-ical"; import * as ical from "node-ical";
import { DAVClient } from "tsdav"; import { DAVClient } from "tsdav";
@@ -14,6 +17,9 @@ import type { TestingResult } from "../base/test-connection/test-connection-serv
import type { ICalendarIntegration } from "../interfaces/calendar/calendar-integration"; import type { ICalendarIntegration } from "../interfaces/calendar/calendar-integration";
import type { CalendarEvent } from "../interfaces/calendar/calendar-types"; import type { CalendarEvent } from "../interfaces/calendar/calendar-types";
dayjs.extend(utc);
dayjs.extend(timezone);
@HandleIntegrationErrors([integrationTsdavHttpErrorHandler]) @HandleIntegrationErrors([integrationTsdavHttpErrorHandler])
export class NextcloudIntegration extends Integration implements ICalendarIntegration { export class NextcloudIntegration extends Integration implements ICalendarIntegration {
protected async testingAsync(input: IntegrationTestingInput): Promise<TestingResult> { protected async testingAsync(input: IntegrationTestingInput): Promise<TestingResult> {
@@ -41,47 +47,59 @@ export class NextcloudIntegration extends Integration implements ICalendarIntegr
) )
).flat(); ).flat();
return calendarEvents.map((event): CalendarEvent => { return calendarEvents
// @ts-expect-error the typescript definitions for this package are wrong .map((event) => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access // @ts-expect-error the typescript definitions for this package are wrong
const icalData = ical.default.parseICS(event.data) as ical.CalendarResponse; // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
const veventObject = Object.values(icalData).find((data) => data.type === "VEVENT"); const icalData = ical.default.parseICS(event.data) as ical.CalendarResponse;
const veventObject = Object.values(icalData).find((data) => data.type === "VEVENT");
if (!veventObject) { if (!veventObject) {
throw new Error(`Invalid event data object: ${JSON.stringify(event.data)}. Unable to process the calendar.`); throw new Error(`Invalid event data object: ${JSON.stringify(event.data)}. Unable to process the calendar.`);
} }
logger.debug(`Converting VEVENT event to ${event.etag} from Nextcloud: ${JSON.stringify(veventObject)}`); logger.debug(`Converting VEVENT event to ${event.etag} from Nextcloud: ${JSON.stringify(veventObject)}`);
const date = veventObject.start; const eventUrlWithoutHost = new URL(event.url).pathname;
const eventSlug = Buffer.from(eventUrlWithoutHost).toString("base64url");
const eventUrlWithoutHost = new URL(event.url).pathname; const startDates = veventObject.rrule ? veventObject.rrule.between(start, end) : [veventObject.start];
const dateInMillis = veventObject.start.valueOf();
const url = this.url( const durationMs = veventObject.end.getTime() - veventObject.start.getTime();
`/apps/calendar/timeGridWeek/now/edit/sidebar/${Buffer.from(eventUrlWithoutHost).toString("base64url")}/${dateInMillis / 1000}`,
);
return { return startDates.map((startDate) => {
title: veventObject.summary, const timezoneOffsetMinutes = veventObject.rrule?.origOptions.tzid
subTitle: null, ? dayjs(startDate).tz(veventObject.rrule.origOptions.tzid).utcOffset()
description: veventObject.description, : 0;
startDate: date, const utcStartDate = new Date(startDate.getTime() - timezoneOffsetMinutes * 60 * 1000);
endDate: veventObject.end, const endDate = new Date(utcStartDate.getTime() + durationMs);
image: null, const dateInMillis = utcStartDate.valueOf();
location: veventObject.location || null,
indicatorColor: "#ff8600", return {
links: [ title: veventObject.summary,
{ subTitle: null,
href: url.toString(), description: veventObject.description,
name: "Nextcloud", startDate: utcStartDate,
logo: "/images/apps/nextcloud.svg", endDate,
color: undefined, image: null,
isDark: true, location: veventObject.location || null,
}, indicatorColor:
], "color" in veventObject && typeof veventObject.color === "string" ? veventObject.color : "#ff8600",
}; links: [
}); {
href: this.url(
`/apps/calendar/timeGridWeek/now/edit/sidebar/${eventSlug}/${dateInMillis / 1000}`,
).toString(),
name: "Nextcloud",
logo: "/images/apps/nextcloud.svg",
color: undefined,
isDark: true,
},
],
};
});
})
.flat();
} }
private async createCalendarClientAsync(agent?: Agent) { private async createCalendarClientAsync(agent?: Agent) {

View File

@@ -142,7 +142,10 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
rating: item.rating?.toFixed(1), rating: item.rating?.toFixed(1),
tags: item.Genre?.map((genre) => genre.tag) ?? [], tags: item.Genre?.map((genre) => genre.tag) ?? [],
href: super href: super
.url(`/web/index.html#!/server/${machineIdentifier}/details?key=${encodeURIComponent(item.key)}`) .url(
// Url with children on the end results in infinite loading screen, see https://github.com/homarr-labs/homarr/issues/4078
`/web/index.html#!/server/${machineIdentifier}/details?key=${encodeURIComponent(item.key.replace("/children", ""))}`,
)
.toString(), .toString(),
length: item.duration ? Math.round(item.duration / 1000) : undefined, length: item.duration ? Math.round(item.duration / 1000) : undefined,
}; };

View File

@@ -27,7 +27,7 @@
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
"superjson": "2.2.2", "superjson": "2.2.2",
"winston": "3.18.3", "winston": "3.18.3",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -33,13 +33,13 @@
"@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.3", "@mantine/core": "^8.3.4",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"next": "15.5.4", "next": "15.5.4",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

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.3", "@mantine/core": "^8.3.4",
"@mantine/hooks": "^8.3.3", "@mantine/hooks": "^8.3.4",
"react": "19.2.0" "react": "19.2.0"
}, },
"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.3", "@mantine/notifications": "^8.3.4",
"@tabler/icons-react": "^3.35.0" "@tabler/icons-react": "^3.35.0"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -37,14 +37,14 @@
"@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.3", "@mantine/core": "^8.3.4",
"@mantine/hooks": "^8.3.3", "@mantine/hooks": "^8.3.4",
"adm-zip": "0.5.16", "adm-zip": "0.5.16",
"next": "15.5.4", "next": "15.5.4",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"superjson": "2.2.2", "superjson": "2.2.2",
"zod": "^4.1.11", "zod": "^4.1.12",
"zod-form-data": "^3.0.1" "zod-form-data": "^3.0.1"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -23,7 +23,7 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

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.8.0", "ioredis": "5.8.1",
"superjson": "2.2.2" "superjson": "2.2.2"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -33,7 +33,7 @@
"octokit": "^5.0.3", "octokit": "^5.0.3",
"superjson": "2.2.2", "superjson": "2.2.2",
"undici": "7.16.0", "undici": "7.16.0",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -47,7 +47,7 @@ async function getContainersWithStatsAsync() {
const instance = dockerInstances.find(({ host }) => host === container.instance)?.instance; const instance = dockerInstances.find(({ host }) => host === container.instance)?.instance;
if (!instance) return null; if (!instance) return null;
const stats = await instance.getContainer(container.Id).stats({ stream: false }); const stats = await instance.getContainer(container.Id).stats({ stream: false, "one-shot": true });
return { return {
id: container.Id, id: container.Id,
@@ -60,7 +60,8 @@ async function getContainersWithStatsAsync() {
return icon.name.toLowerCase().includes(extractedImage.toLowerCase()); return icon.name.toLowerCase().includes(extractedImage.toLowerCase());
})?.url ?? null, })?.url ?? null,
cpuUsage: calculateCpuUsage(stats), cpuUsage: calculateCpuUsage(stats),
memoryUsage: stats.memory_stats.usage, // memory usage by default includes cache, which should not be shown as it is also not shown with docker stats command
memoryUsage: stats.memory_stats.usage - stats.memory_stats.stats.cache,
image: container.Image, image: container.Image,
ports: container.Ports, ports: container.Ports,
}; };

View File

@@ -26,7 +26,7 @@
"@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.3", "@mantine/dates": "^8.3.4",
"next": "15.5.4", "next": "15.5.4",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0" "react-dom": "19.2.0"

View File

@@ -33,9 +33,9 @@
"@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.3", "@mantine/core": "^8.3.4",
"@mantine/hooks": "^8.3.3", "@mantine/hooks": "^8.3.4",
"@mantine/spotlight": "^8.3.3", "@mantine/spotlight": "^8.3.4",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"jotai": "^2.15.0", "jotai": "^2.15.0",
"next": "15.5.4", "next": "15.5.4",

View File

@@ -33,7 +33,7 @@
"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.4", "next": "15.5.4",
"next-intl": "4.3.9", "next-intl": "4.3.12",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0" "react-dom": "19.2.0"
}, },

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "" "label": ""
}, },
@@ -2974,13 +2986,19 @@
"invite": "", "invite": "",
"integration": "", "integration": "",
"app": "", "app": "",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "", "boards": "",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "用户组名称已存在" "groupNameTaken": "用户组名称已存在"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "标题" "label": "标题"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "边界颜色" "label": "边界颜色"
} }
@@ -1744,6 +1753,9 @@
"label": "显示当前风速", "label": "显示当前风速",
"description": "仅在当前天气时" "description": "仅在当前天气时"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "天气位置" "label": "天气位置"
}, },
@@ -2974,13 +2986,19 @@
"invite": "邀请", "invite": "邀请",
"integration": "集成", "integration": "集成",
"app": "应用", "app": "应用",
"group": "群组" "group": "群组",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "面板", "boards": "面板",
"resources": "资源", "resources": "资源",
"authentication": "认证", "authentication": "认证",
"authorization": "认证" "authorization": "认证"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "crwdns2366:0crwdne2366:0" "groupNameTaken": "crwdns2366:0crwdne2366:0"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "crwdns3764:0crwdne3764:0",
"milesPerHour": "crwdns3766:0crwdne3766:0"
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "crwdns3103:0crwdne3103:0" "label": "crwdns3103:0crwdne3103:0"
}, },
"customCssClasses": {
"label": "crwdns3776:0crwdne3776:0"
},
"borderColor": { "borderColor": {
"label": "crwdns2839:0crwdne2839:0" "label": "crwdns2839:0crwdne2839:0"
} }
@@ -1744,6 +1753,9 @@
"label": "crwdns2706:0crwdne2706:0", "label": "crwdns2706:0crwdne2706:0",
"description": "crwdns2708:0crwdne2708:0" "description": "crwdns2708:0crwdne2708:0"
}, },
"useImperialSpeed": {
"label": "crwdns3768:0crwdne3768:0"
},
"location": { "location": {
"label": "crwdns1018:0crwdne1018:0" "label": "crwdns1018:0crwdne1018:0"
}, },
@@ -1762,12 +1774,12 @@
"description": "crwdns1030:0crwdne1030:0" "description": "crwdns1030:0crwdne1030:0"
} }
}, },
"currentWindSpeed": "crwdns2710:0{currentWindSpeed}crwdne2710:0", "currentWindSpeed": "crwdns3770:0{currentWindSpeed}crwdnd3770:0{unit}crwdne3770:0",
"dailyForecast": { "dailyForecast": {
"sunrise": "crwdns2712:0crwdne2712:0", "sunrise": "crwdns2712:0crwdne2712:0",
"sunset": "crwdns2714:0crwdne2714:0", "sunset": "crwdns2714:0crwdne2714:0",
"maxWindSpeed": "crwdns2716:0{maxWindSpeed}crwdne2716:0", "maxWindSpeed": "crwdns3772:0{maxWindSpeed}crwdnd3772:0{unit}crwdne3772:0",
"maxWindGusts": "crwdns2718:0{maxWindGusts}crwdne2718:0" "maxWindGusts": "crwdns3774:0{maxWindGusts}crwdnd3774:0{unit}crwdne3774:0"
}, },
"kind": { "kind": {
"clear": "crwdns1032:0crwdne1032:0", "clear": "crwdns1032:0crwdne1032:0",
@@ -2974,13 +2986,19 @@
"invite": "crwdns1620:0crwdne1620:0", "invite": "crwdns1620:0crwdne1620:0",
"integration": "crwdns1622:0crwdne1622:0", "integration": "crwdns1622:0crwdne1622:0",
"app": "crwdns1624:0crwdne1624:0", "app": "crwdns1624:0crwdne1624:0",
"group": "crwdns1626:0crwdne1626:0" "group": "crwdns1626:0crwdne1626:0",
"searchEngine": "crwdns3778:0crwdne3778:0",
"media": "crwdns3780:0crwdne3780:0"
}, },
"statisticLabel": { "statisticLabel": {
"boards": "crwdns1628:0crwdne1628:0", "boards": "crwdns1628:0crwdne1628:0",
"resources": "crwdns1630:0crwdne1630:0", "resources": "crwdns1630:0crwdne1630:0",
"authentication": "crwdns1632:0crwdne1632:0", "authentication": "crwdns1632:0crwdne1632:0",
"authorization": "crwdns1634:0crwdne1634:0" "authorization": "crwdns1634:0crwdne1634:0"
},
"heroBanner": {
"title": "crwdns3782:0crwdne3782:0",
"subtitle": "crwdns3784:0{app}crwdne3784:0"
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Název skupiny je již používán" "groupNameTaken": "Název skupiny je již používán"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Lokalita pro počasí" "label": "Lokalita pro počasí"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Pozvánky", "invite": "Pozvánky",
"integration": "", "integration": "",
"app": "Aplikace", "app": "Aplikace",
"group": "Skupiny" "group": "Skupiny",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Plochy", "boards": "Plochy",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Gruppenavn allerede taget" "groupNameTaken": "Gruppenavn allerede taget"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Titel" "label": "Titel"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Kantfarve" "label": "Kantfarve"
} }
@@ -1708,7 +1717,7 @@
"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": { "duration": {
"allDay": "" "allDay": "Hele dagen"
}, },
"option": { "option": {
"releaseType": { "releaseType": {
@@ -1744,6 +1753,9 @@
"label": "Vis aktuel vindhastighed", "label": "Vis aktuel vindhastighed",
"description": "Kun på nuværende vejr" "description": "Kun på nuværende vejr"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Vejr lokation" "label": "Vejr lokation"
}, },
@@ -1982,21 +1994,21 @@
"name": "Navn", "name": "Navn",
"id": "Id", "id": "Id",
"metadata": { "metadata": {
"title": "", "title": "Statistik for nørder",
"video": { "video": {
"title": "", "title": "Video",
"resolution": "" "resolution": "Opløsning"
}, },
"audio": { "audio": {
"title": "", "title": "Lyd",
"channelCount": "", "channelCount": "Lyd kanaler",
"codec": "" "codec": "Lyd codec"
}, },
"transcoding": { "transcoding": {
"title": "", "title": "Transkoder",
"container": "", "container": "Container",
"resolution": "", "resolution": "Opløsning",
"target": "" "target": "Mål codec"
} }
} }
} }
@@ -2974,13 +2986,19 @@
"invite": "Invitationer", "invite": "Invitationer",
"integration": "Integrationer", "integration": "Integrationer",
"app": "Apps", "app": "Apps",
"group": "Grupper" "group": "Grupper",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Tavler", "boards": "Tavler",
"resources": "Ressourcer", "resources": "Ressourcer",
"authentication": "Autorisering", "authentication": "Autorisering",
"authorization": "Autorisation" "authorization": "Autorisation"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {
@@ -3338,7 +3356,7 @@
"label": "Firewall Grænseflader" "label": "Firewall Grænseflader"
}, },
"weather": { "weather": {
"label": "" "label": "Vejr"
} }
}, },
"interval": { "interval": {
@@ -3466,19 +3484,19 @@
"subtitle": "{count} brugt i koden for Homarr" "subtitle": "{count} brugt i koden for Homarr"
}, },
"hotkeys": { "hotkeys": {
"title": "", "title": "Genvejstaster",
"subtitle": "", "subtitle": "Tastaturgenveje til at forbedre din arbejdsgang",
"field": { "field": {
"shortcut": "", "shortcut": "Genvej",
"action": "" "action": "Handling"
}, },
"action": { "action": {
"toggleBoardEdit": "", "toggleBoardEdit": "Skift tavleredigeringstilstand",
"toggleColorScheme": "", "toggleColorScheme": "Slå lys/mørk tilstand til/fra",
"saveNotebook": "", "saveNotebook": "Gem notesbog (kun inde i notesbog widget)",
"openSpotlight": "" "openSpotlight": "Åbn søgefunktionen"
}, },
"note": "" "note": "Tip: Mod refererer til både Ctrl-tasten og -tasten på macOS"
} }
} }
} }

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Gruppenname bereits vergeben" "groupNameTaken": "Gruppenname bereits vergeben"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Rahmenfarbe" "label": "Rahmenfarbe"
} }
@@ -1744,6 +1753,9 @@
"label": "Aktuelle Windgeschwindigkeit anzeigen", "label": "Aktuelle Windgeschwindigkeit anzeigen",
"description": "Nur bei aktuellem Wetter" "description": "Nur bei aktuellem Wetter"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Wetterstandort" "label": "Wetterstandort"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Einladungen", "invite": "Einladungen",
"integration": "Integrationen", "integration": "Integrationen",
"app": "", "app": "",
"group": "Gruppen" "group": "Gruppen",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "", "boards": "",
"resources": "Ressourcen", "resources": "Ressourcen",
"authentication": "Authentifizierung", "authentication": "Authentifizierung",
"authorization": "Autorisierung" "authorization": "Autorisierung"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Gruppenname bereits vergeben" "groupNameTaken": "Gruppenname bereits vergeben"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Titel" "label": "Titel"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Rahmenfarbe" "label": "Rahmenfarbe"
} }
@@ -1744,6 +1753,9 @@
"label": "Aktuelle Windgeschwindigkeit anzeigen", "label": "Aktuelle Windgeschwindigkeit anzeigen",
"description": "Nur bei aktuellem Wetter" "description": "Nur bei aktuellem Wetter"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Wetterstandort" "label": "Wetterstandort"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Einladungen", "invite": "Einladungen",
"integration": "Integrationen", "integration": "Integrationen",
"app": "Apps", "app": "Apps",
"group": "Gruppen" "group": "Gruppen",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Boards", "boards": "Boards",
"resources": "Ressourcen", "resources": "Ressourcen",
"authentication": "Authentifizierung", "authentication": "Authentifizierung",
"authorization": "Autorisierung" "authorization": "Autorisierung"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Τοποθεσία καιρού" "label": "Τοποθεσία καιρού"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Προσκλήσεις", "invite": "Προσκλήσεις",
"integration": "", "integration": "",
"app": "Εφαρμογές", "app": "Εφαρμογές",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Πίνακες", "boards": "Πίνακες",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "An existing group already has this name" "groupNameTaken": "An existing group already has this name"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Title" "label": "Title"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Border colour" "label": "Border colour"
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "" "label": ""
}, },
@@ -2974,13 +2986,19 @@
"invite": "", "invite": "",
"integration": "", "integration": "",
"app": "", "app": "",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "", "boards": "",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -2986,13 +2986,19 @@
"invite": "Invites", "invite": "Invites",
"integration": "Integrations", "integration": "Integrations",
"app": "Apps", "app": "Apps",
"group": "Groups" "group": "Groups",
"searchEngine": "Search engines",
"media": "Medias"
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Boards", "boards": "Boards",
"resources": "Resources", "resources": "Resources",
"authentication": "Authentication", "authentication": "Authentication",
"authorization": "Authorization" "authorization": "Authorization"
},
"heroBanner": {
"title": "Welcome back to your",
"subtitle": "{app} Board"
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Nombre del grupo en uso" "groupNameTaken": "Nombre del grupo en uso"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "km/h",
"milesPerHour": "mph"
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Título" "label": "Título"
}, },
"customCssClasses": {
"label": "Clases CSS personalizadas"
},
"borderColor": { "borderColor": {
"label": "Color del borde" "label": "Color del borde"
} }
@@ -1744,6 +1753,9 @@
"label": "Mostrar velocidad del viento actual", "label": "Mostrar velocidad del viento actual",
"description": "Sólo en el tiempo actual" "description": "Sólo en el tiempo actual"
}, },
"useImperialSpeed": {
"label": "Usar mph para la velocidad del viento"
},
"location": { "location": {
"label": "Ubicación" "label": "Ubicación"
}, },
@@ -1762,12 +1774,12 @@
"description": "Cómo debería ser la fecha" "description": "Cómo debería ser la fecha"
} }
}, },
"currentWindSpeed": "{currentWindSpeed} km/h", "currentWindSpeed": "{currentWindSpeed} {unit}",
"dailyForecast": { "dailyForecast": {
"sunrise": "Amanecer", "sunrise": "Amanecer",
"sunset": "Atardecer", "sunset": "Atardecer",
"maxWindSpeed": "Velocidad máxima del viento: {maxWindSpeed} km/h", "maxWindSpeed": "Velocidad máxima del viento: {maxWindSpeed} {unit}",
"maxWindGusts": "Máximas ráfagas de viento: {maxWindGusts} km/h" "maxWindGusts": "Máximas ráfagas de viento: {maxWindGusts} {unit}"
}, },
"kind": { "kind": {
"clear": "Despejado", "clear": "Despejado",
@@ -2225,7 +2237,7 @@
"total": "Total" "total": "Total"
}, },
"users": { "users": {
"main": "Mejores usuarios", "main": "Clasificación de usuarios",
"requests": "Solicitudes" "requests": "Solicitudes"
} }
} }
@@ -2974,13 +2986,19 @@
"invite": "Invitaciones", "invite": "Invitaciones",
"integration": "Integraciones", "integration": "Integraciones",
"app": "Aplicaciones", "app": "Aplicaciones",
"group": "Grupos" "group": "Grupos",
"searchEngine": "Motores de búsqueda",
"media": "Imágenes"
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Tableros", "boards": "Tableros",
"resources": "Recursos", "resources": "Recursos",
"authentication": "Autenticación", "authentication": "Autenticación",
"authorization": "Autenticación" "authorization": "Autenticación"
},
"heroBanner": {
"title": "Bienvenido de nuevo a tu",
"subtitle": "Tablero de {app}"
} }
}, },
"board": { "board": {
@@ -3044,11 +3062,11 @@
"general": { "general": {
"title": "General", "title": "General",
"item": { "item": {
"language": "Idioma y región", "language": "Idioma",
"board": { "board": {
"title": "Tablero de inicio", "title": "Tableros",
"type": { "type": {
"general": "General", "general": "Escritorio",
"mobile": "Móvil" "mobile": "Móvil"
} }
}, },
@@ -3217,7 +3235,7 @@
"board": { "board": {
"title": "Tableros", "title": "Tableros",
"homeBoard": { "homeBoard": {
"label": "Tablero de inicio global", "label": "Tablero de escritorio global",
"mobileLabel": "Tablero móvil global", "mobileLabel": "Tablero móvil global",
"description": "Sólo los tableros públicos están disponibles para la selección" "description": "Sólo los tableros públicos están disponibles para la selección"
}, },
@@ -4397,7 +4415,7 @@
"page": { "page": {
"list": { "list": {
"title": "Certificados de confianza", "title": "Certificados de confianza",
"description": "Utilizado por Homarr para solicitar datos de las integraciones.", "description": "Utilizados por Homarr para solicitar datos de las integraciones.",
"noResults": { "noResults": {
"title": "Aún no hay certificados" "title": "Aún no hay certificados"
}, },

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "" "label": ""
}, },
@@ -2974,13 +2986,19 @@
"invite": "", "invite": "",
"integration": "", "integration": "",
"app": "", "app": "",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "", "boards": "",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Nom de groupe déjà utilisé" "groupNameTaken": "Nom de groupe déjà utilisé"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Titre" "label": "Titre"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Couleur de la bordure" "label": "Couleur de la bordure"
} }
@@ -1744,6 +1753,9 @@
"label": "Afficher la vitesse actuelle du vent", "label": "Afficher la vitesse actuelle du vent",
"description": "Uniquement sur la météo actuelle" "description": "Uniquement sur la météo actuelle"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Lieu de la météo" "label": "Lieu de la météo"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Invitations", "invite": "Invitations",
"integration": "Intégrations", "integration": "Intégrations",
"app": "Applications", "app": "Applications",
"group": "Groupes" "group": "Groupes",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Tableaux de bord", "boards": "Tableaux de bord",
"resources": "Ressources", "resources": "Ressources",
"authentication": "Authentification", "authentication": "Authentification",
"authorization": "Autorisation" "authorization": "Autorisation"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "שם הקבוצה כבר תפוס" "groupNameTaken": "שם הקבוצה כבר תפוס"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "כותרת" "label": "כותרת"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "צבע מסגרת" "label": "צבע מסגרת"
} }
@@ -1744,6 +1753,9 @@
"label": "הצגת מהירות רוח נוכחית", "label": "הצגת מהירות רוח נוכחית",
"description": "רק במזג אוויר נוכחי" "description": "רק במזג אוויר נוכחי"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "מיקום מזג האוויר" "label": "מיקום מזג האוויר"
}, },
@@ -2974,13 +2986,19 @@
"invite": "הזמנות", "invite": "הזמנות",
"integration": "אינטגרציות", "integration": "אינטגרציות",
"app": "אפליקציות", "app": "אפליקציות",
"group": "קבוצות" "group": "קבוצות",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "לוחות", "boards": "לוחות",
"resources": "מקורות", "resources": "מקורות",
"authentication": "אימות", "authentication": "אימות",
"authorization": "הרשאה" "authorization": "הרשאה"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Lokacija vremenske prognoze" "label": "Lokacija vremenske prognoze"
}, },
@@ -2974,13 +2986,19 @@
"invite": "poziva", "invite": "poziva",
"integration": "", "integration": "",
"app": "aplikacije", "app": "aplikacije",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Daske", "boards": "Daske",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Időjárás helye" "label": "Időjárás helye"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Meghívók", "invite": "Meghívók",
"integration": "Integrációk", "integration": "Integrációk",
"app": "Alkalmazások", "app": "Alkalmazások",
"group": "Csoportok" "group": "Csoportok",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Táblák", "boards": "Táblák",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Nome gruppo già preso" "groupNameTaken": "Nome gruppo già preso"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Titolo" "label": "Titolo"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Colore del bordo" "label": "Colore del bordo"
} }
@@ -1744,6 +1753,9 @@
"label": "Mostra la velocità attuale del vento", "label": "Mostra la velocità attuale del vento",
"description": "Solo sul meteo corrente" "description": "Solo sul meteo corrente"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Località meteo" "label": "Località meteo"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Inviti", "invite": "Inviti",
"integration": "Integrazioni", "integration": "Integrazioni",
"app": "Applicazioni", "app": "Applicazioni",
"group": "Gruppi" "group": "Gruppi",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Board", "boards": "Board",
"resources": "Risorse", "resources": "Risorse",
"authentication": "Autenticazione", "authentication": "Autenticazione",
"authorization": "Autorizzazione" "authorization": "Autorizzazione"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "グループ名は、既に使用されています" "groupNameTaken": "グループ名は、既に使用されています"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "タイトル" "label": "タイトル"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "境界線の色" "label": "境界線の色"
} }
@@ -1744,6 +1753,9 @@
"label": "現在の風速を表示", "label": "現在の風速を表示",
"description": "現在の天気のみ表示" "description": "現在の天気のみ表示"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "天候の場所" "label": "天候の場所"
}, },
@@ -2974,13 +2986,19 @@
"invite": "招待", "invite": "招待",
"integration": "連携機能", "integration": "連携機能",
"app": "アプリ", "app": "アプリ",
"group": "グループ" "group": "グループ",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "ボード", "boards": "ボード",
"resources": "リソース", "resources": "リソース",
"authentication": "認証", "authentication": "認証",
"authorization": "認可" "authorization": "認可"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "날씨 위치" "label": "날씨 위치"
}, },
@@ -2974,13 +2986,19 @@
"invite": "초대", "invite": "초대",
"integration": "", "integration": "",
"app": "앱", "app": "앱",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "보드", "boards": "보드",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "" "label": ""
}, },
@@ -2974,13 +2986,19 @@
"invite": "Pakvietimai", "invite": "Pakvietimai",
"integration": "", "integration": "",
"app": "Programėlės", "app": "Programėlės",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Lentos", "boards": "Lentos",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Laikapstākļu atrašānās vieta" "label": "Laikapstākļu atrašānās vieta"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Uzaicinājumi", "invite": "Uzaicinājumi",
"integration": "", "integration": "",
"app": "Lietotnes", "app": "Lietotnes",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Dēļi", "boards": "Dēļi",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Groepsnaam al in gebruik" "groupNameTaken": "Groepsnaam al in gebruik"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Titel" "label": "Titel"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Randkleur" "label": "Randkleur"
} }
@@ -1744,6 +1753,9 @@
"label": "Toon huidige windsnelheid", "label": "Toon huidige windsnelheid",
"description": "Alleen op het huidige weer" "description": "Alleen op het huidige weer"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Weerlocatie" "label": "Weerlocatie"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Uitnodigingen", "invite": "Uitnodigingen",
"integration": "Integraties", "integration": "Integraties",
"app": "Apps", "app": "Apps",
"group": "Groepen" "group": "Groepen",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Borden", "boards": "Borden",
"resources": "Bronnen", "resources": "Bronnen",
"authentication": "Authenticatie", "authentication": "Authenticatie",
"authorization": "Authorisatie" "authorization": "Authorisatie"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Gruppenavn allerede tatt" "groupNameTaken": "Gruppenavn allerede tatt"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Grensefarge" "label": "Grensefarge"
} }
@@ -1744,6 +1753,9 @@
"label": "Vis nåværende vindhastighet", "label": "Vis nåværende vindhastighet",
"description": "Bare på nåværende vær" "description": "Bare på nåværende vær"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Vær plassering" "label": "Vær plassering"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Invitasjoner", "invite": "Invitasjoner",
"integration": "Integrasjoner", "integration": "Integrasjoner",
"app": "Apper", "app": "Apper",
"group": "Grupper" "group": "Grupper",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Tavler", "boards": "Tavler",
"resources": "Ressurser", "resources": "Ressurser",
"authentication": "Autentisering", "authentication": "Autentisering",
"authorization": "Autorisasjon" "authorization": "Autorisasjon"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -389,7 +389,7 @@
} }
}, },
"media": { "media": {
"title": "Media", "title": "Multimedia",
"item": { "item": {
"upload": { "upload": {
"label": "Prześlij media", "label": "Prześlij media",
@@ -978,7 +978,7 @@
} }
}, },
"media": { "media": {
"plural": "Medias", "plural": "Multimedia",
"search": "Znajdź media", "search": "Znajdź media",
"field": { "field": {
"name": "Nazwa", "name": "Nazwa",
@@ -1145,6 +1145,12 @@
"groupNameTaken": "Nazwa użytkownika jest już zajęta" "groupNameTaken": "Nazwa użytkownika jest już zajęta"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "km/h",
"milesPerHour": "mph"
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Tytuł" "label": "Tytuł"
}, },
"customCssClasses": {
"label": "Niestandardowe klasy CSS"
},
"borderColor": { "borderColor": {
"label": "Kolor obramowania" "label": "Kolor obramowania"
} }
@@ -1744,6 +1753,9 @@
"label": "Pokaż aktualną prędkość wiatru", "label": "Pokaż aktualną prędkość wiatru",
"description": "Tylko dla bieżącej pogody" "description": "Tylko dla bieżącej pogody"
}, },
"useImperialSpeed": {
"label": "Prędkość wiatru w mph"
},
"location": { "location": {
"label": "Lokalizacja pogody" "label": "Lokalizacja pogody"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Zaproszenia", "invite": "Zaproszenia",
"integration": "Integracje", "integration": "Integracje",
"app": "Aplikacje", "app": "Aplikacje",
"group": "Grupy" "group": "Grupy",
"searchEngine": "Wyszukiwarki",
"media": "Multimedia"
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Tablice", "boards": "Tablice",
"resources": "Zasoby", "resources": "Zasoby",
"authentication": "Uwierzytelnianie", "authentication": "Uwierzytelnianie",
"authorization": "Autoryzacja" "authorization": "Autoryzacja"
},
"heroBanner": {
"title": "Witaj z powrotem w swojej",
"subtitle": "{app} tablicy"
} }
}, },
"board": { "board": {

View File

@@ -153,7 +153,7 @@
"label": "Usar ícone para pings" "label": "Usar ícone para pings"
}, },
"defaultSearchEngine": { "defaultSearchEngine": {
"label": "Mecanismo de busca padrão" "label": "Mecanismo de pesquisa padrão"
}, },
"openSearchInNewTab": { "openSearchInNewTab": {
"label": "Abrir resultados da busca em uma nova aba" "label": "Abrir resultados da busca em uma nova aba"
@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Localização do tempo" "label": "Localização do tempo"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Convites", "invite": "Convites",
"integration": "", "integration": "",
"app": "Aplicativos", "app": "Aplicativos",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Placas", "boards": "Placas",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Locație meteo" "label": "Locație meteo"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Invitații", "invite": "Invitații",
"integration": "", "integration": "",
"app": "Aplicații", "app": "Aplicații",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Planșe", "boards": "Planșe",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Имя группы уже занято" "groupNameTaken": "Имя группы уже занято"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Цвет границы" "label": "Цвет границы"
} }
@@ -1744,6 +1753,9 @@
"label": "Показать текущую скорость ветра", "label": "Показать текущую скорость ветра",
"description": "Только для текущей погоды" "description": "Только для текущей погоды"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Местоположение" "label": "Местоположение"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Приглашения", "invite": "Приглашения",
"integration": "Интеграции", "integration": "Интеграции",
"app": "Приложения", "app": "Приложения",
"group": "Группы" "group": "Группы",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Панели", "boards": "Панели",
"resources": "Ресурсы", "resources": "Ресурсы",
"authentication": "Аутентификация", "authentication": "Аутентификация",
"authorization": "Авторизация" "authorization": "Авторизация"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Názov skupiny je už obsadený" "groupNameTaken": "Názov skupiny je už obsadený"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Názov" "label": "Názov"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Farba okraja" "label": "Farba okraja"
} }
@@ -1744,6 +1753,9 @@
"label": "Zobraziť aktuálnu rýchlosť vetra", "label": "Zobraziť aktuálnu rýchlosť vetra",
"description": "Len za aktuálneho počasia" "description": "Len za aktuálneho počasia"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Poloha počasia" "label": "Poloha počasia"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Pozvánky", "invite": "Pozvánky",
"integration": "Integrácie", "integration": "Integrácie",
"app": "Aplikácie", "app": "Aplikácie",
"group": "Skupiny" "group": "Skupiny",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Dosky", "boards": "Dosky",
"resources": "Zdroje", "resources": "Zdroje",
"authentication": "Autentifikácia", "authentication": "Autentifikácia",
"authorization": "Autorizácia" "authorization": "Autorizácia"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Lokacija vremena" "label": "Lokacija vremena"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Vabi", "invite": "Vabi",
"integration": "", "integration": "",
"app": "Aplikacije", "app": "Aplikacije",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Deske", "boards": "Deske",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Plats för väder" "label": "Plats för väder"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Inbjudningar", "invite": "Inbjudningar",
"integration": "Integrationer", "integration": "Integrationer",
"app": "Applikationer", "app": "Applikationer",
"group": "Grupper" "group": "Grupper",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Tavlor", "boards": "Tavlor",
"resources": "Resurser", "resources": "Resurser",
"authentication": "Autentisering", "authentication": "Autentisering",
"authorization": "Auktorisering" "authorization": "Auktorisering"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Grup adı zaten alınmış" "groupNameTaken": "Grup adı zaten alınmış"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "Başlık" "label": "Başlık"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "Kenarlık rengi" "label": "Kenarlık rengi"
} }
@@ -1744,6 +1753,9 @@
"label": "Mevcut rüzgar hızını göster", "label": "Mevcut rüzgar hızını göster",
"description": "Yalnızca mevcut hava durumunda" "description": "Yalnızca mevcut hava durumunda"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Hava durumu konumu" "label": "Hava durumu konumu"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Davetler", "invite": "Davetler",
"integration": "Entegrasyonlar", "integration": "Entegrasyonlar",
"app": "Uygulamalar", "app": "Uygulamalar",
"group": "Gruplar" "group": "Gruplar",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Paneller", "boards": "Paneller",
"resources": "Kaynaklar", "resources": "Kaynaklar",
"authentication": "Kimlik doğrulama", "authentication": "Kimlik doğrulama",
"authorization": "Yetkilendirme" "authorization": "Yetkilendirme"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "Назва групи вже зайнята" "groupNameTaken": "Назва групи вже зайнята"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "Показати поточну швидкість вітру", "label": "Показати поточну швидкість вітру",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Погодна локація" "label": "Погодна локація"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Запрошення", "invite": "Запрошення",
"integration": "Інтеграції", "integration": "Інтеграції",
"app": "Додатки", "app": "Додатки",
"group": "Групи" "group": "Групи",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Дошки", "boards": "Дошки",
"resources": "Ресурси", "resources": "Ресурси",
"authentication": "Аутентифікація", "authentication": "Аутентифікація",
"authorization": "Авторизація" "authorization": "Авторизація"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "" "groupNameTaken": ""
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "" "label": ""
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "" "label": ""
} }
@@ -1744,6 +1753,9 @@
"label": "", "label": "",
"description": "" "description": ""
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "Vị trí thời tiết" "label": "Vị trí thời tiết"
}, },
@@ -2974,13 +2986,19 @@
"invite": "Mời", "invite": "Mời",
"integration": "", "integration": "",
"app": "Ứng dụng", "app": "Ứng dụng",
"group": "" "group": "",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Bảng", "boards": "Bảng",
"resources": "", "resources": "",
"authentication": "", "authentication": "",
"authorization": "" "authorization": ""
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -1145,6 +1145,12 @@
"groupNameTaken": "用戶組名稱已存在" "groupNameTaken": "用戶組名稱已存在"
} }
} }
},
"unit": {
"speed": {
"kilometersPerHour": "",
"milesPerHour": ""
}
} }
}, },
"section": { "section": {
@@ -1157,6 +1163,9 @@
"title": { "title": {
"label": "標題" "label": "標題"
}, },
"customCssClasses": {
"label": ""
},
"borderColor": { "borderColor": {
"label": "邊框顏色" "label": "邊框顏色"
} }
@@ -1744,6 +1753,9 @@
"label": "顯示當前風速", "label": "顯示當前風速",
"description": "僅限當前天氣" "description": "僅限當前天氣"
}, },
"useImperialSpeed": {
"label": ""
},
"location": { "location": {
"label": "天氣位置" "label": "天氣位置"
}, },
@@ -2974,13 +2986,19 @@
"invite": "邀請", "invite": "邀請",
"integration": "集成", "integration": "集成",
"app": "應用程式", "app": "應用程式",
"group": "群組" "group": "群組",
"searchEngine": "",
"media": ""
}, },
"statisticLabel": { "statisticLabel": {
"boards": "面板", "boards": "面板",
"resources": "資源", "resources": "資源",
"authentication": "認證", "authentication": "認證",
"authorization": "認證" "authorization": "認證"
},
"heroBanner": {
"title": "",
"subtitle": ""
} }
}, },
"board": { "board": {

View File

@@ -30,9 +30,9 @@
"@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.3", "@mantine/core": "^8.3.4",
"@mantine/dates": "^8.3.3", "@mantine/dates": "^8.3.4",
"@mantine/hooks": "^8.3.3", "@mantine/hooks": "^8.3.4",
"@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.4", "next": "15.5.4",

View File

@@ -24,7 +24,7 @@
"dependencies": { "dependencies": {
"@homarr/definitions": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"zod": "^4.1.11", "zod": "^4.1.12",
"zod-form-data": "^3.0.1" "zod-form-data": "^3.0.1"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -48,26 +48,26 @@
"@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.3", "@mantine/charts": "^8.3.4",
"@mantine/core": "^8.3.3", "@mantine/core": "^8.3.4",
"@mantine/hooks": "^8.3.3", "@mantine/hooks": "^8.3.4",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"@tiptap/extension-color": "2.26.2", "@tiptap/extension-color": "2.26.3",
"@tiptap/extension-highlight": "2.26.2", "@tiptap/extension-highlight": "2.26.3",
"@tiptap/extension-image": "2.26.2", "@tiptap/extension-image": "2.26.3",
"@tiptap/extension-link": "^2.26.2", "@tiptap/extension-link": "^2.26.3",
"@tiptap/extension-placeholder": "^2.26.2", "@tiptap/extension-placeholder": "^2.26.3",
"@tiptap/extension-table": "2.26.2", "@tiptap/extension-table": "2.26.3",
"@tiptap/extension-table-cell": "2.26.2", "@tiptap/extension-table-cell": "2.26.3",
"@tiptap/extension-table-header": "2.26.2", "@tiptap/extension-table-header": "2.26.3",
"@tiptap/extension-table-row": "2.26.2", "@tiptap/extension-table-row": "2.26.3",
"@tiptap/extension-task-item": "2.26.2", "@tiptap/extension-task-item": "2.26.3",
"@tiptap/extension-task-list": "2.26.2", "@tiptap/extension-task-list": "2.26.3",
"@tiptap/extension-text-align": "2.26.2", "@tiptap/extension-text-align": "2.26.3",
"@tiptap/extension-text-style": "2.26.2", "@tiptap/extension-text-style": "2.26.3",
"@tiptap/extension-underline": "2.26.2", "@tiptap/extension-underline": "2.26.3",
"@tiptap/react": "^2.26.2", "@tiptap/react": "^2.26.3",
"@tiptap/starter-kit": "^2.26.1", "@tiptap/starter-kit": "^2.26.3",
"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",
@@ -78,7 +78,7 @@
"react-markdown": "^10.1.0", "react-markdown": "^10.1.0",
"recharts": "^2.15.4", "recharts": "^2.15.4",
"video.js": "^8.23.4", "video.js": "^8.23.4",
"zod": "^4.1.11" "zod": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

1259
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

File diff suppressed because one or more lines are too long

View File

@@ -24,7 +24,7 @@
"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": "^6.1.1", "eslint-plugin-react-hooks": "^6.1.1",
"typescript-eslint": "^8.45.0" "typescript-eslint": "^8.46.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",