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 label: Version
description: What version of Homarr are you running? description: What version of Homarr are you running?
options: options:
# The below comment is used to insert a new version with on-release.yml
#NEXT_VERSION#
- 1.33.0
- 1.32.0 - 1.32.0
- 1.31.0 - 1.31.0
- 1.30.1 - 1.30.1

View File

@@ -14,6 +14,6 @@ jobs:
validate-pull-request-title: validate-pull-request-title:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: amannn/action-semantic-pull-request@v5 - uses: amannn/action-semantic-pull-request@v6
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 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 # Security Policy
This policy is relevant if you found potential vulnerabilities in an audit. This policy is relevant if you found potential vulnerabilities in an audit.
We consider something as a vulnerability if it... We consider something as a vulnerability if it...
1. puts users or user data at risk 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), ...) 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, ...) 3. abuses the system in an unintended way (e.g. crypto mining, proxy, ...)
## Supported Versions ## Supported Versions
| Version | Supported | 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.
| ------- | ------------------ |
| >1.0.0 | :white_check_mark: |
| <1.0.0 | :x: |
## Reporting a Vulnerability ## 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). 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. 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/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^8.2.4", "@mantine/colors-generator": "^8.2.5",
"@mantine/core": "^8.2.4", "@mantine/core": "^8.2.5",
"@mantine/dropzone": "^8.2.4", "@mantine/dropzone": "^8.2.5",
"@mantine/hooks": "^8.2.4", "@mantine/hooks": "^8.2.5",
"@mantine/modals": "^8.2.4", "@mantine/modals": "^8.2.5",
"@mantine/tiptap": "^8.2.4", "@mantine/tiptap": "^8.2.5",
"@million/lint": "1.0.14", "@million/lint": "1.0.14",
"@tabler/icons-react": "^3.34.1", "@tabler/icons-react": "^3.34.1",
"@tanstack/react-query": "^5.85.3", "@tanstack/react-query": "^5.85.5",
"@tanstack/react-query-devtools": "^5.85.3", "@tanstack/react-query-devtools": "^5.85.5",
"@tanstack/react-query-next-experimental": "^5.85.3", "@tanstack/react-query-next-experimental": "^5.85.5",
"@trpc/client": "^11.4.4", "@trpc/client": "^11.4.4",
"@trpc/next": "^11.4.4", "@trpc/next": "^11.4.4",
"@trpc/react-query": "^11.4.4", "@trpc/react-query": "^11.4.4",
@@ -76,7 +76,7 @@
"glob": "^11.0.3", "glob": "^11.0.3",
"jotai": "^2.13.1", "jotai": "^2.13.1",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "15.4.6", "next": "15.5.0",
"postcss-preset-mantine": "^1.18.0", "postcss-preset-mantine": "^1.18.0",
"prismjs": "^1.30.0", "prismjs": "^1.30.0",
"react": "19.1.1", "react": "19.1.1",
@@ -87,7 +87,7 @@
"superjson": "2.2.2", "superjson": "2.2.2",
"swagger-ui-react": "^5.27.1", "swagger-ui-react": "^5.27.1",
"use-deep-compare-effect": "^1.8.1", "use-deep-compare-effect": "^1.8.1",
"zod": "^4.0.14" "zod": "^4.0.17"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -30,12 +30,12 @@
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@paralleldrive/cuid2": "^2.2.2", "@paralleldrive/cuid2": "^2.2.2",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"next": "15.4.6", "next": "15.5.0",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"undici": "7.13.0", "undici": "7.14.0",
"zod": "^4.0.14", "zod": "^4.0.17",
"zod-validation-error": "^3.5.3" "zod-validation-error": "^4.0.1"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@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 type { AnyRequestError } from "../request-error";
import { ResponseError } from "../response-error"; import { ResponseError } from "../response-error";
import { FetchHttpErrorHandler } from "./fetch-http-error-handler";
import { HttpErrorHandler } from "./http-error-handler"; import { HttpErrorHandler } from "./http-error-handler";
import { NodeFetchHttpErrorHandler } from "./node-fetch-http-error-handler";
export class TsdavHttpErrorHandler extends HttpErrorHandler { export class TsdavHttpErrorHandler extends HttpErrorHandler {
handleRequestError(error: unknown): AnyRequestError | undefined { handleRequestError(error: unknown): AnyRequestError | undefined {
return new FetchHttpErrorHandler("tsdav").handleRequestError(error); return new NodeFetchHttpErrorHandler("tsdav").handleRequestError(error);
} }
handleResponseError(error: unknown): ResponseError | undefined { 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 // https://github.com/natelindev/tsdav/blob/bf33f04b1884694d685ee6f2b43fe9354b12d167/src/account.ts#L86
if (error.message !== "Invalid credentials") return undefined; if (error.message !== "Invalid credentials") return undefined;
logger.debug("Received Tsdav response error", { logger.debug("Received tsdav response error", {
status: 401, status: 401,
}); });

View File

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

View File

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

View File

@@ -44,14 +44,14 @@
"@homarr/definitions": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "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", "@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.5.1", "@testcontainers/mysql": "^11.5.1",
"better-sqlite3": "^12.2.0", "better-sqlite3": "^12.2.0",
"dotenv": "^17.2.1", "dotenv": "^17.2.1",
"drizzle-kit": "^0.31.4", "drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.4", "drizzle-orm": "^0.44.4",
"drizzle-zod": "^0.8.2", "drizzle-zod": "^0.8.3",
"mysql2": "3.14.3", "mysql2": "3.14.3",
"superjson": "2.2.2" "superjson": "2.2.2"
}, },

View File

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

View File

@@ -26,9 +26,9 @@
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/form": "^8.2.4", "@mantine/form": "^8.2.5",
"mantine-form-zod-resolver": "^1.2.1", "mantine-form-zod-resolver": "^1.3.0",
"zod": "^4.0.14" "zod": "^4.0.17"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -29,9 +29,9 @@
"@homarr/notifications": "workspace:^0.1.0", "@homarr/notifications": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.2.4", "@mantine/core": "^8.2.5",
"react": "19.1.1", "react": "19.1.1",
"zod": "^4.0.14" "zod": "^4.0.17"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

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

View File

@@ -45,9 +45,9 @@
"octokit": "^5.0.3", "octokit": "^5.0.3",
"proxmox-api": "1.1.1", "proxmox-api": "1.1.1",
"tsdav": "^2.1.5", "tsdav": "^2.1.5",
"undici": "7.13.0", "undici": "7.14.0",
"xml2js": "^0.6.2", "xml2js": "^0.6.2",
"zod": "^4.0.14" "zod": "^4.0.17"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@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 * as ical from "node-ical";
import { DAVClient } from "tsdav"; 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 { logger } from "@homarr/log";
import { HandleIntegrationErrors } from "../base/errors/decorator"; import { HandleIntegrationErrors } from "../base/errors/decorator";
@@ -16,7 +17,7 @@ import type { CalendarEvent } from "../interfaces/calendar/calendar-types";
@HandleIntegrationErrors([integrationTsdavHttpErrorHandler]) @HandleIntegrationErrors([integrationTsdavHttpErrorHandler])
export class NextcloudIntegration extends Integration implements ICalendarIntegration { export class NextcloudIntegration extends Integration implements ICalendarIntegration {
protected async testingAsync(input: IntegrationTestingInput): Promise<TestingResult> { 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(); await client.login();
return { success: true }; 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({ return new DAVClient({
serverUrl: this.integration.url, serverUrl: this.integration.url,
credentials: { credentials: {
@@ -90,9 +91,10 @@ export class NextcloudIntegration extends Integration implements ICalendarIntegr
authMethod: "Basic", authMethod: "Basic",
defaultAccountType: "caldav", defaultAccountType: "caldav",
fetchOptions: { fetchOptions: {
// We can use the undici options as the global fetch is used instead of the polyfilled. // tsdav is using cross-fetch which uses node-fetch for nodejs environments.
dispatcher: dispatcher ?? (await createCertificateAgentAsync()), // There is an agent property that is the same type as the http(s) agents of nodejs
} satisfies UndiciFetchRequestInit as RequestInit, agent: agent ?? (await createHttpsAgentAsync()),
} satisfies NodeFetchRequestInit as RequestInit,
}); });
} }
} }

View File

@@ -27,7 +27,7 @@
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
"superjson": "2.2.2", "superjson": "2.2.2",
"winston": "3.17.0", "winston": "3.17.0",
"zod": "^4.0.14" "zod": "^4.0.17"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -33,13 +33,13 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.2.4", "@mantine/core": "^8.2.5",
"@tabler/icons-react": "^3.34.1", "@tabler/icons-react": "^3.34.1",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"next": "15.4.6", "next": "15.5.0",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"zod": "^4.0.14" "zod": "^4.0.17"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -24,8 +24,8 @@
"dependencies": { "dependencies": {
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.2.4", "@mantine/core": "^8.2.5",
"@mantine/hooks": "^8.2.4", "@mantine/hooks": "^8.2.5",
"react": "19.1.1" "react": "19.1.1"
}, },
"devDependencies": { "devDependencies": {

View File

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

View File

@@ -37,14 +37,14 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.2.4", "@mantine/core": "^8.2.5",
"@mantine/hooks": "^8.2.4", "@mantine/hooks": "^8.2.5",
"adm-zip": "0.5.16", "adm-zip": "0.5.16",
"next": "15.4.6", "next": "15.5.0",
"react": "19.1.1", "react": "19.1.1",
"react-dom": "19.1.1", "react-dom": "19.1.1",
"superjson": "2.2.2", "superjson": "2.2.2",
"zod": "^4.0.14", "zod": "^4.0.17",
"zod-form-data": "^3.0.0" "zod-form-data": "^3.0.0"
}, },
"devDependencies": { "devDependencies": {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "", "error": "",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "", "label": "",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

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

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Beta", "beta": "Beta",
"error": "Chyba", "error": "Chyba",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Nástroje", "label": "Nástroje",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

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

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Fehler", "error": "Fehler",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "Statusüberprüfung aktivieren" "label": "Statusüberprüfung aktivieren"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Werkzeuge", "label": "Werkzeuge",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

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

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Σφάλμα", "error": "Σφάλμα",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Εργαλεία", "label": "Εργαλεία",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Beta", "beta": "Beta",
"error": "Alpha", "error": "Alpha",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "", "label": "",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "", "error": "",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "", "label": "",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

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

View File

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

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Pogreška", "error": "Pogreška",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Alati", "label": "Alati",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Béta", "beta": "Béta",
"error": "Hiba", "error": "Hiba",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "Egyszerű ping engedélyezése" "label": "Egyszerű ping engedélyezése"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Eszközök", "label": "Eszközök",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Errore", "error": "Errore",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Strumenti", "label": "Strumenti",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

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

View File

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

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "", "error": "",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Įrankiai", "label": "Įrankiai",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Kļūda", "error": "Kļūda",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Rīki", "label": "Rīki",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Beta", "beta": "Beta",
"error": "Fout", "error": "Fout",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "Statuscontrole inschakelen" "label": "Statuscontrole inschakelen"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Gereedschappen", "label": "Gereedschappen",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "Docker" "label": "Docker"
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Beta", "beta": "Beta",
"error": "Feil", "error": "Feil",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "Aktiver enkel ping" "label": "Aktiver enkel ping"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Verktøy", "label": "Verktøy",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "Docker" "label": "Docker"
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Wersja beta", "beta": "Wersja beta",
"error": "Błąd", "error": "Błąd",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "Włącz prosty ping" "label": "Włącz prosty ping"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Narzędzia", "label": "Narzędzia",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Erro", "error": "Erro",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Ferramentas", "label": "Ferramentas",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Eroare", "error": "Eroare",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Unelte", "label": "Unelte",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Бета", "beta": "Бета",
"error": "Ошибка", "error": "Ошибка",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "Включить простую проверку доступности" "label": "Включить простую проверку доступности"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Инструменты", "label": "Инструменты",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "Docker" "label": "Docker"
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Beta", "beta": "Beta",
"error": "Chyba", "error": "Chyba",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "Povoliť jednoduchý ping" "label": "Povoliť jednoduchý ping"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Nástroje", "label": "Nástroje",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "Docker" "label": "Docker"
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Napaka", "error": "Napaka",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Orodja", "label": "Orodja",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Fel", "error": "Fel",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "Varje dag vid midnatt", "midnight": "Varje dag vid midnatt",
"weeklyMonday": "Varje vecka på måndag" "weeklyMonday": "Varje vecka på måndag",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Verktyg", "label": "Verktyg",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "Başarılı",
"beta": "Test", "beta": "Test",
"error": "Hata", "error": "Hata",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "Durum denetimini etkinleştir" "label": "Durum denetimini etkinleştir"
},
"layout": {
"label": "Düzen",
"option": {
"row": "Yatay",
"row-reverse": "Yatay (ters)",
"column": "Dikey",
"column-reverse": "Dikey (ters)"
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "Her {interval, plural, =1 {dakika} other {# dakikada bir}}", "minutes": "Her {interval, plural, =1 {dakika} other {# dakikada bir}}",
"hours": "Her {interval, plural, =1 {saat} other {# saatte bir}}", "hours": "Her {interval, plural, =1 {saat} other {# saatte bir}}",
"midnight": "Her gün gece yarısı", "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": { "settings": {
"title": "{jobName} için görev ayarları" "title": "{jobName} için görev ayarları"
}, },
"field": { "field": {
"name": {
"label": "İsim"
},
"interval": { "interval": {
"label": "Zamanlama aralığı" "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": { "tools": {
"label": "Araçlar", "label": "Araçlar",
"tasks": {
"label": "Görevler"
},
"docker": { "docker": {
"label": "Docker" "label": "Docker"
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "Бета-версія", "beta": "Бета-версія",
"error": "Помилка", "error": "Помилка",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Інструменти", "label": "Інструменти",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "Докер" "label": "Докер"
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "", "beta": "",
"error": "Lỗi", "error": "Lỗi",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "" "label": ""
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "Công cụ", "label": "Công cụ",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "" "label": ""
}, },

View File

@@ -1003,6 +1003,7 @@
} }
}, },
"common": { "common": {
"success": "",
"beta": "測試版", "beta": "測試版",
"error": "錯誤", "error": "錯誤",
"action": { "action": {
@@ -1270,6 +1271,15 @@
}, },
"pingEnabled": { "pingEnabled": {
"label": "啟用簡單的 Ping" "label": "啟用簡單的 Ping"
},
"layout": {
"label": "",
"option": {
"row": "",
"row-reverse": "",
"column": "",
"column-reverse": ""
}
} }
}, },
"error": { "error": {
@@ -3260,14 +3270,70 @@
"minutes": "", "minutes": "",
"hours": "", "hours": "",
"midnight": "", "midnight": "",
"weeklyMonday": "" "weeklyMonday": "",
"update": {
"success": {
"message": ""
},
"error": {
"message": ""
}
}
}, },
"settings": { "settings": {
"title": "" "title": ""
}, },
"field": { "field": {
"name": {
"label": ""
},
"interval": { "interval": {
"label": "" "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": { "tools": {
"label": "工具", "label": "工具",
"tasks": {
"label": ""
},
"docker": { "docker": {
"label": "Docker" "label": "Docker"
}, },

View File

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

View File

@@ -24,7 +24,7 @@
"dependencies": { "dependencies": {
"@homarr/definitions": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"zod": "^4.0.14", "zod": "^4.0.17",
"zod-form-data": "^3.0.0" "zod-form-data": "^3.0.0"
}, },
"devDependencies": { "devDependencies": {

View File

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

View File

@@ -1,10 +1,12 @@
"use client"; "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 { translateIfNecessary } from "@homarr/translation";
import type { stringOrTranslation } from "@homarr/translation"; import type { stringOrTranslation } from "@homarr/translation";
import { useI18n } from "@homarr/translation/client"; import { useI18n } from "@homarr/translation/client";
import type { TablerIcon } from "@homarr/ui";
import type { CommonWidgetInputProps } from "./common"; import type { CommonWidgetInputProps } from "./common";
import { useWidgetInputTranslation } from "./common"; import { useWidgetInputTranslation } from "./common";
@@ -12,6 +14,7 @@ import { useFormContext } from "./form";
export type SelectOption = export type SelectOption =
| { | {
icon?: TablerIcon;
value: string; value: string;
label: stringOrTranslation; label: stringOrTranslation;
} }
@@ -23,10 +26,19 @@ export type inferSelectOptionValue<TOption extends SelectOption> = TOption exten
? TValue ? TValue
: TOption; : 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">) => { export const WidgetSelectInput = ({ property, kind, options }: CommonWidgetInputProps<"select">) => {
const t = useI18n(); const t = useI18n();
const tWidget = useWidgetInputTranslation(kind, property); const tWidget = useWidgetInputTranslation(kind, property);
const form = useFormContext(); const form = useFormContext();
const inputProps = form.getInputProps(`options.${property}`);
const CurrentIcon = getIconFor(options.options, inputProps.value as string);
return ( return (
<Select <Select
@@ -39,9 +51,29 @@ export const WidgetSelectInput = ({ property, kind, options }: CommonWidgetInput
label: translateIfNecessary(t, option.label) ?? option.value, 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} description={options.withDescription ? tWidget("description") : undefined}
searchable={options.searchable} searchable={options.searchable}
{...form.getInputProps(`options.${property}`)} {...inputProps}
/> />
); );
}; };

View File

@@ -1,7 +1,7 @@
"use client"; "use client";
import type { PropsWithChildren } from "react"; import type { PropsWithChildren } from "react";
import { Suspense } from "react"; import { Fragment, Suspense } from "react";
import { Flex, Text, Tooltip, UnstyledButton } from "@mantine/core"; import { Flex, Text, Tooltip, UnstyledButton } from "@mantine/core";
import { IconLoader } from "@tabler/icons-react"; import { IconLoader } from "@tabler/icons-react";
import combineClasses from "clsx"; import combineClasses from "clsx";
@@ -56,7 +56,8 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
[app, options.openInNewTab], [app, options.openInNewTab],
); );
const tinyText = height < 100 || width < 100; const isTiny = height < 100 || width < 100;
const isColumnLayout = options.layout.startsWith("column");
return ( return (
<AppLink <AppLink
@@ -65,22 +66,34 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
enabled={Boolean(app.href) && !isEditMode} enabled={Boolean(app.href) && !isEditMode}
> >
<Tooltip.Floating <Tooltip.Floating
label={app.description} label={app.description?.split("\n").map((line, index) => (
<Fragment key={index}>
{line}
<br />
</Fragment>
))}
position="right-start" position="right-start"
multiline multiline
disabled={!options.showDescriptionTooltip || !app.description} disabled={!options.showDescriptionTooltip || !app.description}
styles={{ tooltip: { maxWidth: 300 } }} styles={{ tooltip: { maxWidth: 300 } }}
> >
<Flex <Flex
p={isTiny ? 4 : "sm"}
className={combineClasses("app-flex-wrapper", app.name, app.id, app.href && classes.appWithUrl)} className={combineClasses("app-flex-wrapper", app.name, app.id, app.href && classes.appWithUrl)}
h="100%" h="100%"
w="100%" w="100%"
direction="column" direction={options.layout}
justify="center" justify="center"
align="center" align="center"
gap={isColumnLayout ? 0 : "sm"}
> >
{options.showTitle && ( {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} {app.name}
</Text> </Text>
)} )}
@@ -92,6 +105,8 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
style={{ style={{
height: "100%", height: "100%",
width: "100%", width: "100%",
minWidth: "20%",
maxWidth: isColumnLayout ? undefined : "50%",
}} }}
/> />
</Flex> </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 { createWidgetDefinition } from "../definition";
import { optionsBuilder } from "../options"; import { optionsBuilder } from "../options";
@@ -12,6 +19,40 @@ export const { definition, componentLoader } = createWidgetDefinition("app", {
openInNewTab: factory.switch({ defaultValue: true }), openInNewTab: factory.switch({ defaultValue: true }),
showTitle: factory.switch({ defaultValue: true }), showTitle: factory.switch({ defaultValue: true }),
showDescriptionTooltip: factory.switch({ defaultValue: false }), 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 }), 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", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@next/eslint-plugin-next": "15.4.6", "@next/eslint-plugin-next": "15.5.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-config-turbo": "^2.5.6", "eslint-config-turbo": "^2.5.6",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5", "eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"typescript-eslint": "^8.39.1" "typescript-eslint": "^8.40.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",