ソースを参照

Merge branch 'dependabot/npm_and_yarn/eslint-config-next-13.4.4' of github.com:meienberger/runtipi into dependabot/npm_and_yarn/eslint-config-next-13.4.4

Nicolas Meienberger 2 年 前
コミット
7813fd4c67

+ 38 - 1
.all-contributorsrc

@@ -245,6 +245,42 @@
       "contributions": [
         "translation"
       ]
+    },
+    {
+      "login": "Bvoxl",
+      "name": "Bvoxl",
+      "avatar_url": "https://avatars.githubusercontent.com/u/67489519?v=4",
+      "profile": "https://github.com/Bvoxl",
+      "contributions": [
+        "translation"
+      ]
+    },
+    {
+      "login": "m-lab-0",
+      "name": "m-lab-0",
+      "avatar_url": "https://avatars.githubusercontent.com/u/116570617?v=4",
+      "profile": "https://github.com/m-lab-0",
+      "contributions": [
+        "translation"
+      ]
+    },
+    {
+      "login": "dannkunt",
+      "name": "dannkunt",
+      "avatar_url": "https://avatars.githubusercontent.com/u/32395839?v=4",
+      "profile": "https://github.com/dannkunt",
+      "contributions": [
+        "translation"
+      ]
+    },
+    {
+      "login": "Schmanko",
+      "name": "Schmanko",
+      "avatar_url": "https://avatars.githubusercontent.com/u/94195393?v=4",
+      "profile": "https://github.com/Schmanko",
+      "contributions": [
+        "translation"
+      ]
     }
   ],
   "contributorsPerLine": 7,
@@ -253,5 +289,6 @@
   "repoType": "github",
   "repoHost": "https://github.com",
   "skipCi": true,
-  "commitConvention": "angular"
+  "commitConvention": "angular",
+  "commitType": "docs"
 }

+ 1 - 1
.github/workflows/release-candidate.yml

@@ -34,7 +34,7 @@ jobs:
           echo "::set-output name=tag::${TAG}"
 
       - name: Build and push images
-        uses: docker/build-push-action@v3
+        uses: docker/build-push-action@v4
         with:
           context: .
           platforms: linux/amd64,linux/arm64

+ 1 - 1
.github/workflows/release.yml

@@ -30,7 +30,7 @@ jobs:
           echo "::set-output name=tag::${TAG}"
 
       - name: Build and push images
-        uses: docker/build-push-action@v3
+        uses: docker/build-push-action@v4
         with:
           context: .
           platforms: linux/amd64,linux/arm64

+ 7 - 1
README.md

@@ -1,7 +1,7 @@
 # Tipi — A personal homeserver for everyone
 
 <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
-[![All Contributors](https://img.shields.io/badge/all_contributors-25-orange.svg?style=flat-square)](#contributors-)
+[![All Contributors](https://img.shields.io/badge/all_contributors-29-orange.svg?style=flat-square)](#contributors-)
 <!-- ALL-CONTRIBUTORS-BADGE:END -->
 
 [![License](https://img.shields.io/github/license/meienberger/runtipi)](https://github.com/meienberger/runtipi/blob/master/LICENSE)
@@ -105,6 +105,12 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="14.28%"><a href="https://github.com/sclaren"><img src="https://avatars.githubusercontent.com/u/915292?v=4?s=100" width="100px;" alt="sclaren"/><br /><sub><b>sclaren</b></sub></a><br /><a href="https://github.com/meienberger/runtipi/commits?author=sclaren" title="Code">💻</a></td>
       <td align="center" valign="top" width="14.28%"><a href="https://github.com/mcmeel"><img src="https://avatars.githubusercontent.com/u/13773536?v=4?s=100" width="100px;" alt="mcmeel"/><br /><sub><b>mcmeel</b></sub></a><br /><a href="#question-mcmeel" title="Answering Questions">💬</a> <a href="#ideas-mcmeel" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/meienberger/runtipi/commits?author=mcmeel" title="Code">💻</a> <a href="https://github.com/meienberger/runtipi/commits?author=mcmeel" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="14.28%"><a href="https://github.com/NoisyFridge"><img src="https://avatars.githubusercontent.com/u/73795785?v=4?s=100" width="100px;" alt="NoisyFridge"/><br /><sub><b>NoisyFridge</b></sub></a><br /><a href="#translation-NoisyFridge" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Bvoxl"><img src="https://avatars.githubusercontent.com/u/67489519?v=4?s=100" width="100px;" alt="Bvoxl"/><br /><sub><b>Bvoxl</b></sub></a><br /><a href="#translation-Bvoxl" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/m-lab-0"><img src="https://avatars.githubusercontent.com/u/116570617?v=4?s=100" width="100px;" alt="m-lab-0"/><br /><sub><b>m-lab-0</b></sub></a><br /><a href="#translation-m-lab-0" title="Translation">🌍</a></td>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/dannkunt"><img src="https://avatars.githubusercontent.com/u/32395839?v=4?s=100" width="100px;" alt="dannkunt"/><br /><sub><b>dannkunt</b></sub></a><br /><a href="#translation-dannkunt" title="Translation">🌍</a></td>
+    </tr>
+    <tr>
+      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Schmanko"><img src="https://avatars.githubusercontent.com/u/94195393?v=4?s=100" width="100px;" alt="Schmanko"/><br /><sub><b>Schmanko</b></sub></a><br /><a href="#translation-Schmanko" title="Translation">🌍</a></td>
     </tr>
   </tbody>
 </table>

+ 4 - 4
docker-compose.yml

@@ -4,7 +4,7 @@ services:
   reverse-proxy:
     container_name: reverse-proxy
     image: traefik:v2.8
-    restart: unless-stopped
+    restart: on-failure
     ports:
       - ${NGINX_PORT-80}:80
       - ${NGINX_PORT_SSL-443}:443
@@ -19,7 +19,7 @@ services:
   tipi-db:
     container_name: tipi-db
     image: postgres:14
-    restart: unless-stopped
+    restart: on-failure
     stop_grace_period: 1m
     volumes:
       - ${PWD}/data/postgres:/var/lib/postgresql/data
@@ -38,7 +38,7 @@ services:
   tipi-redis:
     container_name: tipi-redis
     image: redis:alpine
-    restart: unless-stopped
+    restart: on-failure
     volumes:
       - ./data/redis:/data
     healthcheck:
@@ -51,7 +51,7 @@ services:
 
   dashboard:
     image: meienberger/runtipi:${TIPI_VERSION}
-    restart: unless-stopped
+    restart: on-failure
     container_name: dashboard
     networks:
       - tipi_main_network

+ 4 - 4
package.json

@@ -1,6 +1,6 @@
 {
   "name": "runtipi",
-  "version": "1.4.1",
+  "version": "1.4.2",
   "description": "A homeserver for everyone",
   "scripts": {
     "copy:migrations": "mkdir -p dist/migrations && cp -r ./src/server/migrations dist",
@@ -54,7 +54,7 @@
     "isomorphic-fetch": "^3.0.0",
     "js-cookie": "^3.0.5",
     "lodash.merge": "^4.6.2",
-    "next": "13.4.3",
+    "next": "13.4.4",
     "next-intl": "^2.14.2",
     "node-cron": "^3.0.1",
     "node-fetch-commonjs": "^3.2.4",
@@ -98,10 +98,10 @@
     "@types/jest": "^29.5.1",
     "@types/js-cookie": "^3.0.3",
     "@types/lodash.merge": "^4.6.7",
-    "@types/node": "20.2.1",
+    "@types/node": "20.2.5",
     "@types/node-cron": "^3.0.2",
     "@types/pg": "^8.6.6",
-    "@types/react": "18.2.6",
+    "@types/react": "18.2.7",
     "@types/react-dom": "18.2.4",
     "@types/semver": "^7.5.0",
     "@types/supertest": "^2.0.12",

+ 139 - 142
pnpm-lock.yaml

@@ -15,10 +15,10 @@ dependencies:
     version: 12.0.1
   '@radix-ui/react-dialog':
     specifier: ^1.0.3
-    version: 1.0.3(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)
+    version: 1.0.3(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)
   '@radix-ui/react-select':
     specifier: ^1.2.1
-    version: 1.2.1(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)
+    version: 1.2.1(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)
   '@radix-ui/react-switch':
     specifier: ^1.0.2
     version: 1.0.2(react-dom@18.2.0)(react@18.2.0)
@@ -45,7 +45,7 @@ dependencies:
     version: 10.27.1(@trpc/server@10.27.1)
   '@trpc/next':
     specifier: ^10.27.1
-    version: 10.27.1(@tanstack/react-query@4.29.7)(@trpc/client@10.27.1)(@trpc/react-query@10.27.1)(@trpc/server@10.27.1)(next@13.4.3)(react-dom@18.2.0)(react@18.2.0)
+    version: 10.27.1(@tanstack/react-query@4.29.7)(@trpc/client@10.27.1)(@trpc/react-query@10.27.1)(@trpc/server@10.27.1)(next@13.4.4)(react-dom@18.2.0)(react@18.2.0)
   '@trpc/react-query':
     specifier: ^10.27.1
     version: 10.27.1(@tanstack/react-query@4.29.7)(@trpc/client@10.27.1)(@trpc/server@10.27.1)(react-dom@18.2.0)(react@18.2.0)
@@ -83,11 +83,11 @@ dependencies:
     specifier: ^4.6.2
     version: 4.6.2
   next:
-    specifier: 13.4.3
-    version: 13.4.3(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1)
+    specifier: 13.4.4
+    version: 13.4.4(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1)
   next-intl:
     specifier: ^2.14.2
-    version: 2.14.2(next@13.4.3)(react@18.2.0)
+    version: 2.14.2(next@13.4.4)(react@18.2.0)
   node-cron:
     specifier: ^3.0.1
     version: 3.0.2
@@ -114,10 +114,10 @@ dependencies:
     version: 2.4.1(csstype@3.1.1)(react-dom@18.2.0)(react@18.2.0)
   react-markdown:
     specifier: ^8.0.7
-    version: 8.0.7(@types/react@18.2.6)(react@18.2.0)
+    version: 8.0.7(@types/react@18.2.7)(react@18.2.0)
   react-select:
     specifier: ^5.7.3
-    version: 5.7.3(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)
+    version: 5.7.3(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)
   react-tooltip:
     specifier: ^5.13.1
     version: 5.13.1(react-dom@18.2.0)(react@18.2.0)
@@ -211,8 +211,8 @@ devDependencies:
     specifier: ^4.6.7
     version: 4.6.7
   '@types/node':
-    specifier: 20.2.1
-    version: 20.2.1
+    specifier: 20.2.5
+    version: 20.2.5
   '@types/node-cron':
     specifier: ^3.0.2
     version: 3.0.7
@@ -220,8 +220,8 @@ devDependencies:
     specifier: ^8.6.6
     version: 8.6.6
   '@types/react':
-    specifier: 18.2.6
-    version: 18.2.6
+    specifier: 18.2.7
+    version: 18.2.7
   '@types/react-dom':
     specifier: 18.2.4
     version: 18.2.4
@@ -268,8 +268,8 @@ devDependencies:
     specifier: ^17.0.0
     version: 17.0.0(@typescript-eslint/eslint-plugin@5.59.6)(@typescript-eslint/parser@5.59.6)(eslint-plugin-import@2.27.5)(eslint@8.41.0)
   eslint-config-next:
-    specifier: 13.4.3
-    version: 13.4.3(eslint@8.41.0)(typescript@5.0.4)
+    specifier: 13.4.4
+    version: 13.4.4(eslint@8.41.0)(typescript@5.0.4)
   eslint-config-prettier:
     specifier: ^8.8.0
     version: 8.8.0(eslint@8.41.0)
@@ -302,7 +302,7 @@ devDependencies:
     version: 5.11.0(eslint@8.41.0)(typescript@5.0.4)
   jest:
     specifier: ^29.5.0
-    version: 29.5.0(@types/node@20.2.1)(ts-node@10.9.1)
+    version: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
   jest-environment-jsdom:
     specifier: ^29.5.0
     version: 29.5.0
@@ -311,7 +311,7 @@ devDependencies:
     version: 1.2.1(typescript@5.0.4)
   next-router-mock:
     specifier: ^0.9.3
-    version: 0.9.3(next@13.4.3)(react@18.2.0)
+    version: 0.9.3(next@13.4.4)(react@18.2.0)
   nodemon:
     specifier: ^2.0.22
     version: 2.0.22
@@ -326,7 +326,7 @@ devDependencies:
     version: 29.1.0(@babel/core@7.21.8)(esbuild@0.16.17)(jest@29.5.0)(typescript@5.0.4)
   ts-node:
     specifier: ^10.9.1
-    version: 10.9.1(@types/node@20.2.1)(typescript@5.0.4)
+    version: 10.9.1(@types/node@20.2.5)(typescript@5.0.4)
   typescript:
     specifier: 5.0.4
     version: 5.0.4
@@ -736,7 +736,7 @@ packages:
     resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==}
     dev: false
 
-  /@emotion/react@11.10.6(@types/react@18.2.6)(react@18.2.0):
+  /@emotion/react@11.10.6(@types/react@18.2.7)(react@18.2.0):
     resolution: {integrity: sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==}
     peerDependencies:
       '@types/react': '*'
@@ -752,7 +752,7 @@ packages:
       '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0)
       '@emotion/utils': 1.2.0
       '@emotion/weak-memoize': 0.3.0
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
       hoist-non-react-statics: 3.3.2
       react: 18.2.0
     dev: false
@@ -1078,7 +1078,7 @@ packages:
       '@floating-ui/core': 1.2.1
     dev: false
 
-  /@floating-ui/react-dom@0.7.2(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0):
+  /@floating-ui/react-dom@0.7.2(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==}
     peerDependencies:
       react: '>=16.8.0'
@@ -1087,7 +1087,7 @@ packages:
       '@floating-ui/dom': 0.5.4
       react: 18.2.0
       react-dom: 18.2.0(react@18.2.0)
-      use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.6)(react@18.2.0)
+      use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.7)(react@18.2.0)
     transitivePeerDependencies:
       - '@types/react'
     dev: false
@@ -1188,7 +1188,7 @@ packages:
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       chalk: 4.1.2
       jest-message-util: 29.5.0
       jest-util: 29.5.0
@@ -1209,14 +1209,14 @@ packages:
       '@jest/test-result': 29.5.0
       '@jest/transform': 29.5.0
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       ci-info: 3.8.0
       exit: 0.1.2
       graceful-fs: 4.2.10
       jest-changed-files: 29.5.0
-      jest-config: 29.5.0(@types/node@20.2.1)(ts-node@10.9.1)
+      jest-config: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
       jest-haste-map: 29.5.0
       jest-message-util: 29.5.0
       jest-regex-util: 29.4.3
@@ -1243,7 +1243,7 @@ packages:
     dependencies:
       '@jest/fake-timers': 29.5.0
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       jest-mock: 29.5.0
     dev: true
 
@@ -1270,7 +1270,7 @@ packages:
     dependencies:
       '@jest/types': 29.5.0
       '@sinonjs/fake-timers': 10.0.2
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       jest-message-util: 29.5.0
       jest-mock: 29.5.0
       jest-util: 29.5.0
@@ -1303,7 +1303,7 @@ packages:
       '@jest/transform': 29.5.0
       '@jest/types': 29.5.0
       '@jridgewell/trace-mapping': 0.3.17
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       chalk: 4.1.2
       collect-v8-coverage: 1.0.1
       exit: 0.1.2
@@ -1391,7 +1391,7 @@ packages:
       '@jest/schemas': 29.4.3
       '@types/istanbul-lib-coverage': 2.0.4
       '@types/istanbul-reports': 3.0.1
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       '@types/yargs': 17.0.22
       chalk: 4.1.2
     dev: true
@@ -1477,81 +1477,81 @@ packages:
       - supports-color
     dev: true
 
-  /@next/env@13.4.3:
-    resolution: {integrity: sha512-pa1ErjyFensznttAk3EIv77vFbfSYT6cLzVRK5jx4uiRuCQo+m2wCFAREaHKIy63dlgvOyMlzh6R8Inu8H3KrQ==}
+  /@next/env@13.4.4:
+    resolution: {integrity: sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==}
 
-  /@next/eslint-plugin-next@13.4.3:
-    resolution: {integrity: sha512-5B0uOnh7wyUY9vNNdIA6NUvWozhrZaTMZOzdirYAefqD0ZBK5C/h3+KMYdCKrR7JrXGvVpWnHtv54b3dCzwICA==}
+  /@next/eslint-plugin-next@13.4.4:
+    resolution: {integrity: sha512-5jnh7q6I15efnjR/rR+/TGTc9hn53g3JTbEjAMjmeQiExKqEUgIXqrHI5zlTNlNyzCPkBB860/ctxXheZaF2Vw==}
     dependencies:
       glob: 7.1.7
     dev: true
 
-  /@next/swc-darwin-arm64@13.4.3:
-    resolution: {integrity: sha512-yx18udH/ZmR4Bw4M6lIIPE3JxsAZwo04iaucEfA2GMt1unXr2iodHUX/LAKNyi6xoLP2ghi0E+Xi1f4Qb8f1LQ==}
+  /@next/swc-darwin-arm64@13.4.4:
+    resolution: {integrity: sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
     optional: true
 
-  /@next/swc-darwin-x64@13.4.3:
-    resolution: {integrity: sha512-Mi8xJWh2IOjryAM1mx18vwmal9eokJ2njY4nDh04scy37F0LEGJ/diL6JL6kTXi0UfUCGbMsOItf7vpReNiD2A==}
+  /@next/swc-darwin-x64@13.4.4:
+    resolution: {integrity: sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
     optional: true
 
-  /@next/swc-linux-arm64-gnu@13.4.3:
-    resolution: {integrity: sha512-aBvtry4bxJ1xwKZ/LVPeBGBwWVwxa4bTnNkRRw6YffJnn/f4Tv4EGDPaVeYHZGQVA56wsGbtA6nZMuWs/EIk4Q==}
+  /@next/swc-linux-arm64-gnu@13.4.4:
+    resolution: {integrity: sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@next/swc-linux-arm64-musl@13.4.3:
-    resolution: {integrity: sha512-krT+2G3kEsEUvZoYte3/2IscscDraYPc2B+fDJFipPktJmrv088Pei/RjrhWm5TMIy5URYjZUoDZdh5k940Dyw==}
+  /@next/swc-linux-arm64-musl@13.4.4:
+    resolution: {integrity: sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@next/swc-linux-x64-gnu@13.4.3:
-    resolution: {integrity: sha512-AMdFX6EKJjC0G/CM6hJvkY8wUjCcbdj3Qg7uAQJ7PVejRWaVt0sDTMavbRfgMchx8h8KsAudUCtdFkG9hlEClw==}
+  /@next/swc-linux-x64-gnu@13.4.4:
+    resolution: {integrity: sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@next/swc-linux-x64-musl@13.4.3:
-    resolution: {integrity: sha512-jySgSXE48shaLtcQbiFO9ajE9mqz7pcAVLnVLvRIlUHyQYR/WyZdK8ehLs65Mz6j9cLrJM+YdmdJPyV4WDaz2g==}
+  /@next/swc-linux-x64-musl@13.4.4:
+    resolution: {integrity: sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@next/swc-win32-arm64-msvc@13.4.3:
-    resolution: {integrity: sha512-5DxHo8uYcaADiE9pHrg8o28VMt/1kR8voDehmfs9AqS0qSClxAAl+CchjdboUvbCjdNWL1MISCvEfKY2InJ3JA==}
+  /@next/swc-win32-arm64-msvc@13.4.4:
+    resolution: {integrity: sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
     optional: true
 
-  /@next/swc-win32-ia32-msvc@13.4.3:
-    resolution: {integrity: sha512-LaqkF3d+GXRA5X6zrUjQUrXm2MN/3E2arXBtn5C7avBCNYfm9G3Xc646AmmmpN3DJZVaMYliMyCIQCMDEzk80w==}
+  /@next/swc-win32-ia32-msvc@13.4.4:
+    resolution: {integrity: sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==}
     engines: {node: '>= 10'}
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
     optional: true
 
-  /@next/swc-win32-x64-msvc@13.4.3:
-    resolution: {integrity: sha512-jglUk/x7ZWeOJWlVoKyIAkHLTI+qEkOriOOV+3hr1GyiywzcqfI7TpFSiwC7kk1scOiH7NTFKp8mA3XPNO9bDw==}
+  /@next/swc-win32-x64-msvc@13.4.4:
+    resolution: {integrity: sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [win32]
@@ -1678,7 +1678,7 @@ packages:
       react: 18.2.0
     dev: false
 
-  /@radix-ui/react-dialog@1.0.3(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0):
+  /@radix-ui/react-dialog@1.0.3(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-owNhq36kNPqC2/a+zJRioPg6HHnTn5B/sh/NjTY8r4W9g1L5VJlrzZIVcBr7R9Mg8iLjVmh6MGgMlfoVf/WO/A==}
     peerDependencies:
       react: ^16.8 || ^17.0 || ^18.0
@@ -1700,7 +1700,7 @@ packages:
       aria-hidden: 1.2.3
       react: 18.2.0
       react-dom: 18.2.0(react@18.2.0)
-      react-remove-scroll: 2.5.5(@types/react@18.2.6)(react@18.2.0)
+      react-remove-scroll: 2.5.5(@types/react@18.2.7)(react@18.2.0)
     transitivePeerDependencies:
       - '@types/react'
     dev: false
@@ -1763,14 +1763,14 @@ packages:
       react: 18.2.0
     dev: false
 
-  /@radix-ui/react-popper@1.1.1(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0):
+  /@radix-ui/react-popper@1.1.1(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-keYDcdMPNMjSC8zTsZ8wezUMiWM9Yj14wtF3s0PTIs9srnEPC9Kt2Gny1T3T81mmSeyDjZxsD9N5WCwNNb712w==}
     peerDependencies:
       react: ^16.8 || ^17.0 || ^18.0
       react-dom: ^16.8 || ^17.0 || ^18.0
     dependencies:
       '@babel/runtime': 7.20.13
-      '@floating-ui/react-dom': 0.7.2(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)
+      '@floating-ui/react-dom': 0.7.2(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)
       '@radix-ui/react-arrow': 1.0.2(react-dom@18.2.0)(react@18.2.0)
       '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
       '@radix-ui/react-context': 1.0.0(react@18.2.0)
@@ -1843,7 +1843,7 @@ packages:
       react-dom: 18.2.0(react@18.2.0)
     dev: false
 
-  /@radix-ui/react-select@1.2.1(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0):
+  /@radix-ui/react-select@1.2.1(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-GULRMITaOHNj79BZvQs3iZO0+f2IgI8g5HDhMi7Bnc13t7IlG86NFtOCfTLme4PNZdEtU+no+oGgcl6IFiphpQ==}
     peerDependencies:
       react: ^16.8 || ^17.0 || ^18.0
@@ -1860,7 +1860,7 @@ packages:
       '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0)
       '@radix-ui/react-focus-scope': 1.0.2(react-dom@18.2.0)(react@18.2.0)
       '@radix-ui/react-id': 1.0.0(react@18.2.0)
-      '@radix-ui/react-popper': 1.1.1(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)
+      '@radix-ui/react-popper': 1.1.1(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)
       '@radix-ui/react-portal': 1.0.2(react-dom@18.2.0)(react@18.2.0)
       '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0)
       '@radix-ui/react-slot': 1.0.1(react@18.2.0)
@@ -1872,7 +1872,7 @@ packages:
       aria-hidden: 1.2.3
       react: 18.2.0
       react-dom: 18.2.0(react@18.2.0)
-      react-remove-scroll: 2.5.5(@types/react@18.2.6)(react@18.2.0)
+      react-remove-scroll: 2.5.5(@types/react@18.2.7)(react@18.2.0)
     transitivePeerDependencies:
       - '@types/react'
     dev: false
@@ -2297,7 +2297,7 @@ packages:
       '@trpc/server': 10.27.1
     dev: false
 
-  /@trpc/next@10.27.1(@tanstack/react-query@4.29.7)(@trpc/client@10.27.1)(@trpc/react-query@10.27.1)(@trpc/server@10.27.1)(next@13.4.3)(react-dom@18.2.0)(react@18.2.0):
+  /@trpc/next@10.27.1(@tanstack/react-query@4.29.7)(@trpc/client@10.27.1)(@trpc/react-query@10.27.1)(@trpc/server@10.27.1)(next@13.4.4)(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-3aMGjhJXiJOj/tjqkyMot3x/nbxbHeEcCWjgYiCHmiXVk9h9liIG73f2is8jWEPs3o/eJ+eNwNSzkfhrhIWq2g==}
     peerDependencies:
       '@tanstack/react-query': ^4.18.0
@@ -2312,7 +2312,7 @@ packages:
       '@trpc/client': 10.27.1(@trpc/server@10.27.1)
       '@trpc/react-query': 10.27.1(@tanstack/react-query@4.29.7)(@trpc/client@10.27.1)(@trpc/server@10.27.1)(react-dom@18.2.0)(react@18.2.0)
       '@trpc/server': 10.27.1
-      next: 13.4.3(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1)
+      next: 13.4.4(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1)
       react: 18.2.0
       react-dom: 18.2.0(react@18.2.0)
       react-ssr-prepass: 1.5.0(react@18.2.0)
@@ -2391,13 +2391,13 @@ packages:
     resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
     dependencies:
       '@types/connect': 3.4.35
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/connect@3.4.35:
     resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/cookie@0.4.1:
@@ -2416,7 +2416,7 @@ packages:
   /@types/express-serve-static-core@4.17.33:
     resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       '@types/qs': 6.9.7
       '@types/range-parser': 1.2.4
     dev: true
@@ -2440,13 +2440,13 @@ packages:
     resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==}
     dependencies:
       '@types/jsonfile': 6.1.1
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/graceful-fs@4.1.6:
     resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/hast@2.3.4:
@@ -2493,7 +2493,7 @@ packages:
   /@types/jsdom@20.0.1:
     resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       '@types/tough-cookie': 4.0.2
       parse5: 7.1.2
     dev: true
@@ -2509,7 +2509,7 @@ packages:
   /@types/jsonfile@6.1.1:
     resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/lodash.merge@4.6.7:
@@ -2539,8 +2539,8 @@ packages:
     resolution: {integrity: sha512-9PuLtBboc/+JJ7FshmJWv769gDonTpItN0Ol5TMwclpSQNjVyB2SRxSKBcTtbSysSL5R7Oea06kTTFNciCoYwA==}
     dev: true
 
-  /@types/node@20.2.1:
-    resolution: {integrity: sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg==}
+  /@types/node@20.2.5:
+    resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==}
 
   /@types/parse-json@4.0.0:
     resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
@@ -2549,7 +2549,7 @@ packages:
   /@types/pg@8.6.6:
     resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       pg-protocol: 1.6.0
       pg-types: 2.2.0
 
@@ -2571,17 +2571,17 @@ packages:
   /@types/react-dom@18.2.4:
     resolution: {integrity: sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==}
     dependencies:
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
     dev: true
 
   /@types/react-transition-group@4.4.5:
     resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==}
     dependencies:
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
     dev: false
 
-  /@types/react@18.2.6:
-    resolution: {integrity: sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==}
+  /@types/react@18.2.7:
+    resolution: {integrity: sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==}
     dependencies:
       '@types/prop-types': 15.7.5
       '@types/scheduler': 0.16.2
@@ -2598,13 +2598,13 @@ packages:
     resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==}
     dependencies:
       '@types/mime': 3.0.1
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/set-cookie-parser@2.4.2:
     resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/stack-utils@2.0.1:
@@ -2615,7 +2615,7 @@ packages:
     resolution: {integrity: sha512-FFK/rRjNy24U6J1BvQkaNWu2ohOIF/kxRQXRsbT141YQODcOcZjzlcc4DGdI2SkTa0rhmF+X14zu6ICjCGIg+w==}
     dependencies:
       '@types/cookiejar': 2.1.2
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/supertest@2.0.12:
@@ -2653,7 +2653,7 @@ packages:
   /@types/web-push@3.3.2:
     resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
     dev: true
 
   /@types/yargs-parser@21.0.0:
@@ -4535,8 +4535,8 @@ packages:
       object.entries: 1.1.6
     dev: true
 
-  /eslint-config-next@13.4.3(eslint@8.41.0)(typescript@5.0.4):
-    resolution: {integrity: sha512-1lXwdFi29fKxzeugof/TUE7lpHyJQt5+U4LaUHyvQfHjvsWO77vFNicJv5sX6k0VDVSbnfz0lw+avxI+CinbMg==}
+  /eslint-config-next@13.4.4(eslint@8.41.0)(typescript@5.0.4):
+    resolution: {integrity: sha512-z/PMbm6L0iC/fwISULxe8IVy4DtNqZk2wQY711o35klenq70O6ns82A8yuMVCFjHC0DIyB2lyugesRtuk9u8dQ==}
     peerDependencies:
       eslint: ^7.23.0 || ^8.0.0
       typescript: '>=3.3.1'
@@ -4544,7 +4544,7 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@next/eslint-plugin-next': 13.4.3
+      '@next/eslint-plugin-next': 13.4.4
       '@rushstack/eslint-patch': 1.2.0
       '@typescript-eslint/parser': 5.59.6(eslint@8.41.0)(typescript@5.0.4)
       eslint: 8.41.0
@@ -4694,7 +4694,7 @@ packages:
       '@typescript-eslint/eslint-plugin': 5.59.6(@typescript-eslint/parser@5.59.6)(eslint@8.41.0)(typescript@5.0.4)
       '@typescript-eslint/utils': 5.52.0(eslint@8.41.0)(typescript@5.0.4)
       eslint: 8.41.0
-      jest: 29.5.0(@types/node@20.2.1)(ts-node@10.9.1)
+      jest: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
     transitivePeerDependencies:
       - supports-color
       - typescript
@@ -6005,7 +6005,7 @@ packages:
       '@jest/expect': 29.5.0
       '@jest/test-result': 29.5.0
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       chalk: 4.1.2
       co: 4.6.0
       dedent: 0.7.0
@@ -6025,7 +6025,7 @@ packages:
       - supports-color
     dev: true
 
-  /jest-cli@29.5.0(@types/node@20.2.1)(ts-node@10.9.1):
+  /jest-cli@29.5.0(@types/node@20.2.5)(ts-node@10.9.1):
     resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
@@ -6042,7 +6042,7 @@ packages:
       exit: 0.1.2
       graceful-fs: 4.2.10
       import-local: 3.1.0
-      jest-config: 29.5.0(@types/node@20.2.1)(ts-node@10.9.1)
+      jest-config: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
       jest-util: 29.5.0
       jest-validate: 29.5.0
       prompts: 2.4.2
@@ -6053,7 +6053,7 @@ packages:
       - ts-node
     dev: true
 
-  /jest-config@29.5.0(@types/node@20.2.1)(ts-node@10.9.1):
+  /jest-config@29.5.0(@types/node@20.2.5)(ts-node@10.9.1):
     resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
@@ -6068,7 +6068,7 @@ packages:
       '@babel/core': 7.21.8
       '@jest/test-sequencer': 29.5.0
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       babel-jest: 29.5.0(@babel/core@7.21.8)
       chalk: 4.1.2
       ci-info: 3.8.0
@@ -6088,7 +6088,7 @@ packages:
       pretty-format: 29.5.0
       slash: 3.0.0
       strip-json-comments: 3.1.1
-      ts-node: 10.9.1(@types/node@20.2.1)(typescript@5.0.4)
+      ts-node: 10.9.1(@types/node@20.2.5)(typescript@5.0.4)
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -6134,7 +6134,7 @@ packages:
       '@jest/fake-timers': 29.5.0
       '@jest/types': 29.5.0
       '@types/jsdom': 20.0.1
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       jest-mock: 29.5.0
       jest-util: 29.5.0
       jsdom: 20.0.3
@@ -6151,7 +6151,7 @@ packages:
       '@jest/environment': 29.5.0
       '@jest/fake-timers': 29.5.0
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       jest-mock: 29.5.0
       jest-util: 29.5.0
     dev: true
@@ -6167,7 +6167,7 @@ packages:
     dependencies:
       '@jest/types': 29.5.0
       '@types/graceful-fs': 4.1.6
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       anymatch: 3.1.3
       fb-watchman: 2.0.2
       graceful-fs: 4.2.10
@@ -6218,7 +6218,7 @@ packages:
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       jest-util: 29.5.0
     dev: true
 
@@ -6273,7 +6273,7 @@ packages:
       '@jest/test-result': 29.5.0
       '@jest/transform': 29.5.0
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       chalk: 4.1.2
       emittery: 0.13.1
       graceful-fs: 4.2.10
@@ -6304,7 +6304,7 @@ packages:
       '@jest/test-result': 29.5.0
       '@jest/transform': 29.5.0
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       chalk: 4.1.2
       cjs-module-lexer: 1.2.2
       collect-v8-coverage: 1.0.1
@@ -6359,7 +6359,7 @@ packages:
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       chalk: 4.1.2
       ci-info: 3.8.0
       graceful-fs: 4.2.10
@@ -6384,7 +6384,7 @@ packages:
     dependencies:
       '@jest/test-result': 29.5.0
       '@jest/types': 29.5.0
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       emittery: 0.13.1
@@ -6396,13 +6396,13 @@ packages:
     resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       jest-util: 29.5.0
       merge-stream: 2.0.0
       supports-color: 8.1.1
     dev: true
 
-  /jest@29.5.0(@types/node@20.2.1)(ts-node@10.9.1):
+  /jest@29.5.0(@types/node@20.2.5)(ts-node@10.9.1):
     resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
@@ -6415,7 +6415,7 @@ packages:
       '@jest/core': 29.5.0(ts-node@10.9.1)
       '@jest/types': 29.5.0
       import-local: 3.1.0
-      jest-cli: 29.5.0(@types/node@20.2.1)(ts-node@10.9.1)
+      jest-cli: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
     transitivePeerDependencies:
       - '@types/node'
       - supports-color
@@ -7316,7 +7316,7 @@ packages:
     engines: {node: '>= 0.6'}
     dev: false
 
-  /next-intl@2.14.2(next@13.4.3)(react@18.2.0):
+  /next-intl@2.14.2(next@13.4.4)(react@18.2.0):
     resolution: {integrity: sha512-JZNxNWWuZoF6wITMuwphND3LAW0IkV0U9YE4xftOX0zx+2MgIbBaRgBgGJ5l8S8Rstc7uPEz9Z0IT4lp0rJoNw==}
     engines: {node: '>=10'}
     peerDependencies:
@@ -7325,18 +7325,18 @@ packages:
     dependencies:
       '@formatjs/intl-localematcher': 0.2.32
       negotiator: 0.6.3
-      next: 13.4.3(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1)
+      next: 13.4.4(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1)
       react: 18.2.0
       use-intl: 2.14.2(react@18.2.0)
     dev: false
 
-  /next-router-mock@0.9.3(next@13.4.3)(react@18.2.0):
+  /next-router-mock@0.9.3(next@13.4.4)(react@18.2.0):
     resolution: {integrity: sha512-jl8eFe71LpMVGeBMpoxILkGfEgGY7IfLy8XPyv05/o61p5oQRNpoMmk46VMxRIpt0fI8XcvznBZKpDK6vbYQcQ==}
     peerDependencies:
       next: '>=10.0.0'
       react: '>=17.0.0'
     dependencies:
-      next: 13.4.3(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1)
+      next: 13.4.4(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1)
       react: 18.2.0
     dev: true
 
@@ -7344,14 +7344,13 @@ packages:
     resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
     dev: true
 
-  /next@13.4.3(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1):
-    resolution: {integrity: sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==}
+  /next@13.4.4(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(sass@1.62.1):
+    resolution: {integrity: sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==}
     engines: {node: '>=16.8.0'}
     hasBin: true
     peerDependencies:
       '@opentelemetry/api': ^1.1.0
       fibers: '>= 3.1.0'
-      node-sass: ^6.0.0 || ^7.0.0
       react: ^18.2.0
       react-dom: ^18.2.0
       sass: ^1.3.0
@@ -7360,12 +7359,10 @@ packages:
         optional: true
       fibers:
         optional: true
-      node-sass:
-        optional: true
       sass:
         optional: true
     dependencies:
-      '@next/env': 13.4.3
+      '@next/env': 13.4.4
       '@swc/helpers': 0.5.1
       busboy: 1.6.0
       caniuse-lite: 1.0.30001469
@@ -7376,15 +7373,15 @@ packages:
       styled-jsx: 5.1.1(@babel/core@7.21.8)(react@18.2.0)
       zod: 3.21.4
     optionalDependencies:
-      '@next/swc-darwin-arm64': 13.4.3
-      '@next/swc-darwin-x64': 13.4.3
-      '@next/swc-linux-arm64-gnu': 13.4.3
-      '@next/swc-linux-arm64-musl': 13.4.3
-      '@next/swc-linux-x64-gnu': 13.4.3
-      '@next/swc-linux-x64-musl': 13.4.3
-      '@next/swc-win32-arm64-msvc': 13.4.3
-      '@next/swc-win32-ia32-msvc': 13.4.3
-      '@next/swc-win32-x64-msvc': 13.4.3
+      '@next/swc-darwin-arm64': 13.4.4
+      '@next/swc-darwin-x64': 13.4.4
+      '@next/swc-linux-arm64-gnu': 13.4.4
+      '@next/swc-linux-arm64-musl': 13.4.4
+      '@next/swc-linux-x64-gnu': 13.4.4
+      '@next/swc-linux-x64-musl': 13.4.4
+      '@next/swc-win32-arm64-msvc': 13.4.4
+      '@next/swc-win32-ia32-msvc': 13.4.4
+      '@next/swc-win32-x64-msvc': 13.4.4
     transitivePeerDependencies:
       - '@babel/core'
       - babel-plugin-macros
@@ -8041,7 +8038,7 @@ packages:
   /react-is@18.2.0:
     resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
 
-  /react-markdown@8.0.7(@types/react@18.2.6)(react@18.2.0):
+  /react-markdown@8.0.7(@types/react@18.2.7)(react@18.2.0):
     resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==}
     peerDependencies:
       '@types/react': '>=16'
@@ -8049,7 +8046,7 @@ packages:
     dependencies:
       '@types/hast': 2.3.4
       '@types/prop-types': 15.7.5
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
       '@types/unist': 2.0.6
       comma-separated-tokens: 2.0.3
       hast-util-whitespace: 2.0.1
@@ -8068,7 +8065,7 @@ packages:
       - supports-color
     dev: false
 
-  /react-remove-scroll-bar@2.3.4(@types/react@18.2.6)(react@18.2.0):
+  /react-remove-scroll-bar@2.3.4(@types/react@18.2.7)(react@18.2.0):
     resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==}
     engines: {node: '>=10'}
     peerDependencies:
@@ -8078,13 +8075,13 @@ packages:
       '@types/react':
         optional: true
     dependencies:
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
       react: 18.2.0
-      react-style-singleton: 2.2.1(@types/react@18.2.6)(react@18.2.0)
+      react-style-singleton: 2.2.1(@types/react@18.2.7)(react@18.2.0)
       tslib: 2.5.2
     dev: false
 
-  /react-remove-scroll@2.5.5(@types/react@18.2.6)(react@18.2.0):
+  /react-remove-scroll@2.5.5(@types/react@18.2.7)(react@18.2.0):
     resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
     engines: {node: '>=10'}
     peerDependencies:
@@ -8094,16 +8091,16 @@ packages:
       '@types/react':
         optional: true
     dependencies:
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
       react: 18.2.0
-      react-remove-scroll-bar: 2.3.4(@types/react@18.2.6)(react@18.2.0)
-      react-style-singleton: 2.2.1(@types/react@18.2.6)(react@18.2.0)
+      react-remove-scroll-bar: 2.3.4(@types/react@18.2.7)(react@18.2.0)
+      react-style-singleton: 2.2.1(@types/react@18.2.7)(react@18.2.0)
       tslib: 2.5.2
-      use-callback-ref: 1.3.0(@types/react@18.2.6)(react@18.2.0)
-      use-sidecar: 1.1.2(@types/react@18.2.6)(react@18.2.0)
+      use-callback-ref: 1.3.0(@types/react@18.2.7)(react@18.2.0)
+      use-sidecar: 1.1.2(@types/react@18.2.7)(react@18.2.0)
     dev: false
 
-  /react-select@5.7.3(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0):
+  /react-select@5.7.3(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-z8i3NCuFFWL3w27xq92rBkVI2onT0jzIIPe480HlBjXJ3b5o6Q+Clp4ydyeKrj9DZZ3lrjawwLC5NGl0FSvUDg==}
     peerDependencies:
       react: ^16.8.0 || ^17.0.0 || ^18.0.0
@@ -8111,7 +8108,7 @@ packages:
     dependencies:
       '@babel/runtime': 7.20.13
       '@emotion/cache': 11.10.5
-      '@emotion/react': 11.10.6(@types/react@18.2.6)(react@18.2.0)
+      '@emotion/react': 11.10.6(@types/react@18.2.7)(react@18.2.0)
       '@floating-ui/dom': 1.2.1
       '@types/react-transition-group': 4.4.5
       memoize-one: 6.0.0
@@ -8119,7 +8116,7 @@ packages:
       react: 18.2.0
       react-dom: 18.2.0(react@18.2.0)
       react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0)
-      use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.6)(react@18.2.0)
+      use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.7)(react@18.2.0)
     transitivePeerDependencies:
       - '@types/react'
     dev: false
@@ -8132,7 +8129,7 @@ packages:
       react: 18.2.0
     dev: false
 
-  /react-style-singleton@2.2.1(@types/react@18.2.6)(react@18.2.0):
+  /react-style-singleton@2.2.1(@types/react@18.2.7)(react@18.2.0):
     resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
     engines: {node: '>=10'}
     peerDependencies:
@@ -8142,7 +8139,7 @@ packages:
       '@types/react':
         optional: true
     dependencies:
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
       get-nonce: 1.0.1
       invariant: 2.2.4
       react: 18.2.0
@@ -8989,7 +8986,7 @@ packages:
       bs-logger: 0.2.6
       esbuild: 0.16.17
       fast-json-stable-stringify: 2.1.0
-      jest: 29.5.0(@types/node@20.2.1)(ts-node@10.9.1)
+      jest: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
       jest-util: 29.5.0
       json5: 2.2.3
       lodash.memoize: 4.1.2
@@ -8999,7 +8996,7 @@ packages:
       yargs-parser: 21.1.1
     dev: true
 
-  /ts-node@10.9.1(@types/node@20.2.1)(typescript@5.0.4):
+  /ts-node@10.9.1(@types/node@20.2.5)(typescript@5.0.4):
     resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
     hasBin: true
     peerDependencies:
@@ -9018,7 +9015,7 @@ packages:
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.3
-      '@types/node': 20.2.1
+      '@types/node': 20.2.5
       acorn: 8.8.2
       acorn-walk: 8.2.0
       arg: 4.1.3
@@ -9235,7 +9232,7 @@ packages:
     resolution: {integrity: sha512-RtuPeMy7c1UrHwproMZN9gN6kiZ0SvJwRaEzwZY0j9MypEkFqyBaKv176jvlPtg58Zh36bOkS0NFABXMHvvGCA==}
     dev: false
 
-  /use-callback-ref@1.3.0(@types/react@18.2.6)(react@18.2.0):
+  /use-callback-ref@1.3.0(@types/react@18.2.7)(react@18.2.0):
     resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==}
     engines: {node: '>=10'}
     peerDependencies:
@@ -9245,7 +9242,7 @@ packages:
       '@types/react':
         optional: true
     dependencies:
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
       react: 18.2.0
       tslib: 2.5.2
     dev: false
@@ -9261,7 +9258,7 @@ packages:
       react: 18.2.0
     dev: false
 
-  /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.6)(react@18.2.0):
+  /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.7)(react@18.2.0):
     resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
     peerDependencies:
       '@types/react': '*'
@@ -9270,11 +9267,11 @@ packages:
       '@types/react':
         optional: true
     dependencies:
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
       react: 18.2.0
     dev: false
 
-  /use-sidecar@1.1.2(@types/react@18.2.6)(react@18.2.0):
+  /use-sidecar@1.1.2(@types/react@18.2.7)(react@18.2.0):
     resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
     engines: {node: '>=10'}
     peerDependencies:
@@ -9284,7 +9281,7 @@ packages:
       '@types/react':
         optional: true
     dependencies:
-      '@types/react': 18.2.6
+      '@types/react': 18.2.7
       detect-node-es: 1.1.0
       react: 18.2.0
       tslib: 2.5.2

+ 209 - 209
src/client/messages/de-DE.json

@@ -1,89 +1,89 @@
 {
   "server-messages": {
     "errors": {
-      "invalid-credentials": "Invalid credentials",
-      "admin-already-exists": "There is already an admin user. Please login to create a new user from the admin panel.",
-      "missing-email-or-password": "Missing email or password",
-      "invalid-username": "Invalid username",
-      "user-already-exists": "User already exists",
-      "error-creating-user": "Error creating user",
-      "no-change-password-request": "No change password request found",
-      "operator-not-found": "Operator user not found",
-      "user-not-found": "User not found",
-      "not-allowed-in-demo": "Not allowed in demo mode",
-      "not-allowed-in-dev": "Not allowed in dev mode",
-      "invalid-password": "Invalid password",
-      "invalid-password-length": "Password must be at least 8 characters long",
-      "invalid-locale": "Invalid locale",
-      "totp-session-not-found": "2FA session not found",
-      "totp-not-enabled": "2FA is not enabled for this user",
-      "totp-invalid-code": "Invalid 2FA code",
-      "totp-already-enabled": "2FA is already enabled for this user",
-      "app-not-found": "App {id} not found",
-      "app-failed-to-start": "Failed to start app {id}, see logs for more details",
-      "app-failed-to-install": "Failed to install app {id}, see logs for more details",
-      "app-failed-to-stop": "Failed to stop app {id}, see logs for more details",
-      "app-failed-to-uninstall": "Failed to uninstall app {id}, see logs for more details",
-      "app-failed-to-update": "Failed to update app {id}, see logs for more details",
-      "domain-required-if-expose-app": "Domain is required if app is exposed",
-      "domain-not-valid": "Domain {domain} is not a valid domain",
-      "invalid-config": "App {id} has an invalid config.json file",
-      "app-not-exposable": "App {id} is not exposable",
-      "app-force-exposed": "App {id} works only with exposed domain",
-      "domain-already-in-use": "Domain {domain} is already in use by app {id}",
-      "could-not-get-latest-version": "Could not get latest version",
-      "current-version-is-latest": "Current version is already up to date",
-      "major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
+      "invalid-credentials": "Ungültige Zugangsdaten",
+      "admin-already-exists": "Es existiert bereits ein Admin-Benutzer. Bitte melde dich an, um einen neuen Benutzer im Admin-Panel zu erzeugen.",
+      "missing-email-or-password": "E-Mail oder Passwort fehlt",
+      "invalid-username": "Ungültiger Nutzername",
+      "user-already-exists": "Benutzer existiert bereits",
+      "error-creating-user": "Fehler bei der Erstellung des Nutzers",
+      "no-change-password-request": "Keine Anfrage, das Passwort zu ändern gefunden",
+      "operator-not-found": "Operator-Benutzer nicht gefunden",
+      "user-not-found": "Benutzer nicht gefunden",
+      "not-allowed-in-demo": "Im Demo-Modus nicht erlaubt",
+      "not-allowed-in-dev": "Im Dev-Modus nicht erlaubt",
+      "invalid-password": "Ungültiges Passwort",
+      "invalid-password-length": "Das Passwort muss mindestens 8 Zeichen lang sein",
+      "invalid-locale": "Ungültige Region",
+      "totp-session-not-found": "2FA-Sitzung nicht gefunden",
+      "totp-not-enabled": "2FA ist für diesen Nutzer nicht aktiviert",
+      "totp-invalid-code": "Ungültiger 2FA-Code",
+      "totp-already-enabled": "2FA wurde für diesen Nutzer bereits aktiviert",
+      "app-not-found": "App {id} nicht gefunden",
+      "app-failed-to-start": "Starten der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
+      "app-failed-to-install": "Installieren der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
+      "app-failed-to-stop": "Stoppen der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
+      "app-failed-to-uninstall": "Deinstallieren der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
+      "app-failed-to-update": "Aktualisieren der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
+      "domain-required-if-expose-app": "Eine Domain ist erforderlich, wenn die App veröffentlicht ist",
+      "domain-not-valid": "Die Domain {domain} ist ungültig",
+      "invalid-config": "Die App {id} hat eine ungültige config.json Datei",
+      "app-not-exposable": "App {id} nicht veröffentlichbar",
+      "app-force-exposed": "App {id} funktioniert nur mit veröffentlichter Domain",
+      "domain-already-in-use": "Die Domain {domain} ist bereits in Verwendung von der App {id}",
+      "could-not-get-latest-version": "Konnte aktuellste Version nicht abfragen",
+      "current-version-is-latest": "Die aktuelle Version ist bereits auf dem neuesten Stand",
+      "major-version-update": "Die Hauptversion hat sich geändert. Bitte aktualisieren Sie manuell. (Anleitung auf GitHub)"
     },
     "success": {}
   },
   "auth": {
     "login": {
-      "title": "Login to your account",
-      "submit": "Login"
+      "title": "In Konto einloggen",
+      "submit": "Anmelden"
     },
     "totp": {
-      "title": "Two-factor authentication",
-      "instructions": "Enter the code from your authenticator app",
-      "submit": "Confirm"
+      "title": "Zwei-Faktor Authentifizierung",
+      "instructions": "Code aus der Authenticator-App eingeben",
+      "submit": "Bestätigen"
     },
     "register": {
-      "title": "Register your account",
-      "submit": "Register"
+      "title": "Ihr Konto erstellen",
+      "submit": "Registrieren"
     },
     "reset-password": {
-      "title": "Reset your password",
-      "submit": "Reset password",
-      "cancel": "Cancel password change request",
-      "instructions": "Run this command on your server and then refresh this page",
-      "success-title": "Password reset",
-      "success": "Your password has been reset. You can now login with your new password. And your email {email}",
-      "back-to-login": "Back to login"
+      "title": "Passwort zurücksetzen",
+      "submit": "Zurücksetzen",
+      "cancel": "Passwortänderung abbrechen",
+      "instructions": "Führen Sie diesen Befehl auf Ihrem Server aus und aktualisieren Sie die Seite",
+      "success-title": "Passwort zurückgesetzt",
+      "success": "Ihr Passwort wurde gespeichert. Sie können sich nun mit Ihrem neuen Passwort und ihrer E-Mail {email} anmelden",
+      "back-to-login": "Zurück zur Anmeldung"
     },
     "form": {
-      "email": "Email address",
-      "email-placeholder": "you@example.com",
-      "password": "Password",
-      "password-placeholder": "Enter your password",
-      "password-confirmation": "Confirm password",
-      "password-confirmation-placeholder": "Confirm your password",
-      "forgot": "Forgot password?",
-      "new-password-placeholder": "Your new password",
-      "new-password-confirmation-placeholder": "Confirm your new password",
+      "email": "E-Mail Adresse",
+      "email-placeholder": "name@beispiel.com",
+      "password": "Passwort",
+      "password-placeholder": "Passwort eingeben",
+      "password-confirmation": "Passwort bestätigen",
+      "password-confirmation-placeholder": "Passwort bestätigen",
+      "forgot": "Passwort vergessen?",
+      "new-password-placeholder": "Neues Passwort",
+      "new-password-confirmation-placeholder": "Neues Passwort bestätigen",
       "errors": {
         "email": {
-          "required": "Email address is required",
-          "email": "Email address is invalid",
-          "invalid": "Email address is invalid"
+          "required": "E-Mail-Adresse erforderlich",
+          "email": "E-Mail-Adresse ist ungültig",
+          "invalid": "E-Mail-Adresse ist ungültig"
         },
         "password": {
-          "required": "Password is required",
-          "minlength": "Password must be at least 8 characters"
+          "required": "Passwort erforderlich",
+          "minlength": "Das Passwort muss mindestens 8 Zeichen lang sein"
         },
         "password-confirmation": {
-          "required": "Password confirmation is required",
-          "minlength": "Password confirmation must be at least 8 characters",
-          "match": "Passwords do not match"
+          "required": "Passwortbestätigung erforderlich",
+          "minlength": "Die Passwortbestätigung muss mindestens 8 Zeichen lang sein",
+          "match": "Passwörter stimmen nicht überein"
         }
       }
     }
@@ -92,204 +92,204 @@
     "title": "Dashboard",
     "cards": {
       "disk": {
-        "title": "Disk Space",
-        "subtitle": "Used out of {total} GB"
+        "title": "Speicherplatz",
+        "subtitle": "Wird von {total} GB verwendet"
       },
       "memory": {
-        "title": "Memory Used"
+        "title": "Speichernutzung"
       },
       "cpu": {
-        "title": "CPU Load",
-        "subtitle": "Uninstall apps to reduce load"
+        "title": "CPU-Auslastung",
+        "subtitle": "Apps deinstallieren um Last zu reduzieren"
       }
     }
   },
   "apps": {
-    "status-running": "Running",
-    "status-stopped": "Stopped",
-    "status-starting": "Starting",
-    "status-stopping": "Stopping",
-    "status-updating": "Updating",
-    "status-missing": "Missing",
-    "status-installing": "Installing",
-    "status-uninstalling": "Uninstalling",
-    "update-available": "Update available",
+    "status-running": "Aktiv",
+    "status-stopped": "Angehalten",
+    "status-starting": "Startet",
+    "status-stopping": "Stoppen",
+    "status-updating": "Aktualisieren",
+    "status-missing": "Fehlt",
+    "status-installing": "Installieren",
+    "status-uninstalling": "Deinstallieren",
+    "update-available": "Aktualisierung verfügbar",
     "my-apps": {
-      "title": "My Apps",
-      "empty-title": "No app installed",
-      "empty-subtitle": "Install an app from the app store to get started",
-      "empty-action": "Go to app store"
+      "title": "Meine Apps",
+      "empty-title": "Keine Apps installiert",
+      "empty-subtitle": "Installiere eine App aus dem App Store, um loszulegen",
+      "empty-action": "Zum App Store"
     },
     "app-store": {
       "title": "App Store",
-      "search-placeholder": "Search apps",
-      "category-placeholder": "Select a category",
-      "no-results": "No app found",
-      "no-results-subtitle": "Try to refine your search"
+      "search-placeholder": "Apps suchen",
+      "category-placeholder": "Kategorie wählen",
+      "no-results": "Keine App gefunden",
+      "no-results-subtitle": "Versuche, deine Suche zu verbessern"
     },
     "app-details": {
-      "install-success": "App installed successfully",
-      "uninstall-success": "App uninstalled successfully",
-      "stop-success": "App stopped successfully",
-      "update-success": "App updated successfully",
-      "start-success": "App started successfully",
-      "update-config-success": "App config updated successfully. Restart the app to apply the changes",
+      "install-success": "App erfolgreich installiert",
+      "uninstall-success": "App erfolgreich deinstalliert",
+      "stop-success": "App erfolgreich angehalten",
+      "update-success": "App erfolgreich aktualisiert",
+      "start-success": "App erfolgreich gestartet",
+      "update-config-success": "App-Konfiguration erfolgreich aktualisiert. Starte die App neu, um die Änderungen zu übernehmen",
       "version": "Version",
-      "description": "Description",
-      "base-info": "Base info",
-      "source-code": "Source code",
-      "author": "Author",
+      "description": "Beschreibung",
+      "base-info": "Basisinfo",
+      "source-code": "Quellcode",
+      "author": "Autor",
       "port": "Port",
-      "categories-title": "Categories",
+      "categories-title": "Kategorien",
       "link": "Link",
       "website": "Website",
-      "supported-arch": "Supported architectures",
+      "supported-arch": "Unterstütze Architekturen",
       "categories": {
-        "data": "Data",
-        "network": "Network",
+        "data": "Daten",
+        "network": "Netzwerk",
         "media": "Media",
-        "development": "Development",
-        "automation": "Automation",
-        "social": "Social",
-        "utilities": "Utilities",
-        "security": "Security",
-        "photography": "Photography",
-        "featured": "Featured",
-        "books": "Books",
-        "music": "Music",
-        "finance": "Finance",
+        "development": "Entwicklung",
+        "automation": "Automatisierung",
+        "social": "Soziale Medien",
+        "utilities": "Dienstprogramme",
+        "security": "Sicherheit",
+        "photography": "Fotografie",
+        "featured": "Empfohlen",
+        "books": "Bücher",
+        "music": "Musik",
+        "finance": "Finanzen",
         "gaming": "Gaming",
-        "ai": "AI"
+        "ai": "KI"
       },
       "actions": {
         "start": "Start",
-        "remove": "Remove",
-        "settings": "Settings",
-        "stop": "Stop",
-        "open": "Open",
-        "loading": "Loading",
-        "cancel": "Cancel",
-        "install": "Install",
-        "update": "Update"
+        "remove": "Löschen",
+        "settings": "Einstellungen",
+        "stop": "Anhalten",
+        "open": "Öffnen",
+        "loading": "Laden",
+        "cancel": "Abbrechen",
+        "install": "Installieren",
+        "update": "Aktualisieren"
       },
       "install-form": {
-        "title": "Install {name}",
-        "expose-app": "Expose app",
-        "domain-name": "Domain name",
-        "domain-name-hint": "Make sure this exact domain contains an A record pointing to your IP.",
-        "choose-option": "Choose an option...",
-        "sumbit-install": "Install",
-        "submit-update": "Update",
+        "title": "{name} installieren",
+        "expose-app": "App veröffentlichen",
+        "domain-name": "Domainname",
+        "domain-name-hint": "Stellen Sie sicher, dass diese Domain einen A-Eintrag enthält, der auf Ihre IP verweist.",
+        "choose-option": "Wählen Sie eine Option...",
+        "sumbit-install": "Installieren",
+        "submit-update": "Aktualisieren",
         "errors": {
-          "required": "{label} is required",
-          "regex": "{label} must match the pattern {pattern}",
-          "max-length": "{label} must be less than {max} characters",
-          "min-length": "{label} must be at least {min} characters",
-          "between-length": "{label} must be between {min} and {max} characters",
-          "invalid-email": "{label} must be a valid email address",
-          "number": "{label} must be a number",
-          "fqdn": "{label} must be a valid domain",
-          "ip": "{label} must be a valid IP address",
-          "fqdnip": "{label} must be a valid domain or IP address",
-          "url": "{label} must be a valid URL"
+          "required": "{label} ist erforderlich",
+          "regex": "{label} stimmt nicht mit dem Format {pattern} überein",
+          "max-length": "{label} muss kleiner als {max} Zeichen sein",
+          "min-length": "{label} muss mindestens {min} Zeichen lang sein",
+          "between-length": "{label} muss zwischen {min} und {max} Zeichen lang sein",
+          "invalid-email": "{label} muss eine gültige E-Mail Adresse sein",
+          "number": "{label} muss eine Nummer sein",
+          "fqdn": "{label} muss eine gültige Domain sein",
+          "ip": "{label} muss eine gültige IP-Adresse sein",
+          "fqdnip": "{label} muss eine gültige Domain oder IP-Addresse sein",
+          "url": "{label} muss eine gültige URL sein"
         }
       },
       "stop-form": {
-        "title": "Stop {name} ?",
-        "subtitle": "All data will be retained",
-        "submit": "Stop"
+        "title": "{name} anhalten?",
+        "subtitle": "Alle Daten werden aufbewahrt",
+        "submit": "Anhalten"
       },
       "uninstall-form": {
-        "title": "Uninstall {name} ?",
-        "subtitle": "All data for this app will be lost.",
-        "warning": "Are you sure? This action cannot be undone.",
-        "submit": "Uninstall"
+        "title": "{name} deinstallieren?",
+        "subtitle": "Alle Daten für diese Anwendung werden gelöscht.",
+        "warning": "Sind Sie sicher? Dieser Schritt kann nicht rückgängig gemacht werden.",
+        "submit": "Deinstallieren"
       },
       "update-form": {
-        "title": "Update {name} ?",
-        "subtitle1": "Update app to latest verion :",
-        "subtitle2": "This will reset your custom configuration (e.g. changes in docker-compose.yml)",
-        "submit": "Update"
+        "title": "Aktualisieren {name}?",
+        "subtitle1": "App auf die neueste Version aktualisieren:",
+        "subtitle2": "Dies wird Ihre benutzerdefinierte Konfiguration zurücksetzen (z.B. Änderungen in docker-compose.yml)",
+        "submit": "Aktualisieren"
       },
       "update-settings-form": {
-        "title": "Update {name} config"
+        "title": "Aktualisieren {name} Konfiguration"
       }
     }
   },
   "settings": {
-    "title": "Settings",
+    "title": "Einstellungen",
     "actions": {
-      "tab-title": "Actions",
-      "title": "Actions",
-      "current-version": "Current version: {version}",
-      "stay-up-to-date": "Stay up to date with the latest version of Tipi",
-      "new-version": "A new version ({version}) of Tipi is available",
-      "maintenance-title": "Maintenance",
-      "maintenance-subtitle": "Common actions to perform on your instance",
-      "restart": "Restart",
-      "update": "Update to {version}",
-      "already-latest": "Already up to date"
+      "tab-title": "Aktionen",
+      "title": "Aktionen",
+      "current-version": "Aktuelle Version: {version}",
+      "stay-up-to-date": "Bleiben Sie auf dem Laufenden mit der neuesten Version von Tipi",
+      "new-version": "Eine neue Version ({version}) von Tipi ist verfügbar",
+      "maintenance-title": "Wartung",
+      "maintenance-subtitle": "Beliebte Aktionen, die Sie auf Ihrer Instanz durchführen können",
+      "restart": "Neustart",
+      "update": "Aktualisieren zu {version}",
+      "already-latest": "Bereits auf dem neuesten Stand"
     },
     "settings": {
-      "tab-title": "Settings",
-      "title": "General settings",
-      "subtitle": "This will update your settings.json file. Make sure you know what you are doing before updating these values.",
-      "settings-updated": "Settings updated. Restart your instance to apply new settings.",
-      "invalid-ip": "Invalid IP address",
-      "invalid-url": "Invalid URL",
-      "invalid-domain": "Invalid domain",
-      "domain-name": "Domain name",
-      "domain-name-hint": "Make sure this exact domain contains an A record pointing to your IP.",
+      "tab-title": "Einstellungen",
+      "title": "Allgemeine Einstellungen",
+      "subtitle": "Dadurch wird Ihre Datei settings.json aktualisiert. Stellen Sie sicher, dass Sie wissen, was Sie tun, bevor Sie diese Werte aktualisieren.",
+      "settings-updated": "Einstellungen aktualisiert. Starten Sie Ihre Instanz neu, um die Einstellungen zu übernehmen.",
+      "invalid-ip": "Ungültige IP-Adresse",
+      "invalid-url": "Ungültige URL",
+      "invalid-domain": "Ungültige Domain",
+      "domain-name": "Domänenname",
+      "domain-name-hint": "Stellen Sie sicher, dass genau diese Domain einen A-Eintrag enthält, der auf Ihre IP verweist.",
       "dns-ip": "DNS IP",
-      "internal-ip": "Internal IP",
-      "internal-ip-hint": "IP address your server is listening on.",
-      "apps-repo": "Apps repo URL",
-      "apps-repo-hint": "URL to the apps repository.",
-      "storage-path": "Storage path",
-      "storage-path-hint": "Path to the storage directory. Keep empty for default (runtipi/app-data). Make sure it is an absolute path and that it exists",
-      "submit": "Save",
-      "user-settings-title": "User settings",
-      "language": "Language",
-      "help-translate": "Help translate Tipi"
+      "internal-ip": "Interne IP",
+      "internal-ip-hint": "IP-Adresse, die Ihr Server abhört.",
+      "apps-repo": "App-Repo-URL",
+      "apps-repo-hint": "URL zum App-Repository.",
+      "storage-path": "Speicherpfad",
+      "storage-path-hint": "Pfad zum Speicherverzeichnis. Leer lassen für Standard (runtipi/app-data). Stelle sicher, dass es ein absoluter Pfad ist, der existiert",
+      "submit": "Speichern",
+      "user-settings-title": "Benutzereinstellungen",
+      "language": "Sprache",
+      "help-translate": "Beim Übersetzen helfen"
     },
     "security": {
-      "tab-title": "Security",
-      "change-password-title": "Change password",
-      "change-password-subtitle": "Changing your password will log you out of all devices.",
-      "password-change-success": "Password changed successfully",
-      "2fa-title": "Two-factor authentication",
-      "2fa-subtitle": "Two-factor authentication (2FA) adds an additional layer of security to your account.",
-      "2fa-subtitle-2": "When enabled, you will be prompted to enter a code from your authenticator app when you log in.",
-      "2fa-enable-success": "Two-factor authentication enabled",
-      "2fa-disable-success": "Two-factor authentication disabled",
-      "scan-qr-code": "Scan this QR code with your authenticator app.",
-      "enter-key-manually": "Or enter this key manually.",
-      "enter-2fa-code": "Enter the 6-digit code from your authenticator app",
-      "enable-2fa": "Enable two-factor authentication",
-      "disable-2fa": "Disable two-factor authentication",
-      "password-needed": "Password needed",
-      "password-needed-hint": "Your password is required to change two-factor authentication settings.",
+      "tab-title": "Sicherheit",
+      "change-password-title": "Passwort ändern",
+      "change-password-subtitle": "Das Ändern des Passworts wird Sie von allen Geräten abmelden.",
+      "password-change-success": "Passwort erfolgreich geändert",
+      "2fa-title": "Zwei-Faktor Authentifizierung",
+      "2fa-subtitle": "Zwei-Faktor Authentifizierung (2FA) fügt deinem Konto eine weitere Sicherheitsebene zu.",
+      "2fa-subtitle-2": "Wenn aktiviert, werden Sie bei der Anmeldung aufgefordert, einen Code aus ihrer Authentifizierungs-App einzugeben.",
+      "2fa-enable-success": "Zwei-Faktor Authentifizierung aktiviert",
+      "2fa-disable-success": "Zwei‐Faktor‐Authentifizierung deaktiviert",
+      "scan-qr-code": "Scannen Sie diesen QR-Code mit Ihrer Authentifizierungs-App.",
+      "enter-key-manually": "Oder diesen Code manuell eingeben.",
+      "enter-2fa-code": "Geben Sie den 6-stelligen Code aus\nihrer Authentifizierungs-App ein",
+      "enable-2fa": "Zwei-Faktor-Authentifizierung aktivieren",
+      "disable-2fa": "Zwei-Faktor-Authentifizierung deaktivieren",
+      "password-needed": "Passwort erforderlich",
+      "password-needed-hint": "Ihr Passwort wird benötigt, um die Zwei-Faktor-Authentifizierungseinstellungen zu ändern.",
       "form": {
-        "password-length": "Password must be at least 8 characters",
-        "password-match": "Passwords do not match",
-        "current-password": "Current password",
-        "new-password": "New password",
-        "confirm-password": "Confirm new password",
-        "change-password": "Change password",
-        "password": "Password"
+        "password-length": "Das Passwort muss mindestens 8 Zeichen lang sein",
+        "password-match": "Passwörter stimmen nicht überein",
+        "current-password": "Aktuelles Passwort",
+        "new-password": "Neues Passwort",
+        "confirm-password": "Neues Passwort bestätigen",
+        "change-password": "Passwort ändern",
+        "password": "Passwort"
       }
     }
   },
   "header": {
     "dashboard": "Dashboard",
-    "my-apps": "My Apps",
+    "my-apps": "Meine Apps",
     "app-store": "App Store",
-    "settings": "Settings",
-    "logout": "Logout",
-    "dark-mode": "Dark Mode",
-    "light-mode": "Light Mode",
+    "settings": "Einstellungen",
+    "logout": "Abmelden",
+    "dark-mode": "Dunkler Modus",
+    "light-mode": "Heller Modus",
     "sponsor": "Sponsor",
-    "source-code": "Source code",
-    "update-available": "Update available"
+    "source-code": "Quellcode",
+    "update-available": "Aktualisierung verfügbar"
   }
 }

+ 18 - 18
src/client/messages/es-ES.json

@@ -1,24 +1,24 @@
 {
   "server-messages": {
     "errors": {
-      "invalid-credentials": "Invalid credentials",
-      "admin-already-exists": "There is already an admin user. Please login to create a new user from the admin panel.",
-      "missing-email-or-password": "Missing email or password",
-      "invalid-username": "Invalid username",
-      "user-already-exists": "User already exists",
-      "error-creating-user": "Error creating user",
-      "no-change-password-request": "No change password request found",
-      "operator-not-found": "Operator user not found",
-      "user-not-found": "User not found",
-      "not-allowed-in-demo": "Not allowed in demo mode",
-      "not-allowed-in-dev": "Not allowed in dev mode",
-      "invalid-password": "Invalid password",
-      "invalid-password-length": "Password must be at least 8 characters long",
-      "invalid-locale": "Invalid locale",
-      "totp-session-not-found": "2FA session not found",
-      "totp-not-enabled": "2FA is not enabled for this user",
-      "totp-invalid-code": "Invalid 2FA code",
-      "totp-already-enabled": "2FA is already enabled for this user",
+      "invalid-credentials": "Credenciales inválidas",
+      "admin-already-exists": "Ya existe un usuario administrador. Inicie sesión para crear un nuevo usuario desde el panel de administración.",
+      "missing-email-or-password": "Falta el correo electrónico o la contraseña",
+      "invalid-username": "Nombre de usuario inválido",
+      "user-already-exists": "El usuario ya existe",
+      "error-creating-user": "Error al crear usuario",
+      "no-change-password-request": "No se ha encontrado ninguna solicitud de cambio de contraseña",
+      "operator-not-found": "Usuario operador no encontrado",
+      "user-not-found": "Usuario no encontrado",
+      "not-allowed-in-demo": "No se permite en modo demo",
+      "not-allowed-in-dev": "No está permitido en modo dev",
+      "invalid-password": "Contraseña invalida",
+      "invalid-password-length": "La contraseña debe tener al menos 8 caracteres",
+      "invalid-locale": "Local inválido",
+      "totp-session-not-found": "Sesión 2FA no encontrado",
+      "totp-not-enabled": "2FA no está habilitado para este usuario",
+      "totp-invalid-code": "Código 2FA no válido",
+      "totp-already-enabled": "2FA ya está habilitado para este usuario",
       "app-not-found": "App {id} not found",
       "app-failed-to-start": "Failed to start app {id}, see logs for more details",
       "app-failed-to-install": "Failed to install app {id}, see logs for more details",

+ 220 - 220
src/client/messages/hu-HU.json

@@ -1,295 +1,295 @@
 {
   "server-messages": {
     "errors": {
-      "invalid-credentials": "Invalid credentials",
-      "admin-already-exists": "There is already an admin user. Please login to create a new user from the admin panel.",
-      "missing-email-or-password": "Missing email or password",
-      "invalid-username": "Invalid username",
-      "user-already-exists": "User already exists",
-      "error-creating-user": "Error creating user",
-      "no-change-password-request": "No change password request found",
-      "operator-not-found": "Operator user not found",
-      "user-not-found": "User not found",
-      "not-allowed-in-demo": "Not allowed in demo mode",
-      "not-allowed-in-dev": "Not allowed in dev mode",
-      "invalid-password": "Invalid password",
-      "invalid-password-length": "Password must be at least 8 characters long",
-      "invalid-locale": "Invalid locale",
-      "totp-session-not-found": "2FA session not found",
-      "totp-not-enabled": "2FA is not enabled for this user",
-      "totp-invalid-code": "Invalid 2FA code",
-      "totp-already-enabled": "2FA is already enabled for this user",
-      "app-not-found": "App {id} not found",
-      "app-failed-to-start": "Failed to start app {id}, see logs for more details",
-      "app-failed-to-install": "Failed to install app {id}, see logs for more details",
-      "app-failed-to-stop": "Failed to stop app {id}, see logs for more details",
-      "app-failed-to-uninstall": "Failed to uninstall app {id}, see logs for more details",
-      "app-failed-to-update": "Failed to update app {id}, see logs for more details",
-      "domain-required-if-expose-app": "Domain is required if app is exposed",
-      "domain-not-valid": "Domain {domain} is not a valid domain",
-      "invalid-config": "App {id} has an invalid config.json file",
-      "app-not-exposable": "App {id} is not exposable",
-      "app-force-exposed": "App {id} works only with exposed domain",
-      "domain-already-in-use": "Domain {domain} is already in use by app {id}",
-      "could-not-get-latest-version": "Could not get latest version",
-      "current-version-is-latest": "Current version is already up to date",
-      "major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
+      "invalid-credentials": "Érvénytelen hitelesítő adatok",
+      "admin-already-exists": "Már van egy admin felhasználó. Kérjük, jelentkezzen be, hogy új felhasználót hozzon létre az admin panelen.",
+      "missing-email-or-password": "Hiányzó e-mail cím vagy jelszó",
+      "invalid-username": "Érvénytelen felhasználónév",
+      "user-already-exists": "A felhasználó már létezik",
+      "error-creating-user": "Hiba a felhasználó létrehozásakor",
+      "no-change-password-request": "Nincs jelszóváltoztatási kérelem",
+      "operator-not-found": "Az operátor felhasználó nem található",
+      "user-not-found": "A felhasználó nem található",
+      "not-allowed-in-demo": "Demó üzemmódban nem engedélyezett",
+      "not-allowed-in-dev": "Dev módban nem megengedett",
+      "invalid-password": "Érvénytelen jelszó",
+      "invalid-password-length": "A jelszónak legalább 8 karakter hosszúnak kell lennie",
+      "invalid-locale": "Érvénytelen nyelvi beállítás",
+      "totp-session-not-found": "2FA munkamenet nem található",
+      "totp-not-enabled": "A 2FA nincs engedélyezve ennél a felhasználónál",
+      "totp-invalid-code": "Érvénytelen 2FA kód",
+      "totp-already-enabled": "A 2FA már engedélyezve van ennél a felhasználónál",
+      "app-not-found": "A(z) {id} alkalmazás nem található",
+      "app-failed-to-start": "Nem sikerült elindítani az {id} alkalmazást. További részletekért tekintse meg a naplókat",
+      "app-failed-to-install": "Nem sikerült telepíteni az {id} alkalmazást. További részletekért tekintse meg a naplókat",
+      "app-failed-to-stop": "Nem sikerült leállítani az {id} alkalmazást. További részletekért tekintse meg a naplókat",
+      "app-failed-to-uninstall": "Nem sikerült eltávolítani az {id} alkalmazást. További részletekért tekintse meg a naplókat",
+      "app-failed-to-update": "Nem sikerült frissíteni az {id} alkalmazást. További részletekért tekintse meg a naplókat",
+      "domain-required-if-expose-app": "Domain szükséges, ha az alkalmazás exponálva van",
+      "domain-not-valid": "A(z) {domain} domain nem érvényes domain",
+      "invalid-config": "A(z) {id} alkalmazás érvénytelen config.json fájlt tartalmaz",
+      "app-not-exposable": "Az {id} alkalmazás nem hozzáférhető",
+      "app-force-exposed": "Az {id} alkalmazás csak nyilvános domainnel működik",
+      "domain-already-in-use": "A(z) {domain} domaint már használja a(z) {id} alkalmazás",
+      "could-not-get-latest-version": "Nem sikerült letölteni a legújabb verziót",
+      "current-version-is-latest": "A jelenlegi verzió már naprakész",
+      "major-version-update": "A fő verzió megváltozott. Kérjük, frissítse manuálisan (utasítások a GitHubon)"
     },
     "success": {}
   },
   "auth": {
     "login": {
-      "title": "Login to your account",
-      "submit": "Login"
+      "title": "Jelentkezz be a fiókodba",
+      "submit": "Belépés"
     },
     "totp": {
-      "title": "Two-factor authentication",
-      "instructions": "Enter the code from your authenticator app",
-      "submit": "Confirm"
+      "title": "Kétlépcsős hitelesítés",
+      "instructions": "Írja be a kódot a hitelesítő alkalmazásból",
+      "submit": "Megerősít"
     },
     "register": {
-      "title": "Register your account",
-      "submit": "Register"
+      "title": "Fiók regisztráció",
+      "submit": "Regisztráció"
     },
     "reset-password": {
-      "title": "Reset your password",
-      "submit": "Reset password",
-      "cancel": "Cancel password change request",
-      "instructions": "Run this command on your server and then refresh this page",
-      "success-title": "Password reset",
-      "success": "Your password has been reset. You can now login with your new password. And your email {email}",
-      "back-to-login": "Back to login"
+      "title": "Jelszó visszaállítása",
+      "submit": "Jelszó visszaállítása",
+      "cancel": "Jelszómódosítási kérés visszavonása",
+      "instructions": "Futtassa ezt a parancsot a szerverén, majd frissítse ezt az oldalt",
+      "success-title": "Jelszó visszaállítása",
+      "success": "A jelszava vissza lett állítva. Most már bejelentkezhet az új jelszavával. Ez az e-mail címe {email}",
+      "back-to-login": "Vissza a belépéshez"
     },
     "form": {
-      "email": "Email address",
-      "email-placeholder": "you@example.com",
-      "password": "Password",
-      "password-placeholder": "Enter your password",
-      "password-confirmation": "Confirm password",
-      "password-confirmation-placeholder": "Confirm your password",
-      "forgot": "Forgot password?",
-      "new-password-placeholder": "Your new password",
-      "new-password-confirmation-placeholder": "Confirm your new password",
+      "email": "E-mail cím",
+      "email-placeholder": "nev@pelda.com",
+      "password": "Jelszó",
+      "password-placeholder": "Jelszó megadása",
+      "password-confirmation": "Jelszó megerősítése",
+      "password-confirmation-placeholder": "Jelszó megerősítése",
+      "forgot": "Elfelejtette jelszavát?",
+      "new-password-placeholder": "Az új jelszava",
+      "new-password-confirmation-placeholder": "Erősítse meg az új jelszavát",
       "errors": {
         "email": {
-          "required": "Email address is required",
-          "email": "Email address is invalid",
-          "invalid": "Email address is invalid"
+          "required": "E-mail cím megadása kötelező",
+          "email": "E-mail cím érvénytelen",
+          "invalid": "Az e-mail cím érvénytelen"
         },
         "password": {
-          "required": "Password is required",
-          "minlength": "Password must be at least 8 characters"
+          "required": "Jelszó megadása szükséges",
+          "minlength": "A jelszónak minimum 8 karakternek kell lennie"
         },
         "password-confirmation": {
-          "required": "Password confirmation is required",
-          "minlength": "Password confirmation must be at least 8 characters",
-          "match": "Passwords do not match"
+          "required": "Jelszó megerősítés szükséges",
+          "minlength": "A jelszónak legalább 8 karakterből kell állnia",
+          "match": "A jelszavak nem egyeznek"
         }
       }
     }
   },
   "dashboard": {
-    "title": "Dashboard",
+    "title": "Irányítópult",
     "cards": {
       "disk": {
-        "title": "Disk Space",
-        "subtitle": "Used out of {total} GB"
+        "title": "Lemezterület",
+        "subtitle": "A {total} GB-ból használható"
       },
       "memory": {
-        "title": "Memory Used"
+        "title": "Memória használat"
       },
       "cpu": {
-        "title": "CPU Load",
-        "subtitle": "Uninstall apps to reduce load"
+        "title": "CPU kihasználtság",
+        "subtitle": "Távolítson el alkalmazásokat a terhelés csökkentése érdekében"
       }
     }
   },
   "apps": {
-    "status-running": "Running",
-    "status-stopped": "Stopped",
-    "status-starting": "Starting",
-    "status-stopping": "Stopping",
-    "status-updating": "Updating",
-    "status-missing": "Missing",
-    "status-installing": "Installing",
-    "status-uninstalling": "Uninstalling",
-    "update-available": "Update available",
+    "status-running": "Fut",
+    "status-stopped": "Megállítva",
+    "status-starting": "Indítás",
+    "status-stopping": "Leállítás",
+    "status-updating": "Frissítés",
+    "status-missing": "Hiányzó",
+    "status-installing": "Telepítés folyamatban",
+    "status-uninstalling": "Eltávolítás",
+    "update-available": "Frissítés elérhető",
     "my-apps": {
-      "title": "My Apps",
-      "empty-title": "No app installed",
-      "empty-subtitle": "Install an app from the app store to get started",
-      "empty-action": "Go to app store"
+      "title": "Alkalmazásaim",
+      "empty-title": "Nincsenek alkalmazások telepítve",
+      "empty-subtitle": "Telepítsen egy alkalmazást az Alkalmazásboltból az induláshoz",
+      "empty-action": "Ugrás az Alkalmazásboltba"
     },
     "app-store": {
-      "title": "App Store",
-      "search-placeholder": "Search apps",
-      "category-placeholder": "Select a category",
-      "no-results": "No app found",
-      "no-results-subtitle": "Try to refine your search"
+      "title": "Alkalmazásbolt",
+      "search-placeholder": "Alkalmazások keresése",
+      "category-placeholder": "Kategória választása",
+      "no-results": "Nem található alkalmazás",
+      "no-results-subtitle": "Próbálja meg finomítani a keresést"
     },
     "app-details": {
-      "install-success": "App installed successfully",
-      "uninstall-success": "App uninstalled successfully",
-      "stop-success": "App stopped successfully",
-      "update-success": "App updated successfully",
-      "start-success": "App started successfully",
-      "update-config-success": "App config updated successfully. Restart the app to apply the changes",
-      "version": "Version",
-      "description": "Description",
-      "base-info": "Base info",
-      "source-code": "Source code",
-      "author": "Author",
+      "install-success": "Az alkalmazás sikeresen telepítve",
+      "uninstall-success": "Az alkalmazás sikeresen eltávolítva",
+      "stop-success": "Az alkalmazás sikeresen leállítva",
+      "update-success": "Az alkalmazás sikeresen frissítve",
+      "start-success": "Az alkalmazás sikeresen elindítva",
+      "update-config-success": "Az alkalmazás konfigurációja sikeresen frissült. Indítsa újra az alkalmazást a módosítások alkalmazásához",
+      "version": "Verzió",
+      "description": "Leírás",
+      "base-info": "Alapinformáció",
+      "source-code": "Forráskód",
+      "author": "Szerző",
       "port": "Port",
-      "categories-title": "Categories",
-      "link": "Link",
-      "website": "Website",
-      "supported-arch": "Supported architectures",
+      "categories-title": "Kategóriák",
+      "link": "Hivatkozás",
+      "website": "Weboldal",
+      "supported-arch": "Támogatott architektúrák",
       "categories": {
-        "data": "Data",
-        "network": "Network",
-        "media": "Media",
-        "development": "Development",
-        "automation": "Automation",
-        "social": "Social",
-        "utilities": "Utilities",
-        "security": "Security",
-        "photography": "Photography",
-        "featured": "Featured",
-        "books": "Books",
-        "music": "Music",
-        "finance": "Finance",
-        "gaming": "Gaming",
+        "data": "Adat",
+        "network": "Hálózat",
+        "media": "Média",
+        "development": "Fejlesztés",
+        "automation": "Automatizálás",
+        "social": "Közösségi",
+        "utilities": "Segédprogramok",
+        "security": "Biztonság",
+        "photography": "Fényképészet",
+        "featured": "Ajánlott",
+        "books": "Könyvek",
+        "music": "Zene",
+        "finance": "Pénzügyek",
+        "gaming": "Játék",
         "ai": "AI"
       },
       "actions": {
-        "start": "Start",
-        "remove": "Remove",
-        "settings": "Settings",
-        "stop": "Stop",
-        "open": "Open",
-        "loading": "Loading",
-        "cancel": "Cancel",
-        "install": "Install",
-        "update": "Update"
+        "start": "Indít",
+        "remove": "Eltávolít",
+        "settings": "Beállítások",
+        "stop": "Megállít",
+        "open": "Megnyitás",
+        "loading": "Betöltés",
+        "cancel": "Mégsem",
+        "install": "Telepítés",
+        "update": "Frissítés"
       },
       "install-form": {
-        "title": "Install {name}",
-        "expose-app": "Expose app",
-        "domain-name": "Domain name",
-        "domain-name-hint": "Make sure this exact domain contains an A record pointing to your IP.",
-        "choose-option": "Choose an option...",
-        "sumbit-install": "Install",
-        "submit-update": "Update",
+        "title": "{name} telepítése",
+        "expose-app": "Tegye ki az alkalmazást",
+        "domain-name": "Domain név",
+        "domain-name-hint": "Győződjön meg arról, hogy ez a domain tartalmaz egy A rekordot, amely az Ön IP-jére mutat.",
+        "choose-option": "Válasszon egy lehetőséget...",
+        "sumbit-install": "Telepítés",
+        "submit-update": "Frissítés",
         "errors": {
-          "required": "{label} is required",
-          "regex": "{label} must match the pattern {pattern}",
-          "max-length": "{label} must be less than {max} characters",
-          "min-length": "{label} must be at least {min} characters",
-          "between-length": "{label} must be between {min} and {max} characters",
-          "invalid-email": "{label} must be a valid email address",
-          "number": "{label} must be a number",
-          "fqdn": "{label} must be a valid domain",
-          "ip": "{label} must be a valid IP address",
-          "fqdnip": "{label} must be a valid domain or IP address",
-          "url": "{label} must be a valid URL"
+          "required": "{label} megadása kötelező",
+          "regex": "{label} meg kell egyeznie a mintával {pattern}",
+          "max-length": "A {label} karakternek kevesebbnek kell lennie, mint a {max} karakter(ek)",
+          "min-length": "{label} legalább {min} karakter hosszú legyen",
+          "between-length": "A {label} {min} és {max} karakterek között kell lennie",
+          "invalid-email": "{label} érvényes e-mail címnek kell lennie",
+          "number": "{label} számnak kell lennie",
+          "fqdn": "A {label} érvényes domainnek kell lennie",
+          "ip": "{label} érvényes IP-címnek kell lennie",
+          "fqdnip": "{label} érvényes domain vagy IP-cím lehet",
+          "url": "{label} érvényes URL címnek kell lennie"
         }
       },
       "stop-form": {
-        "title": "Stop {name} ?",
-        "subtitle": "All data will be retained",
-        "submit": "Stop"
+        "title": "Megállít {name} ?",
+        "subtitle": "Minden adat megmarad",
+        "submit": "Megállít"
       },
       "uninstall-form": {
-        "title": "Uninstall {name} ?",
-        "subtitle": "All data for this app will be lost.",
-        "warning": "Are you sure? This action cannot be undone.",
-        "submit": "Uninstall"
+        "title": "Távolítsa el a {name} ?",
+        "subtitle": "Az alkalmazás összes adata elveszik.",
+        "warning": "Biztos benne? Ezt a műveletet nem lehet visszavonni.",
+        "submit": "Eltávolit"
       },
       "update-form": {
-        "title": "Update {name} ?",
-        "subtitle1": "Update app to latest verion :",
-        "subtitle2": "This will reset your custom configuration (e.g. changes in docker-compose.yml)",
-        "submit": "Update"
+        "title": "Frissíti {name} ?",
+        "subtitle1": "Frissítse az alkalmazást a legújabb verzióra:",
+        "subtitle2": "Ez visszaállítja az egyéni konfigurációt (pl. változások a docker-compose.yml-ben)",
+        "submit": "Frissítés"
       },
       "update-settings-form": {
-        "title": "Update {name} config"
+        "title": "Frissítse a {name} konfigurációt"
       }
     }
   },
   "settings": {
-    "title": "Settings",
+    "title": "Beállítások",
     "actions": {
-      "tab-title": "Actions",
-      "title": "Actions",
-      "current-version": "Current version: {version}",
-      "stay-up-to-date": "Stay up to date with the latest version of Tipi",
-      "new-version": "A new version ({version}) of Tipi is available",
-      "maintenance-title": "Maintenance",
-      "maintenance-subtitle": "Common actions to perform on your instance",
-      "restart": "Restart",
-      "update": "Update to {version}",
-      "already-latest": "Already up to date"
+      "tab-title": "Műveletek",
+      "title": "Műveletek",
+      "current-version": "Jelenlegi verzió: {version}",
+      "stay-up-to-date": "Legyen naprakész a Tipi legújabb verziójával",
+      "new-version": "A Tipi új verziója ({version}) elérhető",
+      "maintenance-title": "Karbantartás",
+      "maintenance-subtitle": "Általános műveletek ezen a példányon",
+      "restart": "Újraindítás",
+      "update": "Frissítés erre {version}",
+      "already-latest": "Már naprakész"
     },
     "settings": {
-      "tab-title": "Settings",
-      "title": "General settings",
-      "subtitle": "This will update your settings.json file. Make sure you know what you are doing before updating these values.",
-      "settings-updated": "Settings updated. Restart your instance to apply new settings.",
-      "invalid-ip": "Invalid IP address",
-      "invalid-url": "Invalid URL",
-      "invalid-domain": "Invalid domain",
-      "domain-name": "Domain name",
-      "domain-name-hint": "Make sure this exact domain contains an A record pointing to your IP.",
-      "dns-ip": "DNS IP",
-      "internal-ip": "Internal IP",
-      "internal-ip-hint": "IP address your server is listening on.",
-      "apps-repo": "Apps repo URL",
-      "apps-repo-hint": "URL to the apps repository.",
-      "storage-path": "Storage path",
-      "storage-path-hint": "Path to the storage directory. Keep empty for default (runtipi/app-data). Make sure it is an absolute path and that it exists",
-      "submit": "Save",
-      "user-settings-title": "User settings",
-      "language": "Language",
-      "help-translate": "Help translate Tipi"
+      "tab-title": "Beállítások",
+      "title": "Általános beállítások",
+      "subtitle": "Ez frissíti a settings.json fájlt. Mielőtt frissítené ezeket az értékeket, győződjön meg arról, hogy tudja, mit csinál.",
+      "settings-updated": "A beállítások frissítve. Indítsa újra a példányt az új beállítások alkalmazásához.",
+      "invalid-ip": "Érvénytelen IP-cím",
+      "invalid-url": "Érvénytelen URL",
+      "invalid-domain": "Érvénytelen domain név",
+      "domain-name": "Domain név",
+      "domain-name-hint": "Győződjön meg arról, hogy ez a domain tartalmaz egy A rekordot, amely az Ön IP-jére mutat.",
+      "dns-ip": "DNS IP címe",
+      "internal-ip": "Belső IP cím",
+      "internal-ip-hint": "A szerver által hallgatott IP-cím.",
+      "apps-repo": "Alkalmazás-tárház URL címe",
+      "apps-repo-hint": "Az alkalmazás-tárház URL-je.",
+      "storage-path": "A tárhely elérési útja",
+      "storage-path-hint": "Út a tárolókönyvtárhoz. Alapértelmezés szerint maradjon üres (runtipi/app-data). Ügyeljen arra, hogy abszolút út legyen, és hogy létezik",
+      "submit": "Mentés",
+      "user-settings-title": "Felhasználói beállítások",
+      "language": "Nyelv",
+      "help-translate": "Segíts a Tipi fordításában"
     },
     "security": {
-      "tab-title": "Security",
-      "change-password-title": "Change password",
-      "change-password-subtitle": "Changing your password will log you out of all devices.",
-      "password-change-success": "Password changed successfully",
-      "2fa-title": "Two-factor authentication",
-      "2fa-subtitle": "Two-factor authentication (2FA) adds an additional layer of security to your account.",
-      "2fa-subtitle-2": "When enabled, you will be prompted to enter a code from your authenticator app when you log in.",
-      "2fa-enable-success": "Two-factor authentication enabled",
-      "2fa-disable-success": "Two-factor authentication disabled",
-      "scan-qr-code": "Scan this QR code with your authenticator app.",
-      "enter-key-manually": "Or enter this key manually.",
-      "enter-2fa-code": "Enter the 6-digit code from your authenticator app",
-      "enable-2fa": "Enable two-factor authentication",
-      "disable-2fa": "Disable two-factor authentication",
-      "password-needed": "Password needed",
-      "password-needed-hint": "Your password is required to change two-factor authentication settings.",
+      "tab-title": "Biztonság",
+      "change-password-title": "Jelszó módosítása",
+      "change-password-subtitle": "A jelszó megváltoztatása után minden eszközből kijelentkezik.",
+      "password-change-success": "A jelszó sikeresen megváltozott",
+      "2fa-title": "Kétlépcsős hitelesítés",
+      "2fa-subtitle": "Kétlépcsős azonosítás (2FA) használatával a fiók biztonsága tovább növelhető.",
+      "2fa-subtitle-2": "Ha engedélyezve van, akkor a rendszer kéri, hogy írjon be egy kódot a hitelesítő alkalmazásból, amikor bejelentkezik.",
+      "2fa-enable-success": "Kétlépcsős azonosítás engedélyezve",
+      "2fa-disable-success": "Kétlépcsős azonosítás kikapcsolva",
+      "scan-qr-code": "Ezt a QR kódot kell beolvasni a hitelesítő alkalmazással.",
+      "enter-key-manually": "Vagy adja meg a kulcsot manuálisan.",
+      "enter-2fa-code": "Írja be a 6 számjegyű kódot a hitelesítő alkalmazásból",
+      "enable-2fa": "Kétlépcsős azonosítás engedélyezése",
+      "disable-2fa": "Kétlépcsős azonosítás letiltása",
+      "password-needed": "Jelszó szükséges",
+      "password-needed-hint": "A kétlépcsős hitelesítési beállítások megváltoztatásához szükséges a jelszavad.",
       "form": {
-        "password-length": "Password must be at least 8 characters",
-        "password-match": "Passwords do not match",
-        "current-password": "Current password",
-        "new-password": "New password",
-        "confirm-password": "Confirm new password",
-        "change-password": "Change password",
-        "password": "Password"
+        "password-length": "A jelszónak minimum 8 karakter hosszúnak kell lennie",
+        "password-match": "A jelszavak nem egyeznek",
+        "current-password": "Jelenlegi jelszó",
+        "new-password": "Új jelszó",
+        "confirm-password": "Új jelszó megerősítése",
+        "change-password": "Jelszó módosítása",
+        "password": "Jelszó"
       }
     }
   },
   "header": {
-    "dashboard": "Dashboard",
-    "my-apps": "My Apps",
-    "app-store": "App Store",
-    "settings": "Settings",
-    "logout": "Logout",
-    "dark-mode": "Dark Mode",
-    "light-mode": "Light Mode",
-    "sponsor": "Sponsor",
-    "source-code": "Source code",
-    "update-available": "Update available"
+    "dashboard": "Irányítópult",
+    "my-apps": "Alkalmazásaim",
+    "app-store": "Alkalmazásbolt",
+    "settings": "Beállítások",
+    "logout": "Kijelentkezés",
+    "dark-mode": "Sötét mód",
+    "light-mode": "Világos mód",
+    "sponsor": "Szponzor",
+    "source-code": "Forráskód",
+    "update-available": "Frissítés érhető el"
   }
 }

+ 9 - 4
src/shared/internationalization/locales.ts

@@ -1,6 +1,8 @@
 const APP_LOCALES = {
+  'de-DE': 'Deutsch',
   'en-US': 'English',
   'fr-FR': 'Français',
+  'hu-HU': 'Magyar',
   'ja-JP': '日本語',
   'pl-PL': 'Polski',
   'sv-SE': 'Svenska',
@@ -10,15 +12,18 @@ const APP_LOCALES = {
   'zh-TW': '繁體中文',
 } as const;
 
-const FALLBACK_LOCALES = [
-  { from: 'fr', to: 'fr-FR' },
+type BaseLang<T extends string> = T extends `${infer U}-${string}` ? U : T; // 'en-US' -> 'en'
+
+const FALLBACK_LOCALES: { from: BaseLang<keyof typeof APP_LOCALES>; to: keyof typeof APP_LOCALES }[] = [
+  { from: 'de', to: 'de-DE' },
   { from: 'en', to: 'en-US' },
+  { from: 'fr', to: 'fr-FR' },
   { from: 'ja', to: 'ja-JP' },
+  { from: 'pl', to: 'pl-PL' },
+  { from: 'sv', to: 'sv-SE' },
   { from: 'ro', to: 'ro-RO' },
   { from: 'ru', to: 'ru-RU' },
   { from: 'zh', to: 'zh-CN' },
-  { from: 'pl', to: 'pl-PL' },
-  { from: 'sv', to: 'sv-SE' },
 ];
 
 export type Locale = keyof typeof APP_LOCALES;