release: 3.4.1 (#1471)

* Release/3.3.1 (#1439)

* chore: bump version to 3.3.1

* ci: run e2e when build-images is skipped

* feat: view app logs in dashboard (#1445)

* socket events for docker logs

* auto-scroll with ref

* add log terminal with auto scroll

* remove console.logs

* increase initial lines to 25

* remove more console logs

* useSocketEmit

* emit on disconect & hide tab if not running

* change tab when not running & logs options

* logs max lines

* logs emit

* remove console logs

* refactor(logs-socket): consolidate & reduce state usage

* useTranslations in logs tab

* remove wrapLines from useEffect

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* order file & add spanish translations

* chore: fix tsc issues

---------

Co-authored-by: Jorge Montejo <jorgemon.lopez@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* autoforward ports in codespaces (#1447)

* chore(deps-dev): bump @typescript-eslint/parser from 6.21.0 to 7.11.0 (#1443)

Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.21.0 to 7.11.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.11.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: sentry config (#1448)

* chore(deps): bump the minor-patch group across 1 directory with 17 updates (#1451)

* chore(deps): bump the minor-patch group across 1 directory with 17 updates

Bumps the minor-patch group with 17 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) | `8.4.0` | `8.7.0` |
| [@tabler/icons-react](https://github.com/tabler/tabler-icons/tree/HEAD/packages/icons-react) | `3.4.0` | `3.5.0` |
| [argon2](https://github.com/ranisalt/node-argon2) | `0.40.1` | `0.40.3` |
| [bullmq](https://github.com/taskforcesh/bullmq) | `5.7.12` | `5.7.14` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.51.4` | `7.51.5` |
| [sass](https://github.com/sass/dart-sass) | `1.77.2` | `1.77.3` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.12.12` | `20.12.13` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `7.10.0` | `7.11.0` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `4.2.1` | `4.3.0` |
| [eslint-plugin-jsonc](https://github.com/ota-meshi/eslint-plugin-jsonc) | `2.15.1` | `2.16.0` |
| [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) | `7.34.1` | `7.34.2` |
| [jsdom](https://github.com/jsdom/jsdom) | `24.0.0` | `24.1.0` |
| [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `5.16.0` | `5.17.3` |
| [@sentry/types](https://github.com/getsentry/sentry-javascript) | `8.4.0` | `8.7.0` |
| [@sentry/node](https://github.com/getsentry/sentry-javascript) | `8.4.0` | `8.7.0` |
| [hono](https://github.com/honojs/hono) | `4.3.11` | `4.4.0` |
| [nodemon](https://github.com/remy/nodemon) | `3.1.0` | `3.1.2` |



Updates `@sentry/nextjs` from 8.4.0 to 8.7.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.4.0...8.7.0)

Updates `@tabler/icons-react` from 3.4.0 to 3.5.0
- [Release notes](https://github.com/tabler/tabler-icons/releases)
- [Commits](https://github.com/tabler/tabler-icons/commits/v3.5.0/packages/icons-react)

Updates `argon2` from 0.40.1 to 0.40.3
- [Release notes](https://github.com/ranisalt/node-argon2/releases)
- [Commits](https://github.com/ranisalt/node-argon2/commits)

Updates `bullmq` from 5.7.12 to 5.7.14
- [Release notes](https://github.com/taskforcesh/bullmq/releases)
- [Commits](https://github.com/taskforcesh/bullmq/compare/v5.7.12...v5.7.14)

Updates `react-hook-form` from 7.51.4 to 7.51.5
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.51.4...v7.51.5)

Updates `sass` from 1.77.2 to 1.77.3
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.77.2...1.77.3)

Updates `@types/node` from 20.12.12 to 20.12.13
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@typescript-eslint/eslint-plugin` from 7.10.0 to 7.11.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.11.0/packages/eslint-plugin)

Updates `@vitejs/plugin-react` from 4.2.1 to 4.3.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/v4.3.0/packages/plugin-react)

Updates `eslint-plugin-jsonc` from 2.15.1 to 2.16.0
- [Release notes](https://github.com/ota-meshi/eslint-plugin-jsonc/releases)
- [Changelog](https://github.com/ota-meshi/eslint-plugin-jsonc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ota-meshi/eslint-plugin-jsonc/compare/v2.15.1...v2.16.0)

Updates `eslint-plugin-react` from 7.34.1 to 7.34.2
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.34.1...v7.34.2)

Updates `jsdom` from 24.0.0 to 24.1.0
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/main/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/24.0.0...24.1.0)

Updates `knip` from 5.16.0 to 5.17.3
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Changelog](https://github.com/webpro-nl/knip/blob/main/packages/knip/.release-it.json)
- [Commits](https://github.com/webpro-nl/knip/commits/5.17.3/packages/knip)

Updates `@sentry/types` from 8.4.0 to 8.7.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.4.0...8.7.0)

Updates `@sentry/node` from 8.4.0 to 8.7.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.4.0...8.7.0)

Updates `hono` from 4.3.11 to 4.4.0
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.3.11...v4.4.0)

Updates `nodemon` from 3.1.0 to 3.1.2
- [Release notes](https://github.com/remy/nodemon/releases)
- [Commits](https://github.com/remy/nodemon/compare/v3.1.0...v3.1.2)

---
updated-dependencies:
- dependency-name: "@sentry/nextjs"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@tabler/icons-react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: argon2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: bullmq
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: react-hook-form
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@vitejs/plugin-react"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: eslint-plugin-jsonc
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: jsdom
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: knip
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@sentry/types"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@sentry/node"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: hono
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: nodemon
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: fix vite plugin typings

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicolas Meienberger <github@thisprops.com>

* Feat/tipi logs terminal (#1450)

* refactor: extract logs terminal ui in its own component

* feat: runtipi logs settings

* fix: runtipi dashboard logs project name

* ci: use nightly version for e2e

* feat(docker-tamplate): include addPorts and readOnly in volumes (#1456)

* chore(deps): bump the minor-patch group with 6 updates (#1454)

* fix(logs): maxlines not updated in closure

* chore: add missing websecure options in docker-compose.dev

* chore(deps): bump the minor-patch group across 1 directory with 13 updates (#1466)

* chore(deps): bump the minor-patch group across 1 directory with 13 updates

Bumps the minor-patch group with 13 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [drizzle-orm](https://github.com/drizzle-team/drizzle-orm) | `0.31.0` | `0.31.1` |
| [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg) | `8.11.5` | `8.12.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.13.0` | `20.14.1` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `7.11.0` | `7.12.0` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `7.11.0` | `7.12.0` |
| [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `5.17.3` | `5.17.4` |
| [msw](https://github.com/mswjs/msw) | `2.3.0` | `2.3.1` |
| [prettier](https://github.com/prettier/prettier) | `3.2.5` | `3.3.0` |
| [hono](https://github.com/honojs/hono) | `4.4.2` | `4.4.3` |
| [yaml](https://github.com/eemeli/yaml) | `2.4.2` | `2.4.3` |
| [@sentry/esbuild-plugin](https://github.com/getsentry/sentry-javascript-bundler-plugins) | `2.17.0` | `2.18.0` |
| [nodemon](https://github.com/remy/nodemon) | `3.1.2` | `3.1.3` |
| [tsx](https://github.com/privatenumber/tsx) | `4.11.0` | `4.11.2` |



Updates `drizzle-orm` from 0.31.0 to 0.31.1
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/0.31.0...0.31.1)

Updates `pg` from 8.11.5 to 8.12.0
- [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md)
- [Commits](https://github.com/brianc/node-postgres/commits/pg@8.12.0/packages/pg)

Updates `@types/node` from 20.13.0 to 20.14.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@typescript-eslint/eslint-plugin` from 7.11.0 to 7.12.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.12.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 7.11.0 to 7.12.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.12.0/packages/parser)

Updates `knip` from 5.17.3 to 5.17.4
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Changelog](https://github.com/webpro-nl/knip/blob/main/packages/knip/.release-it.json)
- [Commits](https://github.com/webpro-nl/knip/commits/5.17.4/packages/knip)

Updates `msw` from 2.3.0 to 2.3.1
- [Release notes](https://github.com/mswjs/msw/releases)
- [Changelog](https://github.com/mswjs/msw/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mswjs/msw/compare/v2.3.0...v2.3.1)

Updates `prettier` from 3.2.5 to 3.3.0
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.2.5...3.3.0)

Updates `hono` from 4.4.2 to 4.4.3
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.4.2...v4.4.3)

Updates `yaml` from 2.4.2 to 2.4.3
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v2.4.2...v2.4.3)

Updates `@sentry/esbuild-plugin` from 2.17.0 to 2.18.0
- [Release notes](https://github.com/getsentry/sentry-javascript-bundler-plugins/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript-bundler-plugins/blob/main/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript-bundler-plugins/compare/2.17.0...2.18.0)

Updates `nodemon` from 3.1.2 to 3.1.3
- [Release notes](https://github.com/remy/nodemon/releases)
- [Commits](https://github.com/remy/nodemon/compare/v3.1.2...v3.1.3)

Updates `tsx` from 4.11.0 to 4.11.2
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.11.0...v4.11.2)

---
updated-dependencies:
- dependency-name: drizzle-orm
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: pg
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: knip
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: msw
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: hono
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: yaml
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: "@sentry/esbuild-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: nodemon
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: tsx
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: fix linting issue

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicolas Meienberger <github@thisprops.com>

* docs: add gabrielfariasnunes as a contributor for translation (#1461)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>

* feat: add portuguese language

* chore(deps-dev): bump @testing-library/react from 15.0.7 to 16.0.0 (#1464)

Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 15.0.7 to 16.0.0.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v15.0.7...v16.0.0)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the minor-patch group with 5 updates (#1468)

Bumps the minor-patch group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@hookform/resolvers](https://github.com/react-hook-form/resolvers) | `3.4.2` | `3.5.0` |
| [bullmq](https://github.com/taskforcesh/bullmq) | `5.7.14` | `5.7.15` |
| [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) | `7.24.6` | `7.24.7` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.14.1` | `20.14.2` |
| [prettier](https://github.com/prettier/prettier) | `3.3.0` | `3.3.1` |


Updates `@hookform/resolvers` from 3.4.2 to 3.5.0
- [Release notes](https://github.com/react-hook-form/resolvers/releases)
- [Commits](https://github.com/react-hook-form/resolvers/compare/v3.4.2...v3.5.0)

Updates `bullmq` from 5.7.14 to 5.7.15
- [Release notes](https://github.com/taskforcesh/bullmq/releases)
- [Commits](https://github.com/taskforcesh/bullmq/compare/v5.7.14...v5.7.15)

Updates `@babel/core` from 7.24.6 to 7.24.7
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-core)

Updates `@types/node` from 20.14.1 to 20.14.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `prettier` from 3.3.0 to 3.3.1
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.3.0...3.3.1)

---
updated-dependencies:
- dependency-name: "@hookform/resolvers"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: bullmq
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: "@babel/core"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* New Crowdin updates (#1467)

* New translations en.json (French)

* New translations en.json (Romanian)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Turkish)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Turkish)

* New translations en.json (Romanian)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Swedish)

* New translations en.json (Swedish)

* New translations en.json (French)

* New translations en.json (Turkish)

* New translations en.json (Romanian)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Russian)

* New translations en.json (French)

* New translations en.json (Turkish)

* New translations en.json (Romanian)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Russian)

* New translations en.json (Spanish)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* chore(deps): bump the minor-patch group across 1 directory with 9 updates (#1470)

Bumps the minor-patch group with 9 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@hookform/resolvers](https://github.com/react-hook-form/resolvers) | `3.5.0` | `3.6.0` |
| [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) | `8.7.0` | `8.8.0` |
| [drizzle-orm](https://github.com/drizzle-team/drizzle-orm) | `0.31.1` | `0.31.2` |
| [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) | `28.5.0` | `28.6.0` |
| [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `5.17.4` | `5.18.0` |
| [@sentry/types](https://github.com/getsentry/sentry-javascript) | `8.7.0` | `8.8.0` |
| [@sentry/node](https://github.com/getsentry/sentry-javascript) | `8.7.0` | `8.8.0` |
| [hono](https://github.com/honojs/hono) | `4.4.3` | `4.4.4` |
| [tsx](https://github.com/privatenumber/tsx) | `4.11.2` | `4.13.2` |



Updates `@hookform/resolvers` from 3.5.0 to 3.6.0
- [Release notes](https://github.com/react-hook-form/resolvers/releases)
- [Commits](https://github.com/react-hook-form/resolvers/compare/v3.5.0...v3.6.0)

Updates `@sentry/nextjs` from 8.7.0 to 8.8.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.7.0...8.8.0)

Updates `drizzle-orm` from 0.31.1 to 0.31.2
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/0.31.1...0.31.2)

Updates `eslint-plugin-jest` from 28.5.0 to 28.6.0
- [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases)
- [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v28.5.0...v28.6.0)

Updates `knip` from 5.17.4 to 5.18.0
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Changelog](https://github.com/webpro-nl/knip/blob/main/packages/knip/.release-it.json)
- [Commits](https://github.com/webpro-nl/knip/commits/5.18.0/packages/knip)

Updates `@sentry/types` from 8.7.0 to 8.8.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.7.0...8.8.0)

Updates `@sentry/node` from 8.7.0 to 8.8.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.7.0...8.8.0)

Updates `hono` from 4.4.3 to 4.4.4
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.4.3...v4.4.4)

Updates `tsx` from 4.11.2 to 4.13.2
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.11.2...v4.13.2)

---
updated-dependencies:
- dependency-name: "@hookform/resolvers"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@sentry/nextjs"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: drizzle-orm
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: eslint-plugin-jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: knip
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@sentry/types"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@sentry/node"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: hono
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: tsx
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: bump version to 3.4.1

* feat(logs): keep tabs in url and settings in local storage

* fix(logs): run only on the client

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Jorge Montejo <jorgemon.lopez@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Stavros <steveiliop56@gmail.com>
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
This commit is contained in:
Nicolas Meienberger 2024-06-09 11:30:21 +02:00 committed by GitHub
parent 9eb6301ada
commit c08f521cf6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
46 changed files with 1492 additions and 1278 deletions

View File

@ -475,6 +475,15 @@
"contributions": [
"code"
]
},
{
"login": "gabrielfariasnunes",
"name": "Gabriel Farias Nunes",
"avatar_url": "https://avatars.githubusercontent.com/u/21142663?v=4",
"profile": "http://www.bielfarias.com",
"contributions": [
"translation"
]
}
],
"contributorsPerLine": 7,

View File

@ -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-50-orange.svg?style=flat-square)](#contributors-)
[![All Contributors](https://img.shields.io/badge/all_contributors-51-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
[![License](https://img.shields.io/github/license/runtipi/runtipi)](https://github.com/runtipi/runtipi/blob/master/LICENSE)
@ -140,6 +140,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hex-developer"><img src="https://avatars.githubusercontent.com/u/77530549?v=4?s=100" width="100px;" alt="hex-developer"/><br /><sub><b>hex-developer</b></sub></a><br /><a href="https://github.com/runtipi/runtipi/commits?author=hex-developer" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.bielfarias.com"><img src="https://avatars.githubusercontent.com/u/21142663?v=4?s=100" width="100px;" alt="Gabriel Farias Nunes"/><br /><sub><b>Gabriel Farias Nunes</b></sub></a><br /><a href="#translation-gabrielfariasnunes" title="Translation">🌍</a></td>
</tr>
</tbody>
</table>

View File

@ -107,6 +107,15 @@ services:
traefik.http.routers.dashboard.rule: PathPrefix("/")
traefik.http.routers.dashboard.service: dashboard
traefik.http.routers.dashboard.entrypoints: web
# Websecure
traefik.http.routers.dashboard-insecure.rule: Host(`${DOMAIN}`) && PathPrefix(`/`)
traefik.http.routers.dashboard-insecure.service: dashboard
traefik.http.routers.dashboard-insecure.entrypoints: web
traefik.http.routers.dashboard-insecure.middlewares: redirect-to-https
traefik.http.routers.dashboard-secure.rule: Host(`${DOMAIN}`) && PathPrefix(`/`)
traefik.http.routers.dashboard-secure.service: dashboard
traefik.http.routers.dashboard-secure.entrypoints: websecure
traefik.http.routers.dashboard-secure.tls.certresolver: myresolver
# Local domain
traefik.http.routers.dashboard-local-insecure.rule: Host(`${LOCAL_DOMAIN}`)
traefik.http.routers.dashboard-local-insecure.entrypoints: web
@ -128,6 +137,23 @@ services:
traefik.http.routers.worker-api.rule: PathPrefix("/worker-api")
traefik.http.routers.worker-api.service: worker-api
traefik.http.routers.worker-api.entrypoints: web
# Websecure
traefik.http.routers.worker-insecure.rule: Host(`${DOMAIN}`) && PathPrefix(`/worker`)
traefik.http.routers.worker-insecure.service: worker
traefik.http.routers.worker-insecure.entrypoints: web
traefik.http.routers.worker-insecure.middlewares: redirect-to-https
traefik.http.routers.worker-secure.rule: Host(`${DOMAIN}`) && PathPrefix(`/worker`)
traefik.http.routers.worker-secure.service: worker
traefik.http.routers.worker-secure.entrypoints: websecure
traefik.http.routers.worker-secure.tls.certresolver: myresolver
traefik.http.routers.worker-api-insecure.rule: Host(`${DOMAIN}`) && PathPrefix(`/worker-api`)
traefik.http.routers.worker-api-insecure.service: worker-api
traefik.http.routers.worker-api-insecure.entrypoints: web
traefik.http.routers.worker-api-insecure.middlewares: redirect-to-https
traefik.http.routers.worker-api-secure.rule: Host(`${DOMAIN}`) && PathPrefix(`/worker-api`)
traefik.http.routers.worker-api-secure.service: worker-api
traefik.http.routers.worker-api-secure.entrypoints: websecure
traefik.http.routers.worker-api-secure.tls.certresolver: myresolver
# Local domain
traefik.http.routers.worker-local-insecure.rule: Host(`${LOCAL_DOMAIN}`) && PathPrefix("/worker")
traefik.http.routers.worker-local-insecure.entrypoints: web

View File

@ -1,6 +1,6 @@
{
"name": "runtipi",
"version": "3.4.0",
"version": "3.4.1",
"description": "A homeserver for everyone",
"scripts": {
"clean-containers": "docker rm -f $(docker ps -a -q)",
@ -25,7 +25,7 @@
"postinstall": "./scripts/postinstall.sh"
},
"dependencies": {
"@hookform/resolvers": "^3.4.2",
"@hookform/resolvers": "^3.6.0",
"@otplib/core": "^12.0.1",
"@otplib/plugin-crypto": "^12.0.1",
"@otplib/plugin-thirty-two": "^12.0.1",
@ -38,13 +38,14 @@
"@radix-ui/react-tabs": "^1.0.4",
"@runtipi/postgres-migrations": "^5.3.0",
"@runtipi/shared": "workspace:^",
"@sentry/nextjs": "^8.7.0",
"@sentry/nextjs": "^8.8.0",
"@tabler/core": "1.0.0-beta20",
"@tabler/icons-react": "^3.5.0",
"@uidotdev/usehooks": "^2.4.1",
"argon2": "^0.40.3",
"bullmq": "^5.7.14",
"bullmq": "^5.7.15",
"clsx": "^2.1.0",
"drizzle-orm": "^0.31.0",
"drizzle-orm": "^0.31.2",
"fs-extra": "^11.2.0",
"geist": "^1.3.0",
"ipaddr.js": "^2.2.0",
@ -56,7 +57,7 @@
"next-client-cookies": "^1.1.1",
"next-intl": "^3.14.1",
"next-safe-action": "^6.2.0",
"pg": "^8.11.5",
"pg": "^8.12.0",
"qrcode.react": "^3.1.0",
"react": "18.3.1",
"react-dom": "18.3.1",
@ -81,12 +82,12 @@
"zustand": "^4.5.2"
},
"devDependencies": {
"@babel/core": "^7.24.6",
"@babel/core": "^7.24.7",
"@faker-js/faker": "^8.4.1",
"@playwright/test": "^1.44.1",
"@testing-library/dom": "^10.1.0",
"@testing-library/jest-dom": "^6.4.5",
"@testing-library/react": "^15.0.7",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^14.5.2",
"@total-typescript/shoehorn": "^0.1.2",
"@total-typescript/ts-reset": "^0.5.1",
@ -94,15 +95,15 @@
"@types/fs-extra": "^11.0.4",
"@types/jsonwebtoken": "^9.0.6",
"@types/lodash.merge": "^4.6.9",
"@types/node": "20.13.0",
"@types/node": "20.14.2",
"@types/pg": "^8.11.6",
"@types/react": "18.3.3",
"@types/react-dom": "18.3.0",
"@types/semver": "^7.5.8",
"@types/uuid": "^9.0.8",
"@types/validator": "^13.11.10",
"@typescript-eslint/eslint-plugin": "^7.11.0",
"@typescript-eslint/parser": "^7.11.0",
"@typescript-eslint/eslint-plugin": "^7.12.0",
"@typescript-eslint/parser": "^7.12.0",
"@vitejs/plugin-react": "^4.3.0",
"@vitest/coverage-v8": "^1.5.0",
"@vitest/ui": "^1.6.0",
@ -111,7 +112,7 @@
"eslint-config-next": "14.2.3",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jest": "^28.5.0",
"eslint-plugin-jest": "^28.6.0",
"eslint-plugin-jest-dom": "^5.4.0",
"eslint-plugin-jsonc": "^2.16.0",
"eslint-plugin-jsx-a11y": "^6.8.0",
@ -121,11 +122,11 @@
"jest": "^29.7.0",
"jsdom": "^24.1.0",
"jsonc-eslint-parser": "^2.4.0",
"knip": "^5.17.3",
"knip": "^5.18.0",
"memfs": "^4.8.2",
"msw": "^2.3.0",
"msw": "^2.3.1",
"next-router-mock": "^0.9.13",
"prettier": "^3.2.5",
"prettier": "^3.3.1",
"typescript": "5.4.5",
"vite-tsconfig-paths": "^4.3.2",
"vitest": "^1.6.0",

View File

@ -38,12 +38,12 @@
"zod": "^3.23.8"
},
"devDependencies": {
"@sentry/types": "^8.7.0",
"@sentry/types": "^8.8.0",
"@types/lodash.clonedeep": "^4.5.9",
"@typescript-eslint/eslint-plugin": "^7.11.0",
"@typescript-eslint/parser": "^7.11.0",
"@typescript-eslint/eslint-plugin": "^7.12.0",
"@typescript-eslint/parser": "^7.12.0",
"eslint": "8.57.0",
"eslint-plugin-import": "^2.29.1",
"prettier": "^3.2.5"
"prettier": "^3.3.1"
}
}

View File

@ -18,19 +18,19 @@
"license": "ISC",
"devDependencies": {
"@faker-js/faker": "^8.4.1",
"@sentry/esbuild-plugin": "^2.17.0",
"@sentry/esbuild-plugin": "^2.18.0",
"@types/web-push": "^3.6.3",
"@typescript-eslint/eslint-plugin": "^7.11.0",
"@typescript-eslint/parser": "^7.11.0",
"@typescript-eslint/eslint-plugin": "^7.12.0",
"@typescript-eslint/parser": "^7.12.0",
"dotenv-cli": "^7.4.2",
"esbuild": "^0.19.4",
"eslint": "8.57.0",
"eslint-plugin-import": "^2.29.1",
"knip": "^5.17.3",
"knip": "^5.18.0",
"memfs": "^4.8.2",
"nodemon": "^3.1.2",
"prettier": "^3.2.5",
"tsx": "^4.10.2",
"nodemon": "^3.1.3",
"prettier": "^3.3.1",
"tsx": "^4.13.2",
"typescript": "^5.4.5",
"vite-tsconfig-paths": "^4.3.2",
"vitest": "^1.6.0"
@ -40,16 +40,16 @@
"@runtipi/postgres-migrations": "^5.3.0",
"@runtipi/shared": "workspace:^",
"@sentry/integrations": "^7.114.0",
"@sentry/node": "^8.7.0",
"bullmq": "^5.7.14",
"@sentry/node": "^8.8.0",
"bullmq": "^5.7.15",
"dotenv": "^16.4.5",
"hono": "^4.4.2",
"hono": "^4.4.4",
"ioredis": "^5.4.1",
"pg": "^8.11.5",
"pg": "^8.12.0",
"socket.io": "^4.7.5",
"systeminformation": "^5.22.10",
"web-push": "^3.6.7",
"yaml": "^2.4.1",
"yaml": "^2.4.3",
"zod": "^3.23.8"
}
}

View File

@ -166,7 +166,6 @@ export const handleViewAppLogsEvent = async (socket: Socket, event: SocketEvent)
socket.on('app-logs', (data) => {
if (data.event === 'stopLogs') {
console.log('Stopping logs');
logs.kill('SIGINT');
}
});

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
* - Please do NOT serve this file on production.
*/
const PACKAGE_VERSION = '2.3.0'
const PACKAGE_VERSION = '2.3.1'
const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423'
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
const activeClientIds = new Set()

View File

@ -0,0 +1,33 @@
import React from 'react';
import { TabsList, TabsTrigger } from '@/components/ui/tabs';
import { useTranslations } from 'next-intl';
import { AppStatus } from '@/server/db/schema';
import { useRouter } from 'next/navigation';
interface IProps {
status: AppStatus;
}
export const AppDetailsTabTriggers = ({ status }: IProps) => {
const t = useTranslations();
const router = useRouter();
const handleTabChange = (newTab: string) => {
void router.push(`?tab=${newTab}`);
};
return (
<TabsList>
<TabsTrigger onClick={() => handleTabChange('description')} value="description">
{t('APP_DETAILS_DESCRIPTION')}
</TabsTrigger>
<TabsTrigger onClick={() => handleTabChange('info')} value="info">
{t('APP_DETAILS_BASE_INFO')}
</TabsTrigger>
<TabsTrigger onClick={() => handleTabChange('logs')} value="logs" disabled={status === 'missing'}>
{t('APP_LOGS_TAB_TITLE')}
</TabsTrigger>
</TabsList>
);
};

View File

@ -1,12 +1,14 @@
import { IconAlertCircle, IconExternalLink } from '@tabler/icons-react';
import React from 'react';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Tabs, TabsContent } from '@/components/ui/tabs';
import { useTranslations } from 'next-intl';
import { AppInfo } from '@runtipi/shared';
import { Markdown } from '@/components/Markdown';
import { DataGrid, DataGridItem } from '@/components/ui/DataGrid';
import { AppStatus as AppStatusEnum } from '@/server/db/schema';
import { AppLogs } from './AppLogs';
import { AppDetailsTabTriggers } from './AppDetailsTabTriggers';
import { useSearchParams } from 'next/navigation';
interface IProps {
info: AppInfo;
@ -16,15 +18,11 @@ interface IProps {
export const AppDetailsTabs: React.FC<IProps> = ({ info, status }) => {
const t = useTranslations();
const defaultTab = useSearchParams().get('tab');
return (
<Tabs defaultValue="description" orientation="vertical" style={{ marginTop: -1 }}>
<TabsList>
<TabsTrigger value="description">{t('APP_DETAILS_DESCRIPTION')}</TabsTrigger>
<TabsTrigger value="info">{t('APP_DETAILS_BASE_INFO')}</TabsTrigger>
<TabsTrigger value="logs" disabled={status === 'missing'}>
{t('APP_LOGS_TAB_TITLE')}
</TabsTrigger>
</TabsList>
<Tabs defaultValue={defaultTab || 'description'} orientation="vertical" style={{ marginTop: -1 }}>
<AppDetailsTabTriggers status={status} />
<TabsContent value="description">
{info.deprecated && (
<div className="alert alert-danger" role="alert">

View File

@ -1,18 +1,19 @@
'use client';
import React, { useState } from 'react';
import React, { useState, useRef } from 'react';
import { useSocket } from '@/lib/socket/useSocket';
import { LogsTerminal } from 'src/app/components/LogsTerminal/LogsTerminal';
import { ClientOnly } from '@/components/ClientOnly/ClientOnly';
export const AppLogs = ({ appId }: { appId: string }) => {
let nextId = 0;
const [logs, setLogs] = useState<{ id: number; text: string }[]>([]);
const [maxLines, setMaxLines] = useState<number>(300);
const maxLines = useRef(300);
useSocket({
selector: { type: 'app-logs', event: 'newLogs', data: { property: 'appId', value: appId } },
onCleanup: () => setLogs([]),
emitOnConnect: { type: 'app-logs-init', event: 'initLogs', data: { appId, maxLines } },
emitOnConnect: { type: 'app-logs-init', event: 'initLogs', data: { appId, maxLines: maxLines.current } },
emitOnDisconnect: { type: 'app-logs', event: 'stopLogs', data: { appId } },
onEvent: (_, data) => {
setLogs((prevLogs) => {
@ -20,8 +21,8 @@ export const AppLogs = ({ appId }: { appId: string }) => {
return prevLogs;
}
const newLogs = [...prevLogs, ...data.lines.map((line) => ({ id: nextId++, text: line.trim() }))];
if (newLogs.length > maxLines) {
return newLogs.slice(newLogs.length - maxLines);
if (newLogs.length > maxLines.current) {
return newLogs.slice(newLogs.length - maxLines.current);
}
return newLogs;
});
@ -30,9 +31,13 @@ export const AppLogs = ({ appId }: { appId: string }) => {
const updateMaxLines = (lines: number) => {
const linesToKeep = Math.max(1, lines);
setMaxLines(linesToKeep);
maxLines.current = linesToKeep;
setLogs((currentLogs) => currentLogs.slice(currentLogs.length - linesToKeep));
};
return <LogsTerminal logs={logs} maxLines={maxLines} onMaxLinesChange={updateMaxLines} />;
return (
<ClientOnly>
<LogsTerminal logs={logs} maxLines={maxLines.current} onMaxLinesChange={updateMaxLines} />
</ClientOnly>
);
};

View File

@ -1,18 +1,19 @@
'use client';
import React, { useState } from 'react';
import React, { useState, useRef } from 'react';
import { useSocket } from '@/lib/socket/useSocket';
import { LogsTerminal } from 'src/app/components/LogsTerminal/LogsTerminal';
import { ClientOnly } from '@/components/ClientOnly/ClientOnly';
export const LogsContainer = () => {
let nextId = 0;
const [logs, setLogs] = useState<{ id: number; text: string }[]>([]);
const [maxLines, setMaxLines] = useState<number>(300);
const maxLines = useRef(300);
useSocket({
selector: { type: 'runtipi-logs', event: 'newLogs' },
onCleanup: () => setLogs([]),
emitOnConnect: { type: 'runtipi-logs-init', event: 'initLogs', data: { maxLines } },
emitOnConnect: { type: 'runtipi-logs-init', event: 'initLogs', data: { maxLines: maxLines.current } },
emitOnDisconnect: { type: 'runtipi-logs', event: 'stopLogs', data: {} },
onEvent: (_, data) => {
setLogs((prevLogs) => {
@ -20,8 +21,8 @@ export const LogsContainer = () => {
return prevLogs;
}
const newLogs = [...prevLogs, ...data.lines.map((line) => ({ id: nextId++, text: line.trim() }))];
if (newLogs.length > maxLines) {
return newLogs.slice(newLogs.length - maxLines);
if (newLogs.length > maxLines.current) {
return newLogs.slice(newLogs.length - maxLines.current);
}
return newLogs;
});
@ -30,9 +31,13 @@ export const LogsContainer = () => {
const updateMaxLines = (lines: number) => {
const linesToKeep = Math.max(1, lines);
setMaxLines(linesToKeep);
maxLines.current = linesToKeep;
setLogs(logs.slice(logs.length - linesToKeep));
};
return <LogsTerminal logs={logs} maxLines={maxLines} onMaxLinesChange={updateMaxLines} />;
return (
<ClientOnly>
<LogsTerminal logs={logs} maxLines={maxLines.current} onMaxLinesChange={updateMaxLines} />
</ClientOnly>
);
};

View File

@ -1,6 +1,7 @@
'use client';
import React, { useEffect, useRef, useState } from 'react';
import React, { useEffect, useRef } from 'react';
import { useLocalStorage } from '@uidotdev/usehooks';
import clsx from 'clsx';
import styles from './LogsTerminal.module.scss';
import { useTranslations } from 'next-intl';
@ -15,8 +16,8 @@ export const LogsTerminal = (props: Props) => {
const t = useTranslations();
const { logs, onMaxLinesChange, maxLines } = props;
const [follow, setFollow] = useState<boolean>(true);
const [wrapLines, setWrapLines] = useState<boolean>(false);
const [follow, setFollow] = useLocalStorage<boolean>('logs-follow', true);
const [wrapLines, setWrapLines] = useLocalStorage<boolean>('logs-wraplines', false);
const ref = useRef<HTMLPreElement>(null);
const lastLogId = logs.length > 0 ? logs.at(-1)?.id : null;

View File

@ -0,0 +1,18 @@
'use client';
/**
* Hack to work around next.js hydration
* @see https://github.com/uidotdev/usehooks/issues/218
*/
import React from 'react';
import { useIsClient } from '@uidotdev/usehooks';
type ClientOnlyProps = {
children: React.ReactNode;
};
export const ClientOnly: React.FC<ClientOnlyProps> = ({ children }) => {
const isClient = useIsClient();
// Render children if on client side, otherwise return null
return isClient ? <>{children}</> : null;
};

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Instal·la",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Actualitza",
"APP_INSTALL_FORM_TITLE": "Instal·la {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "Tota la informació d'aquesta aplicació es perdrà.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Inicia sessió al teu compte",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Torna a l'inici de sessió",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel·la la sol·licitud de canvi de contrasenya",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Executa aquesta comanda al teu servidor i després actualitza aquesta pàgina",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Restableix la contrasenya",
"AUTH_RESET_PASSWORD_SUCCESS": "La teva contrasenya s'ha restablert. Ara pots iniciar sessió amb la nova contrasenya. I el correu electrònic {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "La contrasenya s'ha restablert",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Es requereix la teva contrasenya per canviar la configuració de l'autenticació de dos factors.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Escanegeu aquest codi QR amb l'aplicació autenticadora.",
"SETTINGS_SECURITY_TAB_TITLE": "Seguretat",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Configuració",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "No s'ha pogut recuperar l'última versió",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "La versió actual ja està actualitzada",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -3,11 +3,11 @@
"APP_ACTION_INSTALL": "Installieren",
"APP_ACTION_LOADING": "Laden",
"APP_ACTION_OPEN": "Öffnen",
"APP_ACTION_REMOVE": "Löschen",
"APP_ACTION_REMOVE": "Entfernen",
"APP_ACTION_SETTINGS": "Einstellungen",
"APP_ACTION_START": "Start",
"APP_ACTION_START": "Starten",
"APP_ACTION_STOP": "Anhalten",
"APP_ACTION_RESTART": "Restart",
"APP_ACTION_RESTART": "Neu starten",
"APP_ACTION_UPDATE": "Aktualisieren",
"APP_CATEGORY_AI": "KI",
"APP_CATEGORY_AUTOMATION": "Automatisierung",
@ -27,22 +27,22 @@
"APP_DETAILS_AUTHOR": "Autor",
"APP_DETAILS_BASE_INFO": "Basisinfo",
"APP_DETAILS_CATEGORIES_TITLE": "Kategorien",
"APP_DETAILS_CHOOSE_OPEN_METHOD": "Offene Methode wählen",
"APP_DETAILS_DEPRECATED_ALERT_SUBTITLE": "A breaking change in this app prevents it from being updated automatically. You can still use this version and update it manually, but it is recommended to switch to a newer version and migrate your data. You can find an updated version in the app store under the same name.",
"APP_DETAILS_DEPRECATED_ALERT_TITLE": "This app is deprecated",
"APP_DETAILS_CHOOSE_OPEN_METHOD": "Wähle eine Öffnungsmethode aus",
"APP_DETAILS_DEPRECATED_ALERT_SUBTITLE": "Eine grundlegende Änderung in dieser App verhindert eine automatische Aktualisierung. Du kannst diese Version weiterhin verwenden und manuell aktualisieren, aber es wird empfohlen, auf eine neuere Version umzusteigen und deine Daten zu migrieren. Eine aktualisierte Version findest du im App Store unter demselben Namen.",
"APP_DETAILS_DEPRECATED_ALERT_TITLE": "Diese App ist veraltet",
"APP_DETAILS_DESCRIPTION": "Beschreibung",
"APP_DETAILS_LINK": "Link",
"APP_DETAILS_PORT": "Port",
"APP_DETAILS_SOURCE_CODE": "Quellcode",
"APP_DETAILS_SUPPORTED_ARCH": "Unterstütze Architekturen",
"APP_DETAILS_TITLE": "App details",
"APP_DETAILS_TITLE": "App-Details",
"APP_DETAILS_VERSION": "Version",
"APP_DETAILS_WEBSITE": "Webseite",
"APP_ERROR_APP_FAILED_TO_INSTALL": "Installieren der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
"APP_ERROR_APP_FAILED_TO_RESET": "Failed to reset app {id}, see logs for more details",
"APP_ERROR_APP_FAILED_TO_INSTALL": "Installieren der App {id} fehlgeschlagen, schau dir die Logs an für weitere Informationen",
"APP_ERROR_APP_FAILED_TO_RESET": "Zurücksetzen der App {id} fehlgeschlagen, schau dir die Logs an für weitere Details",
"APP_ERROR_APP_FAILED_TO_START": "Starten der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
"APP_ERROR_APP_FAILED_TO_STOP": "Stoppen der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
"APP_ERROR_APP_FAILED_TO_RESTART": "Failed to restart app {id}, see logs for more details",
"APP_ERROR_APP_FAILED_TO_RESTART": "Neustart der App {id} fehlgeschlagen, schau dir die Logs an für weitere Details",
"APP_ERROR_APP_FAILED_TO_UNINSTALL": "Deinstallieren der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
"APP_ERROR_APP_FAILED_TO_UPDATE": "Aktualisieren der App {id} fehlgeschlagen. Siehe die Logs für weitere Informationen",
"APP_ERROR_APP_FORCE_EXPOSED": "App {id} funktioniert nur mit veröffentlichter Domain",
@ -50,57 +50,64 @@
"APP_ERROR_APP_NOT_FOUND": "App {id} nicht gefunden",
"APP_ERROR_DOMAIN_ALREADY_IN_USE": "Die Domain {domain} ist bereits in Verwendung von der App {id}",
"APP_ERROR_DOMAIN_NOT_VALID": "Die Domain {domain} ist ungültig",
"APP_ERROR_DOMAIN_REQUIRED_IF_EXPOSE_APP": "Eine Domain ist erforderlich, wenn die App veröffentlicht ist",
"APP_ERROR_DOMAIN_REQUIRED_IF_EXPOSE_APP": "Eine Domain ist erforderlich, wenn die App freigegeben ist",
"APP_ERROR_INVALID_CONFIG": "Die App {id} hat eine ungültige config.json Datei",
"APP_INSTALL_FORM_CHOOSE_OPTION": "Wählen Sie eine Option...",
"APP_INSTALL_FORM_DISPLAY_ON_GUEST_DASHBOARD": "Display on guest dashboard",
"APP_INSTALL_FORM_DOMAIN_NAME": "Domänenname",
"APP_INSTALL_FORM_DOMAIN_NAME_HINT": "Stellen Sie sicher, dass genau diese Domain einen A-Eintrag enthält, der auf Ihre IP verweist.",
"APP_INSTALL_FORM_CHOOSE_OPTION": "Wähle eine Option...",
"APP_INSTALL_FORM_DISPLAY_ON_GUEST_DASHBOARD": "Anzeige auf dem Gast-Dashboard",
"APP_INSTALL_FORM_DOMAIN_NAME": "Domainname",
"APP_INSTALL_FORM_DOMAIN_NAME_HINT": "Stelle sicher, dass genau diese Domain einen A-Record enthält, der auf deine IP zeigt.",
"APP_INSTALL_FORM_ERROR_BETWEEN_LENGTH": "{label} muss zwischen {min} und {max} Zeichen lang sein",
"APP_INSTALL_FORM_ERROR_FQDN": "{label} muss eine gültige Domain sein",
"APP_INSTALL_FORM_ERROR_FQDNIP": "{label} muss eine gültige Domain oder IP-Addresse sein",
"APP_INSTALL_FORM_ERROR_INVALID_EMAIL": "{label} muss eine gültige E-Mail Adresse sein",
"APP_INSTALL_FORM_ERROR_FQDNIP": "{label} muss eine gültige Domain oder IP-Adresse sein",
"APP_INSTALL_FORM_ERROR_INVALID_EMAIL": "{label} muss eine gültige E-Mail-Adresse sein",
"APP_INSTALL_FORM_ERROR_IP": "{label} muss eine gültige IP-Adresse sein",
"APP_INSTALL_FORM_ERROR_MAX_LENGTH": "{label} muss kleiner als {max} Zeichen sein",
"APP_INSTALL_FORM_ERROR_MAX_LENGTH": "{label} darf nicht mehr als {max} Zeichen enthalten",
"APP_INSTALL_FORM_ERROR_MIN_LENGTH": "{label} muss mindestens {min} Zeichen lang sein",
"APP_INSTALL_FORM_ERROR_NUMBER": "{label} muss eine Nummer sein",
"APP_INSTALL_FORM_ERROR_NUMBER": "{label} muss eine Zahl sein",
"APP_INSTALL_FORM_ERROR_REGEX": "{label} stimmt nicht mit dem Format {pattern} überein",
"APP_INSTALL_FORM_ERROR_REQUIRED": "{label} ist erforderlich",
"APP_INSTALL_FORM_ERROR_URL": "{label} muss eine gültige URL sein",
"APP_INSTALL_FORM_EXPOSE_APP": "Expose app on the internet",
"APP_INSTALL_FORM_OPEN_PORT": "Open port",
"APP_INSTALL_FORM_OPEN_PORT_HINT": "Open a port on the host? This app will be accessible at {internalIp}:{port}. (Easiest but less secure)",
"APP_INSTALL_FORM_EXPOSE_LOCAL": "Expose app on local network",
"APP_INSTALL_FORM_EXPOSE_LOCAL_HINT": "Expose the app on the local network? This app will be accessible at {appId}.{domain}. (Visit settings page to setup your local domain)",
"APP_INSTALL_FORM_RESET": "Reset app",
"APP_INSTALL_FORM_EXPOSE_APP": "App im Internet verfügbar machen",
"APP_INSTALL_FORM_OPEN_PORT": "Port öffnen",
"APP_INSTALL_FORM_OPEN_PORT_HINT": "Einen Port auf dem Host öffnen? Diese App wird unter {internalIp}:{port} erreichbar sein. (Einfachste, aber weniger sichere Methode)",
"APP_INSTALL_FORM_EXPOSE_LOCAL": "Die App im lokalen Netzwerk freigeben",
"APP_INSTALL_FORM_EXPOSE_LOCAL_HINT": "Die App im lokalen Netzwerk freigeben? Diese App wird unter {appId}.{domain} erreichbar sein. (Besuche die Einstellungsseite, um deine lokale Domain einzurichten)",
"APP_INSTALL_FORM_RESET": "App zurücksetzen",
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Installieren",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Aktualisieren",
"APP_INSTALL_FORM_TITLE": "{name} installieren",
"APP_INSTALL_FORM_GENERAL": "Allgemein",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse Proxy",
"APP_INSTALL_SUCCESS": "App- {id} erfolgreich installiert",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "Alle Daten für diese Anwendung werden gelöscht.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
"APP_RESET_FORM_WARNING": "Sind Sie sicher? Dieser Schritt kann nicht rückgängig gemacht werden.",
"APP_RESET_SUCCESS": "App {id} reset successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEU",
"APP_RESET_FORM_SUBMIT": "Zurücksetzen",
"APP_RESET_FORM_SUBTITLE": "Alle Daten für diese App gehen verloren.",
"APP_RESET_FORM_TITLE": "{name} zurücksetzen?",
"APP_RESET_FORM_WARNING": "Bist du sicher? Diese Aktion kann nicht rückgängig gemacht werden.",
"APP_RESET_SUCCESS": "App {id} erfolgreich zurückgesetzt",
"APP_START_SUCCESS": "App {id} erfolgreich gestartet",
"APP_STATUS_INSTALLING": "Installieren",
"APP_STATUS_MISSING": "Fehlt",
"APP_STATUS_RESETTING": "Resetting",
"APP_STATUS_RESETTING": "Wird zurückgesetzt",
"APP_STATUS_RUNNING": "Aktiv",
"APP_STATUS_STARTING": "Startet",
"APP_STATUS_STOPPED": "Angehalten",
"APP_STATUS_STOPPED": "Gestoppt",
"APP_STATUS_STOPPING": "Stoppen",
"APP_STATUS_RESTARTING": "Restarting",
"APP_STATUS_RESTARTING": "Wird neu gestartet",
"APP_STATUS_UNINSTALLING": "Deinstallieren",
"APP_STATUS_UPDATING": "Aktualisieren",
"APP_STOP_FORM_SUBMIT": "Anhalten",
"APP_STOP_FORM_SUBTITLE": "Alle Daten werden aufbewahrt",
"APP_STOP_FORM_TITLE": "{name} anhalten?",
"APP_STOP_SUCCESS": "App {id} erfolgreich angehalten",
"APP_RESTART_FORM_SUBMIT": "Restart",
"APP_RESTART_FORM_SUBTITLE": "All data will be retained",
"APP_RESTART_FORM_TITLE": "Restart {name} ?",
"APP_RESTART_SUCCESS": "App {id} restarted successfully",
"APP_RESTART_FORM_SUBMIT": "Neu starten",
"APP_RESTART_FORM_SUBTITLE": "Alle Daten bleiben erhalten",
"APP_RESTART_FORM_TITLE": "{name} neu starten?",
"APP_RESTART_SUCCESS": "App {id} erfolgreich neu gestartet",
"APP_STORE_CATEGORY_PLACEHOLDER": "Kategorie wählen",
"APP_STORE_NO_RESULTS": "Keine App gefunden",
"APP_STORE_NO_RESULTS_SUBTITLE": "Versuche, deine Suche zu verbessern",
@ -112,7 +119,7 @@
"APP_UNINSTALL_FORM_WARNING": "Sind Sie sicher? Dieser Schritt kann nicht rückgängig gemacht werden.",
"APP_UNINSTALL_SUCCESS": "App {id} erfolgreich deinstalliert",
"APP_UPDATE_CONFIG_SUCCESS": "App-Konfiguration erfolgreich aktualisiert. Starte die App neu, um die Änderungen zu übernehmen",
"APP_UPDATE_ERROR_MIN_TIPI_VERSION": "App {id} update requires Tipi version {minVersion} or higher. Please update your instance.",
"APP_UPDATE_ERROR_MIN_TIPI_VERSION": "Update der App {id} erfordert Tipi-Version {minVersion} oder höher. Bitte aktualisiere deine Instanz.",
"APP_UPDATE_FORM_SUBMIT": "Aktualisieren",
"APP_UPDATE_FORM_SUBTITLE_1": "App auf die neueste Version aktualisieren:",
"APP_UPDATE_FORM_SUBTITLE_2": "Dies wird Ihre benutzerdefinierte Konfiguration zurücksetzen (z.B. Änderungen in docker-compose.yml).",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Ihr Konto erstellen",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Zurück zur Anmeldung",
"AUTH_RESET_PASSWORD_CANCEL": "Passwortänderung abbrechen",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Führen Sie diesen Befehl auf Ihrem Server aus und aktualisieren Sie die Seite",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Um zu beginnen, führe diesen Befehl auf deinem Server aus und aktualisiere dann diese Seite. Falls du das bereits zuvor getan hast, könnte die Anforderung zum Zurücksetzen des Passworts abgelaufen sein. In diesem Fall versuche es bitte erneut",
"AUTH_RESET_PASSWORD_SUBMIT": "Zurücksetzen",
"AUTH_RESET_PASSWORD_SUCCESS": "Ihr Passwort wurde gespeichert. Sie können sich nun mit Ihrem neuen Passwort und ihrer E-Mail {email} anmelden",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Passwort zurückgesetzt",
@ -165,18 +172,18 @@
"AUTH_TOTP_INSTRUCTIONS": "Code aus der Authenticator-App eingeben",
"AUTH_TOTP_SUBMIT": "Bestätigen",
"AUTH_TOTP_TITLE": "Zwei-Faktor Authentifizierung",
"COMMON_CLOSE": "Close",
"COMMON_CLOSE": "Schließen",
"DASHBOARD_CPU_SUBTITLE": "Apps deinstallieren um Last zu reduzieren",
"DASHBOARD_CPU_TITLE": "CPU Last",
"DASHBOARD_DISK_SPACE_SUBTITLE": "Wird von {total} GB verwendet",
"DASHBOARD_DISK_SPACE_TITLE": "Speicherplatz",
"DASHBOARD_MEMORY_TITLE": "Benutzter Speicher",
"DASHBOARD_TITLE": "Dashboard",
"DASHBOARD_IP_WARNING_TITLE": "Insecure configuration",
"DASHBOARD_IP_WARNING": "Warning, you might be at risk! it looks like you are accessing your instance through a public IP address. This makes your dashboard and all apps that you install vulnerable to attackers",
"GUEST_DASHBOARD": "Guest dashboard",
"GUEST_DASHBOARD_NO_APPS": "No apps to display",
"GUEST_DASHBOARD_NO_APPS_SUBTITLE": "Ask your administrator to add apps to the guest dashboard or login to see your apps.",
"DASHBOARD_IP_WARNING_TITLE": "Unsichere Konfiguration",
"DASHBOARD_IP_WARNING": "Warnung, du könntest gefährdet sein! Es sieht so aus, als würdest du auf deine Instanz über eine öffentliche IP-Adresse zugreifen. Dies macht dein Dashboard und alle installierten Apps anfällig für Angreifer",
"GUEST_DASHBOARD": "Gast-Dashboard",
"GUEST_DASHBOARD_NO_APPS": "Keine Apps anzuzeigen",
"GUEST_DASHBOARD_NO_APPS_SUBTITLE": "Bitte deinen Administrator, Apps zum Gast-Dashboard hinzuzufügen, oder melde dich an, um deine Apps anzuzeigen.",
"HEADER_APPS": "Meine Apps",
"HEADER_APP_STORE": "App Store",
"HEADER_DARK_MODE": "Dunkler Modus",
@ -188,35 +195,35 @@
"HEADER_SOURCE_CODE": "Quellcode",
"HEADER_SPONSOR": "Sponsor",
"HEADER_UPDATE_AVAILABLE": "Aktualisierung verfügbar",
"INTERNAL_SERVER_ERROR": "Internal server error",
"LINKS_ADD_SUBMIT": "Submit",
"LINKS_ADD_SUBTITLE": "Add external link to the dashboard",
"LINKS_ADD_SUCCESS": "Link added succesfully",
"LINKS_ADD_TITLE": "Add external link",
"LINKS_DELETE_CONTEXT_MENU": "Delete",
"LINKS_DELETE_SUBMIT": "Delete",
"LINKS_DELETE_SUBTITLE": "Are you sure you want to delete this external link?",
"LINKS_DELETE_SUCCESS": "Link deleted succesfully",
"LINKS_DELETE_TITLE": "Delete external link",
"LINKS_EDIT_CONTEXT_MENU": "Edit",
"LINKS_EDIT_SUBMIT": "Save",
"LINKS_EDIT_SUCCESS": "Link edited succesfully",
"LINKS_EDIT_TITLE": "Edit link",
"INTERNAL_SERVER_ERROR": "Interner Serverfehler",
"LINKS_ADD_SUBMIT": "Bestätigen",
"LINKS_ADD_SUBTITLE": "Externen Link zum Dashboard hinzufügen",
"LINKS_ADD_SUCCESS": "Link erfolgreich hinzugefügt",
"LINKS_ADD_TITLE": "Externen Link hinzufügen",
"LINKS_DELETE_CONTEXT_MENU": "Löschen",
"LINKS_DELETE_SUBMIT": "Löschen",
"LINKS_DELETE_SUBTITLE": "Bist du sicher, dass du diesen externen Link entfernen willst?",
"LINKS_DELETE_SUCCESS": "Link erfolgreich gelöscht",
"LINKS_DELETE_TITLE": "Externen Link löschen",
"LINKS_EDIT_CONTEXT_MENU": "Bearbeiten",
"LINKS_EDIT_SUBMIT": "Speichern",
"LINKS_EDIT_SUCCESS": "Link erfolgreich bearbeitet",
"LINKS_EDIT_TITLE": "Link bearbeiten",
"LINKS_FORM_ICON_PLACEHOLDER": "Link logo URL",
"LINKS_FORM_ICON_URL": "Icon URL",
"LINKS_FORM_LINK_TITLE": "Link title",
"LINKS_FORM_LINK_URL": "Link URL",
"LINKS_FROM_LINK_DESCRIPTION": "Link Description",
"MY_APPS_DEPRECATED": "This app is deprecated",
"LINKS_FORM_ICON_URL": "Icon-URL",
"LINKS_FORM_LINK_TITLE": "Linktitel",
"LINKS_FORM_LINK_URL": "Link-URL",
"LINKS_FROM_LINK_DESCRIPTION": "Linkbeschreibung",
"MY_APPS_DEPRECATED": "Diese App ist veraltet",
"MY_APPS_EMPTY_ACTION": "Zum App Store",
"MY_APPS_EMPTY_SUBTITLE": "Installiere eine App aus dem App Store, um loszulegen",
"MY_APPS_EMPTY_TITLE": "Keine Apps installiert",
"MY_APPS_TITLE": "Meine Apps",
"MY_APPS_UPDATE_ALL_FORM_SUBMIT": "Update all",
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_1": "Do you want to update all your apps to the latest version?",
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_2": "This will update all your apps to the latest version. Make sure you've read the release notes of the apps and you've backed up your app data.",
"MY_APPS_UPDATE_ALL_FORM_TITLE": "Update all apps",
"MY_APPS_UPDATE_ALL_IN_PROGRESS": "Updating all apps",
"MY_APPS_UPDATE_ALL_FORM_SUBMIT": "Alle aktualisieren",
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_1": "Möchtest du alle deine Apps auf die neueste Version aktualisieren?",
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_2": "Dies wird all deine Apps auf die neueste Version aktualisieren. Stelle sicher, dass du die Release Notes der Apps gelesen und deine App-Daten gesichert hast.",
"MY_APPS_UPDATE_ALL_FORM_TITLE": "Alle Apps aktualisieren",
"MY_APPS_UPDATE_ALL_IN_PROGRESS": "Alle Apps werden aktualisiert",
"MY_APPS_UPDATE_AVAILABLE": "Aktualisierung verfügbar",
"RUNTIPI": "Runtipi",
"SERVER_ERROR_INVALID_LOCALE": "Ungültige Region",
@ -231,18 +238,18 @@
"SETTINGS_ACTIONS_STAY_UP_TO_DATE": "Bleiben Sie auf dem Laufenden mit der neuesten Version von Tipi",
"SETTINGS_ACTIONS_TAB_TITLE": "Aktionen",
"SETTINGS_ACTIONS_TITLE": "Aktionen",
"SETTINGS_GENERAL_ALLOW_AUTO_THEMES": "Allow auto themes",
"SETTINGS_GENERAL_ALLOW_AUTO_THEMES_HINT": "Be surprised by themes that change automatically based on the time of the year.",
"SETTINGS_GENERAL_ALLOW_ERROR_MONITORING": "Allow anonymous error monitoring",
"SETTINGS_GENERAL_ALLOW_ERROR_MONITORING_HINT": "Error monitoring is used to track errors and improve Tipi. Keep this option enabled to help us improve Tipi.",
"SETTINGS_GENERAL_ALLOW_AUTO_THEMES": "Automatische Themes zulassen",
"SETTINGS_GENERAL_ALLOW_AUTO_THEMES_HINT": "Lass dich von Themes überraschen, die sich automatisch je nach Jahreszeit ändern.",
"SETTINGS_GENERAL_ALLOW_ERROR_MONITORING": "Anonymes Fehler-Monitoring zulassen",
"SETTINGS_GENERAL_ALLOW_ERROR_MONITORING_HINT": "Fehler-Monitoring wird verwendet, um Fehler zu tracken und Tipi zu verbessern. Lass diese Option aktiviert, um uns bei der Verbesserung von Tipi zu unterstützen.",
"SETTINGS_GENERAL_APPS_REPO": "App-Repo-URL",
"SETTINGS_GENERAL_APPS_REPO_HINT": "URL zum App-Repository.",
"SETTINGS_GENERAL_DNS_IP": "DNS IP",
"SETTINGS_GENERAL_DOMAIN_NAME": "Domänenname",
"SETTINGS_GENERAL_DOMAIN_NAME_HINT": "Stellen Sie sicher, dass genau diese Domain einen A-Eintrag enthält, der auf Ihre IP verweist.",
"SETTINGS_GENERAL_DOWNLOAD_CERTIFICATE": "Zertifikat herunterladen",
"SETTINGS_GENERAL_GUEST_DASHBOARD": "Enable guest dashboard",
"SETTINGS_GENERAL_GUEST_DASHBOARD_HINT": "This will allow non-authenticated users to see a limited dashboard and easily access the running apps on your instance.",
"SETTINGS_GENERAL_GUEST_DASHBOARD": "Gast-Dashboard aktivieren",
"SETTINGS_GENERAL_GUEST_DASHBOARD_HINT": "Dies ermöglicht nicht authentifizierten Benutzern, ein begrenztes Dashboard zu sehen und einfach auf die laufenden Apps auf deiner Instanz zuzugreifen.",
"SETTINGS_GENERAL_INTERNAL_IP": "Interne IP",
"SETTINGS_GENERAL_INTERNAL_IP_HINT": "IP-Adresse, die Ihr Server abhört.",
"SETTINGS_GENERAL_INVALID_DOMAIN": "Ungültige Domain",
@ -251,10 +258,10 @@
"SETTINGS_GENERAL_LANGUAGE": "Sprache",
"SETTINGS_GENERAL_LANGUAGE_HELP_TRANSLATE": "Beim Übersetzen helfen",
"SETTINGS_GENERAL_LOCAL_DOMAIN": "Local domain",
"SETTINGS_GENERAL_LOCAL_DOMAIN_HINT": "Domain name used for accessing apps in your local network. Your apps will be accessible at app-name.local-domain.",
"SETTINGS_GENERAL_LOCAL_DOMAIN_HINT": "Domainname für den Zugriff auf Apps in deinem lokalen Netzwerk. Deine Apps werden unter app-name.local-domain erreichbar sein.",
"SETTINGS_GENERAL_SETTINGS_UPDATED": "Einstellungen aktualisiert. Starten Sie Ihre Instanz neu, um die Einstellungen zu übernehmen.",
"SETTINGS_GENERAL_STORAGE_PATH": "Speicherpfad",
"SETTINGS_GENERAL_STORAGE_PATH_HINT": "Path to the storage directory. Make sure it is an absolute path and that it exists.",
"SETTINGS_GENERAL_STORAGE_PATH_HINT": "Pfad zum Speicherverzeichnis. Stelle sicher, dass es ein absoluter Pfad ist und er existiert.",
"SETTINGS_GENERAL_SUBMIT": "Einstellungen aktualisieren",
"SETTINGS_GENERAL_SUBTITLE": "Dadurch wird Ihre Datei settings.json aktualisiert. Stellen Sie sicher, dass Sie wissen, was Sie tun, bevor Sie diese Werte aktualisieren.",
"SETTINGS_GENERAL_TAB_TITLE": "Einstellungen",
@ -265,15 +272,15 @@
"SETTINGS_SECURITY_2FA_SUBTITLE": "Zwei-Faktor Authentifizierung (2FA) fügt deinem Konto eine weitere Sicherheitsebene zu.",
"SETTINGS_SECURITY_2FA_SUBTITLE_2": "Wenn aktiviert, werden Sie bei der Anmeldung aufgefordert, einen Code aus ihrer Authentifizierungs-App einzugeben.",
"SETTINGS_SECURITY_2FA_TITLE": "Zwei-Faktor Authentifizierung",
"SETTINGS_SECURITY_CHANGE_PASSWORD_SUBTITLE": "Changing your password will log you out of all devices.",
"SETTINGS_SECURITY_CHANGE_PASSWORD_SUBTITLE": "Wenn du dein Passwort änderst, wirst du von allen Geräten abgemeldet.",
"SETTINGS_SECURITY_CHANGE_PASSWORD_TITLE": "Passwort ändern",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_INVALID_USERNAME": "Muss eine gültige E-Mail Adresse sein",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_NEW_USERNAME": "Neuer Benutzername",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_PASSWORD": "Passwort",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_PASSWORD_NEEDED_HINT": "Your password is required to change your username.",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_PASSWORD_NEEDED_HINT": "Dein Passwort wird benötigt, um deinen Benutzernamen zu ändern.",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_SUBMIT": "Benutzername ändern",
"SETTINGS_SECURITY_CHANGE_USERNAME_SUBTITLE": "Changing your username will log you out of all devices.",
"SETTINGS_SECURITY_CHANGE_USERNAME_SUCCESS": "Username changed successfully",
"SETTINGS_SECURITY_CHANGE_USERNAME_SUBTITLE": "Wenn du deinen Benutzernamen änderst, wirst du von allen Geräten abgemeldet.",
"SETTINGS_SECURITY_CHANGE_USERNAME_SUCCESS": "Benutzername erfolgreich geändert",
"SETTINGS_SECURITY_CHANGE_USERNAME_TITLE": "Benutzername ändern",
"SETTINGS_SECURITY_DISABLE_2FA": "Zwei-Faktor-Authentifizierung deaktivieren",
"SETTINGS_SECURITY_ENABLE_2FA": "Zwei-Faktor-Authentifizierung aktivieren",
@ -291,10 +298,11 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Ihr Passwort wird benötigt, um die Zwei-Faktor-Authentifizierungseinstellungen zu ändern.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scannen Sie diesen QR-Code mit Ihrer Authentifizierungs-App.",
"SETTINGS_SECURITY_TAB_TITLE": "Sicherheit",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Einstellungen",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Konnte aktuellste Version nicht abfragen",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Die aktuelle Version ist bereits auf dem neuesten Stand",
"SYSTEM_ERROR_DEMO_MODE_LIMIT": "Im Demo-Modus können nur 6 Apps installiert werden. Bitte deinstallieren Sie eine andere App, um eine neue zu installieren.",
"SYSTEM_ERROR_MAJOR_VERSION_UPDATE": "Die Hauptversion hat sich geändert. Bitte aktualisieren Sie manuell. (Anleitung auf GitHub)",
"SYSTEM_ERROR_YOU_MUST_BE_LOGGED_IN": "You must be logged in to perform this action"
"SYSTEM_ERROR_YOU_MUST_BE_LOGGED_IN": "Du musst angemeldet sein, um diese Aktion auszuführen"
}

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Εγκατάσταση",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Ενημέρωση",
"APP_INSTALL_FORM_TITLE": "Εγκατάσταση {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "Όλα τα δεδομένα αυτής της εφαρμογής θα χαθούν.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Εγγραφή του λογαριασμού σας",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Επιστροφή στη σελίδα εισόδου",
"AUTH_RESET_PASSWORD_CANCEL": "Ακύρωση αιτήματος αλλαγής κωδικού πρόσβασης",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Εκτελέστε αυτήν την εντολή στο διακομιστή σας και στη συνέχεια ανανεώστε αυτή τη σελίδα",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Επαναφορά κωδικού πρόσβασης",
"AUTH_RESET_PASSWORD_SUCCESS": "Ο κωδικός σας έχει επαναφερθεί. Μπορείτε τώρα να συνδεθείτε με τον καινούριο κωδικό πρόσβασης και τη διεύθυνση ηλεκτρονικού ταχυδρομείου {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Επαναφορά κωδικού πρόσβασης",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Απαιτείται κωδικός πρόσβασης για να αλλάξετε τις ρυθμίσεις ελέγχου ταυτότητας δύο βημάτων.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Σαρώστε αυτόν τον κώδικα QR με την εφαρμογή επαλήθευσης.",
"SETTINGS_SECURITY_TAB_TITLE": "Ασφάλεια",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Ρυθμίσεις",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Αδυναμία λήψης της τελευταίας έκδοσης",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Η τρέχουσα έκδοση είναι ενημερωμένη",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,11 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Instalar",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Actualizar",
"APP_INSTALL_FORM_TITLE": "Instalar {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Proxy inverso",
"APP_INSTALL_SUCCESS": "La aplicación {id} se instaló correctamente",
"APP_LOGS_TAB_FOLLOW": "Seguir trazas",
"APP_LOGS_TAB_MAX_LINES": "Maximo numero de líneas:",
"APP_LOGS_TAB_MAX_LINES": "Líneas máximas:",
"APP_LOGS_TAB_TITLE": "Trazas",
"APP_LOGS_TAB_WRAP_LINES": "Ajustar líneas",
"APP_NEW": "NUEVA",
"APP_RESET_FORM_SUBMIT": "Restablecer",
"APP_RESET_FORM_SUBTITLE": "Todos los datos de esta aplicación se perderán.",
"APP_RESET_FORM_TITLE": "Restablecer {name}?",
@ -161,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Registre su cuenta",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Volver al inicio de sesión",
"AUTH_RESET_PASSWORD_CANCEL": "Cancelar cambio de contraseña",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Ejecuta este comando en tu servidor y luego actualiza esta página",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Ejecuta este comando en el servidor y recarga la página. Si ya has hecho esto previamente, es posible que la solicitud haya caducado. En ese caso, inténtelo de nuevo por favor",
"AUTH_RESET_PASSWORD_SUBMIT": "Restablecer contraseña",
"AUTH_RESET_PASSWORD_SUCCESS": "Tu contraseña ha sido restablecida. Ahora puedes iniciar sesión con tu nueva contraseña. Y tu correo electrónico es {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Restablecimiento de contraseña",
@ -295,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Tu contraseña es necesaria para cambiar la configuración de autenticación de dos factores.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Escanea este código QR con tu aplicación de autenticación.",
"SETTINGS_SECURITY_TAB_TITLE": "Seguridad",
"SETTINGS_LOGS_TAB_TITLE": "Trazas",
"SETTINGS_TITLE": "Configuración",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "No se pudo obtener la última versión",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "La versión ya está actualizada",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Installer",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Mettre à jour",
"APP_INSTALL_FORM_TITLE": "Installer {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "Application {id} installée avec succès",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NOUVEAU",
"APP_RESET_FORM_SUBMIT": "Réinitialiser",
"APP_RESET_FORM_SUBTITLE": "Toutes les données de cette application seront perdues.",
"APP_RESET_FORM_TITLE": "Réinitialiser {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Créez votre compte",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Retour au login",
"AUTH_RESET_PASSWORD_CANCEL": "Annuler la demande de changement de mot de passe",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Exécutez cette commande sur votre serveur, puis rafraîchissez cette page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Pour commencer, exécutez cette commande sur votre serveur puis actualisez cette page. Si vous l'avez déjà fait, la demande de réinitialisation du mot de passe peut avoir expiré. Dans ce cas, veuillez réessayer.",
"AUTH_RESET_PASSWORD_SUBMIT": "Réinitialiser",
"AUTH_RESET_PASSWORD_SUCCESS": "Votre mot de passe a été réinitialisé. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe. Et votre e-mail {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Mot de passe réinitialisé",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Votre mot de passe est requis pour modifier les paramètres d'authentification à deux facteurs.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scannez ce QR code avec votre application d'authentification.",
"SETTINGS_SECURITY_TAB_TITLE": "Sécurité",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Paramètres",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Impossible d'obtenir la dernière version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "La version actuelle est déjà à jour",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Telepítés",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Frissítés",
"APP_INSTALL_FORM_TITLE": "{name} telepítése",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "A(z) {id} alkalmazás sikeresen telepítve",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Alaphelyzetbe állítás",
"APP_RESET_FORM_SUBTITLE": "Az alkalmazás összes adata elveszik.",
"APP_RESET_FORM_TITLE": "Alaphelyzetbe állítod a következőt: {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Fiók regisztráció",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Vissza a belépéshez",
"AUTH_RESET_PASSWORD_CANCEL": "Jelszómódosítási kérés visszavonása",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Futtassa ezt a parancsot a szerverén, majd frissítse ezt az oldalt",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Jelszó visszaállítása",
"AUTH_RESET_PASSWORD_SUCCESS": "A jelszava vissza lett állítva. Most már bejelentkezhet az új jelszavával. Ez az e-mail címe {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Jelszó visszaállítása",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "A kétlépcsős hitelesítési beállítások megváltoztatásához szükséges a jelszavad.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Ezt a QR kódot kell beolvasni a hitelesítő alkalmazással.",
"SETTINGS_SECURITY_TAB_TITLE": "Biztonság",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Beállítások",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Nem sikerült letölteni a legújabb verziót",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "A jelenlegi verzió már naprakész",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Installa",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Aggiorna",
"APP_INSTALL_FORM_TITLE": "Installa {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installata con successo",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "Tutti i dati relativi a questa app verranno persi.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Crea un nuovo account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Torna alla pagina di login",
"AUTH_RESET_PASSWORD_CANCEL": "Annulla richiesta di cambio password",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Esegui questo comando sul tuo server e poi aggiorna questa pagina",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Resetta password",
"AUTH_RESET_PASSWORD_SUCCESS": "La tua password è stata resettata. Ora puoi accedere con la tua nuova password. E la tua email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Resettata la password",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "La tua password è richiesta per cambiare le impostazioni relative all'autenticazione a due fattori.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scansiona questo codice QR con la tua app di autenticazione.",
"SETTINGS_SECURITY_TAB_TITLE": "Sicurezza",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Impostazioni",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Impossibile ottenere l'ultima versione",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "La versione corrente è già la più recente",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "インストール",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "更新",
"APP_INSTALL_FORM_TITLE": "{name} をインストール",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "このアプリのすべてのデータが失われます。",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "アカウントを作成",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "ログインページへ戻る",
"AUTH_RESET_PASSWORD_CANCEL": "パスワード変更リクエストをキャンセルする",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "サーバーでこのコマンドを実行してから、このページを更新してください",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "パスワードをリセット",
"AUTH_RESET_PASSWORD_SUCCESS": "パスワードがリセットされました。新しいパスワードでログインできるようになりました。そして、メールアドレス {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "パスワードをリセットする",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "二段階認証の設定を変更するにはパスワードが必要です。",
"SETTINGS_SECURITY_SCAN_QR_CODE": "認証アプリでQRコードをスキャンして下さい。",
"SETTINGS_SECURITY_TAB_TITLE": "セキュリティ",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "設定",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "最新バージョンを取得できませんでした",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "現在のバージョンは既に最新です",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Zainstaluj",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Aktualizuj",
"APP_INSTALL_FORM_TITLE": "Zainstaluj {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "Wszystkie dane tej aplikacji zostaną utracone.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Uruchom to polecenie na swoim serwerze, a następnie odśwież tę stronę",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Zresetuj hasło",
"AUTH_RESET_PASSWORD_SUCCESS": "Twoje hasło zostało zresetowane. Możesz teraz zalogować się przy użyciu nowego hasła. I e-mail {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Resetowanie hasła",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Twoje hasło jest wymagane do zmiany ustawień weryfikacji dwuetapowej.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Zeskanuj ten kod QR za pomocą aplikacji uwierzytelniającej.",
"SETTINGS_SECURITY_TAB_TITLE": "Bezpieczeństwo",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Ustawienia",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Nie udało się pobrać najnowszej wersji",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Bieżąca wersja jest już aktualna",

View File

@ -59,28 +59,35 @@
"APP_INSTALL_FORM_ERROR_BETWEEN_LENGTH": "{label} Deve ter entre {min} e {max} caracteres",
"APP_INSTALL_FORM_ERROR_FQDN": "{label} Deve ser um domínio válido",
"APP_INSTALL_FORM_ERROR_FQDNIP": "{label} Deve ser um domínio ou endereço IP válido",
"APP_INSTALL_FORM_ERROR_INVALID_EMAIL": "Deve ser um endereço de e-mail válido",
"APP_INSTALL_FORM_ERROR_IP": "O endereço IP não é válido",
"APP_INSTALL_FORM_ERROR_INVALID_EMAIL": "{label} Deve ser um endereço de e-mail válido",
"APP_INSTALL_FORM_ERROR_IP": "{label} O endereço IP não é válido",
"APP_INSTALL_FORM_ERROR_MAX_LENGTH": "{label} Deve ter entre {min} e {max} caracteres",
"APP_INSTALL_FORM_ERROR_MIN_LENGTH": "{label} deve ter pelo menos {min} caracteres",
"APP_INSTALL_FORM_ERROR_NUMBER": "{label} deve ser um número",
"APP_INSTALL_FORM_ERROR_REGEX": "{label} deve corresponder ao padrão {pattern}",
"APP_INSTALL_FORM_ERROR_MIN_LENGTH": "{label} Deve ter pelo menos {min} caracteres",
"APP_INSTALL_FORM_ERROR_NUMBER": "{label} Deve ser um número",
"APP_INSTALL_FORM_ERROR_REGEX": "{label} Deve corresponder ao padrão {pattern}",
"APP_INSTALL_FORM_ERROR_REQUIRED": "{label} É obrigatório",
"APP_INSTALL_FORM_ERROR_URL": "{label} Deve ser um endereço válido",
"APP_INSTALL_FORM_EXPOSE_APP": "Tornar aplicação pública",
"APP_INSTALL_FORM_OPEN_PORT": "Abrir porta",
"APP_INSTALL_FORM_OPEN_PORT_HINT": "Abrir uma porta no host? Este aplicativo será acessível em {internalIp}:{port}. (Mais fácil, mas menos seguro)",
"APP_INSTALL_FORM_EXPOSE_LOCAL": "Expor o aplicativo na rede local",
"APP_INSTALL_FORM_OPEN_PORT_HINT": "Abrir uma porta nesse endereço? Este aplicativo será acessível em {internalIp}:{port}. (Mais fácil, mas menos seguro)",
"APP_INSTALL_FORM_EXPOSE_LOCAL": "Tornar acessível apenas na rede local",
"APP_INSTALL_FORM_EXPOSE_LOCAL_HINT": "Expor o aplicativo na rede local? Este aplicativo estará acessível em {appId}.{domain}. (Visite a página de configurações para configurar seu domínio local)",
"APP_INSTALL_FORM_RESET": "Redefinir o aplicativo",
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Instalar",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Atualizar",
"APP_INSTALL_FORM_TITLE": "Instalar {name}",
"APP_INSTALL_FORM_GENERAL": "Geral",
"APP_INSTALL_FORM_REVERSE_PROXY": "Proxy Reverso",
"APP_INSTALL_SUCCESS": "Aplicativo {id} instalado com sucesso",
"APP_LOGS_TAB_FOLLOW": "Seguir registros",
"APP_LOGS_TAB_MAX_LINES": "Máximo de linhas",
"APP_LOGS_TAB_TITLE": "Registros",
"APP_LOGS_TAB_WRAP_LINES": "Ajuste de linha automático",
"APP_NEW": "NOVO",
"APP_RESET_FORM_SUBMIT": "Redefinir",
"APP_RESET_FORM_SUBTITLE": "Todos os dados deste aplicativo serão perdidos.",
"APP_RESET_FORM_TITLE": "Redefinir {name} ?",
"APP_RESET_FORM_WARNING": "Confirma? essa ação não poderá ser desfeita.",
"APP_RESET_FORM_WARNING": "Confirma? Essa ação não poderá ser desfeita.",
"APP_RESET_SUCCESS": "App {id} redefinido com sucesso",
"APP_START_SUCCESS": "App {id} iniciado com sucesso",
"APP_STATUS_INSTALLING": "Instalando",
@ -95,7 +102,7 @@
"APP_STATUS_UPDATING": "Atualizando",
"APP_STOP_FORM_SUBMIT": "Parar",
"APP_STOP_FORM_SUBTITLE": "Todos os dados serão removidos",
"APP_STOP_FORM_TITLE": "Parar {name}?",
"APP_STOP_FORM_TITLE": "Interromper {name}?",
"APP_STOP_SUCCESS": "O aplicativo {id} foi interrompido com sucesso",
"APP_RESTART_FORM_SUBMIT": "Reiniciar",
"APP_RESTART_FORM_SUBTITLE": "Todos os dados serão apagados",
@ -112,7 +119,7 @@
"APP_UNINSTALL_FORM_WARNING": "Tem certeza? Esta ação não pode ser desfeita.",
"APP_UNINSTALL_SUCCESS": "App {id} desinstalado com sucesso",
"APP_UPDATE_CONFIG_SUCCESS": "Configuração do aplicativo atualizada com sucesso. Reinicie o aplicativo para aplicar as alterações",
"APP_UPDATE_ERROR_MIN_TIPI_VERSION": "App {id} update requires Tipi version {minVersion} or higher. Please update your instance.",
"APP_UPDATE_ERROR_MIN_TIPI_VERSION": "A atualização do aplicativo {id} requer a versão do Tipi {minVersion} ou superior. Por favor, atualize sua instância.",
"APP_UPDATE_FORM_SUBMIT": "Atualizar",
"APP_UPDATE_FORM_SUBTITLE_1": "Atualize o aplicativo para a última versão :",
"APP_UPDATE_FORM_SUBTITLE_2": "Certifique-se de ter lido as notas de lançamento do app e de ter feito backup dos dados do seu aplicativo.",
@ -132,15 +139,15 @@
"AUTH_ERROR_TOTP_INVALID_CODE": "Código 2FA inválido",
"AUTH_ERROR_TOTP_NOT_ENABLED": "2FA não está habilitado para esse usuário",
"AUTH_ERROR_TOTP_SESSION_NOT_FOUND": "Sessão 2FA não encontrado",
"AUTH_ERROR_USER_ALREADY_EXISTS": "Usuário já existe",
"AUTH_ERROR_USER_ALREADY_EXISTS": "Usuário já existente ",
"AUTH_ERROR_USER_NOT_FOUND": "Usuário não encontrado",
"AUTH_FORM_EMAIL": "Endereço de e-mail",
"AUTH_FORM_EMAIL_PLACEHOLDER": "voce@exemplo.com",
"AUTH_FORM_ERROR_EMAIL_EMAIL": "O endereço de e-mail é inválido",
"AUTH_FORM_ERROR_EMAIL_INVALID": "O endereço de e-mail é inválido",
"AUTH_FORM_ERROR_EMAIL_REQUIRED": "E-mail é obrigatório",
"AUTH_FORM_ERROR_EMAIL_REQUIRED": "O endereço de e-mail é obrigatório",
"AUTH_FORM_ERROR_PASSWORD_CONFIRMATION_LENGTH": "A confirmação da senha deve ter pelo menos 8 caracteres",
"AUTH_FORM_ERROR_PASSWORD_CONFIRMATION_MATCH": "As senhas não conferem",
"AUTH_FORM_ERROR_PASSWORD_CONFIRMATION_MATCH": "As senhas não são iguais",
"AUTH_FORM_ERROR_PASSWORD_CONFIRMATION_REQUIRED": "Confirmação de senha é necessária",
"AUTH_FORM_ERROR_PASSWORD_LENGTH": "A senha deve ter pelo menos 8 caracteres",
"AUTH_FORM_ERROR_PASSWORD_REQUIRED": "A senha é obrigatória",
@ -151,13 +158,13 @@
"AUTH_FORM_PASSWORD_CONFIRMATION": "Confirme a senha",
"AUTH_FORM_PASSWORD_CONFIRMATION_PLACEHOLDER": "Confirme sua senha",
"AUTH_FORM_PASSWORD_PLACEHOLDER": "Digite sua senha",
"AUTH_LOGIN_SUBMIT": "Entrar",
"AUTH_LOGIN_SUBMIT": "Acessar",
"AUTH_LOGIN_TITLE": "Entrar na sua conta",
"AUTH_REGISTER_SUBMIT": "Registrar",
"AUTH_REGISTER_TITLE": "Crie sua conta",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Voltar para o login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancelar solicitação de alteração de senha",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Execute este comando em seu servidor e depois atualize a página",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Para começar, execute este comando em seu servidor e depois atualize esta página. Se você já fez isso anteriormente, a solicitação de redefinição de senha pode ter expirado. Nesse caso, por favor, tente novamente",
"AUTH_RESET_PASSWORD_SUBMIT": "Redefinir senha",
"AUTH_RESET_PASSWORD_SUCCESS": "Sua senha foi atualizada com sucesso, Agora você pode utilizar sua nova senha e seu e-mail {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Senha atualizada",
@ -165,15 +172,15 @@
"AUTH_TOTP_INSTRUCTIONS": "Insira o código de autenticação",
"AUTH_TOTP_SUBMIT": "Aceitar",
"AUTH_TOTP_TITLE": "Autenticação de 3 fatores",
"COMMON_CLOSE": "Close",
"COMMON_CLOSE": "Finalizar",
"DASHBOARD_CPU_SUBTITLE": "Desinstale aplicativos para reduzir a carga",
"DASHBOARD_CPU_TITLE": "Utilização do Processador",
"DASHBOARD_DISK_SPACE_SUBTITLE": "Espaço disponível {total} GB",
"DASHBOARD_DISK_SPACE_TITLE": "Espaço total em disco",
"DASHBOARD_MEMORY_TITLE": "Memória utilizada",
"DASHBOARD_TITLE": "Painel de controle",
"DASHBOARD_IP_WARNING_TITLE": "Insecure configuration",
"DASHBOARD_IP_WARNING": "Warning, you might be at risk! it looks like you are accessing your instance through a public IP address. This makes your dashboard and all apps that you install vulnerable to attackers",
"DASHBOARD_IP_WARNING_TITLE": "Configuração insegura",
"DASHBOARD_IP_WARNING": "Atenção, você pode estar em risco! Parece que você está acessando sua instância através de um endereço IP público. Isso torna seu painel e todos os aplicativos que você instala vulneráveis a ataques",
"GUEST_DASHBOARD": "Painel de controle para visitantes",
"GUEST_DASHBOARD_NO_APPS": "Nenhum aplicativo instalado",
"GUEST_DASHBOARD_NO_APPS_SUBTITLE": "Peça ao seu administrador para adicionar aplicativos ao painel de visitantes ou fazer login para ver seus aplicativos.",
@ -202,14 +209,14 @@
"LINKS_EDIT_SUBMIT": "Salvar",
"LINKS_EDIT_SUCCESS": "Link editado com sucesso",
"LINKS_EDIT_TITLE": "Editar link",
"LINKS_FORM_ICON_PLACEHOLDER": "Link URL da logo",
"LINKS_FORM_ICON_PLACEHOLDER": "URL da logo",
"LINKS_FORM_ICON_URL": "URL do ícone",
"LINKS_FORM_LINK_TITLE": "Título do link",
"LINKS_FORM_LINK_URL": "URL do link",
"LINKS_FROM_LINK_DESCRIPTION": "Descrição do link",
"MY_APPS_DEPRECATED": "Este aplicativo está obsoleto",
"MY_APPS_DEPRECATED": "Esse aplicativo foi descontinuado",
"MY_APPS_EMPTY_ACTION": "Ir para a App Store",
"MY_APPS_EMPTY_SUBTITLE": "Instale um aplicativo da loja de aplicativos para começar",
"MY_APPS_EMPTY_SUBTITLE": "Instale uma aplicação na loja de aplicativos para começar",
"MY_APPS_EMPTY_TITLE": "Nenhum aplicativo instalado",
"MY_APPS_TITLE": "Meus aplicativos",
"MY_APPS_UPDATE_ALL_FORM_SUBMIT": "Atualizar tudo",
@ -217,12 +224,12 @@
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_2": "Isso atualizará todos os seus aplicativos para a versão mais recente. Certifique-se de ter lido as notas de lançamento dos aplicativos e ter feito backup dos dados do seu aplicativo.",
"MY_APPS_UPDATE_ALL_FORM_TITLE": "Atualizar todos os aplicativos",
"MY_APPS_UPDATE_ALL_IN_PROGRESS": "Atualizando todos os aplicativos",
"MY_APPS_UPDATE_AVAILABLE": "Atualização Disponível",
"MY_APPS_UPDATE_AVAILABLE": "Atualização disponível",
"RUNTIPI": "Runtipi",
"SERVER_ERROR_INVALID_LOCALE": "Idioma inválido",
"SERVER_ERROR_NOT_ALLOWED_IN_DEMO": "Não é permitido no modo demonstração",
"SERVER_ERROR_NOT_ALLOWED_IN_DEV": "Não permitido no modo de desenvolvimento",
"SETTINGS_ACTIONS_ALREADY_LATEST": "Já está atualizado",
"SETTINGS_ACTIONS_ALREADY_LATEST": "Você já está na última versão",
"SETTINGS_ACTIONS_CURRENT_VERSION": "Versão atual: {version}",
"SETTINGS_ACTIONS_MAINTENANCE_SUBTITLE": "Ações comuns a serem realizadas em sua instância",
"SETTINGS_ACTIONS_MAINTENANCE_TITLE": "Manutenção",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Sua senha é necessária para alterar as configurações de autenticação em duas etapas.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Escaneie este código de barras com\nseu aplicativo autenticador.",
"SETTINGS_SECURITY_TAB_TITLE": "Segurança",
"SETTINGS_LOGS_TAB_TITLE": "Registros",
"SETTINGS_TITLE": "Configurações",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Error ao baixar atualização",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "A versão atual já está atualizada",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Instalar",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Atualizar",
"APP_INSTALL_FORM_TITLE": "Instalar {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "Todos os dados deste aplicativo serão perdidos.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Registre a sua conta",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Voltar ao início de sessão",
"AUTH_RESET_PASSWORD_CANCEL": "Cancelar solicitação de alteração de senha",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Execute este comando no seu servidor e, em seguida, atualize esta página",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Repor palavra-passe",
"AUTH_RESET_PASSWORD_SUCCESS": "Sua senha foi redefinida. Agora você pode acessar com a sua nova senha. E seu e-mail {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Redefinir palavra-passe",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "A sua senha é necessária para alterar as configurações de autenticação de dois fatores.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Digitalize este código QR com o seu aplicativo de autenticação.",
"SETTINGS_SECURITY_TAB_TITLE": "Segurança",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Configurações",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Não foi possível obter a versão recente",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "A versão atual já é atualizada",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Instalare",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Actualizare",
"APP_INSTALL_FORM_TITLE": "Instalează {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "Toate datele pentru această aplicație vor fi pierdute.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Înregistrați-vă contul",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Inapoi la autentificare",
"AUTH_RESET_PASSWORD_CANCEL": "Anulează cererea de modificare a parolei",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Rulează această comandă pe serverul tău și apoi reîmprospătează această pagină",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Resetare parola",
"AUTH_RESET_PASSWORD_SUCCESS": "Parola ta a fost resetată. Acum te poți conecta cu noua ta parolă. Și adresa de e-mail {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Parolă resetată",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Parola dvs. este necesară pentru a schimba setările de autentificare cu doi factori.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scanați acest cod QR cu aplicația de autentificare.",
"SETTINGS_SECURITY_TAB_TITLE": "Securitate",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Setări",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Nu s-a putut obține cea mai recentă versiune",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Versiunea curentă este deja actualizată",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Установить",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Обновить",
"APP_INSTALL_FORM_TITLE": "Установить {name}",
"APP_INSTALL_FORM_GENERAL": "Общее",
"APP_INSTALL_FORM_REVERSE_PROXY": "Обратный прокси",
"APP_INSTALL_SUCCESS": "Приложение {id} успешно установлено",
"APP_LOGS_TAB_FOLLOW": "Следить за логами",
"APP_LOGS_TAB_MAX_LINES": "Максимум строк:",
"APP_LOGS_TAB_TITLE": "Логи",
"APP_LOGS_TAB_WRAP_LINES": "Переносить строки",
"APP_NEW": "НОВОЕ",
"APP_RESET_FORM_SUBMIT": "Сбросить",
"APP_RESET_FORM_SUBTITLE": "Все данные этого приложения будут потеряны.",
"APP_RESET_FORM_TITLE": "Сбросить {name}?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Зарегистрируйте аккаунт",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Вернуться на страницу входа",
"AUTH_RESET_PASSWORD_CANCEL": "Отменить запрос на смену пароля",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Выполните эту команду на вашем сервере, затем обновите эту страницу",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Чтобы начать, запустите команду на вашем сервере и обновите эту страницу. Если вы уже сделали это, возможно, запрос на сброс пароля истёк. В этом случае повторите попытку",
"AUTH_RESET_PASSWORD_SUBMIT": "Сбросить пароль",
"AUTH_RESET_PASSWORD_SUCCESS": "Ваш пароль был сброшен. Теперь вы можете войти с новым паролем. Ваш адрес электронной почты {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Пароль сброшен",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Для изменения параметров двухфакторной аутентификации требуется пароль.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Сканируйте этот QR-код вашим приложением-аутентификатором.",
"SETTINGS_SECURITY_TAB_TITLE": "Безопасность",
"SETTINGS_LOGS_TAB_TITLE": "Логи",
"SETTINGS_TITLE": "Настройки",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Не удалось получить последнюю версию",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Текущая версия уже актуальна",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -42,7 +42,7 @@
"APP_ERROR_APP_FAILED_TO_RESET": "Det gick inte att återställa appen {id}, se loggar för mer information",
"APP_ERROR_APP_FAILED_TO_START": "Det gick inte att starta app {id}, se loggar för mer information",
"APP_ERROR_APP_FAILED_TO_STOP": "Det gick inte att stoppa app {id}, se loggar för mer information",
"APP_ERROR_APP_FAILED_TO_RESTART": "Failed to restart app {id}, see logs for more details",
"APP_ERROR_APP_FAILED_TO_RESTART": "Misslyckades med att starta om appen{id}. Se loggen för mer detaljer",
"APP_ERROR_APP_FAILED_TO_UNINSTALL": "Det gick inte att avinstallera app {id}, se loggar för mer information",
"APP_ERROR_APP_FAILED_TO_UPDATE": "Det gick inte att uppdatera app {id}, se loggar för mer information",
"APP_ERROR_APP_FORCE_EXPOSED": "Appen {id} fungerar endast med exponerad domän",
@ -67,8 +67,8 @@
"APP_INSTALL_FORM_ERROR_REGEX": "{label} måste matcha mönstret {pattern}",
"APP_INSTALL_FORM_ERROR_REQUIRED": "{label} krävs",
"APP_INSTALL_FORM_ERROR_URL": "{label} måste vara en giltig URL",
"APP_INSTALL_FORM_EXPOSE_APP": "Expose app on the internet",
"APP_INSTALL_FORM_OPEN_PORT": "Open port",
"APP_INSTALL_FORM_EXPOSE_APP": "Exponera appen mot internet",
"APP_INSTALL_FORM_OPEN_PORT": "Öppna en port",
"APP_INSTALL_FORM_OPEN_PORT_HINT": "Open a port on the host? This app will be accessible at {internalIp}:{port}. (Easiest but less secure)",
"APP_INSTALL_FORM_EXPOSE_LOCAL": "Expose app on local network",
"APP_INSTALL_FORM_EXPOSE_LOCAL_HINT": "Expose the app on the local network? This app will be accessible at {appId}.{domain}. (Visit settings page to setup your local domain)",
@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Installera",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Uppdatera",
"APP_INSTALL_FORM_TITLE": "Installera {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "Appen {id} installerades",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Återställ",
"APP_RESET_FORM_SUBTITLE": "Alla data för denna app kommer att försvinna.",
"APP_RESET_FORM_TITLE": "Återställ {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Registrera ditt konto",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Tillbaka till inloggningen",
"AUTH_RESET_PASSWORD_CANCEL": "Avbryta begäran om ändring av lösenord",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Kör detta kommando på din server och uppdatera sedan den här sidan",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Återställ lösenord",
"AUTH_RESET_PASSWORD_SUCCESS": "Ditt lösenord har återställts. Du kan nu logga in med ditt nya lösenord. Och din e-postadress {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Återställ lösenord",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Ditt lösenord krävs för att ändra tvåfaktorsautentiseringsinställningar.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Skanna den här QR-koden med din autentiseringsapp.",
"SETTINGS_SECURITY_TAB_TITLE": "Säkerhet",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Inställningar",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Kunde inte hämta senaste versionen",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Den nuvarande versionen är redan uppdaterad",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Yükle",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Güncelle",
"APP_INSTALL_FORM_TITLE": "Yükle {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "Uygulama başarıyla yüklendi",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Sıfırla",
"APP_RESET_FORM_SUBTITLE": "Bu uygulama için tüm veriler kaybolacak.",
"APP_RESET_FORM_TITLE": "Yeniden Başlat {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Yeni hesabınızı kaydedin",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Giriş sayfasına dön",
"AUTH_RESET_PASSWORD_CANCEL": "Parola değiştirme isteğini iptal et",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Bu komutu sunucunuzda çalıştırtıkdan sonra bu sayfayı yenileyin",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Parolayı sıfırla",
"AUTH_RESET_PASSWORD_SUCCESS": "Parolanız sıfırlandı. Artık yeni parolanız ile giriş yapabilirsiniz. Ve e-postanız {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Parolayı sıfırla",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "İki faktörlü kimlik doğrulama ayarlarını değiştirmek için parolanız gereklidir.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Bu QR kodunu kimlik doğrulama uygulamanızla tarayın.",
"SETTINGS_SECURITY_TAB_TITLE": "Güvenlik",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Ayarlar",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "En son sürüm alınamadı",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Son versiyon zaten yüklü",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Install",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Update",
"APP_INSTALL_FORM_TITLE": "Install {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "All data for this app will be lost.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Register your account",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Back to login",
"AUTH_RESET_PASSWORD_CANCEL": "Cancel password change request",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Run this command on your server and then refresh this page",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "Reset password",
"AUTH_RESET_PASSWORD_SUCCESS": "Your password has been reset. You can now login with your new password. And your email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Password reset",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Your password is required to change two-factor authentication settings.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Scan this QR code with your authenticator app.",
"SETTINGS_SECURITY_TAB_TITLE": "Security",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Settings",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Could not get latest version",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Current version is already up to date",

View File

@ -7,7 +7,7 @@
"APP_ACTION_SETTINGS": "Cài đặt",
"APP_ACTION_START": "Bắt đầu",
"APP_ACTION_STOP": "Dừng",
"APP_ACTION_RESTART": "Restart",
"APP_ACTION_RESTART": "Khởi Động Lại",
"APP_ACTION_UPDATE": "Cập nhật",
"APP_CATEGORY_AI": "Trí tuệ nhân tạo",
"APP_CATEGORY_AUTOMATION": "Tự động hóa",
@ -28,8 +28,8 @@
"APP_DETAILS_BASE_INFO": "Thông tin cơ bản",
"APP_DETAILS_CATEGORIES_TITLE": "Danh mục",
"APP_DETAILS_CHOOSE_OPEN_METHOD": "Chọn phương thức mở",
"APP_DETAILS_DEPRECATED_ALERT_SUBTITLE": "A breaking change in this app prevents it from being updated automatically. You can still use this version and update it manually, but it is recommended to switch to a newer version and migrate your data. You can find an updated version in the app store under the same name.",
"APP_DETAILS_DEPRECATED_ALERT_TITLE": "This app is deprecated",
"APP_DETAILS_DEPRECATED_ALERT_SUBTITLE": "Một thay đổi nghiêm trọng trong ứng dụng này ngăn nó khỏi được cập nhật tự động. Bạn vẫn có thể sử dụng phiên bản này và cập nhật thủ công, nhưng khuyến khích chuyển sang phiên bản mới hơn và di dời dữ liệu của bạn. Bạn có thể tìm thấy phiên bản cập nhật trong cửa hàng ứng dụng dưới cùng tên.",
"APP_DETAILS_DEPRECATED_ALERT_TITLE": "Ứng dụng này đã bị loại bỏ",
"APP_DETAILS_DESCRIPTION": "Mô tả",
"APP_DETAILS_LINK": "Liên kết",
"APP_DETAILS_PORT": "Cổng",
@ -38,11 +38,11 @@
"APP_DETAILS_TITLE": "Chi tiết ứng dụng",
"APP_DETAILS_VERSION": "Phiên bản",
"APP_DETAILS_WEBSITE": "Trang web",
"APP_ERROR_APP_FAILED_TO_INSTALL": "Cài đặt ứng dụng {id} thất bại, vui lòng xem log để biết chi tiết",
"APP_ERROR_APP_FAILED_TO_INSTALL": "Cài đặt ứng dụng {id} thất bại, xem nhật kí để biết chi tiết",
"APP_ERROR_APP_FAILED_TO_RESET": "Failed to reset app {id}, see logs for more details",
"APP_ERROR_APP_FAILED_TO_START": "Khởi động ứng dụng {id} thất bại, vui lòng xem log để biết chi tiết",
"APP_ERROR_APP_FAILED_TO_STOP": "Dừng ứng dụng {id} thất bại, vui lòng xem log để biết chi tiết",
"APP_ERROR_APP_FAILED_TO_RESTART": "Failed to restart app {id}, see logs for more details",
"APP_ERROR_APP_FAILED_TO_RESTART": "Khởi động lại ứng dụng {id} thất bại, xem nhật kí biết thêm",
"APP_ERROR_APP_FAILED_TO_UNINSTALL": "Gỡ cài đặt ứng dụng {id} thất bại, vui lòng xem log để biết chi tiết",
"APP_ERROR_APP_FAILED_TO_UPDATE": "Cập nhật ứng dụng {id} thất bại, vui lòng xem log để biết chi tiết",
"APP_ERROR_APP_FORCE_EXPOSED": "Ứng dụng {id} chỉ hoạt động với tên miền công khai",
@ -76,31 +76,38 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "Cài đặt",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "Cập nhật",
"APP_INSTALL_FORM_TITLE": "Cài đặt {name}",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_INSTALL_FORM_GENERAL": "Chung",
"APP_INSTALL_FORM_REVERSE_PROXY": "Proxy ngược",
"APP_INSTALL_SUCCESS": "Ứng dụng {id} đã được cài đặt thành công",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "MỚI",
"APP_RESET_FORM_SUBMIT": "Thiết lập lại",
"APP_RESET_FORM_SUBTITLE": "Tất cả dữ liệu của ứng dụng này sẽ bị mất.",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
"APP_RESET_FORM_TITLE": "Đặt lại {name}?",
"APP_RESET_FORM_WARNING": "Bạn chắc chứ? Hành động này không thể hoàn tác.",
"APP_RESET_SUCCESS": "App {id} reset successfully",
"APP_START_SUCCESS": "App {id} started successfully",
"APP_RESET_SUCCESS": "Ứng dụng {id} đã được thiết lập lại thành công",
"APP_START_SUCCESS": "Ứng dụng {id} Bắt đầu thành công",
"APP_STATUS_INSTALLING": "Đang cài đặt",
"APP_STATUS_MISSING": "Thiếu",
"APP_STATUS_RESETTING": "Resetting",
"APP_STATUS_RESETTING": "Đang đặt lại",
"APP_STATUS_RUNNING": "Đang hoạt động",
"APP_STATUS_STARTING": "Đang khởi động",
"APP_STATUS_STOPPED": "Đã dừng",
"APP_STATUS_STOPPING": "Đang dừng",
"APP_STATUS_RESTARTING": "Restarting",
"APP_STATUS_RESTARTING": "Khởi động lại",
"APP_STATUS_UNINSTALLING": "Đang gỡ cài đặt",
"APP_STATUS_UPDATING": "Đang cập nhật",
"APP_STOP_FORM_SUBMIT": "Dừng",
"APP_STOP_FORM_SUBTITLE": "Tất cả dữ liệu sẽ được giữ lại",
"APP_STOP_FORM_TITLE": "Dừng {name}?",
"APP_STOP_SUCCESS": "App {id} stopped successfully",
"APP_RESTART_FORM_SUBMIT": "Restart",
"APP_RESTART_FORM_SUBTITLE": "All data will be retained",
"APP_RESTART_FORM_TITLE": "Restart {name} ?",
"APP_RESTART_SUCCESS": "App {id} restarted successfully",
"APP_STOP_SUCCESS": "Ứng dụng {id} đã dừng thành công",
"APP_RESTART_FORM_SUBMIT": "Khởi động lại",
"APP_RESTART_FORM_SUBTITLE": "Tất cả dữ liệu sẽ được giữ lại",
"APP_RESTART_FORM_TITLE": "Khởi động lại {name} ?",
"APP_RESTART_SUCCESS": "Ứng dụng {id} đã khởi động lại thành công",
"APP_STORE_CATEGORY_PLACEHOLDER": "Chọn một danh mục",
"APP_STORE_NO_RESULTS": "Không tìm thấy ứng dụng",
"APP_STORE_NO_RESULTS_SUBTITLE": "Hãy thử tìm kiếm lại",
@ -110,15 +117,15 @@
"APP_UNINSTALL_FORM_SUBTITLE": "Tất cả dữ liệu của ứng dụng này sẽ bị mất.",
"APP_UNINSTALL_FORM_TITLE": "Gỡ cài đặt {name}?",
"APP_UNINSTALL_FORM_WARNING": "Bạn chắc chứ? Hành động này không thể hoàn tác.",
"APP_UNINSTALL_SUCCESS": "App {id} uninstalled successfully",
"APP_UNINSTALL_SUCCESS": "Ứng dụng {id} đã được gỡ cài đặt thành công",
"APP_UPDATE_CONFIG_SUCCESS": "Cài đặt của ứng dụng đã được cập nhật. Khởi động lại ứng dụng để áp dụng thay đổi",
"APP_UPDATE_ERROR_MIN_TIPI_VERSION": "App {id} update requires Tipi version {minVersion} or higher. Please update your instance.",
"APP_UPDATE_ERROR_MIN_TIPI_VERSION": "Ứng dụng {id} cần cập nhật phiên bản Tipi {minVersion} hoặc cao hơn. Vui lòng cập nhật phiên bản của bạn.",
"APP_UPDATE_FORM_SUBMIT": "Cập nhật",
"APP_UPDATE_FORM_SUBTITLE_1": "Cập nhật ứng dụng lên phiên bản mới nhất:",
"APP_UPDATE_FORM_SUBTITLE_2": "Việc này sẽ thay đổi cấu hình tùy chọn của bạn (ví dụ: các thay đổi trong file docker-compose.yml).",
"APP_UPDATE_FORM_TITLE": "Cập nhật {name}?",
"APP_UPDATE_SETTINGS_FORM_TITLE": "Cập nhật cấu hình {name}",
"APP_UPDATE_SUCCESS": "App {id} updated successfully",
"APP_UPDATE_SUCCESS": "Ứng dụng {id} cập nhật thành công",
"AUTH_ERROR_ADMIN_ALREADY_EXISTS": "Người dùng với quyền quản trị đã tồn tại. Vui lòng đăng nhập để tạo người dùng mới từ Trang quản trị.",
"AUTH_ERROR_ERROR_CREATING_USER": "Đã có lỗi khi tạo người dùng",
"AUTH_ERROR_INVALID_CREDENTIALS": "Thông tin đăng nhập không hợp lệ",
@ -127,7 +134,7 @@
"AUTH_ERROR_INVALID_USERNAME": "Tên người dùng không hợp lệ",
"AUTH_ERROR_MISSING_EMAIL_OR_PASSWORD": "Thiếu email hoặc mật khẩu",
"AUTH_ERROR_NO_CHANGE_PASSWORD_REQUEST": "Không có yêu cầu thay đổi mật khẩu nào được tìm thấy",
"AUTH_ERROR_OPERATOR_NOT_FOUND": "Operator user not found",
"AUTH_ERROR_OPERATOR_NOT_FOUND": "Không tìm thấy người quản lí",
"AUTH_ERROR_TOTP_ALREADY_ENABLED": "2FA đã được kích hoạt cho người dùng này",
"AUTH_ERROR_TOTP_INVALID_CODE": "Mã 2FA không hợp lệ",
"AUTH_ERROR_TOTP_NOT_ENABLED": "2FA không kích hoạt cho người dùng này",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "Đăng kí tài khoản của bạn",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "Trở lại trang đăng nhập",
"AUTH_RESET_PASSWORD_CANCEL": "Hủy yêu cầu thay đổi mật khẩu",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Chạy lệnh này trên máy chủ của bạn và tải lại trang này",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "Để bắt đầu, chạy lệnh này trên máy chủ của bạn và sau đó làm mới trang này. Nếu bạn đã thực hiện điều này trước đó, yêu cầu đặt lại mật khẩu có thể đã hết hạn. Trong trường hợp đó, vui lòng thử lại",
"AUTH_RESET_PASSWORD_SUBMIT": "Đặt lại mật khẩu",
"AUTH_RESET_PASSWORD_SUCCESS": "Mật khẩu của bạn đã được khôi phục. Bạn có thể đăng nhập với mật khẩu mới và email {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "Khôi phục mật khẩu",
@ -165,18 +172,18 @@
"AUTH_TOTP_INSTRUCTIONS": "Nhập mã từ ứng dụng xác thực của bạn",
"AUTH_TOTP_SUBMIT": "Xác nhận",
"AUTH_TOTP_TITLE": "Xác thực 2 bước",
"COMMON_CLOSE": "Close",
"COMMON_CLOSE": "Đóng",
"DASHBOARD_CPU_SUBTITLE": "Gỡ cài đặt ứng dụng để giảm thiểu việc quá tải",
"DASHBOARD_CPU_TITLE": "Tải CPU",
"DASHBOARD_DISK_SPACE_SUBTITLE": "Đã dùng trên tổng số {total} GB",
"DASHBOARD_DISK_SPACE_TITLE": "Dung lượng đĩa",
"DASHBOARD_MEMORY_TITLE": "Đã sử dụng bộ nhớ",
"DASHBOARD_TITLE": "Bảng điều khiển",
"DASHBOARD_IP_WARNING_TITLE": "Insecure configuration",
"DASHBOARD_IP_WARNING": "Warning, you might be at risk! it looks like you are accessing your instance through a public IP address. This makes your dashboard and all apps that you install vulnerable to attackers",
"GUEST_DASHBOARD": "Guest dashboard",
"GUEST_DASHBOARD_NO_APPS": "No apps to display",
"GUEST_DASHBOARD_NO_APPS_SUBTITLE": "Ask your administrator to add apps to the guest dashboard or login to see your apps.",
"DASHBOARD_IP_WARNING_TITLE": "Cấu hình không an toàn",
"DASHBOARD_IP_WARNING": "Cảnh báo, bạn có thể gặp nguy hiểm! Có vẻ bạn đang truy cập vào phiên của mình thông qua IP công cộng. Điều này khiến bảng điều khiển của bạn và các ứng dụng bạn cài đặt có thể bị tấn công",
"GUEST_DASHBOARD": "Bảng điều khiển Khách",
"GUEST_DASHBOARD_NO_APPS": "Không có ứng dụng để hiển thị",
"GUEST_DASHBOARD_NO_APPS_SUBTITLE": "Yêu cầu người quản trị của bạn thêm ứng dụng vào bảng điều khiển khách hoặc đăng nhập để xem ứng dụng của bạn.",
"HEADER_APPS": "Ứng dụng của tôi",
"HEADER_APP_STORE": "Cửa hàng ứng dụng",
"HEADER_DARK_MODE": "Chế độ Ban đêm",
@ -188,33 +195,33 @@
"HEADER_SOURCE_CODE": "Mã nguồn",
"HEADER_SPONSOR": "Nhà tài trợ",
"HEADER_UPDATE_AVAILABLE": "Đã có bản cập nhật",
"INTERNAL_SERVER_ERROR": "Internal server error",
"LINKS_ADD_SUBMIT": "Submit",
"LINKS_ADD_SUBTITLE": "Add external link to the dashboard",
"LINKS_ADD_SUCCESS": "Link added succesfully",
"LINKS_ADD_TITLE": "Add external link",
"LINKS_DELETE_CONTEXT_MENU": "Delete",
"LINKS_DELETE_SUBMIT": "Delete",
"LINKS_DELETE_SUBTITLE": "Are you sure you want to delete this external link?",
"LINKS_DELETE_SUCCESS": "Link deleted succesfully",
"LINKS_DELETE_TITLE": "Delete external link",
"LINKS_EDIT_CONTEXT_MENU": "Edit",
"LINKS_EDIT_SUBMIT": "Save",
"LINKS_EDIT_SUCCESS": "Link edited succesfully",
"LINKS_EDIT_TITLE": "Edit link",
"LINKS_FORM_ICON_PLACEHOLDER": "Link logo URL",
"LINKS_FORM_ICON_URL": "Icon URL",
"LINKS_FORM_LINK_TITLE": "Link title",
"LINKS_FORM_LINK_URL": "Link URL",
"LINKS_FROM_LINK_DESCRIPTION": "Link Description",
"MY_APPS_DEPRECATED": "This app is deprecated",
"INTERNAL_SERVER_ERROR": "Lỗi máy chủ nội bộ",
"LINKS_ADD_SUBMIT": "Gửi",
"LINKS_ADD_SUBTITLE": "Thêm liên kết bên ngoài vào bảng điều khiển",
"LINKS_ADD_SUCCESS": "Liên kết được thêm thành công",
"LINKS_ADD_TITLE": "Thêm liên kết ngoài",
"LINKS_DELETE_CONTEXT_MENU": "Xóa",
"LINKS_DELETE_SUBMIT": "Xóa",
"LINKS_DELETE_SUBTITLE": "Bạn có chắc chắn muốn xóa liên kết bên ngoài này không?",
"LINKS_DELETE_SUCCESS": "Xóa liên kết thành công",
"LINKS_DELETE_TITLE": "Xóa liên kết bên ngoài",
"LINKS_EDIT_CONTEXT_MENU": "Chỉnh sửa",
"LINKS_EDIT_SUBMIT": "Lưu",
"LINKS_EDIT_SUCCESS": "Sửa liên kết thành công",
"LINKS_EDIT_TITLE": "Sửa liên kết",
"LINKS_FORM_ICON_PLACEHOLDER": "Liên kết logo",
"LINKS_FORM_ICON_URL": "URL biểu tượng",
"LINKS_FORM_LINK_TITLE": "Liên kết tiêu đề",
"LINKS_FORM_LINK_URL": "Địa chỉ liên kết:",
"LINKS_FROM_LINK_DESCRIPTION": "Mô tả Liên kết",
"MY_APPS_DEPRECATED": "Ứng dụng này đã bị loại bỏ",
"MY_APPS_EMPTY_ACTION": "Đi đến Cửa hàng Ứng dụng",
"MY_APPS_EMPTY_SUBTITLE": "Cài đặt một ứng dụng từ Cửa hàng Ứng dụng để bắt đầu",
"MY_APPS_EMPTY_TITLE": "Không có ứng dụng nào được cài đặt",
"MY_APPS_TITLE": "Ứng dụng của tôi",
"MY_APPS_UPDATE_ALL_FORM_SUBMIT": "Cập nhật tất cả",
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_1": "Do you want to update all your apps to the latest version?",
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_2": "This will update all your apps to the latest version. Make sure you've read the release notes of the apps and you've backed up your app data.",
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_1": "Bạn có muốn cập nhật tất cả ứng dụng của mình lên phiên bản mới nhất?",
"MY_APPS_UPDATE_ALL_FORM_SUBTITLE_2": "Điều này sẽ cập nhật tất cả ứng dụng của bạn lên phiên bản mới nhất. Hãy chắc chắn bạn đã đọc ghi chú phát hành của ứng dụng và đã sao lưu dữ liệu ứng dụng của bạn.",
"MY_APPS_UPDATE_ALL_FORM_TITLE": "Cập nhật tất cả ứng dụng",
"MY_APPS_UPDATE_ALL_IN_PROGRESS": "Đang cập nhật tất cả ứng dụng",
"MY_APPS_UPDATE_AVAILABLE": "Đã có bản cập nhật",
@ -231,18 +238,18 @@
"SETTINGS_ACTIONS_STAY_UP_TO_DATE": "Luôn được cập nhật phiên bản mới nhất của Tipi",
"SETTINGS_ACTIONS_TAB_TITLE": "Thao tác",
"SETTINGS_ACTIONS_TITLE": "Thao tác",
"SETTINGS_GENERAL_ALLOW_AUTO_THEMES": "Allow auto themes",
"SETTINGS_GENERAL_ALLOW_AUTO_THEMES_HINT": "Be surprised by themes that change automatically based on the time of the year.",
"SETTINGS_GENERAL_ALLOW_ERROR_MONITORING": "Allow anonymous error monitoring",
"SETTINGS_GENERAL_ALLOW_ERROR_MONITORING_HINT": "Error monitoring is used to track errors and improve Tipi. Keep this option enabled to help us improve Tipi.",
"SETTINGS_GENERAL_ALLOW_AUTO_THEMES": "Cho phép chủ đề tự động",
"SETTINGS_GENERAL_ALLOW_AUTO_THEMES_HINT": "Hãy ngạc nhiên bởi các chủ đề thay đổi tự động dựa trên thời gian trong năm.",
"SETTINGS_GENERAL_ALLOW_ERROR_MONITORING": "Cho phép theo dõi lỗi ẩn danh",
"SETTINGS_GENERAL_ALLOW_ERROR_MONITORING_HINT": "Theo dõi lỗi được sử dụng để theo dõi lỗi và cải thiện Tipi. Hãy giữ cho tùy chọn này được bật để giúp chúng tôi cải thiện Tipi.",
"SETTINGS_GENERAL_APPS_REPO": "Đường dẫn kho ứng dụng",
"SETTINGS_GENERAL_APPS_REPO_HINT": "Đường dẫn đến kho ứng dụng.",
"SETTINGS_GENERAL_DNS_IP": "Địa chỉ IP DNS",
"SETTINGS_GENERAL_DOMAIN_NAME": "Tên miền",
"SETTINGS_GENERAL_DOMAIN_NAME_HINT": "Hãy chắc chắn rằng tên miền này có chứa bản ghi A trỏ đến địa chỉ IP của bạn.",
"SETTINGS_GENERAL_DOWNLOAD_CERTIFICATE": "Tải chứng chỉ",
"SETTINGS_GENERAL_GUEST_DASHBOARD": "Enable guest dashboard",
"SETTINGS_GENERAL_GUEST_DASHBOARD_HINT": "This will allow non-authenticated users to see a limited dashboard and easily access the running apps on your instance.",
"SETTINGS_GENERAL_GUEST_DASHBOARD": "Kích hoạt bảng điều khiển khách",
"SETTINGS_GENERAL_GUEST_DASHBOARD_HINT": "Điều này sẽ cho phép người dùng chưa xác thực xem bảng điều khiển giới hạn và dễ dàng truy cập các ứng dụng đang chạy trên phiên bản của bạn.",
"SETTINGS_GENERAL_INTERNAL_IP": "Địa chỉ IP nội bộ",
"SETTINGS_GENERAL_INTERNAL_IP_HINT": "Địa chỉ IP máy chủ của bạn sẽ nhận gói tin.",
"SETTINGS_GENERAL_INVALID_DOMAIN": "Tên miền không hợp lệ",
@ -254,7 +261,7 @@
"SETTINGS_GENERAL_LOCAL_DOMAIN_HINT": "Tên miền để truy cập ứng dụng từ mạng nội bộ của bạn. Ứng dụng có thể được truy cập tại app-name.local-domain.",
"SETTINGS_GENERAL_SETTINGS_UPDATED": "Cài đặt đã được cập nhật. Khởi động lại máy chủ của bạn để áp dụng cài đặt mới.",
"SETTINGS_GENERAL_STORAGE_PATH": "Đường dẫn lưu trữ dữ liệu",
"SETTINGS_GENERAL_STORAGE_PATH_HINT": "Path to the storage directory. Make sure it is an absolute path and that it exists.",
"SETTINGS_GENERAL_STORAGE_PATH_HINT": "Đường dẫn đến thư mục lưu trữ dữ liệu. Hãy chắc rằng đó là đường dẫn tuyệt đối và đã tồn tại.",
"SETTINGS_GENERAL_SUBMIT": "Cập nhật cài đặt",
"SETTINGS_GENERAL_SUBTITLE": "Điều này sẽ thay đổi file setting.json của bạn. Hãy chắc chắn rằng bạn hiểu rõ mình đang làm gì trước khi thay đổi các giá trị này.",
"SETTINGS_GENERAL_TAB_TITLE": "Cài đặt",
@ -270,9 +277,9 @@
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_INVALID_USERNAME": "Phải là một địa chỉ email hợp lệ",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_NEW_USERNAME": "Tên đăng nhập mới",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_PASSWORD": "Mật khẩu",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_PASSWORD_NEEDED_HINT": "Your password is required to change your username.",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_PASSWORD_NEEDED_HINT": "Mật khẩu của bạn cần thiết để thay đổi tên người dùng của bạn.",
"SETTINGS_SECURITY_CHANGE_USERNAME_FORM_SUBMIT": "Thay đổi tên đăng nhập",
"SETTINGS_SECURITY_CHANGE_USERNAME_SUBTITLE": "Changing your username will log you out of all devices.",
"SETTINGS_SECURITY_CHANGE_USERNAME_SUBTITLE": "Thay đổi tên người dùng sẽ đăng xuất bạn khỏi tất cả các thiết bị.",
"SETTINGS_SECURITY_CHANGE_USERNAME_SUCCESS": "Tên đăng nhập thay đổi thành công",
"SETTINGS_SECURITY_CHANGE_USERNAME_TITLE": "Thay đổi tên đăng nhập",
"SETTINGS_SECURITY_DISABLE_2FA": "Tắt xác thực 2 bước",
@ -291,10 +298,11 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "Mật khẩu của bạn được yêu cầu khi muốn thay đổi cấu hình Xác thực 2 bước.",
"SETTINGS_SECURITY_SCAN_QR_CODE": "Quét mã QR này bằng ứng dụng xác thực của bạn.",
"SETTINGS_SECURITY_TAB_TITLE": "Bảo mật",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "Cài đặt",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "Không thể kiểm tra phiên bản mới nhất",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "Phiên bản hiện tại đã được cập nhật",
"SYSTEM_ERROR_DEMO_MODE_LIMIT": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one.",
"SYSTEM_ERROR_DEMO_MODE_LIMIT": "Chỉ có thể cài đặt 6 ứng dụng trong chế độ demo. Vui lòng gỡ bỏ một ứng dụng khác để cài đặt một ứng dụng mới.",
"SYSTEM_ERROR_MAJOR_VERSION_UPDATE": "Ứng dụng được cập nhật phiên bản lớn. Vui lòng cập nhật thủ công (hướng dẫn được tim thấy ở GitHub)",
"SYSTEM_ERROR_YOU_MUST_BE_LOGGED_IN": "You must be logged in to perform this action"
"SYSTEM_ERROR_YOU_MUST_BE_LOGGED_IN": "Bạn phải đăng nhập để thực hiện hành động này"
}

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "安装",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "更新",
"APP_INSTALL_FORM_TITLE": "安装 {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "应用 {id} 安装成功",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "重置",
"APP_RESET_FORM_SUBTITLE": "此应用的所有数据将丢失。",
"APP_RESET_FORM_TITLE": "确认重置 {name}",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "注册您的账户",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "返回登录界面",
"AUTH_RESET_PASSWORD_CANCEL": "取消密码更改请求",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "在您的服务器上运行此命令,然后刷新此页",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "重置密码",
"AUTH_RESET_PASSWORD_SUCCESS": "您的密码已重置。您现在可以使用您的新密码登录。您的电子邮件 {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "密码重置",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "更改双重身份验证设置需要您的密码。",
"SETTINGS_SECURITY_SCAN_QR_CODE": "使用验证器应用扫描这个二维码",
"SETTINGS_SECURITY_TAB_TITLE": "安全",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "设置",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "无法获取最新版本",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "当前版本已经是最新版本",

View File

@ -76,7 +76,14 @@
"APP_INSTALL_FORM_SUBMIT_INSTALL": "安裝",
"APP_INSTALL_FORM_SUBMIT_UPDATE": "更新",
"APP_INSTALL_FORM_TITLE": "安裝 {name}",
"APP_INSTALL_FORM_GENERAL": "General",
"APP_INSTALL_FORM_REVERSE_PROXY": "Reverse proxy",
"APP_INSTALL_SUCCESS": "App {id} installed successfully",
"APP_LOGS_TAB_FOLLOW": "Follow logs",
"APP_LOGS_TAB_MAX_LINES": "Max lines:",
"APP_LOGS_TAB_TITLE": "Logs",
"APP_LOGS_TAB_WRAP_LINES": "Wrap lines",
"APP_NEW": "NEW",
"APP_RESET_FORM_SUBMIT": "Reset",
"APP_RESET_FORM_SUBTITLE": "此應用程序的所有數據都將丟失。",
"APP_RESET_FORM_TITLE": "Reset {name} ?",
@ -157,7 +164,7 @@
"AUTH_REGISTER_TITLE": "註冊您的帳戶",
"AUTH_RESET_PASSWORD_BACK_TO_LOGIN": "返回登入",
"AUTH_RESET_PASSWORD_CANCEL": "取消密碼更改請求",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "在您的服務器上運行此命令,然後刷新此頁面",
"AUTH_RESET_PASSWORD_INSTRUCTIONS": "To get started, run this command on your server and then refresh this page. If you have previously done so, the password reset request may have expired. In that case please retry",
"AUTH_RESET_PASSWORD_SUBMIT": "密碼重置",
"AUTH_RESET_PASSWORD_SUCCESS": "您的密碼已重置。 您現在可以使用新密碼登錄。 還有你的電子郵件 {email}",
"AUTH_RESET_PASSWORD_SUCCESS_TITLE": "重置密碼",
@ -291,6 +298,7 @@
"SETTINGS_SECURITY_PASSWORD_NEEDED_HINT": "需要您的密碼才能更改雙因素身份驗證設置",
"SETTINGS_SECURITY_SCAN_QR_CODE": "使用您的驗證器程式掃描此 QR Code",
"SETTINGS_SECURITY_TAB_TITLE": "安全性",
"SETTINGS_LOGS_TAB_TITLE": "Logs",
"SETTINGS_TITLE": "設定",
"SYSTEM_ERROR_COULD_NOT_GET_LATEST_VERSION": "無法檢查最新版本",
"SYSTEM_ERROR_CURRENT_VERSION_IS_LATEST": "當前版本已經是最新的",

View File

@ -15,6 +15,8 @@ const APP_LOCALES = {
'vi-VN': 'Tiếng Việt',
'zh-CN': '简体中文',
'zh-TW': '繁體中文',
'pt-PT': 'Português',
'pt-BR': 'Português (Brasil)',
} as const;
type BaseLang<T extends string> = T extends `${infer U}-${string}` ? U : T; // 'en-US' -> 'en'
@ -28,6 +30,7 @@ const FALLBACK_LOCALES: { from: BaseLang<keyof typeof APP_LOCALES>; to: keyof ty
{ from: 'it', to: 'it-IT' },
{ from: 'ja', to: 'ja-JP' },
{ from: 'pl', to: 'pl-PL' },
{ from: 'pt', to: 'pt-PT' },
{ from: 'sv', to: 'sv-SE' },
{ from: 'ro', to: 'ro-RO' },
{ from: 'ru', to: 'ru-RU' },