chore(release): automatic release v1.5.0
This commit is contained in:
1
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
1
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -31,6 +31,7 @@ body:
|
|||||||
label: Version
|
label: Version
|
||||||
description: What version of Homarr are you running?
|
description: What version of Homarr are you running?
|
||||||
options:
|
options:
|
||||||
|
- 1.4.0
|
||||||
- 1.3.1
|
- 1.3.1
|
||||||
- 1.3.0
|
- 1.3.0
|
||||||
- 1.2.0
|
- 1.2.0
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ RUN apk add --no-cache libc6-compat curl bash
|
|||||||
RUN apk update
|
RUN apk update
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
|
# Install working version of corepack (See https://github.com/nodejs/corepack/issues/612)
|
||||||
|
RUN npm install -g corepack@0.31.0 && corepack --version
|
||||||
RUN corepack enable pnpm && pnpm install --recursive --frozen-lockfile
|
RUN corepack enable pnpm && pnpm install --recursive --frozen-lockfile
|
||||||
|
|
||||||
# Copy static data as it is not part of the build
|
# Copy static data as it is not part of the build
|
||||||
@@ -17,6 +19,8 @@ COPY static-data ./static-data
|
|||||||
ARG SKIP_ENV_VALIDATION='true'
|
ARG SKIP_ENV_VALIDATION='true'
|
||||||
ARG CI='true'
|
ARG CI='true'
|
||||||
ARG DISABLE_REDIS_LOGS='true'
|
ARG DISABLE_REDIS_LOGS='true'
|
||||||
|
# Install working version of corepack (See https://github.com/nodejs/corepack/issues/612)
|
||||||
|
RUN npm install -g corepack@0.31.0 && corepack --version
|
||||||
RUN corepack enable pnpm && pnpm build
|
RUN corepack enable pnpm && pnpm build
|
||||||
|
|
||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
"@mantine/tiptap": "^7.16.2",
|
"@mantine/tiptap": "^7.16.2",
|
||||||
"@million/lint": "1.0.14",
|
"@million/lint": "1.0.14",
|
||||||
"@t3-oss/env-nextjs": "^0.12.0",
|
"@t3-oss/env-nextjs": "^0.12.0",
|
||||||
"@tabler/icons-react": "^3.29.0",
|
"@tabler/icons-react": "^3.30.0",
|
||||||
"@tanstack/react-query": "^5.66.0",
|
"@tanstack/react-query": "^5.66.0",
|
||||||
"@tanstack/react-query-devtools": "^5.66.0",
|
"@tanstack/react-query-devtools": "^5.66.0",
|
||||||
"@tanstack/react-query-next-experimental": "^5.66.0",
|
"@tanstack/react-query-next-experimental": "^5.66.0",
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
"dotenv": "^16.4.7",
|
"dotenv": "^16.4.7",
|
||||||
"flag-icons": "^7.3.2",
|
"flag-icons": "^7.3.2",
|
||||||
"glob": "^11.0.1",
|
"glob": "^11.0.1",
|
||||||
"jotai": "^2.11.2",
|
"jotai": "^2.11.3",
|
||||||
"mantine-react-table": "2.0.0-beta.8",
|
"mantine-react-table": "2.0.0-beta.8",
|
||||||
"next": "15.1.6",
|
"next": "15.1.6",
|
||||||
"postcss-preset-mantine": "^1.17.0",
|
"postcss-preset-mantine": "^1.17.0",
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
"react-dom": "19.0.0",
|
"react-dom": "19.0.0",
|
||||||
"react-error-boundary": "^5.0.0",
|
"react-error-boundary": "^5.0.0",
|
||||||
"react-simple-code-editor": "^0.14.1",
|
"react-simple-code-editor": "^0.14.1",
|
||||||
"sass": "^1.83.4",
|
"sass": "^1.84.0",
|
||||||
"superjson": "2.2.2",
|
"superjson": "2.2.2",
|
||||||
"swagger-ui-react": "^5.18.3",
|
"swagger-ui-react": "^5.18.3",
|
||||||
"use-deep-compare-effect": "^1.8.1",
|
"use-deep-compare-effect": "^1.8.1",
|
||||||
@@ -87,7 +87,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/chroma-js": "3.1.1",
|
"@types/chroma-js": "3.1.1",
|
||||||
"@types/node": "^22.12.0",
|
"@types/node": "^22.13.1",
|
||||||
"@types/prismjs": "^1.26.5",
|
"@types/prismjs": "^1.26.5",
|
||||||
"@types/react": "19.0.8",
|
"@types/react": "19.0.8",
|
||||||
"@types/react-dom": "19.0.3",
|
"@types/react-dom": "19.0.3",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
.bannerContainer {
|
.bannerContainer {
|
||||||
border-radius: 8px;
|
border-radius: 16px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@mixin dark {
|
@mixin dark {
|
||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
import { useRef } from "react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { Button, Group, Stack, Textarea, TextInput } from "@mantine/core";
|
import { Button, Group, Stack, Textarea, TextInput } from "@mantine/core";
|
||||||
import type { z } from "zod";
|
import type { z } from "zod";
|
||||||
|
|
||||||
import { useZodForm } from "@homarr/form";
|
import { useZodForm } from "@homarr/form";
|
||||||
import type { TranslationFunction } from "@homarr/translation";
|
|
||||||
import { useI18n } from "@homarr/translation/client";
|
import { useI18n } from "@homarr/translation/client";
|
||||||
import { validation } from "@homarr/validation";
|
import { validation } from "@homarr/validation";
|
||||||
|
|
||||||
@@ -14,14 +14,21 @@ import { IconPicker } from "~/components/icons/picker/icon-picker";
|
|||||||
type FormType = z.infer<typeof validation.app.manage>;
|
type FormType = z.infer<typeof validation.app.manage>;
|
||||||
|
|
||||||
interface AppFormProps {
|
interface AppFormProps {
|
||||||
submitButtonTranslation: (t: TranslationFunction) => string;
|
buttonLabels: {
|
||||||
|
submit: string;
|
||||||
|
submitAndCreateAnother?: string;
|
||||||
|
};
|
||||||
initialValues?: FormType;
|
initialValues?: FormType;
|
||||||
handleSubmit: (values: FormType) => void;
|
handleSubmit: (values: FormType, redirect: boolean, afterSuccess?: () => void) => void;
|
||||||
isPending: boolean;
|
isPending: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const AppForm = (props: AppFormProps) => {
|
export const AppForm = ({
|
||||||
const { submitButtonTranslation, handleSubmit, initialValues, isPending } = props;
|
buttonLabels,
|
||||||
|
handleSubmit: originalHandleSubmit,
|
||||||
|
initialValues,
|
||||||
|
isPending,
|
||||||
|
}: AppFormProps) => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
|
|
||||||
const form = useZodForm(validation.app.manage, {
|
const form = useZodForm(validation.app.manage, {
|
||||||
@@ -33,11 +40,23 @@ export const AppForm = (props: AppFormProps) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const shouldCreateAnother = useRef(false);
|
||||||
|
const handleSubmit = (values: FormType) => {
|
||||||
|
const redirect = !shouldCreateAnother.current;
|
||||||
|
const afterSuccess = shouldCreateAnother.current
|
||||||
|
? () => {
|
||||||
|
form.reset();
|
||||||
|
shouldCreateAnother.current = false;
|
||||||
|
}
|
||||||
|
: undefined;
|
||||||
|
originalHandleSubmit(values, redirect, afterSuccess);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form onSubmit={form.onSubmit(handleSubmit)}>
|
<form onSubmit={form.onSubmit(handleSubmit)}>
|
||||||
<Stack>
|
<Stack>
|
||||||
<TextInput {...form.getInputProps("name")} withAsterisk label={t("app.field.name.label")} />
|
<TextInput {...form.getInputProps("name")} withAsterisk label={t("app.field.name.label")} />
|
||||||
<IconPicker initialValue={initialValues?.iconUrl} {...form.getInputProps("iconUrl")} />
|
<IconPicker {...form.getInputProps("iconUrl")} />
|
||||||
<Textarea {...form.getInputProps("description")} label={t("app.field.description.label")} />
|
<Textarea {...form.getInputProps("description")} label={t("app.field.description.label")} />
|
||||||
<TextInput {...form.getInputProps("href")} label={t("app.field.url.label")} />
|
<TextInput {...form.getInputProps("href")} label={t("app.field.url.label")} />
|
||||||
|
|
||||||
@@ -45,8 +64,19 @@ export const AppForm = (props: AppFormProps) => {
|
|||||||
<Button variant="default" component={Link} href="/manage/apps">
|
<Button variant="default" component={Link} href="/manage/apps">
|
||||||
{t("common.action.backToOverview")}
|
{t("common.action.backToOverview")}
|
||||||
</Button>
|
</Button>
|
||||||
|
{buttonLabels.submitAndCreateAnother && (
|
||||||
|
<Button
|
||||||
|
type="submit"
|
||||||
|
onClick={() => {
|
||||||
|
shouldCreateAnother.current = true;
|
||||||
|
}}
|
||||||
|
loading={isPending}
|
||||||
|
>
|
||||||
|
{buttonLabels.submitAndCreateAnother}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
<Button type="submit" loading={isPending}>
|
<Button type="submit" loading={isPending}>
|
||||||
{submitButtonTranslation(t)}
|
{buttonLabels.submit}
|
||||||
</Button>
|
</Button>
|
||||||
</Group>
|
</Group>
|
||||||
</Stack>
|
</Stack>
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ import type { RouterOutputs } from "@homarr/api";
|
|||||||
import { clientApi } from "@homarr/api/client";
|
import { clientApi } from "@homarr/api/client";
|
||||||
import { revalidatePathActionAsync } from "@homarr/common/client";
|
import { revalidatePathActionAsync } from "@homarr/common/client";
|
||||||
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
|
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
|
||||||
import type { TranslationFunction } from "@homarr/translation";
|
import { useI18n, useScopedI18n } from "@homarr/translation/client";
|
||||||
import { useScopedI18n } from "@homarr/translation/client";
|
|
||||||
import type { validation } from "@homarr/validation";
|
import type { validation } from "@homarr/validation";
|
||||||
|
|
||||||
import { AppForm } from "../../_form";
|
import { AppForm } from "../../_form";
|
||||||
@@ -19,14 +18,15 @@ interface AppEditFormProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const AppEditForm = ({ app }: AppEditFormProps) => {
|
export const AppEditForm = ({ app }: AppEditFormProps) => {
|
||||||
const t = useScopedI18n("app.page.edit.notification");
|
const tScoped = useScopedI18n("app.page.edit.notification");
|
||||||
|
const t = useI18n();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const { mutate, isPending } = clientApi.app.update.useMutation({
|
const { mutate, isPending } = clientApi.app.update.useMutation({
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
showSuccessNotification({
|
showSuccessNotification({
|
||||||
title: t("success.title"),
|
title: tScoped("success.title"),
|
||||||
message: t("success.message"),
|
message: tScoped("success.message"),
|
||||||
});
|
});
|
||||||
void revalidatePathActionAsync("/manage/apps").then(() => {
|
void revalidatePathActionAsync("/manage/apps").then(() => {
|
||||||
router.push("/manage/apps");
|
router.push("/manage/apps");
|
||||||
@@ -34,8 +34,8 @@ export const AppEditForm = ({ app }: AppEditFormProps) => {
|
|||||||
},
|
},
|
||||||
onError: () => {
|
onError: () => {
|
||||||
showErrorNotification({
|
showErrorNotification({
|
||||||
title: t("error.title"),
|
title: tScoped("error.title"),
|
||||||
message: t("error.message"),
|
message: tScoped("error.message"),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -50,11 +50,11 @@ export const AppEditForm = ({ app }: AppEditFormProps) => {
|
|||||||
[mutate, app.id],
|
[mutate, app.id],
|
||||||
);
|
);
|
||||||
|
|
||||||
const submitButtonTranslation = useCallback((t: TranslationFunction) => t("common.action.save"), []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AppForm
|
<AppForm
|
||||||
submitButtonTranslation={submitButtonTranslation}
|
buttonLabels={{
|
||||||
|
submit: t("common.action.save"),
|
||||||
|
}}
|
||||||
initialValues={app}
|
initialValues={app}
|
||||||
handleSubmit={handleSubmit}
|
handleSubmit={handleSubmit}
|
||||||
isPending={isPending}
|
isPending={isPending}
|
||||||
|
|||||||
@@ -7,44 +7,55 @@ import type { z } from "zod";
|
|||||||
import { clientApi } from "@homarr/api/client";
|
import { clientApi } from "@homarr/api/client";
|
||||||
import { revalidatePathActionAsync } from "@homarr/common/client";
|
import { revalidatePathActionAsync } from "@homarr/common/client";
|
||||||
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
|
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
|
||||||
import type { TranslationFunction } from "@homarr/translation";
|
import { useI18n, useScopedI18n } from "@homarr/translation/client";
|
||||||
import { useScopedI18n } from "@homarr/translation/client";
|
|
||||||
import type { validation } from "@homarr/validation";
|
import type { validation } from "@homarr/validation";
|
||||||
|
|
||||||
import { AppForm } from "../_form";
|
import { AppForm } from "../_form";
|
||||||
|
|
||||||
export const AppNewForm = () => {
|
export const AppNewForm = () => {
|
||||||
const t = useScopedI18n("app.page.create.notification");
|
const tScoped = useScopedI18n("app.page.create.notification");
|
||||||
|
const t = useI18n();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const { mutate, isPending } = clientApi.app.create.useMutation({
|
const { mutate, isPending } = clientApi.app.create.useMutation({
|
||||||
onSuccess: () => {
|
|
||||||
showSuccessNotification({
|
|
||||||
title: t("success.title"),
|
|
||||||
message: t("success.message"),
|
|
||||||
});
|
|
||||||
void revalidatePathActionAsync("/manage/apps").then(() => {
|
|
||||||
router.push("/manage/apps");
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onError: () => {
|
onError: () => {
|
||||||
showErrorNotification({
|
showErrorNotification({
|
||||||
title: t("error.title"),
|
title: tScoped("error.title"),
|
||||||
message: t("error.message"),
|
message: tScoped("error.message"),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleSubmit = useCallback(
|
const handleSubmit = useCallback(
|
||||||
(values: z.infer<typeof validation.app.manage>) => {
|
(values: z.infer<typeof validation.app.manage>, redirect: boolean, afterSuccess?: () => void) => {
|
||||||
mutate(values);
|
mutate(values, {
|
||||||
},
|
onSuccess() {
|
||||||
[mutate],
|
showSuccessNotification({
|
||||||
);
|
title: tScoped("success.title"),
|
||||||
|
message: tScoped("success.message"),
|
||||||
|
});
|
||||||
|
afterSuccess?.();
|
||||||
|
|
||||||
const submitButtonTranslation = useCallback((t: TranslationFunction) => t("common.action.create"), []);
|
if (!redirect) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void revalidatePathActionAsync("/manage/apps").then(() => {
|
||||||
|
router.push("/manage/apps");
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
[mutate, router, tScoped],
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AppForm submitButtonTranslation={submitButtonTranslation} handleSubmit={handleSubmit} isPending={isPending} />
|
<AppForm
|
||||||
|
buttonLabels={{
|
||||||
|
submit: t("common.action.create"),
|
||||||
|
submitAndCreateAnother: t("common.action.createAnother"),
|
||||||
|
}}
|
||||||
|
handleSubmit={handleSubmit}
|
||||||
|
isPending={isPending}
|
||||||
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export default async function AppsPage(props: AppsPageProps) {
|
|||||||
<Stack>
|
<Stack>
|
||||||
<Title>{t("page.list.title")}</Title>
|
<Title>{t("page.list.title")}</Title>
|
||||||
<Group justify="space-between" align="center">
|
<Group justify="space-between" align="center">
|
||||||
<SearchInput placeholder={`${t("search")}...`} defaultValue={searchParams.search} />
|
<SearchInput placeholder={`${t("search")}...`} defaultValue={searchParams.search} flexExpand />
|
||||||
{session.user.permissions.includes("app-create") && (
|
{session.user.permissions.includes("app-create") && (
|
||||||
<MobileAffixButton component={Link} href="/manage/apps/new">
|
<MobileAffixButton component={Link} href="/manage/apps/new">
|
||||||
{t("page.create.title")}
|
{t("page.create.title")}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ const BoardCard = async ({ board }: BoardCardProps) => {
|
|||||||
const VisibilityIcon = board.isPublic ? IconWorld : IconLock;
|
const VisibilityIcon = board.isPublic ? IconWorld : IconLock;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card withBorder>
|
<Card radius="lg" withBorder>
|
||||||
<CardSection p="sm" withBorder>
|
<CardSection p="sm" withBorder>
|
||||||
<Group justify="space-between" align="center">
|
<Group justify="space-between" align="center">
|
||||||
<Group gap="sm">
|
<Group gap="sm">
|
||||||
@@ -106,15 +106,25 @@ const BoardCard = async ({ board }: BoardCardProps) => {
|
|||||||
</Group>
|
</Group>
|
||||||
</CardSection>
|
</CardSection>
|
||||||
|
|
||||||
<CardSection p="sm">
|
<CardSection>
|
||||||
<Group wrap="nowrap">
|
<Group gap={0} wrap="nowrap">
|
||||||
<Button component={Link} href={`/boards/${board.name}`} variant="default" fullWidth>
|
<Button
|
||||||
|
style={{ border: "none", borderRadius: 0 }}
|
||||||
|
component={Link}
|
||||||
|
href={`/boards/${board.name}`}
|
||||||
|
variant="default"
|
||||||
|
fullWidth
|
||||||
|
>
|
||||||
{t("action.open.label")}
|
{t("action.open.label")}
|
||||||
</Button>
|
</Button>
|
||||||
{isMenuVisible && (
|
{isMenuVisible && (
|
||||||
<Menu position="bottom-end">
|
<Menu position="bottom-end">
|
||||||
<MenuTarget>
|
<MenuTarget>
|
||||||
<ActionIcon variant="default" size="lg">
|
<ActionIcon
|
||||||
|
style={{ borderTop: "none", borderBottom: "none", borderRight: "none", borderRadius: 0 }}
|
||||||
|
variant="default"
|
||||||
|
size="lg"
|
||||||
|
>
|
||||||
<IconDotsVertical size={16} stroke={1.5} />
|
<IconDotsVertical size={16} stroke={1.5} />
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</MenuTarget>
|
</MenuTarget>
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ export const IntegrationCreateDropdownContent = () => {
|
|||||||
value={search}
|
value={search}
|
||||||
data-autofocus
|
data-autofocus
|
||||||
onChange={handleSearch}
|
onChange={handleSearch}
|
||||||
|
variant="filled"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{filteredKinds.length > 0 ? (
|
{filteredKinds.length > 0 ? (
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
.root {
|
||||||
|
border-radius: var(--mantine-radius-lg);
|
||||||
|
background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6));
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6));
|
||||||
|
border: 1px solid transparent;
|
||||||
|
position: relative;
|
||||||
|
z-index: 0;
|
||||||
|
transition: transform 150ms ease;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&[data-first="true"] {
|
||||||
|
border-radius: var(--mantine-radius-lg) var(--mantine-radius-lg) 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-last="true"] {
|
||||||
|
border-radius: 0 0 var(--mantine-radius-lg) var(--mantine-radius-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-active] {
|
||||||
|
transform: scale(1.01);
|
||||||
|
z-index: 1;
|
||||||
|
background-color: var(--mantine-color-body);
|
||||||
|
border-color: light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-4));
|
||||||
|
box-shadow: var(--mantine-shadow-md);
|
||||||
|
border-radius: var(--mantine-radius-lg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chevron {
|
||||||
|
&[data-rotate] {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,6 +44,7 @@ import { NoResults } from "~/components/no-results";
|
|||||||
import { ActiveTabAccordion } from "../../../../components/active-tab-accordion";
|
import { ActiveTabAccordion } from "../../../../components/active-tab-accordion";
|
||||||
import { DeleteIntegrationActionButton } from "./_integration-buttons";
|
import { DeleteIntegrationActionButton } from "./_integration-buttons";
|
||||||
import { IntegrationCreateDropdownContent } from "./new/_integration-new-dropdown";
|
import { IntegrationCreateDropdownContent } from "./new/_integration-new-dropdown";
|
||||||
|
import classes from "./page.module.css";
|
||||||
|
|
||||||
interface IntegrationsPageProps {
|
interface IntegrationsPageProps {
|
||||||
searchParams: Promise<{
|
searchParams: Promise<{
|
||||||
@@ -133,7 +134,7 @@ const IntegrationList = async ({ integrations, activeTab }: IntegrationListProps
|
|||||||
return <NoResults icon={IconPlugX} title={t("page.list.noResults.title")} />;
|
return <NoResults icon={IconPlugX} title={t("page.list.noResults.title")} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
const grouppedIntegrations = integrations.reduce(
|
const groupedIntegrations = integrations.reduce(
|
||||||
(acc, integration) => {
|
(acc, integration) => {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||||
if (!acc[integration.kind]) {
|
if (!acc[integration.kind]) {
|
||||||
@@ -147,11 +148,13 @@ const IntegrationList = async ({ integrations, activeTab }: IntegrationListProps
|
|||||||
{} as Record<IntegrationKind, RouterOutputs["integration"]["all"]>,
|
{} as Record<IntegrationKind, RouterOutputs["integration"]["all"]>,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const entries = objectEntries(groupedIntegrations);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ActiveTabAccordion defaultValue={activeTab} variant="separated">
|
<ActiveTabAccordion defaultValue={activeTab} radius="lg" classNames={classes}>
|
||||||
{objectEntries(grouppedIntegrations).map(([kind, integrations]) => (
|
{entries.map(([kind, integrations], index) => (
|
||||||
<AccordionItem key={kind} value={kind}>
|
<AccordionItem key={kind} value={kind} data-first={index === 0} data-last={index === entries.length - 1}>
|
||||||
<AccordionControl icon={<IntegrationAvatar size="sm" kind={kind} />}>
|
<AccordionControl icon={<IntegrationAvatar size="sm" kind={kind} radius="sm" />}>
|
||||||
<Group>
|
<Group>
|
||||||
<Text>{getIntegrationName(kind)}</Text>
|
<Text>{getIntegrationName(kind)}</Text>
|
||||||
<CountBadge count={integrations.length} />
|
<CountBadge count={integrations.length} />
|
||||||
|
|||||||
@@ -1,26 +1,26 @@
|
|||||||
import type { PropsWithChildren } from "react";
|
import type { PropsWithChildren } from "react";
|
||||||
import { AppShellMain } from "@mantine/core";
|
import { AppShellMain } from "@mantine/core";
|
||||||
import {
|
import {
|
||||||
|
IconAffiliateFilled,
|
||||||
IconBook2,
|
IconBook2,
|
||||||
IconBox,
|
IconBox,
|
||||||
IconBrandDiscord,
|
IconBrandDiscord,
|
||||||
IconBrandDocker,
|
IconBrandDocker,
|
||||||
IconBrandGithub,
|
IconBrandGithub,
|
||||||
|
IconBrandTablerFilled,
|
||||||
IconCertificate,
|
IconCertificate,
|
||||||
|
IconClipboardListFilled,
|
||||||
|
IconDirectionsFilled,
|
||||||
IconGitFork,
|
IconGitFork,
|
||||||
IconHome,
|
IconHelpSquareRoundedFilled,
|
||||||
IconInfoSmall,
|
IconHomeFilled,
|
||||||
IconLayoutDashboard,
|
IconLayoutDashboardFilled,
|
||||||
IconLogs,
|
|
||||||
IconMailForward,
|
IconMailForward,
|
||||||
IconPhoto,
|
IconPhotoFilled,
|
||||||
IconPlug,
|
IconPointerFilled,
|
||||||
IconQuestionMark,
|
|
||||||
IconReport,
|
|
||||||
IconSearch,
|
IconSearch,
|
||||||
IconSettings,
|
IconSettingsFilled,
|
||||||
IconTool,
|
IconUserFilled,
|
||||||
IconUser,
|
|
||||||
IconUsers,
|
IconUsers,
|
||||||
IconUsersGroup,
|
IconUsersGroup,
|
||||||
} from "@tabler/icons-react";
|
} from "@tabler/icons-react";
|
||||||
@@ -31,6 +31,7 @@ import { createDocumentationLink } from "@homarr/definitions";
|
|||||||
import { getScopedI18n } from "@homarr/translation/server";
|
import { getScopedI18n } from "@homarr/translation/server";
|
||||||
|
|
||||||
import { MainHeader } from "~/components/layout/header";
|
import { MainHeader } from "~/components/layout/header";
|
||||||
|
import { homarrLogoPath } from "~/components/layout/logo/homarr-logo";
|
||||||
import type { NavigationLink } from "~/components/layout/navigation";
|
import type { NavigationLink } from "~/components/layout/navigation";
|
||||||
import { MainNavigation } from "~/components/layout/navigation";
|
import { MainNavigation } from "~/components/layout/navigation";
|
||||||
import { ClientShell } from "~/components/layout/shell";
|
import { ClientShell } from "~/components/layout/shell";
|
||||||
@@ -41,11 +42,11 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
|
|||||||
const navigationLinks: NavigationLink[] = [
|
const navigationLinks: NavigationLink[] = [
|
||||||
{
|
{
|
||||||
label: t("items.home"),
|
label: t("items.home"),
|
||||||
icon: IconHome,
|
icon: IconHomeFilled,
|
||||||
href: "/manage",
|
href: "/manage",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: IconLayoutDashboard,
|
icon: IconLayoutDashboardFilled,
|
||||||
href: "/manage/boards",
|
href: "/manage/boards",
|
||||||
label: t("items.boards"),
|
label: t("items.boards"),
|
||||||
},
|
},
|
||||||
@@ -54,9 +55,12 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
|
|||||||
href: "/manage/apps",
|
href: "/manage/apps",
|
||||||
label: t("items.apps"),
|
label: t("items.apps"),
|
||||||
hidden: !session,
|
hidden: !session,
|
||||||
|
iconProps: {
|
||||||
|
strokeWidth: 2.5,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: IconPlug,
|
icon: IconAffiliateFilled,
|
||||||
href: "/manage/integrations",
|
href: "/manage/integrations",
|
||||||
label: t("items.integrations"),
|
label: t("items.integrations"),
|
||||||
hidden: !session,
|
hidden: !session,
|
||||||
@@ -66,15 +70,18 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
|
|||||||
href: "/manage/search-engines",
|
href: "/manage/search-engines",
|
||||||
label: t("items.searchEngies"),
|
label: t("items.searchEngies"),
|
||||||
hidden: !session,
|
hidden: !session,
|
||||||
|
iconProps: {
|
||||||
|
strokeWidth: 2.5,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: IconPhoto,
|
icon: IconPhotoFilled,
|
||||||
href: "/manage/medias",
|
href: "/manage/medias",
|
||||||
label: t("items.medias"),
|
label: t("items.medias"),
|
||||||
hidden: !session,
|
hidden: !session,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: IconUser,
|
icon: IconUserFilled,
|
||||||
label: t("items.users.label"),
|
label: t("items.users.label"),
|
||||||
hidden: !session?.user.permissions.includes("admin"),
|
hidden: !session?.user.permissions.includes("admin"),
|
||||||
items: [
|
items: [
|
||||||
@@ -98,7 +105,7 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t("items.tools.label"),
|
label: t("items.tools.label"),
|
||||||
icon: IconTool,
|
icon: IconPointerFilled,
|
||||||
// As permissions always include there children permissions, we can check other-view-logs as admin includes it
|
// As permissions always include there children permissions, we can check other-view-logs as admin includes it
|
||||||
hidden: !session?.user.permissions.includes("other-view-logs"),
|
hidden: !session?.user.permissions.includes("other-view-logs"),
|
||||||
items: [
|
items: [
|
||||||
@@ -110,13 +117,13 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t("items.tools.items.api"),
|
label: t("items.tools.items.api"),
|
||||||
icon: IconPlug,
|
icon: IconDirectionsFilled,
|
||||||
href: "/manage/tools/api",
|
href: "/manage/tools/api",
|
||||||
hidden: !session?.user.permissions.includes("admin"),
|
hidden: !session?.user.permissions.includes("admin"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t("items.tools.items.logs"),
|
label: t("items.tools.items.logs"),
|
||||||
icon: IconLogs,
|
icon: IconBrandTablerFilled,
|
||||||
href: "/manage/tools/logs",
|
href: "/manage/tools/logs",
|
||||||
hidden: !session?.user.permissions.includes("other-view-logs"),
|
hidden: !session?.user.permissions.includes("other-view-logs"),
|
||||||
},
|
},
|
||||||
@@ -128,7 +135,7 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t("items.tools.items.tasks"),
|
label: t("items.tools.items.tasks"),
|
||||||
icon: IconReport,
|
icon: IconClipboardListFilled,
|
||||||
href: "/manage/tools/tasks",
|
href: "/manage/tools/tasks",
|
||||||
hidden: !session?.user.permissions.includes("admin"),
|
hidden: !session?.user.permissions.includes("admin"),
|
||||||
},
|
},
|
||||||
@@ -137,12 +144,12 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
|
|||||||
{
|
{
|
||||||
label: t("items.settings"),
|
label: t("items.settings"),
|
||||||
href: "/manage/settings",
|
href: "/manage/settings",
|
||||||
icon: IconSettings,
|
icon: IconSettingsFilled,
|
||||||
hidden: !session?.user.permissions.includes("admin"),
|
hidden: !session?.user.permissions.includes("admin"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t("items.help.label"),
|
label: t("items.help.label"),
|
||||||
icon: IconQuestionMark,
|
icon: IconHelpSquareRoundedFilled,
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
label: t("items.help.items.documentation"),
|
label: t("items.help.items.documentation"),
|
||||||
@@ -172,7 +179,7 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t("items.about"),
|
label: t("items.about"),
|
||||||
icon: IconInfoSmall,
|
icon: homarrLogoPath,
|
||||||
href: "/manage/about",
|
href: "/manage/about",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ export default async function GroupsListPage(props: MediaListPageProps) {
|
|||||||
const { items: medias, totalCount } = await api.media.getPaginated(searchParams);
|
const { items: medias, totalCount } = await api.media.getPaginated(searchParams);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ManageContainer size="xl">
|
<ManageContainer>
|
||||||
<DynamicBreadcrumb />
|
<DynamicBreadcrumb />
|
||||||
<Stack>
|
<Stack>
|
||||||
<Title>{t("media.plural")}</Title>
|
<Title>{t("media.plural")}</Title>
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ export default async function ManagementPage() {
|
|||||||
{links.map(
|
{links.map(
|
||||||
(link) =>
|
(link) =>
|
||||||
!link.hidden && (
|
!link.hidden && (
|
||||||
<Card component={Link} href={link.href} key={link.href} withBorder>
|
<Card component={Link} href={link.href} key={link.href} radius="lg">
|
||||||
<Group justify="space-between" wrap="nowrap">
|
<Group justify="space-between" wrap="nowrap">
|
||||||
<Group wrap="nowrap">
|
<Group wrap="nowrap">
|
||||||
<Text size="2.4rem" fw="bolder">
|
<Text size="2.4rem" fw="bolder">
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ export const SearchEngineForm = (props: SearchEngineFormProps) => {
|
|||||||
/>
|
/>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
<IconPicker initialValue={initialValues?.iconUrl} {...form.getInputProps("iconUrl")} />
|
<IconPicker {...form.getInputProps("iconUrl")} />
|
||||||
|
|
||||||
<Fieldset legend={t("search.engine.page.edit.configControl")}>
|
<Fieldset legend={t("search.engine.page.edit.configControl")}>
|
||||||
<SegmentedControl
|
<SegmentedControl
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export default async function SearchEnginesPage(props: SearchEnginesPageProps) {
|
|||||||
<Stack>
|
<Stack>
|
||||||
<Title>{tEngine("page.list.title")}</Title>
|
<Title>{tEngine("page.list.title")}</Title>
|
||||||
<Group justify="space-between" align="center">
|
<Group justify="space-between" align="center">
|
||||||
<SearchInput placeholder={`${tEngine("search")}...`} defaultValue={searchParams.search} />
|
<SearchInput placeholder={`${tEngine("search")}...`} defaultValue={searchParams.search} flexExpand />
|
||||||
{session.user.permissions.includes("search-engine-create") && (
|
{session.user.permissions.includes("search-engine-create") && (
|
||||||
<MobileAffixButton component={Link} href="/manage/search-engines/new">
|
<MobileAffixButton component={Link} href="/manage/search-engines/new">
|
||||||
{tEngine("page.create.title")}
|
{tEngine("page.create.title")}
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useMemo } from "react";
|
import { useCallback, useMemo } from "react";
|
||||||
import { Button, Group, Stack, Text, Title } from "@mantine/core";
|
import { ActionIcon, Button, Group, Stack, Text, Title } from "@mantine/core";
|
||||||
|
import { IconTrash } from "@tabler/icons-react";
|
||||||
import type { MRT_ColumnDef } from "mantine-react-table";
|
import type { MRT_ColumnDef } from "mantine-react-table";
|
||||||
import { MantineReactTable, useMantineReactTable } from "mantine-react-table";
|
import { MantineReactTable, useMantineReactTable } from "mantine-react-table";
|
||||||
|
|
||||||
import type { RouterOutputs } from "@homarr/api";
|
import type { RouterOutputs } from "@homarr/api";
|
||||||
import { clientApi } from "@homarr/api/client";
|
import { clientApi } from "@homarr/api/client";
|
||||||
import { revalidatePathActionAsync } from "@homarr/common/client";
|
import { revalidatePathActionAsync } from "@homarr/common/client";
|
||||||
import { useModalAction } from "@homarr/modals";
|
import { useConfirmModal, useModalAction } from "@homarr/modals";
|
||||||
import { useScopedI18n } from "@homarr/translation/client";
|
import { useScopedI18n } from "@homarr/translation/client";
|
||||||
import { UserAvatar } from "@homarr/ui";
|
import { UserAvatar } from "@homarr/ui";
|
||||||
|
|
||||||
@@ -20,7 +21,8 @@ interface ApiKeysManagementProps {
|
|||||||
|
|
||||||
export const ApiKeysManagement = ({ apiKeys }: ApiKeysManagementProps) => {
|
export const ApiKeysManagement = ({ apiKeys }: ApiKeysManagementProps) => {
|
||||||
const { openModal } = useModalAction(CopyApiKeyModal);
|
const { openModal } = useModalAction(CopyApiKeyModal);
|
||||||
const { mutate, isPending } = clientApi.apiKeys.create.useMutation({
|
const { openConfirmModal } = useConfirmModal();
|
||||||
|
const { mutate: mutateCreate, isPending: isPendingCreate } = clientApi.apiKeys.create.useMutation({
|
||||||
async onSuccess(data) {
|
async onSuccess(data) {
|
||||||
openModal({
|
openModal({
|
||||||
apiKey: data.apiKey,
|
apiKey: data.apiKey,
|
||||||
@@ -28,7 +30,26 @@ export const ApiKeysManagement = ({ apiKeys }: ApiKeysManagementProps) => {
|
|||||||
await revalidatePathActionAsync("/manage/tools/api");
|
await revalidatePathActionAsync("/manage/tools/api");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
const { mutateAsync: mutateDeleteAsync, isPending: isPendingDelete } = clientApi.apiKeys.delete.useMutation({
|
||||||
|
async onSuccess() {
|
||||||
|
await revalidatePathActionAsync("/manage/tools/api");
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const t = useScopedI18n("management.page.tool.api.tab.apiKey");
|
const t = useScopedI18n("management.page.tool.api.tab.apiKey");
|
||||||
|
const handleDelete = useCallback(
|
||||||
|
(id: string) => {
|
||||||
|
openConfirmModal({
|
||||||
|
title: t("modal.delete.title"),
|
||||||
|
children: t("modal.delete.text"),
|
||||||
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
|
async onConfirm() {
|
||||||
|
await mutateDeleteAsync({ apiKeyId: id });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
[t, openConfirmModal, mutateDeleteAsync],
|
||||||
|
);
|
||||||
|
|
||||||
const columns = useMemo<MRT_ColumnDef<RouterOutputs["apiKeys"]["getAll"][number]>[]>(
|
const columns = useMemo<MRT_ColumnDef<RouterOutputs["apiKeys"]["getAll"][number]>[]>(
|
||||||
() => [
|
() => [
|
||||||
@@ -46,8 +67,18 @@ export const ApiKeysManagement = ({ apiKeys }: ApiKeysManagementProps) => {
|
|||||||
</Group>
|
</Group>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: t("table.header.actions"),
|
||||||
|
Cell: ({ row }) => (
|
||||||
|
<Group gap="xs">
|
||||||
|
<ActionIcon onClick={() => handleDelete(row.original.id)} loading={isPendingDelete} c="red">
|
||||||
|
<IconTrash size="1rem" />
|
||||||
|
</ActionIcon>
|
||||||
|
</Group>
|
||||||
|
),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
[t],
|
[t, handleDelete, isPendingDelete],
|
||||||
);
|
);
|
||||||
|
|
||||||
const table = useMantineReactTable({
|
const table = useMantineReactTable({
|
||||||
@@ -56,9 +87,9 @@ export const ApiKeysManagement = ({ apiKeys }: ApiKeysManagementProps) => {
|
|||||||
renderTopToolbarCustomActions: () => (
|
renderTopToolbarCustomActions: () => (
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
mutate();
|
mutateCreate();
|
||||||
}}
|
}}
|
||||||
loading={isPending}
|
loading={isPendingCreate}
|
||||||
>
|
>
|
||||||
{t("button.createApiToken")}
|
{t("button.createApiToken")}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useCallback } from "react";
|
import { useCallback } from "react";
|
||||||
|
|
||||||
|
import { fetchApi } from "@homarr/api/client";
|
||||||
import { createId } from "@homarr/db/client";
|
import { createId } from "@homarr/db/client";
|
||||||
import { useConfirmModal, useModalAction } from "@homarr/modals";
|
import { useConfirmModal, useModalAction } from "@homarr/modals";
|
||||||
import { useI18n } from "@homarr/translation/client";
|
import { useI18n } from "@homarr/translation/client";
|
||||||
@@ -7,6 +8,7 @@ import { useI18n } from "@homarr/translation/client";
|
|||||||
import type { CategorySection } from "~/app/[locale]/boards/_types";
|
import type { CategorySection } from "~/app/[locale]/boards/_types";
|
||||||
import { useCategoryActions } from "./category-actions";
|
import { useCategoryActions } from "./category-actions";
|
||||||
import { CategoryEditModal } from "./category-edit-modal";
|
import { CategoryEditModal } from "./category-edit-modal";
|
||||||
|
import { filterByItemKind } from "./filter";
|
||||||
|
|
||||||
export const useCategoryMenuActions = (category: CategorySection) => {
|
export const useCategoryMenuActions = (category: CategorySection) => {
|
||||||
const { openModal } = useModalAction(CategoryEditModal);
|
const { openModal } = useModalAction(CategoryEditModal);
|
||||||
@@ -97,6 +99,28 @@ export const useCategoryMenuActions = (category: CategorySection) => {
|
|||||||
);
|
);
|
||||||
}, [category, openModal, renameCategory, t]);
|
}, [category, openModal, renameCategory, t]);
|
||||||
|
|
||||||
|
const openAllInNewTabs = useCallback(async () => {
|
||||||
|
const appIds = filterByItemKind(category.items, "app").map((item) => {
|
||||||
|
return item.options.appId;
|
||||||
|
});
|
||||||
|
|
||||||
|
const apps = await fetchApi.app.byIds.query(appIds);
|
||||||
|
const appsWithUrls = apps.filter((app) => app.href && app.href.length > 0);
|
||||||
|
|
||||||
|
for (const app of appsWithUrls) {
|
||||||
|
const openedWindow = window.open(app.href ?? undefined);
|
||||||
|
if (openedWindow) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
openConfirmModal({
|
||||||
|
title: t("section.category.openAllInNewTabs.title"),
|
||||||
|
children: t("section.category.openAllInNewTabs.text"),
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}, [category, t, openConfirmModal]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
addCategoryAbove,
|
addCategoryAbove,
|
||||||
addCategoryBelow,
|
addCategoryBelow,
|
||||||
@@ -104,5 +128,6 @@ export const useCategoryMenuActions = (category: CategorySection) => {
|
|||||||
moveCategoryDown,
|
moveCategoryDown,
|
||||||
remove,
|
remove,
|
||||||
edit,
|
edit,
|
||||||
|
openAllInNewTabs,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { ActionIcon, Menu } from "@mantine/core";
|
|||||||
import {
|
import {
|
||||||
IconDotsVertical,
|
IconDotsVertical,
|
||||||
IconEdit,
|
IconEdit,
|
||||||
|
IconExternalLink,
|
||||||
IconRowInsertBottom,
|
IconRowInsertBottom,
|
||||||
IconRowInsertTop,
|
IconRowInsertTop,
|
||||||
IconTransitionBottom,
|
IconTransitionBottom,
|
||||||
@@ -12,6 +13,7 @@ import {
|
|||||||
IconTrash,
|
IconTrash,
|
||||||
} from "@tabler/icons-react";
|
} from "@tabler/icons-react";
|
||||||
|
|
||||||
|
import type { MaybePromise } from "@homarr/common/types";
|
||||||
import { useScopedI18n } from "@homarr/translation/client";
|
import { useScopedI18n } from "@homarr/translation/client";
|
||||||
import type { TablerIcon } from "@homarr/ui";
|
import type { TablerIcon } from "@homarr/ui";
|
||||||
|
|
||||||
@@ -27,8 +29,6 @@ export const CategoryMenu = ({ category }: Props) => {
|
|||||||
const actions = useActions(category);
|
const actions = useActions(category);
|
||||||
const t = useScopedI18n("section.category");
|
const t = useScopedI18n("section.category");
|
||||||
|
|
||||||
if (actions.length === 0) return null;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Menu withArrow>
|
<Menu withArrow>
|
||||||
<Menu.Target>
|
<Menu.Target>
|
||||||
@@ -37,18 +37,20 @@ export const CategoryMenu = ({ category }: Props) => {
|
|||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</Menu.Target>
|
</Menu.Target>
|
||||||
<Menu.Dropdown>
|
<Menu.Dropdown>
|
||||||
{actions.map((action) => (
|
{actions.map((action) => {
|
||||||
<React.Fragment key={action.label}>
|
return (
|
||||||
{"group" in action && <Menu.Label>{t(action.group)}</Menu.Label>}
|
<React.Fragment key={action.label}>
|
||||||
<Menu.Item
|
{"group" in action && <Menu.Label>{t(action.group)}</Menu.Label>}
|
||||||
leftSection={<action.icon size="1rem" />}
|
<Menu.Item
|
||||||
onClick={action.onClick}
|
leftSection={<action.icon size="1rem" />}
|
||||||
color={"color" in action ? action.color : undefined}
|
onClick={action.onClick}
|
||||||
>
|
color={"color" in action ? action.color : undefined}
|
||||||
{t(action.label)}
|
>
|
||||||
</Menu.Item>
|
{t(action.label)}
|
||||||
</React.Fragment>
|
</Menu.Item>
|
||||||
))}
|
</React.Fragment>
|
||||||
|
);
|
||||||
|
})}
|
||||||
</Menu.Dropdown>
|
</Menu.Dropdown>
|
||||||
</Menu>
|
</Menu>
|
||||||
);
|
);
|
||||||
@@ -106,15 +108,21 @@ const useEditModeActions = (category: CategorySection) => {
|
|||||||
] as const satisfies ActionDefinition[];
|
] as const satisfies ActionDefinition[];
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: once apps are added we can use this for the open many apps action
|
const useNonEditModeActions = (category: CategorySection) => {
|
||||||
const useNonEditModeActions = (_category: CategorySection) => {
|
const { openAllInNewTabs } = useCategoryMenuActions(category);
|
||||||
return [] as const satisfies ActionDefinition[];
|
return [
|
||||||
|
{
|
||||||
|
icon: IconExternalLink,
|
||||||
|
label: "action.openAllInNewTabs",
|
||||||
|
onClick: openAllInNewTabs,
|
||||||
|
},
|
||||||
|
] as const satisfies ActionDefinition[];
|
||||||
};
|
};
|
||||||
|
|
||||||
interface ActionDefinition {
|
interface ActionDefinition {
|
||||||
icon: TablerIcon;
|
icon: TablerIcon;
|
||||||
label: string;
|
label: string;
|
||||||
onClick: () => void;
|
onClick: () => MaybePromise<void>;
|
||||||
color?: string;
|
color?: string;
|
||||||
group?: string;
|
group?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
14
apps/nextjs/src/components/board/sections/category/filter.ts
Normal file
14
apps/nextjs/src/components/board/sections/category/filter.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import type { WidgetKind } from "@homarr/definitions";
|
||||||
|
import type { WidgetComponentProps } from "@homarr/widgets";
|
||||||
|
import { reduceWidgetOptionsWithDefaultValues } from "@homarr/widgets";
|
||||||
|
|
||||||
|
import type { Item } from "~/app/[locale]/boards/_types";
|
||||||
|
|
||||||
|
export const filterByItemKind = <TKind extends WidgetKind>(items: Item[], kind: TKind) => {
|
||||||
|
return items
|
||||||
|
.filter((item) => item.kind === kind)
|
||||||
|
.map((item) => ({
|
||||||
|
...item,
|
||||||
|
options: reduceWidgetOptionsWithDefaultValues(kind, item.options) as WidgetComponentProps<TKind>["options"],
|
||||||
|
}));
|
||||||
|
};
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import type { FocusEventHandler } from "react";
|
import type { FocusEventHandler } from "react";
|
||||||
import { startTransition, useState } from "react";
|
import { startTransition } from "react";
|
||||||
import {
|
import {
|
||||||
ActionIcon,
|
ActionIcon,
|
||||||
Box,
|
Box,
|
||||||
@@ -17,7 +17,7 @@ import {
|
|||||||
UnstyledButton,
|
UnstyledButton,
|
||||||
useCombobox,
|
useCombobox,
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
import { useDebouncedValue } from "@mantine/hooks";
|
import { useDebouncedValue, useUncontrolled } from "@mantine/hooks";
|
||||||
import { IconUpload } from "@tabler/icons-react";
|
import { IconUpload } from "@tabler/icons-react";
|
||||||
|
|
||||||
import { clientApi } from "@homarr/api/client";
|
import { clientApi } from "@homarr/api/client";
|
||||||
@@ -28,17 +28,27 @@ import { UploadMedia } from "~/app/[locale]/manage/medias/_actions/upload-media"
|
|||||||
import classes from "./icon-picker.module.css";
|
import classes from "./icon-picker.module.css";
|
||||||
|
|
||||||
interface IconPickerProps {
|
interface IconPickerProps {
|
||||||
initialValue?: string;
|
value?: string;
|
||||||
onChange: (iconUrl: string) => void;
|
onChange: (iconUrl: string) => void;
|
||||||
error?: string | null;
|
error?: string | null;
|
||||||
onFocus?: FocusEventHandler;
|
onFocus?: FocusEventHandler;
|
||||||
onBlur?: FocusEventHandler;
|
onBlur?: FocusEventHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: IconPickerProps) => {
|
export const IconPicker = ({ value: propsValue, onChange, error, onFocus, onBlur }: IconPickerProps) => {
|
||||||
const [value, setValue] = useState<string>(initialValue ?? "");
|
const [value, setValue] = useUncontrolled({
|
||||||
const [search, setSearch] = useState(initialValue ?? "");
|
value: propsValue,
|
||||||
const [previewUrl, setPreviewUrl] = useState<string | null>(initialValue ?? null);
|
onChange,
|
||||||
|
});
|
||||||
|
const [search, setSearch] = useUncontrolled({
|
||||||
|
value,
|
||||||
|
onChange: (value) => {
|
||||||
|
setValue(value);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const [previewUrl, setPreviewUrl] = useUncontrolled({
|
||||||
|
value: propsValue ?? null,
|
||||||
|
});
|
||||||
const { data: session } = useSession();
|
const { data: session } = useSession();
|
||||||
|
|
||||||
const tCommon = useScopedI18n("common");
|
const tCommon = useScopedI18n("common");
|
||||||
@@ -68,10 +78,9 @@ export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: I
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
const value = item.url;
|
const value = item.url;
|
||||||
startTransition(() => {
|
startTransition(() => {
|
||||||
setValue(value);
|
|
||||||
setPreviewUrl(value);
|
setPreviewUrl(value);
|
||||||
setSearch(value);
|
setSearch(value);
|
||||||
onChange(value);
|
setValue(value);
|
||||||
combobox.closeDropdown();
|
combobox.closeDropdown();
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
@@ -128,7 +137,6 @@ export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: I
|
|||||||
setSearch(event.currentTarget.value);
|
setSearch(event.currentTarget.value);
|
||||||
setValue(event.currentTarget.value);
|
setValue(event.currentTarget.value);
|
||||||
setPreviewUrl(null);
|
setPreviewUrl(null);
|
||||||
onChange(event.currentTarget.value);
|
|
||||||
}}
|
}}
|
||||||
onClick={() => combobox.openDropdown()}
|
onClick={() => combobox.openDropdown()}
|
||||||
onFocus={(event) => {
|
onFocus={(event) => {
|
||||||
@@ -154,7 +162,6 @@ export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: I
|
|||||||
setValue(url);
|
setValue(url);
|
||||||
setPreviewUrl(url);
|
setPreviewUrl(url);
|
||||||
setSearch(url);
|
setSearch(url);
|
||||||
onChange(url);
|
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export const DesktopSearchInput = () => {
|
|||||||
size="sm"
|
size="sm"
|
||||||
leftSection={<IconSearch size={20} stroke={1.5} />}
|
leftSection={<IconSearch size={20} stroke={1.5} />}
|
||||||
onClick={openSpotlight}
|
onClick={openSpotlight}
|
||||||
|
radius="xl"
|
||||||
>
|
>
|
||||||
{`${t("search.placeholder")}...`}
|
{`${t("search.placeholder")}...`}
|
||||||
</TextInput>
|
</TextInput>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { JSX } from "react";
|
import type { JSX } from "react";
|
||||||
import { AppShellNavbar, AppShellSection, ScrollArea } from "@mantine/core";
|
import { AppShellNavbar, AppShellSection, Image, ScrollArea } from "@mantine/core";
|
||||||
|
|
||||||
import type { TablerIcon } from "@homarr/ui";
|
import type { TablerIcon, TablerIconProps } from "@homarr/ui";
|
||||||
|
|
||||||
import type { ClientNavigationLink } from "./navigation-link";
|
import type { ClientNavigationLink } from "./navigation-link";
|
||||||
import { CommonNavLink } from "./navigation-link";
|
import { CommonNavLink } from "./navigation-link";
|
||||||
@@ -27,8 +27,13 @@ export const MainNavigation = ({ headerSection, footerSection, links }: MainNavi
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { icon: TablerIcon, ...props } = link;
|
const { icon: TablerIcon, iconProps, ...props } = link;
|
||||||
const Icon = <TablerIcon size={20} stroke={1.5} />;
|
const Icon =
|
||||||
|
typeof TablerIcon === "string" ? (
|
||||||
|
<Image src={TablerIcon} w={20} h={20} />
|
||||||
|
) : (
|
||||||
|
<TablerIcon size={20} stroke={1.5} {...iconProps} />
|
||||||
|
);
|
||||||
let clientLink: ClientNavigationLink;
|
let clientLink: ClientNavigationLink;
|
||||||
if ("items" in props) {
|
if ("items" in props) {
|
||||||
clientLink = {
|
clientLink = {
|
||||||
@@ -38,7 +43,7 @@ export const MainNavigation = ({ headerSection, footerSection, links }: MainNavi
|
|||||||
.map((item) => {
|
.map((item) => {
|
||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
icon: <item.icon size={20} stroke={1.5} />,
|
icon: <item.icon size={20} stroke={1.5} {...iconProps} />,
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
} as ClientNavigationLink;
|
} as ClientNavigationLink;
|
||||||
@@ -55,7 +60,8 @@ export const MainNavigation = ({ headerSection, footerSection, links }: MainNavi
|
|||||||
|
|
||||||
interface CommonNavigationLinkProps {
|
interface CommonNavigationLinkProps {
|
||||||
label: string;
|
label: string;
|
||||||
icon: TablerIcon;
|
icon: TablerIcon | string;
|
||||||
|
iconProps?: TablerIconProps;
|
||||||
hidden?: boolean;
|
hidden?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,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.12.0",
|
"@types/node": "^22.13.1",
|
||||||
"dotenv-cli": "^8.0.0",
|
"dotenv-cli": "^8.0.0",
|
||||||
"eslint": "^9.19.0",
|
"eslint": "^9.19.0",
|
||||||
"prettier": "^3.4.2",
|
"prettier": "^3.4.2",
|
||||||
|
|||||||
14
package.json
14
package.json
@@ -38,22 +38,22 @@
|
|||||||
"@semantic-release/github": "^11.0.1",
|
"@semantic-release/github": "^11.0.1",
|
||||||
"@semantic-release/npm": "^12.0.1",
|
"@semantic-release/npm": "^12.0.1",
|
||||||
"@semantic-release/release-notes-generator": "^14.0.3",
|
"@semantic-release/release-notes-generator": "^14.0.3",
|
||||||
"@turbo/gen": "^2.3.4",
|
"@turbo/gen": "^2.4.0",
|
||||||
"@vitejs/plugin-react": "^4.3.4",
|
"@vitejs/plugin-react": "^4.3.4",
|
||||||
"@vitest/coverage-v8": "^3.0.4",
|
"@vitest/coverage-v8": "^3.0.5",
|
||||||
"@vitest/ui": "^3.0.4",
|
"@vitest/ui": "^3.0.5",
|
||||||
"conventional-changelog-conventionalcommits": "^8.0.0",
|
"conventional-changelog-conventionalcommits": "^8.0.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"jsdom": "^26.0.0",
|
"jsdom": "^26.0.0",
|
||||||
"prettier": "^3.4.2",
|
"prettier": "^3.4.2",
|
||||||
"semantic-release": "^24.2.1",
|
"semantic-release": "^24.2.1",
|
||||||
"testcontainers": "^10.17.2",
|
"testcontainers": "^10.18.0",
|
||||||
"turbo": "^2.3.4",
|
"turbo": "^2.4.0",
|
||||||
"typescript": "^5.7.3",
|
"typescript": "^5.7.3",
|
||||||
"vite-tsconfig-paths": "^5.1.4",
|
"vite-tsconfig-paths": "^5.1.4",
|
||||||
"vitest": "^3.0.4"
|
"vitest": "^3.0.5"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@9.15.4",
|
"packageManager": "pnpm@9.15.5",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=22.13.1"
|
"node": ">=22.13.1"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
"react-dom": "19.0.0",
|
"react-dom": "19.0.0",
|
||||||
"superjson": "2.2.2",
|
"superjson": "2.2.2",
|
||||||
"trpc-to-openapi": "^2.1.2",
|
"trpc-to-openapi": "^2.1.3",
|
||||||
"zod": "^3.24.1"
|
"zod": "^3.24.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
import { createSaltAsync, hashPasswordAsync } from "@homarr/auth";
|
import { createSaltAsync, hashPasswordAsync } from "@homarr/auth";
|
||||||
import { generateSecureRandomToken } from "@homarr/common/server";
|
import { generateSecureRandomToken } from "@homarr/common/server";
|
||||||
import { createId, db } from "@homarr/db";
|
import { createId, db, eq } from "@homarr/db";
|
||||||
import { apiKeys } from "@homarr/db/schema";
|
import { apiKeys } from "@homarr/db/schema";
|
||||||
|
|
||||||
import { createTRPCRouter, permissionRequiredProcedure } from "../trpc";
|
import { createTRPCRouter, permissionRequiredProcedure } from "../trpc";
|
||||||
@@ -39,4 +41,10 @@ export const apiKeysRouter = createTRPCRouter({
|
|||||||
apiKey: `${id}.${randomToken}`,
|
apiKey: `${id}.${randomToken}`,
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
|
delete: permissionRequiredProcedure
|
||||||
|
.requiresPermission("admin")
|
||||||
|
.input(z.object({ apiKeyId: z.string() }))
|
||||||
|
.mutation(async ({ ctx, input }) => {
|
||||||
|
await ctx.db.delete(apiKeys).where(eq(apiKeys.id, input.apiKeyId)).limit(1);
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -195,6 +195,12 @@ export const searchEngineRouter = createTRPCRouter({
|
|||||||
.requiresPermission("search-engine-full-all")
|
.requiresPermission("search-engine-full-all")
|
||||||
.input(validation.common.byId)
|
.input(validation.common.byId)
|
||||||
.mutation(async ({ ctx, input }) => {
|
.mutation(async ({ ctx, input }) => {
|
||||||
|
await ctx.db
|
||||||
|
.update(users)
|
||||||
|
.set({
|
||||||
|
defaultSearchEngineId: null,
|
||||||
|
})
|
||||||
|
.where(eq(users.defaultSearchEngineId, input.id));
|
||||||
await ctx.db.delete(searchEngines).where(eq(searchEngines.id, input.id));
|
await ctx.db.delete(searchEngines).where(eq(searchEngines.id, input.id));
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
"@homarr/server-settings": "workspace:^0.1.0",
|
"@homarr/server-settings": "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",
|
||||||
"semver-parser": "^4.1.7"
|
"semver-parser": "^4.1.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- Custom SQL migration file, put your code below! --
|
||||||
|
-- This file is empty as there was a bug in the migration script of sqlite, missing on delete actions. See https://github.com/homarr-labs/homarr/pull/2211 --
|
||||||
1764
packages/db/migrations/mysql/meta/0023_snapshot.json
Normal file
1764
packages/db/migrations/mysql/meta/0023_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -162,6 +162,13 @@
|
|||||||
"when": 1737927618711,
|
"when": 1737927618711,
|
||||||
"tag": "0022_famous_otto_octavius",
|
"tag": "0022_famous_otto_octavius",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 23,
|
||||||
|
"version": "5",
|
||||||
|
"when": 1738687012272,
|
||||||
|
"tag": "0023_fix_on_delete_actions",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
39
packages/db/migrations/sqlite/0023_fix_on_delete_actions.sql
Normal file
39
packages/db/migrations/sqlite/0023_fix_on_delete_actions.sql
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
-- Custom SQL migration file, put your code below! --
|
||||||
|
COMMIT TRANSACTION;
|
||||||
|
--> statement-breakpoint
|
||||||
|
PRAGMA foreign_keys = OFF;
|
||||||
|
--> statement-breakpoint
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE `__new_user` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`name` text,
|
||||||
|
`email` text,
|
||||||
|
`email_verified` integer,
|
||||||
|
`image` text,
|
||||||
|
`password` text,
|
||||||
|
`salt` text,
|
||||||
|
`provider` text DEFAULT 'credentials' NOT NULL,
|
||||||
|
`home_board_id` text,
|
||||||
|
`mobile_home_board_id` text,
|
||||||
|
`default_search_engine_id` text,
|
||||||
|
`open_search_in_new_tab` integer DEFAULT true NOT NULL,
|
||||||
|
`color_scheme` text DEFAULT 'dark' NOT NULL,
|
||||||
|
`first_day_of_week` integer DEFAULT 1 NOT NULL,
|
||||||
|
`ping_icons_enabled` integer DEFAULT false NOT NULL,
|
||||||
|
FOREIGN KEY (`home_board_id`) REFERENCES `board`(`id`) ON UPDATE no action ON DELETE set null,
|
||||||
|
FOREIGN KEY (`mobile_home_board_id`) REFERENCES `board`(`id`) ON UPDATE no action ON DELETE set null,
|
||||||
|
FOREIGN KEY (`default_search_engine_id`) REFERENCES `search_engine`(`id`) ON UPDATE no action ON DELETE set null
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
INSERT INTO `__new_user`("id", "name", "email", "email_verified", "image", "password", "salt", "provider", "home_board_id", "mobile_home_board_id", "default_search_engine_id", "open_search_in_new_tab", "color_scheme", "first_day_of_week", "ping_icons_enabled") SELECT "id", "name", "email", "email_verified", "image", "password", "salt", "provider", "home_board_id", "mobile_home_board_id", "default_search_engine_id", "open_search_in_new_tab", "color_scheme", "first_day_of_week", "ping_icons_enabled" FROM `user`;
|
||||||
|
--> statement-breakpoint
|
||||||
|
DROP TABLE `user`;
|
||||||
|
--> statement-breakpoint
|
||||||
|
ALTER TABLE `__new_user` RENAME TO `user`;
|
||||||
|
--> statement-breakpoint
|
||||||
|
COMMIT TRANSACTION;
|
||||||
|
--> statement-breakpoint
|
||||||
|
PRAGMA foreign_keys = ON;
|
||||||
|
--> statement-breakpoint
|
||||||
|
BEGIN TRANSACTION;
|
||||||
1689
packages/db/migrations/sqlite/meta/0023_snapshot.json
Normal file
1689
packages/db/migrations/sqlite/meta/0023_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -162,6 +162,13 @@
|
|||||||
"when": 1737927609085,
|
"when": 1737927609085,
|
||||||
"tag": "0022_modern_sunfire",
|
"tag": "0022_modern_sunfire",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 23,
|
||||||
|
"version": "6",
|
||||||
|
"when": 1738686324915,
|
||||||
|
"tag": "0023_fix_on_delete_actions",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,11 +44,11 @@
|
|||||||
"@homarr/server-settings": "workspace:^0.1.0",
|
"@homarr/server-settings": "workspace:^0.1.0",
|
||||||
"@paralleldrive/cuid2": "^2.2.2",
|
"@paralleldrive/cuid2": "^2.2.2",
|
||||||
"@t3-oss/env-nextjs": "^0.12.0",
|
"@t3-oss/env-nextjs": "^0.12.0",
|
||||||
"@testcontainers/mysql": "^10.17.2",
|
"@testcontainers/mysql": "^10.18.0",
|
||||||
"better-sqlite3": "^11.8.1",
|
"better-sqlite3": "^11.8.1",
|
||||||
"dotenv": "^16.4.7",
|
"dotenv": "^16.4.7",
|
||||||
"drizzle-kit": "^0.30.4",
|
"drizzle-kit": "^0.30.4",
|
||||||
"drizzle-orm": "^0.39.1",
|
"drizzle-orm": "^0.39.2",
|
||||||
"drizzle-zod": "^0.7.0",
|
"drizzle-zod": "^0.7.0",
|
||||||
"mysql2": "3.12.0"
|
"mysql2": "3.12.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export interface HealthMonitoring {
|
|||||||
};
|
};
|
||||||
rebootRequired: boolean;
|
rebootRequired: boolean;
|
||||||
availablePkgUpdates: number;
|
availablePkgUpdates: number;
|
||||||
cpuTemp: number;
|
cpuTemp: number | undefined;
|
||||||
fileSystem: {
|
fileSystem: {
|
||||||
deviceName: string;
|
deviceName: string;
|
||||||
used: string;
|
used: string;
|
||||||
|
|||||||
@@ -63,9 +63,6 @@ export class OpenMediaVaultIntegration extends Integration {
|
|||||||
if (!smartResult.success) {
|
if (!smartResult.success) {
|
||||||
throw new Error("Invalid SMART information response");
|
throw new Error("Invalid SMART information response");
|
||||||
}
|
}
|
||||||
if (!cpuTempResult.success) {
|
|
||||||
throw new Error("Invalid CPU temperature response");
|
|
||||||
}
|
|
||||||
|
|
||||||
const fileSystem = fileSystemResult.data.response.map((fileSystem) => ({
|
const fileSystem = fileSystemResult.data.response.map((fileSystem) => ({
|
||||||
deviceName: fileSystem.devicename,
|
deviceName: fileSystem.devicename,
|
||||||
@@ -94,7 +91,7 @@ export class OpenMediaVaultIntegration extends Integration {
|
|||||||
},
|
},
|
||||||
rebootRequired: systemResult.data.response.rebootRequired,
|
rebootRequired: systemResult.data.response.rebootRequired,
|
||||||
availablePkgUpdates: systemResult.data.response.availablePkgUpdates,
|
availablePkgUpdates: systemResult.data.response.availablePkgUpdates,
|
||||||
cpuTemp: cpuTempResult.data.response.cputemp,
|
cpuTemp: cpuTempResult.success ? cpuTempResult.data.response.cputemp : undefined,
|
||||||
fileSystem,
|
fileSystem,
|
||||||
smart,
|
smart,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
},
|
},
|
||||||
"prettier": "@homarr/prettier-config",
|
"prettier": "@homarr/prettier-config",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ioredis": "5.4.2",
|
"ioredis": "5.5.0",
|
||||||
"superjson": "2.2.2",
|
"superjson": "2.2.2",
|
||||||
"winston": "3.17.0"
|
"winston": "3.17.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
"@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": "^7.16.2",
|
"@mantine/core": "^7.16.2",
|
||||||
"@tabler/icons-react": "^3.29.0",
|
"@tabler/icons-react": "^3.30.0",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"next": "15.1.6",
|
"next": "15.1.6",
|
||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@homarr/ui": "workspace:^0.1.0",
|
"@homarr/ui": "workspace:^0.1.0",
|
||||||
"@mantine/notifications": "^7.16.2",
|
"@mantine/notifications": "^7.16.2",
|
||||||
"@tabler/icons-react": "^3.29.0"
|
"@tabler/icons-react": "^3.30.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ const optionMapping: OptionMapping = {
|
|||||||
showSeconds: () => undefined,
|
showSeconds: () => undefined,
|
||||||
timezone: (oldOptions) => oldOptions.timezone,
|
timezone: (oldOptions) => oldOptions.timezone,
|
||||||
useCustomTimezone: () => true,
|
useCustomTimezone: () => true,
|
||||||
|
customTimeFormat: () => undefined,
|
||||||
|
customDateFormat: () => undefined,
|
||||||
},
|
},
|
||||||
downloads: {
|
downloads: {
|
||||||
activeTorrentThreshold: (oldOptions) =>
|
activeTorrentThreshold: (oldOptions) =>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
"@homarr/db": "workspace:^",
|
"@homarr/db": "workspace:^",
|
||||||
"@homarr/definitions": "workspace:^",
|
"@homarr/definitions": "workspace:^",
|
||||||
"@homarr/log": "workspace:^",
|
"@homarr/log": "workspace:^",
|
||||||
"ioredis": "5.4.2",
|
"ioredis": "5.5.0",
|
||||||
"superjson": "2.2.2"
|
"superjson": "2.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
"@homarr/log": "workspace:^0.1.0",
|
"@homarr/log": "workspace:^0.1.0",
|
||||||
"@homarr/redis": "workspace:^0.1.0",
|
"@homarr/redis": "workspace:^0.1.0",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"octokit": "^4.1.0",
|
"octokit": "^4.1.1",
|
||||||
"pretty-print-error": "^1.1.2",
|
"pretty-print-error": "^1.1.2",
|
||||||
"superjson": "2.2.2"
|
"superjson": "2.2.2"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -36,8 +36,8 @@
|
|||||||
"@mantine/core": "^7.16.2",
|
"@mantine/core": "^7.16.2",
|
||||||
"@mantine/hooks": "^7.16.2",
|
"@mantine/hooks": "^7.16.2",
|
||||||
"@mantine/spotlight": "^7.16.2",
|
"@mantine/spotlight": "^7.16.2",
|
||||||
"@tabler/icons-react": "^3.29.0",
|
"@tabler/icons-react": "^3.30.0",
|
||||||
"jotai": "^2.11.2",
|
"jotai": "^2.11.3",
|
||||||
"next": "15.1.6",
|
"next": "15.1.6",
|
||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
"react-dom": "19.0.0",
|
"react-dom": "19.0.0",
|
||||||
|
|||||||
@@ -2,237 +2,237 @@
|
|||||||
"init": {
|
"init": {
|
||||||
"step": {
|
"step": {
|
||||||
"start": {
|
"start": {
|
||||||
"title": "",
|
"title": "Us donem la benvinguda a Homarr",
|
||||||
"subtitle": "",
|
"subtitle": "Comencem configurant la vostra instància de Homarr.",
|
||||||
"description": "",
|
"description": "Per començar, seleccioneu com voleu configurar la vostra instància de Homarr.",
|
||||||
"action": {
|
"action": {
|
||||||
"scratch": "",
|
"scratch": "Comença des de zero",
|
||||||
"importOldmarr": ""
|
"importOldmarr": "Importa des d'una versió de Homarr anterior a 1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"title": "",
|
"title": "Importa dades",
|
||||||
"subtitle": "",
|
"subtitle": "Pot importar dades des d'una instància de Homarr existent.",
|
||||||
"dropzone": {
|
"dropzone": {
|
||||||
"title": "",
|
"title": "Arrossegueu el fitxer zip aquí o feu clic per navegar",
|
||||||
"description": ""
|
"description": "El fitxer zip carregat es processarà i podreu seleccionar què voleu importar"
|
||||||
},
|
},
|
||||||
"fileInfo": {
|
"fileInfo": {
|
||||||
"action": {
|
"action": {
|
||||||
"change": ""
|
"change": "Canvia el fitzer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"importSettings": {
|
"importSettings": {
|
||||||
"title": "",
|
"title": "Importa la configuració",
|
||||||
"description": ""
|
"description": "Configura el comportament d'importació"
|
||||||
},
|
},
|
||||||
"boardSelection": {
|
"boardSelection": {
|
||||||
"title": "",
|
"title": "S'han trobat {count} taulers",
|
||||||
"description": "",
|
"description": "Escolliu tots els taulers amb la mida que voleu importar",
|
||||||
"action": {
|
"action": {
|
||||||
"selectAll": "",
|
"selectAll": "Seleccionar-ho tot",
|
||||||
"unselectAll": ""
|
"unselectAll": "Anul·la la selecció"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"summary": {
|
"summary": {
|
||||||
"title": "",
|
"title": "Resum de la importació",
|
||||||
"description": "",
|
"description": "En el resum següent podeu veure el que s'importarà",
|
||||||
"action": {
|
"action": {
|
||||||
"import": ""
|
"import": "Confirma la importació i continua"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"apps": "",
|
"apps": "Aplicacions",
|
||||||
"boards": "",
|
"boards": "Tauler",
|
||||||
"integrations": "",
|
"integrations": "Integracions",
|
||||||
"credentialUsers": ""
|
"credentialUsers": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tokenModal": {
|
"tokenModal": {
|
||||||
"title": "",
|
"title": "Introduïu el token d'importació",
|
||||||
"field": {
|
"field": {
|
||||||
"token": {
|
"token": {
|
||||||
"label": "",
|
"label": "Token",
|
||||||
"description": ""
|
"description": "Introduïu el token d'importació mostrat a la instància prèvia de Homarr"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification": {
|
"notification": {
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "Token invàlid",
|
||||||
"message": ""
|
"message": "El token que heu introduït no és vàlid"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"title": "",
|
"title": "Usuari administrador",
|
||||||
"subtitle": "",
|
"subtitle": "Especifiqueu les credencials del vostre usuari administrador.",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "S'ha creat l'usuari",
|
||||||
"message": ""
|
"message": "L'usuari s'ha creat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": ""
|
"title": "S'ha produït un error al crear l'usuari"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"title": "",
|
"title": "Grup extern",
|
||||||
"subtitle": "",
|
"subtitle": "Especifiqueu el grup que s'ha d'utilitzar per als usuaris externs.",
|
||||||
"form": {
|
"form": {
|
||||||
"name": {
|
"name": {
|
||||||
"label": "",
|
"label": "Nom del grup",
|
||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "",
|
"title": "Configuració",
|
||||||
"subtitle": ""
|
"subtitle": "Configureu els paràmetres del servidor."
|
||||||
},
|
},
|
||||||
"finish": {
|
"finish": {
|
||||||
"title": "",
|
"title": "Finalitza la configuració",
|
||||||
"subtitle": "",
|
"subtitle": "Ja està tot llest!",
|
||||||
"description": "",
|
"description": "El procés de configuració s'ha completat correctament. Podeu començar a utilitzar Homarr. Escolliu la vostra propera acció:",
|
||||||
"action": {
|
"action": {
|
||||||
"goToBoard": "",
|
"goToBoard": "Ves al tauler {name}",
|
||||||
"createBoard": "",
|
"createBoard": "Creeu el vostre primer tauler",
|
||||||
"inviteUser": "",
|
"inviteUser": "Convideu altres usuaris",
|
||||||
"docs": ""
|
"docs": "Llegiu la documentació"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"backToStart": ""
|
"backToStart": "Torna a l'inici"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"title": "",
|
"title": "Usuaris",
|
||||||
"name": "",
|
"name": "Usuari",
|
||||||
"page": {
|
"page": {
|
||||||
"login": {
|
"login": {
|
||||||
"title": "",
|
"title": "Entreu al vostre compte",
|
||||||
"subtitle": ""
|
"subtitle": ""
|
||||||
},
|
},
|
||||||
"invite": {
|
"invite": {
|
||||||
"title": "",
|
"title": "Uneix-te a Homarr",
|
||||||
"subtitle": "",
|
"subtitle": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"init": {
|
"init": {
|
||||||
"title": "",
|
"title": "Nova instal·lació de Homarr",
|
||||||
"subtitle": ""
|
"subtitle": "Creeu l'usuari administrador inicial"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"field": {
|
"field": {
|
||||||
"email": {
|
"email": {
|
||||||
"label": "",
|
"label": "Adreça electrònica",
|
||||||
"verified": ""
|
"verified": "Verificat"
|
||||||
},
|
},
|
||||||
"username": {
|
"username": {
|
||||||
"label": ""
|
"label": "Nom d’usuari"
|
||||||
},
|
},
|
||||||
"password": {
|
"password": {
|
||||||
"label": "",
|
"label": "Contrasenya",
|
||||||
"requirement": {
|
"requirement": {
|
||||||
"length": "",
|
"length": "Inclou com a mínim 8 caràcters",
|
||||||
"lowercase": "",
|
"lowercase": "Inclou minúscules",
|
||||||
"uppercase": "",
|
"uppercase": "Inclou majúscules",
|
||||||
"number": "",
|
"number": "Inclou nombres",
|
||||||
"special": ""
|
"special": "Inclou símbols especials"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"passwordConfirm": {
|
"passwordConfirm": {
|
||||||
"label": ""
|
"label": "Confiremeu la contrasenya"
|
||||||
},
|
},
|
||||||
"previousPassword": {
|
"previousPassword": {
|
||||||
"label": ""
|
"label": "Contrasenya anterior"
|
||||||
},
|
},
|
||||||
"homeBoard": {
|
"homeBoard": {
|
||||||
"label": ""
|
"label": "Tauler principal"
|
||||||
},
|
},
|
||||||
"pingIconsEnabled": {
|
"pingIconsEnabled": {
|
||||||
"label": ""
|
"label": "Utilitza icones pels pings"
|
||||||
},
|
},
|
||||||
"defaultSearchEngine": {
|
"defaultSearchEngine": {
|
||||||
"label": ""
|
"label": "Motor de cerca principal"
|
||||||
},
|
},
|
||||||
"openSearchInNewTab": {
|
"openSearchInNewTab": {
|
||||||
"label": ""
|
"label": "Obre els resultats de la cerca en una pestanya nova"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"usernameTaken": ""
|
"usernameTaken": "El nom d’usuari ja està en ús"
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
"login": {
|
"login": {
|
||||||
"label": "",
|
"label": "Inicia la sessió",
|
||||||
"labelWith": "",
|
"labelWith": "Inicia la sessió amb {provider}",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Inici de sessió correcte",
|
||||||
"message": ""
|
"message": "Heu iniciat sessió"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "No s'ha pogut iniciar sessió",
|
||||||
"message": ""
|
"message": "No s'ha pogut iniciar la sessió"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"forgotPassword": {
|
"forgotPassword": {
|
||||||
"label": "",
|
"label": "Heu oblidat la contrasenya?",
|
||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"register": {
|
"register": {
|
||||||
"label": "",
|
"label": "Crear un compte",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "S'ha creat el compte",
|
||||||
"message": ""
|
"message": "Inicieu la sessió per continuar"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "La creació del compte ha fallat",
|
||||||
"message": ""
|
"message": "No s'ha pogut crear el compte"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"create": "",
|
"create": "Crea un usuari",
|
||||||
"changePassword": {
|
"changePassword": {
|
||||||
"label": "",
|
"label": "Canvia la contrasenya",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "La contrasenya s'ha canviat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": ""
|
"message": "No s'ha pogut canviar la contrasenya"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"changeHomeBoard": {
|
"changeHomeBoard": {
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "El tauler d'inici s'ha canviat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": ""
|
"message": "No 'ha pogut canviar el tauler d'inici"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"changeSearchPreferences": {
|
"changeSearchPreferences": {
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "Els paràmetres de cerca s'han canviat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": ""
|
"message": "No s'han pogut canviar els paràmetres de cerca"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"changeFirstDayOfWeek": {
|
"changeFirstDayOfWeek": {
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "Primer dia de la setmana establert correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": ""
|
"message": "No s'ha pogut canviar el primer dia de la setmana"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -248,29 +248,29 @@
|
|||||||
},
|
},
|
||||||
"manageAvatar": {
|
"manageAvatar": {
|
||||||
"changeImage": {
|
"changeImage": {
|
||||||
"label": "",
|
"label": "Canvia la imatge",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "La imatge s'ha canviat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": ""
|
"message": "No s'ha pogut canviar la imatge"
|
||||||
},
|
},
|
||||||
"toLarge": {
|
"toLarge": {
|
||||||
"title": "",
|
"title": "La imatge és massa gran",
|
||||||
"message": ""
|
"message": "La mida màxima de la imatge és {size}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"removeImage": {
|
"removeImage": {
|
||||||
"label": "",
|
"label": "Elimina la imatge",
|
||||||
"confirm": "",
|
"confirm": "Esteu segur que voleu eliminar la imatge?",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "La imatge s'ha eliminat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": ""
|
"message": "No s'ha pogut eliminar la imatge"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -278,104 +278,104 @@
|
|||||||
"editProfile": {
|
"editProfile": {
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "El perfil s'ha actualitzat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": ""
|
"message": "No s'ha pogut actualitzar el perfil"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"label": "",
|
"label": "Eliminar l'usuari permanentment",
|
||||||
"description": "",
|
"description": "Elimina l'usuari incloent les seves configuracions. Això no esborrarà cap tauler. No es notificarà l'usuari.",
|
||||||
"confirm": ""
|
"confirm": "Esteu segur que voleu eliminar l'usuari {username} i les seves configuracions?"
|
||||||
},
|
},
|
||||||
"select": {
|
"select": {
|
||||||
"label": "",
|
"label": "Seleccioneu l'usuari",
|
||||||
"notFound": ""
|
"notFound": "No s'ha trobat l'usuari"
|
||||||
},
|
},
|
||||||
"transfer": {
|
"transfer": {
|
||||||
"label": ""
|
"label": "Seleccioneu un nou propietari"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"title": "",
|
"title": "Grups",
|
||||||
"name": "",
|
"name": "Grup",
|
||||||
"search": "",
|
"search": "Troba un grup",
|
||||||
"field": {
|
"field": {
|
||||||
"name": "",
|
"name": "Nom",
|
||||||
"members": ""
|
"members": "Membres"
|
||||||
},
|
},
|
||||||
"permission": {
|
"permission": {
|
||||||
"admin": {
|
"admin": {
|
||||||
"title": "",
|
"title": "Administrador",
|
||||||
"item": {
|
"item": {
|
||||||
"admin": {
|
"admin": {
|
||||||
"label": "",
|
"label": "Administrador",
|
||||||
"description": ""
|
"description": "Els membres amb aquest permís tenen accés complet a totes les funcions i configuracions"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"app": {
|
"app": {
|
||||||
"title": "",
|
"title": "Aplicacions",
|
||||||
"item": {
|
"item": {
|
||||||
"create": {
|
"create": {
|
||||||
"label": "",
|
"label": "Crear aplicacions",
|
||||||
"description": ""
|
"description": "Permet que els membres crein aplicacions"
|
||||||
},
|
},
|
||||||
"use-all": {
|
"use-all": {
|
||||||
"label": "",
|
"label": "Utilitzar totes les aplicacions",
|
||||||
"description": ""
|
"description": "Permet que els membres afegeixin qualsevol aplicació als seus taulers"
|
||||||
},
|
},
|
||||||
"modify-all": {
|
"modify-all": {
|
||||||
"label": "",
|
"label": "Modificar totes les aplicacions",
|
||||||
"description": ""
|
"description": "Permet que els memebres modifiquin totes les aplicacions"
|
||||||
},
|
},
|
||||||
"full-all": {
|
"full-all": {
|
||||||
"label": "",
|
"label": "Accés complet a les aplicacions",
|
||||||
"description": ""
|
"description": "Permet que els membres gestionin, utilitzin i eliminin qualsevol aplicació"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"board": {
|
"board": {
|
||||||
"title": "",
|
"title": "Taulers",
|
||||||
"item": {
|
"item": {
|
||||||
"create": {
|
"create": {
|
||||||
"label": "",
|
"label": "Crear taulers",
|
||||||
"description": ""
|
"description": "Permet que els membres crein taulers"
|
||||||
},
|
},
|
||||||
"view-all": {
|
"view-all": {
|
||||||
"label": "",
|
"label": "Visualitzar tots els taulers",
|
||||||
"description": ""
|
"description": "Permet que els membres visualitzin tots els taulers"
|
||||||
},
|
},
|
||||||
"modify-all": {
|
"modify-all": {
|
||||||
"label": "",
|
"label": "Modificar tots els taulers",
|
||||||
"description": ""
|
"description": "Permet que els membres modifiquin tots els taulers (No inclou control d'accés ni zona de perill)"
|
||||||
},
|
},
|
||||||
"full-all": {
|
"full-all": {
|
||||||
"label": "",
|
"label": "Accés total a tots els taulers",
|
||||||
"description": ""
|
"description": "Permet que els membres visualitzin, modifiquin i esborrin tots els taulers (incloent-hi control d'accés i zona de perill)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"integration": {
|
"integration": {
|
||||||
"title": "",
|
"title": "Integracions",
|
||||||
"item": {
|
"item": {
|
||||||
"create": {
|
"create": {
|
||||||
"label": "",
|
"label": "Crear integracions",
|
||||||
"description": ""
|
"description": "Permet que els membres crein integracions"
|
||||||
},
|
},
|
||||||
"use-all": {
|
"use-all": {
|
||||||
"label": "",
|
"label": "Utilitzar totes les integracions",
|
||||||
"description": ""
|
"description": "Permet que els membres afegeixin qualsevol integració als seus taulers"
|
||||||
},
|
},
|
||||||
"interact-all": {
|
"interact-all": {
|
||||||
"label": "",
|
"label": "Interactuar amb qualsevol integració",
|
||||||
"description": ""
|
"description": "Permet que els usuaris interaccionin amb qualsevol integració"
|
||||||
},
|
},
|
||||||
"full-all": {
|
"full-all": {
|
||||||
"label": "",
|
"label": "Accés total a les integracions",
|
||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -518,140 +518,140 @@
|
|||||||
"title": "",
|
"title": "",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Creació correcta",
|
||||||
"message": ""
|
"message": "L'aplicació s'ha creat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "Creació fallida",
|
||||||
"message": ""
|
"message": "No s'ha pogut crear l'aplicació"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"title": "",
|
"title": "Edita l'aplicació",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Els canvis s'han aplicat correctament",
|
||||||
"message": ""
|
"message": "L'aplicació s'ha desat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "No s'han pogut aplicar els canvis",
|
||||||
"message": ""
|
"message": "L'aplicació no s'ha pogut desar"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "",
|
"title": "Elimina l'aplicació",
|
||||||
"message": "",
|
"message": "Esteu segur que voleu eliminar l'aplicació {name}?",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Eliminació correcta",
|
||||||
"message": ""
|
"message": "L'aplicació s'ha eliminat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "Eliminació fallida",
|
||||||
"message": ""
|
"message": "No s'ha pogut eliminar l'aplicació"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"field": {
|
"field": {
|
||||||
"name": {
|
"name": {
|
||||||
"label": ""
|
"label": "Nom"
|
||||||
},
|
},
|
||||||
"description": {
|
"description": {
|
||||||
"label": ""
|
"label": "Descripció"
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"label": ""
|
"label": "URL"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
"select": {
|
"select": {
|
||||||
"label": "",
|
"label": "Seleccioneu l'aplicació",
|
||||||
"notFound": ""
|
"notFound": "No s'ha trobat cap aplicació"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"integration": {
|
"integration": {
|
||||||
"page": {
|
"page": {
|
||||||
"list": {
|
"list": {
|
||||||
"title": "",
|
"title": "Integracions",
|
||||||
"search": "",
|
"search": "Cercar integracions",
|
||||||
"noResults": {
|
"noResults": {
|
||||||
"title": ""
|
"title": "Encara no hi ha cap integració"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "Nova integració de {name}",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Creació correcta",
|
||||||
"message": ""
|
"message": "La integració s'ha creat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "Creació fallida",
|
||||||
"message": ""
|
"message": "No s'ha pogut crear la integració"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"title": "",
|
"title": "Edita la integració de {name}",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Els canvis s'han aplicat correctament",
|
||||||
"message": ""
|
"message": "La integració s'ha desat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "No s'han pogut aplicar els canvis",
|
||||||
"message": ""
|
"message": "No s'ha pogut desar la integració"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "",
|
"title": "Elimina la integració",
|
||||||
"message": "",
|
"message": "Esteu segur que voleu eliminar la integració {name}?",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Eliminació correcta",
|
||||||
"message": ""
|
"message": "La integració s'ha eliminat correctament"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "Eliminació fallida",
|
||||||
"message": ""
|
"message": "No s'ha pogut eliminar la integració"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"field": {
|
"field": {
|
||||||
"name": {
|
"name": {
|
||||||
"label": ""
|
"label": "Nom"
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"label": ""
|
"label": "URL"
|
||||||
},
|
},
|
||||||
"attemptSearchEngineCreation": {
|
"attemptSearchEngineCreation": {
|
||||||
"label": "",
|
"label": "Crea un motor de cerca",
|
||||||
"description": ""
|
"description": "La integració \"{kind}\" es pot utilitzar amb els motors de cerca. Seleccioneu aquesta opció per configurar el motor de cerca automàticament."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
"create": ""
|
"create": "Nova integració"
|
||||||
},
|
},
|
||||||
"testConnection": {
|
"testConnection": {
|
||||||
"action": {
|
"action": {
|
||||||
"create": "",
|
"create": "Comprova la connexió i crea",
|
||||||
"edit": ""
|
"edit": "Comprova la connexió i desa"
|
||||||
},
|
},
|
||||||
"alertNotice": "",
|
"alertNotice": "El botó \"Desa\" s'habilita quan la connexió s'estableix correctament",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "S'ha connectat",
|
||||||
"message": ""
|
"message": "S'ha connectat correctament"
|
||||||
},
|
},
|
||||||
"invalidUrl": {
|
"invalidUrl": {
|
||||||
"title": "",
|
"title": "Adreça URL no vàlida",
|
||||||
"message": ""
|
"message": "L'adreça URL no és vàlida"
|
||||||
},
|
},
|
||||||
"secretNotDefined": {
|
"secretNotDefined": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "",
|
"apply": "",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "",
|
"create": "",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "",
|
"edit": "",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "",
|
"insert": "",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "",
|
"moveUp": "",
|
||||||
"moveDown": "",
|
"moveDown": "",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": ""
|
"changePosition": ""
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "应用",
|
"apply": "应用",
|
||||||
"backToOverview": "返回概览",
|
"backToOverview": "返回概览",
|
||||||
"create": "创建",
|
"create": "创建",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "编辑",
|
"edit": "编辑",
|
||||||
"import": "导入",
|
"import": "导入",
|
||||||
"insert": "插入",
|
"insert": "插入",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "上移",
|
"moveUp": "上移",
|
||||||
"moveDown": "下移",
|
"moveDown": "下移",
|
||||||
"createAbove": "上方新建分类",
|
"createAbove": "上方新建分类",
|
||||||
"createBelow": "下方新建分类"
|
"createBelow": "下方新建分类",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "新建分类",
|
"title": "新建分类",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "新建分类",
|
"create": "新建分类",
|
||||||
"changePosition": "换位"
|
"changePosition": "换位"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "日期格式",
|
"label": "日期格式",
|
||||||
"description": "日期应该是什么样的"
|
"description": "日期应该是什么样的"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "创建 API 令牌"
|
"createApiToken": "创建 API 令牌"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"createdBy": "创建者"
|
"createdBy": "创建者",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Použít",
|
"apply": "Použít",
|
||||||
"backToOverview": "Zpět na přehled",
|
"backToOverview": "Zpět na přehled",
|
||||||
"create": "Vytvořit",
|
"create": "Vytvořit",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Upravit",
|
"edit": "Upravit",
|
||||||
"import": "Importovat",
|
"import": "Importovat",
|
||||||
"insert": "Vložit",
|
"insert": "Vložit",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Posunout nahoru",
|
"moveUp": "Posunout nahoru",
|
||||||
"moveDown": "Posunout dolů",
|
"moveDown": "Posunout dolů",
|
||||||
"createAbove": "Nová kategorie nad",
|
"createAbove": "Nová kategorie nad",
|
||||||
"createBelow": "Nová kategorie pod"
|
"createBelow": "Nová kategorie pod",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nová kategorie",
|
"title": "Nová kategorie",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Nová kategorie",
|
"create": "Nová kategorie",
|
||||||
"changePosition": "Změnit pozici"
|
"changePosition": "Změnit pozici"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Formát data",
|
"label": "Formát data",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Anvend",
|
"apply": "Anvend",
|
||||||
"backToOverview": "Tilbage til oversigt",
|
"backToOverview": "Tilbage til oversigt",
|
||||||
"create": "Opret",
|
"create": "Opret",
|
||||||
|
"createAnother": "Opret og start forfra",
|
||||||
"edit": "Rediger",
|
"edit": "Rediger",
|
||||||
"import": "Importér",
|
"import": "Importér",
|
||||||
"insert": "Indsæt",
|
"insert": "Indsæt",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Flyt op",
|
"moveUp": "Flyt op",
|
||||||
"moveDown": "Flyt ned",
|
"moveDown": "Flyt ned",
|
||||||
"createAbove": "Ny kategori ovenover",
|
"createAbove": "Ny kategori ovenover",
|
||||||
"createBelow": "Ny kategori nedenunder"
|
"createBelow": "Ny kategori nedenunder",
|
||||||
|
"openAllInNewTabs": "Åbn alt i faneblade"
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Ny kategori",
|
"title": "Ny kategori",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Ny kategori",
|
"create": "Ny kategori",
|
||||||
"changePosition": "Ændre placering"
|
"changePosition": "Ændre placering"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "Åbn alt i faneblade",
|
||||||
|
"text": "Nogle browsere kan blokere bulk-åbning af faner af sikkerhedsmæssige årsager. Homarr kunne ikke åbne alle vinduer, fordi din browser blokerede denne handling. Tillad venligst \"Åbn pop op-vinduer\" og prøv igen."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Datoformat",
|
"label": "Datoformat",
|
||||||
"description": "Hvordan datoen skal se ud"
|
"description": "Hvordan datoen skal se ud"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "Brugerdefineret tidsformat",
|
||||||
|
"description": "Brug ISO 8601 til at formatere tid (dette vil tilsidesætte andre valgmuligheder)"
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "Brugerdefineret datoformat",
|
||||||
|
"description": "Brug ISO 8601 til at formatere dato (dette vil tilsidesætte andre valg)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "Opret API token"
|
"createApiToken": "Opret API token"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "Slet API token",
|
||||||
|
"text": "Dette vil permanent slette API-token. API-klienter der bruger dette token kan ikke længere godkende og udføre API-anmodninger. Denne handling kan ikke fortrydes."
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"createdBy": "Oprettet af"
|
"createdBy": "Oprettet af",
|
||||||
|
"actions": "Handlinger"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Übernehmen",
|
"apply": "Übernehmen",
|
||||||
"backToOverview": "Zurück zur Übersicht",
|
"backToOverview": "Zurück zur Übersicht",
|
||||||
"create": "Erstellen",
|
"create": "Erstellen",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Bearbeiten",
|
"edit": "Bearbeiten",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"insert": "Einfügen",
|
"insert": "Einfügen",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Nach oben bewegen",
|
"moveUp": "Nach oben bewegen",
|
||||||
"moveDown": "Nach unten bewegen",
|
"moveDown": "Nach unten bewegen",
|
||||||
"createAbove": "Neue Kategorie oben",
|
"createAbove": "Neue Kategorie oben",
|
||||||
"createBelow": "Neue Kategorie unten"
|
"createBelow": "Neue Kategorie unten",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Neue Kategorie",
|
"title": "Neue Kategorie",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Neue Kategorie",
|
"create": "Neue Kategorie",
|
||||||
"changePosition": "Position wechseln"
|
"changePosition": "Position wechseln"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Datumsformat",
|
"label": "Datumsformat",
|
||||||
"description": "Wie das Datum aussehen sollte"
|
"description": "Wie das Datum aussehen sollte"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "API Token erstellen"
|
"createApiToken": "API Token erstellen"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"createdBy": "Erstellt von"
|
"createdBy": "Erstellt von",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Εφαρμογή",
|
"apply": "Εφαρμογή",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Δημιουργία",
|
"create": "Δημιουργία",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Επεξεργασία",
|
"edit": "Επεξεργασία",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Εισαγωγή",
|
"insert": "Εισαγωγή",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Μετακίνηση επάνω",
|
"moveUp": "Μετακίνηση επάνω",
|
||||||
"moveDown": "Μετακίνηση κάτω",
|
"moveDown": "Μετακίνηση κάτω",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Αλλαγή θέσης"
|
"changePosition": "Αλλαγή θέσης"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "Αναγνωριστικό (ID)",
|
"id": "Αναγνωριστικό (ID)",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Apply",
|
"apply": "Apply",
|
||||||
"backToOverview": "Back to overview",
|
"backToOverview": "Back to overview",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
|
"createAnother": "Create and start over",
|
||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"insert": "Insert",
|
"insert": "Insert",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Move up",
|
"moveUp": "Move up",
|
||||||
"moveDown": "Move down",
|
"moveDown": "Move down",
|
||||||
"createAbove": "New category above",
|
"createAbove": "New category above",
|
||||||
"createBelow": "New category below"
|
"createBelow": "New category below",
|
||||||
|
"openAllInNewTabs": "Open all in tabs"
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "New category",
|
"title": "New category",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "New category",
|
"create": "New category",
|
||||||
"changePosition": "Change position"
|
"changePosition": "Change position"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "Open all in tabs",
|
||||||
|
"text": "Some browsers may block the bulk-opening of tabs for security reasons. Homarr was unable to open all windows, because your browser blocked this action. Please allow \"Open pop-up windows\" and re-try."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Date Format",
|
"label": "Date Format",
|
||||||
"description": "How the date should look like"
|
"description": "How the date should look like"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "Custom time format",
|
||||||
|
"description": "Use ISO 8601 to format time (this will override other options)"
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "Custom date format",
|
||||||
|
"description": "Use ISO 8601 to format date (this will override other options)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "Create API token"
|
"createApiToken": "Create API token"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "Delete API token",
|
||||||
|
"text": "This will permanently delete the API token. API clients using this token can no longer authenticate and perform API requests. This action cannot be undone."
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"createdBy": "Created by"
|
"createdBy": "Created by",
|
||||||
|
"actions": "Actions"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Aplicar",
|
"apply": "Aplicar",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Crear",
|
"create": "Crear",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Insertar",
|
"insert": "Insertar",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Mover hacia arriba",
|
"moveUp": "Mover hacia arriba",
|
||||||
"moveDown": "Mover hacia abajo",
|
"moveDown": "Mover hacia abajo",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Cambiar posición"
|
"changePosition": "Cambiar posición"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "",
|
"apply": "",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "",
|
"create": "",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "",
|
"edit": "",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "",
|
"insert": "",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "",
|
"moveUp": "",
|
||||||
"moveDown": "",
|
"moveDown": "",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": ""
|
"changePosition": ""
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Appliquer",
|
"apply": "Appliquer",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Créer",
|
"create": "Créer",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Modifier",
|
"edit": "Modifier",
|
||||||
"import": "Importer",
|
"import": "Importer",
|
||||||
"insert": "Insérer",
|
"insert": "Insérer",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Monter",
|
"moveUp": "Monter",
|
||||||
"moveDown": "Descendre",
|
"moveDown": "Descendre",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Modifier la position"
|
"changePosition": "Modifier la position"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
},
|
},
|
||||||
"boardSelection": {
|
"boardSelection": {
|
||||||
"title": "נמצאו {count} לוחות",
|
"title": "נמצאו {count} לוחות",
|
||||||
"description": "בחר את כל הלוחות שברצונך לייבא",
|
"description": "בחר את כל הלוחות עם הגודל שברצונך לייבא",
|
||||||
"action": {
|
"action": {
|
||||||
"selectAll": "בחר הכל",
|
"selectAll": "בחר הכל",
|
||||||
"unselectAll": "בטל את הבחירה בכולם"
|
"unselectAll": "בטל את הבחירה בכולם"
|
||||||
@@ -153,10 +153,10 @@
|
|||||||
"label": "השתמש בסמלים עבור פינגים"
|
"label": "השתמש בסמלים עבור פינגים"
|
||||||
},
|
},
|
||||||
"defaultSearchEngine": {
|
"defaultSearchEngine": {
|
||||||
"label": ""
|
"label": "מנוע חיפוש ברירת מחדל"
|
||||||
},
|
},
|
||||||
"openSearchInNewTab": {
|
"openSearchInNewTab": {
|
||||||
"label": ""
|
"label": "פתיחת תוצאות חיפוש בכרטיסיה חדשה"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
@@ -219,10 +219,10 @@
|
|||||||
"changeSearchPreferences": {
|
"changeSearchPreferences": {
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "העדפות חיפוש השתנו בהצלחה"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": ""
|
"message": "לא ניתן לשנות העדפות חיפוש"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "החל",
|
"apply": "החל",
|
||||||
"backToOverview": "חזרה לסקירה כללית",
|
"backToOverview": "חזרה לסקירה כללית",
|
||||||
"create": "צור",
|
"create": "צור",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "עריכה",
|
"edit": "עריכה",
|
||||||
"import": "ייבוא",
|
"import": "ייבוא",
|
||||||
"insert": "הוספה",
|
"insert": "הוספה",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "הזזה למעלה",
|
"moveUp": "הזזה למעלה",
|
||||||
"moveDown": "הזזה למטה",
|
"moveDown": "הזזה למטה",
|
||||||
"createAbove": "קטגוריה חדשה למעלה",
|
"createAbove": "קטגוריה חדשה למעלה",
|
||||||
"createBelow": "קטגוריה חדשה למטה"
|
"createBelow": "קטגוריה חדשה למטה",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "קטגוריה חדשה",
|
"title": "קטגוריה חדשה",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "קטגוריה חדשה",
|
"create": "קטגוריה חדשה",
|
||||||
"changePosition": "שנה מיקום"
|
"changePosition": "שנה מיקום"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "פורמט תאריך",
|
"label": "פורמט תאריך",
|
||||||
"description": "איך צריך להיראות התאריך"
|
"description": "איך צריך להיראות התאריך"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1374,11 +1388,11 @@
|
|||||||
"label": "טמפרטורה בפרנהייט"
|
"label": "טמפרטורה בפרנהייט"
|
||||||
},
|
},
|
||||||
"disableTemperatureDecimals": {
|
"disableTemperatureDecimals": {
|
||||||
"label": ""
|
"label": "ביטול טמפרטורה עשרונית"
|
||||||
},
|
},
|
||||||
"showCurrentWindSpeed": {
|
"showCurrentWindSpeed": {
|
||||||
"label": "",
|
"label": "הצגת מהירות רוח נוכחית",
|
||||||
"description": ""
|
"description": "רק במזג אוויר נוכחי"
|
||||||
},
|
},
|
||||||
"location": {
|
"location": {
|
||||||
"label": "מיקום מזג האוויר"
|
"label": "מיקום מזג האוויר"
|
||||||
@@ -1398,12 +1412,12 @@
|
|||||||
"description": "איך צריך להיראות התאריך"
|
"description": "איך צריך להיראות התאריך"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"currentWindSpeed": "",
|
"currentWindSpeed": "{currentWindSpeed} קמ״ש",
|
||||||
"dailyForecast": {
|
"dailyForecast": {
|
||||||
"sunrise": "",
|
"sunrise": "זריחה",
|
||||||
"sunset": "",
|
"sunset": "שקיעה",
|
||||||
"maxWindSpeed": "",
|
"maxWindSpeed": "מהירות רוח מקסימלית: {maxWindSpeed} קמ״ש",
|
||||||
"maxWindGusts": ""
|
"maxWindGusts": "משבי רוח מקסימלים: {maxWindGusts} קמ״ש"
|
||||||
},
|
},
|
||||||
"kind": {
|
"kind": {
|
||||||
"clear": "בהיר",
|
"clear": "בהיר",
|
||||||
@@ -2301,7 +2315,7 @@
|
|||||||
"mobile": "מכשיר נייד"
|
"mobile": "מכשיר נייד"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"search": "",
|
"search": "חיפוש",
|
||||||
"firstDayOfWeek": "היום הראשון בשבוע",
|
"firstDayOfWeek": "היום הראשון בשבוע",
|
||||||
"accessibility": "נגישות"
|
"accessibility": "נגישות"
|
||||||
}
|
}
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "יצירת מפתח API"
|
"createApiToken": "יצירת מפתח API"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "מספר מזהה",
|
"id": "מספר מזהה",
|
||||||
"createdBy": "נוצר על ידי"
|
"createdBy": "נוצר על ידי",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "",
|
"apply": "",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Stvoriti",
|
"create": "Stvoriti",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Uredi",
|
"edit": "Uredi",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "",
|
"insert": "",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Pomakni se gore",
|
"moveUp": "Pomakni se gore",
|
||||||
"moveDown": "Pomicati prema dolje",
|
"moveDown": "Pomicati prema dolje",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Promijenjen položaj"
|
"changePosition": "Promijenjen položaj"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "iskaznica",
|
"id": "iskaznica",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Alkalmaz",
|
"apply": "Alkalmaz",
|
||||||
"backToOverview": "Vissza az áttekintéshez",
|
"backToOverview": "Vissza az áttekintéshez",
|
||||||
"create": "Létrehozás",
|
"create": "Létrehozás",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Szerkesztés",
|
"edit": "Szerkesztés",
|
||||||
"import": "Importálás",
|
"import": "Importálás",
|
||||||
"insert": "Beillesztés",
|
"insert": "Beillesztés",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Felfelé mozgatás",
|
"moveUp": "Felfelé mozgatás",
|
||||||
"moveDown": "Mozgatás le",
|
"moveDown": "Mozgatás le",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Pozíció módosítása"
|
"changePosition": "Pozíció módosítása"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Dátum formátum",
|
"label": "Dátum formátum",
|
||||||
"description": "Hogyan nézzen ki a dátum"
|
"description": "Hogyan nézzen ki a dátum"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "Azonosító",
|
"id": "Azonosító",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Applica",
|
"apply": "Applica",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Crea",
|
"create": "Crea",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Modifica",
|
"edit": "Modifica",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Inserisci",
|
"insert": "Inserisci",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Sposta in alto",
|
"moveUp": "Sposta in alto",
|
||||||
"moveDown": "Sposta in basso",
|
"moveDown": "Sposta in basso",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Cambia posizione"
|
"changePosition": "Cambia posizione"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "適用",
|
"apply": "適用",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "作成",
|
"create": "作成",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "編集",
|
"edit": "編集",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "挿入",
|
"insert": "挿入",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "上に移動",
|
"moveUp": "上に移動",
|
||||||
"moveDown": "下へ移動",
|
"moveDown": "下へ移動",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "ポジションを変更する"
|
"changePosition": "ポジションを変更する"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "",
|
"apply": "",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "만들기",
|
"create": "만들기",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "수정",
|
"edit": "수정",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "",
|
"insert": "",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "위로 이동",
|
"moveUp": "위로 이동",
|
||||||
"moveDown": "아래로 이동",
|
"moveDown": "아래로 이동",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "위치 변경"
|
"changePosition": "위치 변경"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "",
|
"apply": "",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Sukurti",
|
"create": "Sukurti",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "",
|
"edit": "",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "",
|
"insert": "",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Pakelti aukštyn",
|
"moveUp": "Pakelti aukštyn",
|
||||||
"moveDown": "Perkelti žemyn",
|
"moveDown": "Perkelti žemyn",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": ""
|
"changePosition": ""
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Lietot",
|
"apply": "Lietot",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Izveidot",
|
"create": "Izveidot",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Rediģēt",
|
"edit": "Rediģēt",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Ievietot",
|
"insert": "Ievietot",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Virzīt augšup",
|
"moveUp": "Virzīt augšup",
|
||||||
"moveDown": "Virzīt lejup",
|
"moveDown": "Virzīt lejup",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Mainīt pozīciju"
|
"changePosition": "Mainīt pozīciju"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Toepassen",
|
"apply": "Toepassen",
|
||||||
"backToOverview": "Terug naar overzicht",
|
"backToOverview": "Terug naar overzicht",
|
||||||
"create": "Aanmaken",
|
"create": "Aanmaken",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Bewerken",
|
"edit": "Bewerken",
|
||||||
"import": "Importeren",
|
"import": "Importeren",
|
||||||
"insert": "Invoegen",
|
"insert": "Invoegen",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Omhoog",
|
"moveUp": "Omhoog",
|
||||||
"moveDown": "Omlaag",
|
"moveDown": "Omlaag",
|
||||||
"createAbove": "Nieuwe categorie hierboven",
|
"createAbove": "Nieuwe categorie hierboven",
|
||||||
"createBelow": "Nieuwe categorie hieronder"
|
"createBelow": "Nieuwe categorie hieronder",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nieuwe categorie",
|
"title": "Nieuwe categorie",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Nieuwe categorie",
|
"create": "Nieuwe categorie",
|
||||||
"changePosition": "Positie wijzigen"
|
"changePosition": "Positie wijzigen"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Datumnotatie",
|
"label": "Datumnotatie",
|
||||||
"description": "Hoe de datum eruit moet zien"
|
"description": "Hoe de datum eruit moet zien"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "API-token aanmaken"
|
"createApiToken": "API-token aanmaken"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"createdBy": "Aangemaakt door"
|
"createdBy": "Aangemaakt door",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Zastosuj",
|
"apply": "Zastosuj",
|
||||||
"backToOverview": "Powrót do widoku ogólnego",
|
"backToOverview": "Powrót do widoku ogólnego",
|
||||||
"create": "Utwórz",
|
"create": "Utwórz",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Edytuj",
|
"edit": "Edytuj",
|
||||||
"import": "Importuj",
|
"import": "Importuj",
|
||||||
"insert": "Wstaw",
|
"insert": "Wstaw",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Przenieś w górę",
|
"moveUp": "Przenieś w górę",
|
||||||
"moveDown": "Przenieś w dół",
|
"moveDown": "Przenieś w dół",
|
||||||
"createAbove": "Nowa kategoria powyżej",
|
"createAbove": "Nowa kategoria powyżej",
|
||||||
"createBelow": "Nowa kategoria poniżej"
|
"createBelow": "Nowa kategoria poniżej",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nowa kategoria",
|
"title": "Nowa kategoria",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Nowa kategoria",
|
"create": "Nowa kategoria",
|
||||||
"changePosition": "Zmiana pozycji"
|
"changePosition": "Zmiana pozycji"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Format daty",
|
"label": "Format daty",
|
||||||
"description": "Jak powinna wyglądać data"
|
"description": "Jak powinna wyglądać data"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Aplicar",
|
"apply": "Aplicar",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Criar",
|
"create": "Criar",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Inserir",
|
"insert": "Inserir",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Subir",
|
"moveUp": "Subir",
|
||||||
"moveDown": "Mover para baixo",
|
"moveDown": "Mover para baixo",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Mudar de posição"
|
"changePosition": "Mudar de posição"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Aplică",
|
"apply": "Aplică",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Creează",
|
"create": "Creează",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Editare",
|
"edit": "Editare",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Introdu",
|
"insert": "Introdu",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Mută în sus",
|
"moveUp": "Mută în sus",
|
||||||
"moveDown": "Mută în jos",
|
"moveDown": "Mută în jos",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Schimbă locația"
|
"changePosition": "Schimbă locația"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Применить",
|
"apply": "Применить",
|
||||||
"backToOverview": "Вернуться к обзору",
|
"backToOverview": "Вернуться к обзору",
|
||||||
"create": "Создать",
|
"create": "Создать",
|
||||||
|
"createAnother": "Создать и начать заново",
|
||||||
"edit": "Редактировать",
|
"edit": "Редактировать",
|
||||||
"import": "Импортировать",
|
"import": "Импортировать",
|
||||||
"insert": "Вставить",
|
"insert": "Вставить",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Переместить вверх",
|
"moveUp": "Переместить вверх",
|
||||||
"moveDown": "Переместить вниз",
|
"moveDown": "Переместить вниз",
|
||||||
"createAbove": "Создать категорию выше",
|
"createAbove": "Создать категорию выше",
|
||||||
"createBelow": "Создать категорию ниже"
|
"createBelow": "Создать категорию ниже",
|
||||||
|
"openAllInNewTabs": "Открыть все во вкладках"
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Новая категория",
|
"title": "Новая категория",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Новая категория",
|
"create": "Новая категория",
|
||||||
"changePosition": "Изменить позицию"
|
"changePosition": "Изменить позицию"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "Открыть все во вкладках",
|
||||||
|
"text": "Некоторые браузеры могут блокировать широкое открытие вкладок по соображениям безопасности. Homarr не смог открыть все окна, потому что ваш браузер заблокировал это действие. Пожалуйста, разрешите \"Открыть всплывающие окна\" и повторите попытку."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Формат даты",
|
"label": "Формат даты",
|
||||||
"description": "Как должна выглядеть дата"
|
"description": "Как должна выглядеть дата"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "Пользовательский формат времени",
|
||||||
|
"description": "Использовать ISO 8601 для форматирования времени (это переопределит другие параметры)"
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "Пользовательский формат даты",
|
||||||
|
"description": "Использовать ISO 8601 для форматирования даты (это переопределит другие параметры)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1374,11 +1388,11 @@
|
|||||||
"label": "Температура в градусах Фаренгейта"
|
"label": "Температура в градусах Фаренгейта"
|
||||||
},
|
},
|
||||||
"disableTemperatureDecimals": {
|
"disableTemperatureDecimals": {
|
||||||
"label": ""
|
"label": "Отключить десятичные дроби у температур"
|
||||||
},
|
},
|
||||||
"showCurrentWindSpeed": {
|
"showCurrentWindSpeed": {
|
||||||
"label": "",
|
"label": "Показать текущую скорость ветра",
|
||||||
"description": ""
|
"description": "Только при текущей погоде"
|
||||||
},
|
},
|
||||||
"location": {
|
"location": {
|
||||||
"label": "Местоположение"
|
"label": "Местоположение"
|
||||||
@@ -1398,12 +1412,12 @@
|
|||||||
"description": "Как должна отображаться дата"
|
"description": "Как должна отображаться дата"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"currentWindSpeed": "",
|
"currentWindSpeed": "{currentWindSpeed} км/ч",
|
||||||
"dailyForecast": {
|
"dailyForecast": {
|
||||||
"sunrise": "",
|
"sunrise": "Восход",
|
||||||
"sunset": "",
|
"sunset": "Закат",
|
||||||
"maxWindSpeed": "",
|
"maxWindSpeed": "Максимальная скорость ветра: {maxWindSpeed} км/ч",
|
||||||
"maxWindGusts": ""
|
"maxWindGusts": "Максимальные порывы ветра: {maxWindGusts} км/ч"
|
||||||
},
|
},
|
||||||
"kind": {
|
"kind": {
|
||||||
"clear": "Ясно",
|
"clear": "Ясно",
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "Создать API-токен"
|
"createApiToken": "Создать API-токен"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "Удалить API-токен",
|
||||||
|
"text": "Это навсегда удалит API токен. API клиенты с помощью этого токена больше не могут аутентифицировать и выполнить API запросы. Это действие нельзя отменить."
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"createdBy": "Создан пользователем"
|
"createdBy": "Создан пользователем",
|
||||||
|
"actions": "Действия"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Použiť",
|
"apply": "Použiť",
|
||||||
"backToOverview": "Späť na prehľad",
|
"backToOverview": "Späť na prehľad",
|
||||||
"create": "Vytvoriť",
|
"create": "Vytvoriť",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Upraviť",
|
"edit": "Upraviť",
|
||||||
"import": "Importovať",
|
"import": "Importovať",
|
||||||
"insert": "Vložiť",
|
"insert": "Vložiť",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Posunúť nahor",
|
"moveUp": "Posunúť nahor",
|
||||||
"moveDown": "Posunúť nadol",
|
"moveDown": "Posunúť nadol",
|
||||||
"createAbove": "Nová kategória vyššie",
|
"createAbove": "Nová kategória vyššie",
|
||||||
"createBelow": "Nová kategória nižšie"
|
"createBelow": "Nová kategória nižšie",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nová kategória",
|
"title": "Nová kategória",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Nová kategória",
|
"create": "Nová kategória",
|
||||||
"changePosition": "Zmeniť pozíciu"
|
"changePosition": "Zmeniť pozíciu"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Formát Dátumu",
|
"label": "Formát Dátumu",
|
||||||
"description": "Ako by mal dátum vyzerať"
|
"description": "Ako by mal dátum vyzerať"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "Vytvorte token API"
|
"createApiToken": "Vytvorte token API"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"createdBy": "Vytvoril/a"
|
"createdBy": "Vytvoril/a",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Uporabi",
|
"apply": "Uporabi",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Ustvarite spletno stran",
|
"create": "Ustvarite spletno stran",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Uredi",
|
"edit": "Uredi",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Vstavite",
|
"insert": "Vstavite",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Premaknite se navzgor",
|
"moveUp": "Premaknite se navzgor",
|
||||||
"moveDown": "Premaknite se navzdol",
|
"moveDown": "Premaknite se navzdol",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Spremeni položaj"
|
"changePosition": "Spremeni položaj"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Verkställ",
|
"apply": "Verkställ",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Skapa",
|
"create": "Skapa",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Redigera",
|
"edit": "Redigera",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Infoga",
|
"insert": "Infoga",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Flytta uppåt",
|
"moveUp": "Flytta uppåt",
|
||||||
"moveDown": "Flytta nedåt",
|
"moveDown": "Flytta nedåt",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Ändra position"
|
"changePosition": "Ändra position"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Uygula",
|
"apply": "Uygula",
|
||||||
"backToOverview": "Genel bakışa dön",
|
"backToOverview": "Genel bakışa dön",
|
||||||
"create": "Oluştur",
|
"create": "Oluştur",
|
||||||
|
"createAnother": "Kaydet ve Yeni Oluştur",
|
||||||
"edit": "Düzenle",
|
"edit": "Düzenle",
|
||||||
"import": "İçe aktar",
|
"import": "İçe aktar",
|
||||||
"insert": "Ekle",
|
"insert": "Ekle",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Yukarı taşı",
|
"moveUp": "Yukarı taşı",
|
||||||
"moveDown": "Aşağı taşı",
|
"moveDown": "Aşağı taşı",
|
||||||
"createAbove": "Yukarı Yeni Kategori",
|
"createAbove": "Yukarı Yeni Kategori",
|
||||||
"createBelow": "Aşağı Yeni Kategori"
|
"createBelow": "Aşağı Yeni Kategori",
|
||||||
|
"openAllInNewTabs": "Tümünü sekmelerde aç"
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Yeni Kategori",
|
"title": "Yeni Kategori",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Yeni Kategori",
|
"create": "Yeni Kategori",
|
||||||
"changePosition": "Pozisyonu değiştir"
|
"changePosition": "Pozisyonu değiştir"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "Tümünü sekmelerde aç",
|
||||||
|
"text": "Bazı tarayıcılar güvenlik nedeniyle sekmelerin toplu olarak açılmasını engelleyebilir. Homarr tüm pencereleri açamadı, çünkü tarayıcınız bu eylemi engelledi. Lütfen \"Açılır pencereleri aç\"a izin verin ve tekrar deneyin."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1166,21 +1172,21 @@
|
|||||||
"description": "Geçerli tarih ve saati görüntüler.",
|
"description": "Geçerli tarih ve saati görüntüler.",
|
||||||
"option": {
|
"option": {
|
||||||
"customTitleToggle": {
|
"customTitleToggle": {
|
||||||
"label": "Özel Başlık/Şehir gösterimi",
|
"label": "Özel Başlık/Şehir göster",
|
||||||
"description": "Saatin üstüne özel bir başlık veya şehir/ülke adını ekleyin."
|
"description": "Saatin üstüne özel bir başlık veya şehir/ülke adı ekleminizi sağlar."
|
||||||
},
|
},
|
||||||
"customTitle": {
|
"customTitle": {
|
||||||
"label": "Başlık"
|
"label": "Başlık"
|
||||||
},
|
},
|
||||||
"is24HourFormat": {
|
"is24HourFormat": {
|
||||||
"label": "24 saatlik format",
|
"label": "24 saatlik biçim",
|
||||||
"description": "12 saatlik format yerine 24 saatlik formatı kullanın"
|
"description": "12 saatlik format yerine 24 saatlik biçimi kullanın"
|
||||||
},
|
},
|
||||||
"showSeconds": {
|
"showSeconds": {
|
||||||
"label": "Saniyeleri görüntüle"
|
"label": "Saniyeleri göster"
|
||||||
},
|
},
|
||||||
"useCustomTimezone": {
|
"useCustomTimezone": {
|
||||||
"label": "Sabit bir zaman dilimi kullanın"
|
"label": "Sabit zaman dilimi kullan"
|
||||||
},
|
},
|
||||||
"timezone": {
|
"timezone": {
|
||||||
"label": "Saat dilimi",
|
"label": "Saat dilimi",
|
||||||
@@ -1191,7 +1197,15 @@
|
|||||||
},
|
},
|
||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Tarih Biçimi",
|
"label": "Tarih Biçimi",
|
||||||
"description": "Tarihin nasıl görüneceği"
|
"description": "Görüntülenecek tarihin biçimi"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "Özel zaman biçimi",
|
||||||
|
"description": "Zaman biçimini değiştirmek için ISO 8601 standardını kullanın (bu diğer seçenekleri geçersiz kılacaktır)"
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "Özel tarih biçimi",
|
||||||
|
"description": "Tarih biçimini değiştirmek için ISO 8601 standardını kullanın (bu diğer seçenekleri geçersiz kılacaktır)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1354,8 +1368,8 @@
|
|||||||
"label": "Radarr yayın türü",
|
"label": "Radarr yayın türü",
|
||||||
"options": {
|
"options": {
|
||||||
"inCinemas": "Sinemalarda",
|
"inCinemas": "Sinemalarda",
|
||||||
"digitalRelease": "Dijital sürüm",
|
"digitalRelease": "Dijital Yayın",
|
||||||
"physicalRelease": "Fiziksel Yayınlanan"
|
"physicalRelease": "Fiziksel Yayın"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"filterPastMonths": {
|
"filterPastMonths": {
|
||||||
@@ -1374,7 +1388,7 @@
|
|||||||
"label": "Fahrenheit cinsinden sıcaklık"
|
"label": "Fahrenheit cinsinden sıcaklık"
|
||||||
},
|
},
|
||||||
"disableTemperatureDecimals": {
|
"disableTemperatureDecimals": {
|
||||||
"label": "Sıcaklık ondalıklarını devre dışı bırak"
|
"label": "Sıcaklıklarda ondalıkları gösterme"
|
||||||
},
|
},
|
||||||
"showCurrentWindSpeed": {
|
"showCurrentWindSpeed": {
|
||||||
"label": "Mevcut rüzgar hızını göster",
|
"label": "Mevcut rüzgar hızını göster",
|
||||||
@@ -1395,7 +1409,7 @@
|
|||||||
},
|
},
|
||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Tarih Biçimi",
|
"label": "Tarih Biçimi",
|
||||||
"description": "Tarihin nasıl görüneceği"
|
"description": "Görüntülenecek tarihin biçimi"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"currentWindSpeed": "{currentWindSpeed} km/s",
|
"currentWindSpeed": "{currentWindSpeed} km/s",
|
||||||
@@ -1403,22 +1417,22 @@
|
|||||||
"sunrise": "Gün Doğumu",
|
"sunrise": "Gün Doğumu",
|
||||||
"sunset": "Gün Batımı",
|
"sunset": "Gün Batımı",
|
||||||
"maxWindSpeed": "Maks. Rüzgar Hızı: {maxWindSpeed} km/s",
|
"maxWindSpeed": "Maks. Rüzgar Hızı: {maxWindSpeed} km/s",
|
||||||
"maxWindGusts": "Maks. Rüzgar Hamlesi: {maxWindGusts} km/h"
|
"maxWindGusts": "Maks. Rüzgar Hamlesi: {maxWindGusts} km/s"
|
||||||
},
|
},
|
||||||
"kind": {
|
"kind": {
|
||||||
"clear": "Temiz",
|
"clear": "Açık",
|
||||||
"mainlyClear": "Genel olarak açık",
|
"mainlyClear": "Genel olarak açık",
|
||||||
"fog": "Sis",
|
"fog": "Sisli",
|
||||||
"drizzle": "Çiseleme",
|
"drizzle": "Çiseleme",
|
||||||
"freezingDrizzle": "Soğuk çiseleme",
|
"freezingDrizzle": "Donan Çisenti",
|
||||||
"rain": "Yağmur",
|
"rain": "Yağmur",
|
||||||
"freezingRain": "Dondurucu yağmur",
|
"freezingRain": "Donan Yağmur",
|
||||||
"snowFall": "Kar yağışı",
|
"snowFall": "Kar Yağış",
|
||||||
"snowGrains": "Kar taneleri",
|
"snowGrains": "Donmuş Kar",
|
||||||
"rainShowers": "Sağanak yağmur",
|
"rainShowers": "Sağanak Yağmur",
|
||||||
"snowShowers": "Kar yağışı",
|
"snowShowers": "Kar Yağışlı",
|
||||||
"thunderstorm": "Fırtına",
|
"thunderstorm": "Fırtına",
|
||||||
"thunderstormWithHail": "Fırtına ve dolu",
|
"thunderstormWithHail": "Dolu Yağışlı Fırtına",
|
||||||
"unknown": "Bilinmeyen"
|
"unknown": "Bilinmeyen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1710,7 +1724,7 @@
|
|||||||
"completed": "Tamamlanan",
|
"completed": "Tamamlanan",
|
||||||
"failed": "Başarısız",
|
"failed": "Başarısız",
|
||||||
"processing": "İşlemde",
|
"processing": "İşlemde",
|
||||||
"leeching": "Leechleme",
|
"leeching": "Aranıyor",
|
||||||
"stalled": "Durduruldu",
|
"stalled": "Durduruldu",
|
||||||
"unknown": "Bilinmeyen",
|
"unknown": "Bilinmeyen",
|
||||||
"seeding": "Seed ediliyor"
|
"seeding": "Seed ediliyor"
|
||||||
@@ -2148,8 +2162,8 @@
|
|||||||
"homeBoard": {
|
"homeBoard": {
|
||||||
"title": "Öntanımlı Panel Yapılandırılmadı",
|
"title": "Öntanımlı Panel Yapılandırılmadı",
|
||||||
"admin": {
|
"admin": {
|
||||||
"description": "Sunucu için henüz bir ana sayfa paneli belirlemediniz.",
|
"description": "Sunucu için henüz öntanımlı panel belirlemediniz.",
|
||||||
"link": "Sunucu geneli için ana panel yapılandırın",
|
"link": "Sunucu geneli için öntanımlı panel atayın",
|
||||||
"notice": "Bu sayfayı tüm kullanıcılardan gizlemek için sunucu için bir ana panel ayarlayın"
|
"notice": "Bu sayfayı tüm kullanıcılardan gizlemek için sunucu için bir ana panel ayarlayın"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
@@ -2459,8 +2473,8 @@
|
|||||||
"board": {
|
"board": {
|
||||||
"title": "Paneller",
|
"title": "Paneller",
|
||||||
"homeBoard": {
|
"homeBoard": {
|
||||||
"label": "Genel Ana Sayfa Paneli",
|
"label": "Genel öntanımlı panel",
|
||||||
"mobileLabel": "Genel Mobil Panel",
|
"mobileLabel": "Genel öntanımlı mobil panel",
|
||||||
"description": "Seçim yalnızca herkese açık paneller için kullanılabilir"
|
"description": "Seçim yalnızca herkese açık paneller için kullanılabilir"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "API token'ı oluştur"
|
"createApiToken": "API token'ı oluştur"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "API belirtecini sil",
|
||||||
|
"text": "Bu, API belirtecini kalıcı olarak silecektir. Bu belirteci kullanan API istemcileri artık kimlik doğrulaması yapamaz ve API istekleri gerçekleştiremez. Bu eylem geri alınamaz."
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "Kimlik",
|
"id": "Kimlik",
|
||||||
"createdBy": "Tarafından oluşturuldu"
|
"createdBy": "Tarafından oluşturuldu",
|
||||||
|
"actions": "Eylemler"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
"title": "Введіть токен імпорту",
|
"title": "Введіть токен імпорту",
|
||||||
"field": {
|
"field": {
|
||||||
"token": {
|
"token": {
|
||||||
"label": "Токен.",
|
"label": "Токен",
|
||||||
"description": "Введіть показаний токен імпорту з вашого попереднього екземпляра homarr"
|
"description": "Введіть показаний токен імпорту з вашого попереднього екземпляра homarr"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -219,7 +219,7 @@
|
|||||||
"changeSearchPreferences": {
|
"changeSearchPreferences": {
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"message": ""
|
"message": "Налаштування пошуку успішно змінено"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Не вдалося змінити налаштування пошуку"
|
"message": "Не вдалося змінити налаштування пошуку"
|
||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Застосувати",
|
"apply": "Застосувати",
|
||||||
"backToOverview": "Назад до огляду",
|
"backToOverview": "Назад до огляду",
|
||||||
"create": "Створити",
|
"create": "Створити",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Редагувати",
|
"edit": "Редагувати",
|
||||||
"import": "Імпорт",
|
"import": "Імпорт",
|
||||||
"insert": "Вставити",
|
"insert": "Вставити",
|
||||||
@@ -877,7 +878,7 @@
|
|||||||
"switchToDarkMode": "Перемикнути на темну тему",
|
"switchToDarkMode": "Перемикнути на темну тему",
|
||||||
"switchToLightMode": "Перемикнути на світлу тему",
|
"switchToLightMode": "Перемикнути на світлу тему",
|
||||||
"management": "Управління",
|
"management": "Управління",
|
||||||
"preferences": "Ваші уподобання",
|
"preferences": "Ваші налаштування",
|
||||||
"logout": "Вийти",
|
"logout": "Вийти",
|
||||||
"login": "Логін",
|
"login": "Логін",
|
||||||
"homeBoard": "Ваша домашня дошка",
|
"homeBoard": "Ваша домашня дошка",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Перемістити вгору",
|
"moveUp": "Перемістити вгору",
|
||||||
"moveDown": "Перемістити вниз",
|
"moveDown": "Перемістити вниз",
|
||||||
"createAbove": "Нові категорії зверху",
|
"createAbove": "Нові категорії зверху",
|
||||||
"createBelow": "Нова категорія знизу"
|
"createBelow": "Нова категорія знизу",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Нова категорія",
|
"title": "Нова категорія",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "Нова категорія",
|
"create": "Нова категорія",
|
||||||
"changePosition": "Змінити положення"
|
"changePosition": "Змінити положення"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "Формат дати",
|
"label": "Формат дати",
|
||||||
"description": "Як має виглядати дата"
|
"description": "Як має виглядати дата"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1424,10 +1438,10 @@
|
|||||||
},
|
},
|
||||||
"indexerManager": {
|
"indexerManager": {
|
||||||
"name": "Статус менеджера індексування",
|
"name": "Статус менеджера індексування",
|
||||||
"description": "",
|
"description": "Статус ваших індексаторів",
|
||||||
"option": {
|
"option": {
|
||||||
"openIndexerSiteInNewTab": {
|
"openIndexerSiteInNewTab": {
|
||||||
"label": ""
|
"label": "Відкрити сайт індексатора у новій вкладці"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"title": "Менеджер індексації",
|
"title": "Менеджер індексації",
|
||||||
@@ -2072,14 +2086,14 @@
|
|||||||
"title": ""
|
"title": ""
|
||||||
},
|
},
|
||||||
"access": {
|
"access": {
|
||||||
"title": "",
|
"title": "Управління доступом",
|
||||||
"permission": {
|
"permission": {
|
||||||
"item": {
|
"item": {
|
||||||
"view": {
|
"view": {
|
||||||
"label": "Перегляд дошки"
|
"label": "Перегляд дошки"
|
||||||
},
|
},
|
||||||
"modify": {
|
"modify": {
|
||||||
"label": ""
|
"label": "Змінювати дошку"
|
||||||
},
|
},
|
||||||
"full": {
|
"full": {
|
||||||
"label": "Повний доступ"
|
"label": "Повний доступ"
|
||||||
@@ -2297,7 +2311,7 @@
|
|||||||
"board": {
|
"board": {
|
||||||
"title": "Домашня дошка",
|
"title": "Домашня дошка",
|
||||||
"type": {
|
"type": {
|
||||||
"general": "",
|
"general": "Загальна",
|
||||||
"mobile": "Мобільна"
|
"mobile": "Мобільна"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2336,7 +2350,7 @@
|
|||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"review": {
|
"review": {
|
||||||
"label": ""
|
"label": "Огляд"
|
||||||
},
|
},
|
||||||
"completed": {
|
"completed": {
|
||||||
"title": "Користувача створено"
|
"title": "Користувача створено"
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "Створити API токен"
|
"createApiToken": "Створити API токен"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ІДЕНТИФІКАТОР",
|
"id": "ІДЕНТИФІКАТОР",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2720,10 +2741,10 @@
|
|||||||
"permission": {
|
"permission": {
|
||||||
"title": "Дозволи",
|
"title": "Дозволи",
|
||||||
"userSelect": {
|
"userSelect": {
|
||||||
"title": ""
|
"title": "Додати дозвіл для користувача"
|
||||||
},
|
},
|
||||||
"groupSelect": {
|
"groupSelect": {
|
||||||
"title": ""
|
"title": "Додати дозвіл для групи"
|
||||||
},
|
},
|
||||||
"tab": {
|
"tab": {
|
||||||
"user": "Користувачі",
|
"user": "Користувачі",
|
||||||
@@ -2738,12 +2759,12 @@
|
|||||||
"label": "Група"
|
"label": "Група"
|
||||||
},
|
},
|
||||||
"permission": {
|
"permission": {
|
||||||
"label": ""
|
"label": "Дозвіл"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
"saveUser": "",
|
"saveUser": "Зберегти дозвіл користувача",
|
||||||
"saveGroup": ""
|
"saveGroup": "Зберегти дозвіл групи"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"navigationStructure": {
|
"navigationStructure": {
|
||||||
@@ -2753,7 +2774,7 @@
|
|||||||
"label": "Дошки"
|
"label": "Дошки"
|
||||||
},
|
},
|
||||||
"integrations": {
|
"integrations": {
|
||||||
"label": "",
|
"label": "Інтеграції",
|
||||||
"edit": {
|
"edit": {
|
||||||
"label": "Редагувати"
|
"label": "Редагувати"
|
||||||
},
|
},
|
||||||
@@ -2762,7 +2783,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"search-engines": {
|
"search-engines": {
|
||||||
"label": "",
|
"label": "Пошукові системи",
|
||||||
"new": {
|
"new": {
|
||||||
"label": ""
|
"label": ""
|
||||||
},
|
},
|
||||||
@@ -2771,7 +2792,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"medias": {
|
"medias": {
|
||||||
"label": ""
|
"label": "Медіа"
|
||||||
},
|
},
|
||||||
"apps": {
|
"apps": {
|
||||||
"label": "Додатки",
|
"label": "Додатки",
|
||||||
@@ -2791,7 +2812,7 @@
|
|||||||
"security": "Безпека",
|
"security": "Безпека",
|
||||||
"board": "Дошки",
|
"board": "Дошки",
|
||||||
"groups": {
|
"groups": {
|
||||||
"label": ""
|
"label": "Групи"
|
||||||
},
|
},
|
||||||
"invites": {
|
"invites": {
|
||||||
"label": "Запрошення"
|
"label": "Запрошення"
|
||||||
@@ -2800,13 +2821,13 @@
|
|||||||
"tools": {
|
"tools": {
|
||||||
"label": "Інструменти",
|
"label": "Інструменти",
|
||||||
"docker": {
|
"docker": {
|
||||||
"label": ""
|
"label": "Докер"
|
||||||
},
|
},
|
||||||
"logs": {
|
"logs": {
|
||||||
"label": ""
|
"label": "Логи"
|
||||||
},
|
},
|
||||||
"certificates": {
|
"certificates": {
|
||||||
"label": ""
|
"label": "Сертифікати"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
@@ -2819,7 +2840,7 @@
|
|||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"placeholder": "",
|
"placeholder": "",
|
||||||
"nothingFound": "",
|
"nothingFound": "Нічого не знайдено",
|
||||||
"error": {
|
"error": {
|
||||||
"fetch": ""
|
"fetch": ""
|
||||||
},
|
},
|
||||||
@@ -2835,7 +2856,7 @@
|
|||||||
"label": "Відкрити посилання на додаток"
|
"label": "Відкрити посилання на додаток"
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"label": ""
|
"label": "Редагувати додаток"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"detail": {
|
"detail": {
|
||||||
@@ -2851,10 +2872,10 @@
|
|||||||
"label": "Відкрити дошку"
|
"label": "Відкрити дошку"
|
||||||
},
|
},
|
||||||
"homeBoard": {
|
"homeBoard": {
|
||||||
"label": ""
|
"label": "Встановити як домашню дошку"
|
||||||
},
|
},
|
||||||
"mobileBoard": {
|
"mobileBoard": {
|
||||||
"label": ""
|
"label": "Встановити як мобільну дошку"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"label": "Відкрити налаштування"
|
"label": "Відкрити налаштування"
|
||||||
@@ -3140,15 +3161,15 @@
|
|||||||
"interactive": ""
|
"interactive": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "Нова пошукова система",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Пошукова система створена",
|
||||||
"message": ""
|
"message": "Пошукова система успішно створена"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "Пошукова система не створена",
|
||||||
"message": ""
|
"message": "Не вдалося створити пошукову систему"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -3171,16 +3192,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "",
|
"title": "Видалити пошукову систему",
|
||||||
"message": "",
|
"message": "Ви впевнені, що хочете видалити пошукову систему \"{name}\"?",
|
||||||
"notification": {
|
"notification": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "",
|
"title": "Пошукову систему видалено",
|
||||||
"message": ""
|
"message": "Пошукову систему успішно видалено"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "",
|
"title": "Пошукова система не видалена",
|
||||||
"message": ""
|
"message": "Не вдалося видалити пошукову систему"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3188,11 +3209,11 @@
|
|||||||
"media": {
|
"media": {
|
||||||
"request": {
|
"request": {
|
||||||
"modal": {
|
"modal": {
|
||||||
"title": "",
|
"title": "Запит \"{name}\"",
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"season": "",
|
"season": "Сезон",
|
||||||
"episodes": ""
|
"episodes": "Серії"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"button": {
|
"button": {
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "Áp dụng",
|
"apply": "Áp dụng",
|
||||||
"backToOverview": "",
|
"backToOverview": "",
|
||||||
"create": "Tạo nên",
|
"create": "Tạo nên",
|
||||||
|
"createAnother": "",
|
||||||
"edit": "Sửa",
|
"edit": "Sửa",
|
||||||
"import": "",
|
"import": "",
|
||||||
"insert": "Thêm",
|
"insert": "Thêm",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "Đi lên",
|
"moveUp": "Đi lên",
|
||||||
"moveDown": "Đi xuống",
|
"moveDown": "Đi xuống",
|
||||||
"createAbove": "",
|
"createAbove": "",
|
||||||
"createBelow": ""
|
"createBelow": "",
|
||||||
|
"openAllInNewTabs": ""
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "",
|
"title": "",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "",
|
"create": "",
|
||||||
"changePosition": "Đổi vị trí"
|
"changePosition": "Đổi vị trí"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": ""
|
"createApiToken": ""
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "",
|
||||||
|
"text": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "NHẬN DẠNG",
|
"id": "NHẬN DẠNG",
|
||||||
"createdBy": ""
|
"createdBy": "",
|
||||||
|
"actions": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -805,6 +805,7 @@
|
|||||||
"apply": "應用",
|
"apply": "應用",
|
||||||
"backToOverview": "返回總覽",
|
"backToOverview": "返回總覽",
|
||||||
"create": "創建",
|
"create": "創建",
|
||||||
|
"createAnother": "創建並重新開始",
|
||||||
"edit": "編輯",
|
"edit": "編輯",
|
||||||
"import": "匯入",
|
"import": "匯入",
|
||||||
"insert": "插入",
|
"insert": "插入",
|
||||||
@@ -946,7 +947,8 @@
|
|||||||
"moveUp": "上移",
|
"moveUp": "上移",
|
||||||
"moveDown": "下移",
|
"moveDown": "下移",
|
||||||
"createAbove": "新分類之上",
|
"createAbove": "新分類之上",
|
||||||
"createBelow": "新分類之下"
|
"createBelow": "新分類之下",
|
||||||
|
"openAllInNewTabs": "於分頁中開啟全部"
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "創建分類",
|
"title": "創建分類",
|
||||||
@@ -965,6 +967,10 @@
|
|||||||
"create": "創建分類",
|
"create": "創建分類",
|
||||||
"changePosition": "變更位置"
|
"changePosition": "變更位置"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"openAllInNewTabs": {
|
||||||
|
"title": "於分頁中開啟全部",
|
||||||
|
"text": "某些瀏覽器可能會因安全性考量而阻止批量開啟分頁,Homarr 無法開啟所有視窗,因為您的瀏覽器已封鎖此操作,請允許「開啟彈出式視窗」,然後重試"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1192,6 +1198,14 @@
|
|||||||
"dateFormat": {
|
"dateFormat": {
|
||||||
"label": "日期格式",
|
"label": "日期格式",
|
||||||
"description": "日期應該是什麼樣式"
|
"description": "日期應該是什麼樣式"
|
||||||
|
},
|
||||||
|
"customTimeFormat": {
|
||||||
|
"label": "自訂時間格式",
|
||||||
|
"description": "使用 ISO 8601 格式化時間 (此操作將覆蓋其他選項)"
|
||||||
|
},
|
||||||
|
"customDateFormat": {
|
||||||
|
"label": "自訂日期格式",
|
||||||
|
"description": "使用 ISO 8601 格式化日期 (此操作將覆蓋其他選項)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1374,11 +1388,11 @@
|
|||||||
"label": "華氏溫度"
|
"label": "華氏溫度"
|
||||||
},
|
},
|
||||||
"disableTemperatureDecimals": {
|
"disableTemperatureDecimals": {
|
||||||
"label": ""
|
"label": "關閉溫度小數點"
|
||||||
},
|
},
|
||||||
"showCurrentWindSpeed": {
|
"showCurrentWindSpeed": {
|
||||||
"label": "",
|
"label": "顯示當前風速",
|
||||||
"description": ""
|
"description": "僅限當前天氣"
|
||||||
},
|
},
|
||||||
"location": {
|
"location": {
|
||||||
"label": "天氣位置"
|
"label": "天氣位置"
|
||||||
@@ -1398,12 +1412,12 @@
|
|||||||
"description": "日期應該是什麼樣式"
|
"description": "日期應該是什麼樣式"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"currentWindSpeed": "",
|
"currentWindSpeed": "{currentWindSpeed} 公里/時",
|
||||||
"dailyForecast": {
|
"dailyForecast": {
|
||||||
"sunrise": "",
|
"sunrise": "日出",
|
||||||
"sunset": "",
|
"sunset": "日落",
|
||||||
"maxWindSpeed": "",
|
"maxWindSpeed": "最大風速:{maxWindSpeed} 公里/時",
|
||||||
"maxWindGusts": ""
|
"maxWindGusts": "最大陣風:{maxWindGusts} 公里/時"
|
||||||
},
|
},
|
||||||
"kind": {
|
"kind": {
|
||||||
"clear": "晴朗",
|
"clear": "晴朗",
|
||||||
@@ -2570,10 +2584,17 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"createApiToken": "創建 API 密鑰"
|
"createApiToken": "創建 API 密鑰"
|
||||||
},
|
},
|
||||||
|
"modal": {
|
||||||
|
"delete": {
|
||||||
|
"title": "刪除 API 密鑰",
|
||||||
|
"text": "這將永久刪除 API 金鑰,使用此金鑰的 API 客戶端將無法再進行身份驗證或執行 API 請求,此操作無法撤銷"
|
||||||
|
}
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"header": {
|
"header": {
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"createdBy": "創建者"
|
"createdBy": "創建者",
|
||||||
|
"actions": "動作"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { Icon123 } from "@tabler/icons-react";
|
import type { Icon123, IconProps } from "@tabler/icons-react";
|
||||||
|
|
||||||
export * from "./src";
|
export * from "./src";
|
||||||
|
|
||||||
export type TablerIcon = typeof Icon123;
|
export type TablerIcon = typeof Icon123;
|
||||||
|
export type TablerIconProps = IconProps;
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
"@mantine/core": "^7.16.2",
|
"@mantine/core": "^7.16.2",
|
||||||
"@mantine/dates": "^7.16.2",
|
"@mantine/dates": "^7.16.2",
|
||||||
"@mantine/hooks": "^7.16.2",
|
"@mantine/hooks": "^7.16.2",
|
||||||
"@tabler/icons-react": "^3.29.0",
|
"@tabler/icons-react": "^3.30.0",
|
||||||
"mantine-react-table": "2.0.0-beta.8",
|
"mantine-react-table": "2.0.0-beta.8",
|
||||||
"next": "15.1.6",
|
"next": "15.1.6",
|
||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { MantineSize } from "@mantine/core";
|
import type { MantineRadius, MantineSize } from "@mantine/core";
|
||||||
import { Avatar } from "@mantine/core";
|
import { Avatar } from "@mantine/core";
|
||||||
|
|
||||||
import type { IntegrationKind } from "@homarr/definitions";
|
import type { IntegrationKind } from "@homarr/definitions";
|
||||||
@@ -7,13 +7,14 @@ import { getIconUrl } from "@homarr/definitions";
|
|||||||
interface IntegrationAvatarProps {
|
interface IntegrationAvatarProps {
|
||||||
size: MantineSize;
|
size: MantineSize;
|
||||||
kind: IntegrationKind | null;
|
kind: IntegrationKind | null;
|
||||||
|
radius?: MantineRadius;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const IntegrationAvatar = ({ kind, size }: IntegrationAvatarProps) => {
|
export const IntegrationAvatar = ({ kind, size, radius }: IntegrationAvatarProps) => {
|
||||||
const url = kind ? getIconUrl(kind) : null;
|
const url = kind ? getIconUrl(kind) : null;
|
||||||
if (!url) {
|
if (!url) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return <Avatar size={size} src={url} />;
|
return <Avatar size={size} src={url} radius={radius} styles={{ image: { objectFit: "contain" } }} />;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,9 +10,10 @@ import { IconSearch } from "@tabler/icons-react";
|
|||||||
interface SearchInputProps {
|
interface SearchInputProps {
|
||||||
defaultValue?: string;
|
defaultValue?: string;
|
||||||
placeholder: string;
|
placeholder: string;
|
||||||
|
flexExpand?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const SearchInput = ({ placeholder, defaultValue }: SearchInputProps) => {
|
export const SearchInput = ({ placeholder, defaultValue, flexExpand = false }: SearchInputProps) => {
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
const { replace } = useRouter();
|
const { replace } = useRouter();
|
||||||
const pathName = usePathname();
|
const pathName = usePathname();
|
||||||
@@ -40,6 +41,7 @@ export const SearchInput = ({ placeholder, defaultValue }: SearchInputProps) =>
|
|||||||
defaultValue={defaultValue}
|
defaultValue={defaultValue}
|
||||||
onChange={handleSearch}
|
onChange={handleSearch}
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
|
style={{ flex: flexExpand ? "1" : undefined }}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
"@homarr/validation": "workspace:^0.1.0",
|
"@homarr/validation": "workspace:^0.1.0",
|
||||||
"@mantine/core": "^7.16.2",
|
"@mantine/core": "^7.16.2",
|
||||||
"@mantine/hooks": "^7.16.2",
|
"@mantine/hooks": "^7.16.2",
|
||||||
"@tabler/icons-react": "^3.29.0",
|
"@tabler/icons-react": "^3.30.0",
|
||||||
"@tiptap/extension-color": "2.11.5",
|
"@tiptap/extension-color": "2.11.5",
|
||||||
"@tiptap/extension-highlight": "2.11.5",
|
"@tiptap/extension-highlight": "2.11.5",
|
||||||
"@tiptap/extension-image": "2.11.5",
|
"@tiptap/extension-image": "2.11.5",
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ export default function ClockWidget({ options }: WidgetComponentProps<"clock">)
|
|||||||
const secondsFormat = options.showSeconds ? ":ss" : "";
|
const secondsFormat = options.showSeconds ? ":ss" : "";
|
||||||
const timeFormat = options.is24HourFormat ? `HH:mm${secondsFormat}` : `h:mm${secondsFormat} A`;
|
const timeFormat = options.is24HourFormat ? `HH:mm${secondsFormat}` : `h:mm${secondsFormat} A`;
|
||||||
const dateFormat = options.dateFormat;
|
const dateFormat = options.dateFormat;
|
||||||
|
const customTimeFormat = options.customTimeFormat;
|
||||||
|
const customDateFormat = options.customDateFormat;
|
||||||
const timezone = options.useCustomTimezone ? options.timezone : Intl.DateTimeFormat().resolvedOptions().timeZone;
|
const timezone = options.useCustomTimezone ? options.timezone : Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||||
const time = useCurrentTime(options);
|
const time = useCurrentTime(options);
|
||||||
return (
|
return (
|
||||||
@@ -27,11 +29,15 @@ export default function ClockWidget({ options }: WidgetComponentProps<"clock">)
|
|||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
<Text className="clock-time-text" fw={700} size="22.5cqmin" lh="1">
|
<Text className="clock-time-text" fw={700} size="22.5cqmin" lh="1">
|
||||||
{dayjs(time).tz(timezone).format(timeFormat)}
|
{options.customTimeFormat
|
||||||
|
? dayjs(time).tz(timezone).format(customTimeFormat)
|
||||||
|
: dayjs(time).tz(timezone).format(timeFormat)}
|
||||||
</Text>
|
</Text>
|
||||||
{options.showDate && (
|
{options.showDate && (
|
||||||
<Text className="clock-date-text" size="12.5cqmin" p="1cqmin" lineClamp={1}>
|
<Text className="clock-date-text" size="12.5cqmin" p="1cqmin" lineClamp={1}>
|
||||||
{dayjs(time).tz(timezone).format(dateFormat)}
|
{options.customDateFormat
|
||||||
|
? dayjs(time).tz(timezone).format(customDateFormat)
|
||||||
|
: dayjs(time).tz(timezone).format(dateFormat)}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
</Stack>
|
</Stack>
|
||||||
|
|||||||
@@ -46,6 +46,14 @@ export const { definition, componentLoader } = createWidgetDefinition("clock", {
|
|||||||
defaultValue: "dddd, MMMM D",
|
defaultValue: "dddd, MMMM D",
|
||||||
withDescription: true,
|
withDescription: true,
|
||||||
}),
|
}),
|
||||||
|
customTimeFormat: factory.text({
|
||||||
|
defaultValue: "",
|
||||||
|
withDescription: true,
|
||||||
|
}),
|
||||||
|
customDateFormat: factory.text({
|
||||||
|
defaultValue: "",
|
||||||
|
withDescription: true,
|
||||||
|
}),
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
customTitle: {
|
customTitle: {
|
||||||
|
|||||||
@@ -347,9 +347,14 @@ const CpuRing = ({ cpuUtilization }: { cpuUtilization: number }) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const CpuTempRing = ({ fahrenheit, cpuTemp }: { fahrenheit: boolean; cpuTemp: number }) => {
|
const CpuTempRing = ({ fahrenheit, cpuTemp }: { fahrenheit: boolean; cpuTemp: number | undefined }) => {
|
||||||
const { width, ref } = useElementSize();
|
const { width, ref } = useElementSize();
|
||||||
const fallbackWidth = width || 1; // See https://github.com/homarr-labs/homarr/issues/2196
|
const fallbackWidth = width || 1; // See https://github.com/homarr-labs/homarr/issues/2196
|
||||||
|
|
||||||
|
if (!cpuTemp) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box ref={ref} w="100%" h="100%" className="health-monitoring-cpu-temperature">
|
<Box ref={ref} w="100%" h="100%" className="health-monitoring-cpu-temperature">
|
||||||
<RingProgress
|
<RingProgress
|
||||||
|
|||||||
770
pnpm-lock.yaml
generated
770
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -19,12 +19,12 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@next/eslint-plugin-next": "^15.1.6",
|
"@next/eslint-plugin-next": "^15.1.6",
|
||||||
"eslint-config-prettier": "^10.0.1",
|
"eslint-config-prettier": "^10.0.1",
|
||||||
"eslint-config-turbo": "^2.3.4",
|
"eslint-config-turbo": "^2.4.0",
|
||||||
"eslint-plugin-import": "^2.31.0",
|
"eslint-plugin-import": "^2.31.0",
|
||||||
"eslint-plugin-jsx-a11y": "^6.10.2",
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
||||||
"eslint-plugin-react": "^7.37.4",
|
"eslint-plugin-react": "^7.37.4",
|
||||||
"eslint-plugin-react-hooks": "^5.1.0",
|
"eslint-plugin-react-hooks": "^5.1.0",
|
||||||
"typescript-eslint": "^8.22.0"
|
"typescript-eslint": "^8.23.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||||
|
|||||||
Reference in New Issue
Block a user