diff --git a/.env.example b/.env.example index b05d685b1..854c2b19a 100644 --- a/.env.example +++ b/.env.example @@ -4,6 +4,14 @@ # This file will be committed to version control, so make sure not to have any secrets in it. # If you are cloning this repo, create a copy of this file named `.env` and populate it with your secrets. +# The below secret is not used anywhere but required for Auth.js (Would encrypt JWTs and Mail hashes, both not used) +AUTH_SECRET="supersecret" + +# The below secret is used to encrypt integration secrets in the database. +# It should be a 32-byte string, generated by running `openssl rand -hex 32` on Unix +# or starting the project without any (which will show a randomly generated one). +SECRET_ENCRYPTION_KEY=0000000000000000000000000000000000000000000000000000000000000000 + # This is how you can use the sqlite driver: DB_DRIVER='better-sqlite3' DB_URL='FULL_PATH_TO_YOUR_SQLITE_DB_FILE' @@ -20,11 +28,6 @@ DB_URL='FULL_PATH_TO_YOUR_SQLITE_DB_FILE' # DB_PASSWORD='password' # DB_NAME='name-of-database' - -# You can generate the secret via 'openssl rand -base64 32' on Unix -# @see https://next-auth.js.org/configuration/options#secret -AUTH_SECRET='supersecret' - TURBO_TELEMETRY_DISABLED=1 # Configure logging to use winston logger diff --git a/.github/workflows/deployment-docker-image.yml b/.github/workflows/deployment-docker-image.yml index b2860a9df..74772e8ef 100644 --- a/.github/workflows/deployment-docker-image.yml +++ b/.github/workflows/deployment-docker-image.yml @@ -13,11 +13,6 @@ on: required: false default: true description: Send notifications - push-image: - type: boolean - required: false - default: true - description: Push Docker Image permissions: contents: write @@ -112,7 +107,6 @@ jobs: NEXT_VERSION: ${{ needs.release.outputs.version }} DEPLOY_LATEST: ${{ github.ref_name == 'main' }} DEPLOY_BETA: ${{ github.ref_name == 'beta' }} - PUSH_IMAGE: ${{ github.event_name != 'workflow_dispatch' || github.events.inputs.push-image == true }} steps: - uses: actions/checkout@v4 with: @@ -143,13 +137,13 @@ jobs: ${{ env.DEPLOY_LATEST == 'true' && 'type=raw,value=latest' || null }} ${{ env.DEPLOY_BETA == 'true' && 'type=raw,value=beta' || null }} type=raw,value=${{ env.NEXT_VERSION }} - - name: Build and maybe push + - name: Build and push id: buildPushAction uses: docker/build-push-action@v6 with: platforms: linux/amd64,linux/arm64 context: . - push: ${{ env.PUSH_IMAGE }} + push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} network: host @@ -160,4 +154,4 @@ jobs: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} uses: Ilshidur/action-discord@master with: - args: "Deployment of image has completed for branch ${{ github.ref_name }}. Image ID is '${{ steps.buildPushAction.outputs.imageid }}'. ${{ env.PUSH_IMAGE == 'true' && '' || 'This was a dry run' }}" + args: "Deployment of image has completed for branch ${{ github.ref_name }}. Image ID is '${{ steps.buildPushAction.outputs.imageid }}'." diff --git a/.vscode/settings.json b/.vscode/settings.json index 2e67df382..51d2500a1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -39,5 +39,5 @@ "i18n-ally.localesPaths": [ "packages/translation/src/lang", ], - "i18n-ally.keystyle": "auto", + "i18n-ally.keystyle": "nested", } diff --git a/Dockerfile b/Dockerfile index 3e6f04281..a799e8152 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,51 +25,41 @@ RUN corepack enable pnpm && pnpm build FROM base AS runner WORKDIR /app -# gettext is required for envsubst -RUN apk add --no-cache redis nginx bash gettext su-exec +# gettext is required for envsubst, openssl for generating AUTH_SECRET, su-exec for running application as non-root +RUN apk add --no-cache redis nginx bash gettext su-exec openssl RUN mkdir /appdata VOLUME /appdata -RUN mkdir /secrets -VOLUME /secrets - - - -RUN addgroup --system --gid 1001 nodejs -RUN adduser --system --uid 1001 nextjs # Enable homarr cli -COPY --from=builder --chown=nextjs:nodejs /app/packages/cli/cli.cjs /app/apps/cli/cli.cjs +COPY --from=builder /app/packages/cli/cli.cjs /app/apps/cli/cli.cjs RUN echo $'#!/bin/bash\ncd /app/apps/cli && node ./cli.cjs "$@"' > /usr/bin/homarr RUN chmod +x /usr/bin/homarr # Don't run production as root -RUN chown -R nextjs:nodejs /secrets -RUN mkdir -p /var/cache/nginx && chown -R nextjs:nodejs /var/cache/nginx && \ - mkdir -p /var/log/nginx && chown -R nextjs:nodejs /var/log/nginx && \ - mkdir -p /var/lib/nginx && chown -R nextjs:nodejs /var/lib/nginx && \ - touch /run/nginx/nginx.pid && chown -R nextjs:nodejs /run/nginx/nginx.pid && \ - mkdir -p /etc/nginx/templates /etc/nginx/ssl/certs && chown -R nextjs:nodejs /etc/nginx +RUN mkdir -p /var/cache/nginx && \ + mkdir -p /var/log/nginx && \ + mkdir -p /var/lib/nginx && \ + touch /run/nginx/nginx.pid && \ + mkdir -p /etc/nginx/templates /etc/nginx/ssl/certs COPY --from=builder /app/apps/nextjs/next.config.mjs . COPY --from=builder /app/apps/nextjs/package.json . -COPY --from=builder --chown=nextjs:nodejs /app/apps/tasks/tasks.cjs ./apps/tasks/tasks.cjs -COPY --from=builder --chown=nextjs:nodejs /app/apps/websocket/wssServer.cjs ./apps/websocket/wssServer.cjs -COPY --from=builder --chown=nextjs:nodejs /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/build/better_sqlite3.node +COPY --from=builder /app/apps/tasks/tasks.cjs ./apps/tasks/tasks.cjs +COPY --from=builder /app/apps/websocket/wssServer.cjs ./apps/websocket/wssServer.cjs +COPY --from=builder /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/build/better_sqlite3.node -COPY --from=builder --chown=nextjs:nodejs /app/packages/db/migrations ./db/migrations +COPY --from=builder /app/packages/db/migrations ./db/migrations # Automatically leverage output traces to reduce image size # https://nextjs.org/docs/advanced-features/output-file-tracing -COPY --from=builder --chown=nextjs:nodejs /app/apps/nextjs/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/apps/nextjs/.next/static ./apps/nextjs/.next/static -COPY --from=builder --chown=nextjs:nodejs /app/apps/nextjs/public ./apps/nextjs/public -COPY --chown=nextjs:nodejs scripts/run.sh ./run.sh -COPY scripts/entrypoint.sh ./entrypoint.sh -RUN chmod +x ./entrypoint.sh -COPY --chown=nextjs:nodejs scripts/generateRandomSecureKey.js ./generateRandomSecureKey.js -COPY --chown=nextjs:nodejs packages/redis/redis.conf /app/redis.conf -COPY --chown=nextjs:nodejs nginx.conf /etc/nginx/templates/nginx.conf +COPY --from=builder /app/apps/nextjs/.next/standalone ./ +COPY --from=builder /app/apps/nextjs/.next/static ./apps/nextjs/.next/static +COPY --from=builder /app/apps/nextjs/public ./apps/nextjs/public +COPY scripts/run.sh ./run.sh +COPY --chmod=777 scripts/entrypoint.sh ./entrypoint.sh +COPY packages/redis/redis.conf /app/redis.conf +COPY nginx.conf /etc/nginx/templates/nginx.conf ENV DB_URL='/appdata/db/db.sqlite' @@ -78,4 +68,4 @@ ENV DB_DRIVER='better-sqlite3' ENV AUTH_PROVIDERS='credentials' ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD ["sh", "run.sh"] +CMD ["sh", "run.sh"] \ No newline at end of file diff --git a/apps/nextjs/next.config.mjs b/apps/nextjs/next.config.mjs index 8c4bd2800..bd57eb1a2 100644 --- a/apps/nextjs/next.config.mjs +++ b/apps/nextjs/next.config.mjs @@ -1,6 +1,7 @@ // Importing env files here to validate on build import "@homarr/auth/env.mjs"; import "@homarr/db/env.mjs"; +import "@homarr/common/env.mjs"; import MillionLint from "@million/lint"; import createNextIntlPlugin from "next-intl/plugin"; diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 6b7a81f36..d9c654358 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -87,7 +87,7 @@ "@types/react": "^19.0.2", "@types/react-dom": "^19.0.2", "@types/swagger-ui-react": "^4.18.3", - "concurrently": "^9.1.1", + "concurrently": "^9.1.2", "eslint": "^9.17.0", "node-loader": "^2.1.0", "prettier": "^3.4.2", diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx index 791be2938..a223e3bfc 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx @@ -3,13 +3,13 @@ import { useCallback } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; -import { Alert, Button, Fieldset, Group, SegmentedControl, Stack, Text, TextInput } from "@mantine/core"; +import { Alert, Button, Checkbox, Fieldset, Group, SegmentedControl, Stack, Text, TextInput } from "@mantine/core"; import { IconInfoCircle } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; import type { IntegrationKind, IntegrationSecretKind } from "@homarr/definitions"; -import { getAllSecretKindOptions, getIntegrationName } from "@homarr/definitions"; +import { getAllSecretKindOptions, getIntegrationName, integrationDefs } from "@homarr/definitions"; import type { UseFormReturnType } from "@homarr/form"; import { useZodForm } from "@homarr/form"; import { convertIntegrationTestConnectionError } from "@homarr/integrations/client"; @@ -38,6 +38,7 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => kind, value: "", })), + attemptSearchEngineCreation: true, }, }); const { mutateAsync, isPending } = clientApi.integration.create.useMutation(); @@ -78,6 +79,8 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => ); }; + const supportsSearchEngine = integrationDefs[searchParams.kind].category.flat().includes("search"); + return (
void handleSubmitAsync(value))}> @@ -104,6 +107,16 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => + {supportsSearchEngine && ( + + )} + + + + + ); +}).withOptions({ + size: "xl", +}); + +interface Season { + id: number; + name: string; + episodeCount: number; +} diff --git a/packages/redis/src/index.ts b/packages/redis/src/index.ts index 0f4a99f38..b752177ac 100644 --- a/packages/redis/src/index.ts +++ b/packages/redis/src/index.ts @@ -5,6 +5,7 @@ export { createItemAndIntegrationChannel, createItemChannel, createIntegrationOptionsChannel, + createWidgetOptionsChannel, createChannelWithLatestAndEvents, handshakeAsync, createSubPubChannel, diff --git a/packages/redis/src/lib/channel.ts b/packages/redis/src/lib/channel.ts index 68664a2d7..42eb2ef13 100644 --- a/packages/redis/src/lib/channel.ts +++ b/packages/redis/src/lib/channel.ts @@ -183,6 +183,16 @@ export const createIntegrationOptionsChannel = ( return createChannelWithLatestAndEvents(channelName); }; +export const createWidgetOptionsChannel = ( + widgetKind: WidgetKind, + queryKey: string, + options: Record, +) => { + const optionsKey = hashObjectBase64(options); + const channelName = `widget:${widgetKind}:${queryKey}:options:${optionsKey}`; + return createChannelWithLatestAndEvents(channelName); +}; + export const createItemChannel = (itemId: string) => { return createChannelWithLatestAndEvents(`item:${itemId}`); }; diff --git a/packages/request-handler/package.json b/packages/request-handler/package.json index d94d07aa8..e50417232 100644 --- a/packages/request-handler/package.json +++ b/packages/request-handler/package.json @@ -29,7 +29,7 @@ "@homarr/log": "workspace:^0.1.0", "@homarr/redis": "workspace:^0.1.0", "dayjs": "^1.11.13", - "octokit": "^4.0.2", + "octokit": "^4.0.3", "pretty-print-error": "^1.1.2", "superjson": "2.2.2" }, diff --git a/packages/request-handler/src/lib/cached-widget-request-handler.ts b/packages/request-handler/src/lib/cached-widget-request-handler.ts new file mode 100644 index 000000000..4016bc5b4 --- /dev/null +++ b/packages/request-handler/src/lib/cached-widget-request-handler.ts @@ -0,0 +1,36 @@ +import type { Duration } from "dayjs/plugin/duration"; + +import type { WidgetKind } from "@homarr/definitions"; +import { createWidgetOptionsChannel } from "@homarr/redis"; + +import { createCachedRequestHandler } from "./cached-request-handler"; + +interface Options> { + // Unique key for this request handler + queryKey: string; + requestAsync: (input: TInput) => Promise; + cacheDuration: Duration; + widgetKind: TKind; +} + +export const createCachedWidgetRequestHandler = < + TData, + TKind extends WidgetKind, + TInput extends Record, +>( + requestHandlerOptions: Options, +) => { + return { + handler: (widgetOptions: TInput) => + createCachedRequestHandler({ + queryKey: requestHandlerOptions.queryKey, + requestAsync: async (input: TInput) => { + return await requestHandlerOptions.requestAsync(input); + }, + cacheDuration: requestHandlerOptions.cacheDuration, + createRedisChannel(input, options) { + return createWidgetOptionsChannel(requestHandlerOptions.widgetKind, options.queryKey, input); + }, + }).handler(widgetOptions), + }; +}; diff --git a/packages/request-handler/src/minecraft-server-status.ts b/packages/request-handler/src/minecraft-server-status.ts new file mode 100644 index 000000000..d2b98fcc3 --- /dev/null +++ b/packages/request-handler/src/minecraft-server-status.ts @@ -0,0 +1,35 @@ +import dayjs from "dayjs"; +import { z } from "zod"; + +import { fetchWithTimeout } from "@homarr/common"; + +import { createCachedWidgetRequestHandler } from "./lib/cached-widget-request-handler"; + +export const minecraftServerStatusRequestHandler = createCachedWidgetRequestHandler({ + queryKey: "minecraftServerStatusApiResult", + widgetKind: "minecraftServerStatus", + async requestAsync(input: { domain: string; isBedrockServer: boolean }) { + const path = `/3/${input.isBedrockServer ? "bedrock/" : ""}${input.domain}`; + + const response = await fetchWithTimeout(`https://api.mcsrvstat.us${path}`); + return responseSchema.parse(await response.json()); + }, + cacheDuration: dayjs.duration(5, "minutes"), +}); + +const responseSchema = z + .object({ + online: z.literal(false), + }) + .or( + z.object({ + online: z.literal(true), + players: z.object({ + online: z.number(), + max: z.number(), + }), + icon: z.string().optional(), + }), + ); + +export type MinecraftServerStatus = z.infer; diff --git a/packages/spotlight/src/components/actions/children-actions.tsx b/packages/spotlight/src/components/actions/children-actions.tsx index b7f36909d..1907792a3 100644 --- a/packages/spotlight/src/components/actions/children-actions.tsx +++ b/packages/spotlight/src/components/actions/children-actions.tsx @@ -4,14 +4,25 @@ import { ChildrenActionItem } from "./items/children-action-item"; interface SpotlightChildrenActionsProps { childrenOptions: inferSearchInteractionOptions<"children">; query: string; + setChildrenOptions: (options: inferSearchInteractionOptions<"children">) => void; } -export const SpotlightChildrenActions = ({ childrenOptions, query }: SpotlightChildrenActionsProps) => { +export const SpotlightChildrenActions = ({ + childrenOptions, + query, + setChildrenOptions, +}: SpotlightChildrenActionsProps) => { const actions = childrenOptions.useActions(childrenOptions.option, query); return actions .filter((action) => (typeof action.hide === "function" ? !action.hide(childrenOptions.option) : !action.hide)) .map((action) => ( - + )); }; diff --git a/packages/spotlight/src/components/actions/items/children-action-item.tsx b/packages/spotlight/src/components/actions/items/children-action-item.tsx index 0b070b147..777446b78 100644 --- a/packages/spotlight/src/components/actions/items/children-action-item.tsx +++ b/packages/spotlight/src/components/actions/items/children-action-item.tsx @@ -8,9 +8,10 @@ interface ChildrenActionItemProps { childrenOptions: inferSearchInteractionOptions<"children">; query: string; action: ReturnType["useActions"]>[number]; + setChildrenOptions: (options: inferSearchInteractionOptions<"children">) => void; } -export const ChildrenActionItem = ({ childrenOptions, action, query }: ChildrenActionItemProps) => { +export const ChildrenActionItem = ({ childrenOptions, action, query, setChildrenOptions }: ChildrenActionItemProps) => { const interaction = action.useInteraction(childrenOptions.option, query); const renderRoot = @@ -20,10 +21,20 @@ export const ChildrenActionItem = ({ childrenOptions, action, query }: ChildrenA } : undefined; - const onClick = interaction.type === "javaScript" ? interaction.onSelect : undefined; + const onClick = + interaction.type === "javaScript" + ? interaction.onSelect + : interaction.type === "children" + ? () => setChildrenOptions(interaction) + : undefined; return ( - + ); diff --git a/packages/spotlight/src/components/spotlight.tsx b/packages/spotlight/src/components/spotlight.tsx index 1ab051bb7..70c0da866 100644 --- a/packages/spotlight/src/components/spotlight.tsx +++ b/packages/spotlight/src/components/spotlight.tsx @@ -140,7 +140,11 @@ const SpotlightWithActiveMode = ({ modeState, activeMode, defaultMode }: Spotlig {childrenOptions ? ( - + ) : ( { diff --git a/packages/spotlight/src/lib/children.ts b/packages/spotlight/src/lib/children.ts index 0c2c34992..f7f8bdf83 100644 --- a/packages/spotlight/src/lib/children.ts +++ b/packages/spotlight/src/lib/children.ts @@ -10,7 +10,10 @@ export interface CreateChildrenOptionsProps> { key: string; Component: (option: TParentOptions) => JSX.Element; - useInteraction: (option: TParentOptions, query: string) => inferSearchInteractionDefinition<"link" | "javaScript">; + useInteraction: ( + option: TParentOptions, + query: string, + ) => inferSearchInteractionDefinition<"link" | "javaScript" | "children">; hide?: boolean | ((option: TParentOptions) => boolean); } diff --git a/packages/spotlight/src/modes/external/search-engines-search-group.tsx b/packages/spotlight/src/modes/external/search-engines-search-group.tsx index 5c6529624..2d73ba2e9 100644 --- a/packages/spotlight/src/modes/external/search-engines-search-group.tsx +++ b/packages/spotlight/src/modes/external/search-engines-search-group.tsx @@ -1,8 +1,12 @@ import { Group, Image, Kbd, Stack, Text } from "@mantine/core"; -import { IconSearch } from "@tabler/icons-react"; +import { IconDownload, IconSearch } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; +import type { IntegrationKind } from "@homarr/definitions"; +import { getIntegrationKindsByCategory, getIntegrationName } from "@homarr/definitions"; +import { useModalAction } from "@homarr/modals"; +import { RequestMediaModal } from "@homarr/modals-collection"; import { useScopedI18n } from "@homarr/translation/client"; import { createChildrenOptions } from "../../lib/children"; @@ -11,6 +15,100 @@ import { interaction } from "../../lib/interaction"; type SearchEngine = RouterOutputs["searchEngine"]["search"][number]; +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +type MediaRequestChildrenProps = { + result: { + id: number; + image?: string; + name: string; + link: string; + text?: string; + type: "tv" | "movie"; + inLibrary: boolean; + }; + integration: { + kind: IntegrationKind; + url: string; + id: string; + }; +}; + +const mediaRequestsChildrenOptions = createChildrenOptions({ + useActions() { + const { openModal } = useModalAction(RequestMediaModal); + return [ + { + key: "request", + hide: (option) => option.result.inLibrary, + Component(option) { + const t = useScopedI18n("search.mode.media"); + return ( + + + {option.result.type === "tv" && {t("requestSeries")}} + {option.result.type === "movie" && {t("requestMovie")}} + + ); + }, + useInteraction: interaction.javaScript((option) => ({ + onSelect() { + openModal( + { + integrationId: option.integration.id, + mediaId: option.result.id, + mediaType: option.result.type, + }, + { + title(t) { + return t("search.engine.media.request.modal.title", { name: option.result.name }); + }, + }, + ); + }, + })), + }, + { + key: "open", + Component({ integration }) { + const tChildren = useScopedI18n("search.mode.media"); + return ( + + + {tChildren("openIn", { kind: getIntegrationName(integration.kind) })} + + ); + }, + useInteraction({ result }) { + return { + type: "link", + href: result.link, + newTab: true, + }; + }, + }, + ]; + }, + DetailComponent({ options }) { + return ( + + {options.result.image ? ( + + ) : ( + + )} + + {options.result.name} + {options.result.text && ( + + {options.result.text} + + )} + + + ); + }, +}); + export const searchEnginesChildrenOptions = createChildrenOptions({ useActions: (searchEngine, query) => { const { data } = clientApi.integration.searchInIntegration.useQuery( @@ -64,10 +162,48 @@ export const searchEnginesChildrenOptions = createChildrenOptions( ); }, - useInteraction: interaction.link(() => ({ - href: searchResult.link, - newTab: true, - })), + useInteraction(searchEngine) { + if (searchEngine.type !== "fromIntegration") { + throw new Error("Invalid search engine type"); + } + + if (!searchEngine.integration) { + throw new Error("Invalid search engine integration"); + } + + if ( + getIntegrationKindsByCategory("mediaRequest").some( + (categoryKind) => categoryKind === searchEngine.integration?.kind, + ) && + "type" in searchResult + ) { + const type = searchResult.type; + if (type === "person") { + return { + type: "link", + href: searchResult.link, + newTab: true, + }; + } + + return { + type: "children", + ...mediaRequestsChildrenOptions({ + result: { + ...searchResult, + type, + }, + integration: searchEngine.integration, + }), + }; + } + + return { + type: "link", + href: searchResult.link, + newTab: true, + }; + }, })); }, DetailComponent({ options }) { diff --git a/packages/translation/src/lang/cn.json b/packages/translation/src/lang/cn.json index 3ce2bbafc..453fa6021 100644 --- a/packages/translation/src/lang/cn.json +++ b/packages/translation/src/lang/cn.json @@ -44,14 +44,14 @@ "apps": "应用", "boards": "面板", "integrations": "组件", - "credentialUsers": "凭证用户" + "credentialUsers": "用户凭证" } }, "tokenModal": { "title": "输入导入密钥", "field": { "token": { - "label": "令牌", + "label": "秘钥", "description": "输入您之前的 homarr 实例中显示的导入秘钥" } }, @@ -110,7 +110,7 @@ "page": { "login": { "title": "登录你的账户", - "subtitle": "欢迎回来!请输入您的凭据" + "subtitle": "欢迎回来!请输入您的凭证" }, "invite": { "title": "加入 Homarr", @@ -118,7 +118,7 @@ "description": "您受到了 {username} 的邀请。" }, "init": { - "title": "新建Homarr 安装", + "title": "新建 Homarr 安装", "subtitle": "请创建初始管理员用户" } }, @@ -133,8 +133,8 @@ "password": { "label": "密码", "requirement": { - "length": "包含至少8个字符", - "lowercase": "包括小写字母", + "length": "至少包含 8 个字符", + "lowercase": "包含小写字母", "uppercase": "包含大写字母", "number": "包含数字", "special": "包含特殊符号" @@ -144,17 +144,17 @@ "label": "确认密码" }, "previousPassword": { - "label": "先前的密码" + "label": "以前的密码" }, "homeBoard": { - "label": "首页" + "label": "主面板" }, "pingIconsEnabled": { - "label": "用于ping的图标" + "label": "为 ping 使用图标" } }, "error": { - "usernameTaken": "用户名称已被占用" + "usernameTaken": "用户名已存在" }, "action": { "login": { @@ -167,12 +167,12 @@ }, "error": { "title": "登录失败", - "message": "您登录失败" + "message": "您的登录失败了" } }, "forgotPassword": { - "label": "忘记密码?", - "description": "管理员可以使用以下命令重置您的密码:" + "label": "忘记了你的密码?", + "description": "管理员可以使用以下命令重置密码:" } }, "register": { @@ -180,11 +180,11 @@ "notification": { "success": { "title": "账号已创建", - "message": "请登录以继续" + "message": "请登录后继续" }, "error": { - "title": "创建账户失败", - "message": "无法创建您的帐户" + "title": "账户创建失败", + "message": "无法创建您的账户" } } }, @@ -203,7 +203,7 @@ "changeHomeBoard": { "notification": { "success": { - "message": "主页面修改成功" + "message": "主面板修改成功" }, "error": { "message": "无法修改主面板" @@ -271,7 +271,7 @@ }, "delete": { "label": "永久删除用户", - "description": "删除此用户及其偏好设置。这将不会删除任何看板。用户将不会收到通知。", + "description": "删除此用户(包括其偏好设置)。这不会删除任何面板。用户不会收到通知。", "confirm": "您确定要删除用户 {username} 及其偏好设置吗?" }, "select": { @@ -284,12 +284,12 @@ } }, "group": { - "title": "组", - "name": "组", - "search": "查找组", + "title": "群组", + "name": "群组", + "search": "查找群组", "field": { "name": "名称", - "members": "成员列表" + "members": "成员" }, "permission": { "admin": { @@ -310,15 +310,15 @@ }, "use-all": { "label": "使用全部应用", - "description": "允许成员将任何应用添加到他们的看板" + "description": "允许成员将任何应用添加到他们的面板" }, "modify-all": { - "label": "修改全部应用", + "label": "修改所有应用", "description": "允许成员修改全部应用" }, "full-all": { "label": "完整应用访问权限", - "description": "允许成员管理、使用和删除全部应用" + "description": "允许成员管理、使用和删除任意应用" } } }, @@ -327,40 +327,40 @@ "item": { "create": { "label": "创建面板", - "description": "允许成员创建看板" + "description": "允许成员创建面板" }, "view-all": { "label": "查看全部面板", - "description": "允许成员查看全部看板" + "description": "允许成员查看全部面板" }, "modify-all": { - "label": "修改全部看板", - "description": "允许成员修改全部看板 (不包括访问控制和危险区)" + "label": "修改全部面板", + "description": "允许成员修改全部面板 (不包括访问控制和危险区域)" }, "full-all": { - "label": "完整的看板访问权限", - "description": "允许成员查看、修改和删除全部看板 (包括访问控制和危险区)" + "label": "完整的面板访问权限", + "description": "允许成员查看、修改和删除全部面板 (包括访问控制和危险区域)" } } }, "integration": { - "title": "组件", + "title": "集成", "item": { "create": { - "label": "创建组件", - "description": "允许成员创建组件" + "label": "创建集成", + "description": "允许成员创建集成" }, "use-all": { - "label": "使用全部组件", - "description": "允许成员将任何组件添加到他们的看板" + "label": "使用全部集成", + "description": "允许成员将任何组件添加到他们的面板" }, "interact-all": { - "label": "与任何组件互动", - "description": "允许成员与任何组件互动" + "label": "与任意集成进行互动", + "description": "允许成员与任意组件进行交互" }, "full-all": { - "label": "完全的组件访问权限", - "description": "允许成员管理、使用并与任何组件交互" + "label": "完整的组件访问权限", + "description": "允许成员管理、使用并与任意组件交互" } } }, @@ -506,7 +506,7 @@ }, "error": { "title": "创建失败", - "message": "无法创建此应用" + "message": "无法创建应用" } } }, @@ -514,12 +514,12 @@ "title": "编辑应用", "notification": { "success": { - "title": "更改应用成功", + "title": "成功应用更改", "message": "应用保存成功" }, "error": { "title": "无法应用更改", - "message": "无法保存此应用" + "message": "应用无法保存" } } }, @@ -528,7 +528,7 @@ "message": "确认删除应用 {name} 吗?", "notification": { "success": { - "title": "成功删除", + "title": "删除成功", "message": "应用已成功删除" }, "error": { @@ -559,7 +559,7 @@ "integration": { "page": { "list": { - "title": "组件", + "title": "集成", "search": "搜索组件", "noResults": { "title": "尚无组件" @@ -582,7 +582,7 @@ "title": "编辑组件 {name}", "notification": { "success": { - "title": "更改应用成功", + "title": "成功应用更改", "message": "组件已成功保存" }, "error": { @@ -596,7 +596,7 @@ "message": "确认删除组件 {name} 吗?", "notification": { "success": { - "title": "成功删除", + "title": "删除成功", "message": "组件已成功删除" }, "error": { @@ -630,34 +630,34 @@ }, "invalidUrl": { "title": "无效链接", - "message": "" + "message": "URL 无效" }, "secretNotDefined": { - "title": "", - "message": "" + "title": "缺少凭证", + "message": "并非所有凭证都已提供" }, "invalidCredentials": { - "title": "", + "title": "凭证无效", "message": "" }, "commonError": { - "title": "", - "message": "" + "title": "连接失败", + "message": "无法建立连接" }, "badRequest": { - "title": "", - "message": "" + "title": "错误请求", + "message": "请求格式不正确" }, "unauthorized": { - "title": "", + "title": "未授权", "message": "" }, "forbidden": { "title": "", - "message": "" + "message": "可能缺少权限" }, "notFound": { - "title": "", + "title": "未找到", "message": "" }, "internalServerError": { @@ -681,12 +681,12 @@ "message": "" }, "invalidJson": { - "title": "", - "message": "" + "title": "无效的 JSON", + "message": "无效的JSON响应" }, "wrongPath": { - "title": "", - "message": "" + "title": "路径错误", + "message": "该路径可能不正确" } } }, @@ -694,8 +694,8 @@ "title": "", "lastUpdated": "", "notSet": { - "label": "", - "tooltip": "" + "label": "未设置值", + "tooltip": "尚未设置此必填的密钥" }, "secureNotice": "", "reset": { @@ -703,17 +703,17 @@ "message": "" }, "noSecretsRequired": { - "segmentTitle": "", - "text": "" + "segmentTitle": "没有密钥", + "text": "此集成不需要密钥" }, "kind": { "username": { "label": "用户名", - "newLabel": "" + "newLabel": "新用户名" }, "apiKey": { - "label": "", - "newLabel": "" + "label": "API 密钥", + "newLabel": "新 API 密钥" }, "password": { "label": "密码", @@ -724,12 +724,12 @@ "permission": { "use": "", "interact": "", - "full": "" + "full": "完整的组件访问权限" } }, "media": { - "plural": "", - "search": "", + "plural": "媒体", + "search": "查找媒体", "field": { "name": "名称", "size": "大小", @@ -737,8 +737,8 @@ }, "action": { "upload": { - "label": "", - "file": "", + "label": "上传媒体", + "file": "选择文件", "notification": { "success": { "message": "" @@ -749,32 +749,32 @@ } }, "delete": { - "label": "", - "description": "", + "label": "删除媒体", + "description": "您确定要删除媒体 ?", "notification": { "success": { - "message": "" + "message": "媒体已成功删除" }, "error": { - "message": "" + "message": "无法删除该媒体" } } }, "copy": { - "label": "" + "label": "复制 URL" } } }, "common": { - "beta": "", + "beta": "测试版", "error": "错误", "action": { "add": "添加", "apply": "应用", - "backToOverview": "", + "backToOverview": "返回概览", "create": "创建", "edit": "编辑", - "import": "", + "import": "导入", "insert": "插入", "remove": "删除", "save": "保存", @@ -783,44 +783,44 @@ "delete": "删除", "discard": "", "confirm": "确认", - "continue": "", + "continue": "继续", "previous": "上一步", "next": "下一步", "checkoutDocs": "", - "checkLogs": "", - "tryAgain": "请再试一次", - "loading": "" + "checkLogs": "检查日志获取更多详情", + "tryAgain": "重试", + "loading": "正在加载" }, - "here": "", + "here": "这里", "iconPicker": { - "label": "", + "label": "图标 URL", "header": "" }, "colorScheme": { "options": { - "light": "", - "dark": "" + "light": "日间", + "dark": "暗黑" } }, "information": { - "min": "", - "max": "", - "days": "", + "min": "最小", + "max": "最大", + "days": "天", "hours": "时", "minutes": "分" }, "notification": { "create": { - "success": "", - "error": "" + "success": "创建成功", + "error": "创建失败" }, "delete": { - "success": "", - "error": "" + "success": "删除成功", + "error": "删除失败" }, "update": { - "success": "", - "error": "" + "success": "成功应用更改", + "error": "无法应用更改" }, "transfer": { "success": "", @@ -828,27 +828,27 @@ } }, "multiSelect": { - "placeholder": "" + "placeholder": "选择一个或多个值" }, "multiText": { - "placeholder": "", + "placeholder": "添加更多值", "addLabel": "" }, "select": { - "placeholder": "", + "placeholder": "选择值", "badge": { "recommended": "" } }, "userAvatar": { "menu": { - "switchToDarkMode": "", - "switchToLightMode": "", - "management": "", - "preferences": "您的首选项", - "logout": "", + "switchToDarkMode": "切换到暗黑模式", + "switchToLightMode": "切换到日间模式", + "management": "管理中心", + "preferences": "偏好设置", + "logout": "退出登录", "login": "登录", - "homeBoard": "", + "homeBoard": "您的首页", "loggedOut": "", "updateAvailable": "" } @@ -856,8 +856,8 @@ "dangerZone": "危险", "noResults": "未找到结果", "preview": { - "show": "", - "hide": "" + "show": "显示预览", + "hide": "隐藏预览" }, "zod": { "errors": { @@ -870,7 +870,7 @@ "invalidEmail": "" }, "tooSmall": { - "string": "该字段的长度必须至少为 {minimum} 个字符", + "string": "该字段长度必须至少为 {minimum} 个字符", "number": "该字段必须大于或等于 {minimum}" }, "tooBig": { @@ -878,8 +878,8 @@ "number": "该字段必须小于或等于 {maximum}" }, "custom": { - "passwordsDoNotMatch": "", - "passwordRequirements": "", + "passwordsDoNotMatch": "两次输入的密码不一致", + "passwordRequirements": "密码不符合要求", "boardAlreadyExists": "", "invalidFileType": "", "fileTooLarge": "", @@ -907,9 +907,9 @@ } }, "action": { - "create": "", - "edit": "", - "remove": "", + "create": "新建分类", + "edit": "重命名分类", + "remove": "删除分类", "moveUp": "上移", "moveDown": "下移", "createAbove": "", @@ -937,12 +937,12 @@ }, "item": { "action": { - "create": "", - "import": "", - "edit": "", + "create": "新建项目", + "import": "导入项目", + "edit": "编辑项目", "moveResize": "", "duplicate": "", - "remove": "" + "remove": "删除项目" }, "menu": { "label": { @@ -951,7 +951,7 @@ }, "create": { "title": "", - "addToBoard": "" + "addToBoard": "添加到面板" }, "moveResize": { "title": "", @@ -963,17 +963,17 @@ "label": "高度" }, "xOffset": { - "label": "" + "label": "X 偏移" }, "yOffset": { - "label": "" + "label": "Y 偏移" } } }, "edit": { - "title": "", + "title": "编辑项目", "advancedOptions": { - "label": "", + "label": "高级选项", "title": "" }, "field": { @@ -986,44 +986,44 @@ } }, "remove": { - "title": "", - "message": "" + "title": "删除项目", + "message": "你确定要删除这个项目吗?" } }, "widget": { "app": { - "name": "", + "name": "应用", "description": "", "option": { "appId": { - "label": "" + "label": "选择应用" }, "openInNewTab": { "label": "在新标签页中打开" }, "showTitle": { - "label": "" + "label": "显示应用名称" }, "showDescriptionTooltip": { - "label": "" + "label": "显示描述提示" }, "pingEnabled": { - "label": "" + "label": "启用简单的 ping" } }, "error": { "notFound": { - "label": "", + "label": "没有应用", "tooltip": "" } } }, "bookmarks": { - "name": "", - "description": "", + "name": "书签", + "description": "显示多个应用链接", "option": { "title": { - "label": "" + "label": "标题" }, "layout": { "label": "显示布局", @@ -1064,22 +1064,22 @@ } }, "usePiHoleColors": { - "label": "" + "label": "使用 Pi-Hole 颜色" } }, "error": { - "internalServerError": "", - "integrationsDisconnected": "" + "internalServerError": "获取 DNS Hole 摘要失败", + "integrationsDisconnected": "没有可用的数据,所有集成已断开" }, "data": { "adsBlockedToday": "今日屏蔽", "adsBlockedTodayPercentage": "今日屏蔽", "dnsQueriesToday": "今日查询", - "domainsBeingBlocked": "" + "domainsBeingBlocked": "黑名单上的域" } }, "dnsHoleControls": { - "name": "", + "name": "DNS Hole 控制", "description": "从您的面板控制 PiHole 或 AdGuard", "option": { "layout": { @@ -1097,15 +1097,15 @@ } }, "showToggleAllButtons": { - "label": "" + "label": "显示全部按钮" } }, "error": { - "internalServerError": "" + "internalServerError": "无法控制 DNS Hole" }, "controls": { - "enableAll": "", - "disableAll": "", + "enableAll": "全部启用", + "disableAll": "全部禁用", "setTimer": "", "set": "设置", "enabled": "已启用", @@ -1171,7 +1171,7 @@ "strikethrough": "删除线", "underline": "下划线", "colorText": "文字颜色", - "colorHighlight": "彩色高亮文本", + "colorHighlight": "彩色高亮文字", "code": "代码", "clear": "清除格式", "heading": "标题 {level}", @@ -1279,7 +1279,7 @@ } }, "spotlightAction": { - "run": "" + "run": "运行 {name}" } }, "calendar": { @@ -1313,18 +1313,18 @@ "label": "天气位置" }, "showCity": { - "label": "" + "label": "显示城市" }, "hasForecast": { "label": "" }, "forecastDayCount": { "label": "", - "description": "" + "description": "当小部件不够宽时,显示的天数减少" }, "dateFormat": { - "label": "", - "description": "" + "label": "日期格式", + "description": "日期应该是什么样的" } }, "kind": { @@ -1346,7 +1346,7 @@ }, "indexerManager": { "name": "索引器管理状态", - "description": "", + "description": "索引器状态", "option": { "openIndexerSiteInNewTab": { "label": "" @@ -1396,16 +1396,16 @@ }, "common": { "location": { - "query": "", + "query": "城市/邮编", "latitude": "", "longitude": "", - "disabledTooltip": "", + "disabledTooltip": "请输入城市或邮编", "unknownLocation": "", "search": "搜索", "table": { "header": { - "city": "", - "country": "", + "city": "城市", + "country": "国家", "coordinates": "", "population": "" }, @@ -1450,17 +1450,22 @@ } }, "error": { - "noUrl": "", - "forYoutubeUseIframe": "" + "noUrl": "没有提供视频 URL", + "forYoutubeUseIframe": "YouTube 视频使用 iframe 选项" } }, "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { - "name": "", + "name": "下载客户端", "description": "", "option": { "columns": { @@ -1544,7 +1549,7 @@ "detailsTitle": "" }, "size": { - "columnTitle": "", + "columnTitle": "文件大小", "detailsTitle": "" }, "state": { @@ -1556,12 +1561,12 @@ "detailsTitle": "" }, "type": { - "columnTitle": "", + "columnTitle": "类型", "detailsTitle": "" }, "upSpeed": { "columnTitle": "上传", - "detailsTitle": "" + "detailsTitle": "上传速度" } }, "states": { @@ -1622,7 +1627,7 @@ "toBeDetermined": "" }, "mediaRequests-requestStats": { - "name": "", + "name": "媒体请求状态", "description": "您的媒体请求统计", "option": {}, "titles": { @@ -1644,8 +1649,8 @@ } }, "mediaTranscoding": { - "name": "", - "description": "", + "name": "媒体转码", + "description": "您的媒体转码的统计、当前队列和工作状态", "option": { "defaultView": { "label": "默认视图" @@ -1710,7 +1715,7 @@ "label": "" }, "enableRtl": { - "label": "" + "label": "启用 RTL" }, "textLinesClamp": { "label": "" @@ -1723,8 +1728,8 @@ }, "widgetPreview": { "toggle": { - "enabled": "", - "disabled": "" + "enabled": "启用编辑模式", + "disabled": "禁用编辑模式" }, "dimensions": { "title": "" @@ -1735,11 +1740,11 @@ "edit": { "notification": { "success": { - "title": "", + "title": "成功应用更改", "message": "" }, "error": { - "title": "", + "title": "无法应用更改", "message": "" } }, @@ -1757,7 +1762,7 @@ }, "error": { "title": "", - "message": "" + "message": "无法导入面板,请检查日志以获取更多详情" } }, "form": { @@ -1772,16 +1777,16 @@ "description": "" }, "onlyImportApps": { - "label": "", - "description": "" + "label": "仅导入应用", + "description": "只添加应用,面板需要手动重新创建" } }, "name": { "label": "" }, "screenSize": { - "label": "", - "description": "", + "label": "屏幕大小", + "description": "在1.0之前的版本中,有三种不同的模式,所以你可以根据屏幕大小选择列的数量。", "option": { "sm": "小号", "md": "中号", @@ -1789,16 +1794,16 @@ } }, "sidebarBehavior": { - "label": "", - "description": "", + "label": "侧边栏行为", + "description": "侧边栏在1.0中被删除了,您可以选择其中的项目应该发生什么。", "option": { "lastSection": { - "label": "", - "description": "" + "label": "最后部分", + "description": "侧边栏将显示在最后一部分的下方" }, "removeItems": { - "label": "", - "description": "" + "label": "删除项目", + "description": "侧边栏中包含的项目将被删除" } } } @@ -1807,7 +1812,7 @@ }, "field": { "pageTitle": { - "label": "" + "label": "页面标题" }, "metaTitle": { "label": "" @@ -1900,7 +1905,7 @@ "metaTitle": "" }, "setting": { - "title": "", + "title": "{boardName} 面板设置", "section": { "general": { "title": "通用", @@ -1984,7 +1989,7 @@ "title": "欢迎使用 Homarr", "description": "", "link": "创建您的第一个面板", - "notice": "" + "notice": "要使这个页面消失,请创建一个面板并将其设置为主面板" }, "notFound": { "title": "", @@ -1993,21 +1998,21 @@ "notice": "" }, "homeBoard": { - "title": "", + "title": "没有主面板", "admin": { - "description": "", - "link": "", - "notice": "" + "description": "您还没有为服务器设置主面板。", + "link": "配置服务器主面板", + "notice": "要使此页面消失,请为服务器设置主面板" }, "user": { - "description": "", - "link": "", - "notice": "" + "description": "您尚未设置主面板。", + "link": "配置您的首页", + "notice": "要使此页面消失,请在您的偏好设置中指定主面板" }, "anonymous": { - "description": "", - "link": "", - "notice": "" + "description": "服务器管理员尚未设置主面板。", + "link": "查看公共面板", + "notice": "要使这个页面消失,请服务器管理员为服务器设置一个主面板" } } } @@ -2030,22 +2035,22 @@ "apps": "应用", "integrations": "组件", "searchEngies": "", - "medias": "", + "medias": "媒体", "users": { "label": "用户", "items": { - "manage": "管理中心", + "manage": "管理", "invites": "邀请", - "groups": "" + "groups": "群组" } }, "tools": { "label": "工具", "items": { "docker": "", - "logs": "", - "api": "", - "tasks": "" + "logs": "日志", + "api": "API", + "tasks": "任务" } }, "settings": "设置", @@ -2069,7 +2074,7 @@ "invite": "邀请", "integration": "组件", "app": "应用", - "group": "" + "group": "群组" }, "statisticLabel": { "boards": "面板", @@ -2091,10 +2096,10 @@ "label": "设置" }, "setHomeBoard": { - "label": "", + "label": "设置为您的首页", "badge": { "label": "首页", - "tooltip": "" + "tooltip": "此面板将显示为您的主面板" } }, "delete": { @@ -2129,8 +2134,8 @@ "general": { "title": "通用", "item": { - "language": "", - "board": "", + "language": "语言与地区", + "board": "主面板", "firstDayOfWeek": "一周的第一天", "accessibility": "无障碍服务" } @@ -2160,7 +2165,7 @@ "label": "安全" }, "groups": { - "label": "", + "label": "群组", "title": "", "description": "" }, @@ -2223,7 +2228,7 @@ "ownerOfGroupDeleted": "" }, "members": { - "title": "", + "title": "成员", "search": "", "notFound": "" }, @@ -2239,143 +2244,143 @@ "title": "设置", "notification": { "success": { - "message": "" + "message": "设置保存成功" }, "error": { - "message": "" + "message": "无法保存设置" } }, "section": { "analytics": { - "title": "", + "title": "分析", "general": { - "title": "", - "text": "" + "title": "发送匿名分析", + "text": "Homarr 将使用开源软件 Umami 发送匿名分析。它从不收集任何个人信息,因此完全符合 GDPR 和 CCPA 要求。我们鼓励您启用分析,因为它可以帮助我们的开源团队识别问题并确定待办事项的优先级。" }, "widgetData": { - "title": "", - "text": "" + "title": "组件数据", + "text": "发送您已配置的组件(及其数量)。不包括URL、名称或任何其他数据。" }, "integrationData": { - "title": "", - "text": "" + "title": "集成数据", + "text": "发送您已配置的集成(及其数量)。不包括URL、名称或任何其他数据。" }, "usersData": { - "title": "", - "text": "" + "title": "用户数据", + "text": "发送用户数量以及您是否激活了SSO" } }, "crawlingAndIndexing": { - "title": "", - "warning": "", + "title": "爬取和索引", + "warning": "启用或禁用这里的任何设置将严重影响搜索引擎如何索引和抓取你的页面。任何设置都是一个请求,是否应用这些设置取决于爬虫。任何修改可能需要数天或数周才能申请。一些设置可能是搜索引擎特定的。", "noIndex": { - "title": "", - "text": "" + "title": "不要索引", + "text": "不要在搜索引擎上索引网站,也不要在任何搜索结果中显示。" }, "noFollow": { - "title": "", - "text": "" + "title": "不要追踪", + "text": "索引时不要追踪任何链接。禁用此功能将导致爬虫程序试图跟踪Homarr上的所有链接。" }, "noTranslate": { - "title": "", - "text": "" + "title": "不要翻译", + "text": "当站点语言可能不是用户想要阅读的语言时,谷歌将在搜索结果中显示一个翻译链接" }, "noSiteLinksSearchBox": { - "title": "", - "text": "" + "title": "没有站点链接搜索框", + "text": "谷歌将与爬取的链接以及其他直接链接构建一个搜索框。启用此功能将要求谷歌禁用该框。" } }, "board": { "title": "面板", "homeBoard": { - "label": "", - "description": "" + "label": "全局主面板", + "description": "只有公共面板可供选择" } }, "appearance": { "title": "外观", "defaultColorScheme": { - "label": "", + "label": "默认配色方案", "options": { - "light": "", - "dark": "" + "light": "日间", + "dark": "暗黑" } } }, "culture": { - "title": "", + "title": "区域", "defaultLocale": { - "label": "" + "label": "默认语言" } } } }, "tool": { "tasks": { - "title": "", + "title": "任务", "status": { - "idle": "", + "idle": "空闲", "running": "运行中", "error": "错误" }, "job": { "iconsUpdater": { - "label": "" + "label": "图标更新" }, "analytics": { - "label": "" + "label": "分析" }, "smartHomeEntityState": { - "label": "" + "label": "智能家居实体状态" }, "ping": { - "label": "" + "label": "Pings" }, "mediaServer": { "label": "媒体服务" }, "mediaOrganizer": { - "label": "" + "label": "媒体组织者" }, "downloads": { - "label": "" + "label": "正在下载" }, "mediaRequestStats": { - "label": "" + "label": "媒体请求统计" }, "mediaRequestList": { - "label": "" + "label": "媒体请求列表" }, "rssFeeds": { - "label": "" + "label": "RSS订阅" }, "indexerManager": { - "label": "" + "label": "索引器管理" }, "healthMonitoring": { - "label": "" + "label": "健康监测" }, "dnsHole": { - "label": "" + "label": "DNS Hole 数据" }, "sessionCleanup": { - "label": "" + "label": "会话清理" }, "updateChecker": { - "label": "" + "label": "更新检查" }, "mediaTranscoding": { - "label": "" + "label": "媒体转码" } } }, "api": { - "title": "", + "title": "API", "modal": { "createApiToken": { - "title": "", - "description": "", - "button": "" + "title": "API 令牌已创建", + "description": "已创建API令牌。小心,这个令牌在数据库中是加密的,永远不会再传输给您。如果您丢失了这个令牌,您将无法再检索这个特定的令牌。", + "button": "复制并关闭" } }, "tab": { @@ -2383,15 +2388,15 @@ "label": "文档" }, "apiKey": { - "label": "", - "title": "", + "label": "认证", + "title": "API 密钥", "button": { - "createApiToken": "" + "createApiToken": "创建 API 令牌" }, "table": { "header": { - "id": "", - "createdBy": "" + "id": "ID", + "createdBy": "创建者" } } } @@ -2408,7 +2413,7 @@ }, "translators": { "title": "", - "subtitle": "" + "subtitle": "{count}翻译了许多语言" }, "libraries": { "title": "", @@ -2516,7 +2521,7 @@ } }, "error": { - "internalServerError": "" + "internalServerError": "获取 Docker 容器失败" } }, "permission": { @@ -2529,7 +2534,7 @@ }, "tab": { "user": "用户", - "group": "", + "group": "群组", "inherited": "" }, "field": { @@ -2537,7 +2542,7 @@ "label": "用户" }, "group": { - "label": "" + "label": "群组" }, "permission": { "label": "" @@ -2564,7 +2569,7 @@ } }, "search-engines": { - "label": "", + "label": "搜索引擎", "new": { "label": "" }, @@ -2573,7 +2578,7 @@ } }, "medias": { - "label": "" + "label": "媒体" }, "apps": { "label": "应用", @@ -2593,7 +2598,7 @@ "security": "安全", "board": "面板", "groups": { - "label": "" + "label": "群组" }, "invites": { "label": "邀请" @@ -2605,7 +2610,7 @@ "label": "" }, "logs": { - "label": "" + "label": "日志" } }, "settings": { @@ -2617,7 +2622,7 @@ } }, "search": { - "placeholder": "", + "placeholder": "搜索任意内容", "nothingFound": "", "error": { "fetch": "" @@ -2634,7 +2639,7 @@ "label": "" }, "edit": { - "label": "" + "label": "编辑应用" } }, "detail": { @@ -2650,10 +2655,10 @@ "label": "" }, "homeBoard": { - "label": "" + "label": "设置为主面板" }, "settings": { - "label": "" + "label": "打开设置" } }, "detail": { @@ -2676,14 +2681,14 @@ "title": "", "option": { "colorScheme": { - "light": "", - "dark": "" + "light": "切换到日间模式", + "dark": "切换到暗黑模式" }, "language": { - "label": "", + "label": "更改语言", "children": { "detail": { - "title": "" + "title": "选择你的首选语言" } } }, @@ -2825,25 +2830,25 @@ "label": "" }, "manageApi": { - "label": "" + "label": "Swagger API" }, "manageLog": { - "label": "" + "label": "查看日志" }, "manageTask": { - "label": "" + "label": "管理任务" }, "manageSettings": { - "label": "" + "label": "全局设置" }, "about": { "label": "关于" }, "homeBoard": { - "label": "" + "label": "主面板" }, "preferences": { - "label": "您的首选项" + "label": "偏好设置" } } } @@ -2866,7 +2871,7 @@ } }, "group": { - "title": "", + "title": "群组", "children": { "action": { "detail": { @@ -2900,7 +2905,7 @@ "label": "" }, "description": { - "label": "" + "label": "描述" } }, "page": { @@ -2929,11 +2934,11 @@ "title": "", "notification": { "success": { - "title": "", + "title": "成功应用更改", "message": "" }, "error": { - "title": "", + "title": "无法应用更改", "message": "" } }, diff --git a/packages/translation/src/lang/cr.json b/packages/translation/src/lang/cr.json index e2c405b33..562a7f558 100644 --- a/packages/translation/src/lang/cr.json +++ b/packages/translation/src/lang/cr.json @@ -1381,7 +1381,7 @@ "memory": "crwdns5734:0{memory}crwdne5734:0", "memoryAvailable": "crwdns5736:0{memoryAvailable}crwdnd5736:0{percent}crwdne5736:0", "version": "crwdns5738:0{version}crwdne5738:0", - "uptime": "crwdns5740:0{days}crwdnd5740:0{hours}crwdnd5740:0{minutes}crwdne5740:0", + "uptime": "crwdns7008:0{months}crwdnd7008:0{days}crwdnd7008:0{hours}crwdnd7008:0{minutes}crwdne7008:0", "loadAverage": "crwdns5742:0crwdne5742:0", "minute": "crwdns5744:0crwdne5744:0", "minutes": "crwdns5746:0{count}crwdne5746:0", @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "crwdns5810:0crwdne5810:0", "description": "crwdns5812:0crwdne5812:0", - "option": {} + "option": {}, + "items": { + "user": "crwdns7010:0crwdne7010:0", + "name": "crwdns7012:0crwdne7012:0", + "id": "crwdns7014:0crwdne7014:0" + } }, "downloads": { "name": "crwdns5814:0crwdne5814:0", diff --git a/packages/translation/src/lang/cs.json b/packages/translation/src/lang/cs.json index 02ec270d7..03757122d 100644 --- a/packages/translation/src/lang/cs.json +++ b/packages/translation/src/lang/cs.json @@ -68,20 +68,20 @@ "subtitle": "", "notification": { "success": { - "title": "", - "message": "" + "title": "Uživatel byl vytvořen", + "message": "Uživatel byl úspěšně vytvořen" }, "error": { - "title": "" + "title": "Vytvoření uživatele se nezdařilo" } } }, "group": { - "title": "", + "title": "Externí skupina", "subtitle": "", "form": { "name": { - "label": "", + "label": "Název skupiny", "description": "" } } @@ -91,35 +91,35 @@ "subtitle": "" }, "finish": { - "title": "", - "subtitle": "", - "description": "", + "title": "Dokončit nastavení", + "subtitle": "Jste připraveni začít!", + "description": "Úspěšně jste dokončili proces nastavení. Nyní můžete začít používat Homarr. Vyberte další akci:", "action": { - "goToBoard": "", - "createBoard": "", - "inviteUser": "", - "docs": "" + "goToBoard": "Přejít na plochu {name}", + "createBoard": "Vytvořte svou první plochu", + "inviteUser": "Pozvat ostatní uživatele", + "docs": "Přečtěte si dokumentaci" } } }, - "backToStart": "" + "backToStart": "Zpět na začátek" }, "user": { "title": "Uživatelé", "name": "Uživatel", "page": { "login": { - "title": "", - "subtitle": "" + "title": "Přihlaste se ke svému účtu", + "subtitle": "Vítejte zpět! Zadejte prosím Vaše přihlašovací údaje" }, "invite": { "title": "", - "subtitle": "", - "description": "" + "subtitle": "Vítejte v Homarru! Vytvořte si prosím svůj účet", + "description": "Byli jste pozváni {username}" }, "init": { - "title": "", - "subtitle": "" + "title": "Nová instalace Homarru", + "subtitle": "Vytvořte prosím původního administrátora" } }, "field": { @@ -133,45 +133,45 @@ "password": { "label": "Heslo", "requirement": { - "length": "", + "length": "Obsahuje alespoň 8 znaků", "lowercase": "Obsahuje malé písmeno", "uppercase": "Obsahuje velké písmeno", "number": "Obsahuje číslo", - "special": "" + "special": "Obsahuje speciální symbol" } }, "passwordConfirm": { "label": "Potvrďte heslo" }, "previousPassword": { - "label": "" + "label": "Původní heslo" }, "homeBoard": { - "label": "" + "label": "Domovská plocha" }, "pingIconsEnabled": { - "label": "" + "label": "Používat ikony pro pingy" } }, "error": { - "usernameTaken": "" + "usernameTaken": "Uživatelské jméno je již používáno" }, "action": { "login": { "label": "Přihlásit se", - "labelWith": "", + "labelWith": "Přihlaste se pomocí {provider}", "notification": { "success": { - "title": "", - "message": "" + "title": "Přihlášení bylo úspěšné", + "message": "Nyní jste přihlášeni" }, "error": { - "title": "", - "message": "" + "title": "Příhlášení selhalo", + "message": "Vaše přihlášení se nezdařilo" } }, "forgotPassword": { - "label": "", + "label": "Zapomněli jste Vaše heslo?", "description": "" } }, @@ -180,40 +180,40 @@ "notification": { "success": { "title": "Účet byl vytvořen", - "message": "" + "message": "Chcete-li pokračovat, přihlaste se" }, "error": { - "title": "", - "message": "" + "title": "Vytvoření účtu se nezdařilo", + "message": "Váš účet se nepodařilo vytvořit" } } }, "create": "Vytvořit uživatele", "changePassword": { - "label": "", + "label": "Změnit heslo", "notification": { "success": { - "message": "" + "message": "Heslo bylo úspěšně změněno" }, "error": { - "message": "" + "message": "Nepodařilo se změnit heso" } } }, "changeHomeBoard": { "notification": { "success": { - "message": "" + "message": "Domovská plocha byla úspěšně změněna" }, "error": { - "message": "" + "message": "Nepodařilo se změnit domovskou plochu" } } }, "changeFirstDayOfWeek": { "notification": { "success": { - "message": "" + "message": "První den v týdnu byl úspěšně změněn" }, "error": { "message": "" @@ -247,14 +247,14 @@ } }, "removeImage": { - "label": "", - "confirm": "", + "label": "Odebrat obrázek", + "confirm": "Opravdu chcete odstranit tento obrázek?", "notification": { "success": { - "message": "" + "message": "Obrázek byl úspěšně odstraněn" }, "error": { - "message": "" + "message": "Obrázek nelze odstranit" } } } @@ -262,42 +262,42 @@ "editProfile": { "notification": { "success": { - "message": "" + "message": "Profil byl úspěšně aktualizován" }, "error": { - "message": "" + "message": "Profil nelze aktualizovat" } } }, "delete": { - "label": "", - "description": "", - "confirm": "" + "label": "Trvale smazat uživatele", + "description": "Smaže tohoto uživatele včetně jeho nastavení. Neodstraní žádné plochy. Uživatel nebude upozorněn.", + "confirm": "Jste si jisti, že chcete odstranit uživatele {username} včetně jejich nastavení?" }, "select": { - "label": "", - "notFound": "" + "label": "Vybrat uživatele", + "notFound": "Nebyl nalezen žádný uživatel" }, "transfer": { - "label": "" + "label": "Vyberte nového vlastníka" } } }, "group": { - "title": "", - "name": "", - "search": "", + "title": "Skupiny", + "name": "Skupina", + "search": "Najít skupinu", "field": { "name": "Název", - "members": "" + "members": "Členové" }, "permission": { "admin": { "title": "Administrátor", "item": { "admin": { - "label": "", - "description": "" + "label": "Administrátor", + "description": "Uživatelé s tímto oprávněním mají plný přístup ke všem funkcím a nastavením" } } }, @@ -305,20 +305,20 @@ "title": "Aplikace", "item": { "create": { - "label": "", - "description": "" + "label": "Vytvořit aplikace", + "description": "Povolit členům vytvářet aplikace" }, "use-all": { - "label": "", - "description": "" + "label": "Používat všechny aplikace", + "description": "Umožňuje členům přidávat do jejich ploch jakékoli aplikace" }, "modify-all": { - "label": "", - "description": "" + "label": "Upravit všechny aplikace", + "description": "Umožňuje členům upravovat všechny aplikace" }, "full-all": { - "label": "", - "description": "" + "label": "Úplný přístup k aplikacím", + "description": "Umožňuje členům spravovat, používat a mazat jakoukoli aplikaci" } } }, @@ -326,16 +326,16 @@ "title": "Plochy", "item": { "create": { - "label": "", - "description": "" + "label": "Tvorba ploch", + "description": "Umožňuje členům vytvářet plochy" }, "view-all": { - "label": "", - "description": "" + "label": "Zobrazit všechny plochy", + "description": "Umožňuje členům zobrazit všechny plochy" }, "modify-all": { - "label": "", - "description": "" + "label": "Upravit všechny plochy", + "description": "Umožňuje členům upravovat všechny plochy (nezahrnuje kontrolu přístupu a nebezpečnou zónu)" }, "full-all": { "label": "", @@ -344,83 +344,83 @@ } }, "integration": { - "title": "", + "title": "Integrace", "item": { "create": { - "label": "", - "description": "" + "label": "Vytvořit integrace", + "description": "Povolit členům vytvářet integrace" }, "use-all": { - "label": "", - "description": "" + "label": "Použít všechny integrace", + "description": "Umožňuje členům přidávat do jejich ploch jakékoli integrace" }, "interact-all": { - "label": "", - "description": "" + "label": "Interakce s jakoukoli integrací", + "description": "Umožnit členům interagovat s jakoukoli integrací" }, "full-all": { - "label": "", - "description": "" + "label": "Plný přístup k integraci", + "description": "Umožňuje členům spravovat, používat a interagovat s jakoukoli integrací" } } }, "media": { - "title": "", + "title": "Média", "item": { "upload": { - "label": "", - "description": "" + "label": "Nahrávat média", + "description": "Povolit členům nahrávat média" }, "view-all": { - "label": "", - "description": "" + "label": "Zobrazit všechna média", + "description": "Umožňuje členům nahrávat média" }, "full-all": { - "label": "", + "label": "Úplný přístup k médiím", "description": "" } } }, "other": { - "title": "", + "title": "Ostatní", "item": { "view-logs": { - "label": "", - "description": "" + "label": "Zobrazit logy", + "description": "Umožňuje členům prohlížet logy" } } }, "search-engine": { - "title": "", + "title": "Vyhledávače", "item": { "create": { - "label": "", - "description": "" + "label": "Vytvořit vyhledávače", + "description": "Umožňuje členům vytvářet vyhledávače" }, "modify-all": { "label": "", - "description": "" + "description": "Umožňuje členům upravovat všechny vyhledávače" }, "full-all": { - "label": "", - "description": "" + "label": "Úplný přístup k vyhledávačům", + "description": "Umožňuje členům spravovat a mazat jakýkoliv vyhledávač" } } } }, "memberNotice": { - "mixed": "", - "external": "" + "mixed": "Někteří členové jsou od externích poskytovatelů a nelze je spravovat zde", + "external": "Všichni členové jsou od externích poskytovatelů a nelze je spravovat zde" }, "reservedNotice": { - "message": "" + "message": "Tato skupina je vyhrazena pro používání systému a omezuje některé akce. " }, "action": { "create": { - "label": "", + "label": "Nová skupina", "notification": { "success": { - "message": "" + "message": "Skupina byla úspěšně vytvořena" }, "error": { "message": "" @@ -506,34 +506,34 @@ }, "error": { "title": "", - "message": "" + "message": "Aplikaci nelze vytvořit" } } }, "edit": { - "title": "", + "title": "Upravit aplikaci", "notification": { "success": { - "title": "", - "message": "" + "title": "Změny úspěšně aplikovány", + "message": "Aplikace byla úspěšně uložena" }, "error": { - "title": "", - "message": "" + "title": "Nepodařilo se uložit změny", + "message": "Aplikaci se nepodařilo uložit" } } }, "delete": { - "title": "", - "message": "", + "title": "Vymazat aplikaci", + "message": "Jste si jisti, že chcete vymazat aplikaci {name}?", "notification": { "success": { - "title": "", - "message": "" + "title": "Úspěšně odstraněno", + "message": "Aplikace byla úspěšně odstraněna" }, "error": { - "title": "", - "message": "" + "title": "Smazání se nezdařilo", + "message": "Nelze odstranit aplikaci" } } } @@ -543,15 +543,15 @@ "label": "Název" }, "description": { - "label": "" + "label": "Popis" }, "url": { - "label": "" + "label": "Url" } }, "action": { "select": { - "label": "", + "label": "Vybrat aplikaci", "notFound": "" } } @@ -559,49 +559,49 @@ "integration": { "page": { "list": { - "title": "", - "search": "", + "title": "Integrace", + "search": "Prohledat integrace", "noResults": { - "title": "" + "title": "Zatím nejsou žádné integrace" } }, "create": { - "title": "", + "title": "Nová integrace {name}", "notification": { "success": { - "title": "", - "message": "" + "title": "Vytvoření bylo úspěšné", + "message": "Integrace byla úspěšně vytvořena" }, "error": { - "title": "", - "message": "" + "title": "Vytvoření se nezdařilo", + "message": "Integraci se nepodařilo vytvořit" } } }, "edit": { - "title": "", + "title": "Upravit integraci {name}", "notification": { "success": { - "title": "", - "message": "" + "title": "Změny byly úspěšně aplikovány", + "message": "Integrace byla úspěšně uložena" }, "error": { - "title": "", - "message": "" + "title": "Nepodařilo se uložit změny", + "message": "Integraci se nepodařilo uložit" } } }, "delete": { - "title": "", - "message": "", + "title": "Smazat integraci", + "message": "Jste si jisti, že chcete vymazat integraci {name}?", "notification": { "success": { - "title": "", - "message": "" + "title": "Odstránění bylo úspěšné", + "message": "Integrace byla úspěšně smazána" }, "error": { - "title": "", - "message": "" + "title": "Smazání se nezdařilo", + "message": "Nepodařilo se odstranit integraci" } } } @@ -611,41 +611,41 @@ "label": "Název" }, "url": { - "label": "" + "label": "Url" } }, "action": { - "create": "" + "create": "Nová integrace" }, "testConnection": { "action": { - "create": "", - "edit": "" + "create": "Otestovat připojení a vytvořit", + "edit": "Otestovat připojení a uložit" }, "alertNotice": "", "notification": { "success": { - "title": "", + "title": "Spojení bylo úspěšné", "message": "" }, "invalidUrl": { "title": "Neplatná URL adresa", - "message": "" + "message": "URL adresa je neplatná" }, "secretNotDefined": { - "title": "", - "message": "" + "title": "Chybějící přihlašovací údaje", + "message": "Nebyly poskytnuty všechny přihlašovací údaje" }, "invalidCredentials": { - "title": "", - "message": "" + "title": "Neplatné přihlašovací údaje", + "message": "Přihlašovací údaje jsou neplatné" }, "commonError": { - "title": "", - "message": "" + "title": "Spojení selhalo", + "message": "Spojení nelze navázat" }, "badRequest": { - "title": "", + "title": "Chybný požadavek", "message": "" }, "unauthorized": { @@ -766,89 +766,89 @@ } }, "common": { - "beta": "", + "beta": "Beta", "error": "Chyba", "action": { "add": "Přidat", "apply": "Použít", - "backToOverview": "", + "backToOverview": "Zpět na přehled", "create": "Vytvořit", "edit": "Upravit", - "import": "", + "import": "Importovat", "insert": "Vložit", "remove": "Odstranit", "save": "Uložit", "saveChanges": "Uložit změny", "cancel": "Zrušit", "delete": "Odstranit", - "discard": "", + "discard": "Zahodit", "confirm": "Potvrdit", - "continue": "", + "continue": "Pokračovat", "previous": "Zpět", "next": "Další", - "checkoutDocs": "", - "checkLogs": "", + "checkoutDocs": "Přečtěte si dokumentaci", + "checkLogs": "Pro více podrobností zkontrolujte logy", "tryAgain": "Zkusit znovu", - "loading": "" + "loading": "Načítání" }, - "here": "", + "here": "zde", "iconPicker": { - "label": "", + "label": "URL ikony", "header": "" }, "colorScheme": { "options": { - "light": "", - "dark": "" + "light": "Světlý", + "dark": "Tmavý" } }, "information": { - "min": "", - "max": "", - "days": "", + "min": "Min", + "max": "Max", + "days": "Dnů", "hours": "Hodin", "minutes": "Minut" }, "notification": { "create": { - "success": "", - "error": "" + "success": "Vytvoření bylo úspěšné", + "error": "Vytvoření se nezdařilo" }, "delete": { - "success": "", - "error": "" + "success": "Odstranění bylo úspěšné", + "error": "Odstranění se nezdařilo" }, "update": { - "success": "", - "error": "" + "success": "Změny byly úspěšně aplikovány", + "error": "Nepodařilo se uložit změny" }, "transfer": { - "success": "", - "error": "" + "success": "Přenos úspěšný", + "error": "Přenos se nezdařil" } }, "multiSelect": { "placeholder": "" }, "multiText": { - "placeholder": "", - "addLabel": "" + "placeholder": "Přidat více hodnot", + "addLabel": "Přidat {value}" }, "select": { - "placeholder": "", + "placeholder": "Vybrat hodnotu", "badge": { - "recommended": "" + "recommended": "Doporučeno" } }, "userAvatar": { "menu": { - "switchToDarkMode": "", - "switchToLightMode": "", - "management": "", + "switchToDarkMode": "Přepnout do tmavého režimu", + "switchToLightMode": "Přepnout do světlého režimu", + "management": "Správa", "preferences": "Vaše předvolby", - "logout": "", + "logout": "Odhlásit se", "login": "Přihlásit se", - "homeBoard": "", + "homeBoard": "Vaše domácí plocha", "loggedOut": "", "updateAvailable": "" } @@ -856,8 +856,8 @@ "dangerZone": "Nebezpečná zóna", "noResults": "Nebyly nalezeny žádné výsledky", "preview": { - "show": "", - "hide": "" + "show": "Zobrazit náhled", + "hide": "Skrýt náhled" }, "zod": { "errors": { @@ -867,7 +867,7 @@ "startsWith": "Toto pole musí začínat {startsWith}", "endsWith": "Toto pole musí končit {endsWith}", "includes": "Toto pole musí obsahovat {includes}", - "invalidEmail": "" + "invalidEmail": "Toto pole musí být platný e-mail" }, "tooSmall": { "string": "Toto pole musí obsahovat alespoň {minimum} znaků", @@ -878,13 +878,13 @@ "number": "Toto pole musí být menší nebo rovno {maximum}" }, "custom": { - "passwordsDoNotMatch": "", - "passwordRequirements": "", - "boardAlreadyExists": "", - "invalidFileType": "", - "fileTooLarge": "", - "invalidConfiguration": "", - "groupNameTaken": "" + "passwordsDoNotMatch": "Hesla se neshodují", + "passwordRequirements": "Heslo nesplňuje požadavky", + "boardAlreadyExists": "Plocha s tímto názvem již existuje", + "invalidFileType": "Neplatný typ souboru, očekáván {expected}", + "fileTooLarge": "Soubor je příliš velký, maximální velikost je {maxSize}", + "invalidConfiguration": "Neplatná konfigurace", + "groupNameTaken": "Název skupiny je již používán" } } } @@ -892,11 +892,11 @@ "section": { "dynamic": { "action": { - "create": "", - "remove": "" + "create": "Nová dynamická sekce", + "remove": "Odstranit dynamickou sekci" }, "remove": { - "title": "", + "title": "Odstranit dynamickou sekci", "message": "" } }, @@ -1047,7 +1047,7 @@ }, "dnsHoleSummary": { "name": "", - "description": "", + "description": "Zobrazí shrnutí vaší DNS Hole", "option": { "layout": { "label": "Rozložení", @@ -1059,16 +1059,16 @@ "label": "Vertikální" }, "grid": { - "label": "" + "label": "Mřížka" } } }, "usePiHoleColors": { - "label": "" + "label": "Používat barvy Pi-Hole" } }, "error": { - "internalServerError": "", + "internalServerError": "Nepodařilo se načíst souhrn DNS Hole", "integrationsDisconnected": "" }, "data": { @@ -1092,7 +1092,7 @@ "label": "Vertikální" }, "grid": { - "label": "" + "label": "Mřížka" } } }, @@ -1104,21 +1104,21 @@ "internalServerError": "" }, "controls": { - "enableAll": "", - "disableAll": "", - "setTimer": "", + "enableAll": "Povolit vše", + "disableAll": "Zakázat vše", + "setTimer": "Nastavit časovač", "set": "Nastavit", "enabled": "Zapnuto", "disabled": "Vypnuto", - "processing": "", + "processing": "Zpracovávání", "disconnected": "", "hours": "Hodin", "minutes": "Minut", - "unlimited": "" + "unlimited": "Ponechte prázdné pro neomezené" } }, "clock": { - "name": "", + "name": "Datum a čas", "description": "Zobrazuje aktuální datum a čas.", "option": { "customTitleToggle": { @@ -1126,17 +1126,17 @@ "description": "" }, "customTitle": { - "label": "" + "label": "Název" }, "is24HourFormat": { - "label": "", - "description": "" + "label": "24hodinový formát", + "description": "Použít 24hodinový formát místo 12hodinového formátu" }, "showSeconds": { - "label": "" + "label": "Zobrazit vteřiny" }, "useCustomTimezone": { - "label": "" + "label": "Použít pevné časové pásmo" }, "timezone": { "label": "Časové pásmo", @@ -1146,7 +1146,7 @@ "label": "" }, "dateFormat": { - "label": "", + "label": "Formát data", "description": "" } } @@ -1213,11 +1213,11 @@ } }, "iframe": { - "name": "", + "name": "iFrame", "description": "Vložte jakýkoli obsah z internetu. Některé webové stránky mohou omezit přístup.", "option": { "embedUrl": { - "label": "" + "label": "Embed URL" }, "allowFullScreen": { "label": "Povolit celou obrazovku" @@ -1245,12 +1245,12 @@ } }, "error": { - "noUrl": "", + "noUrl": "Nebyla zadána URL adresa iFrame", "noBrowerSupport": "Váš prohlížeč nepodporuje iFrame. Aktualizujte, prosím, svůj prohlížeč." } }, "smartHome-entityState": { - "name": "", + "name": "Stav entity", "description": "", "option": { "entityId": { @@ -1316,7 +1316,7 @@ "label": "" }, "hasForecast": { - "label": "" + "label": "Zobrazit předpověď" }, "forecastDayCount": { "label": "", @@ -1400,14 +1400,14 @@ "latitude": "", "longitude": "", "disabledTooltip": "", - "unknownLocation": "", + "unknownLocation": "Neznámá poloha", "search": "Vyhledat", "table": { "header": { - "city": "", - "country": "", - "coordinates": "", - "population": "" + "city": "Město", + "country": "Státy", + "coordinates": "Souřadnice", + "population": "Populace" }, "action": { "select": "" @@ -1418,16 +1418,16 @@ } }, "integration": { - "noData": "", - "description": "" + "noData": "Nebyla nalezena žádná integrace", + "description": "Klikněte na pro vytvoření nové integrace" }, "app": { "noData": "", - "description": "" + "description": "Klikněte na pro vytvoření nové aplikace" }, "error": { - "noIntegration": "", - "noData": "" + "noIntegration": "Nebyla vybrána žádná integrace", + "noData": "Nejsou k dispozici žádná data o integraci" }, "option": {} }, @@ -1440,7 +1440,7 @@ }, "hasAutoPlay": { "label": "Automatické přehrávání", - "description": "" + "description": "Automatické přehrávání funguje pouze když je ztlumeno kvůli omezením prohlížeče" }, "isMuted": { "label": "" @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "Uživatel", + "name": "Jméno", + "id": "Id" + } }, "downloads": { "name": "", @@ -1515,11 +1520,11 @@ "detailsTitle": "Rychlost stahování" }, "index": { - "columnTitle": "", + "columnTitle": "#", "detailsTitle": "" }, "id": { - "columnTitle": "" + "columnTitle": "Id" }, "integration": { "columnTitle": "Integrace" @@ -1536,12 +1541,12 @@ "detailsTitle": "" }, "received": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "Celkem staženo", + "detailsTitle": "Celkem staženo" }, "sent": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "Celkem nahráno", + "detailsTitle": "Celkem nahráno" }, "size": { "columnTitle": "", diff --git a/packages/translation/src/lang/da.json b/packages/translation/src/lang/da.json index 4b402617e..03b0b25bd 100644 --- a/packages/translation/src/lang/da.json +++ b/packages/translation/src/lang/da.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/de.json b/packages/translation/src/lang/de.json index 32d1f57d4..3cb3449f6 100644 --- a/packages/translation/src/lang/de.json +++ b/packages/translation/src/lang/de.json @@ -1381,7 +1381,7 @@ "memory": "Speicher: {memory}GiB", "memoryAvailable": "Verfügbar: {memoryAvailable} GiB ({percent}%)", "version": "", - "uptime": "Betriebszeit: {days} Tage, {hours} Stunden, {minutes} Minuten", + "uptime": "Laufzeit: {months} Monate, {days} Tage, {hours} Stunden, {minutes} Minuten", "loadAverage": "Durchschnittliche Last:", "minute": "1 Minute", "minutes": "{count} Minuten", @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/el.json b/packages/translation/src/lang/el.json index f8a385f15..5f0727cb0 100644 --- a/packages/translation/src/lang/el.json +++ b/packages/translation/src/lang/el.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 516d0d5a5..9a87ad643 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -612,6 +612,10 @@ }, "url": { "label": "Url" + }, + "attemptSearchEngineCreation": { + "label": "Create Search Engine", + "description": "Integration \"{kind}\" can be used with the search engines. Check this to automatically configure the search engine." } }, "action": { @@ -1151,6 +1155,25 @@ } } }, + "minecraftServerStatus": { + "name": "Minecraft Server Status", + "description": "Displays the status of a Minecraft server", + "option": { + "title": { + "label": "Title" + }, + "domain": { + "label": "Server address" + }, + "isBedrockServer": { + "label": "Bedrock server" + } + }, + "status": { + "online": "Online", + "offline": "Offline" + } + }, "notebook": { "name": "Notebook", "description": "A simple notebook widget that supports markdown", @@ -1381,7 +1404,7 @@ "memory": "Memory: {memory}GiB", "memoryAvailable": "Available: {memoryAvailable}GiB ({percent}%)", "version": "Version: {version}", - "uptime": "Uptime: {days} Days, {hours} Hours, {minutes} Minutes", + "uptime": "Uptime: {months} Months, {days} Days, {hours} Hours, {minutes} Minutes", "loadAverage": "Load average:", "minute": "1 minute", "minutes": "{count} minutes", @@ -1457,7 +1480,12 @@ "mediaServer": { "name": "Current media server streams", "description": "Show the current streams on your media servers", - "option": {} + "option": {}, + "items": { + "user": "User", + "name": "Name", + "id": "Id" + } }, "downloads": { "name": "Download Client", @@ -2319,6 +2347,9 @@ "error": "Error" }, "job": { + "minecraftServerStatus": { + "label": "Minecraft server status" + }, "iconsUpdater": { "label": "Icons Updater" }, @@ -2717,6 +2748,11 @@ } } }, + "media": { + "requestMovie": "Request movie", + "requestSeries": "Request series", + "openIn": "Open in {kind}" + }, "external": { "help": "Use an external search engine", "group": { @@ -2957,6 +2993,22 @@ } } } + }, + "media": { + "request": { + "modal": { + "title": "Request \"{name}\"", + "table": { + "header": { + "season": "Season", + "episodes": "Episodes" + } + }, + "button": { + "send": "Send request" + } + } + } } } } diff --git a/packages/translation/src/lang/es.json b/packages/translation/src/lang/es.json index 92f5ddfc0..239d12d6d 100644 --- a/packages/translation/src/lang/es.json +++ b/packages/translation/src/lang/es.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/et.json b/packages/translation/src/lang/et.json index 1e6479a95..4f72a2dba 100644 --- a/packages/translation/src/lang/et.json +++ b/packages/translation/src/lang/et.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/fr.json b/packages/translation/src/lang/fr.json index 6ab07d8ed..61d7b9767 100644 --- a/packages/translation/src/lang/fr.json +++ b/packages/translation/src/lang/fr.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/he.json b/packages/translation/src/lang/he.json index ef2c269ca..9583a92bf 100644 --- a/packages/translation/src/lang/he.json +++ b/packages/translation/src/lang/he.json @@ -92,7 +92,7 @@ }, "finish": { "title": "סיים את ההגדרה", - "subtitle": "", + "subtitle": "המערכת מוכנה לפעולה!", "description": "השלמת בהצלחה את תהליך ההגדרה. כעת תוכל להתחיל להשתמש ב-Homarr. בחר את הפעולה הבאה שלך:", "action": { "goToBoard": "עבור ללוח {name}", @@ -449,7 +449,7 @@ }, "delete": { "label": "מחק קבוצה", - "description": "", + "description": "ברגע שתמחק/י קבוצה, לא ניתן יהיה לחזור אחורה. אנא ודא/י זאת בוודאות.", "confirm": "האם אתה בטוח שברצונך למחוק את הקבוצה {name}?", "notification": { "success": { @@ -634,86 +634,86 @@ }, "secretNotDefined": { "title": "חסרים פרטי התחברות", - "message": "" + "message": "לא סופקו כל פרטי ההתחברות" }, "invalidCredentials": { - "title": "", - "message": "" + "title": "פרטי התחברות שגויים", + "message": "פרטי ההתחברות אינם חוקיים" }, "commonError": { - "title": "", - "message": "" + "title": "החיבור נכשל", + "message": "לא ניתן היה ליצור את החיבור" }, "badRequest": { - "title": "", - "message": "" + "title": "בקשה שגויה", + "message": "הבקשה הייתה שגויה" }, "unauthorized": { - "title": "", - "message": "" + "title": "לא מורשה", + "message": "כנראה פרטי התחברות שגויים" }, "forbidden": { - "title": "", - "message": "" + "title": "אסור", + "message": "כנראה חסרות הרשאות" }, "notFound": { - "title": "", - "message": "" + "title": "לא נמצא", + "message": "כנראה כתובת אתר או נתיב שגויים" }, "internalServerError": { - "title": "", - "message": "" + "title": "שגיאת שרת פנימית", + "message": "השרת נתקל בשגיאה" }, "serviceUnavailable": { - "title": "", - "message": "" + "title": "השירות אינו זמין", + "message": "השרת אינו זמין כרגע" }, "connectionAborted": { - "title": "", - "message": "" + "title": "החיבור הופסק", + "message": "החיבור בוטל" }, "domainNotFound": { - "title": "", - "message": "" + "title": "הדומיין לא נמצא", + "message": "לא ניתן למצוא את הדומיין" }, "connectionRefused": { - "title": "", - "message": "" + "title": "החיבור נדחה", + "message": "החיבור נדחה" }, "invalidJson": { - "title": "", - "message": "" + "title": "JSON לא חוקי", + "message": "התגובה לא הייתה JSON חוקי" }, "wrongPath": { - "title": "", - "message": "" + "title": "נתיב שגוי", + "message": "כנראה שהנתיב שגוי" } } }, "secrets": { - "title": "", - "lastUpdated": "", + "title": "נתוני גישה", + "lastUpdated": "עדכון אחרון {date}", "notSet": { - "label": "", - "tooltip": "" + "label": "לא הוגדר ערך", + "tooltip": "נתון הגישה הנדרש עדיין לא נקבע" }, - "secureNotice": "", + "secureNotice": "לא ניתן לאחזר את נתון הגישה לאחר היצירה", "reset": { - "title": "", - "message": "" + "title": "איפוס נתון גישה", + "message": "האם את/ה בטוח/ה שברצונך למחוק את נתון הגישה הזה?" }, "noSecretsRequired": { - "segmentTitle": "", - "text": "" + "segmentTitle": "אין נתוני גישה", + "text": "לא נדרשים נתוני גישה לאינטגרציה זו" }, "kind": { "username": { "label": "שם משתמש", - "newLabel": "" + "newLabel": "שם משתמש חדש" }, "apiKey": { - "label": "", - "newLabel": "" + "label": "מפתח API", + "newLabel": "מפתח API חדש" }, "password": { "label": "סיסמה", @@ -722,14 +722,14 @@ } }, "permission": { - "use": "", - "interact": "", + "use": "בחר אינטגרציות בפריטים", + "interact": "אינטראקציה עם אינטגרציות", "full": "גישת אינטגרציה מלאה" } }, "media": { "plural": "מדיה", - "search": "", + "search": "מצא מדיה", "field": { "name": "שם", "size": "גודל", @@ -737,75 +737,75 @@ }, "action": { "upload": { - "label": "", - "file": "", + "label": "העלה מדיה", + "file": "בחר קובץ", "notification": { "success": { - "message": "" + "message": "המדיה הועלתה בהצלחה" }, "error": { - "message": "" + "message": "לא ניתן היה להעלות את המדיה" } } }, "delete": { - "label": "", - "description": "", + "label": "מחק מדיה", + "description": "האם אתה בטוח שברצונך למחוק את המדיה ?", "notification": { "success": { - "message": "" + "message": "המדיה נמחקה בהצלחה" }, "error": { - "message": "" + "message": "לא ניתן למחוק את המדיה" } } }, "copy": { - "label": "" + "label": "העתק קישור" } } }, "common": { - "beta": "", + "beta": "בטא", "error": "שגיאה", "action": { "add": "הוסף", "apply": "החל", - "backToOverview": "", + "backToOverview": "חזרה לסקירה כללית", "create": "צור", "edit": "עריכה", - "import": "", + "import": "ייבוא", "insert": "הוספה", "remove": "הסר", "save": "שמור", "saveChanges": "שמור שינויים", "cancel": "בטל", "delete": "מחיקה", - "discard": "", + "discard": "ביטול", "confirm": "לאשר", - "continue": "", + "continue": "המשך", "previous": "הקודם", "next": "הבא", - "checkoutDocs": "", - "checkLogs": "", + "checkoutDocs": "בדוק את התיעוד", + "checkLogs": "בדוק לוגים לפרטים נוספים", "tryAgain": "נא לנסות שוב", - "loading": "" + "loading": "טוען" }, - "here": "", + "here": "כאן", "iconPicker": { - "label": "", - "header": "" + "label": "קישור של הסמל", + "header": "הקלד שם או אובייקטים לסינון עבור אייקונים... Homarr יחפש עבורך סמלים של {countIcons} ." }, "colorScheme": { "options": { - "light": "", - "dark": "" + "light": "בהיר", + "dark": "כהה" } }, "information": { - "min": "", - "max": "", - "days": "", + "min": "מינימום", + "max": "מקסימום", + "days": "ימים", "hours": "שעות", "minutes": "דקות" }, @@ -823,41 +823,41 @@ "error": "לא ניתן להחיל שינויים" }, "transfer": { - "success": "", - "error": "" + "success": "הועבר בהצלחה", + "error": "ההעברה נכשלה" } }, "multiSelect": { - "placeholder": "" + "placeholder": "בחר ערך אחד או יותר" }, "multiText": { - "placeholder": "", - "addLabel": "" + "placeholder": "הוסף עוד ערכים", + "addLabel": "הוסף {value}" }, "select": { - "placeholder": "", + "placeholder": "בחר ערך", "badge": { - "recommended": "" + "recommended": "מומלץ" } }, "userAvatar": { "menu": { - "switchToDarkMode": "", - "switchToLightMode": "", - "management": "", + "switchToDarkMode": "עבור למצב כהה", + "switchToLightMode": "עבור למצב בהיר", + "management": "ניהול", "preferences": "העדפות שלך", - "logout": "", + "logout": "התנתק/י", "login": "התחבר/י", - "homeBoard": "", - "loggedOut": "", - "updateAvailable": "" + "homeBoard": "לוח הבית שלך", + "loggedOut": "נותקת מהמערכת", + "updateAvailable": "{countUpdates} עדכונים זמינים: {tag}" } }, "dangerZone": "אזור מסוכן", "noResults": "לא נמצאו תוצאות", "preview": { - "show": "", - "hide": "" + "show": "הצג תצוגה מקדימה", + "hide": "הסתר תצוגה המקדימה" }, "zod": { "errors": { @@ -867,7 +867,7 @@ "startsWith": "שדה זה חייב להתחיל עם {startsWith}", "endsWith": "שדה זה חייב להסתיים עם {endsWith}", "includes": "שדה זה חייב להכיל {includes}", - "invalidEmail": "" + "invalidEmail": "שדה זה חייב להיות דוא\"ל חוקי" }, "tooSmall": { "string": "שדה זה חייב להיות באורך של {minimum} תווים לפחות", @@ -878,13 +878,13 @@ "number": "שדה זה חייב להיות קטן או שווה ל {maximum}" }, "custom": { - "passwordsDoNotMatch": "", - "passwordRequirements": "", - "boardAlreadyExists": "", - "invalidFileType": "", - "fileTooLarge": "", - "invalidConfiguration": "", - "groupNameTaken": "" + "passwordsDoNotMatch": "סיסמאות לא תואמות", + "passwordRequirements": "הסיסמה אינה עומדת בדרישות", + "boardAlreadyExists": "לוח בשם זה כבר קיים", + "invalidFileType": "סוג קובץ לא חוקי, צפוי {expected}", + "fileTooLarge": "הקובץ גדול מדי, הגודל המרבי הוא {maxSize}", + "invalidConfiguration": "תצורה לא חוקית", + "groupNameTaken": "שם הקבוצה כבר תפוס" } } } @@ -892,12 +892,12 @@ "section": { "dynamic": { "action": { - "create": "", - "remove": "" + "create": "מדור דינמי חדש", + "remove": "הסר קטע דינמי" }, "remove": { - "title": "", - "message": "" + "title": "הסר קטע דינמי", + "message": "האם אתה בטוח שברצונך להסיר את הקטע הדינמי הזה? פריטים יועברו לאותו מיקום במדור האב." } }, "category": { @@ -907,29 +907,29 @@ } }, "action": { - "create": "", - "edit": "", - "remove": "", + "create": "קטגוריה חדשה", + "edit": "שנה את שם הקטגוריה", + "remove": "הסר קטגוריה", "moveUp": "הזזה למעלה", "moveDown": "הזזה למטה", - "createAbove": "", - "createBelow": "" + "createAbove": "קטגוריה חדשה למעלה", + "createBelow": "קטגוריה חדשה למטה" }, "create": { - "title": "", - "submit": "" + "title": "קטגוריה חדשה", + "submit": "הוסף קטגוריה" }, "remove": { - "title": "", - "message": "" + "title": "הסר קטגוריה", + "message": "האם אתה בטוח שברצונך להסיר את הקטגוריה {name}?" }, "edit": { - "title": "", - "submit": "" + "title": "שנה את שם הקטגוריה", + "submit": "שנה את שם הקטגוריה" }, "menu": { "label": { - "create": "", + "create": "קטגוריה חדשה", "changePosition": "שנה מיקום" } } @@ -937,12 +937,12 @@ }, "item": { "action": { - "create": "", - "import": "", - "edit": "", - "moveResize": "", - "duplicate": "", - "remove": "" + "create": "פריט חדש", + "import": "ייבוא פריט", + "edit": "ערוך פריט", + "moveResize": "הזז/שנה גודל פריט", + "duplicate": "שכפול פריט", + "remove": "הסרת פריט" }, "menu": { "label": { @@ -950,11 +950,11 @@ } }, "create": { - "title": "", - "addToBoard": "" + "title": "בחירת פריט להוספה", + "addToBoard": "הוספה ללוח" }, "moveResize": { - "title": "", + "title": "הזז/שנה גודל פריט", "field": { "width": { "label": "רוחב" @@ -963,67 +963,67 @@ "label": "גובה" }, "xOffset": { - "label": "" + "label": "היסט X" }, "yOffset": { - "label": "" + "label": "היסט Y" } } }, "edit": { - "title": "", + "title": "ערוך פריט", "advancedOptions": { - "label": "", - "title": "" + "label": "אפשרויות מתקדמות", + "title": "אפשרויות פריט מתקדמות" }, "field": { "integrations": { "label": "אינטגרציות" }, "customCssClasses": { - "label": "" + "label": "מחלקות עיצוב מותאמות אישית" } } }, "remove": { - "title": "", - "message": "" + "title": "הסרת פריט", + "message": "האם אתה בטוח שברצונך להסיר פריט זה?" } }, "widget": { "app": { - "name": "", - "description": "", + "name": "אפליקציה", + "description": "הטמעת אפליקציה בלוח.", "option": { "appId": { - "label": "" + "label": "בחר אפליקציה" }, "openInNewTab": { "label": "פתיחה בכרטיסיה חדשה" }, "showTitle": { - "label": "" + "label": "הצג את שם האפליקציה" }, "showDescriptionTooltip": { - "label": "" + "label": "הצג תיאור" }, "pingEnabled": { - "label": "" + "label": "אפשר פינג פשוט" } }, "error": { "notFound": { - "label": "", - "tooltip": "" + "label": "אין אפליקציה", + "tooltip": "לא נבחרה אפליקציה חוקית" } } }, "bookmarks": { - "name": "", - "description": "", + "name": "סימניות", + "description": "מציג קישורי אפליקציות מרובים", "option": { "title": { - "label": "" + "label": "כותרת" }, "layout": { "label": "פריסה", @@ -1035,19 +1035,19 @@ "label": "אנכי" }, "grid": { - "label": "" + "label": "רשת" } } }, "items": { - "label": "", - "add": "" + "label": "סימניות", + "add": "הוסף סימניה" } } }, "dnsHoleSummary": { - "name": "", - "description": "", + "name": "סיכום חור אבטחה DNS", + "description": "מציג את הסיכום חור אבטחת DNS שלך", "option": { "layout": { "label": "פריסה", @@ -1059,27 +1059,27 @@ "label": "אנכי" }, "grid": { - "label": "" + "label": "רשת" } } }, "usePiHoleColors": { - "label": "" + "label": "השתמש בצבעי Pi-Hole" } }, "error": { - "internalServerError": "", - "integrationsDisconnected": "" + "internalServerError": "אחזור סיכום החור אבטחת DNS נכשל", + "integrationsDisconnected": "אין נתונים זמינים, כל האינטגרציות מנותקות" }, "data": { "adsBlockedToday": "נחסמו היום", "adsBlockedTodayPercentage": "נחסמו היום", "dnsQueriesToday": "שאילתות היום", - "domainsBeingBlocked": "" + "domainsBeingBlocked": "דומיינים ברשימת החסימה" } }, "dnsHoleControls": { - "name": "", + "name": "בקרות חור אבטחת DNS", "description": "שלוט ב-PiHole או ב-AdGuard מלוח המחוונים שלך", "option": { "layout": { @@ -1092,68 +1092,68 @@ "label": "אנכי" }, "grid": { - "label": "" + "label": "רשת" } } }, "showToggleAllButtons": { - "label": "" + "label": "הצג את כל הלחצנים" } }, "error": { - "internalServerError": "" + "internalServerError": "השליטה בחור אבטחת DNS נכשלה" }, "controls": { - "enableAll": "", - "disableAll": "", - "setTimer": "", + "enableAll": "אפשר הכל", + "disableAll": "השבת הכל", + "setTimer": "הגדר טיימר", "set": "הגדר", "enabled": "מאופשר", "disabled": "מושבת", - "processing": "", - "disconnected": "", + "processing": "מעבד", + "disconnected": "מנותק", "hours": "שעות", "minutes": "דקות", - "unlimited": "" + "unlimited": "השאר ריק עבור ללא הגבלה" } }, "clock": { - "name": "", + "name": "תאריך ושעה", "description": "מציג את התאריך והשעה הנוכחיים.", "option": { "customTitleToggle": { - "label": "", - "description": "" + "label": "תצוגת כותרת/עיר מותאמת אישית", + "description": "הצג כותרת מותאמת אישית או שם העיר/המדינה על גבי השעון." }, "customTitle": { - "label": "" + "label": "כותרת" }, "is24HourFormat": { - "label": "", - "description": "" + "label": "פורמט 24 שעות", + "description": "השתמש בפורמט של 24 שעות במקום בפורמט של 12 שעות" }, "showSeconds": { - "label": "" + "label": "הצג שניות" }, "useCustomTimezone": { - "label": "" + "label": "השתמש באזור זמן קבוע" }, "timezone": { "label": "אזור זמן", - "description": "" + "description": "בחר את אזור הזמן בהתאם לתקן IANA" }, "showDate": { - "label": "" + "label": "הצג את התאריך" }, "dateFormat": { - "label": "", - "description": "" + "label": "פורמט תאריך", + "description": "איך צריך להיראות התאריך" } } }, "notebook": { "name": "פנקס רשימות", - "description": "", + "description": "ווידג'ט פשוט של מחברת התומך ב-markdown", "option": { "showToolbar": { "label": "הצג את סרגל הכלים לסיוע כתיבת סימון" @@ -1245,31 +1245,31 @@ } }, "error": { - "noUrl": "", + "noUrl": "לא סופק קישור של iFrame", "noBrowerSupport": "הדפדפן שלך אינו תומך ב-iframes. נא עדכן את הדפדפן שלך." } }, "smartHome-entityState": { - "name": "", - "description": "", + "name": "מצב ישות", + "description": "הצג את המצב של ישות והחלף אותו באופן אופציונלי", "option": { "entityId": { "label": "מזהה ישות" }, "displayName": { - "label": "" + "label": "שם תצוגה" }, "entityUnit": { - "label": "" + "label": "יחידת ישות" }, "clickable": { - "label": "" + "label": "ניתן ללחיצה" } } }, "smartHome-executeAutomation": { - "name": "", - "description": "", + "name": "הפעל אוטומציה", + "description": "הפעל אוטומציה בלחיצה אחת", "option": { "displayName": { "label": "הצג שם" @@ -1279,26 +1279,26 @@ } }, "spotlightAction": { - "run": "" + "run": "הפעל {name}" } }, "calendar": { "name": "לוח שנה", - "description": "", + "description": "הצג אירועים מהאינטגרציות שלך בתצוגת לוח שנה בתוך פרק זמן יחסי מסוים", "option": { "releaseType": { "label": "סוג שחרור של Radarr", "options": { - "inCinemas": "", - "digitalRelease": "", - "physicalRelease": "" + "inCinemas": "בבתי קולנוע", + "digitalRelease": "שחרור דיגיטלי", + "physicalRelease": "שחרור פיזי" } }, "filterPastMonths": { - "label": "" + "label": "התחל מ" }, "filterFutureMonths": { - "label": "" + "label": "סיים ב" } } }, @@ -1307,24 +1307,24 @@ "description": "מציג את מידע מזג האוויר הנוכחי של מיקום מוגדר.", "option": { "isFormatFahrenheit": { - "label": "" + "label": "טמפרטורה בפרנהייט" }, "location": { "label": "מיקום מזג האוויר" }, "showCity": { - "label": "" + "label": "הצג עיר" }, "hasForecast": { - "label": "" + "label": "הצג תחזית" }, "forecastDayCount": { - "label": "", - "description": "" + "label": "כמות ימי התחזית", + "description": "כאשר הווידג'ט אינו רחב מספיק, פחות ימים מוצגים" }, "dateFormat": { - "label": "", - "description": "" + "label": "פורמט תאריך", + "description": "איך צריך להיראות התאריך" } }, "kind": { @@ -1346,16 +1346,16 @@ }, "indexerManager": { "name": "סטטוס מנהל אינדקס", - "description": "", + "description": "מצב האינדקסים שלך", "option": { "openIndexerSiteInNewTab": { - "label": "" + "label": "פתח את אתר האינדקס בכרטיסייה חדשה" } }, "title": "מנהל אינדקס", "testAll": "בדוק הכל", "error": { - "internalServerError": "" + "internalServerError": "נכשל באחזור סטטוס האינדקסים" } }, "healthMonitoring": { @@ -1376,41 +1376,41 @@ } }, "popover": { - "information": "", - "processor": "", - "memory": "", - "memoryAvailable": "", - "version": "", - "uptime": "", - "loadAverage": "", - "minute": "", - "minutes": "", - "used": "", + "information": "מידע", + "processor": "מעבד: {cpuModelName}", + "memory": "זיכרון: {memory}GiB", + "memoryAvailable": "זמין: {memoryAvailable}GiB ({percent}%)", + "version": "גרסה: {version}", + "uptime": "זמן פעילות: {months} חודשים, {days} ימים, {hours} שעות, {minutes} דקות", + "loadAverage": "ממוצע עומס:", + "minute": "דקה אחת", + "minutes": "{count} דקות", + "used": "בשימוש", "available": "זמין", - "lastSeen": "" + "lastSeen": "עדכון סטטוס אחרון: {lastSeen}" }, "memory": {}, "error": { - "internalServerError": "" + "internalServerError": "נכשל בעדכון סטטוס בריאות המערכת" } }, "common": { "location": { - "query": "", - "latitude": "", - "longitude": "", - "disabledTooltip": "", - "unknownLocation": "", + "query": "עיר / מיקוד", + "latitude": "קו רוחב", + "longitude": "קו אורך", + "disabledTooltip": "אנא הזן עיר או מיקוד", + "unknownLocation": "מיקום לא ידוע", "search": "חיפוש", "table": { "header": { - "city": "", - "country": "", - "coordinates": "", - "population": "" + "city": "עיר", + "country": "מדינה", + "coordinates": "קואורדינטות", + "population": "אוכלוסיה" }, "action": { - "select": "" + "select": "בחר {city}, {countryCode}" }, "population": { "fallback": "לא ידוע" @@ -1418,16 +1418,16 @@ } }, "integration": { - "noData": "", - "description": "" + "noData": "לא נמצא אינטגרציה", + "description": "לחץ על כדי ליצור אינטגרציה חדשה" }, "app": { "noData": "לא נמצאה אפליקציה", - "description": "" + "description": "לחץ על כדי ליצור אפליקציה חדשה" }, "error": { - "noIntegration": "", - "noData": "" + "noIntegration": "לא נבחרה אינטגרציה", + "noData": "אין נתוני אינטגרציה זמינים" }, "option": {} }, @@ -1440,75 +1440,80 @@ }, "hasAutoPlay": { "label": "הפעלה אוטומטית", - "description": "" + "description": "הפעלה אוטומטית פועלת רק כשהיא מושתקת בגלל הגבלות הדפדפן" }, "isMuted": { - "label": "" + "label": "מושתק" }, "hasControls": { - "label": "" + "label": "הצג פקדים" } }, "error": { - "noUrl": "", - "forYoutubeUseIframe": "" + "noUrl": "לא סופק קישור של סרטון", + "forYoutubeUseIframe": "עבור סרטוני YouTube השתמש באפשרות iframe" } }, "mediaServer": { - "name": "", - "description": "", - "option": {} + "name": "זרמי שרת מדיה נוכחיים", + "description": "הצג את הזרמים הנוכחיים בשרתי המדיה שלך", + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { - "name": "", - "description": "", + "name": "הורדת לקוח", + "description": "מאפשר לך להציג ולנהל את ההורדות שלך הן מלקוחות Torrent והן מלקוחות Usenet.", "option": { "columns": { - "label": "" + "label": "עמודות להצגה" }, "enableRowSorting": { - "label": "" + "label": "אפשר מיון פריטים" }, "defaultSort": { - "label": "" + "label": "עמודה המשמשת למיון כברירת מחדל" }, "descendingDefaultSort": { - "label": "" + "label": "מיון הפוך" }, "showCompletedUsenet": { - "label": "" + "label": "הצג ערכי usenet שסומנו כהשלמה" }, "showCompletedTorrent": { - "label": "" + "label": "הצג ערכי טורנט שסומנו כהשלמה" }, "activeTorrentThreshold": { - "label": "" + "label": "הסתר טורנט שהושלם מתחת לסף הזה (בקיB/s)" }, "categoryFilter": { - "label": "" + "label": "קטגוריות/תוויות לסינון" }, "filterIsWhitelist": { - "label": "" + "label": "סנן כרשימת היתרים" }, "applyFilterToRatio": { - "label": "" + "label": "השתמש במסנן כדי לחשב יחס" } }, "errors": { - "noColumns": "", - "noCommunications": "" + "noColumns": "בחר עמודות בפריטים", + "noCommunications": "לא ניתן לטעון נתונים מהאינטגרציה" }, "items": { "actions": { - "columnTitle": "" + "columnTitle": "פקדים" }, "added": { - "columnTitle": "", + "columnTitle": "נוסף", "detailsTitle": "נוסף בתאריך" }, "category": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "תוספות", + "detailsTitle": "קטגוריות (או מידע נוסף)" }, "downSpeed": { "columnTitle": "הורדה", @@ -1516,10 +1521,10 @@ }, "index": { "columnTitle": "", - "detailsTitle": "" + "detailsTitle": "מדד נוכחי בתוך הלקוח" }, "id": { - "columnTitle": "" + "columnTitle": "מזהה" }, "integration": { "columnTitle": "אינטגרציה" @@ -1529,39 +1534,39 @@ }, "progress": { "columnTitle": "התקדמות", - "detailsTitle": "" + "detailsTitle": "התקדמות ההורדה" }, "ratio": { "columnTitle": "יחס", - "detailsTitle": "" + "detailsTitle": "יחס טורנט (התקבל/נשלח)" }, "received": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "סך הכל הורדה", + "detailsTitle": "הורדה כוללת" }, "sent": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "סך הכל העלאה", + "detailsTitle": "העלאה כוללת" }, "size": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "גודל קובץ", + "detailsTitle": "גודל כולל של בחירה/קבצים" }, "state": { "columnTitle": "מצב", "detailsTitle": "" }, "time": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "זמן סיום", + "detailsTitle": "זמן מאז/עד סיום" }, "type": { - "columnTitle": "", - "detailsTitle": "" + "columnTitle": "סוּג", + "detailsTitle": "סוג לקוח הורדה" }, "upSpeed": { "columnTitle": "העלאה", - "detailsTitle": "" + "detailsTitle": "קצב העלאה" } }, "states": { @@ -1569,38 +1574,38 @@ "queued": "בתור", "paused": "מושהה", "completed": "הושלם", - "failed": "", - "processing": "", + "failed": "נכשל", + "processing": "מעבד", "leeching": "", "stalled": "", "unknown": "לא ידוע", - "seeding": "" + "seeding": "זריעה" }, "actions": { "clients": { - "modalTitle": "", - "pause": "", - "resume": "" + "modalTitle": "רשימת לקוחות הורדה", + "pause": "השהה את כל הלקוחות/פריטים", + "resume": "המשך כל הלקוחות/פריטים" }, "client": { - "pause": "", - "resume": "" + "pause": "השהה לקוח", + "resume": "המשך לקוח" }, "item": { - "pause": "", - "resume": "", + "pause": "השהה פריט", + "resume": "המשך פריט", "delete": { - "title": "", + "title": "מחק פריט", "modalTitle": "", "entry": "", "entryAndFiles": "" } } }, - "globalRatio": "" + "globalRatio": "יחס גלובלי" }, "mediaRequests-requestList": { - "name": "", + "name": "רשימת בקשות מדיה", "description": "ראה רשימה של כל בקשות המדיה ממופע Overseerr או Jellyseerr שלך", "option": { "linksTargetNewTab": { @@ -1608,21 +1613,21 @@ } }, "pending": { - "approve": "", - "approving": "", - "decline": "" + "approve": "אשר בקשה", + "approving": "מאשר את הבקשה...", + "decline": "דחה בקשה" }, "availability": { "unknown": "לא ידוע", - "pending": "", - "processing": "", + "pending": "בהמתנה", + "processing": "מעבד", "partiallyAvailable": "חלקי", "available": "זמין" }, - "toBeDetermined": "" + "toBeDetermined": "ייקבע בהמשך" }, "mediaRequests-requestStats": { - "name": "", + "name": "מצב בקשות מדיה", "description": "סטטיסטיקה לגבי בקשות המדיה", "option": {}, "titles": { @@ -1630,28 +1635,28 @@ "main": "סטטיסטיקות מדיה", "approved": "כבר אושר", "pending": "ממתין לאישור", - "processing": "", - "declined": "", - "available": "", + "processing": "בעיבוד", + "declined": "נדחה כבר", + "available": "כבר זמין", "tv": "בקשות סדרות", "movie": "בקשות סרטים", "total": "סך הכל" }, "users": { "main": "משתמשים מובילים", - "requests": "" + "requests": "בקשות" } } }, "mediaTranscoding": { - "name": "", - "description": "", + "name": "המרת קידוד מדיה", + "description": "סטטיסטיקה, תור נוכחי וסטטוס עיבוד של המרת המדיה שלך", "option": { "defaultView": { "label": "תצוגת ברירת מחדל" }, "queuePageSize": { - "label": "" + "label": "גודל העמוד בתור" } }, "tab": { @@ -1659,9 +1664,9 @@ "queue": "תור", "statistics": "סטָטִיסטִיקָה" }, - "currentIndex": "", + "currentIndex": "{start}-{end} מתוך {total}", "healthCheck": { - "title": "", + "title": "בדיקת תקינות", "queued": "בתור", "status": { "healthy": "בָּרִיא", @@ -1672,11 +1677,11 @@ "statistics": { "empty": "ריק", "transcodes": "קידודים", - "transcodesCount": "", - "healthChecksCount": "", - "filesCount": "", - "savedSpace": "", - "healthChecks": "", + "transcodesCount": "קידודים: {value}", + "healthChecksCount": "בדיקות בריאות: {value}", + "filesCount": "קבצים: {value}", + "savedSpace": "שטח שמור: {value}", + "healthChecks": "בדיקות בריאות", "videoCodecs": "קודקים", "videoContainers": "מיכלים", "videoResolutions": "רזולוציות" @@ -1688,7 +1693,7 @@ "eta": "זמן סיום משוער", "progress": "התקדמות", "transcode": "קידוד", - "healthCheck": "" + "healthCheck": "בדיקת תקינות" } }, "queue": { @@ -1697,37 +1702,37 @@ "file": "קוֹבֶץ", "size": "גודל", "transcode": "קידוד", - "healthCheck": "" + "healthCheck": "בדיקת תקינות" } } } }, "rssFeed": { - "name": "", - "description": "", + "name": "הזנות RSS", + "description": "מעקב והצג עדכוני RSS, ATOM או JSON גנרי אחד או יותר", "option": { "feedUrls": { - "label": "" + "label": "כתובות אתרים של הזנה" }, "enableRtl": { - "label": "" + "label": "אפשר RTL" }, "textLinesClamp": { - "label": "" + "label": "חיתוך שורות טקסט" }, "maximumAmountPosts": { - "label": "" + "label": "הגבלת כמות הודעות" } } } }, "widgetPreview": { "toggle": { - "enabled": "", - "disabled": "" + "enabled": "מצב עריכה מופעל", + "disabled": "מצב עריכה מושבת" }, "dimensions": { - "title": "" + "title": "שנה מידות" } }, "board": { @@ -1736,52 +1741,52 @@ "notification": { "success": { "title": "השינויים הוחלו בהצלחה", - "message": "" + "message": "הלוח נשמר בהצלחה" }, "error": { "title": "לא ניתן להחיל שינויים", - "message": "" + "message": "לא ניתן היה לשמור את הלוח" } }, "confirmLeave": { - "title": "", - "message": "" + "title": "שינויים שלא נשמרו", + "message": "יש לך שינויים שלא נשמרו, האם אתה בטוח שברצונך לעזוב?" } }, "oldImport": { - "label": "", + "label": "יבוא מ- homarr לפני 1.0.0", "notification": { "success": { - "title": "", - "message": "" + "title": "הייבוא הצליח", + "message": "הלוח יובא בהצלחה" }, "error": { - "title": "", - "message": "" + "title": "הייבוא נכשל", + "message": "לא ניתן לייבא את הלוח, בדוק את לוגים לפרטים נוספים" } }, "form": { "file": { - "label": "", - "invalidError": "" + "label": "בחר קובץ JSON", + "invalidError": "קובץ תצורה לא חוקי" }, "apps": { "label": "אפליקציות", "avoidDuplicates": { - "label": "", - "description": "" + "label": "הימנע מכפילויות", + "description": "מתעלם מאפליקציות שבהן כבר קיימת אפליקציה עם אותה כתובת רשת" }, "onlyImportApps": { - "label": "", - "description": "" + "label": "ייבוא רק אפליקציות", + "description": "רק מוסיף את האפליקציות, יש ליצור מחדש את הלוח באופן ידני" } }, "name": { - "label": "" + "label": "שם הלוח" }, "screenSize": { - "label": "", - "description": "", + "label": "גודל מסך", + "description": "בגרסאות שלפני 1.0 היו קיימים שלושה מצבים שונים, כך שניתן היה לבחור את כמות העמודות עבור כל גודל מסך.", "option": { "sm": "קטן", "md": "בינוני", @@ -1789,16 +1794,16 @@ } }, "sidebarBehavior": { - "label": "", - "description": "", + "label": "התנהגות סרגל הצד", + "description": "סרגלי צד הוסרו ב- 1.0, אתה יכול לבחור מה צריך לקרות עם הפריטים שבתוכם.", "option": { "lastSection": { "label": "", - "description": "" + "description": "סרגל צד יוצג מתחת לקטע האחרון" }, "removeItems": { - "label": "", - "description": "" + "label": "הסרת פריטים", + "description": "פריטים הכלולים בסרגל הצד יוסרו" } } } @@ -1807,51 +1812,51 @@ }, "field": { "pageTitle": { - "label": "" + "label": "כותרת העמוד" }, "metaTitle": { - "label": "" + "label": "כותרת מטא" }, "logoImageUrl": { - "label": "" + "label": "כתובת אתר של תמונת לוגו" }, "faviconImageUrl": { - "label": "" + "label": "כתובת אתר של תמונת Favicon" }, "backgroundImageUrl": { - "label": "" + "label": "כתובת אתר של תמונת רקע" }, "backgroundImageAttachment": { "label": "צירוף תמונת רקע", "option": { "fixed": { - "label": "", - "description": "" + "label": "קבוע", + "description": "הרקע נשאר באותו מיקום." }, "scroll": { - "label": "", - "description": "" + "label": "גלילה", + "description": "גלילה ברקע עם העכבר." } } }, "backgroundImageRepeat": { - "label": "", + "label": "חזרה על תמונת רקע", "option": { "repeat": { - "label": "", - "description": "" + "label": "חזור", + "description": "התמונה חוזרת על עצמה ככל הנדרש כדי לכסות את כל אזור ציור תמונת הרקע." }, "no-repeat": { - "label": "", - "description": "" + "label": "ללא חזרה", + "description": "התמונה אינה חוזרת על עצמה וייתכן שלא תמלא את כל החלל." }, "repeat-x": { - "label": "", - "description": "" + "label": "חזור על ציר X", + "description": "זהה ל'חזרה' אבל רק על הציר האופקי." }, "repeat-y": { - "label": "", - "description": "" + "label": "חזור על ציר Y", + "description": "זהה ל'חזרה' אבל רק על הציר האנכי." } } }, @@ -1859,12 +1864,12 @@ "label": "גודל תמונת רקע", "option": { "cover": { - "label": "", - "description": "" + "label": "כיסוי", + "description": "קנה קנה מידה קטן ככל האפשר של התמונה כדי לכסות את כל החלון על ידי חיתוך שטח מוגזם." }, "contain": { - "label": "", - "description": "" + "label": "מכיל", + "description": "קנה מידה גדול ככל האפשר של התמונה בתוך המיכל שלה מבלי לחתוך או למתוח את התמונה." } } }, @@ -1875,36 +1880,36 @@ "label": "צבע משני" }, "opacity": { - "label": "" + "label": "אטימות" }, "customCss": { - "label": "", + "label": "עיצוב מותאם אישית עבור הלוח הזה", "description": "יתר על כן, התאם את לוח המחוונים שלך באמצעות CSS, מומלץ רק למשתמשים מנוסים", "customClassesAlert": { - "title": "", - "description": "" + "title": "מחלקות מתאמות אישית", + "description": "אתה יכול להוסיף מחלקות מותאמות אישית לפריטי הלוח שלך באפשרויות המתקדמות של כל פריט ולהשתמש בהן בעיצוב המותאם אישית למעלה." } }, "columnCount": { - "label": "" + "label": "ספירת עמודות" }, "name": { "label": "שם" }, "isPublic": { "label": "ציבורי", - "description": "" + "description": "לוחות ציבוריים נגישים לכולם, גם ללא חשבון." } }, "content": { - "metaTitle": "" + "metaTitle": "לוח {boardName}" }, "setting": { - "title": "", + "title": "הגדרות עבור לוח {boardName}", "section": { "general": { "title": "כללי", - "unrecognizedLink": "" + "unrecognizedLink": "הקישור שסופק אינו מזוהה ולא יוצג בתצוגה מקדימה, ייתכן שהוא עדיין יעבוד." }, "layout": { "title": "פריסה" @@ -1913,23 +1918,23 @@ "title": "רקע" }, "color": { - "title": "" + "title": "צבעים" }, "customCss": { - "title": "" + "title": "עיצוב מותאם אישית" }, "access": { - "title": "", + "title": "בקרת גישה", "permission": { "item": { "view": { "label": "צפייה בלוח" }, "modify": { - "label": "" + "label": "שנה לוח" }, "full": { - "label": "" + "label": "גישה מלאה" } } } @@ -1938,15 +1943,15 @@ "title": "אזור מסוכן", "action": { "rename": { - "label": "", - "description": "", - "button": "", + "label": "שנה את שם הלוח", + "description": "שינוי השם ישבור כל קישור ללוח זה.", + "button": "שנה שם", "modal": { - "title": "" + "title": "שנה את שם הלוח" } }, "visibility": { - "label": "", + "label": "שנה את נראות הלוח", "description": { "public": "", "private": "" @@ -2013,7 +2018,7 @@ } }, "management": { - "metaTitle": "", + "metaTitle": "ניהול", "title": { "morning": "", "afternoon": "", @@ -2297,8 +2302,8 @@ "defaultColorScheme": { "label": "", "options": { - "light": "", - "dark": "" + "light": "בהיר", + "dark": "כהה" } } }, @@ -2347,7 +2352,7 @@ "label": "" }, "rssFeeds": { - "label": "" + "label": "הזנות RSS" }, "indexerManager": { "label": "" @@ -2365,7 +2370,7 @@ "label": "" }, "mediaTranscoding": { - "label": "" + "label": "המרת קידוד מדיה" } } }, @@ -2676,8 +2681,8 @@ "title": "", "option": { "colorScheme": { - "light": "", - "dark": "" + "light": "עבור למצב בהיר", + "dark": "עבור למצב כהה" }, "language": { "label": "", diff --git a/packages/translation/src/lang/hr.json b/packages/translation/src/lang/hr.json index d70a830d2..1f1e7fafb 100644 --- a/packages/translation/src/lang/hr.json +++ b/packages/translation/src/lang/hr.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/hu.json b/packages/translation/src/lang/hu.json index f1a22dd50..93e9b2e78 100644 --- a/packages/translation/src/lang/hu.json +++ b/packages/translation/src/lang/hu.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/it.json b/packages/translation/src/lang/it.json index a15ee98c9..f287d2f73 100644 --- a/packages/translation/src/lang/it.json +++ b/packages/translation/src/lang/it.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/ja.json b/packages/translation/src/lang/ja.json index 87d73077f..74c44a010 100644 --- a/packages/translation/src/lang/ja.json +++ b/packages/translation/src/lang/ja.json @@ -2,16 +2,16 @@ "init": { "step": { "start": { - "title": "", + "title": "Homarrへようこそ", "subtitle": "", "description": "", "action": { - "scratch": "", + "scratch": "ゼロからスタート", "importOldmarr": "" } }, "import": { - "title": "", + "title": "データのインポート", "subtitle": "", "dropzone": { "title": "", @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/ko.json b/packages/translation/src/lang/ko.json index 657a35c9c..2696d9acc 100644 --- a/packages/translation/src/lang/ko.json +++ b/packages/translation/src/lang/ko.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/lt.json b/packages/translation/src/lang/lt.json index 2d947019a..3465f1815 100644 --- a/packages/translation/src/lang/lt.json +++ b/packages/translation/src/lang/lt.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/lv.json b/packages/translation/src/lang/lv.json index 6cf025fdc..b2e568ba5 100644 --- a/packages/translation/src/lang/lv.json +++ b/packages/translation/src/lang/lv.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/nl.json b/packages/translation/src/lang/nl.json index 2c5b20d10..41bb61bb5 100644 --- a/packages/translation/src/lang/nl.json +++ b/packages/translation/src/lang/nl.json @@ -7,7 +7,7 @@ "description": "Selecteer om te beginnen hoe je je Homarr instantie wilt instellen.", "action": { "scratch": "Vanaf nul beginnen", - "importOldmarr": "Importeren uit Homarr voor 1.0" + "importOldmarr": "Importeren uit Homarr vóór 1.0" } }, "import": { @@ -15,7 +15,7 @@ "subtitle": "Je kunt gegevens importeren uit een bestaande Homarr instantie.", "dropzone": { "title": "Sleep het ZIP-bestand hierheen of klik om te bladeren", - "description": "De geüploade zip wordt verwerkt en je kunt selecteren wat je wilt importeren" + "description": "De geüploade ZIP wordt verwerkt en je kunt selecteren wat je wilt importeren" }, "fileInfo": { "action": { @@ -30,7 +30,7 @@ "title": "{count} borden gevonden", "description": "Kies alle borden met hun grootte die je wilt importeren", "action": { - "selectAll": "Selecteer alles", + "selectAll": "Alles selecteren", "unselectAll": "Alles deselecteren" } }, @@ -41,18 +41,18 @@ "import": "Import bevestigen en doorgaan" }, "entities": { - "apps": "", + "apps": "Apps", "boards": "Borden", "integrations": "Integraties", "credentialUsers": "Inloggegevens gebruikers" } }, "tokenModal": { - "title": "Voer importeertoken in", + "title": "Importeertoken invoeren", "field": { "token": { "label": "Penning", - "description": "Voer het getoonde importtoken van je vorige Homarr instantie in" + "description": "Voer het getoonde importeertoken van je vorige Homarr instantie in" } }, "notification": { @@ -136,8 +136,8 @@ "length": "Bevat ten minste 8 tekens", "lowercase": "Inclusief kleine letter", "uppercase": "Inclusief hoofdletter", - "number": "Inclusief aantal", - "special": "Inclusief speciaal symbool" + "number": "Inclusief getal", + "special": "Inclusief speciaal teken" } }, "passwordConfirm": { @@ -147,7 +147,7 @@ "label": "Vorig wachtwoord" }, "homeBoard": { - "label": "Home bord" + "label": "Home-bord" }, "pingIconsEnabled": { "label": "Gebruik iconen voor pings" @@ -242,7 +242,7 @@ }, "toLarge": { "title": "Afbeelding is te groot", - "message": "Max. afbeeldingsgrootte is {size}" + "message": "Maximale afbeeldingsgrootte is {size}" } } }, @@ -262,7 +262,7 @@ "editProfile": { "notification": { "success": { - "message": "Profiel is bijgewerkt" + "message": "Profiel succesvol bijgewerkt" }, "error": { "message": "Kan profiel niet bijwerken" @@ -275,11 +275,11 @@ "confirm": "Weet je zeker dat je de gebruiker {username} met zijn voorkeuren wilt verwijderen?" }, "select": { - "label": "Selecteer gebruiker", + "label": "Gebruiker selecteren", "notFound": "Geen gebruiker gevonden" }, "transfer": { - "label": "Selecteer nieuwe eigenaar" + "label": "Nieuwe eigenaar selecteren" } } }, @@ -302,7 +302,7 @@ } }, "app": { - "title": "", + "title": "Apps", "item": { "create": { "label": "Apps aanmaken", @@ -310,11 +310,11 @@ }, "use-all": { "label": "Alle apps gebruiken", - "description": "Leden toestaan om apps aan hun borden toe te voegen" + "description": "Laat leden apps aan hun borden toevoegen" }, "modify-all": { - "label": "Alle apps wijzigen", - "description": "Leden toestaan om alle apps aan te passen" + "label": "Alle apps aanpassen", + "description": "Laat leden alle apps aanpassen" }, "full-all": { "label": "Volledige app-toegang", @@ -331,15 +331,15 @@ }, "view-all": { "label": "Alle borden bekijken", - "description": "Leden toestaan alle borden te bekijken" + "description": "Laat leden alle borden bekijken" }, "modify-all": { - "label": "Alle borden wijzigen", - "description": "Leden toestaan alle borden te wijzigen (bevat geen toegangscontrole en gevarenzone)" + "label": "Alle borden aanpassen", + "description": "Laat leden alle borden wijzigen (exclusief toegangscontrole en gevarenzone)" }, "full-all": { "label": "Toegang aan bord", - "description": "Leden alle borden laten bekijken, wijzigen en verwijderen (inclusief toegangscontrole en gevarenzone)" + "description": "Laat leden alle borden bekijken, wijzigen en verwijderen (inclusief toegangscontrole en gevarenzone)" } } }, @@ -348,19 +348,19 @@ "item": { "create": { "label": "Integraties aanmaken", - "description": "Leden toestaan om integraties aan te maken" + "description": "Laat leden integraties aanmaken" }, "use-all": { "label": "Alle integraties gebruiken", - "description": "Leden kunnen integraties toevoegen aan hun borden" + "description": "Geeft leden de mogelijkheid om integraties toe te voegen aan hun borden" }, "interact-all": { "label": "Interactie met elke integratie", - "description": "Leden toestaan om te communiceren met elke integratie" + "description": "Laat leden communiceren met elke integratie" }, "full-all": { "label": "Volledige integratietoegang", - "description": "Geef leden de mogelijkheid om elke integratie te beheren, te gebruiken en ermee te interageren" + "description": "Laat leden elke integratie te beheren, gebruiken en ermee werken" } } }, @@ -369,7 +369,7 @@ "item": { "upload": { "label": "Media uploaden", - "description": "Leden toestaan om media te uploaden" + "description": "Laat leden media uploaden" }, "view-all": { "label": "Alle media bekijken", @@ -386,7 +386,7 @@ "item": { "view-logs": { "label": "Logs bekijken", - "description": "Leden toestaan om logs te bekijken" + "description": "Laat leden logs bekijken" } } }, @@ -399,7 +399,7 @@ }, "modify-all": { "label": "Alle zoekmachines aanpassen", - "description": "Leden toestaan om alle zoekmachines aan te passen" + "description": "Laat leden alle zoekmachines aanpassen" }, "full-all": { "label": "Volledige zoekmachinetoegang", @@ -449,14 +449,14 @@ }, "delete": { "label": "Groep verwijderen", - "description": "Als je eenmaal een groep hebt verwijderd, is er geen weg meer terug. Wees er zeker van.", + "description": "Als je eenmaal een groep hebt verwijderd, kun je niet meer terug. Wees er zeker van.", "confirm": "Weet je zeker dat je de groep {name} wilt verwijderen?", "notification": { "success": { "message": "Groep {name} succesvol verwijderd" }, "error": { - "message": "Kan groep niet verwijderen {name}" + "message": "Kan groep {name} niet verwijderen" } } }, @@ -478,7 +478,7 @@ "message": "De groep {name} is succesvol opgeslagen" }, "error": { - "message": "Kan groep niet opslaan {name}" + "message": "Kan groep {name} niet opslaan" } } }, @@ -491,7 +491,7 @@ "app": { "page": { "list": { - "title": "", + "title": "Apps", "noResults": { "title": "Er zijn nog geen apps", "action": "Je eerste app aanmaken" @@ -551,7 +551,7 @@ }, "action": { "select": { - "label": "Selecteer app", + "label": "App selecteren", "notFound": "Geen app gevonden" } } @@ -622,7 +622,7 @@ "create": "Verbinding testen en aanmaken", "edit": "Verbinding testen en opslaan" }, - "alertNotice": "De knop Opslaan wordt ingeschakeld zodra er een succesvolle verbinding tot stand is gebracht", + "alertNotice": "De opslaan knop wordt ingeschakeld zodra er een succesvolle verbinding tot stand is gebracht", "notification": { "success": { "title": "Verbinding geslaagd", @@ -645,8 +645,8 @@ "message": "De verbinding kon niet tot stand worden gebracht" }, "badRequest": { - "title": "", - "message": "Het verzoek was misvormd" + "title": "Bad request", + "message": "De aanvraag was onjuist" }, "unauthorized": { "title": "Niet-geautoriseerd", @@ -658,10 +658,10 @@ }, "notFound": { "title": "Niet gevonden", - "message": "Waarschijnlijk verkeerde URL of verkeerd pad" + "message": "Waarschijnlijk verkeerde URL of pad" }, "internalServerError": { - "title": "Interne server error", + "title": "Interne serverfout", "message": "Er is een fout opgetreden bij de server" }, "serviceUnavailable": { @@ -722,7 +722,7 @@ } }, "permission": { - "use": "Selecteer integraties in items", + "use": "Integraties selecteren in items", "interact": "Interactie met integraties", "full": "Volledige integratietoegang" } @@ -761,12 +761,12 @@ } }, "copy": { - "label": "Kopieer URL" + "label": "URL kopiëren" } } }, "common": { - "beta": "", + "beta": "Beta", "error": "Fout", "action": { "add": "Toevoegen", @@ -787,14 +787,14 @@ "previous": "Vorige", "next": "Volgende", "checkoutDocs": "De documentatie bekijken", - "checkLogs": "Controleer logboeken voor meer details", - "tryAgain": "Probeer het opnieuw", + "checkLogs": "Controleer logs voor meer details", + "tryAgain": "Probeer opnieuw", "loading": "Laden" }, "here": "hier", "iconPicker": { - "label": "Icoon URL", - "header": "Typ naam of objecten om te filteren op pictogrammen... Homarr doorzoekt {countIcons} pictogrammen voor je." + "label": "Icoon-URL", + "header": "Typ naam of objecten om te filteren op iconen… Homarr doorzoekt {countIcons} iconen voor je." }, "colorScheme": { "options": { @@ -828,7 +828,7 @@ } }, "multiSelect": { - "placeholder": "Kies een of meer waarden" + "placeholder": "Kies één of meer waarden" }, "multiText": { "placeholder": "Meer waarden toevoegen", @@ -865,12 +865,12 @@ "required": "Dit veld is verplicht", "string": { "startsWith": "Dit veld moet beginnen met {startsWith}", - "endsWith": "Dit veld moet eindigen op {endsWith}", + "endsWith": "Dit veld moet eindigen met {endsWith}", "includes": "Dit veld moet {includes} bevatten.", "invalidEmail": "Dit veld moet een geldig e-mailadres zijn" }, "tooSmall": { - "string": "Dit veld moet minstens {minimum} tekens lang zijn", + "string": "Dit veld moet minimaal {minimum} tekens lang zijn", "number": "Dit veld moet groter of gelijk zijn aan {minimum}" }, "tooBig": { @@ -881,10 +881,10 @@ "passwordsDoNotMatch": "Wachtwoorden komen niet overeen", "passwordRequirements": "Wachtwoord voldoet niet aan de eisen", "boardAlreadyExists": "Er bestaat al een bord met deze naam", - "invalidFileType": "Ongeldig bestandstype, verwacht {expected}", + "invalidFileType": "Ongeldig bestandstype, verwachtte {expected}", "fileTooLarge": "Bestand is te groot, maximale grootte is {maxSize}", "invalidConfiguration": "Ongeldige configuratie", - "groupNameTaken": "Groepsnaam al bezet" + "groupNameTaken": "Groepsnaam al in gebruik" } } } @@ -893,10 +893,10 @@ "dynamic": { "action": { "create": "Nieuwe dynamische sectie", - "remove": "Dynamisch gedeelte verwijderen" + "remove": "Dynamische sectie verwijderen" }, "remove": { - "title": "Dynamisch gedeelte verwijderen", + "title": "Dynamische sectie verwijderen", "message": "Weet je zeker dat je deze dynamische sectie wilt verwijderen? Items worden verplaatst naar dezelfde locatie in de bovenliggende sectie." } }, @@ -941,7 +941,7 @@ "import": "Item importeren", "edit": "Item bewerken", "moveResize": "Item verplaatsen / formaat wijzigen", - "duplicate": "Duplicaat item", + "duplicate": "Item dupliceren", "remove": "Item verwijderen" }, "menu": { @@ -963,10 +963,10 @@ "label": "Hoogte" }, "xOffset": { - "label": "" + "label": "X offset" }, "yOffset": { - "label": "" + "label": "Y offset" } } }, @@ -992,20 +992,20 @@ }, "widget": { "app": { - "name": "", - "description": "Sluit een app in op het bord.", + "name": "App", + "description": "Een app insluiten op het bord.", "option": { "appId": { "label": "App kiezen" }, "openInNewTab": { - "label": "Open in nieuw tabblad" + "label": "In nieuw tabblad openen" }, "showTitle": { - "label": "Toon app naam" + "label": "App naam weergeven" }, "showDescriptionTooltip": { - "label": "Toon beschrijving tooltip" + "label": "Beschrijving tooltip weergeven" }, "pingEnabled": { "label": "Eenvoudige ping inschakelen" @@ -1020,13 +1020,13 @@ }, "bookmarks": { "name": "Bladwijzers", - "description": "Meerdere app-links weergeven", + "description": "Toont meerdere app-links", "option": { "title": { "label": "Titel" }, "layout": { - "label": "Indeling", + "label": "Lay-out", "option": { "row": { "label": "Horizontaal" @@ -1046,11 +1046,11 @@ } }, "dnsHoleSummary": { - "name": "DNS-hole samenvatting", - "description": "Geeft de samenvatting van je DNS-gat weer", + "name": "DNS-hole overzicht", + "description": "Toont het overzicht van je DNS-hole", "option": { "layout": { - "label": "Indeling", + "label": "Lay-out", "option": { "row": { "label": "Horizontaal" @@ -1068,14 +1068,14 @@ } }, "error": { - "internalServerError": "DNS-gatenoverzicht niet opgehaald", + "internalServerError": "DNS-hole overzicht ophalen mislukt", "integrationsDisconnected": "Geen gegevens beschikbaar, alle integraties verbroken" }, "data": { "adsBlockedToday": "Vandaag geblokkeerd", "adsBlockedTodayPercentage": "Vandaag geblokkeerd", - "dnsQueriesToday": "Queries vandaag", - "domainsBeingBlocked": "Domeinen op de blokkadelijst" + "dnsQueriesToday": "Aanvragen vandaag", + "domainsBeingBlocked": "Domeinen op blokkadelijst" } }, "dnsHoleControls": { @@ -1083,7 +1083,7 @@ "description": "Bedien PiHole of AdGuard vanaf je dashboard", "option": { "layout": { - "label": "Indeling", + "label": "Lay-out", "option": { "row": { "label": "Horizontaal" @@ -1101,7 +1101,7 @@ } }, "error": { - "internalServerError": "Besturen DNS hole mislukt" + "internalServerError": "DNS-hole besturen mislukt" }, "controls": { "enableAll": "Alles inschakelen", @@ -1114,7 +1114,7 @@ "disconnected": "Verbinding verbroken", "hours": "Uren", "minutes": "Minuten", - "unlimited": "Laat leeg tot onbeperkt" + "unlimited": "Laat leeg voor onbeperkt" } }, "clock": { @@ -1123,13 +1123,13 @@ "option": { "customTitleToggle": { "label": "Aangepaste titel-/plaatsweergave", - "description": "Pronk met een aangepaste titel of de naam van de stad/het land bovenop de klok." + "description": "Aangepaste titel of de naam van de stad/het land boven de klok weergeven." }, "customTitle": { "label": "Titel" }, "is24HourFormat": { - "label": "24-uurs formaat", + "label": "24-uursnotatie", "description": "Gebruik de 24-uursnotatie in plaats van de 12-uursnotatie" }, "showSeconds": { @@ -1143,10 +1143,10 @@ "description": "Kies de tijdzone volgens de IANA-standaard" }, "showDate": { - "label": "Toon de datum" + "label": "De datum weergeven" }, "dateFormat": { - "label": "Datum formaat", + "label": "Datumnotatie", "description": "Hoe de datum eruit moet zien" } } @@ -1156,7 +1156,7 @@ "description": "Een eenvoudige notitie widget die markdown ondersteunt", "option": { "showToolbar": { - "label": "Toon de werkbalk om je te helpen markdown te schrijven" + "label": "De werkbalk weergeven om je te helpen markdown te schrijven" }, "allowReadOnlyCheck": { "label": "Controle in alleen-lezen modus toestaan" @@ -1170,28 +1170,28 @@ "italic": "Schuingedrukt", "strikethrough": "Doorgestreept", "underline": "Onderstreept", - "colorText": "Kleur tekst", + "colorText": "Tekstkleur", "colorHighlight": "Gekleurde tekst markeren", - "code": "", + "code": "Code", "clear": "Opmaak wissen", "heading": "Koptekst {level}", "align": "Tekst uitlijnen: {position}", "blockquote": "Blokquote", "horizontalLine": "Horizontale lijn", "bulletList": "Opsommingslijst", - "orderedList": "Geordende lijst", + "orderedList": "Gerangschikte lijst", "checkList": "Controlelijst", - "increaseIndent": "Inspringen vergroten", + "increaseIndent": "Inspringing vergroten", "decreaseIndent": "Inspringen verminderen", - "link": "", + "link": "Link", "unlink": "Link verwijderen", "image": "Afbeelding insluiten", "addTable": "Tabel toevoegen", "deleteTable": "Tabel verwijderen", - "colorCell": "Kleur cel", - "mergeCell": "Cellen samenvoegen togglen", - "addColumnLeft": "Kolom toevoegen vóór", - "addColumnRight": "Kolom toevoegen ná", + "colorCell": "Celkleur", + "mergeCell": "Cellen samenvoegen schakelen", + "addColumnLeft": "Kolom ervoor toevoegen", + "addColumnRight": "Kolom erna toevoegen", "deleteColumn": "Kolom verwijderen", "addRowTop": "Rij toevoegen vóór", "addRowBelow": "Rij toevoegen ná", @@ -1213,8 +1213,8 @@ } }, "iframe": { - "name": "", - "description": "Insluiten van alle inhoud van het internet. Sommige websites kunnen de toegang beperken.", + "name": "iFrame", + "description": "Elke inhoud van het internet insluiten. Sommige websites kunnen de toegang beperken.", "option": { "embedUrl": { "label": "URL insluiten" @@ -1251,16 +1251,16 @@ }, "smartHome-entityState": { "name": "Entiteitsstatus", - "description": "De status van een entiteit weergeven en optioneel omschakelen", + "description": "Status van een entiteit weergeven en optioneel omschakelen", "option": { "entityId": { - "label": "Entiteit-ID" + "label": "Entiteits-ID" }, "displayName": { "label": "Weergavenaam" }, "entityUnit": { - "label": "Entiteit-eenheid" + "label": "Entiteitseenheid" }, "clickable": { "label": "Klikbaar" @@ -1279,7 +1279,7 @@ } }, "spotlightAction": { - "run": "Uitvoeren {name}" + "run": "{name} uitvoeren" } }, "calendar": { @@ -1287,7 +1287,7 @@ "description": "Gebeurtenissen van je integraties weergeven in een kalenderweergave binnen een bepaalde relatieve tijdsperiode", "option": { "releaseType": { - "label": "Radarr vrijgavetype", + "label": "Radarr uitgavetype", "options": { "inCinemas": "In bioscopen", "digitalRelease": "Digitale uitgave", @@ -1310,7 +1310,7 @@ "label": "Temperatuur in fahrenheit" }, "location": { - "label": "Weerslocatie" + "label": "Weerlocatie" }, "showCity": { "label": "Stad weergeven" @@ -1323,12 +1323,12 @@ "description": "Als de widget niet breed genoeg is, worden er minder dagen getoond" }, "dateFormat": { - "label": "Datum formaat", + "label": "Datumnotatie", "description": "Hoe de datum eruit moet zien" } }, "kind": { - "clear": "Helder", + "clear": "Wissen", "mainlyClear": "Overwegend helder", "fog": "Mist", "drizzle": "Motregen", @@ -1345,14 +1345,14 @@ } }, "indexerManager": { - "name": "Indexeer beheerder status", + "name": "Indexeringsbeheerder status", "description": "Status van je indexers", "option": { "openIndexerSiteInNewTab": { "label": "Indexersite in nieuw tabblad openen" } }, - "title": "Indexeer beheerder", + "title": "Indexeringsbeheerder", "testAll": "Alles testen", "error": { "internalServerError": "Indexersstatus ophalen mislukt" @@ -1377,7 +1377,7 @@ }, "popover": { "information": "Informatie", - "processor": "", + "processor": "Processor: {cpuModelName}", "memory": "Geheugen: {memory}GiB", "memoryAvailable": "Beschikbaar: {memoryAvailable}GiB ({percent}%)", "version": "Versie: {version}", @@ -1410,7 +1410,7 @@ "population": "Populatie" }, "action": { - "select": "Selecteer {city}, {countryCode}" + "select": "{city}, {countryCode} selecteren" }, "population": { "fallback": "Onbekend" @@ -1419,11 +1419,11 @@ }, "integration": { "noData": "Geen integratie gevonden", - "description": "Klik op om een nieuwe integratie aan te maken" + "description": "Klik om een nieuwe integratie aan te maken" }, "app": { "noData": "Geen app gevonden", - "description": "Klik op om een nieuwe app aan te maken" + "description": "Klik om een nieuwe app aan te maken" }, "error": { "noIntegration": "Geen integratie geselecteerd", @@ -1433,20 +1433,20 @@ }, "video": { "name": "Video stream", - "description": "Een videostream of video van een camera of een website insluiten", + "description": "Een videostream of video van een camera of website insluiten", "option": { "feedUrl": { - "label": "" + "label": "Feed-URL" }, "hasAutoPlay": { "label": "Automatisch afspelen", - "description": "Autoplay werkt alleen als het gedempt is vanwege browserbeperkingen" + "description": "Automatisch afspelen werkt alleen als het gedempt is vanwege browserbeperkingen" }, "isMuted": { "label": "Gedempt" }, "hasControls": { - "label": "Toon besturingen" + "label": "Besturingen weergeven" } }, "error": { @@ -1456,12 +1456,17 @@ }, "mediaServer": { "name": "Huidige mediaserver streams", - "description": "Toon de huidige streams op je mediaservers", - "option": {} + "description": "De huidige streams op je mediaservers weergeven", + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "Client downloaden", - "description": "Hiermee kun je je Downloads van zowel Torrent- als Usenet-clients bekijken en beheren.", + "description": "Geeft je de mogelijkheid om downloads van torrent- en usenet-clients te bekijken en beheren.", "option": { "columns": { "label": "Kolommen om te laten zien" @@ -1476,13 +1481,13 @@ "label": "Sorteren omkeren" }, "showCompletedUsenet": { - "label": "Toon usenet items gemarkeerd als voltooid" + "label": "Usenet-items weergeven die zijn gemarkeerd als voltooid" }, "showCompletedTorrent": { - "label": "Toon torrentvermeldingen die zijn gemarkeerd als voltooid" + "label": "Torrentvermeldingen weergeven die zijn gemarkeerd als voltooid" }, "activeTorrentThreshold": { - "label": "Verberg voltooide torrent onder deze drempel (in kiB/s)" + "label": "Voltooide torrent verbergen onder deze drempel (in kiB/s)" }, "categoryFilter": { "label": "Categorieën/labels om te filteren" @@ -1491,11 +1496,11 @@ "label": "Filteren als witte lijst" }, "applyFilterToRatio": { - "label": "Gebruik filter om Ratio te berekenen" + "label": "Gebruik filter om ratio te berekenen" } }, "errors": { - "noColumns": "Kolommen selecteren in Items", + "noColumns": "Kolommen selecteren in items", "noCommunications": "Kan geen gegevens laden van integratie" }, "items": { @@ -1515,7 +1520,7 @@ "detailsTitle": "Downloadsnelheid" }, "index": { - "columnTitle": "", + "columnTitle": "#", "detailsTitle": "Huidige index binnen client" }, "id": { @@ -1529,11 +1534,11 @@ }, "progress": { "columnTitle": "Voortgang", - "detailsTitle": "Download-vooruitgang" + "detailsTitle": "Downloadvoortgang" }, "ratio": { "columnTitle": "Verhouding", - "detailsTitle": "Torrentratio (ontvangen/verzonden)" + "detailsTitle": "Torrent ratio (ontvangen/verzonden)" }, "received": { "columnTitle": "Totaal down", @@ -1552,11 +1557,11 @@ "detailsTitle": "Taakstatus" }, "time": { - "columnTitle": "Voltooiingstijd", + "columnTitle": "Eindtijd", "detailsTitle": "Tijd sinds/tot voltooiing" }, "type": { - "columnTitle": "", + "columnTitle": "Type", "detailsTitle": "Client type downloaden" }, "upSpeed": { @@ -1565,16 +1570,16 @@ } }, "states": { - "downloading": "Bezig met downloaden", + "downloading": "Downloaden", "queued": "In wachtrij", "paused": "Gepauzeerd", "completed": "Voltooid", "failed": "Mislukt", "processing": "Verwerken", - "leeching": "", + "leeching": "Leeching", "stalled": "Stilgevallen", "unknown": "Onbekend", - "seeding": "" + "seeding": "Seeding" }, "actions": { "clients": { @@ -1600,16 +1605,16 @@ "globalRatio": "Globale verhouding" }, "mediaRequests-requestList": { - "name": "Mediaverzoeken-lijst", - "description": "Bekijk een lijst met alle mediaverzoeken van je Overseerr of Jellyseerr instantie", + "name": "Media-aanvragen lijst", + "description": "Bekijk een lijst met alle media-aanvragen van je Overseerr of Jellyseerr instantie", "option": { "linksTargetNewTab": { "label": "Links in nieuw tabblad openen" } }, "pending": { - "approve": "Verzoek goedkeuren", - "approving": "Bezig met verzoek goedkeuren…", + "approve": "Aanvraag goedkeuren", + "approving": "Aanvraag goedkeuren…", "decline": "Aanvraag weigeren" }, "availability": { @@ -1619,32 +1624,32 @@ "partiallyAvailable": "Gedeeltelijk", "available": "Beschikbaar" }, - "toBeDetermined": "" + "toBeDetermined": "TBD" }, "mediaRequests-requestStats": { - "name": "Mediaverzoeken statistieken", - "description": "Statistieken over je mediaverzoeken", + "name": "Media-aanvragen statistieken", + "description": "Statistieken over je media-aanvragen", "option": {}, "titles": { "stats": { - "main": "Media statistieken", + "main": "Mediastatistieken", "approved": "Reeds goedgekeurd", "pending": "In afwachting van goedkeuring", "processing": "Wordt verwerkt", "declined": "Reeds geweigerd", - "available": "Al beschikbaar", - "tv": "TV verzoeken", - "movie": "Film verzoeken", + "available": "Reeds beschikbaar", + "tv": "TV aanvragen", + "movie": "Film aanvragen", "total": "Totaal" }, "users": { "main": "Grootste gebruikers", - "requests": "Verzoeken" + "requests": "Aanvragen" } } }, "mediaTranscoding": { - "name": "Media transcodering", + "name": "Mediatranscodering", "description": "Statistieken, huidige wachtrij en worker-status van je media transcodering", "option": { "defaultView": { @@ -1655,7 +1660,7 @@ } }, "tab": { - "workers": "", + "workers": "Workers", "queue": "Wachtrij", "statistics": "Statistieken" }, @@ -1665,27 +1670,27 @@ "queued": "In wachtrij", "status": { "healthy": "Gezond", - "unhealthy": "Ongezond" + "unhealthy": "Niet-gezond" } }, "panel": { "statistics": { "empty": "Leeg", - "transcodes": "", - "transcodesCount": "", + "transcodes": "Transcodes", + "transcodesCount": "Transcodes: {value}", "healthChecksCount": "Gezondheidscontroles: {value}", "filesCount": "Bestanden: {value}", "savedSpace": "Bespaarde ruimte: {value}", "healthChecks": "Gezondheidscontroles", - "videoCodecs": "", - "videoContainers": "", + "videoCodecs": "Codecs", + "videoContainers": "Containers", "videoResolutions": "Resoluties" }, "workers": { "empty": "Leeg", "table": { "file": "Bestand", - "eta": "", + "eta": "ETA", "progress": "Voortgang", "transcode": "Transcoderen", "healthCheck": "Gezondheidscontrole" @@ -1704,13 +1709,13 @@ }, "rssFeed": { "name": "RSS-feeds", - "description": "Een of meer algemene RSS-, ATOM- of JSON-feeds bewaken en weergeven", + "description": "Eén of meer algemene RSS-, ATOM- of JSON-feeds monitoren en weergeven", "option": { "feedUrls": { "label": "Feed URL's" }, "enableRtl": { - "label": "Inschakelen RTL" + "label": "RTL inschakelen" }, "textLinesClamp": { "label": "Beschrijving regel-clamp" @@ -1740,16 +1745,16 @@ }, "error": { "title": "Kan wijzigingen niet toepassen", - "message": "Het bord kon niet worden gered" + "message": "Het bord kon niet worden opgeslagen" } }, "confirmLeave": { "title": "Niet-opgeslagen wijzigingen", - "message": "Je hebt niet-opgeslagen veranderingen, weet je zeker dat je weg wilt?" + "message": "Je hebt niet-opgeslagen wijzigingen, weet je zeker dat je weg wilt?" } }, "oldImport": { - "label": "Importeren uit Homarr voor 1.0.0", + "label": "Importeren uit Homarr vóór 1.0.0", "notification": { "success": { "title": "Succesvol geimporteerd", @@ -1757,16 +1762,16 @@ }, "error": { "title": "Importeren mislukt", - "message": "Het bord kon niet worden geïmporteerd, controleer de logboeken voor meer informatie" + "message": "Het bord kon niet worden geïmporteerd, controleer de logs voor meer informatie" } }, "form": { "file": { - "label": "Selecteer JSON-bestand", + "label": "JSON-bestand selecteren", "invalidError": "Ongeldig configuratiebestand" }, "apps": { - "label": "", + "label": "Apps", "avoidDuplicates": { "label": "Duplicaten vermijden", "description": "Negeert apps waar al een app met dezelfde href bestaat" @@ -1780,11 +1785,11 @@ "label": "Bord naam" }, "screenSize": { - "label": "Schermformaat", - "description": "In versies voor 1.0 bestonden drie verschillende modi, zodat je het aantal kolommen voor elke schermgrootte kon kiezen.", + "label": "Schermgrootte", + "description": "In versies vóór 1.0 bestonden drie verschillende modi, zodat je het aantal kolommen voor elke schermgrootte kon kiezen.", "option": { "sm": "Klein", - "md": "Middel", + "md": "Gemiddeld", "lg": "Groot" } }, @@ -1797,7 +1802,7 @@ "description": "De zijbalk wordt onder de laatste sectie weergegeven" }, "removeItems": { - "label": "Items toevoegen of verwijderen", + "label": "Items verwijderen", "description": "Items in de zijbalk worden verwijderd" } } @@ -1813,10 +1818,10 @@ "label": "Meta titel" }, "logoImageUrl": { - "label": "Logo afbeelding URL" + "label": "Logo afbeeldings-URL" }, "faviconImageUrl": { - "label": "Favicon afbeelding URL" + "label": "Favicon afbeeldings-URL" }, "backgroundImageUrl": { "label": "Achtergrondafbeelding URL" @@ -1830,7 +1835,7 @@ }, "scroll": { "label": "Scrollen", - "description": "De achtergrond scrolt met je muis." + "description": "Achtergrond scrolt met je muis." } } }, @@ -1839,19 +1844,19 @@ "option": { "repeat": { "label": "Herhalen", - "description": "Herhalen - De afbeelding wordt zoveel herhaald als nodig is om het hele achtergrondafbeelding gebied te bedekken." + "description": "De afbeelding wordt zoveel herhaald als nodig is om het hele achtergrondafbeelding gebied te bedekken." }, "no-repeat": { "label": "Niet herhalen", - "description": "De afbeelding wordt niet herhaald en mag niet de hele ruimte vullen." + "description": "De afbeelding wordt niet herhaald en vult mogelijk niet de hele ruimte." }, "repeat-x": { - "label": "Herhaal X", - "description": "Hetzelfde als 'Herhaal', maar alleen op de horizontale as." + "label": "X herhalen", + "description": "Hetzelfde als ‘herhaal', maar alleen op de horizontale as." }, "repeat-y": { - "label": "Herhaal Y", - "description": "Hetzelfde als 'Herhaal', maar alleen op de verticale as." + "label": "Y herhalen", + "description": "Hetzelfde als ‘herhaal', maar alleen op de verticale as." } } }, @@ -1864,7 +1869,7 @@ }, "contain": { "label": "Insluiten", - "description": "Bevatten - Schaalt de afbeelding zo groot mogelijk binnen de container zonder de afbeelding bij te snijden of uit te rekken." + "description": "Schaalt de afbeelding zo groot mogelijk binnen de container zonder de afbeelding bij te snijden of uit te rekken." } } }, @@ -1882,7 +1887,7 @@ "description": "Pas je dashboard verder aan met behulp van CSS, alleen aanbevolen voor ervaren gebruikers", "customClassesAlert": { "title": "Aangepaste classes", - "description": "Je kunt aangepaste klassen toevoegen aan je borditems in de geavanceerde opties van elk item en ze gebruiken in de aangepaste CSS hierboven." + "description": "Je kunt aangepaste classes toevoegen aan je borditems in de geavanceerde opties van elk item en ze gebruiken in de aangepaste CSS hierboven." } }, "columnCount": { @@ -1907,7 +1912,7 @@ "unrecognizedLink": "De opgegeven link wordt niet herkend en geeft geen voorbeeld, maar werkt misschien nog wel." }, "layout": { - "title": "Indeling" + "title": "Lay-out" }, "background": { "title": "Achtergrond" @@ -1953,22 +1958,22 @@ }, "button": { "public": "Privé maken", - "private": "Maak openbaar" + "private": "Openbaar maken" }, "confirm": { "public": { - "title": "Bestuur privé maken", + "title": "Bord privé maken", "description": "Weet je zeker dat je dit bord privé wilt maken? Dit verbergt het bord voor het publiek. Links voor gastgebruikers worden verbroken." }, "private": { - "title": "Bestuur openbaar maken", + "title": "Bord openbaar maken", "description": "Weet je zeker dat je dit bord openbaar wilt maken? Dit maakt het bord toegankelijk voor iedereen." } } }, "delete": { "label": "Dit bord verwijderen", - "description": "Als je een bord hebt verwijderd, kun je niet meer terug. Wees er zeker van.", + "description": "Als je eenmaal een bord hebt verwijderd, kun je niet meer terug. Wees er zeker van.", "button": "Dit bord verwijderen", "confirm": { "title": "Bord verwijderen", @@ -1987,7 +1992,7 @@ "notice": "Om deze pagina te laten verdwijnen, maak je een bord aan en stel je het in als home-bord" }, "notFound": { - "title": "Raad van bestuur niet gevonden", + "title": "Bord niet gevonden", "description": "Het opgegeven bord is niet gevonden of je hebt er geen toegang toe.", "link": "Alle borden bekijken", "notice": "Controleer de link of neem contact op met een beheerder als je denkt dat deze toegankelijk moet zijn" @@ -2021,13 +2026,13 @@ }, "notFound": { "title": "Niet gevonden", - "text": "Kon de gevraagde bron niet vinden" + "text": "Kon de aangevraagde bron niet vinden" }, "navbar": { "items": { - "home": "", + "home": "Home", "boards": "Borden", - "apps": "", + "apps": "Apps", "integrations": "Integraties", "searchEngies": "Zoekmachines", "medias": "Media", @@ -2042,19 +2047,19 @@ "tools": { "label": "Gereedschappen", "items": { - "docker": "", - "logs": "", - "api": "", + "docker": "Docker", + "logs": "Logs", + "api": "API", "tasks": "Taken" } }, "settings": "Instellingen", "help": { - "label": "", + "label": "Help", "items": { "documentation": "Documentatie", "submitIssue": "Een probleem melden", - "discord": "", + "discord": "Community Discord", "sourceCode": "Broncode" } }, @@ -2068,7 +2073,7 @@ "user": "Gebruikers", "invite": "Uitnodigingen", "integration": "Integraties", - "app": "", + "app": "Apps", "group": "Groepen" }, "statisticLabel": { @@ -2093,7 +2098,7 @@ "setHomeBoard": { "label": "Instellen als je home-bord", "badge": { - "label": "", + "label": "Home", "tooltip": "Dit bord wordt weergegeven als je home-bord" } }, @@ -2130,7 +2135,7 @@ "title": "Algemeen", "item": { "language": "Taal & regio", - "board": "Home bord", + "board": "Home-bord", "firstDayOfWeek": "Eerste dag van de week", "accessibility": "Toegankelijkheid" } @@ -2187,7 +2192,7 @@ "description": "Na de vervaldatum is een uitnodiging niet langer geldig en kan de ontvanger van de uitnodiging geen account meer aanmaken." }, "copy": { - "title": "Kopieer de uitnodiging", + "title": "Uitnodiging kopiëren", "description": "Je uitnodiging is gegenereerd. Na het sluiten van dit venster kun je deze link niet meer kopiëren. Als je deze persoon niet langer wilt uitnodigen, kun je deze uitnodiging op elk moment verwijderen.", "link": "Uitnodigingslink", "button": "Kopiëren en sluiten" @@ -2199,7 +2204,7 @@ }, "field": { "id": { - "label": "" + "label": "ID" }, "creator": { "label": "Maker" @@ -2220,7 +2225,7 @@ "title": "Algemeen", "owner": "Eigenaar", "ownerOfGroup": "Eigenaar van deze groep", - "ownerOfGroupDeleted": "De eigenaar van deze groep is verwijderd. Er is momenteel geen eigenaar." + "ownerOfGroupDeleted": "De eigenaar van deze groep is verwijderd. Het heeft momenteel geen eigenaar." }, "members": { "title": "Leden", @@ -2230,7 +2235,7 @@ "permissions": { "title": "Machtigingen", "form": { - "unsavedChanges": "Er zijn wijzigingen die niet opgeslagen zijn!" + "unsavedChanges": "Er zijn niet-opgeslagen wijzigingen!" } } } @@ -2247,9 +2252,9 @@ }, "section": { "analytics": { - "title": "", + "title": "Analytics", "general": { - "title": "Anonieme analyses versturen", + "title": "Anonieme analyses sturen", "text": "Homarr verstuurt geanonimiseerde analyses met behulp van de open source software Umami. Het verzamelt nooit persoonlijke informatie en is daarom volledig GDPR & CCPA compliant. We moedigen je aan om analytics in te schakelen omdat het ons open source team helpt bij het identificeren van problemen en het prioriteren van onze backlog." }, "widgetData": { @@ -2267,17 +2272,17 @@ }, "crawlingAndIndexing": { "title": "Crawlen en indexeren", - "warning": "Het in- of uitschakelen van instellingen hier heeft grote invloed op hoe zoekmachines je pagina zullen indexeren en crawlen. Elke instelling is een verzoek en het is aan de crawler om deze instellingen toe te passen. Het kan meerdere dagen of weken duren voordat elke wijziging is toegepast. Sommige instellingen kunnen zoekmachinespecifiek zijn.", + "warning": "Het in- of uitschakelen van instellingen hier heeft grote invloed op hoe zoekmachines je pagina zullen indexeren en crawlen. Elke instelling is een aanvraag en het is aan de crawler om deze instellingen toe te passen. Het kan meerdere dagen of weken duren voordat elke wijziging is toegepast. Sommige instellingen kunnen zoekmachinespecifiek zijn.", "noIndex": { - "title": "Index kaart icoon", + "title": "Geen index", "text": "De website niet indexeren in zoekmachines en niet weergeven in zoekresultaten" }, "noFollow": { "title": "Niet volgen", - "text": "Volg geen links tijdens het indexeren. Als je dit uitschakelt, zullen crawlers proberen alle links op Homarr te volgen." + "text": "Geen enkele links volgen tijdens het indexeren. Als je dit uitschakelt, zullen crawlers proberen alle links op Homarr te volgen." }, "noTranslate": { - "title": "Niet vertalen", + "title": "Geen vertaling", "text": "Als de taal van de site waarschijnlijk niet de taal is die de gebruiker wil lezen, zal Google een vertaallink tonen in de zoekresultaten" }, "noSiteLinksSearchBox": { @@ -2293,7 +2298,7 @@ } }, "appearance": { - "title": "Opmaak", + "title": "Weergave", "defaultColorScheme": { "label": "Standaard kleurenschema", "options": { @@ -2323,58 +2328,58 @@ "label": "Icoon updater" }, "analytics": { - "label": "" + "label": "Analytics" }, "smartHomeEntityState": { "label": "Smart home entiteitstatus" }, "ping": { - "label": "" + "label": "Pings" }, "mediaServer": { - "label": "Media server" + "label": "Mediaserver" }, "mediaOrganizer": { "label": "Media organisatoren" }, "downloads": { - "label": "" + "label": "Downloads" }, "mediaRequestStats": { - "label": "Mediaverzoek statistieken" + "label": "Media-aanvraag statistieken" }, "mediaRequestList": { - "label": "Mediaverzoeken-lijst" + "label": "Media-aanvraag lijst" }, "rssFeeds": { "label": "RSS-feeds" }, "indexerManager": { - "label": "Indexeer beheerder" + "label": "Indexeringsbeheerder" }, "healthMonitoring": { "label": "Gezondheidsmonitoring" }, "dnsHole": { - "label": "DNS-gatgegevens" + "label": "DNS-hole gegevens" }, "sessionCleanup": { "label": "Sessie opruimen" }, "updateChecker": { - "label": "" + "label": "Update checker" }, "mediaTranscoding": { - "label": "Media transcodering" + "label": "Mediatranscodering" } } }, "api": { - "title": "", + "title": "API", "modal": { "createApiToken": { - "title": "API token aangemaakt", - "description": "API token is aangemaakt. Wees voorzichtig, dit token is versleuteld in de database en zal nooit meer aan jou worden overgedragen. Als je dit token verliest, kun je dit specifieke token niet meer opvragen.", + "title": "API-token aangemaakt", + "description": "API-token is aangemaakt. Wees voorzichtig, dit token is versleuteld in de database en zal nooit meer aan jou worden overgedragen. Als je dit token verliest, kun je dit specifieke token niet meer opvragen.", "button": "Kopiëren en sluiten" } }, @@ -2386,11 +2391,11 @@ "label": "Authenticatie", "title": "API-sleutels", "button": { - "createApiToken": "API token aanmaken" + "createApiToken": "API-token aanmaken" }, "table": { "header": { - "id": "", + "id": "ID", "createdBy": "Aangemaakt door" } } @@ -2419,7 +2424,7 @@ } }, "docker": { - "title": "", + "title": "Containers", "table": { "updated": "Bijgewerkt {when}", "search": "Zoek {count} containers", @@ -2435,9 +2440,9 @@ "created": "Aangemaakt", "running": "Actief", "paused": "Gepauzeerd", - "restarting": "Bezig met herstarten", + "restarting": "Herstarten", "exited": "Verlaten", - "removing": "Bezig met verwijderen", + "removing": "Verwijderen", "dead": "Dood" } }, @@ -2450,11 +2455,11 @@ }, "action": { "start": { - "label": "", + "label": "Start", "notification": { "success": { "title": "Containers gestart", - "message": "De containers zijn succesvol gestart" + "message": "De containers werden succesvol gestart" }, "error": { "title": "Containers niet gestart", @@ -2467,7 +2472,7 @@ "notification": { "success": { "title": "Containers gestopt", - "message": "De containers zijn succesvol gestopt" + "message": "De containers werden succesvol gestopt" }, "error": { "title": "Containers niet gestopt", @@ -2476,15 +2481,15 @@ } }, "restart": { - "label": "Herstart", + "label": "Herstarten", "notification": { "success": { "title": "Containers herstart", - "message": "De containers zijn succesvol herstart" + "message": "De containers werden succesvol herstart" }, "error": { "title": "Containers niet opnieuw opgestart", - "message": "De containers konden niet opnieuw worden opgestart" + "message": "De containers konden niet worden herstart" } } }, @@ -2493,7 +2498,7 @@ "notification": { "success": { "title": "Containers verwijderd", - "message": "De containers werden met succes verwijderd" + "message": "De containers werden succesvol verwijderd" }, "error": { "title": "Containers niet verwijderd", @@ -2576,7 +2581,7 @@ "label": "Media" }, "apps": { - "label": "", + "label": "Apps", "new": { "label": "Nieuw" }, @@ -2602,10 +2607,10 @@ "tools": { "label": "Gereedschappen", "docker": { - "label": "" + "label": "Docker" }, "logs": { - "label": "" + "label": "Logs" } }, "settings": { @@ -2627,7 +2632,7 @@ "help": "Zoeken naar apps, integraties of borden", "group": { "app": { - "title": "", + "title": "Apps", "children": { "action": { "open": { @@ -2737,24 +2742,24 @@ }, "option": { "google": { - "name": "", + "name": "Google", "description": "Zoeken op het web met Google" }, "bing": { - "name": "", + "name": "Bing", "description": "Zoeken op het web met Bing" }, "duckduckgo": { - "name": "", + "name": "DuckDuckGo", "description": "Zoeken op het web met DuckDuckGo" }, "torrent": { "name": "Verouderde torrents weergeven", - "description": "Torrents zoeken op torrentdownloads.pro" + "description": "Zoeken naar torrents op torrentdownloads.pro" }, "youTube": { - "name": "", - "description": "Video's zoeken op YouTube" + "name": "YouTube", + "description": "Zoeken naar video's op YouTube" } } } @@ -2766,7 +2771,7 @@ "title": "Modi" }, "help": { - "title": "", + "title": "Help", "option": { "documentation": { "label": "Documentatie" @@ -2775,7 +2780,7 @@ "label": "Een probleem melden" }, "discord": { - "label": "" + "label": "Community Discord" } } } @@ -2825,7 +2830,7 @@ "label": "Docker beheren" }, "manageApi": { - "label": "" + "label": "Swagger API" }, "manageLog": { "label": "Logs bekijken" @@ -2840,7 +2845,7 @@ "label": "Over" }, "homeBoard": { - "label": "Home bord" + "label": "Home-bord" }, "preferences": { "label": "Jouw voorkeuren" @@ -2857,7 +2862,7 @@ "children": { "action": { "detail": { - "label": "Gebruikersgegevens tonen" + "label": "Gebruikersgegevens weergeven" } }, "detail": { @@ -2870,7 +2875,7 @@ "children": { "action": { "detail": { - "label": "Details van groep weergeven" + "label": "Groepdetails weergeven" }, "manageMember": { "label": "Leden beheren" diff --git a/packages/translation/src/lang/no.json b/packages/translation/src/lang/no.json index c9fde5e3e..58ab1bcb5 100644 --- a/packages/translation/src/lang/no.json +++ b/packages/translation/src/lang/no.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/pl.json b/packages/translation/src/lang/pl.json index e2f83a84e..f59cee154 100644 --- a/packages/translation/src/lang/pl.json +++ b/packages/translation/src/lang/pl.json @@ -1254,7 +1254,7 @@ "description": "", "option": { "entityId": { - "label": "ID encji" + "label": "ID obiektu" }, "displayName": { "label": "" @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/pt.json b/packages/translation/src/lang/pt.json index 3186e11e2..314552f75 100644 --- a/packages/translation/src/lang/pt.json +++ b/packages/translation/src/lang/pt.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/ro.json b/packages/translation/src/lang/ro.json index 2da2ae314..c9d12cd85 100644 --- a/packages/translation/src/lang/ro.json +++ b/packages/translation/src/lang/ro.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/ru.json b/packages/translation/src/lang/ru.json index 8c70eafae..160e884a1 100644 --- a/packages/translation/src/lang/ru.json +++ b/packages/translation/src/lang/ru.json @@ -1381,7 +1381,7 @@ "memory": "Память: {memory}GiB", "memoryAvailable": "Доступно: {memoryAvailable}GiB ({percent}%)", "version": "Версия: {version}", - "uptime": "Время работы: {days} дн., {hours} ч., {minutes} мин.", + "uptime": "Время работы: {months} мес., {days} дн., {hours} ч., {minutes} мин.", "loadAverage": "Средняя нагрузка:", "minute": "1 минута", "minutes": "{count} минут", @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "Активные просмотры", "description": "Отображает текущие сеансы воспроизведения на медиасерверах", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "Загрузки", diff --git a/packages/translation/src/lang/sk.json b/packages/translation/src/lang/sk.json index a3052d75e..bbd0b1a71 100644 --- a/packages/translation/src/lang/sk.json +++ b/packages/translation/src/lang/sk.json @@ -2,9 +2,9 @@ "init": { "step": { "start": { - "title": "Vitajte na stránke Homarr", - "subtitle": "Začnime s nastavením inštancie Homarr.", - "description": "Ak chcete začať, vyberte, ako chcete nastaviť inštanciu Homarr.", + "title": "Vitajte na Homár", + "subtitle": "Začnime s nastavením inštancie Homár.", + "description": "Ak chcete začať, vyberte, ako chcete nastaviť inštanciu Homár.", "action": { "scratch": "Začať odznova", "importOldmarr": "Import z Homarru pred 1.0" @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "Aktuálne streamy mediálneho servera", "description": "Zobrazte aktuálne streamy na vašich mediálnych serveroch", - "option": {} + "option": {}, + "items": { + "user": "Používateľ", + "name": "Názov", + "id": "Id" + } }, "downloads": { "name": "Download klient", diff --git a/packages/translation/src/lang/sl.json b/packages/translation/src/lang/sl.json index 6b13bf358..c0da63e30 100644 --- a/packages/translation/src/lang/sl.json +++ b/packages/translation/src/lang/sl.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/sv.json b/packages/translation/src/lang/sv.json index b3760d305..5263131b8 100644 --- a/packages/translation/src/lang/sv.json +++ b/packages/translation/src/lang/sv.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/tr.json b/packages/translation/src/lang/tr.json index fdc47b8ee..7cb8e2f1a 100644 --- a/packages/translation/src/lang/tr.json +++ b/packages/translation/src/lang/tr.json @@ -147,7 +147,7 @@ "label": "Eski Şifre" }, "homeBoard": { - "label": "Varsayılan Panel" + "label": "Öntanımlı panel" }, "pingIconsEnabled": { "label": "Pingler İçin Simgeler Kullanın" @@ -203,10 +203,10 @@ "changeHomeBoard": { "notification": { "success": { - "message": "Varsayılan panel başarıyla değiştirildi" + "message": "Öntanımlı panel başarıyla değiştirildi" }, "error": { - "message": "Varsayılan panel değiştirilemiyor" + "message": "Öntanımlı panel değiştirilemiyor" } } }, @@ -498,7 +498,7 @@ } }, "create": { - "title": "Yeni uygulama", + "title": "Yeni Uygulama", "notification": { "success": { "title": "Oluşturma başarılı", @@ -566,7 +566,7 @@ } }, "create": { - "title": "Yeni {name} entegrasyonu", + "title": "Yeni {name} Entegrasyonu", "notification": { "success": { "title": "Oluşturma başarılı", @@ -615,7 +615,7 @@ } }, "action": { - "create": "Yeni entegrasyon" + "create": "Yeni Entegrasyon" }, "testConnection": { "action": { @@ -703,13 +703,13 @@ "message": "Gizli anahtarı sıfırlamak istediğinizden emin misiniz?" }, "noSecretsRequired": { - "segmentTitle": "Hiçbir Gizli Anahtar Bulunamadı", + "segmentTitle": "Gizli Anahtar Yok", "text": "Bu entegrasyon için gizli anahtar gerekmiyor" }, "kind": { "username": { "label": "Kullanıcı adı", - "newLabel": "Yeni kullanıcı adı" + "newLabel": "Yeni Kullanıcı Adı" }, "apiKey": { "label": "API Anahtarı", @@ -717,7 +717,7 @@ }, "password": { "label": "Şifre", - "newLabel": "Yeni parola" + "newLabel": "Yeni Şifre" } } }, @@ -842,18 +842,18 @@ }, "userAvatar": { "menu": { - "switchToDarkMode": "Koyu moda geç", - "switchToLightMode": "Aydınlık moda geç", + "switchToDarkMode": "Koyu Temaya Geç", + "switchToLightMode": "Aydınlık Temaya Geç", "management": "Yönetim", "preferences": "Tercihleriniz", "logout": "Oturumu kapat", "login": "Giriş", - "homeBoard": "Varsayılan Panel", + "homeBoard": "Öntanımlı Panel", "loggedOut": "Oturum kapatıldı", "updateAvailable": "{countUpdates} güncelleme mevcut: {tag}" } }, - "dangerZone": "Tehlikeli bölge", + "dangerZone": "Tehlikeli Bölge", "noResults": "Sonuç bulunamadı", "preview": { "show": "Ara Renkleri Göster", @@ -892,7 +892,7 @@ "section": { "dynamic": { "action": { - "create": "Yeni dinamik bölüm", + "create": "Yeni Dinamik Bölüm", "remove": "Dinamik bölümü kaldır" }, "remove": { @@ -907,16 +907,16 @@ } }, "action": { - "create": "Yeni kategori", - "edit": "Kategoriyi yeniden adlandır", + "create": "Yeni Kategori", + "edit": "Kategoriyi Yeniden Adlandır", "remove": "Kategoriyi kaldır", "moveUp": "Yukarı taşı", "moveDown": "Aşağı taşı", - "createAbove": "Yukarı yeni kategori", - "createBelow": "Aşağı yeni kategori" + "createAbove": "Yukarı Yeni Kategori", + "createBelow": "Aşağı Yeni Kategori" }, "create": { - "title": "Yeni kategori", + "title": "Yeni Kategori", "submit": "Kategori ekle" }, "remove": { @@ -924,12 +924,12 @@ "message": "{name} kategorisini kaldırmak istediğinizden emin misiniz?" }, "edit": { - "title": "Kategoriyi yeniden adlandır", - "submit": "Kategoriyi yeniden adlandır" + "title": "Kategoriyi Yeniden Adlandır", + "submit": "Kategoriyi Yeniden Adlandır" }, "menu": { "label": { - "create": "Yeni kategori", + "create": "Yeni Kategori", "changePosition": "Pozisyonu değiştir" } } @@ -937,10 +937,10 @@ }, "item": { "action": { - "create": "Yeni öğe", + "create": "Yeni Öğe", "import": "Öğeleri İçe Aktar", "edit": "Öğeyi Düzenle", - "moveResize": "Öğeyi taşı / yeniden boyutlandır", + "moveResize": "Öğeyi Taşı / Yeniden Boyutlandır", "duplicate": "Öğeyi Çoğalt", "remove": "Öğeyi kaldır" }, @@ -954,7 +954,7 @@ "addToBoard": "Panele Ekle" }, "moveResize": { - "title": "Öğeyi taşı / yeniden boyutlandır", + "title": "Öğeyi Taşı / Yeniden Boyutlandır", "field": { "width": { "label": "Genişlik" @@ -981,7 +981,7 @@ "label": "Entegrasyonlar" }, "customCssClasses": { - "label": "Özel css sınıfları" + "label": "Özel CSS Alanı" } } }, @@ -999,7 +999,7 @@ "label": "Uygulama seç" }, "openInNewTab": { - "label": "Yeni sekmede aç" + "label": "Yeni Sekmede Aç" }, "showTitle": { "label": "Uygulama adını göster" @@ -1019,7 +1019,7 @@ } }, "bookmarks": { - "name": "Yer imleri", + "name": "Yer İmleri", "description": "Birden fazla uygulama bağlantısını görüntüler", "option": { "title": { @@ -1040,7 +1040,7 @@ } }, "items": { - "label": "Yer imleri", + "label": "Yer İmleri", "add": "Yer imi ekle" } } @@ -1079,7 +1079,7 @@ } }, "dnsHoleControls": { - "name": "DNS çözümleyici kontrolleri", + "name": "DNS Çözümleyici Kontrolleri", "description": "Kontrol panelinizden PiHole veya AdGuard'ı kontrol edin", "option": { "layout": { @@ -1118,7 +1118,7 @@ } }, "clock": { - "name": "Tarih ve saat", + "name": "Tarih ve Saat", "description": "Geçerli tarih ve saati görüntüler.", "option": { "customTitleToggle": { @@ -1152,7 +1152,7 @@ } }, "notebook": { - "name": "Not defteri", + "name": "Not Defteri", "description": "Markdown'ı destekleyen basit bir not defteri bileşeni", "option": { "showToolbar": { @@ -1345,17 +1345,17 @@ } }, "indexerManager": { - "name": "Dizin oluşturucu yöneticisi statüsü", - "description": "Dizinleyicilerinizin durumu", + "name": "İndeksleyici Yönetim Durumu", + "description": "İndeksleyicilerinizin durumu", "option": { "openIndexerSiteInNewTab": { - "label": "Dizinleyici sitesini yeni sekmede aç" + "label": "İndeksleyici Sitesini Yeni Sekmede Aç" } }, - "title": "Dizin oluşturucu yöneticisi", + "title": "İndeksleyici Yöneticisi", "testAll": "Tümünü test et", "error": { - "internalServerError": "Dizinleyicilerin durumu alınamadı" + "internalServerError": "İndeksleyicilerin durumu alınamadı" } }, "healthMonitoring": { @@ -1455,9 +1455,14 @@ } }, "mediaServer": { - "name": "Güncel medya sunucusu akışları", + "name": "Güncel Medya Sunucusu Akışları", "description": "Medya sunucularınızdaki mevcut akışları gösterin", - "option": {} + "option": {}, + "items": { + "user": "Kullanıcı", + "name": "İsim", + "id": "Kimlik" + } }, "downloads": { "name": "İndirme İstemcisi", @@ -1470,7 +1475,7 @@ "label": "Öğelerin sıralanmasını etkinleştir" }, "defaultSort": { - "label": "Varsayılan olarak sıralama için kullanılan sütun" + "label": "Öntanımlı olarak sıralama için kullanılan sütun" }, "descendingDefaultSort": { "label": "Ters sıralama" @@ -1644,11 +1649,11 @@ } }, "mediaTranscoding": { - "name": "Medya kod dönüştürme", + "name": "Medya Kod Dönüştürme", "description": "Medya kod dönüştürmenizin istatistikleri, geçerli kuyruğu ve çalışan durumu", "option": { "defaultView": { - "label": "Varsayılan görünüm" + "label": "Öntanımlı görünüm" }, "queuePageSize": { "label": "Kuyruk Sayfa Boyutu" @@ -1703,8 +1708,8 @@ } }, "rssFeed": { - "name": "RSS beslemeleri", - "description": "Bir veya daha fazla genel RSS, ATOM veya JSON beslemesini izleyin ve görüntüleyin", + "name": "RSS Beslemeleri", + "description": "Bir veya daha fazla RSS, ATOM veya JSON beslemesini takip edin ve görüntüleyin", "option": { "feedUrls": { "label": "Besleme URL'leri" @@ -1807,22 +1812,22 @@ }, "field": { "pageTitle": { - "label": "Sayfa başlığı" + "label": "Sayfa Başlığı" }, "metaTitle": { - "label": "Meta başlığı" + "label": "Meta Başlığı" }, "logoImageUrl": { - "label": "Logo görsel URL'si" + "label": "Logo Görseli URL'si" }, "faviconImageUrl": { - "label": "Favicon görsel URL'si" + "label": "Favicon Görseli URL'si" }, "backgroundImageUrl": { - "label": "Arkaplan görsel URL'si" + "label": "Arkaplan Resmi URL'si" }, "backgroundImageAttachment": { - "label": "Arkaplan görsel yerleştirme", + "label": "Arka Plan Yerleşimi", "option": { "fixed": { "label": "Sabit", @@ -1830,12 +1835,12 @@ }, "scroll": { "label": "Kaydır", - "description": "Arkaplan farenizle birlikte kayar." + "description": "Arkaplan Farenizle Birlikte Kayar." } } }, "backgroundImageRepeat": { - "label": "Arkaplan görüntüsünü Tekrarla", + "label": "Arkaplan Resmini Tekrarla", "option": { "repeat": { "label": "Tekrarla", @@ -1856,7 +1861,7 @@ } }, "backgroundImageSize": { - "label": "Arkaplan görsel boyutu", + "label": "Arkaplan Resim Boyutu", "option": { "cover": { "label": "Kapak", @@ -1879,14 +1884,14 @@ }, "customCss": { "label": "Bu panel için özel css", - "description": "Kontrol panelinizi yalnızca deneyimli kullanıcılar için önerilen CSS kullanarak özelleştirin", + "description": "CSS kullanarak panelizi özelleştirin, sadece tecrübeli kullanıcılar için tavsiye edilir", "customClassesAlert": { "title": "Özel sınıflar", - "description": "Her öğenin gelişmiş seçeneklerinde panel örneklerinize özel sınıflar ekleyebilir ve bunları yukarıdaki özel CSS'de kullanabilirsiniz." + "description": "Düzenlenen her aracın gelişmiş seçenekler sekmesinde bulunan alanı kullanarak panel öğelerinizi CSS ile özelleştirebilir ve ya yukarıdaki özel CSS alanını kullanabilirsiniz." } }, "columnCount": { - "label": "Sütun sayısı" + "label": "Sütun Sayısı" }, "name": { "label": "İsim" @@ -1919,7 +1924,7 @@ "title": "Özel Css" }, "access": { - "title": "Erişim kontrolü", + "title": "Erişim Kontrolü", "permission": { "item": { "view": { @@ -1935,14 +1940,14 @@ } }, "dangerZone": { - "title": "Tehlikeli bölge", + "title": "Tehlikeli Bölge", "action": { "rename": { - "label": "Panelin adını değiştir", + "label": "Panelin ismini değiştir", "description": "İsmin değiştirilmesi bu panele olan tüm bağlantıların kopmasına neden olacaktır.", "button": "İsmi değiştir", "modal": { - "title": "Panelin adını değiştir" + "title": "Panelin ismini değiştir" } }, "visibility": { @@ -1993,7 +1998,7 @@ "notice": "Bağlantıyı kontrol edin veya erişilebilir olması gerektiğini düşünüyorsanız bir yöneticiyle iletişime geçin" }, "homeBoard": { - "title": "Varsayılan Panel Yapılandırılmadı", + "title": "Öntanımlı Panel Yapılandırılmadı", "admin": { "description": "Sunucu için henüz bir ana sayfa paneli belirlemediniz.", "link": "Sunucu geneli için ana panel yapılandırın", @@ -2001,13 +2006,13 @@ }, "user": { "description": "Henüz bir ev paneli belirlemediniz.", - "link": "Varsayılan Paneli Yapılandır", - "notice": "Bu Sayfanın Kaybolmasını Sağlamak İçin Tercihlerden Varsayılan Panel Atayın" + "link": "Öntanımlı paneli yapılandır", + "notice": "Bu sayfanın kaybolmasını sağlamak için tercihlerden öntanımlı panel seçin" }, "anonymous": { - "description": "Sunucu Yöneticiniz Henüz Bir Varsayılan Panel Atamadı.", + "description": "Sunucu yöneticiniz henüz bir öntanımlı panel belirlemedi.", "link": "Herkese açık panelleri görüntüle", - "notice": "Bu Sayfanın Kaybolmasını Sağlamak İçin Sunucu Yöneticisinden Varsayılan Panel Atamasını isteyin" + "notice": "Bu sayfanın kaybolmasını sağlamak için sunucu yöneticisinden öntanımlı panel ayarlamasını isteyin" } } } @@ -2082,7 +2087,7 @@ "title": "Panelleriniz", "action": { "new": { - "label": "Yeni panel" + "label": "Yeni Panel" }, "open": { "label": "Panel'i aç" @@ -2091,10 +2096,10 @@ "label": "Ayarlar" }, "setHomeBoard": { - "label": "Varsayılan Panel Olarak Ata", + "label": "Öntanımlı panel olarak ayarlayın", "badge": { "label": "Ana Sayfa", - "tooltip": "Bu panel sizin varsayılan paneliniz olarak görüntülenecektir" + "tooltip": "Bu panel sizin öntanımlı paneliniz olarak görüntülenecektir" } }, "delete": { @@ -2130,7 +2135,7 @@ "title": "Genel", "item": { "language": "Dil & Bölge", - "board": "Varsayılan Panel", + "board": "Öntanımlı panel", "firstDayOfWeek": "Haftanın ilk günü", "accessibility": "Erişilebilirlik" } @@ -2151,7 +2156,7 @@ }, "create": { "metaTitle": "Kullanıcı ekle", - "title": "Yeni kullanıcı oluştur", + "title": "Yeni Kullanıcı Oluştur", "step": { "personalInformation": { "label": "Kişisel bilgiler" @@ -2183,7 +2188,7 @@ "title": "Kullanıcı Davetlerini Yönet", "action": { "new": { - "title": "Yeni davet", + "title": "Yeni Davet", "description": "Süre sona erdikten sonra davet artık geçerli olmayacak ve daveti alan kişi bir hesap oluşturamayacaktır." }, "copy": { @@ -2254,11 +2259,11 @@ }, "widgetData": { "title": "Widget verileri", - "text": "Widget (ve sayıları) yapılandırma verilerini gönder. URL'leri, adları veya başka herhangi bir veriyi içermez." + "text": "Araç (ve sayılarını) yapılandırma verilerini gönder. URL'leri, alan adlarını veya başka herhangi bir veriyi içermez." }, "integrationData": { "title": "Entegrasyon verileri", - "text": "Entegrasyon (ve sayıları) yapılandırma verilerini gönder. URL'leri, adları veya başka herhangi bir veriyi içermez." + "text": "Entegrasyon (ve sayıları) yapılandırma verilerini gönder. URL'leri, alan adlarını veya başka herhangi bir veriyi içermez." }, "usersData": { "title": "Kullanıcı verileri", @@ -2281,21 +2286,21 @@ "text": "Kullanıcının site üzerinde okumak isteyeceği dilin olmaması durumunda Google, arama sonuçlarında bir çeviri bağlantısı gösterecektir" }, "noSiteLinksSearchBox": { - "title": "Site arama alanını gösterme", + "title": "Site Arama Alanını Gösterme", "text": "Google, aranan bağlantıların yanı sıra diğer doğrudan bağlantılardan oluşan bir arama kutusu oluşturur. Bu seçenek etkinleştirildiğinde Google'dan bu alanı devre dışı bırakması istenecektir." } }, "board": { "title": "Paneller", "homeBoard": { - "label": "Genel Varsayılan Panel", - "description": "Seçim için yalnızca herkese açık paneller kullanılabilir" + "label": "Genel Ana Sayfa Paneli", + "description": "Seçim yalnızca herkese açık paneller için kullanılabilir" } }, "appearance": { "title": "Görünüş", "defaultColorScheme": { - "label": "Varsayılan renk şeması", + "label": "Öntanımlı Renk Düzeni", "options": { "light": "Aydınlık", "dark": "Koyu" @@ -2305,7 +2310,7 @@ "culture": { "title": "Kültür", "defaultLocale": { - "label": "Varsayılan dil" + "label": "Öntanımlı Dil" } } } @@ -2320,7 +2325,7 @@ }, "job": { "iconsUpdater": { - "label": "Simge Güncelleyici" + "label": "Simge Güncelleme" }, "analytics": { "label": "Analiz" @@ -2347,10 +2352,10 @@ "label": "Medya Talep Listesi" }, "rssFeeds": { - "label": "RSS beslemeleri" + "label": "RSS Beslemeleri" }, "indexerManager": { - "label": "Dizinleyici Yöneticisi" + "label": "İndeksleyici Yöneticisi" }, "healthMonitoring": { "label": "Sağlık İzleme" @@ -2365,7 +2370,7 @@ "label": "Güncelleme denetleyicisi" }, "mediaTranscoding": { - "label": "Medya kod dönüştürme" + "label": "Medya Kod Dönüştürme" } } }, @@ -2400,7 +2405,7 @@ }, "about": { "version": "Sürüm {version}", - "text": "Homarr, gönüllüler tarafından sürdürülen topluluk odaklı bir açık kaynak projesidir. Bu kişiler sayesinde Homarr, 2021'den beri büyüyen bir projedir. Ekibimiz, boş zamanlarında Homarr üzerinde birçok farklı ülkeden tamamen uzaktan, hiçbir ücret almadan çalışmaktadır.", + "text": "Homarr, gönüllüler tarafından sürdürülen topluluk odaklı bir açık kaynak projesidir. Bu kişiler sayesinde Homarr, 2021'den bugüne büyüyerek ilerleyen bir projedir. Ekibimiz, boş zamanlarında Homarr üzerinde birçok farklı ülkeden tamamen uzaktan, hiçbir ücret almadan çalışmaktadır.", "accordion": { "contributors": { "title": "Katkıda Bulunanlar", @@ -2408,7 +2413,7 @@ }, "translators": { "title": "Çevirmenler", - "subtitle": "{count} dilde birçok kişi çevirilere katkıda bulunuyor" + "subtitle": "Birçok kişi Homarr'ın {count} dile çevrilmesine katkı sağlıyor" }, "libraries": { "title": "Kütüphaneler", @@ -2435,7 +2440,7 @@ "created": "Oluşturuldu", "running": "Çalışıyor", "paused": "Duraklatıldı", - "restarting": "Yeniden başlatılıyor", + "restarting": "Yeniden Başlatılıyor", "exited": "Çıkıldı", "removing": "Kaldırılıyor", "dead": "Ölü" @@ -2564,7 +2569,7 @@ } }, "search-engines": { - "label": "Arama motorları", + "label": "Arama Motorları", "new": { "label": "Yeni" }, @@ -2617,7 +2622,7 @@ } }, "search": { - "placeholder": "Ara", + "placeholder": "Ara (\"!\" İle Başlamalı)", "nothingFound": "Hiçbir şey bulunamadı", "error": { "fetch": "Veriler alınırken bir hata oluştu" @@ -2650,7 +2655,7 @@ "label": "Panel'i aç" }, "homeBoard": { - "label": "Varsayılan Panel Olarak Ata" + "label": "Öntanımlı panel olarak ata" }, "settings": { "label": "Ayarları aç" @@ -2676,8 +2681,8 @@ "title": "Genel komutlar", "option": { "colorScheme": { - "light": "Aydınlık moda geç", - "dark": "Koyu moda geç" + "light": "Aydınlık Temaya Geç", + "dark": "Koyu Temaya Geç" }, "language": { "label": "Dili değiştir", @@ -2688,16 +2693,16 @@ } }, "newBoard": { - "label": "Yeni bir panel oluştur" + "label": "Yeni Panel Oluştur" }, "importBoard": { "label": "Bir paneli içe aktar" }, "newApp": { - "label": "Yeni bir uygulama oluştur" + "label": "Yeni Uygulama Oluştur" }, "newIntegration": { - "label": "Yeni bir entegrasyon oluşturun", + "label": "Yeni Entegrasyon Oluştur", "children": { "detail": { "title": "Oluşturmak istediğiniz entegrasyon türünü seçin" @@ -2705,13 +2710,13 @@ } }, "newUser": { - "label": "Yeni bir kullanıcı oluştur" + "label": "Yeni Kullanıcı Oluştur" }, "newInvite": { - "label": "Yeni bir davet oluştur" + "label": "Yeni Davet Oluştur" }, "newGroup": { - "label": "Yeni bir grup oluştur" + "label": "Yeni Grup Oluştur" } } } @@ -2721,7 +2726,7 @@ "help": "Harici bir arama motoru kullanın", "group": { "searchEngine": { - "title": "Arama motorları", + "title": "Arama Motorları", "children": { "action": { "search": { @@ -2729,7 +2734,7 @@ } }, "detail": { - "title": "Arama motoru için bir eylem seçin" + "title": "Arama yapmak istediğiniz terimleri girin" }, "searchResults": { "title": "Eylemler için bir arama sonucu seçin" @@ -2840,7 +2845,7 @@ "label": "Hakkında" }, "homeBoard": { - "label": "Varsayılan Panel" + "label": "Öntanımlı panel" }, "preferences": { "label": "Tercihleriniz" @@ -2913,7 +2918,7 @@ "interactive": "Etkileşimli, entegrasyon kullanır" }, "create": { - "title": "Yeni arama motoru", + "title": "Yeni Arama Motoru", "notification": { "success": { "title": "Arama motoru oluşturuldu", diff --git a/packages/translation/src/lang/tw.json b/packages/translation/src/lang/tw.json index e622b7f60..ce5e146a4 100644 --- a/packages/translation/src/lang/tw.json +++ b/packages/translation/src/lang/tw.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "使用者", + "name": "名稱", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/uk.json b/packages/translation/src/lang/uk.json index c67e20b69..91219a9d7 100644 --- a/packages/translation/src/lang/uk.json +++ b/packages/translation/src/lang/uk.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/vi.json b/packages/translation/src/lang/vi.json index 10f89aa67..a1a55468f 100644 --- a/packages/translation/src/lang/vi.json +++ b/packages/translation/src/lang/vi.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/translation/src/lang/zh.json b/packages/translation/src/lang/zh.json index 4f82cee8b..cc660f4cd 100644 --- a/packages/translation/src/lang/zh.json +++ b/packages/translation/src/lang/zh.json @@ -1457,7 +1457,12 @@ "mediaServer": { "name": "", "description": "", - "option": {} + "option": {}, + "items": { + "user": "", + "name": "", + "id": "" + } }, "downloads": { "name": "", diff --git a/packages/validation/src/common.ts b/packages/validation/src/common.ts index 68506df63..3decf20be 100644 --- a/packages/validation/src/common.ts +++ b/packages/validation/src/common.ts @@ -15,8 +15,21 @@ const searchSchema = z.object({ limit: z.number().int().positive().default(10), }); +const mediaRequestOptionsSchema = z.object({ + mediaId: z.number(), + mediaType: z.enum(["tv", "movie"]), +}); + +const requestMediaSchema = z.object({ + mediaType: z.enum(["tv", "movie"]), + mediaId: z.number(), + seasons: z.array(z.number().min(0)).optional(), +}); + export const commonSchemas = { paginated: paginatedSchema, byId: byIdSchema, search: searchSchema, + mediaRequestOptions: mediaRequestOptionsSchema, + requestMedia: requestMediaSchema, }; diff --git a/packages/validation/src/integration.ts b/packages/validation/src/integration.ts index 1a7529087..ad22d8eeb 100644 --- a/packages/validation/src/integration.ts +++ b/packages/validation/src/integration.ts @@ -15,6 +15,7 @@ const integrationCreateSchema = z.object({ value: z.string().nonempty(), }), ), + attemptSearchEngineCreation: z.boolean(), }); const integrationUpdateSchema = z.object({ diff --git a/packages/widgets/package.json b/packages/widgets/package.json index 5dbc64085..a6bc44136 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -44,21 +44,21 @@ "@mantine/core": "^7.15.2", "@mantine/hooks": "^7.15.2", "@tabler/icons-react": "^3.26.0", - "@tiptap/extension-color": "2.10.4", - "@tiptap/extension-highlight": "2.10.4", - "@tiptap/extension-image": "2.10.4", - "@tiptap/extension-link": "^2.10.4", - "@tiptap/extension-table": "2.10.4", - "@tiptap/extension-table-cell": "2.10.4", - "@tiptap/extension-table-header": "2.10.4", - "@tiptap/extension-table-row": "2.10.4", - "@tiptap/extension-task-item": "2.10.4", - "@tiptap/extension-task-list": "2.10.4", - "@tiptap/extension-text-align": "2.10.4", - "@tiptap/extension-text-style": "2.10.4", - "@tiptap/extension-underline": "2.10.4", - "@tiptap/react": "^2.10.4", - "@tiptap/starter-kit": "^2.10.4", + "@tiptap/extension-color": "2.11.0", + "@tiptap/extension-highlight": "2.11.0", + "@tiptap/extension-image": "2.11.0", + "@tiptap/extension-link": "^2.11.0", + "@tiptap/extension-table": "2.11.0", + "@tiptap/extension-table-cell": "2.11.0", + "@tiptap/extension-table-header": "2.11.0", + "@tiptap/extension-table-row": "2.11.0", + "@tiptap/extension-task-item": "2.11.0", + "@tiptap/extension-task-list": "2.11.0", + "@tiptap/extension-text-align": "2.11.0", + "@tiptap/extension-text-style": "2.11.0", + "@tiptap/extension-underline": "2.11.0", + "@tiptap/react": "^2.11.0", + "@tiptap/starter-kit": "^2.11.0", "clsx": "^2.1.1", "dayjs": "^1.11.13", "mantine-react-table": "2.0.0-beta.7", diff --git a/packages/widgets/src/health-monitoring/component.tsx b/packages/widgets/src/health-monitoring/component.tsx index b150ca91f..d4a597f4f 100644 --- a/packages/widgets/src/health-monitoring/component.tsx +++ b/packages/widgets/src/health-monitoring/component.tsx @@ -66,7 +66,7 @@ export default function HealthMonitoringWidget({ options, integrationIds }: Widg } const newData = prevData.map((item) => item.integrationId === data.integrationId - ? { ...item, healthInfo: data.healthInfo, timestamp: data.timestamp } + ? { ...item, healthInfo: data.healthInfo, updatedAt: data.timestamp } : item, ); return newData; @@ -272,11 +272,12 @@ export default function HealthMonitoringWidget({ options, integrationIds }: Widg export const formatUptime = (uptimeInSeconds: number, t: TranslationFunction) => { const uptimeDuration = dayjs.duration(uptimeInSeconds, "seconds"); + const months = uptimeDuration.months(); const days = uptimeDuration.days(); const hours = uptimeDuration.hours(); const minutes = uptimeDuration.minutes(); - return t("widget.healthMonitoring.popover.uptime", { days, hours, minutes }); + return t("widget.healthMonitoring.popover.uptime", { months, days, hours, minutes }); }; export const progressColor = (percentage: number) => { diff --git a/packages/widgets/src/index.tsx b/packages/widgets/src/index.tsx index 7fc8f97ff..b041c11ba 100644 --- a/packages/widgets/src/index.tsx +++ b/packages/widgets/src/index.tsx @@ -22,6 +22,7 @@ import * as mediaRequestsList from "./media-requests/list"; import * as mediaRequestsStats from "./media-requests/stats"; import * as mediaServer from "./media-server"; import * as mediaTranscoding from "./media-transcoding"; +import * as minecraftServerStatus from "./minecraft/server-status"; import * as notebook from "./notebook"; import type { WidgetOptionDefinition } from "./options"; import * as rssFeed from "./rssFeed"; @@ -54,6 +55,7 @@ export const widgetImports = { indexerManager, healthMonitoring, mediaTranscoding, + minecraftServerStatus, } satisfies WidgetImportRecord; export type WidgetImports = typeof widgetImports; diff --git a/packages/widgets/src/media-server/component.tsx b/packages/widgets/src/media-server/component.tsx index b68b7f09c..6c56a98bc 100644 --- a/packages/widgets/src/media-server/component.tsx +++ b/packages/widgets/src/media-server/component.tsx @@ -1,12 +1,17 @@ "use client"; import { useMemo } from "react"; -import { Avatar, Box, Group, Text } from "@mantine/core"; +import type { MantineStyleProp } from "@mantine/core"; +import { Avatar, Box, Flex, Group, Stack, Text, Title } from "@mantine/core"; +import { IconDeviceAudioTape, IconDeviceTv, IconMovie, IconVideo } from "@tabler/icons-react"; import type { MRT_ColumnDef } from "mantine-react-table"; import { MantineReactTable } from "mantine-react-table"; import { clientApi } from "@homarr/api/client"; +import { getIconUrl, integrationDefs } from "@homarr/definitions"; import type { StreamSession } from "@homarr/integrations"; +import { createModal, useModalAction } from "@homarr/modals"; +import { useScopedI18n } from "@homarr/translation/client"; import { useTranslatedMantineReactTable } from "@homarr/ui/hooks"; import type { WidgetComponentProps } from "../definition"; @@ -29,26 +34,54 @@ export default function MediaServerWidget({ integrationIds, isEditMode }: Widget { accessorKey: "sessionName", header: "Name", + mantineTableHeadCellProps: { + style: { + fontSize: "7cqmin", + padding: "2cqmin", + width: "30%", + }, + }, + Cell: ({ row }) => ( + + {row.original.sessionName} + + ), }, { accessorKey: "user.username", header: "User", + mantineTableHeadCellProps: { + style: { + fontSize: "7cqmin", + padding: "2cqmin", + width: "25%", + }, + }, Cell: ({ row }) => ( - - - {row.original.user.username} + + + {row.original.user.username} ), }, { accessorKey: "currentlyPlaying", // currentlyPlaying.name can be undefined which results in a warning. This is why we use currentlyPlaying instead of currentlyPlaying.name header: "Currently playing", + mantineTableHeadCellProps: { + style: { + fontSize: "7cqmin", + padding: "2cqmin", + width: "45%", + }, + }, Cell: ({ row }) => { if (row.original.currentlyPlaying) { return ( -
- {row.original.currentlyPlaying.name} -
+ + + {row.original.currentlyPlaying.name} + + ); } @@ -83,49 +116,153 @@ export default function MediaServerWidget({ integrationIds, isEditMode }: Widget // Only render the flat list of sessions when the currentStreams change // Otherwise it will always create a new array reference and cause the table to re-render - const flatSessions = useMemo(() => currentStreams.flatMap((pair) => pair.sessions), [currentStreams]); + const flatSessions = useMemo( + () => + currentStreams.flatMap((pair) => + pair.sessions.map((session) => ({ + ...session, + integrationKind: pair.integrationKind, + integrationName: integrationDefs[pair.integrationKind].name, + integrationIcon: getIconUrl(pair.integrationKind), + })), + ), + [currentStreams], + ); + const baseStyle: MantineStyleProp = { + "--total-width": "calc(100cqw / var(--total-width))", + "--ratio-width": "calc(100cqw / var(--total-width))", + "--space-size": "calc(var(--ratio-width) * 0.1)", //Standard gap and spacing value + "--text-fz": "calc(var(--ratio-width) * 0.45)", //General Font Size + "--icon-size": "calc(var(--ratio-width) * 2 / 3)", //Normal icon size + "--mrt-base-background-color": "transparent", + }; + const { openModal } = useModalAction(itemInfoModal); const table = useTranslatedMantineReactTable({ columns, data: flatSessions, - enableRowSelection: false, + enablePagination: false, + enableTopToolbar: false, + enableBottomToolbar: false, + enableSorting: false, + enableColumnActions: false, + enableStickyHeader: false, enableColumnOrdering: false, + enableRowSelection: false, enableFullScreenToggle: false, enableGlobalFilter: false, enableDensityToggle: false, enableFilters: false, - enablePagination: true, - enableSorting: true, enableHiding: false, - enableTopToolbar: false, - enableColumnActions: false, - enableStickyHeader: true, initialState: { density: "xs", }, mantinePaperProps: { - display: "flex", - h: "100%", + flex: 1, withBorder: false, - style: { - flexDirection: "column", - }, + shadow: undefined, }, mantineTableProps: { + className: "media-server-widget-table", style: { tableLayout: "fixed", }, }, mantineTableContainerProps: { style: { - flexGrow: 5, + height: "100%", }, }, + mantineTableBodyCellProps: ({ row }) => ({ + onClick: () => { + openModal({ + item: row.original, + title: + row.original.currentlyPlaying?.type === "movie" ? ( + + ) : row.original.currentlyPlaying?.type === "tv" ? ( + + ) : row.original.currentlyPlaying?.type === "video" ? ( + + ) : ( + + ), + }); + }, + }), + }); + + const uniqueIntegrations = Array.from(new Set(flatSessions.map((session) => session.integrationKind))).map((kind) => { + const session = flatSessions.find((session) => session.integrationKind === kind); + return { + integrationKind: kind, + integrationIcon: session?.integrationIcon, + integrationName: session?.integrationName, + }; }); return ( - + - + + {uniqueIntegrations.map((integration) => ( + + + + {integration.integrationName} + + + ))} + + ); } + +const itemInfoModal = createModal<{ item: StreamSession; title: React.ReactNode }>(({ innerProps }) => { + const t = useScopedI18n("widget.mediaServer.items"); + + return ( + + + {innerProps.title} + {innerProps.item.currentlyPlaying?.name} + + {innerProps.item.currentlyPlaying?.episodeName} + {innerProps.item.currentlyPlaying?.seasonName && ( + <> + {" - "} + {innerProps.item.currentlyPlaying.seasonName} + + )} + + + + + + + ); +}).withOptions({ + defaultTitle() { + return ""; + }, + size: "auto", + centered: true, +}); + +const NormalizedLine = ({ itemKey, value }: { itemKey: string; value: string }) => { + return ( + + {itemKey}: + {value} + + ); +}; diff --git a/packages/widgets/src/minecraft/server-status/component.tsx b/packages/widgets/src/minecraft/server-status/component.tsx new file mode 100644 index 000000000..bb0be1367 --- /dev/null +++ b/packages/widgets/src/minecraft/server-status/component.tsx @@ -0,0 +1,61 @@ +"use client"; + +import { Box, Flex, Group, Text, Tooltip } from "@mantine/core"; +import { IconUsersGroup } from "@tabler/icons-react"; + +import { clientApi } from "@homarr/api/client"; +import { useScopedI18n } from "@homarr/translation/client"; + +import type { WidgetComponentProps } from "../../definition"; + +export default function MinecraftServerStatusWidget({ options }: WidgetComponentProps<"minecraftServerStatus">) { + const [{ data }] = clientApi.widget.minecraft.getServerStatus.useSuspenseQuery(options); + const utils = clientApi.useUtils(); + clientApi.widget.minecraft.subscribeServerStatus.useSubscription(options, { + onData(data) { + utils.widget.minecraft.getServerStatus.setData(options, { + data, + timestamp: new Date(), + }); + }, + }); + const tStatus = useScopedI18n("widget.minecraftServerStatus.status"); + + const title = options.title.trim().length > 0 ? options.title : options.domain; + + return ( + + + + + + + {title} + + + {data.online && ( + <> + {`minecraft + + + + {data.players.online}/{data.players.max} + + + + )} + + ); +} diff --git a/packages/widgets/src/minecraft/server-status/index.ts b/packages/widgets/src/minecraft/server-status/index.ts new file mode 100644 index 000000000..df4c0e2bc --- /dev/null +++ b/packages/widgets/src/minecraft/server-status/index.ts @@ -0,0 +1,15 @@ +import { IconBrandMinecraft } from "@tabler/icons-react"; + +import { z } from "@homarr/validation"; + +import { createWidgetDefinition } from "../../definition"; +import { optionsBuilder } from "../../options"; + +export const { componentLoader, definition } = createWidgetDefinition("minecraftServerStatus", { + icon: IconBrandMinecraft, + options: optionsBuilder.from((factory) => ({ + title: factory.text({ defaultValue: "" }), + domain: factory.text({ defaultValue: "hypixel.net", validate: z.string().nonempty() }), + isBedrockServer: factory.switch({ defaultValue: false }), + })), +}).withDynamicImport(() => import("./component")); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28a444b55..15f21b980 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,7 +165,7 @@ importers: version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/tiptap': specifier: ^7.15.2 - version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tiptap/extension-link@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4))(@tiptap/react@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tiptap/extension-link@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0))(@tiptap/react@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@million/lint': specifier: 1.0.14 version: 1.0.14(rollup@4.21.3)(webpack-sources@3.2.3) @@ -186,16 +186,16 @@ importers: version: 5.62.11(@tanstack/react-query@5.62.11(react@19.0.0))(next@14.2.22(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react@19.0.0) '@trpc/client': specifier: next - version: 11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2) + version: 11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2) '@trpc/next': specifier: next - version: 11.0.0-rc.666(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.666(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(next@14.2.22(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 11.0.0-rc.682(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.682(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(next@14.2.22(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) '@trpc/react-query': specifier: next - version: 11.0.0-rc.666(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 11.0.0-rc.682(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) '@trpc/server': specifier: next - version: 11.0.0-rc.666(typescript@5.7.2) + version: 11.0.0-rc.682(typescript@5.7.2) '@xterm/addon-canvas': specifier: ^0.7.0 version: 0.7.0(@xterm/xterm@5.5.0) @@ -291,8 +291,8 @@ importers: specifier: ^4.18.3 version: 4.18.3 concurrently: - specifier: ^9.1.1 - version: 9.1.1 + specifier: ^9.1.2 + version: 9.1.2 eslint: specifier: ^9.17.0 version: 9.17.0 @@ -541,16 +541,19 @@ importers: version: link:../validation '@trpc/client': specifier: next - version: 11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2) + version: 11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2) '@trpc/react-query': specifier: next - version: 11.0.0-rc.666(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 11.0.0-rc.682(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) '@trpc/server': specifier: next - version: 11.0.0-rc.666(typescript@5.7.2) + version: 11.0.0-rc.682(typescript@5.7.2) dockerode: specifier: ^4.0.2 version: 4.0.2 + lodash.clonedeep: + specifier: ^4.5.0 + version: 4.5.0 next: specifier: ^14.2.22 version: 14.2.22(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) @@ -561,8 +564,8 @@ importers: specifier: 2.2.2 version: 2.2.2 trpc-to-openapi: - specifier: ^2.1.0 - version: 2.1.0(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1) + specifier: ^2.1.1 + version: 2.1.1(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1431,8 +1434,8 @@ importers: specifier: ^1.11.13 version: 1.11.13 octokit: - specifier: ^4.0.2 - version: 4.0.2 + specifier: ^4.0.3 + version: 4.0.3 pretty-print-error: specifier: ^1.1.2 version: 1.1.2(patch_hash=4arrfgbz7em6s4gqywse7esg4u) @@ -1746,50 +1749,50 @@ importers: specifier: ^3.26.0 version: 3.26.0(react@19.0.0) '@tiptap/extension-color': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/extension-text-style@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/extension-text-style@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))) '@tiptap/extension-highlight': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/extension-image': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/extension-link': - specifier: ^2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + specifier: ^2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) '@tiptap/extension-table': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) '@tiptap/extension-table-cell': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/extension-table-header': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/extension-table-row': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/extension-task-item': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) '@tiptap/extension-task-list': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/extension-text-align': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/extension-text-style': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/extension-underline': - specifier: 2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + specifier: 2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) '@tiptap/react': - specifier: ^2.10.4 - version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^2.11.0 + version: 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tiptap/starter-kit': - specifier: ^2.10.4 - version: 2.10.4 + specifier: ^2.11.0 + version: 2.11.0 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -1841,7 +1844,7 @@ importers: version: 2.3.3(eslint@9.17.0) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0) + version: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@9.17.0) @@ -1852,8 +1855,8 @@ importers: specifier: ^5.1.0 version: 5.1.0(eslint@9.17.0) typescript-eslint: - specifier: ^8.18.2 - version: 8.18.2(eslint@9.17.0)(typescript@5.7.2) + specifier: ^8.19.0 + version: 8.19.0(eslint@9.17.0)(typescript@5.7.2) devDependencies: '@homarr/prettier-config': specifier: workspace:^0.1.0 @@ -3694,241 +3697,241 @@ packages: '@testcontainers/mysql@10.16.0': resolution: {integrity: sha512-GyxWqKfpY13lUrTEBmkKrAXyN7RZ//ntMdY/5Eyo/SukDM9LNGu3j5aNuDTGlYr4AEMJuzJ8CHxqUDAFGnCB/w==} - '@tiptap/core@2.10.4': - resolution: {integrity: sha512-fExFRTRgb6MSpg2VvR5qO2dPTQAZWuUoU4UsBCurIVcPWcyVv4FG1YzgMyoLDKy44rebFtwUGJbfU9NzX7Q/bA==} + '@tiptap/core@2.11.0': + resolution: {integrity: sha512-0S3AWx6E2QqwdQqb6z0/q6zq2u9lA9oL3BLyAaITGSC9zt8OwjloS2k1zN6wLa9hp2rO0c0vDnWsTPeFaEaMdw==} peerDependencies: '@tiptap/pm': ^2.7.0 - '@tiptap/extension-blockquote@2.10.4': - resolution: {integrity: sha512-4JSwAM3B92YWvGzu/Vd5rovPrCGwLSaSLD5rxcLyfxLSrTDQd3n7lp78pzVgGhunVECzaGF5A0ByWWpEyS0a3w==} + '@tiptap/extension-blockquote@2.11.0': + resolution: {integrity: sha512-DBjWbgmbAAR879WAsk0+5xxgqpOTweWNnY7kEqWv3EJtLUvECXN63smiv3o4fREwwbEJqgihBu5/YugRC5z1dg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bold@2.10.4': - resolution: {integrity: sha512-SdO4oFQKaERCGfwOc1CLYQRtThENam2KWfWmvpsymknokt5qYzU57ft0SE1HQV9vVYEzZ9HrWIgv2xrgu0g9kg==} + '@tiptap/extension-bold@2.11.0': + resolution: {integrity: sha512-3x9BQZHYD5xFA0pCEneEMHZyIoxYo4NKcbhR4CLxGad1Xd+5g109nr1+eZ1JgvnChkeVf1eD6SaQE2A28lxR5g==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bubble-menu@2.10.4': - resolution: {integrity: sha512-GVtZwJaQyLBptMsmDtYl5GEobd1Uu7C9sc9Z+PdXwMuxmFfg+j07bCKCj5JJj/tjgXCSLVxWdTlDHxNrgzQHjw==} + '@tiptap/extension-bubble-menu@2.11.0': + resolution: {integrity: sha512-21KyB7+QSQjw72Oxzs3Duw9WErAUrigFZCyoCZNjp24wP7mFVsy1jAcnRiAi8pBVwlwHBZ29IW1PeavqCSFFVA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-bullet-list@2.10.4': - resolution: {integrity: sha512-JVwDPgOBYRU2ivaadOh4IaQYXQEiSw6sB36KT/bwqJF2GnEvLiMwptdRMn9Uuh6xYR3imjIZtV6uZAoneZdd6g==} + '@tiptap/extension-bullet-list@2.11.0': + resolution: {integrity: sha512-UALypJvO+cPSk/nC1HhkX/ImS9FxbKe2Pr0iDofakvZU1U1msumLVn2M/iq+ax1Mm9thodpvJv0hGDtFRwm7lQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-code-block@2.10.4': - resolution: {integrity: sha512-qS4jnbJqghNMT2+B+GQ807ATgqkL9OQ//NlL+ZwVSe+DPDduNA9B6IB9SrWENDfOnzekpi7kcEcm+RenELARRQ==} + '@tiptap/extension-code-block@2.11.0': + resolution: {integrity: sha512-8of3qTOLjpveHBrrk8KVliSUVd6R2i2TNrBj0f/21HcFVAy0fP++02p6vI6UPOhwM3+p3CprGdSM48DFCu1rqw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code@2.10.4': - resolution: {integrity: sha512-Vj/N0nbSQiV1o7X7pRySK9Fu72Dd266gm27TSlsts6IwJu5MklFvz7ezJUWoLjt2wmCV8/U/USmk/39ic9qjvg==} + '@tiptap/extension-code@2.11.0': + resolution: {integrity: sha512-2roNZxcny1bGjyZ8x6VmGTuKbwfJyTZ1hiqPc/CRTQ1u42yOhbjF4ziA5kfyUoQlzygZrWH9LR5IMYGzPQ1N3w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-color@2.10.4': - resolution: {integrity: sha512-LgYECcWnTfonqzTUJQN+ujNlWQahGg4G6typRR44opNxwGTlmXHjc6h/JwgLiYxSMZke3EDP/17BSQDH9MMrIA==} + '@tiptap/extension-color@2.11.0': + resolution: {integrity: sha512-9dO6zr7Zzz7vvJAct+IGHvYpV6pHcNyifLjmXNdJdKY118lnoeQfu1dsxiPGl9KXCv5bHgn4dUg3CsrnAlb9OQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/extension-text-style': ^2.7.0 - '@tiptap/extension-document@2.10.4': - resolution: {integrity: sha512-1Pqrl6Rr9bVEHJ3zO2dM7UUA0Qn/r70JQ9YLlestjW1sbMaMuY3Ifvu2uSyUE7SAGV3gvxwNVQCrv8f0VlVEaA==} + '@tiptap/extension-document@2.11.0': + resolution: {integrity: sha512-9YI0AT3mxyUZD7NHECHyV1uAjQ8KwxOS5ACwvrK1MU8TqY084LmodYNTXPKwpqbr51yvt3qZq1R7UIVu4/22Cg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-dropcursor@2.10.4': - resolution: {integrity: sha512-0XEM/yNLaMc/sZlYOau7XpHyYiHT9LwXUe7kmze/L8eowIa/iLvmRbcnUd3rtlZ7x7wooE6UO9c7OtlREg4ZBw==} + '@tiptap/extension-dropcursor@2.11.0': + resolution: {integrity: sha512-p7tUtlz7KzBa+06+7W2LJ8AEiHG5chdnUIapojZ7SqQCrFRVw70R+orpkzkoictxNNHsun0A9FCUy4rz8L0+nQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-floating-menu@2.10.4': - resolution: {integrity: sha512-K2MDiu6CwQ7+Jr6g1Lh3Tuxm1L6SefSHMpQO0UW3aRGwgEV5pjlrztnBFX4K9b7MNuQ4dJGCUK9u8Cv7Xss0qg==} + '@tiptap/extension-floating-menu@2.11.0': + resolution: {integrity: sha512-dexhhUJm0x9OolbeVCa7RpxuALU3bJZC7dFpu/rPG3ZetXKhVw8hTrqUQD5w1DjXpczBzScnLgLrvnjxbG66pw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-gapcursor@2.10.4': - resolution: {integrity: sha512-KbJfoaqTZePpkWAN+klpK5j0UVtELxN7H5B0J556/UCB/rnq+OsdEFHPks2Ss9TidqWzRUqcxUE50UZ7b8h7Ug==} + '@tiptap/extension-gapcursor@2.11.0': + resolution: {integrity: sha512-1TVOthPkUYwTQnQwP0BzuIHVz09epOiXJQ3GqgNZsmTehwcMzz2vGCpx1JXhZ5DoMaREHNLCdraXb1n2FdhDNA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-hard-break@2.10.4': - resolution: {integrity: sha512-nW9wubW1A/CO2Ssn9wNMP08tR9Oarg9VUGzJ5qNuz38DDNyntE1SyDS+XStkeMq5nKqJ3YKhukyAJH/PiRq4Mg==} + '@tiptap/extension-hard-break@2.11.0': + resolution: {integrity: sha512-7pMgPNk2FnPT0LcWaWNNxOLK3LQnRSYFgrdBGMXec3sy+y3Lit3hM+EZhbZcHpTIQTbWWs+eskh1waRMIt0ZaQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-heading@2.10.4': - resolution: {integrity: sha512-7D0h0MIvE97Gx3Qwuo2xnPDK07WfCnyh4tpOPBOus4e1g6sgxVkwDwhbkYWiwvIrf4BUVJflnke/DEDCVp6/Eg==} + '@tiptap/extension-heading@2.11.0': + resolution: {integrity: sha512-vrYvxibsY7/Sd2wYQDZ8AfIORfFi/UHZAWI7JmaMtDkILuMLYQ+jXb7p4K2FFW/1nN7C8QqgLLFI5AfjZUusgw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-highlight@2.10.4': - resolution: {integrity: sha512-0E/eK+eKx7I7UotELKPFsL/jiWFVtAkyXvcs1+OzcCr8ao2M6t5hGKh0McBG4WUQdxttnIwfQemGzIHU25pDog==} + '@tiptap/extension-highlight@2.11.0': + resolution: {integrity: sha512-+szogL1ux8HMOuIn+TyB5PNhS0mdy4so5ejT2KAMtdZioPNS3Awj1FypimrXJV1kDjaN6LHRkF+w8/bV0qX4hA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-history@2.10.4': - resolution: {integrity: sha512-fg6BNxbpMMtgKaiNI/GLcCzkxIQMwSYBhO9LA0CxLvmsWGU+My4r9W3DK6HwNoRJ9+6OleDPSLo1P73fbSTtEA==} + '@tiptap/extension-history@2.11.0': + resolution: {integrity: sha512-eEUEDoOtS17AHVEPbGfZ+x2L5A87SiIsppWYTkpfIH/8EnVQmzu+3i1tcT9cWvHC31d9JTG7TDptVuuHr30TJw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-horizontal-rule@2.10.4': - resolution: {integrity: sha512-s9ycm/BOGoW3L0Epnj541vdngHbFbMM488HoODd1CmVSw1C+wBWFgsukgqKjlyE3VGfZXuSb1ur9zinW0RiLJQ==} + '@tiptap/extension-horizontal-rule@2.11.0': + resolution: {integrity: sha512-ZbkILwmcccmwQB2VTA/dzHRMB+xoJQ8UJdafcUiaAUlQfvDgl898+AYMa2GRTZkLPvzCKjXMC9hybSyy54Lz3Q==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-image@2.10.4': - resolution: {integrity: sha512-fPdAqP4M1zwz5jyrQNIEL4OvvGeJso45svaaBLV342yRLOpbVIgAp/RsuWSGDQTUWoGhdkHdIrbH2bUGNEbMBg==} + '@tiptap/extension-image@2.11.0': + resolution: {integrity: sha512-R+JkK5ocX35ag1c42aAw6rcb9QlLUBB0ju8A7b+8qZXN5yWKE0yO/oixYFmnZN7WSnBYtzuCVDX8cvRG+BPbgA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-italic@2.10.4': - resolution: {integrity: sha512-8MIQ+wsbyxNCZDCFTVTOXrS2AvFyOhtlBNgVU2+6r6xnJV4AcfEA3qclysqrjOlL117ped/nzDeoB0AeX0CI+Q==} + '@tiptap/extension-italic@2.11.0': + resolution: {integrity: sha512-T+jjS0gOsvNzQXVTSArmUp/kt2R9OikPQaV1DI60bfjO0rknOgtG0tbwZmfbugzwc07RbpxOYFy3vBxMLDsksA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-link@2.10.4': - resolution: {integrity: sha512-9lbtMUPc9IYCRMKV/B4k/no9J5OQQl/jJn9W2ce3NjJZSrOjuZs0CjJZgCESIaj6911s7nEJUvxKKmsbD3UC3Q==} + '@tiptap/extension-link@2.11.0': + resolution: {integrity: sha512-hvJSj0Ul4h8uxivtFtqaSy08s9G3smaW0He0ybYJ7rcJIsZ1zSrxQLGvIr/J8/yUq8VoVNspNR5cGUoyQaaw4A==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-list-item@2.10.4': - resolution: {integrity: sha512-8K3WUD5fPyw2poQKnJGGm7zlfeIbpld92+SRF4M9wkp95EzvgexTlodvxlrL3i8zKXcQQVyExWA8kCcGPFb9bA==} + '@tiptap/extension-list-item@2.11.0': + resolution: {integrity: sha512-Jikcg0fccpM13a3hAFLtguMcpVg4eMWI8NnC0aUULD9rFhvWZQYQYQuoK3fO6vQrAQpNhsV4oa0dfSq1btu9kg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-ordered-list@2.10.4': - resolution: {integrity: sha512-NaeEu+qFG2O0emc8WlwOM7DKNKOaqHWuNkuKrrmQzslgL+UQSEGlGMo6NEJ5sLLckPBDpIa0MuRm30407JE+cg==} + '@tiptap/extension-ordered-list@2.11.0': + resolution: {integrity: sha512-i6pNsDHA2QvBAebwjAuvhHKwz+bZVJ929PCIJaN8mxg0ldiAmFbAsf+rwIIFHWogMp+5xEX2RBzux20usNVZ9w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-paragraph@2.10.4': - resolution: {integrity: sha512-SRNVhT8OXqjpZtcyuOtofbtOpXXFrQrjqqCc/yXebda//2SfUTOvB16Lss77vQOWi6xr7TF1mZuowJgSTkcczw==} + '@tiptap/extension-paragraph@2.11.0': + resolution: {integrity: sha512-xLNC05An3SQq0bVHJtOTLa8As5r6NxDZFpK0NZqO2hTq/fAIRL/9VPeZ8E0tziXULwIvIPp+L0Taw3TvaUkRUg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-strike@2.10.4': - resolution: {integrity: sha512-OibipsomFpOJWTPVX/z4Z53HgwDA93lE/loHGa+ONJfML1dO6Zd6UTwzaVO1/g8WOwRgwkYu/6JnhxLKRlP8Lg==} + '@tiptap/extension-strike@2.11.0': + resolution: {integrity: sha512-71i2IZT58kY2ohlhyO+ucyAioNNCkNkuPkrVERc9lXhmcCKOff5y6ekDHQHO2jNjnejkVE5ibyDO3Z7RUXjh1A==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-table-cell@2.10.4': - resolution: {integrity: sha512-vYwRYt3xPaAU4hxoz3OMGPQzcAxaxEVri6VSRMWg4BN3x4DwWevBTAk59Ho9nkJpaRuXO6c5pIxcwWCZM0Aw0w==} + '@tiptap/extension-table-cell@2.11.0': + resolution: {integrity: sha512-05lXXaGPWzVi/mVYRzsiLbaZ1VVU42buCkoTZrduvJsGEu6K+Cut2fqo7I29CJmJ0P/hDSyMEJDKqdKSP9xalA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-table-header@2.10.4': - resolution: {integrity: sha512-NVi/KMBh9IAzpukjptCsH+gibZB3VxgCc+wuFk41QqI5ABnTPKWflnQ0wRo7IC6wC/tUi4YBahh20dL/wBJn3w==} + '@tiptap/extension-table-header@2.11.0': + resolution: {integrity: sha512-pOKz1E7VT9v37psA0lFJ0mcj2DAa/KNqNqO3TGOUnNOYaN+/6w01i6tA7rAinULsxaFTZx5x1BGLMqonc6n0fw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-table-row@2.10.4': - resolution: {integrity: sha512-kpQQSZQNYHhencIk+lzs+zWtgg6nUXHIVQKZUg5dVT0VP2JNO7wPM6d8HgnscvxOkJNRVF/Q5dYe0Cb4tROIKg==} + '@tiptap/extension-table-row@2.11.0': + resolution: {integrity: sha512-j+o5Lr1JynSWcd/NN+4mNELvcVwj6CxcNT3J37oc5uy0a6CBhHlmp1d9eEbEnk95tMEsibunVV73wRqE150nEw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-table@2.10.4': - resolution: {integrity: sha512-ak1RT8n0WQFNnVsZ9e6QFLWlRQP0IjT+Yp/PTsx5fSmqkiiwQKGs1ILCJWlBB3H0hV7N69aaOtK3h/35lmqoEg==} + '@tiptap/extension-table@2.11.0': + resolution: {integrity: sha512-RH9pw2L2eilFjQxEGaWdk7929rm4NLxCs/aXuFVY+zL3ZHzHovsMDM5SZiyk4pTnVpE2Bj8+NcDZ8r/zMcvYIA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-task-item@2.10.4': - resolution: {integrity: sha512-ucKGXdHdHCBanIJTB/nhmQ3iIL6BcSVKr7mN5BGEu6sSLYROflX7lmnMPVIRcTKJz+FGJeR6AqPFVagZAXVkGQ==} + '@tiptap/extension-task-item@2.11.0': + resolution: {integrity: sha512-qu6VuRc8qF80Bwr82CItFcrKtC67LJkwpxESLEIi42zWZ5sXF/3DJEPPS/4Kk+nAc9UCBoEMFAULibPq7rRl/w==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-task-list@2.10.4': - resolution: {integrity: sha512-21bFlHlvGr5hsXUEug9p+BWPLqdziFS/4mGG6nUnrSDI1e4eEC86WZczsG+If6FEpjcCS9Eb2RHgqaA4VoJEqg==} + '@tiptap/extension-task-list@2.11.0': + resolution: {integrity: sha512-+dZRjeXLXxyliFt3J7uQADxfOwi6ntyepVM+ri1rnmIaqVZUHJbUFodOc0LivI+Z5iZZ10u3TId8gehqWJHD+w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-align@2.10.4': - resolution: {integrity: sha512-rt2Hz3N081QAgkKKSMpyDZTKorBmXKpeHkYIw+ArVuvBYhi8x5wVyZgZ2SIMW9A5G4rx1M0czn7xNi+/P3NopQ==} + '@tiptap/extension-text-align@2.11.0': + resolution: {integrity: sha512-VRXBqO17po6ddqhoWLBa2aCX/tqHdzdKPLfjnBy1fF8hjQKbidzjMWhb4CMm31ApvJjKK/DTkM3EnyYS/XDhng==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-style@2.10.4': - resolution: {integrity: sha512-ibq7avkcwHyUSG53Hf+P31rrwsKVbbiqbWZM4kXC7M2X3iUwFrtvaa+SWzyWQfE1jl2cCrD1+rfSkj/alcOKGg==} + '@tiptap/extension-text-style@2.11.0': + resolution: {integrity: sha512-vuA16wMZ6J3fboL7FObwV2f5uN9Vg0WYmqU7971vxzJyaRj9VE1eeH8Kh5fq4RgwDzc13MZGvZZV4HcE1R8o8A==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text@2.10.4': - resolution: {integrity: sha512-wPdVxCHrIS9S+8n08lgyyqRZPj9FBbyLlFt74/lV5yBC3LOorq1VKdjrTskmaj4jud7ImXoKDyBddAYTHdJ1xw==} + '@tiptap/extension-text@2.11.0': + resolution: {integrity: sha512-LcyrP+7ZEVx3YaKzjMAeujq+4xRt4mZ3ITGph2CQ4vOKFaMI8bzSR909q18t7Qyyvek0a9VydEU1NHSaq4G5jw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-underline@2.10.4': - resolution: {integrity: sha512-KhlCndQFMe/Gsz+3qkVn9z1utDy8y1igvdePijMjA5B8PTu0hPs2Q1d6szfLTBdtoFNkCokknxzXhSY0OFJEyQ==} + '@tiptap/extension-underline@2.11.0': + resolution: {integrity: sha512-DE1piq441y1+9Aj1pvvuq1dcc5B2HZ2d1SPtO4DTMjCxrhok12biTkMxxq0q1dzA5/BouLlUW6WTPpinhmrUWA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/pm@2.10.4': - resolution: {integrity: sha512-pZ4NEkRtYoDLe0spARvXZ1N3hNv/5u6vfPdPtEbmNpoOSjSNqDC1kVM+qJY0iaCYpxbxcv7cxn3kBumcFLQpJQ==} + '@tiptap/pm@2.11.0': + resolution: {integrity: sha512-4RU6bpODkMY+ZshzdRFcuUc5jWlMW82LWXR6UOsHK/X/Mav41ZFS0Cyf+hQM6gxxTB09YFIICmGpEpULb+/CuA==} - '@tiptap/react@2.10.4': - resolution: {integrity: sha512-JTeqDB+xgjo46QC9ILRXe2TcSfxKVRwhZ3vDvYoemN7giRk5a/WsCF1VQIT1fax+tCl6kfv3U1f4Mkx0DkbPkA==} + '@tiptap/react@2.11.0': + resolution: {integrity: sha512-AALzHbqNq/gerJpkbXmN2OXFmHAs2bQENH7rXbnH70bpxVdIfQVtvjK4dIb+cQQvAuTWZvhsISnTrFY2BesT3Q==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@2.10.4': - resolution: {integrity: sha512-tu/WCs9Mkr5Nt8c3/uC4VvAbQlVX0OY7ygcqdzHGUeG9zP3twdW7o5xM3kyDKR2++sbVzqu5Ll5qNU+1JZvPGQ==} + '@tiptap/starter-kit@2.11.0': + resolution: {integrity: sha512-lrYmkeaAFiuUjN5nGnCowdjponrsR7eRmeTf/15/5oZsNrMN7t/fvPb014AqhG/anNasa0ism4CKZns3D+4pKQ==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@trpc/client@11.0.0-rc.666': - resolution: {integrity: sha512-BP3H0bktY03m7haVT5QoPR4sn30DNJcvFHsA3Msj3uPRY8JLVE03MR4rVG6T7VbcglORKpyMlRxjpUgdRmJErA==} + '@trpc/client@11.0.0-rc.682': + resolution: {integrity: sha512-zfM6t4tkbQPm/FHK85jcJjJle7FJTj9U8t/ieDzIe3X6DNo66sg6KqQpjkeTJcaj5u2hga1lmv3rc4uob/7D0g==} peerDependencies: - '@trpc/server': 11.0.0-rc.666+99556c074 - typescript: '>=5.6.2' + '@trpc/server': 11.0.0-rc.682+8650a22e8 + typescript: '>=5.7.2' - '@trpc/next@11.0.0-rc.666': - resolution: {integrity: sha512-EiNMEY0nValoxMSvC+j68evlQqU/NoLrZXskvHnheoyaDLP8TxhTA2xUr+P4tkWPkjsRzh/Y5lxlyAb2PTA7aw==} + '@trpc/next@11.0.0-rc.682': + resolution: {integrity: sha512-3LhlwyZiVEMTBKfpxSbD00Ea/uuW9vfTmlFpKRbuU22BBkcW/QNtfcHWL5QtyDHnr8/SIvReTJQ+BfDnqNUSLA==} peerDependencies: '@tanstack/react-query': ^5.59.15 - '@trpc/client': 11.0.0-rc.666+99556c074 - '@trpc/react-query': 11.0.0-rc.666+99556c074 - '@trpc/server': 11.0.0-rc.666+99556c074 + '@trpc/client': 11.0.0-rc.682+8650a22e8 + '@trpc/react-query': 11.0.0-rc.682+8650a22e8 + '@trpc/server': 11.0.0-rc.682+8650a22e8 next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' - typescript: '>=5.6.2' + typescript: '>=5.7.2' peerDependenciesMeta: '@tanstack/react-query': optional: true '@trpc/react-query': optional: true - '@trpc/react-query@11.0.0-rc.666': - resolution: {integrity: sha512-BH0vU7g5w4IrN7xmWSKvLucZ9ZnpRwsDWCSJ0R09xdYwR7geHkna3PBbd8vQVFBSw7MpWEy6LGXVSCHSbUicLg==} + '@trpc/react-query@11.0.0-rc.682': + resolution: {integrity: sha512-Ghuk7e7jGRvxOD32X/ImGZTqERZ3R03vaPVzfmdWnBeTyOeqBr0Tb8ylTVyCclqBHpTrRhdM3pWlaXR4M/LKDg==} peerDependencies: '@tanstack/react-query': ^5.62.8 - '@trpc/client': 11.0.0-rc.666+99556c074 - '@trpc/server': 11.0.0-rc.666+99556c074 + '@trpc/client': 11.0.0-rc.682+8650a22e8 + '@trpc/server': 11.0.0-rc.682+8650a22e8 react: '>=18.2.0' react-dom: '>=18.2.0' - typescript: '>=5.6.2' + typescript: '>=5.7.2' - '@trpc/server@11.0.0-rc.666': - resolution: {integrity: sha512-k+jKrdH/owDRRXPR7oPKCQRTu0dOEnqdGh56863ym95sFY8qXE7BhOR8S4WqyZw1CiPZGjRkdFN0q/GsJhKsIA==} + '@trpc/server@11.0.0-rc.682': + resolution: {integrity: sha512-y8FhLW/UJ8SOyHByvSQW7WvCnbvYioOYhviWD+sRvqkB9f0O8/sEBPJt1mBadWaO/0tygOghkeNC9o1wAsJ8cg==} peerDependencies: - typescript: '>=5.6.2' + typescript: '>=5.7.2' '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -4147,51 +4150,51 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.18.2': - resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==} + '@typescript-eslint/eslint-plugin@8.19.0': + resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.18.2': - resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==} + '@typescript-eslint/parser@8.19.0': + resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.18.2': - resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} + '@typescript-eslint/scope-manager@8.19.0': + resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.18.2': - resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==} + '@typescript-eslint/type-utils@8.19.0': + resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.18.2': - resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} + '@typescript-eslint/types@8.19.0': + resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.18.2': - resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==} + '@typescript-eslint/typescript-estree@8.19.0': + resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.18.2': - resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} + '@typescript-eslint/utils@8.19.0': + resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.18.2': - resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} + '@typescript-eslint/visitor-keys@8.19.0': + resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@umami/node@0.4.0': @@ -4906,8 +4909,8 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@9.1.1: - resolution: {integrity: sha512-6VX8lrBIycgZKTwBsWS+bLrmkGRkDmvtGsYylRN9b93CygN6CbK46HmnQ3rdSOR8HRjdahDrxb5MqD9cEFOg5Q==} + concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} engines: {node: '>=18'} hasBin: true @@ -6715,8 +6718,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - linkifyjs@4.1.3: - resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} + linkifyjs@4.2.0: + resolution: {integrity: sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==} load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} @@ -7333,8 +7336,8 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - octokit@4.0.2: - resolution: {integrity: sha512-wbqF4uc1YbcldtiBFfkSnquHtECEIpYD78YUXI6ri1Im5OO2NLo6ZVpRdbJpdnpZ05zMrVPssNiEo6JQtea+Qg==} + octokit@4.0.3: + resolution: {integrity: sha512-kfqH80Yuuux4fLbZ4SvObjCvVu89U0eCh5+fulh6tr/hJkDYS1inXDGnNJDOp312GANMEhWWMLYmjQR8MvSSMQ==} engines: {node: '>= 18'} ofetch@1.4.1: @@ -7365,8 +7368,8 @@ packages: resolution: {integrity: sha512-dtyTFKx2xVcO0W8JKaluXIHC9l/MLjHeflBaWjiWNMCHp/TBs9dEjQDbj/VFlHR4omFOKjjmqm1pW1aCAhmPBg==} engines: {node: '>=12.20.0'} - openapi3-ts@4.3.3: - resolution: {integrity: sha512-LKkzBGJcZ6wdvkKGMoSvpK+0cbN5Xc3XuYkJskO+vjEQWJgs1kgtyUk0pjf8KwPuysv323Er62F5P17XQl96Qg==} + openapi3-ts@4.4.0: + resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -8287,10 +8290,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} @@ -8792,8 +8791,8 @@ packages: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} - trpc-to-openapi@2.1.0: - resolution: {integrity: sha512-LODbI2a9LQamLpEz9hsqeMJBxpNT8KqfyICJhTVe8JBPZM8DvUkoICPlsdHf1KJVteoem/LlbwkD7loKYPWP1Q==} + trpc-to-openapi@2.1.1: + resolution: {integrity: sha512-61VvDOSLHk7+vZnjswvD4yPThvCo+4ymZ2NbOqYQPbkbr5qRyyfVPdBV5YaJCUcCsIzxxgjq46DELxKYXlM6uA==} peerDependencies: '@trpc/server': ^11.0.0-rc.648 zod: ^3.23.8 @@ -8963,8 +8962,8 @@ packages: types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - typescript-eslint@8.18.2: - resolution: {integrity: sha512-KuXezG6jHkvC3MvizeXgupZzaG5wjhU3yE8E7e6viOvAvD9xAWYp8/vy0WULTGe9DYDWcQu7aW03YIV3mSitrQ==} + typescript-eslint@8.19.0: + resolution: {integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -10439,12 +10438,12 @@ snapshots: dependencies: react: 19.0.0 - '@mantine/tiptap@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tiptap/extension-link@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4))(@tiptap/react@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/tiptap@7.15.2(@mantine/core@7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.15.2(react@19.0.0))(@tiptap/extension-link@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0))(@tiptap/react@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@mantine/core': 7.15.2(@mantine/hooks@7.15.2(react@19.0.0))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': 7.15.2(react@19.0.0) - '@tiptap/extension-link': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) - '@tiptap/react': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tiptap/extension-link': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + '@tiptap/react': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -11375,157 +11374,157 @@ snapshots: transitivePeerDependencies: - supports-color - '@tiptap/core@2.10.4(@tiptap/pm@2.10.4)': + '@tiptap/core@2.11.0(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/pm': 2.10.4 + '@tiptap/pm': 2.11.0 - '@tiptap/extension-blockquote@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-blockquote@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-bold@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-bold@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-bubble-menu@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-bubble-menu@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-bullet-list@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-code-block@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-code-block@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 - '@tiptap/extension-code@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-code@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-color@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/extension-text-style@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)))': + '@tiptap/extension-color@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/extension-text-style@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/extension-text-style': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/extension-text-style': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) - '@tiptap/extension-document@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-document@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-dropcursor@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-dropcursor@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 - '@tiptap/extension-floating-menu@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-floating-menu@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 tippy.js: 6.3.7 - '@tiptap/extension-gapcursor@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-gapcursor@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 - '@tiptap/extension-hard-break@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-hard-break@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-heading@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-heading@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-highlight@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-highlight@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-history@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-history@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 - '@tiptap/extension-horizontal-rule@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-horizontal-rule@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 - '@tiptap/extension-image@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-image@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-italic@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-italic@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-link@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-link@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 - linkifyjs: 4.1.3 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 + linkifyjs: 4.2.0 - '@tiptap/extension-list-item@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-list-item@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-ordered-list@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-ordered-list@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-paragraph@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-paragraph@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-strike@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-strike@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-table-cell@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-table-cell@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-table-header@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-table-header@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-table-row@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-table-row@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-table@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-table@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 - '@tiptap/extension-task-item@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + '@tiptap/extension-task-item@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 - '@tiptap/extension-task-list@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-task-list@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-text-align@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-text-align@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-text-style@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-text-style@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-text@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-text@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/extension-underline@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + '@tiptap/extension-underline@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) - '@tiptap/pm@2.10.4': + '@tiptap/pm@2.11.0': dependencies: prosemirror-changeset: 2.2.1 prosemirror-collab: 1.3.1 @@ -11546,71 +11545,71 @@ snapshots: prosemirror-transform: 1.10.2 prosemirror-view: 1.37.0 - '@tiptap/react@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@tiptap/react@2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/extension-bubble-menu': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) - '@tiptap/extension-floating-menu': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/extension-bubble-menu': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + '@tiptap/extension-floating-menu': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + '@tiptap/pm': 2.11.0 '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) use-sync-external-store: 1.2.2(react@19.0.0) - '@tiptap/starter-kit@2.10.4': + '@tiptap/starter-kit@2.11.0': dependencies: - '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) - '@tiptap/extension-blockquote': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-bold': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-bullet-list': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-code': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-code-block': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) - '@tiptap/extension-document': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-dropcursor': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) - '@tiptap/extension-gapcursor': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) - '@tiptap/extension-hard-break': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-heading': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-history': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) - '@tiptap/extension-horizontal-rule': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) - '@tiptap/extension-italic': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-list-item': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-ordered-list': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-paragraph': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-strike': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-text': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/extension-text-style': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) - '@tiptap/pm': 2.10.4 + '@tiptap/core': 2.11.0(@tiptap/pm@2.11.0) + '@tiptap/extension-blockquote': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-bold': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-bullet-list': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-code': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-code-block': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + '@tiptap/extension-document': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-dropcursor': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + '@tiptap/extension-gapcursor': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + '@tiptap/extension-hard-break': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-heading': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-history': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + '@tiptap/extension-horizontal-rule': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0))(@tiptap/pm@2.11.0) + '@tiptap/extension-italic': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-list-item': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-ordered-list': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-paragraph': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-strike': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-text': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/extension-text-style': 2.11.0(@tiptap/core@2.11.0(@tiptap/pm@2.11.0)) + '@tiptap/pm': 2.11.0 '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2)': + '@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2)': dependencies: - '@trpc/server': 11.0.0-rc.666(typescript@5.7.2) + '@trpc/server': 11.0.0-rc.682(typescript@5.7.2) typescript: 5.7.2 - '@trpc/next@11.0.0-rc.666(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.666(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(next@14.2.22(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@trpc/next@11.0.0-rc.682(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.682(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(next@14.2.22(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': dependencies: - '@trpc/client': 11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2) - '@trpc/server': 11.0.0-rc.666(typescript@5.7.2) + '@trpc/client': 11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2) + '@trpc/server': 11.0.0-rc.682(typescript@5.7.2) next: 14.2.22(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) typescript: 5.7.2 optionalDependencies: '@tanstack/react-query': 5.62.11(react@19.0.0) - '@trpc/react-query': 11.0.0-rc.666(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@trpc/react-query': 11.0.0-rc.682(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - '@trpc/react-query@11.0.0-rc.666(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@trpc/react-query@11.0.0-rc.682(@tanstack/react-query@5.62.11(react@19.0.0))(@trpc/client@11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': dependencies: '@tanstack/react-query': 5.62.11(react@19.0.0) - '@trpc/client': 11.0.0-rc.666(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(typescript@5.7.2) - '@trpc/server': 11.0.0-rc.666(typescript@5.7.2) + '@trpc/client': 11.0.0-rc.682(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(typescript@5.7.2) + '@trpc/server': 11.0.0-rc.682(typescript@5.7.2) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) typescript: 5.7.2 - '@trpc/server@11.0.0-rc.666(typescript@5.7.2)': + '@trpc/server@11.0.0-rc.682(typescript@5.7.2)': dependencies: typescript: 5.7.2 @@ -11884,14 +11883,14 @@ snapshots: dependencies: '@types/node': 22.10.2 - '@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.2(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.2 - '@typescript-eslint/type-utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.2 + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.19.0 eslint: 9.17.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -11901,27 +11900,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2)': dependencies: - '@typescript-eslint/scope-manager': 8.18.2 - '@typescript-eslint/types': 8.18.2 - '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.2 + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.19.0 debug: 4.4.0 eslint: 9.17.0 typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.18.2': + '@typescript-eslint/scope-manager@8.19.0': dependencies: - '@typescript-eslint/types': 8.18.2 - '@typescript-eslint/visitor-keys': 8.18.2 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/visitor-keys': 8.19.0 - '@typescript-eslint/type-utils@8.18.2(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) debug: 4.4.0 eslint: 9.17.0 ts-api-utils: 1.3.0(typescript@5.7.2) @@ -11929,12 +11928,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.18.2': {} + '@typescript-eslint/types@8.19.0': {} - '@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 8.18.2 - '@typescript-eslint/visitor-keys': 8.18.2 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/visitor-keys': 8.19.0 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -11945,20 +11944,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.2(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) - '@typescript-eslint/scope-manager': 8.18.2 - '@typescript-eslint/types': 8.18.2 - '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) eslint: 9.17.0 typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.18.2': + '@typescript-eslint/visitor-keys@8.19.0': dependencies: - '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/types': 8.19.0 eslint-visitor-keys: 4.2.0 '@umami/node@0.4.0': {} @@ -12808,7 +12807,7 @@ snapshots: concat-map@0.0.1: {} - concurrently@9.1.1: + concurrently@9.1.2: dependencies: chalk: 4.1.2 lodash: 4.17.21 @@ -13608,17 +13607,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.18.2(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) eslint: 9.17.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -13629,7 +13628,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.17.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -13641,7 +13640,7 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.18.2(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14419,7 +14418,7 @@ snapshots: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 internal-slot@1.1.0: dependencies: @@ -14898,7 +14897,7 @@ snapshots: dependencies: uc.micro: 2.1.0 - linkifyjs@4.1.3: {} + linkifyjs@4.2.0: {} load-json-file@4.0.0: dependencies: @@ -15436,7 +15435,7 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - octokit@4.0.2: + octokit@4.0.3: dependencies: '@octokit/app': 15.1.1 '@octokit/core': 6.1.2 @@ -15481,7 +15480,7 @@ snapshots: dependencies: apg-lite: 1.0.4 - openapi3-ts@4.3.3: + openapi3-ts@4.4.0: dependencies: yaml: 2.5.1 @@ -15963,7 +15962,7 @@ snapshots: qs@6.13.1: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 querystringify@2.2.0: {} @@ -16589,13 +16588,6 @@ snapshots: object-inspect: 1.13.3 side-channel-map: 1.0.1 - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 - side-channel@1.1.0: dependencies: es-errors: 1.3.0 @@ -17233,13 +17225,12 @@ snapshots: triple-beam@1.4.1: {} - trpc-to-openapi@2.1.0(@trpc/server@11.0.0-rc.666(typescript@5.7.2))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1): + trpc-to-openapi@2.1.1(@trpc/server@11.0.0-rc.682(typescript@5.7.2))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1): dependencies: - '@trpc/server': 11.0.0-rc.666(typescript@5.7.2) + '@trpc/server': 11.0.0-rc.682(typescript@5.7.2) co-body: 6.2.0 h3: 1.13.0 - lodash.clonedeep: 4.5.0 - openapi3-ts: 4.3.3 + openapi3-ts: 4.4.0 zod: 3.24.1 zod-openapi: 2.19.0(zod@3.24.1) optionalDependencies: @@ -17422,11 +17413,11 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.18.2(eslint@9.17.0)(typescript@5.7.2): + typescript-eslint@8.19.0(eslint@9.17.0)(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/parser': 8.18.2(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) eslint: 9.17.0 typescript: 5.7.2 transitivePeerDependencies: diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh index 59a5589df..54131a632 100644 --- a/scripts/entrypoint.sh +++ b/scripts/entrypoint.sh @@ -1,10 +1,25 @@ #!/bin/sh set -e -# Creating folders in volume -mkdir -p /appdata/db -mkdir -p /appdata/redis +export PUID=${PUID:-0} +export PGID=${PGID:-0} -chown -R nextjs:nodejs /appdata +echo "Starting with UID='$PUID', GID='$PGID'" -su-exec 1001:1001 "$@" \ No newline at end of file +if [ "${PUID}" != "0" ] || [ "${PGID}" != "0" ]; then + # The below command will change the owner of all files in the /app directory (except node_modules) to the new UID and GID + echo "Changing owner to $PUID:$PGID, this will take about 10 seconds..." + find . -name 'node_modules' -prune -o -mindepth 1 -maxdepth 1 -exec chown -R $PUID:$PGID {} + + chown -R $PUID:$PGID /var/cache/nginx + chown -R $PUID:$PGID /var/log/nginx + chown -R $PUID:$PGID /var/lib/nginx + chown -R $PUID:$PGID /run/nginx/nginx.pid + chown -R $PUID:$PGID /etc/nginx + echo "Changing owner to $PUID:$PGID, done." +fi + +if [ "${PUID}" != "0" ]; then + su-exec $PUID:$PGID "$@" +else + exec "$@" +fi diff --git a/scripts/generateRandomSecureKey.js b/scripts/generateRandomSecureKey.js deleted file mode 100644 index 4813ae6a5..000000000 --- a/scripts/generateRandomSecureKey.js +++ /dev/null @@ -1,7 +0,0 @@ -// This script generates a random secure key with a length of 64 characters -// This key is used to encrypt and decrypt the integration secrets for auth.js -// In production it is generated in run.sh and stored in the environment variables ENCRYPTION_KEY / AUTH_SECRET -// during runtime, it's also stored in a file. - -const crypto = require("crypto"); -console.log(crypto.randomBytes(32).toString("hex")); diff --git a/scripts/run.sh b/scripts/run.sh index 2ba89cdff..f3f92820c 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -1,3 +1,7 @@ +# Create sub directories in volume +mkdir -p /appdata/db +mkdir -p /appdata/redis + # Run migrations if [ $DB_MIGRATIONS_DISABLED = "true" ]; then echo "DB migrations are disabled, skipping" @@ -6,31 +10,8 @@ else node ./db/migrations/$DB_DIALECT/migrate.cjs ./db/migrations/$DB_DIALECT fi -# Generates an encryption key if it doesn't exist and saves it to /secrets/encryptionKey -# Also sets the ENCRYPTION_KEY environment variable -encryptionKey="" -if [ -r /secrets/encryptionKey ]; then - echo "Encryption key already exists" - encryptionKey=$(cat /secrets/encryptionKey) -else - echo "Generating encryption key" - encryptionKey=$(node ./generateRandomSecureKey.js) - echo $encryptionKey > /secrets/encryptionKey -fi -export ENCRYPTION_KEY=$encryptionKey - -# Generates an auth secret if it doesn't exist and saves it to /secrets/authSecret -# Also sets the AUTH_SECRET environment variable required for auth.js -authSecret="" -if [ -r /secrets/authSecret ]; then - echo "Auth secret already exists" - authSecret=$(cat /secrets/authSecret) -else - echo "Generating auth secret" - authSecret=$(node ./generateRandomSecureKey.js) - echo $authSecret > /secrets/authSecret -fi -export AUTH_SECRET=$authSecret +# Auth secret is generated every time the container starts as it is required, but not used because we don't need JWTs or Mail hashing +export AUTH_SECRET=$(openssl rand -base64 32) # Start nginx proxy # 1. Replace the HOSTNAME in the nginx template file diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index a293736b3..cc04a35c2 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -24,7 +24,7 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.3", "eslint-plugin-react-hooks": "^5.1.0", - "typescript-eslint": "^8.18.2" + "typescript-eslint": "^8.19.0" }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", diff --git a/turbo.json b/turbo.json index b7c00eb22..b3732c66e 100644 --- a/turbo.json +++ b/turbo.json @@ -23,7 +23,6 @@ "AUTH_OIDC_AUTO_LOGIN", "AUTH_LOGOUT_REDIRECT_URL", "AUTH_PROVIDERS", - "AUTH_SECRET", "AUTH_SESSION_EXPIRY_TIME", "CI", "DISABLE_REDIS_LOGS", @@ -38,6 +37,7 @@ "DOCKER_PORTS", "NODE_ENV", "PORT", + "SECRET_ENCRYPTION_KEY", "SKIP_ENV_VALIDATION" ], "ui": "stream",