chore(release): automatic release v1.24.0

This commit is contained in:
homarr-releases[bot]
2025-06-13 19:14:43 +00:00
committed by GitHub
66 changed files with 1792 additions and 1290 deletions

View File

@@ -31,6 +31,7 @@ body:
label: Version
description: What version of Homarr are you running?
options:
- 1.23.0
- 1.22.0
- 1.21.0
- 1.20.0

View File

@@ -17,31 +17,16 @@ const withNextIntl = createNextIntlPlugin({
requestConfig: "../../packages/translation/src/request.ts",
});
interface WebpackConfig {
module: {
rules: {
test: RegExp;
loader: string;
}[];
};
}
const nextConfig: NextConfig = {
output: "standalone",
reactStrictMode: true,
/** We already do linting and typechecking as separate tasks in CI */
eslint: { ignoreDuringBuilds: true },
typescript: { ignoreBuildErrors: true },
webpack: (config: WebpackConfig, { isServer }) => {
if (isServer) {
config.module.rules.push({
test: /\.node$/,
loader: "node-loader",
});
}
return config;
},
/**
* dockerode is required in the external server packages because of https://github.com/homarr-labs/homarr/issues/612
*/
serverExternalPackages: ["dockerode"],
experimental: {
optimizePackageImports: ["@mantine/core", "@mantine/hooks", "@tabler/icons-react"],
},
@@ -68,6 +53,7 @@ const nextConfig: NextConfig = {
form-action 'self';
img-src * data:;
font-src * data:;
media-src * data:;
`
.replace(/\s{2,}/g, " ")
.trim(),

View File

@@ -48,21 +48,21 @@
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^8.0.2",
"@mantine/core": "^8.0.2",
"@mantine/dropzone": "^8.0.2",
"@mantine/hooks": "^8.0.2",
"@mantine/modals": "^8.0.2",
"@mantine/tiptap": "^8.0.2",
"@mantine/colors-generator": "^8.1.0",
"@mantine/core": "^8.1.0",
"@mantine/dropzone": "^8.1.0",
"@mantine/hooks": "^8.1.0",
"@mantine/modals": "^8.1.0",
"@mantine/tiptap": "^8.1.0",
"@million/lint": "1.0.14",
"@tabler/icons-react": "^3.34.0",
"@tanstack/react-query": "^5.80.6",
"@tanstack/react-query-devtools": "^5.80.6",
"@tanstack/react-query-next-experimental": "^5.80.6",
"@trpc/client": "^11.3.1",
"@trpc/next": "^11.3.1",
"@trpc/react-query": "^11.3.1",
"@trpc/server": "^11.3.1",
"@tanstack/react-query": "^5.80.7",
"@tanstack/react-query-devtools": "^5.80.7",
"@tanstack/react-query-next-experimental": "^5.80.7",
"@trpc/client": "^11.4.1",
"@trpc/next": "^11.4.1",
"@trpc/react-query": "^11.4.1",
"@trpc/server": "^11.4.1",
"@xterm/addon-canvas": "^0.7.0",
"@xterm/addon-fit": "0.10.0",
"@xterm/xterm": "^5.5.0",
@@ -71,7 +71,7 @@
"dayjs": "^1.11.13",
"dotenv": "^16.5.0",
"flag-icons": "^7.5.0",
"glob": "^11.0.2",
"glob": "^11.0.3",
"jotai": "^2.12.5",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.3.3",
@@ -81,20 +81,20 @@
"react-dom": "19.1.0",
"react-error-boundary": "^6.0.0",
"react-simple-code-editor": "^0.14.1",
"sass": "^1.89.1",
"sass": "^1.89.2",
"superjson": "2.2.2",
"swagger-ui-react": "^5.24.0",
"swagger-ui-react": "^5.24.1",
"use-deep-compare-effect": "^1.8.1",
"zod": "^3.25.55"
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/chroma-js": "3.1.1",
"@types/node": "^22.15.30",
"@types/node": "^22.15.31",
"@types/prismjs": "^1.26.5",
"@types/react": "19.1.6",
"@types/react": "19.1.8",
"@types/react-dom": "19.1.6",
"@types/swagger-ui-react": "^5.18.0",
"concurrently": "^9.1.2",

View File

@@ -44,12 +44,12 @@
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/node": "^22.15.30",
"@types/node": "^22.15.31",
"dotenv-cli": "^8.0.0",
"esbuild": "^0.25.5",
"eslint": "^9.28.0",
"prettier": "^3.5.3",
"tsx": "4.19.4",
"tsx": "4.20.3",
"typescript": "^5.8.3"
}
}

View File

@@ -26,7 +26,7 @@
"@homarr/redis": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"dotenv": "^16.5.0",
"tsx": "4.19.4",
"tsx": "4.20.3",
"ws": "^8.18.2"
},
"devDependencies": {

View File

@@ -39,21 +39,21 @@
"@semantic-release/npm": "^12.0.1",
"@semantic-release/release-notes-generator": "^14.0.3",
"@turbo/gen": "^2.5.4",
"@vitejs/plugin-react": "^4.5.1",
"@vitest/coverage-v8": "^3.2.2",
"@vitest/ui": "^3.2.2",
"@vitejs/plugin-react": "^4.5.2",
"@vitest/coverage-v8": "^3.2.3",
"@vitest/ui": "^3.2.3",
"conventional-changelog-conventionalcommits": "^9.0.0",
"cross-env": "^7.0.3",
"jsdom": "^26.1.0",
"prettier": "^3.5.3",
"semantic-release": "^24.2.5",
"testcontainers": "^11.0.0",
"testcontainers": "^11.0.3",
"turbo": "^2.5.4",
"typescript": "^5.8.3",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.2"
"vitest": "^3.2.3"
},
"packageManager": "pnpm@10.11.1",
"packageManager": "pnpm@10.12.1",
"engines": {
"node": ">=22.16.0"
},

View File

@@ -41,18 +41,18 @@
"@homarr/server-settings": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.3.0",
"@tanstack/react-query": "^5.80.6",
"@trpc/client": "^11.3.1",
"@trpc/react-query": "^11.3.1",
"@trpc/server": "^11.3.1",
"@trpc/tanstack-react-query": "^11.3.1",
"@tanstack/react-query": "^5.80.7",
"@trpc/client": "^11.4.1",
"@trpc/react-query": "^11.4.1",
"@trpc/server": "^11.4.1",
"@trpc/tanstack-react-query": "^11.4.1",
"lodash.clonedeep": "^4.5.0",
"next": "15.3.3",
"react": "19.1.0",
"react-dom": "19.1.0",
"superjson": "2.2.2",
"trpc-to-openapi": "^2.3.1",
"zod": "^3.25.55"
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -39,14 +39,14 @@
"next-auth": "5.0.0-beta.28",
"react": "19.1.0",
"react-dom": "19.1.0",
"zod": "^3.25.55"
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/bcrypt": "5.0.2",
"@types/cookies": "0.9.0",
"@types/cookies": "0.9.1",
"eslint": "^9.28.0",
"prettier": "^3.5.3",
"typescript": "^5.8.3"

View File

@@ -34,8 +34,8 @@
"react": "19.1.0",
"react-dom": "19.1.0",
"undici": "7.10.0",
"zod": "^3.25.55",
"zod-validation-error": "^3.4.1"
"zod": "^3.25.64",
"zod-validation-error": "^3.5.0"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -1,10 +1,10 @@
import { EVERY_5_SECONDS } from "@homarr/cron-jobs-core/expressions";
import { EVERY_MINUTE } from "@homarr/cron-jobs-core/expressions";
import { dnsHoleRequestHandler } from "@homarr/request-handler/dns-hole";
import { createRequestIntegrationJobHandler } from "@homarr/request-handler/lib/cached-request-integration-job-handler";
import { createCronJob } from "../../lib";
export const dnsHoleJob = createCronJob("dnsHole", EVERY_5_SECONDS).withCallback(
export const dnsHoleJob = createCronJob("dnsHole", EVERY_MINUTE).withCallback(
createRequestIntegrationJobHandler(dnsHoleRequestHandler.handler, {
widgetKinds: ["dnsHoleSummary", "dnsHoleControls"],
getInput: {

View File

@@ -1,6 +1,6 @@
import SuperJSON from "superjson";
import { EVERY_5_MINUTES } from "@homarr/cron-jobs-core/expressions";
import { EVERY_10_MINUTES } from "@homarr/cron-jobs-core/expressions";
import { db, eq } from "@homarr/db";
import { items } from "@homarr/db/schema";
import { logger } from "@homarr/log";
@@ -10,7 +10,7 @@ import { rssFeedsRequestHandler } from "@homarr/request-handler/rss-feeds";
import type { WidgetComponentProps } from "../../../widgets";
import { createCronJob } from "../lib";
export const rssFeedsJob = createCronJob("rssFeeds", EVERY_5_MINUTES).withCallback(async () => {
export const rssFeedsJob = createCronJob("rssFeeds", EVERY_10_MINUTES).withCallback(async () => {
const rssItems = await db.query.items.findMany({
where: eq(items.kind, "rssFeed"),
});

View File

@@ -44,9 +44,9 @@
"@homarr/env": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^8.0.2",
"@mantine/core": "^8.1.0",
"@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.0.0",
"@testcontainers/mysql": "^11.0.3",
"better-sqlite3": "^11.10.0",
"dotenv": "^16.5.0",
"drizzle-kit": "^0.31.1",
@@ -63,7 +63,7 @@
"esbuild": "^0.25.5",
"eslint": "^9.28.0",
"prettier": "^3.5.3",
"tsx": "4.19.4",
"tsx": "4.20.3",
"typescript": "^5.8.3"
}
}

View File

@@ -24,15 +24,15 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/common": "workspace:^0.1.0",
"fast-xml-parser": "^5.2.4",
"zod": "^3.25.55"
"fast-xml-parser": "^5.2.5",
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.28.0",
"tsx": "4.19.4",
"tsx": "4.20.3",
"typescript": "^5.8.3"
}
}

View File

@@ -32,7 +32,7 @@
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/dockerode": "^3.3.39",
"@types/dockerode": "^3.3.40",
"eslint": "^9.28.0",
"typescript": "^5.8.3"
}

View File

@@ -23,8 +23,8 @@
},
"prettier": "@homarr/prettier-config",
"dependencies": {
"@t3-oss/env-nextjs": "^0.13.6",
"zod": "^3.25.55"
"@t3-oss/env-nextjs": "^0.13.8",
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -26,8 +26,8 @@
"@homarr/common": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/form": "^8.0.2",
"zod": "^3.25.55"
"@mantine/form": "^8.1.0",
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -29,9 +29,9 @@
"@homarr/notifications": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.0.2",
"@mantine/core": "^8.1.0",
"react": "19.1.0",
"zod": "^3.25.55"
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -44,7 +44,7 @@
"tsdav": "^2.1.4",
"undici": "7.10.0",
"xml2js": "^0.6.2",
"zod": "^3.25.55"
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -77,6 +77,7 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
protected async testingAsync({ fetchAsync }: IntegrationTestingInput): Promise<TestingResult> {
const sessionId = await this.getSessionAsync(fetchAsync);
await this.clearSessionAsync(sessionId, fetchAsync);
await this.sessionStore.clearAsync();
return { success: true };
}

View File

@@ -27,7 +27,7 @@
"ioredis": "5.6.1",
"superjson": "2.2.2",
"winston": "3.17.0",
"zod": "^3.25.55"
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -33,13 +33,13 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.0.2",
"@mantine/core": "^8.1.0",
"@tabler/icons-react": "^3.34.0",
"dayjs": "^1.11.13",
"next": "15.3.3",
"react": "19.1.0",
"react-dom": "19.1.0",
"zod": "^3.25.55"
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -24,8 +24,8 @@
"dependencies": {
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.0.2",
"@mantine/hooks": "^8.0.2",
"@mantine/core": "^8.1.0",
"@mantine/hooks": "^8.1.0",
"react": "19.1.0"
},
"devDependencies": {

View File

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

View File

@@ -37,14 +37,14 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.0.2",
"@mantine/hooks": "^8.0.2",
"@mantine/core": "^8.1.0",
"@mantine/hooks": "^8.1.0",
"adm-zip": "0.5.16",
"next": "15.3.3",
"react": "19.1.0",
"react-dom": "19.1.0",
"superjson": "2.2.2",
"zod": "^3.25.55",
"zod": "^3.25.64",
"zod-form-data": "^2.0.7"
},
"devDependencies": {

View File

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

View File

@@ -26,7 +26,7 @@
"@homarr/api": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/dates": "^8.0.2",
"@mantine/dates": "^8.1.0",
"next": "15.3.3",
"react": "19.1.0",
"react-dom": "19.1.0"

View File

@@ -33,9 +33,9 @@
"@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.0.2",
"@mantine/hooks": "^8.0.2",
"@mantine/spotlight": "^8.0.2",
"@mantine/core": "^8.1.0",
"@mantine/hooks": "^8.1.0",
"@mantine/spotlight": "^8.1.0",
"@tabler/icons-react": "^3.34.0",
"jotai": "^2.12.5",
"next": "15.3.3",

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -263,14 +263,14 @@
}
},
"removeImage": {
"label": "删除像",
"label": "删除像",
"confirm": "确定要移除这张图片吗?",
"notification": {
"success": {
"message": "图像删除成功"
},
"error": {
"message": "无法删除像"
"message": "无法删除像"
}
}
}
@@ -722,8 +722,8 @@
},
"statusCode": {
"title": "响应错误",
"description": "",
"otherDescription": "",
"description": "收到来自<url></url>的意外{statusCode} {reason}响应。请验证URL是否指向集成的基本URL。",
"otherDescription": "从<url></url>收到意外的{statusCode}响应。请验证URL是否指向集成的基本URL。",
"reason": {
"badRequest": "错误请求",
"notFound": "未找到",
@@ -752,7 +752,7 @@
},
"extract": {
"title": "CA证书提取失败",
"message": ""
"message": "只有自签署证书链可以自动获取。如果使用的是自签名证书请确保手动上传CA证书。您可以找到有关如何执行此操作的说明<docsLink></docsLink>。"
}
},
"action": {
@@ -760,70 +760,70 @@
"label": "重试创建"
},
"trust": {
"label": ""
"label": "信任证书"
},
"upload": {
"label": ""
"label": "上传证书"
}
},
"hostnameMismatch": {
"confirm": {
"title": "",
"message": ""
"title": "信任主机名不匹配",
"message": "您确定要信任主机名不匹配的证书吗?"
},
"notification": {
"success": {
"title": "",
"message": ""
"title": "可信证书",
"message": "将主机名添加到受信任证书列表中"
},
"error": {
"title": "",
"message": ""
"title": "信任证书失败",
"message": "主机名不匹配的证书不可信"
}
}
},
"selfSigned": {
"confirm": {
"title": "",
"message": ""
"title": "信任自签名证书",
"message": "您确定要信任此自签名证书吗?"
},
"notification": {
"success": {
"title": "",
"message": ""
"title": "可信证书",
"message": "已添加证书到可信证书列表"
},
"error": {
"title": "",
"message": ""
"title": "信任证书失败",
"message": "向受信任证书列表添加证书失败"
}
}
},
"details": {
"title": "",
"description": "",
"title": "详情",
"description": "在决定信任证书信息之前,请检查该证书信息。",
"content": {
"action": "",
"title": ""
"action": "显示内容",
"title": "PEM 证书"
}
}
},
"request": {
"title": "",
"title": "错误请求",
"description": {
"connection": {
"hostUnreachable": "",
"networkUnreachable": "",
"refused": "",
"reset": ""
"hostUnreachable": "无法连接到服务器。这通常意味着主机离线或无法从您的网络访问。",
"networkUnreachable": "网络不可达。请检查网络连接或网络配置。",
"refused": "服务器拒绝连接。它可能没有运行或正在拒绝指定端口上的请求。",
"reset": "服务器意外关闭了连接。如果服务器不稳定或重新启动,就会发生这种情况。"
},
"dns": {
"notFound": "",
"timeout": "",
"noAnswer": ""
"notFound": "找不到服务器地址。请检查URL是否有拼写错误或无效的域名。",
"timeout": "DNS查找超时。这可能是暂时的问题请稍后再试。",
"noAnswer": "DNS服务器没有返回有效的响应。域可能存在但没有有效记录。"
},
"timeout": {
"aborted": "",
"timeout": ""
"aborted": "请求在完成之前被中止。这可能是由于用户操作或系统超时造成的。",
"timeout": "请求耗时太长。请检查您的网络或稍后再试。"
}
}
}
@@ -895,8 +895,8 @@
"message": "该路径可能不正确"
},
"tooManyRequests": {
"title": "",
"message": ""
"title": "指定时间内请求过多",
"message": "请求太多了。您可能会受到速率限制或被目标系统拒绝"
}
}
},
@@ -1004,7 +1004,7 @@
"cancel": "取消",
"delete": "删除",
"discard": "Discard",
"close": "",
"close": "关闭",
"confirm": "确认",
"continue": "继续",
"previous": "上一步",
@@ -1220,7 +1220,7 @@
"label": "集成"
},
"title": {
"label": ""
"label": "标题"
},
"customCssClasses": {
"label": "自定义 CSS 类"
@@ -1758,7 +1758,7 @@
"label": "显示内存信息"
},
"showUptime": {
"label": ""
"label": "显示运行时间"
},
"fileSystem": {
"label": "显示文件系统信息"
@@ -1767,7 +1767,7 @@
"label": "默认标签"
},
"visibleClusterSections": {
"label": ""
"label": "可见集群部分"
},
"sectionIndicatorRequirement": {
"label": "部分指标要求"
@@ -1839,11 +1839,11 @@
}
},
"dockerContainers": {
"name": "",
"description": "",
"name": "Docker 状态",
"description": "您的容器状态 (这个小部件只能用管理员权限添加)",
"option": {},
"error": {
"internalServerError": ""
"internalServerError": "获取容器统计信息失败"
}
},
"common": {
@@ -1912,8 +1912,8 @@
"description": "显示媒体服务器上的当前流",
"option": {
"showOnlyPlaying": {
"label": "",
"description": ""
"label": "只显示当前正在播放",
"description": "禁用此功能对plex不起作用"
}
},
"items": {
@@ -1946,7 +1946,7 @@
"label": "显示标记为已完成的 Torrent 条目"
},
"showCompletedHttp": {
"label": ""
"label": "显示标记为已完成的杂项"
},
"activeTorrentThreshold": {
"label": "隐藏在此阈值下已完成的 Torrent (kiB/s)"
@@ -1961,8 +1961,8 @@
"label": "使用过滤器来计算比率"
},
"limitPerIntegration": {
"label": "",
"description": ""
"label": "限制每个集成的项目",
"description": "这将限制每个集成显示的项目数量,而不是全局项目"
}
},
"errors": {
@@ -2095,7 +2095,7 @@
"approved": "已批准",
"declined": "已拒绝",
"failed": "失败",
"completed": ""
"completed": "已完成"
},
"toBeDetermined": "待定"
},
@@ -2199,94 +2199,106 @@
}
},
"releases": {
"name": "",
"description": "",
"name": "发布",
"description": "显示特定版本正则表达式中当前版本的列表。",
"option": {
"newReleaseWithin": {
"label": "",
"description": ""
"label": "内部新版本",
"description": "使用示例1w1周10M10个月。支持单位类型h小时dwMy。留空不突出显示新版本。"
},
"staleReleaseWithin": {
"label": "",
"description": ""
"label": "内部过期发布",
"description": "使用示例1w1周10M10个月。支持单位类型h小时dwMy。留空不突出显示过时的版本。"
},
"showOnlyHighlighted": {
"label": "",
"description": ""
"label": "只显示高亮显示",
"description": "只显示新的或过时的版本。如上所述。"
},
"showDetails": {
"label": ""
"label": "展开详情"
},
"topReleases": {
"label": "",
"description": ""
"label": "热门发布",
"description": "要显示的最新版本的最大数量。零表示没有限制。"
},
"repositories": {
"label": "",
"label": "仓库",
"addRepository": {
"label": ""
"label": "添加仓库"
},
"importRepositories": {
"label": "从 Docker 导入",
"loading": "正在加载 docker 映像",
"noImagesFound": "没有找到 docker 映像",
"listFoundImages": "找到的映像列表",
"listAlreadyImportedImages": "已导入的映像列表",
"allImagesAlreadyImported": "所有映像已导入",
"onlyAdminCanImport": "只有管理员才能从 docker 导入"
},
"provider": {
"label": ""
"label": "提供者"
},
"identifier": {
"label": "",
"placeholder": ""
"label": "标识符",
"placeholder": "姓名或所有者名称"
},
"name": {
"label": ""
"label": "名称"
},
"versionFilter": {
"label": "",
"label": "版本过滤器",
"prefix": {
"label": ""
"label": "前缀"
},
"precision": {
"label": "",
"label": "精度",
"options": {
"none": ""
"none": ""
}
},
"suffix": {
"label": ""
"label": "后缀"
},
"regex": {
"label": ""
"label": "正则表达式"
}
},
"edit": {
"label": ""
"label": "编辑"
},
"editForm": {
"title": "",
"title": "编辑仓库",
"cancel": {
"label": ""
"label": "取消"
},
"confirm": {
"label": ""
"label": "确认"
}
},
"example": {
"label": ""
"importForm": {
"title": "从 Docker 导入"
},
"invalid": ""
"example": {
"label": "示例"
},
"invalid": "仓库定义无效,请检查值"
}
},
"not-found": "",
"pre-release": "",
"archived": "",
"forked": "",
"starsCount": "",
"forksCount": "",
"issuesCount": "",
"openProjectPage": "",
"openReleasePage": "",
"releaseDescription": "",
"created": "",
"not-found": "未找到",
"pre-release": "预发行",
"archived": "已归档",
"forked": "复刻成功",
"starsCount": "",
"forksCount": "复刻",
"issuesCount": "打开问题",
"openProjectPage": "打开项目页面",
"openReleasePage": "打开发布页面",
"releaseDescription": "发布说明",
"created": "已创建",
"error": {
"label": "",
"label": "错误",
"options": {
"noMatchingVersion": ""
"noMatchingVersion": "没有找到匹配的版本"
}
}
},
@@ -2294,56 +2306,56 @@
"option": {},
"card": {
"vpn": {
"countConnected": ""
"countConnected": "{count} 已连接"
}
},
"error": {
"integrationsDisconnected": "",
"unknownContentOption": ""
"integrationsDisconnected": "没有可用的数据,所有集成已断开",
"unknownContentOption": "网络控制器摘要小部件的未知内容选项: "
},
"name": "",
"description": ""
"name": "网络控制器概述",
"description": "显示网络控制器摘要(如Unifi Controller)"
},
"networkControllerStatus": {
"card": {
"variants": {
"wired": {
"name": ""
"name": "有线"
},
"wifi": {
"name": ""
"name": "Wi-Fi"
}
},
"users": {
"label": ""
"label": "用户数"
},
"guests": {
"label": ""
"label": "游客"
}
},
"option": {
"content": {
"option": {
"wifi": {
"label": ""
"label": "Wi-Fi"
},
"wired": {
"label": ""
"label": "有线"
}
},
"label": ""
"label": "小部件内容"
}
},
"error": {
"integrationsDisconnected": "",
"unknownContentOption": ""
"integrationsDisconnected": "没有可用的数据,所有集成已断开",
"unknownContentOption": "网络状态小部件的未知内容选项: "
},
"name": "",
"description": ""
"name": "网络状态",
"description": "在网络上显示已连接的设备"
},
"networkController": {
"error": {
"internalServerError": ""
"internalServerError": "获取网络控制器概述失败"
}
}
},
@@ -2466,10 +2478,10 @@
},
"backgroundImageUrl": {
"label": "背景图片 URL",
"placeholder": "",
"placeholder": "开始输入以搜索本地映像",
"group": {
"your": "你的像",
"other": ""
"your": "你的像",
"other": "其他映像"
}
},
"backgroundImageAttachment": {
@@ -3111,7 +3123,7 @@
"label": "网络控制器"
},
"dockerContainers": {
"label": ""
"label": "Docker 容器"
}
}
},
@@ -3177,7 +3189,7 @@
"updated": "已更新 {when}",
"search": "搜索 {count} 容器",
"selected": "{totalCount} 容器的 {selectCount}",
"footer": ""
"footer": "总计 {count} 容器"
},
"field": {
"name": {
@@ -3197,10 +3209,10 @@
},
"stats": {
"cpu": {
"label": ""
"label": "CPU"
},
"memory": {
"label": ""
"label": "内存"
}
},
"containerImage": {
@@ -3211,7 +3223,7 @@
}
},
"action": {
"title": "",
"title": "操作",
"start": {
"label": "开始",
"notification": {
@@ -3656,7 +3668,7 @@
"certificates": {
"label": "证书",
"hostnames": {
"label": ""
"label": "主机名"
}
}
},
@@ -4057,25 +4069,25 @@
"certificate": {
"field": {
"hostname": {
"label": ""
"label": "主机名"
},
"subject": {
"label": ""
"label": "主题"
},
"issuer": {
"label": ""
"label": "发行者"
},
"validFrom": {
"label": ""
"label": "有效期自"
},
"validTo": {
"label": ""
"label": "有效期至"
},
"serialNumber": {
"label": ""
"label": "序号"
},
"fingerprint": {
"label": ""
"label": "指纹"
}
},
"page": {
@@ -4086,19 +4098,19 @@
"title": "还没有证书"
},
"invalid": {
"title": "",
"description": ""
"title": "无效证书",
"description": "解析证书失败"
},
"expires": "到期时间 {when}",
"toHostnames": ""
"toHostnames": "信任的主机名"
},
"hostnames": {
"title": "",
"description": "",
"title": "信任的证书主机名",
"description": "某些证书不允许指定域名使用 Homarr 请求他们, 由于这个原因,所有信任的主机名及其证书缩略图都被用来绕过这些限制。",
"noResults": {
"title": ""
"title": "还没有主机名"
},
"toCertificates": ""
"toCertificates": "证书"
}
},
"action": {
@@ -4130,16 +4142,16 @@
}
},
"removeHostname": {
"label": "",
"confirm": "",
"label": "删除受信任的主机名",
"confirm": "您确定要删除此受信任的主机名吗?这可能会导致一些集成停止工作。",
"notification": {
"success": {
"title": "",
"message": ""
"title": "主机名已删除",
"message": "主机名已成功删除"
},
"error": {
"title": "",
"message": ""
"title": "主机名未删除",
"message": "无法删除主机名"
}
}
}

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": "Tilføj repository"
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": "Udbyder"
},
@@ -2266,6 +2275,9 @@
"label": "Bekræft"
}
},
"importForm": {
"title": ""
},
"example": {
"label": "Eksempel"
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": "Repository hinzufügen"
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": "Anbieter"
},
@@ -2266,6 +2275,9 @@
"label": "Bestätigen"
}
},
"importForm": {
"title": ""
},
"example": {
"label": "Beispiel"
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": "הוסף מאגר"
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": "ספק"
},
@@ -2266,6 +2275,9 @@
"label": "אשר"
}
},
"importForm": {
"title": ""
},
"example": {
"label": "דוגמא"
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

File diff suppressed because it is too large Load Diff

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": "Depo Ekle"
},
"importRepositories": {
"label": "Docker'dan içe aktar",
"loading": "Docker imajları yükleniyor",
"noImagesFound": "Hiç docker imajı bulunamadı",
"listFoundImages": "Bulunan imajların listesi",
"listAlreadyImportedImages": "Daha önce içe aktarılan imajların listesi",
"allImagesAlreadyImported": "Tüm imajlar daha önce içe aktarıldı",
"onlyAdminCanImport": "Sadece yöneticiler docker'dan içe aktarabilir"
},
"provider": {
"label": "Sağlayıcı"
},
@@ -2266,6 +2275,9 @@
"label": "Onayla"
}
},
"importForm": {
"title": "Docker'dan içe aktar"
},
"example": {
"label": "Örnek"
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": ""
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": ""
},
@@ -2266,6 +2275,9 @@
"label": ""
}
},
"importForm": {
"title": ""
},
"example": {
"label": ""
},

View File

@@ -2226,6 +2226,15 @@
"addRepository": {
"label": "新增儲存庫"
},
"importRepositories": {
"label": "",
"loading": "",
"noImagesFound": "",
"listFoundImages": "",
"listAlreadyImportedImages": "",
"allImagesAlreadyImported": "",
"onlyAdminCanImport": ""
},
"provider": {
"label": "提供者"
},
@@ -2266,6 +2275,9 @@
"label": "確認"
}
},
"importForm": {
"title": ""
},
"example": {
"label": "範例"
},

View File

@@ -29,9 +29,9 @@
"@homarr/log": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.0.2",
"@mantine/dates": "^8.0.2",
"@mantine/hooks": "^8.0.2",
"@mantine/core": "^8.1.0",
"@mantine/dates": "^8.1.0",
"@mantine/hooks": "^8.1.0",
"@tabler/icons-react": "^3.34.0",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.3.3",

View File

@@ -24,7 +24,7 @@
"dependencies": {
"@homarr/definitions": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"zod": "^3.25.55",
"zod": "^3.25.64",
"zod-form-data": "^2.0.7"
},
"devDependencies": {

View File

@@ -48,9 +48,9 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/charts": "^8.0.2",
"@mantine/core": "^8.0.2",
"@mantine/hooks": "^8.0.2",
"@mantine/charts": "^8.1.0",
"@mantine/core": "^8.1.0",
"@mantine/hooks": "^8.1.0",
"@tabler/icons-react": "^3.34.0",
"@tiptap/extension-color": "2.14.0",
"@tiptap/extension-highlight": "2.14.0",
@@ -76,7 +76,7 @@
"react-markdown": "^10.1.0",
"recharts": "^2.15.3",
"video.js": "^8.23.3",
"zod": "^3.25.55"
"zod": "^3.25.64"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

1438
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -24,7 +24,7 @@
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
"typescript-eslint": "^8.33.1"
"typescript-eslint": "^8.34.0"
},
"devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0",