chore(release): automatic release v1.34.0

This commit is contained in:
homarr-releases[bot]
2025-08-22 19:14:51 +00:00
committed by GitHub
78 changed files with 3828 additions and 1318 deletions

View File

@@ -31,6 +31,9 @@ body:
label: Version
description: What version of Homarr are you running?
options:
# The below comment is used to insert a new version with on-release.yml
#NEXT_VERSION#
- 1.33.0
- 1.32.0
- 1.31.0
- 1.30.1

View File

@@ -14,6 +14,6 @@ jobs:
validate-pull-request-title:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
- uses: amannn/action-semantic-pull-request@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

82
.github/workflows/on-release.yml vendored Normal file
View File

@@ -0,0 +1,82 @@
permissions: {}
on:
release:
types: [published]
jobs:
trigger-docs-release:
name: Trigger Documentation Release
runs-on: ubuntu-latest
steps:
- name: Obtain token
id: obtainToken
uses: tibdex/github-app-token@v2
with:
private_key: ${{ secrets.HOMARR_DOCS_RELEASE_APP_PRIVATE_KEY }}
app_id: ${{ vars.HOMARR_DOCS_RELEASE_APP_ID }}
installation_retrieval_mode: repository
installation_retrieval_payload: homarr-labs/documentation
- name: Trigger documentation release
env:
GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }}
SOURCE_TAG: ${{ github.event.release.tag_name }}
run: |
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/repos/homarr-labs/documentation/dispatches \
-d @- <<EOF
{
"event_type": "trigger-release",
"client_payload": {
"tag": "${SOURCE_TAG}"
}
}
EOF
update-bug-report-template:
name: Update Bug Report Template
runs-on: ubuntu-latest
steps:
- name: Obtain token
id: obtainToken
uses: tibdex/github-app-token@v2
with:
private_key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }}
app_id: ${{ secrets.RENOVATE_MERGE_APP_ID }}
- name: Checkout code
uses: actions/checkout@v5
with:
token: ${{ steps.obtainToken.outputs.token }}
- name: Setup
uses: ./tooling/github/setup
- run: pnpm run scripts:update-bug-report-template
env:
NEXT_VERSION: ${{ github.event.release.tag_name }}
- name: Commit changes
run: |
git config --global user.email "175486441+homarr-releases[bot]@users.noreply.github.com"
git config --global user.name "Releases Homarr"
git add .
git commit -m "chore: update bug report template"
- name: Create Pull Request
id: create-pull-request
uses: peter-evans/create-pull-request@v7
with:
token: ${{ steps.obtainToken.outputs.token }}
branch: update-bug-report-template
base: dev
title: "chore: update bug report template"
delete-branch: true
body: |
This PR automatically updates the bug report template of Homarr in the .github/ISSUE_TEMPLATE/bug_report.yml
- name: Install GitHub CLI
run: sudo apt-get install -y gh
- name: Enable auto-merge
env:
GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }}
run: |
gh pr merge ${{steps.create-pull-request.outputs.pull-request-number}} --auto --squash

View File

@@ -1,18 +1,18 @@
# Security Policy
This policy is relevant if you found potential vulnerabilities in an audit.
We consider something as a vulnerability if it...
1. puts users or user data at risk
2. enables third parties to gain control or access (e.g. [RATs](https://en.wikipedia.org/wiki/Remote_desktop_software#RAT), [privilege escalation](https://en.wikipedia.org/wiki/Privilege_escalation), ...)
3. abuses the system in an unintended way (e.g. crypto mining, proxy, ...)
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| >1.0.0 | :white_check_mark: |
| <1.0.0 | :x: |
We only fix security issues in the [latest stable version](https://github.com/homarr-labs/homarr/releases/latest). Meaning security issues in prior versions will not be fixed and users have to upgrade to the latest version to receive them.
## Reporting a Vulnerability
We use [GitHub's system for reporting vulnerabilities](https://docs.github.com/en/enterprise-cloud@latest/code-security/security-advisories/working-with-repository-security-advisories/creating-a-repository-security-advisory).
Click [**here to report an advisory**](https://github.com/homarr-labs/homarr/security/advisories/new). Our team will get notified and will get back to you within 1-6 business days.

View File

@@ -50,17 +50,17 @@
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^8.2.4",
"@mantine/core": "^8.2.4",
"@mantine/dropzone": "^8.2.4",
"@mantine/hooks": "^8.2.4",
"@mantine/modals": "^8.2.4",
"@mantine/tiptap": "^8.2.4",
"@mantine/colors-generator": "^8.2.5",
"@mantine/core": "^8.2.5",
"@mantine/dropzone": "^8.2.5",
"@mantine/hooks": "^8.2.5",
"@mantine/modals": "^8.2.5",
"@mantine/tiptap": "^8.2.5",
"@million/lint": "1.0.14",
"@tabler/icons-react": "^3.34.1",
"@tanstack/react-query": "^5.85.3",
"@tanstack/react-query-devtools": "^5.85.3",
"@tanstack/react-query-next-experimental": "^5.85.3",
"@tanstack/react-query": "^5.85.5",
"@tanstack/react-query-devtools": "^5.85.5",
"@tanstack/react-query-next-experimental": "^5.85.5",
"@trpc/client": "^11.4.4",
"@trpc/next": "^11.4.4",
"@trpc/react-query": "^11.4.4",
@@ -76,7 +76,7 @@
"glob": "^11.0.3",
"jotai": "^2.13.1",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.4.6",
"next": "15.5.0",
"postcss-preset-mantine": "^1.18.0",
"prismjs": "^1.30.0",
"react": "19.1.1",
@@ -87,7 +87,7 @@
"superjson": "2.2.2",
"swagger-ui-react": "^5.27.1",
"use-deep-compare-effect": "^1.8.1",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -1,3 +1,4 @@
import { Fragment } from "react";
import Link from "next/link";
import { redirect } from "next/navigation";
import { ActionIcon, ActionIconGroup, Anchor, Avatar, Card, Group, Stack, Text, Title } from "@mantine/core";
@@ -98,7 +99,12 @@ const AppCard = async ({ app }: AppCardProps) => {
</Text>
{app.description && (
<Text size="sm" c="gray.6" lineClamp={4}>
{app.description}
{app.description.split("\n").map((line, index) => (
<Fragment key={index}>
{line}
<br />
</Fragment>
))}
</Text>
)}
{app.href && (

View File

@@ -39,7 +39,7 @@
"dotenv": "^17.2.1",
"fastify": "^5.5.0",
"superjson": "2.2.2",
"undici": "7.13.0"
"undici": "7.14.0"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -22,13 +22,14 @@
"lint:ws": "pnpm dlx sherif@latest",
"package:new": "turbo gen init",
"release": "semantic-release",
"scripts:update-bug-report-template": "tsx ./scripts/update-bug-report-template.mts",
"scripts:update-readme-integrations": "tsx ./scripts/update-integration-list.mts",
"start": "concurrently \"pnpm with-env node apps/tasks/tasks.cjs\" \"pnpm with-env node apps/websocket/wssServer.cjs\" \"pnpm -F nextjs start\"",
"test": "cross-env NODE_ENV=development CI=true vitest run --exclude e2e --coverage.enabled ",
"test:e2e": "cross-env NODE_ENV=development CI=true vitest e2e",
"test:ui": "cross-env NODE_ENV=development CI=true vitest --exclude e2e --ui --coverage.enabled",
"typecheck": "turbo typecheck",
"with-env": "dotenv -e .env --",
"scripts:update-readme-integrations": "tsx ./scripts/update-integration-list.mts"
"with-env": "dotenv -e .env --"
},
"prettier": "@homarr/prettier-config",
"devDependencies": {
@@ -41,7 +42,7 @@
"@semantic-release/release-notes-generator": "^14.0.3",
"@testcontainers/redis": "^11.5.1",
"@turbo/gen": "^2.5.6",
"@vitejs/plugin-react": "^5.0.0",
"@vitejs/plugin-react": "^5.0.1",
"@vitest/coverage-v8": "^3.2.4",
"@vitest/ui": "^3.2.4",
"conventional-changelog-conventionalcommits": "^9.1.0",
@@ -55,7 +56,7 @@
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4"
},
"packageManager": "pnpm@10.14.0",
"packageManager": "pnpm@10.15.0",
"engines": {
"node": ">=22.18.0"
},
@@ -72,7 +73,7 @@
"tree-sitter-json"
],
"overrides": {
"proxmox-api>undici": "7.13.0"
"proxmox-api>undici": "7.14.0"
},
"patchedDependencies": {
"@types/node-unifi": "patches/@types__node-unifi.patch"

View File

@@ -42,18 +42,18 @@
"@homarr/server-settings": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.3.0",
"@tanstack/react-query": "^5.85.3",
"@tanstack/react-query": "^5.85.5",
"@trpc/client": "^11.4.4",
"@trpc/react-query": "^11.4.4",
"@trpc/server": "^11.4.4",
"@trpc/tanstack-react-query": "^11.4.4",
"lodash.clonedeep": "^4.5.0",
"next": "15.4.6",
"next": "15.5.0",
"react": "19.1.1",
"react-dom": "19.1.1",
"superjson": "2.2.2",
"trpc-to-openapi": "^3.0.0",
"zod": "^4.0.14"
"trpc-to-openapi": "^3.0.1",
"zod": "^4.0.17"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -35,11 +35,11 @@
"bcrypt": "^6.0.0",
"cookies": "^0.9.1",
"ldapts": "8.0.9",
"next": "15.4.6",
"next": "15.5.0",
"next-auth": "5.0.0-beta.29",
"react": "19.1.1",
"react-dom": "19.1.1",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -24,7 +24,7 @@
"dependencies": {
"@homarr/common": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0",
"undici": "7.13.0"
"undici": "7.14.0"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -30,12 +30,12 @@
"@homarr/log": "workspace:^0.1.0",
"@paralleldrive/cuid2": "^2.2.2",
"dayjs": "^1.11.13",
"next": "15.4.6",
"next": "15.5.0",
"react": "19.1.1",
"react-dom": "19.1.1",
"undici": "7.13.0",
"zod": "^4.0.14",
"zod-validation-error": "^3.5.3"
"undici": "7.14.0",
"zod": "^4.0.17",
"zod-validation-error": "^4.0.1"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -0,0 +1,44 @@
import { FetchError } from "node-fetch";
import { logger } from "@homarr/log";
import { RequestError } from "../request-error";
import type { AnyRequestError } from "../request-error";
import type { ResponseError } from "../response-error";
import { matchErrorCode } from "./fetch-http-error-handler";
import { HttpErrorHandler } from "./http-error-handler";
/**
* node-fetch was a defacto standard to use fetch in nodejs.
*
* It is for example used within the cross-fetch package which is used in tsdav.
*/
export class NodeFetchHttpErrorHandler extends HttpErrorHandler {
constructor(private type = "node-fetch") {
super();
}
handleRequestError(error: unknown): AnyRequestError | undefined {
if (!(error instanceof FetchError)) return undefined;
if (error.code === undefined) return undefined;
logger.debug(`Received ${this.type} request error`, {
code: error.code,
message: error.message,
});
const requestErrorInput = matchErrorCode(error.code);
if (!requestErrorInput) return undefined;
return new RequestError(requestErrorInput, {
cause: error,
});
}
/**
* Response errors do not exist for fetch as it does not throw errors for non successful responses.
*/
handleResponseError(_: unknown): ResponseError | undefined {
return undefined;
}
}

View File

@@ -2,12 +2,12 @@ import { logger } from "@homarr/log";
import type { AnyRequestError } from "../request-error";
import { ResponseError } from "../response-error";
import { FetchHttpErrorHandler } from "./fetch-http-error-handler";
import { HttpErrorHandler } from "./http-error-handler";
import { NodeFetchHttpErrorHandler } from "./node-fetch-http-error-handler";
export class TsdavHttpErrorHandler extends HttpErrorHandler {
handleRequestError(error: unknown): AnyRequestError | undefined {
return new FetchHttpErrorHandler("tsdav").handleRequestError(error);
return new NodeFetchHttpErrorHandler("tsdav").handleRequestError(error);
}
handleResponseError(error: unknown): ResponseError | undefined {
@@ -16,7 +16,7 @@ export class TsdavHttpErrorHandler extends HttpErrorHandler {
// https://github.com/natelindev/tsdav/blob/bf33f04b1884694d685ee6f2b43fe9354b12d167/src/account.ts#L86
if (error.message !== "Invalid credentials") return undefined;
logger.debug("Received Tsdav response error", {
logger.debug("Received tsdav response error", {
status: 401,
});

View File

@@ -26,7 +26,7 @@
"dependencies": {
"@t3-oss/env-nextjs": "^0.13.8",
"ioredis": "5.7.0",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -29,13 +29,13 @@
"@homarr/core": "workspace:^0.1.0",
"@homarr/cron-jobs": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0",
"@tanstack/react-query": "^5.85.3",
"@tanstack/react-query": "^5.85.5",
"@trpc/client": "^11.4.4",
"@trpc/server": "^11.4.4",
"@trpc/tanstack-react-query": "^11.4.4",
"node-cron": "^4.2.1",
"react": "19.1.1",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -44,14 +44,14 @@
"@homarr/definitions": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^8.2.4",
"@mantine/core": "^8.2.5",
"@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.5.1",
"better-sqlite3": "^12.2.0",
"dotenv": "^17.2.1",
"drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.4",
"drizzle-zod": "^0.8.2",
"drizzle-zod": "^0.8.3",
"mysql2": "3.14.3",
"superjson": "2.2.2"
},

View File

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

View File

@@ -26,9 +26,9 @@
"@homarr/common": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/form": "^8.2.4",
"mantine-form-zod-resolver": "^1.2.1",
"zod": "^4.0.14"
"@mantine/form": "^8.2.5",
"mantine-form-zod-resolver": "^1.3.0",
"zod": "^4.0.17"
},
"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.2.4",
"@mantine/core": "^8.2.5",
"react": "19.1.1",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -97,7 +97,13 @@ export const AppForm = ({
<Stack>
<TextInput {...form.getInputProps("name")} withAsterisk label={t("app.field.name.label")} />
<IconPicker {...form.getInputProps("iconUrl")} />
<Textarea {...form.getInputProps("description")} label={t("app.field.description.label")} />
<Textarea
{...form.getInputProps("description")}
label={t("app.field.description.label")}
autosize
minRows={2}
resize="vertical"
/>
<TextInput {...form.getInputProps("href")} label={t("app.field.url.label")} />
<Checkbox

View File

@@ -45,9 +45,9 @@
"octokit": "^5.0.3",
"proxmox-api": "1.1.1",
"tsdav": "^2.1.5",
"undici": "7.13.0",
"undici": "7.14.0",
"xml2js": "^0.6.2",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -1,8 +1,9 @@
import type { Agent } from "https";
import type { RequestInit as NodeFetchRequestInit } from "node-fetch";
import * as ical from "node-ical";
import { DAVClient } from "tsdav";
import type { Dispatcher, RequestInit as UndiciFetchRequestInit } from "undici";
import { createCertificateAgentAsync } from "@homarr/certificates/server";
import { createHttpsAgentAsync } from "@homarr/certificates/server";
import { logger } from "@homarr/log";
import { HandleIntegrationErrors } from "../base/errors/decorator";
@@ -16,7 +17,7 @@ import type { CalendarEvent } from "../interfaces/calendar/calendar-types";
@HandleIntegrationErrors([integrationTsdavHttpErrorHandler])
export class NextcloudIntegration extends Integration implements ICalendarIntegration {
protected async testingAsync(input: IntegrationTestingInput): Promise<TestingResult> {
const client = await this.createCalendarClientAsync(input.dispatcher);
const client = await this.createCalendarClientAsync(await createHttpsAgentAsync(input.options));
await client.login();
return { success: true };
@@ -80,7 +81,7 @@ export class NextcloudIntegration extends Integration implements ICalendarIntegr
});
}
private async createCalendarClientAsync(dispatcher?: Dispatcher) {
private async createCalendarClientAsync(agent?: Agent) {
return new DAVClient({
serverUrl: this.integration.url,
credentials: {
@@ -90,9 +91,10 @@ export class NextcloudIntegration extends Integration implements ICalendarIntegr
authMethod: "Basic",
defaultAccountType: "caldav",
fetchOptions: {
// We can use the undici options as the global fetch is used instead of the polyfilled.
dispatcher: dispatcher ?? (await createCertificateAgentAsync()),
} satisfies UndiciFetchRequestInit as RequestInit,
// tsdav is using cross-fetch which uses node-fetch for nodejs environments.
// There is an agent property that is the same type as the http(s) agents of nodejs
agent: agent ?? (await createHttpsAgentAsync()),
} satisfies NodeFetchRequestInit as RequestInit,
});
}
}

View File

@@ -27,7 +27,7 @@
"@homarr/core": "workspace:^0.1.0",
"superjson": "2.2.2",
"winston": "3.17.0",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"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.2.4",
"@mantine/core": "^8.2.5",
"@tabler/icons-react": "^3.34.1",
"dayjs": "^1.11.13",
"next": "15.4.6",
"next": "15.5.0",
"react": "19.1.1",
"react-dom": "19.1.1",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"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.2.4",
"@mantine/hooks": "^8.2.4",
"@mantine/core": "^8.2.5",
"@mantine/hooks": "^8.2.5",
"react": "19.1.1"
},
"devDependencies": {

View File

@@ -24,7 +24,7 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/ui": "workspace:^0.1.0",
"@mantine/notifications": "^8.2.4",
"@mantine/notifications": "^8.2.5",
"@tabler/icons-react": "^3.34.1"
},
"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.2.4",
"@mantine/hooks": "^8.2.4",
"@mantine/core": "^8.2.5",
"@mantine/hooks": "^8.2.5",
"adm-zip": "0.5.16",
"next": "15.4.6",
"next": "15.5.0",
"react": "19.1.1",
"react-dom": "19.1.1",
"superjson": "2.2.2",
"zod": "^4.0.14",
"zod": "^4.0.17",
"zod-form-data": "^3.0.0"
},
"devDependencies": {

View File

@@ -39,6 +39,7 @@ export const mapApp = (
pingEnabled: app.network.enabledStatusChecker,
showDescriptionTooltip: app.behaviour.tooltipDescription !== "",
showTitle: app.appearance.appNameStatus === "normal",
layout: app.appearance.positionAppName,
} satisfies WidgetComponentProps<"app">["options"]),
layouts: boardSizes.map((size) => {
const shapeForSize = app.shape[size];

View File

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

View File

@@ -32,7 +32,7 @@
"dayjs": "^1.11.13",
"octokit": "^5.0.3",
"superjson": "2.2.2",
"undici": "7.13.0"
"undici": "7.14.0"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -26,8 +26,8 @@
"@homarr/api": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/dates": "^8.2.4",
"next": "15.4.6",
"@mantine/dates": "^8.2.5",
"next": "15.5.0",
"react": "19.1.1",
"react-dom": "19.1.1"
},

View File

@@ -33,12 +33,12 @@
"@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.2.4",
"@mantine/hooks": "^8.2.4",
"@mantine/spotlight": "^8.2.4",
"@mantine/core": "^8.2.5",
"@mantine/hooks": "^8.2.5",
"@mantine/spotlight": "^8.2.5",
"@tabler/icons-react": "^3.34.1",
"jotai": "^2.13.1",
"next": "15.4.6",
"next": "15.5.0",
"react": "19.1.1",
"react-dom": "19.1.1",
"use-deep-compare-effect": "^1.8.1"

View File

@@ -32,7 +32,7 @@
"dayjs": "^1.11.13",
"deepmerge": "4.3.1",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.4.6",
"next": "15.5.0",
"next-intl": "4.3.4",
"react": "19.1.1",
"react-dom": "19.1.1"

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "测试版",
"error": "错误",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "启用状态检查"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "每 {interval, plural, =1 {分钟} other {# 分钟}}",
"hours": "每 {interval, plural, =1 {小时} other {# 小时}}",
"midnight": "每日午夜",
"weeklyMonday": "每周一"
"weeklyMonday": "每周一",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": "{jobName} 任务设置"
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": "计划时间间隔"
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "工具",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Beta",
"error": "Chyba",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Nástroje",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Beta",
"error": "Fejl",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Aktiver statustjek"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "Hvert {interval, plural, one {}=1 {minut} other {# minutter}}",
"hours": "Hvert {interval, plural, one {}=1 {time} other {# timer}}",
"midnight": "Hver dag ved midnat",
"weeklyMonday": "Hver uge om mandagen"
"weeklyMonday": "Hver uge om mandagen",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": "Opgave indstillinger for {jobName}"
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": "Planlæg interval"
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Værktøjer",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Fehler",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Statusüberprüfung aktivieren"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Werkzeuge",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Beta",
"error": "Fehler",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Statusüberprüfung aktivieren"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "Jeweils {interval, plural, =1 {Minute} other {# Minuten}}",
"hours": "Jeweils {interval, plural, =1 {Stunde} other {# Stunden}}",
"midnight": "Jeden Tag um Mitternacht",
"weeklyMonday": "Jede Woche am Montag"
"weeklyMonday": "Jede Woche am Montag",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": "Einstellungen der Aufgabe für {jobName}"
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": "Intervall des Zeitplans"
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Werkzeuge",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Σφάλμα",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Εργαλεία",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Beta",
"error": "Alpha",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1271,6 +1271,15 @@
},
"pingEnabled": {
"label": "Enable status check"
},
"layout": {
"label": "Layout",
"option": {
"row": "Horizontal",
"row-reverse": "Horizontal (reversed)",
"column": "Vertical",
"column-reverse": "Vertical (reversed)"
}
}
},
"error": {

File diff suppressed because it is too large Load Diff

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Bêta",
"error": "Erreur",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Activer la vérification du statut"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "Chaque {interval, plural, one {}=1 {minute} other {# minutes}}",
"hours": "Chaque {interval, plural, one {}=1 {heure} other {# heures}}",
"midnight": "Chaque jour à minuit",
"weeklyMonday": "Chaque semaine le lundi"
"weeklyMonday": "Chaque semaine le lundi",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": "Paramètres de la tâche pour {jobName}"
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": "Intervalle de planification"
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Outils",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "בטא",
"error": "שגיאה",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "אפשר בדיקת מצב"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "כל {interval, plural, =1 {minute} other {# minutes}}",
"hours": "כל {interval, plural, =1 {hour} other {# hours}}",
"midnight": "כל יום בחצות",
"weeklyMonday": "כל שבוע ביום שני"
"weeklyMonday": "כל שבוע ביום שני",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": "הגדרות משימה עבור {jobName}"
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": "מרווח זמן לתזמון"
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "כלים",
"tasks": {
"label": ""
},
"docker": {
"label": "דוקר"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Pogreška",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Alati",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Béta",
"error": "Hiba",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Egyszerű ping engedélyezése"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Eszközök",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Errore",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Strumenti",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -946,12 +946,12 @@
"newLabel": "新規トピック"
},
"opnsenseApiKey": {
"label": "",
"newLabel": ""
"label": "API キー (キー)",
"newLabel": "新しいAPIキーキー"
},
"opnsenseApiSecret": {
"label": "",
"newLabel": ""
"label": "API キー (シークレット)",
"newLabel": "新しい API キー (シークレット)"
}
}
},
@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "成功",
"beta": "Beta",
"error": "エラー",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "ステータスチェックを有効にする"
},
"layout": {
"label": "レイアウト",
"option": {
"row": "水平方向",
"row-reverse": "水平方向(反転)",
"column": "垂直方向",
"column-reverse": "垂直方向(反転)"
}
}
},
"error": {
@@ -2266,7 +2276,7 @@
"label": "詳細を表示"
},
"showOnlyIcon": {
"label": ""
"label": "アイコンのみ表示"
},
"topReleases": {
"label": "トップリリース",
@@ -2285,8 +2295,8 @@
"listAlreadyImportedImages": "すでにインポートされたイメージのリスト",
"allImagesAlreadyImported": "すでにインポートされた全てのイメージ",
"onlyAdminCanImport": "管理者のみが Docker からインポートできます",
"selectAll": "",
"deselectAll": ""
"selectAll": "すべてを選択",
"deselectAll": "選択をすべて解除"
},
"provider": {
"label": "プロバイダー"
@@ -2348,7 +2358,7 @@
"starsCount": "スター数",
"forksCount": "フォーク数",
"issuesCount": "未解決の課題数",
"markViewed": "",
"markViewed": "閲覧済みにする",
"openProjectPage": "プロジェクトページを開く",
"openReleasePage": "リリースページを開く",
"releaseDescription": "リリースの説明",
@@ -2422,31 +2432,31 @@
}
},
"firewall": {
"name": "",
"description": "",
"name": "ファイアウォールの監視",
"description": "ファイアウォールの概要を表示する",
"tab": {
"system": "",
"interfaces": ""
"system": "システム",
"interfaces": "インターフェース"
},
"error": {
"internalServerError": ""
"internalServerError": "ファイアウォールからデータを取得できません"
},
"option": {
"interfaces": ""
"interfaces": "表示するネットワークインターフェイス"
},
"widget": {
"fwname": "",
"version": "",
"versiontitle": "",
"cputitle": "",
"memorytitle": "",
"cpu": "",
"memory": "",
"fwname": "名称",
"version": "バージョン",
"versiontitle": "バージョン",
"cputitle": "CPU 使用率",
"memorytitle": "メモリ使用率",
"cpu": "CPU",
"memory": "メモリ",
"interfaces": {
"name": "",
"trans": "",
"recv": "",
"title": ""
"name": "名称",
"trans": "送信",
"recv": "受信",
"title": "ネットワークインターフェース"
}
}
},
@@ -2457,15 +2467,15 @@
"option": {}
},
"systemResources": {
"name": "",
"description": "",
"name": "システムリソース",
"description": "CPU、メモリ、ディスクなどのシステムハードウェアの使用",
"option": {},
"card": {
"cpu": "",
"memory": "",
"network": "",
"up": "",
"down": ""
"cpu": "CPU",
"memory": "MEM",
"network": "NET",
"up": "UP",
"down": "DOWN"
}
}
},
@@ -3243,16 +3253,16 @@
"label": "Docker コンテナ"
},
"firewallCpu": {
"label": ""
"label": "ファイアウォールの CPU"
},
"firewallMemory": {
"label": ""
"label": "ファイアウォールのメモリ"
},
"firewallVersion": {
"label": ""
"label": "ファイアウォールのバージョン"
},
"firewallInterfaces": {
"label": ""
"label": "ファイアウォールのインターフェース"
}
},
"interval": {
@@ -3260,14 +3270,70 @@
"minutes": "{interval, plural, =1 {分} other {# 分}}周期",
"hours": "{interval, plural, =1 {時間} other {# 時間}}周期",
"midnight": "毎日深夜",
"weeklyMonday": "毎週月曜日"
"weeklyMonday": "毎週月曜日",
"update": {
"success": {
"message": "間隔が正常に更新されました"
},
"error": {
"message": "間隔の更新に失敗しました"
}
}
},
"settings": {
"title": "{jobName} の タスク設定"
},
"field": {
"name": {
"label": "名称"
},
"interval": {
"label": "スケジュール間隔"
},
"lastExecution": {
"label": "最終実行"
},
"actions": {
"label": "アクション"
}
},
"table": {
"search": "{count} のタスクを検索..."
},
"action": {
"refresh": {
"label": "更新"
}
},
"refresh": {
"success": {
"message": "タスクは正常に更新されました"
},
"error": {
"message": "タスクの更新に失敗しました"
}
},
"trigger": {
"success": {
"message": "タスクが正常にトリガーされました"
},
"error": {
"message": "タスクのトリガーに失敗しました"
}
},
"enable": {
"success": {
"message": "正常にタスクが有効になりました"
}
},
"disable": {
"success": {
"message": "正常にタスクが無効になりました"
}
},
"toggle": {
"error": {
"message": "タスクの状態の切り替えに失敗しました"
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "ツール",
"tasks": {
"label": "タスク"
},
"docker": {
"label": "Docker"
},

View File

@@ -2,40 +2,40 @@
"init": {
"step": {
"start": {
"title": "",
"subtitle": "",
"description": "",
"title": "Homarr에 오신 것을 환영합니다",
"subtitle": "Homarr 인스턴스 설정을 시작합니다.",
"description": "시작하기 전에, Homarr 인스턴스를 어떻게 설정할지 선택해주세요.",
"action": {
"scratch": "",
"importOldmarr": ""
"scratch": "처음부터 시작하기",
"importOldmarr": "1.0 이전의 Homarr에서 불러오기"
}
},
"import": {
"title": "",
"subtitle": "",
"title": "데이터 불러오기",
"subtitle": "기존 Homarr 인스턴스에서 데이터를 불러올 수 있습니다.",
"dropzone": {
"title": "",
"title": "zip 파일 드롭 또는 클릭해서 찾아보기",
"description": ""
},
"fileInfo": {
"action": {
"change": ""
"change": "파일 변경"
}
},
"importSettings": {
"title": "",
"title": "설정 불러오기",
"description": ""
},
"boardSelection": {
"title": "",
"title": "{count}개의 보드 찾음",
"description": "",
"action": {
"selectAll": "",
"unselectAll": ""
"selectAll": "모두 선택",
"unselectAll": "모두 선택 해제"
}
},
"summary": {
"title": "",
"title": "불러오기 요약",
"description": "",
"action": {
"import": ""
@@ -57,69 +57,69 @@
},
"notification": {
"error": {
"title": "",
"message": ""
"title": "유효하지 않은 토큰",
"message": "입력한 토큰이 유효하지 않습니다"
}
}
}
},
"user": {
"title": "",
"subtitle": "",
"title": "관리자",
"subtitle": "관리자의 계정 정보를 설정해주세요.",
"notification": {
"success": {
"title": "",
"message": ""
"title": "계정 생성됨",
"message": "계정이 성공적으로 생성되었습니다"
},
"error": {
"title": ""
"title": "계정 생성 실패"
}
}
},
"group": {
"title": "",
"title": "외부 그룹",
"subtitle": "",
"form": {
"name": {
"label": "",
"description": ""
"label": "그룹 이름",
"description": "이름은 외부 제공자의 관리자 그룹과 일치해야 합니다"
}
}
},
"settings": {
"title": "설정",
"subtitle": ""
"subtitle": "서버 설정하기."
},
"finish": {
"title": "",
"subtitle": "",
"description": "",
"title": "설정 완료",
"subtitle": "모든 준비가 끝났습니다!",
"description": "설정 과정을 성공적으로 완료했습니다. 이제 Homarr을 사용할 수 있습니다. 다음 작업을 선택해주세요:",
"action": {
"goToBoard": "",
"createBoard": "",
"inviteUser": "",
"docs": ""
"goToBoard": "{name} 보드로 가기",
"createBoard": "첫 번째 보드 만들기",
"inviteUser": "다른 사용자 초대하기",
"docs": "문서 읽기"
}
}
},
"backToStart": ""
"backToStart": "시작으로 돌아가기"
},
"user": {
"title": "사용자",
"name": "사용자",
"page": {
"login": {
"title": "",
"subtitle": ""
"title": "내 계정에 로그인",
"subtitle": "돌아오신 것을 환영합니다! 계정 정보를 입력해주세요"
},
"invite": {
"title": "",
"subtitle": "",
"description": ""
"title": "Homarr 참여하기",
"subtitle": "Homarr에 오신 것을 환영합니다! 계정을 생성해주세요",
"description": "{username}가 초대했습니다"
},
"init": {
"title": "",
"subtitle": ""
"title": "새로운 Homarr 설치",
"subtitle": "초기 관리자 계정을 생성해주세요"
}
},
"field": {
@@ -281,47 +281,47 @@
"message": ""
},
"error": {
"message": ""
"message": "프로필을 업데이트할 수 없습니다"
}
}
},
"delete": {
"label": "",
"label": "사용자 영원히 삭제",
"description": "",
"confirm": ""
},
"select": {
"label": "",
"notFound": ""
"label": "사용자 선택",
"notFound": "사용자 찾을 수 없음"
},
"transfer": {
"label": ""
"label": "새로운 소유자 선택하기"
}
}
},
"group": {
"title": "",
"name": "",
"search": "",
"title": "그룹",
"name": "그룹",
"search": "그룹 찾기",
"field": {
"name": "이름",
"members": "",
"members": "멤버",
"homeBoard": {
"label": "",
"label": "홈 보드",
"description": ""
},
"mobileBoard": {
"label": "",
"label": "모바일 보드",
"description": ""
}
},
"permission": {
"admin": {
"title": "",
"title": "관리자",
"item": {
"admin": {
"label": "",
"description": ""
"label": "관리자",
"description": "이 권한을 가진 멤버는 모든 기능과 설정에 대한 접근을 할 수 있습니다"
}
}
},
@@ -329,11 +329,11 @@
"title": "앱",
"item": {
"create": {
"label": "",
"description": ""
"label": "앱 만들기",
"description": "멤버가 앱을 만들 수 있도록 허락하기"
},
"use-all": {
"label": "",
"label": "모든 앱 사용",
"description": ""
},
"modify-all": {
@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "오류",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "도구",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Įrankiai",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Kļūda",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Rīki",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Beta",
"error": "Fout",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Statuscontrole inschakelen"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Gereedschappen",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Beta",
"error": "Feil",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Aktiver enkel ping"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Verktøy",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Wersja beta",
"error": "Błąd",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Włącz prosty ping"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Narzędzia",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Erro",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Ferramentas",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Eroare",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Unelte",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Бета",
"error": "Ошибка",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Включить простую проверку доступности"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Инструменты",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Beta",
"error": "Chyba",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Povoliť jednoduchý ping"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Nástroje",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Napaka",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Orodja",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Fel",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "Varje dag vid midnatt",
"weeklyMonday": "Varje vecka på måndag"
"weeklyMonday": "Varje vecka på måndag",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Verktyg",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "Başarılı",
"beta": "Test",
"error": "Hata",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "Durum denetimini etkinleştir"
},
"layout": {
"label": "Düzen",
"option": {
"row": "Yatay",
"row-reverse": "Yatay (ters)",
"column": "Dikey",
"column-reverse": "Dikey (ters)"
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "Her {interval, plural, =1 {dakika} other {# dakikada bir}}",
"hours": "Her {interval, plural, =1 {saat} other {# saatte bir}}",
"midnight": "Her gün gece yarısı",
"weeklyMonday": "Her hafta pazartesi günü"
"weeklyMonday": "Her hafta pazartesi günü",
"update": {
"success": {
"message": "Aralık başarıyla güncellendi"
},
"error": {
"message": "Aralık güncellenemedi"
}
}
},
"settings": {
"title": "{jobName} için görev ayarları"
},
"field": {
"name": {
"label": "İsim"
},
"interval": {
"label": "Zamanlama aralığı"
},
"lastExecution": {
"label": "Son Çalıştırma"
},
"actions": {
"label": "Eylemler"
}
},
"table": {
"search": "{count} görevi ara..."
},
"action": {
"refresh": {
"label": "Yenile"
}
},
"refresh": {
"success": {
"message": "Görevler başarıyla yenilendi"
},
"error": {
"message": "Görevler yenilenemedi"
}
},
"trigger": {
"success": {
"message": "Görev başarıyla tetiklendi"
},
"error": {
"message": "Görev tetiklenemedi"
}
},
"enable": {
"success": {
"message": "Görev başarıyla etkinleştirildi"
}
},
"disable": {
"success": {
"message": "Görev başarıyla devre dışı bırakıldı"
}
},
"toggle": {
"error": {
"message": "Görev durumu değiştirilemedi"
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Araçlar",
"tasks": {
"label": "Görevler"
},
"docker": {
"label": "Docker"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "Бета-версія",
"error": "Помилка",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Інструменти",
"tasks": {
"label": ""
},
"docker": {
"label": "Докер"
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "",
"error": "Lỗi",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "Công cụ",
"tasks": {
"label": ""
},
"docker": {
"label": ""
},

View File

@@ -1003,6 +1003,7 @@
}
},
"common": {
"success": "",
"beta": "測試版",
"error": "錯誤",
"action": {
@@ -1270,6 +1271,15 @@
},
"pingEnabled": {
"label": "啟用簡單的 Ping"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
}
},
"error": {
@@ -3260,14 +3270,70 @@
"minutes": "",
"hours": "",
"midnight": "",
"weeklyMonday": ""
"weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
},
"settings": {
"title": ""
},
"field": {
"name": {
"label": ""
},
"interval": {
"label": ""
},
"lastExecution": {
"label": ""
},
"actions": {
"label": ""
}
},
"table": {
"search": ""
},
"action": {
"refresh": {
"label": ""
}
},
"refresh": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"trigger": {
"success": {
"message": ""
},
"error": {
"message": ""
}
},
"enable": {
"success": {
"message": ""
}
},
"disable": {
"success": {
"message": ""
}
},
"toggle": {
"error": {
"message": ""
}
}
},
@@ -3776,6 +3842,9 @@
},
"tools": {
"label": "工具",
"tasks": {
"label": ""
},
"docker": {
"label": "Docker"
},

View File

@@ -30,12 +30,12 @@
"@homarr/log": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.2.4",
"@mantine/dates": "^8.2.4",
"@mantine/hooks": "^8.2.4",
"@mantine/core": "^8.2.5",
"@mantine/dates": "^8.2.5",
"@mantine/hooks": "^8.2.5",
"@tabler/icons-react": "^3.34.1",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.4.6",
"next": "15.5.0",
"react": "19.1.1",
"react-dom": "19.1.1",
"svgson": "^5.3.1"

View File

@@ -24,7 +24,7 @@
"dependencies": {
"@homarr/definitions": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"zod": "^4.0.14",
"zod": "^4.0.17",
"zod-form-data": "^3.0.0"
},
"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.2.4",
"@mantine/core": "^8.2.4",
"@mantine/hooks": "^8.2.4",
"@mantine/charts": "^8.2.5",
"@mantine/core": "^8.2.5",
"@mantine/hooks": "^8.2.5",
"@tabler/icons-react": "^3.34.1",
"@tiptap/extension-color": "2.26.1",
"@tiptap/extension-highlight": "2.26.1",
@@ -70,15 +70,15 @@
"@tiptap/starter-kit": "^2.26.1",
"clsx": "^2.1.1",
"dayjs": "^1.11.13",
"mantine-form-zod-resolver": "^1.2.1",
"mantine-form-zod-resolver": "^1.3.0",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.4.6",
"next": "15.5.0",
"react": "19.1.1",
"react-dom": "19.1.1",
"react-markdown": "^10.1.0",
"recharts": "^2.15.4",
"video.js": "^8.23.4",
"zod": "^4.0.14"
"zod": "^4.0.17"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -1,10 +1,12 @@
"use client";
import { Select } from "@mantine/core";
import { Group, Select } from "@mantine/core";
import { IconCheck } from "@tabler/icons-react";
import { translateIfNecessary } from "@homarr/translation";
import type { stringOrTranslation } from "@homarr/translation";
import { useI18n } from "@homarr/translation/client";
import type { TablerIcon } from "@homarr/ui";
import type { CommonWidgetInputProps } from "./common";
import { useWidgetInputTranslation } from "./common";
@@ -12,6 +14,7 @@ import { useFormContext } from "./form";
export type SelectOption =
| {
icon?: TablerIcon;
value: string;
label: stringOrTranslation;
}
@@ -23,10 +26,19 @@ export type inferSelectOptionValue<TOption extends SelectOption> = TOption exten
? TValue
: TOption;
const getIconFor = (options: SelectOption[], value: string) => {
const current = options.find((option) => (typeof option === "string" ? option : option.value) === value);
if (!current) return null;
if (typeof current === "string") return null;
return current.icon;
};
export const WidgetSelectInput = ({ property, kind, options }: CommonWidgetInputProps<"select">) => {
const t = useI18n();
const tWidget = useWidgetInputTranslation(kind, property);
const form = useFormContext();
const inputProps = form.getInputProps(`options.${property}`);
const CurrentIcon = getIconFor(options.options, inputProps.value as string);
return (
<Select
@@ -39,9 +51,29 @@ export const WidgetSelectInput = ({ property, kind, options }: CommonWidgetInput
label: translateIfNecessary(t, option.label) ?? option.value,
},
)}
leftSection={CurrentIcon && <CurrentIcon size={16} stroke={1.5} />}
renderOption={({ option, checked }) => {
const Icon = getIconFor(options.options, option.value);
return (
<Group flex="1" gap="xs">
{Icon && <Icon color="currentColor" opacity={0.6} size={18} stroke={1.5} />}
{option.label}
{checked && (
<IconCheck
style={{ marginInlineStart: "auto" }}
color="currentColor"
opacity={0.6}
size={18}
stroke={1.5}
/>
)}
</Group>
);
}}
description={options.withDescription ? tWidget("description") : undefined}
searchable={options.searchable}
{...form.getInputProps(`options.${property}`)}
{...inputProps}
/>
);
};

View File

@@ -1,7 +1,7 @@
"use client";
import type { PropsWithChildren } from "react";
import { Suspense } from "react";
import { Fragment, Suspense } from "react";
import { Flex, Text, Tooltip, UnstyledButton } from "@mantine/core";
import { IconLoader } from "@tabler/icons-react";
import combineClasses from "clsx";
@@ -56,7 +56,8 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
[app, options.openInNewTab],
);
const tinyText = height < 100 || width < 100;
const isTiny = height < 100 || width < 100;
const isColumnLayout = options.layout.startsWith("column");
return (
<AppLink
@@ -65,22 +66,34 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
enabled={Boolean(app.href) && !isEditMode}
>
<Tooltip.Floating
label={app.description}
label={app.description?.split("\n").map((line, index) => (
<Fragment key={index}>
{line}
<br />
</Fragment>
))}
position="right-start"
multiline
disabled={!options.showDescriptionTooltip || !app.description}
styles={{ tooltip: { maxWidth: 300 } }}
>
<Flex
p={isTiny ? 4 : "sm"}
className={combineClasses("app-flex-wrapper", app.name, app.id, app.href && classes.appWithUrl)}
h="100%"
w="100%"
direction="column"
direction={options.layout}
justify="center"
align="center"
gap={isColumnLayout ? 0 : "sm"}
>
{options.showTitle && (
<Text className="app-title" fw={700} size={tinyText ? "8px" : "sm"} ta="center">
<Text
className="app-title"
fw={700}
size={isTiny ? "8px" : "sm"}
ta={isColumnLayout ? "center" : undefined}
>
{app.name}
</Text>
)}
@@ -92,6 +105,8 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
style={{
height: "100%",
width: "100%",
minWidth: "20%",
maxWidth: isColumnLayout ? undefined : "50%",
}}
/>
</Flex>

View File

@@ -1,4 +1,11 @@
import { IconApps, IconDeviceDesktopX } from "@tabler/icons-react";
import {
IconApps,
IconDeviceDesktopX,
IconLayoutBottombarExpand,
IconLayoutNavbarExpand,
IconLayoutSidebarLeftExpand,
IconLayoutSidebarRightExpand,
} from "@tabler/icons-react";
import { createWidgetDefinition } from "../definition";
import { optionsBuilder } from "../options";
@@ -12,6 +19,40 @@ export const { definition, componentLoader } = createWidgetDefinition("app", {
openInNewTab: factory.switch({ defaultValue: true }),
showTitle: factory.switch({ defaultValue: true }),
showDescriptionTooltip: factory.switch({ defaultValue: false }),
layout: factory.select({
options: [
{
label(t) {
return t("widget.app.option.layout.option.column");
},
value: "column",
icon: IconLayoutNavbarExpand,
},
{
label(t) {
return t("widget.app.option.layout.option.column-reverse");
},
value: "column-reverse",
icon: IconLayoutBottombarExpand,
},
{
label(t) {
return t("widget.app.option.layout.option.row");
},
value: "row",
icon: IconLayoutSidebarLeftExpand,
},
{
label(t) {
return t("widget.app.option.layout.option.row-reverse");
},
value: "row-reverse",
icon: IconLayoutSidebarRightExpand,
},
],
defaultValue: "column",
searchable: true,
}),
pingEnabled: factory.switch({ defaultValue: settings.enableStatusByDefault }),
}),
{

994
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,14 @@
import { readFile, writeFile } from "fs/promises";
const replaceTemplate = "#NEXT_VERSION#";
const fileName = ".github/ISSUE_TEMPLATE/bug_report.yml";
const env = {
NEXT_VERSION: process.env.NEXT_VERSION as string,
};
const content = await readFile(fileName, "utf8");
const updatedContent = content.replace(
replaceTemplate,
`${replaceTemplate}\n - ${env.NEXT_VERSION.replace("v", "")}`,
);
await writeFile(fileName, updatedContent, "utf8");

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -17,14 +17,14 @@
},
"prettier": "@homarr/prettier-config",
"dependencies": {
"@next/eslint-plugin-next": "15.4.6",
"@next/eslint-plugin-next": "15.5.0",
"eslint-config-prettier": "^10.1.8",
"eslint-config-turbo": "^2.5.6",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
"typescript-eslint": "^8.39.1"
"typescript-eslint": "^8.40.0"
},
"devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0",