Compare commits

...
Author SHA1 Message Date
Thomas 76ea2d3df6 Merge branch 'dev' into feat/widget-right-click-context-menu 2026-06-30 17:39:05 +02:00
Thomas Camlong 6c122c70e4 fix: use explicit React type imports instead of global namespace 2026-06-30 17:34:30 +02:00
ajnart aca0f56dfe style: auto-fix lint and format 2026-06-30 15:28:11 +00:00
Thomas Camlong 07ad643f4d fix(context-menu): persist widget option changes to server
Toggle switches and edit modal changes from the context menu now call
saveBoard mutation to persist to DB. Previously only the client cache
was updated, losing changes on reload. Removes unnecessary invalidation
that caused cascading refetch loops.
2026-06-30 17:26:52 +02:00
homarr-crowdin[bot] 8cac0b11c1 chore(lang): updated translations from crowdin (#6061) 2026-06-30 14:02:29 +02:00
homarr-renovate[bot] 5f011e8456 chore(deps): update turbo monorepo to ^2.10.0 (#6129)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-29 20:22:40 +00:00
homarr-renovate[bot] 9e1b529288 chore(deps): update dependency nanoid@>=4.0.0 <5.0.9 to >=5.1.16 (#6131)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-29 20:14:32 +00:00
homarr-renovate[bot] 4ad115dd2d chore(deps): update dependency posthog-js to ^1.393.4 (#6127)
* chore(deps): update dependency posthog-js to ^1.393.4

* style: auto-fix lint and format

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-29 20:01:36 +00:00
ajnart f5b4625c8e style: auto-fix lint and format 2026-06-29 19:10:48 +00:00
ajnart ae8ad9785e chore: revert unrelated sitemap change from auto-fix 2026-06-29 21:09:18 +02:00
27209a5dde chore: add integration CODEOWNERS (#6086)
Co-authored-by: Manuel <30572287+manuel-rw@users.noreply.github.com>
Co-authored-by: Afonso Jorge Ramos <afonsojorgeramos@gmail.com>
2026-06-29 18:56:44 +02:00
ajnart b72b70d2a3 style: auto-fix lint and format 2026-06-29 13:27:25 +00:00
ajnart 8d22df5123 fix(widgets): gate context menu behind authenticated session
- Only show right-click context menu for logged-in users
- Unauthenticated users see plain children without menu wrapper
- Matches existing BoardItemMenu session gating pattern
2026-06-29 15:26:09 +02:00
Thomas ed33748a49 Merge pull request #6118 from darbyjack/docs/warrior 2026-06-29 15:12:57 +02:00
ajnart 2f7bdbfe1c style: auto-fix lint and format 2026-06-29 13:12:33 +00:00
ajnart 1136b3a99b fix(widgets): address CodeRabbit review — badge in context menu target, edit-only pending gate
- Move title badge inside WidgetContextMenu wrapper so right-clicking the title overlay also triggers the context menu
- Remove full-menu hide during integration loading; only disable 'Edit' action while isPending
- Add isPending to allActions useMemo dependency array
2026-06-29 15:10:34 +02:00
ajnart bf26f17fcd style: auto-fix lint and format 2026-06-29 15:10:34 +02:00
ajnart 83b93e17da feat(widgets): add right-click context menu with auto-generated toggle actions
- Add WidgetContextMenu component using Mantine 9.3 Menu.ContextMenu
- Extend WidgetDefinition with contextActions API for widget-specific actions
- Auto-generate context menu toggle items for switch-type widget options
- Add 'Search' context action to media-requests widgets (list + stats)
- Keep existing dots-button menu for discoverability in edit mode
- Add widgetStateRef to WidgetComponentProps for client-side-only state
- Add skipContextMenu opt-out on switch option definitions
2026-06-29 15:10:34 +02:00
homarr-renovate[bot] 7a21e2a9c3 chore(deps): update dependency @playwright/test to ^1.61.1 (#6120)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 21:14:08 +00:00
darbyjack f66469d797 feat(docs): addd in documentation for archiveteam warrior 2026-06-28 15:45:52 -05:00
homarr-renovate[bot] c4a0c818d0 chore(deps): update mantine monorepo to ^9.4.0 (#6102)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 19:32:49 +00:00
homarr-renovate[bot] ef016061ae chore(deps): update pnpm to v11.9.0 (#6117)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 17:26:09 +00:00
homarr-renovate[bot] 3492700e6b chore(deps): update dependency vite to ^8.1.0 (#6114)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 14:06:36 +00:00
homarr-renovate[bot] 590d316671 chore(deps): update dependency vite@>=5.0.0 <=5.4.18 to >=8.1.0 (#6115)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 14:03:05 +00:00
homarr-renovate[bot] 6e9d20e651 chore(deps): update dependency recharts to ^3.9.0 (#6113)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 14:00:52 +00:00
homarr-renovate[bot] ed829fddfa chore(deps): update dependency posthog-js to ^1.393.0 (#6112)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 13:57:57 +00:00
homarr-renovate[bot] ed8b8a40eb chore(deps): update dependency @vitejs/plugin-react to ^6.0.3 (#6110)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 11:18:49 +00:00
homarr-renovate[bot] 7bc3bbb8c0 chore(deps): update dependency @gfazioli/mantine-onboarding-tour to ^4.0.6 (#6109)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 09:03:24 +00:00
homarr-renovate[bot] 74943ef9bc chore(deps): update dependency hono@<4.6.5 to >=4.12.27 (#6108)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 05:28:04 +00:00
homarr-renovate[bot] 5dd7f839ee chore(deps): update dependency axios@>=1.0.0 <1.8.2 to >=1.18.1 (#6104)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 00:16:33 +00:00
homarr-renovate[bot] d8c6c0f978 chore(deps): update dependency posthog-js to ^1.391.4 (#6094)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 00:16:09 +00:00
homarr-renovate[bot] 75b2d1bd1b chore(deps): update dependency oxlint to ^1.71.0 (#6101)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 00:15:23 +00:00
homarr-renovate[bot] 7c12a9ce48 chore(deps): update dependency @scalar/api-reference-react to ^0.9.48 (#6103)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-28 00:13:44 +00:00
homarr-renovate[bot] 9033acc66c chore(deps): update dependency oxfmt to ^0.56.0 (#6100)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-06-27 22:17:27 +00:00
Thomas a42dc34d34 Revert "feat(config): enable pnpm global virtual store for worktree support" (#6106) 2026-06-27 23:37:36 +02:00
euduardo db3d58821e feat(widgets): show calendar events on hover with pin on click (#2637) (#6081)
feat(widgets): show calendar events on hover with pin on click (#2637)

docs(widgets): update calendar interactions section for hover behavior
2026-06-27 22:49:26 +02:00
Bergasha 076526293d feat(docker-widget): add per-column visibility toggle (#6093)
* Add 'Columns to show' label in Docker stats

* feat: Add column translation keys for Docker widget

* feat: Enhance table with column visibility state

Added column visibility state management for the table.

* Add 'noColumns' error message to en.json
2026-06-27 22:44:39 +02:00
Thomasandajnart 2443f1cd3f fix: dns-hole widgets showing stale disconnected state (#6096)
Co-authored-by: ajnart <ajnart@users.noreply.github.com>
2026-06-27 22:37:34 +02:00
Thomas 3864727502 feat(config): enable pnpm global virtual store for worktree support (#6098) 2026-06-27 13:23:01 +02:00
homarr-releases[bot] f3608b26a0 chore: update bug report template (#6091)
Co-authored-by: Releases Homarr <175486441+homarr-releases[bot]@users.noreply.github.com>
2026-06-26 18:43:53 +00:00
Thomas 73bed51df8 fix(widgets): make downloads widget table background transparent (#6025)
The MantineReactTable defaults table cell backgrounds to
var(--mantine-color-body) which is opaque. This makes the
downloads widget table block appear solid while the footer
and other widgets correctly show the board's background.

Added a styles.css targeting table elements to force
background-color: transparent, following the same pattern
used by the beszel-system-table widget. Also added
bg=transparent to mantinePaperProps for the Paper wrapper.
2026-06-26 20:27:25 +02:00
62 changed files with 4019 additions and 1985 deletions

No files matched your search

+1
View File
@@ -33,6 +33,7 @@ body:
options:
# The below comment is used to insert a new version with on-release.yml
#NEXT_VERSION#
- 1.68.0
- 1.67.0
- 1.66.1
- 1.66.0
+185 -4
View File
@@ -1,12 +1,193 @@
# ── CODEOWNERS ───────────────────────────────────────
* @homarr-labs/maintainers
# Specific features / integrations
# Glueten
apps/docs/docs/integrations/glueten @Lok3sh-kumar
# Specific features / integrations
# These owners come from the PR that introduced each integration implementation.
# Specific rules override the global fallback because CODEOWNERS uses the last
# matching pattern; do not include @homarr-labs/maintainers here unless they
# should also be requested for that integration.
# AdGuard Home - introduced in https://github.com/homarr-labs/homarr/pull/929 by @hillaliy
apps/docs/docs/integrations/adguard-home @hillaliy
packages/integrations/src/adguard-home @hillaliy
# Anchor - introduced in https://github.com/homarr-labs/homarr/pull/5040 by @ohmzi
apps/docs/docs/integrations/anchor @ohmzi
packages/integrations/src/anchor @ohmzi
# ArchiveTeam Warrior - introduced in https://github.com/homarr-labs/homarr/pull/5784 by @darbyjack
apps/docs/docs/integrations/archive-team-warrior @darbyjack
packages/integrations/src/archive-team-warrior @darbyjack
# Audiobookshelf - introduced in https://github.com/homarr-labs/homarr/pull/5910 by @ajnart
apps/docs/docs/integrations/audiobookshelf @ajnart
packages/integrations/src/audiobookshelf @ajnart
# Beszel - introduced in https://github.com/homarr-labs/homarr/pull/5900 by @ajnart
apps/docs/docs/integrations/beszel @ajnart
packages/integrations/src/beszel @ajnart
# Codeberg - introduced in https://github.com/homarr-labs/homarr/pull/3253 by @Aandree5
apps/docs/docs/integrations/codeberg @Aandree5
packages/integrations/src/codeberg @Aandree5
# Coolify - introduced in https://github.com/homarr-labs/homarr/pull/4789 by @Rhiz3K
apps/docs/docs/integrations/coolify @Rhiz3K
packages/integrations/src/coolify @Rhiz3K
# Dash. - introduced in https://github.com/homarr-labs/homarr/pull/1541 by @manuel-rw
apps/docs/docs/integrations/dash-dot @manuel-rw
packages/integrations/src/dashdot @manuel-rw
# Docker Hub - introduced in https://github.com/homarr-labs/homarr/pull/3253 by @Aandree5
apps/docs/docs/integrations/docker-hub @Aandree5
packages/integrations/src/docker-hub @Aandree5
# Emby - introduced in https://github.com/homarr-labs/homarr/pull/2466 by @Meierschlumpf
apps/docs/docs/integrations/emby @Meierschlumpf
packages/integrations/src/emby @Meierschlumpf
# GitHub - introduced in https://github.com/homarr-labs/homarr/pull/3253 by @Aandree5
apps/docs/docs/integrations/github @Aandree5
packages/integrations/src/github @Aandree5
# GitHub Container Registry - introduced in https://github.com/homarr-labs/homarr/pull/3727 by @Aandree5
apps/docs/docs/integrations/github-containerregistry @Aandree5
packages/integrations/src/github-container-registry @Aandree5
# GitLab - introduced in https://github.com/homarr-labs/homarr/pull/3253 by @Aandree5
apps/docs/docs/integrations/gitlab @Aandree5
packages/integrations/src/gitlab @Aandree5
# Glances - introduced in https://github.com/homarr-labs/homarr/pull/5102 by @manuel-rw
apps/docs/docs/integrations/glances @manuel-rw
packages/integrations/src/glances @manuel-rw
# Gluetun - introduced in https://github.com/homarr-labs/homarr/pull/5812 by @Lok3sh-kumar
apps/docs/docs/integrations/gluetun @Lok3sh-kumar
packages/integrations/src/gluetun @Lok3sh-kumar
# Exempt Renovate‑managed files (no owners)
# Gotify - introduced in https://github.com/homarr-labs/homarr/pull/5847 by @Nerdy-Technician
apps/docs/docs/integrations/gotify @Nerdy-Technician
packages/integrations/src/gotify @Nerdy-Technician
# Home Assistant - introduced in https://github.com/homarr-labs/homarr/pull/578 by @manuel-rw
apps/docs/docs/integrations/home-assistant @manuel-rw
packages/integrations/src/homeassistant @manuel-rw
# ICal - introduced in https://github.com/homarr-labs/homarr/pull/3980 by @NicolasNewman
apps/docs/docs/integrations/ical @NicolasNewman
packages/integrations/src/ical @NicolasNewman
# Immich - introduced in https://github.com/homarr-labs/homarr/pull/5165 by @manuel-rw
apps/docs/docs/integrations/immich @manuel-rw
packages/integrations/src/immich @manuel-rw
# Jellyfin - introduced in https://github.com/homarr-labs/homarr/pull/672 by @manuel-rw
apps/docs/docs/integrations/jellyfin @manuel-rw
packages/integrations/src/jellyfin @manuel-rw
# Jellyseerr - introduced in https://github.com/homarr-labs/homarr/pull/774 by @manuel-rw
apps/docs/docs/integrations/jellyseerr @manuel-rw
packages/integrations/src/jellyseerr @manuel-rw
# LinuxServer.io - introduced in https://github.com/homarr-labs/homarr/pull/3607 by @Aandree5
apps/docs/docs/integrations/linux-server-io @Aandree5
packages/integrations/src/linuxserverio @Aandree5
# Navidrome - introduced in https://github.com/homarr-labs/homarr/pull/5910 by @ajnart
apps/docs/docs/integrations/navidrome @ajnart
packages/integrations/src/navidrome @ajnart
# Nextcloud - introduced in https://github.com/homarr-labs/homarr/pull/2501 by @manuel-rw
apps/docs/docs/integrations/nextcloud @manuel-rw
packages/integrations/src/nextcloud @manuel-rw
# npm - introduced in https://github.com/homarr-labs/homarr/pull/3253 by @Aandree5
apps/docs/docs/integrations/npm @Aandree5
packages/integrations/src/npm @Aandree5
# ntfy - introduced in https://github.com/homarr-labs/homarr/pull/2900 by @itzTheMeow
apps/docs/docs/integrations/ntfy @ajnart @manuel-rw
packages/integrations/src/ntfy @ajnart @manuel-rw
# OpenMediaVault - introduced in https://github.com/homarr-labs/homarr/pull/1142 by @hillaliy
apps/docs/docs/integrations/open-media-vault @hillaliy
packages/integrations/src/openmediavault @hillaliy
# OPNsense - introduced in https://github.com/homarr-labs/homarr/pull/3424 by @Oupsman
apps/docs/docs/integrations/opnsense @Oupsman
packages/integrations/src/opnsense @Oupsman
# Overseerr - introduced in https://github.com/homarr-labs/homarr/pull/774 by @manuel-rw
apps/docs/docs/integrations/overseerr @manuel-rw
packages/integrations/src/overseerr @manuel-rw
# Paperless-ngx - introduced in https://github.com/homarr-labs/homarr/pull/5910 by @ajnart
apps/docs/docs/integrations/paperless-ngx @ajnart
packages/integrations/src/paperless-ngx @ajnart
# PeaNUT - introduced in https://github.com/homarr-labs/homarr/pull/5862 by @afonsojramos
apps/docs/docs/integrations/peanut @afonsojramos
packages/integrations/src/peanut @afonsojramos
# Pi-hole - introduced in https://github.com/homarr-labs/homarr/pull/521 by @Meierschlumpf
apps/docs/docs/integrations/pi-hole @Meierschlumpf
packages/integrations/src/pi-hole @Meierschlumpf
# Plex - introduced in https://github.com/homarr-labs/homarr/pull/1342 by @hillaliy
apps/docs/docs/integrations/plex @hillaliy
packages/integrations/src/plex @hillaliy
# Prowlarr - introduced in https://github.com/homarr-labs/homarr/pull/965 by @hillaliy
apps/docs/docs/integrations/prowlarr @hillaliy
packages/integrations/src/prowlarr @hillaliy
# Proxmox - introduced in https://github.com/homarr-labs/homarr/pull/1969 by @Meierschlumpf
apps/docs/docs/integrations/proxmox @Meierschlumpf
packages/integrations/src/proxmox @Meierschlumpf
# Quay - introduced in https://github.com/homarr-labs/homarr/pull/3607 by @Aandree5
apps/docs/docs/integrations/quay @Aandree5
packages/integrations/src/quay @Aandree5
# search.ch - introduced in https://github.com/homarr-labs/homarr/pull/5180 by @Meierschlumpf
apps/docs/docs/integrations/search-ch @Meierschlumpf
packages/integrations/src/search-ch @Meierschlumpf
# Speedtest Tracker - introduced in https://github.com/homarr-labs/homarr/pull/5363 by @kylegrieder
apps/docs/docs/integrations/speedtest-tracker @kylegrieder
packages/integrations/src/speedtest-tracker @kylegrieder
# Technitium DNS - introduced in https://github.com/homarr-labs/homarr/pull/5832 by @lopsch
apps/docs/docs/integrations/technitium-dns @lopsch
packages/integrations/src/technitium @lopsch
# Tracearr - introduced in https://github.com/homarr-labs/homarr/pull/5060 by @StrandedTurtle
apps/docs/docs/integrations/tracearr @StrandedTurtle
packages/integrations/src/tracearr @StrandedTurtle
# TrueNAS - introduced in https://github.com/homarr-labs/homarr/pull/3745 by @manuel-rw
apps/docs/docs/integrations/truenas @manuel-rw @afonsojramos
packages/integrations/src/truenas @manuel-rw @afonsojramos
# Umami - introduced in https://github.com/homarr-labs/homarr/pull/5362 by @febrile42
apps/docs/docs/integrations/umami @febrile42
packages/integrations/src/umami @febrile42
# UniFi Controller - introduced in https://github.com/homarr-labs/homarr/pull/2236 by @pitschi
apps/docs/docs/integrations/unifi-controller @pitschi
packages/integrations/src/unifi-controller @pitschi
# Unraid - introduced in https://github.com/homarr-labs/homarr/pull/4439 by @manuel-rw
apps/docs/docs/integrations/unraid @manuel-rw
packages/integrations/src/unraid @manuel-rw
# Uptime Kuma - introduced in https://github.com/homarr-labs/homarr/pull/5910 by @ajnart
apps/docs/docs/integrations/uptime-kuma @ajnart
packages/integrations/src/uptime-kuma @ajnart
# Exempt Renovate-managed files (no owners)
package.json
**/package.json
package-lock.json
@@ -0,0 +1,35 @@
---
title: "ArchiveTeam Warrior"
description: "ArchiveTeam Warrior is an easy-to-run virtual machine that helps preserve websites by using some of your bandwidth and disk space to download and upload content to ArchiveTeam’s archive."
hide_title: true
---
import { IntegrationHeader } from "@site/src/components/integrations/header";
import { AddingIntegration } from "@site/src/components/integrations/adding";
import { IntegrationSecrets } from "@site/src/components/integrations/secrets";
import { archiveTeamWarriorIntegration } from ".";
<IntegrationHeader integration={archiveTeamWarriorIntegration} categories={["archiving"]} />
The ArchiveTeam Warrior integration lets Homarr connect to your ArchiveTeam Warrior instance so you can manage and monitor your archiving tasks directly from your dashboard.
### Adding the integration
<AddingIntegration />
### Secrets
ArchiveTeam Warrior does not require authentication by default. If your instance is protected with basic authentication, you can provide a username and password.
<IntegrationSecrets
secrets={[
{
credentials: [],
steps: [],
},
{
credentials: ["username", "password"],
steps: [],
},
]}
/>
@@ -0,0 +1,9 @@
import { IntegrationDefinition } from "@site/src/types";
export const archiveTeamWarriorIntegration: IntegrationDefinition = {
name: "ArchiveTeam Warrior",
description:
"ArchiveTeam Warrior is an easy-to-run virtual machine that helps preserve websites by using some of your bandwidth and disk space to download and upload content to ArchiveTeam’s archive.",
iconUrl: "https://cdn.jsdelivr.net/gh/selfhst/icons/png/archiveteam-warrior.png",
path: "../../integrations/archiveteam-warrior",
};
+3 -1
View File
@@ -63,7 +63,9 @@ import withoutIntegrations from './img/without-integrations.png';
### Interactions
- View calendar events by clicking on the marked dates.
- Hover over a marked date to preview its events in a popover.
- Click on a marked date to pin the popover open (it will stay visible even after moving the mouse away).
- Click the date again or click outside to close the pinned popover.
### Adding the widget
@@ -1,3 +1,5 @@
import type { MutableRefObject } from "react";
import { useRef } from "react";
import { Badge, Card } from "@mantine/core";
import { useElementSize } from "@mantine/hooks";
import { QueryErrorResetBoundary } from "@tanstack/react-query";
@@ -16,6 +18,7 @@ import classes from "../sections/item.module.css";
import { useItemActions } from "./item-actions";
import itemContentClasses from "./item-content.module.css";
import { BoardItemMenu } from "./item-menu";
import { WidgetContextMenu } from "./widget-context-menu";
interface BoardItemContentProps {
item: SectionItem;
@@ -30,30 +33,33 @@ const getOverflowFromKind = (kind: SectionItem["kind"]) => {
export const BoardItemContent = ({ item }: BoardItemContentProps) => {
const { ref, width, height } = useElementSize<HTMLDivElement>();
const board = useRequiredBoard();
const widgetStateRef = useRef<Record<string, unknown> | null>(null);
return (
<>
<Card
ref={ref}
className={combineClasses(
classes.itemCard,
`${item.kind}-wrapper`,
"grid-stack-item-content",
item.advancedOptions.customCssClasses.join(" "),
)}
radius={board.itemRadius}
styles={{
root: {
"--opacity": board.opacity / 100,
containerType: "size",
overflow: getOverflowFromKind(item.kind),
"--border-color": item.advancedOptions.borderColor !== "" ? item.advancedOptions.borderColor : undefined,
},
}}
p={0}
>
<InnerContent item={item} width={width} height={height} />
</Card>
<WidgetContextMenu item={item} widgetStateRef={widgetStateRef}>
<Card
ref={ref}
className={combineClasses(
classes.itemCard,
`${item.kind}-wrapper`,
"grid-stack-item-content",
item.advancedOptions.customCssClasses.join(" "),
)}
radius={board.itemRadius}
styles={{
root: {
"--opacity": board.opacity / 100,
containerType: "size",
overflow: getOverflowFromKind(item.kind),
"--border-color": item.advancedOptions.borderColor !== "" ? item.advancedOptions.borderColor : undefined,
},
}}
p={0}
>
<InnerContent item={item} width={width} height={height} widgetStateRef={widgetStateRef} />
</Card>
</WidgetContextMenu>
{item.advancedOptions.title?.trim() && (
<Badge
pos="absolute"
@@ -83,6 +89,7 @@ interface InnerContentProps {
item: SectionItem;
width: number;
height: number;
widgetStateRef: MutableRefObject<Record<string, unknown> | null>;
}
const InnerContent = ({ item, ...dimensions }: InnerContentProps) => {
@@ -0,0 +1,250 @@
"use client";
import type { MutableRefObject, ReactNode } from "react";
import { useCallback, useMemo } from "react";
import { Group, Menu, Switch } from "@mantine/core";
import { IconCopy, IconLayoutKanban, IconSettings, IconTrash } from "@tabler/icons-react";
import { clientApi } from "@homarr/api/client";
import { useSession } from "@homarr/auth/client";
import { useRequiredBoard } from "@homarr/boards/context";
import { useEditMode } from "@homarr/boards/edit-mode";
import { useConfirmModal, useModalAction } from "@homarr/modals";
import { useSettings } from "@homarr/settings";
import { translateIfNecessary } from "@homarr/translation";
import { useI18n, useScopedI18n } from "@homarr/translation/client";
import type { WidgetContextMenuAction } from "@homarr/widgets";
import { reduceWidgetOptionsWithDefaultValues, widgetImports } from "@homarr/widgets";
import { WidgetEditModal } from "@homarr/widgets/modals";
import type { SectionItem } from "~/app/[locale]/boards/_types";
import { useSectionContext } from "../sections/section-context";
import { useItemActions } from "./item-actions";
import { ItemMoveModal } from "./item-move-modal";
interface WidgetContextMenuProps {
item: SectionItem;
widgetStateRef: MutableRefObject<Record<string, unknown> | null>;
children: ReactNode;
}
export const WidgetContextMenu = ({ item, widgetStateRef, children }: WidgetContextMenuProps) => {
const { data: session } = useSession();
const [isEditMode] = useEditMode();
const board = useRequiredBoard();
const tItem = useScopedI18n("item");
const tMenu = useScopedI18n("item.menu.label");
const t = useI18n();
const settings = useSettings();
const { openModal } = useModalAction(WidgetEditModal);
const { openModal: openMoveModal } = useModalAction(ItemMoveModal);
const { openConfirmModal } = useConfirmModal();
const { updateItemOptions, updateItemAdvancedOptions, updateItemIntegrations, duplicateItem, removeItem } =
useItemActions();
const { data: integrationData, isPending } = clientApi.integration.all.useQuery();
const { mutate: saveBoard } = clientApi.board.saveBoard.useMutation();
const currentDefinition = useMemo(() => widgetImports[item.kind].definition, [item.kind]);
const { gridstack } = useSectionContext().refs;
const options = useMemo(
() => reduceWidgetOptionsWithDefaultValues(item.kind, settings, item.options) as Record<string, unknown>,
[item.kind, settings, item.options],
);
type OptionDef = { type: string; skipContextMenu?: boolean };
const toggleOptions = useMemo(() => {
const rawOptions = currentDefinition.createOptions(settings) as unknown as Record<string, OptionDef>;
return Object.entries(rawOptions).filter(([, def]) => def.type === "switch" && !def.skipContextMenu);
}, [currentDefinition, settings]);
const widgetContextActions = useMemo(() => {
const def = currentDefinition as Record<string, unknown>;
if (typeof def.contextActions !== "function") return [];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const actions = (def.contextActions as any)({
options,
setOptions: (partial: Record<string, unknown>) => {
updateItemOptions({ itemId: item.id, newOptions: { ...options, ...partial } });
},
integrationIds: item.integrationIds,
context: { isEditMode, boardId: board.id, itemId: item.id },
widgetStateRef,
});
return (Array.isArray(actions) ? actions : []) as WidgetContextMenuAction[];
}, [currentDefinition, options, item, updateItemOptions, isEditMode, board.id, widgetStateRef]);
const persistBoard = useCallback(
(updatedItems: typeof board.items) => {
saveBoard({ ...board, items: updatedItems });
},
[board, saveBoard],
);
const openEditModal = useCallback(() => {
openModal(
{
kind: item.kind,
value: {
advancedOptions: item.advancedOptions,
options: item.options,
integrationIds: item.integrationIds,
},
onSuccessfulEdit: (editResult) => {
updateItemOptions({ itemId: item.id, newOptions: editResult.options });
updateItemAdvancedOptions({ itemId: item.id, newAdvancedOptions: editResult.advancedOptions });
updateItemIntegrations({ itemId: item.id, newIntegrations: editResult.integrationIds });
if (!isEditMode) {
persistBoard(
board.items.map((boardItem) =>
boardItem.id !== item.id
? boardItem
: {
...boardItem,
options: editResult.options,
advancedOptions: editResult.advancedOptions,
integrationIds: editResult.integrationIds,
},
),
);
}
},
integrationData: (integrationData ?? []).filter(
(integration) =>
"supportedIntegrations" in currentDefinition &&
(currentDefinition.supportedIntegrations as string[]).some((kind) => kind === integration.kind),
),
integrationSupport: "supportedIntegrations" in currentDefinition,
settings,
appId: item.kind === "app" ? (item.options.appId as string | undefined) : undefined,
},
// eslint-disable-next-line @typescript-eslint/no-explicit-any
{ title: (fn: any) => `${fn("item.edit.title")} - ${fn(`widget.${item.kind}.name`)}` },
);
}, [
openModal,
item,
updateItemOptions,
updateItemAdvancedOptions,
updateItemIntegrations,
integrationData,
currentDefinition,
settings,
isEditMode,
persistBoard,
board,
]);
const handleToggle = useCallback(
(key: string) => (checked: boolean) => {
const newOptions = { ...options, [key]: checked };
updateItemOptions({ itemId: item.id, newOptions });
persistBoard(
board.items.map((boardItem) => (boardItem.id !== item.id ? boardItem : { ...boardItem, options: newOptions })),
);
},
[options, item.id, updateItemOptions, persistBoard, board],
);
if (!session) return <>{children}</>;
const visibleWidgetActions = widgetContextActions.filter((a) => !a.hidden);
return (
<Menu shadow="md" width={300} closeOnItemClick={false} position="right-start" offset={4}>
<Menu.ContextMenu>{children}</Menu.ContextMenu>
<Menu.Dropdown>
{toggleOptions.length > 0 && (
<>
<Menu.Label>{tMenu("options")}</Menu.Label>
{toggleOptions.map(([key]) => (
<Menu.Item key={key} onClick={() => handleToggle(key)(!options[key])}>
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
<Group wrap="nowrap">
{String(translateIfNecessary(t, ((fn: any) => fn(`widget.${item.kind}.option.${key}.label`)) as any))}
<Switch size="xs" checked={Boolean(options[key])} readOnly tabIndex={-1} ml="auto" />
</Group>
</Menu.Item>
))}
</>
)}
{visibleWidgetActions.length > 0 && (
<>
{toggleOptions.length > 0 && <Menu.Divider />}
<Menu.Label>{tMenu("actions")}</Menu.Label>
{visibleWidgetActions.map((action) => {
const Icon = action.icon;
return (
<Menu.Item
key={action.key}
closeMenuOnClick
leftSection={Icon ? <Icon size={16} /> : undefined}
onClick={action.onClick}
disabled={action.disabled}
color={action.color}
>
{String(translateIfNecessary(t, action.label))}
</Menu.Item>
);
})}
</>
)}
{isEditMode && (
<>
{(toggleOptions.length > 0 || visibleWidgetActions.length > 0) && <Menu.Divider />}
<Menu.Item
closeMenuOnClick
leftSection={<IconLayoutKanban size={16} />}
onClick={() => {
if (!gridstack.current) return;
openMoveModal({ item, columnCount: gridstack.current.getColumn(), gridStack: gridstack.current });
}}
>
{tItem("action.moveResize")}
</Menu.Item>
<Menu.Item
closeMenuOnClick
leftSection={<IconCopy size={16} />}
onClick={() => duplicateItem({ itemId: item.id })}
>
{tItem("action.duplicate")}
</Menu.Item>
</>
)}
<>
{!isEditMode && (toggleOptions.length > 0 || visibleWidgetActions.length > 0) && <Menu.Divider />}
<Menu.Item
closeMenuOnClick
leftSection={<IconSettings size={16} />}
onClick={openEditModal}
disabled={isPending}
>
{tMenu("settings")}
</Menu.Item>
</>
{isEditMode && (
<>
<Menu.Divider />
<Menu.Item
closeMenuOnClick
color="red"
leftSection={<IconTrash size={16} />}
onClick={() => {
openConfirmModal({
title: tItem("remove.title"),
children: tItem("remove.message"),
onConfirm: () => removeItem({ itemId: item.id }),
});
}}
>
{tItem("action.remove")}
</Menu.Item>
</>
)}
</Menu.Dropdown>
</Menu>
);
};
+2 -2
View File
@@ -6,7 +6,7 @@
},
"engines": {
"node": ">=24.17.0",
"pnpm": ">=11.8.0"
"pnpm": ">=11.9.0"
},
"packageManager": "pnpm@11.8.0"
"packageManager": "pnpm@11.9.0"
}
+2 -2
View File
@@ -62,9 +62,9 @@
},
"engines": {
"node": ">=24.17.0",
"pnpm": ">=11.8.0"
"pnpm": ">=11.9.0"
},
"packageManager": "pnpm@11.8.0",
"packageManager": "pnpm@11.9.0",
"dependencies": {
"jsonpath-plus": "catalog:"
}
@@ -165,6 +165,7 @@ export type HomarrDocumentationPath =
| "/docs/getting-started/installation/unraid"
| "/docs/integrations/adguard-home"
| "/docs/integrations/anchor"
| "/docs/integrations/archiveteam-warrior"
| "/docs/integrations/aria2"
| "/docs/integrations/audiobookshelf"
| "/docs/integrations/beszel"
+1 -1
View File
@@ -502,7 +502,7 @@ export const integrationDefs = {
iconUrl: "https://cdn.jsdelivr.net/gh/selfhst/icons/png/archiveteam-warrior.png",
category: ["archiving"],
defaultUrl: "http://localhost:8001",
documentationUrl: null,
documentationUrl: createDocumentationLink("/docs/integrations/archiveteam-warrior"),
},
// This integration only returns mock data, it is used during development (but can also be used in production by directly going to the create page)
mock: {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "",
"management": "",
"docker": "",
"preferences": "",
"logout": "",
"login": "",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "这里",
"iconPicker": {
"label": "图标 URL",
"header": "输入名称或对象来筛选图标… Homarr 将为您搜索 {countIcons} 图标。"
"header": "输入名称或对象来筛选图标… Homarr 将为您搜索 {countIcons} 图标。",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "切换到暗黑模式",
"switchToLightMode": "切换到日间模式",
"management": "管理中心",
"docker": "",
"preferences": "偏好设置",
"logout": "退出登录",
"login": "登录",
@@ -2352,6 +2357,9 @@
"name": "Docker 状态",
"description": "您的容器状态 (这个小部件只能用管理员权限添加)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "启用项目排序"
},
@@ -2405,6 +2413,12 @@
"title": "实例"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "未找到",
"text": "找不到请求的资源"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "首页",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": "Umami 活跃访客"
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "获取 Docker 容器失败"
"internalServerError": "获取 Docker 容器失败",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "crwdns4473:0crwdne4473:0",
"speedtest": "crwdns4475:0crwdne4475:0",
"analytics": "crwdns4477:0crwdne4477:0",
"vpn": "crwdns5687:0crwdne5687:0",
"mediaLibrary": "crwdns4979:0crwdne4979:0",
"uptimeMonitoring": "crwdns4981:0crwdne4981:0"
},
@@ -1412,7 +1413,10 @@
"here": "crwdns552:0crwdne552:0",
"iconPicker": {
"label": "crwdns554:0crwdne554:0",
"header": "crwdns556:0{countIcons}crwdne556:0"
"header": "crwdns556:0{countIcons}crwdne556:0",
"headerLoading": "crwdns5681:0crwdne5681:0",
"noResults": "crwdns5683:0{search}crwdne5683:0",
"error": "crwdns5685:0crwdne5685:0"
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "crwdns594:0crwdne594:0",
"switchToLightMode": "crwdns596:0crwdne596:0",
"management": "crwdns598:0crwdne598:0",
"docker": "crwdns5703:0crwdne5703:0",
"preferences": "crwdns600:0crwdne600:0",
"logout": "crwdns602:0crwdne602:0",
"login": "crwdns604:0crwdne604:0",
@@ -2352,6 +2357,9 @@
"name": "crwdns3424:0crwdne3424:0",
"description": "crwdns3426:0crwdne3426:0",
"option": {
"columns": {
"label": "crwdns5705:0crwdne5705:0"
},
"enableRowSorting": {
"label": "crwdns3808:0crwdne3808:0"
},
@@ -2405,6 +2413,12 @@
"title": "crwdns3876:0crwdne3876:0"
}
},
"vpn": {
"name": "crwdns5689:0crwdne5689:0",
"description": "crwdns5691:0crwdne5691:0",
"serviceUnavailable": "crwdns5693:0crwdne5693:0",
"option": {}
},
"ups": {
"name": "crwdns4481:0crwdne4481:0",
"description": "crwdns4483:0crwdne4483:0",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": "crwdns5653:0crwdne5653:0"
},
"empty": {
"noSystems": "crwdns5677:0crwdne5677:0"
},
"metric": {
"cpu": "crwdns4865:0crwdne4865:0",
"memory": "crwdns4867:0crwdne4867:0",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "crwdns4927:0crwdne4927:0",
"empty": {
"noSystems": "crwdns5679:0crwdne5679:0"
},
"error": {
"internalServerError": "crwdns5661:0crwdne5661:0",
"liveConnectionFailed": "crwdns5663:0crwdne5663:0",
@@ -4133,6 +4153,11 @@
"title": "crwdns1568:0crwdne1568:0",
"text": "crwdns1570:0crwdne1570:0"
},
"error": {
"title": "crwdns5697:0crwdne5697:0",
"text": "crwdns5699:0crwdne5699:0",
"digest": "crwdns5701:0{digest}crwdne5701:0"
},
"navbar": {
"items": {
"home": "crwdns1572:0crwdne1572:0",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": "crwdns4223:0crwdne4223:0"
},
"vpn": {
"label": "crwdns5695:0crwdne5695:0"
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "crwdns2262:0crwdne2262:0"
"internalServerError": "crwdns2262:0crwdne2262:0",
"noColumns": "crwdns5707:0crwdne5707:0"
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "zde",
"iconPicker": {
"label": "URL ikony",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Přepnout do tmavého režimu",
"switchToLightMode": "Přepnout do světlého režimu",
"management": "Správa",
"docker": "",
"preferences": "Vaše předvolby",
"logout": "Odhlásit se",
"login": "Přihlásit se",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": "Nepodařilo se nalézt požadovaný zdroj"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Domovská stránka",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "her",
"iconPicker": {
"label": "Ikon-URL",
"header": "Indtast navn eller objekter for at filtrere for ikoner... Homarr vil søge gennem {countIcons} ikoner for dig."
"header": "Indtast navn eller objekter for at filtrere for ikoner... Homarr vil søge gennem {countIcons} ikoner for dig.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Skift til mørk tilstand",
"switchToLightMode": "Skift til lys tilstand",
"management": "Håndtering",
"docker": "",
"preferences": "Dine indstillinger",
"logout": "Log ud",
"login": "Log ind",
@@ -2352,6 +2357,9 @@
"name": "Docker statistik",
"description": "Statistik for dine containere (Denne widget kan kun tilføjes med administratorrettigheder)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Aktiver sortering"
},
@@ -2405,6 +2413,12 @@
"title": "Instanser"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Ikke Fundet",
"text": "Kunne ikke finde den anmodede ressource"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Hjem",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Kunne ikke hente Docker-containere"
"internalServerError": "Kunne ikke hente Docker-containere",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "Hier",
"iconPicker": {
"label": "",
"header": "Geben Sie Namen oder Objekte ein, um nach Symbolen zu filtern... Homarr sucht nach {countIcons} Icons für Sie."
"header": "Geben Sie Namen oder Objekte ein, um nach Symbolen zu filtern... Homarr sucht nach {countIcons} Icons für Sie.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Zum dunklen Design wechseln",
"switchToLightMode": "Zum hellen Design wechseln",
"management": "Verwaltung",
"docker": "",
"preferences": "Ihre Einstellungen",
"logout": "Abmelden",
"login": "Anmelden",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Nicht gefunden",
"text": "Konnte die angeforderte Ressource nicht finden"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Startseite",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Fehler beim Abrufen der Docker Container"
"internalServerError": "Fehler beim Abrufen der Docker Container",
"noColumns": ""
}
},
"kubernetes": {
+102 -73
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "Überwachung",
"speedtest": "Geschwindigkeitstest",
"analytics": "Nutzungsdaten",
"vpn": "",
"mediaLibrary": "Medienbibliothek",
"uptimeMonitoring": "Überwachung der Betriebszeit"
},
@@ -1412,7 +1413,10 @@
"here": "Hier",
"iconPicker": {
"label": "Icon URL",
"header": "Geben Sie Namen oder Objekte ein, um nach Symbolen zu filtern... Homarr sucht nach {countIcons} Icons für Sie."
"header": "Geben Sie Namen oder Objekte ein, um nach Symbolen zu filtern... Homarr sucht nach {countIcons} Icons für Sie.",
"headerLoading": "Tippe um die Symbole zu durchsuchen…",
"noResults": "Keine Symbole stimmen mit \"{search}\" überein.",
"error": "Konnte Symbole nicht laden."
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Zum dunklen Design wechseln",
"switchToLightMode": "Zum hellen Design wechseln",
"management": "Verwaltung",
"docker": "",
"preferences": "Ihre Einstellungen",
"logout": "Abmelden",
"login": "Anmelden",
@@ -2352,6 +2357,9 @@
"name": "Docker Statistiken",
"description": "Statistiken Ihrer Container (Dieses Widget kann nur mit Administratorrechten hinzugefügt werden)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Sortierung von Elementen aktivieren"
},
@@ -2405,6 +2413,12 @@
"title": "Instanzen"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "UPS",
"description": "Überwachen Sie den Status Ihrer UPS Geräte über einen NUT Server",
@@ -3395,53 +3409,53 @@
},
"showNowPlaying": {
"label": "\"Sie hören\" anzeigen",
"description": ""
"description": "Zeige aktuell gespielte Titel an (Navidrome)"
},
"showNowPlayingList": {
"label": "",
"description": ""
"label": "\"Sie hören jetzt\" Wiedergabeliste anzeigen",
"description": "Einzelne Tracks anstelle der aktiven Streamanzahl anzeigen (Navidrome)"
},
"maxNowPlayingItems": {
"label": "",
"description": ""
"label": "Maximale jetzt abgespielte Elemente",
"description": "Maximale Anzahl an Titeln, die in der \"Sie hören jetzt\" Wiedergabeliste angezeigt werden (Navidrome)"
},
"showLibraryCount": {
"label": "",
"description": ""
"label": "Anzahl der Bibliotheken anzeigen",
"description": "Zeige die Anzahl der Bibliotheken in deiner Instanz (Hörbücherregal)"
},
"showAudiobooks": {
"label": "",
"description": ""
"label": "Hörbücher anzeigen",
"description": "Zeige die Gesamtzahl der Hörbücher in allen Bibliotheken (Hörbücherregal)"
},
"showPodcasts": {
"label": "",
"description": ""
"label": "Podcasts anzeigen",
"description": "Zeige die Gesamtzahl der Podcasts in allen Bibliotheken (Hörbücherregal)"
},
"showListeningTime": {
"label": "",
"label": "Hördauer anzeigen",
"description": "Zeigt deine gesamte Hörzeit (Audiobookshelf)"
},
"showActiveSessions": {
"label": "Aktive Streams anzeigen",
"description": ""
"description": "Zeige die Anzahl der aktuell aktiven Wiedergabesitzungen (Hörbücherregal)"
},
"compactMode": {
"label": "",
"description": ""
"label": "Kompakter Modus",
"description": "Verwenden Sie ein dichteres Layout mit kleineren Kacheln, ideal für kleine Widget-Größen"
}
},
"artists": "",
"albums": "",
"songs": "",
"libraryCount": "",
"audiobooks": "",
"podcasts": "",
"listeningTime": "",
"activeSessions": "",
"nowPlaying": "",
"nowPlayingCount": "",
"artists": "Künstler",
"albums": "Alben",
"songs": "Musik",
"libraryCount": "Bibliotheken",
"audiobooks": "Hörbücher",
"podcasts": "Podcasts",
"listeningTime": "Hördauer",
"activeSessions": "Aktive Sitzungen",
"nowPlaying": "Aktuelle Wiedergabe",
"nowPlayingCount": "{count, plural, one {# stream} other {# streams}}",
"error": {
"internalServerError": ""
"internalServerError": "Fehler beim Abrufen der Audio-Statistikdaten"
}
},
"systemResources": {
@@ -3457,7 +3471,7 @@
"option": {
"cpu": "CPU",
"memory": "Speicher",
"gpu": "",
"gpu": "GPU",
"network": "Netzwerk"
}
},
@@ -3474,7 +3488,7 @@
"card": {
"cpu": "CPU",
"memory": "Arbeitsspeicher",
"gpu": "",
"gpu": "GPU",
"network": "Netzwerk",
"up": "OBEN",
"down": "UNTEN"
@@ -3510,93 +3524,93 @@
}
},
"customApi": {
"name": "",
"description": "",
"name": "Benutzerdefinierte API",
"description": "Zeigt Daten von jeder externen API mit benutzerdefinierter Konfiguration an.",
"option": {
"definitionId": {
"label": ""
"label": "Definitions ID"
},
"refreshInterval": {
"label": "",
"description": ""
"label": "Aktualisierungsintervall",
"description": "Wie oft Daten von der API neu geladen werden sollen (in Sekunden)"
}
},
"noDefinition": "",
"definitionNotFound": "",
"noDisplayOutput": "",
"executeConfirm": "",
"executing": "",
"executeSuccess": "",
"executeFailed": ""
"noDefinition": "Keine Definition ausgewählt",
"definitionNotFound": "Widget-Definition nicht gefunden. Möglicherweise wurde sie gelöscht.",
"noDisplayOutput": "Keine Anzeige-Ausgabe",
"executeConfirm": "Bist du dir sicher, dass du diese Aktion ausführen möchtest?",
"executing": "Wird ausgeführt...",
"executeSuccess": "Aktion erfolgreich ausgeführt",
"executeFailed": "Aktion fehlgeschlagen. Überprüfen Sie die Widget-Konfiguration."
},
"beszelSystemTable": {
"name": "",
"description": "",
"name": "Beszel Systeme (Tabelle)",
"description": "Tabellenansicht aller Beszel-überwachten Systeme mit sortierbaren Spalten und Statusindikatoren",
"option": {
"statusFilter": {
"label": ""
"label": "Status Filter"
},
"sortBy": {
"label": ""
"label": "Sortieren nach"
},
"sortDirection": {
"label": ""
"label": "Sortierreihenfolge"
},
"showCpu": {
"label": ""
"label": "CPU anzeigen"
},
"showMemory": {
"label": ""
"label": "Arbeitsspeicher anzeigen"
},
"showDisk": {
"label": ""
"label": "Datenträger anzeigen"
},
"showGpu": {
"label": ""
"label": "GPU anzeigen"
},
"showLoadAvg": {
"label": ""
"label": "Zeige Belastungsdurchschnitt"
},
"showNet": {
"label": ""
"label": "Netzwerk anzeigen"
},
"showTemp": {
"label": ""
"label": "Temperatur anzeigen"
},
"showBattery": {
"label": ""
"label": "Akkustand anzeigen"
},
"showServices": {
"label": ""
"label": "Dienste anzeigen"
},
"showUptime": {
"label": ""
"label": "Laufzeit anzeigen"
},
"showAgent": {
"label": ""
"label": "Agent-Version anzeigen"
}
},
"noRecords": "",
"noRecords": "Keine Systeme gefunden",
"error": {
"internalServerError": ""
"internalServerError": "Keine Verbindung zu Beszel. Überprüfen Sie Ihre Integrationseinstellungen."
},
"column": {
"system": "",
"cpu": "",
"memory": "",
"disk": "",
"gpu": "",
"loadAvg": "",
"net": "",
"temp": "",
"battery": "",
"services": "",
"uptime": "",
"agent": ""
"system": "System",
"cpu": "CPU",
"memory": "Arbeitsspeicher",
"disk": "Datenträger",
"gpu": "GPU",
"loadAvg": "Systemlast",
"net": "Netz",
"temp": "Temperatur",
"battery": "Batterie",
"services": "Dienste",
"uptime": "Betriebszeit",
"agent": "Agent"
}
},
"beszelSystemGrid": {
"name": "",
"name": "Beszel Systems (Grid)",
"description": "",
"option": {
"statusFilter": {
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "CPU",
"memory": "Arbeitsspeicher",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "System auswählen",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Nicht gefunden",
"text": "Konnte die angeforderte Ressource nicht finden"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Startseite",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Fehler beim Abrufen der Docker Container"
"internalServerError": "Fehler beim Abrufen der Docker Container",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "εδώ",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Εναλλαγή σε σκοτεινή λειτουργία",
"switchToLightMode": "Εναλλαγή σε φωτεινή λειτουργία",
"management": "Διαχείριση",
"docker": "",
"preferences": "Οι ρυθμίσεις σας",
"logout": "Αποσύνδεση",
"login": "Σύνδεση",
@@ -2352,6 +2357,9 @@
"name": "Στατιστικά Docker",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Αρχική",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "here",
"iconPicker": {
"label": "Icon URL",
"header": "Please enter a name or object to filter for the icon. Homarr will search throughout {countIcons} different icons to find the right one."
"header": "Please enter a name or object to filter for the icon. Homarr will search throughout {countIcons} different icons to find the right one.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Switch to dark mode",
"switchToLightMode": "Switch to light mode",
"management": "Management",
"docker": "",
"preferences": "Your preferences",
"logout": "Log-out",
"login": "Log-in",
@@ -2352,6 +2357,9 @@
"name": "Docker stats",
"description": "Stats of your containers (This widget can only be added with administrator privileges)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Enable items sorting"
},
@@ -2405,6 +2413,12 @@
"title": "Instances"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+9 -3
View File
@@ -1598,7 +1598,9 @@
},
"menu": {
"label": {
"settings": "Settings"
"settings": "Settings",
"options": "Options",
"actions": "Actions"
}
},
"create": {
@@ -2357,6 +2359,9 @@
"name": "Docker stats",
"description": "Stats of your containers (This widget can only be added with administrator privileges)",
"option": {
"columns": {
"label": "Columns to show"
},
"enableRowSorting": {
"label": "Enable items sorting"
},
@@ -4308,7 +4313,7 @@
"notStarted": "Not started"
},
"name": {
"management": "Management",
"management": "Management",
"dashboard": "Dashboard"
}
}
@@ -5096,7 +5101,8 @@
}
},
"error": {
"internalServerError": "Failed to fetch Docker containers"
"internalServerError": "Failed to fetch Docker containers",
"noColumns": "Select at least one column in the widget settings"
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "aquí",
"iconPicker": {
"label": "URL del icono",
"header": "Escribe nombre u objetos para filtrar iconos... Homarr buscará a través de iconos {countIcons} por ti."
"header": "Escribe nombre u objetos para filtrar iconos... Homarr buscará a través de iconos {countIcons} por ti.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Cambiar a modo oscuro",
"switchToLightMode": "Cambiar a modo claro",
"management": "Administración",
"docker": "",
"preferences": "Tus preferencias",
"logout": "Cerrar sesión",
"login": "Iniciar sesión",
@@ -2352,6 +2357,9 @@
"name": "Estadísticas de Docker",
"description": "Estadísticas de tus contenedores (Este widget sólo puede ser añadido con privilegios de administrador)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Habilitar ordenar elementos"
},
@@ -2405,6 +2413,12 @@
"title": "Instancias"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "No Encontrado",
"text": "No se pudo encontrar el recurso solicitado"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Inicio",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Fallo al obtener los contenedores de Docker"
"internalServerError": "Fallo al obtener los contenedores de Docker",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "",
"management": "",
"docker": "",
"preferences": "Teie eelistused",
"logout": "",
"login": "",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+32 -3
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "Valvonta",
"speedtest": "Nopeustestaus",
"analytics": "Analytiikka",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1044,7 +1045,7 @@
"description": "Vastausta ei voitu jäsentää. Tarkista, että URL-osoite osoittaa palvelun perusosoitteeseen."
},
"authorization": {
"title": "Tuonnistautumisvirhe",
"title": "Tunnistautumisvirhe",
"description": "Pyyntöä ei hyväksytty. Varmista, että kirjautumistiedot ovat oikein ja että niille on määritetty riittävät käyttöoikeudet."
},
"statusCode": {
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "Kuvakkeen URL-osoite",
"header": "Suodata kuvakkeita syöttämällä nimi tai objekti... Homarr etsii {countIcons} kuvakkeesta."
"header": "Suodata kuvakkeita syöttämällä nimi tai objekti... Homarr etsii {countIcons} kuvakkeesta.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "",
"management": "Hallinta",
"docker": "",
"preferences": "Asetuksesi",
"logout": "Kirjaudu ulos",
"login": "",
@@ -2352,6 +2357,9 @@
"name": "Docker-tilastot",
"description": "Konttiesi tilastot (tämä widget voidaan lisätä vain ylläpito-oikeuksilla)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Salli kohteiden järjestys"
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Aloitus",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": "Umamin aktiiviset käyttäjät"
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "ici",
"iconPicker": {
"label": "URL de l'icône :",
"header": "Tapez le nom ou les objets pour filtrer les icônes... Homarr recherchera les icônes {countIcons} pour vous."
"header": "Tapez le nom ou les objets pour filtrer les icônes... Homarr recherchera les icônes {countIcons} pour vous.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Activer le mode sombre",
"switchToLightMode": "Activer le mode clair",
"management": "Administration",
"docker": "",
"preferences": "Vos préférences",
"logout": "Se déconnecter",
"login": "Connexion",
@@ -2352,6 +2357,9 @@
"name": "Statistiques de Docker",
"description": "Statistiques de vos conteneurs (Ce widget ne peut être ajouté qu'avec les privilèges d'administrateur)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Activer le tri des éléments"
},
@@ -2405,6 +2413,12 @@
"title": "Instances"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Non trouvé",
"text": "Impossible de trouver la ressource demandée"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Accueil",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Impossible de récupérer les conteneurs Docker"
"internalServerError": "Impossible de récupérer les conteneurs Docker",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "כאן",
"iconPicker": {
"label": "קישור של הסמל",
"header": "הקלד שם או אובייקטים לסינון עבור אייקונים... Homarr יחפש עבורך סמלים של {countIcons} ."
"header": "הקלד שם או אובייקטים לסינון עבור אייקונים... Homarr יחפש עבורך סמלים של {countIcons} .",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "עבור למצב כהה",
"switchToLightMode": "עבור למצב בהיר",
"management": "ניהול",
"docker": "",
"preferences": "העדפות שלך",
"logout": "התנתק/י",
"login": "התחבר/י",
@@ -2352,6 +2357,9 @@
"name": "סטטיסטיקות דוקר",
"description": "סטטיסטיקות של המכולות שלך (ניתן להוסיף ווידג'ט זה רק עם הרשאות מנהל)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "אפשר מיון פריטים"
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "לא נמצא",
"text": "לא ניתן לאתר את המשאב המבוקש"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "מסך הבית",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "נכשל בקבלת קונטיינרי דוקר"
"internalServerError": "נכשל בקבלת קונטיינרי דוקר",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "",
"management": "",
"docker": "",
"preferences": "Vaše preferencije",
"logout": "",
"login": "Prijaviti se",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Dom",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "itt",
"iconPicker": {
"label": "Ikonhivatkozás",
"header": "Írjon be nevet vagy objektumokat az ikonok szűréséhez... A Homarr a {countIcons} ikonok között keres."
"header": "Írjon be nevet vagy objektumokat az ikonok szűréséhez... A Homarr a {countIcons} ikonok között keres.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Váltás sötét módba",
"switchToLightMode": "Váltás világos módra",
"management": "Kezelés",
"docker": "",
"preferences": "Saját preferenciák",
"logout": "Kijelentkezés",
"login": "Bejelentkezés",
@@ -2352,6 +2357,9 @@
"name": "Docker statisztika",
"description": "A konténereid statisztikái (Ezt a widgetet csak rendszergazdai jogosultsággal lehet hozzáadni)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Az elemek rendezésének engedélyezése"
},
@@ -2405,6 +2413,12 @@
"title": "Példányok"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Nyitólap",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "Monitoraggio",
"speedtest": "Speed test",
"analytics": "Analytics",
"vpn": "VPN",
"mediaLibrary": "Media Library",
"uptimeMonitoring": "Uptime Monitoring"
},
@@ -1412,7 +1413,10 @@
"here": "qui",
"iconPicker": {
"label": "Icona URL",
"header": "Digita il nome o gli oggetti da filtrare per le icone... Homarr cercherà tra le icone {countIcons} per te."
"header": "Digita il nome o gli oggetti da filtrare per le icone... Homarr cercherà tra le icone {countIcons} per te.",
"headerLoading": "Digita per cercare icone…",
"noResults": "Nessuna icona corrisponde a \"{search}\".",
"error": "Impossibile caricare le icone."
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Passa alla modalità scura",
"switchToLightMode": "Passa al tema chiaro",
"management": "Gestione",
"docker": "Docker",
"preferences": "Le tue impostazioni",
"logout": "Disconnettiti",
"login": "Accedi",
@@ -2352,6 +2357,9 @@
"name": "Statistiche del docker",
"description": "Statistiche dei tuoi contenitori (questo widget può essere aggiunto solo con privilegi di amministratore)",
"option": {
"columns": {
"label": "Colonne da mostrare"
},
"enableRowSorting": {
"label": "Abilita l'ordinamento degli elementi"
},
@@ -2405,6 +2413,12 @@
"title": "Istanze"
}
},
"vpn": {
"name": "VPN",
"description": "Panoramica delle tue connessioni VPN",
"serviceUnavailable": "VPN non disponibile",
"option": {}
},
"ups": {
"name": "UPS",
"description": "Monitora lo stato dei tuoi dispositivi UPS tramite un server NUT",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": "Impossibile connettersi a Beszel. Controlla le tue impostazioni di integrazione."
},
"empty": {
"noSystems": "Nessun sistema trovato"
},
"metric": {
"cpu": "CPU",
"memory": "Memoria",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "Seleziona sistema",
"empty": {
"noSystems": "Nessun sistema trovato"
},
"error": {
"internalServerError": "Impossibile connettersi a Beszel. Controlla le tue impostazioni di integrazione.",
"liveConnectionFailed": "Connessione Live non riuscita. L'istanza di Beszel potrebbe non supportare lo streaming in tempo reale.",
@@ -4133,6 +4153,11 @@
"title": "Non trovato",
"text": "Impossibile trovare la risorsa richiesta"
},
"error": {
"title": "Questa pagina non può essere caricata",
"text": "Si è verificato un errore inatteso durante il caricamento di questa pagina. La navigazione è ancora disponibile: prova a ricaricare o usa un'altra sezione dalla barra laterale.",
"digest": "Riferimento errore: {digest}"
},
"navbar": {
"items": {
"home": "Home",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": "Visitatori Attivi Umami"
},
"vpn": {
"label": "Stato VPN"
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Recupero dei container Docker non riuscito"
"internalServerError": "Recupero dei container Docker non riuscito",
"noColumns": "Seleziona almeno una colonna nelle impostazioni dei widget"
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "こちら",
"iconPicker": {
"label": "アイコン URL",
"header": "アイコンをフィルタするために、名前またはオブジェクトを入力してください... Homarrは {countIcons} アイコンを検索します。"
"header": "アイコンをフィルタするために、名前またはオブジェクトを入力してください... Homarrは {countIcons} アイコンを検索します。",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "ダークモードに切り替え",
"switchToLightMode": "ライトモードに切り替え",
"management": "管理",
"docker": "",
"preferences": "個人設定",
"logout": "ログアウト",
"login": "ログイン",
@@ -2352,6 +2357,9 @@
"name": "Dockerのステータス",
"description": "あなたのコンテナの統計(このウィジェットは管理者権限でのみ追加できます)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "アイテムの並び替えを有効にする"
},
@@ -2405,6 +2413,12 @@
"title": "インスタンス"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "見つかりません",
"text": "要求されたリソースが見つかりませんでした"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "ホーム",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Docker コンテナの取得に失敗しました"
"internalServerError": "Docker コンテナの取得に失敗しました",
"noColumns": ""
}
},
"kubernetes": {
+87 -58
View File
@@ -288,10 +288,10 @@
"changePingIconsEnabled": {
"notification": {
"success": {
"message": ""
"message": "Ping 아이콘 전환 완료"
},
"error": {
"message": ""
"message": "Ping 아이콘을 전환할 수 없습니다"
}
}
},
@@ -701,56 +701,56 @@
},
"action": {
"create": "생성",
"import": "",
"save": "",
"delete": "",
"deleteConfirm": "",
"export": "",
"addMapping": "",
"addColumn": "",
"edit": "",
"removeMapping": "",
"removeColumn": "",
"addItem": "",
"removeItem": "",
"addBar": "",
"duplicate": "",
"copyAiPrompt": "",
"enable": "",
"disable": "",
"menu": ""
"import": "가져오기",
"save": "저장",
"delete": "사용자 지정 위젯 삭제",
"deleteConfirm": "\"{name}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"export": "내보내기",
"addMapping": "매핑 추가",
"addColumn": "열 추가",
"edit": "편집",
"removeMapping": "매핑 제거",
"removeColumn": "열 제거",
"addItem": "항목 추가",
"removeItem": "항목 제거",
"addBar": "바 추가",
"duplicate": "복사",
"copyAiPrompt": "AI 프롬프트 복사",
"enable": "활성화",
"disable": "비활성화",
"menu": "동작"
},
"field": {
"name": "",
"description": "",
"iconUrl": "",
"url": "",
"authType": "",
"headerName": "",
"method": "",
"requestBody": "",
"displayType": "",
"jsonPath": "",
"jsonPathHint": "",
"label": "",
"unit": "",
"mappings": "",
"tablePath": "",
"tablePathHint": "",
"columns": "",
"header": "",
"items": "",
"gridColumns": "",
"cardStyle": "",
"bars": "",
"valuePath": "",
"maxPath": "",
"showPercentage": "",
"barSize": "",
"goodValues": "",
"dotSize": "",
"valueSize": "",
"labelPosition": "",
"name": "이름",
"description": "설명",
"iconUrl": "아이콘 URL",
"url": "URL",
"authType": "인증 유형",
"headerName": "헤더/쿼리 파라미터 이름",
"method": "메서드",
"requestBody": "요청 본문",
"displayType": "표시 유형",
"jsonPath": "JSON 경로",
"jsonPathHint": "JSONPath 문법으로 값을 추출하십시오. 예: $.data.temperature 또는 $.items[0].name",
"label": "레이블",
"unit": "단위",
"mappings": "매핑",
"tablePath": "JSON 경로 배열",
"tablePathHint": "응답에서 배열이 위치한 경로입니다. 예: $.data.items",
"columns": "열",
"header": "헤더",
"items": "항목",
"gridColumns": "그리드 열 개수",
"cardStyle": "카드 스타일",
"bars": "바",
"valuePath": "JSON 경로 값",
"maxPath": "JSON 경로 최댓값",
"showPercentage": "백분율 표시",
"barSize": "바 크기",
"goodValues": "정상 값(쉼표로 구분)",
"dotSize": "점 크기",
"valueSize": "값 크기",
"labelPosition": "레이블 위치",
"kvLayout": "레이아웃",
"striped": "",
"compact": "컴팩트 모드",
@@ -849,14 +849,14 @@
"secret": {
"apiKey": "",
"username": "",
"password": "",
"savedPlaceholder": ""
"password": "비밀번호",
"savedPlaceholder": "••••••• (저장됨, 유지하려면 공백)"
},
"preview": {
"title": "",
"test": "",
"hint": "",
"rawResponse": ""
"title": "미리보기",
"test": "테스트",
"hint": "현재 설정으로 API 응답을 미리 보려면 테스트를 클릭하십시오.",
"rawResponse": "원본 JSON 응답"
},
"notification": {
"created": "\"{name}\" 위젯 생성 완료.",
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "모니터링",
"speedtest": "속도 테스트",
"analytics": "분석",
"vpn": "",
"mediaLibrary": "미디어 라이브러리",
"uptimeMonitoring": "업타임 모니터링"
},
@@ -1412,7 +1413,10 @@
"here": "여기",
"iconPicker": {
"label": "아이콘 URL",
"header": "이름 또는 주제를 입력해 아이콘을 필터링하세요... Homarr가 {countIcons}에서 아이콘을 검색합니다."
"header": "이름 또는 주제를 입력해 아이콘을 필터링하세요... Homarr가 {countIcons}에서 아이콘을 검색합니다.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "다크 모드로 전환",
"switchToLightMode": "라이트 모드로 전환",
"management": "관리",
"docker": "",
"preferences": "기본 설정",
"logout": "로그아웃",
"login": "로그인",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "찾을 수 없음",
"text": "요청한 리소스를 찾을 수 없습니다"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "홈",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "",
"management": "",
"docker": "",
"preferences": "",
"logout": "",
"login": "Prisijungti",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Pagrindinis",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "",
"management": "",
"docker": "",
"preferences": "Jūsu iestatījumi",
"logout": "",
"login": "Pieslēgties",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Sākums",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "hier",
"iconPicker": {
"label": "Icoon-URL",
"header": "Typ naam of objecten om te filteren op iconen… Homarr doorzoekt {countIcons} iconen voor je."
"header": "Typ naam of objecten om te filteren op iconen… Homarr doorzoekt {countIcons} iconen voor je.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Schakel naar donkere modus",
"switchToLightMode": "Schakel naar lichte modus",
"management": "Beheer",
"docker": "",
"preferences": "Jouw voorkeuren",
"logout": "Uitloggen",
"login": "Inloggen",
@@ -2352,6 +2357,9 @@
"name": "Docker statistieken",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Niet gevonden",
"text": "Kon de aangevraagde bron niet vinden"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Home",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Docker-containers zijn niet opgehaald"
"internalServerError": "Docker-containers zijn niet opgehaald",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "her",
"iconPicker": {
"label": "Ikon-URL",
"header": "Skriv navn eller objekt å filtrere for ikoner... Homarr vil søke gjennom {countIcons} ikoner for deg."
"header": "Skriv navn eller objekt å filtrere for ikoner... Homarr vil søke gjennom {countIcons} ikoner for deg.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Bytt til mørk modus",
"switchToLightMode": "Bytt til lys modus",
"management": "Administrasjon",
"docker": "",
"preferences": "Dine innstillinger",
"logout": "Logg ut",
"login": "Logg Inn",
@@ -2352,6 +2357,9 @@
"name": "Docker status",
"description": "Statistikk over containerne dine (denne widgeten kan bare legges til med administratorrettigheter)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Aktiver sortering av elementer"
},
@@ -2405,6 +2413,12 @@
"title": "Instanser"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Ikke funnet",
"text": "Fant ikke den forespurte ressursen"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Hjem",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": "Umami Aktive Besøkende"
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Klarte ikke hente Docker-containere"
"internalServerError": "Klarte ikke hente Docker-containere",
"noColumns": ""
}
},
"kubernetes": {
File diff suppressed because it is too large. Load diff
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "Monitoramento",
"speedtest": "Teste de Velocidade",
"analytics": "Análises",
"vpn": "",
"mediaLibrary": "Biblioteca de mídia",
"uptimeMonitoring": "Monitoramento do Uptime"
},
@@ -1412,7 +1413,10 @@
"here": "aqui",
"iconPicker": {
"label": "URL do ícone",
"header": "Digite o nome ou os objetos para filtrar os ícones... O Homarr pesquisará {countIcons} ícones para você."
"header": "Digite o nome ou os objetos para filtrar os ícones... O Homarr pesquisará {countIcons} ícones para você.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Alternar para o modo escuro",
"switchToLightMode": "Alternar para o modo claro",
"management": "Gerenciamento",
"docker": "",
"preferences": "Suas preferências",
"logout": "Sair",
"login": "“Login”",
@@ -2352,6 +2357,9 @@
"name": "Estatísticas do Docker",
"description": "Estatísticas dos seus contêineres (Esse widget só pode ser adicionado com privilégios de administrador)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Ativar ordenação de itens"
},
@@ -2405,6 +2413,12 @@
"title": "Instâncias"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "UPS",
"description": "Monitore o status de seus dispositivos UPS através de um servidor NUT",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Não encontrado",
"text": "Não foi possível encontrar o recurso solicitado"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Início",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": "Visitantes Ativos do Umami"
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Falha ao buscar contêineres Docker"
"internalServerError": "Falha ao buscar contêineres Docker",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "",
"management": "",
"docker": "",
"preferences": "",
"logout": "",
"login": "",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "",
"management": "",
"docker": "",
"preferences": "Preferințele dvs.",
"logout": "",
"login": "Utilizator",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Acasă",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "здесь",
"iconPicker": {
"label": "URL иконки",
"header": "Введите название или объекты для фильтрации иконок... Homarr найдёт для вас среди {countIcons} иконок."
"header": "Введите название или объекты для фильтрации иконок... Homarr найдёт для вас среди {countIcons} иконок.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Переключить на тёмную тему",
"switchToLightMode": "Переключить на светлую тему",
"management": "Управление",
"docker": "",
"preferences": "Настройки",
"logout": "Выйти",
"login": "Вход",
@@ -2352,6 +2357,9 @@
"name": "Статистика Docker",
"description": "Статистика контейнеров (этот виджет можно добавить только с правами администратора)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Включить сортировку элементов"
},
@@ -2405,6 +2413,12 @@
"title": "Экземпляры"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Не найдено",
"text": "Запрошенный ресурс не найден"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Главная",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Произошла ошибка при обновлении данных о контейнерах"
"internalServerError": "Произошла ошибка при обновлении данных о контейнерах",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "tu",
"iconPicker": {
"label": "URL ikony",
"header": "Zadajte názov alebo objekty na filtrovanie ikon... Homarr pre vás vyhľadá ikony na stránke {countIcons} ."
"header": "Zadajte názov alebo objekty na filtrovanie ikon... Homarr pre vás vyhľadá ikony na stránke {countIcons} .",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Prepnúť na tmavý motív",
"switchToLightMode": "Prepnúť na svetlý motív",
"management": "Administrácia",
"docker": "",
"preferences": "Vaše preferencie",
"logout": "Odhlásiť",
"login": "Prihlásiť sa",
@@ -2352,6 +2357,9 @@
"name": "Docker stav",
"description": "Štatistiky vašich kontajnerov (Túto miniaplikáciu je možné pridať iba s oprávneniami správcu)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Nenájdené",
"text": "Nepodarilo sa nájsť požadovaný zdroj"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Domovská stránka",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Nepodarilo sa načítať kontajnery Docker"
"internalServerError": "Nepodarilo sa načítať kontajnery Docker",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "Svetli način",
"management": "Nastavitve",
"docker": "",
"preferences": "Prilagoditev",
"logout": "Odjava",
"login": "Prijava",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Domov",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Byt till mörkt läge",
"switchToLightMode": "Byt till ljust läge",
"management": "Administration",
"docker": "",
"preferences": "Dina inställningar",
"logout": "Logga ut",
"login": "Logga in",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Hittades ej",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Hem",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "buraya",
"iconPicker": {
"label": "Simge URL'si",
"header": "Simgeleri filtrelemek için isim veya nesne yazın... Homarr sizin için {countIcons} simge arasında arama yapacaktır."
"header": "Simgeleri filtrelemek için isim veya nesne yazın... Homarr sizin için {countIcons} simge arasında arama yapacaktır.",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Koyu Temaya Geç",
"switchToLightMode": "Aydınlık Temaya Geç",
"management": "Yönetim",
"docker": "",
"preferences": "Tercihleriniz",
"logout": "Oturumu kapat",
"login": "Giriş",
@@ -2352,6 +2357,9 @@
"name": "Docker istatistikleri",
"description": "Konteynerlerinizin istatistikleri (Bu widget yalnızca yönetici ayrıcalıklarıyla eklenebilir)",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": "Enable items sorting"
},
@@ -2405,6 +2413,12 @@
"title": "Instances"
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Bulunamadı",
"text": "İstenen kaynak bulunamadı"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Ana Sayfa",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "Docker konteynerlerları getirilemedi"
"internalServerError": "Docker konteynerlerları getirilemedi",
"noColumns": ""
}
},
"kubernetes": {
+39 -10
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "Медіа бібліотека",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "тут",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "Перемикнути на темну тему",
"switchToLightMode": "Перемикнути на світлу тему",
"management": "Управління",
"docker": "",
"preferences": "Ваші налаштування",
"logout": "Вийти",
"login": "Логін",
@@ -1938,7 +1943,7 @@
"addTable": "Додати таблицю",
"deleteTable": "Видалити таблицю",
"colorCell": "",
"mergeCell": "",
"mergeCell": "Ввімкнути/вимкнути об'єднання клітини",
"addColumnLeft": "",
"addColumnRight": "",
"deleteColumn": "",
@@ -2101,13 +2106,13 @@
"label": ""
},
"1y": {
"label": ""
"label": "1 рік"
},
"2y": {
"label": ""
},
"5y": {
"label": ""
"label": "5 років"
},
"10y": {
"label": ""
@@ -2142,7 +2147,7 @@
"label": ""
},
"1mo": {
"label": ""
"label": "1 місяць"
}
}
}
@@ -2182,7 +2187,7 @@
"label": "Температура за Фаренгейтом"
},
"disableTemperatureDecimals": {
"label": ""
"label": "Вимкнути десяткові дроби температури"
},
"showCurrentWindSpeed": {
"label": "Показати поточну швидкість вітру",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2359,7 +2367,7 @@
"label": "",
"option": {
"name": "",
"state": "",
"state": "Стан",
"cpuUsage": "",
"memoryUsage": ""
}
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -2470,7 +2484,7 @@
"videoDecision": {
"directPlay": "",
"transcode": "",
"directStream": ""
"directStream": "Прямий потік"
}
},
"recentActivity": {
@@ -2550,7 +2564,7 @@
"label": "",
"description": "",
"option": {
"chart": "",
"chart": "Графік",
"events": "",
"topPages": "",
"topReferrers": ""
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "Не знайдено",
"text": "Не вдалося знайти запитуваний ресурс"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Головна",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "",
"iconPicker": {
"label": "",
"header": ""
"header": "",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "",
"switchToLightMode": "Đổi qua chế độ nền sáng",
"management": "",
"docker": "",
"preferences": "Cá nhân hoá",
"logout": "",
"login": "Đăng nhập",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "",
"text": ""
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "Trang chủ",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": ""
"internalServerError": "",
"noColumns": ""
}
},
"kubernetes": {
+31 -2
View File
@@ -1021,6 +1021,7 @@
"mediaMonitoring": "",
"speedtest": "",
"analytics": "",
"vpn": "",
"mediaLibrary": "",
"uptimeMonitoring": ""
},
@@ -1412,7 +1413,10 @@
"here": "此處",
"iconPicker": {
"label": "Icon 網址",
"header": "輸入名稱或物件來篩選 icons,Homarr 會自動搜尋 {countIcons}"
"header": "輸入名稱或物件來篩選 icons,Homarr 會自動搜尋 {countIcons}",
"headerLoading": "",
"noResults": "",
"error": ""
},
"colorScheme": {
"options": {
@@ -1464,6 +1468,7 @@
"switchToDarkMode": "切換至暗黑模式",
"switchToLightMode": "切換至日間模式",
"management": "管理中心",
"docker": "",
"preferences": "偏好設定",
"logout": "登出",
"login": "登入",
@@ -2352,6 +2357,9 @@
"name": "",
"description": "",
"option": {
"columns": {
"label": ""
},
"enableRowSorting": {
"label": ""
},
@@ -2405,6 +2413,12 @@
"title": ""
}
},
"vpn": {
"name": "",
"description": "",
"serviceUnavailable": "",
"option": {}
},
"ups": {
"name": "",
"description": "",
@@ -3639,6 +3653,9 @@
"error": {
"internalServerError": ""
},
"empty": {
"noSystems": ""
},
"metric": {
"cpu": "",
"memory": "",
@@ -3712,6 +3729,9 @@
}
},
"selectSystem": "",
"empty": {
"noSystems": ""
},
"error": {
"internalServerError": "",
"liveConnectionFailed": "",
@@ -4133,6 +4153,11 @@
"title": "不存在",
"text": "找不到請求的資源"
},
"error": {
"title": "",
"text": "",
"digest": ""
},
"navbar": {
"items": {
"home": "首頁",
@@ -4579,6 +4604,9 @@
},
"umamiActiveVisitors": {
"label": ""
},
"vpn": {
"label": ""
}
},
"interval": {
@@ -5071,7 +5099,8 @@
}
},
"error": {
"internalServerError": "取得 Docker 容器失敗"
"internalServerError": "取得 Docker 容器失敗",
"noColumns": ""
}
},
"kubernetes": {
+33 -7
View File
@@ -1,4 +1,4 @@
import { useState } from "react";
import { useCallback, useState } from "react";
import { Box, Container, Flex, Popover, Text, useMantineTheme } from "@mantine/core";
import { useElementSize } from "@mantine/hooks";
@@ -13,10 +13,12 @@ interface CalendarDayProps {
disabled: boolean;
rootWidth: number;
rootHeight: number;
onOpen: (close: () => void) => void;
}
export const CalendarDay = ({ date, events, disabled, rootHeight, rootWidth }: CalendarDayProps) => {
export const CalendarDay = ({ date, events, disabled, rootHeight, rootWidth, onOpen }: CalendarDayProps) => {
const [opened, setOpened] = useState(false);
const [pinned, setPinned] = useState(false);
const { primaryColor } = useMantineTheme();
const { ref, height } = useElementSize();
const board = useRequiredBoard();
@@ -29,6 +31,19 @@ export const CalendarDay = ({ date, events, disabled, rootHeight, rootWidth }: C
const isTooSmallForIndicators = height < 30;
const handleMouseEnter = useCallback(() => {
if (disabled) return;
onOpen(() => {
setOpened(false);
setPinned(false);
});
setOpened(true);
}, [disabled, onOpen]);
const handleMouseLeave = useCallback(() => {
if (!pinned) setOpened(false);
}, [pinned]);
return (
<Popover
position="bottom"
@@ -39,7 +54,10 @@ export const CalendarDay = ({ date, events, disabled, rootHeight, rootWidth }: C
transitionProps={{
transition: "pop",
}}
onChange={setOpened}
onChange={(value) => {
setOpened(value);
if (!value) setPinned(false);
}}
opened={opened}
disabled={disabled}
>
@@ -59,10 +77,10 @@ export const CalendarDay = ({ date, events, disabled, rootHeight, rootWidth }: C
cursor: disabled ? "default" : "pointer",
}}
onClick={() => {
if (disabled) return;
setOpened((prev) => !prev);
if (!disabled) setPinned((prev) => !prev);
}}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<Text ta={"center"} size={shouldScaleDown ? "xs" : "md"} lh={1}>
{date.getDate()}
@@ -71,7 +89,15 @@ export const CalendarDay = ({ date, events, disabled, rootHeight, rootWidth }: C
</Container>
</Popover.Target>
{/* Popover has some offset on the left side, padding is removed because of scrollarea paddings */}
<Popover.Dropdown maw="calc(100vw - 24px)" w={512} pe={4} pb={0} style={{ overflow: "hidden" }}>
<Popover.Dropdown
maw="calc(100vw - 24px)"
w={512}
pe={4}
pb={0}
style={{ overflow: "hidden" }}
onMouseEnter={() => setOpened(true)}
onMouseLeave={handleMouseLeave}
>
<CalendarEventList events={events} />
</Popover.Dropdown>
</Popover>
+50 -10
View File
@@ -1,6 +1,6 @@
"use client";
import { useMemo, useState } from "react";
import { useCallback, useMemo, useRef, useState } from "react";
import { useParams } from "next/navigation";
import { useMantineTheme } from "@mantine/core";
import { Calendar } from "@mantine/dates";
@@ -16,11 +16,15 @@ import type { WidgetComponentProps } from "../definition";
import { CalendarDay } from "./calender-day";
import classes from "./component.module.css";
export default function CalendarWidget(props: WidgetComponentProps<"calendar">) {
export default function CalendarWidget(
props: WidgetComponentProps<"calendar">,
) {
const [month, setMonth] = useState(new Date());
if (props.integrationIds.length === 0) {
return <CalendarBase {...props} events={[]} month={month} setMonth={setMonth} />;
return (
<CalendarBase {...props} events={[]} month={month} setMonth={setMonth} />
);
}
return <FetchCalendar month={month} setMonth={setMonth} {...props} />;
@@ -31,7 +35,13 @@ interface FetchCalendarProps extends WidgetComponentProps<"calendar"> {
setMonth: (date: Date) => void;
}
const FetchCalendar = ({ month, setMonth, isEditMode, integrationIds, options }: FetchCalendarProps) => {
const FetchCalendar = ({
month,
setMonth,
isEditMode,
integrationIds,
options,
}: FetchCalendarProps) => {
const input = {
integrationIds,
month: month.getMonth(),
@@ -61,9 +71,20 @@ const FetchCalendar = ({ month, setMonth, isEditMode, integrationIds, options }:
},
});
const events = useMemo(() => data?.flatMap((item) => item.events) ?? [], [data]);
const events = useMemo(
() => data?.flatMap((item) => item.events) ?? [],
[data],
);
return <CalendarBase isEditMode={isEditMode} events={events} month={month} setMonth={setMonth} options={options} />;
return (
<CalendarBase
isEditMode={isEditMode}
events={events}
month={month}
setMonth={setMonth}
options={options}
/>
);
};
interface CalendarBaseProps {
@@ -74,7 +95,13 @@ interface CalendarBaseProps {
options: WidgetComponentProps<"calendar">["options"];
}
const CalendarBase = ({ isEditMode, events, month, setMonth, options }: CalendarBaseProps) => {
const CalendarBase = ({
isEditMode,
events,
month,
setMonth,
options,
}: CalendarBaseProps) => {
const params = useParams();
const locale = params.locale as string;
const { firstDayOfWeek } = useSettings();
@@ -85,6 +112,11 @@ const CalendarBase = ({ isEditMode, events, month, setMonth, options }: Calendar
const isSmall = width < 256;
const normalizedEvents = useMemo(() => splitEvents(events), [events]);
const activeCloseRef = useRef<(() => void) | null>(null);
const onDayOpen = useCallback((close: () => void) => {
activeCloseRef.current?.();
activeCloseRef.current = close;
}, []);
return (
<Calendar
@@ -150,9 +182,14 @@ const CalendarBase = ({ isEditMode, events, month, setMonth, options }: Calendar
const eventsForDate = normalizedEvents
.filter((event) => dayjs(event.startDate).isSame(tileDate, "day"))
.filter(
(event) => event.metadata?.type !== "radarr" || options.releaseType.includes(event.metadata.releaseType),
(event) =>
event.metadata?.type !== "radarr" ||
options.releaseType.includes(event.metadata.releaseType),
)
.toSorted((eventA, eventB) => eventA.startDate.getTime() - eventB.startDate.getTime());
.toSorted(
(eventA, eventB) =>
eventA.startDate.getTime() - eventB.startDate.getTime(),
);
return (
<CalendarDay
@@ -161,6 +198,7 @@ const CalendarBase = ({ isEditMode, events, month, setMonth, options }: Calendar
disabled={isEditMode || eventsForDate.length === 0}
rootWidth={width}
rootHeight={height}
onOpen={onDayOpen}
/>
);
}}
@@ -198,7 +236,9 @@ export const splitEvents = (events: CalendarEvent[]): CalendarEvent[] => {
splitEvents.push({
...event,
startDate: currentStart.toDate(),
endDate: currentStart.endOf("day").isAfter(event.endDate) ? event.endDate : currentStart.endOf("day").toDate(),
endDate: currentStart.endOf("day").isAfter(event.endDate)
? event.endDate
: currentStart.endOf("day").toDate(),
});
currentStart = currentStart.add(1, "day").startOf("day");
+32 -1
View File
@@ -1,3 +1,4 @@
import type React from "react";
import type { LoaderComponent } from "next/dynamic";
import type { QueryClient } from "@tanstack/react-query";
import type { DefaultErrorData } from "@trpc/server/unstable-core-do-not-import";
@@ -9,7 +10,35 @@ import type { stringOrTranslation } from "@homarr/translation";
import type { TablerIcon } from "@homarr/ui";
import type { WidgetImports } from ".";
import type { inferOptionsFromCreator, WidgetOptionsRecord } from "./options";
import type { inferOptionsFromCreator, inferOptionsFromDefinition, WidgetOptionsRecord } from "./options";
export interface WidgetContextMenuAction {
key: string;
label: stringOrTranslation;
icon?: TablerIcon;
onClick: () => void;
hidden?: boolean;
disabled?: boolean;
color?: string;
}
export interface WidgetContextMenuContext {
isEditMode: boolean;
boardId: string | undefined;
itemId: string | undefined;
}
export interface WidgetContextActionProps<
TKind extends WidgetKind,
TOptions extends WidgetOptionsRecord = WidgetOptionsRecord,
> {
kind: TKind;
options: inferOptionsFromDefinition<TOptions>;
setOptions: (partial: Partial<inferOptionsFromDefinition<TOptions>>) => void;
integrationIds: string[];
context: WidgetContextMenuContext;
widgetStateRef: React.MutableRefObject<Record<string, unknown> | null>;
}
const createWithDynamicImport =
<TKind extends WidgetKind, TDefinition extends WidgetDefinition>(kind: TKind, definition: TDefinition) =>
@@ -56,6 +85,7 @@ export interface WidgetDefinition {
}
>
>;
contextActions?: (props: Omit<WidgetContextActionProps<WidgetKind>, "kind">) => WidgetContextMenuAction[];
}
export interface WidgetProps<TKind extends WidgetKind> {
@@ -70,6 +100,7 @@ export type WidgetComponentProps<TKind extends WidgetKind> = WidgetProps<TKind>
setOptions: ({ newOptions }: { newOptions: Partial<inferOptionsFromCreator<WidgetOptionsRecordOf<TKind>>> }) => void;
width: number;
height: number;
widgetStateRef?: React.MutableRefObject<Record<string, unknown> | null>;
};
export type WidgetOptionsRecordOf<TKind extends WidgetKind> = WidgetImports[TKind]["definition"]["createOptions"];
@@ -57,6 +57,7 @@ export default function DnsHoleControlsWidget({
},
{
staleTime: 5 * 1000,
refetchInterval: 5 * 1000,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
retry: false,
@@ -26,6 +26,7 @@ export default function DnsHoleSummaryWidget({ options, integrationIds }: Widget
},
{
staleTime: 5 * 1000,
refetchInterval: 5 * 1000,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
retry: false,
+21 -2
View File
@@ -1,10 +1,10 @@
"use client";
import { useMemo } from "react";
import { ActionIcon, Avatar, Badge, Group, Stack, Text, Tooltip } from "@mantine/core";
import { ActionIcon, Avatar, Badge, Center, Group, Stack, Text, Tooltip } from "@mantine/core";
import type { IconProps } from "@tabler/icons-react";
import { IconBrandDocker, IconPlayerPlay, IconPlayerStop, IconRotateClockwise } from "@tabler/icons-react";
import type { MRT_ColumnDef } from "mantine-react-table";
import type { MRT_ColumnDef, MRT_VisibilityState } from "mantine-react-table";
import { MantineReactTable } from "mantine-react-table";
import type { RouterOutputs } from "@homarr/api";
@@ -213,6 +213,15 @@ export default function DockerWidget({ options, width, isEditMode }: WidgetCompo
const columns = useMemo(() => createColumns(t), [t]);
const columnVisibility: MRT_VisibilityState = {
name: options.columns.includes("name"),
state: options.columns.includes("state"),
host: options.columns.includes("host"),
cpuUsage: options.columns.includes("cpuUsage"),
memoryUsage: options.columns.includes("memoryUsage"),
actions: options.columns.includes("actions"),
};
const table = useTranslatedMantineReactTable({
columns,
data: containers,
@@ -233,6 +242,9 @@ export default function DockerWidget({ options, width, isEditMode }: WidgetCompo
sorting: [{ id: options.defaultSort, desc: options.descendingDefaultSort }],
density: "xs",
},
state: {
columnVisibility,
},
mantinePaperProps: {
flex: 1,
withBorder: false,
@@ -260,6 +272,13 @@ export default function DockerWidget({ options, width, isEditMode }: WidgetCompo
},
});
if (options.columns.length === 0)
return (
<Center h="100%">
<Text>{t("error.noColumns")}</Text>
</Center>
);
return (
<Stack gap={0} h="100%" display="flex">
<MantineReactTable table={table} />
+19
View File
@@ -12,10 +12,29 @@ const columnsList = [
"memoryUsage",
] as const satisfies (keyof RouterOutputs["docker"]["getContainers"]["containers"][number])[];
const allColumnsList = ["name", "state", "host", "cpuUsage", "memoryUsage", "actions"] as const;
const columnTranslationKeyMap = {
name: "docker.field.name.label",
state: "docker.field.state.label",
host: "docker.field.host.label",
cpuUsage: "docker.field.stats.cpu.label",
memoryUsage: "docker.field.stats.memory.label",
actions: "docker.action.title",
} as const satisfies Record<(typeof allColumnsList)[number], string>;
export const { definition, componentLoader } = createWidgetDefinition("dockerContainers", {
icon: IconBrandDocker,
createOptions() {
return optionsBuilder.from((factory) => ({
columns: factory.multiSelect({
defaultValue: [...allColumnsList],
options: allColumnsList.map((value) => ({
value,
label: (t) => t(columnTranslationKeyMap[value]),
})),
searchable: true,
}),
enableRowSorting: factory.switch({
defaultValue: false,
}),
+2 -1
View File
@@ -1,6 +1,7 @@
"use client";
import "../widgets-common.css";
import "./styles.css";
import { useCallback, useMemo, useState } from "react";
import type { MantineStyleProp } from "@mantine/core";
@@ -577,7 +578,7 @@ export default function DownloadClientsWidget({
enableColumnOrdering: isEditMode,
enableRowVirtualization: true,
rowVirtualizerOptions: { overscan: 5 },
mantinePaperProps: { flex: 1, withBorder: false, shadow: undefined },
mantinePaperProps: { flex: 1, withBorder: false, shadow: undefined, bg: "transparent" },
mantineTableContainerProps: { style: { height: "100%" } },
mantineTableProps: {
className: "downloads-widget-table",
+12
View File
@@ -0,0 +1,12 @@
/* Make the MantineReactTable transparent so the board card's opacity-controlled
background shows through. MRT defaults to var(--mantine-color-body) which is opaque. */
.downloads-widget-table,
.downloads-widget-table .mantine-Table-table,
.downloads-widget-table .mantine-Table-thead,
.downloads-widget-table .mantine-Table-tbody,
.downloads-widget-table .mantine-Table-tfoot,
.downloads-widget-table .mantine-Table-tr,
.downloads-widget-table th,
.downloads-widget-table td {
background-color: transparent !important;
}
+6 -1
View File
@@ -61,7 +61,12 @@ import * as video from "./video";
import * as weather from "./weather";
import * as customApi from "./custom-api";
export type { WidgetDefinition, WidgetOptionsSettings } from "./definition";
export type {
WidgetDefinition,
WidgetContextMenuAction,
WidgetContextActionProps,
WidgetOptionsSettings,
} from "./definition";
export type { WidgetComponentProps };
export type { WidgetOptionDefinition, WidgetOptionType } from "./options";
@@ -1,6 +1,7 @@
import { IconZoomQuestion } from "@tabler/icons-react";
import { IconSearch, IconZoomQuestion } from "@tabler/icons-react";
import { getIntegrationKindsByCategory } from "@homarr/definitions";
import { openMediaRequestSearch } from "@homarr/spotlight";
import { createWidgetDefinition } from "../../definition";
import { optionsBuilder } from "../../options";
@@ -14,5 +15,15 @@ export const { componentLoader, definition } = createWidgetDefinition("mediaRequ
}),
}));
},
contextActions: ({ integrationIds }) => [
{
key: "search",
label: (t) => t("search.mode.media.action.search.label"),
icon: IconSearch,
onClick: () => {
openMediaRequestSearch({ integrationIds });
},
},
],
supportedIntegrations: getIntegrationKindsByCategory("mediaRequest"),
}).withDynamicImport(() => import("./component"));
@@ -1,6 +1,7 @@
import { IconChartBar } from "@tabler/icons-react";
import { IconChartBar, IconSearch } from "@tabler/icons-react";
import { getIntegrationKindsByCategory } from "@homarr/definitions";
import { openMediaRequestSearch } from "@homarr/spotlight";
import { createWidgetDefinition } from "../../definition";
@@ -9,5 +10,15 @@ export const { componentLoader, definition } = createWidgetDefinition("mediaRequ
createOptions() {
return {};
},
contextActions: ({ integrationIds }) => [
{
key: "search",
label: (t) => t("search.mode.media.action.search.label"),
icon: IconSearch,
onClick: () => {
openMediaRequestSearch({ integrationIds });
},
},
],
supportedIntegrations: getIntegrationKindsByCategory("mediaRequest"),
}).withDynamicImport(() => import("./component"));
+2
View File
@@ -13,6 +13,7 @@ import type { ReleasesRepository } from "./releases/releases-repository";
interface CommonInput<TType> {
defaultValue?: TType;
withDescription?: boolean;
skipContextMenu?: boolean;
}
interface TextInput extends CommonInput<string> {
@@ -91,6 +92,7 @@ const optionsFactory = {
type: "switch" as const,
defaultValue: input?.defaultValue ?? false,
withDescription: input?.withDescription ?? false,
skipContextMenu: input?.skipContextMenu ?? false,
}),
text: (input?: TextInput) => ({
type: "text" as const,
+1210 -862
View File
File diff suppressed because it is too large. Load diff
+26 -26
View File
@@ -14,7 +14,7 @@ catalog:
"@dnd-kit/utilities": ^3.2.2
"@drizzle-team/brocli": ^0.12.0
"@extractus/feed-extractor": 7.2.1
'@gfazioli/mantine-onboarding-tour': ^4.0.5
'@gfazioli/mantine-onboarding-tour': ^4.0.6
"@gitbeaker/rest": ^43.8.0
"@homarr/gridstack": ^1.12.0
"@homarr/node-unifi": ^2.6.0
@@ -22,21 +22,21 @@ catalog:
"@jellyfin/sdk": ^0.13.0
"@kubernetes/client-node": ^1.4.0
"@modelcontextprotocol/sdk": 1.29.0
"@mantine/charts": ^9.3.2
"@mantine/colors-generator": ^9.3.2
"@mantine/core": ^9.3.2
"@mantine/dates": ^9.3.2
"@mantine/dropzone": ^9.3.2
"@mantine/form": ^9.3.2
"@mantine/hooks": ^9.3.2
"@mantine/modals": ^9.3.2
"@mantine/notifications": ^9.3.2
"@mantine/spotlight": ^9.3.2
"@mantine/tiptap": ^9.3.2
"@mantine/charts": ^9.4.0
"@mantine/colors-generator": ^9.4.0
"@mantine/core": ^9.4.0
"@mantine/dates": ^9.4.0
"@mantine/dropzone": ^9.4.0
"@mantine/form": ^9.4.0
"@mantine/hooks": ^9.4.0
"@mantine/modals": ^9.4.0
"@mantine/notifications": ^9.4.0
"@mantine/spotlight": ^9.4.0
"@mantine/tiptap": ^9.4.0
"@next/eslint-plugin-next": 16.2.9
"@octokit/auth-app": ^8.2.0
"@paralleldrive/cuid2": ^3.3.0
"@playwright/test": ^1.61.0
"@playwright/test": ^1.61.1
"@semantic-release/changelog": ^6.0.3
"@semantic-release/commit-analyzer": ^13.0.1
"@semantic-release/git": ^10.0.1
@@ -73,7 +73,7 @@ catalog:
"@trpc/react-query": ^11.17.0
"@trpc/server": ^11.17.0
"@trpc/tanstack-react-query": ^11.17.0
"@turbo/gen": ^2.9.18
"@turbo/gen": ^2.10.0
"@types/adm-zip": 0.5.8
"@types/bcrypt": 6.0.0
"@types/better-sqlite3": 7.6.13
@@ -88,13 +88,13 @@ catalog:
"@types/prismjs": ^1.26.6
"@types/react": 19.2.17
"@types/react-dom": 19.2.3
"@scalar/api-reference-react": ^0.9.47
"@scalar/api-reference-react": ^0.9.48
"@types/video.js": ^7.3.58
"@types/ws": ^8.18.1
"@types/xml2js": ^0.4.14
posthog-js: ^1.391.2
posthog-js: ^1.393.4
posthog-node: ^4.18.0
"@vitejs/plugin-react": ^6.0.2
"@vitejs/plugin-react": ^6.0.3
"@vitest/coverage-v8": ^4.1.9
"@vitest/ui": ^4.1.9
"@xterm/addon-canvas": ^0.7.0
@@ -150,8 +150,8 @@ catalog:
next-intl: 4.13.0
node-loader: ^2.1.0
octokit: ^5.0.5
oxfmt: ^0.55.0
oxlint: ^1.70.0
oxfmt: ^0.56.0
oxlint: ^1.71.0
pg: ^8.22.0
postcss-preset-mantine: ^1.18.0
prismjs: ^1.30.0
@@ -163,7 +163,7 @@ catalog:
react-markdown: ^10.1.0
react-quill-new: ^3.8.3
react-simple-code-editor: ^0.14.1
recharts: ^3.8.1
recharts: ^3.9.0
sass: ^1.101.0
semantic-release: ^25.0.5
semver-parser: ^4.2.1
@@ -175,9 +175,9 @@ catalog:
trpc-to-openapi: ^3.3.0
tsdav: ^2.2.2
tsx: 4.20.4
turbo: ^2.9.18
turbo: ^2.10.0
typescript: ^6.0.3
vite: ^8.0.16
vite: ^8.1.0
undici: 7.27.2
use-deep-compare-effect: ^1.8.1
video.js: ^8.23.9
@@ -206,14 +206,14 @@ minimumReleaseAgeExclude:
overrides:
"@babel/helpers@<7.26.10": ">=7.29.7"
"@babel/runtime@<7.26.10": ">=7.29.7"
"axios@>=1.0.0 <1.8.2": ">=1.18.0"
"axios@>=1.0.0 <1.8.2": ">=1.18.1"
"brace-expansion@>=2.0.0 <=2.0.1": ">=5.0.6"
"brace-expansion@>=1.0.0 <=1.1.11": ">=5.0.6"
"esbuild@<=0.24.2": ">=0.28.0"
"form-data@>=4.0.0 <4.0.4": ">=4.0.6"
"hono@<4.6.5": ">=4.12.26"
"hono@<4.6.5": ">=4.12.27"
"linkifyjs@<4.3.2": ">=4.3.3"
"nanoid@>=4.0.0 <5.0.9": ">=5.1.15"
"nanoid@>=4.0.0 <5.0.9": ">=5.1.16"
"prismjs@<1.30.0": ">=1.30.0"
"proxmox-api>undici": "7.27.1"
"react-is": "^19.2.7"
@@ -222,7 +222,7 @@ overrides:
"tar-fs@>=3.0.0 <3.0.9": ">=3.1.2"
"tar-fs@>=2.0.0 <2.1.3": ">=3.1.2"
"tmp@<=0.2.3": ">=0.2.7"
"vite@>=5.0.0 <=5.4.18": ">=8.0.16"
"vite@>=5.0.0 <=5.4.18": ">=8.1.0"
patchedDependencies:
"@types/node-unifi": "patches/@types__node-unifi.patch"
"trpc-to-openapi": "patches/trpc-to-openapi.patch"