Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d8a2ab74d2 | ||
|
|
4dabc98bd4 | ||
|
|
84909b2535 | ||
|
|
f2540c7d8e | ||
|
|
0e63ffe611 | ||
|
|
0b120455fd | ||
|
|
fde68f8bcc | ||
|
|
38e368fdbc | ||
|
|
94533c667c | ||
|
|
cd25bdfc0e | ||
|
|
3a7c8d5e19 | ||
|
|
1afbdd0511 | ||
|
|
1fa60cbea6 | ||
|
|
3cbb664bc0 | ||
|
|
a80c5d40e0 | ||
|
|
cccec5e195 | ||
|
|
afca8007f1 | ||
|
|
5c86930220 | ||
|
|
35a8ac820f | ||
|
|
cd5d9c66ca | ||
|
|
60370a7e33 | ||
|
|
65ccfdfb13 | ||
|
|
f792b2a553 | ||
|
|
5d402f88d2 | ||
|
|
7a7b3a32f8 | ||
|
|
d80f070ba3 | ||
|
|
d7182b9cf5 | ||
|
|
6a199561b6 | ||
|
|
7e5f4e59a9 | ||
|
|
1b7e67dd97 | ||
|
|
0aede0dec3 | ||
|
|
e8877169f8 | ||
|
|
4ffbea3b52 | ||
|
|
fab57e6fbd | ||
|
|
c2b2b098a1 | ||
|
|
4f74395000 | ||
|
|
073ede3aad | ||
|
|
40f9ce0530 | ||
|
|
92802a37db | ||
|
|
4c2e352aca | ||
|
|
3b708c5ebd | ||
|
|
50a23d76e3 | ||
|
|
6d0a1452a6 | ||
|
|
a9f73bc279 | ||
|
|
76bc24b06a | ||
|
|
196a9b4b6d | ||
|
|
eb39eea87f | ||
|
|
e0fe6d5b81 | ||
|
|
530335eecc | ||
|
|
c35c15c635 | ||
|
|
e7267548fe | ||
|
|
ec09fb70a9 | ||
|
|
7e500f772d | ||
|
|
c9841dfb47 | ||
|
|
6aa127e57a | ||
|
|
bd6761cb75 | ||
|
|
982a0c96a5 | ||
|
|
0ff0b17c28 | ||
|
|
055770c5e8 | ||
|
|
3934252053 | ||
|
|
35172fa910 | ||
|
|
9e059a9632 | ||
|
|
82cd072753 | ||
|
|
ee05137351 | ||
|
|
d9de9694c0 | ||
|
|
915a759d7e | ||
|
|
cf2977f821 | ||
|
|
c072e19150 | ||
|
|
4da24060c9 | ||
|
|
84ace42aa5 | ||
|
|
040786353d | ||
|
|
e1162c7907 | ||
|
|
e827f6653f | ||
|
|
67184890ec | ||
|
|
340f8f98e4 | ||
|
|
5955ae6f8b | ||
|
|
af448f0085 | ||
|
|
b4cfc3bf8b | ||
|
|
a21fbd26da | ||
|
|
eb7a3a31f0 |
No files matched your search
@@ -33,6 +33,8 @@ body:
|
||||
options:
|
||||
# The below comment is used to insert a new version with on-release.yml
|
||||
#NEXT_VERSION#
|
||||
- 1.41.0
|
||||
- 1.40.0
|
||||
- 1.39.0
|
||||
- 1.38.0
|
||||
- 1.37.0
|
||||
|
||||
@@ -1,3 +1,63 @@
|
||||
## [1.42.0](https://github.com/homarr-labs/homarr/compare/v1.41.0...v1.42.0) (2025-10-17)
|
||||
|
||||
### Features
|
||||
|
||||
* **nextcloud:** reuse color from event for indicator ([#4270](https://github.com/homarr-labs/homarr/issues/4270)) ([afca800](https://github.com/homarr-labs/homarr/commit/afca8007f1919e0bb8cb17eefb9c41e3f28291cc))
|
||||
* **users:** allow profile picture change for external providers ([#4275](https://github.com/homarr-labs/homarr/issues/4275)) ([5c86930](https://github.com/homarr-labs/homarr/commit/5c86930220e97888eeae1c5440572ba7ef2434be))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **calendar:** recurring events not working ([#4265](https://github.com/homarr-labs/homarr/issues/4265)) ([1b7e67d](https://github.com/homarr-labs/homarr/commit/1b7e67dd9760c159e525cd88face00e28a260d13))
|
||||
* **deps:** update dependency @auth/core to ^0.41.0 ([#4282](https://github.com/homarr-labs/homarr/issues/4282)) ([60370a7](https://github.com/homarr-labs/homarr/commit/60370a7e33dc1957aa433cbd6a11ab69661606cc))
|
||||
* **deps:** update dependency @auth/drizzle-adapter to ^1.11.0 ([#4283](https://github.com/homarr-labs/homarr/issues/4283)) ([cd5d9c6](https://github.com/homarr-labs/homarr/commit/cd5d9c66ca42687faa9aeeff3d4d74d21a472a92))
|
||||
* **deps:** update dependency @ctrl/qbittorrent to ^9.9.1 ([#4229](https://github.com/homarr-labs/homarr/issues/4229)) ([c2b2b09](https://github.com/homarr-labs/homarr/commit/c2b2b098a1ae7df027265dfcd184c01be1831ffc))
|
||||
* **deps:** update dependency ioredis to v5.8.1 ([#4259](https://github.com/homarr-labs/homarr/issues/4259)) ([4ffbea3](https://github.com/homarr-labs/homarr/commit/4ffbea3b521b45c3dd52595d4f6824d25a6b4a05))
|
||||
* **deps:** update dependency mysql2 to v3.15.2 ([#4280](https://github.com/homarr-labs/homarr/issues/4280)) ([65ccfdf](https://github.com/homarr-labs/homarr/commit/65ccfdfb13e83e78e65585aaf15a07b9d9755697))
|
||||
* **deps:** update dependency next-intl to v4.3.10 ([#4271](https://github.com/homarr-labs/homarr/issues/4271)) ([5d402f8](https://github.com/homarr-labs/homarr/commit/5d402f88d29892ddebfc7e9efc902be4c3bbeba1))
|
||||
* **deps:** update dependency next-intl to v4.3.11 ([#4273](https://github.com/homarr-labs/homarr/issues/4273)) ([f792b2a](https://github.com/homarr-labs/homarr/commit/f792b2a553f7a5851db36fc6a7ec495e2662dbc0))
|
||||
* **deps:** update dependency next-intl to v4.3.12 ([#4274](https://github.com/homarr-labs/homarr/issues/4274)) ([3a7c8d5](https://github.com/homarr-labs/homarr/commit/3a7c8d5e19c28a1e3b084e80eb52a3193a419d7f))
|
||||
* **deps:** update dependency swagger-ui-react to ^5.29.4 ([#4293](https://github.com/homarr-labs/homarr/issues/4293)) ([fde68f8](https://github.com/homarr-labs/homarr/commit/fde68f8bcc75aefb9cdb15c0b3b5d12c18a54d35))
|
||||
* **deps:** update dependency trpc-to-openapi to ^3.1.0 ([#4268](https://github.com/homarr-labs/homarr/issues/4268)) ([d80f070](https://github.com/homarr-labs/homarr/commit/d80f070ba3dca6bd8af10ee771f7cbd3d24dafa3))
|
||||
* **deps:** update dependency typescript-eslint to ^8.46.0 ([#4264](https://github.com/homarr-labs/homarr/issues/4264)) ([0aede0d](https://github.com/homarr-labs/homarr/commit/0aede0dec38016f5df08ce42f4f2e9237aaecaa6))
|
||||
* **deps:** update dependency zod to ^4.1.12 ([#4263](https://github.com/homarr-labs/homarr/issues/4263)) ([e887716](https://github.com/homarr-labs/homarr/commit/e8877169f88179fc9a23947c3f34478f851cb66a))
|
||||
* **deps:** update mantine monorepo to ^8.3.4 ([#4290](https://github.com/homarr-labs/homarr/issues/4290)) ([94533c6](https://github.com/homarr-labs/homarr/commit/94533c667cd234fdfe8f064b3d4892ad902e74c7))
|
||||
* **deps:** update tiptap monorepo to v2.26.3 ([#4292](https://github.com/homarr-labs/homarr/issues/4292)) ([38e368f](https://github.com/homarr-labs/homarr/commit/38e368fdbcf9aba54fbc960031742cb162a72b72))
|
||||
* **docker-widget:** memory usage wrong ([#4266](https://github.com/homarr-labs/homarr/issues/4266)) ([cccec5e](https://github.com/homarr-labs/homarr/commit/cccec5e19538aa8df154281f14fa939414bc8190))
|
||||
* **management:** improve homepage ([#4260](https://github.com/homarr-labs/homarr/issues/4260)) ([7e5f4e5](https://github.com/homarr-labs/homarr/commit/7e5f4e59a9edcb05dfa8a09919408e93e8d0313f))
|
||||
* **plex:** tv show links not working ([#4272](https://github.com/homarr-labs/homarr/issues/4272)) ([a80c5d4](https://github.com/homarr-labs/homarr/commit/a80c5d40e0e944d40dfdfe8e902ee10872e26bc0))
|
||||
* **users:** profile picture upload limit wrong ([#4276](https://github.com/homarr-labs/homarr/issues/4276)) ([35a8ac8](https://github.com/homarr-labs/homarr/commit/35a8ac820f084271bc7591834096226639aec0d4))
|
||||
|
||||
## [1.41.0](https://github.com/homarr-labs/homarr/compare/v1.40.0...v1.41.0) (2025-10-10)
|
||||
|
||||
### Features
|
||||
|
||||
* **dynamic-sections:** add custom css classes option ([#4256](https://github.com/homarr-labs/homarr/issues/4256)) ([4c2e352](https://github.com/homarr-labs/homarr/commit/4c2e352acac62434c840e407887f8fddfc8c426a))
|
||||
* **integrations:** allow changing secret kinds of existing integration ([#4254](https://github.com/homarr-labs/homarr/issues/4254)) ([3b708c5](https://github.com/homarr-labs/homarr/commit/3b708c5ebdcfb3425cb0b777f72ff2aaea23386b))
|
||||
* **weather-widget:** add imperial windspeed option ([#4253](https://github.com/homarr-labs/homarr/issues/4253)) ([50a23d7](https://github.com/homarr-labs/homarr/commit/50a23d76e3dc14f23a27125297b8901a6724d18a))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **deps:** update dependency @ctrl/deluge to ^7.4.0 ([#4227](https://github.com/homarr-labs/homarr/issues/4227)) ([cf2977f](https://github.com/homarr-labs/homarr/commit/cf2977f82189d9fa8b896012dd7730a641cc252b))
|
||||
* **deps:** update dependency @ctrl/qbittorrent to ^9.9.0 ([#4228](https://github.com/homarr-labs/homarr/issues/4228)) ([ee05137](https://github.com/homarr-labs/homarr/commit/ee051373512fbfb5fb70d78ea45755b2cf370f6a))
|
||||
* **deps:** update dependency @kubernetes/client-node to ^1.4.0 ([#4247](https://github.com/homarr-labs/homarr/issues/4247)) ([ec09fb7](https://github.com/homarr-labs/homarr/commit/ec09fb70a950cbef131352f60fdf45553c7fe99f))
|
||||
* **deps:** update dependency @octokit/auth-app to ^8.1.1 ([#4217](https://github.com/homarr-labs/homarr/issues/4217)) ([5955ae6](https://github.com/homarr-labs/homarr/commit/5955ae6f8b3c90a7c9b17760650095676303192e))
|
||||
* **deps:** update dependency dockerode to ^4.0.9 ([#4214](https://github.com/homarr-labs/homarr/issues/4214)) ([340f8f9](https://github.com/homarr-labs/homarr/commit/340f8f98e452c068c5d26973195ea676d2b3ee6e))
|
||||
* **deps:** update dependency dotenv to ^17.2.3 ([#4218](https://github.com/homarr-labs/homarr/issues/4218)) ([af448f0](https://github.com/homarr-labs/homarr/commit/af448f008571562492748986bd7cb2651623130e))
|
||||
* **deps:** update dependency drizzle-orm to ^0.44.6 ([#4237](https://github.com/homarr-labs/homarr/issues/4237)) ([3934252](https://github.com/homarr-labs/homarr/commit/3934252053792874c41a6bd545b20acd7ccef4e8))
|
||||
* **deps:** update dependency eslint-plugin-react-hooks to v6 ([#4231](https://github.com/homarr-labs/homarr/issues/4231)) ([76bc24b](https://github.com/homarr-labs/homarr/commit/76bc24b06aeec71b53b9f3351b98c076621d69d9))
|
||||
* **deps:** update dependency fast-xml-parser to ^5.3.0 ([#4245](https://github.com/homarr-labs/homarr/issues/4245)) ([c35c15c](https://github.com/homarr-labs/homarr/commit/c35c15c635f37d09071b9ccafcd532e1e2e9ccd4))
|
||||
* **deps:** update dependency swagger-ui-react to ^5.29.1 ([#4210](https://github.com/homarr-labs/homarr/issues/4210)) ([eb7a3a3](https://github.com/homarr-labs/homarr/commit/eb7a3a31f0ddf135664f5609c39b9d8ee72ef432))
|
||||
* **deps:** update dependency swagger-ui-react to ^5.29.2 ([#4212](https://github.com/homarr-labs/homarr/issues/4212)) ([055770c](https://github.com/homarr-labs/homarr/commit/055770c5e8e43dfc035b2a25d650383df865c118))
|
||||
* **deps:** update dependency swagger-ui-react to ^5.29.3 ([#4238](https://github.com/homarr-labs/homarr/issues/4238)) ([e726754](https://github.com/homarr-labs/homarr/commit/e7267548fe132d6b32e3ba8379ebe31fa8f16635))
|
||||
* **deps:** update dependency typescript-eslint to ^8.45.0 ([#4215](https://github.com/homarr-labs/homarr/issues/4215)) ([e827f66](https://github.com/homarr-labs/homarr/commit/e827f6653f1caabaf4da7d477aa59849e9d023b9))
|
||||
* **deps:** update dependency winston to v3.18.0 ([#4219](https://github.com/homarr-labs/homarr/issues/4219)) ([e1162c7](https://github.com/homarr-labs/homarr/commit/e1162c7907b3285f1e8bb9980340ca758786715d))
|
||||
* **deps:** update dependency winston to v3.18.1 ([#4220](https://github.com/homarr-labs/homarr/issues/4220)) ([84ace42](https://github.com/homarr-labs/homarr/commit/84ace42aa5eb5f3f8e3351e64b1e1ba6fe747544))
|
||||
* **deps:** update dependency winston to v3.18.3 ([#4222](https://github.com/homarr-labs/homarr/issues/4222)) ([d9de969](https://github.com/homarr-labs/homarr/commit/d9de9694c0d7bbb630d40e64c01dee082856ce0f))
|
||||
* **deps:** update mantine monorepo to ^8.3.3 ([#4242](https://github.com/homarr-labs/homarr/issues/4242)) ([982a0c9](https://github.com/homarr-labs/homarr/commit/982a0c96a5d40a532d4fa06640f0d35e8125e1f2))
|
||||
* **deps:** update react monorepo to v19.2.0 ([#4230](https://github.com/homarr-labs/homarr/issues/4230)) ([35172fa](https://github.com/homarr-labs/homarr/commit/35172fa91007487c6da3f6e0709dadeab20621c6))
|
||||
* **deps:** update testcontainers-node monorepo to ^11.7.0 ([#4211](https://github.com/homarr-labs/homarr/issues/4211)) ([a21fbd2](https://github.com/homarr-labs/homarr/commit/a21fbd26dad82427e62a5a6b18f72dc32c00e608))
|
||||
* **deps:** update testcontainers-node monorepo to ^11.7.1 ([#4213](https://github.com/homarr-labs/homarr/issues/4213)) ([7e500f7](https://github.com/homarr-labs/homarr/commit/7e500f772d769b30354a73d73e2fee6382fb8811))
|
||||
|
||||
## [1.40.0](https://github.com/homarr-labs/homarr/compare/v1.39.0...v1.40.0) (2025-10-03)
|
||||
|
||||
### Features
|
||||
|
||||
+16
-16
@@ -50,12 +50,12 @@
|
||||
"@homarr/ui": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@homarr/widgets": "workspace:^0.1.0",
|
||||
"@mantine/colors-generator": "^8.3.2",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"@mantine/dropzone": "^8.3.2",
|
||||
"@mantine/hooks": "^8.3.2",
|
||||
"@mantine/modals": "^8.3.2",
|
||||
"@mantine/tiptap": "^8.3.2",
|
||||
"@mantine/colors-generator": "^8.3.4",
|
||||
"@mantine/core": "^8.3.4",
|
||||
"@mantine/dropzone": "^8.3.4",
|
||||
"@mantine/hooks": "^8.3.4",
|
||||
"@mantine/modals": "^8.3.4",
|
||||
"@mantine/tiptap": "^8.3.4",
|
||||
"@million/lint": "1.0.14",
|
||||
"@tabler/icons-react": "^3.35.0",
|
||||
"@tanstack/react-query": "^5.90.2",
|
||||
@@ -71,7 +71,7 @@
|
||||
"chroma-js": "^3.1.2",
|
||||
"clsx": "^2.1.1",
|
||||
"dayjs": "^1.11.18",
|
||||
"dotenv": "^17.2.2",
|
||||
"dotenv": "^17.2.3",
|
||||
"flag-icons": "^7.5.0",
|
||||
"glob": "^11.0.3",
|
||||
"jotai": "^2.15.0",
|
||||
@@ -79,30 +79,30 @@
|
||||
"next": "15.5.4",
|
||||
"postcss-preset-mantine": "^1.18.0",
|
||||
"prismjs": "^1.30.0",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"react-error-boundary": "^6.0.0",
|
||||
"react-simple-code-editor": "^0.14.1",
|
||||
"sass": "^1.93.2",
|
||||
"superjson": "2.2.2",
|
||||
"swagger-ui-react": "^5.29.0",
|
||||
"swagger-ui-react": "^5.29.4",
|
||||
"use-deep-compare-effect": "^1.8.1",
|
||||
"zod": "^4.1.11"
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/chroma-js": "3.1.1",
|
||||
"@types/node": "^22.18.7",
|
||||
"@types/node": "^22.18.10",
|
||||
"@types/prismjs": "^1.26.5",
|
||||
"@types/react": "19.1.15",
|
||||
"@types/react-dom": "19.1.9",
|
||||
"@types/react": "19.2.2",
|
||||
"@types/react-dom": "19.2.1",
|
||||
"@types/swagger-ui-react": "^5.18.0",
|
||||
"concurrently": "^9.2.1",
|
||||
"eslint": "^9.36.0",
|
||||
"eslint": "^9.37.0",
|
||||
"node-loader": "^2.1.0",
|
||||
"prettier": "^3.6.2",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import { Box, Grid, GridCol, Group, Image, Stack, Title } from "@mantine/core";
|
||||
|
||||
import { splitToNChunks } from "@homarr/common";
|
||||
import { integrationDefs } from "@homarr/definitions";
|
||||
import { getScopedI18n } from "@homarr/translation/server";
|
||||
|
||||
import classes from "./hero-banner.module.css";
|
||||
|
||||
@@ -12,19 +13,20 @@ const icons = Object.values(integrationDefs)
|
||||
const countIconGroups = 3;
|
||||
const animationDurationInSeconds = icons.length;
|
||||
const arrayInChunks = splitToNChunks(icons, countIconGroups);
|
||||
const gridSpan = 12 / countIconGroups;
|
||||
|
||||
export const HeroBanner = () => {
|
||||
const gridSpan = 12 / countIconGroups;
|
||||
export const HeroBanner = async () => {
|
||||
const t = await getScopedI18n("management.page.home");
|
||||
|
||||
return (
|
||||
<Box className={classes.bannerContainer} p={{ base: "lg", md: "3rem" }} bg="dark.6" pos="relative">
|
||||
<Stack gap={0}>
|
||||
<Title fz={{ base: "h4", md: "h2" }} c="dimmed">
|
||||
Welcome back to your
|
||||
{t("heroBanner.title")}
|
||||
</Title>
|
||||
<Group gap="xs" wrap="nowrap">
|
||||
<Image src="/logo/logo.png" w={{ base: 32, md: 40 }} h={{ base: 32, md: 40 }} />
|
||||
<Title fz={{ base: "h3", md: "h1" }}>Homarr Board</Title>
|
||||
<Title fz={{ base: "h3", md: "h1" }}>{t("heroBanner.subtitle", { app: "Homarr" })}</Title>
|
||||
</Group>
|
||||
</Stack>
|
||||
<Box visibleFrom="md" className={classes.scrollContainer} w={"30%"} top={0} right={0} pos="absolute">
|
||||
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
import { useCallback } from "react";
|
||||
import { SegmentedControl } from "@mantine/core";
|
||||
|
||||
import type { IntegrationSecretKind } from "@homarr/definitions";
|
||||
import type { UseFormReturnType } from "@homarr/form";
|
||||
import { useScopedI18n } from "@homarr/translation/client";
|
||||
|
||||
interface FormType {
|
||||
secrets: { kind: IntegrationSecretKind; value: string | null }[];
|
||||
}
|
||||
|
||||
interface SecretKindsSegmentedControlProps<TFormType extends FormType> {
|
||||
defaultKinds?: IntegrationSecretKind[];
|
||||
secretKinds: IntegrationSecretKind[][];
|
||||
form: UseFormReturnType<TFormType, (values: TFormType) => TFormType>;
|
||||
}
|
||||
|
||||
export const SecretKindsSegmentedControl = <TFormType extends FormType>({
|
||||
defaultKinds,
|
||||
secretKinds,
|
||||
form,
|
||||
}: SecretKindsSegmentedControlProps<TFormType>) => {
|
||||
const t = useScopedI18n("integration.secrets");
|
||||
|
||||
const defaultValue = defaultKinds?.length === 0 ? "empty" : defaultKinds?.join("-");
|
||||
const secretKindGroups = secretKinds.map((kinds) => ({
|
||||
label:
|
||||
kinds.length === 0
|
||||
? t("noSecretsRequired.segmentTitle")
|
||||
: kinds.map((kind) => t(`kind.${kind}.label`)).join(" & "),
|
||||
value: kinds.length === 0 ? "empty" : kinds.join("-"),
|
||||
}));
|
||||
|
||||
const onChange = useCallback(
|
||||
(value: string) => {
|
||||
if (value === "empty") {
|
||||
const emptyValues = [] satisfies FormType["secrets"];
|
||||
// @ts-expect-error somehow it is not able to understand that secrets is an array?
|
||||
form.setFieldValue("secrets", emptyValues);
|
||||
return;
|
||||
}
|
||||
|
||||
const kinds = value.split("-") as IntegrationSecretKind[];
|
||||
const secrets = kinds.map((kind) => ({
|
||||
kind,
|
||||
value: "",
|
||||
})) satisfies FormType["secrets"];
|
||||
// @ts-expect-error somehow it is not able to understand that secrets is an array?
|
||||
form.setFieldValue("secrets", secrets);
|
||||
},
|
||||
[form],
|
||||
);
|
||||
|
||||
return (
|
||||
<SegmentedControl
|
||||
fullWidth
|
||||
data={secretKindGroups}
|
||||
defaultValue={defaultValue}
|
||||
onChange={onChange}
|
||||
></SegmentedControl>
|
||||
);
|
||||
};
|
||||
+65
-33
@@ -3,7 +3,8 @@
|
||||
import { useState } from "react";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/navigation";
|
||||
import { Button, Fieldset, Group, Stack, TextInput } from "@mantine/core";
|
||||
import { Alert, Button, Fieldset, Group, Stack, Text, TextInput } from "@mantine/core";
|
||||
import { IconInfoCircle } from "@tabler/icons-react";
|
||||
import type { z } from "zod/v4";
|
||||
|
||||
import type { RouterOutputs } from "@homarr/api";
|
||||
@@ -18,6 +19,7 @@ import { integrationUpdateSchema } from "@homarr/validation/integration";
|
||||
|
||||
import { SecretCard } from "../../_components/secrets/integration-secret-card";
|
||||
import { IntegrationSecretInput } from "../../_components/secrets/integration-secret-inputs";
|
||||
import { SecretKindsSegmentedControl } from "../../_components/secrets/integration-secret-segmented-control";
|
||||
import { IntegrationTestConnectionError } from "../../_components/test-connection/integration-test-connection-error";
|
||||
import type { AnyMappedTestConnectionError } from "../../_components/test-connection/types";
|
||||
|
||||
@@ -28,19 +30,21 @@ interface EditIntegrationForm {
|
||||
export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => {
|
||||
const t = useI18n();
|
||||
const { openConfirmModal } = useConfirmModal();
|
||||
const secretsKinds =
|
||||
const allSecretKinds = getAllSecretKindOptions(integration.kind);
|
||||
|
||||
const initialSecretsKinds =
|
||||
getAllSecretKindOptions(integration.kind).find((secretKinds) =>
|
||||
integration.secrets.every((secret) => secretKinds.includes(secret.kind)),
|
||||
) ?? getDefaultSecretKinds(integration.kind);
|
||||
|
||||
const hasUrlSecret = secretsKinds.includes("url");
|
||||
const hasUrlSecret = initialSecretsKinds.includes("url");
|
||||
|
||||
const router = useRouter();
|
||||
const form = useZodForm(integrationUpdateSchema.omit({ id: true }), {
|
||||
initialValues: {
|
||||
name: integration.name,
|
||||
url: integration.url,
|
||||
secrets: secretsKinds.map((kind) => ({
|
||||
secrets: initialSecretsKinds.map((kind) => ({
|
||||
kind,
|
||||
value: integration.secrets.find((secret) => secret.kind === kind)?.value ?? "",
|
||||
})),
|
||||
@@ -93,6 +97,10 @@ export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => {
|
||||
);
|
||||
};
|
||||
|
||||
const isInitialSecretKinds =
|
||||
initialSecretsKinds.every((kind) => form.values.secrets.some((secret) => secret.kind === kind)) &&
|
||||
form.values.secrets.length === initialSecretsKinds.length;
|
||||
|
||||
return (
|
||||
<form onSubmit={form.onSubmit((values) => void handleSubmitAsync(values))}>
|
||||
<Stack>
|
||||
@@ -104,36 +112,60 @@ export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => {
|
||||
|
||||
<Fieldset legend={t("integration.secrets.title")}>
|
||||
<Stack gap="sm">
|
||||
{secretsKinds.map((kind, index) => (
|
||||
<SecretCard
|
||||
key={kind}
|
||||
secret={secretsMap.get(kind) ?? { kind, value: null, updatedAt: null }}
|
||||
onCancel={() =>
|
||||
new Promise((resolve) => {
|
||||
// When nothing changed, just close the secret card
|
||||
if ((form.values.secrets[index]?.value ?? "") === (secretsMap.get(kind)?.value ?? "")) {
|
||||
return resolve(true);
|
||||
{allSecretKinds.length > 1 && (
|
||||
<SecretKindsSegmentedControl
|
||||
defaultKinds={initialSecretsKinds}
|
||||
secretKinds={allSecretKinds}
|
||||
form={form}
|
||||
/>
|
||||
)}
|
||||
{!isInitialSecretKinds
|
||||
? null
|
||||
: form.values.secrets.map((secret, index) => (
|
||||
<SecretCard
|
||||
key={secret.kind}
|
||||
secret={secretsMap.get(secret.kind) ?? { kind: secret.kind, value: null, updatedAt: null }}
|
||||
onCancel={() =>
|
||||
new Promise((resolve) => {
|
||||
// When nothing changed, just close the secret card
|
||||
if ((secret.value ?? "") === (secretsMap.get(secret.kind)?.value ?? "")) {
|
||||
return resolve(true);
|
||||
}
|
||||
openConfirmModal({
|
||||
title: t("integration.secrets.reset.title"),
|
||||
children: t("integration.secrets.reset.message"),
|
||||
onCancel: () => resolve(false),
|
||||
onConfirm: () => {
|
||||
form.setFieldValue(`secrets.${index}.value`, secretsMap.get(secret.kind)?.value ?? "");
|
||||
resolve(true);
|
||||
},
|
||||
});
|
||||
})
|
||||
}
|
||||
openConfirmModal({
|
||||
title: t("integration.secrets.reset.title"),
|
||||
children: t("integration.secrets.reset.message"),
|
||||
onCancel: () => resolve(false),
|
||||
onConfirm: () => {
|
||||
form.setFieldValue(`secrets.${index}.value`, secretsMap.get(kind)?.value ?? "");
|
||||
resolve(true);
|
||||
},
|
||||
});
|
||||
})
|
||||
}
|
||||
>
|
||||
<IntegrationSecretInput
|
||||
label={t(`integration.secrets.kind.${kind}.newLabel`)}
|
||||
key={kind}
|
||||
kind={kind}
|
||||
{...form.getInputProps(`secrets.${index}.value`)}
|
||||
/>
|
||||
</SecretCard>
|
||||
))}
|
||||
>
|
||||
<IntegrationSecretInput
|
||||
label={t(`integration.secrets.kind.${secret.kind}.newLabel`)}
|
||||
key={secret.kind}
|
||||
kind={secret.kind}
|
||||
{...form.getInputProps(`secrets.${index}.value`)}
|
||||
/>
|
||||
</SecretCard>
|
||||
))}
|
||||
{isInitialSecretKinds
|
||||
? null
|
||||
: form.values.secrets.map(({ kind }, index) => (
|
||||
<IntegrationSecretInput
|
||||
withAsterisk
|
||||
key={kind}
|
||||
kind={kind}
|
||||
{...form.getInputProps(`secrets.${index}.value`)}
|
||||
/>
|
||||
))}
|
||||
{form.values.secrets.length === 0 && (
|
||||
<Alert icon={<IconInfoCircle size={"1rem"} />} color={"blue"}>
|
||||
<Text c={"blue"}>{t("integration.secrets.noSecretsRequired.text")}</Text>
|
||||
</Alert>
|
||||
)}
|
||||
</Stack>
|
||||
</Fieldset>
|
||||
|
||||
|
||||
@@ -1,26 +1,15 @@
|
||||
"use client";
|
||||
|
||||
import { useCallback, useState } from "react";
|
||||
import { useState } from "react";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/navigation";
|
||||
import {
|
||||
Alert,
|
||||
Button,
|
||||
Checkbox,
|
||||
Collapse,
|
||||
Fieldset,
|
||||
Group,
|
||||
SegmentedControl,
|
||||
Stack,
|
||||
Text,
|
||||
TextInput,
|
||||
} from "@mantine/core";
|
||||
import { Alert, Button, Checkbox, Collapse, Fieldset, Group, Stack, Text, TextInput } from "@mantine/core";
|
||||
import { IconInfoCircle } from "@tabler/icons-react";
|
||||
import { z } from "zod/v4";
|
||||
|
||||
import { clientApi } from "@homarr/api/client";
|
||||
import { revalidatePathActionAsync } from "@homarr/common/client";
|
||||
import type { IntegrationKind, IntegrationSecretKind } from "@homarr/definitions";
|
||||
import type { IntegrationKind } from "@homarr/definitions";
|
||||
import {
|
||||
getAllSecretKindOptions,
|
||||
getIconUrl,
|
||||
@@ -28,14 +17,14 @@ import {
|
||||
getIntegrationName,
|
||||
integrationDefs,
|
||||
} from "@homarr/definitions";
|
||||
import type { UseFormReturnType } from "@homarr/form";
|
||||
import { useZodForm } from "@homarr/form";
|
||||
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
|
||||
import { useI18n, useScopedI18n } from "@homarr/translation/client";
|
||||
import { useI18n } from "@homarr/translation/client";
|
||||
import { appHrefSchema } from "@homarr/validation/app";
|
||||
import { integrationCreateSchema } from "@homarr/validation/integration";
|
||||
|
||||
import { IntegrationSecretInput } from "../_components/secrets/integration-secret-inputs";
|
||||
import { SecretKindsSegmentedControl } from "../_components/secrets/integration-secret-segmented-control";
|
||||
import { IntegrationTestConnectionError } from "../_components/test-connection/integration-test-connection-error";
|
||||
import type { AnyMappedTestConnectionError } from "../_components/test-connection/types";
|
||||
|
||||
@@ -218,40 +207,4 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) =>
|
||||
);
|
||||
};
|
||||
|
||||
interface SecretKindsSegmentedControlProps {
|
||||
secretKinds: IntegrationSecretKind[][];
|
||||
form: UseFormReturnType<FormType, (values: FormType) => FormType>;
|
||||
}
|
||||
|
||||
const SecretKindsSegmentedControl = ({ secretKinds, form }: SecretKindsSegmentedControlProps) => {
|
||||
const t = useScopedI18n("integration.secrets");
|
||||
|
||||
const secretKindGroups = secretKinds.map((kinds) => ({
|
||||
label:
|
||||
kinds.length === 0
|
||||
? t("noSecretsRequired.segmentTitle")
|
||||
: kinds.map((kind) => t(`kind.${kind}.label`)).join(" & "),
|
||||
value: kinds.length === 0 ? "empty" : kinds.join("-"),
|
||||
}));
|
||||
|
||||
const onChange = useCallback(
|
||||
(value: string) => {
|
||||
if (value === "empty") {
|
||||
form.setFieldValue("secrets", []);
|
||||
return;
|
||||
}
|
||||
|
||||
const kinds = value.split("-") as IntegrationSecretKind[];
|
||||
const secrets = kinds.map((kind) => ({
|
||||
kind,
|
||||
value: "",
|
||||
}));
|
||||
form.setFieldValue("secrets", secrets);
|
||||
},
|
||||
[form],
|
||||
);
|
||||
|
||||
return <SegmentedControl fullWidth data={secretKindGroups} onChange={onChange}></SegmentedControl>;
|
||||
};
|
||||
|
||||
type FormType = z.infer<typeof formSchema>;
|
||||
@@ -1,25 +1,16 @@
|
||||
import type { Metadata } from "next";
|
||||
import Link from "next/link";
|
||||
import { Card, Group, SimpleGrid, Space, Stack, Text } from "@mantine/core";
|
||||
import { IconArrowRight } from "@tabler/icons-react";
|
||||
|
||||
import { api } from "@homarr/api/server";
|
||||
import { auth } from "@homarr/auth/next";
|
||||
import { isProviderEnabled } from "@homarr/auth/server";
|
||||
import { getScopedI18n } from "@homarr/translation/server";
|
||||
|
||||
import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb";
|
||||
import { createMetaTitle } from "~/metadata";
|
||||
import { HeroBanner } from "./_components/hero-banner";
|
||||
|
||||
interface LinkProps {
|
||||
title: string;
|
||||
subtitle: string;
|
||||
count: number;
|
||||
href: string;
|
||||
hidden?: boolean;
|
||||
}
|
||||
|
||||
export async function generateMetadata() {
|
||||
export async function generateMetadata(): Promise<Metadata> {
|
||||
const t = await getScopedI18n("management");
|
||||
|
||||
return {
|
||||
@@ -29,78 +20,32 @@ export async function generateMetadata() {
|
||||
|
||||
export default async function ManagementPage() {
|
||||
const statistics = await api.home.getStats();
|
||||
const session = await auth();
|
||||
const t = await getScopedI18n("management.page.home");
|
||||
|
||||
const links: LinkProps[] = [
|
||||
{
|
||||
count: statistics.countBoards,
|
||||
href: "/manage/boards",
|
||||
subtitle: t("statisticLabel.boards"),
|
||||
title: t("statistic.board"),
|
||||
},
|
||||
{
|
||||
count: statistics.countUsers,
|
||||
href: "/manage/users",
|
||||
subtitle: t("statisticLabel.authentication"),
|
||||
title: t("statistic.user"),
|
||||
hidden: !session?.user.permissions.includes("admin"),
|
||||
},
|
||||
{
|
||||
count: statistics.countInvites,
|
||||
href: "/manage/users/invites",
|
||||
subtitle: t("statisticLabel.authentication"),
|
||||
title: t("statistic.invite"),
|
||||
hidden: !isProviderEnabled("credentials") || !session?.user.permissions.includes("admin"),
|
||||
},
|
||||
{
|
||||
count: statistics.countIntegrations,
|
||||
href: "/manage/integrations",
|
||||
subtitle: t("statisticLabel.resources"),
|
||||
title: t("statistic.integration"),
|
||||
},
|
||||
{
|
||||
count: statistics.countApps,
|
||||
href: "/manage/apps",
|
||||
subtitle: t("statisticLabel.resources"),
|
||||
title: t("statistic.app"),
|
||||
hidden: !session?.user,
|
||||
},
|
||||
{
|
||||
count: statistics.countGroups,
|
||||
href: "/manage/users/groups",
|
||||
subtitle: t("statisticLabel.authorization"),
|
||||
title: t("statistic.group"),
|
||||
hidden: !session?.user.permissions.includes("admin"),
|
||||
},
|
||||
];
|
||||
return (
|
||||
<>
|
||||
<DynamicBreadcrumb />
|
||||
<HeroBanner />
|
||||
<Space h="md" />
|
||||
<SimpleGrid cols={{ xs: 1, sm: 2, md: 3 }}>
|
||||
{links.map(
|
||||
(link) =>
|
||||
!link.hidden && (
|
||||
<Card component={Link} href={link.href} key={link.href} radius="lg">
|
||||
<Group justify="space-between" wrap="nowrap">
|
||||
<Group wrap="nowrap">
|
||||
<Text size="2.4rem" fw="bolder">
|
||||
{link.count}
|
||||
</Text>
|
||||
<Stack gap={0}>
|
||||
<Text c="red" size="xs">
|
||||
{link.subtitle}
|
||||
</Text>
|
||||
<Text fw="bold">{link.title}</Text>
|
||||
</Stack>
|
||||
</Group>
|
||||
<IconArrowRight />
|
||||
</Group>
|
||||
</Card>
|
||||
),
|
||||
)}
|
||||
{statistics.map((statistic) => (
|
||||
<Card component={Link} href={statistic.path} key={statistic.path} radius="lg">
|
||||
<Group justify="space-between" wrap="nowrap">
|
||||
<Group wrap="nowrap">
|
||||
<Text size="2.4rem" fw="bolder">
|
||||
{statistic.count}
|
||||
</Text>
|
||||
<Stack gap={0}>
|
||||
<Text c="red" size="xs">
|
||||
{t(`statisticLabel.${statistic.subtitleKey}`)}
|
||||
</Text>
|
||||
<Text fw="bold">{t(`statistic.${statistic.titleKey}`)}</Text>
|
||||
</Stack>
|
||||
</Group>
|
||||
<IconArrowRight />
|
||||
</Group>
|
||||
</Card>
|
||||
))}
|
||||
</SimpleGrid>
|
||||
</>
|
||||
);
|
||||
|
||||
+14
-28
@@ -92,38 +92,24 @@ export const UserProfileAvatarForm = ({ user }: UserProfileAvatarForm) => {
|
||||
});
|
||||
}, [mutate, user.id, openConfirmModal, tManageAvatar]);
|
||||
|
||||
const isCredentialsUser = user.provider === "credentials";
|
||||
|
||||
return (
|
||||
<Box pos="relative">
|
||||
<Menu
|
||||
opened={opened}
|
||||
keepMounted
|
||||
onChange={isCredentialsUser ? toggle : undefined}
|
||||
position="bottom-start"
|
||||
withArrow
|
||||
>
|
||||
<Menu opened={opened} keepMounted onChange={toggle} position="bottom-start" withArrow>
|
||||
<Menu.Target>
|
||||
<UnstyledButton
|
||||
component={isCredentialsUser ? undefined : "div"}
|
||||
style={{ cursor: !isCredentialsUser ? "default" : undefined }}
|
||||
onClick={isCredentialsUser ? toggle : undefined}
|
||||
>
|
||||
<UnstyledButton onClick={toggle}>
|
||||
<UserAvatar user={user} size={200} />
|
||||
{isCredentialsUser && (
|
||||
<Button
|
||||
component="div"
|
||||
pos="absolute"
|
||||
bottom={0}
|
||||
left={0}
|
||||
size="compact-md"
|
||||
fw="normal"
|
||||
variant="default"
|
||||
leftSection={<IconPencil size={18} stroke={1.5} />}
|
||||
>
|
||||
{t("common.action.edit")}
|
||||
</Button>
|
||||
)}
|
||||
<Button
|
||||
component="div"
|
||||
pos="absolute"
|
||||
bottom={0}
|
||||
left={0}
|
||||
size="compact-md"
|
||||
fw="normal"
|
||||
variant="default"
|
||||
leftSection={<IconPencil size={18} stroke={1.5} />}
|
||||
>
|
||||
{t("common.action.edit")}
|
||||
</Button>
|
||||
</UnstyledButton>
|
||||
</Menu.Target>
|
||||
<Menu.Dropdown>
|
||||
|
||||
@@ -12,6 +12,7 @@ export class DynamicSectionMockBuilder {
|
||||
options: {
|
||||
title: "",
|
||||
borderColor: "",
|
||||
customCssClasses: [],
|
||||
},
|
||||
layouts: [],
|
||||
...section,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Badge, Box, Card } from "@mantine/core";
|
||||
import combineClasses from "clsx";
|
||||
|
||||
import { useCurrentLayout, useRequiredBoard } from "@homarr/boards/context";
|
||||
|
||||
@@ -24,7 +25,7 @@ export const BoardDynamicSection = ({ section }: Props) => {
|
||||
}}
|
||||
>
|
||||
<Card
|
||||
className={classes.itemCard}
|
||||
className={combineClasses(classes.itemCard, section.options.customCssClasses.join(" "))}
|
||||
w="100%"
|
||||
h="100%"
|
||||
withBorder
|
||||
|
||||
@@ -19,6 +19,7 @@ export const addDynamicSectionCallback = () => (board: Board) => {
|
||||
options: {
|
||||
title: "",
|
||||
borderColor: "",
|
||||
customCssClasses: [],
|
||||
},
|
||||
layouts: createDynamicSectionLayouts(board, firstSection),
|
||||
} satisfies DynamicSection;
|
||||
|
||||
@@ -6,6 +6,7 @@ import type { z } from "zod/v4";
|
||||
import { useZodForm } from "@homarr/form";
|
||||
import { createModal } from "@homarr/modals";
|
||||
import { useI18n } from "@homarr/translation/client";
|
||||
import { TextMultiSelect } from "@homarr/ui";
|
||||
import { dynamicSectionOptionsSchema } from "@homarr/validation/shared";
|
||||
|
||||
interface ModalProps {
|
||||
@@ -31,6 +32,10 @@ export const DynamicSectionEditModal = createModal<ModalProps>(({ actions, inner
|
||||
>
|
||||
<Stack>
|
||||
<TextInput label={t("section.dynamic.option.title.label")} {...form.getInputProps("title")} />
|
||||
<TextMultiSelect
|
||||
label={t("section.dynamic.option.customCssClasses.label")}
|
||||
{...form.getInputProps("customCssClasses")}
|
||||
/>
|
||||
<ColorInput
|
||||
label={t("section.dynamic.option.borderColor.label")}
|
||||
format="hex"
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@homarr/widgets": "workspace:^0.1.0",
|
||||
"dayjs": "^1.11.18",
|
||||
"dotenv": "^17.2.2",
|
||||
"dotenv": "^17.2.3",
|
||||
"fastify": "^5.6.1",
|
||||
"superjson": "2.2.2",
|
||||
"undici": "7.16.0"
|
||||
@@ -47,12 +47,12 @@
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/node": "^22.18.7",
|
||||
"@types/node": "^22.18.10",
|
||||
"dotenv-cli": "^10.0.0",
|
||||
"esbuild": "^0.25.10",
|
||||
"eslint": "^9.36.0",
|
||||
"eslint": "^9.37.0",
|
||||
"prettier": "^3.6.2",
|
||||
"tsx": "4.20.4",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@
|
||||
"@homarr/log": "workspace:^",
|
||||
"@homarr/redis": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"dotenv": "^17.2.2",
|
||||
"dotenv": "^17.2.3",
|
||||
"tsx": "4.20.4",
|
||||
"ws": "^8.18.3"
|
||||
},
|
||||
@@ -35,8 +35,8 @@
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/ws": "^8.18.1",
|
||||
"esbuild": "^0.25.10",
|
||||
"eslint": "^9.36.0",
|
||||
"eslint": "^9.37.0",
|
||||
"prettier": "^3.6.2",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
+10
-10
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homarr",
|
||||
"version": "1.40.0",
|
||||
"version": "1.42.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "cross-env CI=true turbo build",
|
||||
@@ -42,23 +42,23 @@
|
||||
"@semantic-release/github": "^11.0.6",
|
||||
"@semantic-release/npm": "^12.0.2",
|
||||
"@semantic-release/release-notes-generator": "^14.1.0",
|
||||
"@testcontainers/redis": "^11.6.0",
|
||||
"@testcontainers/redis": "^11.7.1",
|
||||
"@turbo/gen": "^2.5.8",
|
||||
"@vitejs/plugin-react": "^5.0.4",
|
||||
"@vitest/coverage-v8": "^3.2.4",
|
||||
"@vitest/ui": "^3.2.4",
|
||||
"conventional-changelog-conventionalcommits": "^9.1.0",
|
||||
"cross-env": "^10.0.0",
|
||||
"cross-env": "^10.1.0",
|
||||
"jsdom": "^27.0.0",
|
||||
"prettier": "^3.6.2",
|
||||
"semantic-release": "^24.2.9",
|
||||
"testcontainers": "^11.6.0",
|
||||
"testcontainers": "^11.7.1",
|
||||
"turbo": "^2.5.8",
|
||||
"typescript": "^5.9.2",
|
||||
"typescript": "^5.9.3",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^3.2.4"
|
||||
},
|
||||
"packageManager": "pnpm@10.17.1",
|
||||
"packageManager": "pnpm@10.18.2",
|
||||
"engines": {
|
||||
"node": ">=22.20.0"
|
||||
},
|
||||
@@ -82,18 +82,18 @@
|
||||
"brace-expansion@>=1.0.0 <=1.1.11": ">=4.0.1",
|
||||
"esbuild@<=0.24.2": ">=0.25.10",
|
||||
"form-data@>=4.0.0 <4.0.4": ">=4.0.4",
|
||||
"hono@<4.6.5": ">=4.9.9",
|
||||
"hono@<4.6.5": ">=4.9.11",
|
||||
"linkifyjs@<4.3.2": ">=4.3.2",
|
||||
"nanoid@>=4.0.0 <5.0.9": ">=5.1.6",
|
||||
"prismjs@<1.30.0": ">=1.30.0",
|
||||
"proxmox-api>undici": "7.16.0",
|
||||
"react-is": "^19.1.1",
|
||||
"rollup@>=4.0.0 <4.22.4": ">=4.52.3",
|
||||
"react-is": "^19.2.0",
|
||||
"rollup@>=4.0.0 <4.22.4": ">=4.52.4",
|
||||
"sha.js@<=2.4.11": ">=2.4.12",
|
||||
"tar-fs@>=3.0.0 <3.0.9": ">=3.1.1",
|
||||
"tar-fs@>=2.0.0 <2.1.3": ">=3.1.1",
|
||||
"tmp@<=0.2.3": ">=0.2.5",
|
||||
"vite@>=5.0.0 <=5.4.18": ">=7.1.7"
|
||||
"vite@>=5.0.0 <=5.4.18": ">=7.1.9"
|
||||
},
|
||||
"patchedDependencies": {
|
||||
"@types/node-unifi": "patches/@types__node-unifi.patch",
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -40,8 +40,9 @@
|
||||
"@homarr/redis": "workspace:^0.1.0",
|
||||
"@homarr/request-handler": "workspace:^0.1.0",
|
||||
"@homarr/server-settings": "workspace:^0.1.0",
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@kubernetes/client-node": "^1.3.0",
|
||||
"@kubernetes/client-node": "^1.4.0",
|
||||
"@tanstack/react-query": "^5.90.2",
|
||||
"@trpc/client": "^11.6.0",
|
||||
"@trpc/react-query": "^11.6.0",
|
||||
@@ -49,18 +50,18 @@
|
||||
"@trpc/tanstack-react-query": "^11.6.0",
|
||||
"lodash.clonedeep": "^4.5.0",
|
||||
"next": "15.5.4",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"superjson": "2.2.2",
|
||||
"trpc-to-openapi": "^3.0.1",
|
||||
"zod": "^4.1.11"
|
||||
"trpc-to-openapi": "^3.1.0",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"eslint": "^9.37.0",
|
||||
"prettier": "^3.6.2",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
+136
-20
@@ -1,31 +1,147 @@
|
||||
import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
||||
|
||||
import { isProviderEnabled } from "@homarr/auth/server";
|
||||
import type { Database } from "@homarr/db";
|
||||
import { apps, boards, groups, integrations, invites, users } from "@homarr/db/schema";
|
||||
import { db, eq, inArray, or } from "@homarr/db";
|
||||
import {
|
||||
apps,
|
||||
boards,
|
||||
boardUserPermissions,
|
||||
groupMembers,
|
||||
groups,
|
||||
integrations,
|
||||
invites,
|
||||
medias,
|
||||
searchEngines,
|
||||
users,
|
||||
} from "@homarr/db/schema";
|
||||
import type { TranslationObject } from "@homarr/translation";
|
||||
|
||||
import { createTRPCRouter, publicProcedure } from "../trpc";
|
||||
|
||||
interface HomeStatistic {
|
||||
titleKey: keyof TranslationObject["management"]["page"]["home"]["statistic"];
|
||||
subtitleKey: keyof TranslationObject["management"]["page"]["home"]["statisticLabel"];
|
||||
count: number;
|
||||
path: string;
|
||||
}
|
||||
|
||||
export const homeRouter = createTRPCRouter({
|
||||
getStats: publicProcedure.query(async ({ ctx }) => {
|
||||
const isAdmin = ctx.session?.user.permissions.includes("admin") ?? false;
|
||||
const isCredentialsEnabled = isProviderEnabled("credentials");
|
||||
|
||||
return {
|
||||
countBoards: await getCountForTableAsync(ctx.db, boards, true),
|
||||
countUsers: await getCountForTableAsync(ctx.db, users, isAdmin),
|
||||
countGroups: await getCountForTableAsync(ctx.db, groups, true),
|
||||
countInvites: await getCountForTableAsync(ctx.db, invites, isAdmin),
|
||||
countIntegrations: await getCountForTableAsync(ctx.db, integrations, isCredentialsEnabled && isAdmin),
|
||||
countApps: await getCountForTableAsync(ctx.db, apps, true),
|
||||
};
|
||||
const statistics: HomeStatistic[] = [];
|
||||
|
||||
const boardIds: string[] = [];
|
||||
if (ctx.session?.user && !ctx.session.user.permissions.includes("board-view-all")) {
|
||||
const permissionsOfCurrentUserWhenPresent = await ctx.db.query.boardUserPermissions.findMany({
|
||||
where: eq(boardUserPermissions.userId, ctx.session.user.id),
|
||||
});
|
||||
|
||||
const permissionsOfCurrentUserGroupsWhenPresent = await ctx.db.query.groupMembers.findMany({
|
||||
where: eq(groupMembers.userId, ctx.session.user.id),
|
||||
with: {
|
||||
group: {
|
||||
with: {
|
||||
boardPermissions: {},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
boardIds.push(
|
||||
...permissionsOfCurrentUserWhenPresent
|
||||
.map((permission) => permission.boardId)
|
||||
.concat(
|
||||
permissionsOfCurrentUserGroupsWhenPresent
|
||||
.map((groupMember) => groupMember.group.boardPermissions.map((permission) => permission.boardId))
|
||||
.flat(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
statistics.push({
|
||||
titleKey: "board",
|
||||
subtitleKey: "boards",
|
||||
count: await db.$count(
|
||||
boards,
|
||||
ctx.session?.user.permissions.includes("board-view-all")
|
||||
? undefined
|
||||
: or(
|
||||
eq(boards.isPublic, true),
|
||||
eq(boards.creatorId, ctx.session?.user.id ?? ""),
|
||||
boardIds.length > 0 ? inArray(boards.id, boardIds) : undefined,
|
||||
),
|
||||
),
|
||||
path: "/manage/boards",
|
||||
});
|
||||
|
||||
if (isAdmin) {
|
||||
statistics.push({
|
||||
titleKey: "user",
|
||||
subtitleKey: "authentication",
|
||||
count: await db.$count(users),
|
||||
path: "/manage/users",
|
||||
});
|
||||
}
|
||||
|
||||
if (isAdmin && isCredentialsEnabled) {
|
||||
statistics.push({
|
||||
titleKey: "invite",
|
||||
subtitleKey: "authentication",
|
||||
count: await db.$count(invites),
|
||||
path: "/manage/users/invites",
|
||||
});
|
||||
}
|
||||
|
||||
if (ctx.session?.user.permissions.includes("integration-create")) {
|
||||
statistics.push({
|
||||
titleKey: "integration",
|
||||
subtitleKey: "resources",
|
||||
count: await db.$count(integrations),
|
||||
path: "/manage/integrations",
|
||||
});
|
||||
}
|
||||
|
||||
if (ctx.session?.user) {
|
||||
statistics.push({
|
||||
titleKey: "app",
|
||||
subtitleKey: "resources",
|
||||
count: await db.$count(apps),
|
||||
path: "/manage/apps",
|
||||
});
|
||||
}
|
||||
|
||||
if (isAdmin) {
|
||||
statistics.push({
|
||||
titleKey: "group",
|
||||
subtitleKey: "authorization",
|
||||
count: await db.$count(groups),
|
||||
path: "/manage/users/groups",
|
||||
});
|
||||
}
|
||||
|
||||
if (ctx.session?.user.permissions.includes("search-engine-create")) {
|
||||
statistics.push({
|
||||
titleKey: "searchEngine",
|
||||
subtitleKey: "resources",
|
||||
count: await db.$count(searchEngines),
|
||||
path: "/manage/search-engines",
|
||||
});
|
||||
}
|
||||
|
||||
if (ctx.session?.user.permissions.includes("media-upload")) {
|
||||
statistics.push({
|
||||
titleKey: "media",
|
||||
subtitleKey: "resources",
|
||||
count: await db.$count(
|
||||
medias,
|
||||
ctx.session.user.permissions.includes("media-view-all")
|
||||
? undefined
|
||||
: eq(medias.creatorId, ctx.session.user.id),
|
||||
),
|
||||
path: "/manage/medias",
|
||||
});
|
||||
}
|
||||
|
||||
return statistics;
|
||||
}),
|
||||
});
|
||||
|
||||
const getCountForTableAsync = async (db: Database, table: AnySQLiteTable, canView: boolean) => {
|
||||
if (!canView) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return await db.$count(table);
|
||||
};
|
||||
@@ -4,7 +4,7 @@ import { z } from "zod/v4";
|
||||
import { createId, objectEntries } from "@homarr/common";
|
||||
import { decryptSecret, encryptSecret } from "@homarr/common/server";
|
||||
import type { Database } from "@homarr/db";
|
||||
import { and, asc, eq, handleTransactionsAsync, inArray, like } from "@homarr/db";
|
||||
import { and, asc, eq, handleTransactionsAsync, inArray, like, or } from "@homarr/db";
|
||||
import {
|
||||
groupMembers,
|
||||
groupPermissions,
|
||||
@@ -386,6 +386,21 @@ export const integrationRouter = createTRPCRouter({
|
||||
}
|
||||
}
|
||||
|
||||
const removedSecrets = integration.secrets.filter(
|
||||
(dbSecret) => !input.secrets.some((secret) => dbSecret.kind === secret.kind),
|
||||
);
|
||||
if (removedSecrets.length >= 1) {
|
||||
await ctx.db
|
||||
.delete(integrationSecrets)
|
||||
.where(
|
||||
or(
|
||||
...removedSecrets.map((secret) =>
|
||||
and(eq(integrationSecrets.integrationId, input.id), eq(integrationSecrets.kind, secret.kind)),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
logger.info("Updated integration", {
|
||||
id: input.id,
|
||||
name: input.name,
|
||||
|
||||
@@ -114,11 +114,10 @@ export const userRouter = createTRPCRouter({
|
||||
.input(
|
||||
z.object({
|
||||
userId: z.string(),
|
||||
// Max image size of 256KB, only png and jpeg are allowed
|
||||
image: z
|
||||
.string()
|
||||
.regex(/^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9/+]+=*$/g)
|
||||
.max(262144)
|
||||
.max(350000) // approximately 256KB in base64 (256 * 1024 * 4 / 3 + prefixes)
|
||||
.nullable(),
|
||||
}),
|
||||
)
|
||||
@@ -147,13 +146,6 @@ export const userRouter = createTRPCRouter({
|
||||
});
|
||||
}
|
||||
|
||||
if (user.provider !== "credentials") {
|
||||
throw new TRPCError({
|
||||
code: "FORBIDDEN",
|
||||
message: "Profile image can not be changed for users with external providers",
|
||||
});
|
||||
}
|
||||
|
||||
await ctx.db
|
||||
.update(users)
|
||||
.set({
|
||||
|
||||
@@ -20,6 +20,7 @@ export const createSignInEventHandler = (db: Database): Exclude<NextAuthConfig["
|
||||
where: eq(users.id, user.id),
|
||||
columns: {
|
||||
name: true,
|
||||
image: true,
|
||||
colorScheme: true,
|
||||
},
|
||||
});
|
||||
@@ -59,6 +60,15 @@ export const createSignInEventHandler = (db: Database): Exclude<NextAuthConfig["
|
||||
`Username for user of oidc provider has changed. user=${user.id} old='${dbUser.name}' new='${profileUsername}'`,
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
typeof profile.picture === "string" &&
|
||||
dbUser.image !== profile.picture &&
|
||||
!dbUser.image?.startsWith("data:")
|
||||
) {
|
||||
await db.update(users).set({ image: profile.picture }).where(eq(users.id, user.id));
|
||||
logger.info(`Profile picture for user of oidc provider has changed. user=${user.id}'`);
|
||||
}
|
||||
}
|
||||
|
||||
logger.info(`User '${dbUser.name}' logged in at ${dayjs().format()}`);
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
},
|
||||
"prettier": "@homarr/prettier-config",
|
||||
"dependencies": {
|
||||
"@auth/core": "^0.40.0",
|
||||
"@auth/drizzle-adapter": "^1.10.0",
|
||||
"@auth/core": "^0.41.0",
|
||||
"@auth/drizzle-adapter": "^1.11.0",
|
||||
"@homarr/certificates": "workspace:^0.1.0",
|
||||
"@homarr/common": "workspace:^0.1.0",
|
||||
"@homarr/core": "workspace:^0.1.0",
|
||||
@@ -37,9 +37,9 @@
|
||||
"ldapts": "8.0.9",
|
||||
"next": "15.5.4",
|
||||
"next-auth": "5.0.0-beta.29",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"zod": "^4.1.11"
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
@@ -47,8 +47,8 @@
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/bcrypt": "6.0.0",
|
||||
"@types/cookies": "0.9.1",
|
||||
"eslint": "^9.36.0",
|
||||
"eslint": "^9.37.0",
|
||||
"prettier": "^3.6.2",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -61,6 +61,7 @@ export const OidcProvider = (headers: ReadonlyHeaders | null): OIDCConfig<Profil
|
||||
id: profile.sub,
|
||||
name,
|
||||
email: profile.email,
|
||||
image: typeof profile.picture === "string" ? profile.picture : null,
|
||||
provider: "oidc",
|
||||
};
|
||||
},
|
||||
|
||||
@@ -25,14 +25,14 @@
|
||||
"prettier": "@homarr/prettier-config",
|
||||
"dependencies": {
|
||||
"@homarr/api": "workspace:^0.1.0",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1"
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,7 @@
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -28,14 +28,14 @@
|
||||
"@homarr/common": "workspace:^0.1.0",
|
||||
"@homarr/db": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"dotenv": "^17.2.2"
|
||||
"dotenv": "^17.2.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"esbuild": "^0.25.10",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -34,17 +34,17 @@
|
||||
"dns-caching": "^0.2.7",
|
||||
"next": "15.5.4",
|
||||
"octokit": "^5.0.3",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"undici": "7.16.0",
|
||||
"zod": "^4.1.11",
|
||||
"zod": "^4.1.12",
|
||||
"zod-validation-error": "^4.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -47,3 +47,8 @@ export const humanFileSize = (size: number, concat = ""): string => {
|
||||
}
|
||||
return "∞";
|
||||
};
|
||||
|
||||
const IMPERIAL_MULTIPLIER = 1.609344;
|
||||
|
||||
export const metricToImperial = (metricValue: number) => metricValue / IMPERIAL_MULTIPLIER;
|
||||
export const imperialToMetric = (imperialValue: number) => imperialValue * IMPERIAL_MULTIPLIER;
|
||||
@@ -25,14 +25,14 @@
|
||||
"prettier": "@homarr/prettier-config",
|
||||
"dependencies": {
|
||||
"@t3-oss/env-nextjs": "^0.13.8",
|
||||
"ioredis": "5.8.0",
|
||||
"zod": "^4.1.11"
|
||||
"ioredis": "5.8.1",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -34,16 +34,16 @@
|
||||
"@trpc/server": "^11.6.0",
|
||||
"@trpc/tanstack-react-query": "^11.6.0",
|
||||
"node-cron": "^4.2.1",
|
||||
"react": "19.1.1",
|
||||
"zod": "^4.1.11"
|
||||
"react": "19.2.0",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/node-cron": "^3.0.11",
|
||||
"@types/react": "19.1.15",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"@types/react": "19.2.2",
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -33,7 +33,7 @@
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/node-cron": "^3.0.11",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -44,7 +44,7 @@
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -43,22 +43,22 @@
|
||||
},
|
||||
"prettier": "@homarr/prettier-config",
|
||||
"dependencies": {
|
||||
"@auth/core": "^0.40.0",
|
||||
"@auth/core": "^0.41.0",
|
||||
"@homarr/common": "workspace:^0.1.0",
|
||||
"@homarr/core": "workspace:^0.1.0",
|
||||
"@homarr/definitions": "workspace:^0.1.0",
|
||||
"@homarr/log": "workspace:^0.1.0",
|
||||
"@homarr/server-settings": "workspace:^0.1.0",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"@mantine/core": "^8.3.4",
|
||||
"@paralleldrive/cuid2": "^2.2.2",
|
||||
"@testcontainers/mysql": "^11.6.0",
|
||||
"@testcontainers/postgresql": "^11.6.0",
|
||||
"@testcontainers/mysql": "^11.7.1",
|
||||
"@testcontainers/postgresql": "^11.7.1",
|
||||
"better-sqlite3": "^12.4.1",
|
||||
"dotenv": "^17.2.2",
|
||||
"dotenv": "^17.2.3",
|
||||
"drizzle-kit": "^0.31.5",
|
||||
"drizzle-orm": "^0.44.5",
|
||||
"drizzle-orm": "^0.44.6",
|
||||
"drizzle-zod": "^0.8.3",
|
||||
"mysql2": "3.15.1",
|
||||
"mysql2": "3.15.2",
|
||||
"pg": "^8.16.3",
|
||||
"superjson": "2.2.2"
|
||||
},
|
||||
@@ -70,9 +70,9 @@
|
||||
"@types/pg": "^8.15.5",
|
||||
"dotenv-cli": "^10.0.0",
|
||||
"esbuild": "^0.25.10",
|
||||
"eslint": "^9.36.0",
|
||||
"eslint": "^9.37.0",
|
||||
"prettier": "^3.6.2",
|
||||
"tsx": "4.20.4",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -24,15 +24,15 @@
|
||||
"prettier": "@homarr/prettier-config",
|
||||
"dependencies": {
|
||||
"@homarr/common": "workspace:^0.1.0",
|
||||
"fast-xml-parser": "^5.2.5",
|
||||
"zod": "^4.1.11"
|
||||
"fast-xml-parser": "^5.3.0",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"eslint": "^9.37.0",
|
||||
"tsx": "4.20.4",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -26,14 +26,14 @@
|
||||
"dependencies": {
|
||||
"@homarr/common": "workspace:^0.1.0",
|
||||
"@homarr/core": "workspace:^0.1.0",
|
||||
"dockerode": "^4.0.8"
|
||||
"dockerode": "^4.0.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/dockerode": "^3.3.44",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -26,15 +26,15 @@
|
||||
"@homarr/common": "workspace:^0.1.0",
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@mantine/form": "^8.3.2",
|
||||
"@mantine/form": "^8.3.4",
|
||||
"mantine-form-zod-resolver": "^1.3.0",
|
||||
"zod": "^4.1.11"
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -29,15 +29,15 @@
|
||||
"@homarr/notifications": "workspace:^0.1.0",
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"react": "19.1.1",
|
||||
"zod": "^4.1.11"
|
||||
"@mantine/core": "^8.3.4",
|
||||
"react": "19.2.0",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -33,7 +33,7 @@
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/bcrypt": "6.0.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -25,8 +25,8 @@
|
||||
},
|
||||
"prettier": "@homarr/prettier-config",
|
||||
"dependencies": {
|
||||
"@ctrl/deluge": "^7.3.0",
|
||||
"@ctrl/qbittorrent": "^9.8.0",
|
||||
"@ctrl/deluge": "^7.4.0",
|
||||
"@ctrl/qbittorrent": "^9.9.1",
|
||||
"@ctrl/transmission": "^7.4.0",
|
||||
"@gitbeaker/rest": "^43.5.0",
|
||||
"@homarr/certificates": "workspace:^0.1.0",
|
||||
@@ -40,7 +40,7 @@
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@jellyfin/sdk": "^0.11.0",
|
||||
"@octokit/auth-app": "^8.1.0",
|
||||
"@octokit/auth-app": "^8.1.1",
|
||||
"ical.js": "^2.2.1",
|
||||
"maria2": "^0.4.1",
|
||||
"node-ical": "^0.21.0",
|
||||
@@ -49,7 +49,7 @@
|
||||
"tsdav": "^2.1.5",
|
||||
"undici": "7.16.0",
|
||||
"xml2js": "^0.6.2",
|
||||
"zod": "^4.1.11"
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
@@ -57,7 +57,7 @@
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/node-unifi": "^2.5.1",
|
||||
"@types/xml2js": "^0.4.14",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
import type { Agent } from "https";
|
||||
import dayjs from "dayjs";
|
||||
import timezone from "dayjs/plugin/timezone";
|
||||
import utc from "dayjs/plugin/utc";
|
||||
import type { RequestInit as NodeFetchRequestInit } from "node-fetch";
|
||||
import * as ical from "node-ical";
|
||||
import { DAVClient } from "tsdav";
|
||||
@@ -14,6 +17,9 @@ import type { TestingResult } from "../base/test-connection/test-connection-serv
|
||||
import type { ICalendarIntegration } from "../interfaces/calendar/calendar-integration";
|
||||
import type { CalendarEvent } from "../interfaces/calendar/calendar-types";
|
||||
|
||||
dayjs.extend(utc);
|
||||
dayjs.extend(timezone);
|
||||
|
||||
@HandleIntegrationErrors([integrationTsdavHttpErrorHandler])
|
||||
export class NextcloudIntegration extends Integration implements ICalendarIntegration {
|
||||
protected async testingAsync(input: IntegrationTestingInput): Promise<TestingResult> {
|
||||
@@ -41,47 +47,59 @@ export class NextcloudIntegration extends Integration implements ICalendarIntegr
|
||||
)
|
||||
).flat();
|
||||
|
||||
return calendarEvents.map((event): CalendarEvent => {
|
||||
// @ts-expect-error the typescript definitions for this package are wrong
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
const icalData = ical.default.parseICS(event.data) as ical.CalendarResponse;
|
||||
const veventObject = Object.values(icalData).find((data) => data.type === "VEVENT");
|
||||
return calendarEvents
|
||||
.map((event) => {
|
||||
// @ts-expect-error the typescript definitions for this package are wrong
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
||||
const icalData = ical.default.parseICS(event.data) as ical.CalendarResponse;
|
||||
const veventObject = Object.values(icalData).find((data) => data.type === "VEVENT");
|
||||
|
||||
if (!veventObject) {
|
||||
throw new Error(`Invalid event data object: ${JSON.stringify(event.data)}. Unable to process the calendar.`);
|
||||
}
|
||||
if (!veventObject) {
|
||||
throw new Error(`Invalid event data object: ${JSON.stringify(event.data)}. Unable to process the calendar.`);
|
||||
}
|
||||
|
||||
logger.debug(`Converting VEVENT event to ${event.etag} from Nextcloud: ${JSON.stringify(veventObject)}`);
|
||||
logger.debug(`Converting VEVENT event to ${event.etag} from Nextcloud: ${JSON.stringify(veventObject)}`);
|
||||
|
||||
const date = veventObject.start;
|
||||
const eventUrlWithoutHost = new URL(event.url).pathname;
|
||||
const eventSlug = Buffer.from(eventUrlWithoutHost).toString("base64url");
|
||||
|
||||
const eventUrlWithoutHost = new URL(event.url).pathname;
|
||||
const dateInMillis = veventObject.start.valueOf();
|
||||
const startDates = veventObject.rrule ? veventObject.rrule.between(start, end) : [veventObject.start];
|
||||
|
||||
const url = this.url(
|
||||
`/apps/calendar/timeGridWeek/now/edit/sidebar/${Buffer.from(eventUrlWithoutHost).toString("base64url")}/${dateInMillis / 1000}`,
|
||||
);
|
||||
const durationMs = veventObject.end.getTime() - veventObject.start.getTime();
|
||||
|
||||
return {
|
||||
title: veventObject.summary,
|
||||
subTitle: null,
|
||||
description: veventObject.description,
|
||||
startDate: date,
|
||||
endDate: veventObject.end,
|
||||
image: null,
|
||||
location: veventObject.location || null,
|
||||
indicatorColor: "#ff8600",
|
||||
links: [
|
||||
{
|
||||
href: url.toString(),
|
||||
name: "Nextcloud",
|
||||
logo: "/images/apps/nextcloud.svg",
|
||||
color: undefined,
|
||||
isDark: true,
|
||||
},
|
||||
],
|
||||
};
|
||||
});
|
||||
return startDates.map((startDate) => {
|
||||
const timezoneOffsetMinutes = veventObject.rrule?.origOptions.tzid
|
||||
? dayjs(startDate).tz(veventObject.rrule.origOptions.tzid).utcOffset()
|
||||
: 0;
|
||||
const utcStartDate = new Date(startDate.getTime() - timezoneOffsetMinutes * 60 * 1000);
|
||||
const endDate = new Date(utcStartDate.getTime() + durationMs);
|
||||
const dateInMillis = utcStartDate.valueOf();
|
||||
|
||||
return {
|
||||
title: veventObject.summary,
|
||||
subTitle: null,
|
||||
description: veventObject.description,
|
||||
startDate: utcStartDate,
|
||||
endDate,
|
||||
image: null,
|
||||
location: veventObject.location || null,
|
||||
indicatorColor:
|
||||
"color" in veventObject && typeof veventObject.color === "string" ? veventObject.color : "#ff8600",
|
||||
links: [
|
||||
{
|
||||
href: this.url(
|
||||
`/apps/calendar/timeGridWeek/now/edit/sidebar/${eventSlug}/${dateInMillis / 1000}`,
|
||||
).toString(),
|
||||
name: "Nextcloud",
|
||||
logo: "/images/apps/nextcloud.svg",
|
||||
color: undefined,
|
||||
isDark: true,
|
||||
},
|
||||
],
|
||||
};
|
||||
});
|
||||
})
|
||||
.flat();
|
||||
}
|
||||
|
||||
private async createCalendarClientAsync(agent?: Agent) {
|
||||
|
||||
@@ -142,7 +142,10 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
|
||||
rating: item.rating?.toFixed(1),
|
||||
tags: item.Genre?.map((genre) => genre.tag) ?? [],
|
||||
href: super
|
||||
.url(`/web/index.html#!/server/${machineIdentifier}/details?key=${encodeURIComponent(item.key)}`)
|
||||
.url(
|
||||
// Url with children on the end results in infinite loading screen, see https://github.com/homarr-labs/homarr/issues/4078
|
||||
`/web/index.html#!/server/${machineIdentifier}/details?key=${encodeURIComponent(item.key.replace("/children", ""))}`,
|
||||
)
|
||||
.toString(),
|
||||
length: item.duration ? Math.round(item.duration / 1000) : undefined,
|
||||
};
|
||||
|
||||
@@ -26,14 +26,14 @@
|
||||
"dependencies": {
|
||||
"@homarr/core": "workspace:^0.1.0",
|
||||
"superjson": "2.2.2",
|
||||
"winston": "3.17.0",
|
||||
"zod": "^4.1.11"
|
||||
"winston": "3.18.3",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -33,19 +33,19 @@
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/ui": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"@mantine/core": "^8.3.4",
|
||||
"@tabler/icons-react": "^3.35.0",
|
||||
"dayjs": "^1.11.18",
|
||||
"next": "15.5.4",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"zod": "^4.1.11"
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -24,15 +24,15 @@
|
||||
"dependencies": {
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/ui": "workspace:^0.1.0",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"@mantine/hooks": "^8.3.2",
|
||||
"react": "19.1.1"
|
||||
"@mantine/core": "^8.3.4",
|
||||
"@mantine/hooks": "^8.3.4",
|
||||
"react": "19.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -24,14 +24,14 @@
|
||||
"prettier": "@homarr/prettier-config",
|
||||
"dependencies": {
|
||||
"@homarr/ui": "workspace:^0.1.0",
|
||||
"@mantine/notifications": "^8.3.2",
|
||||
"@mantine/notifications": "^8.3.4",
|
||||
"@tabler/icons-react": "^3.35.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -37,14 +37,14 @@
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/ui": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"@mantine/hooks": "^8.3.2",
|
||||
"@mantine/core": "^8.3.4",
|
||||
"@mantine/hooks": "^8.3.4",
|
||||
"adm-zip": "0.5.16",
|
||||
"next": "15.5.4",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"superjson": "2.2.2",
|
||||
"zod": "^4.1.11",
|
||||
"zod": "^4.1.12",
|
||||
"zod-form-data": "^3.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -52,7 +52,7 @@
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/adm-zip": "0.5.7",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -88,6 +88,7 @@ const optionMapping: OptionMapping = {
|
||||
location: (oldOptions) => oldOptions.location,
|
||||
showCity: (oldOptions) => oldOptions.displayCityName,
|
||||
dateFormat: (oldOptions) => (oldOptions.dateFormat === "hide" ? undefined : oldOptions.dateFormat),
|
||||
useImperialSpeed: () => undefined,
|
||||
},
|
||||
iframe: {
|
||||
embedUrl: (oldOptions) => oldOptions.embedUrl,
|
||||
|
||||
@@ -23,13 +23,13 @@
|
||||
"prettier": "@homarr/prettier-config",
|
||||
"dependencies": {
|
||||
"@homarr/common": "workspace:^0.1.0",
|
||||
"zod": "^4.1.11"
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,7 @@
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -27,14 +27,14 @@
|
||||
"@homarr/db": "workspace:^",
|
||||
"@homarr/definitions": "workspace:^",
|
||||
"@homarr/log": "workspace:^",
|
||||
"ioredis": "5.8.0",
|
||||
"ioredis": "5.8.1",
|
||||
"superjson": "2.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -33,13 +33,13 @@
|
||||
"octokit": "^5.0.3",
|
||||
"superjson": "2.2.2",
|
||||
"undici": "7.16.0",
|
||||
"zod": "^4.1.11"
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -47,7 +47,7 @@ async function getContainersWithStatsAsync() {
|
||||
const instance = dockerInstances.find(({ host }) => host === container.instance)?.instance;
|
||||
if (!instance) return null;
|
||||
|
||||
const stats = await instance.getContainer(container.Id).stats({ stream: false });
|
||||
const stats = await instance.getContainer(container.Id).stats({ stream: false, "one-shot": true });
|
||||
|
||||
return {
|
||||
id: container.Id,
|
||||
@@ -60,7 +60,8 @@ async function getContainersWithStatsAsync() {
|
||||
return icon.name.toLowerCase().includes(extractedImage.toLowerCase());
|
||||
})?.url ?? null,
|
||||
cpuUsage: calculateCpuUsage(stats),
|
||||
memoryUsage: stats.memory_stats.usage,
|
||||
// memory usage by default includes cache, which should not be shown as it is also not shown with docker stats command
|
||||
memoryUsage: stats.memory_stats.usage - stats.memory_stats.stats.cache,
|
||||
image: container.Image,
|
||||
ports: container.Ports,
|
||||
};
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -26,16 +26,16 @@
|
||||
"@homarr/api": "workspace:^0.1.0",
|
||||
"@homarr/db": "workspace:^0.1.0",
|
||||
"@homarr/server-settings": "workspace:^0.1.0",
|
||||
"@mantine/dates": "^8.3.2",
|
||||
"@mantine/dates": "^8.3.4",
|
||||
"next": "15.5.4",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1"
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -33,21 +33,21 @@
|
||||
"@homarr/settings": "workspace:^0.1.0",
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/ui": "workspace:^0.1.0",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"@mantine/hooks": "^8.3.2",
|
||||
"@mantine/spotlight": "^8.3.2",
|
||||
"@mantine/core": "^8.3.4",
|
||||
"@mantine/hooks": "^8.3.4",
|
||||
"@mantine/spotlight": "^8.3.4",
|
||||
"@tabler/icons-react": "^3.35.0",
|
||||
"jotai": "^2.15.0",
|
||||
"next": "15.5.4",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"use-deep-compare-effect": "^1.8.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -33,15 +33,15 @@
|
||||
"deepmerge": "4.3.1",
|
||||
"mantine-react-table": "2.0.0-beta.9",
|
||||
"next": "15.5.4",
|
||||
"next-intl": "4.3.9",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1"
|
||||
"next-intl": "4.3.12",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": ""
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "",
|
||||
"integration": "",
|
||||
"app": "",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "用户组名称已存在"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "标题"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "边界颜色"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "显示当前风速",
|
||||
"description": "仅在当前天气时"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "天气位置"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "正在播放",
|
||||
"user": "用户",
|
||||
"name": "名称",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "邀请",
|
||||
"integration": "集成",
|
||||
"app": "应用",
|
||||
"group": "群组"
|
||||
"group": "群组",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "面板",
|
||||
"resources": "资源",
|
||||
"authentication": "认证",
|
||||
"authorization": "认证"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "相关的库",
|
||||
"subtitle": "{count} 用于 Homarr 代码中"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "crwdns2366:0crwdne2366:0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "crwdns3764:0crwdne3764:0",
|
||||
"milesPerHour": "crwdns3766:0crwdne3766:0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "crwdns3103:0crwdne3103:0"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": "crwdns3776:0crwdne3776:0"
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "crwdns2839:0crwdne2839:0"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "crwdns2706:0crwdne2706:0",
|
||||
"description": "crwdns2708:0crwdne2708:0"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": "crwdns3768:0crwdne3768:0"
|
||||
},
|
||||
"location": {
|
||||
"label": "crwdns1018:0crwdne1018:0"
|
||||
},
|
||||
@@ -1762,12 +1774,12 @@
|
||||
"description": "crwdns1030:0crwdne1030:0"
|
||||
}
|
||||
},
|
||||
"currentWindSpeed": "crwdns2710:0{currentWindSpeed}crwdne2710:0",
|
||||
"currentWindSpeed": "crwdns3770:0{currentWindSpeed}crwdnd3770:0{unit}crwdne3770:0",
|
||||
"dailyForecast": {
|
||||
"sunrise": "crwdns2712:0crwdne2712:0",
|
||||
"sunset": "crwdns2714:0crwdne2714:0",
|
||||
"maxWindSpeed": "crwdns2716:0{maxWindSpeed}crwdne2716:0",
|
||||
"maxWindGusts": "crwdns2718:0{maxWindGusts}crwdne2718:0"
|
||||
"maxWindSpeed": "crwdns3772:0{maxWindSpeed}crwdnd3772:0{unit}crwdne3772:0",
|
||||
"maxWindGusts": "crwdns3774:0{maxWindGusts}crwdnd3774:0{unit}crwdne3774:0"
|
||||
},
|
||||
"kind": {
|
||||
"clear": "crwdns1032:0crwdne1032:0",
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "crwdns2847:0crwdne2847:0",
|
||||
"user": "crwdns2476:0crwdne2476:0",
|
||||
"name": "crwdns2478:0crwdne2478:0",
|
||||
"id": "crwdns2480:0crwdne2480:0"
|
||||
"id": "crwdns2480:0crwdne2480:0",
|
||||
"metadata": {
|
||||
"title": "crwdns3744:0crwdne3744:0",
|
||||
"video": {
|
||||
"title": "crwdns3746:0crwdne3746:0",
|
||||
"resolution": "crwdns3748:0crwdne3748:0"
|
||||
},
|
||||
"audio": {
|
||||
"title": "crwdns3750:0crwdne3750:0",
|
||||
"channelCount": "crwdns3752:0crwdne3752:0",
|
||||
"codec": "crwdns3754:0crwdne3754:0"
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "crwdns3756:0crwdne3756:0",
|
||||
"container": "crwdns3758:0crwdne3758:0",
|
||||
"resolution": "crwdns3760:0crwdne3760:0",
|
||||
"target": "crwdns3762:0crwdne3762:0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "crwdns1620:0crwdne1620:0",
|
||||
"integration": "crwdns1622:0crwdne1622:0",
|
||||
"app": "crwdns1624:0crwdne1624:0",
|
||||
"group": "crwdns1626:0crwdne1626:0"
|
||||
"group": "crwdns1626:0crwdne1626:0",
|
||||
"searchEngine": "crwdns3778:0crwdne3778:0",
|
||||
"media": "crwdns3780:0crwdne3780:0"
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "crwdns1628:0crwdne1628:0",
|
||||
"resources": "crwdns1630:0crwdne1630:0",
|
||||
"authentication": "crwdns1632:0crwdne1632:0",
|
||||
"authorization": "crwdns1634:0crwdne1634:0"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "crwdns3782:0crwdne3782:0",
|
||||
"subtitle": "crwdns3784:0{app}crwdne3784:0"
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "crwdns1888:0crwdne1888:0",
|
||||
"subtitle": "crwdns1890:0{count}crwdne1890:0"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "crwdns3726:0crwdne3726:0",
|
||||
"subtitle": "crwdns3728:0crwdne3728:0",
|
||||
"field": {
|
||||
"shortcut": "crwdns3730:0crwdne3730:0",
|
||||
"action": "crwdns3732:0crwdne3732:0"
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "crwdns3734:0crwdne3734:0",
|
||||
"toggleColorScheme": "crwdns3736:0crwdne3736:0",
|
||||
"saveNotebook": "crwdns3738:0crwdne3738:0",
|
||||
"openSpotlight": "crwdns3740:0crwdne3740:0"
|
||||
},
|
||||
"note": "crwdns3742:0crwdne3742:0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Název skupiny je již používán"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Lokalita pro počasí"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "Uživatel",
|
||||
"name": "Jméno",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Pozvánky",
|
||||
"integration": "",
|
||||
"app": "Aplikace",
|
||||
"group": "Skupiny"
|
||||
"group": "Skupiny",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Plochy",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Gruppenavn allerede taget"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Titel"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Kantfarve"
|
||||
}
|
||||
@@ -1708,7 +1717,7 @@
|
||||
"name": "Kalender",
|
||||
"description": "Vis begivenheder fra dine integrationer i en kalendervisning inden for en vis relativ tidsperiode",
|
||||
"duration": {
|
||||
"allDay": ""
|
||||
"allDay": "Hele dagen"
|
||||
},
|
||||
"option": {
|
||||
"releaseType": {
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Vis aktuel vindhastighed",
|
||||
"description": "Kun på nuværende vejr"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Vejr lokation"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Afspiller lige nu",
|
||||
"user": "Bruger",
|
||||
"name": "Navn",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "Statistik for nørder",
|
||||
"video": {
|
||||
"title": "Video",
|
||||
"resolution": "Opløsning"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Lyd",
|
||||
"channelCount": "Lyd kanaler",
|
||||
"codec": "Lyd codec"
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "Transkoder",
|
||||
"container": "Container",
|
||||
"resolution": "Opløsning",
|
||||
"target": "Mål codec"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Invitationer",
|
||||
"integration": "Integrationer",
|
||||
"app": "Apps",
|
||||
"group": "Grupper"
|
||||
"group": "Grupper",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Tavler",
|
||||
"resources": "Ressourcer",
|
||||
"authentication": "Autorisering",
|
||||
"authorization": "Autorisation"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3320,7 +3356,7 @@
|
||||
"label": "Firewall Grænseflader"
|
||||
},
|
||||
"weather": {
|
||||
"label": ""
|
||||
"label": "Vejr"
|
||||
}
|
||||
},
|
||||
"interval": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Biblioteker",
|
||||
"subtitle": "{count} brugt i koden for Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "Genvejstaster",
|
||||
"subtitle": "Tastaturgenveje til at forbedre din arbejdsgang",
|
||||
"field": {
|
||||
"shortcut": "Genvej",
|
||||
"action": "Handling"
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "Skift tavleredigeringstilstand",
|
||||
"toggleColorScheme": "Slå lys/mørk tilstand til/fra",
|
||||
"saveNotebook": "Gem notesbog (kun inde i notesbog widget)",
|
||||
"openSpotlight": "Åbn søgefunktionen"
|
||||
},
|
||||
"note": "Tip: Mod refererer til både Ctrl-tasten og -tasten på macOS"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Gruppenname bereits vergeben"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Rahmenfarbe"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Aktuelle Windgeschwindigkeit anzeigen",
|
||||
"description": "Nur bei aktuellem Wetter"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Wetterstandort"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Aktuelle Wiedergabe",
|
||||
"user": "Benutzer",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Einladungen",
|
||||
"integration": "Integrationen",
|
||||
"app": "",
|
||||
"group": "Gruppen"
|
||||
"group": "Gruppen",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "",
|
||||
"resources": "Ressourcen",
|
||||
"authentication": "Authentifizierung",
|
||||
"authorization": "Autorisierung"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Bibliotheken",
|
||||
"subtitle": "{count} im Code von Homarr verwendet"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -946,28 +946,28 @@
|
||||
"newLabel": "Neues Thema erstellen"
|
||||
},
|
||||
"url": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "URL",
|
||||
"newLabel": "Neue URL"
|
||||
},
|
||||
"opnsenseApiKey": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "API-Schlüssel (Schlüssel)",
|
||||
"newLabel": "Neuer API-Schlüssel (Schlüssel)"
|
||||
},
|
||||
"opnsenseApiSecret": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "API-Schlüssel (Secret)",
|
||||
"newLabel": "Neuer API-Schlüssel (Secret)"
|
||||
},
|
||||
"githubAppId": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "App ID",
|
||||
"newLabel": "Neue App ID"
|
||||
},
|
||||
"githubInstallationId": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "Installations ID",
|
||||
"newLabel": "Neue Installations ID"
|
||||
},
|
||||
"privateKey": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "Privater Schlüssel",
|
||||
"newLabel": "Neuer privater Schlüssel"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1019,7 +1019,7 @@
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"success": "",
|
||||
"success": "Erfolgreich",
|
||||
"beta": "Beta",
|
||||
"error": "Fehler",
|
||||
"action": {
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Gruppenname bereits vergeben"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Titel"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Rahmenfarbe"
|
||||
}
|
||||
@@ -1286,21 +1295,21 @@
|
||||
"label": "Statusüberprüfung aktivieren"
|
||||
},
|
||||
"layout": {
|
||||
"label": "",
|
||||
"label": "Ansicht",
|
||||
"option": {
|
||||
"row": "",
|
||||
"row-reverse": "",
|
||||
"column": "",
|
||||
"column-reverse": ""
|
||||
"row": "Horizontal",
|
||||
"row-reverse": "Horizontal (invertiert)",
|
||||
"column": "Vertikal",
|
||||
"column-reverse": "Vertikal (invertiert)"
|
||||
}
|
||||
},
|
||||
"descriptionDisplayMode": {
|
||||
"label": "",
|
||||
"description": "",
|
||||
"label": "Beschreibung des Anzeigemodus",
|
||||
"description": "Wählen Sie, wie die App-Beschreibung angezeigt werden soll",
|
||||
"option": {
|
||||
"normal": "",
|
||||
"tooltip": "",
|
||||
"hidden": ""
|
||||
"normal": "Innerhalb des Widgets",
|
||||
"tooltip": "Als Tooltip",
|
||||
"hidden": "Versteckt"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1549,11 +1558,11 @@
|
||||
},
|
||||
"placeholder": "Mit dem Schreiben von Notizen beginnen",
|
||||
"dismiss": {
|
||||
"title": "",
|
||||
"message": "",
|
||||
"title": "Änderungen verwerfen?",
|
||||
"message": "Sie haben ungespeicherte Änderungen in Ihrem Notizbuch. Sind Sie sicher, dass Sie diese verwerfen möchten?",
|
||||
"action": {
|
||||
"discard": "",
|
||||
"keepEditing": ""
|
||||
"discard": "Änderungen verwerfen",
|
||||
"keepEditing": "Bearbeitung fortsetzen"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1708,7 +1717,7 @@
|
||||
"name": "Kalender",
|
||||
"description": "Zeigt Ereignisse aus Ihren Integrationen in einer Kalenderansicht innerhalb eines bestimmten Zeitraums an",
|
||||
"duration": {
|
||||
"allDay": ""
|
||||
"allDay": "Ganztägig"
|
||||
},
|
||||
"option": {
|
||||
"releaseType": {
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Aktuelle Windgeschwindigkeit anzeigen",
|
||||
"description": "Nur bei aktuellem Wetter"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Wetterstandort"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Aktuelle Wiedergabe",
|
||||
"user": "Benutzer",
|
||||
"name": "Name",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "Statistiken für Nerds",
|
||||
"video": {
|
||||
"title": "Video",
|
||||
"resolution": "Auflösung"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Audio",
|
||||
"channelCount": "Audio Kanäle",
|
||||
"codec": "Audio Codec"
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "Transkodierung",
|
||||
"container": "Container",
|
||||
"resolution": "Auflösung",
|
||||
"target": "Ziel Codec"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2288,7 +2318,7 @@
|
||||
"label": "Limit für Beiträge"
|
||||
},
|
||||
"hideDescription": {
|
||||
"label": ""
|
||||
"label": "Beschreibung ausblenden"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2507,24 +2537,24 @@
|
||||
"description": "CPU, Arbeitsspeicher, Festplatte und andere Hardware-Nutzung Ihres Systems",
|
||||
"option": {
|
||||
"hasShadow": {
|
||||
"label": ""
|
||||
"label": "Schattierung der Diagramme aktivieren"
|
||||
},
|
||||
"visibleCharts": {
|
||||
"label": "",
|
||||
"description": "",
|
||||
"label": "Sichtbare Diagramme",
|
||||
"description": "Wählen Sie die Diagramme aus, die angezeigt werden sollen.",
|
||||
"option": {
|
||||
"cpu": "",
|
||||
"memory": "",
|
||||
"network": ""
|
||||
"cpu": "CPU",
|
||||
"memory": "Speicher",
|
||||
"network": "Netzwerk"
|
||||
}
|
||||
},
|
||||
"labelDisplayMode": {
|
||||
"label": "",
|
||||
"label": "Anzeigemodus der Beschriftung",
|
||||
"option": {
|
||||
"textWithIcon": "",
|
||||
"text": "",
|
||||
"icon": "",
|
||||
"hidden": ""
|
||||
"textWithIcon": "Text mit Symbol anzeigen",
|
||||
"text": "Nur Text anzeigen",
|
||||
"icon": "Nur das Symbol anzeigen",
|
||||
"hidden": "Beschriftung ausblenden"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Einladungen",
|
||||
"integration": "Integrationen",
|
||||
"app": "Apps",
|
||||
"group": "Gruppen"
|
||||
"group": "Gruppen",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Boards",
|
||||
"resources": "Ressourcen",
|
||||
"authentication": "Authentifizierung",
|
||||
"authorization": "Autorisierung"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3331,10 +3367,10 @@
|
||||
"weeklyMonday": "Jede Woche am Montag",
|
||||
"update": {
|
||||
"success": {
|
||||
"message": ""
|
||||
"message": "Intervall erfolgreich aktualisiert"
|
||||
},
|
||||
"error": {
|
||||
"message": ""
|
||||
"message": "Fehler beim Aktualisieren des Intervalls"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -3365,33 +3401,33 @@
|
||||
},
|
||||
"refresh": {
|
||||
"success": {
|
||||
"message": ""
|
||||
"message": "Aufgaben erfolgreich aktualisiert"
|
||||
},
|
||||
"error": {
|
||||
"message": ""
|
||||
"message": "Fehler beim Aktualisieren der Aufgaben"
|
||||
}
|
||||
},
|
||||
"trigger": {
|
||||
"success": {
|
||||
"message": ""
|
||||
"message": "Aufgabe erfolgreich ausgelöst"
|
||||
},
|
||||
"error": {
|
||||
"message": ""
|
||||
"message": "Fehler beim Auslösen der Aufgabe"
|
||||
}
|
||||
},
|
||||
"enable": {
|
||||
"success": {
|
||||
"message": ""
|
||||
"message": "Aufgabe erfolgreich aktiviert"
|
||||
}
|
||||
},
|
||||
"disable": {
|
||||
"success": {
|
||||
"message": ""
|
||||
"message": "Aufgabe erfolgreich deaktiviert"
|
||||
}
|
||||
},
|
||||
"toggle": {
|
||||
"error": {
|
||||
"message": ""
|
||||
"message": "Fehler beim Umschalten des Aufgabenstatus"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Bibliotheken",
|
||||
"subtitle": "{count} im Code von Homarr verwendet"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "Tastenkürzel",
|
||||
"subtitle": "Tastenkürzel zur Verbesserung Ihres Workflows",
|
||||
"field": {
|
||||
"shortcut": "Verknüpfung",
|
||||
"action": "Aktion"
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "Bearbeitungsmodus des Boardes umschalten",
|
||||
"toggleColorScheme": "Hell/Dunkelmodus umschalten",
|
||||
"saveNotebook": "Notizbuch speichern (nur innerhalb des Notizbuch Widgets)",
|
||||
"openSpotlight": "Suche öffnen"
|
||||
},
|
||||
"note": "Tipp: Mod bezieht sich sowohl auf die Strg-Taste als auch auf die ⌘ Taste auf macOS"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Τοποθεσία καιρού"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Προσκλήσεις",
|
||||
"integration": "",
|
||||
"app": "Εφαρμογές",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Πίνακες",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "An existing group already has this name"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Title"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Border colour"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": ""
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "",
|
||||
"integration": "",
|
||||
"app": "",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Group name already taken"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "km/h",
|
||||
"milesPerHour": "mph"
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Title"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": "Custom css classes"
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Border color"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Show current wind speed",
|
||||
"description": "Only on current weather"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": "Use mph for windspeed"
|
||||
},
|
||||
"location": {
|
||||
"label": "Weather location"
|
||||
},
|
||||
@@ -1762,12 +1774,12 @@
|
||||
"description": "How the date should look like"
|
||||
}
|
||||
},
|
||||
"currentWindSpeed": "{currentWindSpeed} km/h",
|
||||
"currentWindSpeed": "{currentWindSpeed} {unit}",
|
||||
"dailyForecast": {
|
||||
"sunrise": "Sunrise",
|
||||
"sunset": "Sunset",
|
||||
"maxWindSpeed": "Max wind speed: {maxWindSpeed} km/h",
|
||||
"maxWindGusts": "Max wind gusts: {maxWindGusts} km/h"
|
||||
"maxWindSpeed": "Max wind speed: {maxWindSpeed} {unit}",
|
||||
"maxWindGusts": "Max wind gusts: {maxWindGusts} {unit}"
|
||||
},
|
||||
"kind": {
|
||||
"clear": "Clear",
|
||||
@@ -2974,13 +2986,19 @@
|
||||
"invite": "Invites",
|
||||
"integration": "Integrations",
|
||||
"app": "Apps",
|
||||
"group": "Groups"
|
||||
"group": "Groups",
|
||||
"searchEngine": "Search engines",
|
||||
"media": "Medias"
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Boards",
|
||||
"resources": "Resources",
|
||||
"authentication": "Authentication",
|
||||
"authorization": "Authorization"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "Welcome back to your",
|
||||
"subtitle": "{app} Board"
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
|
||||
@@ -302,7 +302,7 @@
|
||||
"group": {
|
||||
"title": "Grupos",
|
||||
"name": "Grupo",
|
||||
"search": "Encontrar un grupo",
|
||||
"search": "Buscar un grupo...",
|
||||
"field": {
|
||||
"name": "Nombre",
|
||||
"members": "Miembros",
|
||||
@@ -1043,9 +1043,9 @@
|
||||
"previous": "Anterior",
|
||||
"next": "Siguiente",
|
||||
"checkoutDocs": "Consultar la documentación",
|
||||
"checkLogs": "Comprobar los registros para más detalles",
|
||||
"checkLogs": "Comprueba los registros para más detalles",
|
||||
"tryAgain": "Intentar de nuevo",
|
||||
"loading": "Cargar"
|
||||
"loading": "Cargando"
|
||||
},
|
||||
"here": "aquí",
|
||||
"iconPicker": {
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Nombre del grupo en uso"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "km/h",
|
||||
"milesPerHour": "mph"
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Título"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": "Clases CSS personalizadas"
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Color del borde"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Mostrar velocidad del viento actual",
|
||||
"description": "Sólo en el tiempo actual"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": "Usar mph para la velocidad del viento"
|
||||
},
|
||||
"location": {
|
||||
"label": "Ubicación"
|
||||
},
|
||||
@@ -1762,12 +1774,12 @@
|
||||
"description": "Cómo debería ser la fecha"
|
||||
}
|
||||
},
|
||||
"currentWindSpeed": "{currentWindSpeed} km/h",
|
||||
"currentWindSpeed": "{currentWindSpeed} {unit}",
|
||||
"dailyForecast": {
|
||||
"sunrise": "Amanecer",
|
||||
"sunset": "Atardecer",
|
||||
"maxWindSpeed": "Velocidad máxima del viento: {maxWindSpeed} km/h",
|
||||
"maxWindGusts": "Máximas ráfagas de viento: {maxWindGusts} km/h"
|
||||
"maxWindSpeed": "Velocidad máxima del viento: {maxWindSpeed} {unit}",
|
||||
"maxWindGusts": "Máximas ráfagas de viento: {maxWindGusts} {unit}"
|
||||
},
|
||||
"kind": {
|
||||
"clear": "Despejado",
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Reproducción en curso",
|
||||
"user": "Usuario",
|
||||
"name": "Nombre",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"metadata": {
|
||||
"title": "Estadísticas",
|
||||
"video": {
|
||||
"title": "Vídeo",
|
||||
"resolution": "Resolución"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Audio",
|
||||
"channelCount": "Canales de audio",
|
||||
"codec": "Códec de audio"
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "Transcodificación",
|
||||
"container": "Contenedor",
|
||||
"resolution": "Resolución",
|
||||
"target": "Códec de destino"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2207,7 +2237,7 @@
|
||||
"total": "Total"
|
||||
},
|
||||
"users": {
|
||||
"main": "Mejores usuarios",
|
||||
"main": "Clasificación de usuarios",
|
||||
"requests": "Solicitudes"
|
||||
}
|
||||
}
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Invitaciones",
|
||||
"integration": "Integraciones",
|
||||
"app": "Aplicaciones",
|
||||
"group": "Grupos"
|
||||
"group": "Grupos",
|
||||
"searchEngine": "Motores de búsqueda",
|
||||
"media": "Imágenes"
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Tableros",
|
||||
"resources": "Recursos",
|
||||
"authentication": "Autenticación",
|
||||
"authorization": "Autenticación"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "Bienvenido de nuevo a tu",
|
||||
"subtitle": "Tablero de {app}"
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3026,11 +3062,11 @@
|
||||
"general": {
|
||||
"title": "General",
|
||||
"item": {
|
||||
"language": "Idioma y región",
|
||||
"language": "Idioma",
|
||||
"board": {
|
||||
"title": "Tablero de inicio",
|
||||
"title": "Tableros",
|
||||
"type": {
|
||||
"general": "General",
|
||||
"general": "Escritorio",
|
||||
"mobile": "Móvil"
|
||||
}
|
||||
},
|
||||
@@ -3135,7 +3171,7 @@
|
||||
},
|
||||
"members": {
|
||||
"title": "Miembros",
|
||||
"search": "Buscar un miembro",
|
||||
"search": "Buscar un miembro...",
|
||||
"notFound": "No se han encontrado miembros"
|
||||
},
|
||||
"permissions": {
|
||||
@@ -3199,7 +3235,7 @@
|
||||
"board": {
|
||||
"title": "Tableros",
|
||||
"homeBoard": {
|
||||
"label": "Tablero de inicio global",
|
||||
"label": "Tablero de escritorio global",
|
||||
"mobileLabel": "Tablero móvil global",
|
||||
"description": "Sólo los tableros públicos están disponibles para la selección"
|
||||
},
|
||||
@@ -3356,7 +3392,7 @@
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"search": "Buscar {count} tareas..."
|
||||
"search": "Buscar una tarea..."
|
||||
},
|
||||
"action": {
|
||||
"refresh": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Librerías",
|
||||
"subtitle": "{count} usadas en el Código de Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "Accesos directos",
|
||||
"subtitle": "Accesos directos de teclado para mejorar tu flujo de trabajo",
|
||||
"field": {
|
||||
"shortcut": "Acceso directo",
|
||||
"action": "Acción"
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "Cambiar a modo de edición de tablero",
|
||||
"toggleColorScheme": "Cambiar a modo claro/oscuro",
|
||||
"saveNotebook": "Guardar el bloc de notas (solo dentro del widget de bloc de notas)",
|
||||
"openSpotlight": "Abrir búsqueda"
|
||||
},
|
||||
"note": "Sugerencia: Mod se refiere tanto a la tecla CTRL como a la tecla ⌘ en macOS"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3575,7 +3626,7 @@
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"internalServerError": "Fallo al obtener contenedores Docker"
|
||||
"internalServerError": "Fallo al obtener los contenedores de Docker"
|
||||
}
|
||||
},
|
||||
"kubernetes": {
|
||||
@@ -4364,7 +4415,7 @@
|
||||
"page": {
|
||||
"list": {
|
||||
"title": "Certificados de confianza",
|
||||
"description": "Utilizado por Homarr para solicitar datos de las integraciones.",
|
||||
"description": "Utilizados por Homarr para solicitar datos de las integraciones.",
|
||||
"noResults": {
|
||||
"title": "Aún no hay certificados"
|
||||
},
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": ""
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "",
|
||||
"integration": "",
|
||||
"app": "",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -946,24 +946,24 @@
|
||||
"newLabel": "Nouveau sujet"
|
||||
},
|
||||
"url": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "Url",
|
||||
"newLabel": "Nouvelle url"
|
||||
},
|
||||
"opnsenseApiKey": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "Clé API (Key)",
|
||||
"newLabel": "Nouvelle clé API (Key)"
|
||||
},
|
||||
"opnsenseApiSecret": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "Clé API (secrète)",
|
||||
"newLabel": "Nouvelle clé API (secrète)"
|
||||
},
|
||||
"githubAppId": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "Identifiant de l'application",
|
||||
"newLabel": "Nouvel Id de l'Application"
|
||||
},
|
||||
"githubInstallationId": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "Id d'installation",
|
||||
"newLabel": "Nouvel ID d'installation"
|
||||
},
|
||||
"privateKey": {
|
||||
"label": "",
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Nom de groupe déjà utilisé"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Titre"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Couleur de la bordure"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Afficher la vitesse actuelle du vent",
|
||||
"description": "Uniquement sur la météo actuelle"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Lieu de la météo"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "En cours de lecture",
|
||||
"user": "Utilisateur",
|
||||
"name": "Nom",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "Résolution",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2312,7 +2342,7 @@
|
||||
"label": "Afficher les détails"
|
||||
},
|
||||
"showOnlyIcon": {
|
||||
"label": ""
|
||||
"label": "Afficher uniquement l'icône"
|
||||
},
|
||||
"topReleases": {
|
||||
"label": "Meilleures sorties",
|
||||
@@ -2331,8 +2361,8 @@
|
||||
"listAlreadyImportedImages": "Liste des images déjà importées",
|
||||
"allImagesAlreadyImported": "Toutes les images déjà importées",
|
||||
"onlyAdminCanImport": "Seuls les administrateurs peuvent importer depuis docker",
|
||||
"selectAll": "",
|
||||
"deselectAll": ""
|
||||
"selectAll": "Tout sélectionner",
|
||||
"deselectAll": "Tout déselectionner"
|
||||
},
|
||||
"provider": {
|
||||
"label": "Fournisseur"
|
||||
@@ -2394,7 +2424,7 @@
|
||||
"starsCount": "Étoiles",
|
||||
"forksCount": "",
|
||||
"issuesCount": "Problèmes ouverts",
|
||||
"markViewed": "",
|
||||
"markViewed": "Marquer comme vu(s)",
|
||||
"openProjectPage": "Ouvrir la page du projet",
|
||||
"openReleasePage": "Ouvrir la page de publication",
|
||||
"releaseDescription": "Description de la publication",
|
||||
@@ -2468,21 +2498,21 @@
|
||||
}
|
||||
},
|
||||
"firewall": {
|
||||
"name": "",
|
||||
"name": "Surveillance du pare-feu",
|
||||
"description": "",
|
||||
"tab": {
|
||||
"system": "",
|
||||
"interfaces": ""
|
||||
"system": "Système",
|
||||
"interfaces": "Interfaces"
|
||||
},
|
||||
"error": {
|
||||
"internalServerError": ""
|
||||
"internalServerError": "Impossible d'obtenir les données depuis le pare-feu"
|
||||
},
|
||||
"option": {
|
||||
"interfaces": ""
|
||||
"interfaces": "Interfaces réseau à afficher"
|
||||
},
|
||||
"widget": {
|
||||
"fwname": "",
|
||||
"version": "",
|
||||
"fwname": "Nom",
|
||||
"version": "Version",
|
||||
"versiontitle": "",
|
||||
"cputitle": "",
|
||||
"memorytitle": "",
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Invitations",
|
||||
"integration": "Intégrations",
|
||||
"app": "Applications",
|
||||
"group": "Groupes"
|
||||
"group": "Groupes",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Tableaux de bord",
|
||||
"resources": "Ressources",
|
||||
"authentication": "Authentification",
|
||||
"authorization": "Autorisation"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Bibliothèques",
|
||||
"subtitle": "{count} utilisés dans le Code d'Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "שם הקבוצה כבר תפוס"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "כותרת"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "צבע מסגרת"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "הצגת מהירות רוח נוכחית",
|
||||
"description": "רק במזג אוויר נוכחי"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "מיקום מזג האוויר"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "מתנגן כרגע",
|
||||
"user": "משתמש",
|
||||
"name": "שם",
|
||||
"id": "מזהה"
|
||||
"id": "מזהה",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "הזמנות",
|
||||
"integration": "אינטגרציות",
|
||||
"app": "אפליקציות",
|
||||
"group": "קבוצות"
|
||||
"group": "קבוצות",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "לוחות",
|
||||
"resources": "מקורות",
|
||||
"authentication": "אימות",
|
||||
"authorization": "הרשאה"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "ספריות",
|
||||
"subtitle": "{count} בשימוש בקוד של Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Lokacija vremenske prognoze"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "poziva",
|
||||
"integration": "",
|
||||
"app": "aplikacije",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Daske",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Időjárás helye"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Meghívók",
|
||||
"integration": "Integrációk",
|
||||
"app": "Alkalmazások",
|
||||
"group": "Csoportok"
|
||||
"group": "Csoportok",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Táblák",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Nome gruppo già preso"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Titolo"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Colore del bordo"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Mostra la velocità attuale del vento",
|
||||
"description": "Solo sul meteo corrente"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Località meteo"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Attualmente in riproduzione",
|
||||
"user": "Utente",
|
||||
"name": "Nome",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Inviti",
|
||||
"integration": "Integrazioni",
|
||||
"app": "Applicazioni",
|
||||
"group": "Gruppi"
|
||||
"group": "Gruppi",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Board",
|
||||
"resources": "Risorse",
|
||||
"authentication": "Autenticazione",
|
||||
"authorization": "Autorizzazione"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Librerie",
|
||||
"subtitle": "{count} utilizzato nel Codice di Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -946,8 +946,8 @@
|
||||
"newLabel": "新規トピック"
|
||||
},
|
||||
"url": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "URL",
|
||||
"newLabel": "新規URL"
|
||||
},
|
||||
"opnsenseApiKey": {
|
||||
"label": "API キー (キー)",
|
||||
@@ -958,16 +958,16 @@
|
||||
"newLabel": "新しい API キー (シークレット)"
|
||||
},
|
||||
"githubAppId": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "App Id",
|
||||
"newLabel": "新規App Id"
|
||||
},
|
||||
"githubInstallationId": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "インストール ID",
|
||||
"newLabel": "新規インストール ID"
|
||||
},
|
||||
"privateKey": {
|
||||
"label": "",
|
||||
"newLabel": ""
|
||||
"label": "秘密鍵",
|
||||
"newLabel": "新しい秘密鍵"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "グループ名は、既に使用されています"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "タイトル"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "境界線の色"
|
||||
}
|
||||
@@ -1549,11 +1558,11 @@
|
||||
},
|
||||
"placeholder": "あなたのノートを書き始めましょう",
|
||||
"dismiss": {
|
||||
"title": "",
|
||||
"message": "",
|
||||
"title": "変更を放棄しますか?",
|
||||
"message": "ノートブックに保存されていない変更があります。それらを破棄してもよろしいですか?",
|
||||
"action": {
|
||||
"discard": "",
|
||||
"keepEditing": ""
|
||||
"discard": "変更を破棄",
|
||||
"keepEditing": "編集を続ける"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1708,7 +1717,7 @@
|
||||
"name": "カレンダー",
|
||||
"description": "カレンダービューで、特定の相対的な期間内に、連携機能からのイベントを表示します",
|
||||
"duration": {
|
||||
"allDay": ""
|
||||
"allDay": "すべての日"
|
||||
},
|
||||
"option": {
|
||||
"releaseType": {
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "現在の風速を表示",
|
||||
"description": "現在の天気のみ表示"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "天候の場所"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "再生中の曲",
|
||||
"user": "ユーザー",
|
||||
"name": "名称",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "詳細統計情報",
|
||||
"video": {
|
||||
"title": "動画",
|
||||
"resolution": "解像度"
|
||||
},
|
||||
"audio": {
|
||||
"title": "音声",
|
||||
"channelCount": "音声チャンネル",
|
||||
"codec": "オーディオコーデック"
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "トランスコーディング",
|
||||
"container": "コンテナー",
|
||||
"resolution": "対応詳細",
|
||||
"target": "ターゲットコーデック"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2288,7 +2318,7 @@
|
||||
"label": "投稿数の上限"
|
||||
},
|
||||
"hideDescription": {
|
||||
"label": ""
|
||||
"label": "詳細を非表示"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2507,24 +2537,24 @@
|
||||
"description": "CPU、メモリ、ディスクなどのシステムハードウェアの使用",
|
||||
"option": {
|
||||
"hasShadow": {
|
||||
"label": ""
|
||||
"label": "グラフのシェーディングを有効にする"
|
||||
},
|
||||
"visibleCharts": {
|
||||
"label": "",
|
||||
"description": "",
|
||||
"label": "グラフの表示",
|
||||
"description": "表示するグラフを選択します。",
|
||||
"option": {
|
||||
"cpu": "",
|
||||
"memory": "",
|
||||
"network": ""
|
||||
"cpu": "CPU",
|
||||
"memory": "メモリ",
|
||||
"network": "ネットワーク"
|
||||
}
|
||||
},
|
||||
"labelDisplayMode": {
|
||||
"label": "",
|
||||
"label": "ラベル表示モード",
|
||||
"option": {
|
||||
"textWithIcon": "",
|
||||
"text": "",
|
||||
"icon": "",
|
||||
"hidden": ""
|
||||
"textWithIcon": "アイコン付きでテキストを表示",
|
||||
"text": "テキストのみ表示",
|
||||
"icon": "アイコンのみ表示",
|
||||
"hidden": "ラベルを隠す"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "招待",
|
||||
"integration": "連携機能",
|
||||
"app": "アプリ",
|
||||
"group": "グループ"
|
||||
"group": "グループ",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "ボード",
|
||||
"resources": "リソース",
|
||||
"authentication": "認証",
|
||||
"authorization": "認可"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3320,7 +3356,7 @@
|
||||
"label": "ファイアウォールのインターフェース"
|
||||
},
|
||||
"weather": {
|
||||
"label": ""
|
||||
"label": "天気"
|
||||
}
|
||||
},
|
||||
"interval": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "ライブラリ",
|
||||
"subtitle": "{count} 個が Homarr のコードで使用されています"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "ホットキー",
|
||||
"subtitle": "ワークフローを強化するためのキーボードショートカット",
|
||||
"field": {
|
||||
"shortcut": "ショートカット",
|
||||
"action": "アクション"
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "ボード編集モードの切り替え",
|
||||
"toggleColorScheme": "ライト/ダークモードの切り替え",
|
||||
"saveNotebook": "ノートブックを保存 (ノートブックウィジェット内のみ)",
|
||||
"openSpotlight": "検索を開く"
|
||||
},
|
||||
"note": "ヒント:CtrlキーとMacOSの⌘キーの両方を参照します"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "날씨 위치"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "초대",
|
||||
"integration": "",
|
||||
"app": "앱",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "보드",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": ""
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Pakvietimai",
|
||||
"integration": "",
|
||||
"app": "Programėlės",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Lentos",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Laikapstākļu atrašānās vieta"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Uzaicinājumi",
|
||||
"integration": "",
|
||||
"app": "Lietotnes",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Dēļi",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Groepsnaam al in gebruik"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Titel"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Randkleur"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Toon huidige windsnelheid",
|
||||
"description": "Alleen op het huidige weer"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Weerlocatie"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Momenteel aan het afspelen",
|
||||
"user": "Gebruiker",
|
||||
"name": "Naam",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Uitnodigingen",
|
||||
"integration": "Integraties",
|
||||
"app": "Apps",
|
||||
"group": "Groepen"
|
||||
"group": "Groepen",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Borden",
|
||||
"resources": "Bronnen",
|
||||
"authentication": "Authenticatie",
|
||||
"authorization": "Authorisatie"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Bibliotheken",
|
||||
"subtitle": "{count} gebruikt in de code van Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Gruppenavn allerede tatt"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Grensefarge"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Vis nåværende vindhastighet",
|
||||
"description": "Bare på nåværende vær"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Vær plassering"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Spilles nå",
|
||||
"user": "Bruker",
|
||||
"name": "Navn",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Invitasjoner",
|
||||
"integration": "Integrasjoner",
|
||||
"app": "Apper",
|
||||
"group": "Grupper"
|
||||
"group": "Grupper",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Tavler",
|
||||
"resources": "Ressurser",
|
||||
"authentication": "Autentisering",
|
||||
"authorization": "Autorisasjon"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Biblioteker",
|
||||
"subtitle": "{count} brukt i koden til Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -389,7 +389,7 @@
|
||||
}
|
||||
},
|
||||
"media": {
|
||||
"title": "Media",
|
||||
"title": "Multimedia",
|
||||
"item": {
|
||||
"upload": {
|
||||
"label": "Prześlij media",
|
||||
@@ -978,7 +978,7 @@
|
||||
}
|
||||
},
|
||||
"media": {
|
||||
"plural": "Medias",
|
||||
"plural": "Multimedia",
|
||||
"search": "Znajdź media",
|
||||
"field": {
|
||||
"name": "Nazwa",
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Nazwa użytkownika jest już zajęta"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "km/h",
|
||||
"milesPerHour": "mph"
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Tytuł"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": "Niestandardowe klasy CSS"
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Kolor obramowania"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Pokaż aktualną prędkość wiatru",
|
||||
"description": "Tylko dla bieżącej pogody"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": "Prędkość wiatru w mph"
|
||||
},
|
||||
"location": {
|
||||
"label": "Lokalizacja pogody"
|
||||
},
|
||||
@@ -1779,7 +1791,7 @@
|
||||
"freezingRain": "Marznący deszcz",
|
||||
"snowFall": "Opady śniegu",
|
||||
"snowGrains": "Ziarna śniegu",
|
||||
"rainShowers": "Deszczownice",
|
||||
"rainShowers": "Przelotne opady deszczu",
|
||||
"snowShowers": "Przelotne opady śniegu",
|
||||
"thunderstorm": "Burza",
|
||||
"thunderstormWithHail": "Burza z gradem",
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Obecnie odtwarzane",
|
||||
"user": "Użytkownik",
|
||||
"name": "Nazwa",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"metadata": {
|
||||
"title": "Statystyki dla nerdów",
|
||||
"video": {
|
||||
"title": "Wideo",
|
||||
"resolution": "Rozdzielczość"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Dźwięk",
|
||||
"channelCount": "Kanały audio",
|
||||
"codec": "Kodek audio"
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "Transkodowanie",
|
||||
"container": "Kontener",
|
||||
"resolution": "Rozdzielczość",
|
||||
"target": "Kodek docelowy"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Zaproszenia",
|
||||
"integration": "Integracje",
|
||||
"app": "Aplikacje",
|
||||
"group": "Grupy"
|
||||
"group": "Grupy",
|
||||
"searchEngine": "Wyszukiwarki",
|
||||
"media": "Multimedia"
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Tablice",
|
||||
"resources": "Zasoby",
|
||||
"authentication": "Uwierzytelnianie",
|
||||
"authorization": "Autoryzacja"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "Witaj z powrotem w swojej",
|
||||
"subtitle": "{app} tablicy"
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Biblioteki",
|
||||
"subtitle": "{count} używanych w kodzie Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "Skróty klawiszowe",
|
||||
"subtitle": "Skróty klawiaturowe ułatwiające pracę”",
|
||||
"field": {
|
||||
"shortcut": "Skrót",
|
||||
"action": "Akcja"
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "Przełącz tryb edycji tablicy",
|
||||
"toggleColorScheme": "Przełącz tryb jasny/ciemny",
|
||||
"saveNotebook": "Zapisz notatnik (tylko w widżecie notatnika)",
|
||||
"openSpotlight": "Otwórz wyszukiwarkę"
|
||||
},
|
||||
"note": "Wskazówka: Mod odnosi się zarówno do klawisza Ctrl, jak i ⌘ na macOS"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,10 +153,10 @@
|
||||
"label": "Usar ícone para pings"
|
||||
},
|
||||
"defaultSearchEngine": {
|
||||
"label": ""
|
||||
"label": "Mecanismo de pesquisa padrão"
|
||||
},
|
||||
"openSearchInNewTab": {
|
||||
"label": ""
|
||||
"label": "Abrir resultados da busca em uma nova aba"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
@@ -219,10 +219,10 @@
|
||||
"changeSearchPreferences": {
|
||||
"notification": {
|
||||
"success": {
|
||||
"message": ""
|
||||
"message": "Preferências de busca alteradas com sucesso"
|
||||
},
|
||||
"error": {
|
||||
"message": ""
|
||||
"message": "Não foi possível alterar as preferências de busca"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Localização do tempo"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Convites",
|
||||
"integration": "",
|
||||
"app": "Aplicativos",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Placas",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Locație meteo"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Invitații",
|
||||
"integration": "",
|
||||
"app": "Aplicații",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Planșe",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Имя группы уже занято"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Цвет границы"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Показать текущую скорость ветра",
|
||||
"description": "Только для текущей погоды"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Местоположение"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "Пользователь",
|
||||
"name": "Название",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Приглашения",
|
||||
"integration": "Интеграции",
|
||||
"app": "Приложения",
|
||||
"group": "Группы"
|
||||
"group": "Группы",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Панели",
|
||||
"resources": "Ресурсы",
|
||||
"authentication": "Аутентификация",
|
||||
"authorization": "Авторизация"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Библиотеки",
|
||||
"subtitle": "{count} используются в коде Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Názov skupiny je už obsadený"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Názov"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Farba okraja"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Zobraziť aktuálnu rýchlosť vetra",
|
||||
"description": "Len za aktuálneho počasia"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Poloha počasia"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Momentálne sa prehráva",
|
||||
"user": "Používateľ",
|
||||
"name": "Názov",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Pozvánky",
|
||||
"integration": "Integrácie",
|
||||
"app": "Aplikácie",
|
||||
"group": "Skupiny"
|
||||
"group": "Skupiny",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Dosky",
|
||||
"resources": "Zdroje",
|
||||
"authentication": "Autentifikácia",
|
||||
"authorization": "Autorizácia"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Knižnice",
|
||||
"subtitle": "{count} používané v Homarrskom kódexe"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Lokacija vremena"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Vabi",
|
||||
"integration": "",
|
||||
"app": "Aplikacije",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Deske",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Plats för väder"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Inbjudningar",
|
||||
"integration": "Integrationer",
|
||||
"app": "Applikationer",
|
||||
"group": "Grupper"
|
||||
"group": "Grupper",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Tavlor",
|
||||
"resources": "Resurser",
|
||||
"authentication": "Autentisering",
|
||||
"authorization": "Auktorisering"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Grup adı zaten alınmış"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "Başlık"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "Kenarlık rengi"
|
||||
}
|
||||
@@ -1708,7 +1717,7 @@
|
||||
"name": "Takvim",
|
||||
"description": "Entegrasyonlarınızdaki etkinlikleri belirli bir göreli zaman dilimi içinde bir takvim görünümünde görüntüleyin",
|
||||
"duration": {
|
||||
"allDay": ""
|
||||
"allDay": "Bütün gün"
|
||||
},
|
||||
"option": {
|
||||
"releaseType": {
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Mevcut rüzgar hızını göster",
|
||||
"description": "Yalnızca mevcut hava durumunda"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Hava durumu konumu"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "Şuan Oynatılan",
|
||||
"user": "Kullanıcı",
|
||||
"name": "İsim",
|
||||
"id": "Kimlik"
|
||||
"id": "Kimlik",
|
||||
"metadata": {
|
||||
"title": "Meraklısı için istatistikler",
|
||||
"video": {
|
||||
"title": "Video",
|
||||
"resolution": "Çözünürlük"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Ses",
|
||||
"channelCount": "Ses kanalları",
|
||||
"codec": "Ses kodekleri"
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "Kod Dönüştürme",
|
||||
"container": "Konteyner",
|
||||
"resolution": "Çözünürlük",
|
||||
"target": "Hedef Kodek"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Davetler",
|
||||
"integration": "Entegrasyonlar",
|
||||
"app": "Uygulamalar",
|
||||
"group": "Gruplar"
|
||||
"group": "Gruplar",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Paneller",
|
||||
"resources": "Kaynaklar",
|
||||
"authentication": "Kimlik doğrulama",
|
||||
"authorization": "Yetkilendirme"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3320,7 +3356,7 @@
|
||||
"label": "Güvenlik Duvarı Arayüzleri"
|
||||
},
|
||||
"weather": {
|
||||
"label": ""
|
||||
"label": "Hava Durumu"
|
||||
}
|
||||
},
|
||||
"interval": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Kütüphaneler",
|
||||
"subtitle": "Homarr kodlamasında {count} kütüphane kullanılıyor"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "Kısayollar",
|
||||
"subtitle": "İş akışınızı geliştirmek için klavye kısayolları",
|
||||
"field": {
|
||||
"shortcut": "Kısayol",
|
||||
"action": "Eylem"
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "Panonun düzenleme modunu değiştir",
|
||||
"toggleColorScheme": "Aydınlık/karanlık mod",
|
||||
"saveNotebook": "Not defterini kaydet (sadece not defteri widget'ının içinde)",
|
||||
"openSpotlight": "Aramayı aç"
|
||||
},
|
||||
"note": "İpucu: Mod, macOS'ta hem Ctrl tuşunu hem de ⌘ tuşunu ifade eder"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "Назва групи вже зайнята"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "Показати поточну швидкість вітру",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Погодна локація"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "Користувач",
|
||||
"name": "Назва",
|
||||
"id": "Id"
|
||||
"id": "Id",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Запрошення",
|
||||
"integration": "Інтеграції",
|
||||
"app": "Додатки",
|
||||
"group": "Групи"
|
||||
"group": "Групи",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Дошки",
|
||||
"resources": "Ресурси",
|
||||
"authentication": "Аутентифікація",
|
||||
"authorization": "Авторизація"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "Бібліотеки",
|
||||
"subtitle": "{count} - стільки бібліотек використано в коді Homarr"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": ""
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": ""
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "Vị trí thời tiết"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "",
|
||||
"user": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"id": "",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "Mời",
|
||||
"integration": "",
|
||||
"app": "Ứng dụng",
|
||||
"group": ""
|
||||
"group": "",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "Bảng",
|
||||
"resources": "",
|
||||
"authentication": "",
|
||||
"authorization": ""
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1145,6 +1145,12 @@
|
||||
"groupNameTaken": "用戶組名稱已存在"
|
||||
}
|
||||
}
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kilometersPerHour": "",
|
||||
"milesPerHour": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
@@ -1157,6 +1163,9 @@
|
||||
"title": {
|
||||
"label": "標題"
|
||||
},
|
||||
"customCssClasses": {
|
||||
"label": ""
|
||||
},
|
||||
"borderColor": {
|
||||
"label": "邊框顏色"
|
||||
}
|
||||
@@ -1744,6 +1753,9 @@
|
||||
"label": "顯示當前風速",
|
||||
"description": "僅限當前天氣"
|
||||
},
|
||||
"useImperialSpeed": {
|
||||
"label": ""
|
||||
},
|
||||
"location": {
|
||||
"label": "天氣位置"
|
||||
},
|
||||
@@ -1980,7 +1992,25 @@
|
||||
"currentlyPlaying": "目前播放中",
|
||||
"user": "使用者",
|
||||
"name": "名稱",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"video": {
|
||||
"title": "",
|
||||
"resolution": ""
|
||||
},
|
||||
"audio": {
|
||||
"title": "",
|
||||
"channelCount": "",
|
||||
"codec": ""
|
||||
},
|
||||
"transcoding": {
|
||||
"title": "",
|
||||
"container": "",
|
||||
"resolution": "",
|
||||
"target": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
@@ -2956,13 +2986,19 @@
|
||||
"invite": "邀請",
|
||||
"integration": "集成",
|
||||
"app": "應用程式",
|
||||
"group": "群組"
|
||||
"group": "群組",
|
||||
"searchEngine": "",
|
||||
"media": ""
|
||||
},
|
||||
"statisticLabel": {
|
||||
"boards": "面板",
|
||||
"resources": "資源",
|
||||
"authentication": "認證",
|
||||
"authorization": "認證"
|
||||
},
|
||||
"heroBanner": {
|
||||
"title": "",
|
||||
"subtitle": ""
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
@@ -3446,6 +3482,21 @@
|
||||
"libraries": {
|
||||
"title": "資料庫",
|
||||
"subtitle": "{count} 於 Homarr 待碼中使用"
|
||||
},
|
||||
"hotkeys": {
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"field": {
|
||||
"shortcut": "",
|
||||
"action": ""
|
||||
},
|
||||
"action": {
|
||||
"toggleBoardEdit": "",
|
||||
"toggleColorScheme": "",
|
||||
"saveNotebook": "",
|
||||
"openSpotlight": ""
|
||||
},
|
||||
"note": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,14 +30,14 @@
|
||||
"@homarr/log": "workspace:^0.1.0",
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"@mantine/dates": "^8.3.2",
|
||||
"@mantine/hooks": "^8.3.2",
|
||||
"@mantine/core": "^8.3.4",
|
||||
"@mantine/dates": "^8.3.4",
|
||||
"@mantine/hooks": "^8.3.4",
|
||||
"@tabler/icons-react": "^3.35.0",
|
||||
"mantine-react-table": "2.0.0-beta.9",
|
||||
"next": "15.5.4",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"svgson": "^5.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -45,7 +45,7 @@
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/css-modules": "^1.0.5",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -24,14 +24,14 @@
|
||||
"dependencies": {
|
||||
"@homarr/definitions": "workspace:^0.1.0",
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"zod": "^4.1.11",
|
||||
"zod": "^4.1.12",
|
||||
"zod-form-data": "^3.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -62,6 +62,7 @@ const emptySectionSchema = z.object({
|
||||
|
||||
export const dynamicSectionOptionsSchema = z.object({
|
||||
title: z.string().max(20).default(""),
|
||||
customCssClasses: z.array(z.string()).default([]),
|
||||
borderColor: z.string().default(""),
|
||||
});
|
||||
|
||||
|
||||
@@ -48,44 +48,44 @@
|
||||
"@homarr/translation": "workspace:^0.1.0",
|
||||
"@homarr/ui": "workspace:^0.1.0",
|
||||
"@homarr/validation": "workspace:^0.1.0",
|
||||
"@mantine/charts": "^8.3.2",
|
||||
"@mantine/core": "^8.3.2",
|
||||
"@mantine/hooks": "^8.3.2",
|
||||
"@mantine/charts": "^8.3.4",
|
||||
"@mantine/core": "^8.3.4",
|
||||
"@mantine/hooks": "^8.3.4",
|
||||
"@tabler/icons-react": "^3.35.0",
|
||||
"@tiptap/extension-color": "2.26.2",
|
||||
"@tiptap/extension-highlight": "2.26.2",
|
||||
"@tiptap/extension-image": "2.26.2",
|
||||
"@tiptap/extension-link": "^2.26.2",
|
||||
"@tiptap/extension-placeholder": "^2.26.2",
|
||||
"@tiptap/extension-table": "2.26.2",
|
||||
"@tiptap/extension-table-cell": "2.26.2",
|
||||
"@tiptap/extension-table-header": "2.26.2",
|
||||
"@tiptap/extension-table-row": "2.26.2",
|
||||
"@tiptap/extension-task-item": "2.26.2",
|
||||
"@tiptap/extension-task-list": "2.26.2",
|
||||
"@tiptap/extension-text-align": "2.26.2",
|
||||
"@tiptap/extension-text-style": "2.26.2",
|
||||
"@tiptap/extension-underline": "2.26.2",
|
||||
"@tiptap/react": "^2.26.2",
|
||||
"@tiptap/starter-kit": "^2.26.1",
|
||||
"@tiptap/extension-color": "2.26.3",
|
||||
"@tiptap/extension-highlight": "2.26.3",
|
||||
"@tiptap/extension-image": "2.26.3",
|
||||
"@tiptap/extension-link": "^2.26.3",
|
||||
"@tiptap/extension-placeholder": "^2.26.3",
|
||||
"@tiptap/extension-table": "2.26.3",
|
||||
"@tiptap/extension-table-cell": "2.26.3",
|
||||
"@tiptap/extension-table-header": "2.26.3",
|
||||
"@tiptap/extension-table-row": "2.26.3",
|
||||
"@tiptap/extension-task-item": "2.26.3",
|
||||
"@tiptap/extension-task-list": "2.26.3",
|
||||
"@tiptap/extension-text-align": "2.26.3",
|
||||
"@tiptap/extension-text-style": "2.26.3",
|
||||
"@tiptap/extension-underline": "2.26.3",
|
||||
"@tiptap/react": "^2.26.3",
|
||||
"@tiptap/starter-kit": "^2.26.3",
|
||||
"clsx": "^2.1.1",
|
||||
"dayjs": "^1.11.18",
|
||||
"mantine-form-zod-resolver": "^1.3.0",
|
||||
"mantine-react-table": "2.0.0-beta.9",
|
||||
"next": "15.5.4",
|
||||
"react": "19.1.1",
|
||||
"react-dom": "19.1.1",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"react-markdown": "^10.1.0",
|
||||
"recharts": "^2.15.4",
|
||||
"video.js": "^8.23.4",
|
||||
"zod": "^4.1.11"
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@homarr/eslint-config": "workspace:^0.2.0",
|
||||
"@homarr/prettier-config": "workspace:^0.1.0",
|
||||
"@homarr/tsconfig": "workspace:^0.1.0",
|
||||
"@types/video.js": "^7.3.58",
|
||||
"eslint": "^9.36.0",
|
||||
"typescript": "^5.9.2"
|
||||
"eslint": "^9.37.0",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import dayjs from "dayjs";
|
||||
|
||||
import type { RouterOutputs } from "@homarr/api";
|
||||
import { clientApi } from "@homarr/api/client";
|
||||
import { metricToImperial } from "@homarr/common";
|
||||
import { useScopedI18n } from "@homarr/translation/client";
|
||||
|
||||
import type { WidgetComponentProps } from "../definition";
|
||||
@@ -52,6 +53,7 @@ interface WeatherProps extends Pick<WidgetComponentProps<"weather">, "options">
|
||||
|
||||
const DailyWeather = ({ options, weather }: WeatherProps) => {
|
||||
const t = useScopedI18n("widget.weather");
|
||||
const tCommon = useScopedI18n("common");
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -78,7 +80,17 @@ const DailyWeather = ({ options, weather }: WeatherProps) => {
|
||||
{options.showCurrentWindSpeed && (
|
||||
<Group className="weather-current-wind-speed-group" wrap="nowrap" gap="xs">
|
||||
<IconWind size={16} />
|
||||
<Text fz={16}>{t("currentWindSpeed", { currentWindSpeed: String(weather.current.windspeed) })}</Text>
|
||||
<Text fz={16}>
|
||||
{t("currentWindSpeed", {
|
||||
currentWindSpeed: (options.useImperialSpeed
|
||||
? metricToImperial(weather.current.windspeed)
|
||||
: weather.current.windspeed
|
||||
).toFixed(1),
|
||||
unit: options.useImperialSpeed
|
||||
? tCommon("unit.speed.milesPerHour")
|
||||
: tCommon("unit.speed.kilometersPerHour"),
|
||||
})}
|
||||
</Text>
|
||||
</Group>
|
||||
)}
|
||||
<Group className="weather-max-min-temp-group" wrap="nowrap" gap="sm">
|
||||
@@ -180,6 +192,7 @@ function Forecast({ weather, options }: WeatherProps) {
|
||||
</HoverCard.Target>
|
||||
<HoverCard.Dropdown>
|
||||
<WeatherDescription
|
||||
useImperialSpeed={options.useImperialSpeed}
|
||||
dateFormat={dateFormat}
|
||||
time={dayWeather.time}
|
||||
weatherCode={dayWeather.weatherCode}
|
||||
|
||||
@@ -15,6 +15,7 @@ import {
|
||||
} from "@tabler/icons-react";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
import { metricToImperial } from "@homarr/common";
|
||||
import type { TranslationObject } from "@homarr/translation";
|
||||
import { useScopedI18n } from "@homarr/translation/client";
|
||||
import type { TablerIcon } from "@homarr/ui";
|
||||
@@ -40,6 +41,7 @@ export const WeatherIcon = ({ code, size = 50 }: WeatherIconProps) => {
|
||||
|
||||
interface WeatherDescriptionProps {
|
||||
weatherOnly?: boolean;
|
||||
useImperialSpeed?: boolean;
|
||||
dateFormat?: WidgetProps<"weather">["options"]["dateFormat"];
|
||||
time?: string;
|
||||
weatherCode: number;
|
||||
@@ -66,6 +68,7 @@ interface WeatherDescriptionProps {
|
||||
*/
|
||||
export const WeatherDescription = ({
|
||||
weatherOnly,
|
||||
useImperialSpeed,
|
||||
dateFormat,
|
||||
time,
|
||||
weatherCode,
|
||||
@@ -96,12 +99,18 @@ export const WeatherDescription = ({
|
||||
<List.Item icon={<IconMoon size={15} />}>{`${t("dailyForecast.sunset")}: ${sunset}`}</List.Item>
|
||||
{maxWindSpeed !== undefined && (
|
||||
<List.Item icon={<IconWind size={15} />}>
|
||||
{t("dailyForecast.maxWindSpeed", { maxWindSpeed: String(maxWindSpeed) })}
|
||||
{t("dailyForecast.maxWindSpeed", {
|
||||
maxWindSpeed: (useImperialSpeed ? metricToImperial(maxWindSpeed) : maxWindSpeed).toFixed(1),
|
||||
unit: useImperialSpeed ? tCommon("unit.speed.milesPerHour") : tCommon("unit.speed.kilometersPerHour"),
|
||||
})}
|
||||
</List.Item>
|
||||
)}
|
||||
{maxWindGusts !== undefined && (
|
||||
<List.Item icon={<IconWind size={15} />}>
|
||||
{t("dailyForecast.maxWindGusts", { maxWindGusts: String(maxWindGusts) })}
|
||||
{t("dailyForecast.maxWindGusts", {
|
||||
maxWindGusts: (useImperialSpeed ? metricToImperial(maxWindGusts) : maxWindGusts).toFixed(1),
|
||||
unit: useImperialSpeed ? tCommon("unit.speed.milesPerHour") : tCommon("unit.speed.kilometersPerHour"),
|
||||
})}
|
||||
</List.Item>
|
||||
)}
|
||||
</List>
|
||||
|
||||
@@ -13,6 +13,7 @@ export const { definition, componentLoader } = createWidgetDefinition("weather",
|
||||
isFormatFahrenheit: factory.switch(),
|
||||
disableTemperatureDecimals: factory.switch(),
|
||||
showCurrentWindSpeed: factory.switch({ withDescription: true }),
|
||||
useImperialSpeed: factory.switch(),
|
||||
location: factory.location({
|
||||
defaultValue: {
|
||||
name: "Paris",
|
||||
|
||||
Loaded 100 of 104 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user