Compare commits

...

48 Commits

Author SHA1 Message Date
Elias Schneider
3d1656688e release: 1.12.0 2025-05-07 16:11:30 +02:00
Elias Schneider
e53a25750d chore: sync package-lock.json 2025-05-07 16:09:45 +02:00
Elias Schneider
ffcd857d9a Merge remote-tracking branch 'origin/main' 2025-05-07 14:10:55 +02:00
Elias Schneider
48a6ceb3b4 fix: OIDC configuration from YAML configuration file doesn't get loaded 2025-05-07 14:10:48 +02:00
Elias Schneider
84833e5f91 chore(translations): update translations via Crowdin (#828)
* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Danish)

* New translations en-us.ts (German)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Serbian (Cyrillic))

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (Chinese Traditional)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Serbian (Latin))

* New translations en-us.ts (Dutch, Belgium)

* New translations en-us.ts (Arabic, Egypt)

* New translations en-us.ts (French)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Japanese)
2025-05-07 13:39:29 +02:00
Elias Schneider
1864951bdb fix: use sandbox CSP for file previews 2025-05-07 13:39:02 +02:00
Elias Schneider
427e99c7b1 fix: disable HTML rendering in Markdown preview 2025-05-07 13:38:42 +02:00
Lucas Reis
ccc783ab6a feat(s3): stream s3 content over a zip file (#822)
* chore: update package.json and enhance file handling in backend

* refactor: remove StreamResponseFilter and update getZip method for improved file handling

- Deleted StreamResponseFilter as it was no longer needed.
- Updated getZip method in LocalFileService to return a Promise and handle errors more effectively.
- Adjusted getZip method in FileService to await the storage service's getZip call.

* refactor: remove unused UseFilters import in file.controller.ts
2025-05-04 20:37:04 +02:00
Elias Schneider
853f217bf1 chore(translations): update translations via Crowdin (#826)
* New translations en-us.ts (Polish)

* New translations en-us.ts (Polish)
2025-05-04 20:35:26 +02:00
Pranav
af047c0bc1 fix: spelling mistake and add clarity in email template (#824)
* fix: Fix spelling mistake

Change "in a hour" to "in an hour" in
config.example.yaml and config.seed.ts

* fix: Add clarity in email template

Change shareRecipientsMessage
template by splitting the call to
action part of sentence to make
the language more clear.
2025-04-29 08:34:47 +02:00
Elias Schneider
8ddee32664 chore(translations): update translations via Crowdin (#807)
* New translations en-us.ts (Italian)

* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (German)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Thai)
2025-04-23 08:58:02 +02:00
Elias Schneider
e7128dcfef chore: dump newman version 2025-04-23 08:56:09 +02:00
Elias Schneider
56d8517073 ci/cd: dump nodejs version in action 2025-04-23 08:52:36 +02:00
Elias Schneider
df4341163a chore: upgrade to nodejs 22 2025-04-23 08:33:00 +02:00
Elias Schneider
81547ba1e0 ci/cd: set timeout for workflows 2025-04-23 08:32:05 +02:00
Marvin A. Ruder
a790ac73fd fix: health check for containers with reverse proxy disabled (#816)
* Fixes #809

Signed-off-by: Marvin A. Ruder <signed@mruder.dev>
2025-04-18 18:43:11 +02:00
Elias Schneider
3fd689a760 docs: update example config 2025-04-17 19:16:18 +02:00
Elias Schneider
6a8ac1aa65 chore: upgrade backend dependencies 2025-04-14 15:13:55 +02:00
Elias Schneider
4d1ce8aa49 release: 1.11.1 2025-04-06 20:38:29 +02:00
Elias Schneider
71eab23503 chore: dump package versions 2025-04-05 16:58:15 +02:00
Elias Schneider
2943073c10 release: 1.11.0 2025-04-05 16:55:22 +02:00
Zyanido
27fca64a69 feat: add env variable to disable caddy (#797) 2025-04-05 16:45:55 +02:00
Elias Schneider
7d005db4e1 chore(translations): update translations via Crowdin (#794)
* New translations en-us.ts (German)

* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Dutch, Belgium)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Danish)

* New translations en-us.ts (German)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Serbian (Cyrillic))

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Chinese Traditional)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Thai)

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Serbian (Latin))

* New translations en-us.ts (Dutch, Belgium)

* New translations en-us.ts (Arabic, Egypt)
2025-04-04 15:48:31 +02:00
marekhanzlik
73a76a9d5b feat(s3): allow disabling upload checksum (#804)
* S3 - toggle useChecksum

* Update frontend/src/i18n/translations/en-US.ts

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2025-04-04 14:59:09 +02:00
Elias Schneider
8e828311fe Update Crowdin configuration file 2025-03-20 20:20:14 +01:00
Elias Schneider
b7410d8589 Update Crowdin configuration file 2025-03-20 20:17:47 +01:00
Elias Schneider
5cfa8f3015 release: 1.10.4 2025-03-20 19:55:25 +01:00
Elias Schneider
ccb7fdca43 fix: admin role gets reset if signing in with an OIDC provider 2025-03-20 19:55:13 +01:00
Elias Schneider
ac81cb9ab7 release: 1.10.3 2025-03-10 21:36:16 +01:00
Elias Schneider
b737cba35e fix: error while signing in with OIDC if roles claim is undefined 2025-03-10 14:23:04 +01:00
Gustav Mårdestam
1d51973358 ci/cd: update build action and add labels to image (#781) 2025-03-07 14:50:37 +01:00
Elias Schneider
589127e943 chore(translations): update translations via Crowdin (#779)
* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Danish)

* New translations en-us.ts (German)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Serbian (Cyrillic))

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Chinese Traditional)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Thai)

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Serbian (Latin))

* New translations en-us.ts (Dutch, Belgium)

* New translations en-us.ts (Arabic, Egypt)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Spanish)
2025-03-07 14:47:18 +01:00
Elias Schneider
6722938ae6 release: 1.10.2 2025-03-07 14:47:03 +01:00
Elias Schneider
9f720388ef Merge branch 'main' of https://github.com/stonith404/pingvin-share 2025-03-07 14:38:37 +01:00
Elias Schneider
e7b3c48ff4 fix: don't throw error if group claim is missing 2025-03-07 14:38:33 +01:00
Elias Schneider
0dfd4d014d chore: upgrade prisma and aws CLI 2025-03-07 14:33:11 +01:00
Alexander Lehmann
ce0dc976a8 chore(translations): fix typo (#782)
1 char small typo in the English text
2025-03-03 16:13:03 +01:00
Elias Schneider
61418a1d8d release: 1.10.1 2025-02-28 13:33:49 +01:00
Elias Schneider
1159d972a8 fix: admin property can't be set if OAuth2 user email doesn't match actual user's email 2025-02-28 13:32:31 +01:00
Elias Schneider
b6d1720fe6 fix: type error when trying to run the seed command 2025-02-28 13:30:20 +01:00
Elias Schneider
dc30f4f3c9 refactor: run formatter 2025-02-28 11:18:10 +01:00
Elias Schneider
e77edfd5d3 release: 1.10.0 2025-02-28 11:05:19 +01:00
Elias Schneider
e848675d63 fix: page crash if new release check fails 2025-02-28 11:05:07 +01:00
Elias Schneider
5e2d44b423 chore(translations): update translations via Crowdin (#776)
* New translations en-us.ts (Estonian)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Danish)

* New translations en-us.ts (German)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Serbian (Cyrillic))

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Chinese Traditional)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Thai)

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Serbian (Latin))

* New translations en-us.ts (Dutch, Belgium)

* New translations en-us.ts (Arabic, Egypt)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (French)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Chinese Simplified)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Danish)

* New translations en-us.ts (German)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Serbian (Cyrillic))

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Chinese Traditional)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Thai)

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Serbian (Latin))

* New translations en-us.ts (Dutch, Belgium)

* New translations en-us.ts (Arabic, Egypt)
2025-02-28 11:03:43 +01:00
Mattia Müggler
9dfb52a145 feat: add ability to configure application with a config file (#740)
* add config file possibility

* revert port in docker compose

* Update docker-compose.yml

Co-authored-by: Elias Schneider <login@eliasschneider.com>

* Update docker-compose.yml

Co-authored-by: Elias Schneider <login@eliasschneider.com>

* add attribute description to config file

* remove email message config

* add package to resolve errors

* remove email messages from config

* move config initialization to config module

* revert unnecessary change

* add order

* improve alert

* run formatter

* remove unnecessary packages

* remove unnecessary types

* use logger

* don't save yaml config to db

* allowEdit if no yaml config is set

* improve docs

* fix allow edit state

* remove unnecessary check and refactor code

* restore old config file

* add script that generates `config.example.yaml` automatically

* allow config variables to be changed if they are not set in the `config.yml`

* add back init user

* Revert "allow config variables to be changed if they are not set in the `config.yml`"

This reverts commit 7dbdb6729034be5b083f126f854d5e1411735a54.

* improve info box text

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2025-02-28 11:01:54 +01:00
Elias Schneider
f4291421b5 fix: smtp password gets autofilled in Firefox 2025-02-26 13:32:59 +01:00
Elias Schneider
28fdbc2281 fix: confusing config configuration description for session duration 2025-02-26 12:28:04 +01:00
Elias Schneider
2f74c87d0b chore(translations): update translations via Crowdin (#773)
* New translations en-us.ts (Estonian)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Estonian)

* New translations en-us.ts (Chinese Simplified)
2025-02-26 12:25:56 +01:00
71 changed files with 5996 additions and 4168 deletions

View File

@@ -10,8 +10,9 @@ on:
jobs: jobs:
system-tests: system-tests:
timeout-minutes: 15
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: node:18 container: node:22
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Install Dependencies - name: Install Dependencies

View File

@@ -6,6 +6,7 @@ on:
jobs: jobs:
build: build:
timeout-minutes: 60
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: checkout code - name: checkout code
@@ -30,7 +31,7 @@ jobs:
uses: docker/setup-buildx-action@v2 uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub - name: Login to Docker Hub
uses: docker/login-action@v2 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKER_USERNAME }} username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }} password: ${{ secrets.DOCKER_PASSWORD }}
@@ -43,11 +44,12 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v4 uses: docker/build-push-action@v6
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
push: true push: true
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha cache-from: type=gha
cache-to: type=gha,mode=max cache-to: type=gha,mode=max

1
.gitignore vendored
View File

@@ -44,6 +44,7 @@ yarn-error.log*
/docs/build/ /docs/build/
/docs/.docusaurus /docs/.docusaurus
/docs/.cache-loader /docs/.cache-loader
/config.yaml
# Jetbrains specific (webstorm) # Jetbrains specific (webstorm)
.idea/**/** .idea/**/**

View File

@@ -1,3 +1,72 @@
## [1.12.0](https://github.com/stonith404/pingvin-share/compare/v1.11.1...v1.12.0) (2025-05-07)
### Features
* **s3:** stream s3 content over a zip file ([#822](https://github.com/stonith404/pingvin-share/issues/822)) ([ccc783a](https://github.com/stonith404/pingvin-share/commit/ccc783ab6a00841a7041c454e77afb472d76999e))
### Bug Fixes
* disable HTML rendering in Markdown preview ([427e99c](https://github.com/stonith404/pingvin-share/commit/427e99c7b1d00ff6ed7b5fd879d8cf0f0d49281a))
* health check for containers with reverse proxy disabled ([#816](https://github.com/stonith404/pingvin-share/issues/816)) ([a790ac7](https://github.com/stonith404/pingvin-share/commit/a790ac73fd42d266a957e09a05b1894199605f6a)), closes [#809](https://github.com/stonith404/pingvin-share/issues/809)
* OIDC configuration from YAML configuration file doesn't get loaded ([48a6ceb](https://github.com/stonith404/pingvin-share/commit/48a6ceb3b4b4dfc0407dc6f9ee2e07cca1829cef))
* spelling mistake and add clarity in email template ([#824](https://github.com/stonith404/pingvin-share/issues/824)) ([af047c0](https://github.com/stonith404/pingvin-share/commit/af047c0bc152a955b3ab135f5a9ea3d62b32fb0f))
* use sandbox CSP for file previews ([1864951](https://github.com/stonith404/pingvin-share/commit/1864951bdbf573431e795109224a45545b86b54d))
## [1.11.1](https://github.com/stonith404/pingvin-share/compare/v1.11.0...v1.11.1) (2025-04-06)
## [1.11.0](https://github.com/stonith404/pingvin-share/compare/v1.10.4...v1.11.0) (2025-04-05)
### Features
* add env variable to disable caddy ([#797](https://github.com/stonith404/pingvin-share/issues/797)) ([27fca64](https://github.com/stonith404/pingvin-share/commit/27fca64a69067eaa094d1559ca1fee4f064d89a7))
* **s3:** allow disabling upload checksum ([#804](https://github.com/stonith404/pingvin-share/issues/804)) ([73a76a9](https://github.com/stonith404/pingvin-share/commit/73a76a9d5b9825a3dc396f49d76ddc5c303fce40))
## [1.10.4](https://github.com/stonith404/pingvin-share/compare/v1.10.3...v1.10.4) (2025-03-20)
### Bug Fixes
* admin role gets reset if signing in with an OIDC provider ([ccb7fdc](https://github.com/stonith404/pingvin-share/commit/ccb7fdca43a2d458243e56a24510fe5325fa7942))
## [1.10.3](https://github.com/stonith404/pingvin-share/compare/v1.10.2...v1.10.3) (2025-03-10)
### Bug Fixes
* error while signing in with OIDC if roles claim is undefined ([b737cba](https://github.com/stonith404/pingvin-share/commit/b737cba35e59255904eccae9e9de1cbd36284fb1))
## [1.10.2](https://github.com/stonith404/pingvin-share/compare/v1.10.1...v1.10.2) (2025-03-07)
### Bug Fixes
* don't throw error if group claim is missing ([e7b3c48](https://github.com/stonith404/pingvin-share/commit/e7b3c48ff48bd7cfb206c32ea97862b757057573))
## [1.10.1](https://github.com/stonith404/pingvin-share/compare/v1.10.0...v1.10.1) (2025-02-28)
### Bug Fixes
* admin property can't be set if OAuth2 user email doesn't match actual user's email ([1159d97](https://github.com/stonith404/pingvin-share/commit/1159d972a8c32a0d6bf53d161c2fc09e6f8dfb28))
* type error when trying to run the seed command ([b6d1720](https://github.com/stonith404/pingvin-share/commit/b6d1720fe637497ad624c6cdc40058b1b0f0c74c))
## [1.10.0](https://github.com/stonith404/pingvin-share/compare/v1.9.1...v1.10.0) (2025-02-28)
### Features
* add ability to configure application with a config file ([#740](https://github.com/stonith404/pingvin-share/issues/740)) ([9dfb52a](https://github.com/stonith404/pingvin-share/commit/9dfb52a14587065dacd9fcd2bb2efa1b458880a5))
### Bug Fixes
* confusing config configuration description for session duration ([28fdbc2](https://github.com/stonith404/pingvin-share/commit/28fdbc22814260040c78e27a62d86b84df83751f))
* page crash if new release check fails ([e848675](https://github.com/stonith404/pingvin-share/commit/e848675d634a08efe3aac4e02d98136c36b36bfc))
* smtp password gets autofilled in Firefox ([f429142](https://github.com/stonith404/pingvin-share/commit/f4291421b5531b0eeae5bcca9139f80c3cd43b4b))
## [1.9.1](https://github.com/stonith404/pingvin-share/compare/v1.9.0...v1.9.1) (2025-02-14) ## [1.9.1](https://github.com/stonith404/pingvin-share/compare/v1.9.0...v1.9.1) (2025-02-14)

View File

@@ -1,25 +1,25 @@
# Stage 1: Frontend dependencies # Stage 1: Frontend dependencies
FROM node:20-alpine AS frontend-dependencies FROM node:22-alpine AS frontend-dependencies
WORKDIR /opt/app WORKDIR /opt/app
COPY frontend/package.json frontend/package-lock.json ./ COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci RUN npm ci
# Stage 2: Build frontend # Stage 2: Build frontend
FROM node:20-alpine AS frontend-builder FROM node:22-alpine AS frontend-builder
WORKDIR /opt/app WORKDIR /opt/app
COPY ./frontend . COPY ./frontend .
COPY --from=frontend-dependencies /opt/app/node_modules ./node_modules COPY --from=frontend-dependencies /opt/app/node_modules ./node_modules
RUN npm run build RUN npm run build
# Stage 3: Backend dependencies # Stage 3: Backend dependencies
FROM node:20-alpine AS backend-dependencies FROM node:22-alpine AS backend-dependencies
RUN apk add --no-cache python3 RUN apk add --no-cache python3
WORKDIR /opt/app WORKDIR /opt/app
COPY backend/package.json backend/package-lock.json ./ COPY backend/package.json backend/package-lock.json ./
RUN npm ci RUN npm ci
# Stage 4: Build backend # Stage 4: Build backend
FROM node:20-alpine AS backend-builder FROM node:22-alpine AS backend-builder
RUN apk add openssl RUN apk add openssl
WORKDIR /opt/app WORKDIR /opt/app
@@ -29,7 +29,7 @@ RUN npx prisma generate
RUN npm run build && npm prune --production RUN npm run build && npm prune --production
# Stage 5: Final image # Stage 5: Final image
FROM node:20-alpine AS runner FROM node:22-alpine AS runner
ENV NODE_ENV=docker ENV NODE_ENV=docker
# Delete default node user # Delete default node user
@@ -50,15 +50,16 @@ COPY --from=backend-builder /opt/app/node_modules ./node_modules
COPY --from=backend-builder /opt/app/dist ./dist COPY --from=backend-builder /opt/app/dist ./dist
COPY --from=backend-builder /opt/app/prisma ./prisma COPY --from=backend-builder /opt/app/prisma ./prisma
COPY --from=backend-builder /opt/app/package.json ./ COPY --from=backend-builder /opt/app/package.json ./
COPY --from=backend-builder /opt/app/tsconfig.json ./
WORKDIR /opt/app WORKDIR /opt/app
COPY ./reverse-proxy /opt/app/reverse-proxy COPY ./reverse-proxy /opt/app/reverse-proxy
COPY ./scripts ./scripts COPY ./scripts/docker ./scripts/docker
EXPOSE 3000 EXPOSE 3000
HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://localhost:3000/api/health || exit 1 HEALTHCHECK --interval=10s --timeout=3s CMD /bin/sh -c '(if [[ "$CADDY_DISABLED" = "true" ]]; then curl -fs http://localhost:${BACKEND_PORT:-8080}/api/health; else curl -fs http://localhost:3000/api/health; fi) || exit 1'
ENTRYPOINT ["sh", "./scripts/docker/create-user.sh"] ENTRYPOINT ["sh", "./scripts/docker/create-user.sh"]
CMD ["sh", "./scripts/docker/entrypoint.sh"] CMD ["sh", "./scripts/docker/entrypoint.sh"]

View File

@@ -16,6 +16,7 @@ Pingvin Share is a self-hosted file sharing platform and an alternative for WeTr
- Reverse shares - Reverse shares
- OIDC and LDAP authentication - OIDC and LDAP authentication
- Integration with ClamAV for security scans - Integration with ClamAV for security scans
- Different file providers: local storage and S3
## 🐧 Get to know Pingvin Share ## 🐧 Get to know Pingvin Share

6890
backend/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "pingvin-share-backend", "name": "pingvin-share-backend",
"version": "1.9.1", "version": "1.12.0",
"scripts": { "scripts": {
"build": "nest build", "build": "nest build",
"dev": "cross-env NODE_ENV=development nest start --watch", "dev": "cross-env NODE_ENV=development nest start --watch",
@@ -13,34 +13,34 @@
"seed": "ts-node prisma/seed/config.seed.ts" "seed": "ts-node prisma/seed/config.seed.ts"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.679.0", "@aws-sdk/client-s3": "^3.787.0",
"@nestjs/cache-manager": "^2.2.2", "@nestjs/cache-manager": "^3.0.1",
"@nestjs/common": "^10.4.3", "@nestjs/common": "^11.0.17",
"@nestjs/config": "^3.2.3", "@nestjs/config": "^4.0.2",
"@nestjs/core": "^10.4.3", "@nestjs/core": "^11.0.17",
"@nestjs/jwt": "^10.2.0", "@nestjs/jwt": "^11.0.0",
"@nestjs/passport": "^10.0.3", "@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^10.4.3", "@nestjs/platform-express": "^11.0.17",
"@nestjs/schedule": "^4.1.1", "@nestjs/schedule": "^5.0.1",
"@nestjs/swagger": "^7.4.2", "@nestjs/swagger": "^11.1.3",
"@nestjs/throttler": "^6.2.1", "@nestjs/throttler": "^6.4.0",
"@prisma/client": "^5.19.1", "@prisma/client": "^6.6.0",
"@types/jmespath": "^0.15.2", "@types/jmespath": "^0.15.2",
"archiver": "^7.0.1", "archiver": "^7.0.1",
"argon2": "^0.41.1", "argon2": "^0.41.1",
"body-parser": "^1.20.3", "body-parser": "^2.2.0",
"cache-manager": "^5.7.6", "cache-manager": "^6.4.2",
"clamscan": "^2.3.1", "clamscan": "^2.4.0",
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"class-validator": "^0.14.1", "class-validator": "^0.14.1",
"content-disposition": "^0.5.4", "content-disposition": "^0.5.4",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.7",
"jmespath": "^0.16.0", "jmespath": "^0.16.0",
"ldapts": "^7.2.0", "ldapts": "^7.4.0",
"mime-types": "^2.1.35", "mime-types": "^3.0.1",
"moment": "^2.30.1", "moment": "^2.30.1",
"nanoid": "^3.3.7", "nanoid": "^3.3.7",
"nodemailer": "^6.9.15", "nodemailer": "^6.10.1",
"otplib": "^12.0.1", "otplib": "^12.0.1",
"passport": "^0.7.0", "passport": "^0.7.0",
"passport-jwt": "^4.0.1", "passport-jwt": "^4.0.1",
@@ -48,41 +48,43 @@
"qrcode-svg": "^1.1.0", "qrcode-svg": "^1.1.0",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"rxjs": "^7.8.1", "rxjs": "^7.8.2",
"sharp": "^0.33.5", "sharp": "^0.34.1",
"ts-node": "^10.9.2" "ts-node": "^10.9.2",
"uuid": "^11.1.0",
"yaml": "^2.7.1"
}, },
"devDependencies": { "devDependencies": {
"@nestjs/cli": "^10.4.5", "@nestjs/cli": "^11.0.6",
"@nestjs/schematics": "^10.1.4", "@nestjs/schematics": "^11.0.5",
"@nestjs/testing": "^10.4.3", "@nestjs/testing": "^11.0.17",
"@types/archiver": "^6.0.2", "@types/archiver": "^6.0.3",
"@types/clamscan": "^2.0.8", "@types/clamscan": "^2.4.1",
"@types/cookie-parser": "^1.4.7", "@types/cookie-parser": "^1.4.8",
"@types/cron": "^2.4.0", "@types/cron": "^2.4.0",
"@types/express": "^4.17.21", "@types/express": "^5.0.1",
"@types/mime-types": "^2.1.4", "@types/mime-types": "^2.1.4",
"@types/multer": "^1.4.12", "@types/multer": "^1.4.12",
"@types/node": "^22.5.5", "@types/node": "^22.14.1",
"@types/nodemailer": "^6.4.16", "@types/nodemailer": "^6.4.17",
"@types/passport-jwt": "^4.0.1", "@types/passport-jwt": "^4.0.1",
"@types/qrcode-svg": "^1.1.5", "@types/qrcode-svg": "^1.1.5",
"@types/sharp": "^0.32.0", "@types/sharp": "^0.32.0",
"@types/supertest": "^6.0.2", "@types/supertest": "^6.0.3",
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^8.6.0", "@typescript-eslint/eslint-plugin": "^8.29.1",
"@typescript-eslint/parser": "^8.6.0", "@typescript-eslint/parser": "^8.29.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"eslint": "^9.10.0", "eslint": "^9.24.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^10.1.2",
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.6",
"newman": "^6.2.1", "newman": "^6.2.1",
"prettier": "^3.3.3", "prettier": "^3.5.3",
"prisma": "^5.19.1", "prisma": "^6.6.0",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"ts-loader": "^9.5.1", "ts-loader": "^9.5.2",
"tsconfig-paths": "4.2.0", "tsconfig-paths": "4.2.0",
"typescript": "^5.6.2", "typescript": "^5.8.3",
"wait-on": "^8.0.1" "wait-on": "^8.0.3"
} }
} }

View File

@@ -1,7 +1,7 @@
import { Prisma, PrismaClient } from "@prisma/client"; import { Prisma, PrismaClient } from "@prisma/client";
import * as crypto from "crypto"; import * as crypto from "crypto";
const configVariables: ConfigVariables = { export const configVariables = {
internal: { internal: {
jwtSecret: { jwtSecret: {
type: "string", type: "string",
@@ -89,7 +89,7 @@ const configVariables: ConfigVariables = {
shareRecipientsMessage: { shareRecipientsMessage: {
type: "text", type: "text",
defaultValue: defaultValue:
"Hey!\n\n{creator} ({creatorEmail}) shared some files with you, view or download the files with this link: {shareUrl}\n\nThe share will expire {expires}.\n\nNote: {desc}\n\nShared securely with Pingvin Share 🐧", "Hey!\n\n{creator} ({creatorEmail}) shared some files with you. You can view or download the files with this link: {shareUrl}\n\nThe share will expire {expires}.\n\nNote: {desc}\n\nShared securely with Pingvin Share 🐧",
}, },
reverseShareSubject: { reverseShareSubject: {
type: "string", type: "string",
@@ -107,7 +107,7 @@ const configVariables: ConfigVariables = {
resetPasswordMessage: { resetPasswordMessage: {
type: "text", type: "text",
defaultValue: defaultValue:
"Hey!\n\nYou requested a password reset. Click this link to reset your password: {url}\nThe link expires in a hour.\n\nPingvin Share 🐧", "Hey!\n\nYou requested a password reset. Click this link to reset your password: {url}\nThe link expires in an hour.\n\nPingvin Share 🐧",
}, },
inviteSubject: { inviteSubject: {
type: "string", type: "string",
@@ -181,12 +181,12 @@ const configVariables: ConfigVariables = {
}, },
searchQuery: { searchQuery: {
type: "string", type: "string",
defaultValue: "" defaultValue: "",
}, },
adminGroups: { adminGroups: {
type: "string", type: "string",
defaultValue: "" defaultValue: "",
}, },
fieldNameMemberOf: { fieldNameMemberOf: {
@@ -196,18 +196,18 @@ const configVariables: ConfigVariables = {
fieldNameEmail: { fieldNameEmail: {
type: "string", type: "string",
defaultValue: "userPrincipalName", defaultValue: "userPrincipalName",
} },
}, },
oauth: { oauth: {
"allowRegistration": { allowRegistration: {
type: "boolean", type: "boolean",
defaultValue: "true", defaultValue: "true",
}, },
"ignoreTotp": { ignoreTotp: {
type: "boolean", type: "boolean",
defaultValue: "true", defaultValue: "true",
}, },
"disablePassword": { disablePassword: {
type: "boolean", type: "boolean",
defaultValue: "false", defaultValue: "false",
secret: false, secret: false,
@@ -349,6 +349,10 @@ const configVariables: ConfigVariables = {
defaultValue: "", defaultValue: "",
obscured: true, obscured: true,
}, },
useChecksum: {
type: "boolean",
defaultValue: "true",
},
}, },
legal: { legal: {
enabled: { enabled: {
@@ -376,7 +380,22 @@ const configVariables: ConfigVariables = {
defaultValue: "", defaultValue: "",
secret: false, secret: false,
}, },
} },
} satisfies ConfigVariables;
export type YamlConfig = {
[Category in keyof typeof configVariables]: {
[Key in keyof (typeof configVariables)[Category]]: string;
};
} & {
initUser: {
enabled: string;
username: string;
email: string;
password: string;
isAdmin: boolean;
ldapDN: string;
};
}; };
type ConfigVariables = { type ConfigVariables = {
@@ -433,7 +452,7 @@ async function migrateConfigVariables() {
for (const existingConfigVariable of existingConfigVariables) { for (const existingConfigVariable of existingConfigVariables) {
const configVariable = const configVariable =
configVariables[existingConfigVariable.category]?.[ configVariables[existingConfigVariable.category]?.[
existingConfigVariable.name existingConfigVariable.name
]; ];
// Delete the config variable if it doesn't exist in the seed // Delete the config variable if it doesn't exist in the seed

View File

@@ -20,12 +20,12 @@ import { UserModule } from "./user/user.module";
@Module({ @Module({
imports: [ imports: [
ConfigModule,
AuthModule, AuthModule,
ShareModule, ShareModule,
FileModule, FileModule,
EmailModule, EmailModule,
PrismaModule, PrismaModule,
ConfigModule,
JobsModule, JobsModule,
UserModule, UserModule,
ThrottlerModule.forRoot([ ThrottlerModule.forRoot([

View File

@@ -1,4 +1,5 @@
import { Global, Module } from "@nestjs/common"; import { Global, Module } from "@nestjs/common";
import { Config } from "@prisma/client";
import { EmailModule } from "src/email/email.module"; import { EmailModule } from "src/email/email.module";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { ConfigController } from "./config.controller"; import { ConfigController } from "./config.controller";
@@ -16,7 +17,15 @@ import { LogoService } from "./logo.service";
}, },
inject: [PrismaService], inject: [PrismaService],
}, },
ConfigService, {
provide: ConfigService,
useFactory: async (prisma: PrismaService, configVariables: Config[]) => {
const configService = new ConfigService(configVariables, prisma);
await configService.initialize();
return configService;
},
inject: [PrismaService, "CONFIG_VARIABLES"],
},
LogoService, LogoService,
], ],
controllers: [ConfigController], controllers: [ConfigController],

View File

@@ -2,12 +2,17 @@ import {
BadRequestException, BadRequestException,
Inject, Inject,
Injectable, Injectable,
Logger,
NotFoundException, NotFoundException,
} from "@nestjs/common"; } from "@nestjs/common";
import { Config } from "@prisma/client"; import { Config } from "@prisma/client";
import * as argon from "argon2";
import { EventEmitter } from "events"; import { EventEmitter } from "events";
import * as fs from "fs";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { stringToTimespan } from "src/utils/date.util"; import { stringToTimespan } from "src/utils/date.util";
import { parse as yamlParse } from "yaml";
import { YamlConfig } from "../../prisma/seed/config.seed";
/** /**
* ConfigService extends EventEmitter to allow listening for config updates, * ConfigService extends EventEmitter to allow listening for config updates,
@@ -15,6 +20,9 @@ import { stringToTimespan } from "src/utils/date.util";
*/ */
@Injectable() @Injectable()
export class ConfigService extends EventEmitter { export class ConfigService extends EventEmitter {
yamlConfig?: YamlConfig;
logger = new Logger(ConfigService.name);
constructor( constructor(
@Inject("CONFIG_VARIABLES") private configVariables: Config[], @Inject("CONFIG_VARIABLES") private configVariables: Config[],
private prisma: PrismaService, private prisma: PrismaService,
@@ -22,6 +30,67 @@ export class ConfigService extends EventEmitter {
super(); super();
} }
// Initialize gets called by the ConfigModule
async initialize() {
await this.loadYamlConfig();
if (this.yamlConfig) {
await this.migrateInitUser();
}
}
private async loadYamlConfig() {
let configFile: string = "";
try {
configFile = fs.readFileSync("../config.yaml", "utf8");
} catch (e) {
this.logger.log(
"Config.yaml is not set. Falling back to UI configuration.",
);
}
try {
this.yamlConfig = yamlParse(configFile);
if (this.yamlConfig) {
for (const configVariable of this.configVariables) {
const category = this.yamlConfig[configVariable.category];
if (!category) continue;
configVariable.value = category[configVariable.name];
this.emit("update", configVariable.name, configVariable.value);
}
}
} catch (e) {
this.logger.error(
"Failed to parse config.yaml. Falling back to UI configuration: ",
e,
);
}
}
private async migrateInitUser(): Promise<void> {
if (!this.yamlConfig.initUser.enabled) return;
const userCount = await this.prisma.user.count({
where: { isAdmin: true },
});
if (userCount === 1) {
this.logger.log(
"Skip initial user creation. Admin user is already existent.",
);
return;
}
await this.prisma.user.create({
data: {
email: this.yamlConfig.initUser.email,
username: this.yamlConfig.initUser.username,
password: this.yamlConfig.initUser.password
? await argon.hash(this.yamlConfig.initUser.password)
: null,
isAdmin: this.yamlConfig.initUser.isAdmin,
},
});
}
get(key: `${string}.${string}`): any { get(key: `${string}.${string}`): any {
const configVariable = this.configVariables.filter( const configVariable = this.configVariables.filter(
(variable) => `${variable.category}.${variable.name}` == key, (variable) => `${variable.category}.${variable.name}` == key,
@@ -40,24 +109,22 @@ export class ConfigService extends EventEmitter {
} }
async getByCategory(category: string) { async getByCategory(category: string) {
const configVariables = await this.prisma.config.findMany({ const configVariables = this.configVariables
orderBy: { order: "asc" }, .filter((c) => !c.locked && category == c.category)
where: { category, locked: { equals: false } }, .sort((c) => c.order);
});
return configVariables.map((variable) => { return configVariables.map((variable) => {
return { return {
...variable, ...variable,
key: `${variable.category}.${variable.name}`, key: `${variable.category}.${variable.name}`,
value: variable.value ?? variable.defaultValue, value: variable.value ?? variable.defaultValue,
allowEdit: this.isEditAllowed(),
}; };
}); });
} }
async list() { async list() {
const configVariables = await this.prisma.config.findMany({ const configVariables = this.configVariables.filter((c) => !c.secret);
where: { secret: { equals: false } },
});
return configVariables.map((variable) => { return configVariables.map((variable) => {
return { return {
@@ -69,6 +136,11 @@ export class ConfigService extends EventEmitter {
} }
async updateMany(data: { key: string; value: string | number | boolean }[]) { async updateMany(data: { key: string; value: string | number | boolean }[]) {
if (!this.isEditAllowed())
throw new BadRequestException(
"You are only allowed to update config variables via the config.yaml file",
);
const response: Config[] = []; const response: Config[] = [];
for (const variable of data) { for (const variable of data) {
@@ -79,6 +151,11 @@ export class ConfigService extends EventEmitter {
} }
async update(key: string, value: string | number | boolean) { async update(key: string, value: string | number | boolean) {
if (!this.isEditAllowed())
throw new BadRequestException(
"You are only allowed to update config variables via the config.yaml file",
);
const configVariable = await this.prisma.config.findUnique({ const configVariable = await this.prisma.config.findUnique({
where: { where: {
name_category: { name_category: {
@@ -143,4 +220,8 @@ export class ConfigService extends EventEmitter {
throw new BadRequestException(validation.message); throw new BadRequestException(validation.message);
} }
} }
isEditAllowed(): boolean {
return this.yamlConfig === undefined || this.yamlConfig === null;
}
} }

View File

@@ -17,6 +17,9 @@ export class AdminConfigDTO extends ConfigDTO {
@Expose() @Expose()
obscured: boolean; obscured: boolean;
@Expose()
allowEdit: boolean;
from(partial: Partial<AdminConfigDTO>) { from(partial: Partial<AdminConfigDTO>) {
return plainToClass(AdminConfigDTO, partial, { return plainToClass(AdminConfigDTO, partial, {
excludeExtraneousValues: true, excludeExtraneousValues: true,

View File

@@ -54,7 +54,7 @@ export class FileController {
@Res({ passthrough: true }) res: Response, @Res({ passthrough: true }) res: Response,
@Param("shareId") shareId: string, @Param("shareId") shareId: string,
) { ) {
const zipStream = this.fileService.getZip(shareId); const zipStream = await this.fileService.getZip(shareId);
res.set({ res.set({
"Content-Type": "application/zip", "Content-Type": "application/zip",
@@ -78,7 +78,7 @@ export class FileController {
"Content-Type": "Content-Type":
mime?.lookup?.(file.metaData.name) || "application/octet-stream", mime?.lookup?.(file.metaData.name) || "application/octet-stream",
"Content-Length": file.metaData.size, "Content-Length": file.metaData.size,
"Content-Security-Policy": "script-src 'none'", "Content-Security-Policy": "sandbox",
}; };
if (download === "true") { if (download === "true") {

View File

@@ -59,9 +59,9 @@ export class FileService {
return storageService.deleteAllFiles(shareId); return storageService.deleteAllFiles(shareId);
} }
getZip(shareId: string) { async getZip(shareId: string): Promise<Readable> {
const storageService = this.getStorageService(); const storageService = this.getStorageService();
return storageService.getZip(shareId) as Readable; return await storageService.getZip(shareId);
} }
private async streamToUint8Array(stream: Readable): Promise<Uint8Array> { private async streamToUint8Array(stream: Readable): Promise<Uint8Array> {

View File

@@ -14,6 +14,7 @@ import { ConfigService } from "src/config/config.service";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { validate as isValidUUID } from "uuid"; import { validate as isValidUUID } from "uuid";
import { SHARE_DIRECTORY } from "../constants"; import { SHARE_DIRECTORY } from "../constants";
import { Readable } from "stream";
@Injectable() @Injectable()
export class LocalFileService { export class LocalFileService {
@@ -155,7 +156,19 @@ export class LocalFileService {
}); });
} }
getZip(shareId: string) { async getZip(shareId: string): Promise<Readable> {
return createReadStream(`${SHARE_DIRECTORY}/${shareId}/archive.zip`); return new Promise((resolve, reject) => {
const zipStream = createReadStream(
`${SHARE_DIRECTORY}/${shareId}/archive.zip`,
);
zipStream.on("error", (err) => {
reject(new InternalServerErrorException(err));
});
zipStream.on("open", () => {
resolve(zipStream);
});
});
} }
} }

View File

@@ -25,6 +25,7 @@ import * as mime from "mime-types";
import { File } from "./file.service"; import { File } from "./file.service";
import { Readable } from "stream"; import { Readable } from "stream";
import { validate as isValidUUID } from "uuid"; import { validate as isValidUUID } from "uuid";
import * as archiver from "archiver";
@Injectable() @Injectable()
export class S3FileService { export class S3FileService {
@@ -275,6 +276,9 @@ export class S3FileService {
} }
getS3Instance(): S3Client { getS3Instance(): S3Client {
const checksumCalculation =
this.config.get("s3.useChecksum") === true ? null : "WHEN_REQUIRED";
return new S3Client({ return new S3Client({
endpoint: this.config.get("s3.endpoint"), endpoint: this.config.get("s3.endpoint"),
region: this.config.get("s3.region"), region: this.config.get("s3.region"),
@@ -283,13 +287,100 @@ export class S3FileService {
secretAccessKey: this.config.get("s3.secret"), secretAccessKey: this.config.get("s3.secret"),
}, },
forcePathStyle: true, forcePathStyle: true,
requestChecksumCalculation: checksumCalculation,
responseChecksumValidation: checksumCalculation,
}); });
} }
getZip() { getZip(shareId: string) {
throw new BadRequestException( return new Promise<Readable>(async (resolve, reject) => {
"ZIP download is not supported with S3 storage", const s3Instance = this.getS3Instance();
); const bucketName = this.config.get("s3.bucketName");
const compressionLevel = this.config.get("share.zipCompressionLevel");
const prefix = `${this.getS3Path()}${shareId}/`;
try {
const listResponse = await s3Instance.send(
new ListObjectsV2Command({
Bucket: bucketName,
Prefix: prefix,
}),
);
if (!listResponse.Contents || listResponse.Contents.length === 0) {
throw new NotFoundException(`No files found for share ${shareId}`);
}
const archive = archiver("zip", {
zlib: { level: parseInt(compressionLevel) },
});
archive.on("error", (err) => {
this.logger.error("Archive error", err);
reject(new InternalServerErrorException("Error creating ZIP file"));
});
const fileKeys = listResponse.Contents.filter(
(object) => object.Key && object.Key !== prefix,
).map((object) => object.Key as string);
if (fileKeys.length === 0) {
throw new NotFoundException(
`No valid files found for share ${shareId}`,
);
}
let filesAdded = 0;
const processNextFile = async (index: number) => {
if (index >= fileKeys.length) {
archive.finalize();
return;
}
const key = fileKeys[index];
const fileName = key.replace(prefix, "");
try {
const response = await s3Instance.send(
new GetObjectCommand({
Bucket: bucketName,
Key: key,
}),
);
if (response.Body instanceof Readable) {
const fileStream = response.Body;
fileStream.on("end", () => {
filesAdded++;
processNextFile(index + 1);
});
fileStream.on("error", (err) => {
this.logger.error(`Error streaming file ${fileName}`, err);
processNextFile(index + 1);
});
archive.append(fileStream, { name: fileName });
} else {
processNextFile(index + 1);
}
} catch (error) {
this.logger.error(`Error processing file ${fileName}`, error);
processNextFile(index + 1);
}
};
resolve(archive);
processNextFile(0);
} catch (error) {
this.logger.error("Error creating ZIP file", error);
reject(new InternalServerErrorException("Error creating ZIP file"));
}
});
} }
getS3Path(): string { getS3Path(): string {

View File

@@ -63,7 +63,7 @@ export class OAuthService {
}, },
}); });
if (oauthUser) { if (oauthUser) {
await this.updateIsAdmin(user); await this.updateIsAdmin(oauthUser.userId, user.isAdmin);
const updatedUser = await this.prisma.user.findFirst({ const updatedUser = await this.prisma.user.findFirst({
where: { where: {
id: oauthUser.userId, id: oauthUser.userId,
@@ -170,7 +170,7 @@ export class OAuthService {
userId: existingUser.id, userId: existingUser.id,
}, },
}); });
await this.updateIsAdmin(user); await this.updateIsAdmin(existingUser.id, user.isAdmin);
return this.auth.generateToken(existingUser, { idToken: user.idToken }); return this.auth.generateToken(existingUser, { idToken: user.idToken });
} }
@@ -196,15 +196,15 @@ export class OAuthService {
return result; return result;
} }
private async updateIsAdmin(user: OAuthSignInDto) { private async updateIsAdmin(userId: string, isAdmin?: boolean) {
if ("isAdmin" in user) if (!isAdmin) return;
await this.prisma.user.update({ await this.prisma.user.update({
where: { where: {
email: user.email, id: userId,
}, },
data: { data: {
isAdmin: user.isAdmin, isAdmin: isAdmin,
}, },
}); });
} }
} }

View File

@@ -147,38 +147,36 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
if (roleConfig?.path) { if (roleConfig?.path) {
// A path to read roles from the token is configured // A path to read roles from the token is configured
let roles: string[] | null; let roles: string[] = [];
try { try {
roles = jmespath.search(idTokenData, roleConfig.path); const rolesClaim = jmespath.search(idTokenData, roleConfig.path);
if (Array.isArray(rolesClaim)) {
roles = rolesClaim;
}
} catch (e) { } catch (e) {
roles = null; this.logger.warn(
}
if (Array.isArray(roles)) {
// Roles are found in the token
if (
roleConfig.generalAccess &&
!roles.includes(roleConfig.generalAccess)
) {
// Role for general access is configured and the user does not have it
this.logger.error(
`User roles ${roles} do not include ${roleConfig.generalAccess}`,
);
throw new ErrorPageException("user_not_allowed");
}
if (roleConfig.adminAccess) {
// Role for admin access is configured
isAdmin = roles.includes(roleConfig.adminAccess);
}
} else {
this.logger.error(
`Roles not found at path ${roleConfig.path} in ID Token ${JSON.stringify( `Roles not found at path ${roleConfig.path} in ID Token ${JSON.stringify(
idTokenData, idTokenData,
undefined, undefined,
2, 2,
)}`, )}`,
); );
}
if (
roleConfig.generalAccess &&
!roles.includes(roleConfig.generalAccess)
) {
// Role for general access is configured and the user does not have it
this.logger.error(
`User roles ${roles} do not include ${roleConfig.generalAccess}`,
);
throw new ErrorPageException("user_not_allowed"); throw new ErrorPageException("user_not_allowed");
} }
if (roleConfig.adminAccess) {
// Role for admin access is configured
isAdmin = roles.includes(roleConfig.adminAccess);
}
} }
if (!username) { if (!username) {

228
config.example.yaml Normal file
View File

@@ -0,0 +1,228 @@
#This configuration is pre-filled with the default values.
#You can remove keys you don't want to set. If a key is missing, the value set in the UI will be used; if that is also unset, the default value applies.
general:
#Name of the application
appName: Pingvin Share
#On which URL Pingvin Share is available
appUrl: http://localhost:3000
#Whether to set the secure flag on cookies. If enabled, the site will not function when accessed over HTTP.
secureCookies: "false"
#Whether to show the home page
showHomePage: "true"
#Time after which a user must log in again (default: 3 months).
sessionDuration: 3 months
share:
#Whether registration is allowed
allowRegistration: "true"
#Whether unauthenticated users can create shares
allowUnauthenticatedShares: "false"
#Maximum share expiration. Set to 0 to allow unlimited expiration.
maxExpiration: 0 days
#Default length for the generated ID of a share. This value is also used to generate links for reverse shares. A value below 8 is not considered secure.
shareIdLength: "8"
#Maximum share size
maxSize: "1000000000"
#Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression.
zipCompressionLevel: "9"
#Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.
chunkSize: "10000000"
#The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.
autoOpenShareModal: "false"
email:
#Whether to allow email sharing with recipients. Only enable this if SMTP is activated.
enableShareEmailRecipients: "false"
#Subject of the email which gets sent to the share recipients.
shareRecipientsSubject: Files shared with you
#Message which gets sent to the share recipients. Available variables:
# {creator} - The username of the creator of the share
# {creatorEmail} - The email of the creator of the share
# {shareUrl} - The URL of the share
# {desc} - The description of the share
# {expires} - The expiration date of the share
# These variables will be replaced with the actual value.
shareRecipientsMessage: >-
Hey!
{creator} ({creatorEmail}) shared some files with you. You can view or download the
files with this link: {shareUrl}
The share will expire {expires}.
Note: {desc}
Shared securely with Pingvin Share 🐧
#Subject of the sent email when someone created a share with your reverse share link.
reverseShareSubject: Reverse share link used
#Message which gets sent when someone created a share with your reverse share link. {shareUrl} will be replaced with the creator's name and the share URL.
reverseShareMessage: |-
Hey!
A share was just created with your reverse share link: {shareUrl}
Shared securely with Pingvin Share 🐧
#Subject of the sent email when a user requests a password reset.
resetPasswordSubject: Pingvin Share password reset
#Message which gets sent when a user requests a password reset. {url} will be replaced with the reset password URL.
resetPasswordMessage: >-
Hey!
You requested a password reset. Click this link to reset your password:
{url}
The link expires in an hour.
Pingvin Share 🐧
#Subject of the sent email when an admin invites a user.
inviteSubject: Pingvin Share invite
#Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the users password.
inviteMessage: >-
Hey!
You were invited to Pingvin Share. Click this link to accept the invite:
{url}
You can use the email "{email}" and the password "{password}" to sign in.
Pingvin Share 🐧
smtp:
#Whether SMTP is enabled. Only set this to true if you entered the host, port, email, user and password of your SMTP server.
enabled: "false"
#Only set this to true if you need to trust self signed certificates.
allowUnauthorizedCertificates: "false"
#Host of the SMTP server
host: ""
#Port of the SMTP server
port: "0"
#Email address from which the emails get sent
email: ""
#Username of the SMTP server
username: ""
#Password of the SMTP server
password: ""
ldap:
#Use LDAP authentication for user login
enabled: "false"
#URL of the LDAP server
url: ""
#Default user used to perform the user search
bindDn: ""
#Password used to perform the user search
bindPassword: ""
#Base location, where the user search will be performed
searchBase: ""
#The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.
searchQuery: ""
#Group required for administrative access.
adminGroups: ""
#LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.
fieldNameMemberOf: memberOf
#LDAP attribute name for the email of an user.
fieldNameEmail: userPrincipalName
oauth:
#Allow users to register via social login
allowRegistration: "true"
#Whether to ignore TOTP when user using social login
ignoreTotp: "true"
#Whether to disable password login
#Make sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.
disablePassword: "false"
#Whether GitHub login is enabled
github-enabled: "false"
#Client ID of the GitHub OAuth app
github-clientId: ""
#Client secret of the GitHub OAuth app
github-clientSecret: ""
#Whether Google login is enabled
google-enabled: "false"
#Client ID of the Google OAuth app
google-clientId: ""
#Client secret of the Google OAuth app
google-clientSecret: ""
#Whether Microsoft login is enabled
microsoft-enabled: "false"
#Tenant ID of the Microsoft OAuth app
#common: Users with both a personal Microsoft account and a work or school account from Microsoft Entra ID can sign in to the application. organizations: Only users with work or school accounts from Microsoft Entra ID can sign in to the application.
#consumers: Only users with a personal Microsoft account can sign in to the application.
#domain name of the Microsoft Entra tenant or the tenant ID in GUID format: Only users from a specific Microsoft Entra tenant (directory members with a work or school account or directory guests with a personal Microsoft account) can sign in to the application.
microsoft-tenant: common
#Client ID of the Microsoft OAuth app
microsoft-clientId: ""
#Client secret of the Microsoft OAuth app
microsoft-clientSecret: ""
#Whether Discord login is enabled
discord-enabled: "false"
#Limit signing in to users in a specific server. Leave it blank to disable.
discord-limitedGuild: ""
#Limit signing in to specific users by their Discord ID. Leave it blank to disable.
discord-limitedUsers: ""
#Client ID of the Discord OAuth app
discord-clientId: ""
#Client secret of the Discord OAuth app
discord-clientSecret: ""
#Whether OpenID Connect login is enabled
oidc-enabled: "false"
#Discovery URI of the OpenID Connect OAuth app
oidc-discoveryUri: ""
#Whether the “Sign out” button will sign out from the OpenID Connect provider
oidc-signOut: "false"
#Scopes which should be requested from the OpenID Connect provider.
oidc-scope: openid email profile
#Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.
oidc-usernameClaim: ""
#Must be a valid JMES path referencing an array of roles. Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. Leave it blank if you don't know what this config is.
oidc-rolePath: ""
#Role required for general access. Must be present in a users roles for them to log in. Leave it blank if you don't know what this config is.
oidc-roleGeneralAccess: ""
#Role required for administrative access. Must be present in a users roles for them to access the admin panel. Leave it blank if you don't know what this config is.
oidc-roleAdminAccess: ""
#Client ID of the OpenID Connect OAuth app
oidc-clientId: ""
#Client secret of the OpenID Connect OAuth app
oidc-clientSecret: ""
s3:
#Whether S3 should be used to store the shared files instead of the local file system.
enabled: "false"
#The URL of the S3 bucket.
endpoint: ""
#The region of the S3 bucket.
region: ""
#The name of the S3 bucket.
bucketName: ""
#The default path which should be used to store the files in the S3 bucket.
bucketPath: ""
#The key which allows you to access the S3 bucket.
key: ""
#The secret which allows you to access the S3 bucket.
secret: ""
#Turn off for backends that do not support checksum (e.g. B2).
useChecksum: "true"
legal:
#Whether to show a link to imprint and privacy policy in the footer.
enabled: "false"
#The text which should be shown in the imprint. Supports Markdown. Leave blank to link to an external imprint page.
imprintText: ""
#If you already have an imprint page you can link it here instead of using the text field.
imprintUrl: ""
#The text which should be shown in the privacy policy. Supports Markdown. Leave blank to link to an external privacy policy page.
privacyPolicyText: ""
#If you already have a privacy policy page you can link it here instead of using the text field.
privacyPolicyUrl: ""
#This configuration is used to create the initial user when the application is started for the first time.
#Make sure to change at least the password as soon as you log in!
initUser:
enabled: false
username: admin
email: admin@example.com
password: my-secure-password
isAdmin: true
ldapDN: ""

View File

@@ -1,4 +1,4 @@
files: files:
- source: /frontend/src/i18n/translations/en-US.ts - source: /frontend/src/i18n/translations/en-US.ts
translation: /%original_path%/%locale%.ts translation: /%original_path%/%locale%.ts
pull_request_title: "chore(translations): update translations via Crowdin" pull_request_title: 'chore(translations): update translations via Crowdin'

12
docker-compose.local.yml Normal file
View File

@@ -0,0 +1,12 @@
services:
pingvin-share:
build: .
restart: unless-stopped
ports:
- 3001:3000
environment:
- TRUST_PROXY=false
volumes:
- "./data:/opt/app/backend/data"
- "./data/images:/opt/app/frontend/public/img"
# - "./config.yaml:/opt/app/config.yaml"

View File

@@ -9,6 +9,7 @@ services:
volumes: volumes:
- "./data:/opt/app/backend/data" - "./data:/opt/app/backend/data"
- "./data/images:/opt/app/frontend/public/img" - "./data/images:/opt/app/frontend/public/img"
# - "./config.yaml:/opt/app/config.yaml" # Add this line, if you want to configure pingvin-share via config file and not via UI
# To add ClamAV, to scan your shares for malicious files, # To add ClamAV, to scan your shares for malicious files,
# see https://stonith404.github.io/pingvin-share/setup/integrations/#clamav-docker-only # see https://stonith404.github.io/pingvin-share/setup/integrations/#clamav-docker-only

View File

@@ -4,27 +4,21 @@ id: configuration
# Configuration # Configuration
You can customize Pingvin Share by going to the configuration page in your admin dashboard `/admin/config`. ## General configuration
## General There are plenty of settings you can adjust to your needs. Pingvin Share can be configured in two ways:
The **General** Tab will let you customize your Pingvin Share instance to your liking. ### UI
### App name You can change the settings in the UI (`/admin/config`)
To change the name of your instance, insert any text into `App name`. ### YAML file
### App URL You can set the configuration via a YAML file. If you choose this way, you won't be able to change the settings in the UI.
To make your App available trough your own **domain**, insert your specific domain and also subdomain if needed. Add an `https://` if you have an SSL certificate installed. If this is not the case, use `http://`. If you use Docker you can create a `config.yml` file based on the [`config.example.yaml`](https://github.com/stonith404/pingvin-share/blob/main/config.yaml) and mount it to `/opt/app/config.yaml` in the container.
### Show home page If you run Pingvin Share without Docker, you can create a `config.yml` file based on the [`config.example.yaml`](https://github.com/stonith404/pingvin-share/blob/main/config.yaml) in the root directory of the project.
If you don't like the **home page** Pingvin Share provides and you just want the upload tab to be the main page, toggle this to `true`.
### Logo
Not only you can change your instances name, but also the logo it shows everywhere. To do that, upload an image as `png` with a 1:1 aspect ratio.
--- ---
@@ -50,9 +44,11 @@ For installation specific configuration, you can use environment variables. The
| `API_URL` | `http://localhost:8080` | The URL of the backend for the frontend. | | `API_URL` | `http://localhost:8080` | The URL of the backend for the frontend. |
#### Docker specific #### Docker specific
Environment variables that are only available when running Pingvin Share with Docker. Environment variables that are only available when running Pingvin Share with Docker.
| Variable | Default Value | Description | | Variable | Default Value | Description |
| ------------- | ------------- | ----------------------------------------------------------------------------------------------------------- | | ----------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TRUST_PROXY` | `false` | Whether Pingvin Share is behind a reverse proxy. If set to `true`, the `X-Forwarded-For` header is trusted. | | `TRUST_PROXY` | `false` | Whether Pingvin Share is behind a reverse proxy. If set to `true`, the `X-Forwarded-For` header is trusted. |
| `PUID` and `PGID` | `1000` | The user and group ID of the user who should run Pingvin Share inside the Docker container and owns the files that are mounted with the volume. You can get the `PUID` and `GUID` of your user on your host machine by using the command `id`. For more information see [this article](https://docs.linuxserver.io/general/understanding-puid-and-pgid/#using-the-variables). | | `CADDY_DISABLED` | `false` | Configures if Pingvin Share is starting built-in Caddy. If set to `true`, Caddy will not be started. If disabled, you must configure your reverse proxy to correctly map all paths. Refer to the [official Caddyfile](https://github.com/stonith404/pingvin-share/blob/main/reverse-proxy/Caddyfile) for guidance. |
| `PUID` and `PGID` | `1000` | The user and group ID of the user who should run Pingvin Share inside the Docker container and owns the files that are mounted with the volume. You can get the `PUID` and `GUID` of your user on your host machine by using the command `id`. For more information see [this article](https://docs.linuxserver.io/general/understanding-puid-and-pgid/#using-the-variables). |

View File

@@ -25,7 +25,7 @@ Your container is now listening on `http://localhost:<externalport>`, have fun w
Required tools: Required tools:
- [Node.js](https://nodejs.org/en/download/) >= 16 - [Node.js](https://nodejs.org/en/download/) >= 22
- [Git](https://git-scm.com/downloads) - [Git](https://git-scm.com/downloads)
- [pm2](https://pm2.keymetrics.io/) for running Pingvin Share in the background - [pm2](https://pm2.keymetrics.io/) for running Pingvin Share in the background

View File

@@ -1,12 +1,12 @@
{ {
"name": "pingvin-share-frontend", "name": "pingvin-share-frontend",
"version": "1.9.1", "version": "1.12.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pingvin-share-frontend", "name": "pingvin-share-frontend",
"version": "1.9.1", "version": "1.12.0",
"dependencies": { "dependencies": {
"@emotion/react": "^11.13.3", "@emotion/react": "^11.13.3",
"@emotion/server": "^11.11.0", "@emotion/server": "^11.11.0",
@@ -72,81 +72,18 @@
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.23.5", "version": "7.26.2",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dependencies": { "dependencies": {
"@babel/highlight": "^7.23.4", "@babel/helper-validator-identifier": "^7.25.9",
"chalk": "^2.4.2" "js-tokens": "^4.0.0",
"picocolors": "^1.0.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/code-frame/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/code-frame/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/code-frame/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/@babel/code-frame/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
"node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@babel/code-frame/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/code-frame/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/compat-data": { "node_modules/@babel/compat-data": {
"version": "7.19.4", "version": "7.19.4",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz",
@@ -491,17 +428,17 @@
} }
}, },
"node_modules/@babel/helper-string-parser": { "node_modules/@babel/helper-string-parser": {
"version": "7.23.4", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
"integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-validator-identifier": { "node_modules/@babel/helper-validator-identifier": {
"version": "7.22.20", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
@@ -529,99 +466,24 @@
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "7.17.9", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
"integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
"dependencies": { "dependencies": {
"@babel/template": "^7.16.7", "@babel/template": "^7.27.0",
"@babel/traverse": "^7.17.9", "@babel/types": "^7.27.0"
"@babel/types": "^7.17.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/highlight": {
"version": "7.23.4",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
"dependencies": {
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/@babel/highlight/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
"node_modules/@babel/highlight/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@babel/highlight/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.23.5", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
"integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
"dependencies": {
"@babel/types": "^7.27.0"
},
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
}, },
@@ -1667,9 +1529,9 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.24.5", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
"integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.14.0" "regenerator-runtime": "^0.14.0"
}, },
@@ -1678,13 +1540,13 @@
} }
}, },
"node_modules/@babel/template": { "node_modules/@babel/template": {
"version": "7.22.15", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
"integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.22.13", "@babel/code-frame": "^7.26.2",
"@babel/parser": "^7.22.15", "@babel/parser": "^7.27.0",
"@babel/types": "^7.22.15" "@babel/types": "^7.27.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@@ -1719,13 +1581,12 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.23.5", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
"integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"dependencies": { "dependencies": {
"@babel/helper-string-parser": "^7.23.4", "@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.22.20", "@babel/helper-validator-identifier": "^7.25.9"
"to-fast-properties": "^2.0.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@@ -2665,9 +2526,9 @@
} }
}, },
"node_modules/@next/env": { "node_modules/@next/env": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.26.tgz",
"integrity": "sha512-JfDpuOCB0UBKlEgEy/H6qcBSzHimn/YWjUHzKl1jMeUO+QVRdzmTTl8gFJaNO87c8DXmVKhFCtwxQ9acqB3+Pw==" "integrity": "sha512-vO//GJ/YBco+H7xdQhzJxF7ub3SUwft76jwaeOyVVQFHCi5DCnkP16WHB+JBylo4vOKPoZBlR94Z8xBxNBdNJA=="
}, },
"node_modules/@next/eslint-plugin-next": { "node_modules/@next/eslint-plugin-next": {
"version": "14.2.12", "version": "14.2.12",
@@ -2725,9 +2586,9 @@
} }
}, },
"node_modules/@next/swc-darwin-arm64": { "node_modules/@next/swc-darwin-arm64": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.26.tgz",
"integrity": "sha512-WDfq7bmROa5cIlk6ZNonNdVhKmbCv38XteVFYsxea1vDJt3SnYGgxLGMTXQNfs5OkFvAhmfKKrwe7Y0Hs+rWOg==", "integrity": "sha512-zDJY8gsKEseGAxG+C2hTMT0w9Nk9N1Sk1qV7vXYz9MEiyRoF5ogQX2+vplyUMIfygnjn9/A04I6yrUTRTuRiyQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -2740,9 +2601,9 @@
} }
}, },
"node_modules/@next/swc-darwin-x64": { "node_modules/@next/swc-darwin-x64": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.26.tgz",
"integrity": "sha512-XIQlC+NAmJPfa2hruLvr1H1QJJeqOTDV+v7tl/jIdoFvqhoihvSNykLU/G6NMgoeo+e/H7p/VeWSOvMUHKtTIg==", "integrity": "sha512-U0adH5ryLfmTDkahLwG9sUQG2L0a9rYux8crQeC92rPhi3jGQEY47nByQHrVrt3prZigadwj/2HZ1LUUimuSbg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -2755,9 +2616,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-gnu": { "node_modules/@next/swc-linux-arm64-gnu": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.26.tgz",
"integrity": "sha512-pnzBrHTPXIMm5QX3QC8XeMkpVuoAYOmyfsO4VlPn+0NrHraNuWjdhe+3xLq01xR++iCvX+uoeZmJDKcOxI201Q==", "integrity": "sha512-SINMl1I7UhfHGM7SoRiw0AbwnLEMUnJ/3XXVmhyptzriHbWvPPbbm0OEVG24uUKhuS1t0nvN/DBvm5kz6ZIqpg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -2770,9 +2631,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-musl": { "node_modules/@next/swc-linux-arm64-musl": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.26.tgz",
"integrity": "sha512-WhJJAFpi6yqmUx1momewSdcm/iRXFQS0HU2qlUGlGE/+98eu7JWLD5AAaP/tkK1mudS/rH2f9E3WCEF2iYDydQ==", "integrity": "sha512-s6JaezoyJK2DxrwHWxLWtJKlqKqTdi/zaYigDXUJ/gmx/72CrzdVZfMvUc6VqnZ7YEvRijvYo+0o4Z9DencduA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -2785,9 +2646,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-gnu": { "node_modules/@next/swc-linux-x64-gnu": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.26.tgz",
"integrity": "sha512-ao5HCbw9+iG1Kxm8XsGa3X174Ahn17mSYBQlY6VGsdsYDAbz/ZP13wSLfvlYoIDn1Ger6uYA+yt/3Y9KTIupRg==", "integrity": "sha512-FEXeUQi8/pLr/XI0hKbe0tgbLmHFRhgXOUiPScz2hk0hSmbGiU8aUqVslj/6C6KA38RzXnWoJXo4FMo6aBxjzg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -2800,9 +2661,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-musl": { "node_modules/@next/swc-linux-x64-musl": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.26.tgz",
"integrity": "sha512-CXm/kpnltKTT7945np6Td3w7shj/92TMRPyI/VvveFe8+YE+/YOJ5hyAWK5rpx711XO1jBCgXl211TWaxOtkaA==", "integrity": "sha512-BUsomaO4d2DuXhXhgQCVt2jjX4B4/Thts8nDoIruEJkhE5ifeQFtvW5c9JkdOtYvE5p2G0hcwQ0UbRaQmQwaVg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -2815,9 +2676,9 @@
} }
}, },
"node_modules/@next/swc-win32-arm64-msvc": { "node_modules/@next/swc-win32-arm64-msvc": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.26.tgz",
"integrity": "sha512-upJn2HGQgKNDbXVfIgmqT2BN8f3z/mX8ddoyi1I565FHbfowVK5pnMEwauvLvaJf4iijvuKq3kw/b6E9oIVRWA==", "integrity": "sha512-5auwsMVzT7wbB2CZXQxDctpWbdEnEW/e66DyXO1DcgHxIyhP06awu+rHKshZE+lPLIGiwtjo7bsyeuubewwxMw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -2830,9 +2691,9 @@
} }
}, },
"node_modules/@next/swc-win32-ia32-msvc": { "node_modules/@next/swc-win32-ia32-msvc": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.26.tgz",
"integrity": "sha512-igQW/JWciTGJwj3G1ipalD2V20Xfx3ywQy17IV0ciOUBbFhNfyU1DILWsTi32c8KmqgIDviUEulW/yPb2FF90w==", "integrity": "sha512-GQWg/Vbz9zUGi9X80lOeGsz1rMH/MtFO/XqigDznhhhTfDlDoynCM6982mPCbSlxJ/aveZcKtTlwfAjwhyxDpg==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@@ -2845,9 +2706,9 @@
} }
}, },
"node_modules/@next/swc-win32-x64-msvc": { "node_modules/@next/swc-win32-x64-msvc": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.26.tgz",
"integrity": "sha512-AFmqeLW6LtxeFTuoB+MXFeM5fm5052i3MU6xD0WzJDOwku6SkZaxb1bxjBaRC8uNqTRTSPl0yMFtjNowIVI67w==", "integrity": "sha512-2rdB3T1/Gp7bv1eQTTm9d1Y1sv9UuJ2LAwOE0Pe2prHKe32UNscj7YS13fRB37d0GAiGNR+Y7ZcW8YjDI8Ns0w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -3977,9 +3838,9 @@
} }
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.7.7", "version": "1.8.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.6",
@@ -7259,11 +7120,11 @@
"peer": true "peer": true
}, },
"node_modules/next": { "node_modules/next": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/next/-/next-14.2.20.tgz", "resolved": "https://registry.npmjs.org/next/-/next-14.2.26.tgz",
"integrity": "sha512-yPvIiWsiyVYqJlSQxwmzMIReXn5HxFNq4+tlVQ812N1FbvhmE+fDpIAD7bcS2mGYQwPJ5vAsQouyme2eKsxaug==", "integrity": "sha512-b81XSLihMwCfwiUVRRja3LphLo4uBBMZEzBBWMaISbKTwOmq3wPknIETy/8000tr7Gq4WmbuFYPS7jOYIf+ZJw==",
"dependencies": { "dependencies": {
"@next/env": "14.2.20", "@next/env": "14.2.26",
"@swc/helpers": "0.5.5", "@swc/helpers": "0.5.5",
"busboy": "1.6.0", "busboy": "1.6.0",
"caniuse-lite": "^1.0.30001579", "caniuse-lite": "^1.0.30001579",
@@ -7278,15 +7139,15 @@
"node": ">=18.17.0" "node": ">=18.17.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@next/swc-darwin-arm64": "14.2.20", "@next/swc-darwin-arm64": "14.2.26",
"@next/swc-darwin-x64": "14.2.20", "@next/swc-darwin-x64": "14.2.26",
"@next/swc-linux-arm64-gnu": "14.2.20", "@next/swc-linux-arm64-gnu": "14.2.26",
"@next/swc-linux-arm64-musl": "14.2.20", "@next/swc-linux-arm64-musl": "14.2.26",
"@next/swc-linux-x64-gnu": "14.2.20", "@next/swc-linux-x64-gnu": "14.2.26",
"@next/swc-linux-x64-musl": "14.2.20", "@next/swc-linux-x64-musl": "14.2.26",
"@next/swc-win32-arm64-msvc": "14.2.20", "@next/swc-win32-arm64-msvc": "14.2.26",
"@next/swc-win32-ia32-msvc": "14.2.20", "@next/swc-win32-ia32-msvc": "14.2.26",
"@next/swc-win32-x64-msvc": "14.2.20" "@next/swc-win32-x64-msvc": "14.2.26"
}, },
"peerDependencies": { "peerDependencies": {
"@opentelemetry/api": "^1.1.0", "@opentelemetry/api": "^1.1.0",
@@ -8412,9 +8273,9 @@
} }
}, },
"node_modules/serialize-javascript": { "node_modules/serialize-javascript": {
"version": "6.0.1", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
"integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"dependencies": { "dependencies": {
"randombytes": "^2.1.0" "randombytes": "^2.1.0"
} }
@@ -9071,14 +8932,6 @@
"globrex": "^0.1.2" "globrex": "^0.1.2"
} }
}, },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"engines": {
"node": ">=4"
}
},
"node_modules/to-regex-range": { "node_modules/to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -10101,63 +9954,13 @@
} }
}, },
"@babel/code-frame": { "@babel/code-frame": {
"version": "7.23.5", "version": "7.26.2",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"requires": { "requires": {
"@babel/highlight": "^7.23.4", "@babel/helper-validator-identifier": "^7.25.9",
"chalk": "^2.4.2" "js-tokens": "^4.0.0",
}, "picocolors": "^1.0.0"
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"requires": {
"has-flag": "^3.0.0"
}
}
} }
}, },
"@babel/compat-data": { "@babel/compat-data": {
@@ -10410,14 +10213,14 @@
} }
}, },
"@babel/helper-string-parser": { "@babel/helper-string-parser": {
"version": "7.23.4", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
"integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
}, },
"@babel/helper-validator-identifier": { "@babel/helper-validator-identifier": {
"version": "7.22.20", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
}, },
"@babel/helper-validator-option": { "@babel/helper-validator-option": {
"version": "7.18.6", "version": "7.18.6",
@@ -10436,80 +10239,21 @@
} }
}, },
"@babel/helpers": { "@babel/helpers": {
"version": "7.17.9", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
"integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
"requires": { "requires": {
"@babel/template": "^7.16.7", "@babel/template": "^7.27.0",
"@babel/traverse": "^7.17.9", "@babel/types": "^7.27.0"
"@babel/types": "^7.17.0"
}
},
"@babel/highlight": {
"version": "7.23.4",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
"requires": {
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"requires": {
"has-flag": "^3.0.0"
}
}
} }
}, },
"@babel/parser": { "@babel/parser": {
"version": "7.23.5", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
"integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==" "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
"requires": {
"@babel/types": "^7.27.0"
}
}, },
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.18.6", "version": "7.18.6",
@@ -11187,21 +10931,21 @@
} }
}, },
"@babel/runtime": { "@babel/runtime": {
"version": "7.24.5", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
"integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
"requires": { "requires": {
"regenerator-runtime": "^0.14.0" "regenerator-runtime": "^0.14.0"
} }
}, },
"@babel/template": { "@babel/template": {
"version": "7.22.15", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
"integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
"requires": { "requires": {
"@babel/code-frame": "^7.22.13", "@babel/code-frame": "^7.26.2",
"@babel/parser": "^7.22.15", "@babel/parser": "^7.27.0",
"@babel/types": "^7.22.15" "@babel/types": "^7.27.0"
} }
}, },
"@babel/traverse": { "@babel/traverse": {
@@ -11229,13 +10973,12 @@
} }
}, },
"@babel/types": { "@babel/types": {
"version": "7.23.5", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
"integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"requires": { "requires": {
"@babel/helper-string-parser": "^7.23.4", "@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.22.20", "@babel/helper-validator-identifier": "^7.25.9"
"to-fast-properties": "^2.0.0"
} }
}, },
"@emnapi/runtime": { "@emnapi/runtime": {
@@ -11840,9 +11583,9 @@
"requires": {} "requires": {}
}, },
"@next/env": { "@next/env": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.26.tgz",
"integrity": "sha512-JfDpuOCB0UBKlEgEy/H6qcBSzHimn/YWjUHzKl1jMeUO+QVRdzmTTl8gFJaNO87c8DXmVKhFCtwxQ9acqB3+Pw==" "integrity": "sha512-vO//GJ/YBco+H7xdQhzJxF7ub3SUwft76jwaeOyVVQFHCi5DCnkP16WHB+JBylo4vOKPoZBlR94Z8xBxNBdNJA=="
}, },
"@next/eslint-plugin-next": { "@next/eslint-plugin-next": {
"version": "14.2.12", "version": "14.2.12",
@@ -11887,57 +11630,57 @@
} }
}, },
"@next/swc-darwin-arm64": { "@next/swc-darwin-arm64": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.26.tgz",
"integrity": "sha512-WDfq7bmROa5cIlk6ZNonNdVhKmbCv38XteVFYsxea1vDJt3SnYGgxLGMTXQNfs5OkFvAhmfKKrwe7Y0Hs+rWOg==", "integrity": "sha512-zDJY8gsKEseGAxG+C2hTMT0w9Nk9N1Sk1qV7vXYz9MEiyRoF5ogQX2+vplyUMIfygnjn9/A04I6yrUTRTuRiyQ==",
"optional": true "optional": true
}, },
"@next/swc-darwin-x64": { "@next/swc-darwin-x64": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.26.tgz",
"integrity": "sha512-XIQlC+NAmJPfa2hruLvr1H1QJJeqOTDV+v7tl/jIdoFvqhoihvSNykLU/G6NMgoeo+e/H7p/VeWSOvMUHKtTIg==", "integrity": "sha512-U0adH5ryLfmTDkahLwG9sUQG2L0a9rYux8crQeC92rPhi3jGQEY47nByQHrVrt3prZigadwj/2HZ1LUUimuSbg==",
"optional": true "optional": true
}, },
"@next/swc-linux-arm64-gnu": { "@next/swc-linux-arm64-gnu": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.26.tgz",
"integrity": "sha512-pnzBrHTPXIMm5QX3QC8XeMkpVuoAYOmyfsO4VlPn+0NrHraNuWjdhe+3xLq01xR++iCvX+uoeZmJDKcOxI201Q==", "integrity": "sha512-SINMl1I7UhfHGM7SoRiw0AbwnLEMUnJ/3XXVmhyptzriHbWvPPbbm0OEVG24uUKhuS1t0nvN/DBvm5kz6ZIqpg==",
"optional": true "optional": true
}, },
"@next/swc-linux-arm64-musl": { "@next/swc-linux-arm64-musl": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.26.tgz",
"integrity": "sha512-WhJJAFpi6yqmUx1momewSdcm/iRXFQS0HU2qlUGlGE/+98eu7JWLD5AAaP/tkK1mudS/rH2f9E3WCEF2iYDydQ==", "integrity": "sha512-s6JaezoyJK2DxrwHWxLWtJKlqKqTdi/zaYigDXUJ/gmx/72CrzdVZfMvUc6VqnZ7YEvRijvYo+0o4Z9DencduA==",
"optional": true "optional": true
}, },
"@next/swc-linux-x64-gnu": { "@next/swc-linux-x64-gnu": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.26.tgz",
"integrity": "sha512-ao5HCbw9+iG1Kxm8XsGa3X174Ahn17mSYBQlY6VGsdsYDAbz/ZP13wSLfvlYoIDn1Ger6uYA+yt/3Y9KTIupRg==", "integrity": "sha512-FEXeUQi8/pLr/XI0hKbe0tgbLmHFRhgXOUiPScz2hk0hSmbGiU8aUqVslj/6C6KA38RzXnWoJXo4FMo6aBxjzg==",
"optional": true "optional": true
}, },
"@next/swc-linux-x64-musl": { "@next/swc-linux-x64-musl": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.26.tgz",
"integrity": "sha512-CXm/kpnltKTT7945np6Td3w7shj/92TMRPyI/VvveFe8+YE+/YOJ5hyAWK5rpx711XO1jBCgXl211TWaxOtkaA==", "integrity": "sha512-BUsomaO4d2DuXhXhgQCVt2jjX4B4/Thts8nDoIruEJkhE5ifeQFtvW5c9JkdOtYvE5p2G0hcwQ0UbRaQmQwaVg==",
"optional": true "optional": true
}, },
"@next/swc-win32-arm64-msvc": { "@next/swc-win32-arm64-msvc": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.26.tgz",
"integrity": "sha512-upJn2HGQgKNDbXVfIgmqT2BN8f3z/mX8ddoyi1I565FHbfowVK5pnMEwauvLvaJf4iijvuKq3kw/b6E9oIVRWA==", "integrity": "sha512-5auwsMVzT7wbB2CZXQxDctpWbdEnEW/e66DyXO1DcgHxIyhP06awu+rHKshZE+lPLIGiwtjo7bsyeuubewwxMw==",
"optional": true "optional": true
}, },
"@next/swc-win32-ia32-msvc": { "@next/swc-win32-ia32-msvc": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.26.tgz",
"integrity": "sha512-igQW/JWciTGJwj3G1ipalD2V20Xfx3ywQy17IV0ciOUBbFhNfyU1DILWsTi32c8KmqgIDviUEulW/yPb2FF90w==", "integrity": "sha512-GQWg/Vbz9zUGi9X80lOeGsz1rMH/MtFO/XqigDznhhhTfDlDoynCM6982mPCbSlxJ/aveZcKtTlwfAjwhyxDpg==",
"optional": true "optional": true
}, },
"@next/swc-win32-x64-msvc": { "@next/swc-win32-x64-msvc": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.20.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.26.tgz",
"integrity": "sha512-AFmqeLW6LtxeFTuoB+MXFeM5fm5052i3MU6xD0WzJDOwku6SkZaxb1bxjBaRC8uNqTRTSPl0yMFtjNowIVI67w==", "integrity": "sha512-2rdB3T1/Gp7bv1eQTTm9d1Y1sv9UuJ2LAwOE0Pe2prHKe32UNscj7YS13fRB37d0GAiGNR+Y7ZcW8YjDI8Ns0w==",
"optional": true "optional": true
}, },
"@nodelib/fs.scandir": { "@nodelib/fs.scandir": {
@@ -12799,9 +12542,9 @@
"dev": true "dev": true
}, },
"axios": { "axios": {
"version": "1.7.7", "version": "1.8.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
"dev": true, "dev": true,
"requires": { "requires": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.6",
@@ -15181,20 +14924,20 @@
"peer": true "peer": true
}, },
"next": { "next": {
"version": "14.2.20", "version": "14.2.26",
"resolved": "https://registry.npmjs.org/next/-/next-14.2.20.tgz", "resolved": "https://registry.npmjs.org/next/-/next-14.2.26.tgz",
"integrity": "sha512-yPvIiWsiyVYqJlSQxwmzMIReXn5HxFNq4+tlVQ812N1FbvhmE+fDpIAD7bcS2mGYQwPJ5vAsQouyme2eKsxaug==", "integrity": "sha512-b81XSLihMwCfwiUVRRja3LphLo4uBBMZEzBBWMaISbKTwOmq3wPknIETy/8000tr7Gq4WmbuFYPS7jOYIf+ZJw==",
"requires": { "requires": {
"@next/env": "14.2.20", "@next/env": "14.2.26",
"@next/swc-darwin-arm64": "14.2.20", "@next/swc-darwin-arm64": "14.2.26",
"@next/swc-darwin-x64": "14.2.20", "@next/swc-darwin-x64": "14.2.26",
"@next/swc-linux-arm64-gnu": "14.2.20", "@next/swc-linux-arm64-gnu": "14.2.26",
"@next/swc-linux-arm64-musl": "14.2.20", "@next/swc-linux-arm64-musl": "14.2.26",
"@next/swc-linux-x64-gnu": "14.2.20", "@next/swc-linux-x64-gnu": "14.2.26",
"@next/swc-linux-x64-musl": "14.2.20", "@next/swc-linux-x64-musl": "14.2.26",
"@next/swc-win32-arm64-msvc": "14.2.20", "@next/swc-win32-arm64-msvc": "14.2.26",
"@next/swc-win32-ia32-msvc": "14.2.20", "@next/swc-win32-ia32-msvc": "14.2.26",
"@next/swc-win32-x64-msvc": "14.2.20", "@next/swc-win32-x64-msvc": "14.2.26",
"@swc/helpers": "0.5.5", "@swc/helpers": "0.5.5",
"busboy": "1.6.0", "busboy": "1.6.0",
"caniuse-lite": "^1.0.30001579", "caniuse-lite": "^1.0.30001579",
@@ -15953,9 +15696,9 @@
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="
}, },
"serialize-javascript": { "serialize-javascript": {
"version": "6.0.1", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
"integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"requires": { "requires": {
"randombytes": "^2.1.0" "randombytes": "^2.1.0"
} }
@@ -16427,11 +16170,6 @@
"globrex": "^0.1.2" "globrex": "^0.1.2"
} }
}, },
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
},
"to-regex-range": { "to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",

View File

@@ -1,6 +1,6 @@
{ {
"name": "pingvin-share-frontend", "name": "pingvin-share-frontend",
"version": "1.9.1", "version": "1.12.0",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"build": "next build", "build": "next build",

View File

@@ -8,9 +8,9 @@ import {
} from "@mantine/core"; } from "@mantine/core";
import { useForm } from "@mantine/form"; import { useForm } from "@mantine/form";
import { AdminConfig, UpdateConfig } from "../../../types/config.type"; import { AdminConfig, UpdateConfig } from "../../../types/config.type";
import TimespanInput from "../../core/TimespanInput";
import { stringToTimespan, timespanToString } from "../../../utils/date.util"; import { stringToTimespan, timespanToString } from "../../../utils/date.util";
import FileSizeInput from "../../core/FileSizeInput"; import FileSizeInput from "../../core/FileSizeInput";
import TimespanInput from "../../core/TimespanInput";
const AdminConfigInput = ({ const AdminConfigInput = ({
configVariable, configVariable,
@@ -41,9 +41,11 @@ const AdminConfigInput = ({
{configVariable.type == "string" && {configVariable.type == "string" &&
(configVariable.obscured ? ( (configVariable.obscured ? (
<PasswordInput <PasswordInput
autoComplete="new-password"
style={{ style={{
width: "100%", width: "100%",
}} }}
disabled={!configVariable.allowEdit}
{...form.getInputProps("stringValue")} {...form.getInputProps("stringValue")}
onChange={(e) => onValueChange(configVariable, e.target.value)} onChange={(e) => onValueChange(configVariable, e.target.value)}
/> />
@@ -52,6 +54,7 @@ const AdminConfigInput = ({
style={{ style={{
width: "100%", width: "100%",
}} }}
disabled={!configVariable.allowEdit}
{...form.getInputProps("stringValue")} {...form.getInputProps("stringValue")}
placeholder={configVariable.defaultValue} placeholder={configVariable.defaultValue}
onChange={(e) => onValueChange(configVariable, e.target.value)} onChange={(e) => onValueChange(configVariable, e.target.value)}
@@ -63,6 +66,7 @@ const AdminConfigInput = ({
style={{ style={{
width: "100%", width: "100%",
}} }}
disabled={!configVariable.allowEdit}
autosize autosize
{...form.getInputProps("textValue")} {...form.getInputProps("textValue")}
placeholder={configVariable.defaultValue} placeholder={configVariable.defaultValue}
@@ -72,6 +76,7 @@ const AdminConfigInput = ({
{configVariable.type == "number" && ( {configVariable.type == "number" && (
<NumberInput <NumberInput
{...form.getInputProps("numberValue")} {...form.getInputProps("numberValue")}
disabled={!configVariable.allowEdit}
placeholder={configVariable.defaultValue} placeholder={configVariable.defaultValue}
onChange={(number) => onValueChange(configVariable, number)} onChange={(number) => onValueChange(configVariable, number)}
w={201} w={201}
@@ -80,6 +85,7 @@ const AdminConfigInput = ({
{configVariable.type == "filesize" && ( {configVariable.type == "filesize" && (
<FileSizeInput <FileSizeInput
{...form.getInputProps("numberValue")} {...form.getInputProps("numberValue")}
disabled={!configVariable.allowEdit}
value={parseInt(configVariable.value ?? configVariable.defaultValue)} value={parseInt(configVariable.value ?? configVariable.defaultValue)}
onChange={(bytes) => onValueChange(configVariable, bytes)} onChange={(bytes) => onValueChange(configVariable, bytes)}
w={201} w={201}
@@ -88,6 +94,7 @@ const AdminConfigInput = ({
{configVariable.type == "boolean" && ( {configVariable.type == "boolean" && (
<> <>
<Switch <Switch
disabled={!configVariable.allowEdit}
{...form.getInputProps("booleanValue", { type: "checkbox" })} {...form.getInputProps("booleanValue", { type: "checkbox" })}
onChange={(e) => onValueChange(configVariable, e.target.checked)} onChange={(e) => onValueChange(configVariable, e.target.checked)}
/> />
@@ -96,6 +103,7 @@ const AdminConfigInput = ({
{configVariable.type == "timespan" && ( {configVariable.type == "timespan" && (
<TimespanInput <TimespanInput
value={stringToTimespan(configVariable.value)} value={stringToTimespan(configVariable.value)}
disabled={!configVariable.allowEdit}
onChange={(timespan) => onChange={(timespan) =>
onValueChange(configVariable, timespanToString(timespan)) onValueChange(configVariable, timespanToString(timespan))
} }

View File

@@ -7,11 +7,11 @@ import {
useMantineTheme, useMantineTheme,
} from "@mantine/core"; } from "@mantine/core";
import { modals } from "@mantine/modals"; import { modals } from "@mantine/modals";
import Markdown, { MarkdownToJSX } from "markdown-to-jsx";
import Link from "next/link"; import Link from "next/link";
import React, { Dispatch, SetStateAction, useEffect, useState } from "react"; import React, { Dispatch, SetStateAction, useEffect, useState } from "react";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
import api from "../../services/api.service"; import api from "../../services/api.service";
import Markdown from "markdown-to-jsx";
const FilePreviewContext = React.createContext<{ const FilePreviewContext = React.createContext<{
shareId: string; shareId: string;
@@ -132,7 +132,8 @@ const TextPreview = () => {
.then((res) => setText(res.data ?? "Preview couldn't be fetched.")); .then((res) => setText(res.data ?? "Preview couldn't be fetched."));
}, [shareId, fileId]); }, [shareId, fileId]);
const options = { const options: MarkdownToJSX.Options = {
disableParsingRawHTML: true,
overrides: { overrides: {
pre: { pre: {
props: { props: {

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "المشاركة {shareId}", "share.title": "المشاركة {shareId}",
"share.description": "انظر ما الذي شاركته معك!", "share.description": "انظر ما الذي شاركته معك!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "تم تجاوز حد المشاهدات", "share.error.visitor-limit-exceeded.title": "تم تجاوز حد المشاهدات",
"share.error.visitor-limit-exceeded.description": "تم تجاوز الحد الأقصى لزوار هذه المشاركة.", "share.error.visitor-limit-exceeded.description": "تم تجاوز الحد الأقصى لزوار هذه المشاركة.",
"share.error.removed.title": "تمت إزالة المشاركة", "share.error.removed.title": "تمت إزالة المشاركة",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "الإعدادات", "admin.config.title": "الإعدادات",
"admin.config.category.general": "عام", "admin.config.category.general": "عام",
"admin.config.category.share": "مشاركة", "admin.config.category.share": "مشاركة",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "إظهار الصفحة الرئيسية", "admin.config.general.show-home-page": "إظهار الصفحة الرئيسية",
"admin.config.general.show-home-page.description": "تحديد ما إذا كان سيتم عرض الصفحة الرئيسية", "admin.config.general.show-home-page.description": "تحديد ما إذا كان سيتم عرض الصفحة الرئيسية",
"admin.config.general.session-duration": "مدة الجلسة", "admin.config.general.session-duration": "مدة الجلسة",
"admin.config.general.session-duration.description": "الوقت بالساعات الذي يجب على المستخدم بعده إعادة تسجيل الدخول (الافتراضي: 3 أشهر).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "الشعار", "admin.config.general.logo": "الشعار",
"admin.config.general.logo.description": "يمكنك تغيير شعارك عن طريق تحميل صورة جديدة. يجب أن تكون الصورة PNG ويجب أن يكون تنسيقها 1:1.", "admin.config.general.logo.description": "يمكنك تغيير شعارك عن طريق تحميل صورة جديدة. يجب أن تكون الصورة PNG ويجب أن يكون تنسيقها 1:1.",
"admin.config.general.logo.placeholder": "اختر صورة", "admin.config.general.logo.placeholder": "اختر صورة",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "المنفذ", "admin.config.smtp.port": "المنفذ",
"admin.config.smtp.port.description": "منفذ خادم الـSMTP", "admin.config.smtp.port.description": "منفذ خادم الـSMTP",
"admin.config.smtp.email": "البريد الإلكتروني", "admin.config.smtp.email": "البريد الإلكتروني",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "اسم المستخدم", "admin.config.smtp.username": "اسم المستخدم",
"admin.config.smtp.username.description": "اسم المستخدم لخادم الـSMTP", "admin.config.smtp.username.description": "اسم المستخدم لخادم الـSMTP",
"admin.config.smtp.password": "كلمة السر", "admin.config.smtp.password": "كلمة السر",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Sdílení {shareId}", "share.title": "Sdílení {shareId}",
"share.description": "Podívejte se, co jsem s vámi sdílel!", "share.description": "Podívejte se, co jsem s vámi sdílel!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Limit návštěvníků překročen", "share.error.visitor-limit-exceeded.title": "Limit návštěvníků překročen",
"share.error.visitor-limit-exceeded.description": "Limit návštěvníků tohoto sdílení byl překročen.", "share.error.visitor-limit-exceeded.description": "Limit návštěvníků tohoto sdílení byl překročen.",
"share.error.removed.title": "Sdílení bylo odstraněno", "share.error.removed.title": "Sdílení bylo odstraněno",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Nastavení", "admin.config.title": "Nastavení",
"admin.config.category.general": "Obecné", "admin.config.category.general": "Obecné",
"admin.config.category.share": "Sdílení", "admin.config.category.share": "Sdílení",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Zobrazit domovskou stránku", "admin.config.general.show-home-page": "Zobrazit domovskou stránku",
"admin.config.general.show-home-page.description": "Zda zobrazovat domovskou stránku", "admin.config.general.show-home-page.description": "Zda zobrazovat domovskou stránku",
"admin.config.general.session-duration": "Délka trvání relace", "admin.config.general.session-duration": "Délka trvání relace",
"admin.config.general.session-duration.description": "Čas v hodinách, po kterém se uživatel musí znovu přihlásit (výchozí: 3 měsíce).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Změňte své logo nahráním nového obrázku. Obrázek musí být PNG a měl by mít formát 1:1.", "admin.config.general.logo.description": "Změňte své logo nahráním nového obrázku. Obrázek musí být PNG a měl by mít formát 1:1.",
"admin.config.general.logo.placeholder": "Vybrat obrázek", "admin.config.general.logo.placeholder": "Vybrat obrázek",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port SMTP serveru", "admin.config.smtp.port.description": "Port SMTP serveru",
"admin.config.smtp.email": "E-mail", "admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Uživatelské jméno", "admin.config.smtp.username": "Uživatelské jméno",
"admin.config.smtp.username.description": "Uživatelské jméno SMTP serveru", "admin.config.smtp.username.description": "Uživatelské jméno SMTP serveru",
"admin.config.smtp.password": "Heslo", "admin.config.smtp.password": "Heslo",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Použít checksum",
"admin.config.s3.use-checksum.description": "Vypněte pro backendy které nepodporují checksum (např. B2)",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Del {shareId}", "share.title": "Del {shareId}",
"share.description": "Se hvad jeg har delt med dig!", "share.description": "Se hvad jeg har delt med dig!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Grænsen for besøgende overskredet", "share.error.visitor-limit-exceeded.title": "Grænsen for besøgende overskredet",
"share.error.visitor-limit-exceeded.description": "Besøgsgrænsen for denne deling er blevet overskredet.", "share.error.visitor-limit-exceeded.description": "Besøgsgrænsen for denne deling er blevet overskredet.",
"share.error.removed.title": "Deling fjernet", "share.error.removed.title": "Deling fjernet",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Konfiguration", "admin.config.title": "Konfiguration",
"admin.config.category.general": "Generelt", "admin.config.category.general": "Generelt",
"admin.config.category.share": "Del", "admin.config.category.share": "Del",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Vis forside", "admin.config.general.show-home-page": "Vis forside",
"admin.config.general.show-home-page.description": "Om forsiden skal vises", "admin.config.general.show-home-page.description": "Om forsiden skal vises",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Skift dit logo ved at uploade et nyt billede. Billedet skal være PNG og skal have formatet 1:1.", "admin.config.general.logo.description": "Skift dit logo ved at uploade et nyt billede. Billedet skal være PNG og skal have formatet 1:1.",
"admin.config.general.logo.placeholder": "Vælg billede", "admin.config.general.logo.placeholder": "Vælg billede",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Porten til SMTP serveren", "admin.config.smtp.port.description": "Porten til SMTP serveren",
"admin.config.smtp.email": "E-mail", "admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Brugernavn", "admin.config.smtp.username": "Brugernavn",
"admin.config.smtp.username.description": "Brugernavnet til SMTP serveren", "admin.config.smtp.username.description": "Brugernavnet til SMTP serveren",
"admin.config.smtp.password": "Adgangskode", "admin.config.smtp.password": "Adgangskode",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Freigabe {shareId}", "share.title": "Freigabe {shareId}",
"share.description": "Schau, was ich mit dir geteilt habe!", "share.description": "Schau, was ich mit dir geteilt habe!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Besucher Limit erreicht", "share.error.visitor-limit-exceeded.title": "Besucher Limit erreicht",
"share.error.visitor-limit-exceeded.description": "Die maximale Besucheranzahl für diese Freigabe ist überschritten.", "share.error.visitor-limit-exceeded.description": "Die maximale Besucheranzahl für diese Freigabe ist überschritten.",
"share.error.removed.title": "Freigabe entfernt", "share.error.removed.title": "Freigabe entfernt",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Datenschutzerklärung", "privacy.title": "Datenschutzerklärung",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Konfigurationsdatei aktiv",
"admin.config.config-file-warning.description": "Da Pingvin Share mit einer Konfigurationsdatei konfiguriert ist, kann die Konfiguration nicht über die Benutzeroberfläche geändert werden.",
"admin.config.title": "Einstellungen", "admin.config.title": "Einstellungen",
"admin.config.category.general": "Allgemein", "admin.config.category.general": "Allgemein",
"admin.config.category.share": "Freigabe", "admin.config.category.share": "Freigabe",
@@ -412,8 +415,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery-URL der OpenID OAuth App", "admin.config.oauth.oidc-discovery-uri.description": "Discovery-URL der OpenID OAuth App",
"admin.config.oauth.oidc-sign-out": "Abmelden von OpenID Connect", "admin.config.oauth.oidc-sign-out": "Abmelden von OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Wenn aktiviert, wird der Benutzer mit der „Abmelden“-Schaltfläche vom OpenID-Connect-Provider abgemeldet.", "admin.config.oauth.oidc-sign-out.description": "Wenn aktiviert, wird der Benutzer mit der „Abmelden“-Schaltfläche vom OpenID-Connect-Provider abgemeldet.",
"admin.config.oauth.oidc-scope": "OpenID Connect scope", "admin.config.oauth.oidc-scope": "OpenID Connect",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.", "admin.config.oauth.oidc-scope.description": "Scopes, die vom OpenID Connect Provider angefordert werden sollen.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect Benutzername anfordern", "admin.config.oauth.oidc-username-claim": "OpenID Connect Benutzername anfordern",
"admin.config.oauth.oidc-username-claim.description": "Benutzername im OpenID Token. Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.", "admin.config.oauth.oidc-username-claim.description": "Benutzername im OpenID Token. Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
"admin.config.oauth.oidc-role-path": "Pfad zu den Rollen im OpenID Verbindungs-Token", "admin.config.oauth.oidc-role-path": "Pfad zu den Rollen im OpenID Verbindungs-Token",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "Der Schlüssel, der den Zugriff auf den S3-Bucket ermöglicht.", "admin.config.s3.key.description": "Der Schlüssel, der den Zugriff auf den S3-Bucket ermöglicht.",
"admin.config.s3.secret": "Geheimnis", "admin.config.s3.secret": "Geheimnis",
"admin.config.s3.secret.description": "Das Geheimnis, das den Zugriff auf den S3-Bucket ermöglicht.", "admin.config.s3.secret.description": "Das Geheimnis, das den Zugriff auf den S3-Bucket ermöglicht.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Rechtliches", "admin.config.category.legal": "Rechtliches",
"admin.config.legal.enabled": "Impressum und Datenschutz aktivieren", "admin.config.legal.enabled": "Impressum und Datenschutz aktivieren",
"admin.config.legal.enabled.description": "Gibt an, ob die Links zum Impressum und zur Datenschutzerklärung im Footer angezeigt werden sollen.", "admin.config.legal.enabled.description": "Gibt an, ob die Links zum Impressum und zur Datenschutzerklärung im Footer angezeigt werden sollen.",
@@ -521,7 +526,7 @@ export default {
"common.error.unknown": "Ein unbekannter Fehler ist aufgetreten", "common.error.unknown": "Ein unbekannter Fehler ist aufgetreten",
"common.error.invalid-email": "Ungültige E-Mail-Adresse", "common.error.invalid-email": "Ungültige E-Mail-Adresse",
"common.error.too-short": "Muss mindestens {length} Zeichen enthalten", "common.error.too-short": "Muss mindestens {length} Zeichen enthalten",
"common.error.too-long": "Muss maximal {length} Zeichen enthalten", "common.error.too-long": "Darf maximal {length} Zeichen enthalten",
"common.error.number-too-small": "Darf mindestens {min} sein", "common.error.number-too-small": "Darf mindestens {min} sein",
"common.error.number-too-large": "Darf höchstens {max} sein", "common.error.number-too-large": "Darf höchstens {max} sein",
"common.error.exact-length": "Muss genau {length} Zeichen lang sein", "common.error.exact-length": "Muss genau {length} Zeichen lang sein",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Διαμοιρασμός {shareId}", "share.title": "Διαμοιρασμός {shareId}",
"share.description": "Σας προωθώ αρχεία προς κοινοποίηση.", "share.description": "Σας προωθώ αρχεία προς κοινοποίηση.",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Υπέρβαση ορίου επισκέπτη", "share.error.visitor-limit-exceeded.title": "Υπέρβαση ορίου επισκέπτη",
"share.error.visitor-limit-exceeded.description": "Ξεπεράστηκε το όριο επισκεπτών σε αυτή την κοινοποίηση.", "share.error.visitor-limit-exceeded.description": "Ξεπεράστηκε το όριο επισκεπτών σε αυτή την κοινοποίηση.",
"share.error.removed.title": "Κοινοποίηση αφαιρέθηκε", "share.error.removed.title": "Κοινοποίηση αφαιρέθηκε",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Διαμόρφωση", "admin.config.title": "Διαμόρφωση",
"admin.config.category.general": "Γενικά", "admin.config.category.general": "Γενικά",
"admin.config.category.share": "Διαμοιρασμός", "admin.config.category.share": "Διαμοιρασμός",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Εμφάνιση αρχικής σελίδας", "admin.config.general.show-home-page": "Εμφάνιση αρχικής σελίδας",
"admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα", "admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα",
"admin.config.general.session-duration": "Διάρκεια συνεδρίας", "admin.config.general.session-duration": "Διάρκεια συνεδρίας",
"admin.config.general.session-duration.description": "Χρόνος σε ώρες μετά την οποία ένας χρήστης πρέπει να συνδεθεί ξανά (προεπιλογή: 3 μήνες).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Λογότυπο", "admin.config.general.logo": "Λογότυπο",
"admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.", "admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.",
"admin.config.general.logo.placeholder": "Επιλέξτε εικόνα", "admin.config.general.logo.placeholder": "Επιλέξτε εικόνα",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Θύρα", "admin.config.smtp.port": "Θύρα",
"admin.config.smtp.port.description": "SMTP θύρα", "admin.config.smtp.port.description": "SMTP θύρα",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Όνομα χρήστη", "admin.config.smtp.username": "Όνομα χρήστη",
"admin.config.smtp.username.description": "Όνομα χρήστη στον SMTP εξυπηρετητή", "admin.config.smtp.username.description": "Όνομα χρήστη στον SMTP εξυπηρετητή",
"admin.config.smtp.password": "Κωδικός πρόσβασης", "admin.config.smtp.password": "Κωδικός πρόσβασης",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -366,6 +366,8 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Share {shareId}", "share.title": "Share {shareId}",
"share.description": "Look what I've shared with you!", "share.description": "Look what I've shared with you!",
"share.fileCount":
"{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Visitor limit exceeded", "share.error.visitor-limit-exceeded.title": "Visitor limit exceeded",
"share.error.visitor-limit-exceeded.description": "share.error.visitor-limit-exceeded.description":
"The visitor limit from this share has been exceeded.", "The visitor limit from this share has been exceeded.",
@@ -408,12 +410,16 @@ export default {
// /imprint // /imprint
"imprint.title": "Imprint", "imprint.title": "Imprint",
// END /imprint // END /imprint
// /privacy // /privacy
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description":
"As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Configuration", "admin.config.title": "Configuration",
"admin.config.category.general": "General", "admin.config.category.general": "General",
"admin.config.category.share": "Share", "admin.config.category.share": "Share",
@@ -434,7 +440,7 @@ export default {
"Whether to show the home page", "Whether to show the home page",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
"admin.config.general.session-duration.description": "admin.config.general.session-duration.description":
"Time in hours after which a user must log in again (default: 3 months).", "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "admin.config.general.logo.description":
"Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.", "Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.",
@@ -503,7 +509,7 @@ export default {
"admin.config.smtp.port.description": "Port of the SMTP server", "admin.config.smtp.port.description": "Port of the SMTP server",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "admin.config.smtp.email.description":
"Email address from wich the emails get sent", "Email address from which the emails get sent",
"admin.config.smtp.username": "Username", "admin.config.smtp.username": "Username",
"admin.config.smtp.username.description": "Username of the SMTP server", "admin.config.smtp.username.description": "Username of the SMTP server",
"admin.config.smtp.password": "Password", "admin.config.smtp.password": "Password",
@@ -639,7 +645,8 @@ export default {
"admin.config.category.s3": "S3", "admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Enabled", "admin.config.s3.enabled": "Enabled",
"admin.config.s3.enabled.description": "Whether S3 should be used to store the shared files instead of the local file system.", "admin.config.s3.enabled.description":
"Whether S3 should be used to store the shared files instead of the local file system.",
"admin.config.s3.endpoint": "Endpoint", "admin.config.s3.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.", "admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region", "admin.config.s3.region": "Region",
@@ -647,23 +654,34 @@ export default {
"admin.config.s3.bucket-name": "Bucket name", "admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.", "admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"admin.config.s3.bucket-path": "Path", "admin.config.s3.bucket-path": "Path",
"admin.config.s3.bucket-path.description": "The default path which should be used to store the files in the S3 bucket.", "admin.config.s3.bucket-path.description":
"The default path which should be used to store the files in the S3 bucket.",
"admin.config.s3.key": "Key", "admin.config.s3.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description":
"The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description":
"The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description":
"Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description":
"Whether to show a link to imprint and privacy policy in the footer.",
"admin.config.legal.imprint-text": "Imprint text", "admin.config.legal.imprint-text": "Imprint text",
"admin.config.legal.imprint-text.description": "The text which should be shown in the imprint. Supports Markdown. Leave blank to link to an external imprint page.", "admin.config.legal.imprint-text.description":
"The text which should be shown in the imprint. Supports Markdown. Leave blank to link to an external imprint page.",
"admin.config.legal.imprint-url": "Imprint URL", "admin.config.legal.imprint-url": "Imprint URL",
"admin.config.legal.imprint-url.description": "If you already have an imprint page you can link it here instead of using the text field.", "admin.config.legal.imprint-url.description":
"If you already have an imprint page you can link it here instead of using the text field.",
"admin.config.legal.privacy-policy-text": "Privacy policy text", "admin.config.legal.privacy-policy-text": "Privacy policy text",
"admin.config.legal.privacy-policy-text.description": "The text which should be shown in the privacy policy. Supports Markdown. Leave blank to link to an external privacy policy page.", "admin.config.legal.privacy-policy-text.description":
"The text which should be shown in the privacy policy. Supports Markdown. Leave blank to link to an external privacy policy page.",
"admin.config.legal.privacy-policy-url": "Privacy policy URL", "admin.config.legal.privacy-policy-url": "Privacy policy URL",
"admin.config.legal.privacy-policy-url.description": "If you already have a privacy policy page you can link it here instead of using the text field.", "admin.config.legal.privacy-policy-url.description":
"If you already have a privacy policy page you can link it here instead of using the text field.",
// 404 // 404
"404.description": "Oops this page doesn't exist.", "404.description": "Oops this page doesn't exist.",

View File

@@ -192,7 +192,7 @@ export default {
"admin.users.edit.update.change-password.field": "Nueva contraseña", "admin.users.edit.update.change-password.field": "Nueva contraseña",
"admin.users.edit.update.change-password.button": "Guardar nueva contraseña", "admin.users.edit.update.change-password.button": "Guardar nueva contraseña",
"admin.users.edit.update.notify.password.success": "Contraseña cambiada correctamente", "admin.users.edit.update.notify.password.success": "Contraseña cambiada correctamente",
"admin.users.edit.delete.title": "Eliminar usuario: {username} ?", "admin.users.edit.delete.title": "¿Eliminar usuario: {username} ?",
"admin.users.edit.delete.description": "¿Realmente deseas eliminar a este usuario y todos sus enlaces compartidos?", "admin.users.edit.delete.description": "¿Realmente deseas eliminar a este usuario y todos sus enlaces compartidos?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Crear usuario", "admin.users.modal.create.title": "Crear usuario",
@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Compartido {shareId}", "share.title": "Compartido {shareId}",
"share.description": "¡Mira lo que he compartido contigo!", "share.description": "¡Mira lo que he compartido contigo!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Se excedió el límite de visitas", "share.error.visitor-limit-exceeded.title": "Se excedió el límite de visitas",
"share.error.visitor-limit-exceeded.description": "Se ha excedido el límite de visitas para este compartido.", "share.error.visitor-limit-exceeded.description": "Se ha excedido el límite de visitas para este compartido.",
"share.error.removed.title": "Compartido eliminado", "share.error.removed.title": "Compartido eliminado",
@@ -278,7 +279,7 @@ export default {
"share.error.access-denied.title": "Compartición privada", "share.error.access-denied.title": "Compartición privada",
"share.error.access-denied.description": "La cuenta actual no tiene permiso para acceder a este compartido", "share.error.access-denied.description": "La cuenta actual no tiene permiso para acceder a este compartido",
"share.modal.password.title": "Se requiere contraseña", "share.modal.password.title": "Se requiere contraseña",
"share.modal.password.description": "Please enter the password to access this share.", "share.modal.password.description": "Por favor, ingresa la contraseña para acceder a este recurso compartido.",
"share.modal.password": "Contraseña", "share.modal.password": "Contraseña",
"share.modal.error.invalid-password": "Contraseña inválida", "share.modal.error.invalid-password": "Contraseña inválida",
"share.button.download-all": "Descargar todo", "share.button.download-all": "Descargar todo",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Política de privacidad", "privacy.title": "Política de privacidad",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Archivo de configuración presente",
"admin.config.config-file-warning.description": "Como tienes configurado Pingvin Share con un archivo de configuración, no puedes cambiar la configuración a través de la interfaz gráfica.",
"admin.config.title": "Configuración", "admin.config.title": "Configuración",
"admin.config.category.general": "General", "admin.config.category.general": "General",
"admin.config.category.share": "Compartido", "admin.config.category.share": "Compartido",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Mostrar página de inicio", "admin.config.general.show-home-page": "Mostrar página de inicio",
"admin.config.general.show-home-page.description": "Mostrar o no la página de inicio", "admin.config.general.show-home-page.description": "Mostrar o no la página de inicio",
"admin.config.general.session-duration": "Duración de la sesión", "admin.config.general.session-duration": "Duración de la sesión",
"admin.config.general.session-duration.description": "Tiempo en horas después del cual un usuario debe iniciar sesión de nuevo (por defecto: 3 meses).", "admin.config.general.session-duration.description": "Tiempo después del cual un usuario debe volver a iniciar sesión (por defecto: 3 meses).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Cambia tu logo subiendo una nueva imagen. La imagen debe ser un PNG y debe estar en formato 1:1.", "admin.config.general.logo.description": "Cambia tu logo subiendo una nueva imagen. La imagen debe ser un PNG y debe estar en formato 1:1.",
"admin.config.general.logo.placeholder": "Elegir imagen", "admin.config.general.logo.placeholder": "Elegir imagen",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Puerto", "admin.config.smtp.port": "Puerto",
"admin.config.smtp.port.description": "Puerto del servidor SMTP", "admin.config.smtp.port.description": "Puerto del servidor SMTP",
"admin.config.smtp.email": "Correo", "admin.config.smtp.email": "Correo",
"admin.config.smtp.email.description": "Dirección desde la cual se envían los correos electrónicos", "admin.config.smtp.email.description": "Dirección de correo electrónico desde la cual se envían los correos electrónicos",
"admin.config.smtp.username": "Usuario", "admin.config.smtp.username": "Usuario",
"admin.config.smtp.username.description": "Usuario del servidor SMTP", "admin.config.smtp.username.description": "Usuario del servidor SMTP",
"admin.config.smtp.password": "Contraseña", "admin.config.smtp.password": "Contraseña",
@@ -431,9 +434,9 @@ export default {
"admin.config.ldap.enabled.description": "Usar autenticación LDAP para el inicio de sesión de usuarios", "admin.config.ldap.enabled.description": "Usar autenticación LDAP para el inicio de sesión de usuarios",
"admin.config.ldap.url": "URL del servidor", "admin.config.ldap.url": "URL del servidor",
"admin.config.ldap.url.description": "URL del servidor LDAP", "admin.config.ldap.url.description": "URL del servidor LDAP",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Usuario LDAP",
"admin.config.ldap.bind-dn.description": "Usuario predeterminado utilizado para realizar la búsqueda de usuarios", "admin.config.ldap.bind-dn.description": "Usuario predeterminado utilizado para realizar la búsqueda de usuarios",
"admin.config.ldap.bind-password": "Bind password", "admin.config.ldap.bind-password": "Contraseña LDAP",
"admin.config.ldap.bind-password.description": "Contraseña utilizada para realizar la búsqueda de usuarios", "admin.config.ldap.bind-password.description": "Contraseña utilizada para realizar la búsqueda de usuarios",
"admin.config.ldap.search-base": "Base de usuarios", "admin.config.ldap.search-base": "Base de usuarios",
"admin.config.ldap.search-base.description": "Ubicación base, donde se llevará a cabo la búsqueda de usuarios", "admin.config.ldap.search-base.description": "Ubicación base, donde se llevará a cabo la búsqueda de usuarios",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "La clave que permite el acceso al bucket S3.", "admin.config.s3.key.description": "La clave que permite el acceso al bucket S3.",
"admin.config.s3.secret": "Secreto", "admin.config.s3.secret": "Secreto",
"admin.config.s3.secret.description": "El secreto que permite acceder al bucket S3.", "admin.config.s3.secret.description": "El secreto que permite acceder al bucket S3.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Habilitar avisos legales", "admin.config.legal.enabled": "Habilitar avisos legales",
"admin.config.legal.enabled.description": "Mostrar un enlace al aviso legal y a la política de privacidad en el pie de página.", "admin.config.legal.enabled.description": "Mostrar un enlace al aviso legal y a la política de privacidad en el pie de página.",

View File

@@ -1,40 +1,40 @@
export default { export default {
// Navbar // Navbar
"navbar.upload": "Upload", "navbar.upload": "Laadi üles",
"navbar.signin": "Sign in", "navbar.signin": "Logi sisse",
"navbar.home": "Home", "navbar.home": "Avaleht",
"navbar.signup": "Sign up", "navbar.signup": "Registreeru",
"navbar.links.shares": "My shares", "navbar.links.shares": "Minu jagamised",
"navbar.links.reverse": "Reverse shares", "navbar.links.reverse": "Pööratud jagamised",
"navbar.avatar.account": "My account", "navbar.avatar.account": "Minu konto",
"navbar.avatar.admin": "Administration", "navbar.avatar.admin": "Administreerimine",
"navbar.avatar.signout": "Sign out", "navbar.avatar.signout": "Logi välja",
// END navbar // END navbar
// / // /
"home.title": "A <h>self-hosted</h> file sharing platform.", "home.title": "<h>Isehostitav</h> failijagamisplatvorm.",
"home.description": "Do you really want to give your personal files in the hand of third parties like WeTransfer?", "home.description": "Kas tõesti soovid anda oma isiklikud failid kolmandate osapoolte nagu WeTransfer kätte?",
"home.bullet.a.name": "Self-Hosted", "home.bullet.a.name": "Isehostitav",
"home.bullet.a.description": "Host Pingvin Share on your own machine.", "home.bullet.a.description": "Hosti Pingvin Share oma seadmes.",
"home.bullet.b.name": "Privacy", "home.bullet.b.name": "Privaatsus",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.", "home.bullet.b.description": "Sinu failid on sinu omad ja neile ei pääse ligi kolmandad osapooled.",
"home.bullet.c.name": "No annoying file size limit", "home.bullet.c.name": "Ei mingeid tüütuid failisuuruse piiranguid",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.", "home.bullet.c.description": "Laadi üles suuri faile ilma piiranguteta. Ainuke piirang on sinu kõvaketta maht.",
"home.button.start": "Get started", "home.button.start": "Alusta",
"home.button.source": "Source code", "home.button.source": "Lähtekood",
// END / // END /
// /auth/signin // /auth/signin
"signin.title": "Welcome back", "signin.title": "Tere tulemast tagasi",
"signin.description": "You don't have an account yet?", "signin.description": "Kas sul pole veel kontot?",
"signin.button.signup": "Sign up", "signin.button.signup": "Registreeru",
"signin.input.email-or-username": "Email or username", "signin.input.email-or-username": "E-post või kasutajanimi",
"signin.input.email-or-username.placeholder": "Your email or username", "signin.input.email-or-username.placeholder": "Sinu e-post või kasutajanimi",
"signin.input.password": "Password", "signin.input.password": "Parool",
"signin.input.password.placeholder": "Your password", "signin.input.password.placeholder": "Sinu parool",
"signin.button.submit": "Sign in", "signin.button.submit": "Logi sisse",
"signIn.notify.totp-required.title": "Two-factor authentication required", "signIn.notify.totp-required.title": "Kahefaktoriline autentimine nõutud",
"signIn.notify.totp-required.description": "Please enter your two-factor authentication code", "signIn.notify.totp-required.description": "Palun sisesta oma kahefaktorilise autentimise kood",
"signIn.oauth.or": "OR", "signIn.oauth.or": "VÕI",
"signIn.oauth.signInWith": "Sign in with", "signIn.oauth.signInWith": "Logi sisse kasutades",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -42,489 +42,494 @@ export default {
"signIn.oauth.oidc": "OpenID", "signIn.oauth.oidc": "OpenID",
// END /auth/signin // END /auth/signin
// /auth/signup // /auth/signup
"signup.title": "Create an account", "signup.title": "Loo konto",
"signup.description": "Already have an account?", "signup.description": "Kas sul on juba konto?",
"signup.button.signin": "Sign in", "signup.button.signin": "Logi sisse",
"signup.input.username": "Username", "signup.input.username": "Kasutajanimi",
"signup.input.username.placeholder": "Your username", "signup.input.username.placeholder": "Sinu kasutajanimi",
"signup.input.email": "Email", "signup.input.email": "E-post",
"signup.input.email.placeholder": "Your email", "signup.input.email.placeholder": "Sinu e-post",
"signup.button.submit": "Let's get started", "signup.button.submit": "Alustame",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "TOTP autentimine",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Sisene",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Forgot your password?", "resetPassword.title": "Unustasid oma parooli?",
"resetPassword.description": "Enter your email to reset your password.", "resetPassword.description": "Parooli lähtestamiseks sisesta enda e-posti aadress.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.", "resetPassword.notify.success": "Kui antud e-post on registreeritud, saadetakse e-mailiga link parooli lähtestamiseks.",
"resetPassword.button.back": "Back to sign in page", "resetPassword.button.back": "Tagasi sisselogimislehele",
"resetPassword.text.resetPassword": "Reset password", "resetPassword.text.resetPassword": "Lähtesta parool",
"resetPassword.text.enterNewPassword": "Enter your new password", "resetPassword.text.enterNewPassword": "Sisesta uus parool",
"resetPassword.input.password": "New password", "resetPassword.input.password": "Uus parool",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.", "resetPassword.notify.passwordReset": "Sinu parool on edukalt lähtestatud.",
// /account // /account
"account.title": "My account", "account.title": "Minu konto",
"account.card.info.title": "Account info", "account.card.info.title": "Konto info",
"account.card.info.username": "Username", "account.card.info.username": "Kasutajanimi",
"account.card.info.email": "Email", "account.card.info.email": "E-post",
"account.notify.info.success": "Account updated successfully", "account.notify.info.success": "Konto edukalt uuendatud",
"account.card.password.title": "Password", "account.card.password.title": "Parool",
"account.card.password.old": "Old password", "account.card.password.old": "Vana parool",
"account.card.password.new": "New password", "account.card.password.new": "Uus parool",
"account.card.password.noPasswordSet": "You do not have a password set. To sign in using your email and password, you need to create a password.", "account.card.password.noPasswordSet": "Sul pole parooli seatud. E-posti ja parooliga sisselogimiseks pead looma parooli.",
"account.notify.password.success": "Password changed successfully", "account.notify.password.success": "Parool edukalt muudetud",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Sisselogimine sotsiaalmeediatega",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Ühenda",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Eemalda ühendus",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Ühendus eemaldatud",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Eemalda konto seos",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your login credentials", "account.modal.unlink.description": "Sotsiaalmeedia kontode lahtiühendamine võib põhjustada konto kaotamist kui sa ei mäleta oma sisselogimisandmeid",
"account.notify.oauth.unlinked.success": "Unlinked successfully", "account.notify.oauth.unlinked.success": "Ühendus eemaldatud edukalt",
"account.card.security.title": "Security", "account.card.security.title": "Turvalisus",
"account.card.security.totp.enable.description": "Enter your current password to start enabling TOTP", "account.card.security.totp.enable.description": "Sisesta oma praegune parool, et alustada TOTP sisselülitamist",
"account.card.security.totp.disable.description": "Enter your current password to disable TOTP", "account.card.security.totp.disable.description": "Sisesta oma praegune parool, et välja lülitada TOTP",
"account.card.security.totp.button.start": "Start", "account.card.security.totp.button.start": "Alusta",
"account.modal.totp.title": "Enable TOTP", "account.modal.totp.title": "Lülita sisse TOTP",
"account.modal.totp.step1": "Step 1: Add your authenticator", "account.modal.totp.step1": "1. samm: Lisa oma autentikaator",
"account.modal.totp.step2": "Step 2: Validate your code", "account.modal.totp.step2": "2. samm: Kinnita oma kood",
"account.modal.totp.enterManually": "Enter manually", "account.modal.totp.enterManually": "Sisesta käsitsi",
"account.modal.totp.code": "Code", "account.modal.totp.code": "Kood",
"common.button.clickToCopy": "Click to copy", "common.button.clickToCopy": "Klõpsa, et kopeerida",
"account.modal.totp.verify": "Verify", "account.modal.totp.verify": "Kinnita",
"account.notify.totp.disable": "TOTP disabled successfully", "account.notify.totp.disable": "TOTP edukalt välja lülitatud",
"account.notify.totp.enable": "TOTP enabled successfully", "account.notify.totp.enable": "TOTP edukalt sisse lülitatud",
"account.card.language.title": "Language", "account.card.language.title": "Keel",
"account.card.language.description": "The project is translated by the community. Some languages might be incomplete.", "account.card.language.description": "Projekti tõlkis kogukond. Mõned keeleversioonid võivad olla mittetäielikud.",
"account.card.color.title": "Color scheme", "account.card.color.title": "Värviskeem",
// ThemeSwitcher.tsx // ThemeSwitcher.tsx
"account.theme.dark": "Dark", "account.theme.dark": "Tume",
"account.theme.light": "Light", "account.theme.light": "Hele",
"account.theme.system": "System", "account.theme.system": "Süsteemi",
"account.button.delete": "Delete Account", "account.button.delete": "Kustuta konto",
"account.modal.delete.title": "Delete Account", "account.modal.delete.title": "Kustuta konto",
"account.modal.delete.description": "Do you really want to delete your account including all your active shares?", "account.modal.delete.description": "Kas tahad tõesti kustutada enda konto koos kõikide jagatud failidega?",
// END /account // END /account
// /account/shares // /account/shares
"account.shares.title": "My shares", "account.shares.title": "Minu jagamised",
"account.shares.title.empty": "It's empty here 👀", "account.shares.title.empty": "Siin on tühjus 👀",
"account.shares.description.empty": "You don't have any shares.", "account.shares.description.empty": "Sul pole ühtegi jagamist.",
"account.shares.button.create": "Create one", "account.shares.button.create": "Loo üks",
"account.shares.info.title": "Share informations", "account.shares.info.title": "Jagamise andmed",
"account.shares.table.id": "ID", "account.shares.table.id": "ID",
"account.shares.table.name": "Name", "account.shares.table.name": "Nimi",
"account.shares.table.description": "Description", "account.shares.table.description": "Kirjeldus",
"account.shares.table.visitors": "Visitors", "account.shares.table.visitors": "Külastajad",
"account.shares.table.expiresAt": "Expires on", "account.shares.table.expiresAt": "Aegub",
"account.shares.table.createdAt": "Created on", "account.shares.table.createdAt": "Loodud",
"account.shares.table.size": "Size", "account.shares.table.size": "Suurus",
"account.shares.table.password-protected": "Password protected", "account.shares.table.password-protected": "Parooliga kaitstud",
"account.shares.table.visitor-count": "{count} of {max}", "account.shares.table.visitor-count": "{count} / {max}",
"account.shares.table.expiry-never": "Never", "account.shares.table.expiry-never": "Mitte kunagi",
"account.shares.modal.share-informations": "Share informations", "account.shares.modal.share-informations": "Jagamise andmed",
"account.shares.modal.share-link": "Share link", "account.shares.modal.share-link": "Jagamise link",
"account.shares.modal.delete.title": "Delete share: {share}", "account.shares.modal.delete.title": "Kustuta jagamine: {share}",
"account.shares.modal.delete.description": "Do you really want to delete this share?", "account.shares.modal.delete.description": "Kas soovid tõesti seda jagamist kustutada?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
"account.reverseShares.title": "Reverse shares", "account.reverseShares.title": "Tagasijagamine",
"account.reverseShares.description": "A reverse share allows you to generate a unique URL that allows external users to create a share.", "account.reverseShares.description": "Tagasijagamine võimaldab sul genereerida unikaalse URL-i, mille kaudu väliskasutajad saavad luua jagamise.",
"account.reverseShares.title.empty": "It's empty here 👀", "account.reverseShares.title.empty": "Siin on tühjus 👀",
"account.reverseShares.description.empty": "You don't have any reverse shares.", "account.reverseShares.description.empty": "Sul pole ühtegi tagasijagamist.",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Create reverse share", "account.reverseShares.modal.title": "Loo tagasijagamine",
"account.reverseShares.modal.expiration.label": "Expiration", "account.reverseShares.modal.expiration.label": "Aegumisaeg",
"account.reverseShares.modal.expiration.minute-singular": "Minute", "account.reverseShares.modal.expiration.minute-singular": "Minut",
"account.reverseShares.modal.expiration.minute-plural": "Minutes", "account.reverseShares.modal.expiration.minute-plural": "Minutit",
"account.reverseShares.modal.expiration.hour-singular": "Hour", "account.reverseShares.modal.expiration.hour-singular": "Tund",
"account.reverseShares.modal.expiration.hour-plural": "Hours", "account.reverseShares.modal.expiration.hour-plural": "Tundi",
"account.reverseShares.modal.expiration.day-singular": "Day", "account.reverseShares.modal.expiration.day-singular": "Päev",
"account.reverseShares.modal.expiration.day-plural": "Days", "account.reverseShares.modal.expiration.day-plural": "Päeva",
"account.reverseShares.modal.expiration.week-singular": "Week", "account.reverseShares.modal.expiration.week-singular": "Nädal",
"account.reverseShares.modal.expiration.week-plural": "Weeks", "account.reverseShares.modal.expiration.week-plural": "Nädalat",
"account.reverseShares.modal.expiration.month-singular": "Month", "account.reverseShares.modal.expiration.month-singular": "Kuu",
"account.reverseShares.modal.expiration.month-plural": "Months", "account.reverseShares.modal.expiration.month-plural": "Kuud",
"account.reverseShares.modal.expiration.year-singular": "Year", "account.reverseShares.modal.expiration.year-singular": "Aasta",
"account.reverseShares.modal.expiration.year-plural": "Years", "account.reverseShares.modal.expiration.year-plural": "Aastat",
"account.reverseShares.modal.max-size.label": "Max share size", "account.reverseShares.modal.max-size.label": "Jagamise maksimaalne suurus",
"account.reverseShares.modal.send-email": "Send email notifications", "account.reverseShares.modal.send-email": "Saada e-posti teavitusi",
"account.reverseShares.modal.send-email.description": "Sends you an email notification when a share is created with this reverse share link.", "account.reverseShares.modal.send-email.description": "Sulle saadetakse e-posti teavitus kui selle tagasijagamise lingiga luuakse jagamine.",
"account.reverseShares.modal.simplified": "Simple mode", "account.reverseShares.modal.simplified": "Lihtrežiim",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will only be able to customize the name and description of the share.", "account.reverseShares.modal.simplified.description": "Muuda faili üleslaadija jaoks lihtsaks faili sinuga jagamine. Nad saavad muuta ainult jagamise nime ja kirjeldust.",
"account.reverseShares.modal.public-access": "Public access", "account.reverseShares.modal.public-access": "Avalik juurdepääs",
"account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.", "account.reverseShares.modal.public-access.description": "Tee selle tagasijagamise lingi abil loodud jagamised avalikuks. Kui see on keelatud, saavad neid vaadata ainult sina ja jagamise looja.",
"account.reverseShares.modal.max-use.label": "Max uses", "account.reverseShares.modal.max-use.label": "Maksimaalne kasutuskordade arv",
"account.reverseShares.modal.max-use.description": "The maximum amount of times this URL can be used to create a share.", "account.reverseShares.modal.max-use.description": "Maksimaalne arv kordi, mil seda URL-i saab kasutada jagamise loomiseks.",
"account.reverseShare.never-expires": "This reverse share will never expire.", "account.reverseShare.never-expires": "See tagasijagamine ei aegu kunagi.",
"account.reverseShare.expires-on": "This reverse share will expire on {expiration}.", "account.reverseShare.expires-on": "See tagasijagamine aegub {expiration}.",
"account.reverseShares.table.no-shares": "No shares created yet", "account.reverseShares.table.no-shares": "Ühtegi jagamist pole veel loodud",
"account.reverseShares.table.count.singular": "share", "account.reverseShares.table.count.singular": "jagamine",
"account.reverseShares.table.count.plural": "shares", "account.reverseShares.table.count.plural": "jagamised",
"account.reverseShares.table.shares": "Shares", "account.reverseShares.table.shares": "Jagamised",
"account.reverseShares.table.remaining": "Remaining uses", "account.reverseShares.table.remaining": "Järelejäänud kasutuskorrad",
"account.reverseShares.table.max-size": "Max share size", "account.reverseShares.table.max-size": "Jagamise maksimaalne suurus",
"account.reverseShares.table.expires": "Expires at", "account.reverseShares.table.expires": "Aegub",
"account.reverseShares.modal.reverse-share-link": "Reverse share link", "account.reverseShares.modal.reverse-share-link": "Tagasijagamise link",
"account.reverseShares.modal.delete.title": "Delete reverse share", "account.reverseShares.modal.delete.title": "Kustuta tagasijagamine",
"account.reverseShares.modal.delete.description": "Do you really want to delete this reverse share? If you do, the associated shares will be deleted as well.", "account.reverseShares.modal.delete.description": "Kas soovid tõesti seda tagasijagamist kustutada? Kui jah, siis kustutatakse ka sellega seotud jagamised.",
// END /account/reverseShares // END /account/reverseShares
// /admin // /admin
"admin.title": "Administration", "admin.title": "Administreerimine",
"admin.button.users": "User management", "admin.button.users": "Kasutajate haldamine",
"admin.button.shares": "Share management", "admin.button.shares": "Jagamiste haldamine",
"admin.button.config": "Configuration", "admin.button.config": "Seaded",
"admin.version": "Version", "admin.version": "Versioon",
// END /admin // END /admin
// /admin/users // /admin/users
"admin.users.title": "User management", "admin.users.title": "Kasutajate haldamine",
"admin.users.table.username": "Username", "admin.users.table.username": "Kasutajanimi",
"admin.users.table.email": "Email", "admin.users.table.email": "E-post",
"admin.users.table.admin": "Admin", "admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Edit user: {username}", "admin.users.edit.update.title": "Muuda kasutajat: {username}",
"admin.users.edit.update.admin-privileges": "Admin privileges", "admin.users.edit.update.admin-privileges": "Administraatori õigused",
"admin.users.edit.update.change-password.title": "Change password", "admin.users.edit.update.change-password.title": "Muuda parooli",
"admin.users.edit.update.change-password.field": "New password", "admin.users.edit.update.change-password.field": "Uus parool",
"admin.users.edit.update.change-password.button": "Save new password", "admin.users.edit.update.change-password.button": "Salvesta uus parool",
"admin.users.edit.update.notify.password.success": "Password changed successfully", "admin.users.edit.update.notify.password.success": "Parool edukalt muudetud",
"admin.users.edit.delete.title": "Delete user: {username} ?", "admin.users.edit.delete.title": "Kustuta kasutaja: {username}?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?", "admin.users.edit.delete.description": "Kas soovid tõesti kustutada selle kasutaja ja kõik tema jagamised?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Create user", "admin.users.modal.create.title": "Loo kasutaja",
"admin.users.modal.create.username": "Username", "admin.users.modal.create.username": "Kasutajanimi",
"admin.users.modal.create.email": "Email", "admin.users.modal.create.email": "E-post",
"admin.users.modal.create.password": "Password", "admin.users.modal.create.password": "Parool",
"admin.users.modal.create.manual-password": "Set password manually", "admin.users.modal.create.manual-password": "Sea parool käsitsi",
"admin.users.modal.create.manual-password.description": "If not checked, the user will receive an email with a link to set their password.", "admin.users.modal.create.manual-password.description": "Kui see ei ole märgitud, saab kasutaja e-kirja lingiga mille kaudu oma parooli seada.",
"admin.users.modal.create.admin": "Admin privileges", "admin.users.modal.create.admin": "Administraatori õigused",
"admin.users.modal.create.admin.description": "If checked, the user will be able to access the admin panel.", "admin.users.modal.create.admin.description": "Kui see on märgitud, saab kasutaja pääseda administraatori paneelile.",
// END /admin/users // END /admin/users
// /admin/shares // /admin/shares
"admin.shares.title": "Share management", "admin.shares.title": "Jagamiste haldus",
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "Jagamise ID",
"admin.shares.table.username": "Creator", "admin.shares.table.username": "Looja",
"admin.shares.table.visitors": "Visitors", "admin.shares.table.visitors": "Külastajad",
"admin.shares.table.expires": "Expires on", "admin.shares.table.expires": "Aegub",
"admin.shares.edit.delete.title": "Delete share: {id}", "admin.shares.edit.delete.title": "Kustuta jagamine: {id}",
"admin.shares.edit.delete.description": "Do you really want to delete this share?", "admin.shares.edit.delete.description": "Kas soovid tõesti seda jagamist kustutada?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Upload", "upload.title": "Laadi üles",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.", "upload.notify.confirm-leave": "Kas oled kindel, et soovid sellelt lehelt lahkuda? Sinu üleslaadimine tühistatakse.",
"upload.notify.generic-error": "An error occurred while finishing your share.", "upload.notify.generic-error": "Jagamise lõpetamisel tekkis viga.",
"upload.notify.count-failed": "{count} files failed to upload. Trying again.", "upload.notify.count-failed": "{count} faili ei õnnestunud üles laadida. Proovime uuesti.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link", "upload.reverse-share.error.invalid.title": "Vigane tagasijagamise link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.", "upload.reverse-share.error.invalid.description": "See tagasijagamine on aegunud või vigane.",
// Dropzone.tsx // Dropzone.tsx
"upload.dropzone.title": "Upload files", "upload.dropzone.title": "Laadi üles failid",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.", "upload.dropzone.description": "Lohista ja aseta failid siia, et alustada jagamist. Võtame vastu ainult faile, mille kogusuurus on maksimaalselt {maxSize}.",
"upload.dropzone.notify.file-too-big": "Your files exceed the maximum share size of {maxSize}.", "upload.dropzone.notify.file-too-big": "Sinu failid ületavad lubatud suuruse {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Name", "upload.filelist.name": "Nimi",
"upload.filelist.size": "Size", "upload.filelist.size": "Suurus",
// showCreateUploadModal.tsx // showCreateUploadModal.tsx
"upload.modal.title": "Create Share", "upload.modal.title": "Loo jagamine",
"upload.modal.link.error.invalid": "Can only contain letters, numbers, underscores, and hyphens", "upload.modal.link.error.invalid": "Võib sisaldada ainult tähti, numbreid, alakriipse ja kriipse",
"upload.modal.link.error.taken": "This link is already in use", "upload.modal.link.error.taken": "See link on juba kasutusel",
"upload.modal.not-signed-in": "You're not signed in", "upload.modal.not-signed-in": "Sa ei ole sisse logitud",
"upload.modal.not-signed-in-description": "You will be unable to delete your share manually and view the visitor count.", "upload.modal.not-signed-in-description": "Sa ei saa oma jagamist käsitsi kustutada ega külastajate arvu vaadata.",
"upload.modal.expires.never": "never", "upload.modal.expires.never": "mitte kunagi",
"upload.modal.expires.never-long": "Permanent share", "upload.modal.expires.never-long": "Püsiv jagamine",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.", "upload.modal.expires.error.too-long": "Aegumiskuupäev ületab lubatud maksimaalset {max}.",
"upload.modal.link.label": "Link", "upload.modal.link.label": "Link",
"upload.modal.expires.label": "Expiration", "upload.modal.expires.label": "Aegumisaeg",
"upload.modal.expires.minute-singular": "Minute", "upload.modal.expires.minute-singular": "Minut",
"upload.modal.expires.minute-plural": "Minutes", "upload.modal.expires.minute-plural": "Minutit",
"upload.modal.expires.hour-singular": "Hour", "upload.modal.expires.hour-singular": "Tund",
"upload.modal.expires.hour-plural": "Hours", "upload.modal.expires.hour-plural": "Tundi",
"upload.modal.expires.day-singular": "Day", "upload.modal.expires.day-singular": "Päev",
"upload.modal.expires.day-plural": "Days", "upload.modal.expires.day-plural": "Päeva",
"upload.modal.expires.week-singular": "Week", "upload.modal.expires.week-singular": "Nädal",
"upload.modal.expires.week-plural": "Weeks", "upload.modal.expires.week-plural": "Nädalat",
"upload.modal.expires.month-singular": "Month", "upload.modal.expires.month-singular": "Kuu",
"upload.modal.expires.month-plural": "Months", "upload.modal.expires.month-plural": "Kuud",
"upload.modal.expires.year-singular": "Year", "upload.modal.expires.year-singular": "Aasta",
"upload.modal.expires.year-plural": "Years", "upload.modal.expires.year-plural": "Aastat",
"upload.modal.accordion.name-and-description.title": "Name and description", "upload.modal.accordion.name-and-description.title": "Nimi ja kirjeldus",
"upload.modal.accordion.name-and-description.name.placeholder": "Name", "upload.modal.accordion.name-and-description.name.placeholder": "Nimi",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share", "upload.modal.accordion.name-and-description.description.placeholder": "Märkus selle jagamise saajatele",
"upload.modal.accordion.email.title": "Email recipients", "upload.modal.accordion.email.title": "E-kirja saajad",
"upload.modal.accordion.email.placeholder": "Enter email recipients", "upload.modal.accordion.email.placeholder": "Sisesta e-posti aadressid",
"upload.modal.accordion.email.invalid-email": "Invalid email address", "upload.modal.accordion.email.invalid-email": "Vigane e-posti aadress",
"upload.modal.accordion.security.title": "Security options", "upload.modal.accordion.security.title": "Turvavalikud",
"upload.modal.accordion.security.password.label": "Password protection", "upload.modal.accordion.security.password.label": "Paroolikaitse",
"upload.modal.accordion.security.password.placeholder": "No password", "upload.modal.accordion.security.password.placeholder": "Parool puudub",
"upload.modal.accordion.security.max-views.label": "Maximum views", "upload.modal.accordion.security.max-views.label": "Maksimaalne vaatamiste arv",
"upload.modal.accordion.security.max-views.placeholder": "No limit", "upload.modal.accordion.security.max-views.placeholder": "Piiramatu",
// showCompletedUploadModal.tsx // showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "This share will never expire.", "upload.modal.completed.never-expires": "See jagamine ei aegu mitte kunagi.",
"upload.modal.completed.expires-on": "This share will expire on {expiration}.", "upload.modal.completed.expires-on": "See jagamine aegub {expiration}.",
"upload.modal.completed.share-ready": "Share ready", "upload.modal.completed.share-ready": "Jagamine valmis",
"upload.modal.completed.notified-reverse-share-creator": "We have notified the creator of the reverse share. You can also manually share this link with them through other means.", "upload.modal.completed.notified-reverse-share-creator": "Oleme teavitanud tagasijagamise loojat. Saad samuti seda linki nendega käsitsi teiste vahenditega jagada.",
// END /upload // END /upload
// /share/[id] // /share/[id]
"share.title": "Share {shareId}", "share.title": "Jagamine {shareId}",
"share.description": "Look what I've shared with you!", "share.description": "Vaata, mida ma sinuga jagasin!",
"share.error.visitor-limit-exceeded.title": "Visitor limit exceeded", "share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.description": "The visitor limit from this share has been exceeded.", "share.error.visitor-limit-exceeded.title": "Külastajate limiit ületatud",
"share.error.removed.title": "Share removed", "share.error.visitor-limit-exceeded.description": "Selle jagamise külastajate limiit on ületatud.",
"share.error.not-found.title": "Share not found", "share.error.removed.title": "Jagamine eemaldatud",
"share.error.not-found.description": "The share you're looking for doesn't exist.", "share.error.not-found.title": "Jagamist ei leitud",
"share.error.access-denied.title": "Private share", "share.error.not-found.description": "Otsitavat jagamist ei eksisteeri.",
"share.error.access-denied.description": "The current account does not have permission to access this share", "share.error.access-denied.title": "Privaatne jagamine",
"share.modal.password.title": "Password required", "share.error.access-denied.description": "Praegusel kontol puudub luba sellele jagamisele juurde pääseda",
"share.modal.password.description": "Please enter the password to access this share.", "share.modal.password.title": "Parool vajalik",
"share.modal.password": "Password", "share.modal.password.description": "Palun sisesta parool, et sellele jagamisele juurde pääseda.",
"share.modal.error.invalid-password": "Invalid password", "share.modal.password": "Parool",
"share.button.download-all": "Download all", "share.modal.error.invalid-password": "Vigane parool",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.", "share.button.download-all": "Laadi kõik alla",
"share.modal.file-link": "File link", "share.notify.download-all-preparing": "Jagamist valmistatakse ette. Palun proovi mõne minuti pärast uuesti.",
"share.table.name": "Name", "share.modal.file-link": "Faili link",
"share.table.size": "Size", "share.table.name": "Nimi",
"share.modal.file-preview.error.not-supported.title": "Preview not supported", "share.table.size": "Suurus",
"share.modal.file-preview.error.not-supported.description": "Previews are not supported for this type of files. Please download the file to view it.", "share.modal.file-preview.error.not-supported.title": "Eelvaadet ei toetata",
"share.modal.file-preview.error.not-supported.description": "Selle failitüübi eelvaateid ei toetata. Faili vaatamiseks laadi see alla.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Edit {shareId}", "share.edit.title": "Muuda jagamist {shareId}",
"share.edit.append-upload": "Append file", "share.edit.append-upload": "Lisa fail",
"share.edit.notify.generic-error": "An error occurred while finishing your share.", "share.edit.notify.generic-error": "Jagamise lõpetamisel tekkis viga.",
"share.edit.notify.save-success": "Share updated successfully", "share.edit.notify.save-success": "Jagamine edukalt uuendatud",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint // /imprint
"imprint.title": "Imprint", "imprint.title": "Kontaktandmed",
// END /imprint // END /imprint
// /privacy // /privacy
"privacy.title": "Privacy Policy", "privacy.title": "Privaatsuspoliitika",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.title": "Configuration", "admin.config.config-file-warning.title": "Konfiguratsioonifail olemas",
"admin.config.category.general": "General", "admin.config.config-file-warning.description": "Kuna teil on konfigureeritud Pingvin Share konfiguratsioonifailiga, ei saa te muuta konfiguratsiooni kasutajaliidest kasutades.",
"admin.config.category.share": "Share", "admin.config.title": "Seaded",
"admin.config.category.email": "Email", "admin.config.category.general": "Üldine",
"admin.config.category.share": "Jagamine",
"admin.config.category.email": "E-post",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "admin.config.category.oauth": "Sotsiaalmeediaga sisselogimine",
"admin.config.general.app-name": "App name", "admin.config.general.app-name": "Rakenduse nimi",
"admin.config.general.app-name.description": "Name of the application", "admin.config.general.app-name.description": "Rakenduse nimi",
"admin.config.general.app-url": "App URL", "admin.config.general.app-url": "Rakenduse URL",
"admin.config.general.app-url.description": "On which URL Pingvin Share is available", "admin.config.general.app-url.description": "URL, mille kaudu Pingvin Share on kättesaadav",
"admin.config.general.secure-cookies": "Secure cookies", "admin.config.general.secure-cookies": "Turvalised küpsised",
"admin.config.general.secure-cookies.description": "Whether to set the secure flag on cookies. If enabled, the site will not function when accessed over HTTP.", "admin.config.general.secure-cookies.description": "Kas küpsistele seata turvalisuse lipp. Kui see on lubatud, ei tööta teenus HTTP kaudu.",
"admin.config.general.show-home-page": "Show home page", "admin.config.general.show-home-page": "Kuva avaleht",
"admin.config.general.show-home-page.description": "Whether to show the home page", "admin.config.general.show-home-page.description": "Kas kuvada avalehte",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Seansi kestus",
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).", "admin.config.general.session-duration.description": "Aeg, mille pärast kasutaja peab uuesti sisse logima (vaikeväärtus: 3 kuud).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.", "admin.config.general.logo.description": "Muuda oma logo laadides üles uus pilt. Pildi formaat peab olema PNG ja kuju 1:1.",
"admin.config.general.logo.placeholder": "Pick image", "admin.config.general.logo.placeholder": "Vali pilt",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing", "admin.config.email.enable-share-email-recipients": "Luba e-posti teavitused jagamise saajatele",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.", "admin.config.email.enable-share-email-recipients.description": "Kas lubada e-posti teavitusi jagamise saajatele. Lubage ainult, kui SMTP on aktiveeritud.",
"admin.config.email.share-recipients-subject": "Share recipients subject", "admin.config.email.share-recipients-subject": "Jagamise saajate pealkiri",
"admin.config.email.share-recipients-subject.description": "Subject of the email which gets sent to the share recipients.", "admin.config.email.share-recipients-subject.description": "Pealkiri mis saadetakse jagamise saajatele.",
"admin.config.email.share-recipients-message": "Share recipients message", "admin.config.email.share-recipients-message": "Jagamise saajate sõnum",
"admin.config.email.share-recipients-message.description": "Message which gets sent to the share recipients. Available variables:\n {creator} - The username of the creator of the share\n {creatorEmail} - The email of the creator of the share\n {shareUrl} - The URL of the share\n {desc} - The description of the share\n {expires} - The expiration date of the share\n These variables will be replaced with the actual value.", "admin.config.email.share-recipients-message.description": "Sõnum, mis saadetakse jagamise saajatele. Kasutatavad muutujad:\n {creator} - jagamise looja kasutajanimi\n {creatorEmail} - jagamise looja e-post\n {shareUrl} - jagamise URL\n {desc} - jagamise kirjeldus\n {expires} - jagamise aegumiskuupäev\n Need muutujad asendatakse vastavate väärtustega.",
"admin.config.email.reverse-share-subject": "Reverse share subject", "admin.config.email.reverse-share-subject": "Tagasijagamise Pealkiri",
"admin.config.email.reverse-share-subject.description": "Subject of the sent email when someone created a share with your reverse share link.", "admin.config.email.reverse-share-subject.description": "Pealkiri mis saadetakse kui keegi loob jagamise sinu tagasijagamise lingiga.",
"admin.config.email.reverse-share-message": "Reverse share message", "admin.config.email.reverse-share-message": "Tagasijagamise sõnum",
"admin.config.email.reverse-share-message.description": "Message which gets sent when someone created a share with your reverse share link. {shareUrl} will be replaced with the creator's name and the share URL.", "admin.config.email.reverse-share-message.description": "Sõnum mis saadetakse kui keegi loob jagamise sinu tagasijagamise lingiga. {shareUrl} asendatakse looja nime ja jagamise URL-iga.",
"admin.config.email.reset-password-subject": "Reset password subject", "admin.config.email.reset-password-subject": "Parooli lähtestamise Pealkiri",
"admin.config.email.reset-password-subject.description": "Subject of the sent email when a user requests a password reset.", "admin.config.email.reset-password-subject.description": "Pealkiri mis saadetakse kui kasutaja taotleb parooli lähtestamist.",
"admin.config.email.reset-password-message": "Reset password message", "admin.config.email.reset-password-message": "Parooli lähtestamise sõnum",
"admin.config.email.reset-password-message.description": "Message which gets sent when a user requests a password reset. {url} will be replaced with the reset password URL.", "admin.config.email.reset-password-message.description": "Sõnum mis saadetakse kui kasutaja taotleb parooli lähtestamist. {url} asendatakse parooli lähtestamise URL-iga.",
"admin.config.email.invite-subject": "Invite subject", "admin.config.email.invite-subject": "Kutse pealkiri",
"admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.", "admin.config.email.invite-subject.description": "Pealkiri mis saadetakse kui administraator kutsub kasutajat.",
"admin.config.email.invite-message": "Invite message", "admin.config.email.invite-message": "Kutse sõnum",
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the users password.", "admin.config.email.invite-message.description": "Sõnum mis saadetakse kui administraator kutsub kasutajat. {url} asendatakse kutse URL-iga, {email} e-posti aadressiga ja {password} kasutaja parooliga.",
"admin.config.share.allow-registration": "Allow registration", "admin.config.share.allow-registration": "Luba registreerimine",
"admin.config.share.allow-registration.description": "Whether registration is allowed", "admin.config.share.allow-registration.description": "Kas registreerimine on lubatud",
"admin.config.share.allow-unauthenticated-shares": "Allow unauthenticated shares", "admin.config.share.allow-unauthenticated-shares": "Luba autentimata jagamised",
"admin.config.share.allow-unauthenticated-shares.description": "Whether unauthenticated users can create shares", "admin.config.share.allow-unauthenticated-shares.description": "Kas autentimata kasutajad saavad jagamisi luua",
"admin.config.share.max-expiration": "Max expiration", "admin.config.share.max-expiration": "Maksimaalne aegumisaeg",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.", "admin.config.share.max-expiration.description": "Maksimaalne jagamise aegumisaeg. Määra 0, et lubada piiramatu aegumisaeg.",
"admin.config.share.share-id-length": "Default share ID length", "admin.config.share.share-id-length": "Vaikimisi jagamise ID pikkus",
"admin.config.share.share-id-length.description": "Default length for the generated ID of a share. This value is also used to generate links for reverse shares. A value below 8 is not considered secure.", "admin.config.share.share-id-length.description": "Vaikimisi pikkus jagamise genereeritud ID jaoks. Seda väärtust kasutatakse ka tagasijagamise linkide loomiseks. Väärtust alla 8 ei peeta turvaliseks.",
"admin.config.share.max-size": "Max size", "admin.config.share.max-size": "Maksimaalne suurus",
"admin.config.share.max-size.description": "Maximum share size", "admin.config.share.max-size.description": "Maksimaalne jagamise suurus",
"admin.config.share.zip-compression-level": "Zip compression level", "admin.config.share.zip-compression-level": "Zip tihendustase",
"admin.config.share.zip-compression-level.description": "Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression. ", "admin.config.share.zip-compression-level.description": "Reguleeri tihendustaset, et leida tasakaal faili suuruse ja tihendamise kiiruse vahel. Kehtivad väärtused jäävad vahemikku 0 kuni 9, kus 0 tähendab mitte tihendamist ja 9 maksimaalset tihendamist. ",
"admin.config.share.chunk-size": "Chunk size", "admin.config.share.chunk-size": "Andmeploki suurus",
"admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.", "admin.config.share.chunk-size.description": "Reguleeri üleslaadimiseks kasutatavate andmeplokkide suurust, et saavutada efektiivsus ja töökindlus vastavalt sinu internetiühendusele. Väiksemad plokid võivad ebastabiilsete ühenduste korral parandada üleslaadimise edukust, samas kui suuremad plokid muudavad üleslaadimise kiiremaks stabiilsete ühenduste korral.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Ava jagamise loomise aken automaatselt",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "Jagamise loomise aken avaneb automaatselt kui kasutaja valib failid nii, et ei pea nuppu käsitsi klõpsama.",
"admin.config.smtp.enabled": "Enable", "admin.config.smtp.enabled": "Luba",
"admin.config.smtp.enabled.description": "Whether SMTP is enabled. Only set this to true if you entered the host, port, email, user and password of your SMTP server.", "admin.config.smtp.enabled.description": "Kas SMTP on lubatud. Sea see tõeks ainult siis, kui oled sisestanud oma SMTP serveri hosti, pordi, e-posti, kasutajanime ja parooli.",
"admin.config.smtp.host": "Host", "admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "Host of the SMTP server", "admin.config.smtp.host.description": "SMTP serveri host",
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port of the SMTP server", "admin.config.smtp.port.description": "SMTP serveri port",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "E-post",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "E-posti aadress, millelt e-kirjad saadetakse",
"admin.config.smtp.username": "Username", "admin.config.smtp.username": "Kasutajanimi",
"admin.config.smtp.username.description": "Username of the SMTP server", "admin.config.smtp.username.description": "SMTP serveri kasutajanimi",
"admin.config.smtp.password": "Password", "admin.config.smtp.password": "Parool",
"admin.config.smtp.password.description": "Password of the SMTP server", "admin.config.smtp.password.description": "SMTP serveri parool",
"admin.config.smtp.button.test": "Send test email", "admin.config.smtp.button.test": "Saada test e-kiri",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates", "admin.config.smtp.allow-unauthorized-certificates": "Usalda volitamata SMTP serveri sertifikaate",
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.", "admin.config.smtp.allow-unauthorized-certificates.description": "Sea see tõeks ainult siis, kui pead usaldama iseallkirjastatud sertifikaate.",
"admin.config.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Luba registreerimine",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Luba kasutajatel registreerida sotsiaalmeedia sisselogimise kaudu",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "Ignoreeri TOTP-i",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "Kas ignoreerida TOTP-i kui kasutaja kasutab sotsiaalset sisselogimist.",
"admin.config.oauth.disable-password": "Disable password login", "admin.config.oauth.disable-password": "Keela parooliga sisselogimine",
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.", "admin.config.oauth.disable-password.description": "Kas keelata parooliga sisselogimine\nVeendu, et OAuth pakkuja on korralikult seadistatud enne selle aktiveerimist, et vältida juurdepääsu lukustamist.",
"admin.config.oauth.github-enabled": "GitHub", "admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled", "admin.config.oauth.github-enabled.description": "Kas GitHub sisselogimine on lubatud",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "GitHub kliendi ID",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app", "admin.config.oauth.github-client-id.description": "GitHub OAuth rakenduse kliendi ID",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "GitHub kliendi saladus",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "GitHub OAuth rakenduse kliendi saladus",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Kas Google sisselogimine on lubatud",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "Google kliendi ID",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "Google OAuth rakenduse kliendi ID",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "Google kliendi saladus",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Google OAuth rakenduse kliendi saladus",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Kas Microsofti sisselogimine on lubatud",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant", "admin.config.oauth.microsoft-tenant": "Microsofti tenant",
"admin.config.oauth.microsoft-tenant.description": "Tenant ID of the Microsoft OAuth app\ncommon: Users with both a personal Microsoft account and a work or school account from Microsoft Entra ID can sign in to the application. organizations: Only users with work or school accounts from Microsoft Entra ID can sign in to the application.\nconsumers: Only users with a personal Microsoft account can sign in to the application.\ndomain name of the Microsoft Entra tenant or the tenant ID in GUID format: Only users from a specific Microsoft Entra tenant (directory members with a work or school account or directory guests with a personal Microsoft account) can sign in to the application.", "admin.config.oauth.microsoft-tenant.description": "Microsoft OAuth rakenduse tenant ID\ncommon: Kasutajad, kellel on nii isiklik Microsofti konto kui ka töö- või koolikonto Microsoft Entra ID-s, saavad rakendusse sisse logida. organizations: Ainult töö- või koolikontoga kasutajad saavad sisse logida.\nconsumers: Ainult isikliku Microsofti kontoga kasutajad saavad sisse logida.\nMicrosoft Entra tenanti domeeninimi või GUID formaadis tenant ID: Ainult teatud tenanti kasutajad saavad sisse logida.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "Microsoft kliendi ID",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth rakenduse kliendi ID",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret", "admin.config.oauth.microsoft-client-secret": "Microsoft kliendi saladus",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth rakenduse kliendi saladus",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "Kas Discord sisselogimine on lubatud",
"admin.config.oauth.discord-limited-users": "Discord limited users", "admin.config.oauth.discord-limited-users": "Piiratud Discord kasutajad",
"admin.config.oauth.discord-limited-users.description": "Limit signing in to specific users by their Discord ID. Leave it blank to disable.", "admin.config.oauth.discord-limited-users.description": "Piira sisselogimist ainult teatud kasutajatele nende Discord ID alusel. Jäta tühjaks, et keelata.",
"admin.config.oauth.discord-limited-guild": "Discord limited server ID", "admin.config.oauth.discord-limited-guild": "Piiratud Discord serveri ID",
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.", "admin.config.oauth.discord-limited-guild.description": "Piira sisselogimist ainult teatud serveri kasutajatele. Jäta tühjaks, et keelata.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord kliendi ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Discord OAuth rakenduse kliendi ID",
"admin.config.oauth.discord-client-secret": "Discord Client secret", "admin.config.oauth.discord-client-secret": "Discord kliendi saladus",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-secret.description": "Discord OAuth rakenduse kliendi saladus",
"admin.config.oauth.oidc-enabled": "OpenID Connect", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled", "admin.config.oauth.oidc-enabled.description": "Kas OpenID Connect sisselogimine on lubatud",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect avastamis-URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth rakenduse avastamis-URI",
"admin.config.oauth.oidc-sign-out": "Sign out from OpenID Connect", "admin.config.oauth.oidc-sign-out": "Logi välja OpenID Connectist",
"admin.config.oauth.oidc-sign-out.description": "Whether the “Sign out” button will sign out from the OpenID Connect provider", "admin.config.oauth.oidc-sign-out.description": "Kas 'Logi välja' nupp logib välja OpenID Connect pakkujast",
"admin.config.oauth.oidc-scope": "OpenID Connect scope", "admin.config.oauth.oidc-scope": "OpenID Connect ulatus",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.", "admin.config.oauth.oidc-scope.description": "Ulatus, mida tuleks OpenID Connect pakkujalt küsida.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim", "admin.config.oauth.oidc-username-claim": "OpenID Connect kasutajanime väide",
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-username-claim.description": "Kasutajanime väide OpenID Connect ID tokenis. Jäta tühjaks kui sa ei tea mis seade see on.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token", "admin.config.oauth.oidc-role-path": "Tee rollideni OpenID Connect tokenis",
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-role-path.description": "Peab olema kehtiv JMES tee, mis viitab rollide massiivile." + "Juurdepääsuõiguste haldamine OpenID Connecti rollide abil on soovitatav ainult siis, kui ühtegi muud identiteedipakkujat pole konfigureeritud ja parooliga sisselogimine on keelatud." + "Leave it blank if you don't know what this config is.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access", "admin.config.oauth.oidc-role-general-access": "OpenID Connect roll üldiseks juurdepääsuks",
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a users roles for them to log in. " + "Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-role-general-access.description": "Üldiseks juurdepääsuks nõutav roll. Kasutajal peab see roll olema, et ta saaks sisse logida." + "Jäta see tühjaks kui sa ei tea mis seade see on.",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access", "admin.config.oauth.oidc-role-admin-access": "OpenID Connect roll admin juurdepääsuks",
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a users roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-role-admin-access.description": "Üldiseks juurdepääsuks vajalik roll. Kasutaja peab selle rolli omama, et sisse logida. " + "Jäta see tühjaks kui sa ei tea mis seade see on",
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID", "admin.config.oauth.oidc-client-id": "OpenID Connect kliendi ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app", "admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth rakenduse kliendi ID",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect kliendi saladus",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app", "admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth rakenduse kliendi saladus",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP", "admin.config.ldap.enabled": "Luba LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Kasutaja sisselogimiseks kasutada LDAP autentimist",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Serveri URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "LDAP serveri URL",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user used to perform the user search", "admin.config.ldap.bind-dn.description": "Vaikimisi kasutaja, mida kasutatakse kasutajate otsimiseks",
"admin.config.ldap.bind-password": "Bind password", "admin.config.ldap.bind-password": "Bind parool",
"admin.config.ldap.bind-password.description": "Password used to perform the user search", "admin.config.ldap.bind-password.description": "Parool, mida kasutatakse kasutajate otsimiseks",
"admin.config.ldap.search-base": "User base", "admin.config.ldap.search-base": "Kasutajate alus",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "admin.config.ldap.search-base.description": "Põhikoht, kus kasutajaid otsitakse",
"admin.config.ldap.search-query": "User query", "admin.config.ldap.search-query": "Kasutaja päring",
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.", "admin.config.ldap.search-query.description": "Kasutaja päring, mida kasutatakse LDAP kasutaja otsimiseks 'Kasutajate alus' alt. %username% saab kasutada kasutaja sisestuse kohatäitjana.",
"admin.config.ldap.admin-groups": "Admin group", "admin.config.ldap.admin-groups": "Admin grupp",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Grupp, mis on vajalik admin juurdepääsuks.",
"admin.config.ldap.field-name-member-of": "User groups attribute name", "admin.config.ldap.field-name-member-of": "Kasutaja gruppide atribuut",
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.", "admin.config.ldap.field-name-member-of.description": "LDAP atribuut, mis näitab, millesse gruppi kasutaja kuulub. Seda kasutatakse admin grupi kontrollimisel.",
"admin.config.ldap.field-name-email": "User email attribute name", "admin.config.ldap.field-name-email": "Kasutaja e-posti atribuut",
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.", "admin.config.ldap.field-name-email.description": "LDAP atribuut kasutaja e-posti aadressi jaoks.",
"admin.config.notify.success": "Configuration updated successfully.", "admin.config.notify.success": "Seaded edukalt uuendatud.",
"admin.config.notify.logo-success": "Logo updated successfully. It may take a few minutes to update on the website.", "admin.config.notify.logo-success": "Logo edukalt uuendatud. Veebilehe värskendamiseks võib kuluda paar minutit.",
"admin.config.notify.no-changes": "No changes to save.", "admin.config.notify.no-changes": "Pole muudatusi mida salvestada.",
"admin.config.category.s3": "S3", "admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Enabled", "admin.config.s3.enabled": "Lubatud",
"admin.config.s3.enabled.description": "Whether S3 should be used to store the shared files instead of the local file system.", "admin.config.s3.enabled.description": "Kas S3-d tuleks kasutada jagatud failide salvestamiseks lokaalse failisüsteemi asemel.",
"admin.config.s3.endpoint": "Endpoint", "admin.config.s3.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.", "admin.config.s3.endpoint.description": "S3 ämbri URL.",
"admin.config.s3.region": "Region", "admin.config.s3.region": "Regioon",
"admin.config.s3.region.description": "The region of the S3 bucket.", "admin.config.s3.region.description": "S3 ämbri regioon.",
"admin.config.s3.bucket-name": "Bucket name", "admin.config.s3.bucket-name": "Ämbri nimi",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.", "admin.config.s3.bucket-name.description": "S3 ämbri nimi.",
"admin.config.s3.bucket-path": "Path", "admin.config.s3.bucket-path": "S3 ämbri tee",
"admin.config.s3.bucket-path.description": "The default path which should be used to store the files in the S3 bucket.", "admin.config.s3.bucket-path.description": "Vaikimisi tee, mida kasutatakse failide salvestamiseks S3 ämbris.",
"admin.config.s3.key": "Key", "admin.config.s3.key": "Võti",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "S3 ämbri võti.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Saladus",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "S3 ämbri saladus.",
"admin.config.category.legal": "Legal", "admin.config.s3.use-checksum": "Kasuta kontrollsummat",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.s3.use-checksum.description": "Lülita välja, kui tagaliides ei toeta kontrollsummasid (nt B2).",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.category.legal": "Juriidiline",
"admin.config.legal.imprint-text": "Imprint text", "admin.config.legal.enabled": "Luba juriidilised teated",
"admin.config.legal.imprint-text.description": "The text which should be shown in the imprint. Supports Markdown. Leave blank to link to an external imprint page.", "admin.config.legal.enabled.description": "Kas kuvada linki kontaktandmetele ja privaatsuspoliitikale jaluses.",
"admin.config.legal.imprint-url": "Imprint URL", "admin.config.legal.imprint-text": "Kontaktandmete tekst",
"admin.config.legal.imprint-url.description": "If you already have an imprint page you can link it here instead of using the text field.", "admin.config.legal.imprint-text.description": "Tekst, mis kuvatakse kontaktandmetel. Toetab Markdowni. Jäta tühjaks, et lingida välisele kontaktandmete lehele.",
"admin.config.legal.privacy-policy-text": "Privacy policy text", "admin.config.legal.imprint-url": "Kontaktandmete URL",
"admin.config.legal.privacy-policy-text.description": "The text which should be shown in the privacy policy. Supports Markdown. Leave blank to link to an external privacy policy page.", "admin.config.legal.imprint-url.description": "Kui sul on juba kontaktandmete leht saad selle siia linkida selle asemel, et kasutada tekstivälja.",
"admin.config.legal.privacy-policy-url": "Privacy policy URL", "admin.config.legal.privacy-policy-text": "Privaatsuspoliitika tekst",
"admin.config.legal.privacy-policy-url.description": "If you already have a privacy policy page you can link it here instead of using the text field.", "admin.config.legal.privacy-policy-text.description": "Tekst mis kuvatakse privaatsuspoliitikas. Toetab Markdowni. Jäta tühjaks, et lingida välisele privaatsuspoliitika lehele.",
"admin.config.legal.privacy-policy-url": "Privaatsuspoliitika URL",
"admin.config.legal.privacy-policy-url.description": "Kui sul on juba privaatsuspoliitika leht saad selle siia linkida selle asemel, et kasutada tekstivälja.",
// 404 // 404
"404.description": "Oops this page doesn't exist.", "404.description": "Ups, seda lehte ei eksisteeri.",
"404.button.home": "Bring me back home", "404.button.home": "Viia mind tagasi avalehele",
// error // error
"error.title": "Error", "error.title": "Viga",
"error.description": "Oops!", "error.description": "Ups!",
"error.button.back": "Go back", "error.button.back": "Mine tagasi",
"error.msg.default": "Something went wrong.", "error.msg.default": "Midagi läks valesti.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "Sa tühistasid autentimisprotsessi, palun proovi uuesti.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "Autentimisprotsess kestis liiga kaua, palun proovi uuesti.",
"error.msg.invalid_token": "Internal Error", "error.msg.invalid_token": "Sisemine viga",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.no_user": "Kasutajat, kes on seotud selle {0} kontoga ei eksisteeri.",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_email": "Ei saa sellest {0} kontost e-posti aadressi hankida.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.already_linked": "See {0} konto on juba seotud teise kontoga.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.", "error.msg.not_linked": "See {0} konto pole veel ühegi kontoga seotud.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.", "error.msg.unverified_account": "See {0} konto on kinnitamata, palun proovi pärast kinnitamist uuesti.",
"error.msg.user_not_allowed": "You are not allowed to sign in.", "error.msg.user_not_allowed": "Sul ei ole luba sisse logida.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.", "error.msg.cannot_get_user_info": "Ei õnnestunud saada sinu kasutaja andmeid sellest {0} kontost.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID Connect", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Save", "common.button.save": "Salvesta",
"common.button.create": "Create", "common.button.create": "Loo",
"common.button.submit": "Submit", "common.button.submit": "Esita",
"common.button.delete": "Delete", "common.button.delete": "Kustuta",
"common.button.cancel": "Cancel", "common.button.cancel": "Tühista",
"common.button.confirm": "Confirm", "common.button.confirm": "Kinnita",
"common.button.disable": "Disable", "common.button.disable": "Lülita välja",
"common.button.share": "Share", "common.button.share": "Jaga",
"common.button.generate": "Generate", "common.button.generate": "Genereeri",
"common.button.done": "Done", "common.button.done": "Valmis",
"common.text.link": "Link", "common.text.link": "Link",
"common.text.navigate-to-link": "Visit link", "common.text.navigate-to-link": "Külastage linki",
"common.text.or": "or", "common.text.or": "või",
"common.text.redirecting": "Redirecting...", "common.text.redirecting": "Ümbersuunamine...",
"common.button.go-back": "Go back", "common.button.go-back": "Mine tagasi",
"common.button.go-home": "Go home", "common.button.go-home": "Mine avalehele",
"common.notify.copied": "Your link was copied to the clipboard", "common.notify.copied": "Sinu link kopeeriti lõikelauale",
"common.notify.copied-link": "Your link was copied to the clipboard", "common.notify.copied-link": "Sinu link kopeeriti lõikelauale",
"common.success": "Success", "common.success": "Õnnestus",
"common.error": "Error", "common.error": "Viga",
"common.error.unknown": "An unknown error occurred", "common.error.unknown": "Tundmatu viga",
"common.error.invalid-email": "Invalid email address", "common.error.invalid-email": "Vigane e-posti aadress",
"common.error.too-short": "Must be at least {length} characters", "common.error.too-short": "Peab olema vähemalt {length} tähemärki",
"common.error.too-long": "Must be at most {length} characters", "common.error.too-long": "Peab olema maksimaalselt {length} tähemärki",
"common.error.number-too-small": "Must be at least {min}", "common.error.number-too-small": "Peab olema vähemalt {min}",
"common.error.number-too-large": "Must be at most {max}", "common.error.number-too-large": "Peab olema maksimaalselt {max}",
"common.error.exact-length": "Must be exactly {length} characters", "common.error.exact-length": "Peab olema täpselt {length} tähemärki",
"common.error.invalid-number": "Must be a number", "common.error.invalid-number": "Peab olema number",
"common.error.field-required": "This field is required" "common.error.field-required": "See väli on kohustuslik"
}; };

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Jaa {shareId}", "share.title": "Jaa {shareId}",
"share.description": "Katso, mitä olen jakanut kanssasi!", "share.description": "Katso, mitä olen jakanut kanssasi!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Vierailijoiden raja ylitetty", "share.error.visitor-limit-exceeded.title": "Vierailijoiden raja ylitetty",
"share.error.visitor-limit-exceeded.description": "Tämän jaon kävijäraja on ylittynyt.", "share.error.visitor-limit-exceeded.description": "Tämän jaon kävijäraja on ylittynyt.",
"share.error.removed.title": "Jako poistettu", "share.error.removed.title": "Jako poistettu",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Asetukset", "admin.config.title": "Asetukset",
"admin.config.category.general": "Yleiset", "admin.config.category.general": "Yleiset",
"admin.config.category.share": "Jako", "admin.config.category.share": "Jako",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Näytä kotisivu", "admin.config.general.show-home-page": "Näytä kotisivu",
"admin.config.general.show-home-page.description": "Näytetäänkö kotisivu vai ei", "admin.config.general.show-home-page.description": "Näytetäänkö kotisivu vai ei",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Muuta logoa lataamalla uusi kuva. Kuvan on oltava PNG ja sen on oltava formaatti 1:1.", "admin.config.general.logo.description": "Muuta logoa lataamalla uusi kuva. Kuvan on oltava PNG ja sen on oltava formaatti 1:1.",
"admin.config.general.logo.placeholder": "Valitse kuva", "admin.config.general.logo.placeholder": "Valitse kuva",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Portti", "admin.config.smtp.port": "Portti",
"admin.config.smtp.port.description": "SMTP palvelimen portti", "admin.config.smtp.port.description": "SMTP palvelimen portti",
"admin.config.smtp.email": "Sähköposti", "admin.config.smtp.email": "Sähköposti",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Käyttäjätunnus", "admin.config.smtp.username": "Käyttäjätunnus",
"admin.config.smtp.username.description": "SMTP palvelimen käyttäjänimi", "admin.config.smtp.username.description": "SMTP palvelimen käyttäjänimi",
"admin.config.smtp.password": "Salasana", "admin.config.smtp.password": "Salasana",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Partage {shareId}", "share.title": "Partage {shareId}",
"share.description": "Regardez ce que jai partagé !", "share.description": "Regardez ce que jai partagé !",
"share.fileCount": "{count, plural, =1 {# fichier} other {# fichiers}} · {size} (le fichier compressé peut être plus petit)",
"share.error.visitor-limit-exceeded.title": "Limite de visiteurs dépassée", "share.error.visitor-limit-exceeded.title": "Limite de visiteurs dépassée",
"share.error.visitor-limit-exceeded.description": "La limite de visiteurs de ce partage a été dépassée.", "share.error.visitor-limit-exceeded.description": "La limite de visiteurs de ce partage a été dépassée.",
"share.error.removed.title": "Partage supprimé", "share.error.removed.title": "Partage supprimé",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Politique de confidentialité", "privacy.title": "Politique de confidentialité",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Fichier de configuration présent",
"admin.config.config-file-warning.description": "Puisque vous avez configuré Pingvin Share avec un fichier de configuration, vous ne pouvez pas modifier la configuration via l'interface utilisateur.",
"admin.config.title": "Paramètres", "admin.config.title": "Paramètres",
"admin.config.category.general": "Général", "admin.config.category.general": "Général",
"admin.config.category.share": "Partage", "admin.config.category.share": "Partage",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Afficher la page daccueil", "admin.config.general.show-home-page": "Afficher la page daccueil",
"admin.config.general.show-home-page.description": "Afficher ou non la page daccueil", "admin.config.general.show-home-page.description": "Afficher ou non la page daccueil",
"admin.config.general.session-duration": "Durée de la session", "admin.config.general.session-duration": "Durée de la session",
"admin.config.general.session-duration.description": "Nombre dheures après lesquelles un utilisateur doit se reconnecter (par défaut : 3 mois).", "admin.config.general.session-duration.description": "Temps après lequel un utilisateur doit se reconnecter (par défaut : 3 mois).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Changez de logo en envoyant une nouvelle image. Limage doit être au format PNG et doit avoir un ratio 1:1.", "admin.config.general.logo.description": "Changez de logo en envoyant une nouvelle image. Limage doit être au format PNG et doit avoir un ratio 1:1.",
"admin.config.general.logo.placeholder": "Sélectionner une image", "admin.config.general.logo.placeholder": "Sélectionner une image",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port du serveur SMTP", "admin.config.smtp.port.description": "Port du serveur SMTP",
"admin.config.smtp.email": "Courriel", "admin.config.smtp.email": "Courriel",
"admin.config.smtp.email.description": "Adresse à partir de laquelle les courriels sont envoyés", "admin.config.smtp.email.description": "Adresse email à partir de laquelle les courriels sont envoyés",
"admin.config.smtp.username": "Nom dutilisateur", "admin.config.smtp.username": "Nom dutilisateur",
"admin.config.smtp.username.description": "Nom dutilisateur du serveur SMTP", "admin.config.smtp.username.description": "Nom dutilisateur du serveur SMTP",
"admin.config.smtp.password": "Mot de passe", "admin.config.smtp.password": "Mot de passe",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "La clé qui vous permet d'accéder au bucket S3.", "admin.config.s3.key.description": "La clé qui vous permet d'accéder au bucket S3.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "Le secret qui vous permet d'accéder au bucket S3.", "admin.config.s3.secret.description": "Le secret qui vous permet d'accéder au bucket S3.",
"admin.config.s3.use-checksum": "Utiliser la somme de contrôle",
"admin.config.s3.use-checksum.description": "Désactivez cette option pour les backends qui ne prennent pas en charge la somme de contrôle (ex. B2).",
"admin.config.category.legal": "Juridique", "admin.config.category.legal": "Juridique",
"admin.config.legal.enabled": "Activer les mentions légales", "admin.config.legal.enabled": "Activer les mentions légales",
"admin.config.legal.enabled.description": "Afficher/Masquer dans le pied de page un lien vers les mentions légales et la politique de confidentialité.", "admin.config.legal.enabled.description": "Afficher/Masquer dans le pied de page un lien vers les mentions légales et la politique de confidentialité.",

View File

@@ -124,9 +124,9 @@ export default {
"account.shares.table.expiresAt": "Istječe", "account.shares.table.expiresAt": "Istječe",
"account.shares.table.createdAt": "Kreirano", "account.shares.table.createdAt": "Kreirano",
"account.shares.table.size": "Veličina", "account.shares.table.size": "Veličina",
"account.shares.table.password-protected": "Password protected", "account.shares.table.password-protected": "Zaštićeno lozinkom",
"account.shares.table.visitor-count": "{count} of {max}", "account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never", "account.shares.table.expiry-never": "Nikad",
"account.shares.modal.share-informations": "Informacije o dijeljenju", "account.shares.modal.share-informations": "Informacije o dijeljenju",
"account.shares.modal.share-link": "Podijelite poveznicu", "account.shares.modal.share-link": "Podijelite poveznicu",
"account.shares.modal.delete.title": "Izbriši dijeljenje {share}", "account.shares.modal.delete.title": "Izbriši dijeljenje {share}",
@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Dijeljenje {shareId}", "share.title": "Dijeljenje {shareId}",
"share.description": "Pogledajte što sam podijelio s vama!", "share.description": "Pogledajte što sam podijelio s vama!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Prekoračeno ograničenje posjetitelja", "share.error.visitor-limit-exceeded.title": "Prekoračeno ograničenje posjetitelja",
"share.error.visitor-limit-exceeded.description": "Ograničenje broja posjetitelja za ovo dijeljenje je premašeno.", "share.error.visitor-limit-exceeded.description": "Ograničenje broja posjetitelja za ovo dijeljenje je premašeno.",
"share.error.removed.title": "Dijeljenje je uklonjeno", "share.error.removed.title": "Dijeljenje je uklonjeno",
@@ -278,7 +279,7 @@ export default {
"share.error.access-denied.title": "Privatno dijeljenje", "share.error.access-denied.title": "Privatno dijeljenje",
"share.error.access-denied.description": "Trenutni račun nema dozvolu za pristup ovom dijeljenju.", "share.error.access-denied.description": "Trenutni račun nema dozvolu za pristup ovom dijeljenju.",
"share.modal.password.title": "Lozinka je potrebna", "share.modal.password.title": "Lozinka je potrebna",
"share.modal.password.description": "Please enter the password to access this share.", "share.modal.password.description": "Molimo unesite lozinku za pristup ovom dijeljenju.",
"share.modal.password": "Lozinka", "share.modal.password": "Lozinka",
"share.modal.error.invalid-password": "Neispravna lozinka", "share.modal.error.invalid-password": "Neispravna lozinka",
"share.button.download-all": "Preuzmi sve", "share.button.download-all": "Preuzmi sve",
@@ -296,12 +297,14 @@ export default {
"share.edit.notify.save-success": "Dijeljenje je uspješno ažurirano", "share.edit.notify.save-success": "Dijeljenje je uspješno ažurirano",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint // /imprint
"imprint.title": "Imprint", "imprint.title": "Otisak",
// END /imprint // END /imprint
// /privacy // /privacy
"privacy.title": "Privacy Policy", "privacy.title": "Pravilima o zaštiti privatnosti",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "",
"admin.config.title": "Konfiguracija", "admin.config.title": "Konfiguracija",
"admin.config.category.general": "Opće", "admin.config.category.general": "Opće",
"admin.config.category.share": "Dijeljenje", "admin.config.category.share": "Dijeljenje",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Prikaži početnu stranicu", "admin.config.general.show-home-page": "Prikaži početnu stranicu",
"admin.config.general.show-home-page.description": "Želite li prikazati početnu stranicu", "admin.config.general.show-home-page.description": "Želite li prikazati početnu stranicu",
"admin.config.general.session-duration": "Trajanje sesije", "admin.config.general.session-duration": "Trajanje sesije",
"admin.config.general.session-duration.description": "Vrijeme u satima nakon kojeg se korisnik mora ponovno prijaviti (zadano: 3 mjeseca).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Promijenite svoj logotip učitavanjem nove slike. Slika mora biti PNG i imati format 1:1.", "admin.config.general.logo.description": "Promijenite svoj logotip učitavanjem nove slike. Slika mora biti PNG i imati format 1:1.",
"admin.config.general.logo.placeholder": "Odaberite sliku", "admin.config.general.logo.placeholder": "Odaberite sliku",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port domaćina SMTP servera", "admin.config.smtp.port.description": "Port domaćina SMTP servera",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Email adresa s koje se poruke šalju", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Korisničko ime", "admin.config.smtp.username": "Korisničko ime",
"admin.config.smtp.username.description": "Korisničko ime SMTP servera", "admin.config.smtp.username.description": "Korisničko ime SMTP servera",
"admin.config.smtp.password": "Lozinka", "admin.config.smtp.password": "Lozinka",
@@ -449,7 +452,7 @@ export default {
"admin.config.notify.logo-success": "Logo je uspješno ažuriran. Može potrajati nekoliko minuta dok se promjena ne prikaže na web stranici.", "admin.config.notify.logo-success": "Logo je uspješno ažuriran. Može potrajati nekoliko minuta dok se promjena ne prikaže na web stranici.",
"admin.config.notify.no-changes": "Nema promjena za spremanje.", "admin.config.notify.no-changes": "Nema promjena za spremanje.",
"admin.config.category.s3": "S3", "admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Enabled", "admin.config.s3.enabled": "Omogućeno",
"admin.config.s3.enabled.description": "Whether S3 should be used to store the shared files instead of the local file system.", "admin.config.s3.enabled.description": "Whether S3 should be used to store the shared files instead of the local file system.",
"admin.config.s3.endpoint": "Endpoint", "admin.config.s3.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.", "admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
@@ -457,12 +460,14 @@ export default {
"admin.config.s3.region.description": "The region of the S3 bucket.", "admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name", "admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.", "admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"admin.config.s3.bucket-path": "Path", "admin.config.s3.bucket-path": "Putanja",
"admin.config.s3.bucket-path.description": "The default path which should be used to store the files in the S3 bucket.", "admin.config.s3.bucket-path.description": "Zadana staza koja bi se trebala koristiti za pohranu datoteka u S3 spremnik.",
"admin.config.s3.key": "Key", "admin.config.s3.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Megosztás: {shareId}", "share.title": "Megosztás: {shareId}",
"share.description": "Megosztottak Önnel valami fontosat!", "share.description": "Megosztottak Önnel valami fontosat!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Túl sok látogató", "share.error.visitor-limit-exceeded.title": "Túl sok látogató",
"share.error.visitor-limit-exceeded.description": "A látogatók száma elérte a megszabott korlátot.", "share.error.visitor-limit-exceeded.description": "A látogatók száma elérte a megszabott korlátot.",
"share.error.removed.title": "Korábban már eltávolított megosztás", "share.error.removed.title": "Korábban már eltávolított megosztás",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Konfiguráció", "admin.config.title": "Konfiguráció",
"admin.config.category.general": "Általános", "admin.config.category.general": "Általános",
"admin.config.category.share": "Megosztás", "admin.config.category.share": "Megosztás",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Kezdőlap mutatása", "admin.config.general.show-home-page": "Kezdőlap mutatása",
"admin.config.general.show-home-page.description": "A kezdőlap mutatásának ki- és bekapcsolása", "admin.config.general.show-home-page.description": "A kezdőlap mutatásának ki- és bekapcsolása",
"admin.config.general.session-duration": "Munkamenet időtartama", "admin.config.general.session-duration": "Munkamenet időtartama",
"admin.config.general.session-duration.description": "Annak az időtartamnak a megadása, amit követően a felhasználónak ismét be kell jelentkeznie (alapérték: 3 hónap).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logó", "admin.config.general.logo": "Logó",
"admin.config.general.logo.description": "A logó személyessé tételéhez töltsön fel egy új képet. A formátum legyen PNG, az oldalarány 1:1.", "admin.config.general.logo.description": "A logó személyessé tételéhez töltsön fel egy új képet. A formátum legyen PNG, az oldalarány 1:1.",
"admin.config.general.logo.placeholder": "Kép kiválasztása", "admin.config.general.logo.placeholder": "Kép kiválasztása",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Az SMTP kiszolgáló portja", "admin.config.smtp.port.description": "Az SMTP kiszolgáló portja",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Felhasználónév", "admin.config.smtp.username": "Felhasználónév",
"admin.config.smtp.username.description": "Felhasználónév az SMTP kiszolgálón", "admin.config.smtp.username.description": "Felhasználónév az SMTP kiszolgálón",
"admin.config.smtp.password": "Jelszó", "admin.config.smtp.password": "Jelszó",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Condividi {shareId}", "share.title": "Condividi {shareId}",
"share.description": "Guarda cosa ho condiviso con te!", "share.description": "Guarda cosa ho condiviso con te!",
"share.fileCount": "{count, plural, =1 {# file} other {# file}} · {size} (il file zip potrebbe essere più piccolo a causa della compressione)",
"share.error.visitor-limit-exceeded.title": "Limite visitatori superato", "share.error.visitor-limit-exceeded.title": "Limite visitatori superato",
"share.error.visitor-limit-exceeded.description": "Il limite di visitatori di questa condivisione è stato superato.", "share.error.visitor-limit-exceeded.description": "Il limite di visitatori di questa condivisione è stato superato.",
"share.error.removed.title": "Condivisione rimossa", "share.error.removed.title": "Condivisione rimossa",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Informativa sulla privacy", "privacy.title": "Informativa sulla privacy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "File di configurazione presente",
"admin.config.config-file-warning.description": "Poiché hai configurato Pingvin Share tramite un file di configurazione, non ti è possibile modificare la configurazione dall'interfaccia utente.",
"admin.config.title": "Configurazione", "admin.config.title": "Configurazione",
"admin.config.category.general": "Generale", "admin.config.category.general": "Generale",
"admin.config.category.share": "Condivisioni", "admin.config.category.share": "Condivisioni",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Visualizza Home Page", "admin.config.general.show-home-page": "Visualizza Home Page",
"admin.config.general.show-home-page.description": "Indica se mostrare la home page", "admin.config.general.show-home-page.description": "Indica se mostrare la home page",
"admin.config.general.session-duration": "Durata della sessione", "admin.config.general.session-duration": "Durata della sessione",
"admin.config.general.session-duration.description": "Tempo in ore dopo il quale un utente deve accedere nuovamente (default: 3 mesi).", "admin.config.general.session-duration.description": "Tempo dopo il quale un utente deve accedere di nuovo (default: tre mesi).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Cambia il tuo logo caricando una nuova immagine. L'immagine deve essere un PNG e dovrebbe avere il formato 1:1.", "admin.config.general.logo.description": "Cambia il tuo logo caricando una nuova immagine. L'immagine deve essere un PNG e dovrebbe avere il formato 1:1.",
"admin.config.general.logo.placeholder": "Scegli un'immagine", "admin.config.general.logo.placeholder": "Scegli un'immagine",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "La chiave che consente di accedere al bucket S3.", "admin.config.s3.key.description": "La chiave che consente di accedere al bucket S3.",
"admin.config.s3.secret": "Parola chiave", "admin.config.s3.secret": "Parola chiave",
"admin.config.s3.secret.description": "La parola chiave che consente di accedere al bucket S3.", "admin.config.s3.secret.description": "La parola chiave che consente di accedere al bucket S3.",
"admin.config.s3.use-checksum": "Usa il checksum",
"admin.config.s3.use-checksum.description": "Disattiva per i backend che non supportano il checksum (ad es. B2).",
"admin.config.category.legal": "Legale", "admin.config.category.legal": "Legale",
"admin.config.legal.enabled": "Abilita le notifiche legali", "admin.config.legal.enabled": "Abilita le notifiche legali",
"admin.config.legal.enabled.description": "Indica se mostrare o meno un link alle informative legali e sulla privacy a piè di pagina.", "admin.config.legal.enabled.description": "Indica se mostrare o meno un link alle informative legali e sulla privacy a piè di pagina.",

View File

@@ -8,7 +8,7 @@ export default {
"navbar.links.reverse": "ファイルリクエスト", "navbar.links.reverse": "ファイルリクエスト",
"navbar.avatar.account": "マイアカウント", "navbar.avatar.account": "マイアカウント",
"navbar.avatar.admin": "管理画面", "navbar.avatar.admin": "管理画面",
"navbar.avatar.signout": "サインアウト", "navbar.avatar.signout": "ログアウト",
// END navbar // END navbar
// / // /
"home.title": "<h>セルフホスト</h>のファイル共有プラットフォーム。", "home.title": "<h>セルフホスト</h>のファイル共有プラットフォーム。",
@@ -25,16 +25,16 @@ export default {
// /auth/signin // /auth/signin
"signin.title": "おかえりなさい", "signin.title": "おかえりなさい",
"signin.description": "アカウントをお持ちではありませんか?", "signin.description": "アカウントをお持ちではありませんか?",
"signin.button.signup": "会員登録", "signin.button.signup": "新規登録",
"signin.input.email-or-username": "メールアドレスまたはユーザー名", "signin.input.email-or-username": "メールアドレスまたはユーザー名",
"signin.input.email-or-username.placeholder": "メールアドレスまたはユーザー名", "signin.input.email-or-username.placeholder": "メールアドレスまたはユーザー名",
"signin.input.password": "パスワード", "signin.input.password": "パスワード",
"signin.input.password.placeholder": "あなたのパスワード", "signin.input.password.placeholder": "あなたのパスワード",
"signin.button.submit": "サインイン", "signin.button.submit": "ログイン",
"signIn.notify.totp-required.title": "二段階認証が必要です", "signIn.notify.totp-required.title": "二段階認証が必要です",
"signIn.notify.totp-required.description": "二段階認証コードを入力してください", "signIn.notify.totp-required.description": "二段階認証コードを入力してください",
"signIn.oauth.or": "または", "signIn.oauth.or": "または",
"signIn.oauth.signInWith": "サインインの方法", "signIn.oauth.signInWith": "ログインの方法",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -44,7 +44,7 @@ export default {
// /auth/signup // /auth/signup
"signup.title": "アカウントを作成", "signup.title": "アカウントを作成",
"signup.description": "既にアカウントをお持ちですか?", "signup.description": "既にアカウントをお持ちですか?",
"signup.button.signin": "サインイン", "signup.button.signin": "ログイン",
"signup.input.username": "ユーザー名", "signup.input.username": "ユーザー名",
"signup.input.username.placeholder": "あなたのユーザー名", "signup.input.username.placeholder": "あなたのユーザー名",
"signup.input.email": "メールアドレス", "signup.input.email": "メールアドレス",
@@ -53,13 +53,13 @@ export default {
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "二段階認証", "totp.title": "二段階認証",
"totp.button.signIn": "サインイン", "totp.button.signIn": "ログイン",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "パスワードを忘れてしまいましたか?", "resetPassword.title": "パスワードを忘れてしまいましたか?",
"resetPassword.description": "登録しているメールアドレスを入力してください。", "resetPassword.description": "登録しているメールアドレスを入力してください。",
"resetPassword.notify.success": "指定されたメールアドレスが存在する場合、パスワードをリセットするためのリンクを含むメッセージが送信されました。", "resetPassword.notify.success": "指定されたメールアドレスが存在する場合、パスワードをリセットするためのリンクを含むメッセージが送信されました。",
"resetPassword.button.back": "サインインページに戻る", "resetPassword.button.back": "ログインページに戻る",
"resetPassword.text.resetPassword": "パスワードをリセット", "resetPassword.text.resetPassword": "パスワードをリセット",
"resetPassword.text.enterNewPassword": "新規パスワードを入力", "resetPassword.text.enterNewPassword": "新規パスワードを入力",
"resetPassword.input.password": "新規パスワード", "resetPassword.input.password": "新規パスワード",
@@ -85,11 +85,11 @@ export default {
"account.card.oauth.unlink": "リンク解除", "account.card.oauth.unlink": "リンク解除",
"account.card.oauth.unlinked": "リンクされていません", "account.card.oauth.unlinked": "リンクされていません",
"account.modal.unlink.title": "アカウントのリンクを解除", "account.modal.unlink.title": "アカウントのリンクを解除",
"account.modal.unlink.description": "ソーシャルアカウントのリンクを解除すると、ログイン認証情報を忘れた場合、アカウントを失う可能性があります。", "account.modal.unlink.description": "ソーシャルアカウントのリンクを解除すると、ログイン認証情報を忘れた場合カウントへアクセスできなくなる可能性があります。",
"account.notify.oauth.unlinked.success": "リンク解除に成功しました", "account.notify.oauth.unlinked.success": "リンク解除に成功しました",
"account.card.security.title": "セキュリティ", "account.card.security.title": "セキュリティ",
"account.card.security.totp.enable.description": "2段階認証を有効にするため、現在のパスワードを入力してください", "account.card.security.totp.enable.description": "2段階認証を有効にするには、現在のパスワードを入力してください",
"account.card.security.totp.disable.description": "2段階認証を無効にするため、現在のパスワードを入力してください", "account.card.security.totp.disable.description": "2段階認証を無効にするには、現在のパスワードを入力してください",
"account.card.security.totp.button.start": "開始", "account.card.security.totp.button.start": "開始",
"account.modal.totp.title": "2段階認証を有効にする", "account.modal.totp.title": "2段階認証を有効にする",
"account.modal.totp.step1": "ステップ1: 認証アプリを追加する", "account.modal.totp.step1": "ステップ1: 認証アプリを追加する",
@@ -216,7 +216,7 @@ export default {
// /upload // /upload
"upload.title": "アップロード", "upload.title": "アップロード",
"upload.notify.confirm-leave": "このページから離れますか?アップロードはキャンセルされます。", "upload.notify.confirm-leave": "このページから離れますか?アップロードはキャンセルされます。",
"upload.notify.generic-error": "共有を仕上げている最中にエラーが発生しました。", "upload.notify.generic-error": "共有の最終処理でエラーが発生しました。",
"upload.notify.count-failed": "{count} ファイルがアップロードに失敗しました。再度お試しください。", "upload.notify.count-failed": "{count} ファイルがアップロードに失敗しました。再度お試しください。",
"upload.reverse-share.error.invalid.title": "無効なファイルリクエストリンク", "upload.reverse-share.error.invalid.title": "無効なファイルリクエストリンク",
"upload.reverse-share.error.invalid.description": "このファイルリクエストは期限が切れているか無効です。", "upload.reverse-share.error.invalid.description": "このファイルリクエストは期限が切れているか無効です。",
@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "「{shareId}」が共有されました", "share.title": "「{shareId}」が共有されました",
"share.description": "あなたと共有したファイルをご確認ください!", "share.description": "あなたと共有したファイルをご確認ください!",
"share.fileCount": "{count, plural, =1 {# ファイル} other {# ファイル}} · {size} (圧縮により ZIP ファイルはより小さくなる場合があります)",
"share.error.visitor-limit-exceeded.title": "訪問者の上限を超えました", "share.error.visitor-limit-exceeded.title": "訪問者の上限を超えました",
"share.error.visitor-limit-exceeded.description": "この共有からの訪問者の回数が制限を超えています。", "share.error.visitor-limit-exceeded.description": "この共有からの訪問者の回数が制限を超えています。",
"share.error.removed.title": "共有が削除されました", "share.error.removed.title": "共有が削除されました",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "プライバシーポリシー", "privacy.title": "プライバシーポリシー",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "構成ファイルがあります",
"admin.config.config-file-warning.description": "設定ファイル設定で済みのPingvin ShareはUI を使用して設定を変更することはできません。",
"admin.config.title": "設定", "admin.config.title": "設定",
"admin.config.category.general": "一般", "admin.config.category.general": "一般",
"admin.config.category.share": "共有", "admin.config.category.share": "共有",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "ホームページを表示する", "admin.config.general.show-home-page": "ホームページを表示する",
"admin.config.general.show-home-page.description": "ホームページを表示するかどうか選択", "admin.config.general.show-home-page.description": "ホームページを表示するかどうか選択",
"admin.config.general.session-duration": "セッション期間", "admin.config.general.session-duration": "セッション期間",
"admin.config.general.session-duration.description": "ユーザーが再度ログインする必要がある時間(時間単位)(デフォルト: 3 月)。", "admin.config.general.session-duration.description": "ユーザーが再度ログインするまでの時間(デフォルト: 3 月)。",
"admin.config.general.logo": "ロゴ", "admin.config.general.logo": "ロゴ",
"admin.config.general.logo.description": "新しい画像をアップロードしてロゴを変更できます。画像は、PNG形式でアスペクト比が1:1である必要があります。", "admin.config.general.logo.description": "新しい画像をアップロードしてロゴを変更できます。画像は、PNG形式でアスペクト比が1:1である必要があります。",
"admin.config.general.logo.placeholder": "画像を選択", "admin.config.general.logo.placeholder": "画像を選択",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "ポート番号", "admin.config.smtp.port": "ポート番号",
"admin.config.smtp.port.description": "SMTPサーバーのポート番号", "admin.config.smtp.port.description": "SMTPサーバーのポート番号",
"admin.config.smtp.email": "メールアドレス", "admin.config.smtp.email": "メールアドレス",
"admin.config.smtp.email.description": "メール送信元となるメールアドレス", "admin.config.smtp.email.description": "メール送信元メールアドレス",
"admin.config.smtp.username": "ユーザー名", "admin.config.smtp.username": "ユーザー名",
"admin.config.smtp.username.description": "SMTPサーバーのユーザー名", "admin.config.smtp.username.description": "SMTPサーバーのユーザー名",
"admin.config.smtp.password": "パスワード", "admin.config.smtp.password": "パスワード",
@@ -417,7 +420,7 @@ export default {
"admin.config.oauth.oidc-username-claim": "OpenID Connect ユーザー名の要求", "admin.config.oauth.oidc-username-claim": "OpenID Connect ユーザー名の要求",
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID トークンのユーザー名要求。この設定が何かわからない場合は空白のままにしてください。", "admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID トークンのユーザー名要求。この設定が何かわからない場合は空白のままにしてください。",
"admin.config.oauth.oidc-role-path": "OpenID Connectトークンのロールへのパス", "admin.config.oauth.oidc-role-path": "OpenID Connectトークンのロールへのパス",
"admin.config.oauth.oidc-role-path.description": "ロールの配列を参照する有効なJMESパスでなければなりません。" + "OpenID Connectのロールを使用してアクセス権を管理することは、他のIDプロバイダが設定されておらず、パスワードログインが無効になっている場合にのみ推奨されます。この構成がわからない場合は空白のままにしてください。" + "この設定が何であるか分からない場合は空白のままにしてください。", "admin.config.oauth.oidc-role-path.description": "ロールの配列を参照する有効なJMESパスでなければなりません。 " + "OpenID Connectのロールを使用してアクセス権を管理することは、他のIDプロバイダが設定されておらず、パスワードログインが無効になっている場合にのみ推奨されます。この構成がわからない場合は空白のままにしてください。 " + "この設定が何であるか分からない場合は空白のままにしてください。",
"admin.config.oauth.oidc-role-general-access": "一般的なアクセスのためのOpenID Connectのロール", "admin.config.oauth.oidc-role-general-access": "一般的なアクセスのためのOpenID Connectのロール",
"admin.config.oauth.oidc-role-general-access.description": "一般的なアクセスに必要なロール。ログインするユーザーのロールに存在する必要があります。 " + "この設定が何であるか分からない場合は空白のままにしてください。", "admin.config.oauth.oidc-role-general-access.description": "一般的なアクセスに必要なロール。ログインするユーザーのロールに存在する必要があります。 " + "この設定が何であるか分からない場合は空白のままにしてください。",
"admin.config.oauth.oidc-role-admin-access": "管理者アクセスのための OpenID Connectのロール", "admin.config.oauth.oidc-role-admin-access": "管理者アクセスのための OpenID Connectのロール",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "S3バケットにアクセスするためのキー。", "admin.config.s3.key.description": "S3バケットにアクセスするためのキー。",
"admin.config.s3.secret": "秘密", "admin.config.s3.secret": "秘密",
"admin.config.s3.secret.description": "S3バケットにアクセスするための秘密。", "admin.config.s3.secret.description": "S3バケットにアクセスするための秘密。",
"admin.config.s3.use-checksum": "チェックサムを使用",
"admin.config.s3.use-checksum.description": "チェックサムをサポートしていないバックエンドB2では無効にしてください。",
"admin.config.category.legal": "法的事項", "admin.config.category.legal": "法的事項",
"admin.config.legal.enabled": "法的通知を有効にする", "admin.config.legal.enabled": "法的通知を有効にする",
"admin.config.legal.enabled.description": "フッターにインプリントとプライバシーポリシーへのリンクを表示するか。", "admin.config.legal.enabled.description": "フッターにインプリントとプライバシーポリシーへのリンクを表示するか。",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "공유 {shareId}", "share.title": "공유 {shareId}",
"share.description": "내가 당신과 공유한 것을 보세요!", "share.description": "내가 당신과 공유한 것을 보세요!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "방문자 한도 초과", "share.error.visitor-limit-exceeded.title": "방문자 한도 초과",
"share.error.visitor-limit-exceeded.description": "이 공유의 방문자 한도를 초과했습니다.", "share.error.visitor-limit-exceeded.description": "이 공유의 방문자 한도를 초과했습니다.",
"share.error.removed.title": "공유가 삭제됨", "share.error.removed.title": "공유가 삭제됨",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "구성", "admin.config.title": "구성",
"admin.config.category.general": "일반", "admin.config.category.general": "일반",
"admin.config.category.share": "공유", "admin.config.category.share": "공유",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "홈 페이지 표시", "admin.config.general.show-home-page": "홈 페이지 표시",
"admin.config.general.show-home-page.description": "홈 페이지를 표시할지 여부", "admin.config.general.show-home-page.description": "홈 페이지를 표시할지 여부",
"admin.config.general.session-duration": "세션 기간", "admin.config.general.session-duration": "세션 기간",
"admin.config.general.session-duration.description": "사용자가 다시 로그인해야 하는 시간 (기본값: 3개월)", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "로고", "admin.config.general.logo": "로고",
"admin.config.general.logo.description": "새 이미지를 업로드하여 로고를 변경하십시오. 이미지는 PNG여야 하며 1:1 비율이어야 합니다.", "admin.config.general.logo.description": "새 이미지를 업로드하여 로고를 변경하십시오. 이미지는 PNG여야 하며 1:1 비율이어야 합니다.",
"admin.config.general.logo.placeholder": "이미지 선택", "admin.config.general.logo.placeholder": "이미지 선택",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "포트", "admin.config.smtp.port": "포트",
"admin.config.smtp.port.description": "SMTP 서버 포트", "admin.config.smtp.port.description": "SMTP 서버 포트",
"admin.config.smtp.email": "이메일", "admin.config.smtp.email": "이메일",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "사용자 이름", "admin.config.smtp.username": "사용자 이름",
"admin.config.smtp.username.description": "SMTP 사용자 이름, 서버 비밀번호", "admin.config.smtp.username.description": "SMTP 사용자 이름, 서버 비밀번호",
"admin.config.smtp.password": "비밀번호", "admin.config.smtp.password": "비밀번호",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Share {shareId}", "share.title": "Share {shareId}",
"share.description": "Kijk eens wat ik met je heb gedeeld!", "share.description": "Kijk eens wat ik met je heb gedeeld!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Bezoekerslimiet overschreden", "share.error.visitor-limit-exceeded.title": "Bezoekerslimiet overschreden",
"share.error.visitor-limit-exceeded.description": "De bezoekerslimiet van deze share is overschreden.", "share.error.visitor-limit-exceeded.description": "De bezoekerslimiet van deze share is overschreden.",
"share.error.removed.title": "Share was verwijderd", "share.error.removed.title": "Share was verwijderd",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Configuratie", "admin.config.title": "Configuratie",
"admin.config.category.general": "Algemeen", "admin.config.category.general": "Algemeen",
"admin.config.category.share": "Delen", "admin.config.category.share": "Delen",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Toon startpagina", "admin.config.general.show-home-page": "Toon startpagina",
"admin.config.general.show-home-page.description": "Toon of verberg de home pagina", "admin.config.general.show-home-page.description": "Toon of verberg de home pagina",
"admin.config.general.session-duration": "Sessieduur", "admin.config.general.session-duration": "Sessieduur",
"admin.config.general.session-duration.description": "Tijd in uren waarna een gebruiker zich opnieuw moet aanmelden (standaard: 3 maanden).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Verander uw logo door een nieuwe afbeelding te uploaden. De afbeelding moet PNG zijn en het formaat moet 1:1 hebben.", "admin.config.general.logo.description": "Verander uw logo door een nieuwe afbeelding te uploaden. De afbeelding moet PNG zijn en het formaat moet 1:1 hebben.",
"admin.config.general.logo.placeholder": "Afbeelding kiezen", "admin.config.general.logo.placeholder": "Afbeelding kiezen",
@@ -355,14 +358,14 @@ export default {
"admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.", "admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "Enable", "admin.config.smtp.enabled": "",
"admin.config.smtp.enabled.description": "Of SMTP is ingeschakeld. Stel dit alleen in op true als u de host hebt ingevoerd, poort, e-mail, gebruiker en wachtwoord van uw SMTP-server.", "admin.config.smtp.enabled.description": "Of SMTP is ingeschakeld. Stel dit alleen in op true als u de host hebt ingevoerd, poort, e-mail, gebruiker en wachtwoord van uw SMTP-server.",
"admin.config.smtp.host": "Host", "admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "Host van de SMTP-server", "admin.config.smtp.host.description": "Host van de SMTP-server",
"admin.config.smtp.port": "Poort", "admin.config.smtp.port": "Poort",
"admin.config.smtp.port.description": "Poort van de SMTP-server", "admin.config.smtp.port.description": "Poort van de SMTP-server",
"admin.config.smtp.email": "E-mail", "admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Gebruikersnaam", "admin.config.smtp.username": "Gebruikersnaam",
"admin.config.smtp.username.description": "Gebruikersnaam van de SMTP-server", "admin.config.smtp.username.description": "Gebruikersnaam van de SMTP-server",
"admin.config.smtp.password": "Wachtwoord", "admin.config.smtp.password": "Wachtwoord",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -58,7 +58,7 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Nie pamiętasz hasła?", "resetPassword.title": "Nie pamiętasz hasła?",
"resetPassword.description": "Wprowadź swój e-mail, aby zresetować swoje hasło.", "resetPassword.description": "Wprowadź swój e-mail, aby zresetować swoje hasło.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.", "resetPassword.notify.success": "Jeśli podany adres e-mail istnieje, wiadomość z linkiem umożliwiającym zresetowanie hasła została wysłana.",
"resetPassword.button.back": "Powrót do strony logowania", "resetPassword.button.back": "Powrót do strony logowania",
"resetPassword.text.resetPassword": "Resetuj hasło", "resetPassword.text.resetPassword": "Resetuj hasło",
"resetPassword.text.enterNewPassword": "Wprowadź nowe hasło", "resetPassword.text.enterNewPassword": "Wprowadź nowe hasło",
@@ -129,7 +129,7 @@ export default {
"account.shares.table.expiry-never": "Never", "account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Informacje udziału", "account.shares.modal.share-informations": "Informacje udziału",
"account.shares.modal.share-link": "Udostępnij link", "account.shares.modal.share-link": "Udostępnij link",
"account.shares.modal.delete.title": "Delete share: {share}", "account.shares.modal.delete.title": "Usuń udostępnianie: {share}",
"account.shares.modal.delete.description": "Czy na pewno chcesz usunąć to udostępnianie?", "account.shares.modal.delete.description": "Czy na pewno chcesz usunąć to udostępnianie?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -156,7 +156,7 @@ export default {
"account.reverseShares.modal.send-email": "Send email notifications", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "Sends you an email notification when a share is created with this reverse share link.", "account.reverseShares.modal.send-email.description": "Sends you an email notification when a share is created with this reverse share link.",
"account.reverseShares.modal.simplified": "Tryb uproszczony", "account.reverseShares.modal.simplified": "Tryb uproszczony",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will only be able to customize the name and description of the share.", "account.reverseShares.modal.simplified.description": "",
"account.reverseShares.modal.public-access": "Dostęp publiczny", "account.reverseShares.modal.public-access": "Dostęp publiczny",
"account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "Limit użyć", "account.reverseShares.modal.max-use.label": "Limit użyć",
@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Udostępnij {shareId}", "share.title": "Udostępnij {shareId}",
"share.description": "Spójrz, co ci udostępniłem!", "share.description": "Spójrz, co ci udostępniłem!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Przekroczono limit odwiedzających", "share.error.visitor-limit-exceeded.title": "Przekroczono limit odwiedzających",
"share.error.visitor-limit-exceeded.description": "Limit odwiedzających dla tego udziału został przekroczony.", "share.error.visitor-limit-exceeded.description": "Limit odwiedzających dla tego udziału został przekroczony.",
"share.error.removed.title": "Udostępnianie usunięte", "share.error.removed.title": "Udostępnianie usunięte",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Konfiguracja", "admin.config.title": "Konfiguracja",
"admin.config.category.general": "Ogólne", "admin.config.category.general": "Ogólne",
"admin.config.category.share": "Udostępnij", "admin.config.category.share": "Udostępnij",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Pokaż stronę główną", "admin.config.general.show-home-page": "Pokaż stronę główną",
"admin.config.general.show-home-page.description": "Czy wyświetlać stronę główną", "admin.config.general.show-home-page.description": "Czy wyświetlać stronę główną",
"admin.config.general.session-duration": "Czas trwania sesji", "admin.config.general.session-duration": "Czas trwania sesji",
"admin.config.general.session-duration.description": "Czas w godzinach, po którym użytkownik musi zalogować się ponownie (domyślnie: 3 miesiące).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Zmień logo, przesyłając nowy obraz. Obraz musi być plikiem PNG i mieć proporcje 1:1.", "admin.config.general.logo.description": "Zmień logo, przesyłając nowy obraz. Obraz musi być plikiem PNG i mieć proporcje 1:1.",
"admin.config.general.logo.placeholder": "Wybierz obraz", "admin.config.general.logo.placeholder": "Wybierz obraz",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Numer portu", "admin.config.smtp.port": "Numer portu",
"admin.config.smtp.port.description": "Numer portu serwera SMTP", "admin.config.smtp.port.description": "Numer portu serwera SMTP",
"admin.config.smtp.email": "Adres e-mail", "admin.config.smtp.email": "Adres e-mail",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Nazwa użytkownika", "admin.config.smtp.username": "Nazwa użytkownika",
"admin.config.smtp.username.description": "Nazwa użytkownika serwera SMTP", "admin.config.smtp.username.description": "Nazwa użytkownika serwera SMTP",
"admin.config.smtp.password": "Hasło", "admin.config.smtp.password": "Hasło",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Compartilhar {shareId}", "share.title": "Compartilhar {shareId}",
"share.description": "Veja o que eu compartilhei com você!", "share.description": "Veja o que eu compartilhei com você!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Limite de visitantes excedido", "share.error.visitor-limit-exceeded.title": "Limite de visitantes excedido",
"share.error.visitor-limit-exceeded.description": "O limite de visitantes deste compartilhamento foi excedido.", "share.error.visitor-limit-exceeded.description": "O limite de visitantes deste compartilhamento foi excedido.",
"share.error.removed.title": "Compartilhamento removido", "share.error.removed.title": "Compartilhamento removido",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Política de Privacidade", "privacy.title": "Política de Privacidade",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Arquivo de configuração presente",
"admin.config.config-file-warning.description": "Como você tem um Pingvin Share configurado com um arquivo de configuração, você não pode alterar a configuração através da UI.",
"admin.config.title": "Configuração", "admin.config.title": "Configuração",
"admin.config.category.general": "Geral", "admin.config.category.general": "Geral",
"admin.config.category.share": "Compartilhamento", "admin.config.category.share": "Compartilhamento",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Mostrar a página inicial", "admin.config.general.show-home-page": "Mostrar a página inicial",
"admin.config.general.show-home-page.description": "Mostrar ou não a página inicial", "admin.config.general.show-home-page.description": "Mostrar ou não a página inicial",
"admin.config.general.session-duration": "Duração de sessão", "admin.config.general.session-duration": "Duração de sessão",
"admin.config.general.session-duration.description": "Tempo em horas após o qual um usuário deve iniciar a sessão novamente (padrão: 3 meses).", "admin.config.general.session-duration.description": "Tempo após o qual um usuário deve iniciar a sessão novamente (padrão: 3 meses).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Alterar o seu logo carregando uma nova imagem. A imagem deve ser PNG e deve ter o formato 1:1.", "admin.config.general.logo.description": "Alterar o seu logo carregando uma nova imagem. A imagem deve ser PNG e deve ter o formato 1:1.",
"admin.config.general.logo.placeholder": "Escolhe uma imagem", "admin.config.general.logo.placeholder": "Escolhe uma imagem",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Porta", "admin.config.smtp.port": "Porta",
"admin.config.smtp.port.description": "Porta do Servidor SMTP", "admin.config.smtp.port.description": "Porta do Servidor SMTP",
"admin.config.smtp.email": "E-mail", "admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "Endereço de e-mail do qual os e-mails são enviados", "admin.config.smtp.email.description": "Endereço de e-mail de onde os e-mails são enviados",
"admin.config.smtp.username": "Nome de usuário", "admin.config.smtp.username": "Nome de usuário",
"admin.config.smtp.username.description": "Nome de usuário do servidor SMTP", "admin.config.smtp.username.description": "Nome de usuário do servidor SMTP",
"admin.config.smtp.password": "Senha", "admin.config.smtp.password": "Senha",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "A chave que permite a você acessar o bucket S3.", "admin.config.s3.key.description": "A chave que permite a você acessar o bucket S3.",
"admin.config.s3.secret": "Segredo", "admin.config.s3.secret": "Segredo",
"admin.config.s3.secret.description": "O segredo que permite a você acessar o bucket S3.", "admin.config.s3.secret.description": "O segredo que permite a você acessar o bucket S3.",
"admin.config.s3.use-checksum": "Usar Checksum",
"admin.config.s3.use-checksum.description": "Desligar para backends que não suportem checksum (por exemplo, B2).",
"admin.config.category.legal": "Aviso legal", "admin.config.category.legal": "Aviso legal",
"admin.config.legal.enabled": "Habilitar avisos legais", "admin.config.legal.enabled": "Habilitar avisos legais",
"admin.config.legal.enabled.description": "Exibir um link para imprimir e política de privacidade no rodapé.", "admin.config.legal.enabled.description": "Exibir um link para imprimir e política de privacidade no rodapé.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Загрузка {shareId}", "share.title": "Загрузка {shareId}",
"share.description": "Посмотрите, чем я поделился с вами!", "share.description": "Посмотрите, чем я поделился с вами!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Превышен лимит посетителей", "share.error.visitor-limit-exceeded.title": "Превышен лимит посетителей",
"share.error.visitor-limit-exceeded.description": "Превышен лимит посетителей.", "share.error.visitor-limit-exceeded.description": "Превышен лимит посетителей.",
"share.error.removed.title": "Загрузка удалена", "share.error.removed.title": "Загрузка удалена",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Конфигурация", "admin.config.title": "Конфигурация",
"admin.config.category.general": "Общее", "admin.config.category.general": "Общее",
"admin.config.category.share": "Загрузки", "admin.config.category.share": "Загрузки",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Показывать домашнюю страницу", "admin.config.general.show-home-page": "Показывать домашнюю страницу",
"admin.config.general.show-home-page.description": "Показывать ли домашнюю страницу или нет", "admin.config.general.show-home-page.description": "Показывать ли домашнюю страницу или нет",
"admin.config.general.session-duration": "Длительность сессии", "admin.config.general.session-duration": "Длительность сессии",
"admin.config.general.session-duration.description": "Время в часах, после которого пользователь должен снова войти (по умолчанию: 3 месяца).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Логотип", "admin.config.general.logo": "Логотип",
"admin.config.general.logo.description": "Измените свой логотип, загрузив новое изображение. Изображение должно быть PNG и должно иметь формат 1:1.", "admin.config.general.logo.description": "Измените свой логотип, загрузив новое изображение. Изображение должно быть PNG и должно иметь формат 1:1.",
"admin.config.general.logo.placeholder": "Выберите изображение", "admin.config.general.logo.placeholder": "Выберите изображение",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Порт", "admin.config.smtp.port": "Порт",
"admin.config.smtp.port.description": "Порт SMTP сервера", "admin.config.smtp.port.description": "Порт SMTP сервера",
"admin.config.smtp.email": "Электронная почта", "admin.config.smtp.email": "Электронная почта",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Логин", "admin.config.smtp.username": "Логин",
"admin.config.smtp.username.description": "Имя пользователя SMTP сервера", "admin.config.smtp.username.description": "Имя пользователя SMTP сервера",
"admin.config.smtp.password": "Пароль", "admin.config.smtp.password": "Пароль",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Deli {shareId}", "share.title": "Deli {shareId}",
"share.description": "Poglej kaj sem delil s taboj!", "share.description": "Poglej kaj sem delil s taboj!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Število ogledov je prekoračena", "share.error.visitor-limit-exceeded.title": "Število ogledov je prekoračena",
"share.error.visitor-limit-exceeded.description": "Število ogledov za to delitev je bila prekoračena.", "share.error.visitor-limit-exceeded.description": "Število ogledov za to delitev je bila prekoračena.",
"share.error.removed.title": "Delitev je odstranjena", "share.error.removed.title": "Delitev je odstranjena",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Nastavitve", "admin.config.title": "Nastavitve",
"admin.config.category.general": "Splošno", "admin.config.category.general": "Splošno",
"admin.config.category.share": "Delitev", "admin.config.category.share": "Delitev",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Prikaži domačo stran", "admin.config.general.show-home-page": "Prikaži domačo stran",
"admin.config.general.show-home-page.description": "Ali prikazati domačo stran", "admin.config.general.show-home-page.description": "Ali prikazati domačo stran",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logotip", "admin.config.general.logo": "Logotip",
"admin.config.general.logo.description": "Naložite novo sliko, da spremenite logotip. Datoteka mora biti tipa PNG in imeti razmerje 1:1.", "admin.config.general.logo.description": "Naložite novo sliko, da spremenite logotip. Datoteka mora biti tipa PNG in imeti razmerje 1:1.",
"admin.config.general.logo.placeholder": "Izberite sliko", "admin.config.general.logo.placeholder": "Izberite sliko",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Vrata", "admin.config.smtp.port": "Vrata",
"admin.config.smtp.port.description": "Vrata SMTP strežnika", "admin.config.smtp.port.description": "Vrata SMTP strežnika",
"admin.config.smtp.email": "E-pošta", "admin.config.smtp.email": "E-pošta",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Uporabniško ime", "admin.config.smtp.username": "Uporabniško ime",
"admin.config.smtp.username.description": "Uporabniško ime SMTP strežnika", "admin.config.smtp.username.description": "Uporabniško ime SMTP strežnika",
"admin.config.smtp.password": "Geslo", "admin.config.smtp.password": "Geslo",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Deljenje {shareId}", "share.title": "Deljenje {shareId}",
"share.description": "Pogledajte šta sam podelio sa vama!", "share.description": "Pogledajte šta sam podelio sa vama!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Prekoračeno je ograničenje posetilaca", "share.error.visitor-limit-exceeded.title": "Prekoračeno je ograničenje posetilaca",
"share.error.visitor-limit-exceeded.description": "Ograničenje posetilaca iz ovog deljenja je premašeno.", "share.error.visitor-limit-exceeded.description": "Ograničenje posetilaca iz ovog deljenja je premašeno.",
"share.error.removed.title": "Deljenje je uklonjeno", "share.error.removed.title": "Deljenje je uklonjeno",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Konfiguracija", "admin.config.title": "Konfiguracija",
"admin.config.category.general": "Opšte", "admin.config.category.general": "Opšte",
"admin.config.category.share": "Deljenje", "admin.config.category.share": "Deljenje",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Prikaži početnu stranicu", "admin.config.general.show-home-page": "Prikaži početnu stranicu",
"admin.config.general.show-home-page.description": "Da li da se prikaže početna stranica", "admin.config.general.show-home-page.description": "Da li da se prikaže početna stranica",
"admin.config.general.session-duration": "Trajanje sesije", "admin.config.general.session-duration": "Trajanje sesije",
"admin.config.general.session-duration.description": "Vreme u satima nakon kojeg korisnik mora ponovo da se prijavi (podrazumevano: 3 meseca).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Promenite svoj logotip tako što ćete otpremiti novu sliku. Slika mora da bude PNG i treba da ima format 1:1.", "admin.config.general.logo.description": "Promenite svoj logotip tako što ćete otpremiti novu sliku. Slika mora da bude PNG i treba da ima format 1:1.",
"admin.config.general.logo.placeholder": "Izaberi sliku", "admin.config.general.logo.placeholder": "Izaberi sliku",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port domaćina SMTP servera", "admin.config.smtp.port.description": "Port domaćina SMTP servera",
"admin.config.smtp.email": "Imejl", "admin.config.smtp.email": "Imejl",
"admin.config.smtp.email.description": "Adresa imejla sa kojeg se poruke šalju", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Korisničko ime", "admin.config.smtp.username": "Korisničko ime",
"admin.config.smtp.username.description": "Korisničko ime SMTP servera", "admin.config.smtp.username.description": "Korisničko ime SMTP servera",
"admin.config.smtp.password": "Lozinka", "admin.config.smtp.password": "Lozinka",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Дељење {shareId}", "share.title": "Дељење {shareId}",
"share.description": "Погледајте шта сам поделио са вама!", "share.description": "Погледајте шта сам поделио са вама!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Прекорачено је ограничење посетилаца", "share.error.visitor-limit-exceeded.title": "Прекорачено је ограничење посетилаца",
"share.error.visitor-limit-exceeded.description": "Ограничење посетилаца из овог дељења је премашено.", "share.error.visitor-limit-exceeded.description": "Ограничење посетилаца из овог дељења је премашено.",
"share.error.removed.title": "Дељење је уклоњено", "share.error.removed.title": "Дељење је уклоњено",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Конфигурација", "admin.config.title": "Конфигурација",
"admin.config.category.general": "Опште", "admin.config.category.general": "Опште",
"admin.config.category.share": "Дељење", "admin.config.category.share": "Дељење",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Прикажи почетну страницу", "admin.config.general.show-home-page": "Прикажи почетну страницу",
"admin.config.general.show-home-page.description": "Да ли да се прикаже почетна страница", "admin.config.general.show-home-page.description": "Да ли да се прикаже почетна страница",
"admin.config.general.session-duration": "Трајање сесије", "admin.config.general.session-duration": "Трајање сесије",
"admin.config.general.session-duration.description": "Време у сатима након којег корисник мора поново да се пријави (подразумевано: 3 месеца).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Лого", "admin.config.general.logo": "Лого",
"admin.config.general.logo.description": "Промените свој логотип тако што ћете отпремити нову слику. Слика мора да буде PNG и треба да има формат 1:1.", "admin.config.general.logo.description": "Промените свој логотип тако што ћете отпремити нову слику. Слика мора да буде PNG и треба да има формат 1:1.",
"admin.config.general.logo.placeholder": "Изабери слику", "admin.config.general.logo.placeholder": "Изабери слику",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Порт", "admin.config.smtp.port": "Порт",
"admin.config.smtp.port.description": "Порт домаћина SMTP сервера", "admin.config.smtp.port.description": "Порт домаћина SMTP сервера",
"admin.config.smtp.email": "Имејл", "admin.config.smtp.email": "Имејл",
"admin.config.smtp.email.description": "Адреса имејла са којег се поруке шаљу", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Корисничко име", "admin.config.smtp.username": "Корисничко име",
"admin.config.smtp.username.description": "Корисничко име SMTP сервера", "admin.config.smtp.username.description": "Корисничко име SMTP сервера",
"admin.config.smtp.password": "Лозинка", "admin.config.smtp.password": "Лозинка",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Delning {shareId}", "share.title": "Delning {shareId}",
"share.description": "Titta vad jag har delat med dig!", "share.description": "Titta vad jag har delat med dig!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Besökargränsen överskriden", "share.error.visitor-limit-exceeded.title": "Besökargränsen överskriden",
"share.error.visitor-limit-exceeded.description": "Gränsen för antalet besökare för denna delning har överskridits.", "share.error.visitor-limit-exceeded.description": "Gränsen för antalet besökare för denna delning har överskridits.",
"share.error.removed.title": "Delning borttagen", "share.error.removed.title": "Delning borttagen",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Konfiguration", "admin.config.title": "Konfiguration",
"admin.config.category.general": "Allmänt", "admin.config.category.general": "Allmänt",
"admin.config.category.share": "Delning", "admin.config.category.share": "Delning",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Visa startsidan", "admin.config.general.show-home-page": "Visa startsidan",
"admin.config.general.show-home-page.description": "Om du vill visa startsidan", "admin.config.general.show-home-page.description": "Om du vill visa startsidan",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logotyp", "admin.config.general.logo": "Logotyp",
"admin.config.general.logo.description": "Ändra din logotyp genom att ladda upp en ny bild. Bilden måste vara en PNG och bör ha formatet 1:1.", "admin.config.general.logo.description": "Ändra din logotyp genom att ladda upp en ny bild. Bilden måste vara en PNG och bör ha formatet 1:1.",
"admin.config.general.logo.placeholder": "Välj bild", "admin.config.general.logo.placeholder": "Välj bild",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port för SMTP-servern", "admin.config.smtp.port.description": "Port för SMTP-servern",
"admin.config.smtp.email": "E-post", "admin.config.smtp.email": "E-post",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Användarnamn", "admin.config.smtp.username": "Användarnamn",
"admin.config.smtp.username.description": "Användarnamn för SMTP-servern", "admin.config.smtp.username.description": "Användarnamn för SMTP-servern",
"admin.config.smtp.password": "Lösenord", "admin.config.smtp.password": "Lösenord",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -33,7 +33,7 @@ export default {
"signin.button.submit": "เข้าสู่ระบบ", "signin.button.submit": "เข้าสู่ระบบ",
"signIn.notify.totp-required.title": "ยืนยันตรวจสอบสิทธิ์สองปัจจัย", "signIn.notify.totp-required.title": "ยืนยันตรวจสอบสิทธิ์สองปัจจัย",
"signIn.notify.totp-required.description": "กรุณาใส่รหัสยืนยันตัวตนสองปัจจัย", "signIn.notify.totp-required.description": "กรุณาใส่รหัสยืนยันตัวตนสองปัจจัย",
"signIn.oauth.or": "OR", "signIn.oauth.or": "หรือ",
"signIn.oauth.signInWith": "Sign in with", "signIn.oauth.signInWith": "Sign in with",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
@@ -302,6 +302,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "การตั้งค่า", "admin.config.title": "การตั้งค่า",
"admin.config.category.general": "ทั่วไป", "admin.config.category.general": "ทั่วไป",
"admin.config.category.share": "การแชร์", "admin.config.category.share": "การแชร์",
@@ -317,7 +319,7 @@ export default {
"admin.config.general.show-home-page": "แสดงหน้าแรก", "admin.config.general.show-home-page": "แสดงหน้าแรก",
"admin.config.general.show-home-page.description": "หากติ๊ก เว็บไซต์จะแสดงหน้าหลักเวลาเข้าถึง URL หลัก", "admin.config.general.show-home-page.description": "หากติ๊ก เว็บไซต์จะแสดงหน้าหลักเวลาเข้าถึง URL หลัก",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "โลโก้", "admin.config.general.logo": "โลโก้",
"admin.config.general.logo.description": "เปลี่ยนโลโก้โดยอัปโหลดรูปภาพใหม่ รูปภาพต้องเป็น PNG และควรมีขนาดอัตราส่วน 1:1", "admin.config.general.logo.description": "เปลี่ยนโลโก้โดยอัปโหลดรูปภาพใหม่ รูปภาพต้องเป็น PNG และควรมีขนาดอัตราส่วน 1:1",
"admin.config.general.logo.placeholder": "คลิกที่นี่หรือลากไฟล์มา", "admin.config.general.logo.placeholder": "คลิกที่นี่หรือลากไฟล์มา",
@@ -362,7 +364,7 @@ export default {
"admin.config.smtp.port": "พอร์ต", "admin.config.smtp.port": "พอร์ต",
"admin.config.smtp.port.description": "พอร์ตของเซิร์ฟเวอร์ SMTP", "admin.config.smtp.port.description": "พอร์ตของเซิร์ฟเวอร์ SMTP",
"admin.config.smtp.email": "อีเมล", "admin.config.smtp.email": "อีเมล",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "ชื่อผู้ใช้", "admin.config.smtp.username": "ชื่อผู้ใช้",
"admin.config.smtp.username.description": "ชื่อผู้ใช้ของเซิร์ฟเวอร์ SMTP", "admin.config.smtp.username.description": "ชื่อผู้ใช้ของเซิร์ฟเวอร์ SMTP",
"admin.config.smtp.password": "รหัสผ่าน", "admin.config.smtp.password": "รหัสผ่าน",
@@ -463,6 +465,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",
@@ -481,7 +485,7 @@ export default {
"error.title": "Error", "error.title": "Error",
"error.description": "Oops!", "error.description": "Oops!",
"error.button.back": "Go back", "error.button.back": "Go back",
"error.msg.default": "Something went wrong.", "error.msg.default": "มีบางอย่างผิดพลาด",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "You canceled the authentication process, please try again.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "The authentication process took too long, please try again.",
"error.msg.invalid_token": "Internal Error", "error.msg.invalid_token": "Internal Error",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "{shareId} Paylaşımı", "share.title": "{shareId} Paylaşımı",
"share.description": "Sizinle paylaştıklarımı bir göz atın!", "share.description": "Sizinle paylaştıklarımı bir göz atın!",
"share.fileCount": "{count, plural, =1 {# dosya} other {# dosya}} · {size} (sıkıştırma nedeniyle zip dosyası daha küçük olabilir)",
"share.error.visitor-limit-exceeded.title": "Ziyaretçi limiti aşıldı", "share.error.visitor-limit-exceeded.title": "Ziyaretçi limiti aşıldı",
"share.error.visitor-limit-exceeded.description": "Bu paylaşımın ziyaretçi limiti aşıldı.", "share.error.visitor-limit-exceeded.description": "Bu paylaşımın ziyaretçi limiti aşıldı.",
"share.error.removed.title": "Paylaşım kaldırıldı", "share.error.removed.title": "Paylaşım kaldırıldı",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Gizlilik Politikası", "privacy.title": "Gizlilik Politikası",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Yapılandırma dosyası mevcut",
"admin.config.config-file-warning.description": "Yapılandırma dosyası ile yapılandırılmış bir Pingvin Paylaşımınız olduğundan, yapılandırmayı kullanıcı arayüzü üzerinden değiştiremezsiniz.",
"admin.config.title": "Yapılandırma", "admin.config.title": "Yapılandırma",
"admin.config.category.general": "Genel", "admin.config.category.general": "Genel",
"admin.config.category.share": "Paylaş", "admin.config.category.share": "Paylaş",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Ana sayfayı göster", "admin.config.general.show-home-page": "Ana sayfayı göster",
"admin.config.general.show-home-page.description": "Ana sayfanın gösterilip gösterilmeyeceği", "admin.config.general.show-home-page.description": "Ana sayfanın gösterilip gösterilmeyeceği",
"admin.config.general.session-duration": "Oturum Süresi", "admin.config.general.session-duration": "Oturum Süresi",
"admin.config.general.session-duration.description": "Bir kullanıcının tekrar oturum açması gereken saat cinsinden süre (varsayılan: 3 ay).", "admin.config.general.session-duration.description": "Kullanıcının tekrar oturum açması için gereken süre (varsayılan süre: 3 ay).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Yeni bir resim yükleyerek logonuzu değiştirin. Resim PNG formatında olmalı ve 1:1 oranında olmalıdır.", "admin.config.general.logo.description": "Yeni bir resim yükleyerek logonuzu değiştirin. Resim PNG formatında olmalı ve 1:1 oranında olmalıdır.",
"admin.config.general.logo.placeholder": "Resim seç", "admin.config.general.logo.placeholder": "Resim seç",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "S3 kovasına erişmenizi sağlayan anahtar.", "admin.config.s3.key.description": "S3 kovasına erişmenizi sağlayan anahtar.",
"admin.config.s3.secret": "Gizli", "admin.config.s3.secret": "Gizli",
"admin.config.s3.secret.description": "S3 kovasına erişmenizi sağlayan gizli anahtar.", "admin.config.s3.secret.description": "S3 kovasına erişmenizi sağlayan gizli anahtar.",
"admin.config.s3.use-checksum": "Doğrulama kullan",
"admin.config.s3.use-checksum.description": "Doğrulama desteklemeyen arka uçlar için kapatın (ör. B2).",
"admin.config.category.legal": "Yasal", "admin.config.category.legal": "Yasal",
"admin.config.legal.enabled": "Yasal Bildirimleri Etkinleştir", "admin.config.legal.enabled": "Yasal Bildirimleri Etkinleştir",
"admin.config.legal.enabled.description": "Alt bilgi kısmında künyeye ve gizlilik politikasına bir bağlantı gösterilip gösterilmeyeceğini belirtir.", "admin.config.legal.enabled.description": "Alt bilgi kısmında künyeye ve gizlilik politikasına bir bağlantı gösterilip gösterilmeyeceğini belirtir.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Завантаження {shareId}", "share.title": "Завантаження {shareId}",
"share.description": "Подивіться, чим я поділився з вами!", "share.description": "Подивіться, чим я поділився з вами!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Перевищено ліміт відвідувачів", "share.error.visitor-limit-exceeded.title": "Перевищено ліміт відвідувачів",
"share.error.visitor-limit-exceeded.description": "Перевищено ліміт відвідувачів.", "share.error.visitor-limit-exceeded.description": "Перевищено ліміт відвідувачів.",
"share.error.removed.title": "Завантаження видалено", "share.error.removed.title": "Завантаження видалено",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Політика конфіденційності", "privacy.title": "Політика конфіденційності",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Файл конфігурації присутній",
"admin.config.config-file-warning.description": "Оскільки у вас налаштовано Pingvin Share за допомогою конфігураційного файлу, ви не можете змінювати конфігурацію через інтерфейс користувача.",
"admin.config.title": "Конфігурація", "admin.config.title": "Конфігурація",
"admin.config.category.general": "Загальне", "admin.config.category.general": "Загальне",
"admin.config.category.share": "Завантаження", "admin.config.category.share": "Завантаження",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Показувати домашню сторінку", "admin.config.general.show-home-page": "Показувати домашню сторінку",
"admin.config.general.show-home-page.description": "Показувати домашню сторінку чи ні", "admin.config.general.show-home-page.description": "Показувати домашню сторінку чи ні",
"admin.config.general.session-duration": "Тривалість сеансу", "admin.config.general.session-duration": "Тривалість сеансу",
"admin.config.general.session-duration.description": "Час у годинах, після якого користувач повинен знову увійти в систему (за замовчуванням: 3 місяці).", "admin.config.general.session-duration.description": "Час, після якого користувач повинен увійти в систему знову (за замовчуванням: 3 місяці).",
"admin.config.general.logo": "Логотип", "admin.config.general.logo": "Логотип",
"admin.config.general.logo.description": "Змініть свій логотип, завантаживши нове зображення. Зображення має бути PNG і повинно мати формат 1:1.", "admin.config.general.logo.description": "Змініть свій логотип, завантаживши нове зображення. Зображення має бути PNG і повинно мати формат 1:1.",
"admin.config.general.logo.placeholder": "Виберіть зображення", "admin.config.general.logo.placeholder": "Виберіть зображення",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Порт", "admin.config.smtp.port": "Порт",
"admin.config.smtp.port.description": "Порт SMTP сервера", "admin.config.smtp.port.description": "Порт SMTP сервера",
"admin.config.smtp.email": "Електронна пошта", "admin.config.smtp.email": "Електронна пошта",
"admin.config.smtp.email.description": "Ел. пошта, з якої надсилаються листи", "admin.config.smtp.email.description": "Адреса ел. пошти, з якої надсилаються листи",
"admin.config.smtp.username": "Логін", "admin.config.smtp.username": "Логін",
"admin.config.smtp.username.description": "Ім'я користувача SMTP-сервера", "admin.config.smtp.username.description": "Ім'я користувача SMTP-сервера",
"admin.config.smtp.password": "Пароль", "admin.config.smtp.password": "Пароль",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "Ключ, який дозволяє отримати доступ до S3 бакету.", "admin.config.s3.key.description": "Ключ, який дозволяє отримати доступ до S3 бакету.",
"admin.config.s3.secret": "Секрет", "admin.config.s3.secret": "Секрет",
"admin.config.s3.secret.description": "Секрет, який дозволяє отримати доступ до S3 бакету.", "admin.config.s3.secret.description": "Секрет, який дозволяє отримати доступ до S3 бакету.",
"admin.config.s3.use-checksum": "Використовувати контрольну суму",
"admin.config.s3.use-checksum.description": "Вимкніть для непідтримуваних контрольних сум (напр. B2).",
"admin.config.category.legal": "Юридична інформація", "admin.config.category.legal": "Юридична інформація",
"admin.config.legal.enabled": "Увімкнути правові сповіщення", "admin.config.legal.enabled": "Увімкнути правові сповіщення",
"admin.config.legal.enabled.description": "Чи відображати посилання на вихідні дані та політику конфіденційності у нижньому колонтитулі.", "admin.config.legal.enabled.description": "Чи відображати посилання на вихідні дані та політику конфіденційності у нижньому колонтитулі.",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "Share {shareId}", "share.title": "Share {shareId}",
"share.description": "Look what I've shared with you!", "share.description": "Look what I've shared with you!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Visitor limit exceeded", "share.error.visitor-limit-exceeded.title": "Visitor limit exceeded",
"share.error.visitor-limit-exceeded.description": "The visitor limit from this share has been exceeded.", "share.error.visitor-limit-exceeded.description": "The visitor limit from this share has been exceeded.",
"share.error.removed.title": "Share removed", "share.error.removed.title": "Share removed",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "Configuration", "admin.config.title": "Configuration",
"admin.config.category.general": "Tổng quan", "admin.config.category.general": "Tổng quan",
"admin.config.category.share": "Share", "admin.config.category.share": "Share",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "Show home page", "admin.config.general.show-home-page": "Show home page",
"admin.config.general.show-home-page.description": "Whether to show the home page", "admin.config.general.show-home-page.description": "Whether to show the home page",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.", "admin.config.general.logo.description": "Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.",
"admin.config.general.logo.placeholder": "Chọn ảnh", "admin.config.general.logo.placeholder": "Chọn ảnh",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "Cổng", "admin.config.smtp.port": "Cổng",
"admin.config.smtp.port.description": "Port of the SMTP server", "admin.config.smtp.port.description": "Port of the SMTP server",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Username", "admin.config.smtp.username": "Username",
"admin.config.smtp.username.description": "Username of the SMTP server", "admin.config.smtp.username.description": "Username of the SMTP server",
"admin.config.smtp.password": "Mật khẩu", "admin.config.smtp.password": "Mật khẩu",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "完全自建", "home.bullet.a.name": "完全自建",
"home.bullet.a.description": "轻松使用私有服务器搭建文件共享平台", "home.bullet.a.description": "轻松使用私有服务器搭建文件共享平台",
"home.bullet.b.name": "完全隐私", "home.bullet.b.name": "完全隐私",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.", "home.bullet.b.description": "您的文件只属于您,永远无法被第三方访问。",
"home.bullet.c.name": "完全无限", "home.bullet.c.name": "完全无限",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.", "home.bullet.c.description": "您希望上传多大的文件都可以。硬盘容量的大小是您唯一的限制。",
"home.button.start": "开始使用", "home.button.start": "开始使用",
"home.button.source": "源代码", "home.button.source": "源代码",
// END / // END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "忘记密码?", "resetPassword.title": "忘记密码?",
"resetPassword.description": "请输入电子邮箱地址来接收重置密码邮件", "resetPassword.description": "请输入电子邮箱地址来接收重置密码邮件",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.", "resetPassword.notify.success": "系统已向您的邮箱发送一条包含重置密码链接的邮件。(若该电子邮箱存在)",
"resetPassword.button.back": "返回登录页面", "resetPassword.button.back": "返回登录页面",
"resetPassword.text.resetPassword": "重置密码", "resetPassword.text.resetPassword": "重置密码",
"resetPassword.text.enterNewPassword": "请输入新密码", "resetPassword.text.enterNewPassword": "请输入新密码",
"resetPassword.input.password": "新密码", "resetPassword.input.password": "新密码",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.", "resetPassword.notify.passwordReset": "您的密码已成功重置。",
// /account // /account
"account.title": "我的账户", "account.title": "我的账户",
"account.card.info.title": "账户信息", "account.card.info.title": "账户信息",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "密码", "account.card.password.title": "密码",
"account.card.password.old": "旧密码", "account.card.password.old": "旧密码",
"account.card.password.new": "新密码", "account.card.password.new": "新密码",
"account.card.password.noPasswordSet": "You do not have a password set. To sign in using your email and password, you need to create a password.", "account.card.password.noPasswordSet": "您还未设置密码。如果您想通过邮箱和密码登录,请先设置密码。",
"account.notify.password.success": "密码更改成功!", "account.notify.password.success": "密码更改成功!",
"account.card.oauth.title": "社交账号登录", "account.card.oauth.title": "社交账号登录",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "解除关联", "account.card.oauth.unlink": "解除关联",
"account.card.oauth.unlinked": "已解除关联", "account.card.oauth.unlinked": "已解除关联",
"account.modal.unlink.title": "解除关联", "account.modal.unlink.title": "解除关联",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your login credentials", "account.modal.unlink.description": "如果您不记得您的用户名和密码,解除和社交账号的关联可能会导致丢失账户",
"account.notify.oauth.unlinked.success": "解除关联成功", "account.notify.oauth.unlinked.success": "解除关联成功",
"account.card.security.title": "安全", "account.card.security.title": "安全",
"account.card.security.totp.enable.description": "请输入当前密码开启两步验证", "account.card.security.totp.enable.description": "请输入当前密码开启两步验证",
@@ -121,15 +121,15 @@ export default {
"account.shares.table.name": "共享后缀", "account.shares.table.name": "共享后缀",
"account.shares.table.description": "描述", "account.shares.table.description": "描述",
"account.shares.table.visitors": "已访问", "account.shares.table.visitors": "已访问",
"account.shares.table.expiresAt": "Expires on", "account.shares.table.expiresAt": "过期于",
"account.shares.table.createdAt": "Created on", "account.shares.table.createdAt": "创建于",
"account.shares.table.size": "文件大小", "account.shares.table.size": "文件大小",
"account.shares.table.password-protected": "Password protected", "account.shares.table.password-protected": "密码保护",
"account.shares.table.visitor-count": "{count} of {max}", "account.shares.table.visitor-count": "{count}/{max}",
"account.shares.table.expiry-never": "Never", "account.shares.table.expiry-never": "永不",
"account.shares.modal.share-informations": "共享信息", "account.shares.modal.share-informations": "共享信息",
"account.shares.modal.share-link": "共享链接", "account.shares.modal.share-link": "共享链接",
"account.shares.modal.delete.title": "Delete share: {share}", "account.shares.modal.delete.title": "删除共享 {share}",
"account.shares.modal.delete.description": "你真的想删除这个共享吗?", "account.shares.modal.delete.description": "你真的想删除这个共享吗?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -138,7 +138,7 @@ export default {
"account.reverseShares.title.empty": "这里空空如也 👀", "account.reverseShares.title.empty": "这里空空如也 👀",
"account.reverseShares.description.empty": "你没有创建任何预留共享", "account.reverseShares.description.empty": "你没有创建任何预留共享",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "创建反向共享", "account.reverseShares.modal.title": "创建预留共享",
"account.reverseShares.modal.expiration.label": "过期时间", "account.reverseShares.modal.expiration.label": "过期时间",
"account.reverseShares.modal.expiration.minute-singular": "1 分钟", "account.reverseShares.modal.expiration.minute-singular": "1 分钟",
"account.reverseShares.modal.expiration.minute-plural": "分钟", "account.reverseShares.modal.expiration.minute-plural": "分钟",
@@ -153,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "1 年", "account.reverseShares.modal.expiration.year-singular": "1 年",
"account.reverseShares.modal.expiration.year-plural": "年", "account.reverseShares.modal.expiration.year-plural": "年",
"account.reverseShares.modal.max-size.label": "共享文件上限", "account.reverseShares.modal.max-size.label": "共享文件上限",
"account.reverseShares.modal.send-email": "Send email notifications", "account.reverseShares.modal.send-email": "发送电子邮件通知",
"account.reverseShares.modal.send-email.description": "Sends you an email notification when a share is created with this reverse share link.", "account.reverseShares.modal.send-email.description": "当使用此预留共享链接创建共享时,向您发送电子邮件通知。",
"account.reverseShares.modal.simplified": "简单模式", "account.reverseShares.modal.simplified": "简单模式",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will only be able to customize the name and description of the share.", "account.reverseShares.modal.simplified.description": "让上传者更轻松地与你共享文件。他们仅能自定义共享的名称和描述。",
"account.reverseShares.modal.public-access": "公开访问", "account.reverseShares.modal.public-access": "公开访问",
"account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.", "account.reverseShares.modal.public-access.description": "公开使用此预留共享创建的共享。如果禁用,则只有您和共享创建者才能查看。",
"account.reverseShares.modal.max-use.label": "最大使用次数", "account.reverseShares.modal.max-use.label": "最大使用次数",
"account.reverseShares.modal.max-use.description": "这个预留共享链接可被用于创建共享的最大使用次数", "account.reverseShares.modal.max-use.description": "这个预留共享链接可被用于创建共享的最大使用次数",
"account.reverseShare.never-expires": "这个预留共享永不过期", "account.reverseShare.never-expires": "这个预留共享永不过期",
@@ -186,14 +186,14 @@ export default {
"admin.users.table.username": "用户名", "admin.users.table.username": "用户名",
"admin.users.table.email": "电子邮件", "admin.users.table.email": "电子邮件",
"admin.users.table.admin": "管理员", "admin.users.table.admin": "管理员",
"admin.users.edit.update.title": "Edit user: {username}", "admin.users.edit.update.title": "编辑用户 {username}",
"admin.users.edit.update.admin-privileges": "管理员", "admin.users.edit.update.admin-privileges": "管理员",
"admin.users.edit.update.change-password.title": "更改密码", "admin.users.edit.update.change-password.title": "更改密码",
"admin.users.edit.update.change-password.field": "新密码", "admin.users.edit.update.change-password.field": "新密码",
"admin.users.edit.update.change-password.button": "保存新密码", "admin.users.edit.update.change-password.button": "保存新密码",
"admin.users.edit.update.notify.password.success": "密码更新成功!", "admin.users.edit.update.notify.password.success": "密码更新成功!",
"admin.users.edit.delete.title": "Delete user: {username} ?", "admin.users.edit.delete.title": "删除用户 {username} ",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?", "admin.users.edit.delete.description": "你真的想删除这个账户,并删除该用户所有的共享吗?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "创建用户", "admin.users.modal.create.title": "创建用户",
"admin.users.modal.create.username": "用户名", "admin.users.modal.create.username": "用户名",
@@ -209,20 +209,20 @@ export default {
"admin.shares.table.id": "共享 ID", "admin.shares.table.id": "共享 ID",
"admin.shares.table.username": "创建者", "admin.shares.table.username": "创建者",
"admin.shares.table.visitors": "访问者", "admin.shares.table.visitors": "访问者",
"admin.shares.table.expires": "Expires on", "admin.shares.table.expires": "过期于",
"admin.shares.edit.delete.title": "Delete share: {id}", "admin.shares.edit.delete.title": "删除共享 {id}",
"admin.shares.edit.delete.description": "你真的要删除这个共享吗?", "admin.shares.edit.delete.description": "你真的要删除这个共享吗?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "上传", "upload.title": "上传",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.", "upload.notify.confirm-leave": "您确定要离开此页面吗?您的上传将被取消。",
"upload.notify.generic-error": "创建共享的过程中发生了错误", "upload.notify.generic-error": "创建共享的过程中发生了错误",
"upload.notify.count-failed": "{count} 文件上传失败,请重试", "upload.notify.count-failed": "{count} 文件上传失败,请重试",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link", "upload.reverse-share.error.invalid.title": "无效的预留共享链接",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.", "upload.reverse-share.error.invalid.description": "这个预留分享已过期或无效。",
// Dropzone.tsx // Dropzone.tsx
"upload.dropzone.title": "上传文件", "upload.dropzone.title": "上传文件",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.", "upload.dropzone.description": "拖放至此以上传文件,文件大小不能超过 {maxSize}。",
"upload.dropzone.notify.file-too-big": "你的文件超过了最大上传限制 {maxSize}", "upload.dropzone.notify.file-too-big": "你的文件超过了最大上传限制 {maxSize}",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "文件名", "upload.filelist.name": "文件名",
@@ -234,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "当前没有登录", "upload.modal.not-signed-in": "当前没有登录",
"upload.modal.not-signed-in-description": "你将不能删除你的共享或查看访问次数", "upload.modal.not-signed-in-description": "你将不能删除你的共享或查看访问次数",
"upload.modal.expires.never": "永不", "upload.modal.expires.never": "永不",
"upload.modal.expires.never-long": "Permanent share", "upload.modal.expires.never-long": "永久分享",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.", "upload.modal.expires.error.too-long": "有效期超过 {max} 的最大值。",
"upload.modal.link.label": "共享链接", "upload.modal.link.label": "共享链接",
"upload.modal.expires.label": "过期时间", "upload.modal.expires.label": "过期时间",
"upload.modal.expires.minute-singular": "1 分钟", "upload.modal.expires.minute-singular": "1 分钟",
@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "共享 {shareId}", "share.title": "共享 {shareId}",
"share.description": "瞧瞧我给你共享了些什么!", "share.description": "瞧瞧我给你共享了些什么!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "访问次数达到上限", "share.error.visitor-limit-exceeded.title": "访问次数达到上限",
"share.error.visitor-limit-exceeded.description": "访问次数达到上限", "share.error.visitor-limit-exceeded.description": "访问次数达到上限",
"share.error.removed.title": "共享已删除", "share.error.removed.title": "共享已删除",
@@ -278,16 +279,16 @@ export default {
"share.error.access-denied.title": "私有共享", "share.error.access-denied.title": "私有共享",
"share.error.access-denied.description": "当前账户没有权限访问此共享", "share.error.access-denied.description": "当前账户没有权限访问此共享",
"share.modal.password.title": "需要密码", "share.modal.password.title": "需要密码",
"share.modal.password.description": "Please enter the password to access this share.", "share.modal.password.description": "请输入密码以访问此共享。",
"share.modal.password": "密码", "share.modal.password": "密码",
"share.modal.error.invalid-password": "密码错误", "share.modal.error.invalid-password": "密码错误",
"share.button.download-all": "全部下载", "share.button.download-all": "全部下载",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.", "share.notify.download-all-preparing": "该共享正在处理中,请稍等片刻。",
"share.modal.file-link": "文件链接", "share.modal.file-link": "文件链接",
"share.table.name": "文件名", "share.table.name": "文件名",
"share.table.size": "文件大小", "share.table.size": "文件大小",
"share.modal.file-preview.error.not-supported.title": "该文件类型不支持预览", "share.modal.file-preview.error.not-supported.title": "该文件类型不支持预览",
"share.modal.file-preview.error.not-supported.description": "Previews are not supported for this type of files. Please download the file to view it.", "share.modal.file-preview.error.not-supported.description": "这种类型的文件不支持预览。请下载文件查看。",
// END /share/[id] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "编辑 {shareId}", "share.edit.title": "编辑 {shareId}",
@@ -296,12 +297,14 @@ export default {
"share.edit.notify.save-success": "共享已更新成功", "share.edit.notify.save-success": "共享已更新成功",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint // /imprint
"imprint.title": "Imprint", "imprint.title": "版权信息",
// END /imprint // END /imprint
// /privacy // /privacy
"privacy.title": "Privacy Policy", "privacy.title": "隐私政策",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "配置文件已存在",
"admin.config.config-file-warning.description": "由于您已配置了Pingvin 共享的配置文件您无法通过UI更改配置。",
"admin.config.title": "配置管理", "admin.config.title": "配置管理",
"admin.config.category.general": "通用", "admin.config.category.general": "通用",
"admin.config.category.share": "共享", "admin.config.category.share": "共享",
@@ -312,57 +315,57 @@ export default {
"admin.config.general.app-name.description": "自定义 App 的名称", "admin.config.general.app-name.description": "自定义 App 的名称",
"admin.config.general.app-url": "App 的地址", "admin.config.general.app-url": "App 的地址",
"admin.config.general.app-url.description": "Pingvin Share 的 URL 地址", "admin.config.general.app-url.description": "Pingvin Share 的 URL 地址",
"admin.config.general.secure-cookies": "Secure cookies", "admin.config.general.secure-cookies": "安全 Cookie",
"admin.config.general.secure-cookies.description": "Whether to set the secure flag on cookies. If enabled, the site will not function when accessed over HTTP.", "admin.config.general.secure-cookies.description": "是否为 cookie 设置安全标志。如果启用,当通过 HTTP 访问时站点将无法运行。",
"admin.config.general.show-home-page": "显示首页", "admin.config.general.show-home-page": "显示首页",
"admin.config.general.show-home-page.description": "是否显示首页", "admin.config.general.show-home-page.description": "是否显示首页",
"admin.config.general.session-duration": "会话时长", "admin.config.general.session-duration": "会话时长",
"admin.config.general.session-duration.description": "用户必须重新登录的时间 (默认3 个月)", "admin.config.general.session-duration.description": "用户必须重新登录的时间 (默认3 个月)",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "上传你的个性化 Logo图片必须是长宽比 1:1 的 PNG 格式", "admin.config.general.logo.description": "上传你的个性化 Logo图片必须是长宽比 1:1 的 PNG 格式",
"admin.config.general.logo.placeholder": "选择图片", "admin.config.general.logo.placeholder": "选择图片",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing", "admin.config.email.enable-share-email-recipients": "启用邮件收件人共享",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.", "admin.config.email.enable-share-email-recipients.description": "是否允许与收件人分享电子邮件。只有在SMTP被激活时才启用此功能。",
"admin.config.email.share-recipients-subject": "共享邮件通知主题", "admin.config.email.share-recipients-subject": "共享邮件通知主题",
"admin.config.email.share-recipients-subject.description": "发送共享邮件通知的邮件主题", "admin.config.email.share-recipients-subject.description": "发送共享邮件通知的邮件主题",
"admin.config.email.share-recipients-message": "共享邮件通知内容", "admin.config.email.share-recipients-message": "共享邮件通知内容",
"admin.config.email.share-recipients-message.description": "Message which gets sent to the share recipients. Available variables:\n {creator} - The username of the creator of the share\n {creatorEmail} - The email of the creator of the share\n {shareUrl} - The URL of the share\n {desc} - The description of the share\n {expires} - The expiration date of the share\n These variables will be replaced with the actual value.", "admin.config.email.share-recipients-message.description": "发给接收者的共享邮件通知的具体内容。可选的变量有:\n {creator} - 该共享的创建者\n {creatorEmail} - 共享创建者的电子邮箱\n {shareUrl} - 该共享的链接\n {desc} - 该共享的描述\n {expires} - 该共享的过期时间\n 这些变量会被实际的值所替代。",
"admin.config.email.reverse-share-subject": "预留共享邮件通知主题", "admin.config.email.reverse-share-subject": "预留共享邮件通知主题",
"admin.config.email.reverse-share-subject.description": "Subject of the sent email when someone created a share with your reverse share link.", "admin.config.email.reverse-share-subject.description": "当有人使用您的预留共享链接创建共享时发送电子邮件的主题",
"admin.config.email.reverse-share-message": "预留共享邮件通知内容", "admin.config.email.reverse-share-message": "预留共享邮件通知内容",
"admin.config.email.reverse-share-message.description": "当有人使用了你的预留共享链接时,发送的通知内容。{shareUrl} 会被创建者的用户名和共享链接代替", "admin.config.email.reverse-share-message.description": "当有人使用了你的预留共享链接时,发送的通知内容。{shareUrl} 会被创建者的用户名和共享链接代替",
"admin.config.email.reset-password-subject": "重置密码邮件通知主题", "admin.config.email.reset-password-subject": "重置密码邮件通知主题",
"admin.config.email.reset-password-subject.description": "Subject of the sent email when a user requests a password reset.", "admin.config.email.reset-password-subject.description": "当用户发起重置密码时,发送的重置密码邮件通知主题",
"admin.config.email.reset-password-message": "重置密码邮件通知内容", "admin.config.email.reset-password-message": "重置密码邮件通知内容",
"admin.config.email.reset-password-message.description": "当用户发起重置密码时,重置密码邮件通知内容。{url} 会被重置密码链接代替", "admin.config.email.reset-password-message.description": "当用户发起重置密码时,重置密码邮件通知内容。{url} 会被重置密码链接代替",
"admin.config.email.invite-subject": "邀请邮件通知主题", "admin.config.email.invite-subject": "邀请邮件通知主题",
"admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.", "admin.config.email.invite-subject.description": "当管理员邀请用户时,发送的邀请邮件通知主题",
"admin.config.email.invite-message": "邀请邮件通知内容", "admin.config.email.invite-message": "邀请邮件通知内容",
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the users password.", "admin.config.email.invite-message.description": "管理员邀请用户时发送的消息。{url} 将被替换为邀请链接,{email} 将被替换为电子邮件,{password} 将被替换为用户的密码。",
"admin.config.share.allow-registration": "允许注册", "admin.config.share.allow-registration": "允许注册",
"admin.config.share.allow-registration.description": "是否允许注册", "admin.config.share.allow-registration.description": "是否允许注册",
"admin.config.share.allow-unauthenticated-shares": "是否允许未验证的共享", "admin.config.share.allow-unauthenticated-shares": "是否允许未验证的共享",
"admin.config.share.allow-unauthenticated-shares.description": "是否允许未验证的用户创建共享", "admin.config.share.allow-unauthenticated-shares.description": "是否允许未验证的用户创建共享",
"admin.config.share.max-expiration": "最长过期时间", "admin.config.share.max-expiration": "最长过期时间",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.", "admin.config.share.max-expiration.description": "“最长过期时间”以小时为单位如果将其设置为“0”则为永不过期。",
"admin.config.share.share-id-length": "Default share ID length", "admin.config.share.share-id-length": "默认共享ID长度",
"admin.config.share.share-id-length.description": "Default length for the generated ID of a share. This value is also used to generate links for reverse shares. A value below 8 is not considered secure.", "admin.config.share.share-id-length.description": "生成的共享 ID 的默认长度。该值也用于生成预留共享的链接。低于 8 的值不安全。",
"admin.config.share.max-size": "最大文件上限", "admin.config.share.max-size": "最大文件上限",
"admin.config.share.max-size.description": "最大文件上限", "admin.config.share.max-size.description": "最大文件上限",
"admin.config.share.zip-compression-level": "Zip 文件压缩质量", "admin.config.share.zip-compression-level": "Zip 文件压缩质量",
"admin.config.share.zip-compression-level.description": "调整压缩质量来平衡压缩文件的大小和压缩的速度。有效值介于 0 和 9 之间0 为不压缩9 为最高质量压缩。 ", "admin.config.share.zip-compression-level.description": "调整压缩质量来平衡压缩文件的大小和压缩的速度。有效值介于 0 和 9 之间0 为不压缩9 为最高质量压缩。 ",
"admin.config.share.chunk-size": "块大小", "admin.config.share.chunk-size": "块大小",
"admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.", "admin.config.share.chunk-size.description": "根据你的互联网连接情况调整上传文件的块大小(以字节为单位),以平衡效率和可靠性。 较小的块有助于提高不稳定网络环境中的上传成功率,而较大的块则可以加快稳定网络环境中的上传速度。",
"admin.config.share.auto-open-share-modal": "自动打开创建共享对话框", "admin.config.share.auto-open-share-modal": "自动打开创建共享对话框",
"admin.config.share.auto-open-share-modal.description": "每当用户选择完将要被上传的文件后,自动打开创建共享的对话框。", "admin.config.share.auto-open-share-modal.description": "每当用户选择完将要被上传的文件后,自动打开创建共享的对话框。",
"admin.config.smtp.enabled": "Enable", "admin.config.smtp.enabled": "启用",
"admin.config.smtp.enabled.description": "是否开启 SMTP仅当输入主机名、端口、发送邮箱、用户名和密码后开启", "admin.config.smtp.enabled.description": "是否开启 SMTP仅当输入主机名、端口、发送邮箱、用户名和密码后开启",
"admin.config.smtp.host": "主机名", "admin.config.smtp.host": "主机名",
"admin.config.smtp.host.description": "SMTP 主机名", "admin.config.smtp.host.description": "SMTP 主机名",
"admin.config.smtp.port": "端口", "admin.config.smtp.port": "端口",
"admin.config.smtp.port.description": "SMTP 主机端口", "admin.config.smtp.port.description": "SMTP 主机端口",
"admin.config.smtp.email": "发送邮箱", "admin.config.smtp.email": "发送邮箱",
"admin.config.smtp.email.description": "Email address from wich the emails get sent", "admin.config.smtp.email.description": "发件人电子邮件地址",
"admin.config.smtp.username": "用户名", "admin.config.smtp.username": "用户名",
"admin.config.smtp.username.description": "SMTP 主机用户名", "admin.config.smtp.username.description": "SMTP 主机用户名",
"admin.config.smtp.password": "密码", "admin.config.smtp.password": "密码",
@@ -398,8 +401,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth App 的 Client secret", "admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth App 的 Client secret",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "是否启用 Discord 账号登录", "admin.config.oauth.discord-enabled.description": "是否启用 Discord 账号登录",
"admin.config.oauth.discord-limited-users": "Discord limited users", "admin.config.oauth.discord-limited-users": "Discord 受限用户",
"admin.config.oauth.discord-limited-users.description": "Limit signing in to specific users by their Discord ID. Leave it blank to disable.", "admin.config.oauth.discord-limited-users.description": "使用Discord ID限制登录到特定的用户。留空以禁用。",
"admin.config.oauth.discord-limited-guild": "Discord 的 limited server ID", "admin.config.oauth.discord-limited-guild": "Discord 的 limited server ID",
"admin.config.oauth.discord-limited-guild.description": "限制特定服务器中的用户登录。留空来禁用。", "admin.config.oauth.discord-limited-guild.description": "限制特定服务器中的用户登录。留空来禁用。",
"admin.config.oauth.discord-client-id": "Discord 的 Client ID", "admin.config.oauth.discord-client-id": "Discord 的 Client ID",
@@ -410,70 +413,72 @@ export default {
"admin.config.oauth.oidc-enabled.description": "是否启用 OpenID Connect 登录", "admin.config.oauth.oidc-enabled.description": "是否启用 OpenID Connect 登录",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect 的 Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect 的 Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth App 的 Discovery URI", "admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth App 的 Discovery URI",
"admin.config.oauth.oidc-sign-out": "Sign out from OpenID Connect", "admin.config.oauth.oidc-sign-out": " OpenID Connect 注销",
"admin.config.oauth.oidc-sign-out.description": "Whether the “Sign out” button will sign out from the OpenID Connect provider", "admin.config.oauth.oidc-sign-out.description": "“注销”按钮是否会退出OpenID连接提供商",
"admin.config.oauth.oidc-scope": "OpenID Connect scope", "admin.config.oauth.oidc-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.", "admin.config.oauth.oidc-scope.description": " OpenID Connect 提供商请求的范围。",
"admin.config.oauth.oidc-username-claim": "OpenID Connect 用户名请求", "admin.config.oauth.oidc-username-claim": "OpenID Connect 用户名请求",
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID token 中的用户名请求。如果您不知道这项配置是什么,请留空。", "admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID token 中的用户名请求。如果您不知道这项配置是什么,请留空。",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token", "admin.config.oauth.oidc-role-path": " OpenID Connect 令牌中的角色路径",
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "只有在没有配置其他身份提供商且密码登录被禁用的情况下,才建议使用 OpenID Connect 角色来管理访问权限。 " + "如果您不知道此配置是什么,请留空。",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access", "admin.config.oauth.oidc-role-general-access": "常规访问的 OpenID Connect 角色",
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a users roles for them to log in. " + "Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-role-general-access.description": "一般访问所需的角色。必须在用户角色中显示才能登录。 " + "如果您不知道此配置是什么,请留空。",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access", "admin.config.oauth.oidc-role-admin-access": "管理员访问的 OpenID Connect 角色",
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a users roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-role-admin-access.description": "管理权限所需的角色。必须在用户角色中显示他们才能访问管理面板。 " + "如果您不知道此配置是什么,请留空。",
"admin.config.oauth.oidc-client-id": "OpenID Connect 的 Client ID", "admin.config.oauth.oidc-client-id": "OpenID Connect 的 Client ID",
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth App 的 Client ID", "admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth App 的 Client ID",
"admin.config.oauth.oidc-client-secret": "OpenID Connect 的 Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect 的 Client secret",
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth App 的 Client secret", "admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth App 的 Client secret",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP", "admin.config.ldap.enabled": "启用 LDAP",
"admin.config.ldap.enabled.description": "使用 LDAP 身份认证进行用户登录", "admin.config.ldap.enabled.description": "使用 LDAP 身份认证进行用户登录",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "服务器 URL",
"admin.config.ldap.url.description": "LDAP 服务器的 URL", "admin.config.ldap.url.description": "LDAP 服务器的 URL",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user used to perform the user search", "admin.config.ldap.bind-dn.description": "用于执行用户搜索的默认用户",
"admin.config.ldap.bind-password": "Bind password", "admin.config.ldap.bind-password": "绑定密码",
"admin.config.ldap.bind-password.description": "Password used to perform the user search", "admin.config.ldap.bind-password.description": "用于执行用户搜索的密码",
"admin.config.ldap.search-base": "User base", "admin.config.ldap.search-base": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "admin.config.ldap.search-base.description": "进行用户搜索的基本位置",
"admin.config.ldap.search-query": "User query", "admin.config.ldap.search-query": "用户查询",
"admin.config.ldap.search-query.description": "将用于在 'User base'中搜索 LDAP 用户。%username% 可以作为用户输入的占位符。", "admin.config.ldap.search-query.description": "将用于在 'User base'中搜索 LDAP 用户。%username% 可以作为用户输入的占位符。",
"admin.config.ldap.admin-groups": "Admin group", "admin.config.ldap.admin-groups": "管理员群组",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name", "admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.", "admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
"admin.config.ldap.field-name-email": "User email attribute name", "admin.config.ldap.field-name-email": "User email attribute name",
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.", "admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
"admin.config.notify.success": "Configuration updated successfully.", "admin.config.notify.success": "Configuration updated successfully.",
"admin.config.notify.logo-success": "Logo updated successfully. It may take a few minutes to update on the website.", "admin.config.notify.logo-success": "Logo 更新成功。可能需要几分钟时间才能在网站上更新。",
"admin.config.notify.no-changes": "No changes to save.", "admin.config.notify.no-changes": "没有要保存的更改。",
"admin.config.category.s3": "S3", "admin.config.category.s3": "对象存储",
"admin.config.s3.enabled": "Enabled", "admin.config.s3.enabled": "启用",
"admin.config.s3.enabled.description": "Whether S3 should be used to store the shared files instead of the local file system.", "admin.config.s3.enabled.description": "是否使用 S3 来存储共享文件而不是本地文件系统。",
"admin.config.s3.endpoint": "Endpoint", "admin.config.s3.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.", "admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region", "admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.", "admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name", "admin.config.s3.bucket-name": "Bucket名称",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.", "admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"admin.config.s3.bucket-path": "Path", "admin.config.s3.bucket-path": "路径",
"admin.config.s3.bucket-path.description": "The default path which should be used to store the files in the S3 bucket.", "admin.config.s3.bucket-path.description": "用于在 S3 桶中存储文件的默认路径。",
"admin.config.s3.key": "Key", "admin.config.s3.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "允许您访问 S3 桶的密钥。",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "允许您访问 S3 桶的密钥。",
"admin.config.category.legal": "Legal", "admin.config.s3.use-checksum": "Use checksum",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.category.legal": "合规",
"admin.config.legal.imprint-text": "Imprint text", "admin.config.legal.enabled": "启用合规提醒",
"admin.config.legal.imprint-text.description": "The text which should be shown in the imprint. Supports Markdown. Leave blank to link to an external imprint page.", "admin.config.legal.enabled.description": "是否在页脚中显示版权信息和隐私政策。",
"admin.config.legal.imprint-url": "Imprint URL", "admin.config.legal.imprint-text": "版权信息",
"admin.config.legal.imprint-url.description": "If you already have an imprint page you can link it here instead of using the text field.", "admin.config.legal.imprint-text.description": "文本将会显示在版权信息中。支持Markdown。留空以链接到版权信息页面。",
"admin.config.legal.privacy-policy-text": "Privacy policy text", "admin.config.legal.imprint-url": "版权信息 URL",
"admin.config.legal.privacy-policy-text.description": "The text which should be shown in the privacy policy. Supports Markdown. Leave blank to link to an external privacy policy page.", "admin.config.legal.imprint-url.description": "如果您已经有一个版权信息页面,您可以在此链接它,而不是使用文本字段。",
"admin.config.legal.privacy-policy-url": "Privacy policy URL", "admin.config.legal.privacy-policy-text": "隐私政策文本",
"admin.config.legal.privacy-policy-url.description": "If you already have a privacy policy page you can link it here instead of using the text field.", "admin.config.legal.privacy-policy-text.description": "文本将会显示在隐私政策页面中。支持Markdown。留空以链接到隐私政策页面。",
"admin.config.legal.privacy-policy-url": "隐私政策网址",
"admin.config.legal.privacy-policy-url.description": "如果您已经有一个隐私政策页面,您可以在此链接它,而不是使用文本字段。",
// 404 // 404
"404.description": "当前的页面走丢啦", "404.description": "当前的页面走丢啦",
"404.button.home": "返回主页", "404.button.home": "返回主页",
@@ -488,10 +493,10 @@ export default {
"error.msg.no_user": "用户关联的这个 {0} 账户不存在。", "error.msg.no_user": "用户关联的这个 {0} 账户不存在。",
"error.msg.no_email": "无法从 {0} 这个账户获取邮箱地址。", "error.msg.no_email": "无法从 {0} 这个账户获取邮箱地址。",
"error.msg.already_linked": "{0} 这个账户已经关联到另一个账号。", "error.msg.already_linked": "{0} 这个账户已经关联到另一个账号。",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.", "error.msg.not_linked": "这个 {0} 账户尚未关联到任何账号。",
"error.msg.unverified_account": "{0} 这个账户尚未验证,请在验证后重试。", "error.msg.unverified_account": "{0} 这个账户尚未验证,请在验证后重试。",
"error.msg.user_not_allowed": "您无权登录。", "error.msg.user_not_allowed": "您无权登录。",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.", "error.msg.cannot_get_user_info": "无法从 {0} 这个账户获取您的用户信息。",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "谷歌", "error.param.provider_google": "谷歌",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -509,9 +514,9 @@ export default {
"common.button.generate": "生成", "common.button.generate": "生成",
"common.button.done": "完成", "common.button.done": "完成",
"common.text.link": "链接", "common.text.link": "链接",
"common.text.navigate-to-link": "Visit link", "common.text.navigate-to-link": "访问链接",
"common.text.or": "或", "common.text.or": "或",
"common.text.redirecting": "Redirecting...", "common.text.redirecting": "正在跳转中...",
"common.button.go-back": "返回", "common.button.go-back": "返回",
"common.button.go-home": "返回主页", "common.button.go-home": "返回主页",
"common.notify.copied": "已复制到剪贴板", "common.notify.copied": "已复制到剪贴板",
@@ -522,7 +527,7 @@ export default {
"common.error.invalid-email": "邮件地址不可用", "common.error.invalid-email": "邮件地址不可用",
"common.error.too-short": "必须不少于 {length} 个字符", "common.error.too-short": "必须不少于 {length} 个字符",
"common.error.too-long": "必须不超过 {length} 个字符", "common.error.too-long": "必须不超过 {length} 个字符",
"common.error.number-too-small": "Must be at least {min}", "common.error.number-too-small": "必须至多为 {min}",
"common.error.number-too-large": "必须至多为 {max}", "common.error.number-too-large": "必须至多为 {max}",
"common.error.exact-length": "必须为 {length} 个字符", "common.error.exact-length": "必须为 {length} 个字符",
"common.error.invalid-number": "必须为数字", "common.error.invalid-number": "必须为数字",

View File

@@ -270,6 +270,7 @@ export default {
// /share/[id] // /share/[id]
"share.title": "分享 {shareId}", "share.title": "分享 {shareId}",
"share.description": "瞧瞧我給您分享了些什麽!", "share.description": "瞧瞧我給您分享了些什麽!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "查看次數達到上限", "share.error.visitor-limit-exceeded.title": "查看次數達到上限",
"share.error.visitor-limit-exceeded.description": "查看次數達到上限", "share.error.visitor-limit-exceeded.description": "查看次數達到上限",
"share.error.removed.title": "分享已刪除", "share.error.removed.title": "分享已刪除",
@@ -302,6 +303,8 @@ export default {
"privacy.title": "Privacy Policy", "privacy.title": "Privacy Policy",
// END /privacy // END /privacy
// /admin/config // /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "As you have a configured Pingvin Share with a configuration file, you can't change the configuration through the UI.",
"admin.config.title": "配置管理", "admin.config.title": "配置管理",
"admin.config.category.general": "通用", "admin.config.category.general": "通用",
"admin.config.category.share": "分享", "admin.config.category.share": "分享",
@@ -317,7 +320,7 @@ export default {
"admin.config.general.show-home-page": "顯示首頁", "admin.config.general.show-home-page": "顯示首頁",
"admin.config.general.show-home-page.description": "是否顯示首頁", "admin.config.general.show-home-page.description": "是否顯示首頁",
"admin.config.general.session-duration": "工作階段持續時間", "admin.config.general.session-duration": "工作階段持續時間",
"admin.config.general.session-duration.description": "使用者需要必須要重新登入的最長時間 (預設: 3 個月)", "admin.config.general.session-duration.description": "Time after which a user must log in again (default: 3 months).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "上傳個性化 Logo圖片必須是長寬比 1:1 的 PNG 格式", "admin.config.general.logo.description": "上傳個性化 Logo圖片必須是長寬比 1:1 的 PNG 格式",
"admin.config.general.logo.placeholder": "選擇圖片", "admin.config.general.logo.placeholder": "選擇圖片",
@@ -362,7 +365,7 @@ export default {
"admin.config.smtp.port": "通訊埠", "admin.config.smtp.port": "通訊埠",
"admin.config.smtp.port.description": "SMTP 通訊埠", "admin.config.smtp.port.description": "SMTP 通訊埠",
"admin.config.smtp.email": "發送郵箱", "admin.config.smtp.email": "發送郵箱",
"admin.config.smtp.email.description": "發送的郵箱地址", "admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "使用者名稱", "admin.config.smtp.username": "使用者名稱",
"admin.config.smtp.username.description": "SMTP 主機使用者名稱", "admin.config.smtp.username.description": "SMTP 主機使用者名稱",
"admin.config.smtp.password": "密碼", "admin.config.smtp.password": "密碼",
@@ -463,6 +466,8 @@ export default {
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.", "admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret", "admin.config.s3.secret": "Secret",
"admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.", "admin.config.s3.secret.description": "The secret which allows you to access the S3 bucket.",
"admin.config.s3.use-checksum": "Use checksum",
"admin.config.s3.use-checksum.description": "Turn off for backends that do not support checksum (e.g. B2).",
"admin.config.category.legal": "Legal", "admin.config.category.legal": "Legal",
"admin.config.legal.enabled": "Enable legal notices", "admin.config.legal.enabled": "Enable legal notices",
"admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.", "admin.config.legal.enabled.description": "Whether to show a link to imprint and privacy policy in the footer.",

View File

@@ -413,7 +413,7 @@ const Account = () => {
onConfirm: async () => { onConfirm: async () => {
await userService await userService
.removeCurrentUser() .removeCurrentUser()
.then(()=> window.location.reload()) .then(() => window.location.reload())
.catch(toast.axiosError); .catch(toast.axiosError);
}, },
}) })

View File

@@ -1,4 +1,5 @@
import { import {
Alert,
AppShell, AppShell,
Box, Box,
Button, Button,
@@ -13,6 +14,7 @@ import { useMediaQuery } from "@mantine/hooks";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { TbInfoCircle } from "react-icons/tb";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
import Meta from "../../../components/Meta"; import Meta from "../../../components/Meta";
import AdminConfigInput from "../../../components/admin/configuration/AdminConfigInput"; import AdminConfigInput from "../../../components/admin/configuration/AdminConfigInput";
@@ -46,6 +48,10 @@ export default function AppShellDemo() {
const [logo, setLogo] = useState<File | null>(null); const [logo, setLogo] = useState<File | null>(null);
const isEditingAllowed = (): boolean => {
return !configVariables || configVariables[0].allowEdit;
};
const saveConfigVariables = async () => { const saveConfigVariables = async () => {
if (logo) { if (logo) {
configService configService
@@ -132,6 +138,17 @@ export default function AppShellDemo() {
) : ( ) : (
<> <>
<Stack> <Stack>
{!isEditingAllowed() && (
<Alert
mb={"lg"}
variant="light"
color="primary"
title={t("admin.config.config-file-warning.title")}
icon={<TbInfoCircle />}
>
<FormattedMessage id="admin.config.config-file-warning.description" />
</Alert>
)}
<Title mb="md" order={3}> <Title mb="md" order={3}>
{t("admin.config.category." + categoryId)} {t("admin.config.category." + categoryId)}
</Title> </Title>

View File

@@ -54,19 +54,22 @@ const Admin = () => {
]); ]);
useEffect(() => { useEffect(() => {
configService.isNewReleaseAvailable().then((isNewReleaseAvailable) => { configService
if (isNewReleaseAvailable) { .isNewReleaseAvailable()
setManagementOptions([ .then((isNewReleaseAvailable) => {
...managementOptions, if (isNewReleaseAvailable) {
{ setManagementOptions([
title: "Update", ...managementOptions,
icon: TbRefresh, {
route: title: "Update",
"https://github.com/stonith404/pingvin-share/releases/latest", icon: TbRefresh,
}, route:
]); "https://github.com/stonith404/pingvin-share/releases/latest",
} },
}); ]);
}
})
.catch();
}, []); }, []);
return ( return (

View File

@@ -2,6 +2,7 @@ import { Box, Group, Text, Title } from "@mantine/core";
import { useModals } from "@mantine/modals"; import { useModals } from "@mantine/modals";
import { GetServerSidePropsContext } from "next"; import { GetServerSidePropsContext } from "next";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { FormattedMessage } from "react-intl";
import Meta from "../../../components/Meta"; import Meta from "../../../components/Meta";
import DownloadAllButton from "../../../components/share/DownloadAllButton"; import DownloadAllButton from "../../../components/share/DownloadAllButton";
import FileList from "../../../components/share/FileList"; import FileList from "../../../components/share/FileList";
@@ -11,6 +12,7 @@ import useTranslate from "../../../hooks/useTranslate.hook";
import shareService from "../../../services/share.service"; import shareService from "../../../services/share.service";
import { Share as ShareType } from "../../../types/share.type"; import { Share as ShareType } from "../../../types/share.type";
import toast from "../../../utils/toast.util"; import toast from "../../../utils/toast.util";
import { byteToHumanSizeString } from "../../../utils/fileSize.util";
export function getServerSideProps(context: GetServerSidePropsContext) { export function getServerSideProps(context: GetServerSidePropsContext) {
return { return {
@@ -107,7 +109,25 @@ const Share = ({ shareId }: { shareId: string }) => {
<Box style={{ maxWidth: "70%" }}> <Box style={{ maxWidth: "70%" }}>
<Title order={3}>{share?.name || share?.id}</Title> <Title order={3}>{share?.name || share?.id}</Title>
<Text size="sm">{share?.description}</Text> <Text size="sm">{share?.description}</Text>
{share?.files?.length > 0 && (
<Text size="sm" color="dimmed" mt={5}>
<FormattedMessage
id="share.fileCount"
values={{
count: share?.files?.length || 0,
size: byteToHumanSizeString(
share?.files?.reduce(
(total: number, file: { size: string }) =>
total + parseInt(file.size),
0,
) || 0,
),
}}
/>
</Text>
)}
</Box> </Box>
{share?.files.length > 1 && <DownloadAllButton shareId={shareId} />} {share?.files.length > 1 && <DownloadAllButton shareId={shareId} />}
</Group> </Group>

View File

@@ -16,6 +16,7 @@ export type AdminConfig = Config & {
secret: boolean; secret: boolean;
description: string; description: string;
obscured: boolean; obscured: boolean;
allowEdit: boolean;
}; };
export type AdminConfigGroupedByCategory = { export type AdminConfigGroupedByCategory = {

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "pingvin-share", "name": "pingvin-share",
"version": "1.9.1", "version": "1.12.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pingvin-share", "name": "pingvin-share",
"version": "1.9.1", "version": "1.12.0",
"devDependencies": { "devDependencies": {
"conventional-changelog-cli": "^3.0.0" "conventional-changelog-cli": "^3.0.0"
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "pingvin-share", "name": "pingvin-share",
"version": "1.9.1", "version": "1.12.0",
"scripts": { "scripts": {
"format": "cd frontend && npm run format && cd ../backend && npm run format", "format": "cd frontend && npm run format && cd ../backend && npm run format",
"lint": "cd frontend && npm run lint && cd ../backend && npm run lint", "lint": "cd frontend && npm run lint && cd ../backend && npm run lint",
@@ -11,5 +11,9 @@
}, },
"devDependencies": { "devDependencies": {
"conventional-changelog-cli": "^3.0.0" "conventional-changelog-cli": "^3.0.0"
},
"prettier": {
"singleQuote": false,
"trailingComma": "all"
} }
} }

View File

@@ -3,11 +3,16 @@
# Copy default logo to the frontend public folder if it doesn't exist # Copy default logo to the frontend public folder if it doesn't exist
cp -rn /tmp/img/* /opt/app/frontend/public/img cp -rn /tmp/img/* /opt/app/frontend/public/img
# Start Caddy if [ "$CADDY_DISABLED" != "true" ]; then
if [ "$TRUST_PROXY" = "true" ]; then # Start Caddy
caddy start --adapter caddyfile --config /opt/app/reverse-proxy/Caddyfile.trust-proxy & echo "Starting Caddy..."
if [ "$TRUST_PROXY" = "true" ]; then
caddy start --adapter caddyfile --config /opt/app/reverse-proxy/Caddyfile.trust-proxy &
else
caddy start --adapter caddyfile --config /opt/app/reverse-proxy/Caddyfile &
fi
else else
caddy start --adapter caddyfile --config /opt/app/reverse-proxy/Caddyfile & echo "Caddy is disabled. Skipping..."
fi fi
# Run the frontend server # Run the frontend server

View File

@@ -0,0 +1,66 @@
import * as fs from "fs";
import * as yaml from "yaml";
import { configVariables } from "../backend/prisma/seed/config.seed";
import translations from "../frontend/src/i18n/translations/en-US";
// Prepare an object that only contains the categories, keys and values
const configVariablesWithDefaultValues = {};
for (const [category, variables] of Object.entries(configVariables)) {
if (category == "internal") continue;
for (const [variableName, { defaultValue }] of Object.entries(variables)) {
if (!configVariablesWithDefaultValues[category]) {
configVariablesWithDefaultValues[category] = {};
}
configVariablesWithDefaultValues[category][variableName] = defaultValue;
}
}
// As `initUser` is not part of the `configVariables` object, we add it manually
configVariablesWithDefaultValues["initUser"] = {
enabled: false,
username: "admin",
email: "admin@example.com",
password: "my-secure-password",
isAdmin: true,
ldapDN: "",
};
// Create the yaml document
const doc: any = new yaml.Document(configVariablesWithDefaultValues);
// Add the descriptions imported from `en-US.ts` as comments
for (const category of doc.contents.items) {
// As `initUser` can't be configured from the UI, we have to add the description manually
if (category.key.value === "initUser") {
category.key.commentBefore =
"This configuration is used to create the initial user when the application is started for the first time.\n";
category.key.commentBefore +=
"Make sure to change at least the password as soon as you log in!";
}
for (const variable of category.value.items) {
variable.key.commentBefore = getDescription(
category.key.value,
variable.key.value
);
}
}
doc.commentBefore =
"This configuration is pre-filled with the default values.\n";
doc.commentBefore +=
"You can remove keys you don't want to set. If a key is missing, the value set in the UI will be used; if that is also unset, the default value applies.";
// Write the YAML content to a file
fs.writeFileSync("../config.example.yaml", doc.toString({ indent: 2 }), "utf8");
console.log("YAML file generated successfully!");
// Helper functions
function getDescription(category: string, name: string) {
return translations[
`admin.config.${category}.${camelToKebab(name)}.description`
];
}
function camelToKebab(str: string) {
return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
}

229
scripts/package-lock.json generated Normal file
View File

@@ -0,0 +1,229 @@
{
"name": "scripts",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "scripts",
"version": "1.0.0",
"dependencies": {
"yaml": "^2.7.0"
},
"devDependencies": {
"@types/node": "^22.13.5",
"ts-node": "^10.9.2"
}
},
"node_modules/@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "0.3.9"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"dev": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"node_modules/@tsconfig/node10": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
"dev": true
},
"node_modules/@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
"dev": true
},
"node_modules/@tsconfig/node14": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
"dev": true
},
"node_modules/@tsconfig/node16": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"dev": true
},
"node_modules/@types/node": {
"version": "22.13.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz",
"integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==",
"dev": true,
"dependencies": {
"undici-types": "~6.20.0"
}
},
"node_modules/acorn": {
"version": "8.14.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
"integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-walk": {
"version": "8.3.4",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
"integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
"dev": true,
"dependencies": {
"acorn": "^8.11.0"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true
},
"node_modules/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true
},
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true,
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
"node_modules/ts-node": {
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dev": true,
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7",
"@tsconfig/node12": "^1.0.7",
"@tsconfig/node14": "^1.0.0",
"@tsconfig/node16": "^1.0.2",
"acorn": "^8.4.1",
"acorn-walk": "^8.1.1",
"arg": "^4.1.0",
"create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"v8-compile-cache-lib": "^3.0.1",
"yn": "3.1.1"
},
"bin": {
"ts-node": "dist/bin.js",
"ts-node-cwd": "dist/bin-cwd.js",
"ts-node-esm": "dist/bin-esm.js",
"ts-node-script": "dist/bin-script.js",
"ts-node-transpile-only": "dist/bin-transpile.js",
"ts-script": "dist/bin-script-deprecated.js"
},
"peerDependencies": {
"@swc/core": ">=1.2.50",
"@swc/wasm": ">=1.2.50",
"@types/node": "*",
"typescript": ">=2.7"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"@swc/wasm": {
"optional": true
}
}
},
"node_modules/typescript": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"dev": true,
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici-types": {
"version": "6.20.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"dev": true
},
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
"dev": true
},
"node_modules/yaml": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
"integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
"engines": {
"node": ">=6"
}
}
}
}

15
scripts/package.json Normal file
View File

@@ -0,0 +1,15 @@
{
"name": "scripts",
"version": "1.0.0",
"scripts": {
"generate-example-config": "ts-node generate-example-config.ts"
},
"description": "",
"dependencies": {
"yaml": "^2.7.0"
},
"devDependencies": {
"@types/node": "^22.13.5",
"ts-node": "^10.9.2"
}
}

8
scripts/tsconfig.json Normal file
View File

@@ -0,0 +1,8 @@
{
"compilerOptions": {
"esModuleInterop": true,
"moduleResolution": "node"
},
"include": ["/**/*.ts", "generate-example-config.ts"],
"exclude": ["node_modules"]
}