Compare commits

...

139 Commits
v1.2.4 ... main

Author SHA1 Message Date
Elias Schneider
4f9a502e40 last commit :) 2025-06-29 15:57:48 +02:00
Elias Schneider
def1d571d0 chore(translations): update translations via Crowdin (#842)
* New translations en-us.ts (Czech)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Danish)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* 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 (Slovenian)

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

* 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 (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)

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

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (French)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Finnish)

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

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

* New translations en-us.ts (Spanish)

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

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

* New translations en-us.ts (Turkish)

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

* New translations en-us.ts (Chinese Traditional)
2025-06-29 15:32:33 +02:00
Elias Schneider
58de3ce0df chore(translations): update translations via Crowdin 2025-05-25 22:25:52 +02:00
Elias Schneider
dd546b4f17 release: 1.13.0 2025-05-25 22:19:48 +02:00
iisteev
19e6b9a0be docs: update config.example.yaml url in configuration.md (#841)
* docs: update the config.example.yaml url

The example file of the config is config.example.yaml
and not config.yml

* docs: format configuration.md markdown tables

Signed-off-by: iisteev <isteevan.shetoo@is-info.fr>

---------

Signed-off-by: iisteev <isteevan.shetoo@is-info.fr>
2025-05-25 22:18:00 +02:00
JulesdeCube
85f514316b feat: allow to use redis cache instead of memory cache (#832)
* feat(backend/cache): allow to use redis cache instead as memory

* feat(frontend/admin): add cache section

Add a new section for cache attributes. Also add US translation.

---------

Co-authored-by: Jules Lefebvre <jules.lefebvre@diabolocom.com>
2025-05-25 22:16:19 +02:00
JulesdeCube
cfdb29ed4d feat(backend): allow to define path to the config file (#838)
Allow to configure where the configuration file is located via the `CONFIG_FILE` environment variable

Co-authored-by: Jules Lefebvre <jules.lefebvre@diabolocom.com>
2025-05-19 15:30:06 +02:00
Elias Schneider
18b34e9bf2 chore(translations): update translations via Crowdin (#839)
* New translations en-us.ts (Czech)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Swedish)
2025-05-19 15:28:24 +02:00
Elias Schneider
9d603c41e5 chore: explicitly upgrade Next.js to version 14.2.26 2025-05-16 09:40:49 +02:00
Elias Schneider
7ba499d5a0 New translations en-us.ts (Portuguese, Brazilian) (#831) 2025-05-14 09:35:57 +02:00
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
Elias Schneider
dcea5ccd89 release: 1.9.1 2025-02-14 14:59:42 +01:00
Elias Schneider
bfbc87817f chore(translations): update translations via Crowdin (#767) 2025-02-14 14:55:55 +01:00
Elias Schneider
a2e031326e fix: page doesn't reload on user deletion 2025-02-14 14:41:52 +01:00
Elias Schneider
ec92e85c8d fix: redirection to the OIDC end session endpoint 2025-02-14 14:30:21 +01:00
Elias Schneider
4b642f419b release: 1.9.0 2025-02-12 16:53:30 +01:00
Elias Schneider
75cd3895d9 chore(translations): add Estonian 2025-02-12 16:51:56 +01:00
Elias Schneider
d3b38b27d1 chore(translations): update translations via Crowdin (#762)
* New translations en-us.ts (French)

* New translations en-us.ts (Italian)
2025-02-09 20:57:00 +01:00
Elias Schneider
398a5532dc chore(translations): update translations via Crowdin (#752)
* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (German)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Spanish)

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

* New translations en-us.ts (German)

* New translations en-us.ts (French)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Danish)

* 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 (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 (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 (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 (Portuguese, Brazilian)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (German)
2025-01-27 18:53:55 +01:00
GitNees
70b577f5ac feat: ability to add email to recipients list by clicking enter (#760)
I encountered so many times now that I send by email, which I use 99% of the time, it didnt got send, because the mail was not accepted when pressing enter. 

Also because no confirmation mail is send, i never knew it arrived. Ill work on that code later, but adding enter to that field, will help a lot!
2025-01-27 18:53:42 +01:00
Finley Thomalla
0d71146a2c docs: fix some typos (#755)
I changed "doc" to "docs" in `contribute.md` as I could only find the latter commit type in the commit history.

Co-authored-by: Finley Thomalla <finley.thomalla@post.ch>
2025-01-22 16:53:07 +01:00
Rai
a53f0711fb chore: fixe spelling mistake (#754) 2025-01-22 16:52:36 +01:00
Elias Schneider
8a7db6bf97 release: 1.8.2 2025-01-21 19:01:38 +01:00
Elias Schneider
f78777b284 chore(translations): update translations via Crowdin (#748)
* New translations en-us.ts (Japanese)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Spanish)
2025-01-21 18:57:45 +01:00
Elias Schneider
3a534c7512 fix: normal share gets attached to previously visited reverse share 2025-01-21 18:57:33 +01:00
Elias Schneider
2b7d3c0a8a fix: wrong TOTP validation for password 2025-01-21 18:44:06 +01:00
Webysther Sperandio
7fea358410 chore: add major tag to Docker image (#747) 2025-01-14 10:13:26 +01:00
Elias Schneider
f65c1ef7d8 docs: add ghcr.io image to docker-compose.yml 2025-01-08 12:27:56 +01:00
Elias Schneider
9e4496dc03 ci/cd: add semver versioning for Docker images 2025-01-08 12:20:12 +01:00
Webysther Sperandio
235772a54b ci/cd: add ghrc.io login to action (#738) 2025-01-08 12:16:50 +01:00
Elias Schneider
784e80db5b chore(translations): update translations via Crowdin (#728)
* New translations en-us.ts (French)

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

* New translations en-us.ts (Italian)

* New translations en-us.ts (German)

* New translations en-us.ts (Vietnamese)
2025-01-06 11:00:12 +01:00
Elias Schneider
0442ece9ba refactor: remove unnecessary console.log 2025-01-04 01:32:30 +01:00
Elias Schneider
7f9f8b6fe7 release: 1.8.1 2025-01-04 01:28:23 +01:00
Elias Schneider
bf1b2633c8 refactor: run formatter 2025-01-04 01:28:05 +01:00
Elias Schneider
b3ea96c191 fix: wrong validation for expiration in reverse share modal 2025-01-04 01:27:59 +01:00
Elias Schneider
4a7076a094 release: 1.8.0 2025-01-02 18:25:34 +01:00
Elias Schneider
0c62485833 chore: add migration for new timespan type 2025-01-02 18:22:02 +01:00
Elias Schneider
2c555eaf9f chore(translations): update translations via Crowdin (#722)
* New translations en-us.ts (Japanese)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Czech)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Danish)

* 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 (Korean)

* New translations en-us.ts (Polish)

* 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 (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 (Portuguese, Brazilian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (French)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Czech)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* 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 (Korean)

* New translations en-us.ts (Polish)

* 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 (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 (French)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Czech)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* 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 (Korean)

* New translations en-us.ts (Polish)

* 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 (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-01-02 17:49:25 +01:00
Aaron
36afbf91b7 feat: improve UI for timespan inputs on admin page (#726)
* Define Timestamp type

* Implement Timestamp utils

* Implement Timespan input

* Use timestamp input on config page

* Add timespan type to config services

* Refactor maxExpiration to use timespan type across services and components

* Update sessionDuration to use timespan type in config and adjust token expiration logic

* Update localized strings
2025-01-02 17:35:50 +01:00
Aaron
df1ffaa2bc feat: add legal page with configuration options (#724)
* Addconfig entries for legal notice

* Add legal route handling to middleware

* Make legal notice public

* Add legal category to config sidebar

* Add legal notice page

* Add German translations for legal notice and configuration options

* Replace legal page with separate imprint and privacy pages

* Update middleware

* Add footer component

* Update legal text descriptions to indicate Markdown support again

* Refactor footer layout

* Add zIndex to footer component

* improve mobile layout

* run formatter

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2025-01-02 17:29:01 +01:00
Aaron
53c05518df feat(UI): improve filesize input and use it in settings (#721)
* Improve file size input component layout

* Fix filesize input value not getting set

* Allow arbitrary props on filesize input

* Update config variables to support filesize type and integrate FileSizeInput component

* Update i18n entries

* WARNING GUESSES: Update translation descriptions for max size and chunk size in multiple languages

* Fix config service not being aware of filesize type

* Fix backend config service not being aware of filesize type

* Move FileSizeInput component to core
2024-12-31 15:25:49 +01:00
Aaron
b58dcdba0b feat(MyShares): show information about own share security options (#720)
* Provide security information about owned shares

* Add visitor count display for shares with max views

* Add password protection indicator to shares table

* Remove validation from MyShareSecurityDTO

* center lock icon and add spacing

* refactor: run formatter

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2024-12-31 15:21:00 +01:00
Aaron
4d3aa398a2 chore(translations): add "never" expiration value to i18n (#719) 2024-12-29 18:19:01 +01:00
Mattia Müggler
a120d44185 docs: update S3 bucket name description (#712)
* update s3 docs

* Update s3.md
2024-12-29 18:13:09 +01:00
Elias Schneider
362e7d4f38 release: 1.7.2 2024-12-28 17:40:42 +01:00
Elias Schneider
f36ba8ac0a refactor: run formatter 2024-12-28 17:40:36 +01:00
Elias Schneider
30caeb5b25 chore(translations): update translations via Crowdin (#701)
* New translations en-us.ts (Japanese)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Czech)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* 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 (Korean)

* New translations en-us.ts (Polish)

* 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 (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 (French)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Ukrainian)

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

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Japanese)
2024-12-28 17:38:10 +01:00
Pak Lam (Billy) Lee
bfd4049c15 fix: crash on zip download if zip is larger than 4GB (#709) 2024-12-28 17:37:58 +01:00
Elias Schneider
856c54d5d6 release: 1.7.1 2024-12-24 17:18:38 +01:00
Elias Schneider
6a97cc279c fix: incorrect ownership of the public folder 2024-12-24 16:07:35 +01:00
Elias Schneider
7e09ae1f98 chore: change location of Caddyfiles 2024-12-24 16:06:59 +01:00
Elias Schneider
3946f6f237 release: 1.7.0 2024-12-19 18:17:51 +01:00
Elias Schneider
5069abe4b9 chore: add missing adapter flag to caddy command 2024-12-19 15:53:27 +01:00
Mattia Müggler
5a54fe4cb7 feat: add support for S3 as a storage provider (#659)
* add s3

* instance the s3 client dynamically

* refactor code

* fix format

* add docs

* add docs

* fix issue with s3 upload if you use the base path,
fix issue with archiving -> disable archiving for s3

* split file service in local and s3 file service and fix s3 upload chunking

* add working download/view

* add new features to local service (from main branch)

* revert s3 service and add working delete/remove functionality

* refactor s3 service

* Update backend/src/file/s3.service.ts

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

* Update frontend/src/components/admin/configuration/ConfigurationNavBar.tsx

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

* Update docs/docs/setup/s3.md

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

* Update backend/prisma/seed/config.seed.ts

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

* add note for ZIP archive in docs

* create logger instance

* make s3 instance dynamic

* add icon import

* remove console.logs

* add correct pdf viewing format

* add storage provider to share

* refactor: run formatter

* chore: add prisma migration

* fix: don't expose `storageProvider`

* chore: improve config variables description

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2024-12-19 12:06:49 +01:00
Elias Schneider
0b406f0464 chore: dump vulnerable package versions 2024-12-18 18:13:44 +01:00
Elias Schneider
cbc7fd83a7 chore(translations): update translations via Crowdin (#686)
* New translations en-us.ts (Italian)

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

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

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

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Hungarian)

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

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

* New translations en-us.ts (Thai)

* New translations en-us.ts (French)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Bulgarian)

* 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 (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Slovenian)

* 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 (Serbian (Latin))

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

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

* New translations en-us.ts (Croatian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (French)

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

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

* New translations en-us.ts (Croatian)

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

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Czech)

* chore(translations): remove Bulgarian

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Czech)

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* 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 (Korean)

* New translations en-us.ts (Polish)

* 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 (Thai)

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

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

* New translations en-us.ts (Arabic, Egypt)
2024-12-18 18:09:37 +01:00
Elias Schneider
c178a83fa5 Merge remote-tracking branch 'origin/main' 2024-12-18 16:24:01 +01:00
Elias Schneider
185f1b2ab7 chore: add OpenSSL to Dockerfile for Prisma 2024-12-18 16:22:03 +01:00
Elias Schneider
6771bfdf50 chore: make Docker image rootless (#683)
* add first version of rootless docker image

* skip user creation if user is already a non root user
2024-12-18 16:08:45 +01:00
Elias Schneider
2db1f6a112 refactor: run formatter 2024-12-17 22:29:24 +01:00
weriomat
168038eae7 docs: fix links in oauth setup (#694)
docs: fix links in oauth setup
2024-12-03 11:40:48 +01:00
Elias Schneider
3df80acff9 refactor: run formatter 2024-11-26 20:58:32 +01:00
Elias Schneider
e86f93830b chore(translations): add missing translation keys 2024-11-26 20:58:25 +01:00
Elias Schneider
38f1626b11 chore(translations): add Croatian 2024-11-26 15:55:16 +01:00
Elias Schneider
ac9b0a1d53 release: 1.6.1 2024-11-26 15:53:33 +01:00
Elias Schneider
ba2e7e122c fix: error for non oidc oauth clients 2024-11-26 15:53:01 +01:00
Elias Schneider
3527dd1dd9 release: 1.6.0 2024-11-25 12:44:42 +01:00
Elias Schneider
54af6c2055 chore(translations): update translations via Crowdin (#684)
* New translations en-us.ts (Spanish)

* New translations en-us.ts (Hungarian)

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

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

* New translations en-us.ts (Thai)

* New translations en-us.ts (French)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Bulgarian)

* 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 (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Slovenian)

* 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 (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 (Portuguese, Brazilian)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Ukrainian)

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

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

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Hungarian)

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

* New translations en-us.ts (French)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Bulgarian)

* 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 (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Turkish)

* New translations en-us.ts (Ukrainian)

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

* New translations en-us.ts (Thai)

* 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 (Serbian (Latin))

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

* New translations en-us.ts (Arabic, Egypt)
2024-11-25 12:44:33 +01:00
Elias Schneider
3160f90e1d fix: add validation for share id and zip compression config variables 2024-11-25 12:41:03 +01:00
Elias Schneider
da54ce6ee0 feat: add config variable to specify the requested OIDC sopes 2024-11-25 12:21:17 +01:00
Elias Schneider
468b25828b release: 1.5.0 2024-11-24 17:26:14 +01:00
Romain Ricard
9d4bb55a09 feat(share): add share ID length setting (#677)
- Add share ID length to share > settings
- Use cryptographically secure RNG for IDs
- Use secure default value for IDs length
- Add FR and EN translation

Co-authored-by: Romain Ricard <romain.ricard@mines-ales.org>
2024-11-24 17:25:50 +01:00
Elias Schneider
f78ffd69e7 chore(translations): update translations via Crowdin (#681)
* New translations en-us.ts (German)

* New translations en-us.ts (German)

* New translations en-us.ts (Ukrainian)

* New translations en-us.ts (Ukrainian)

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

* New translations en-us.ts (Serbian (Latin))
2024-11-24 17:24:10 +01:00
Elias Schneider
17528f999a Merge branch 'main' of https://github.com/stonith404/pingvin-share 2024-11-23 18:55:53 +01:00
Elias Schneider
c8f05f2475 fix: totp can't be enabled if user is a ldap user 2024-11-23 18:55:47 +01:00
Elias Schneider
424e2564d5 chore(translations): update translations via Crowdin (#672)
* New translations en-us.ts (Italian)

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

* New translations en-us.ts (Japanese)

* New translations en-us.ts (French)

* New translations en-us.ts (French)

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

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

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Hungarian)

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

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

* New translations en-us.ts (Thai)

* New translations en-us.ts (French)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Bulgarian)

* 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 (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Slovenian)

* 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 (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 (Portuguese, Brazilian)

* New translations en-us.ts (French)

* New translations en-us.ts (German)

* New translations en-us.ts (German)

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

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

* New translations en-us.ts (German)

* New translations en-us.ts (German)
2024-11-21 20:51:45 +01:00
Elias Schneider
18d8cbbbab release: 1.4.0 2024-11-17 16:22:29 +01:00
Elias Schneider
c7dacb26e8 feat: add "creatorEmail" config bariable to share recipient email message 2024-11-17 16:11:30 +01:00
Elias Schneider
b6d98c7c42 chore: upgrade vulnerable dependencies 2024-11-17 16:09:40 +01:00
Elias Schneider
c52ec71920 refactor: use fs promises in file service 2024-11-17 16:09:23 +01:00
Elias Schneider
6cf5c66fe2 fix: remote arbitrary file overwrite on file upload endpoint 2024-11-17 16:07:21 +01:00
Elias Schneider
51478b6a9f release: 1.3.0 2024-11-14 19:10:37 +01:00
Elias Schneider
6f45c3b1fb fix: use current window url instead of app url in frontend 2024-11-14 19:10:11 +01:00
Elias Schneider
ff2dd81055 chore(translations): update translations via Crowdin (#665)
* New translations en-us.ts (Spanish)

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

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

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

* New translations en-us.ts (Thai)

* New translations en-us.ts (Thai)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (French)

* New translations en-us.ts (French)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Hungarian)

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

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

* New translations en-us.ts (Thai)

* New translations en-us.ts (French)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Bulgarian)

* 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 (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Slovenian)

* 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 (Serbian (Latin))

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

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

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Hungarian)

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

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

* New translations en-us.ts (Thai)

* New translations en-us.ts (French)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Bulgarian)

* 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 (Italian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Slovenian)

* 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 (Serbian (Latin))

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

* New translations en-us.ts (Arabic, Egypt)
2024-11-14 18:57:20 +01:00
Elias Schneider
c26de4e881 fix: throw error if no disk space is left 2024-11-14 18:44:32 +01:00
Elias Schneider
4ef7ebb062 fix: improve share completed dialog redirection for reverse shares 2024-11-14 18:41:34 +01:00
Elias Schneider
d870b5721a refactor: run formatter 2024-11-14 18:04:18 +01:00
Elias Schneider
d8084e401d feat: add confirm dialog for leaving the page if an upload is in progress 2024-11-14 18:04:11 +01:00
Elias Schneider
e1a5d19544 fix: prevent deletion of last admin account 2024-11-14 17:39:06 +01:00
Elias Schneider
4ce64206be feat: add 'secureCookies' configuration variable to explicitly set the secure flag and prevent confusion 2024-11-14 17:31:17 +01:00
Elias Schneider
77eef187b7 chore(translations): fix wrong label for Serbian latin and cyrillic 2024-10-31 17:01:03 +01:00
Elias Schneider
c7138bcf5d chore(translations): update translations via Crowdin (#657)
* New translations en-us.ts (Serbian (Latin))

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

* New translations en-us.ts (German)

* New translations en-us.ts (French)

* New translations en-us.ts (French)

* New translations en-us.ts (German)

* New translations en-us.ts (German)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (German)

* New translations en-us.ts (Spanish)
2024-10-31 16:57:43 +01:00
132 changed files with 12624 additions and 5792 deletions

View File

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

View File

@@ -6,29 +6,50 @@ on:
jobs:
build:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- name: checkout code
uses: actions/checkout@v3
- name: Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: |
ghcr.io/${{ github.repository }}
${{ github.repository }}
tags: |
type=semver,pattern={{version}},prefix=v
type=semver,pattern={{major}}.{{minor}},prefix=v
type=semver,pattern={{major}},prefix=v
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker registry
uses: docker/login-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: stonith404/pingvin-share:latest,stonith404/pingvin-share:${{ github.ref_name }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

1
.gitignore vendored
View File

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

View File

@@ -1,3 +1,200 @@
## [1.13.0](https://github.com/stonith404/pingvin-share/compare/v1.12.0...v1.13.0) (2025-05-25)
### Features
* allow to use redis cache instead of memory cache ([#832](https://github.com/stonith404/pingvin-share/issues/832)) ([85f5143](https://github.com/stonith404/pingvin-share/commit/85f514316b0b808b8c063bf571df6b528a1b3de4))
* **backend:** allow to define path to the config file ([#838](https://github.com/stonith404/pingvin-share/issues/838)) ([cfdb29e](https://github.com/stonith404/pingvin-share/commit/cfdb29ed4dde875233b4bc3f510ae50976b963b8))
## [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)
### Bug Fixes
* page doesn't reload on user deletion ([a2e0313](https://github.com/stonith404/pingvin-share/commit/a2e031326e51f7663c2d864dd0d08a65f180318e))
* redirection to the OIDC end session endpoint ([ec92e85](https://github.com/stonith404/pingvin-share/commit/ec92e85c8d294b30117ad2599ad03b0bbb04574c))
## [1.9.0](https://github.com/stonith404/pingvin-share/compare/v1.8.2...v1.9.0) (2025-02-12)
### Features
* ability to add email to recipients list by clicking enter ([#760](https://github.com/stonith404/pingvin-share/issues/760)) ([70b577f](https://github.com/stonith404/pingvin-share/commit/70b577f5ac8385cfc6a22ffee4c7e317e3cc6403))
## [1.8.2](https://github.com/stonith404/pingvin-share/compare/v1.8.1...v1.8.2) (2025-01-21)
### Bug Fixes
* normal share gets attached to previously visited reverse share ([3a534c7](https://github.com/stonith404/pingvin-share/commit/3a534c7512ef82f3fa982f80e364f53c957306a0))
* wrong TOTP validation for password ([2b7d3c0](https://github.com/stonith404/pingvin-share/commit/2b7d3c0a8a3e527fc1f7f86795731d5ac77eda49))
## [1.8.1](https://github.com/stonith404/pingvin-share/compare/v1.8.0...v1.8.1) (2025-01-04)
### Bug Fixes
* wrong validation for expiration in reverse share modal ([b3ea96c](https://github.com/stonith404/pingvin-share/commit/b3ea96c1916980863fc6903c64cd2a7b32d66cfb))
## [1.8.0](https://github.com/stonith404/pingvin-share/compare/v1.7.2...v1.8.0) (2025-01-02)
### Features
* add legal page with configuration options ([#724](https://github.com/stonith404/pingvin-share/issues/724)) ([df1ffaa](https://github.com/stonith404/pingvin-share/commit/df1ffaa2bcc047668cdc207cf8f86d821778cf44))
* improve UI for timespan inputs on admin page ([#726](https://github.com/stonith404/pingvin-share/issues/726)) ([36afbf9](https://github.com/stonith404/pingvin-share/commit/36afbf91b7ba13e5ce42f2d91ec9898363a560b1))
* **MyShares:** show information about own share security options ([#720](https://github.com/stonith404/pingvin-share/issues/720)) ([b58dcdb](https://github.com/stonith404/pingvin-share/commit/b58dcdba0b8688b286be4cc71796e2862553972a))
* **UI:** improve filesize input and use it in settings ([#721](https://github.com/stonith404/pingvin-share/issues/721)) ([53c0551](https://github.com/stonith404/pingvin-share/commit/53c05518dfef4f65d76f5a1b301d0c5f8735576a))
## [1.7.2](https://github.com/stonith404/pingvin-share/compare/v1.7.1...v1.7.2) (2024-12-28)
### Bug Fixes
* crash on zip download if zip is larger than 4GB ([#709](https://github.com/stonith404/pingvin-share/issues/709)) ([bfd4049](https://github.com/stonith404/pingvin-share/commit/bfd4049c154caae037db0458863e5c8c5d398848))
## [1.7.1](https://github.com/stonith404/pingvin-share/compare/v1.7.0...v1.7.1) (2024-12-24)
### Bug Fixes
* incorrect ownership of the public folder ([6a97cc2](https://github.com/stonith404/pingvin-share/commit/6a97cc279c51bf125b9b516d1795f85b208e6ad5))
## [1.7.0](https://github.com/stonith404/pingvin-share/compare/v1.6.1...v1.7.0) (2024-12-19)
### Features
* add support for S3 as a storage provider ([#659](https://github.com/stonith404/pingvin-share/issues/659)) ([5a54fe4](https://github.com/stonith404/pingvin-share/commit/5a54fe4cb7d9c22740edd8619c0a51044ca8c791))
## [1.6.1](https://github.com/stonith404/pingvin-share/compare/v1.6.0...v1.6.1) (2024-11-26)
### Bug Fixes
* error for non oidc oauth clients ([ba2e7e1](https://github.com/stonith404/pingvin-share/commit/ba2e7e122c45bfb2a783b15438112a79fee0c307))
## [1.6.0](https://github.com/stonith404/pingvin-share/compare/v1.5.0...v1.6.0) (2024-11-25)
### Features
* add config variable to specify the requested OIDC sopes ([da54ce6](https://github.com/stonith404/pingvin-share/commit/da54ce6ee020a9718f55ec30c614607d411f55c8))
### Bug Fixes
* add validation for share id and zip compression config variables ([3160f90](https://github.com/stonith404/pingvin-share/commit/3160f90e1d4bb3d6aa4017e98e400929fc4d3b2e))
## [1.5.0](https://github.com/stonith404/pingvin-share/compare/v1.4.0...v1.5.0) (2024-11-24)
### Features
* **share:** add share ID length setting ([#677](https://github.com/stonith404/pingvin-share/issues/677)) ([9d4bb55](https://github.com/stonith404/pingvin-share/commit/9d4bb55a0945450f8a42c212d7f23983db38f37f))
### Bug Fixes
* totp can't be enabled if user is a ldap user ([c8f05f2](https://github.com/stonith404/pingvin-share/commit/c8f05f2475a5a54550cf64ef57c8b612580273be))
## [1.4.0](https://github.com/stonith404/pingvin-share/compare/v1.3.0...v1.4.0) (2024-11-17)
### Features
* add "creatorEmail" config bariable to share recipient email message ([c7dacb2](https://github.com/stonith404/pingvin-share/commit/c7dacb26e87504a1c5e6b0d87cdcd5ed91b9cdf5))
### Bug Fixes
* remote arbitrary file overwrite on file upload endpoint ([6cf5c66](https://github.com/stonith404/pingvin-share/commit/6cf5c66fe2eda1e0a525edf7440d047fe2f0e35b))
## [1.3.0](https://github.com/stonith404/pingvin-share/compare/v1.2.4...v1.3.0) (2024-11-14)
### Features
* add 'secureCookies' configuration variable to explicitly set the secure flag and prevent confusion ([4ce6420](https://github.com/stonith404/pingvin-share/commit/4ce64206be7440a99299e1ed238ced7408c0563d))
* add confirm dialog for leaving the page if an upload is in progress ([d8084e4](https://github.com/stonith404/pingvin-share/commit/d8084e401d7572b2d6e38ffa20cb678a0fb0e615))
### Bug Fixes
* improve share completed dialog redirection for reverse shares ([4ef7ebb](https://github.com/stonith404/pingvin-share/commit/4ef7ebb0622f16d2d2c4d114b5fc15298e2ba24f))
* prevent deletion of last admin account ([e1a5d19](https://github.com/stonith404/pingvin-share/commit/e1a5d195448e3d741b77fb982ce515489a360562))
* throw error if no disk space is left ([c26de4e](https://github.com/stonith404/pingvin-share/commit/c26de4e881edfe6c7db617c0aeba89871397ebe2))
* use current window url instead of app url in frontend ([6f45c3b](https://github.com/stonith404/pingvin-share/commit/6f45c3b1fbf4a95b29e5742878b55a1afa0b8886))
## [1.2.4](https://github.com/stonith404/pingvin-share/compare/v1.2.3...v1.2.4) (2024-10-24)

View File

@@ -1,25 +1,27 @@
# Stage 1: Frontend dependencies
FROM node:20-alpine AS frontend-dependencies
FROM node:22-alpine AS frontend-dependencies
WORKDIR /opt/app
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci
# Stage 2: Build frontend
FROM node:20-alpine AS frontend-builder
FROM node:22-alpine AS frontend-builder
WORKDIR /opt/app
COPY ./frontend .
COPY --from=frontend-dependencies /opt/app/node_modules ./node_modules
RUN npm run build
# Stage 3: Backend dependencies
FROM node:20-alpine AS backend-dependencies
FROM node:22-alpine AS backend-dependencies
RUN apk add --no-cache python3
WORKDIR /opt/app
COPY backend/package.json backend/package-lock.json ./
RUN npm ci
# Stage 4: Build backend
FROM node:20-alpine AS backend-builder
FROM node:22-alpine AS backend-builder
RUN apk add openssl
WORKDIR /opt/app
COPY ./backend .
COPY --from=backend-dependencies /opt/app/node_modules ./node_modules
@@ -27,12 +29,15 @@ RUN npx prisma generate
RUN npm run build && npm prune --production
# Stage 5: Final image
FROM node:20-alpine AS runner
FROM node:22-alpine AS runner
ENV NODE_ENV=docker
# Delete default node user
RUN deluser --remove-home node
RUN apk update --no-cache \
&& apk upgrade --no-cache \
&& apk add --no-cache curl caddy
&& apk add --no-cache curl caddy su-exec openssl
WORKDIR /opt/app/frontend
COPY --from=frontend-builder /opt/app/public ./public
@@ -45,14 +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/prisma ./prisma
COPY --from=backend-builder /opt/app/package.json ./
COPY ./reverse-proxy /etc/caddy
COPY ./scripts/docker-entrypoint.sh /opt/app/docker-entrypoint.sh
COPY --from=backend-builder /opt/app/tsconfig.json ./
WORKDIR /opt/app
COPY ./reverse-proxy /opt/app/reverse-proxy
COPY ./scripts/docker ./scripts/docker
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'
CMD ["sh", "/opt/app/docker-entrypoint.sh"]
ENTRYPOINT ["sh", "./scripts/docker/create-user.sh"]
CMD ["sh", "./scripts/docker/entrypoint.sh"]

View File

@@ -1,3 +1,11 @@
> ## ⚠️ Project Archived
>
> After much consideration, I've chosen to focus my limited time and energy on my other project, [Pocket ID](https://github.com/pocket-id/pocket-id). As a solo developer, I've found it difficult to actively maintain multiple open source projects with the care and attention they deserve.
>
> If you're interested in continuing this work through a fork, I'd be happy to link to it here in the README.
>
> Thanks to all the contributors and users who have supported Pingvin Share over the years :)
# <div align="center"><img src="https://user-images.githubusercontent.com/58886915/166198400-c2134044-1198-4647-a8b6-da9c4a204c68.svg" width="40"/> </br>Pingvin Share</div>
[![](https://dcbadge.limes.pink/api/server/wHRQ9nFRcK)](https://discord.gg/wHRQ9nFRcK) [![](https://img.shields.io/badge/Crowdin-2E3340.svg?style=for-the-badge&logo=Crowdin&logoColor=white)](https://crowdin.com/project/pingvin-share) [![](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#white)](https://github.com/sponsors/stonith404)
@@ -16,6 +24,7 @@ Pingvin Share is a self-hosted file sharing platform and an alternative for WeTr
- Reverse shares
- OIDC and LDAP authentication
- Integration with ClamAV for security scans
- Different file providers: local storage and S3
## 🐧 Get to know Pingvin Share
@@ -43,9 +52,3 @@ For more installation options and advanced configurations, please refer to the [
## 🖤 Contribute
We would love it if you want to help make Pingvin Share better! You can either [help to translate](https://stonith404.github.io/pingvin-share/help-out/translate) Pingvin Share or [contribute to the codebase](https://stonith404.github.io/pingvin-share/help-out/contribute).
## ❤️ Sponsors
Thank you for supporting Pingvin Share 🙏
- [@COMPLEXWASTAKEN](https://github.com/COMPLEXWASTAKEN)

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

View File

@@ -0,0 +1,24 @@
-- RedefineTables
PRAGMA defer_foreign_keys=ON;
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_Share" (
"id" TEXT NOT NULL PRIMARY KEY,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"name" TEXT,
"uploadLocked" BOOLEAN NOT NULL DEFAULT false,
"isZipReady" BOOLEAN NOT NULL DEFAULT false,
"views" INTEGER NOT NULL DEFAULT 0,
"expiration" DATETIME NOT NULL,
"description" TEXT,
"removedReason" TEXT,
"creatorId" TEXT,
"reverseShareId" TEXT,
"storageProvider" TEXT NOT NULL DEFAULT 'LOCAL',
CONSTRAINT "Share_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT "Share_reverseShareId_fkey" FOREIGN KEY ("reverseShareId") REFERENCES "ReverseShare" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO "new_Share" ("createdAt", "creatorId", "description", "expiration", "id", "isZipReady", "name", "removedReason", "reverseShareId", "uploadLocked", "views") SELECT "createdAt", "creatorId", "description", "expiration", "id", "isZipReady", "name", "removedReason", "reverseShareId", "uploadLocked", "views" FROM "Share";
DROP TABLE "Share";
ALTER TABLE "new_Share" RENAME TO "Share";
PRAGMA foreign_keys=ON;
PRAGMA defer_foreign_keys=OFF;

View File

@@ -0,0 +1 @@
UPDATE Config SET `value` = `value` || ' hours' WHERE name = "maxExpiration" OR name = "sessionDuration";

View File

@@ -95,6 +95,7 @@ model Share {
security ShareSecurity?
recipients ShareRecipient[]
files File[]
storageProvider String @default("LOCAL")
}
model ReverseShare {

View File

@@ -1,7 +1,7 @@
import { Prisma, PrismaClient } from "@prisma/client";
import * as crypto from "crypto";
const configVariables: ConfigVariables = {
export const configVariables = {
internal: {
jwtSecret: {
type: "string",
@@ -20,14 +20,18 @@ const configVariables: ConfigVariables = {
defaultValue: "http://localhost:3000",
secret: false,
},
secureCookies: {
type: "boolean",
defaultValue: "false",
},
showHomePage: {
type: "boolean",
defaultValue: "true",
secret: false,
},
sessionDuration: {
type: "number",
defaultValue: "2160",
type: "timespan",
defaultValue: "3 months",
secret: false,
},
},
@@ -43,12 +47,17 @@ const configVariables: ConfigVariables = {
secret: false,
},
maxExpiration: {
type: "timespan",
defaultValue: "0 days",
secret: false,
},
shareIdLength: {
type: "number",
defaultValue: "0",
defaultValue: "8",
secret: false,
},
maxSize: {
type: "number",
type: "filesize",
defaultValue: "1000000000",
secret: false,
},
@@ -57,7 +66,7 @@ const configVariables: ConfigVariables = {
defaultValue: "9",
},
chunkSize: {
type: "number",
type: "filesize",
defaultValue: "10000000",
secret: false,
},
@@ -67,6 +76,25 @@ const configVariables: ConfigVariables = {
secret: false,
},
},
cache: {
"redis-enabled": {
type: "boolean",
defaultValue: "false",
},
"redis-url": {
type: "string",
defaultValue: "redis://pingvin-redis:6379",
secret: true,
},
ttl: {
type: "number",
defaultValue: "60",
},
maxItems: {
type: "number",
defaultValue: "1000",
},
},
email: {
enableShareEmailRecipients: {
type: "boolean",
@@ -80,7 +108,7 @@ const configVariables: ConfigVariables = {
shareRecipientsMessage: {
type: "text",
defaultValue:
"Hey!\n\n{creator} 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: {
type: "string",
@@ -98,7 +126,7 @@ const configVariables: ConfigVariables = {
resetPasswordMessage: {
type: "text",
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: {
type: "string",
@@ -172,12 +200,12 @@ const configVariables: ConfigVariables = {
},
searchQuery: {
type: "string",
defaultValue: ""
defaultValue: "",
},
adminGroups: {
type: "string",
defaultValue: ""
defaultValue: "",
},
fieldNameMemberOf: {
@@ -187,18 +215,18 @@ const configVariables: ConfigVariables = {
fieldNameEmail: {
type: "string",
defaultValue: "userPrincipalName",
}
},
},
oauth: {
"allowRegistration": {
allowRegistration: {
type: "boolean",
defaultValue: "true",
},
"ignoreTotp": {
ignoreTotp: {
type: "boolean",
defaultValue: "true",
},
"disablePassword": {
disablePassword: {
type: "boolean",
defaultValue: "false",
secret: false,
@@ -279,6 +307,10 @@ const configVariables: ConfigVariables = {
type: "boolean",
defaultValue: "false",
},
"oidc-scope": {
type: "string",
defaultValue: "openid email profile",
},
"oidc-usernameClaim": {
type: "string",
defaultValue: "",
@@ -305,6 +337,84 @@ const configVariables: ConfigVariables = {
obscured: true,
},
},
s3: {
enabled: {
type: "boolean",
defaultValue: "false",
},
endpoint: {
type: "string",
defaultValue: "",
},
region: {
type: "string",
defaultValue: "",
},
bucketName: {
type: "string",
defaultValue: "",
},
bucketPath: {
type: "string",
defaultValue: "",
},
key: {
type: "string",
defaultValue: "",
secret: true,
},
secret: {
type: "string",
defaultValue: "",
obscured: true,
},
useChecksum: {
type: "boolean",
defaultValue: "true",
},
},
legal: {
enabled: {
type: "boolean",
defaultValue: "false",
secret: false,
},
imprintText: {
type: "text",
defaultValue: "",
secret: false,
},
imprintUrl: {
type: "string",
defaultValue: "",
secret: false,
},
privacyPolicyText: {
type: "text",
defaultValue: "",
secret: false,
},
privacyPolicyUrl: {
type: "string",
defaultValue: "",
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 = {
@@ -328,11 +438,11 @@ const prisma = new PrismaClient({
async function seedConfigVariables() {
for (const [category, configVariablesOfCategory] of Object.entries(
configVariables
configVariables,
)) {
let order = 0;
for (const [name, properties] of Object.entries(
configVariablesOfCategory
configVariablesOfCategory,
)) {
const existingConfigVariable = await prisma.config.findUnique({
where: { name_category: { name, category } },
@@ -361,7 +471,7 @@ async function migrateConfigVariables() {
for (const existingConfigVariable of existingConfigVariables) {
const configVariable =
configVariables[existingConfigVariable.category]?.[
existingConfigVariable.name
existingConfigVariable.name
];
// Delete the config variable if it doesn't exist in the seed
@@ -378,7 +488,7 @@ async function migrateConfigVariables() {
// Update the config variable if it exists in the seed
} else {
const variableOrder = Object.keys(
configVariables[existingConfigVariable.category]
configVariables[existingConfigVariable.category],
).indexOf(existingConfigVariable.name);
await prisma.config.update({
where: {

View File

@@ -3,9 +3,9 @@ import { Module } from "@nestjs/common";
import { ScheduleModule } from "@nestjs/schedule";
import { AuthModule } from "./auth/auth.module";
import { CacheModule } from "@nestjs/cache-manager";
import { APP_GUARD } from "@nestjs/core";
import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler";
import { AppCacheModule } from "./cache/cache.module";
import { AppController } from "./app.controller";
import { ClamScanModule } from "./clamscan/clamscan.module";
import { ConfigModule } from "./config/config.module";
@@ -20,12 +20,12 @@ import { UserModule } from "./user/user.module";
@Module({
imports: [
ConfigModule,
AuthModule,
ShareModule,
FileModule,
EmailModule,
PrismaModule,
ConfigModule,
JobsModule,
UserModule,
ThrottlerModule.forRoot([
@@ -38,9 +38,7 @@ import { UserModule } from "./user/user.module";
ClamScanModule,
ReverseShareModule,
OAuthModule,
CacheModule.register({
isGlobal: true,
}),
AppCacheModule,
],
controllers: [AppController],
providers: [

View File

@@ -176,7 +176,7 @@ export class AuthController {
request.cookies.access_token,
);
const isSecure = this.config.get("general.appUrl").startsWith("https");
const isSecure = this.config.get("general.secureCookies");
response.cookie("access_token", "", {
maxAge: -1,
secure: isSecure,

View File

@@ -269,10 +269,7 @@ export class AuthService {
signOutFromProviderSupportedAndActivated
) {
const configuration = await provider.getConfiguration();
if (
configuration.frontchannel_logout_supported &&
URL.canParse(configuration.end_session_endpoint)
) {
if (URL.canParse(configuration.end_session_endpoint)) {
const redirectURI = new URL(configuration.end_session_endpoint);
redirectURI.searchParams.append(
"post_logout_redirect_uri",
@@ -306,11 +303,12 @@ export class AuthService {
}
async createRefreshToken(userId: string, idToken?: string) {
const sessionDuration = this.config.get("general.sessionDuration");
const { id, token } = await this.prisma.refreshToken.create({
data: {
userId,
expiresAt: moment()
.add(this.config.get("general.sessionDuration"), "hours")
.add(sessionDuration.value, sessionDuration.unit)
.toDate(),
oauthIDToken: idToken,
},
@@ -334,21 +332,27 @@ export class AuthService {
refreshToken?: string,
accessToken?: string,
) {
const isSecure = this.config.get("general.appUrl").startsWith("https");
const isSecure = this.config.get("general.secureCookies");
if (accessToken)
response.cookie("access_token", accessToken, {
sameSite: "lax",
secure: isSecure,
maxAge: 1000 * 60 * 60 * 24 * 30 * 3, // 3 months
});
if (refreshToken)
if (refreshToken) {
const now = moment();
const sessionDuration = this.config.get("general.sessionDuration");
const maxAge = moment(now)
.add(sessionDuration.value, sessionDuration.unit)
.diff(now);
response.cookie("refresh_token", refreshToken, {
path: "/api/auth/token",
httpOnly: true,
sameSite: "strict",
secure: isSecure,
maxAge: 1000 * 60 * 60 * this.config.get("general.sessionDuration"),
maxAge,
});
}
}
/**
@@ -368,4 +372,12 @@ export class AuthService {
return null;
}
}
async verifyPassword(user: User, password: string) {
if (!user.password && this.config.get("ldap.enabled")) {
return !!this.ldapService.authenticateUser(user.username, password);
}
return argon.verify(user.password, password);
}
}

View File

@@ -5,7 +5,6 @@ import {
UnauthorizedException,
} from "@nestjs/common";
import { User } from "@prisma/client";
import * as argon from "argon2";
import { authenticator, totp } from "otplib";
import * as qrcode from "qrcode-svg";
import { ConfigService } from "src/config/config.service";
@@ -65,7 +64,7 @@ export class AuthTotpService {
}
async enableTotp(user: User, password: string) {
if (!(await argon.verify(user.password, password)))
if (!this.authService.verifyPassword(user, password))
throw new ForbiddenException("Invalid password");
// Check if we have a secret already
@@ -106,9 +105,8 @@ export class AuthTotpService {
};
}
// TODO: Maybe require a token to verify that the user who started enabling totp is the one who is verifying it?
async verifyTotp(user: User, password: string, code: string) {
if (!(await argon.verify(user.password, password)))
if (!this.authService.verifyPassword(user, password))
throw new ForbiddenException("Invalid password");
const { totpSecret } = await this.prisma.user.findUnique({
@@ -137,7 +135,7 @@ export class AuthTotpService {
}
async disableTotp(user: User, password: string, code: string) {
if (!(await argon.verify(user.password, password)))
if (!this.authService.verifyPassword(user, password))
throw new ForbiddenException("Invalid password");
const { totpSecret } = await this.prisma.user.findUnique({

View File

@@ -1,4 +1,6 @@
import { PickType } from "@nestjs/swagger";
import { UserDTO } from "src/user/dto/user.dto";
import { IsString } from "class-validator";
export class EnableTotpDTO extends PickType(UserDTO, ["password"] as const) {}
export class EnableTotpDTO {
@IsString()
password: string;
}

41
backend/src/cache/cache.module.ts vendored Normal file
View File

@@ -0,0 +1,41 @@
import { Module } from "@nestjs/common";
import { CacheModule } from "@nestjs/cache-manager";
import { CacheableMemory } from "cacheable";
import { createKeyv } from "@keyv/redis";
import { Keyv } from "keyv";
import { ConfigModule } from "src/config/config.module";
import { ConfigService } from "src/config/config.service";
@Module({
imports: [
ConfigModule,
CacheModule.registerAsync({
isGlobal: true,
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => {
const useRedis = configService.get("cache.redis-enabled");
const ttl = configService.get("cache.ttl");
const max = configService.get("cache.maxItems");
let config = {
ttl,
max,
stores: [],
};
if (useRedis) {
const redisUrl = configService.get("cache.redis-url");
config.stores = [
new Keyv({ store: new CacheableMemory({ ttl, lruSize: 5000 }) }),
createKeyv(redisUrl),
];
}
return config;
},
}),
],
exports: [CacheModule],
})
export class AppCacheModule {}

View File

@@ -1,4 +1,5 @@
import { Global, Module } from "@nestjs/common";
import { Config } from "@prisma/client";
import { EmailModule } from "src/email/email.module";
import { PrismaService } from "src/prisma/prisma.service";
import { ConfigController } from "./config.controller";
@@ -16,7 +17,15 @@ import { LogoService } from "./logo.service";
},
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,
],
controllers: [ConfigController],

View File

@@ -2,11 +2,18 @@ import {
BadRequestException,
Inject,
Injectable,
Logger,
NotFoundException,
} from "@nestjs/common";
import { Config } from "@prisma/client";
import { PrismaService } from "src/prisma/prisma.service";
import * as argon from "argon2";
import { EventEmitter } from "events";
import * as fs from "fs";
import { PrismaService } from "src/prisma/prisma.service";
import { stringToTimespan } from "src/utils/date.util";
import { parse as yamlParse } from "yaml";
import { YamlConfig } from "../../prisma/seed/config.seed";
import { CONFIG_FILE } from "src/constants";
/**
* ConfigService extends EventEmitter to allow listening for config updates,
@@ -14,6 +21,9 @@ import { EventEmitter } from "events";
*/
@Injectable()
export class ConfigService extends EventEmitter {
yamlConfig?: YamlConfig;
logger = new Logger(ConfigService.name);
constructor(
@Inject("CONFIG_VARIABLES") private configVariables: Config[],
private prisma: PrismaService,
@@ -21,6 +31,67 @@ export class ConfigService extends EventEmitter {
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_FILE, "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 {
const configVariable = this.configVariables.filter(
(variable) => `${variable.category}.${variable.name}` == key,
@@ -30,31 +101,31 @@ export class ConfigService extends EventEmitter {
const value = configVariable.value ?? configVariable.defaultValue;
if (configVariable.type == "number") return parseInt(value);
if (configVariable.type == "number" || configVariable.type == "filesize")
return parseInt(value);
if (configVariable.type == "boolean") return value == "true";
if (configVariable.type == "string" || configVariable.type == "text")
return value;
if (configVariable.type == "timespan") return stringToTimespan(value);
}
async getByCategory(category: string) {
const configVariables = await this.prisma.config.findMany({
orderBy: { order: "asc" },
where: { category, locked: { equals: false } },
});
const configVariables = this.configVariables
.filter((c) => !c.locked && category == c.category)
.sort((c) => c.order);
return configVariables.map((variable) => {
return {
...variable,
key: `${variable.category}.${variable.name}`,
value: variable.value ?? variable.defaultValue,
allowEdit: this.isEditAllowed(),
};
});
}
async list() {
const configVariables = await this.prisma.config.findMany({
where: { secret: { equals: false } },
});
const configVariables = this.configVariables.filter((c) => !c.secret);
return configVariables.map((variable) => {
return {
@@ -66,6 +137,11 @@ export class ConfigService extends EventEmitter {
}
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[] = [];
for (const variable of data) {
@@ -76,6 +152,11 @@ export class ConfigService extends EventEmitter {
}
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({
where: {
name_category: {
@@ -93,13 +174,16 @@ export class ConfigService extends EventEmitter {
} else if (
typeof value != configVariable.type &&
typeof value == "string" &&
configVariable.type != "text"
configVariable.type != "text" &&
configVariable.type != "timespan"
) {
throw new BadRequestException(
`Config variable must be of type ${configVariable.type}`,
);
}
this.validateConfigVariable(key, value);
const updatedVariable = await this.prisma.config.update({
where: {
name_category: {
@@ -116,4 +200,29 @@ export class ConfigService extends EventEmitter {
return updatedVariable;
}
validateConfigVariable(key: string, value: string | number | boolean) {
const validations = [
{
key: "share.shareIdLength",
condition: (value: number) => value >= 2 && value <= 50,
message: "Share ID length must be between 2 and 50",
},
{
key: "share.zipCompressionLevel",
condition: (value: number) => value >= 0 && value <= 9,
message: "Zip compression level must be between 0 and 9",
},
// TODO add validation for timespan type
];
const validation = validations.find((validation) => validation.key == key);
if (validation && !validation.condition(value as any)) {
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()
obscured: boolean;
@Expose()
allowEdit: boolean;
from(partial: Partial<AdminConfigDTO>) {
return plainToClass(AdminConfigDTO, partial, {
excludeExtraneousValues: true,

View File

@@ -1,5 +1,7 @@
import { LogLevel } from "@nestjs/common";
export const CONFIG_FILE = process.env.CONFIG_FILE || "../config.yaml";
export const DATA_DIRECTORY = process.env.DATA_DIRECTORY || "./data";
export const SHARE_DIRECTORY = `${DATA_DIRECTORY}/uploads/shares`;
export const DATABASE_URL =

View File

@@ -69,6 +69,7 @@ export class EmailService {
.get("email.shareRecipientsMessage")
.replaceAll("\\n", "\n")
.replaceAll("{creator}", creator?.username ?? "Someone")
.replaceAll("{creatorEmail}", creator?.email ?? "")
.replaceAll("{shareUrl}", shareUrl)
.replaceAll("{desc}", description ?? "No description")
.replaceAll(

View File

@@ -17,6 +17,7 @@ import { CreateShareGuard } from "src/share/guard/createShare.guard";
import { ShareOwnerGuard } from "src/share/guard/shareOwner.guard";
import { FileService } from "./file.service";
import { FileSecurityGuard } from "./guard/fileSecurity.guard";
import * as mime from "mime-types";
@Controller("shares/:shareId/files")
export class FileController {
@@ -53,13 +54,14 @@ export class FileController {
@Res({ passthrough: true }) res: Response,
@Param("shareId") shareId: string,
) {
const zip = this.fileService.getZip(shareId);
const zipStream = await this.fileService.getZip(shareId);
res.set({
"Content-Type": "application/zip",
"Content-Disposition": contentDisposition(`${shareId}.zip`),
});
return new StreamableFile(zip);
return new StreamableFile(zipStream);
}
@Get(":fileId")
@@ -73,13 +75,18 @@ export class FileController {
const file = await this.fileService.get(shareId, fileId);
const headers = {
"Content-Type": file.metaData.mimeType,
"Content-Type":
mime?.lookup?.(file.metaData.name) || "application/octet-stream",
"Content-Length": file.metaData.size,
"Content-Security-Policy": "script-src 'none'",
"Content-Security-Policy": "sandbox",
};
if (download === "true") {
headers["Content-Disposition"] = contentDisposition(file.metaData.name);
} else {
headers["Content-Disposition"] = contentDisposition(file.metaData.name, {
type: "inline",
});
}
res.set(headers);

View File

@@ -4,11 +4,13 @@ import { ReverseShareModule } from "src/reverseShare/reverseShare.module";
import { ShareModule } from "src/share/share.module";
import { FileController } from "./file.controller";
import { FileService } from "./file.service";
import { LocalFileService } from "./local.service";
import { S3FileService } from "./s3.service";
@Module({
imports: [JwtModule.register({}), ReverseShareModule, ShareModule],
controllers: [FileController],
providers: [FileService],
providers: [FileService, LocalFileService, S3FileService],
exports: [FileService],
})
export class FileModule {}

View File

@@ -1,149 +1,88 @@
import {
BadRequestException,
HttpException,
HttpStatus,
Injectable,
NotFoundException,
} from "@nestjs/common";
import { JwtService } from "@nestjs/jwt";
import * as crypto from "crypto";
import * as fs from "fs";
import * as mime from "mime-types";
import { Injectable } from "@nestjs/common";
import { LocalFileService } from "./local.service";
import { S3FileService } from "./s3.service";
import { ConfigService } from "src/config/config.service";
import { PrismaService } from "src/prisma/prisma.service";
import { SHARE_DIRECTORY } from "../constants";
import { Readable } from "stream";
import { PrismaService } from "../prisma/prisma.service";
@Injectable()
export class FileService {
constructor(
private prisma: PrismaService,
private jwtService: JwtService,
private config: ConfigService,
private localFileService: LocalFileService,
private s3FileService: S3FileService,
private configService: ConfigService,
) {}
// Determine which service to use based on the current config value
// shareId is optional -> can be used to overwrite a storage provider
private getStorageService(
storageProvider?: string,
): S3FileService | LocalFileService {
if (storageProvider != undefined)
return storageProvider == "S3"
? this.s3FileService
: this.localFileService;
return this.configService.get("s3.enabled")
? this.s3FileService
: this.localFileService;
}
async create(
data: string,
chunk: { index: number; total: number },
file: { id?: string; name: string },
file: {
id?: string;
name: string;
},
shareId: string,
) {
if (!file.id) file.id = crypto.randomUUID();
const share = await this.prisma.share.findUnique({
where: { id: shareId },
include: { files: true, reverseShare: true },
});
if (share.uploadLocked)
throw new BadRequestException("Share is already completed");
let diskFileSize: number;
try {
diskFileSize = fs.statSync(
`${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk`,
).size;
} catch {
diskFileSize = 0;
}
// If the sent chunk index and the expected chunk index doesn't match throw an error
const chunkSize = this.config.get("share.chunkSize");
const expectedChunkIndex = Math.ceil(diskFileSize / chunkSize);
if (expectedChunkIndex != chunk.index)
throw new BadRequestException({
message: "Unexpected chunk received",
error: "unexpected_chunk_index",
expectedChunkIndex,
});
const buffer = Buffer.from(data, "base64");
// Check if share size limit is exceeded
const fileSizeSum = share.files.reduce(
(n, { size }) => n + parseInt(size),
0,
);
const shareSizeSum = fileSizeSum + diskFileSize + buffer.byteLength;
if (
shareSizeSum > this.config.get("share.maxSize") ||
(share.reverseShare?.maxShareSize &&
shareSizeSum > parseInt(share.reverseShare.maxShareSize))
) {
throw new HttpException(
"Max share size exceeded",
HttpStatus.PAYLOAD_TOO_LARGE,
);
}
fs.appendFileSync(
`${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk`,
buffer,
);
const isLastChunk = chunk.index == chunk.total - 1;
if (isLastChunk) {
fs.renameSync(
`${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk`,
`${SHARE_DIRECTORY}/${shareId}/${file.id}`,
);
const fileSize = fs.statSync(
`${SHARE_DIRECTORY}/${shareId}/${file.id}`,
).size;
await this.prisma.file.create({
data: {
id: file.id,
name: file.name,
size: fileSize.toString(),
share: { connect: { id: shareId } },
},
});
}
return file;
const storageService = this.getStorageService();
return storageService.create(data, chunk, file, shareId);
}
async get(shareId: string, fileId: string) {
const fileMetaData = await this.prisma.file.findUnique({
where: { id: fileId },
async get(shareId: string, fileId: string): Promise<File> {
const share = await this.prisma.share.findFirst({
where: { id: shareId },
});
if (!fileMetaData) throw new NotFoundException("File not found");
const file = fs.createReadStream(`${SHARE_DIRECTORY}/${shareId}/${fileId}`);
return {
metaData: {
mimeType: mime.contentType(fileMetaData.name.split(".").pop()),
...fileMetaData,
size: fileMetaData.size,
},
file,
};
const storageService = this.getStorageService(share.storageProvider);
return storageService.get(shareId, fileId);
}
async remove(shareId: string, fileId: string) {
const fileMetaData = await this.prisma.file.findUnique({
where: { id: fileId },
});
if (!fileMetaData) throw new NotFoundException("File not found");
fs.unlinkSync(`${SHARE_DIRECTORY}/${shareId}/${fileId}`);
await this.prisma.file.delete({ where: { id: fileId } });
const storageService = this.getStorageService();
return storageService.remove(shareId, fileId);
}
async deleteAllFiles(shareId: string) {
await fs.promises.rm(`${SHARE_DIRECTORY}/${shareId}`, {
recursive: true,
force: true,
});
const storageService = this.getStorageService();
return storageService.deleteAllFiles(shareId);
}
getZip(shareId: string) {
return fs.createReadStream(`${SHARE_DIRECTORY}/${shareId}/archive.zip`);
async getZip(shareId: string): Promise<Readable> {
const storageService = this.getStorageService();
return await storageService.getZip(shareId);
}
private async streamToUint8Array(stream: Readable): Promise<Uint8Array> {
const chunks: Buffer[] = [];
return new Promise((resolve, reject) => {
stream.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
stream.on("end", () => resolve(new Uint8Array(Buffer.concat(chunks))));
stream.on("error", reject);
});
}
}
export interface File {
metaData: {
id: string;
size: string;
createdAt: Date;
mimeType: string | false;
name: string;
shareId: string;
};
file: Readable;
}

View File

@@ -0,0 +1,174 @@
import {
BadRequestException,
HttpException,
HttpStatus,
Injectable,
InternalServerErrorException,
NotFoundException,
} from "@nestjs/common";
import * as crypto from "crypto";
import { createReadStream } from "fs";
import * as fs from "fs/promises";
import * as mime from "mime-types";
import { ConfigService } from "src/config/config.service";
import { PrismaService } from "src/prisma/prisma.service";
import { validate as isValidUUID } from "uuid";
import { SHARE_DIRECTORY } from "../constants";
import { Readable } from "stream";
@Injectable()
export class LocalFileService {
constructor(
private prisma: PrismaService,
private config: ConfigService,
) {}
async create(
data: string,
chunk: { index: number; total: number },
file: { id?: string; name: string },
shareId: string,
) {
if (!file.id) {
file.id = crypto.randomUUID();
} else if (!isValidUUID(file.id)) {
throw new BadRequestException("Invalid file ID format");
}
const share = await this.prisma.share.findUnique({
where: { id: shareId },
include: { files: true, reverseShare: true },
});
if (share.uploadLocked)
throw new BadRequestException("Share is already completed");
let diskFileSize: number;
try {
diskFileSize = (
await fs.stat(`${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk`)
).size;
} catch {
diskFileSize = 0;
}
// If the sent chunk index and the expected chunk index doesn't match throw an error
const chunkSize = this.config.get("share.chunkSize");
const expectedChunkIndex = Math.ceil(diskFileSize / chunkSize);
if (expectedChunkIndex != chunk.index)
throw new BadRequestException({
message: "Unexpected chunk received",
error: "unexpected_chunk_index",
expectedChunkIndex,
});
const buffer = Buffer.from(data, "base64");
// Check if there is enough space on the server
const space = await fs.statfs(SHARE_DIRECTORY);
const availableSpace = space.bavail * space.bsize;
if (availableSpace < buffer.byteLength) {
throw new InternalServerErrorException("Not enough space on the server");
}
// Check if share size limit is exceeded
const fileSizeSum = share.files.reduce(
(n, { size }) => n + parseInt(size),
0,
);
const shareSizeSum = fileSizeSum + diskFileSize + buffer.byteLength;
if (
shareSizeSum > this.config.get("share.maxSize") ||
(share.reverseShare?.maxShareSize &&
shareSizeSum > parseInt(share.reverseShare.maxShareSize))
) {
throw new HttpException(
"Max share size exceeded",
HttpStatus.PAYLOAD_TOO_LARGE,
);
}
await fs.appendFile(
`${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk`,
buffer,
);
const isLastChunk = chunk.index == chunk.total - 1;
if (isLastChunk) {
await fs.rename(
`${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk`,
`${SHARE_DIRECTORY}/${shareId}/${file.id}`,
);
const fileSize = (
await fs.stat(`${SHARE_DIRECTORY}/${shareId}/${file.id}`)
).size;
await this.prisma.file.create({
data: {
id: file.id,
name: file.name,
size: fileSize.toString(),
share: { connect: { id: shareId } },
},
});
}
return file;
}
async get(shareId: string, fileId: string) {
const fileMetaData = await this.prisma.file.findUnique({
where: { id: fileId },
});
if (!fileMetaData) throw new NotFoundException("File not found");
const file = createReadStream(`${SHARE_DIRECTORY}/${shareId}/${fileId}`);
return {
metaData: {
mimeType: mime.contentType(fileMetaData.name.split(".").pop()),
...fileMetaData,
size: fileMetaData.size,
},
file,
};
}
async remove(shareId: string, fileId: string) {
const fileMetaData = await this.prisma.file.findUnique({
where: { id: fileId },
});
if (!fileMetaData) throw new NotFoundException("File not found");
await fs.unlink(`${SHARE_DIRECTORY}/${shareId}/${fileId}`);
await this.prisma.file.delete({ where: { id: fileId } });
}
async deleteAllFiles(shareId: string) {
await fs.rm(`${SHARE_DIRECTORY}/${shareId}`, {
recursive: true,
force: true,
});
}
async getZip(shareId: string): Promise<Readable> {
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

@@ -0,0 +1,390 @@
import {
BadRequestException,
Injectable,
InternalServerErrorException,
NotFoundException,
Logger,
} from "@nestjs/common";
import {
AbortMultipartUploadCommand,
CompleteMultipartUploadCommand,
CreateMultipartUploadCommand,
DeleteObjectCommand,
DeleteObjectsCommand,
GetObjectCommand,
HeadObjectCommand,
ListObjectsV2Command,
S3Client,
UploadPartCommand,
UploadPartCommandOutput,
} from "@aws-sdk/client-s3";
import { PrismaService } from "src/prisma/prisma.service";
import { ConfigService } from "src/config/config.service";
import * as crypto from "crypto";
import * as mime from "mime-types";
import { File } from "./file.service";
import { Readable } from "stream";
import { validate as isValidUUID } from "uuid";
import * as archiver from "archiver";
@Injectable()
export class S3FileService {
private readonly logger = new Logger(S3FileService.name);
private multipartUploads: Record<
string,
{
uploadId: string;
parts: Array<{ ETag: string | undefined; PartNumber: number }>;
}
> = {};
constructor(
private prisma: PrismaService,
private config: ConfigService,
) {}
async create(
data: string,
chunk: { index: number; total: number },
file: { id?: string; name: string },
shareId: string,
) {
if (!file.id) {
file.id = crypto.randomUUID();
} else if (!isValidUUID(file.id)) {
throw new BadRequestException("Invalid file ID format");
}
const buffer = Buffer.from(data, "base64");
const key = `${this.getS3Path()}${shareId}/${file.name}`;
const bucketName = this.config.get("s3.bucketName");
const s3Instance = this.getS3Instance();
try {
// Initialize multipart upload if it's the first chunk
if (chunk.index === 0) {
const multipartInitResponse = await s3Instance.send(
new CreateMultipartUploadCommand({
Bucket: bucketName,
Key: key,
}),
);
const uploadId = multipartInitResponse.UploadId;
if (!uploadId) {
throw new Error("Failed to initialize multipart upload.");
}
// Store the uploadId and parts list in memory
this.multipartUploads[file.id] = {
uploadId,
parts: [],
};
}
// Get the ongoing multipart upload
const multipartUpload = this.multipartUploads[file.id];
if (!multipartUpload) {
throw new InternalServerErrorException(
"Multipart upload session not found.",
);
}
const uploadId = multipartUpload.uploadId;
// Upload the current chunk
const partNumber = chunk.index + 1; // Part numbers start from 1
const uploadPartResponse: UploadPartCommandOutput = await s3Instance.send(
new UploadPartCommand({
Bucket: bucketName,
Key: key,
PartNumber: partNumber,
UploadId: uploadId,
Body: buffer,
}),
);
// Store the ETag and PartNumber for later completion
multipartUpload.parts.push({
ETag: uploadPartResponse.ETag,
PartNumber: partNumber,
});
// Complete the multipart upload if it's the last chunk
if (chunk.index === chunk.total - 1) {
await s3Instance.send(
new CompleteMultipartUploadCommand({
Bucket: bucketName,
Key: key,
UploadId: uploadId,
MultipartUpload: {
Parts: multipartUpload.parts,
},
}),
);
// Remove the completed upload from memory
delete this.multipartUploads[file.id];
}
} catch (error) {
// Abort the multipart upload if it fails
const multipartUpload = this.multipartUploads[file.id];
if (multipartUpload) {
try {
await s3Instance.send(
new AbortMultipartUploadCommand({
Bucket: bucketName,
Key: key,
UploadId: multipartUpload.uploadId,
}),
);
} catch (abortError) {
console.error("Error aborting multipart upload:", abortError);
}
delete this.multipartUploads[file.id];
}
this.logger.error(error);
throw new Error("Multipart upload failed. The upload has been aborted.");
}
const isLastChunk = chunk.index == chunk.total - 1;
if (isLastChunk) {
const fileSize: number = await this.getFileSize(shareId, file.name);
await this.prisma.file.create({
data: {
id: file.id,
name: file.name,
size: fileSize.toString(),
share: { connect: { id: shareId } },
},
});
}
return file;
}
async get(shareId: string, fileId: string): Promise<File> {
const fileName = (
await this.prisma.file.findUnique({ where: { id: fileId } })
).name;
const s3Instance = this.getS3Instance();
const key = `${this.getS3Path()}${shareId}/${fileName}`;
const response = await s3Instance.send(
new GetObjectCommand({
Bucket: this.config.get("s3.bucketName"),
Key: key,
}),
);
return {
metaData: {
id: fileId,
size: response.ContentLength?.toString() || "0",
name: fileName,
shareId: shareId,
createdAt: response.LastModified || new Date(),
mimeType:
mime.contentType(fileId.split(".").pop()) ||
"application/octet-stream",
},
file: response.Body as Readable,
} as File;
}
async remove(shareId: string, fileId: string) {
const fileMetaData = await this.prisma.file.findUnique({
where: { id: fileId },
});
if (!fileMetaData) throw new NotFoundException("File not found");
const key = `${this.getS3Path()}${shareId}/${fileMetaData.name}`;
const s3Instance = this.getS3Instance();
try {
await s3Instance.send(
new DeleteObjectCommand({
Bucket: this.config.get("s3.bucketName"),
Key: key,
}),
);
} catch (error) {
throw new Error("Could not delete file from S3");
}
await this.prisma.file.delete({ where: { id: fileId } });
}
async deleteAllFiles(shareId: string) {
const prefix = `${this.getS3Path()}${shareId}/`;
const s3Instance = this.getS3Instance();
try {
// List all objects under the given prefix
const listResponse = await s3Instance.send(
new ListObjectsV2Command({
Bucket: this.config.get("s3.bucketName"),
Prefix: prefix,
}),
);
if (!listResponse.Contents || listResponse.Contents.length === 0) {
throw new Error(`No files found for share ${shareId}`);
}
// Extract the keys of the files to be deleted
const objectsToDelete = listResponse.Contents.map((file) => ({
Key: file.Key!,
}));
// Delete all files in a single request (up to 1000 objects at once)
await s3Instance.send(
new DeleteObjectsCommand({
Bucket: this.config.get("s3.bucketName"),
Delete: {
Objects: objectsToDelete,
},
}),
);
} catch (error) {
throw new Error("Could not delete all files from S3");
}
}
async getFileSize(shareId: string, fileName: string): Promise<number> {
const key = `${this.getS3Path()}${shareId}/${fileName}`;
const s3Instance = this.getS3Instance();
try {
// Get metadata of the file using HeadObjectCommand
const headObjectResponse = await s3Instance.send(
new HeadObjectCommand({
Bucket: this.config.get("s3.bucketName"),
Key: key,
}),
);
// Return ContentLength which is the file size in bytes
return headObjectResponse.ContentLength ?? 0;
} catch (error) {
throw new Error("Could not retrieve file size");
}
}
getS3Instance(): S3Client {
const checksumCalculation =
this.config.get("s3.useChecksum") === true ? null : "WHEN_REQUIRED";
return new S3Client({
endpoint: this.config.get("s3.endpoint"),
region: this.config.get("s3.region"),
credentials: {
accessKeyId: this.config.get("s3.key"),
secretAccessKey: this.config.get("s3.secret"),
},
forcePathStyle: true,
requestChecksumCalculation: checksumCalculation,
responseChecksumValidation: checksumCalculation,
});
}
getZip(shareId: string) {
return new Promise<Readable>(async (resolve, reject) => {
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 {
const configS3Path = this.config.get("s3.bucketPath");
return configS3Path ? `${configS3Path}/` : "";
}
}

View File

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

View File

@@ -70,7 +70,10 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
new URLSearchParams({
client_id: this.config.get(`oauth.${this.name}-clientId`),
response_type: "code",
scope: "openid profile email",
scope:
this.name == "oidc"
? this.config.get(`oauth.oidc-scope`)
: "openid email profile",
redirect_uri: this.getRedirectUri(),
state,
nonce,
@@ -144,38 +147,36 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
if (roleConfig?.path) {
// A path to read roles from the token is configured
let roles: string[] | null;
let roles: string[] = [];
try {
roles = jmespath.search(idTokenData, roleConfig.path);
const rolesClaim = jmespath.search(idTokenData, roleConfig.path);
if (Array.isArray(rolesClaim)) {
roles = rolesClaim;
}
} catch (e) {
roles = null;
}
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(
this.logger.warn(
`Roles not found at path ${roleConfig.path} in ID Token ${JSON.stringify(
idTokenData,
undefined,
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");
}
if (roleConfig.adminAccess) {
// Role for admin access is configured
isAdmin = roles.includes(roleConfig.adminAccess);
}
}
if (!username) {

View File

@@ -26,10 +26,11 @@ export class ReverseShareService {
.toDate();
const parsedExpiration = parseRelativeDateToAbsolute(data.shareExpiration);
const maxExpiration = this.config.get("share.maxExpiration");
if (
this.config.get("share.maxExpiration") !== 0 &&
maxExpiration.value !== 0 &&
parsedExpiration >
moment().add(this.config.get("share.maxExpiration"), "hours").toDate()
moment().add(maxExpiration.value, maxExpiration.unit).toDate()
) {
throw new BadRequestException(
"Expiration date exceeds maximum expiration date",

View File

@@ -2,6 +2,7 @@ import { Expose, plainToClass, Type } from "class-transformer";
import { ShareDTO } from "./share.dto";
import { FileDTO } from "../../file/dto/file.dto";
import { OmitType } from "@nestjs/swagger";
import { MyShareSecurityDTO } from "./myShareSecurity.dto";
export class MyShareDTO extends OmitType(ShareDTO, [
"files",
@@ -21,6 +22,9 @@ export class MyShareDTO extends OmitType(ShareDTO, [
@Type(() => OmitType(FileDTO, ["share", "from"] as const))
files: Omit<FileDTO, "share" | "from">[];
@Expose()
security?: MyShareSecurityDTO;
from(partial: Partial<MyShareDTO>) {
return plainToClass(MyShareDTO, partial, { excludeExtraneousValues: true });
}

View File

@@ -0,0 +1,9 @@
import { Expose } from "class-transformer";
export class MyShareSecurityDTO {
@Expose()
passwordProtected: boolean;
@Expose()
maxViews: number;
}

View File

@@ -24,6 +24,7 @@ import { CreateShareDTO } from "./dto/createShare.dto";
export class ShareService {
constructor(
private prisma: PrismaService,
private configService: ConfigService,
private fileService: FileService,
private emailService: EmailService,
private config: ConfigService,
@@ -55,13 +56,12 @@ export class ShareService {
const expiresNever = moment(0).toDate() == parsedExpiration;
const maxExpiration = this.config.get("share.maxExpiration");
if (
this.config.get("share.maxExpiration") !== 0 &&
maxExpiration.value !== 0 &&
(expiresNever ||
parsedExpiration >
moment()
.add(this.config.get("share.maxExpiration"), "hours")
.toDate())
moment().add(maxExpiration.value, maxExpiration.unit).toDate())
) {
throw new BadRequestException(
"Expiration date exceeds maximum expiration date",
@@ -86,6 +86,7 @@ export class ShareService {
? share.recipients.map((email) => ({ email }))
: [],
},
storageProvider: this.configService.get("s3.enabled") ? "S3" : "LOCAL",
},
});
@@ -105,6 +106,8 @@ export class ShareService {
}
async createZip(shareId: string) {
if (this.config.get("s3.enabled")) return;
const path = `${SHARE_DIRECTORY}/${shareId}`;
const files = await this.prisma.file.findMany({ where: { shareId } });
@@ -229,7 +232,7 @@ export class ShareService {
orderBy: {
expiration: "desc",
},
include: { recipients: true, files: true },
include: { recipients: true, files: true, security: true },
});
return shares.map((share) => {
@@ -237,6 +240,10 @@ export class ShareService {
...share,
size: share.files.reduce((acc, file) => acc + parseInt(file.size), 0),
recipients: share.recipients.map((recipients) => recipients.email),
security: {
maxViews: share.security?.maxViews,
passwordProtected: !!share.security?.password,
},
};
});
}

View File

@@ -3,6 +3,7 @@ import {
Controller,
Delete,
Get,
HttpCode,
Param,
Patch,
Post,
@@ -14,12 +15,12 @@ import { Response } from "express";
import { GetUser } from "src/auth/decorator/getUser.decorator";
import { AdministratorGuard } from "src/auth/guard/isAdmin.guard";
import { JwtGuard } from "src/auth/guard/jwt.guard";
import { ConfigService } from "../config/config.service";
import { CreateUserDTO } from "./dto/createUser.dto";
import { UpdateOwnUserDTO } from "./dto/updateOwnUser.dto";
import { UpdateUserDto } from "./dto/updateUser.dto";
import { UserDTO } from "./dto/user.dto";
import { UserSevice } from "./user.service";
import { ConfigService } from "../config/config.service";
@Controller("users")
export class UserController {
@@ -48,12 +49,15 @@ export class UserController {
}
@Delete("me")
@HttpCode(204)
@UseGuards(JwtGuard)
async deleteCurrentUser(
@GetUser() user: User,
@Res({ passthrough: true }) response: Response,
) {
const isSecure = this.config.get("general.appUrl").startsWith("https");
await this.userService.delete(user.id);
const isSecure = this.config.get("general.secureCookies");
response.cookie("access_token", "accessToken", {
maxAge: -1,
@@ -65,7 +69,6 @@ export class UserController {
maxAge: -1,
secure: isSecure,
});
return new UserDTO().from(await this.userService.delete(user.id));
}
// Global user operations

View File

@@ -2,15 +2,15 @@ import { BadRequestException, Injectable, Logger } from "@nestjs/common";
import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library";
import * as argon from "argon2";
import * as crypto from "crypto";
import { Entry } from "ldapts";
import { AuthSignInDTO } from "src/auth/dto/authSignIn.dto";
import { EmailService } from "src/email/email.service";
import { PrismaService } from "src/prisma/prisma.service";
import { inspect } from "util";
import { ConfigService } from "../config/config.service";
import { FileService } from "../file/file.service";
import { CreateUserDTO } from "./dto/createUser.dto";
import { UpdateUserDto } from "./dto/updateUser.dto";
import { ConfigService } from "../config/config.service";
import { Entry } from "ldapts";
import { AuthSignInDTO } from "src/auth/dto/authSignIn.dto";
import { inspect } from "util";
@Injectable()
export class UserSevice {
@@ -89,6 +89,16 @@ export class UserSevice {
});
if (!user) throw new BadRequestException("User not found");
if (user.isAdmin) {
const userCount = await this.prisma.user.count({
where: { isAdmin: true },
});
if (userCount === 1) {
throw new BadRequestException("Cannot delete the last admin user");
}
}
await Promise.all(
user.shares.map((share) => this.fileService.deleteAllFiles(share.id)),
);

View File

@@ -10,3 +10,20 @@ export function parseRelativeDateToAbsolute(relativeDate: string) {
)
.toDate();
}
type Timespan = {
value: number;
unit: "minutes" | "hours" | "days" | "weeks" | "months" | "years";
};
export function stringToTimespan(value: string): Timespan {
const [time, unit] = value.split(" ");
return {
value: parseInt(time),
unit: unit as Timespan["unit"],
};
}
export function timespanToString(timespan: Timespan) {
return `${timespan.value} ${timespan.unit}`;
}

237
config.example.yaml Normal file
View File

@@ -0,0 +1,237 @@
#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"
cache:
#Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.
redis-enabled: "false"
#Url to connect to the Redis instance used for caching.
redis-url: redis://pingvin-redis:6379
#Time in second to keep information inside the cache.
ttl: "60"
#Maximum number of items inside the cache.
maxItems: "1000"
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:
- source: /frontend/src/i18n/translations/en-US.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

@@ -1,6 +1,6 @@
services:
pingvin-share:
image: stonith404/pingvin-share
image: stonith404/pingvin-share # or ghcr.io/stonith404/pingvin-share
restart: unless-stopped
ports:
- 3000:3000
@@ -9,6 +9,7 @@ services:
volumes:
- "./data:/opt/app/backend/data"
- "./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,
# see https://stonith404.github.io/pingvin-share/setup/integrations/#clamav-docker-only

View File

@@ -23,7 +23,7 @@ Before you submit the pull request for review please ensure that
When `TYPE` can be:
- **feat** - is a new feature
- **doc** - documentation only changes
- **docs** - documentation only changes
- **fix** - a bug fix
- **refactor** - code change that neither fixes a bug nor adds a feature

View File

@@ -4,27 +4,21 @@ id: 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.example.yaml) and mount it to `/opt/app/config.yaml` in the container.
### Show home page
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.
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.example.yaml) in the root directory of the project.
---
@@ -39,6 +33,7 @@ For installation specific configuration, you can use environment variables. The
| `BACKEND_PORT` | `8080` | The port on which the backend listens. |
| `DATABASE_URL` | `file:../data/pingvin-share.db?connection_limit=1` | The URL of the SQLite database. |
| `DATA_DIRECTORY` | `./data` | The directory where data is stored. |
| `CONFIG_FILE` | `../config.yaml` | Path to the configuration file |
| `CLAMAV_HOST` | `127.0.0.1` or `clamav` when running with Docker | The IP address of the ClamAV server. See the [ClamAV docs](integrations.md#clamav) for more information. |
| `CLAMAV_PORT` | `3310` | The port number of the ClamAV server. |
@@ -49,8 +44,12 @@ For installation specific configuration, you can use environment variables. The
| `PORT` | `3000` | The port on which the frontend listens. |
| `API_URL` | `http://localhost:8080` | The URL of the backend for the frontend. |
#### Reverse Proxy (inside the Docker container)
#### Docker specific
| 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. |
Environment variables that are only available when running Pingvin Share with Docker.
| 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. |
| `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:
- [Node.js](https://nodejs.org/en/download/) >= 16
- [Node.js](https://nodejs.org/en/download/) >= 22
- [Git](https://git-scm.com/downloads)
- [pm2](https://pm2.keymetrics.io/) for running Pingvin Share in the background

View File

@@ -8,7 +8,7 @@ id: integrations
ClamAV is used to scan shares for malicious files and remove them if found.
Please note that ClamAV needs a lot of [ressources](https://docs.clamav.net/manual/Installing/Docker.html#memory-ram-requirements).
Please note that ClamAV needs a lot of [resources](https://docs.clamav.net/manual/Installing/Docker.html#memory-ram-requirements).
### Docker

View File

@@ -52,7 +52,7 @@ If our built-in providers don't meet your needs, you can create your own OAuth 2
### 1. Create config
Add your config (client id, client secret, etc.) in [`config.seed.ts`](../backend/prisma/seed/config.seed.ts):
Add your config (client id, client secret, etc.) in [`config.seed.ts`](https://github.com/stonith404/pingvin-share/blob/main/backend/prisma/seed/config.seed.ts):
```ts
const configVariables: ConfigVariables = {
@@ -80,9 +80,9 @@ const configVariables: ConfigVariables = {
#### Generic OpenID Connect
If your provider supports OpenID connect, it's extremely easy to extend [`GenericOidcProvider`](../backend/src/oauth/provider/genericOidc.provider.ts) to add a new OpenID Connect provider.
If your provider supports OpenID connect, it's extremely easy to extend [`GenericOidcProvider`](https://github.com/stonith404/pingvin-share/blob/main/backend/src/oauth/provider/genericOidc.provider.ts) to add a new OpenID Connect provider.
The [Google provider](../backend/src/oauth/provider/google.provider.ts) and [Microsoft provider](../backend/src/oauth/provider/microsoft.provider.ts) are good examples.
The [Google provider](https://github.com/stonith404/pingvin-share/blob/main/backend/src/oauth/provider/google.provider.ts) and [Microsoft provider](https://github.com/stonith404/pingvin-share/blob/main/backend/src/oauth/provider/microsoft.provider.ts) are good examples.
Here are some discovery URIs for popular providers:
@@ -96,13 +96,13 @@ Here are some discovery URIs for popular providers:
#### OAuth 2
If your provider only supports OAuth 2, you can implement [`OAuthProvider`](../backend/src/oauth/provider/oauthProvider.interface.ts) interface to add a new OAuth 2 provider.
If your provider only supports OAuth 2, you can implement [`OAuthProvider`](https://github.com/stonith404/pingvin-share/blob/main/backend/src/oauth/provider/oauthProvider.interface.ts) interface to add a new OAuth 2 provider.
The [GitHub provider](../backend/src/oauth/provider/github.provider.ts) and [Discord provider](../backend/src/oauth/provider/discord.provider.ts) are good examples.
The [GitHub provider](https://github.com/stonith404/pingvin-share/blob/main/backend/src/oauth/provider/github.provider.ts) and [Discord provider](https://github.com/stonith404/pingvin-share/blob/main/backend/src/oauth/provider/discord.provider.ts) are good examples.
### 3. Register provider
Register your provider in [`OAuthModule`](../backend/src/oauth/oauth.module.ts) and [`OAuthSignInDto`](../backend/src/oauth/dto/oauthSignIn.dto.ts):
Register your provider in [`OAuthModule`](https://github.com/stonith404/pingvin-share/blob/main/backend/src/oauth/oauth.module.ts) and [`OAuthSignInDto`](https://github.com/stonith404/pingvin-share/blob/main/backend/src/oauth/dto/oauthSignIn.dto.ts):
```ts
@Module({
@@ -142,7 +142,7 @@ export interface OAuthSignInDto {
### 4. Add frontend icon
Add an icon in [`oauth.util.tsx`](../frontend/src/utils/oauth.util.tsx).
Add an icon in [`oauth.util.tsx`](https://github.com/stonith404/pingvin-share/blob/main/frontend/src/utils/oauth.util.tsx).
```tsx
const getOAuthIcon = (provider: string) => {
@@ -155,7 +155,7 @@ const getOAuthIcon = (provider: string) => {
### 5. Add i18n text
Add keys below to your i18n text in [locale file](../frontend/src/i18n/translations/en-US.ts).
Add keys below to your i18n text in [locale file](https://github.com/stonith404/pingvin-share/blob/main/frontend/src/i18n/translations/en-US.ts).
- `signIn.oauth.YOUR_PROVIDER_NAME`
- `account.card.oauth.YOUR_PROVIDER_NAME`

32
docs/docs/setup/s3.md Normal file
View File

@@ -0,0 +1,32 @@
---
id: s3
---
# S3
You are able to add your preferred S3 provider, like AWS, DigitalOcean, Exoscale or Infomaniak. However, if you don't
want to store your files on a S3 bucket, you don't have to. Consider that this feature is `DISABLED` per default.
## Configuration
You can configure your S3 provider and bucket by going to the configuration page in your admin dashboard `/admin/config/s3`.
| Key | Description | Value |
|:-----------|:-------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------|
| enabled | This property enables the storage location on your configured S3 bucket. | `true` |
| endpoint | The host for your S3 bucket. Endpoint formats vary by provider and some may include the bucket name in the FQDN. Ensure this is configured correctly, as an incorrect value may break some features. | `sos-ch-dk-2.exo.io` |
| region | This property is the region where the bucket is located. | `sos-ch-dk-2` |
| bucketName | This property is the name of your S3 bucket. | `my-bucket` |
| bucketPath | This property defines the folder where you want to store your files which are uploaded. Hint: Don't put a slash in the start or end. | `my/custom/path` (or leave it empty for root) |
| key | This is the access key you need to access to your bucket. | `key-asdf` |
| secret | This is the secret you need to access to your bucket. | `secret-asdf` |
Don't forget to save the configuration. :)
## ClamAV
Consider that ClamAV scans are not available at the moment if you store your files in a S3 bucket.
## ZIP
Creating ZIP archives is not currently supported if you store your files in an S3 bucket.

View File

@@ -46,4 +46,4 @@ docker compose up -d
npm run build
pm2 restart pingvin-share-frontend
```
Note that environemnt variables are not picked up when using pm2 restart, if you actually want to change configs, you need to run ````pm2 --update-env restart````
Note that environment variables are not picked up when using pm2 restart, if you actually want to change configs, you need to run ````pm2 --update-env restart````

View File

@@ -36,6 +36,10 @@ const sidebars: SidebarsConfig = {
type: "doc",
id: "setup/oauth2login",
},
{
type: "doc",
id: "setup/s3",
},
{
type: "doc",
id: "setup/upgrading",

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "pingvin-share-frontend",
"version": "1.2.4",
"version": "1.13.0",
"scripts": {
"dev": "next dev",
"build": "next build",
@@ -26,7 +26,7 @@
"markdown-to-jsx": "^7.5.0",
"mime-types": "^2.1.35",
"moment": "^2.30.1",
"next": "^14.2.12",
"next": "^14.2.26",
"next-http-proxy-middleware": "^1.2.6",
"next-pwa": "^5.6.0",
"p-limit": "^6.1.0",

View File

@@ -87,7 +87,7 @@ const CreateEnableTotpModal = ({
<Button
onClick={() => {
navigator.clipboard.writeText(options.secret);
toast.success("Copied to clipboard");
toast.success(t("common.notify.copied"));
}}
>
{options.secret}

View File

@@ -5,10 +5,9 @@ import { translateOutsideContext } from "../../hooks/useTranslate.hook";
const showReverseShareLinkModal = (
modals: ModalsContextProps,
reverseShareToken: string,
appUrl: string,
) => {
const t = translateOutsideContext();
const link = `${appUrl}/upload/${reverseShareToken}`;
const link = `${window.location.origin}/upload/${reverseShareToken}`;
return modals.openModal({
title: t("account.reverseShares.modal.reverse-share-link"),
children: (

View File

@@ -11,11 +11,10 @@ import CopyTextField from "../upload/CopyTextField";
const showShareInformationsModal = (
modals: ModalsContextProps,
share: MyShare,
appUrl: string,
maxShareSize: number,
) => {
const t = translateOutsideContext();
const link = `${appUrl}/s/${share.id}`;
const link = `${window.location.origin}/s/${share.id}`;
const formattedShareSize = byteToHumanSizeString(share.size);
const formattedMaxShareSize = byteToHumanSizeString(maxShareSize);

View File

@@ -2,13 +2,9 @@ import { Stack, TextInput } from "@mantine/core";
import { ModalsContextProps } from "@mantine/modals/lib/context";
import { translateOutsideContext } from "../../hooks/useTranslate.hook";
const showShareLinkModal = (
modals: ModalsContextProps,
shareId: string,
appUrl: string,
) => {
const showShareLinkModal = (modals: ModalsContextProps, shareId: string) => {
const t = translateOutsideContext();
const link = `${appUrl}/s/${shareId}`;
const link = `${window.location.origin}/s/${shareId}`;
return modals.openModal({
title: t("account.shares.modal.share-link"),
children: (

View File

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

View File

@@ -13,12 +13,14 @@ import Link from "next/link";
import { Dispatch, SetStateAction } from "react";
import {
TbAt,
TbBinaryTree,
TbBucket,
TbMail,
TbScale,
TbServerBolt,
TbSettings,
TbShare,
TbSocial,
TbSquare,
TbBinaryTree,
TbSettings,
} from "react-icons/tb";
import { FormattedMessage } from "react-intl";
@@ -29,6 +31,9 @@ const categories = [
{ name: "SMTP", icon: <TbAt /> },
{ name: "OAuth", icon: <TbSocial /> },
{ name: "LDAP", icon: <TbBinaryTree /> },
{ name: "S3", icon: <TbBucket /> },
{ name: "Legal", icon: <TbScale /> },
{ name: "Cache", icon: <TbServerBolt /> },
];
const useStyles = createStyles((theme) => ({

View File

@@ -89,15 +89,11 @@ const ManageShareTable = ({
onClick={() => {
if (window.isSecureContext) {
clipboard.copy(
`${config.get("general.appUrl")}/s/${share.id}`,
`${window.location.origin}/s/${share.id}`,
);
toast.success(t("common.notify.copied"));
toast.success(t("common.notify.copied-link"));
} else {
showShareLinkModal(
modals,
share.id,
config.get("general.appUrl"),
);
showShareLinkModal(modals, share.id);
}
}}
>

View File

@@ -128,9 +128,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
config.get("oauth.disablePassword")
) {
setIsRedirectingToOauthProvider(true);
router.push(
getOAuthUrl(config.get("general.appUrl"), providers.data[0]),
);
router.push(getOAuthUrl(window.location.origin, providers.data[0]));
}
})
.catch(toast.axiosError);
@@ -208,7 +206,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
key={provider}
component="a"
title={t(`signIn.oauth.${provider}`)}
href={getOAuthUrl(config.get("general.appUrl"), provider)}
href={getOAuthUrl(window.location.origin, provider)}
variant="light"
fullWidth
>

View File

@@ -0,0 +1,81 @@
import { NativeSelect, NumberInput } from "@mantine/core";
import { useState } from "react";
const multipliers = {
B: 1,
KB: 1000,
KiB: 1024,
MB: 1000 ** 2,
MiB: 1024 ** 2,
GB: 1000 ** 3,
GiB: 1024 ** 3,
TB: 1000 ** 4,
TiB: 1024 ** 4,
};
const units = (
["B", "KB", "KiB", "MB", "MiB", "GB", "GiB", "TB", "TiB"] as const
).map((unit) => ({ label: unit, value: unit }));
function getLargestApplicableUnit(value: number) {
return (
units.findLast((unit) => value % multipliers[unit.value] === 0) || units[0]
);
}
const FileSizeInput = ({
label,
value,
onChange,
...restProps
}: {
label?: string;
value: number;
onChange: (number: number) => void;
[key: string]: any;
}) => {
const [unit, setUnit] = useState(getLargestApplicableUnit(value).value);
const [inputValue, setInputValue] = useState(value / multipliers[unit]);
const unitSelect = (
<NativeSelect
data={units}
value={unit}
rightSectionWidth={28}
styles={{
input: {
fontWeight: 500,
borderTopLeftRadius: 0,
borderBottomLeftRadius: 0,
width: 76,
marginRight: -2,
},
}}
onChange={(event) => {
const unit = event.currentTarget
.value as (typeof units)[number]["value"];
setUnit(unit);
onChange(multipliers[unit] * inputValue);
}}
/>
);
return (
<NumberInput
label={label}
value={inputValue}
min={1}
max={999999}
precision={0}
rightSection={unitSelect}
rightSectionWidth={76}
onChange={(value) => {
const inputVal = value || 0;
setInputValue(inputVal);
onChange(multipliers[unit] * inputVal);
}}
{...restProps}
/>
);
};
export default FileSizeInput;

View File

@@ -0,0 +1,88 @@
import { useState } from "react";
import { Timespan } from "../../types/timespan.type";
import { NativeSelect, NumberInput } from "@mantine/core";
import useTranslate from "../../hooks/useTranslate.hook";
const TimespanInput = ({
label,
value,
onChange,
...restProps
}: {
label?: string;
value: Timespan;
onChange: (timespan: Timespan) => void;
[key: string]: any;
}) => {
const [unit, setUnit] = useState(value.unit);
const [inputValue, setInputValue] = useState(value.value);
const t = useTranslate();
const version = inputValue == 1 ? "singular" : "plural";
const unitSelect = (
<NativeSelect
data={[
{
value: "minutes",
label: t(`upload.modal.expires.minute-${version}`),
},
{
value: "hours",
label: t(`upload.modal.expires.hour-${version}`),
},
{
value: "days",
label: t(`upload.modal.expires.day-${version}`),
},
{
value: "weeks",
label: t(`upload.modal.expires.week-${version}`),
},
{
value: "months",
label: t(`upload.modal.expires.month-${version}`),
},
{
value: "years",
label: t(`upload.modal.expires.year-${version}`),
},
]}
value={unit}
rightSectionWidth={28}
styles={{
input: {
fontWeight: 500,
borderTopLeftRadius: 0,
borderBottomLeftRadius: 0,
width: 120,
marginRight: -2,
},
}}
onChange={(event) => {
const unit = event.currentTarget.value as Timespan["unit"];
setUnit(unit);
onChange({ value: inputValue, unit });
}}
/>
);
return (
<NumberInput
label={label}
value={inputValue}
min={0}
max={999999}
precision={0}
rightSection={unitSelect}
rightSectionWidth={120}
onChange={(value) => {
const inputVal = value || 0;
setInputValue(inputVal);
onChange({ value: inputVal, unit });
}}
{...restProps}
/>
);
};
export default TimespanInput;

View File

@@ -0,0 +1,62 @@
import { Anchor, Footer as MFooter, SimpleGrid, Text } from "@mantine/core";
import { useMediaQuery } from "@mantine/hooks";
import useConfig from "../../hooks/config.hook";
import useTranslate from "../../hooks/useTranslate.hook";
const Footer = () => {
const t = useTranslate();
const config = useConfig();
const hasImprint = !!(
config.get("legal.imprintUrl") || config.get("legal.imprintText")
);
const hasPrivacy = !!(
config.get("legal.privacyPolicyUrl") ||
config.get("legal.privacyPolicyText")
);
const imprintUrl =
(!config.get("legal.imprintText") && config.get("legal.imprintUrl")) ||
"/imprint";
const privacyUrl =
(!config.get("legal.privacyPolicyText") &&
config.get("legal.privacyPolicyUrl")) ||
"/privacy";
const isMobile = useMediaQuery("(max-width: 700px)");
return (
<MFooter height="auto" py={6} px="xl" zIndex={100}>
<SimpleGrid cols={isMobile ? 2 : 3} m={0}>
{!isMobile && <div></div>}
<Text size="xs" color="dimmed" align={isMobile ? "left" : "center"}>
Powered by{" "}
<Anchor
size="xs"
href="https://github.com/stonith404/pingvin-share"
target="_blank"
>
Pingvin Share
</Anchor>
</Text>
<div>
{config.get("legal.enabled") && (
<Text size="xs" color="dimmed" align="right">
{hasImprint && (
<Anchor size="xs" href={imprintUrl}>
{t("imprint.title")}
</Anchor>
)}
{hasImprint && hasPrivacy && " • "}
{hasPrivacy && (
<Anchor size="xs" href={privacyUrl}>
{t("privacy.title")}
</Anchor>
)}
</Text>
)}
</div>
</SimpleGrid>
</MFooter>
);
};
export default Footer;

View File

@@ -11,7 +11,9 @@ import { useClipboard } from "@mantine/hooks";
import { useModals } from "@mantine/modals";
import { Dispatch, SetStateAction, useEffect, useState } from "react";
import { TbDownload, TbEye, TbLink } from "react-icons/tb";
import { FormattedMessage } from "react-intl";
import useConfig from "../../hooks/config.hook";
import useTranslate from "../../hooks/useTranslate.hook";
import shareService from "../../services/share.service";
import { FileMetaData } from "../../types/File.type";
import { Share } from "../../types/share.type";
@@ -19,8 +21,6 @@ import { byteToHumanSizeString } from "../../utils/fileSize.util";
import toast from "../../utils/toast.util";
import TableSortIcon, { TableSort } from "../core/SortIcon";
import showFilePreviewModal from "./modals/showFilePreviewModal";
import useTranslate from "../../hooks/useTranslate.hook";
import { FormattedMessage } from "react-intl";
const FileList = ({
files,
@@ -65,13 +65,13 @@ const FileList = ({
};
const copyFileLink = (file: FileMetaData) => {
const link = `${config.get("general.appUrl")}/api/shares/${
const link = `${window.location.origin}/api/shares/${
share.id
}/files/${file.id}`;
if (window.isSecureContext) {
clipboard.copy(link);
toast.success(t("common.notify.copied"));
toast.success(t("common.notify.copied-link"));
} else {
modals.openModal({
title: t("share.modal.file-link"),

View File

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

View File

@@ -1,64 +0,0 @@
import { Col, Grid, NumberInput, Select } from "@mantine/core";
import { useEffect, useState } from "react";
import {
byteToUnitAndSize,
unitAndSizeToByte,
} from "../../utils/fileSize.util";
const FileSizeInput = ({
label,
value,
onChange,
}: {
label: string;
value: number;
onChange: (number: number) => void;
}) => {
const [unit, setUnit] = useState("MB");
const [size, setSize] = useState(100);
useEffect(() => {
const { unit, size } = byteToUnitAndSize(value);
setUnit(unit);
setSize(size);
}, [value]);
return (
<Grid align="flex-end">
<Col xs={6}>
<NumberInput
min={1}
max={99999}
precision={0}
variant="filled"
label={label}
value={size}
onChange={(value) => {
if (value) {
setSize(value);
onChange(unitAndSizeToByte(unit, value));
}
}}
/>
</Col>
<Col xs={6}>
<Select
data={[
{ label: "B", value: "B" },
{ label: "KB", value: "KB" },
{ label: "MB", value: "MB" },
{ label: "GB", value: "GB" },
{ label: "TB", value: "TB" },
]}
value={unit}
onChange={(value) => {
setUnit(value!);
onChange(unitAndSizeToByte(value!, size));
}}
/>
</Col>
</Grid>
);
};
export default FileSizeInput;

View File

@@ -20,15 +20,16 @@ import useTranslate, {
translateOutsideContext,
} from "../../../hooks/useTranslate.hook";
import shareService from "../../../services/share.service";
import { Timespan } from "../../../types/timespan.type";
import { getExpirationPreview } from "../../../utils/date.util";
import toast from "../../../utils/toast.util";
import FileSizeInput from "../FileSizeInput";
import FileSizeInput from "../../core/FileSizeInput";
import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
const showCreateReverseShareModal = (
modals: ModalsContextProps,
showSendEmailNotificationOption: boolean,
maxExpirationInHours: number,
maxExpiration: Timespan,
getReverseShares: () => void,
) => {
const t = translateOutsideContext();
@@ -38,7 +39,7 @@ const showCreateReverseShareModal = (
<Body
showSendEmailNotificationOption={showSendEmailNotificationOption}
getReverseShares={getReverseShares}
maxExpirationInHours={maxExpirationInHours}
maxExpiration={maxExpiration}
/>
),
});
@@ -47,11 +48,11 @@ const showCreateReverseShareModal = (
const Body = ({
getReverseShares,
showSendEmailNotificationOption,
maxExpirationInHours,
maxExpiration,
}: {
getReverseShares: () => void;
showSendEmailNotificationOption: boolean;
maxExpirationInHours: number;
maxExpiration: Timespan;
}) => {
const modals = useModals();
const t = useTranslate();
@@ -91,13 +92,17 @@ const Body = ({
) as moment.unitOfTime.DurationConstructor,
);
if (
maxExpirationInHours != 0 &&
expirationDate.isAfter(moment().add(maxExpirationInHours, "hours"))
maxExpiration.value != 0 &&
expirationDate.isAfter(
moment().add(maxExpiration.value, maxExpiration.unit),
)
) {
form.setFieldError(
"expiration_num",
t("upload.modal.expires.error.too-long", {
max: moment.duration(maxExpirationInHours, "hours").humanize(),
max: moment
.duration(maxExpiration.value, maxExpiration.unit)
.humanize(),
}),
);
return;

View File

@@ -1,8 +1,8 @@
import { ActionIcon, TextInput, Tooltip } from "@mantine/core";
import { useClipboard } from "@mantine/hooks";
import { useRef, useState } from "react";
import { TbCheck, TbCopy } from "react-icons/tb";
import { IoOpenOutline } from "react-icons/io5";
import { TbCheck, TbCopy } from "react-icons/tb";
import useTranslate from "../../hooks/useTranslate.hook";
import toast from "../../utils/toast.util";
@@ -18,7 +18,7 @@ function CopyTextField(props: { link: string }) {
const copyLink = () => {
clipboard.copy(props.link);
toast.success(t("common.notify.copied"));
toast.success(t("common.notify.copied-link"));
if (timerRef.current) clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => {
setCheckState(false);

View File

@@ -13,7 +13,6 @@ import CopyTextField from "../CopyTextField";
const showCompletedUploadModal = (
modals: ModalsContextProps,
share: CompletedShare,
appUrl: string,
) => {
const t = translateOutsideContext();
return modals.openModal({
@@ -21,16 +20,18 @@ const showCompletedUploadModal = (
withCloseButton: false,
closeOnEscape: false,
title: t("upload.modal.completed.share-ready"),
children: <Body share={share} appUrl={appUrl} />,
children: <Body share={share} />,
});
};
const Body = ({ share, appUrl }: { share: CompletedShare; appUrl: string }) => {
const Body = ({ share }: { share: CompletedShare }) => {
const modals = useModals();
const router = useRouter();
const t = useTranslate();
const link = `${appUrl}/s/${share.id}`;
const isReverseShare = !!router.query["reverseShareToken"];
const link = `${window.location.origin}/s/${share.id}`;
return (
<Stack align="stretch">
@@ -65,7 +66,11 @@ const Body = ({ share, appUrl }: { share: CompletedShare; appUrl: string }) => {
<Button
onClick={() => {
modals.closeAll();
router.push("/upload");
if (isReverseShare) {
router.reload();
} else {
router.push("/upload");
}
}}
>
<FormattedMessage id="common.button.done" />

View File

@@ -19,7 +19,7 @@ import { useForm, yupResolver } from "@mantine/form";
import { useModals } from "@mantine/modals";
import { ModalsContextProps } from "@mantine/modals/lib/context";
import moment from "moment";
import { useState } from "react";
import React, { useState } from "react";
import { TbAlertCircle } from "react-icons/tb";
import { FormattedMessage } from "react-intl";
import * as yup from "yup";
@@ -30,18 +30,18 @@ import shareService from "../../../services/share.service";
import { FileUpload } from "../../../types/File.type";
import { CreateShare } from "../../../types/share.type";
import { getExpirationPreview } from "../../../utils/date.util";
import React from "react";
import toast from "../../../utils/toast.util";
import { Timespan } from "../../../types/timespan.type";
const showCreateUploadModal = (
modals: ModalsContextProps,
options: {
isUserSignedIn: boolean;
isReverseShare: boolean;
appUrl: string;
allowUnauthenticatedShares: boolean;
enableEmailRecepients: boolean;
maxExpirationInHours: number;
maxExpiration: Timespan;
shareIdLength: number;
simplified: boolean;
},
files: FileUpload[],
@@ -74,18 +74,28 @@ const showCreateUploadModal = (
});
};
const generateLink = () =>
Buffer.from(Math.random().toString(), "utf8")
.toString("base64")
.substring(10, 17);
const generateShareId = (length: number = 16) => {
const chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
const randomArray = new Uint8Array(length >= 3 ? length : 3);
crypto.getRandomValues(randomArray);
randomArray.forEach((number) => {
result += chars[number % chars.length];
});
return result;
};
const generateAvailableLink = async (times = 10): Promise<string> => {
const generateAvailableLink = async (
shareIdLength: number,
times: number = 10,
): Promise<string> => {
if (times <= 0) {
throw new Error("Could not generate available link");
}
const _link = generateLink();
const _link = generateShareId(shareIdLength);
if (!(await shareService.isShareIdAvailable(_link))) {
return await generateAvailableLink(times - 1);
return await generateAvailableLink(shareIdLength, times - 1);
} else {
return _link;
}
@@ -101,16 +111,16 @@ const CreateUploadModalBody = ({
options: {
isUserSignedIn: boolean;
isReverseShare: boolean;
appUrl: string;
allowUnauthenticatedShares: boolean;
enableEmailRecepients: boolean;
maxExpirationInHours: number;
maxExpiration: Timespan;
shareIdLength: number;
};
}) => {
const modals = useModals();
const t = useTranslate();
const generatedLink = generateLink();
const generatedLink = generateShareId(options.shareIdLength);
const [showNotSignedInAlert, setShowNotSignedInAlert] = useState(true);
@@ -171,17 +181,20 @@ const CreateUploadModalBody = ({
);
if (
options.maxExpirationInHours != 0 &&
options.maxExpiration.value != 0 &&
(form.values.never_expires ||
expirationDate.isAfter(
moment().add(options.maxExpirationInHours, "hours"),
moment().add(
options.maxExpiration.value,
options.maxExpiration.unit,
),
))
) {
form.setFieldError(
"expiration_num",
t("upload.modal.expires.error.too-long", {
max: moment
.duration(options.maxExpirationInHours, "hours")
.duration(options.maxExpiration.value, options.maxExpiration.unit)
.humanize(),
}),
);
@@ -232,20 +245,26 @@ const CreateUploadModalBody = ({
<Button
style={{ flex: "0 0 auto" }}
variant="outline"
onClick={() => form.setFieldValue("link", generateLink())}
onClick={() =>
form.setFieldValue(
"link",
generateShareId(options.shareIdLength),
)
}
>
<FormattedMessage id="common.button.generate" />
</Button>
</Group>
<Text
truncate
italic
size="xs"
sx={(theme) => ({
color: theme.colors.gray[6],
})}
>
{`${options.appUrl}/s/${form.values.link}`}
{`${window.location.origin}/s/${form.values.link}`}
</Text>
{!options.isReverseShare && (
<>
@@ -312,7 +331,7 @@ const CreateUploadModalBody = ({
/>
</Col>
</Grid>
{options.maxExpirationInHours == 0 && (
{options.maxExpiration.value == 0 && (
<Checkbox
label={t("upload.modal.expires.never-long")}
{...form.getInputProps("never_expires")}
@@ -391,7 +410,7 @@ const CreateUploadModalBody = ({
{...form.getInputProps("recipients")}
onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => {
// Add email on comma or semicolon
if (e.key === "," || e.key === ";") {
if (e.key === "Enter" || e.key === "," || e.key === ";") {
e.preventDefault();
const inputValue = (
e.target as HTMLInputElement
@@ -461,10 +480,10 @@ const SimplifiedCreateUploadModalModal = ({
options: {
isUserSignedIn: boolean;
isReverseShare: boolean;
appUrl: string;
allowUnauthenticatedShares: boolean;
enableEmailRecepients: boolean;
maxExpirationInHours: number;
maxExpiration: Timespan;
shareIdLength: number;
};
}) => {
const modals = useModals();
@@ -489,10 +508,12 @@ const SimplifiedCreateUploadModalModal = ({
});
const onSubmit = form.onSubmit(async (values) => {
const link = await generateAvailableLink().catch(() => {
toast.error(t("upload.modal.link.error.taken"));
return undefined;
});
const link = await generateAvailableLink(options.shareIdLength).catch(
() => {
toast.error(t("upload.modal.link.error.taken"));
return undefined;
},
);
if (!link) {
return;

View File

@@ -0,0 +1,42 @@
import { useRouter } from "next/router";
import { useEffect } from "react";
const useConfirmLeave = ({
message,
enabled,
}: {
message: string;
enabled: boolean;
}) => {
const router = useRouter();
useEffect(() => {
if (!enabled) return;
// Show confirmation dialog when route changes
const handleRouteChange = () => {
const confirmLeave = window.confirm(message);
if (!confirmLeave) {
router.events.emit("routeChangeError");
throw "Route change aborted.";
}
};
// Show confirmation when the user tries to leave or reload the page
const handleBeforeUnload = (event: BeforeUnloadEvent) => {
event.preventDefault();
event.returnValue = message;
return message;
};
router.events.on("routeChangeStart", handleRouteChange);
window.addEventListener("beforeunload", handleBeforeUnload);
return () => {
router.events.off("routeChangeStart", handleRouteChange);
window.removeEventListener("beforeunload", handleBeforeUnload);
};
}, [router, message, enabled]);
};
export default useConfirmLeave;

View File

@@ -1,11 +1,14 @@
import arabic from "./translations/ar-EG";
import czech from "./translations/cs-CZ";
import danish from "./translations/da-DK";
import german from "./translations/de-DE";
import greek from "./translations/el-GR";
import english from "./translations/en-US";
import spanish from "./translations/es-ES";
import estonian from "./translations/et-EE";
import finnish from "./translations/fi-FI";
import french from "./translations/fr-FR";
import croatian from "./translations/hr-HR";
import hungarian from "./translations/hu-HU";
import italian from "./translations/it-IT";
import japanese from "./translations/ja-JP";
@@ -15,17 +18,15 @@ import polish from "./translations/pl-PL";
import portuguese from "./translations/pt-BR";
import russian from "./translations/ru-RU";
import slovenian from "./translations/sl-SI";
import serbian from "./translations/sr-SP";
import serbianLatin from "./translations/sr-CS";
import serbianCyrillic from "./translations/sr-SP";
import swedish from "./translations/sv-SE";
import thai from "./translations/th-TH";
import turkish from "./translations/tr-TR";
import ukrainian from "./translations/uk-UA";
import viatnamese from "./translations/vi-VN";
import chineseSimplified from "./translations/zh-CN";
import chineseTraditional from "./translations/zh-TW";
import turkish from "./translations/tr-TR";
import czech from "./translations/cs-CZ";
import viatnamese from "./translations/vi-VN";
import bulgarian from "./translations/bg-BG";
import serbianCyrillic from "./translations/sr-CS";
export const LOCALES = {
ENGLISH: {
@@ -89,9 +90,14 @@ export const LOCALES = {
messages: thai,
},
SERBIAN: {
name: "Srpski",
name: "Српски",
code: "sr-SP",
messages: serbian,
messages: serbianCyrillic,
},
SERBIAN_LATIN: {
name: "Srpski",
code: "sr-CS",
messages: serbianLatin,
},
DUTCH: {
name: "Nederlands",
@@ -158,14 +164,14 @@ export const LOCALES = {
code: "vi-VN",
messages: viatnamese,
},
BULGARIAN: {
name: "Български",
code: "bg-BG",
messages: bulgarian,
CROATIAN: {
name: "Hrvatski",
code: "hr-HR",
messages: croatian,
},
SERBIAN_CYRILLIC: {
name: "Српски",
code: "sr-CS",
messages: serbianCyrillic,
ESTONIAN: {
name: "Eesti",
code: "et-EE",
messages: estonian,
},
};

View File

@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "الحجم",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "معلومات المشاركة",
"account.shares.modal.share-link": "رابط المشاركة",
"account.shares.modal.delete.title": "Delete share: {share}",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "رفع",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "حدث خطأ أثناء إنهاء مشاركتك.",
"upload.notify.count-failed": "فشل رفع {count} ملفات. تجري المحاولة مجددًا.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "رفع الملفات",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "المشاركة {shareId}",
"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.description": "تم تجاوز الحد الأقصى لزوار هذه المشاركة.",
"share.error.removed.title": "تمت إزالة المشاركة",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.modal.password.title": "كلمة السر مطلوبة",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "كلمة السر",
"share.modal.error.invalid-password": "كلمة السر غير صحيحة",
"share.button.download-all": "تنزيل الكل",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "حدث خطأ أثناء إنهاء مشاركتك.",
"share.edit.notify.save-success": "تم تحديث المشاركة بنجاح",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "عام",
"admin.config.category.share": "مشاركة",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "البريد",
"admin.config.category.smtp": "بروتوكول نقل البريد البسيط SMTP",
"admin.config.category.oauth": "الدخول بحساب تواصل اجتماعي",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "اسم التطبيق",
"admin.config.general.app-url": "رابط التطبيق",
"admin.config.general.app-url.description": "الرابط الذي تكون مشاركة Pingvin صالحة عليه",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "إظهار الصفحة الرئيسية",
"admin.config.general.show-home-page.description": "تحديد ما إذا كان سيتم عرض الصفحة الرئيسية",
"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.description": "يمكنك تغيير شعارك عن طريق تحميل صورة جديدة. يجب أن تكون الصورة PNG ويجب أن يكون تنسيقها 1:1.",
"admin.config.general.logo.placeholder": "اختر صورة",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "عنوان الرسالة لمستلمي المشاركة",
"admin.config.email.share-recipients-subject.description": "عنوان البريد الذي سيُرسَل لمستقبِلي المشاركة.",
"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 {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": "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.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-message": "رسالة المشاركة العكسية",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "السماح بالمشاركات غير المصادق عليها",
"admin.config.share.allow-unauthenticated-shares.description": "إتاحة إنشاء المشاركات للمستخدمين غير الموثقين",
"admin.config.share.max-expiration": "أبعد زمن لانتهاء الصلاحية",
"admin.config.share.max-expiration.description": "أطول زمن لانتهاء صلاحية المشاركات بالساعات. الصفر يعني أن المشاركة لن تنتهي صلاحيتها.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.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.description": "ضبط الميزان بين حجم الملف وسرعة الضغط. يمكنك إدخال قيم بين 0 إلى 9، حيث 0 تعني بدون ضغط و9 تعني أقصى ضغط. ",
"admin.config.share.chunk-size": "حجم القطعة",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "المنفذ",
"admin.config.smtp.port.description": "منفذ خادم الـSMTP",
"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.description": "اسم المستخدم لخادم الـSMTP",
"admin.config.smtp.password": "كلمة السر",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "رابط الاستكشاف لتطبيق OpenID Connect OAuth",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "طلب اسم المستخدم في رمز معرف OpenID Connect. إذا كنت لا تعرف معنى هذا الإعداد، اتركه فارغًا.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "هذه الصفحة غير موجودة.",
"404.button.home": "أعدني للصفحة الرئيسية",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "العودة",
"common.button.go-home": "العودة للصفحة الرئيسية",
"common.notify.copied": "تم نسخ الرابط إلى الحافظة",
"common.notify.copied-link": "تم نسخ الرابط إلى الحافظة",
"common.success": "تم",
"common.error": "خطأ",
"common.error.unknown": "حدث خطأ غير معروف",

View File

@@ -1,482 +0,0 @@
export default {
// Navbar
"navbar.upload": "Upload",
"navbar.signin": "Sign in",
"navbar.home": "Home",
"navbar.signup": "Sign up",
"navbar.links.shares": "My shares",
"navbar.links.reverse": "Обратни споделяния",
"navbar.avatar.account": "My account",
"navbar.avatar.admin": "Administration",
"navbar.avatar.signout": "Sign out",
// END navbar
// /
"home.title": "A <h>self-hosted</h> file sharing platform.",
"home.description": "Do you really want to give your personal files in the hand of third parties like WeTransfer?",
"home.bullet.a.name": "Self-Hosted",
"home.bullet.a.description": "Host Pingvin Share on your own machine.",
"home.bullet.b.name": "Privacy",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "No annoying file size limit",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Get started",
"home.button.source": "Source code",
// END /
// /auth/signin
"signin.title": "Welcome back",
"signin.description": "You don't have an account yet?",
"signin.button.signup": "Sign up",
"signin.input.email-or-username": "Email or username",
"signin.input.email-or-username.placeholder": "Your email or username",
"signin.input.password": "Password",
"signin.input.password.placeholder": "Your password",
"signin.button.submit": "Вписване",
"signIn.notify.totp-required.title": "Two-factor authentication required",
"signIn.notify.totp-required.description": "Please enter your two-factor authentication code",
"signIn.oauth.or": "OR",
"signIn.oauth.signInWith": "Sign in with",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
"signIn.oauth.discord": "Discord",
"signIn.oauth.oidc": "OpenID",
// END /auth/signin
// /auth/signup
"signup.title": "Create an account",
"signup.description": "Already have an account?",
"signup.button.signin": "Sign in",
"signup.input.username": "Username",
"signup.input.username.placeholder": "Your username",
"signup.input.email": "Email",
"signup.input.email.placeholder": "Your email",
"signup.button.submit": "Let's get started",
// END /auth/signup
// /auth/totp
"totp.title": "TOTP Authentication",
"totp.button.signIn": "Sign in",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Forgot your password?",
"resetPassword.description": "Enter your email to reset your password.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "Back to sign in page",
"resetPassword.text.resetPassword": "Reset password",
"resetPassword.text.enterNewPassword": "Въведете нова парола",
"resetPassword.input.password": "Нова парола",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account
"account.title": "My account",
"account.card.info.title": "Account info",
"account.card.info.username": "Username",
"account.card.info.email": "Email",
"account.notify.info.success": "Account updated successfully",
"account.card.password.title": "Password",
"account.card.password.old": "Old password",
"account.card.password.new": "New password",
"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.notify.password.success": "Password changed successfully",
"account.card.oauth.title": "Social login",
"account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link",
"account.card.oauth.unlink": "Unlink",
"account.card.oauth.unlinked": "Unlinked",
"account.modal.unlink.title": "Unlink account",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your login credentials",
"account.notify.oauth.unlinked.success": "Unlinked successfully",
"account.card.security.title": "Security",
"account.card.security.totp.enable.description": "Enter your current password to start enabling TOTP",
"account.card.security.totp.disable.description": "Enter your current password to disable TOTP",
"account.card.security.totp.button.start": "Start",
"account.modal.totp.title": "Enable TOTP",
"account.modal.totp.step1": "Step 1: Add your authenticator",
"account.modal.totp.step2": "Step 2: Validate your code",
"account.modal.totp.enterManually": "Enter manually",
"account.modal.totp.code": "Code",
"common.button.clickToCopy": "Click to copy",
"account.modal.totp.verify": "Verify",
"account.notify.totp.disable": "TOTP disabled successfully",
"account.notify.totp.enable": "TOTP enabled successfully",
"account.card.language.title": "Language",
"account.card.language.description": "The project is translated by the community. Some languages might be incomplete.",
"account.card.color.title": "Color scheme",
// ThemeSwitcher.tsx
"account.theme.dark": "Dark",
"account.theme.light": "Light",
"account.theme.system": "System",
"account.button.delete": "Delete Account",
"account.modal.delete.title": "Delete Account",
"account.modal.delete.description": "Do you really want to delete your account including all your active shares?",
// END /account
// /account/shares
"account.shares.title": "My shares",
"account.shares.title.empty": "It's empty here 👀",
"account.shares.description.empty": "You don't have any shares.",
"account.shares.button.create": "Create one",
"account.shares.info.title": "Share informations",
"account.shares.table.id": "ID",
"account.shares.table.name": "Име",
"account.shares.table.description": "Description",
"account.shares.table.visitors": "Посетители",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Size",
"account.shares.modal.share-informations": "Share informations",
"account.shares.modal.share-link": "Share link",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Do you really want to delete this share?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Reverse shares",
"account.reverseShares.description": "A reverse share allows you to generate a unique URL that allows external users to create a share.",
"account.reverseShares.title.empty": "It's empty here 👀",
"account.reverseShares.description.empty": "You don't have any reverse shares.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Create reverse share",
"account.reverseShares.modal.expiration.label": "Expiration",
"account.reverseShares.modal.expiration.minute-singular": "Minute",
"account.reverseShares.modal.expiration.minute-plural": "Minutes",
"account.reverseShares.modal.expiration.hour-singular": "Hour",
"account.reverseShares.modal.expiration.hour-plural": "Hours",
"account.reverseShares.modal.expiration.day-singular": "Day",
"account.reverseShares.modal.expiration.day-plural": "Days",
"account.reverseShares.modal.expiration.week-singular": "Week",
"account.reverseShares.modal.expiration.week-plural": "Weeks",
"account.reverseShares.modal.expiration.month-singular": "Month",
"account.reverseShares.modal.expiration.month-plural": "Months",
"account.reverseShares.modal.expiration.year-singular": "Year",
"account.reverseShares.modal.expiration.year-plural": "Years",
"account.reverseShares.modal.max-size.label": "Max share size",
"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.simplified": "Simple mode",
"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.public-access": "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.max-use.label": "Max uses",
"account.reverseShares.modal.max-use.description": "The maximum amount of times this URL can be used to create a share.",
"account.reverseShare.never-expires": "This reverse share will never expire.",
"account.reverseShare.expires-on": "This reverse share will expire on {expiration}.",
"account.reverseShares.table.no-shares": "No shares created yet",
"account.reverseShares.table.count.singular": "share",
"account.reverseShares.table.count.plural": "shares",
"account.reverseShares.table.shares": "Shares",
"account.reverseShares.table.remaining": "Remaining uses",
"account.reverseShares.table.max-size": "Max share size",
"account.reverseShares.table.expires": "Expires at",
"account.reverseShares.modal.reverse-share-link": "Reverse share link",
"account.reverseShares.modal.delete.title": "Delete reverse share",
"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.",
// END /account/reverseShares
// /admin
"admin.title": "Administration",
"admin.button.users": "User management",
"admin.button.shares": "Share management",
"admin.button.config": "Configuration",
"admin.version": "Version",
// END /admin
// /admin/users
"admin.users.title": "User management",
"admin.users.table.username": "Username",
"admin.users.table.email": "Email",
"admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Admin privileges",
"admin.users.edit.update.change-password.title": "Change password",
"admin.users.edit.update.change-password.field": "New password",
"admin.users.edit.update.change-password.button": "Save new password",
"admin.users.edit.update.notify.password.success": "Password changed successfully",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Create user",
"admin.users.modal.create.username": "Username",
"admin.users.modal.create.email": "Email",
"admin.users.modal.create.password": "Password",
"admin.users.modal.create.manual-password": "Set password manually",
"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.admin": "Admin privileges",
"admin.users.modal.create.admin.description": "If checked, the user will be able to access the admin panel.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Share management",
"admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Visitors",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
// END /admin/shares
// /upload
"upload.title": "Upload",
"upload.notify.generic-error": "An error occurred while finishing your share.",
"upload.notify.count-failed": "{count} files failed to upload. Trying again.",
// Dropzone.tsx
"upload.dropzone.title": "Upload files",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
"upload.dropzone.notify.file-too-big": "Your files exceed the maximum share size of {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Name",
"upload.filelist.size": "Size",
// showCreateUploadModal.tsx
"upload.modal.title": "Create Share",
"upload.modal.link.error.invalid": "Can only contain letters, numbers, underscores, and hyphens",
"upload.modal.link.error.taken": "This link is already in use",
"upload.modal.not-signed-in": "You're not signed in",
"upload.modal.not-signed-in-description": "You will be unable to delete your share manually and view the visitor count.",
"upload.modal.expires.never": "never",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Link",
"upload.modal.expires.label": "Expiration",
"upload.modal.expires.minute-singular": "Minute",
"upload.modal.expires.minute-plural": "Minutes",
"upload.modal.expires.hour-singular": "Hour",
"upload.modal.expires.hour-plural": "Hours",
"upload.modal.expires.day-singular": "Day",
"upload.modal.expires.day-plural": "Days",
"upload.modal.expires.week-singular": "Week",
"upload.modal.expires.week-plural": "Weeks",
"upload.modal.expires.month-singular": "Month",
"upload.modal.expires.month-plural": "Months",
"upload.modal.expires.year-singular": "Year",
"upload.modal.expires.year-plural": "Years",
"upload.modal.accordion.name-and-description.title": "Name and description",
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
"upload.modal.accordion.email.title": "Email recipients",
"upload.modal.accordion.email.placeholder": "Enter email recipients",
"upload.modal.accordion.email.invalid-email": "Invalid email address",
"upload.modal.accordion.security.title": "Security options",
"upload.modal.accordion.security.password.label": "Password protection",
"upload.modal.accordion.security.password.placeholder": "No password",
"upload.modal.accordion.security.max-views.label": "Maximum views",
"upload.modal.accordion.security.max-views.placeholder": "No limit",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "This share will never expire.",
"upload.modal.completed.expires-on": "This share will expire on {expiration}.",
"upload.modal.completed.share-ready": "Share ready",
"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.",
// END /upload
// /share/[id]
"share.title": "Share {shareId}",
"share.description": "Look what I've shared with you!",
"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.removed.title": "Share removed",
"share.error.not-found.title": "Share not found",
"share.error.not-found.description": "The share you're looking for doesn't exist.",
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.modal.password.title": "Password required",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Password",
"share.modal.error.invalid-password": "Invalid password",
"share.button.download-all": "Download all",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "File link",
"share.table.name": "Name",
"share.table.size": "Size",
"share.modal.file-preview.error.not-supported.title": "Preview not supported",
"share.modal.file-preview.error.not-supported.description": "Previews are not supported for this type of files. Please download the file to view it.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Edit {shareId}",
"share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /admin/config
"admin.config.title": "Configuration",
"admin.config.category.general": "General",
"admin.config.category.share": "Share",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login",
"admin.config.general.app-name": "App name",
"admin.config.general.app-name.description": "Name of the application",
"admin.config.general.app-url": "App URL",
"admin.config.general.app-url.description": "On which URL Pingvin Share is available",
"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.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.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.placeholder": "Pick image",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Share recipients subject",
"admin.config.email.share-recipients-subject.description": "Subject of the email which gets sent to the share recipients.",
"admin.config.email.share-recipients-message": "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 {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.reverse-share-subject": "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-message": "Reverse share message",
"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.reset-password-subject": "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-message": "Reset password message",
"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.invite-subject": "Invite subject",
"admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "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.share.allow-registration": "Allow registration",
"admin.config.share.allow-registration.description": "Whether registration is allowed",
"admin.config.share.allow-unauthenticated-shares": "Allow unauthenticated shares",
"admin.config.share.allow-unauthenticated-shares.description": "Whether unauthenticated users can create shares",
"admin.config.share.max-expiration": "Max expiration",
"admin.config.share.max-expiration.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"admin.config.share.max-size": "Max size",
"admin.config.share.max-size.description": "Maximum share size in bytes",
"admin.config.share.zip-compression-level": "Zip compression level",
"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.chunk-size": "Chunk size",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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.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.host": "Host",
"admin.config.smtp.host.description": "Host of the SMTP server",
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port of the SMTP server",
"admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Username",
"admin.config.smtp.username.description": "Username of the SMTP server",
"admin.config.smtp.password": "Password",
"admin.config.smtp.password.description": "Password of the SMTP server",
"admin.config.smtp.button.test": "Send test email",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
"admin.config.oauth.allow-registration": "Allow registration",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
"admin.config.oauth.ignore-totp": "Ignore TOTP",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
"admin.config.oauth.disable-password": "Disable password login",
"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.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
"admin.config.oauth.github-client-id": "GitHub Client ID",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app",
"admin.config.oauth.github-client-secret": "GitHub Client secret",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled",
"admin.config.oauth.google-client-id": "Google Client ID",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app",
"admin.config.oauth.google-client-secret": "Google Client secret",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled",
"admin.config.oauth.microsoft-tenant": "Microsoft 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-client-id": "Microsoft Client ID",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Whether Discord login is enabled",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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-guild": "Discord limited server 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-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app",
"admin.config.oauth.discord-client-secret": "Discord Client secret",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
"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-general-access": "OpenID Connect role for general access",
"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-admin-access": "OpenID Connect role for admin access",
"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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server",
"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-password": "Bind password",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"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-query": "User query",
"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.admin-groups": "Admin group",
"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.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.description": "LDAP attribute name for the email of an user.",
// 404
"404.description": "Oops this page doesn't exist.",
"404.button.home": "Bring me back home",
// error
"error.title": "Error",
"error.description": "Oops!",
"error.button.back": "Go back",
"error.msg.default": "Something went wrong.",
"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.invalid_token": "Internal Error",
"error.msg.no_user": "User linked to this {0} account doesn't exist.",
"error.msg.no_email": "Can't get email address from this {0} account.",
"error.msg.already_linked": "This {0} account is already linked to another account.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.user_not_allowed": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID Connect",
// Common translations
"common.button.save": "Save",
"common.button.create": "Create",
"common.button.submit": "Submit",
"common.button.delete": "Delete",
"common.button.cancel": "Cancel",
"common.button.confirm": "Confirm",
"common.button.disable": "Disable",
"common.button.share": "Share",
"common.button.generate": "Generate",
"common.button.done": "Done",
"common.text.link": "Link",
"common.text.navigate-to-link": "Visit link",
"common.text.or": "or",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Go back",
"common.button.go-home": "Go home",
"common.notify.copied": "Your link was copied to the clipboard",
"common.success": "Success",
"common.error": "Error",
"common.error.unknown": "An unknown error occurred",
"common.error.invalid-email": "Invalid email address",
"common.error.too-short": "Must be at least {length} characters",
"common.error.too-long": "Must be at most {length} characters",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Must be exactly {length} characters",
"common.error.invalid-number": "Must be a number",
"common.error.field-required": "This field is required"
};

View File

@@ -3,9 +3,9 @@ export default {
"navbar.upload": "Nahrát",
"navbar.signin": "Přihlásit se",
"navbar.home": "Domů",
"navbar.signup": "Sign up",
"navbar.signup": "Zaregistrovat se",
"navbar.links.shares": "Má sdílení",
"navbar.links.reverse": "Zpětná sdílení",
"navbar.links.reverse": "Opačná sdílení",
"navbar.avatar.account": "Můj účet",
"navbar.avatar.admin": "Administrace",
"navbar.avatar.signout": "Odhlásit se",
@@ -13,12 +13,12 @@ export default {
// /
"home.title": "<h>Samostatně hostovaná</h> platforma pro sdílení souborů.",
"home.description": "Opravdu chcete dát své osobní soubory do rukou třetích stran, jako je WeTransfer?",
"home.bullet.a.name": "Self-Hosted",
"home.bullet.a.name": "Vlastní hosting",
"home.bullet.a.description": "Hostujte Pingvin Share na svém vlastním počítači.",
"home.bullet.b.name": "Soukromí",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.b.description": "Vaše soubory jsou Vaše a nikdy k nim nebudou mít přístup třetí strany.",
"home.bullet.c.name": "Žádný otravný limit pro velikost souborů",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.bullet.c.description": "Nahrajte tak velké soubory, jak chcete. Limitem je pouze Váš pevný disk.",
"home.button.start": "Začít",
"home.button.source": "Zdrojový kód",
// END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password
"resetPassword.title": "Zapomněli jste heslo?",
"resetPassword.description": "Zadejte svůj e-mail pro obnovení hesla.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.notify.success": "Pokud e-mail existuje, byla na něj odeslána zpráva s odkazem k obnovení hesla.",
"resetPassword.button.back": "Zpět na přihlašovací stránku",
"resetPassword.text.resetPassword": "Obnovit heslo",
"resetPassword.text.enterNewPassword": "Zadejte své nové heslo",
"resetPassword.input.password": "Nové heslo",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "Vaše heslo bylo úspěšně obnoveno.",
// /account
"account.title": "Můj účet",
"account.card.info.title": "Informace o účtu",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Heslo",
"account.card.password.old": "Staré heslo",
"account.card.password.new": "Nové heslo",
"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": "Heslo není nastaveno. Pro přihlášení pomocí e-mailu a hesla je potřeba vytvořit heslo.",
"account.notify.password.success": "Heslo bylo úspěšně změněno",
"account.card.oauth.title": "Přihlášení přes sociální sítě",
"account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Odpojit",
"account.card.oauth.unlinked": "Odpojeno",
"account.modal.unlink.title": "Odpojit účet",
"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": "Odpojení vašich sociálních účtů může způsobit ztrátu účtu, pokud si nepamatujete své uživatelské jméno a heslo",
"account.notify.oauth.unlinked.success": "Úspěšně odpojeno",
"account.card.security.title": "Zabezpečení",
"account.card.security.totp.enable.description": "Zadejte své současné heslo, abyste mohli povolit TOTP",
@@ -115,27 +115,30 @@ export default {
"account.shares.title": "Má sdílení",
"account.shares.title.empty": "Je tu prázdno 👀",
"account.shares.description.empty": "Nemáte žádná sdílení.",
"account.shares.button.create": "Create one",
"account.shares.info.title": "Share informations",
"account.shares.button.create": "Vytvořit",
"account.shares.info.title": "Vlastnosti",
"account.shares.table.id": "ID",
"account.shares.table.name": "Název",
"account.shares.table.description": "Popis",
"account.shares.table.visitors": "Návštěvníci",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.expiresAt": "Vyprší",
"account.shares.table.createdAt": "Vytvořeno",
"account.shares.table.size": "Velikost",
"account.shares.modal.share-informations": "Share informations",
"account.shares.table.password-protected": "Chráněno heslem",
"account.shares.table.visitor-count": "{count} z {max}",
"account.shares.table.expiry-never": "Nikdy",
"account.shares.modal.share-informations": "Vlastnosti",
"account.shares.modal.share-link": "Odkaz na sdílení",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "Odstranit sdílení {share}",
"account.shares.modal.delete.description": "Opravdu chcete odstranit toto sdílení?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Zpětná sdílení",
"account.reverseShares.description": "Zpětné sdílení umožňuje vygenerovat jedinečné URL, které umožní externím uživatelům vytvořit sdílet soubory.",
"account.reverseShares.title": "Opačná sdílení",
"account.reverseShares.description": "Opačné sdílení umožňuje vygenerovat jedinečné URL, které umožní externím uživatelům vytvořit sdílet soubory.",
"account.reverseShares.title.empty": "Je tu prázdno 👀",
"account.reverseShares.description.empty": "Nemáte žádná zpětná sdílení.",
"account.reverseShares.description.empty": "Nemáte žádná opačná sdílení.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Vytvořit zpětné sdílení",
"account.reverseShares.modal.title": "Vytvořit opačné sdílení",
"account.reverseShares.modal.expiration.label": "Expirace",
"account.reverseShares.modal.expiration.minute-singular": "Minuta",
"account.reverseShares.modal.expiration.minute-plural": "Minut",
@@ -150,16 +153,16 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Rok",
"account.reverseShares.modal.expiration.year-plural": "Let",
"account.reverseShares.modal.max-size.label": "Max. velikost sdílení",
"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": "Odeslat oznámení e-mailem",
"account.reverseShares.modal.send-email.description": "Odešle vám e-mailové upozornění, až bude sdílení pomocí tohoto reverzního sdíleného odkazu vytvořeno.",
"account.reverseShares.modal.simplified": "Zjednodušený režim",
"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": "Usnadněte odesílateli sdílení souboru s Vámi. Budou moci pouze upravit název a popisek sdílení.",
"account.reverseShares.modal.public-access": "Veřejný přístup",
"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": "Zveřejnit soubory vytvořená tímto opačným sdílením. Pokud není povoleno, pouze Vy a tvůrce sdílení má práva k zobrazení.",
"account.reverseShares.modal.max-use.label": "Max. použití",
"account.reverseShares.modal.max-use.description": "Maximální počet sdílení, která mohou být vytvořena za pomoci tohoto URL.",
"account.reverseShare.never-expires": "Toto zpětné sdílení nikdy nevyprší.",
"account.reverseShare.expires-on": "Toto zpětné sdílení vyprší {expiration}.",
"account.reverseShare.never-expires": "Toto opačné sdílení nikdy nevyprší.",
"account.reverseShare.expires-on": "Toto opačné sdílení vyprší {expiration}.",
"account.reverseShares.table.no-shares": "Zatím nebyla vytvořena žádná sdílení",
"account.reverseShares.table.count.singular": "sdílení",
"account.reverseShares.table.count.plural": "sdílení",
@@ -167,9 +170,9 @@ export default {
"account.reverseShares.table.remaining": "Zbývající použití",
"account.reverseShares.table.max-size": "Max. velikost sdílení",
"account.reverseShares.table.expires": "Vyprší",
"account.reverseShares.modal.reverse-share-link": "Odkaz na zpětné sdílení",
"account.reverseShares.modal.delete.title": "Odstranit zpětné sdílení",
"account.reverseShares.modal.delete.description": "Opravdu chcete odstranit toto zpětné sdílení? Pokud tak učiníte, související sdílené budou také odstraněny.",
"account.reverseShares.modal.reverse-share-link": "Odkaz na opačné sdílení",
"account.reverseShares.modal.delete.title": "Odstranit opačné sdílení",
"account.reverseShares.modal.delete.description": "Opravdu chcete odstranit toto opačné sdílení? Pokud tak učiníte, související sdílení budou také odstraněny.",
// END /account/reverseShares
// /admin
"admin.title": "Administrace",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Uživatelské jméno",
"admin.users.table.email": "E-mail",
"admin.users.table.admin": "Administrátor",
"admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.title": "Upravit uživatele {username}",
"admin.users.edit.update.admin-privileges": "Administrátorská práva",
"admin.users.edit.update.change-password.title": "Změnit heslo",
"admin.users.edit.update.change-password.field": "Nové heslo",
"admin.users.edit.update.change-password.button": "Uložit nové heslo",
"admin.users.edit.update.notify.password.success": "Heslo bylo úspěšně změněno",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "Odstranit uživatele: {username}?",
"admin.users.edit.delete.description": "Opravdu chcete odstranit tohoto uživatele a všechny jeho soubory?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Vytvořit uživatele",
"admin.users.modal.create.username": "Uživatelské jméno",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "ID sdílení",
"admin.shares.table.username": "Autor",
"admin.shares.table.visitors": "Návštěvníci",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.table.expires": "Vyprší",
"admin.shares.edit.delete.title": "Odstranit sdílení: {id}",
"admin.shares.edit.delete.description": "Opravdu chcete smazat toto sdílení?",
// END /admin/shares
// /upload
"upload.title": "Nahrát",
"upload.notify.confirm-leave": "Opravdu chcete opustit tuto stránku? Vaše nahrávání bude zrušeno.",
"upload.notify.generic-error": "Při dokončování vašeho sdílení došlo k chybě.",
"upload.notify.count-failed": "{count} souborů se nepodařilo nahrát. Zkouším to znovu.",
"upload.reverse-share.error.invalid.title": "Neplatný odkaz na opačné sdílení",
"upload.reverse-share.error.invalid.description": "Toto opačné sdílení vypršelo nebo je neplatné.",
// Dropzone.tsx
"upload.dropzone.title": "Nahrát soubory",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
"upload.dropzone.description": "Pro spuštění sdílení, přetáhněte soubory sem. Můžete nahrát soubory o celkové velikosti {maxSize}.",
"upload.dropzone.notify.file-too-big": "Vaše soubory přesahují maximální velikost {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Název",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Nejste přihlášeni",
"upload.modal.not-signed-in-description": "Nebudete moci ručně odstranit své sdílení a zobrazit počet návštěvníků.",
"upload.modal.expires.never": "nikdy",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "Trvalé sdílení",
"upload.modal.expires.error.too-long": "Datum vypršení platnosti překračuje maximum {max}.",
"upload.modal.link.label": "Odkaz",
"upload.modal.expires.label": "Expirace",
"upload.modal.expires.minute-singular": "Minuta",
@@ -259,11 +265,12 @@ export default {
"upload.modal.completed.never-expires": "Toto sdílení nikdy nevyprší.",
"upload.modal.completed.expires-on": "Toto sdílení vyprší {expiration}.",
"upload.modal.completed.share-ready": "Sdílení připraveno",
"upload.modal.completed.notified-reverse-share-creator": "Upozornili jsme tvůrce zpětného sdílení. Můžete s nimi také ručně sdílet tento odkaz jiným způsobem.",
"upload.modal.completed.notified-reverse-share-creator": "Upozornili jsme tvůrce opačného sdílení. Můžete s nimi také ručně sdílet tento odkaz jiným způsobem.",
// END /upload
// /share/[id]
"share.title": "Sdílení {shareId}",
"share.description": "Podívejte se, co jsem s vámi sdílel!",
"share.fileCount": "{count, plural, =1 {# soubor} other {# soubory}} · {size} (Archiv může být menší díky kompresi)",
"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.removed.title": "Sdílení bylo odstraněno",
@@ -272,16 +279,16 @@ export default {
"share.error.access-denied.title": "Soukromé sdílení",
"share.error.access-denied.description": "Aktuální účet nemá oprávnění k přístupu k tomuto sdílení",
"share.modal.password.title": "Heslo vyžadováno",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Zadejte prosím heslo pro přístup k tomuto sdíleni.",
"share.modal.password": "Heslo",
"share.modal.error.invalid-password": "Neplatné heslo",
"share.button.download-all": "Stáhnout vše",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.notify.download-all-preparing": "Sdílení se připravuje. Zkuste to prosím znovu za několik minut.",
"share.modal.file-link": "Odkaz na soubor",
"share.table.name": "Název",
"share.table.size": "Velikost",
"share.modal.file-preview.error.not-supported.title": "Náhled není podporován",
"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": "Náhledy nejsou podporovány pro tento typ souborů. Stáhněte si soubor pro jeho zobrazení.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Upravit {shareId}",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Při dokončování vašeho sdílení došlo k chybě.",
"share.edit.notify.save-success": "Sdílení úspěšně aktualizováno",
// END /share/[id]/edit
// /imprint
"imprint.title": "Tiráž",
// END /imprint
// /privacy
"privacy.title": "Zásady ochrany osobních údajů",
// END /privacy
// /admin/config
"admin.config.config-file-warning.title": "Konfigurační soubor existuje",
"admin.config.config-file-warning.description": "Jelikož je Pingvin Share nastaven pomocí konfiguračního souboru, nemůžete změnit nastavení přes UI.",
"admin.config.title": "Nastavení",
"admin.config.category.general": "Obecné",
"admin.config.category.share": "Sdílení",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "E-mail",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Přihlášení přes sociální sítě",
@@ -300,53 +316,65 @@ export default {
"admin.config.general.app-name.description": "Název aplikace",
"admin.config.general.app-url": "URL aplikace",
"admin.config.general.app-url.description": "Na kterém URL je Pingvin Share k dispozici",
"admin.config.general.secure-cookies": "Bezpečné cookies",
"admin.config.general.secure-cookies.description": "Určuje, zda se má nastavit zabezpečený příznak v cookies. Pokud je povoleno, stránka nebude přístupná přes HTTP.",
"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.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": "Čas, po kterém se uživatel musí znovu přihlásit (výchozí: 3 měsíce).",
"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.placeholder": "Vybrat obrázek",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Share recipients subject",
"admin.config.email.share-recipients-subject.description": "Subject of the email which gets sent to the share recipients.",
"admin.config.email.share-recipients-message": "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 {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.reverse-share-subject": "Předmět e-mailu o zpětném sdílení",
"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-message": "Zpráva o zpětném sdílení",
"admin.config.email.reverse-share-message.description": "Zpráva, která bude odeslána, když někdo vytvoří sdílení s vaším odkazem na zpětné sdílení. {shareUrl} bude nahrazeno jménem tvůrce a URL pro sdílení.",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Sdílení přes e-mail",
"admin.config.email.enable-share-email-recipients.description": "Určuje, zdali je povoleno sdílení souborů přes e-mail. Povolte pouze pokud je aktivováno SMTP.",
"admin.config.email.share-recipients-subject": "Předmět pro příjemce",
"admin.config.email.share-recipients-subject.description": "Předmět e-mailu, který bude odeslán adresátovi.",
"admin.config.email.share-recipients-message": "Zpráva pro příjemce",
"admin.config.email.share-recipients-message.description": "Zpráva, která bude odeslána adresátům. Dostupné proměnné:\n {creator} - Uživatelské jméno tvůrce sdílení\n {shareUrl} - Odkaz sdílení\n {desc} - Popis sdílení\n {expires} - Datum vypršení platnosti sdílení\n Proměnné budou nahrazeny skutečnou hodnotou.",
"admin.config.email.reverse-share-subject": "Předmět e-mailu o opačném sdílení",
"admin.config.email.reverse-share-subject.description": "Předmět e-mailu, když někdo vytvoří sdílení s Vaším odkazem na opačné sdílení.",
"admin.config.email.reverse-share-message": "Zpráva o opačném sdílení",
"admin.config.email.reverse-share-message.description": "Zpráva, která bude odeslána, když někdo vytvoří sdílení s vaším odkazem na opačné sdílení. {shareUrl} bude nahrazeno jménem tvůrce a URL pro sdílení.",
"admin.config.email.reset-password-subject": "Předmět e-mailu pro obnovení hesla",
"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": "Předmět e-mailu, když uživatel požádá o obnovení hesla.",
"admin.config.email.reset-password-message": "Zpráva o obnovení hesla",
"admin.config.email.reset-password-message.description": "Zpráva, která bude odeslána, když uživatel požádá o obnovení hesla. {url} bude nahrazeno URL pro obnovení hesla.",
"admin.config.email.invite-subject": "Předmět pozvánky",
"admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-subject.description": "Předmět e-mailu, když administrátor pozve uživatele.",
"admin.config.email.invite-message": "Zpráva pozvánky",
"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": "Zpráva, která bude odeslána, když administrátor pozve uživatele. {url} bude nahrazeno odkazem, {email} e-mailem a {password} heslem uživatele.",
"admin.config.share.allow-registration": "Povolit registraci",
"admin.config.share.allow-registration.description": "Zda je registrace povolena",
"admin.config.share.allow-unauthenticated-shares": "Povolit sdílení neověřeným uživatelům",
"admin.config.share.allow-unauthenticated-shares.description": "Zda mohou neověření uživatelé vytvářet sdílení",
"admin.config.share.max-expiration": "Max. platnost",
"admin.config.share.max-expiration.description": "Maximální platnost sdílení v hodinách. Nastavte na 0 k povolení neomezené platnosti.",
"admin.config.share.max-expiration.description": "Maximální platnost sdílení. Nastavte 0 pro neomezenou platnost.",
"admin.config.share.share-id-length": "Výchozí délka sdílení ID",
"admin.config.share.share-id-length.description": "Výchozí délka pro generované ID sdílení. Tato hodnota se používá také pro generování odkazů na opačné sdílení. Hodnota nižší než 8 se nepovažuje za bezpečnou.",
"admin.config.share.max-size": "Max. velikost",
"admin.config.share.max-size.description": "Maximální velikost sdílení v bajtech",
"admin.config.share.zip-compression-level": "Úroveň Zip komprese",
"admin.config.share.zip-compression-level.description": "Upravte úroveň pro rovnováhu mezi velikostí souboru a rychlostí komprese. Platné hodnoty se pohybují od 0 do 9, přičemž 0 znamená bez komprese a 9 je maximální komprese. ",
"admin.config.share.chunk-size": "Velikost bloku",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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": "Upravte velikost bloku pro vaše nahrávání tak, aby byla vyvážena efektivita a spolehlivost podle vašeho internetového připojení. Menší bloky mohou zvýšit spolehlivost nestabilních spojení, zatímco větší bloky urychlují nahrávání při stabilním spojení.",
"admin.config.share.auto-open-share-modal": "Automaticky otevřít menu vytvoření sdílení",
"admin.config.share.auto-open-share-modal.description": "Menu vytvoření sdílení se automaticky zobrazí, když uživatel vybere soubory, čímž se eliminuje potřeba ručně kliknout na tlačítko.",
"admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled": "Povolit",
"admin.config.smtp.enabled.description": "Zda je SMTP povoleno. Povolte pouze pokud jste zadali hostitele, port, e-mail, uživatele a heslo vašeho SMTP serveru.",
"admin.config.smtp.host": "Hostitel",
"admin.config.smtp.host.description": "Hostitel SMTP serveru",
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port SMTP serveru",
"admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.email.description": "E-mailová adresa, ze které budou e-maily odesílány",
"admin.config.smtp.username": "Uživatelské jméno",
"admin.config.smtp.username.description": "Uživatelské jméno SMTP serveru",
"admin.config.smtp.password": "Heslo",
@@ -365,71 +393,104 @@ export default {
"admin.config.oauth.github-client-id": "GitHub Client ID",
"admin.config.oauth.github-client-id.description": "Client ID GitHub OAuth aplikace",
"admin.config.oauth.github-client-secret": "GitHub Client secret",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app",
"admin.config.oauth.github-client-secret.description": "Client secret aplikace GitHub OAuth",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Zda je povoleno přihlášení přes Google",
"admin.config.oauth.google-client-id": "Google Client ID",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app",
"admin.config.oauth.google-client-id.description": "Client ID aplikace Google OAuth",
"admin.config.oauth.google-client-secret": "Google Client secret",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app",
"admin.config.oauth.google-client-secret.description": "Client secret aplikace Google OAuth",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Zda je povoleno přihlášení přes Microsoft",
"admin.config.oauth.microsoft-tenant": "Microsoft 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": "Tenant ID aplikace Microsoft OAuth\nběžné: Uživatelé s osobním účtem Microsoft a pracovním nebo školním účtem Microsoft Entra ID se mohou přihlásit do aplikace. \n\norganizace: Do aplikace se mohou přihlásit pouze uživatelé s pracovním nebo školním účtem Microsoft Entra ID.\n\nspotřebitelé: Do aplikace se mohou přihlásit pouze uživatelé s osobním účtem Microsoft.\n\nNázev domény Microsoft Entra tenant nebo tenant ID ve formátu GUID: Do aplikace se mohou přihlásit pouze uživatelé z konkrétní Microsoft Entra tenant (členové adresáře s pracovním nebo školním účtem nebo návštěvníci adresáře s osobním účtem Microsoft).",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app",
"admin.config.oauth.microsoft-client-id.description": "Client ID Microsoft OAuth aplikace",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app",
"admin.config.oauth.microsoft-client-secret.description": "Client secret Microsoft OAuth aplikace",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Zda je povoleno přihlášení přes Discord",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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-guild": "Discord limited server ID",
"admin.config.oauth.discord-limited-users": "Discord povolení uživatelé",
"admin.config.oauth.discord-limited-users.description": "Povolit přístup pouze uživatelům se zadanými Discord ID. Ponechte prázdné pro zakázání.",
"admin.config.oauth.discord-limited-guild": "Discord povolené ID serveru",
"admin.config.oauth.discord-limited-guild.description": "Omezit přihlášení na uživatele na konkrétním serveru. Ponechte prázdné pro vypnutí.",
"admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app",
"admin.config.oauth.discord-client-id.description": "Client ID Discord OAuth aplikace",
"admin.config.oauth.discord-client-secret": "Discord Client secret",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
"admin.config.oauth.discord-client-secret.description": "Client secret Discord OAuth aplikace",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Zda je povoleno přihlášení přes OpenID Connect",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
"admin.config.oauth.oidc-discovery-uri": "Adresa OpenID Connect Discovery",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URL OpenID Connect OAuth aplikace",
"admin.config.oauth.oidc-sign-out": "Odhlásit se z OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Zda tlačítko \"Odhlásit\" odhlásí od poskytovatele OpenID Connect",
"admin.config.oauth.oidc-scope": "OpenID Connect informace",
"admin.config.oauth.oidc-scope.description": "Informace, které by měly být požadovány od poskytovatele OpenID Connect.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect požadavek uživatele",
"admin.config.oauth.oidc-username-claim.description": "Požadavek uživatele v OpenID Connect ID tokenu. Ponechte prázdné, pokud netušíte.",
"admin.config.oauth.oidc-role-path": "Cesta k rolím v OpenID Connect token",
"admin.config.oauth.oidc-role-path.description": "Musí být platná JMES cesta odkazující na pole rolí. " + "Správa přístupových práv pomocí OpenID Connect rolí je doporučena pouze v případě, že není nastaven žádný jiný poskytovatel identity a přihlášení heslem je zakázáno. " + "Ponechte prázdné, pokud nevíte, co tato konfigurace znamená.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role pro obecný přístup",
"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. " + "Ponechte prázdné, pokud nevíte, co tato konfigurace znamená.",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
"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. " + "Ponechte prázdné, pokud nevíte, co tato konfigurace znamená.",
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-role-general-access.description": "Požadovaná role pro všeobecný přístup. Musí být přítomna v uživatelských rolích, aby se mohli přihlásit." + "Ponechte prázdné, pokud nevíte, co tato konfigurace znamená.",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role pro přístup správce.",
"admin.config.oauth.oidc-role-admin-access.description": "Požadovaná role pro přístup správce. Musí být přítomna v uživatelských rolích, pro přístup do panelu správce." + "Ponechte prázdné, pokud nevíte, co tato konfigurace znamená.",
"admin.config.oauth.oidc-client-id": "OpenID Connect ID klienta",
"admin.config.oauth.oidc-client-id.description": "ID klienta OpenID Connect OAuth aplikace",
"admin.config.oauth.oidc-client-secret": "OpenID Connect secret klienta",
"admin.config.oauth.oidc-client-secret.description": "Secret klienta OpenID Connect OAuth aplikace",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.enabled": "Povolit LDAP",
"admin.config.ldap.enabled.description": "Použít LDAP ověření pro přihlášení uživatele",
"admin.config.ldap.url": "URL serveru",
"admin.config.ldap.url.description": "URL of the LDAP server",
"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-password": "Bind password",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"admin.config.ldap.search-base": "User base",
"admin.config.ldap.url.description": "Adresa LDAP serveru",
"admin.config.ldap.bind-dn": "Propojit DN",
"admin.config.ldap.bind-dn.description": "Výchozí uživatel pro vyhledávání uživatelů",
"admin.config.ldap.bind-password": "Propojit heslo",
"admin.config.ldap.bind-password.description": "Heslo pro vyhledávání uživatelů",
"admin.config.ldap.search-base": "Uživatelská větev",
"admin.config.ldap.search-base.description": "Základní umístění, kde budou prováděna hledání uživatelů",
"admin.config.ldap.search-query": "User query",
"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.admin-groups": "Admin group",
"admin.config.ldap.search-query": "Dotaz na uživatele",
"admin.config.ldap.search-query.description": "Dotaz na uživatele pro vyhledání 'Uživatelské větve' pro LDAP uživatele. %username% může být použit jako zástupce pro hodnotu zadanou uživatelem.",
"admin.config.ldap.admin-groups": "Skupina správců",
"admin.config.ldap.admin-groups.description": "Skupina potřebná pro administrativní přístup.",
"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-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-member-of": "Název atributu skupin uživatelů",
"admin.config.ldap.field-name-member-of.description": "LDAP název atributu pro skupiny, jejichž členem je uživatel. Používá se při kontrole skupiny správců.",
"admin.config.ldap.field-name-email": "Název atributu e-mailu uživatele",
"admin.config.ldap.field-name-email.description": "Název atributu LDAP pro e-mail uživatele.",
"admin.config.notify.success": "Konfigurace byla úspěšně aktualizována!",
"admin.config.notify.logo-success": "Logo bylo úspěšně aktualizováno. Zobrazení změny může několik minut trvat.",
"admin.config.notify.no-changes": "Žádné změny k uložení.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Povoleno",
"admin.config.s3.enabled.description": "Zda má být S3 použito k ukládání sdílených souborů namísto lokálního souborového systému.",
"admin.config.s3.endpoint": "Koncový bod",
"admin.config.s3.endpoint.description": "URL bloku S3.",
"admin.config.s3.region": "Oblast",
"admin.config.s3.region.description": "Oblast bloku S3.",
"admin.config.s3.bucket-name": "Název bloku",
"admin.config.s3.bucket-name.description": "Název bloku S3.",
"admin.config.s3.bucket-path": "Cesta",
"admin.config.s3.bucket-path.description": "Výchozí cesta, která by měla být použita pro ukládání souborů do bloku S3.",
"admin.config.s3.key": "Klíč",
"admin.config.s3.key.description": "Klíč, který vám umožňuje přístup k bloku S3.",
"admin.config.s3.secret": "Tajný klíč (Secret)",
"admin.config.s3.secret.description": "Tajný kód, který vám umožňuje přístup do bloku S3.",
"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": "Právní ustanovení",
"admin.config.legal.enabled": "Povolit právní oznámení",
"admin.config.legal.enabled.description": "Zda v zápatí zobrazit odkaz na tiráž a zásady ochrany osobních údajů.",
"admin.config.legal.imprint-text": "Text tiráže",
"admin.config.legal.imprint-text.description": "Text, který by měl být zobrazen v tiráži. Podporuje Markdown. Ponechte prázdné pro odkaz na stránku s externí tiráží.",
"admin.config.legal.imprint-url": "Adresa tiráže",
"admin.config.legal.imprint-url.description": "Pokud již máte stránku s tiráží, můžete ji propojit zde místo použití textového pole.",
"admin.config.legal.privacy-policy-text": "Text zásad ochrany osobních údajů",
"admin.config.legal.privacy-policy-text.description": "Text, který by měl být zobrazen v zásadách ochrany osobních údajů. Podporuje Markdown. Ponechte prázdné pro odkaz na stránku s externími zásadami ochrany osobních údajů.",
"admin.config.legal.privacy-policy-url": "Adresa zásad ochrany soukromí",
"admin.config.legal.privacy-policy-url.description": "Pokud již máte stránku o zásadách ochrany osobních údajů, můžete ji propojit zde místo použití textového pole.",
// 404
"404.description": "Jejda, tato stránka neexistuje.",
"404.button.home": "Bring me back home",
"404.button.home": "Návrat na hlavní stránku",
// error
"error.title": "Chyba",
"error.description": "Jejda!",
@@ -441,10 +502,10 @@ export default {
"error.msg.no_user": "Uživatel propojený s tímto účtem {0} neexistuje.",
"error.msg.no_email": "Z tohoto účtu {0} nelze získat e-mailovou adresu.",
"error.msg.already_linked": "Tento účet {0} je již propojen s jiným účtem.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.not_linked": "Tento účet {0} ještě nebyl propojen s žádným účtem.",
"error.msg.unverified_account": "Tento účet {0} není ověřen, zkuste to prosím znovu po ověření.",
"error.msg.user_not_allowed": "Nemáte oprávnění k přihlášení.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.msg.cannot_get_user_info": "Nelze získat informace o uživateli z tohoto účtu {0}.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
@@ -462,20 +523,21 @@ export default {
"common.button.generate": "Generovat",
"common.button.done": "Hotovo",
"common.text.link": "Odkaz",
"common.text.navigate-to-link": "Visit link",
"common.text.navigate-to-link": "Navštívit odkaz",
"common.text.or": "nebo",
"common.text.redirecting": "Redirecting...",
"common.text.redirecting": "Přesměrování...",
"common.button.go-back": "Vrátit se zpět",
"common.button.go-home": "Jít domů",
"common.notify.copied": "Váš odkaz byl zkopírován do schránky",
"common.notify.copied-link": "Váš odkaz byl zkopírován do schránky",
"common.success": "Úspěch",
"common.error": "Chyba",
"common.error.unknown": "Došlo k neznámé chybě",
"common.error.invalid-email": "Invalid email address",
"common.error.invalid-email": "Neplatná e-mailová adresa",
"common.error.too-short": "Musí mít alespoň {length} znaků",
"common.error.too-long": "Musí mít maximálně {length} znaků",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.number-too-small": "Musí být minimálně {min}",
"common.error.number-too-large": "Musí být nejvýše {max}",
"common.error.exact-length": "Musí mít přesně {length} znaků",
"common.error.invalid-number": "Musí být číslo",
"common.error.field-required": "Toto pole je povinné"

View File

@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Størrelse",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Share informations",
"account.shares.modal.share-link": "Del link",
"account.shares.modal.delete.title": "Delete share: {share}",
@@ -155,7 +158,7 @@ export default {
"account.reverseShares.modal.simplified": "Simple mode",
"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.public-access": "Offentlig adgang",
"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": "Lav filerne i denne omvendte deling offentlige. Hvis deaktiveret kan kun dig og delingens ejer have adgang til filerne.",
"account.reverseShares.modal.max-use.label": "Maksimal anvendelser",
"account.reverseShares.modal.max-use.description": "Det maksimale antal gange, denne URL kan bruges til at oprette en deling.",
"account.reverseShare.never-expires": "Denne omvendte deling udløber aldrig.",
@@ -204,16 +207,19 @@ export default {
// /admin/shares
"admin.shares.title": "Share management",
"admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator",
"admin.shares.table.username": "Ejer",
"admin.shares.table.visitors": "Besøgende",
"admin.shares.table.expires": "Expires on",
"admin.shares.table.expires": "Udløber",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
// END /admin/shares
// /upload
"upload.title": "Upload",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Der opstod en fejl under afslutningen af din deling.",
"upload.notify.count-failed": "{count} files failed to upload. Trying again.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Upload filer",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -257,13 +263,14 @@ export default {
"upload.modal.accordion.security.max-views.placeholder": "Ingen begrænsning",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Denne deling vil aldrig udløbe.",
"upload.modal.completed.expires-on": "Denne omvendte deling udløber den {expiration}.",
"upload.modal.completed.expires-on": "Denne deling udløber den {expiration}.",
"upload.modal.completed.share-ready": "Delingen er klar",
"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.",
// END /upload
// /share/[id]
"share.title": "Del {shareId}",
"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.description": "Besøgsgrænsen for denne deling er blevet overskredet.",
"share.error.removed.title": "Deling fjernet",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Privat deling",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.modal.password.title": "Adgangskode påkrævet",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Adgangskode",
"share.modal.error.invalid-password": "Ugyldig adgangskode",
"share.button.download-all": "Download alle",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Deling opdateret",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Generelt",
"admin.config.category.share": "Del",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "E-mail",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Navnet på applikationen",
"admin.config.general.app-url": "App URL",
"admin.config.general.app-url.description": "På hvilken URL Pingvin Share er tilgængelig",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "Vis forside",
"admin.config.general.show-home-page.description": "Om forsiden skal vises",
"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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Share recipients subject",
"admin.config.email.share-recipients-subject.description": "Subject of the email which gets sent to the share recipients.",
"admin.config.email.share-recipients-message": "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 {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": "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.reverse-share-subject": "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-message": "Reverse share message",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Tillad uautoriserede delinger",
"admin.config.share.allow-unauthenticated-shares.description": "Whether unauthenticated users can create shares",
"admin.config.share.max-expiration": "Maks. udløb",
"admin.config.share.max-expiration.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Maks. størrelse",
"admin.config.share.max-size.description": "Maksimal filstørrelse i bytes",
"admin.config.share.max-size.description": "Maksimal filstørrelse",
"admin.config.share.zip-compression-level": "Zip compression level",
"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.chunk-size": "Chunk size",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Porten til SMTP serveren",
"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.description": "Brugernavnet til SMTP serveren",
"admin.config.smtp.password": "Adgangskode",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Ups! Denne side findes ikke.",
"404.button.home": "Gå tilbage",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Gå tilbage",
"common.button.go-home": "Go home",
"common.notify.copied": "Linket blev kopieret til udklipsholderen",
"common.notify.copied-link": "Linket blev kopieret til udklipsholderen",
"common.success": "Success",
"common.error": "Fejl",
"common.error.unknown": "En ukendt fejl opstod",

View File

@@ -3,9 +3,9 @@ export default {
"navbar.upload": "Hochladen",
"navbar.signin": "Anmelden",
"navbar.home": "Startseite",
"navbar.signup": "Anmelden",
"navbar.signup": "Registrieren",
"navbar.links.shares": "Meine Freigaben",
"navbar.links.reverse": "Externe Freigaben",
"navbar.links.reverse": "Datei Anfrage",
"navbar.avatar.account": "Mein Konto",
"navbar.avatar.admin": "Verwaltung",
"navbar.avatar.signout": "Abmelden",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Selbst gehostet",
"home.bullet.a.description": "Betreibe Pingvin Share auf deinem eigenen Server.",
"home.bullet.b.name": "Privatsphäre",
"home.bullet.b.description": "Ihre Dateien gehören Ihnen und werden niemals von Dritten zugänglich gemacht.",
"home.bullet.b.description": "Deine Dateien gehören dir und sind niemals durch Dritte zugänglich.",
"home.bullet.c.name": "Keine lästige Dateigrößenbegrenzung",
"home.bullet.c.description": " Laden Sie so große Dateien hoch, wie Sie wollen. Nur Ihre Festplatte ist Ihr Limit.",
"home.bullet.c.description": "Lade so große Dateien hoch, wie du willst. Nur deine Festplatte ist dein Limit.",
"home.button.start": "Lege los",
"home.button.source": "Quellcode",
// END /
@@ -26,13 +26,13 @@ export default {
"signin.title": "Willkommen zurück",
"signin.description": "Du hast noch kein Konto?",
"signin.button.signup": "Registrieren",
"signin.input.email-or-username": "Email oder Benutzername",
"signin.input.email-or-username.placeholder": "Deine Email Adresse oder Benutzername",
"signin.input.email-or-username": "E-Mail oder Benutzername",
"signin.input.email-or-username.placeholder": "Deine E-Mail-Adresse oder Benutzername",
"signin.input.password": "Passwort",
"signin.input.password.placeholder": "Dein Passwort",
"signin.button.submit": "Anmelden",
"signIn.notify.totp-required.title": "Zwei-Faktor-Authentifizierung benötigt",
"signIn.notify.totp-required.description": "Bitte füge deinen Zwei-Faktor-Authentifizierungscode ein",
"signIn.notify.totp-required.description": "Bitte gib deinen Zwei-Faktor-Authentifizierungscode ein",
"signIn.oauth.or": "ODER",
"signIn.oauth.signInWith": "Anmelden mit",
"signIn.oauth.github": "GitHub",
@@ -47,8 +47,8 @@ export default {
"signup.button.signin": "Anmelden",
"signup.input.username": "Benutzername",
"signup.input.username.placeholder": "Dein Benutzername",
"signup.input.email": "Email",
"signup.input.email.placeholder": "Deine Emailadresse",
"signup.input.email": "E-Mail",
"signup.input.email.placeholder": "Deine E-Mail-Adresse",
"signup.button.submit": "Lass uns loslegen",
// END /auth/signup
// /auth/totp
@@ -57,13 +57,13 @@ export default {
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Passwort vergessen?",
"resetPassword.description": "Gib deine Email Adresse ein, um dein Passwort zurückzusetzen.",
"resetPassword.description": "Gib deine E-Mail-Adresse ein, um dein Passwort zurückzusetzen.",
"resetPassword.notify.success": "Wir haben dir einen Link gesendet, unter dem du dein Passwort zurücksetzen kannst.",
"resetPassword.button.back": "Zurück zur Anmeldeseite",
"resetPassword.text.resetPassword": "Passwort zurücksetzen",
"resetPassword.text.enterNewPassword": "Gib dein neues Passwort ein",
"resetPassword.input.password": "Neues Passwort",
"resetPassword.notify.passwordReset": "Ihr Passwort wurde erfolgreich zurückgesetzt",
"resetPassword.notify.passwordReset": "Dein Passwort wurde erfolgreich zurückgesetzt.",
// /account
"account.title": "Mein Konto",
"account.card.info.title": "Kontoinformationen",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Verknüpfung aufheben",
"account.card.oauth.unlinked": "Verknüpfung aufgehoben",
"account.modal.unlink.title": "Kontoverknüpfung aufheben",
"account.modal.unlink.description": "Die Aufhebung der Verknüpfung mit Ihren sozialen Konten kann dazu führen, dass Sie Ihr Konto verlieren, wenn Sie sich nicht an Ihren Anmeldedaten erinnern",
"account.modal.unlink.description": "Die Aufhebung der Verknüpfung mit deinen sozialen Konten kann dazu führen, dass du dein Konto verlierst, wenn du dich nicht an deine Anmeldedaten erinnerst",
"account.notify.oauth.unlinked.success": "Verknüpfung erfolgreich aufgehoben",
"account.card.security.title": "Sicherheit",
"account.card.security.totp.enable.description": "Gib dein aktuelles Passwort ein, um TOTP zu aktivieren",
@@ -124,16 +124,19 @@ export default {
"account.shares.table.expiresAt": "Läuft ab am",
"account.shares.table.createdAt": "Angelegt am",
"account.shares.table.size": "Größe",
"account.shares.table.password-protected": "Passwortgeschützt",
"account.shares.table.visitor-count": "{count} von {max}",
"account.shares.table.expiry-never": "nie",
"account.shares.modal.share-informations": "Teile deine Information",
"account.shares.modal.share-link": "Freigabe teilen",
"account.shares.modal.delete.title": "Freigabe löschen: {share}",
"account.shares.modal.delete.description": "Möchtest du wirklich diese Freigabe löschen?",
"account.shares.modal.delete.description": "Möchtest du diese Freigabe wirklich löschen?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Externe Freigaben",
"account.reverseShares.description": "Eine externe Freigabe erlaubt dir eine einzigartige URL zu erstellen, die externen Benutzern erlaubt, Dateien hochzuladen.",
"account.reverseShares.title": "Datei Anfragen",
"account.reverseShares.description": "Eine Datei Anfrage erlaubt dir eine einzigartige URL zu erstellen, die externen Benutzern erlaubt, Dateien hochzuladen.",
"account.reverseShares.title.empty": "Es ist leer hier 👀",
"account.reverseShares.description.empty": "Du hast keine externen Freigaben erstellt.",
"account.reverseShares.description.empty": "Du hast keine Datei Anfrage.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Externe Freigabe erstellen",
"account.reverseShares.modal.expiration.label": "Gültig bis",
@@ -150,16 +153,16 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Jahr",
"account.reverseShares.modal.expiration.year-plural": "Jahre",
"account.reverseShares.modal.max-size.label": "Maximale Freigabegröße",
"account.reverseShares.modal.send-email": "E-Mail-Benachrichtigungen senden",
"account.reverseShares.modal.send-email": "E-Mail Benachrichtigungen senden",
"account.reverseShares.modal.send-email.description": "Sendet eine E-Mail Benachrichtigung, wenn eine Datei auf Ihrer externen Freigabe hochgeladen wurde.",
"account.reverseShares.modal.simplified": "Einfacher Modus",
"account.reverseShares.modal.simplified.description": "Mache es der Person, die die Datei hochlädt, einfach, sie mit dir zu teilen. Sie werden nur den Namen und die Beschreibung der Freigabe ändern können.",
"account.reverseShares.modal.public-access": "Öffentlicher Zugriff",
"account.reverseShares.modal.public-access.description": "Erstelle die Freigaben der externen Freigabe öffentlich. Wenn dies deaktiviert ist, haben nur Sie und der Ersteller der Freigabe Zugriff darauf.",
"account.reverseShares.modal.public-access.description": "Mache die Freigaben die mit dieser externen Freigabe erstellt werden öffentlich. Wenn dies deaktiviert ist, haben nur du und der Ersteller der Freigabe Zugriff darauf.",
"account.reverseShares.modal.max-use.label": "Maximale Nutzungen",
"account.reverseShares.modal.max-use.description": "Die maximale Anzahl von Verwendungen der URL, um Dateien hochzuladen.",
"account.reverseShare.never-expires": "Diese externe Freigabe wird nicht ablaufen.",
"account.reverseShare.expires-on": "Diese Reverse Share läuft am {expiration} ab.",
"account.reverseShare.expires-on": "Diese externe Freigabe wird am {expiration} ablaufen.",
"account.reverseShares.table.no-shares": "Noch keine Freigaben erstellt",
"account.reverseShares.table.count.singular": "Freigabe",
"account.reverseShares.table.count.plural": "Freigaben",
@@ -168,8 +171,8 @@ export default {
"account.reverseShares.table.max-size": "Maximale Freigabegröße",
"account.reverseShares.table.expires": "Läuft ab am",
"account.reverseShares.modal.reverse-share-link": "Link zu externer Freigabe",
"account.reverseShares.modal.delete.title": "Lösche externe Freigabe",
"account.reverseShares.modal.delete.description": "Möchtest du wirklich diese externe Freigabe löschen? In diesem Falle werden auch hiermit verbundene Freigaben gelöscht.",
"account.reverseShares.modal.delete.title": "Externe Freigabe löschen",
"account.reverseShares.modal.delete.description": "Möchtest du diese externe Freigabe wirklich löschen? In diesem Fall werden auch hiermit verbundene Freigaben gelöscht.",
// END /account/reverseShares
// /admin
"admin.title": "Verwaltung",
@@ -190,7 +193,7 @@ export default {
"admin.users.edit.update.change-password.button": "Neues Passwort speichern",
"admin.users.edit.update.notify.password.success": "Passwort erfolgreich geändert",
"admin.users.edit.delete.title": "Benutzer löschen: {username}?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.description": "Möchtest du wirklich diesen Benutzer und all seine Freigaben löschen?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Benutzer erstellen",
"admin.users.modal.create.username": "Benutzername",
@@ -203,17 +206,20 @@ export default {
// END /admin/users
// /admin/shares
"admin.shares.title": "Freigaben Verwaltung",
"admin.shares.table.id": "ID teilen",
"admin.shares.table.id": "Freigabe ID",
"admin.shares.table.username": "Ersteller",
"admin.shares.table.visitors": "Besucher",
"admin.shares.table.expires": "Läuft ab am",
"admin.shares.edit.delete.title": "Freigabe löschen: {id}",
"admin.shares.edit.delete.description": "Möchtest du wirklich diese Freigabe löschen?",
"admin.shares.edit.delete.description": "Möchtest du diese Freigabe wirklich löschen?",
// END /admin/shares
// /upload
"upload.title": "Upload",
"upload.notify.confirm-leave": "Bist du sicher, dass du diese Seite verlassen willst? Dein Upload wird abgebrochen.",
"upload.notify.generic-error": "Während der Erstellung der Freigabe ist ein Fehler aufgetreten.",
"upload.notify.count-failed": "{count} Dateien konnten nicht hochgeladen werden. Wird erneut versucht.",
"upload.reverse-share.error.invalid.title": "Ungültiger Link zu externer Freigabe",
"upload.reverse-share.error.invalid.description": "Diese externe Freigabe ist abgelaufen oder ungültig.",
// Dropzone.tsx
"upload.dropzone.title": "Dateien hochladen",
"upload.dropzone.description": "Ziehe Dateien per Drag'n'Drop hierher, um deine Freigabe zu starten. Wir akzeptieren nur Dateien mit einer Gesamtgröße von bis zu {maxSize}.",
@@ -227,7 +233,7 @@ export default {
"upload.modal.link.error.taken": "Dieser Link wird bereits verwendet",
"upload.modal.not-signed-in": "Du bist nicht angemeldet",
"upload.modal.not-signed-in-description": "Du wirst deine Freigabe nicht löschen können oder die Besucheranzahl sehen.",
"upload.modal.expires.never": "niemals",
"upload.modal.expires.never": "nie",
"upload.modal.expires.never-long": "Permanente Freigabe",
"upload.modal.expires.error.too-long": "Das Ablaufdatum überschreitet das Maximum von {max}.",
"upload.modal.link.label": "Link",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Freigabe {shareId}",
"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.description": "Die maximale Besucheranzahl für diese Freigabe ist überschritten.",
"share.error.removed.title": "Freigabe entfernt",
@@ -272,16 +279,16 @@ export default {
"share.error.access-denied.title": "Private Freigabe",
"share.error.access-denied.description": "Das aktuelle Konto hat keine Berechtigung, um auf diese Freigabe zuzugreifen",
"share.modal.password.title": "Passwort erforderlich",
"share.modal.password.description": "Bitte geben Sie das Passwort ein, um auf diese Freigabe zuzugreifen.",
"share.modal.password.description": "Bitte gib das Passwort ein, um auf diese Freigabe zuzugreifen.",
"share.modal.password": "Passwort",
"share.modal.error.invalid-password": "Ungültiges Passwort",
"share.button.download-all": "Alles herunterladen",
"share.notify.download-all-preparing": "Die Freigabe wird vorbereitet. Bitte versuchen Sie es in ein paar Minuten erneut.",
"share.notify.download-all-preparing": "Die Freigabe wird vorbereitet. Bitte versuche es in ein paar Minuten erneut.",
"share.modal.file-link": "Dateilink",
"share.table.name": "Name",
"share.table.size": "Größe",
"share.modal.file-preview.error.not-supported.title": "Vorschau wird nicht unterstützt",
"share.modal.file-preview.error.not-supported.description": "Vorschaubilder werden für diesen Dateityp nicht unterstützt. Bitte laden Sie die Datei herunter, um sie anzuzeigen.",
"share.modal.file-preview.error.not-supported.description": "Vorschaubilder werden für diesen Dateityp nicht unterstützt. Bitte lade die Datei herunter, um sie anzuzeigen.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "{shareId} bearbeiten",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Während der Erstellung der Freigabe ist ein Fehler aufgetreten.",
"share.edit.notify.save-success": "Freigabe erfolgreich aktualisiert",
// END /share/[id]/edit
// /imprint
"imprint.title": "Impressum",
// END /imprint
// /privacy
"privacy.title": "Datenschutzerklärung",
// END /privacy
// /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.category.general": "Allgemein",
"admin.config.category.share": "Freigabe",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "E-Mail",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Anmeldung über soziale Netzwerke",
@@ -300,6 +316,8 @@ export default {
"admin.config.general.app-name.description": "Name der Applikation",
"admin.config.general.app-url": "App-URL",
"admin.config.general.app-url.description": "Auf welcher URL Pingvin Share verfügbar ist",
"admin.config.general.secure-cookies": "Sichere Cookies",
"admin.config.general.secure-cookies.description": "Gibt an, ob die secure flag bei Cookies gesetzt werden soll. Falls aktiviert, wird die Seite nicht funktionieren, wenn sie über HTTP aufgerufen wird.",
"admin.config.general.show-home-page": "Startseite anzeigen",
"admin.config.general.show-home-page.description": "Ob die Startseite angezeigt werden soll",
"admin.config.general.session-duration": "Session-Dauer",
@@ -307,12 +325,20 @@ export default {
"admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Ändere dein Logo durch Hochladen eines Bildes. Das Bild muss im PNG-Format vorliegen und sollte mit Seitenverhältnis 1:1 sein.",
"admin.config.general.logo.placeholder": "Bild auswählen",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Erlaube das Teilen der Freigabe via E-Mail",
"admin.config.email.enable-share-email-recipients.description": "Gibt an, ob das Teilen von E-Mails mit Empfängern erlaubt werden soll. Aktivieren Sie dies nur, wenn SMTP aktiviert ist.",
"admin.config.email.enable-share-email-recipients.description": "Gibt an, ob das Teilen von E-Mails mit Empfängern erlaubt werden soll. Aktiviere dies nur, wenn SMTP aktiviert ist.",
"admin.config.email.share-recipients-subject": "Betreff für Freigabe-Empfänger",
"admin.config.email.share-recipients-subject.description": "Betreff der E-Mail, die an die Freigabe-Empfänger gesendet wird.",
"admin.config.email.share-recipients-message": "Nachricht für Freigabe-Empfänger",
"admin.config.email.share-recipients-message.description": "Nachricht, die an die Freigabe-Empfänger gesendet wird. Verfügbare Variablen:\n- {creator} - Der Benutzername des Erstellers der Freigabe\n- {shareUrl} - Die URL der Freigabe\n- {desc} - Die Beschreibung der Freigabe\n- {expires} - Das Ablaufdatum der Freigabe\nVariablen werden durch die aktuellen Werte ersetzt.",
"admin.config.email.share-recipients-message.description": "Nachricht, die an die Freigabe-Empfänger gesendet wird. Verfügbare Variablen:\n- {creator} - Der Benutzername des Erstellers der Freigabe\n- {creatorEmail} - E-Mail-Adresse des Erstellers der Freigabe\n- {shareUrl} - Die URL der Freigabe\n- {desc} - Die Beschreibung der Freigabe\n- {expires} - Das Ablaufdatum der Freigabe\nVariablen werden durch die tatsächlichen Werte ersetzt.",
"admin.config.email.reverse-share-subject": "Name der externen Freigabe",
"admin.config.email.reverse-share-subject.description": "Betreff der gesendeten E-Mail, wenn jemand eine Freigabe mit Ihrem externen Freigabe-Link erstellt hat.",
"admin.config.email.reverse-share-message": "Nachricht für externe Freigabe",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Nicht authentifizierte Freigaben erlauben",
"admin.config.share.allow-unauthenticated-shares.description": "Gibt an, ob nicht authentifizierte Benutzer Freigaben erstellen können",
"admin.config.share.max-expiration": "Max. Ablaufdatum",
"admin.config.share.max-expiration.description": "Maximale Ablaufzeit in Stunden. Auf 0 setzen, um kein Ablaufdatum zu definieren.",
"admin.config.share.max-expiration.description": "Maximale Ablaufzeit. Auf 0 setzen, um kein Ablaufdatum zu definieren.",
"admin.config.share.share-id-length": "Standardlänge der Freigabe-ID",
"admin.config.share.share-id-length.description": "Standardlänge für die generierte ID einer Freigabe. Dieser Wert wird auch verwendet, um Links für umgekehrte Freigaben zu generieren. Ein Wert unter 8 wird als nicht sicher betrachtet.",
"admin.config.share.max-size": "Maximale Größe",
"admin.config.share.max-size.description": "Maximale Größe einer Freigabe in Bytes",
"admin.config.share.max-size.description": "Maximale Größe einer Freigabe",
"admin.config.share.zip-compression-level": "ZIP-Kompressionslevel",
"admin.config.share.zip-compression-level.description": "Passe den Wert an, um ein Gleichgewicht zwischen Dateigröße und Kompressionsgeschwindigkeit herzustellen. Gültige Werte liegen zwischen 0 und 9, wobei 0 für keine Komprimierung und 9 für maximale Komprimierung steht. ",
"admin.config.share.chunk-size": "Chunk Größe",
"admin.config.share.chunk-size.description": "Passe die Chunk-Größe (in Bytes) für deine Uploads an, um Effizienz und Zuverlässigkeit entsprechend deiner Internetverbindung auszubalancieren. Kleinere Chunks können die Erfolgsraten bei instabilen Verbindungen erhöhen, während größere Chunks Uploads bei stabilen Verbindungen beschleunigen.",
"admin.config.share.chunk-size.description": "Passe die Chunk-Größe für deine Uploads an, um Effizienz und Zuverlässigkeit entsprechend deiner Internetverbindung auszubalancieren. Kleinere Chunks können die Erfolgsraten bei instabilen Verbindungen erhöhen, während größere Chunks Uploads bei stabilen Verbindungen beschleunigen.",
"admin.config.share.auto-open-share-modal": "Freigabe-Fenster automatisch öffnen",
"admin.config.share.auto-open-share-modal.description": "Das Freigabe-Fenster erscheint automatisch, sobald ein Benutzer Dateien ausgewählt hat, ohne extra auf den Button klicken zu müssen.",
"admin.config.smtp.enabled": "Aktivieren",
@@ -353,7 +381,7 @@ export default {
"admin.config.smtp.password.description": "Passwort des SMTP-Servers",
"admin.config.smtp.button.test": "Test-E-Mail senden",
"admin.config.smtp.allow-unauthorized-certificates": "Vertrauen von nicht authentifizierten SMTP-Server-Zertifikaten",
"admin.config.smtp.allow-unauthorized-certificates.description": "Verwenden Sie diese Option nur, wenn Sie selbst signierten Zertifikaten vertrauen müssen.",
"admin.config.smtp.allow-unauthorized-certificates.description": "Verwende diese Option nur, wenn du selbst signierten Zertifikaten vertrauen musst.",
"admin.config.oauth.allow-registration": "Registrierung erlauben",
"admin.config.oauth.allow-registration.description": "Benutzern erlauben, sich über soziale Netzwerke zu registrieren",
"admin.config.oauth.ignore-totp": "TOTP ignorieren",
@@ -364,38 +392,40 @@ export default {
"admin.config.oauth.github-enabled.description": "GitHub Anmeldung erlaubt",
"admin.config.oauth.github-client-id": "GitHub Client-ID",
"admin.config.oauth.github-client-id.description": "Client-ID der GitHub OAuth-App",
"admin.config.oauth.github-client-secret": "GitHub Client Sekret",
"admin.config.oauth.github-client-secret.description": "Client-Sekret der GitHub OAuth-App",
"admin.config.oauth.github-client-secret": "GitHub Client Secret",
"admin.config.oauth.github-client-secret.description": "Client Secret der GitHub OAuth App",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Google Anmeldung erlaubt",
"admin.config.oauth.google-client-id": "Google Client-ID",
"admin.config.oauth.google-client-id.description": "Client-ID der Google OAuth-App",
"admin.config.oauth.google-client-secret": "Google Client Sekret",
"admin.config.oauth.google-client-secret.description": "Client-Sekret der Google OAuth-App",
"admin.config.oauth.google-client-secret": "Google Client Secret",
"admin.config.oauth.google-client-secret.description": "Client Secret der Google OAuth App",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Microsoft Anmeldung erlaubt",
"admin.config.oauth.microsoft-tenant": "Microsoft Mandant",
"admin.config.oauth.microsoft-tenant.description": "Mandant-ID der Microsoft OAuth App\ncommon: Benutzer mit einem persönlichen Microsoft-Konto und einem Arbeits- oder Schulkonto von Microsoft Entra ID können sich in der Anwendung anmelden.\norganizations: Nur Benutzer mit Arbeits- oder Schulkonten von Microsoft Entra ID können sich in der Anwendung anmelden.\nconsumers: Nur Benutzer mit einem persönlichen Microsoft-Konto können sich in der Anwendung anmelden.\nDomänenname des Microsoft Entra Mandanten oder die Mandanten-ID im GUID-Format: Nur Benutzer eines bestimmten Microsoft Entra Mandanten (Verzeichnismitglieder mit einem Arbeits- oder Schulkonto oder Verzeichnis Gäste mit einem persönlichen Microsoft-Konto) können sich anmelden.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client-ID",
"admin.config.oauth.microsoft-client-id.description": "Client-ID der Microsoft OAuth-App",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client Sekret",
"admin.config.oauth.microsoft-client-secret.description": "Client-Sekret der Microsoft OAuth-App",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client Secret",
"admin.config.oauth.microsoft-client-secret.description": "Client Secret der Microsoft OAuth App",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Discord Anmeldung erlaubt",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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": "Discord limitierte Benutzer",
"admin.config.oauth.discord-limited-users.description": "Limitiere die Anmeldung für spezifische Benutzer anhand ihrer Discord ID. Lasse dieses Feld leer, um es zu deaktivieren.",
"admin.config.oauth.discord-limited-guild": "Discord Server-ID",
"admin.config.oauth.discord-limited-guild.description": "Die Anmeldung auf Benutzer in einem bestimmten Server beschränken. Leer lassen, um zu deaktivieren.",
"admin.config.oauth.discord-client-id": "Discord Client-ID",
"admin.config.oauth.discord-client-id.description": "Client-ID der Discord OAuth-App",
"admin.config.oauth.discord-client-secret": "Discord Client Sekret",
"admin.config.oauth.discord-client-secret.description": "Client-Sekret der Discord OAuth-App",
"admin.config.oauth.discord-client-secret": "Discord Client Secret",
"admin.config.oauth.discord-client-secret.description": "Client Secret der Discord OAuth App",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "OpenID Connect Anmeldung erlaubt",
"admin.config.oauth.oidc-discovery-uri": "OpenID Verbindung Discovery URL",
"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.description": "Wenn aktiviert, wird der Benutzer mit der „Abmelden“-Schaltfläche vom OpenID-Connect-Provider abgemeldet.",
"admin.config.oauth.oidc-scope": "OpenID Connect",
"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.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",
@@ -427,6 +457,37 @@ export default {
"admin.config.ldap.field-name-member-of.description": "LDAP-Attributname für die Gruppen, in denen ein Benutzer Mitglied ist. Dies wird bei der Überprüfung der Admin-Gruppe verwendet.",
"admin.config.ldap.field-name-email": "Attributname für die E-Mail-Adresse des Benutzers",
"admin.config.ldap.field-name-email.description": "LDAP-Attributname für die E-Mail-Adresse eines Benutzers.",
"admin.config.notify.success": "Konfiguration erfolgreich aktualisiert.",
"admin.config.notify.logo-success": "Logo erfolgreich aktualisiert. Es kann einige Minuten dauern, bis es auf der Website aktualisiert wird.",
"admin.config.notify.no-changes": "Keine Änderungen zu speichern.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Aktiviert",
"admin.config.s3.enabled.description": "Ob S3 verwendet werden soll, um die freigegebenen Dateien anstelle des lokalen Dateisystems zu speichern.",
"admin.config.s3.endpoint": "Endpunkt",
"admin.config.s3.endpoint.description": "Die URL des S3-Buckets.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "Die Region des S3-Buckets.",
"admin.config.s3.bucket-name": "Bucket-Name",
"admin.config.s3.bucket-name.description": "Der Name des S3-Buckets.",
"admin.config.s3.bucket-path": "Pfad",
"admin.config.s3.bucket-path.description": "Der Standardpfad, der zum Speichern der Dateien im S3-Bucket verwendet werden soll.",
"admin.config.s3.key": "Schlüssel",
"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.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.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.imprint-text": "Impressum-Text",
"admin.config.legal.imprint-text.description": "Der Text, der im Impressum angezeigt wird. Unterstützt Markdown. Leer lassen, um auf eine externe Impressumsseite zu verlinken.",
"admin.config.legal.imprint-url": "Impressum-URL",
"admin.config.legal.imprint-url.description": "Wenn bereits eine Impressumsseite vorhanden ist, kann sie hier verlinkt werden, anstatt den Text einzugeben.",
"admin.config.legal.privacy-policy-text": "Datenschutzerklärungstext",
"admin.config.legal.privacy-policy-text.description": "Der Text, der in der Datenschutzerklärung angezeigt wird. Unterstützt Markdown. Leer lassen, um auf eine externe Datenschutzerklärungsseite zu verlinken.",
"admin.config.legal.privacy-policy-url": "Datenschutzerklärungs-URL",
"admin.config.legal.privacy-policy-url.description": "Wenn bereits eine Datenschutzerklärungsseite vorhanden ist, kann sie hier verlinkt werden, anstatt den Text einzugeben.",
// 404
"404.description": "Ups, diese Seite existiert nicht.",
"404.button.home": "Zurück zur Startseite",
@@ -468,12 +529,13 @@ export default {
"common.button.go-back": "Zurück",
"common.button.go-home": "Zur Startseite",
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",
"common.notify.copied-link": "Dein Link wurde in die Zwischenablage kopiert",
"common.success": "Erfolg",
"common.error": "Fehler",
"common.error.unknown": "Ein unbekannter Fehler ist aufgetreten",
"common.error.invalid-email": "Ungültige E-Mail-Adresse",
"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-large": "Darf höchstens {max} sein",
"common.error.exact-length": "Muss genau {length} Zeichen lang sein",

View File

@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Μέγεθος",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Πληροφορίες διαμοιρασμού",
"account.shares.modal.share-link": "Κοινοποίηση συνδέσμου",
"account.shares.modal.delete.title": "Delete share: {share}",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "Μεταφόρτωση",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση της κοινής χρήσης σας.",
"upload.notify.count-failed": "Τα αρχεία {count} απέτυχαν να μεταφορτώσουν. Δοκιμάστε ξανά.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Μεταφόρτωση αρχείων",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Διαμοιρασμός {shareId}",
"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.description": "Ξεπεράστηκε το όριο επισκεπτών σε αυτή την κοινοποίηση.",
"share.error.removed.title": "Κοινοποίηση αφαιρέθηκε",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Ιδιωτική κοινοποίηση",
"share.error.access-denied.description": "Ο τρέχων λογαριασμός δεν έχει δικαίωμα πρόσβασης σε αυτήν την κοινοποίηση",
"share.modal.password.title": "Απαιτείται κωδικός",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Κωδικός πρόσβασης",
"share.modal.error.invalid-password": "Μη έγκυρος κωδικός πρόσβασης",
"share.button.download-all": "Λήψη όλων",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση του διαμοιρασμού.",
"share.edit.notify.save-success": "Ο διαμοιρασμός ενημερώθηκε επιτυχώς",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Γενικά",
"admin.config.category.share": "Διαμοιρασμός",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Σύνδεση με λογαριασμό μέσων κοινωνικού δικτύου",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Ονομασία της εφαρμογής",
"admin.config.general.app-url": "URL Εφαρμογής",
"admin.config.general.app-url.description": "Η διεύθυνση URL όπου το Pingvin Share είναι διαθέσιμο",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "Εμφάνιση αρχικής σελίδας",
"admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα",
"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.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.",
"admin.config.general.logo.placeholder": "Επιλέξτε εικόνα",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Θέμα στο email διαμοιρασμού",
"admin.config.email.share-recipients-subject.description": "Το θέμα του email διαμοιρασμού που θα φτάσει στον παραλήπτη.",
"admin.config.email.share-recipients-message": "Το θέμα του email για τον διαμοιρασμό που θα φτάσει στον παραλήπτη ",
"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 {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": "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.reverse-share-subject": "Θέμα email αντίστροφου διαμοιρασμού",
"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-message": "Μήνυμα email αντίστροφου διαμοιρασμού",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Επιτρέψτε κοινές χρήσεις χωρίς έλεγχο ταυτότητας",
"admin.config.share.allow-unauthenticated-shares.description": "Εάν οι χρήστες χωρίς έλεγχο ταυτότητας μπορούν να δημιουργήσουν κοινόχρηστα στοιχεία",
"admin.config.share.max-expiration": "Μέγιστη λήξη",
"admin.config.share.max-expiration.description": "Μέγιστη λήξη κοινής χρήσης σε ώρες. Ορίστε το 0 για να επιτρέψετε απεριόριστη λήξη.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Μέγιστο μέγεθος",
"admin.config.share.max-size.description": "Μέγιστο μέγεθος κοινοποίησης σε bytes",
"admin.config.share.max-size.description": "Μέγιστο μέγεθος κοινοποίησης",
"admin.config.share.zip-compression-level": "Βαθμός συμπίεσης ZIP",
"admin.config.share.zip-compression-level.description": "Προσαρμόστε το βαθμό συμπίεσης για να εξισορροπηθεί το μέγεθος του αρχείου και η ταχύτητα επεξεργασίας. Έγκυρες τιμές κυμαίνονται από 0 έως 9, με 0 χωρίς συμπίεση και 9 μέγιστη συμπίεση.",
"admin.config.share.chunk-size": "Μέγεθος κομματιών",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "Θύρα",
"admin.config.smtp.port.description": "SMTP θύρα",
"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.description": "Όνομα χρήστη στον SMTP εξυπηρετητή",
"admin.config.smtp.password": "Κωδικός πρόσβασης",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Αφήστε κενό αν δε γνωρίζετε για αυτή τη ρύθμιση",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Ουπς. Αυτή η σελίδα δεν υπάρχει.",
"404.button.home": "Πήγαινέ με πίσω",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Επιστροφή",
"common.button.go-home": "Μετάβαση στην αρχική",
"common.notify.copied": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
"common.notify.copied-link": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
"common.success": "Επιτυχία",
"common.error": "Σφάλμα",
"common.error.unknown": "Προέκυψε άγνωστο σφάλμα",

View File

@@ -158,6 +158,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Size",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Share informations",
"account.shares.modal.share-link": "Share link",
@@ -286,9 +289,14 @@ export default {
// /upload
"upload.title": "Upload",
"upload.notify.confirm-leave":
"Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error":
"An error occurred while finishing your share.",
"upload.notify.count-failed": "{count} files failed to upload. Trying again.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description":
"This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Upload files",
@@ -358,6 +366,8 @@ export default {
// /share/[id]
"share.title": "Share {shareId}",
"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.description":
"The visitor limit from this share has been exceeded.",
@@ -371,7 +381,7 @@ export default {
"share.modal.password.title": "Password required",
"share.modal.password.description":
"Please enter the password to acces this share.",
"Please enter the password to access this share.",
"share.modal.password": "Password",
"share.modal.error.invalid-password": "Invalid password",
@@ -397,10 +407,23 @@ export default {
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "General",
"admin.config.category.share": "Share",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login",
@@ -410,17 +433,33 @@ export default {
"admin.config.general.app-url": "App URL",
"admin.config.general.app-url.description":
"On which URL Pingvin Share is available",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "Show 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.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.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": "Pick image",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description":
"Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description":
"Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description":
"Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description":
"Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients":
"Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description":
@@ -430,7 +469,7 @@ export default {
"Subject of the email which gets sent to the share recipients.",
"admin.config.email.share-recipients-message": "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 {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.",
"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.reverse-share-subject": "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.",
@@ -459,15 +498,18 @@ export default {
"Whether unauthenticated users can create shares",
"admin.config.share.max-expiration": "Max expiration",
"admin.config.share.max-expiration.description":
"Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Max size",
"admin.config.share.max-size.description": "Maximum share size in bytes",
"admin.config.share.max-size.description": "Maximum share size",
"admin.config.share.zip-compression-level": "Zip compression level",
"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.chunk-size": "Chunk size",
"admin.config.share.chunk-size.description":
"Adjust the chunk size (in bytes) 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.",
"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.description":
"The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
@@ -481,7 +523,7 @@ export default {
"admin.config.smtp.port.description": "Port of the SMTP server",
"admin.config.smtp.email": "Email",
"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.description": "Username of the SMTP server",
"admin.config.smtp.password": "Password",
@@ -555,6 +597,9 @@ export default {
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description":
"Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"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.",
@@ -607,6 +652,50 @@ export default {
"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.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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description":
"The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Oops this page doesn't exist.",
@@ -657,6 +746,7 @@ export default {
"common.button.go-back": "Go back",
"common.button.go-home": "Go home",
"common.notify.copied": "Your link was copied to the clipboard",
"common.notify.copied-link": "Your link was copied to the clipboard",
"common.success": "Success",
"common.error": "Error",

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Subir",
"navbar.signin": "Iniciar sesión",
"navbar.home": "Inicio",
"navbar.signup": "Sign up",
"navbar.signup": "Registrarse",
"navbar.links.shares": "Mis compartidos",
"navbar.links.reverse": "Comparticiones inversas",
"navbar.avatar.account": "Mi cuenta",
@@ -12,13 +12,13 @@ export default {
// END navbar
// /
"home.title": "Una plataforma <h>autoalojada</h> para compartir archivos.",
"home.description": "¿En realidad quieres dejar tus archivos personales en manos de terceros como WeTransfer?",
"home.description": "¿De verdad quieres dejar tus archivos personales en manos de terceros como WeTransfer?",
"home.bullet.a.name": "Autoalojada",
"home.bullet.a.description": "Aloja Pingvin Share en tu propio equipo.",
"home.bullet.b.name": "Privacidad",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.b.description": "Tus archivos son tuyos y nunca serán accesibles por terceros.",
"home.bullet.c.name": "Sin molestos límites de tamaño de archivo",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.bullet.c.description": "Sube archivos del tamaño que desees. Solo el espacio en tu disco duro será tu límite.",
"home.button.start": "Comenzar",
"home.button.source": "Código fuente",
// END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password
"resetPassword.title": "¿Olvidaste tu contraseña?",
"resetPassword.description": "Ingresa tu correo para restablecer tu contraseña.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.notify.success": "Se ha enviado un mensaje con un enlace para restablecer tu contraseña si el correo electrónico proporcionado existe.",
"resetPassword.button.back": "Volver al inicio de sesión",
"resetPassword.text.resetPassword": "Restablecer contraseña",
"resetPassword.text.enterNewPassword": "Ingresa tu nueva contraseña",
"resetPassword.input.password": "Nueva contraseña",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "Tu contraseña ha sido restablecida exitosamente.",
// /account
"account.title": "Mi cuenta",
"account.card.info.title": "Información de cuenta",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Contraseña",
"account.card.password.old": "Anterior contraseña",
"account.card.password.new": "Nueva contraseña",
"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": "No tienes una contraseña configurada. Para iniciar sesión usando tu correo electrónico y contraseña, necesitas crear una contraseña.",
"account.notify.password.success": "Contraseña cambiada correctamente",
"account.card.oauth.title": "Inicio de sesión con red social",
"account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Desvincular",
"account.card.oauth.unlinked": "Desvinculado",
"account.modal.unlink.title": "Desvincular cuenta",
"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": "Desvincular tus cuentas sociales puede hacer que pierdas acceso a tu cuenta si no recuerdas tus credenciales de inicio de sesión",
"account.notify.oauth.unlinked.success": "Desvinculado correctamente",
"account.card.security.title": "Seguridad",
"account.card.security.totp.enable.description": "Ingrese su contraseña actual para habilitar TOTP",
@@ -104,7 +104,7 @@ export default {
"account.card.language.description": "El proyecto ha sido traducido por la comunidad. Algunos idiomas pueden estar incompletos.",
"account.card.color.title": "Esquema de colores",
// ThemeSwitcher.tsx
"account.theme.dark": "Oscuro",
"account.theme.dark": "Obscuro",
"account.theme.light": "Claro",
"account.theme.system": "Sistema",
"account.button.delete": "Eliminar Cuenta",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Nombre",
"account.shares.table.description": "Descripción",
"account.shares.table.visitors": "Visitas",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.expiresAt": "Vence el",
"account.shares.table.createdAt": "Creado el",
"account.shares.table.size": "Tamaño",
"account.shares.table.password-protected": "Protegido por contraseña",
"account.shares.table.visitor-count": "{count} de {max}",
"account.shares.table.expiry-never": "Nunca",
"account.shares.modal.share-informations": "Información del compartido",
"account.shares.modal.share-link": "Enlace",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "Eliminar enlace compartido: {share}",
"account.shares.modal.delete.description": "¿Seguro que quieres eliminar este compartido?",
// END /account/shares
// /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Año",
"account.reverseShares.modal.expiration.year-plural": "Años",
"account.reverseShares.modal.max-size.label": "Tamaño máximo del compartido",
"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": "Enviar notificaciones por correo electrónico",
"account.reverseShares.modal.send-email.description": "Te envía una notificación por correo electrónico cuando se crea un enlace compartido con este enlace de compartición inverso.",
"account.reverseShares.modal.simplified": "Modo simple",
"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": "Facilita que la persona que sube el archivo lo comparta contigo. Solo podrá personalizar el nombre y la descripción del enlace compartido.",
"account.reverseShares.modal.public-access": "Acceso público",
"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": "Haz que los enlaces compartidos creados con este enlace de compartición inverso sean públicos. Si está desactivado, solo tú y el creador del enlace tendrán acceso para verlo.",
"account.reverseShares.modal.max-use.label": "Máximo de usos",
"account.reverseShares.modal.max-use.description": "Cantidad máxima de veces que esta URL se puede usar para crear un compartido.",
"account.reverseShare.never-expires": "Esta compartición inversa nunca expirará.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Nombre de usuario",
"admin.users.table.email": "Correo",
"admin.users.table.admin": "Administrador",
"admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.title": "Editar usuario: {username}",
"admin.users.edit.update.admin-privileges": "Privilegios de administrador",
"admin.users.edit.update.change-password.title": "Cambiar 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.notify.password.success": "Contraseña cambiada correctamente",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "¿Eliminar usuario: {username} ?",
"admin.users.edit.delete.description": "¿Realmente deseas eliminar a este usuario y todos sus enlaces compartidos?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Crear usuario",
"admin.users.modal.create.username": "Nombre de usuario",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "ID de compartición",
"admin.shares.table.username": "Creador",
"admin.shares.table.visitors": "Visitantes",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.table.expires": "Vence el",
"admin.shares.edit.delete.title": "Eliminar enlace compartido: {id}",
"admin.shares.edit.delete.description": "¿Seguro que quieres eliminar este compartido?",
// END /admin/shares
// /upload
"upload.title": "Subir",
"upload.notify.confirm-leave": "¿Estás seguro de que quieres salir de esta página? Tu subida será cancelada.",
"upload.notify.generic-error": "Ha ocurrido un error mientras se compartía tu archivo.",
"upload.notify.count-failed": "No se pudo cargar {count} archivos. Intentando nuevamente.",
"upload.reverse-share.error.invalid.title": "Enlace de uso compartido inverso inválido",
"upload.reverse-share.error.invalid.description": "Este enlace de uso compartido inverso ha caducado o no es válido.",
// Dropzone.tsx
"upload.dropzone.title": "Subir archivos",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
"upload.dropzone.description": "Arrastra y suelta los archivos aquí para crear tu enlace compartido. Solo aceptamos archivos de hasta {maxSize} en total.",
"upload.dropzone.notify.file-too-big": "Tus archivos exceden el tamaño máximo de {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Nombre",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "No has iniciado sesión",
"upload.modal.not-signed-in-description": "No podrás eliminar tus compartidos manualmente ni ver el número de visitas.",
"upload.modal.expires.never": "nunca",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "Enlace compartido permanente",
"upload.modal.expires.error.too-long": "La fecha de expiración excede el máximo de {max}.",
"upload.modal.link.label": "Enlace",
"upload.modal.expires.label": "Expiración",
"upload.modal.expires.minute-singular": "Minuto",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Compartido {shareId}",
"share.description": "¡Mira lo que he compartido contigo!",
"share.fileCount": "{count, plural, one {}=1 {# archivo} other {# archivos}} · {size} (el archivo comprimido (zip, 7z) puede ser más pequeño debido a la compresión)",
"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.removed.title": "Compartido eliminado",
@@ -272,16 +279,16 @@ export default {
"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.modal.password.title": "Se requiere contraseña",
"share.modal.password.description": "Please enter the password to acces 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.error.invalid-password": "Contraseña inválida",
"share.button.download-all": "Descargar todo",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.notify.download-all-preparing": "El enlace compartido está en preparación. Por favor, inténtalo de nuevo en unos minutos.",
"share.modal.file-link": "Enlace del archivo",
"share.table.name": "Nombre",
"share.table.size": "Tamaño",
"share.modal.file-preview.error.not-supported.title": "Vista previa no disponible",
"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": "Las vistas previas no son compatibles con este tipo de archivos. Por favor, descargue el archivo para verlo.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Editar {shareId}",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Ha ocurrido un error mientras se compartía tu archivo.",
"share.edit.notify.save-success": "Compartir actualizado correctamente",
// END /share/[id]/edit
// /imprint
"imprint.title": "Aviso legal",
// END /imprint
// /privacy
"privacy.title": "Política de privacidad",
// END /privacy
// /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.category.general": "General",
"admin.config.category.share": "Compartido",
"admin.config.category.cache": "Caché",
"admin.config.category.email": "Correo",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Inicio de sesión social",
@@ -300,53 +316,65 @@ export default {
"admin.config.general.app-name.description": "Nombre de la aplicación",
"admin.config.general.app-url": "App URL",
"admin.config.general.app-url.description": "En cuál URL está disponible Pingvin Share",
"admin.config.general.secure-cookies": "Cookies seguras",
"admin.config.general.secure-cookies.description": "Si se establece o no la bandera de seguridad en las cookies. Si se activa, el sitio no funcionará cuando se acceda a través de HTTP.",
"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.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.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.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Habilitar compartir por correo electrónico",
"admin.config.email.enable-share-email-recipients.description": "Si desea permitir compartir por correo electrónico. Solo habilita esto si SMTP está activado.",
"admin.config.email.share-recipients-subject": "Asunto destinatario",
"admin.config.email.share-recipients-subject.description": "Asunto del correo el cual es enviado al destinatario del compartido.",
"admin.config.email.share-recipients-message": "Mensaje destinatario",
"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 {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": "Mensaje que se envía a los destinatarios del enlace compartido. Variables disponibles:\n{creator} - El nombre de usuario del creador del enlace\n{creatorEmail} - El correo electrónico el creador del enlace\n{shareUrl} - La URL del enlace compartido\n{desc} - La descripción del enlace compartido\n{expires} - La fecha de expiración del enlace\nEstas variables se reemplazarán con el valor real.",
"admin.config.email.reverse-share-subject": "Asunto de la compartición inversa",
"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": "Asunto del correo electrónico enviado cuando alguien crea un enlace compartido con tu enlace compartido inverso.",
"admin.config.email.reverse-share-message": "Mensaje de la compartición inversa",
"admin.config.email.reverse-share-message.description": "Mensaje que se envía cuando alguien comparte algo con tu enlace de compartición inversa. {shareUrl} Se remplazará con el nombre del creador y la URL del compartido.",
"admin.config.email.reset-password-subject": "Asunto restablecer contraseña",
"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": "Asunto del correo electrónico enviado cuando un usuario solicita un restablecimiento de contraseña.",
"admin.config.email.reset-password-message": "Mensaje restablecer contraseña",
"admin.config.email.reset-password-message.description": "Mensaje que se envía cuando un usuario solicita restablecer la contraseña. {url} se remplazará con la URL para restablecer la contraseña.",
"admin.config.email.invite-subject": "Asunto de la invitación",
"admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-subject.description": "Asunto del correo electrónico enviado cuando un administrador invita a un usuario.",
"admin.config.email.invite-message": "Mensaje de invitación",
"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": "Mensaje que se envía cuando un administrador invita a un usuario. {url} se reemplazará con la URL de invitación, {email} con el correo electrónico y {password} con la contraseña del usuario.",
"admin.config.share.allow-registration": "Permitir registro",
"admin.config.share.allow-registration.description": "Si se permite el registro",
"admin.config.share.allow-unauthenticated-shares": "Permitir compartir sin iniciar sesión",
"admin.config.share.allow-unauthenticated-shares.description": "Si los usuarios que no han iniciado sesión pueden compartir",
"admin.config.share.max-expiration": "Expiración máxima",
"admin.config.share.max-expiration.description": "Expiración máxima para compartir en horas. Establezca en 0 para permitir una expiración ilimitada.",
"admin.config.share.max-expiration.description": "Plazo máximo de caducidad. Establecer en 0 para enlaces sin caducidad.",
"admin.config.share.share-id-length": "Longitud de ID compartido por defecto",
"admin.config.share.share-id-length.description": "Longitud predeterminada para el ID generado de un compartido. Este valor también se usa para generar enlaces compartidos de uso inverso. Un valor inferior a 8 no se considera seguro.",
"admin.config.share.max-size": "Tamaño máximo",
"admin.config.share.max-size.description": "Tamaño máximo de los archivos, en bytes",
"admin.config.share.max-size.description": "Tamaño máximo de los archivos",
"admin.config.share.zip-compression-level": "Nivel de compresión del Zip",
"admin.config.share.zip-compression-level.description": "Ajustar el nivel para equilibrar entre el tamaño del archivo y la velocidad de compresión. Los valores válidos van del 0 al 9, siendo 0 sin compresión y 9 el nivel máximo de compresión. ",
"admin.config.share.chunk-size": "Tamaño de los fragmentos",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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": "Ajusta el tamaño del fragmento para tus subidas y equilibra la eficiencia y la fiabilidad según tu conexión a Internet. Fragmentos más pequeños pueden aumentar las tasas de éxito para conexiones inestables, mientras que fragmentos más grandes hacen que las subidas sean más rápidas para conexiones estables.",
"admin.config.share.auto-open-share-modal": "Auto abrir un modal de creación de compartidos",
"admin.config.share.auto-open-share-modal.description": "El modal de creación de compartir aparece automáticamente cuando un usuario selecciona archivos, eliminando la necesidad de hacer clic manualmente en el botón.",
"admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled": "Habilitar",
"admin.config.smtp.enabled.description": "Si SMTP está habilitado. Active solo si ha introducido el host, el puerto, el correo, el usuario y la contraseña de su servidor SMTP.",
"admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "Host del servidor SMTP",
"admin.config.smtp.port": "Puerto",
"admin.config.smtp.port.description": "Puerto del servidor SMTP",
"admin.config.smtp.email": "Correo",
"admin.config.smtp.email.description": "Email address from wich the emails get sent",
"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.description": "Usuario del servidor SMTP",
"admin.config.smtp.password": "Contraseña",
@@ -375,58 +403,91 @@ export default {
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Si el inicio de sesión de Microsoft está habilitado",
"admin.config.oauth.microsoft-tenant": "Microsoft 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": "Tenant ID de la aplicación OAuth de Microsoft\ncomún: Los usuarios con una cuenta personal de Microsoft y una cuenta de trabajo o escuela de Microsoft Entra ID pueden iniciar sesión en la aplicación.\norganizaciones: Solo los usuarios con cuentas de trabajo o escuela de Microsoft Entra ID pueden iniciar sesión en la aplicación.\nconsumidores: Solo los usuarios con una cuenta personal de Microsoft pueden iniciar sesión en la aplicación.\nNombre de dominio del Tenant ID de Microsoft Entra o el Tenant ID en formato GUID: Solo los usuarios de un Tenant específico de Microsoft Entra (miembros del directorio con una cuenta de trabajo o escuela o invitados del directorio con una cuenta personal de Microsoft) pueden iniciar sesión en la aplicación.",
"admin.config.oauth.microsoft-client-id": "ID del cliente de Microsoft",
"admin.config.oauth.microsoft-client-id.description": "ID de cliente de la app OAuth de Microsoft",
"admin.config.oauth.microsoft-client-secret": "Secreto del cliente de Microsoft",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app",
"admin.config.oauth.microsoft-client-secret.description": "Secreto del cliente de la aplicación OAuth de Microsoft",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Si el inicio de sesión de Discord está habilitado",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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-guild": "Discord limited server ID",
"admin.config.oauth.discord-limited-users": "Usuarios limitados de Discord",
"admin.config.oauth.discord-limited-users.description": "Limitar el inicio de sesión a usuarios específicos por su ID de Discord. Deja en blanco para desactivar.",
"admin.config.oauth.discord-limited-guild": "ID de servidor limitado de Discord",
"admin.config.oauth.discord-limited-guild.description": "Limitar el inicio de sesión a usuarios en un servidor específico. Déjelo en blanco para desactivarlo.",
"admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app",
"admin.config.oauth.discord-client-secret": "Discord Client secret",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
"admin.config.oauth.discord-client-id": "ID de cliente de Discord",
"admin.config.oauth.discord-client-id.description": "ID de cliente de la aplicación OAuth de Discord",
"admin.config.oauth.discord-client-secret": "Secreto de cliente de Discord",
"admin.config.oauth.discord-client-secret.description": "Secreto del cliente de la aplicación OAuth de Discord",
"admin.config.oauth.oidc-enabled": "Conexión OpenID",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
"admin.config.oauth.oidc-role-path.description": "Debe ser una ruta JMES válida que haga referencia a un array de roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Déjalo en blanco si no sabe lo que es esta configuración.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
"admin.config.oauth.oidc-enabled.description": "Si el inicio de sesión de OpenID Connect está habilitado",
"admin.config.oauth.oidc-discovery-uri": "URI de descubrimiento de OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "URI de descubrimiento de la aplicación OAuth de OpenID Connect",
"admin.config.oauth.oidc-sign-out": "Cerrar sesión de OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Si el botón \"Cerrar sesión\" cerrará la sesión del proveedor de OpenID Connect",
"admin.config.oauth.oidc-scope": "Ámbito de OpenID Connect",
"admin.config.oauth.oidc-scope.description": "Ámbitos que se deberían solicitar al proveedor OpenID Connect.",
"admin.config.oauth.oidc-username-claim": "Reclamo de nombre de usuario de OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Reclamo de nombre de usuario en el token de OpenID Connect. Déjalo en blanco si no sabes qué es esta configuración.",
"admin.config.oauth.oidc-role-path": "Ruta a los roles en el token de OpenID Connect",
"admin.config.oauth.oidc-role-path.description": "Debe ser una ruta JMES válida que haga referencia a un array de roles. " + "Se recomienda gestionar los derechos de acceso utilizando roles de OpenID Connect solo si no se ha configurado ningún otro proveedor de identidad y si el inicio de sesión con contraseña está deshabilitado. " + "Déjalo en blanco si no sabe lo que es esta configuración.",
"admin.config.oauth.oidc-role-general-access": "Rol de OpenID Connect para acceso general",
"admin.config.oauth.oidc-role-general-access.description": "Rol requerido para acceso general. Debe estar presente en los roles de un usuario para que inicie sesión. " + "Déjalo en blanco si no sabe lo que es esta configuración.",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
"admin.config.oauth.oidc-role-admin-access": "Rol de OpenID Connect para acceso de administrador",
"admin.config.oauth.oidc-role-admin-access.description": "Rol requerido para el acceso administrativo. Debe estar presente en los roles de un usuario para acceder al panel de administración. " + "Déjalo en blanco si no sabe lo que es esta configuración.",
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-id": "ID de Cliente OpenID Connect",
"admin.config.oauth.oidc-client-id.description": "ID de cliente de la aplicación OAuth de OpenID Connect",
"admin.config.oauth.oidc-client-secret": "Secreto de cliente de OpenID Connect",
"admin.config.oauth.oidc-client-secret.description": "Secreto del cliente de la aplicación OAuth de OpenID Connect",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server",
"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-password": "Bind password",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"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-query": "User query",
"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.admin-groups": "Admin group",
"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.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.description": "LDAP attribute name for the email of an user.",
"admin.config.ldap.enabled": "Habilitar LDAP",
"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.description": "URL del servidor LDAP",
"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-password": "Contraseña LDAP",
"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.description": "Ubicación base, donde se llevará a cabo la búsqueda de usuarios",
"admin.config.ldap.search-query": "Consulta de usuario",
"admin.config.ldap.search-query.description": "La consulta de usuario se utilizará para buscar en la 'Base de usuarios' al usuario LDAP. Se puede usar %username% como marcador de posición para la entrada del usuario.",
"admin.config.ldap.admin-groups": "Grupo de administración",
"admin.config.ldap.admin-groups.description": "Grupo requerido para acceso administrativo.",
"admin.config.ldap.field-name-member-of": "Atributo grupos de usuarios",
"admin.config.ldap.field-name-member-of.description": "Nombre del atributo LDAP para los grupos de los que es miembro un usuario. Esto se utiliza al verificar el grupo de administración.",
"admin.config.ldap.field-name-email": "Atributo correo electrónico del usuario",
"admin.config.ldap.field-name-email.description": "Nombre del atributo LDAP para el correo electrónico de un usuario.",
"admin.config.notify.success": "Configuración actualizada correctamente.",
"admin.config.notify.logo-success": "Logo actualizado correctamente. Puede tardar unos minutos en actualizarse en el sitio web.",
"admin.config.notify.no-changes": "No hay cambios que guardar.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Habilitado",
"admin.config.s3.enabled.description": "Si se debería utilizar S3 en lugar del sistema de archivos local para almacenar los archivos compartidos.",
"admin.config.s3.endpoint": "Punto de acceso/endpoint",
"admin.config.s3.endpoint.description": "La URL del bucket S3.",
"admin.config.s3.region": "Región",
"admin.config.s3.region.description": "La región del bucket S3.",
"admin.config.s3.bucket-name": "Nombre del bucket",
"admin.config.s3.bucket-name.description": "El nombre del bucket S3.",
"admin.config.s3.bucket-path": "Ruta",
"admin.config.s3.bucket-path.description": "La ruta predeterminada que se debe usar para almacenar los archivos en el bucket S3.",
"admin.config.s3.key": "Clave",
"admin.config.s3.key.description": "La clave que permite el acceso al bucket S3.",
"admin.config.s3.secret": "Secreto",
"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": "Apagar para los backends que no soporten checksums (ej: B2).",
"admin.config.category.legal": "Legal",
"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.imprint-text": "Texto del aviso legal",
"admin.config.legal.imprint-text.description": "El texto que debería mostrarse en el aviso legal. Soporta Markdown. Dejar en blanco para enlazar a un enlace externo.",
"admin.config.legal.imprint-url": "URL del aviso legal",
"admin.config.legal.imprint-url.description": "Si ya tiene una página de aviso legal, puede enlazarlo aquí en lugar de utilizar el campo de texto.",
"admin.config.legal.privacy-policy-text": "Texto de la política de privacidad",
"admin.config.legal.privacy-policy-text.description": "El texto que debe mostrarse en la política de privacidad. Compatible con Markdown. Dejar en blanco para enlazar a una página de política de privacidad externa.",
"admin.config.legal.privacy-policy-url": "URL de la política de privacidad",
"admin.config.legal.privacy-policy-url.description": "Si ya tiene una página de política de privacidad puede enlazarla aquí en lugar de usar el campo de texto.",
// 404
"404.description": "Oops esta página no existe.",
"404.button.home": "Regrésame al inicio",
@@ -441,10 +502,10 @@ export default {
"error.msg.no_user": "El usuario vinculado a esta cuenta {0} no existe.",
"error.msg.no_email": "No se puede obtener la dirección de correo electrónico de esta cuenta {0}.",
"error.msg.already_linked": "Esta cuenta {0} ya está vinculada a otra cuenta.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.not_linked": "Esta cuenta {0} aún no ha sido vinculada a ninguna cuenta.",
"error.msg.unverified_account": "Esta cuenta {0} no está verificada, por favor inténtalo de nuevo después de la verificación.",
"error.msg.user_not_allowed": "No tienes permitido iniciar sesion.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.msg.cannot_get_user_info": "No se puede obtener tu información de usuario de esta cuenta {0}.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
@@ -462,20 +523,21 @@ export default {
"common.button.generate": "Generar",
"common.button.done": "Listo",
"common.text.link": "Enlace",
"common.text.navigate-to-link": "Visit link",
"common.text.navigate-to-link": "Visitar enlace",
"common.text.or": "o",
"common.text.redirecting": "Redirecting...",
"common.text.redirecting": "Redirigiendo...",
"common.button.go-back": "Volver",
"common.button.go-home": "Página de inicio",
"common.notify.copied": "Tu enlace se ha copiado al portapapeles",
"common.notify.copied-link": "Tu enlace se ha copiado al portapapeles",
"common.success": "Éxito",
"common.error": "Error",
"common.error.unknown": "Ocurrió un error desconocido",
"common.error.invalid-email": "Correo electrónico no válido",
"common.error.too-short": "Debe tener al menos {length} caracteres",
"common.error.too-long": "Debe tener como máximo {length} caracteres",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.number-too-small": "Debe ser al menos {min}",
"common.error.number-too-large": "Debe ser como máximo {max}",
"common.error.exact-length": "Debe tener exactamente {length} caracteres",
"common.error.invalid-number": "Debe ser un número",
"common.error.field-required": "Este campo es requerido"

View File

@@ -0,0 +1,544 @@
export default {
// Navbar
"navbar.upload": "Laadi üles",
"navbar.signin": "Logi sisse",
"navbar.home": "Avaleht",
"navbar.signup": "Registreeru",
"navbar.links.shares": "Minu jagamised",
"navbar.links.reverse": "Pööratud jagamised",
"navbar.avatar.account": "Minu konto",
"navbar.avatar.admin": "Administreerimine",
"navbar.avatar.signout": "Logi välja",
// END navbar
// /
"home.title": "<h>Isehostitav</h> failijagamisplatvorm.",
"home.description": "Kas tõesti soovid anda oma isiklikud failid kolmandate osapoolte nagu WeTransfer kätte?",
"home.bullet.a.name": "Isehostitav",
"home.bullet.a.description": "Hosti Pingvin Share oma seadmes.",
"home.bullet.b.name": "Privaatsus",
"home.bullet.b.description": "Sinu failid on sinu omad ja neile ei pääse ligi kolmandad osapooled.",
"home.bullet.c.name": "Ei mingeid tüütuid failisuuruse piiranguid",
"home.bullet.c.description": "Laadi üles suuri faile ilma piiranguteta. Ainuke piirang on sinu kõvaketta maht.",
"home.button.start": "Alusta",
"home.button.source": "Lähtekood",
// END /
// /auth/signin
"signin.title": "Tere tulemast tagasi",
"signin.description": "Kas sul pole veel kontot?",
"signin.button.signup": "Registreeru",
"signin.input.email-or-username": "E-post või kasutajanimi",
"signin.input.email-or-username.placeholder": "Sinu e-post või kasutajanimi",
"signin.input.password": "Parool",
"signin.input.password.placeholder": "Sinu parool",
"signin.button.submit": "Logi sisse",
"signIn.notify.totp-required.title": "Kahefaktoriline autentimine nõutud",
"signIn.notify.totp-required.description": "Palun sisesta oma kahefaktorilise autentimise kood",
"signIn.oauth.or": "VÕI",
"signIn.oauth.signInWith": "Logi sisse kasutades",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
"signIn.oauth.discord": "Discord",
"signIn.oauth.oidc": "OpenID",
// END /auth/signin
// /auth/signup
"signup.title": "Loo konto",
"signup.description": "Kas sul on juba konto?",
"signup.button.signin": "Logi sisse",
"signup.input.username": "Kasutajanimi",
"signup.input.username.placeholder": "Sinu kasutajanimi",
"signup.input.email": "E-post",
"signup.input.email.placeholder": "Sinu e-post",
"signup.button.submit": "Alustame",
// END /auth/signup
// /auth/totp
"totp.title": "TOTP autentimine",
"totp.button.signIn": "Sisene",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Unustasid oma parooli?",
"resetPassword.description": "Parooli lähtestamiseks sisesta enda e-posti aadress.",
"resetPassword.notify.success": "Kui antud e-post on registreeritud, saadetakse e-mailiga link parooli lähtestamiseks.",
"resetPassword.button.back": "Tagasi sisselogimislehele",
"resetPassword.text.resetPassword": "Lähtesta parool",
"resetPassword.text.enterNewPassword": "Sisesta uus parool",
"resetPassword.input.password": "Uus parool",
"resetPassword.notify.passwordReset": "Sinu parool on edukalt lähtestatud.",
// /account
"account.title": "Minu konto",
"account.card.info.title": "Konto info",
"account.card.info.username": "Kasutajanimi",
"account.card.info.email": "E-post",
"account.notify.info.success": "Konto edukalt uuendatud",
"account.card.password.title": "Parool",
"account.card.password.old": "Vana parool",
"account.card.password.new": "Uus parool",
"account.card.password.noPasswordSet": "Sul pole parooli seatud. E-posti ja parooliga sisselogimiseks pead looma parooli.",
"account.notify.password.success": "Parool edukalt muudetud",
"account.card.oauth.title": "Sisselogimine sotsiaalmeediatega",
"account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Ühenda",
"account.card.oauth.unlink": "Eemalda ühendus",
"account.card.oauth.unlinked": "Ühendus eemaldatud",
"account.modal.unlink.title": "Eemalda konto seos",
"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": "Ühendus eemaldatud edukalt",
"account.card.security.title": "Turvalisus",
"account.card.security.totp.enable.description": "Sisesta oma praegune parool, et alustada TOTP sisselülitamist",
"account.card.security.totp.disable.description": "Sisesta oma praegune parool, et välja lülitada TOTP",
"account.card.security.totp.button.start": "Alusta",
"account.modal.totp.title": "Lülita sisse TOTP",
"account.modal.totp.step1": "1. samm: Lisa oma autentikaator",
"account.modal.totp.step2": "2. samm: Kinnita oma kood",
"account.modal.totp.enterManually": "Sisesta käsitsi",
"account.modal.totp.code": "Kood",
"common.button.clickToCopy": "Klõpsa, et kopeerida",
"account.modal.totp.verify": "Kinnita",
"account.notify.totp.disable": "TOTP edukalt välja lülitatud",
"account.notify.totp.enable": "TOTP edukalt sisse lülitatud",
"account.card.language.title": "Keel",
"account.card.language.description": "Projekti tõlkis kogukond. Mõned keeleversioonid võivad olla mittetäielikud.",
"account.card.color.title": "Värviskeem",
// ThemeSwitcher.tsx
"account.theme.dark": "Tume",
"account.theme.light": "Hele",
"account.theme.system": "Süsteemi",
"account.button.delete": "Kustuta konto",
"account.modal.delete.title": "Kustuta konto",
"account.modal.delete.description": "Kas tahad tõesti kustutada enda konto koos kõikide jagatud failidega?",
// END /account
// /account/shares
"account.shares.title": "Minu jagamised",
"account.shares.title.empty": "Siin on tühjus 👀",
"account.shares.description.empty": "Sul pole ühtegi jagamist.",
"account.shares.button.create": "Loo üks",
"account.shares.info.title": "Jagamise andmed",
"account.shares.table.id": "ID",
"account.shares.table.name": "Nimi",
"account.shares.table.description": "Kirjeldus",
"account.shares.table.visitors": "Külastajad",
"account.shares.table.expiresAt": "Aegub",
"account.shares.table.createdAt": "Loodud",
"account.shares.table.size": "Suurus",
"account.shares.table.password-protected": "Parooliga kaitstud",
"account.shares.table.visitor-count": "{count} / {max}",
"account.shares.table.expiry-never": "Mitte kunagi",
"account.shares.modal.share-informations": "Jagamise andmed",
"account.shares.modal.share-link": "Jagamise link",
"account.shares.modal.delete.title": "Kustuta jagamine: {share}",
"account.shares.modal.delete.description": "Kas soovid tõesti seda jagamist kustutada?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Tagasijagamine",
"account.reverseShares.description": "Tagasijagamine võimaldab sul genereerida unikaalse URL-i, mille kaudu väliskasutajad saavad luua jagamise.",
"account.reverseShares.title.empty": "Siin on tühjus 👀",
"account.reverseShares.description.empty": "Sul pole ühtegi tagasijagamist.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Loo tagasijagamine",
"account.reverseShares.modal.expiration.label": "Aegumisaeg",
"account.reverseShares.modal.expiration.minute-singular": "Minut",
"account.reverseShares.modal.expiration.minute-plural": "Minutit",
"account.reverseShares.modal.expiration.hour-singular": "Tund",
"account.reverseShares.modal.expiration.hour-plural": "Tundi",
"account.reverseShares.modal.expiration.day-singular": "Päev",
"account.reverseShares.modal.expiration.day-plural": "Päeva",
"account.reverseShares.modal.expiration.week-singular": "Nädal",
"account.reverseShares.modal.expiration.week-plural": "Nädalat",
"account.reverseShares.modal.expiration.month-singular": "Kuu",
"account.reverseShares.modal.expiration.month-plural": "Kuud",
"account.reverseShares.modal.expiration.year-singular": "Aasta",
"account.reverseShares.modal.expiration.year-plural": "Aastat",
"account.reverseShares.modal.max-size.label": "Jagamise maksimaalne suurus",
"account.reverseShares.modal.send-email": "Saada e-posti teavitusi",
"account.reverseShares.modal.send-email.description": "Sulle saadetakse e-posti teavitus kui selle tagasijagamise lingiga luuakse jagamine.",
"account.reverseShares.modal.simplified": "Lihtrežiim",
"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": "Avalik juurdepääs",
"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": "Maksimaalne kasutuskordade arv",
"account.reverseShares.modal.max-use.description": "Maksimaalne arv kordi, mil seda URL-i saab kasutada jagamise loomiseks.",
"account.reverseShare.never-expires": "See tagasijagamine ei aegu kunagi.",
"account.reverseShare.expires-on": "See tagasijagamine aegub {expiration}.",
"account.reverseShares.table.no-shares": "Ühtegi jagamist pole veel loodud",
"account.reverseShares.table.count.singular": "jagamine",
"account.reverseShares.table.count.plural": "jagamised",
"account.reverseShares.table.shares": "Jagamised",
"account.reverseShares.table.remaining": "Järelejäänud kasutuskorrad",
"account.reverseShares.table.max-size": "Jagamise maksimaalne suurus",
"account.reverseShares.table.expires": "Aegub",
"account.reverseShares.modal.reverse-share-link": "Tagasijagamise link",
"account.reverseShares.modal.delete.title": "Kustuta tagasijagamine",
"account.reverseShares.modal.delete.description": "Kas soovid tõesti seda tagasijagamist kustutada? Kui jah, siis kustutatakse ka sellega seotud jagamised.",
// END /account/reverseShares
// /admin
"admin.title": "Administreerimine",
"admin.button.users": "Kasutajate haldamine",
"admin.button.shares": "Jagamiste haldamine",
"admin.button.config": "Seaded",
"admin.version": "Versioon",
// END /admin
// /admin/users
"admin.users.title": "Kasutajate haldamine",
"admin.users.table.username": "Kasutajanimi",
"admin.users.table.email": "E-post",
"admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Muuda kasutajat: {username}",
"admin.users.edit.update.admin-privileges": "Administraatori õigused",
"admin.users.edit.update.change-password.title": "Muuda parooli",
"admin.users.edit.update.change-password.field": "Uus parool",
"admin.users.edit.update.change-password.button": "Salvesta uus parool",
"admin.users.edit.update.notify.password.success": "Parool edukalt muudetud",
"admin.users.edit.delete.title": "Kustuta kasutaja: {username}?",
"admin.users.edit.delete.description": "Kas soovid tõesti kustutada selle kasutaja ja kõik tema jagamised?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Loo kasutaja",
"admin.users.modal.create.username": "Kasutajanimi",
"admin.users.modal.create.email": "E-post",
"admin.users.modal.create.password": "Parool",
"admin.users.modal.create.manual-password": "Sea parool käsitsi",
"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": "Administraatori õigused",
"admin.users.modal.create.admin.description": "Kui see on märgitud, saab kasutaja pääseda administraatori paneelile.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Jagamiste haldus",
"admin.shares.table.id": "Jagamise ID",
"admin.shares.table.username": "Looja",
"admin.shares.table.visitors": "Külastajad",
"admin.shares.table.expires": "Aegub",
"admin.shares.edit.delete.title": "Kustuta jagamine: {id}",
"admin.shares.edit.delete.description": "Kas soovid tõesti seda jagamist kustutada?",
// END /admin/shares
// /upload
"upload.title": "Laadi üles",
"upload.notify.confirm-leave": "Kas oled kindel, et soovid sellelt lehelt lahkuda? Sinu üleslaadimine tühistatakse.",
"upload.notify.generic-error": "Jagamise lõpetamisel tekkis viga.",
"upload.notify.count-failed": "{count} faili ei õnnestunud üles laadida. Proovime uuesti.",
"upload.reverse-share.error.invalid.title": "Vigane tagasijagamise link",
"upload.reverse-share.error.invalid.description": "See tagasijagamine on aegunud või vigane.",
// Dropzone.tsx
"upload.dropzone.title": "Laadi üles failid",
"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": "Sinu failid ületavad lubatud suuruse {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Nimi",
"upload.filelist.size": "Suurus",
// showCreateUploadModal.tsx
"upload.modal.title": "Loo jagamine",
"upload.modal.link.error.invalid": "Võib sisaldada ainult tähti, numbreid, alakriipse ja kriipse",
"upload.modal.link.error.taken": "See link on juba kasutusel",
"upload.modal.not-signed-in": "Sa ei ole sisse logitud",
"upload.modal.not-signed-in-description": "Sa ei saa oma jagamist käsitsi kustutada ega külastajate arvu vaadata.",
"upload.modal.expires.never": "mitte kunagi",
"upload.modal.expires.never-long": "Püsiv jagamine",
"upload.modal.expires.error.too-long": "Aegumiskuupäev ületab lubatud maksimaalset {max}.",
"upload.modal.link.label": "Link",
"upload.modal.expires.label": "Aegumisaeg",
"upload.modal.expires.minute-singular": "Minut",
"upload.modal.expires.minute-plural": "Minutit",
"upload.modal.expires.hour-singular": "Tund",
"upload.modal.expires.hour-plural": "Tundi",
"upload.modal.expires.day-singular": "Päev",
"upload.modal.expires.day-plural": "Päeva",
"upload.modal.expires.week-singular": "Nädal",
"upload.modal.expires.week-plural": "Nädalat",
"upload.modal.expires.month-singular": "Kuu",
"upload.modal.expires.month-plural": "Kuud",
"upload.modal.expires.year-singular": "Aasta",
"upload.modal.expires.year-plural": "Aastat",
"upload.modal.accordion.name-and-description.title": "Nimi ja kirjeldus",
"upload.modal.accordion.name-and-description.name.placeholder": "Nimi",
"upload.modal.accordion.name-and-description.description.placeholder": "Märkus selle jagamise saajatele",
"upload.modal.accordion.email.title": "E-kirja saajad",
"upload.modal.accordion.email.placeholder": "Sisesta e-posti aadressid",
"upload.modal.accordion.email.invalid-email": "Vigane e-posti aadress",
"upload.modal.accordion.security.title": "Turvavalikud",
"upload.modal.accordion.security.password.label": "Paroolikaitse",
"upload.modal.accordion.security.password.placeholder": "Parool puudub",
"upload.modal.accordion.security.max-views.label": "Maksimaalne vaatamiste arv",
"upload.modal.accordion.security.max-views.placeholder": "Piiramatu",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "See jagamine ei aegu mitte kunagi.",
"upload.modal.completed.expires-on": "See jagamine aegub {expiration}.",
"upload.modal.completed.share-ready": "Jagamine valmis",
"upload.modal.completed.notified-reverse-share-creator": "Oleme teavitanud tagasijagamise loojat. Saad samuti seda linki nendega käsitsi teiste vahenditega jagada.",
// END /upload
// /share/[id]
"share.title": "Jagamine {shareId}",
"share.description": "Vaata, mida ma sinuga jagasin!",
"share.fileCount": "{count, plural, =1 {# file} other {# files}} · {size} (zip file may be smaller due to compression)",
"share.error.visitor-limit-exceeded.title": "Külastajate limiit ületatud",
"share.error.visitor-limit-exceeded.description": "Selle jagamise külastajate limiit on ületatud.",
"share.error.removed.title": "Jagamine eemaldatud",
"share.error.not-found.title": "Jagamist ei leitud",
"share.error.not-found.description": "Otsitavat jagamist ei eksisteeri.",
"share.error.access-denied.title": "Privaatne jagamine",
"share.error.access-denied.description": "Praegusel kontol puudub luba sellele jagamisele juurde pääseda",
"share.modal.password.title": "Parool vajalik",
"share.modal.password.description": "Palun sisesta parool, et sellele jagamisele juurde pääseda.",
"share.modal.password": "Parool",
"share.modal.error.invalid-password": "Vigane parool",
"share.button.download-all": "Laadi kõik alla",
"share.notify.download-all-preparing": "Jagamist valmistatakse ette. Palun proovi mõne minuti pärast uuesti.",
"share.modal.file-link": "Faili link",
"share.table.name": "Nimi",
"share.table.size": "Suurus",
"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]
// /share/[id]/edit
"share.edit.title": "Muuda jagamist {shareId}",
"share.edit.append-upload": "Lisa fail",
"share.edit.notify.generic-error": "Jagamise lõpetamisel tekkis viga.",
"share.edit.notify.save-success": "Jagamine edukalt uuendatud",
// END /share/[id]/edit
// /imprint
"imprint.title": "Kontaktandmed",
// END /imprint
// /privacy
"privacy.title": "Privaatsuspoliitika",
// END /privacy
// /admin/config
"admin.config.config-file-warning.title": "Konfiguratsioonifail olemas",
"admin.config.config-file-warning.description": "Kuna teil on konfigureeritud Pingvin Share konfiguratsioonifailiga, ei saa te muuta konfiguratsiooni kasutajaliidest kasutades.",
"admin.config.title": "Seaded",
"admin.config.category.general": "Üldine",
"admin.config.category.share": "Jagamine",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "E-post",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Sotsiaalmeediaga sisselogimine",
"admin.config.general.app-name": "Rakenduse nimi",
"admin.config.general.app-name.description": "Rakenduse nimi",
"admin.config.general.app-url": "Rakenduse URL",
"admin.config.general.app-url.description": "URL, mille kaudu Pingvin Share on kättesaadav",
"admin.config.general.secure-cookies": "Turvalised küpsised",
"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": "Kuva avaleht",
"admin.config.general.show-home-page.description": "Kas kuvada avalehte",
"admin.config.general.session-duration": "Seansi kestus",
"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.description": "Muuda oma logo laadides üles uus pilt. Pildi formaat peab olema PNG ja kuju 1:1.",
"admin.config.general.logo.placeholder": "Vali pilt",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Luba e-posti teavitused jagamise saajatele",
"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": "Jagamise saajate pealkiri",
"admin.config.email.share-recipients-subject.description": "Pealkiri mis saadetakse jagamise saajatele.",
"admin.config.email.share-recipients-message": "Jagamise saajate sõnum",
"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": "Tagasijagamise Pealkiri",
"admin.config.email.reverse-share-subject.description": "Pealkiri mis saadetakse kui keegi loob jagamise sinu tagasijagamise lingiga.",
"admin.config.email.reverse-share-message": "Tagasijagamise sõnum",
"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": "Parooli lähtestamise Pealkiri",
"admin.config.email.reset-password-subject.description": "Pealkiri mis saadetakse kui kasutaja taotleb parooli lähtestamist.",
"admin.config.email.reset-password-message": "Parooli lähtestamise sõnum",
"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": "Kutse pealkiri",
"admin.config.email.invite-subject.description": "Pealkiri mis saadetakse kui administraator kutsub kasutajat.",
"admin.config.email.invite-message": "Kutse sõnum",
"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": "Luba registreerimine",
"admin.config.share.allow-registration.description": "Kas registreerimine on lubatud",
"admin.config.share.allow-unauthenticated-shares": "Luba autentimata jagamised",
"admin.config.share.allow-unauthenticated-shares.description": "Kas autentimata kasutajad saavad jagamisi luua",
"admin.config.share.max-expiration": "Maksimaalne aegumisaeg",
"admin.config.share.max-expiration.description": "Maksimaalne jagamise aegumisaeg. Määra 0, et lubada piiramatu aegumisaeg.",
"admin.config.share.share-id-length": "Vaikimisi jagamise ID pikkus",
"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": "Maksimaalne suurus",
"admin.config.share.max-size.description": "Maksimaalne jagamise suurus",
"admin.config.share.zip-compression-level": "Zip tihendustase",
"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": "Andmeploki suurus",
"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": "Ava jagamise loomise aken automaatselt",
"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": "Luba",
"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.description": "SMTP serveri host",
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "SMTP serveri port",
"admin.config.smtp.email": "E-post",
"admin.config.smtp.email.description": "E-posti aadress, millelt e-kirjad saadetakse",
"admin.config.smtp.username": "Kasutajanimi",
"admin.config.smtp.username.description": "SMTP serveri kasutajanimi",
"admin.config.smtp.password": "Parool",
"admin.config.smtp.password.description": "SMTP serveri parool",
"admin.config.smtp.button.test": "Saada test e-kiri",
"admin.config.smtp.allow-unauthorized-certificates": "Usalda volitamata SMTP serveri sertifikaate",
"admin.config.smtp.allow-unauthorized-certificates.description": "Sea see tõeks ainult siis, kui pead usaldama iseallkirjastatud sertifikaate.",
"admin.config.oauth.allow-registration": "Luba registreerimine",
"admin.config.oauth.allow-registration.description": "Luba kasutajatel registreerida sotsiaalmeedia sisselogimise kaudu",
"admin.config.oauth.ignore-totp": "Ignoreeri TOTP-i",
"admin.config.oauth.ignore-totp.description": "Kas ignoreerida TOTP-i kui kasutaja kasutab sotsiaalset sisselogimist.",
"admin.config.oauth.disable-password": "Keela parooliga sisselogimine",
"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.description": "Kas GitHub sisselogimine on lubatud",
"admin.config.oauth.github-client-id": "GitHub kliendi ID",
"admin.config.oauth.github-client-id.description": "GitHub OAuth rakenduse kliendi ID",
"admin.config.oauth.github-client-secret": "GitHub kliendi saladus",
"admin.config.oauth.github-client-secret.description": "GitHub OAuth rakenduse kliendi saladus",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Kas Google sisselogimine on lubatud",
"admin.config.oauth.google-client-id": "Google kliendi ID",
"admin.config.oauth.google-client-id.description": "Google OAuth rakenduse kliendi ID",
"admin.config.oauth.google-client-secret": "Google kliendi saladus",
"admin.config.oauth.google-client-secret.description": "Google OAuth rakenduse kliendi saladus",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Kas Microsofti sisselogimine on lubatud",
"admin.config.oauth.microsoft-tenant": "Microsofti tenant",
"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 kliendi ID",
"admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth rakenduse kliendi ID",
"admin.config.oauth.microsoft-client-secret": "Microsoft kliendi saladus",
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth rakenduse kliendi saladus",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Kas Discord sisselogimine on lubatud",
"admin.config.oauth.discord-limited-users": "Piiratud Discord kasutajad",
"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": "Piiratud Discord serveri ID",
"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 kliendi ID",
"admin.config.oauth.discord-client-id.description": "Discord OAuth rakenduse kliendi ID",
"admin.config.oauth.discord-client-secret": "Discord kliendi saladus",
"admin.config.oauth.discord-client-secret.description": "Discord OAuth rakenduse kliendi saladus",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Kas OpenID Connect sisselogimine on lubatud",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect avastamis-URI",
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth rakenduse avastamis-URI",
"admin.config.oauth.oidc-sign-out": "Logi välja OpenID Connectist",
"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 ulatus",
"admin.config.oauth.oidc-scope.description": "Ulatus, mida tuleks OpenID Connect pakkujalt küsida.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect kasutajanime väide",
"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": "Tee rollideni OpenID Connect tokenis",
"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 roll üldiseks juurdepääsuks",
"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 roll admin juurdepääsuks",
"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 kliendi ID",
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth rakenduse kliendi ID",
"admin.config.oauth.oidc-client-secret": "OpenID Connect kliendi saladus",
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth rakenduse kliendi saladus",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Luba LDAP",
"admin.config.ldap.enabled.description": "Kasutaja sisselogimiseks kasutada LDAP autentimist",
"admin.config.ldap.url": "Serveri URL",
"admin.config.ldap.url.description": "LDAP serveri URL",
"admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Vaikimisi kasutaja, mida kasutatakse kasutajate otsimiseks",
"admin.config.ldap.bind-password": "Bind parool",
"admin.config.ldap.bind-password.description": "Parool, mida kasutatakse kasutajate otsimiseks",
"admin.config.ldap.search-base": "Kasutajate alus",
"admin.config.ldap.search-base.description": "Põhikoht, kus kasutajaid otsitakse",
"admin.config.ldap.search-query": "Kasutaja päring",
"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 grupp",
"admin.config.ldap.admin-groups.description": "Grupp, mis on vajalik admin juurdepääsuks.",
"admin.config.ldap.field-name-member-of": "Kasutaja gruppide atribuut",
"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": "Kasutaja e-posti atribuut",
"admin.config.ldap.field-name-email.description": "LDAP atribuut kasutaja e-posti aadressi jaoks.",
"admin.config.notify.success": "Seaded edukalt uuendatud.",
"admin.config.notify.logo-success": "Logo edukalt uuendatud. Veebilehe värskendamiseks võib kuluda paar minutit.",
"admin.config.notify.no-changes": "Pole muudatusi mida salvestada.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Lubatud",
"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.description": "S3 ämbri URL.",
"admin.config.s3.region": "Regioon",
"admin.config.s3.region.description": "S3 ämbri regioon.",
"admin.config.s3.bucket-name": "Ämbri nimi",
"admin.config.s3.bucket-name.description": "S3 ämbri nimi.",
"admin.config.s3.bucket-path": "S3 ämbri tee",
"admin.config.s3.bucket-path.description": "Vaikimisi tee, mida kasutatakse failide salvestamiseks S3 ämbris.",
"admin.config.s3.key": "Võti",
"admin.config.s3.key.description": "S3 ämbri võti.",
"admin.config.s3.secret": "Saladus",
"admin.config.s3.secret.description": "S3 ämbri saladus.",
"admin.config.s3.use-checksum": "Kasuta kontrollsummat",
"admin.config.s3.use-checksum.description": "Lülita välja, kui tagaliides ei toeta kontrollsummasid (nt B2).",
"admin.config.category.legal": "Juriidiline",
"admin.config.legal.enabled": "Luba juriidilised teated",
"admin.config.legal.enabled.description": "Kas kuvada linki kontaktandmetele ja privaatsuspoliitikale jaluses.",
"admin.config.legal.imprint-text": "Kontaktandmete tekst",
"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.imprint-url": "Kontaktandmete URL",
"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-text": "Privaatsuspoliitika tekst",
"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.description": "Ups, seda lehte ei eksisteeri.",
"404.button.home": "Viia mind tagasi avalehele",
// error
"error.title": "Viga",
"error.description": "Ups!",
"error.button.back": "Mine tagasi",
"error.msg.default": "Midagi läks valesti.",
"error.msg.access_denied": "Sa tühistasid autentimisprotsessi, palun proovi uuesti.",
"error.msg.expired_token": "Autentimisprotsess kestis liiga kaua, palun proovi uuesti.",
"error.msg.invalid_token": "Sisemine viga",
"error.msg.no_user": "Kasutajat, kes on seotud selle {0} kontoga ei eksisteeri.",
"error.msg.no_email": "Ei saa sellest {0} kontost e-posti aadressi hankida.",
"error.msg.already_linked": "See {0} konto on juba seotud teise kontoga.",
"error.msg.not_linked": "See {0} konto pole veel ühegi kontoga seotud.",
"error.msg.unverified_account": "See {0} konto on kinnitamata, palun proovi pärast kinnitamist uuesti.",
"error.msg.user_not_allowed": "Sul ei ole luba sisse logida.",
"error.msg.cannot_get_user_info": "Ei õnnestunud saada sinu kasutaja andmeid sellest {0} kontost.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID Connect",
// Common translations
"common.button.save": "Salvesta",
"common.button.create": "Loo",
"common.button.submit": "Esita",
"common.button.delete": "Kustuta",
"common.button.cancel": "Tühista",
"common.button.confirm": "Kinnita",
"common.button.disable": "Lülita välja",
"common.button.share": "Jaga",
"common.button.generate": "Genereeri",
"common.button.done": "Valmis",
"common.text.link": "Link",
"common.text.navigate-to-link": "Külastage linki",
"common.text.or": "või",
"common.text.redirecting": "Ümbersuunamine...",
"common.button.go-back": "Mine tagasi",
"common.button.go-home": "Mine avalehele",
"common.notify.copied": "Sinu link kopeeriti lõikelauale",
"common.notify.copied-link": "Sinu link kopeeriti lõikelauale",
"common.success": "Õnnestus",
"common.error": "Viga",
"common.error.unknown": "Tundmatu viga",
"common.error.invalid-email": "Vigane e-posti aadress",
"common.error.too-short": "Peab olema vähemalt {length} tähemärki",
"common.error.too-long": "Peab olema maksimaalselt {length} tähemärki",
"common.error.number-too-small": "Peab olema vähemalt {min}",
"common.error.number-too-large": "Peab olema maksimaalselt {max}",
"common.error.exact-length": "Peab olema täpselt {length} tähemärki",
"common.error.invalid-number": "Peab olema number",
"common.error.field-required": "See väli on kohustuslik"
};

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Pilvetä",
"navbar.signin": "Kirjaudu Sisään",
"navbar.home": "Koti",
"navbar.signup": "Sign up",
"navbar.signup": "Rekisteröidy",
"navbar.links.shares": "Minun jakaukset",
"navbar.links.reverse": "Takaperin jaetut",
"navbar.avatar.account": "Oma tIli",
@@ -33,13 +33,13 @@ export default {
"signin.button.submit": "Kirjaudu sisään",
"signIn.notify.totp-required.title": "Kaksivaiheinen tunnistautuminen vaadittu",
"signIn.notify.totp-required.description": "Syötä kaksivaiheisen tunnistautumisen koodi tähän",
"signIn.oauth.or": "OR",
"signIn.oauth.signInWith": "Sign in with",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
"signIn.oauth.discord": "Discord",
"signIn.oauth.oidc": "OpenID",
"signIn.oauth.or": "TAI",
"signIn.oauth.signInWith": "Kirjaudu käyttäen",
"signIn.oauth.github": "GitHubia",
"signIn.oauth.google": "Googlea",
"signIn.oauth.microsoft": "Microsofta",
"signIn.oauth.discord": "Discordia",
"signIn.oauth.oidc": "OpenID",
// END /auth/signin
// /auth/signup
"signup.title": "Rekisteröidy",
@@ -53,7 +53,7 @@ export default {
// END /auth/signup
// /auth/totp
"totp.title": "TOTP Authentication",
"totp.button.signIn": "Sign in",
"totp.button.signIn": "Kirjaudu sisään",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Unohditko salasanan?",
@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Koko",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Jaetun tiedot",
"account.shares.modal.share-link": "Jaa linkki",
"account.shares.modal.delete.title": "Delete share: {share}",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "Pilvetä",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Kohdattiin odottamaton virhe jaon luomisessa.",
"upload.notify.count-failed": "{count} tiedostoa ei voitu ladata. Yritetään uudelleen.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Pilvetä tiedostoja",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -229,7 +235,7 @@ export default {
"upload.modal.not-signed-in-description": "Et voi poistaa jakoasi manuaalisesti ja tarkastella kävijöiden määrää.",
"upload.modal.expires.never": "ei koskaan",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.error.too-long": "Viimeinen voimassaolopäivä ylittää enimmäisarvon {max}.",
"upload.modal.link.label": "Linkki",
"upload.modal.expires.label": "Vanhentuminen",
"upload.modal.expires.minute-singular": "Minuutti",
@@ -244,9 +250,9 @@ export default {
"upload.modal.expires.month-plural": "Kuukautta",
"upload.modal.expires.year-singular": "Vuosi",
"upload.modal.expires.year-plural": "Vuotta",
"upload.modal.accordion.name-and-description.title": "Name and description",
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
"upload.modal.accordion.name-and-description.title": "Nimi ja kuvaus",
"upload.modal.accordion.name-and-description.name.placeholder": "Nimi",
"upload.modal.accordion.name-and-description.description.placeholder": "Huomautus tämän jaon vastaanottajille",
"upload.modal.accordion.email.title": "Sähköpostin vastaanottajat",
"upload.modal.accordion.email.placeholder": "Syötä sähköpostin vastaanottajat",
"upload.modal.accordion.email.invalid-email": "Virheellinen sähköpostiosoite",
@@ -264,35 +270,45 @@ export default {
// /share/[id]
"share.title": "Jaa {shareId}",
"share.description": "Katso, mitä olen jakanut kanssasi!",
"share.fileCount": "{count, plural, one {}=1 {# tiedosto} other {# tiedostoa}} · {size} (zip tiedosto voi olla pienempi pakkauksesta)",
"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.removed.title": "Jako poistettu",
"share.error.not-found.title": "Jakoa ei löydetty",
"share.error.not-found.description": "Etsimääsi sivua ei ole olemassa.",
"share.error.access-denied.title": "Private share",
"share.error.access-denied.title": "Yksityinen jako",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.modal.password.title": "Salasana vaaditaan",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Salasana",
"share.modal.error.invalid-password": "Virheellinen salasana",
"share.button.download-all": "Lataa kaikki",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.notify.download-all-preparing": "Jako on valmistumassa. Yritä uudelleen muutaman minuutin kuluttua.",
"share.modal.file-link": "Tiedoston linkki",
"share.table.name": "Nimi",
"share.table.size": "Koko",
"share.modal.file-preview.error.not-supported.title": "Esikatselua ei tuettu",
"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": "Esikatselua ei tueta tämäntyyppisille tiedostoille. Ole hyvä ja lataa tiedosto nähdäksesi sen.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Edit {shareId}",
"share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
"share.edit.title": "Muokkaa {shareId}",
"share.edit.append-upload": "Lisää tiedosto",
"share.edit.notify.generic-error": "Odottamaton virhe jaon luomisessa.",
"share.edit.notify.save-success": "Jako päivitetty onnistuneesti",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Yleiset",
"admin.config.category.share": "Jako",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Sähköposti",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Sovelluksen nimi",
"admin.config.general.app-url": "Sovelluksen URL",
"admin.config.general.app-url.description": "Millä URL-osoitteella Pingvin Share on saatavilla",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "Näytä kotisivu",
"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.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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Sähköpostijaon otsikko",
"admin.config.email.share-recipients-subject.description": "Sähköpostin aihe, joka saa lähetetään jaon vastaanottajille.",
"admin.config.email.share-recipients-message": "Sähköpostijaon viesti",
"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 {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": "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.reverse-share-subject": "Käänteisen jaon aihe",
"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-message": "Käänteisen jakoviestin viesti",
@@ -330,23 +356,25 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Salli anonyymit jaot",
"admin.config.share.allow-unauthenticated-shares.description": "Voiko tunnistamattomat käyttäjät luoda jakoja",
"admin.config.share.max-expiration": "Max expiration",
"admin.config.share.max-expiration.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Maksimikoko",
"admin.config.share.max-size.description": "Jaon enimmäiskoko tavuissa (bytes)",
"admin.config.share.max-size.description": "Jaon enimmäiskoko tavuissa",
"admin.config.share.zip-compression-level": "Zip puristustaso",
"admin.config.share.zip-compression-level.description": "Säädä tasoa tiedoston koon ja pakkausnopeuden välillä. Kelvolliset arvot vaihtelevat 09, 0 ei puristusta ja 9 on suurin puristusvoima. ",
"admin.config.share.chunk-size": "Chunk size",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.chunk-size": "Lohkojen koko",
"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": "Avaa automaattisesti jakomodaali",
"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": "Käytä",
"admin.config.smtp.enabled.description": "Onko SMTP käytössä. Aseta tämä todeksi vain, jos olet syöttänyt SMTP-palvelimen isäntän, portin, sähköpostin, käyttäjän ja salasanan.",
"admin.config.smtp.host": "Isäntä",
"admin.config.smtp.host.description": "SMTP palvelimen isäntä",
"admin.config.smtp.port": "Portti",
"admin.config.smtp.port.description": "SMTP palvelimen portti",
"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": "Sähköpostiosoite, josta sähköpostit lähetetään",
"admin.config.smtp.username": "Käyttäjätunnus",
"admin.config.smtp.username.description": "SMTP palvelimen käyttäjänimi",
"admin.config.smtp.password": "Salasana",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
@@ -427,24 +457,55 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Hups tätä sivua ei ole olemassa.",
"404.button.home": "Tuo minut takaisin kotiin",
// error
"error.title": "Error",
"error.description": "Oops!",
"error.button.back": "Go back",
"error.msg.default": "Something went wrong.",
"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.invalid_token": "Internal Error",
"error.msg.no_user": "User linked to this {0} account doesn't exist.",
"error.msg.no_email": "Can't get email address from this {0} account.",
"error.msg.already_linked": "This {0} account is already linked to another account.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.user_not_allowed": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.title": "Virhe",
"error.description": "Hups!",
"error.button.back": "Takaisin",
"error.msg.default": "Jokin meni pieleen.",
"error.msg.access_denied": "Peruutit tunnistautumisprosessin, ole hyvä ja yritä uudelleen.",
"error.msg.expired_token": "Todennusprosessi kesti liian kauan, yritä uudelleen.",
"error.msg.invalid_token": "Sisäinen virhe",
"error.msg.no_user": "Käyttäjä linkitetty tähän {0} tiliin ei ole olemassa.",
"error.msg.no_email": "Sähköpostiosoitetta ei saada tältä {0} -tililtä.",
"error.msg.already_linked": "Tämä {0} -tili on jo linkitetty toiseen tiliin.",
"error.msg.not_linked": "Tätä {0} -tiliä ei ole vielä linkitetty mihinkään tiliin.",
"error.msg.unverified_account": "Tätä {0} -tiliä ei ole vahvistettu, yritä uudelleen vahvistuksen jälkeen.",
"error.msg.user_not_allowed": "Sinulla ei ole oikeutta kirjautua sisään.",
"error.msg.cannot_get_user_info": "Käyttäjätietojasi ei voi saada tältä {0} -tililtä.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
@@ -464,10 +525,11 @@ export default {
"common.text.link": "Linkki",
"common.text.navigate-to-link": "Visit link",
"common.text.or": "tai",
"common.text.redirecting": "Redirecting...",
"common.text.redirecting": "Uudelleen ohjataan...",
"common.button.go-back": "Takaisin",
"common.button.go-home": "Go home",
"common.button.go-home": "Palaa kotinäkymään",
"common.notify.copied": "Linkki kopioitiin leikepöydälle",
"common.notify.copied-link": "Linkki kopioitiin leikepöydälle",
"common.success": "Suoritettu",
"common.error": "Virhe",
"common.error.unknown": "Tapahtui tuntematon virhe",

View File

@@ -91,14 +91,14 @@ export default {
"account.card.security.totp.enable.description": "Entrez votre mot de passe actuel pour activer TOTP",
"account.card.security.totp.disable.description": "Entrez votre mot de passe actuel pour désactiver TOTP",
"account.card.security.totp.button.start": "Démarrer",
"account.modal.totp.title": "Activer TOTP",
"account.modal.totp.step1": "Étape 1 : Ajouter votre authentificateur",
"account.modal.totp.title": "Activer la double authentification",
"account.modal.totp.step1": "Étape 1 : Ajouter votre authentification",
"account.modal.totp.step2": "Étape 2 : Valider votre code",
"account.modal.totp.enterManually": "Saisir manuellement",
"account.modal.totp.code": "Code",
"common.button.clickToCopy": "Cliquez pour copier",
"account.modal.totp.verify": "Vérifier",
"account.notify.totp.disable": "TOTP désactivé avec succès",
"account.notify.totp.disable": "Double authentification (TOTP) désactivé avec succès",
"account.notify.totp.enable": "TOTP activé avec succès",
"account.card.language.title": "Langue",
"account.card.language.description": "Le projet est traduit par la communauté. Certaines traductions peuvent être incomplètes.",
@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expire le",
"account.shares.table.createdAt": "Créé le",
"account.shares.table.size": "Taille",
"account.shares.table.password-protected": "Protégé par un mot de passe",
"account.shares.table.visitor-count": "{count} sur {max}",
"account.shares.table.expiry-never": "Jamais",
"account.shares.modal.share-informations": "Détails du partage",
"account.shares.modal.share-link": "Lien de partage",
"account.shares.modal.delete.title": "Supprimer le partage : {share}",
@@ -151,7 +154,7 @@ export default {
"account.reverseShares.modal.expiration.year-plural": "Ans",
"account.reverseShares.modal.max-size.label": "Taille maximale du partage",
"account.reverseShares.modal.send-email": "Envoyer des notifications par courriel",
"account.reverseShares.modal.send-email.description": "Vous envoie une notification par courriel lorsqu'un partage est créé avec ce lien de partage inversé.",
"account.reverseShares.modal.send-email.description": "Vous envoi une notification par courriel lorsqu'un partage est créé avec ce lien de partage inversé.",
"account.reverseShares.modal.simplified": "Mode simple",
"account.reverseShares.modal.simplified.description": "Simplifiez la tâche à la personne qui vous partage un fichier. Ils ne pourront que personnaliser le nom et la description du partage.",
"account.reverseShares.modal.public-access": "Accès public",
@@ -190,7 +193,7 @@ export default {
"admin.users.edit.update.change-password.button": "Enregistrer le nouveau mot de passe",
"admin.users.edit.update.notify.password.success": "Le mot de passe a été modifié",
"admin.users.edit.delete.title": "Supprimer l'utilisateur : {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.description": "Souhaitez-vous vraiment supprimer cet utilisateur et tous ses partages ?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Créer un utilisateur",
"admin.users.modal.create.username": "Surnom",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "Envoyer",
"upload.notify.confirm-leave": "Êtes-vous sûr de vouloir quitter cette page ? Votre envoi sera annulé.",
"upload.notify.generic-error": "Une erreur est survenue durant le traitement de votre partage.",
"upload.notify.count-failed": "{count} fichier(s) na(ont) pas pu être envoyé(s). Veuillez réessayer.",
"upload.reverse-share.error.invalid.title": "Lien de partage inversé invalide",
"upload.reverse-share.error.invalid.description": "Ce partage inversé a expiré ou n'est pas valide.",
// Dropzone.tsx
"upload.dropzone.title": "Téléverser des fichiers",
"upload.dropzone.description": "Glisser-déposer les fichiers ici pour commencer votre partage. Nous n'acceptons que les fichiers jusqu'à {maxSize} au total.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Partage {shareId}",
"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.description": "La limite de visiteurs de ce partage a été dépassée.",
"share.error.removed.title": "Partage supprimé",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Partage privé",
"share.error.access-denied.description": "Le compte actuel n'a pas la permission d'accéder à ce partage",
"share.modal.password.title": "Mot de passe requis",
"share.modal.password.description": "Veuillez entrer le mot de passe d'accès à ce partage.",
"share.modal.password.description": "Veuillez entrer le mot de passe pour accéder à ce partage.",
"share.modal.password": "Mot de passe",
"share.modal.error.invalid-password": "Mot de passe incorrect",
"share.button.download-all": "Télécharger tout",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Une erreur est survenue durant le traitement de votre partage.",
"share.edit.notify.save-success": "Partage mis à jour avec succès",
// END /share/[id]/edit
// /imprint
"imprint.title": "Mentions légales",
// END /imprint
// /privacy
"privacy.title": "Politique de confidentialité",
// END /privacy
// /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.category.general": "Général",
"admin.config.category.share": "Partage",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Courriel",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Identifiant social",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Le nom de lapplication",
"admin.config.general.app-url": "URL de lappli",
"admin.config.general.app-url.description": "Depuis quel URL le partage Pingvin est disponible",
"admin.config.general.secure-cookies": "Cookies sécurisés",
"admin.config.general.secure-cookies.description": "Définir ou non le marquage sécurisé sur les cookies. Si activé, le site ne fonctionnera pas lorsqu'il est accédé via HTTP.",
"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.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.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.cache.ttl": "DDV",
"admin.config.cache.ttl.description": "Durée de vie des informations conservées en cache.",
"admin.config.cache.max-items": "Maximum d'éléments",
"admin.config.cache.max-items.description": "Nombre maximum d'éléments conservés en cache.",
"admin.config.cache.redis-enabled": "Redis activé",
"admin.config.cache.redis-enabled.description": "Usuellement, Pingvin Share conserve les informations en mémoire vive. Si vous exécutez plusieurs instances de Pingvin Share, vous devez activer la mise en cache Redis pour partager le cache entre ces instances.",
"admin.config.cache.redis-url": "URL de Redis",
"admin.config.cache.redis-url.description": "URL de connexion à linstance de Redis pour servir de cache.",
"admin.config.email.enable-share-email-recipients": "Activer le partage par courriel",
"admin.config.email.enable-share-email-recipients.description": "Autoriser ou non le partage de courriels avec les destinataires. N'activer cette option que si SMTP est activé.",
"admin.config.email.share-recipients-subject": "Sujet dun partage",
"admin.config.email.share-recipients-subject.description": "Intitulé du courriel envoyé aux destinataires dun partage.",
"admin.config.email.share-recipients-message": "Message dun partage",
"admin.config.email.share-recipients-message.description": "Contenu du courriel qui est envoyé aux destinataires du partage. Variables possibles :\n {creator} : Le pseudo de lauteur du partage\n {shareUrl} : LURL du partage\n {desc} : La description du partage\n {expires} : La date d'expiration du partage\nCes variables seront remplacées par leur valeur réelle.",
"admin.config.email.share-recipients-message.description": "Contenu du courriel qui est envoyé aux destinataires du partage. Variables possibles :\n {creator} - Le nom d'utilisateur du créateur du partage\n {creatorEmail} - L'adresse mail du créateur du partage\n {shareUrl} - L'URL du partage\n {desc} - La description du partage\n {expires} - La date d'expiration du partage.\n Ces variables seront remplacées par leur valeur effective.",
"admin.config.email.reverse-share-subject": "Sujet dun partage inversé",
"admin.config.email.reverse-share-subject.description": "Intitulé du courriel envoyé lorsque quelquun a partagé des fichiers depuis votre partage inversé.",
"admin.config.email.reverse-share-message": "Message dun partage inversé",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Autoriser les partages anonymes",
"admin.config.share.allow-unauthenticated-shares.description": "Permet aux visiteurs de créer des partages",
"admin.config.share.max-expiration": "Échéance",
"admin.config.share.max-expiration.description": "Échéance du partage en heures. Indiquez 0 pour quil nexpire jamais.",
"admin.config.share.max-expiration.description": "Expiration du partage en heures. Réglez sur 0 pour qu'il n'expire jamais.",
"admin.config.share.share-id-length": "Taille de l'identifiant généré",
"admin.config.share.share-id-length.description": "Taille par défaut de l'identifiant généré pour un partage. Cette valeur est aussi utilisée pour générer les liens des partages inverses. Une valeur inférieure à 8 n'est pas considérée sûre.",
"admin.config.share.max-size": "Taille max",
"admin.config.share.max-size.description": "Taille maximale du partage en octets",
"admin.config.share.max-size.description": "Taille maximale du partage",
"admin.config.share.zip-compression-level": "Niveau de compression",
"admin.config.share.zip-compression-level.description": "Ajustez le niveau pour trouver l'équilibre entre la taille du fichier et la vitesse de compression. Les valeurs valides vont de 0 à 9, 0 étant sans compression et 9 étant la compression maximale. ",
"admin.config.share.chunk-size": "Taille des tronçons",
"admin.config.share.chunk-size.description": "Ajustez la taille des tronçons (en octets) pour que vos téléchargements équilibrent efficacité et fiabilité en fonction de votre connexion Internet. Les petits tronçons peuvent améliorer les taux de succès sur les connexions instables, tandis que les tronçons plus importants accélèrent les téléchargements sur les connexions stables.",
"admin.config.share.chunk-size.description": "Ajustez la taille des tronçons pour que vos téléchargements équilibrent efficacité et fiabilité en fonction de votre connexion Internet. Les petits tronçons peuvent améliorer les taux de succès sur les connexions instables, tandis que les tronçons plus importants accélèrent les téléchargements sur les connexions stables.",
"admin.config.share.auto-open-share-modal": "Ouvrir automatiquement la modale de partage",
"admin.config.share.auto-open-share-modal.description": "La modale de création de partage apparaît automatiquement lorsquun utilisateur sélectionne des fichiers, ce qui élimine le besoin de cliquer manuellement sur le bouton.",
"admin.config.smtp.enabled": "Activer",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port du serveur SMTP",
"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.description": "Nom dutilisateur du serveur SMTP",
"admin.config.smtp.password": "Mot de passe",
@@ -356,8 +384,8 @@ export default {
"admin.config.smtp.allow-unauthorized-certificates.description": "Ne permettez ceci que si vous avez besoin de faire confiance aux certificats autosignés.",
"admin.config.oauth.allow-registration": "Autoriser linscription",
"admin.config.oauth.allow-registration.description": "Permettre aux utilisateurs de sinscrire via leur identifiant social",
"admin.config.oauth.ignore-totp": "Ignorer TOTP",
"admin.config.oauth.ignore-totp.description": "Ignorer le TOTP lorsque lutilisateur utilise un identifiant social.",
"admin.config.oauth.ignore-totp": "Ignorer double authentification TOTP",
"admin.config.oauth.ignore-totp.description": "Ignorer la double-authentification (TOTP) lorsque lutilisateur utilise un identifiant social",
"admin.config.oauth.disable-password": "Désactiver la connexion par mot de passe",
"admin.config.oauth.disable-password.description": "Désactive la connexion par mot de passe\nAssurez-vous quun fournisseur OAuth soit correctement configuré avant dactiver cette configuration pour éviter d'être enfermé.",
"admin.config.oauth.github-enabled": "GitHub",
@@ -382,8 +410,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Le secret du client de lapplication Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Permettre la connexion via Discord",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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": "Utilisateurs limités sur Discord",
"admin.config.oauth.discord-limited-users.description": "Limiter la connexion à des utilisateurs spécifiques par leur identifiant Discord. Laissez vide pour désactiver.",
"admin.config.oauth.discord-limited-guild": "ID de serveur restreint Discord",
"admin.config.oauth.discord-limited-guild.description": "Limiter la connexion aux utilisateurs sur un serveur spécifique. Laissez vide pour désactiver.",
"admin.config.oauth.discord-client-id": "ID du client Discord",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "LURI de découverte de la connexion à l'application OpenID OAuth",
"admin.config.oauth.oidc-sign-out": "Déconnexion du fournisseur OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Si activé, le bouton \"Déconnexion\" vous déconnectera également du fournisseur d'identité OpenID Connect",
"admin.config.oauth.oidc-scope": "Paramètres de connexion OpenID",
"admin.config.oauth.oidc-scope.description": "Paramètres fournis par votre fournisseur OpenID.",
"admin.config.oauth.oidc-username-claim": "Revendication du nom dutilisateur OpenID",
"admin.config.oauth.oidc-username-claim.description": "Le champ contenant la revendication du nom dutilisateur dans le jeton OpenID Connect. Laissez vide si vous ne savez pas quoi indiquer.",
"admin.config.oauth.oidc-role-path": "Chemin vers les rôles dans le jeton OpenID Connect",
@@ -427,6 +457,37 @@ export default {
"admin.config.ldap.field-name-member-of.description": "Nom d'attribut LDAP pour les groupes dont un utilisateur est membre. Il est utilisé lors de la vérification du groupe d'administrateurs.",
"admin.config.ldap.field-name-email": "Nom d'attribut de l'e-mail de l'utilisateur",
"admin.config.ldap.field-name-email.description": "Nom d'attribut LDAP pour l'e-mail d'un utilisateur.",
"admin.config.notify.success": "Configuration mise à jour avec succès.",
"admin.config.notify.logo-success": "Logo mis à jour avec succès. La mise à jour sur le site peut prendre quelques minutes.",
"admin.config.notify.no-changes": "Aucune modification à enregistrer.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Activé",
"admin.config.s3.enabled.description": "Si S3 doit être utilisé pour stocker les fichiers partagés au lieu du système de fichiers local.",
"admin.config.s3.endpoint": "Point de terminaison",
"admin.config.s3.endpoint.description": "L'URL du bucket S3.",
"admin.config.s3.region": "Région",
"admin.config.s3.region.description": "La région du bucket S3.",
"admin.config.s3.bucket-name": "Nom du bucket",
"admin.config.s3.bucket-name.description": "Le nom du bucket S3.",
"admin.config.s3.bucket-path": "Chemin",
"admin.config.s3.bucket-path.description": "Le chemin par défaut qui doit être utilisé pour stocker les fichiers dans le bucket S3.",
"admin.config.s3.key": "Clé",
"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.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.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.imprint-text": "Texte des mentions légales",
"admin.config.legal.imprint-text.description": "Le texte qui doit être affiché dans les mentions légales. Supporte le Markdown. Laissez vide pour mettre un lien vers une page de mentions légales externe.",
"admin.config.legal.imprint-url": "URL des mentions légales",
"admin.config.legal.imprint-url.description": "Si vous avez déjà une page de mentions légales, vous pouvez indiquer son URL ici au lieu d'utiliser le champ de texte.",
"admin.config.legal.privacy-policy-text": "Texte de la politique de confidentialité",
"admin.config.legal.privacy-policy-text.description": "Le texte qui doit être affiché dans la politique de confidentialité. Supporte le Markdown. Laissez vide pour mettre un lien vers une page de politique de confidentialité externe.",
"admin.config.legal.privacy-policy-url": "URL de la politique de confidentialité",
"admin.config.legal.privacy-policy-url.description": "Si vous avez déjà une page de politique de confidentialité, vous pouvez indiquer son URL ici au lieu d'utiliser le champ de texte.",
// 404
"404.description": "Désolé, mais cette page nexiste pas.",
"404.button.home": "Retour à laccueil",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Précédent",
"common.button.go-home": "Accueil",
"common.notify.copied": "Votre lien a été copié dans le presse-papiers",
"common.notify.copied-link": "Votre lien a été copié dans le presse-papiers",
"common.success": "Opération réussie",
"common.error": "Erreur",
"common.error.unknown": "Une erreur inconnue est survenue",

View File

@@ -0,0 +1,544 @@
export default {
// Navbar
"navbar.upload": "Otpremi",
"navbar.signin": "Prijava",
"navbar.home": "Početna",
"navbar.signup": "Registracija",
"navbar.links.shares": "Moja dijeljenja",
"navbar.links.reverse": "Obrnuto dijeljenje",
"navbar.avatar.account": "Moj račun",
"navbar.avatar.admin": "Administracija",
"navbar.avatar.signout": "Odjavi se",
// END navbar
// /
"home.title": "<h>Samo-hostana</h> platforma za dijeljenje datoteka.",
"home.description": "Želite li zaista povjeriti svoje osobne datoteke trećim stranama poput WeTransfera?",
"home.bullet.a.name": "Samo-hostano",
"home.bullet.a.description": "Hostajte Pingvin Share na svom uređaju.",
"home.bullet.b.name": "Privatnost",
"home.bullet.b.description": "Vaše datoteke ostaju vaše i nikada neće biti dostupne trećim stranama.",
"home.bullet.c.name": "Bez dosadnog ograničenja veličine datoteka",
"home.bullet.c.description": "Otpremite datoteke bilo koje veličine koliko želite. Samo vaš tvrdi disk je granica.",
"home.button.start": "Započni",
"home.button.source": "Izvorni kod",
// END /
// /auth/signin
"signin.title": "Dobrodošli natrag",
"signin.description": "Još uvijek nemate račun?",
"signin.button.signup": "Registriraj se",
"signin.input.email-or-username": "Email ili korisničko ime",
"signin.input.email-or-username.placeholder": "Vaš email ili korisničko ime",
"signin.input.password": "Lozinka",
"signin.input.password.placeholder": "Vaša lozinka",
"signin.button.submit": "Prijavite se",
"signIn.notify.totp-required.title": "Potrebna je dvofaktorska autentifikacija",
"signIn.notify.totp-required.description": "Unesite svoj dvofaktorski kod za autentifikaciju",
"signIn.oauth.or": "Ili",
"signIn.oauth.signInWith": "Prijavite se sa",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
"signIn.oauth.discord": "Discord",
"signIn.oauth.oidc": "OpenID",
// END /auth/signin
// /auth/signup
"signup.title": "Kreiraj račun",
"signup.description": "Već imate račun?",
"signup.button.signin": "Prijavite se",
"signup.input.username": "Korisničko ime",
"signup.input.username.placeholder": "Vaše korisničko ime",
"signup.input.email": "Email",
"signup.input.email.placeholder": "Vaš email",
"signup.button.submit": "Krenimo",
// END /auth/signup
// /auth/totp
"totp.title": "TOTP autentifikacija",
"totp.button.signIn": "Prijavite se",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Zaboravili ste lozinku?",
"resetPassword.description": "Unesite svoj email kako biste resetirali lozinku.",
"resetPassword.notify.success": "Poruka s poveznicom za resetiranje lozinke je poslana ako unesena email adresa postoji.",
"resetPassword.button.back": "Natrag na stranicu za prijavu",
"resetPassword.text.resetPassword": "Obnovi lozinku",
"resetPassword.text.enterNewPassword": "Unesite svoju novu lozinku",
"resetPassword.input.password": "Nova lozinka",
"resetPassword.notify.passwordReset": "Vaša lozinka je uspješno resetirana.",
// /account
"account.title": "Moj račun",
"account.card.info.title": "Podaci o računu",
"account.card.info.username": "Korisničko ime",
"account.card.info.email": "Email",
"account.notify.info.success": "Račun je uspješno ažuriran",
"account.card.password.title": "Lozinka",
"account.card.password.old": "Stara lozinka",
"account.card.password.new": "Nova lozinka",
"account.card.password.noPasswordSet": "Nemate postavljenu lozinku. Za prijavu korištenjem emaila i lozinke potrebno je da postavite lozinku.",
"account.notify.password.success": "Lozinka je uspješno promijenjena",
"account.card.oauth.title": "Social login",
"account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Poveži",
"account.card.oauth.unlink": "Prekini vezu",
"account.card.oauth.unlinked": "Veza je prekinuta",
"account.modal.unlink.title": "Prekini vezu s računom",
"account.modal.unlink.description": "Uklanjanje veze s vašim društvenim računima može dovesti do gubitka pristupa vašem računu ako se ne sjećate svojih pristupnih podataka.",
"account.notify.oauth.unlinked.success": "Veza je prekinuta",
"account.card.security.title": "Sigurnost",
"account.card.security.totp.enable.description": "Unesite svoju trenutnu lozinku kako biste započeli omogućavanje TOTP-a",
"account.card.security.totp.disable.description": "Unesite svoju trenutnu lozinku kako biste onemogućili TOTP",
"account.card.security.totp.button.start": "Započni",
"account.modal.totp.title": "Omogući TOTP",
"account.modal.totp.step1": "Korak 1: Dodajte svoj autentifikator",
"account.modal.totp.step2": "Korak 2: Potvrdite svoj kod",
"account.modal.totp.enterManually": "Unesite ručno",
"account.modal.totp.code": "Kod",
"common.button.clickToCopy": "Kliknite za kopiranje",
"account.modal.totp.verify": "Potvrdi",
"account.notify.totp.disable": "TOTP je uspješno onemogućen",
"account.notify.totp.enable": "TOTP je uspješno omogućen",
"account.card.language.title": "Jezik",
"account.card.language.description": "Projekt je preveden od strane zajednice. Neki jezici mogu biti nepotpuni.",
"account.card.color.title": "Shema boja",
// ThemeSwitcher.tsx
"account.theme.dark": "Tamna",
"account.theme.light": "Svijetla",
"account.theme.system": "Sustav",
"account.button.delete": "Izbriši račun",
"account.modal.delete.title": "Izbriši račun",
"account.modal.delete.description": "Jeste li sigurni da želite izbrisati svoj račun, uključujući sva vaša aktivna dijeljenja?",
// END /account
// /account/shares
"account.shares.title": "Moja dijeljenja",
"account.shares.title.empty": "Ovdje je prazno 👀",
"account.shares.description.empty": "Nemate nikakva dijeljenja.",
"account.shares.button.create": "Kreirajte",
"account.shares.info.title": "Informacije o dijeljenju",
"account.shares.table.id": "ID",
"account.shares.table.name": "Naziv",
"account.shares.table.description": "Opis",
"account.shares.table.visitors": "Posjetitelji",
"account.shares.table.expiresAt": "Istječe",
"account.shares.table.createdAt": "Kreirano",
"account.shares.table.size": "Veličina",
"account.shares.table.password-protected": "Zaštićeno lozinkom",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Nikad",
"account.shares.modal.share-informations": "Informacije o dijeljenju",
"account.shares.modal.share-link": "Podijelite poveznicu",
"account.shares.modal.delete.title": "Izbriši dijeljenje {share}",
"account.shares.modal.delete.description": "Jeste li sigurni da želite izbrisati ovo dijeljenje?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Obrnuto dijeljenje",
"account.reverseShares.description": "Obrnuto dijeljenje omogućava vam da generirate jedinstveni URL koji omogućava vanjskim korisnicima kreiranje dijeljenja.",
"account.reverseShares.title.empty": "Ovdje je prazno 👀",
"account.reverseShares.description.empty": "Nemate obrnuta dijeljenja.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Kreirajte obrnuto dijeljenje",
"account.reverseShares.modal.expiration.label": "Istječe",
"account.reverseShares.modal.expiration.minute-singular": "Minuta",
"account.reverseShares.modal.expiration.minute-plural": "Minute",
"account.reverseShares.modal.expiration.hour-singular": "Sat",
"account.reverseShares.modal.expiration.hour-plural": "Sati",
"account.reverseShares.modal.expiration.day-singular": "Dan",
"account.reverseShares.modal.expiration.day-plural": "Dani",
"account.reverseShares.modal.expiration.week-singular": "Tjedan",
"account.reverseShares.modal.expiration.week-plural": "Tjedni",
"account.reverseShares.modal.expiration.month-singular": "Mjesec",
"account.reverseShares.modal.expiration.month-plural": "Mjeseci",
"account.reverseShares.modal.expiration.year-singular": "Godina",
"account.reverseShares.modal.expiration.year-plural": "Godine",
"account.reverseShares.modal.max-size.label": "Maksimalna veličina dijeljenja",
"account.reverseShares.modal.send-email": "Pošalji obavijesti emailom",
"account.reverseShares.modal.send-email.description": "Pošaljite obavijest emailom kada se kreira dijeljenje pomoću ovog obrnutog linka za dijeljenje.",
"account.reverseShares.modal.simplified": "Jednostavni način",
"account.reverseShares.modal.simplified.description": "Olakšajte osobi koja prenosi datoteku da je podijeli s vama. Oni će moći prilagoditi samo naziv i opis dijeljenja.",
"account.reverseShares.modal.public-access": "Javni pristup",
"account.reverseShares.modal.public-access.description": "Omogućite da dijeljenja kreirana ovim obrnutim linkom budu javna. Ako je onemogućeno, samo vi i kreator dijeljenja ćete imati pristup pregledavanju.",
"account.reverseShares.modal.max-use.label": "Maksimalan broj korištenja",
"account.reverseShares.modal.max-use.description": "Maksimalan broj puta koji ovaj URL može biti korišten za kreiranje dijeljenja.",
"account.reverseShare.never-expires": "Ovo obrnuto dijeljenje nikada neće isteći.",
"account.reverseShare.expires-on": "Ovo obrnuto dijeljenje će isteći {expiration}.",
"account.reverseShares.table.no-shares": "Još nema kreiranih dijeljenja",
"account.reverseShares.table.count.singular": "dijeljenje",
"account.reverseShares.table.count.plural": "dijeljenja",
"account.reverseShares.table.shares": "Dijeljenja",
"account.reverseShares.table.remaining": "Preostalo korištenje",
"account.reverseShares.table.max-size": "Maksimalna veličina dijeljenja",
"account.reverseShares.table.expires": "Istječe",
"account.reverseShares.modal.reverse-share-link": "Link za obrnuto dijeljenje",
"account.reverseShares.modal.delete.title": "Obrišite obrnuto dijeljenje",
"account.reverseShares.modal.delete.description": "Jeste li sigurni da želite izbrisati ovo obrnuto dijeljenje? Ako to učinite, pridružena dijeljenja će također biti izbrisana.",
// END /account/reverseShares
// /admin
"admin.title": "Administracija",
"admin.button.users": "Upravljanje korisnicima",
"admin.button.shares": "Upravljanje dijeljenjima",
"admin.button.config": "Konfiguracija",
"admin.version": "Verzija",
// END /admin
// /admin/users
"admin.users.title": "Upravljanje korisnicima",
"admin.users.table.username": "Korisničko ime",
"admin.users.table.email": "Email",
"admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Uredi korisnika: {username}",
"admin.users.edit.update.admin-privileges": "Administratorske privilegije",
"admin.users.edit.update.change-password.title": "Promijenite lozinku",
"admin.users.edit.update.change-password.field": "Nova lozinka",
"admin.users.edit.update.change-password.button": "Spremite novu lozinku",
"admin.users.edit.update.notify.password.success": "Lozinka je uspješno promijenjena",
"admin.users.edit.delete.title": "Obrišite korisnika: {username}?",
"admin.users.edit.delete.description": "Jeste li sigurni da želite obrisati ovog korisnika i sva njegova dijeljenja?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Kreiraj korisnika",
"admin.users.modal.create.username": "Korisničko ime",
"admin.users.modal.create.email": "Email",
"admin.users.modal.create.password": "Lozinka",
"admin.users.modal.create.manual-password": "Postavite lozinku ručno",
"admin.users.modal.create.manual-password.description": "Ako nije označeno, korisnik će dobiti email s poveznicom za postavljanje lozinke.",
"admin.users.modal.create.admin": "Administratorske privilegije",
"admin.users.modal.create.admin.description": "Ako je označeno, korisnik će moći pristupiti administratorskom panelu.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Upravljanje dijeljenjima",
"admin.shares.table.id": "ID dijeljenja",
"admin.shares.table.username": "Kreator",
"admin.shares.table.visitors": "Posjetitelji",
"admin.shares.table.expires": "Istječe",
"admin.shares.edit.delete.title": "Obrišite dijeljenje: {id}",
"admin.shares.edit.delete.description": "Jeste li sigurni da želite obrisati ovo dijeljenje?",
// END /admin/shares
// /upload
"upload.title": "Pošalji",
"upload.notify.confirm-leave": "Jeste li sigurni da želite napustiti ovu stranicu? Vaše učitavanje će biti otkazano.",
"upload.notify.generic-error": "Došlo je do pogreške prilikom dovršavanja dijeljenja.",
"upload.notify.count-failed": "Učitavanje {count} datoteka nije uspjelo. Pokušavam ponovno.",
"upload.reverse-share.error.invalid.title": "Nevažeća poveznica za obrnuto dijeljenje",
"upload.reverse-share.error.invalid.description": "Ovo obrnuto dijeljenje je isteklo ili je nevažeće.",
// Dropzone.tsx
"upload.dropzone.title": "Pošaljite datoteke",
"upload.dropzone.description": "Povucite i ispustite datoteke ovdje kako biste započeli dijeljenje. Prihvaćamo samo datoteke ukupne veličine do {maxSize}.",
"upload.dropzone.notify.file-too-big": "Vaše datoteke premašuju maksimalnu veličinu dijeljenja od {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Naziv",
"upload.filelist.size": "Veličina",
// showCreateUploadModal.tsx
"upload.modal.title": "Kreiraj dijeljenje",
"upload.modal.link.error.invalid": "Može sadržavati samo slova, brojeve, donje crte i crtice",
"upload.modal.link.error.taken": "Ova poveznica je već u upotrebi",
"upload.modal.not-signed-in": "Niste prijavljeni",
"upload.modal.not-signed-in-description": "Nećete moći ručno obrisati svoje dijeljenje niti vidjeti broj posjetitelja.",
"upload.modal.expires.never": "nikad",
"upload.modal.expires.never-long": "Trajno dijeljenje",
"upload.modal.expires.error.too-long": "Datum isteka premašuje maksimalnu vrijednost od {max}.",
"upload.modal.link.label": "Poveznica",
"upload.modal.expires.label": "Istječe",
"upload.modal.expires.minute-singular": "Minuta",
"upload.modal.expires.minute-plural": "Minute",
"upload.modal.expires.hour-singular": "Sat",
"upload.modal.expires.hour-plural": "Sati",
"upload.modal.expires.day-singular": "Dan",
"upload.modal.expires.day-plural": "Dani",
"upload.modal.expires.week-singular": "Tjedan",
"upload.modal.expires.week-plural": "Tjedni",
"upload.modal.expires.month-singular": "Mjesec",
"upload.modal.expires.month-plural": "Mjeseci",
"upload.modal.expires.year-singular": "Godina",
"upload.modal.expires.year-plural": "Godine",
"upload.modal.accordion.name-and-description.title": "Ime i opis",
"upload.modal.accordion.name-and-description.name.placeholder": "Ime",
"upload.modal.accordion.name-and-description.description.placeholder": "Napomena za primatelje ovog dijeljenja",
"upload.modal.accordion.email.title": "Primatelji emaila",
"upload.modal.accordion.email.placeholder": "Unesite primatelje emaila",
"upload.modal.accordion.email.invalid-email": "Neispravna email adresa",
"upload.modal.accordion.security.title": "Sigurnosne postavke",
"upload.modal.accordion.security.password.label": "Zaštita lozinkom",
"upload.modal.accordion.security.password.placeholder": "Bez lozinke",
"upload.modal.accordion.security.max-views.label": "Maksimalan broj pregleda",
"upload.modal.accordion.security.max-views.placeholder": "Bez ograničenja",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Ovo dijeljenje nikada neće isteći.",
"upload.modal.completed.expires-on": "Ovo dijeljenje će isteći {expiration}.",
"upload.modal.completed.share-ready": "Dijeljenje je spremno",
"upload.modal.completed.notified-reverse-share-creator": "Obavijestili smo kreatora obrnutog dijeljenja. Također možete ručno podijeliti ovu poveznicu s njima na druge načine.",
// END /upload
// /share/[id]
"share.title": "Dijeljenje {shareId}",
"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.description": "Ograničenje broja posjetitelja za ovo dijeljenje je premašeno.",
"share.error.removed.title": "Dijeljenje je uklonjeno",
"share.error.not-found.title": "Dijeljenje nije pronađeno",
"share.error.not-found.description": "Dijeljenje koje tražite ne postoji.",
"share.error.access-denied.title": "Privatno dijeljenje",
"share.error.access-denied.description": "Trenutni račun nema dozvolu za pristup ovom dijeljenju.",
"share.modal.password.title": "Lozinka je potrebna",
"share.modal.password.description": "Molimo unesite lozinku za pristup ovom dijeljenju.",
"share.modal.password": "Lozinka",
"share.modal.error.invalid-password": "Neispravna lozinka",
"share.button.download-all": "Preuzmi sve",
"share.notify.download-all-preparing": "Dijeljenje se priprema. Molimo pokušajte ponovo za nekoliko minuta.",
"share.modal.file-link": "Poveznica datoteke",
"share.table.name": "Naziv",
"share.table.size": "Veličina",
"share.modal.file-preview.error.not-supported.title": "Pregled nije podržan",
"share.modal.file-preview.error.not-supported.description": "Pregledi nisu podržani za ovu vrstu datoteka. Molimo preuzmite datoteku za pregled.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Uredi {shareId}",
"share.edit.append-upload": "Dodaj datoteku",
"share.edit.notify.generic-error": "Došlo je do pogreške prilikom dovršavanja vašeg dijeljenja.",
"share.edit.notify.save-success": "Dijeljenje je uspješno ažurirano",
// END /share/[id]/edit
// /imprint
"imprint.title": "Otisak",
// END /imprint
// /privacy
"privacy.title": "Pravilima o zaštiti privatnosti",
// END /privacy
// /admin/config
"admin.config.config-file-warning.title": "Configuration file present",
"admin.config.config-file-warning.description": "",
"admin.config.title": "Konfiguracija",
"admin.config.category.general": "Opće",
"admin.config.category.share": "Dijeljenje",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social login",
"admin.config.general.app-name": "Naziv aplikacije",
"admin.config.general.app-name.description": "Naziv aplikacije",
"admin.config.general.app-url": "URL aplikacije",
"admin.config.general.app-url.description": "Na kojoj URL adresi je dostupan Pingvin Share",
"admin.config.general.secure-cookies": "Sigurni kolačići",
"admin.config.general.secure-cookies.description": "Želite li postaviti sigurnosni atribut na kolačiće? Ako je omogućeno, stranica neće raditi preko HTTP-a.",
"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.session-duration": "Trajanje sesije",
"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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Omogućite dijeljenje putem emaila",
"admin.config.email.enable-share-email-recipients.description": "Želite li omogućiti dijeljenje putem emaila. Omogućite ovo samo ako je SMTP aktiviran.",
"admin.config.email.share-recipients-subject": "Naslov emaila za primatelje dijeljenja",
"admin.config.email.share-recipients-subject.description": "Predmet emaila koji se šalje primateljima dijeljenja.",
"admin.config.email.share-recipients-message": "Poruka za primatelje dijeljenja",
"admin.config.email.share-recipients-message.description": "Poruka koja se šalje primateljima dijeljenja. Dostupne varijable:\n{creator} - Korisničko ime kreatora dijeljenja\n{creatorEmail} - Email kreatora dijeljenja\n{shareUrl} - URL dijeljenja\n{desc} - Opis dijeljenja\n{expires} - Datum isteka dijeljenja\nOve varijable će biti zamijenjene stvarnim vrijednostima.",
"admin.config.email.reverse-share-subject": "Predmet obrnutog dijeljenja",
"admin.config.email.reverse-share-subject.description": "Predmet emaila koji se šalje kada netko kreira dijeljenje s vašim obrnutim linkom za dijeljenje.",
"admin.config.email.reverse-share-message": "Poruka za obrnuto dijeljenje",
"admin.config.email.reverse-share-message.description": "Poruka koja se šalje kada netko kreira dijeljenje s vašom obrnutom poveznicom za dijeljenje. {shareUrl} će biti zamijenjen imenom kreatora i URL-om dijeljenja.",
"admin.config.email.reset-password-subject": "Predmet za resetiranje lozinke",
"admin.config.email.reset-password-subject.description": "Predmet emaila koji se šalje kada korisnik zatraži resetiranje lozinke.",
"admin.config.email.reset-password-message": "Poruka za resetiranje lozinke",
"admin.config.email.reset-password-message.description": "Poruka koja se šalje kada korisnik zatraži resetiranje lozinke. {url} će biti zamijenjen poveznicom za resetiranje lozinke.",
"admin.config.email.invite-subject": "Predmet pozivnice",
"admin.config.email.invite-subject.description": "Predmet emaila koji se šalje kada administrator pozove korisnika.",
"admin.config.email.invite-message": "Poruka pozivnice",
"admin.config.email.invite-message.description": "Poruka koja se šalje kada administrator pozove korisnika. {url} će biti zamijenjen poveznicom za poziv, {email} emailom, a {password} lozinkom korisnika.",
"admin.config.share.allow-registration": "Dozvoli registraciju",
"admin.config.share.allow-registration.description": "Je li registracija dozvoljena",
"admin.config.share.allow-unauthenticated-shares": "Dozvoli dijeljenje bez autentifikacije",
"admin.config.share.allow-unauthenticated-shares.description": "Mogu li korisnici bez autentifikacije kreirati dijeljenja",
"admin.config.share.max-expiration": "Maksimalno trajanje",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Dužina zadano generiranog ID-a za dijeljenje",
"admin.config.share.share-id-length.description": "Zadana dužina generiranog ID-a za dijeljenje. Ova vrijednost se također koristi za generiranje poveznica za obrnuto dijeljenje. Vrijednost manja od 8 se ne smatra sigurnom.",
"admin.config.share.max-size": "Maksimalna veličina",
"admin.config.share.max-size.description": "Maksimalna veličina dijeljenja",
"admin.config.share.zip-compression-level": "Razina Zip kompresije",
"admin.config.share.zip-compression-level.description": "Postavite razinu za balansiranje između veličine datoteke i brzine kompresije. Važeće vrijednosti su od 0 do 9, gdje 0 znači bez kompresije, a 9 maksimalnu kompresiju.",
"admin.config.share.chunk-size": "Veličina dijela",
"admin.config.share.chunk-size.description": "Postavite veličinu dijela za učitavanja kako biste uravnotežili učinkovitost i pouzdanost prema vašoj internetskoj vezi. Manji dijelovi mogu poboljšati uspješnost za nestabilne veze, dok veći dijelovi omogućuju brže učitavanje za stabilne veze.",
"admin.config.share.auto-open-share-modal": "Automatski otvori modal za kreiranje dijeljenja",
"admin.config.share.auto-open-share-modal.description": "Modal za kreiranje dijeljenja automatski se pojavljuje kada korisnik odabere datoteke, eliminirajući potrebu za ručnim klikom na gumb.",
"admin.config.smtp.enabled": "Omogući",
"admin.config.smtp.enabled.description": "Je li SMTP omogućen. Postavite na 'točno' samo ako ste unijeli host, port, email, korisničko ime i lozinku vašeg SMTP servera.",
"admin.config.smtp.host": "Domaćin",
"admin.config.smtp.host.description": "Domaćin SMTP servera",
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port domaćina SMTP servera",
"admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Korisničko ime",
"admin.config.smtp.username.description": "Korisničko ime SMTP servera",
"admin.config.smtp.password": "Lozinka",
"admin.config.smtp.password.description": "Lozinka SMTP servera",
"admin.config.smtp.button.test": "Pošaljite testni email",
"admin.config.smtp.allow-unauthorized-certificates": "Dopuštanje neautoriziranih SMTP certifikata",
"admin.config.smtp.allow-unauthorized-certificates.description": "Postavite ovo na \"točno\" samo ako je potrebno vjerovati samo-potpisanim certifikatima.",
"admin.config.oauth.allow-registration": "Dozvoli registraciju",
"admin.config.oauth.allow-registration.description": "Dozvolite korisnicima da se registriraju putem društvene prijave",
"admin.config.oauth.ignore-totp": "Zanemari TOTP",
"admin.config.oauth.ignore-totp.description": "Želite li zanemariti TOTP kada korisnik koristi društvenu prijavu",
"admin.config.oauth.disable-password": "Onemogućite prijavu lozinkom",
"admin.config.oauth.disable-password.description": "Omogućiti prijavu lozinkom ili ne.\nProvjerite je li OAuth pružatelj usluga ispravno konfiguriran prije aktiviranja ove opcije kako biste izbjegli zaključavanje računa.",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Je li omogućena prijava putem GitHuba",
"admin.config.oauth.github-client-id": "GitHub ID klijenta",
"admin.config.oauth.github-client-id.description": "ID klijenta GitHub OAuth aplikacije",
"admin.config.oauth.github-client-secret": "Tajna GitHub klijenta",
"admin.config.oauth.github-client-secret.description": "Tajna klijenta GitHub OAuth aplikacije",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Je li omogućena prijava putem Googlea",
"admin.config.oauth.google-client-id": "Google ID klijenta",
"admin.config.oauth.google-client-id.description": "ID klijenta Google OAuth aplikacije",
"admin.config.oauth.google-client-secret": "Tajna Google klijenta",
"admin.config.oauth.google-client-secret.description": "Tajna klijenta Google OAuth aplikacije",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Je li omogućena prijava putem Microsofta",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
"admin.config.oauth.microsoft-tenant.description": "ID stanara za Microsoft OAuth aplikaciju:\n- `common`: Korisnici s osobnim Microsoft računom i poslovnim ili školskim računom s Microsoft Entra ID-a mogu se prijaviti u aplikaciju.\n- `organizations`: Samo korisnici s poslovnim ili školskim računima s Microsoft Entra ID-a mogu se prijaviti u aplikaciju.\n- `consumers`: Samo korisnici s osobnim Microsoft računom mogu se prijaviti u aplikaciju.\n- Naziv domene stanara Microsoft Entra ID ili ID stanara u GUID formatu: Samo korisnici iz određenog Microsoft Entra ID stanara (članovi direktorija s poslovnim ili školskim računom ili gosti direktorija s osobnim Microsoft računom) mogu se prijaviti u aplikaciju.",
"admin.config.oauth.microsoft-client-id": "Microsoft ID klijenta",
"admin.config.oauth.microsoft-client-id.description": "ID klijenta Microsoft OAuth aplikacije",
"admin.config.oauth.microsoft-client-secret": "Tajna Microsoft klijenta",
"admin.config.oauth.microsoft-client-secret.description": "Tajna klijenta za Microsoft OAuth aplikaciju",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Je li omogućena prijava putem Discorda",
"admin.config.oauth.discord-limited-users": "Ograničenje za Discord korisnike",
"admin.config.oauth.discord-limited-users.description": "Ograničite prijavljivanje na određene korisnike pomoću njihovog Discord ID-a. Ostavite prazno kako biste onemogućili.",
"admin.config.oauth.discord-limited-guild": "Ograničenje za Discord server",
"admin.config.oauth.discord-limited-guild.description": "Ograničite prijavljivanje na korisnike određenog servera. Ostavite prazno kako biste onemogućili.",
"admin.config.oauth.discord-client-id": "Discord ID klijenta",
"admin.config.oauth.discord-client-id.description": "ID klijenta Discord OAuth aplikacije",
"admin.config.oauth.discord-client-secret": "Discord klijent tajna",
"admin.config.oauth.discord-client-secret.description": "Tajna klijenta Discord OAuth aplikacije",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Omogućiti prijavu putem OpenID Connect-a ili ne",
"admin.config.oauth.oidc-discovery-uri": "URI za OpenID Connect Discovery",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI za otkrivanje OpenID Connect OAuth aplikacije",
"admin.config.oauth.oidc-sign-out": "Odjava s OpenID Connect-a",
"admin.config.oauth.oidc-sign-out.description": "Hoće li gumb 'Odjava' također odjaviti korisnika s OpenID Connect pružatelja usluge",
"admin.config.oauth.oidc-scope": "Opseg OpenID Connect-a",
"admin.config.oauth.oidc-scope.description": "Opsezi koji bi trebali biti zatraženi od OpenID Connect pružatelja usluge.",
"admin.config.oauth.oidc-username-claim": "Potraživanje korisničkog imena u OpenID Connect-u",
"admin.config.oauth.oidc-username-claim.description": "Potraživanje korisničkog imena u OpenID Connect ID tokenu. Ostavite prazno ako niste sigurni što je ova konfiguracija.",
"admin.config.oauth.oidc-role-path": "Putanja do uloga u OpenID Connect tokenu",
"admin.config.oauth.oidc-role-path.description": "Mora biti valjana JMES putanja koja referencira niz uloga. " + "Upravljanje pravima pristupa pomoću uloga u OpenID Connect-u preporučuje se samo ako nijedan drugi pružatelj identiteta nije konfiguriran i ako je prijava lozinkom onemogućena. " + "Ostavite prazno ako niste sigurni što je ova konfiguracija.",
"admin.config.oauth.oidc-role-general-access": "Uloga u OpenID Connect-u za opći pristup",
"admin.config.oauth.oidc-role-general-access.description": "Uloga potrebna za opći pristup. Mora biti prisutna u ulogama korisnika kako bi se mogao prijaviti. " + "Ostavite prazno ako niste sigurni što je ova konfiguracija.",
"admin.config.oauth.oidc-role-admin-access": "Uloga u OpenID Connect-u za administratorski pristup",
"admin.config.oauth.oidc-role-admin-access.description": "Uloga potrebna za administratorski pristup. Mora biti prisutna u ulogama korisnika kako bi mogli pristupiti administratorskom panelu. " + "Ostavite prazno ako niste sigurni što je ova konfiguracija.",
"admin.config.oauth.oidc-client-id": "OpenID Connect ID klijenta",
"admin.config.oauth.oidc-client-id.description": "ID klijenta OpenID Connect OAuth aplikacije",
"admin.config.oauth.oidc-client-secret": "OpenID Connect tajna klijenta",
"admin.config.oauth.oidc-client-secret.description": "Tajna klijenta OpenID Connect OAuth aplikacije",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Omogući LDAP",
"admin.config.ldap.enabled.description": "Koristi LDAP autentifikaciju za prijavu korisnika",
"admin.config.ldap.url": "URL poslužitelja",
"admin.config.ldap.url.description": "URL LDAP poslužitelja",
"admin.config.ldap.bind-dn": "DN za vezivanje",
"admin.config.ldap.bind-dn.description": "Zadani korisnik koji se koristi za pretragu korisnika",
"admin.config.ldap.bind-password": "Lozinka za vezivanje",
"admin.config.ldap.bind-password.description": "Lozinka koja se koristi za izvršavanje pretrage korisnika",
"admin.config.ldap.search-base": "Baza korisnika",
"admin.config.ldap.search-base.description": "Lokacija baze, mjesto gdje će se izvršiti pretraga korisnika",
"admin.config.ldap.search-query": "Upit za korisnika",
"admin.config.ldap.search-query.description": "Upit za korisnika koji će se koristiti za pretragu 'Baze korisnika' za LDAP korisnika. %username% se može koristiti kao oznaka za unos korisnika.",
"admin.config.ldap.admin-groups": "Administratorska grupa",
"admin.config.ldap.admin-groups.description": "Grupa koja je potrebna za administratorski pristup.",
"admin.config.ldap.field-name-member-of": "Naziv atributa korisničkih grupa",
"admin.config.ldap.field-name-member-of.description": "LDAP naziv atributa za grupe čiji je korisnik član. Ovo se koristi pri provjeri administratorske grupe.",
"admin.config.ldap.field-name-email": "Naziv atributa za email korisnika",
"admin.config.ldap.field-name-email.description": "LDAP naziv atributa za email korisnika.",
"admin.config.notify.success": "Konfiguracija je uspješno ažurirana.",
"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.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"admin.config.s3.bucket-path": "Putanja",
"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.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Ups - Ova stranica ne postoji.",
"404.button.home": "Vrati me na početnu stranicu",
// error
"error.title": "Greška",
"error.description": "Ups!",
"error.button.back": "Idi natrag",
"error.msg.default": "Nešto je pošlo po zlu.",
"error.msg.access_denied": "Otkazali ste proces autentifikacije, pokušajte ponovno.",
"error.msg.expired_token": "Proces autentifikacije je trajao predugo, pokušajte ponovno.",
"error.msg.invalid_token": "Interna greška",
"error.msg.no_user": "Korisnik povezan s ovim {0} računom ne postoji.",
"error.msg.no_email": "Nije moguće dobiti adresu emaila s ovog {0} računa.",
"error.msg.already_linked": "Ovaj {0} račun je već povezan s drugim računom.",
"error.msg.not_linked": "Ovaj {0} račun još uvijek nije povezan ni s jednim računom.",
"error.msg.unverified_account": "Ovaj {0} račun je nepotvrđen, molimo pokušajte ponovno nakon verifikacije.",
"error.msg.user_not_allowed": "Nemate dozvolu za prijavu.",
"error.msg.cannot_get_user_info": "Nije moguće dohvatiti vaše korisničke informacije s ovog {0} računa.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenId Connect",
// Common translations
"common.button.save": "Spremi",
"common.button.create": "Kreiraj",
"common.button.submit": "Pošalji",
"common.button.delete": "Obriši",
"common.button.cancel": "Otkaži",
"common.button.confirm": "Potvrdi",
"common.button.disable": "Onemogući",
"common.button.share": "Podijeli",
"common.button.generate": "Generiraj",
"common.button.done": "Gotovo",
"common.text.link": "Poveznica",
"common.text.navigate-to-link": "Posjetite poveznicu",
"common.text.or": "ili",
"common.text.redirecting": "Preusmjeravanje...",
"common.button.go-back": "Idi natrag",
"common.button.go-home": "Početna stranica",
"common.notify.copied": "Vaša poveznica je kopirana u međuspremnik",
"common.notify.copied-link": "Vaša poveznica je kopirana u međuspremnik",
"common.success": "Uspješno",
"common.error": "Greška",
"common.error.unknown": "Došlo je do nepoznate greške",
"common.error.invalid-email": "Neispravna email adresa",
"common.error.too-short": "Mora imati najmanje {length} znakova",
"common.error.too-long": "Mora imati najviše {length} znakova",
"common.error.number-too-small": "Mora biti najmanje {min}",
"common.error.number-too-large": "Mora biti najviše {max}",
"common.error.exact-length": "Mora imati točno {length} znakova",
"common.error.invalid-number": "Mora biti broj",
"common.error.field-required": "Polje je obavezno"
};

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Feltöltés",
"navbar.signin": "Bejelentkezés",
"navbar.home": "Home",
"navbar.signup": "Sign up",
"navbar.signup": "Regisztráció",
"navbar.links.shares": "Megosztásaim",
"navbar.links.reverse": "Fordított megosztások",
"navbar.avatar.account": "Fiókom",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Saját üzemeltetés",
"home.bullet.a.description": "A Pingvin Share megosztót saját gépéről futtathatja.",
"home.bullet.b.name": "Adatvédelem",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.b.description": "A te fájljaid a tiéd, és harmadik felek soha nem férnek hozzá.",
"home.bullet.c.name": "Nincs bosszantó fájl méretkorlát",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.bullet.c.description": "Akkora fájlokat oszt meg, amekkorákat csak akar. Határt csak a lemezterület szab.",
"home.button.start": "Nosza, kezdjük",
"home.button.source": "Forráskód",
// END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password
"resetPassword.title": "Elfelejtette jelszavát?",
"resetPassword.description": "Adja meg emailcímét a jelszó alaphelyzetbe állításához.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.notify.success": "A jelszó visszaállítására szolgáló linket tartalmazó üzenetet küldtünk, abban az esetben, ha az e-mail létezik.",
"resetPassword.button.back": "Vissza a bejelentkezési oldalra",
"resetPassword.text.resetPassword": "Jelszó alaphelyzetbe állítása",
"resetPassword.text.enterNewPassword": "Adja meg új jelszavát",
"resetPassword.input.password": "Új jelszó",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "A jelszavát sikeresen helyreállította.",
// /account
"account.title": "Fiókom",
"account.card.info.title": "Fiókinformáció",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Jelszó",
"account.card.password.old": "Régi jelszó",
"account.card.password.new": "Új jelszó",
"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": "Még nincs jelszava. Ha email és jelszó kombinációval kíván bejelentkezni, létre kell hoznia egy jelszót.",
"account.notify.password.success": "A jelszó sikeresen frissítésre került",
"account.card.oauth.title": "Közösségi bejelentkezés",
"account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Leválasztás",
"account.card.oauth.unlinked": "Leválasztva",
"account.modal.unlink.title": "Fiók leválasztása",
"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": "A közösségi hálón keresztül csatolt fiók leválasztásával elveszítheti hozzáférését a fiókhoz, ha a név és jelszó kombinációra nem emlékszik",
"account.notify.oauth.unlinked.success": "Leválasztás sikeres",
"account.card.security.title": "Biztonság",
"account.card.security.totp.enable.description": "Adja meg az aktuális jelszavát a TOTP engedélyezéséhez",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Megnevezés",
"account.shares.table.description": "Leírás",
"account.shares.table.visitors": "Látogatók",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.expiresAt": "Lejár",
"account.shares.table.createdAt": "Létrehozva",
"account.shares.table.size": "Méret",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Megosztás adatai",
"account.shares.modal.share-link": "Hivatkozás",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "Megosztás törlése: {share}",
"account.shares.modal.delete.description": "Biztos abban, hogy törölni kívánja ezt a megosztást?",
// END /account/shares
// /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "év",
"account.reverseShares.modal.expiration.year-plural": "év",
"account.reverseShares.modal.max-size.label": "Megosztás megengedett max mérete",
"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": "E-mail értesítések",
"account.reverseShares.modal.send-email.description": "E-mailben értesít, amikor a fordított megosztási hivatkozást használva megosztást hoznak létre.",
"account.reverseShares.modal.simplified": "Egyszerű mód",
"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": "A fájlt feltöltő személy számára egyszerűsíthető az Önnel történő megosztás. A megosztásnak csak a neve és a leírása módosítható.",
"account.reverseShares.modal.public-access": "Nyilvános megosztá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": "A fordított megosztással létrehozott megosztások nyilvánossá tétele. Kikapcsolása esetén csak a megosztás létrehozója és Ön láthatja a megosztást.",
"account.reverseShares.modal.max-use.label": "Megengedett alkalmak száma",
"account.reverseShares.modal.max-use.description": "A megosztási hivatkozás megengedett felhasználási alkalmainak száma.",
"account.reverseShare.never-expires": "Ez a fordított megosztás soha nem fog lejárni.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Felhasználónév",
"admin.users.table.email": "Email",
"admin.users.table.admin": "Admin ügyek",
"admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.title": "{username} felhasználó szerkesztése",
"admin.users.edit.update.admin-privileges": "Adminisztrátori jogosultságok",
"admin.users.edit.update.change-password.title": "Jelszó módosítása",
"admin.users.edit.update.change-password.field": "Új jelszó",
"admin.users.edit.update.change-password.button": "Új jelszó mentése",
"admin.users.edit.update.notify.password.success": "A jelszó sikeresen frissítésre került",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "{username} felhasználó törlése ?",
"admin.users.edit.delete.description": "Biztosan törölni szeretné ezt a felhasználót és az összes megosztását?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Felhasználó létrehozása",
"admin.users.modal.create.username": "Felhasználónév",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "Megosztás ID",
"admin.shares.table.username": "Létrehozó",
"admin.shares.table.visitors": "Látogatók",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.table.expires": "Lejár",
"admin.shares.edit.delete.title": "Megosztás törlése: {id}",
"admin.shares.edit.delete.description": "Valóban törölni kívánja ezt a megosztást?",
// END /admin/shares
// /upload
"upload.title": "Feltöltés",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Hiba lépett fel a megosztás befejezése közben.",
"upload.notify.count-failed": "{count} darab fájlt nem sikerült feltölteni. Próbálja ismét.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Fájlok feltöltése",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
"upload.dropzone.description": "Húzza ide a fájlokat a megosztás elkészítéséhez. Legfeljebb {maxSize} fájl húzható egy megosztásba.",
"upload.dropzone.notify.file-too-big": "A fájlok mérete meghaladja a megengedett {maxSize} méretet.",
// FileList.tsx
"upload.filelist.name": "Megnevezés",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Megosztás: {shareId}",
"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.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",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Privát megosztás",
"share.error.access-denied.description": "Ez a fiók nem rendelkezik jogosultsággal a megosztás eléréséhez",
"share.modal.password.title": "Jelszó szükséges",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Jelszó",
"share.modal.error.invalid-password": "Érvénytelen jelszó",
"share.button.download-all": "Mindet letölti",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Hiba lépett fel a megosztás befejezése közben.",
"share.edit.notify.save-success": "A megosztás frissítésre került",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Általános",
"admin.config.category.share": "Megosztás",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Közösségi bejelentkezés",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Az alkalmazás neve",
"admin.config.general.app-url": "Alkalmazás URL hivatkozás",
"admin.config.general.app-url.description": "A Pingvin Share megosztáskezelőre mutató hivatkozás",
"admin.config.general.secure-cookies": "Secure cookies",
"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.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.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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Megosztási email tárgya",
"admin.config.email.share-recipients-subject.description": "A megosztások címzettjeinek küldött email tárgya.",
"admin.config.email.share-recipients-message": "Megosztási email szövege",
"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 {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": "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.reverse-share-subject": "Fordított megosztás tárgya",
"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-message": "Fordított megosztás üzenete",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Hitelesítés nélküli megosztások engedélyezése",
"admin.config.share.allow-unauthenticated-shares.description": "Hitelesítés nélküli felhasználók létre hozhatnak-e megosztásokat",
"admin.config.share.max-expiration": "Max lejárat",
"admin.config.share.max-expiration.description": "A megosztások megengedett leghosszabb lejárata órában. 0 értékkel a lejárat kikapcsolható.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Max méret",
"admin.config.share.max-size.description": "A megosztások megengedett legnagyobb mérete bájtban",
"admin.config.share.max-size.description": "A megosztások megengedett legnagyobb mérete",
"admin.config.share.zip-compression-level": "Zip tömörítési szint",
"admin.config.share.zip-compression-level.description": "A fájlméret és a tömörítésre fordított idő közötti választás. Az érték 0 - 9 közül választható, 0: nincs tömörítés, 9: legnagyobb mértékű tömörítés. ",
"admin.config.share.chunk-size": "Darabolási méret",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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": "Megosztás létrehozása felület automatikus megjelenítése",
"admin.config.share.auto-open-share-modal.description": "A mgosztás létrehozása előugró elem automatikusan megjelenik a fájlok kiválasztásakor, ehhez nem szükséges külön kattintani.",
"admin.config.smtp.enabled": "Enable",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Az SMTP kiszolgáló portja",
"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.description": "Felhasználónév az SMTP kiszolgálón",
"admin.config.smtp.password": "Jelszó",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Az OpenID Connect OAuth applikáció Discovery URI azonosítója",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect felhasználónév igény",
"admin.config.oauth.oidc-username-claim.description": "Az OpenID Connect ID token felhasználónév igénye. Hagyja üresen ha nincs információja a beállításról.",
"admin.config.oauth.oidc-role-path": "Az OpenID Connect token szerepeinek elérési útvonala",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Hoppá - ez az oldal nem létezik.",
"404.button.home": "Vissza a Kezdőlapra",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Vissza",
"common.button.go-home": "Kezdőlap",
"common.notify.copied": "A hivatkozást a Vágólapra másoltuk",
"common.notify.copied-link": "A hivatkozást a Vágólapra másoltuk",
"common.success": "Siker",
"common.error": "Hiba",
"common.error.unknown": "Ismeretlen hiba lépett fel",

View File

@@ -13,7 +13,7 @@ export default {
// /
"home.title": "Una piattaforma di condivisione file <h>self-hosted</h>.",
"home.description": "Vuoi davvero dare i tuoi file personali in mano a terzi come WeTransfer?",
"home.bullet.a.name": "Self-hosted",
"home.bullet.a.name": "Self-Hosted",
"home.bullet.a.description": "Configura Pingvin Share sul tuo server.",
"home.bullet.b.name": "Privacy",
"home.bullet.b.description": "I tuoi file sono tuoi e non saranno mai accessibili da terze parti.",
@@ -29,7 +29,7 @@ export default {
"signin.input.email-or-username": "Email o nome utente",
"signin.input.email-or-username.placeholder": "La tua email o nome utente",
"signin.input.password": "Password",
"signin.input.password.placeholder": "Password",
"signin.input.password.placeholder": "La tua password",
"signin.button.submit": "Accedi",
"signIn.notify.totp-required.title": "Autenticazione a due fattori richiesta",
"signIn.notify.totp-required.description": "Inserisci il tuo codice di autenticazione a due fattori",
@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Scade il",
"account.shares.table.createdAt": "Creato il",
"account.shares.table.size": "Dimensione",
"account.shares.table.password-protected": "Protetto da password",
"account.shares.table.visitor-count": "{count} di {max}",
"account.shares.table.expiry-never": "Mai",
"account.shares.modal.share-informations": "Condividi le informazioni",
"account.shares.modal.share-link": "Condividi link",
"account.shares.modal.delete.title": "Elimina condivisione {share}",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "Carica",
"upload.notify.confirm-leave": "Sei sicuro di voler lasciare questa pagina? Il tuo caricamento verrà annullato.",
"upload.notify.generic-error": "Si è verificato un errore durante il completamento della condivisione.",
"upload.notify.count-failed": "Impossibile caricare {count} file. Riprovare.",
"upload.reverse-share.error.invalid.title": "Link di condivisione inversa non valido",
"upload.reverse-share.error.invalid.description": "Questa condivisione inversa è scaduta o non è valida.",
// Dropzone.tsx
"upload.dropzone.title": "Carica File",
"upload.dropzone.description": "Trascina qui i file per iniziare la tua condivisione. Possiamo accettare solo i file che sono inferiori a {maxSize} in totale.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Condividi {shareId}",
"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.description": "Il limite di visitatori di questa condivisione è stato superato.",
"share.error.removed.title": "Condivisione rimossa",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Condivisione privata",
"share.error.access-denied.description": "L' account non ha il premesso di accedere a questa condivisione",
"share.modal.password.title": "Password richiesta",
"share.modal.password.description": "Inserisci la password per accedere a questa condivisione.",
"share.modal.password.description": "Per favore inserisci la password per accedere a questa condivisione.",
"share.modal.password": "Password",
"share.modal.error.invalid-password": "Password non valida",
"share.button.download-all": "Scarica tutto",
@@ -289,30 +296,49 @@ export default {
"share.edit.notify.generic-error": "Si è verificato un errore durante il completamento della condivisione.",
"share.edit.notify.save-success": "Condivisione aggiornata correttamente",
// END /share/[id]/edit
// /imprint
"imprint.title": "Note legali",
// END /imprint
// /privacy
"privacy.title": "Informativa sulla privacy",
// END /privacy
// /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.category.general": "Generale",
"admin.config.category.share": "Condivisioni",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Effettua il login con i Social",
"admin.config.category.oauth": "Login tramite Social",
"admin.config.general.app-name": "Nome dell'App",
"admin.config.general.app-name.description": "Nome dell' applicazione",
"admin.config.general.app-url": "URL dell'App",
"admin.config.general.app-url.description": "Su quale URL Pingvin Share è pubblicato",
"admin.config.general.secure-cookies": "Cookie sicuri",
"admin.config.general.secure-cookies.description": "Indica se impostare il contrassegno sicuro sui cookie. Se abilitato, il sito non funzionerà quando si accede tramite HTTP.",
"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.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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Tempo (in secondi) di mantenimento delle informazioni all'interno della cache.",
"admin.config.cache.max-items": "Numero massimo di elementi",
"admin.config.cache.max-items.description": "Numero massimo di elementi all'interno della cache.",
"admin.config.cache.redis-enabled": "Redis abilitato",
"admin.config.cache.redis-enabled.description": "Normalmente Pingvin Share mantiene la cache in memoria. Se si eseguono più istanze di Pingvin Share, è necessario abilitare il caching di Redis per condividere la cache tra le istanze.",
"admin.config.cache.redis-url": "Url Di Redis",
"admin.config.cache.redis-url.description": "Url per connettersi all'istanza Redis utilizzata per la cache.",
"admin.config.email.enable-share-email-recipients": "Abilita condivisione del destinatario email",
"admin.config.email.enable-share-email-recipients.description": "Indica se consentire la condivisione email con i destinatari. Abilitare questa opzione solo se SMTP è attivato.",
"admin.config.email.share-recipients-subject": "Oggetto dell'email di condivisione",
"admin.config.email.share-recipients-subject.description": "Oggetto dell'email che viene inviata ai destinatari della condivisione.",
"admin.config.email.share-recipients-message": "Testo dell'email di condivisione",
"admin.config.email.share-recipients-message.description": "Messaggio che viene inviato ai destinatari della condivisione. Variabili disponibili:\n {creator} - Il nome utente del creatore della condivisione\n {shareUrl} - L'URL della condivisione\n {desc} - La descrizione della condivisione\n {expires} - La data di scadenza della condivisione\n Le variabili saranno sostituite con il valore effettivo.",
"admin.config.email.share-recipients-message.description": "Messaggio che viene inviato ai destinatari della condivisione. Variabili disponibili:\n {creator} - Il nome utente del creatore della condivisione\n {creatorEmail} - L' email del creatore della condivisione\n {shareUrl} - L'URL della condivisione\n {desc} - La descrizione della condivisione\n {expires} - La data di scadenza della condivisione\n Le variabili saranno sostituite con il valore effettivo.",
"admin.config.email.reverse-share-subject": "Oggetto dell'email di condivisione inversa",
"admin.config.email.reverse-share-subject.description": "Oggetto dell'email che viene inviata quando qualcuno ha creato una condivisione con il tuo link di condivisione inversa.",
"admin.config.email.reverse-share-message": "Testo dell'email di condivisione inversa",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Consenti condivisioni non autenticate",
"admin.config.share.allow-unauthenticated-shares.description": "Indica se gli utenti non autenticati possono creare condivisioni",
"admin.config.share.max-expiration": "Scadenza massima",
"admin.config.share.max-expiration.description": "Scadenza massima di condivisione in ore. Impostare a 0 per consentire la scadenza illimitata.",
"admin.config.share.max-expiration.description": "Scadenza massima della condivisione. Impostare a 0 per consentire la scadenza illimitata.",
"admin.config.share.share-id-length": "Lunghezza ID condivisione predefinita",
"admin.config.share.share-id-length.description": "Lunghezza predefinita dell'ID generato per una condivisione. Questo valore viene utilizzato anche per generare collegamenti per condivisioni inverse. Un valore inferiore a 8 non è considerato sicuro.",
"admin.config.share.max-size": "Dim. massima",
"admin.config.share.max-size.description": "Dimensione massima di condivisione in byte",
"admin.config.share.max-size.description": "Dimensione massima della condivisione",
"admin.config.share.zip-compression-level": "Livello di compressione Zip",
"admin.config.share.zip-compression-level.description": "Regola il livello per bilanciare la dimensione del file e la velocità di compressione. Valori validi da 0 a 9, con 0 senza compressione e 9 con compressione massima. ",
"admin.config.share.chunk-size": "Dimensione dei chunk",
"admin.config.share.chunk-size.description": "Regola la dimensione del chunk (in byte) per i tuoi caricamenti per bilanciare l'efficienza e l'affidabilità in base alla tua connessione internet. I chunk più piccoli possono migliorare i tassi di successo per connessioni instabili, mentre i chunks più grandi velocizzano i caricamenti per connessioni stabili.",
"admin.config.share.chunk-size.description": "Regola la dimensione dei chunk per i tuoi upload, per bilanciare l'efficienza e l'affidabilità in base alla tua connessione internet. I chunk più piccoli possono migliorare i tassi di successo per connessioni instabili, mentre i chunks più grandi velocizzano i caricamenti per connessioni stabili.",
"admin.config.share.auto-open-share-modal": "Apertura automatica creazione modalità condivisione",
"admin.config.share.auto-open-share-modal.description": "La modalità di creazione della condivisione viene visualizzata automaticamente quando un utente seleziona i file, eliminando la necessità di fare clic manualmente sul pulsante.",
"admin.config.smtp.enabled": "Abilita",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect",
"admin.config.oauth.oidc-sign-out": "Esci da OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Se premuto, il pulsante “Disconnettersi” disconnetterà dal provider OpenID Connect",
"admin.config.oauth.oidc-scope": "Ambito di OpenID Connect",
"admin.config.oauth.oidc-scope.description": "Ambiti che dovrebbero essere richiesti al provider OpenID.",
"admin.config.oauth.oidc-username-claim": "Richiesta nome utente OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Nome utente nel token OpenID Connect. Lascialo vuoto se non sai cos'è questa configurazione.",
"admin.config.oauth.oidc-role-path": "Percorso verso i ruoli in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"admin.config.ldap.field-name-member-of.description": "Nome attributo LDAP per i gruppi, di cui un utente è membro. Questo viene utilizzato per controllare il gruppo amministratore.",
"admin.config.ldap.field-name-email": "Nome dell'attributo email dell'utente",
"admin.config.ldap.field-name-email.description": "Nome attributo LDAP per l'email di un utente.",
"admin.config.notify.success": "Configurazione aggiornata correttamente.",
"admin.config.notify.logo-success": "Logo aggiornato con successo. Potrebbe volerci qualche minuto per aggiornare sul sito.",
"admin.config.notify.no-changes": "Nessuna modifica da salvare.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Abilitato",
"admin.config.s3.enabled.description": "Indica se S3 debba essere usato per memorizzare i file condivisi invece che il file system locale.",
"admin.config.s3.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "L'URL del bucket S3.",
"admin.config.s3.region": "Regione",
"admin.config.s3.region.description": "La regione del bucket S3.",
"admin.config.s3.bucket-name": "Nome del bucket",
"admin.config.s3.bucket-name.description": "Il nome del bucket S3.",
"admin.config.s3.bucket-path": "Percorso",
"admin.config.s3.bucket-path.description": "Il percorso predefinito che dovrebbe essere usato per memorizzare i file nel bucket S3.",
"admin.config.s3.key": "Chiave",
"admin.config.s3.key.description": "La chiave che consente di accedere al bucket S3.",
"admin.config.s3.secret": "Parola chiave",
"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.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.imprint-text": "Testo dell'informativa",
"admin.config.legal.imprint-text.description": "Il testo che deve essere mostrato nell'informativa. Supporta il linguaggio Markdown. Lascia vuoto per collegare una pagina informativa esterna.",
"admin.config.legal.imprint-url": "URL dell'informativa",
"admin.config.legal.imprint-url.description": "Nel caso avessi già una pagina di informativa puoi collegarla qui invece di usare il campo di testo.",
"admin.config.legal.privacy-policy-text": "Testo dell'informativa sulla privacy",
"admin.config.legal.privacy-policy-text.description": "Il testo che dovrebbe essere mostrato nell'informativa sulla privacy. Supporta il linguaggio Markdown. Lascia vuoto per collegare una pagina esterna inerente la politica sulla privacy.",
"admin.config.legal.privacy-policy-url": "URL dell'informativa sulla privacy",
"admin.config.legal.privacy-policy-url.description": "Nel caso avessi già una pagina di informativa sulla privacy, puoi collegarla qui invece di usare il campo di testo.",
// 404
"404.description": "Ops, questa pagina non esiste.",
"404.button.home": "Riportami a casa",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Torna indietro",
"common.button.go-home": "Vai alla Home Page",
"common.notify.copied": "Il tuo collegamento e' stato copiato negli appunti",
"common.notify.copied-link": "Il tuo collegamento è stato copiato negli appunti",
"common.success": "Successo",
"common.error": "Errore",
"common.error.unknown": "Si è verificato un errore sconosciuto",

View File

@@ -3,12 +3,12 @@ export default {
"navbar.upload": "アップロード",
"navbar.signin": "サインイン",
"navbar.home": "ホーム",
"navbar.signup": "Sign up",
"navbar.signup": "新規登録",
"navbar.links.shares": "自分の共有",
"navbar.links.reverse": "ファイルリクエスト",
"navbar.avatar.account": "マイアカウント",
"navbar.avatar.admin": "管理画面",
"navbar.avatar.signout": "サインアウト",
"navbar.avatar.signout": "ログアウト",
// END navbar
// /
"home.title": "<h>セルフホスト</h>のファイル共有プラットフォーム。",
@@ -16,25 +16,25 @@ export default {
"home.bullet.a.name": "セルフホスト",
"home.bullet.a.description": "Pingvin Shareをあなたのマシンでホストしましょう。",
"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.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.source": "ソースコード",
// END /
// /auth/signin
"signin.title": "おかえりなさい",
"signin.description": "アカウントをお持ちではありませんか?",
"signin.button.signup": "会員登録",
"signin.button.signup": "新規登録",
"signin.input.email-or-username": "メールアドレスまたはユーザー名",
"signin.input.email-or-username.placeholder": "メールアドレスまたはユーザー名",
"signin.input.password": "パスワード",
"signin.input.password.placeholder": "あなたのパスワード",
"signin.button.submit": "サインイン",
"signin.button.submit": "ログイン",
"signIn.notify.totp-required.title": "二段階認証が必要です",
"signIn.notify.totp-required.description": "二段階認証コードを入力してください",
"signIn.oauth.or": "または",
"signIn.oauth.signInWith": "サインインの方法",
"signIn.oauth.signInWith": "ログインの方法",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
@@ -44,7 +44,7 @@ export default {
// /auth/signup
"signup.title": "アカウントを作成",
"signup.description": "既にアカウントをお持ちですか?",
"signup.button.signin": "サインイン",
"signup.button.signin": "ログイン",
"signup.input.username": "ユーザー名",
"signup.input.username.placeholder": "あなたのユーザー名",
"signup.input.email": "メールアドレス",
@@ -53,17 +53,17 @@ export default {
// END /auth/signup
// /auth/totp
"totp.title": "二段階認証",
"totp.button.signIn": "サインイン",
"totp.button.signIn": "ログイン",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "パスワードを忘れてしまいましたか?",
"resetPassword.description": "登録しているメールアドレスを入力してください。",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "サインインページに戻る",
"resetPassword.notify.success": "指定されたメールアドレスが存在する場合、パスワードをリセットするためのリンクを含むメッセージが送信されました。",
"resetPassword.button.back": "ログインページに戻る",
"resetPassword.text.resetPassword": "パスワードをリセット",
"resetPassword.text.enterNewPassword": "新規パスワードを入力",
"resetPassword.input.password": "新規パスワード",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "パスワードが正常にリセットされました。",
// /account
"account.title": "マイアカウント",
"account.card.info.title": "アカウント情報",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "パスワード",
"account.card.password.old": "現在のパスワード",
"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.card.oauth.title": "ソーシャルログイン",
"account.card.oauth.github": "GitHub",
@@ -85,11 +85,11 @@ export default {
"account.card.oauth.unlink": "リンク解除",
"account.card.oauth.unlinked": "リンクされていません",
"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.card.security.title": "セキュリティ",
"account.card.security.totp.enable.description": "2段階認証を有効にするため、現在のパスワードを入力してください",
"account.card.security.totp.disable.description": "2段階認証を無効にするため、現在のパスワードを入力してください",
"account.card.security.totp.enable.description": "2段階認証を有効にするには、現在のパスワードを入力してください",
"account.card.security.totp.disable.description": "2段階認証を無効にするには、現在のパスワードを入力してください",
"account.card.security.totp.button.start": "開始",
"account.modal.totp.title": "2段階認証を有効にする",
"account.modal.totp.step1": "ステップ1: 認証アプリを追加する",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "名前",
"account.shares.table.description": "説明",
"account.shares.table.visitors": "訪問者",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.expiresAt": "有効期限",
"account.shares.table.createdAt": "作成日",
"account.shares.table.size": "サイズ",
"account.shares.table.password-protected": "パスワードで保護されています",
"account.shares.table.visitor-count": "{count} / {max}",
"account.shares.table.expiry-never": "なし",
"account.shares.modal.share-informations": "共有情報",
"account.shares.modal.share-link": "共有リンク",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "共有を削除: {share}",
"account.shares.modal.delete.description": "この共有を削除してもよろしいですか?",
// END /account/shares
// /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "年間",
"account.reverseShares.modal.expiration.year-plural": "年間",
"account.reverseShares.modal.max-size.label": "最大ファイルサイズ",
"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": "メール通知を送信",
"account.reverseShares.modal.send-email.description": "このファイルリクエストリンクを使用して共有が作成されるとメール通知が送信されます。",
"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.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.description": "このURLを使用してファイルをアップロードできる最大回数です。",
"account.reverseShare.never-expires": "このファイルリクエストリンクは期限切れになりません。",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "ユーザー名",
"admin.users.table.email": "メールアドレス",
"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.change-password.title": "パスワードを変更",
"admin.users.edit.update.change-password.field": "新規パスワード",
"admin.users.edit.update.change-password.button": "新しいパスワードを保存",
"admin.users.edit.update.notify.password.success": "パスワードの変更に成功しました",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "ユーザーを削除: {username}",
"admin.users.edit.delete.description": "このユーザーとそのすべての共有を本当に削除しますか?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "ユーザーを作成",
"admin.users.modal.create.username": "ユーザー名",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "共有ID",
"admin.shares.table.username": "作成者",
"admin.shares.table.visitors": "訪問者",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.table.expires": "有効期限",
"admin.shares.edit.delete.title": "共有を削除: {id}",
"admin.shares.edit.delete.description": "この共有を削除してもよろしいですか?",
// END /admin/shares
// /upload
"upload.title": "アップロード",
"upload.notify.generic-error": "共有を仕上げている最中にエラーが発生しました。",
"upload.notify.confirm-leave": "このページから離れますか?アップロードはキャンセルされます。",
"upload.notify.generic-error": "共有の最終処理でエラーが発生しました。",
"upload.notify.count-failed": "{count} ファイルがアップロードに失敗しました。再度お試しください。",
"upload.reverse-share.error.invalid.title": "無効なファイルリクエストリンク",
"upload.reverse-share.error.invalid.description": "このファイルリクエストは期限が切れているか無効です。",
// Dropzone.tsx
"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} を超えています。",
// FileList.tsx
"upload.filelist.name": "ファイル名",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "サインインしていません",
"upload.modal.not-signed-in-description": "共有の手動削除と訪問者カウンターは表示できません。",
"upload.modal.expires.never": "永久",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "永久シェア",
"upload.modal.expires.error.too-long": "有効期限が最大値{max}を超えています。",
"upload.modal.link.label": "リンク",
"upload.modal.expires.label": "有効期限",
"upload.modal.expires.minute-singular": "分間",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "「{shareId}」が共有されました",
"share.description": "あなたと共有したファイルをご確認ください!",
"share.fileCount": "{count, plural, =1 {# ファイル} other {# ファイル}} · {size} (圧縮により ZIP ファイルはより小さくなる場合があります)",
"share.error.visitor-limit-exceeded.title": "訪問者の上限を超えました",
"share.error.visitor-limit-exceeded.description": "この共有からの訪問者の回数が制限を超えています。",
"share.error.removed.title": "共有が削除されました",
@@ -272,16 +279,16 @@ export default {
"share.error.access-denied.title": "プライベートシェア",
"share.error.access-denied.description": "現在のアカウントにはこの共有にアクセスする権限がありません",
"share.modal.password.title": "パスワードが必要です",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "この共有にアクセスするにはパスワードを入力してください。",
"share.modal.password": "パスワード",
"share.modal.error.invalid-password": "パスワードが間違っています",
"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.table.name": "ファイル名",
"share.table.size": "サイズ",
"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]
// /share/[id]/edit
"share.edit.title": "編集 {shareId}",
@@ -289,64 +296,85 @@ export default {
"share.edit.notify.generic-error": "共有の最終処理でエラーが発生しました。",
"share.edit.notify.save-success": "共有の更新に成功しました",
// END /share/[id]/edit
// /imprint
"imprint.title": "インプリント",
// END /imprint
// /privacy
"privacy.title": "プライバシーポリシー",
// END /privacy
// /admin/config
"admin.config.config-file-warning.title": "構成ファイルがあります",
"admin.config.config-file-warning.description": "設定ファイル設定で済みのPingvin ShareはUI を使用して設定を変更することはできません。",
"admin.config.title": "設定",
"admin.config.category.general": "一般",
"admin.config.category.share": "共有",
"admin.config.category.cache": "キャッシュ",
"admin.config.category.email": "メール",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "ソーシャルログイン",
"admin.config.general.app-name": "アプリ名",
"admin.config.general.app-name.description": "アプリの名前",
"admin.config.general.app-url": "アプリ",
"admin.config.general.app-url": "アプリのURL",
"admin.config.general.app-url.description": "Pingvin Shareで利用できるURL",
"admin.config.general.secure-cookies": "セキュアクッキー",
"admin.config.general.secure-cookies.description": "クッキーにセキュアフラグを設定するか。有効にすると、HTTP 経由でアクセスしたときにサイトが機能しなくなります。",
"admin.config.general.show-home-page": "ホームページを表示する",
"admin.config.general.show-home-page.description": "ホームページを表示するかどうか選択",
"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.description": "新しい画像をアップロードしてロゴを変更できます。画像は、PNG形式でアスペクト比が1:1である必要があります。",
"admin.config.general.logo.placeholder": "画像を選択",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "情報をキャッシュに保存しておく時間(秒)",
"admin.config.cache.max-items": "最大アイテム数",
"admin.config.cache.max-items.description": "キャッシュ内の最大アイテム数",
"admin.config.cache.redis-enabled": "Redis 有効化済み",
"admin.config.cache.redis-enabled.description": "通常、Pingvin Share は情報をメモリ内にキャッシュします。複数の Pingvin Share インスタンスを実行する場合は、インスタンス間でキャッシュを共有するために Redis キャッシュを有効にする必要があります。",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "キャッシュに使用する Redis インスタンスへの接続URL",
"admin.config.email.enable-share-email-recipients": "メール受信者の共有を有効にする",
"admin.config.email.enable-share-email-recipients.description": "受信者とのメール共有を許可するかどうか。SMTPが有効な場合にのみこれを有効にします。",
"admin.config.email.share-recipients-subject": "宛先への件名",
"admin.config.email.share-recipients-subject.description": "メールで共有された相手に送信メールの件名です。",
"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 {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} - 共有の URL\n{desc} - 共有の説明\n{expires} - 共有の有効期限\nこれらの変数は実際の値に置き換えられます。",
"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.description": "あなたが作成したファイルリクエストリンクからファイルがアップロードされた場合に送信されるメールの本文です。{shareUrl} は、作成者の名前とURLにより置き換えられます。",
"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.description": "あなたが作成したファイルリクエストリンクからファイルがアップロードされた場合に送信されるメールの本文です。{url} は、実際のパスワードリセットURLによって置き換えられます。",
"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.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}は招待URLに、{email}はメールアドレスに、{password}はユーザーのパスワードに置き換えられます。",
"admin.config.share.allow-registration": "登録を許可する",
"admin.config.share.allow-registration.description": "登録を許可するかどうかを選択してください。",
"admin.config.share.allow-unauthenticated-shares": "ログインしていない状態での共有を許可する",
"admin.config.share.allow-unauthenticated-shares.description": "ログインしていないユーザーに共有の作成を許可するかどうかを選択してください。",
"admin.config.share.max-expiration": "有効期限の上限",
"admin.config.share.max-expiration.description": "共有に設定可能な有効期限の上限を時間単位で設定できます。0を設定すると、有効期限が無制限になります。",
"admin.config.share.max-expiration.description": "共有の最大有効期限。無期限を許可するには0に設定します。",
"admin.config.share.share-id-length": "デフォルトの共有IDの長さ",
"admin.config.share.share-id-length.description": "共有の生成されたIDのデフォルトの長さ。この値はファイルリクエストのリンクを生成するためにも使用されます。8未満の値は安全ではないと見なされます。",
"admin.config.share.max-size": "最大ファイルサイズ",
"admin.config.share.max-size.description": "最大ファイルサイズbyte単位",
"admin.config.share.max-size.description": "最大ファイルサイズ",
"admin.config.share.zip-compression-level": "Zip圧縮レベル",
"admin.config.share.zip-compression-level.description": "ファイルサイズと圧縮速度のバランスを取るように、レベルを調整できます。有効な値は09の間で、0が無圧縮、9で最大限の圧縮となります。 ",
"admin.config.share.chunk-size": "チャンクサイズ",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.description": "ユーザーがファイルを選択すると、共有作成モーダルが自動的に表示されるため、手動でボタンをクリックする必要がありません。",
"admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled": "有効",
"admin.config.smtp.enabled.description": "SMTPを有効にするかどうかを選択してください。SMTPサーバーのホスト名、ポート番号、電子メールアドレス、ユーザー名、パスワードが入力されている場合にのみ、有効にしてください。",
"admin.config.smtp.host": "ホスト名",
"admin.config.smtp.host.description": "SMTPサーバーのホスト名",
"admin.config.smtp.port": "ポート番号",
"admin.config.smtp.port.description": "SMTPサーバーのポート番号",
"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.description": "SMTPサーバーのユーザー名",
"admin.config.smtp.password": "パスワード",
@@ -382,8 +410,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuthアプリのクライアントシークレット",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Discordアカウントを使用したログインを許可するかどうかを設定します",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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": "Discord限定ユーザー",
"admin.config.oauth.discord-limited-users.description": "Discord IDによって特定のユーザーのサインインを制限します。無効にするには空白のままにします。",
"admin.config.oauth.discord-limited-guild": "Discord限定サーバーID",
"admin.config.oauth.discord-limited-guild.description": "特定のサーバーのユーザーにサインインを制限します。無効にするには空白のままにしてください。",
"admin.config.oauth.discord-client-id": "Discord クライアントID",
@@ -396,10 +424,12 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "OpenID OAuthアプリのDiscovery URI",
"admin.config.oauth.oidc-sign-out": "OpenID Connectからサインアウト",
"admin.config.oauth.oidc-sign-out.description": "「サインアウト」ボタンがOpenID Connectプロバイダーからサインアウトするかどうか",
"admin.config.oauth.oidc-scope": "OpenID Connect スコープ",
"admin.config.oauth.oidc-scope.description": "OpenID Connect プロバイダーから要求する必要があるスコープ。",
"admin.config.oauth.oidc-username-claim": "OpenID Connect ユーザー名の要求",
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID トークンのユーザー名要求。この設定が何かわからない場合は空白のままにしてください。",
"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.description": "一般的なアクセスに必要なロール。ログインするユーザーのロールに存在する必要があります。 " + "この設定が何であるか分からない場合は空白のままにしてください。",
"admin.config.oauth.oidc-role-admin-access": "管理者アクセスのための OpenID Connectのロール",
@@ -409,14 +439,14 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuthアプリのクライアントシークレット",
"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.url": "サーバーURL",
"admin.config.ldap.url.description": "LDAPサーバーのURL",
"admin.config.ldap.bind-dn": "バインド 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": "パスワードをバインド",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"admin.config.ldap.bind-password.description": "ユーザー検索を実行するために使用するパスワード",
"admin.config.ldap.search-base": "ユーザーベース",
"admin.config.ldap.search-base.description": "ユーザーの検索が実行されるベースの場所",
"admin.config.ldap.search-query": "ユーザークエリ",
@@ -427,6 +457,37 @@ export default {
"admin.config.ldap.field-name-member-of.description": "ユーザーがメンバーであるグループのLDAP属性名。これは、管理者グループを確認するときに使用されます。",
"admin.config.ldap.field-name-email": "ユーザーのメール属性名",
"admin.config.ldap.field-name-email.description": "ユーザーのメールのLDAP属性名。",
"admin.config.notify.success": "設定が正常に更新されました。",
"admin.config.notify.logo-success": "ロゴが正常に更新されました。Web サイトで更新されるまでに数分かかる場合があります。",
"admin.config.notify.no-changes": "保存する変更がありません。",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "有効",
"admin.config.s3.enabled.description": "S3を使用して、ローカルファイルシステムの代わりに共有ファイルを保存するかどうか。",
"admin.config.s3.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "S3 バケットの URL",
"admin.config.s3.region": "地域",
"admin.config.s3.region.description": "S3バケットの地域。",
"admin.config.s3.bucket-name": "バケット名",
"admin.config.s3.bucket-name.description": "S3バケットの名前。",
"admin.config.s3.bucket-path": "パス",
"admin.config.s3.bucket-path.description": "S3バケットにファイルを格納するために使用されるデフォルトのパス。",
"admin.config.s3.key": "キー",
"admin.config.s3.key.description": "S3バケットにアクセスするためのキー。",
"admin.config.s3.secret": "秘密",
"admin.config.s3.secret.description": "S3バケットにアクセスするための秘密。",
"admin.config.s3.use-checksum": "チェックサムを使用",
"admin.config.s3.use-checksum.description": "チェックサムをサポートしていないバックエンドB2では無効にしてください。",
"admin.config.category.legal": "法的事項",
"admin.config.legal.enabled": "法的通知を有効にする",
"admin.config.legal.enabled.description": "フッターにインプリントとプライバシーポリシーへのリンクを表示するか。",
"admin.config.legal.imprint-text": "インプリントテキスト",
"admin.config.legal.imprint-text.description": "インプリントに表示されるテキスト。Markdownをサポートします。外部のインプリント ページにリンクするには空白のままにします。",
"admin.config.legal.imprint-url": "インプリントのURL",
"admin.config.legal.imprint-url.description": "すでにインプリント ページがある場合は、テキストフィールドを使用する代わりにここにリンクすることができます。",
"admin.config.legal.privacy-policy-text": "プライバシーポリシーのテキスト",
"admin.config.legal.privacy-policy-text.description": "プライバシーポリシーに表示されるテキスト。Markdownをサポートします。外部のプライバシーポリシーにリンクするには空白のままにします。",
"admin.config.legal.privacy-policy-url": "プライバシーポリシーのURL",
"admin.config.legal.privacy-policy-url.description": "すでにプライバシーポリシーがある場合は、テキストフィールドを使用する代わりにここにリンクすることができます。",
// 404
"404.description": "ページが見つかりません。",
"404.button.home": "ホームに戻る",
@@ -441,10 +502,10 @@ export default {
"error.msg.no_user": "この{0} アカウントにリンクしたユーザーが存在しません。",
"error.msg.no_email": "この{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.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_google": "Google",
"error.param.provider_microsoft": "Microsoft",
@@ -462,20 +523,21 @@ export default {
"common.button.generate": "生成",
"common.button.done": "完了",
"common.text.link": "リンク",
"common.text.navigate-to-link": "Visit link",
"common.text.navigate-to-link": "リンクを開く",
"common.text.or": "または",
"common.text.redirecting": "リダイレクトしています...",
"common.button.go-back": "戻る",
"common.button.go-home": "ホームに戻る",
"common.notify.copied": "リンクをクリップボードにコピーしました",
"common.notify.copied-link": "リンクをクリップボードにコピーしました",
"common.success": "成功",
"common.error": "エラー",
"common.error.unknown": "不明なエラーが発生しました",
"common.error.invalid-email": "無効なメールアドレス",
"common.error.too-short": "最低{length} 文字である必要があります",
"common.error.too-long": "最大{length} 文字である必要があります",
"common.error.number-too-small": "少なくとも{min}でなければなりません",
"common.error.number-too-large": "最大で{max}である必要があります",
"common.error.number-too-small": "少なくとも{min} でなければなりません",
"common.error.number-too-large": "最大で{max} である必要があります",
"common.error.exact-length": "{length} 文字である必要があります",
"common.error.invalid-number": "数字でなければなりません",
"common.error.field-required": "これは必須項目です"

View File

@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "크기",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "공유 정보",
"account.shares.modal.share-link": "공유 링크",
"account.shares.modal.delete.title": "Delete share: {share}",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "업로드",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "공유를 완료하는 동안 오류가 발생했습니다.",
"upload.notify.count-failed": "{count}개의 파일을 업로드하지 못했습니다. 다시 시도하세요.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "파일 업로드",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "공유 {shareId}",
"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.description": "이 공유의 방문자 한도를 초과했습니다.",
"share.error.removed.title": "공유가 삭제됨",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.modal.password.title": "비밀번호 필요",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "비밀번호",
"share.modal.error.invalid-password": "잘못된 비밀번호",
"share.button.download-all": "모두 다운로드",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "공유를 완료하는 동안 오류가 발생했습니다.",
"share.edit.notify.save-success": "공유가 업데이트 되었습니다.",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "일반",
"admin.config.category.share": "공유",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "이메일",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "소셜 로그인",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "이 앱의 이름",
"admin.config.general.app-url": "앱 URL",
"admin.config.general.app-url.description": "Pingvin Share를 사용할 수 있는 URL",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "홈 페이지 표시",
"admin.config.general.show-home-page.description": "홈 페이지를 표시할지 여부",
"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.description": "새 이미지를 업로드하여 로고를 변경하십시오. 이미지는 PNG여야 하며 1:1 비율이어야 합니다.",
"admin.config.general.logo.placeholder": "이미지 선택",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "공유 제목",
"admin.config.email.share-recipients-subject.description": "공유 수신자에게 전송되는 이메일의 제목입니다.",
"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 {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": "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.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-message": "역방향 공유 메시지",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "인증되지 않은 공유 허용",
"admin.config.share.allow-unauthenticated-shares.description": "인증되지 않은 사용자가 공유를 생성할 수 있는지 여부",
"admin.config.share.max-expiration": "최대 만료 시간",
"admin.config.share.max-expiration.description": "공유의 최대 만료 시간. 무제한 만료를 허용하려면 0으로 설정하세요.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.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.description": "파일 크기와 압축 속도 간의 균형을 맞추도록 레벨을 조정합니다. 유효한 값의 범위는 0에서 9까지이며, 0은 압축되지 않고 9는 최대 압축입니다. ",
"admin.config.share.chunk-size": "청크 크기",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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": "공유 생성 창 자동 열기",
"admin.config.share.auto-open-share-modal.description": "사용자가 파일을 선택하면 공유 생성 창이 자동으로 나타나서 버튼을 수동으로 클릭할 필요가 없습니다.",
"admin.config.smtp.enabled": "Enable",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "포트",
"admin.config.smtp.port.description": "SMTP 서버 포트",
"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.description": "SMTP 사용자 이름, 서버 비밀번호",
"admin.config.smtp.password": "비밀번호",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID 토큰의 Username claim 입니다. 이 구성이 무엇인지 모르면 비워 둡니다.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "이런, 이 페이지는 존재하지 않습니다.",
"404.button.home": "나를 집으로 데려다 줘",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "뒤로 가기",
"common.button.go-home": "첫 페이지",
"common.notify.copied": "당신의 링크가 클립보드에 복사되었습니다.",
"common.notify.copied-link": "당신의 링크가 클립보드에 복사되었습니다.",
"common.success": "성공",
"common.error": "에러",
"common.error.unknown": "알 수 없는 오류가 발생했습니다.",

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Delen",
"navbar.signin": "Aanmelden",
"navbar.home": "Startpagina",
"navbar.signup": "Sign up",
"navbar.signup": "Registreren",
"navbar.links.shares": "Mijn gedeelde bestanden",
"navbar.links.reverse": "Omgekeerd delen",
"navbar.avatar.account": "Mijn account",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Zelfgehost",
"home.bullet.a.description": "Host Pingvin Share op uw eigen machine.",
"home.bullet.b.name": "Privacy",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.b.description": "Je bestanden zijn van jou en zullen nooit toegankelijk zijn voor derden.",
"home.bullet.c.name": "Geen vervelende limiet voor bestandsgrootte",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.bullet.c.description": "Upload bestanden zo groot als je wilt. Je harde schijf is de enige limiet.",
"home.button.start": "Aan de slag",
"home.button.source": "Broncode",
// END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password
"resetPassword.title": "Wachtwoord vergeten?",
"resetPassword.description": "Voer uw e-mailadres in om uw wachtwoord opnieuw in te stellen.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.notify.success": "Er is een bericht verzonden met een link om je wachtwoord opnieuw in te stellen, als het opgegeven e-mailadres bestaat.",
"resetPassword.button.back": "Terug naar login pagina",
"resetPassword.text.resetPassword": "Wachtwoord opnieuw instellen",
"resetPassword.text.enterNewPassword": "Voer uw nieuwe wachtwoord in",
"resetPassword.input.password": "Nieuw wachtwoord",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "Je wachtwoord is succesvol gereset.",
// /account
"account.title": "Mijn account",
"account.card.info.title": "Accountinformatie",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Wachtwoord",
"account.card.password.old": "Oude wachtwoord",
"account.card.password.new": "Nieuw wachtwoord",
"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": "Er is geen wachtwoord ingesteld. Om in te loggen met je e-mailadres en wachtwoord, moet je een wachtwoord aanmaken.",
"account.notify.password.success": "Wachtwoord succesvol gewijzigd!",
"account.card.oauth.title": "Social login",
"account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Ontkoppel",
"account.card.oauth.unlinked": "Niet-gekoppeld",
"account.modal.unlink.title": "Ontkoppel account",
"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": "Het ontkoppelen van sociale accounts kan leiden tot verlies van je account als je de inloggegevens bent vergeten",
"account.notify.oauth.unlinked.success": "Ontkoppelen succesvol",
"account.card.security.title": "Beveiliging",
"account.card.security.totp.enable.description": "Voer uw huidige wachtwoord in om TOTP in te schakelen",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Naam",
"account.shares.table.description": "Beschrijving",
"account.shares.table.visitors": "Bezoekers",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.expiresAt": "Verloopt op",
"account.shares.table.createdAt": "Gemaakt op",
"account.shares.table.size": "Grootte",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Gegevens delen",
"account.shares.modal.share-link": "Deel link",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "Share verwijderd: {share}",
"account.shares.modal.delete.description": "Weet u zeker dat u deze share wilt verwijderen?",
// END /account/shares
// /account/reverseShares
@@ -206,14 +209,17 @@ export default {
"admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Auteur",
"admin.shares.table.visitors": "Bezoekers",
"admin.shares.table.expires": "Expires on",
"admin.shares.table.expires": "Verloopt op",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Weet u zeker dat u deze share wilt verwijderen?",
// END /admin/shares
// /upload
"upload.title": "Uploaden",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Er is een fout opgetreden tijdens het voltooien van uw share.",
"upload.notify.count-failed": "{count} bestanden konden niet worden geüpload. Probeer het nogmaals.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Bestanden uploaden",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Share {shareId}",
"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.description": "De bezoekerslimiet van deze share is overschreden.",
"share.error.removed.title": "Share was verwijderd",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "Dit account heeft geen toestemming om toegang te krijgen tot deze share",
"share.modal.password.title": "Wachtwoord vereist",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Wachtwoord",
"share.modal.error.invalid-password": "Ongeldig wachtwoord",
"share.button.download-all": "Alles downloaden",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Er is een fout opgetreden tijdens het voltooien van uw share.",
"share.edit.notify.save-success": "Share is succesvol bijgewerkt",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Algemeen",
"admin.config.category.share": "Delen",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "E-mail",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social login",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Naam van de applicatie",
"admin.config.general.app-url": "App-URL",
"admin.config.general.app-url.description": "De URL waar Pingvin Share bereikbaar is",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "Toon startpagina",
"admin.config.general.show-home-page.description": "Toon of verberg de home pagina",
"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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Onderwerp van ontvangers' share",
"admin.config.email.share-recipients-subject.description": "Het onderwerp van de e-mail die wordt verzonden naar de share-ontvangers.",
"admin.config.email.share-recipients-message": "Bericht voor ontvangers van de share",
"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 {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": "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.reverse-share-subject": "Omgekeerde share email onderwerp",
"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-message": "Omgekeerde share-bericht",
@@ -330,23 +356,25 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Ongeverifieerde shares toestaan",
"admin.config.share.allow-unauthenticated-shares.description": "Sta niet-geverifieerde gebruikers toe shares te kunnen aanmaken",
"admin.config.share.max-expiration": "Max. vervaldatum",
"admin.config.share.max-expiration.description": "Maximale verval tijd van de share in uren. Stel in op 0 om onbeperkte vervaldatum toe te staan.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Max. grootte",
"admin.config.share.max-size.description": "Maximale share grootte in bytes",
"admin.config.share.max-size.description": "Maximale share grootte",
"admin.config.share.zip-compression-level": "Zip compressie niveau",
"admin.config.share.zip-compression-level.description": "Pas het niveau aan voor evenwicht tussen bestandsgrootte en compressie snelheid. Geldige waarden variëren van 0 tot 9, waarbij 0 geen compressie is en 9 de maximale compressie is. ",
"admin.config.share.chunk-size": "Chunk size",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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.host": "Host",
"admin.config.smtp.host.description": "Host van de SMTP-server",
"admin.config.smtp.port": "Poort",
"admin.config.smtp.port.description": "Poort van de SMTP-server",
"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.description": "Gebruikersnaam van de SMTP-server",
"admin.config.smtp.password": "Wachtwoord",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI van de OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "Gebruikersnaam claim in OpenID Connect-ID-token. Laat het leeg als u niet weet wat deze configuratie is.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Oeps, deze pagina bestaat niet.",
"404.button.home": "Breng me terug naar huis",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Ga terug",
"common.button.go-home": "Go home",
"common.notify.copied": "Uw link is gekopieerd naar het klembord",
"common.notify.copied-link": "Uw link is gekopieerd naar het klembord",
"common.success": "Succes",
"common.error": "Fout",
"common.error.unknown": "Er is een onbekende fout opgetreden",

View File

@@ -58,7 +58,7 @@ export default {
// /auth/reset-password
"resetPassword.title": "Nie pamiętasz hasła?",
"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.text.resetPassword": "Resetuj hasło",
"resetPassword.text.enterNewPassword": "Wprowadź nowe hasło",
@@ -124,9 +124,12 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Rozmiar",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Informacje udziału",
"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?",
// END /account/shares
// /account/reverseShares
@@ -153,7 +156,7 @@ export default {
"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.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.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ć",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "Prześlij",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Wystąpił błąd podczas zakończenia tworzenia udziału.",
"upload.notify.count-failed": "Nie udało się przesłać {count} plików. Próbuję ponownie.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Prześlij pliki",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Udostępnij {shareId}",
"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.description": "Limit odwiedzających dla tego udziału został przekroczony.",
"share.error.removed.title": "Udostępnianie usunięte",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Prywatne udostępnienie",
"share.error.access-denied.description": "Bieżące konto nie ma uprawnień dostępu do tego udostępnienia",
"share.modal.password.title": "Wymagane hasło",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Hasło",
"share.modal.error.invalid-password": "Hasło jest nieprawidłowe",
"share.button.download-all": "Pobierz wszystko",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "W trakcie zakańczania tworzenia udziału wystąpił błąd.",
"share.edit.notify.save-success": "Udział zaktualizowany pomyślnie",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Ogólne",
"admin.config.category.share": "Udostępnij",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Adres e-mail",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Logowanie za pomocą konta społecznościowego",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Nazwa aplikacji",
"admin.config.general.app-url": "Adres URL aplikacji",
"admin.config.general.app-url.description": "Pod którym adresem URL Pingvin Share jest dostępny",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "Pokaż 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.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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Temat dla odbiorców udziału",
"admin.config.email.share-recipients-subject.description": "Temat wiadomości e-mail, która zostanie wysłana do odbiorców udziału.",
"admin.config.email.share-recipients-message": "Wiadomość dla odbiorców udziału",
"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 {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": "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.reverse-share-subject": "Temat udziału odwrotnego",
"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-message": "Wiadomość udziału odwrotnego",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Zezwalaj na nieuwierzytelnione udostępnianie",
"admin.config.share.allow-unauthenticated-shares.description": "Czy nieautoryzowani użytkownicy mogą tworzyć udostępnienia",
"admin.config.share.max-expiration": "Maksymalny okres ważności",
"admin.config.share.max-expiration.description": "Maksymalny okres ważności udziału w godzinach. Ustaw na 0, aby zezwolić na nieograniczony okres ważności.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Rozmiar maksymalny",
"admin.config.share.max-size.description": "Maksymalny rozmiar udziału w bajtach",
"admin.config.share.max-size.description": "Maksymalny rozmiar udziału",
"admin.config.share.zip-compression-level": "Poziom kompresji Zip",
"admin.config.share.zip-compression-level.description": "Dostosuj poziom do równowagi między rozmiarem pliku a szybkością kompresji. Prawidłowe wartości mieszczą się w zakresie od 0 do 9, przy czym 0 to brak kompresji a 9 maksymalną kompresją. ",
"admin.config.share.chunk-size": "Rozmiar fragmentu",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "Numer portu",
"admin.config.smtp.port.description": "Numer portu serwera SMTP",
"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.description": "Nazwa użytkownika serwera SMTP",
"admin.config.smtp.password": "Hasło",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
"admin.config.oauth.oidc-sign-out": "Wylogowanie z OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Czy przycisk „Wyloguj się” spowoduje wylogowanie z dostawcy OpenID Connect",
"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-username-claim": "Żądanie nazwy użytkownika OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Żądanie nazwy użytkownika w tokenie identyfikatora OpenID Connect. Jeśli nie wiesz, czym jest ta konfiguracja, pozostaw pustą.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Ups! Ta strona nie istnieje.",
"404.button.home": "Wróć do strony domowej",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Wróć",
"common.button.go-home": "Wróć do ekranu głównego",
"common.notify.copied": "Link został skopiowany do schowka",
"common.notify.copied-link": "Link został skopiowany do schowka",
"common.success": "Zakończono pomyślnie",
"common.error": "Błąd",
"common.error.unknown": "Wystąpił nieznany błąd",

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Carregar",
"navbar.signin": "Iniciar sessão",
"navbar.home": "Início",
"navbar.signup": "Sign up",
"navbar.signup": "Cadastre-se",
"navbar.links.shares": "Meus compartilhamentos",
"navbar.links.reverse": "Compartilhamentos reversos",
"navbar.avatar.account": "Minha conta",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Auto-Hospedado",
"home.bullet.a.description": "Hospede o Pingvin Share em sua própria máquina.",
"home.bullet.b.name": "Privacidade",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.b.description": "Seus arquivos são seus e nunca serão acessados por terceiros.",
"home.bullet.c.name": "Sem limite de tamanho de arquivo irritante",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.bullet.c.description": "Carregue arquivos tão grandes quanto quiser. Apenas o seu disco rígido será o seu limite.",
"home.button.start": "Começar",
"home.button.source": "Código-fonte",
// END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password
"resetPassword.title": "Esqueceu a sua senha?",
"resetPassword.description": "Insira o seu e-mail para redefinir a sua senha.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.notify.success": "Uma mensagem com um link para redefinir sua senha foi enviada se o e-mail fornecido existir.",
"resetPassword.button.back": "Voltar para a página inicial",
"resetPassword.text.resetPassword": "Redefinir senha",
"resetPassword.text.enterNewPassword": "Digite uma nova senha",
"resetPassword.input.password": "Nova senha",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "A sua senha foi redefinida com sucesso.",
// /account
"account.title": "A minha conta",
"account.card.info.title": "Informação sobre a conta",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Senha",
"account.card.password.old": "Senha antiga",
"account.card.password.new": "Nova senha",
"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": "Você não tem uma senha definida. Para entrar utilizando seu e-mail e senha, você precisa criar uma senha.",
"account.notify.password.success": "Senha alterada com sucesso",
"account.card.oauth.title": "Login com Redes Sociais",
"account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Desvincular",
"account.card.oauth.unlinked": "Desvinculado",
"account.modal.unlink.title": "Desvincular conta",
"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": "Desvincular suas redes sociais pode fazer com que você perca sua conta se não se lembrar de seu nome de usuário e senha",
"account.notify.oauth.unlinked.success": "Desvinculado com sucesso",
"account.card.security.title": "Segurança",
"account.card.security.totp.enable.description": "Digite a sua senha atual para começar a habilitar o TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Nome",
"account.shares.table.description": "Descrição",
"account.shares.table.visitors": "Visitantes",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.expiresAt": "Expira em",
"account.shares.table.createdAt": "Criada em",
"account.shares.table.size": "Tamanho",
"account.shares.table.password-protected": "Protegido por senha",
"account.shares.table.visitor-count": "{count} de {max}",
"account.shares.table.expiry-never": "Nunca",
"account.shares.modal.share-informations": "Informações do compartilhamento",
"account.shares.modal.share-link": "Link do compartilhamento",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "Excluir o compartilhamento {share}",
"account.shares.modal.delete.description": "Tem certeza que deseja excluir este compartilhamento?",
// END /account/shares
// /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Ano",
"account.reverseShares.modal.expiration.year-plural": "Anos",
"account.reverseShares.modal.max-size.label": "Tamanho máximo do compartilhamento",
"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": "Enviar notificações por email",
"account.reverseShares.modal.send-email.description": "Enviar uma notificação por e-mail quando um compartilhamento for criado com este link reverso.",
"account.reverseShares.modal.simplified": "Modo simples",
"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": "Facilite o upload da pessoa para compartilhar o arquivo com você. Eles serão capazes de personalizar somente o nome e a descrição do compartilhamento.",
"account.reverseShares.modal.public-access": "Acesso público",
"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": "Faça os compartilhamentos criados com este compartilhamento reverso público. Se desativado, somente você e o criador do compartilhamento poderão visualizá-lo.",
"account.reverseShares.modal.max-use.label": "Limite de uso",
"account.reverseShares.modal.max-use.description": "A quantidade máxima de vezes que esta URL pode ser usada para criar um compartilhamento.",
"account.reverseShare.never-expires": "Este compartilhamento reverso nunca irá expirar.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Nome de usuário",
"admin.users.table.email": "E-mail",
"admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.title": "Editar usuário: {username}",
"admin.users.edit.update.admin-privileges": "Privilégios de administrador",
"admin.users.edit.update.change-password.title": "Alterar senha",
"admin.users.edit.update.change-password.field": "Nova senha",
"admin.users.edit.update.change-password.button": "Salvar nova senha",
"admin.users.edit.update.notify.password.success": "Senha alterada com sucesso",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "Excluir usuário {username} ?",
"admin.users.edit.delete.description": "Você realmente quer excluir este usuário e todos os seus compartilhamentos?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Criar usuário",
"admin.users.modal.create.username": "Nome de usuário",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "ID do Compartilhamento",
"admin.shares.table.username": "Criador",
"admin.shares.table.visitors": "Visitantes",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.table.expires": "Expira em",
"admin.shares.edit.delete.title": "Excluir o compartilhamento {id}",
"admin.shares.edit.delete.description": "Tem certeza que deseja excluir este compartilhamento?",
// END /admin/shares
// /upload
"upload.title": "Carregar",
"upload.notify.confirm-leave": "Você tem certeza que deseja sair desta página? Seu envio será cancelado.",
"upload.notify.generic-error": "Ocorreu um erro ao terminar seu compartilhamento.",
"upload.notify.count-failed": "Falha ao enviar {count} arquivos. Tentando novamente.",
"upload.reverse-share.error.invalid.title": "Link de compartilhamento reverso inválido",
"upload.reverse-share.error.invalid.description": "Este compartilhamento reverso expirou ou é inválido.",
// Dropzone.tsx
"upload.dropzone.title": "Carregar arquivos",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
"upload.dropzone.description": "Arraste os arquivos aqui para iniciar o seu compartilhamento. Aceitamos apenas arquivos até {maxSize} no total.",
"upload.dropzone.notify.file-too-big": "Seus arquivos excedem o tamanho máximo do compartilhamento {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Nome",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Você não está conectado",
"upload.modal.not-signed-in-description": "Você não poderá excluir seu compartilhamento manualmente e visualizar a contagem de visitantes.",
"upload.modal.expires.never": "nunca",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "Compartilhamento permanente",
"upload.modal.expires.error.too-long": "Data de expiração excede o máximo de {max}.",
"upload.modal.link.label": "Link",
"upload.modal.expires.label": "Expiração",
"upload.modal.expires.minute-singular": "Minuto",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Compartilhar {shareId}",
"share.description": "Veja o que eu compartilhei com você!",
"share.fileCount": "{count, plural, one {}=1 {# arquivo} other {# arquivos}} · {size} (arquivo zip pode ser menor devido à compressão)",
"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.removed.title": "Compartilhamento removido",
@@ -272,16 +279,16 @@ export default {
"share.error.access-denied.title": "Compartilhamento privado",
"share.error.access-denied.description": "A conta atual não tem permissão para acessar este compartilhamento",
"share.modal.password.title": "Senha necessária",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Por favor, digite a senha para acessar este compartilhamento.",
"share.modal.password": "Senha",
"share.modal.error.invalid-password": "Senha inválida",
"share.button.download-all": "Transferir tudo",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.notify.download-all-preparing": "O compartilhamento está sendo preparado. Tente novamente em alguns minutos.",
"share.modal.file-link": "Link do arquivo",
"share.table.name": "Nome",
"share.table.size": "Tamanho",
"share.modal.file-preview.error.not-supported.title": "Visualização não suportada",
"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": "Pré-visualizações não são suportadas para este tipo de arquivos. Por favor, baixe o arquivo para visualizá-lo.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Editar {shareId}",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Ocorreu um erro ao terminar seu compartilhamento.",
"share.edit.notify.save-success": "Compartilhamento atualizado com sucesso",
// END /share/[id]/edit
// /imprint
"imprint.title": "Termos Legais",
// END /imprint
// /privacy
"privacy.title": "Política de Privacidade",
// END /privacy
// /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.category.general": "Geral",
"admin.config.category.share": "Compartilhamento",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "E-mail",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Login com Redes Sociais",
@@ -300,53 +316,65 @@ export default {
"admin.config.general.app-name.description": "Nome da aplicação",
"admin.config.general.app-url": "URL do Aplicativo",
"admin.config.general.app-url.description": "Em qual URL o Pingvin Share está disponível",
"admin.config.general.secure-cookies": "Cookies seguros",
"admin.config.general.secure-cookies.description": "Se definir a bandeira segura nos cookies. Se habilitado, o site não funcionará quando acessado por HTTP.",
"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.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.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.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Tempo em segundo para manter a informação dentro do cache.",
"admin.config.cache.max-items": "Máximo de itens",
"admin.config.cache.max-items.description": "Número máximo de itens dentro do cache.",
"admin.config.cache.redis-enabled": "Redis habilitado",
"admin.config.cache.redis-enabled.description": "Normalmente informações de caches Pingvin Share na memória. Se você executar várias instâncias do Pingvin Share, você precisa habilitar o cache do Redis para compartilhar o cache entre as instâncias.",
"admin.config.cache.redis-url": "URL do Redis",
"admin.config.cache.redis-url.description": "Url para conectar à instância de Redis usada para cache.",
"admin.config.email.enable-share-email-recipients": "Ativar compartilhamento por email",
"admin.config.email.enable-share-email-recipients.description": "Se deseja permitir o compartilhamento por e-mail com destinatários. Só ative isto se o SMTP estiver ativado.",
"admin.config.email.share-recipients-subject": "Assunto dos destinatários do compartilhamento",
"admin.config.email.share-recipients-subject.description": "Assunto do e-mail enviado para os destinatários do compartilhamento.",
"admin.config.email.share-recipients-message": "Assunto dos destinatários do compartilhamento",
"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 {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": "Mensagem que é enviada para os destinatários do compartilhamento. Variáveis disponíveis:\n {creator} - O nome de usuário do criador do compartilhamento\n {creatorEmail} - O e-mail do criador do compartilhamento\n {shareUrl} - A URL do compartilhamento\n {desc} - A descrição do compartilhamento\n {expires} - A data de expiração do compartilhamento\n Essas variáveis serão substituídas pelo valor real.",
"admin.config.email.reverse-share-subject": "Assunto do compartilhamento reverso",
"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": "Assunto do e-mail enviado quando alguém criou um compartilhamento com o seu link reverso.",
"admin.config.email.reverse-share-message": "Mensagem do compartilhamento reverso",
"admin.config.email.reverse-share-message.description": "Mensagem enviada quando alguém criou um compartilhamento com o link reverso. {shareUrl} será substituído pelo nome do criador e pela URL de compartilhamento.",
"admin.config.email.reset-password-subject": "Redefinir assunto da senha",
"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": "Assunto do e-mail enviado quando um usuário solicita uma redefinição de senha.",
"admin.config.email.reset-password-message": "Mensagem de redefinição de senha",
"admin.config.email.reset-password-message.description": "Mensagem enviada quando um usuário solicita uma redefinição de senha. {url} será substituído pela URL de redefinição de senha.",
"admin.config.email.invite-subject": "Assunto do convite",
"admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-subject.description": "Assunto do e-mail enviado quando um administrador convida um usuário.",
"admin.config.email.invite-message": "Mensagem de convite",
"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": "Mensagem que é enviada quando um administrador convida um usuário. {url} será substituído pelo URL de convite, {email} com o e-mail e {password} com a senha do usuário.",
"admin.config.share.allow-registration": "Permitir novos registos",
"admin.config.share.allow-registration.description": "Se o registro é permitido",
"admin.config.share.allow-unauthenticated-shares": "Permitir compartilhamentos sem autenticação",
"admin.config.share.allow-unauthenticated-shares.description": "Se usuários não autenticados podem criar compartilhamentos",
"admin.config.share.max-expiration": "Expiração máxima",
"admin.config.share.max-expiration.description": "Validade máxima de ações em horas. Defina 0 para permitir expiração ilimitada.",
"admin.config.share.max-expiration.description": "Expiração máxima de compartilhamento. Defina 0 para permitir expiração ilimitada.",
"admin.config.share.share-id-length": "Comprimento da ID do compartilhamento padrão",
"admin.config.share.share-id-length.description": "Comprimento padrão para a ID gerada de um compartilhamento. Este valor também é usado para gerar links para ações reversas. Um valor abaixo de 8 não é considerado seguro.",
"admin.config.share.max-size": "Tamanho máximo",
"admin.config.share.max-size.description": "Tamanho máximo do compartilhamento em bytes",
"admin.config.share.max-size.description": "Tamanho máximo do compartilhamento",
"admin.config.share.zip-compression-level": "Nível de compressão",
"admin.config.share.zip-compression-level.description": "Ajuste o nível para equilibrar entre o tamanho do arquivo e a velocidade de compressão. Valores válidos vão de 0 a 9, com 0 sendo sem compressão e 9 sendo compressão máxima. ",
"admin.config.share.chunk-size": "Tamanho do pedaço",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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": "Ajuste o tamanho do pedaço para seus uploads equilibrarem eficiência e confiabilidade de acordo com sua conexão com a internet. Pedaços menores podem aumentar as taxas de sucesso para conexões instáveis, enquanto partes maiores aceleram uploads para conexões estáveis.",
"admin.config.share.auto-open-share-modal": "Abertura automática do modal de criação de compartilhamento",
"admin.config.share.auto-open-share-modal.description": "O modal de criação de compartilhamento aparece automaticamente quando um usuário seleciona arquivos, eliminando a necessidade de clicar manualmente no botão.",
"admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled": "Habilitar",
"admin.config.smtp.enabled.description": "Se o SMTP está habilitado. Apenas defina como verdadeiro se você digitou o servidor, porta, e-mail, usuário e senha do seu servidor SMTP.",
"admin.config.smtp.host": "Servidor",
"admin.config.smtp.host.description": "Nome do Servidor SMTP",
"admin.config.smtp.port": "Porta",
"admin.config.smtp.port.description": "Porta do Servidor SMTP",
"admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "Email address from wich the emails get sent",
"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.description": "Nome de usuário do servidor SMTP",
"admin.config.smtp.password": "Senha",
@@ -382,8 +410,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Client secret do aplicativo Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Se o login do Discord está habilitado",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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": "Usuários limitados do Discord",
"admin.config.oauth.discord-limited-users.description": "Limite de login em usuários específicos por sua ID do Discord. Deixe em branco para desativar.",
"admin.config.oauth.discord-limited-guild": "ID do servidor limitado do Discord",
"admin.config.oauth.discord-limited-guild.description": "Limite de login para usuários em um servidor específico. Deixe em branco para desativar.",
"admin.config.oauth.discord-client-id": "ID do Cliente Discord",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "URI da descoberta do aplicativo OpenID Connect OAuth",
"admin.config.oauth.oidc-sign-out": "Sair do OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Se o botão “Sair” fará o logout do provedor OpenID Connect",
"admin.config.oauth.oidc-scope": "Escopo OpenID Connect",
"admin.config.oauth.oidc-scope.description": "Escopos que devem ser solicitados a partir do provedor OpenID Connect.",
"admin.config.oauth.oidc-username-claim": "Reivindicação de nome de usuário OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Nome de usuário no token de ID OpenID Connect. Deixe em branco se você não sabe o que é esta configuração.",
"admin.config.oauth.oidc-role-path": "Caminho para as funções no token OpenID Connect",
@@ -409,14 +439,14 @@ export default {
"admin.config.oauth.oidc-client-secret": "Segredo do cliente OpenID Connect",
"admin.config.oauth.oidc-client-secret.description": "ID do cliente do aplicativo OpenID OAuth",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled": "Habilitar LDAP",
"admin.config.ldap.enabled.description": "Usar autenticação LDAP para login de usuário",
"admin.config.ldap.url": "URL do Servidor",
"admin.config.ldap.url.description": "URL do Servidor LDAP",
"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": "Usuário padrão usado para realizar a pesquisa de usuário",
"admin.config.ldap.bind-password": "Bind Password",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"admin.config.ldap.bind-password.description": "Senha usada para realizar a busca de usuários",
"admin.config.ldap.search-base": "Base de Usuários",
"admin.config.ldap.search-base.description": "Localização base, onde a pesquisa do usuário será realizada",
"admin.config.ldap.search-query": "Consulta de usuário",
@@ -427,6 +457,37 @@ export default {
"admin.config.ldap.field-name-member-of.description": "Nome do atributo LDAP para os grupos, de um usuário é membro. Isto é usado ao verificar para o grupo de administração.",
"admin.config.ldap.field-name-email": "Nome do atributo do grupo de usuários",
"admin.config.ldap.field-name-email.description": "Nome do atributo LDAP para o email de um usuário.",
"admin.config.notify.success": "Configuração atualizada com sucesso.",
"admin.config.notify.logo-success": "Logo atualizado com sucesso. Pode levar alguns minutos para ser atualizado no site.",
"admin.config.notify.no-changes": "Nenhuma alteração para salvar.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Habilitado",
"admin.config.s3.enabled.description": "Se o S3 deve ser usado para armazenar os arquivos compartilhados em vez do sistema de arquivo local.",
"admin.config.s3.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "A URL do bucket S3.",
"admin.config.s3.region": "Região",
"admin.config.s3.region.description": "A região do bucket S3.",
"admin.config.s3.bucket-name": "Nome do Bucket",
"admin.config.s3.bucket-name.description": "O nome do bucket S3.",
"admin.config.s3.bucket-path": "Caminho",
"admin.config.s3.bucket-path.description": "O caminho padrão que deve ser usado para armazenar os arquivos no bucket S3.",
"admin.config.s3.key": "Chave",
"admin.config.s3.key.description": "A chave que permite a você acessar o bucket S3.",
"admin.config.s3.secret": "Segredo",
"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.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.imprint-text": "Imprimir texto",
"admin.config.legal.imprint-text.description": "O texto que deve ser mostrado na imagem. Suporta Markdown. Deixe em branco para vincular a página de impressão externa.",
"admin.config.legal.imprint-url": "Imprimir URL",
"admin.config.legal.imprint-url.description": "Se você já tem uma página impressa, você pode vinculá-la aqui ao invés de usar o campo de texto.",
"admin.config.legal.privacy-policy-text": "Texto da política de privacidade",
"admin.config.legal.privacy-policy-text.description": "O texto que deve ser mostrado na política de privacidade. Suporta Markdown. Deixe em branco para vincular a página de política de privacidade externa.",
"admin.config.legal.privacy-policy-url": "URL da política de privacidade",
"admin.config.legal.privacy-policy-url.description": "Se você já tem uma página impressa, você pode vinculá-la aqui ao invés de usar o campo de texto.",
// 404
"404.description": "Ops, esta página não existe.",
"404.button.home": "Me traga de volta para casa",
@@ -441,10 +502,10 @@ export default {
"error.msg.no_user": "O usuário vinculado a esta conta {0} não existe.",
"error.msg.no_email": "Não é possível obter o endereço de e-mail desta conta {0}.",
"error.msg.already_linked": "Esta conta {0} já está vinculada a outra conta.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.not_linked": "Esta conta {0} ainda não foi vinculada a nenhuma conta.",
"error.msg.unverified_account": "Esta conta {0} não foi verificada, tente novamente após a verificação.",
"error.msg.user_not_allowed": "Você não tem permissão para acessar.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.msg.cannot_get_user_info": "Não é possível obter suas informações de usuário desta conta {0}.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
@@ -462,12 +523,13 @@ export default {
"common.button.generate": "Gerar",
"common.button.done": "Concluído",
"common.text.link": "Link",
"common.text.navigate-to-link": "Visit link",
"common.text.navigate-to-link": "Visitar Link",
"common.text.or": "ou",
"common.text.redirecting": "Redirecionando...",
"common.button.go-back": "Voltar",
"common.button.go-home": "Voltar para o Início",
"common.notify.copied": "O seu link foi copiado para a área de transferência",
"common.notify.copied-link": "O seu link foi copiado para a área de transferência",
"common.success": "Sucesso",
"common.error": "Erro",
"common.error.unknown": "Ocorreu um erro desconhecido",

View File

@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "На собственном сервере",
"home.bullet.a.description": "Pingvin Share работает на вашей машине.",
"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.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.source": "Исходный код",
// END /
@@ -34,7 +34,7 @@ export default {
"signIn.notify.totp-required.title": "Требуется двухфакторная аутентификация",
"signIn.notify.totp-required.description": "Пожалуйста, введите код Вашей 2-х факторной аутентификации",
"signIn.oauth.or": "ИЛИ",
"signIn.oauth.signInWith": "Sign in with",
"signIn.oauth.signInWith": "Войдите с помощью",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password
"resetPassword.title": "Забыли пароль?",
"resetPassword.description": "Введите ваш email для восстановления пароля.",
"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.text.resetPassword": "Сбросить пароль",
"resetPassword.text.enterNewPassword": "Введите новый пароль",
"resetPassword.input.password": "Новый пароль",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "Ваш пароль успешно изменён.",
// /account
"account.title": "Мой аккаунт",
"account.card.info.title": "Информация об аккаунте",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Пароль",
"account.card.password.old": "Старый пароль",
"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.card.oauth.title": "Авторизация через социальные сети",
"account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Отключить",
"account.card.oauth.unlinked": "Отключен",
"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.card.security.title": "Безопасность",
"account.card.security.totp.enable.description": "Введите ваш текущий пароль для начала включения TOTP",
@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Размер",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Сведения",
"account.shares.modal.share-link": "Поделиться ссылкой",
"account.shares.modal.delete.title": "Delete share: {share}",
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Год",
"account.reverseShares.modal.expiration.year-plural": "Года (лет)",
"account.reverseShares.modal.max-size.label": "Макс. размер загрузки",
"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.simplified": "Simple mode",
"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.public-access": "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.send-email": "Отправлять уведомления по эл. почте",
"account.reverseShares.modal.send-email.description": "Отправлять уведомление по электронной почте, когда загрузка создается с помощью этой обратной ссылки.",
"account.reverseShares.modal.simplified": "Упрощенный режим",
"account.reverseShares.modal.simplified.description": "Получатель приглашения легко сможет загружать файл для того, чтобы поделиться им с Вами. Они смогут только настроить имя и описание доли.",
"account.reverseShares.modal.public-access": "Публичный доступ",
"account.reverseShares.modal.public-access.description": "Сделать файлы общедоступными, созданные с этим обратным общим публичным доступом. Если отключено, только вы и создатель ресурса будут иметь доступ к ним для просмотра.",
"account.reverseShares.modal.max-use.label": "Максимум использований",
"account.reverseShares.modal.max-use.description": "Максимальное количество раз, когда URL может быть использован для создания загрузки.",
"account.reverseShare.never-expires": "Эта обратная загрузка никогда не устареет.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Логин",
"admin.users.table.email": "Электронная почта",
"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.change-password.title": "Изменить пароль",
"admin.users.edit.update.change-password.field": "Новый пароль",
"admin.users.edit.update.change-password.button": "Сохранить новый пароль",
"admin.users.edit.update.notify.password.success": "Пароль успешно изменён",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "Удалить пользователя {username} ?",
"admin.users.edit.delete.description": "Вы действительно хотите удалить этого пользователя и все его загрузки?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Создать пользователя",
"admin.users.modal.create.username": "Логин",
@@ -202,22 +205,25 @@ export default {
"admin.users.modal.create.admin.description": "Если отмечено, пользователь будет иметь доступ к панели администратора.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Share management",
"admin.shares.title": "Управление Share",
"admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Visitors",
"admin.shares.table.expires": "Expires on",
"admin.shares.table.username": "Автор",
"admin.shares.table.visitors": "Посетители",
"admin.shares.table.expires": "Срок действия до",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
"admin.shares.edit.delete.description": "Вы действительно хотите удалить эту загрузку?",
// END /admin/shares
// /upload
"upload.title": "Загрузить",
"upload.notify.confirm-leave": "Вы уверены, что хотите покинуть эту страницу? Загрузка будет отменена.",
"upload.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.",
"upload.notify.count-failed": "Не удалось загрузить файлы {count}. Повтор попытки.",
"upload.reverse-share.error.invalid.title": "Неверная обратная ссылка",
"upload.reverse-share.error.invalid.description": "Эта обратная доля устарела или является недействительной.",
// Dropzone.tsx
"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.notify.file-too-big": "Ваши файлы превышают максимальный размер в {maxSize}.",
"upload.dropzone.description": "Перетащите сюда файлы для начала загрузки. Размер всех файлов не должен превышать {maxSize}.",
"upload.dropzone.notify.file-too-big": "Ваши файлы превышают максимальный размер {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Название",
"upload.filelist.size": "Размер",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Вы не авторизованы",
"upload.modal.not-signed-in-description": "Вы не сможете удалить свои файлы вручную и просмотреть количество посетителей.",
"upload.modal.expires.never": "никогда",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "Постоянный доступ",
"upload.modal.expires.error.too-long": "Срок действия превышает максимальный предел {max}.",
"upload.modal.link.label": "Ссылка",
"upload.modal.expires.label": "Истекает",
"upload.modal.expires.minute-singular": "Минута",
@@ -246,7 +252,7 @@ export default {
"upload.modal.expires.year-plural": "Года (лет)",
"upload.modal.accordion.name-and-description.title": "Имя и описание",
"upload.modal.accordion.name-and-description.name.placeholder": "Имя",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
"upload.modal.accordion.name-and-description.description.placeholder": "Примечание для получателей этой загрузки",
"upload.modal.accordion.email.title": "Получатели письма",
"upload.modal.accordion.email.placeholder": "Получатели e-mail",
"upload.modal.accordion.email.invalid-email": "Недопустимый адрес электронной почты",
@@ -259,29 +265,30 @@ export default {
"upload.modal.completed.never-expires": "Эта загрузка никогда не устареет.",
"upload.modal.completed.expires-on": "Эта загрузка устареет {expiration}.",
"upload.modal.completed.share-ready": "Готово",
"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": "Мы уведомили создателя обратного ресурса. Вы также можете вручную поделиться этой ссылкой с ними другими средствами.",
// END /upload
// /share/[id]
"share.title": "Загрузка {shareId}",
"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.description": "Превышен лимит посетителей.",
"share.error.removed.title": "Загрузка удалена",
"share.error.not-found.title": "Загрузка не найдена",
"share.error.not-found.description": "Страница, которую вы ищете, не существует.",
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.error.access-denied.title": "Приватное доступ",
"share.error.access-denied.description": "У текущей учетной записи нет разрешения на доступ к этому ресурсу",
"share.modal.password.title": "Требуется пароль",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Пожалуйста, введите пароль для доступа к этому ресурсу.",
"share.modal.password": "Пароль",
"share.modal.error.invalid-password": "Неверный пароль",
"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.table.name": "Название",
"share.table.size": "Размер",
"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]
// /share/[id]/edit
"share.edit.title": "Редактировать {shareId}",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.",
"share.edit.notify.save-success": "Ссылка на ресурс успешна обновлена",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Общее",
"admin.config.category.share": "Загрузки",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Электронная почта",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Авторизация через социальные сети",
@@ -300,66 +316,78 @@ export default {
"admin.config.general.app-name.description": "Видимое название приложения",
"admin.config.general.app-url": "URL-адрес приложения",
"admin.config.general.app-url.description": "Адрес на котором доступен Pingvin Share",
"admin.config.general.secure-cookies": "Безопасные куки",
"admin.config.general.secure-cookies.description": "Установите флаг безопасности на cookies. Если включено, сайт не будет работать при доступе по HTTP.",
"admin.config.general.show-home-page": "Показывать домашнюю страницу",
"admin.config.general.show-home-page.description": "Показывать ли домашнюю страницу или нет",
"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": "Длительность сессии",
"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.description": "Измените свой логотип, загрузив новое изображение. Изображение должно быть PNG и должно иметь формат 1:1.",
"admin.config.general.logo.placeholder": "Выберите изображение",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Включить отправку email получателю",
"admin.config.email.enable-share-email-recipients.description": "Разрешить ли обмен электронной почтой с получателями. Включите, только если включен SMTP.",
"admin.config.email.share-recipients-subject": "Заголовок письма (загрузка)",
"admin.config.email.share-recipients-subject.description": "Тема письма, которое отправляется получателям акции.",
"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 {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": "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.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.description": "Сообщение, которое отправляется, когда кто-то создал загрузку с вашей обратной ссылкой. {shareUrl} будет заменен именем создателя и URL-адресом общего доступа.",
"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.description": "Сообщение, которое отправляется при запросе сброса пароля. {url} будет заменён ссылкой.",
"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.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} будет заменён ссылкой приглашения, а {password} паролем.",
"admin.config.share.allow-registration": "Разрешить регистрацию",
"admin.config.share.allow-registration.description": "Разрешена ли регистрация",
"admin.config.share.allow-unauthenticated-shares": "Разрешить неавторизованные загрузки",
"admin.config.share.allow-unauthenticated-shares.description": "Могут ли неавторизованные пользователи создавать загрузки",
"admin.config.share.max-expiration": "Максимальная срок действия",
"admin.config.share.max-expiration.description": "Максимальный срок действия общего доступа в часах. Установите значение 0, чтобы разрешить неограниченный срок действия.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Длина идентификатора по умолчанию",
"admin.config.share.share-id-length.description": "Длина по умолчанию для сгенерированного ID ресурса. Это значение также используется для генерации ссылок для обратных акций. Значение ниже 8 не считается безопасным.",
"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.description": "Регулировка уровня баланса между размером файла и скоростью сжатия. Допустимые значения от 0 до 9, с 0 без сжатия, а 9 - максимальное сжатие. ",
"admin.config.share.chunk-size": "Размер чанка",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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.share.chunk-size.description": "Отрегулируйте размер чанка для ваших загрузок, чтобы сбалансировать эффективность и надежность в соответствии с вашим интернет-соединением. Меньшие чанки могут повысить успешность нестабильных соединений, а большие чанки ускоряют загрузку для стабильных соединений.",
"admin.config.share.auto-open-share-modal": "Автоматически открыть общий доступ",
"admin.config.share.auto-open-share-modal.description": "Модуль создания общего доступа автоматически появляется, когда пользователь выбирает файлы, устраняя необходимость вручную нажать кнопку.",
"admin.config.smtp.enabled": "Включено",
"admin.config.smtp.enabled.description": "Включено ли SMTP. Установите значение true только если вы ввели хост, порт, email, пользователь и пароль вашего SMTP-сервера.",
"admin.config.smtp.host": "Хост",
"admin.config.smtp.host.description": "Сервер SMTP сервера",
"admin.config.smtp.port": "Порт",
"admin.config.smtp.port.description": "Порт SMTP сервера",
"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.description": "Имя пользователя SMTP сервера",
"admin.config.smtp.password": "Пароль",
"admin.config.smtp.password.description": "Пароль SMTP-сервера",
"admin.config.smtp.button.test": "Отправить тестовое письмо",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
"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": "Доверять несанкционированным сертификатам SMTP-сервера",
"admin.config.smtp.allow-unauthorized-certificates.description": "Установите это значение только в том случае, если вам нужно доверять самоподписанным сертификатам.",
"admin.config.oauth.allow-registration": "Разрешить регистрацию",
"admin.config.oauth.allow-registration.description": "Разрешить пользователям регистрироваться используя учетные записи социальных сетей",
"admin.config.oauth.ignore-totp": "Игнорировать TOTP",
"admin.config.oauth.ignore-totp.description": "Игнорировать TOTP при использовании социальной авторизации",
"admin.config.oauth.disable-password": "Disable password login",
"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": "Отключить логин и пароль",
"admin.config.oauth.disable-password.description": "Следует ли отключать вход по паролю? \nПеред активацией этой конфигурации убедитесь, что поставщик OAuth настроен должным образом, чтобы избежать блокировки.",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Включен ли логин на GitHub",
"admin.config.oauth.github-client-id": "ID клиента GitHub",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Упс, этой страницы не существует.",
"404.button.home": "Верните меня домой",
@@ -462,20 +523,21 @@ export default {
"common.button.generate": "Сгенерировать",
"common.button.done": "Готово",
"common.text.link": "Ссылка",
"common.text.navigate-to-link": "Visit link",
"common.text.navigate-to-link": "Перейти по ссылке",
"common.text.or": "или",
"common.text.redirecting": "Redirecting...",
"common.text.redirecting": "Идет перенаправление...",
"common.button.go-back": "Назад",
"common.button.go-home": "Домой",
"common.notify.copied": "Ваша ссылка скопирована в буфер обмена",
"common.success": "Успешно",
"common.notify.copied-link": "Ваша ссылка скопирована в буфер обмена",
"common.success": "Успех",
"common.error": "Ошибочка",
"common.error.unknown": "Произошла неизвестная ошибка",
"common.error.invalid-email": "Недопустимый адрес электронной почты",
"common.error.too-short": "Должно быть не менее {length} символов",
"common.error.too-long": "Должно быть не больше {length} символов",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.number-too-small": "Должно быть не меньше {min}",
"common.error.number-too-large": "Должно быть не больше {max}",
"common.error.exact-length": "Должно быть ровно {length} символов",
"common.error.invalid-number": "Должно быть числом",
"common.error.field-required": "Поле обязательно для заполнения"

View File

@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Velikost",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Delite informacije",
"account.shares.modal.share-link": "Delite povezavo",
"account.shares.modal.delete.title": "Delete share: {share}",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "Naložite",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Prišlo je do napake pri ustvarjanju vašega deljenja.",
"upload.notify.count-failed": "Prišlo je do napake pri nalaganju toliko datotek: {count}. Poskušamo ponovno.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Naloži datoteke",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Deli {shareId}",
"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.description": "Število ogledov za to delitev je bila prekoračena.",
"share.error.removed.title": "Delitev je odstranjena",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.modal.password.title": "Zahtevano geslo",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Geslo",
"share.modal.error.invalid-password": "Napačno geslo",
"share.button.download-all": "Prenesi vse",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Prišlo je do napake pri ustvarjanju vaše delitve.",
"share.edit.notify.save-success": "Delitev je bila uspešno posodbljena",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Splošno",
"admin.config.category.share": "Delitev",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "E-pošta",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Prijava z računi družbenih omrežij",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Ime vaše aplikacije",
"admin.config.general.app-url": "URL aplikacije",
"admin.config.general.app-url.description": "Na katerem URL-ju je dostopen Pingvin Share",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "Prikaži 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.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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Zadeva poslane delitve",
"admin.config.email.share-recipients-subject.description": "Zadeva e-poštnega sporočila, ki bo poslan prejemnikom delitve.",
"admin.config.email.share-recipients-message": "Vsebina poslane delitve",
"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 {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": "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.reverse-share-subject": "Zadeva delitve v obratni smeri",
"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-message": "Vsebina delitve v obratni smeri",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Dovoli delitve s strani neprijavljenih uporabnikov",
"admin.config.share.allow-unauthenticated-shares.description": "Če lahko neprijavljeni uporabniki ustvarijo delitve",
"admin.config.share.max-expiration": "Najvišja zapadlost",
"admin.config.share.max-expiration.description": "Najvišja zapadlost delitve v urah. Nastavljeno na 0 pomeni brez zapadlosti.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Največja velikost",
"admin.config.share.max-size.description": "Največja velikost delitve v bytih",
"admin.config.share.max-size.description": "Največja velikost delitve",
"admin.config.share.zip-compression-level": "Nivo Zip stiskanja",
"admin.config.share.zip-compression-level.description": "Nivo stiskanja, ki uravnoveša med velikostjo datoteke in hitrostjo stiskanja. Veljavne vrednosti so med 0 in 9, kjer 0 pomeni brez kompresije in 9 pomeni največjo kompresijo. ",
"admin.config.share.chunk-size": "Velikost delcev",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "Vrata",
"admin.config.smtp.port.description": "Vrata SMTP strežnika",
"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.description": "Uporabniško ime SMTP strežnika",
"admin.config.smtp.password": "Geslo",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "URI za odkrivanje OpenID Connect OAuth aplikacije",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect zahteva za uporabniško ime",
"admin.config.oauth.oidc-username-claim.description": "Zahteva za uporabniško ime za OpenID Connect ID žetona. Pustite prazno, če ne poznate te nastavitve.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Ups! Ta stran ne obstaja.",
"404.button.home": "Pelji me domov",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Nazaj",
"common.button.go-home": "Pojdi domov",
"common.notify.copied": "Povezava je bila kopirana v odložišče",
"common.notify.copied-link": "Povezava je bila kopirana v odložišče",
"common.success": "Uspešno",
"common.error": "Napaka",
"common.error.unknown": "Prišlo je do neznane napake",

File diff suppressed because it is too large Load Diff

View File

@@ -1,33 +1,33 @@
export default {
// Navbar
"navbar.upload": "Пошаљи",
"navbar.signin": "Пријавите се",
"navbar.upload": "Отпреми",
"navbar.signin": "Пријава",
"navbar.home": "Почетна",
"navbar.signup": "Sign up",
"navbar.links.shares": "Moja дељења",
"navbar.signup": "Регистрација",
"navbar.links.shares": "Моја дељења",
"navbar.links.reverse": "Обрнуто дељење",
"navbar.avatar.account": "Мој налог",
"navbar.avatar.admin": "Администрација",
"navbar.avatar.signout": "Одјави се",
// END navbar
// /
"home.title": "<h>self-hosted</h> платформа за дељење фајлова.",
"home.title": "<h>Само-хостована</h> платформа за дељење фајлова.",
"home.description": "Да ли заиста желите да дате своје личне датотеке у руке трећих страна као што је WeTransfer?",
"home.bullet.a.name": "Личан хостинг",
"home.bullet.a.name": "Само-хостовано",
"home.bullet.a.description": "Хостујте Pingvin Share на својој машини.",
"home.bullet.b.name": "Privatnost",
"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.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Почети",
"home.bullet.c.description": "Отпремите онолико великих датотека колико желите. Само ваш чврсти диск је граница.",
"home.button.start": "Започни",
"home.button.source": "Изворни код",
// END /
// /auth/signin
"signin.title": "Добродошли назад",
"signin.description": "Још увек немате налог?",
"signin.button.signup": "Региструј се",
"signin.input.email-or-username": "Е-пошта или корисничко име",
"signin.input.email-or-username.placeholder": "Ваша Е-пошта или корисничко име",
"signin.input.email-or-username": "Имејл или корисничко име",
"signin.input.email-or-username.placeholder": "Ваш имејл или корисничко име",
"signin.input.password": "Лозинка",
"signin.input.password.placeholder": "Ваша лозинка",
"signin.button.submit": "Пријавите се",
@@ -47,8 +47,8 @@ export default {
"signup.button.signin": "Пријавите се",
"signup.input.username": "Корисничко име",
"signup.input.username.placeholder": "Ваше корисничко име",
"signup.input.email": "E-пошта",
"signup.input.email.placeholder": "Ваш и-мејл",
"signup.input.email": "Имејл",
"signup.input.email.placeholder": "Ваш имејл",
"signup.button.submit": "Хајде да почнемо",
// END /auth/signup
// /auth/totp
@@ -57,23 +57,23 @@ export default {
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Заборавили сте лозинку?",
"resetPassword.description": "Унесите своју е-пошту да бисте ресетовали лозинку.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.description": "Унесите свој имејл да бисте ресетовали лозинку.",
"resetPassword.notify.success": "Порука са линком за ресетовање лозинке је послата ако унета и-мејл адреса постоји.",
"resetPassword.button.back": "Назад на страницу за пријаву",
"resetPassword.text.resetPassword": "Обнови лозинку",
"resetPassword.text.enterNewPassword": "Унесите вашу нову лозинку",
"resetPassword.input.password": "Нова лозинка",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "Ваша лозинка је успешно ресетована.",
// /account
"account.title": "Мој налог",
"account.card.info.title": "Подаци о налогу",
"account.card.info.username": "Корисничко име",
"account.card.info.email": "E-пошта",
"account.card.info.email": "Имејл",
"account.notify.info.success": "Налог је успешно ажуриран",
"account.card.password.title": "Лозинка",
"account.card.password.old": "Стара лозинка",
"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.card.oauth.title": "Социал логин",
"account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Прекини везу",
"account.card.oauth.unlinked": "Веза је прекинута",
"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.card.security.title": "Безбедност",
"account.card.security.totp.enable.description": "Унесите своју тренутну лозинку да бисте почели да омогућавате ТОТП",
@@ -112,21 +112,24 @@ export default {
"account.modal.delete.description": "Да ли заиста желите да избришете свој налог укључујући све ваше активне дељења?",
// END /account
// /account/shares
"account.shares.title": "Moja дељења",
"account.shares.title": "Моја дељења",
"account.shares.title.empty": "Овде је празно 👀",
"account.shares.description.empty": "Немате никаква дељења.",
"account.shares.button.create": "Направите",
"account.shares.info.title": "Делите информације",
"account.shares.table.id": "ИД",
"account.shares.table.id": "ID",
"account.shares.table.name": "Назив",
"account.shares.table.description": "Опис",
"account.shares.table.visitors": "Посетици",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.visitors": "Посетиоци",
"account.shares.table.expiresAt": "Истиче",
"account.shares.table.createdAt": "Направљено",
"account.shares.table.size": "Величина",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Делите информације",
"account.shares.modal.share-link": "Дели везу",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "Избриши дељење {share}",
"account.shares.modal.delete.description": "Да ли заиста желите да избришете ово дељење?",
// END /account/shares
// /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Година",
"account.reverseShares.modal.expiration.year-plural": "Године",
"account.reverseShares.modal.max-size.label": "Максимална величина дељења",
"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": "Пошаљи обавештења и-мејлом",
"account.reverseShares.modal.send-email.description": "Пошаљи обавештење имејлом када се креира дељење помоћу ове обрнуте везе за дељење.",
"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.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.description": "Максималан број пута који овај URL може да се користи за прављење дељења.",
"account.reverseShare.never-expires": "Ово обрнуто дељење никада неће истећи.",
@@ -174,49 +177,52 @@ export default {
// /admin
"admin.title": "Администрација",
"admin.button.users": "Управљање корисницима",
"admin.button.shares": "Управљање deljenjima",
"admin.button.shares": "Управљање дељењем",
"admin.button.config": "Конфигурација",
"admin.version": "Верзија",
// END /admin
// /admin/users
"admin.users.title": "Управљање корисницима",
"admin.users.table.username": "Корисничко име",
"admin.users.table.email": "E-пошта",
"admin.users.table.email": "Имејл",
"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.change-password.title": "Промените лозинку",
"admin.users.edit.update.change-password.field": "Нова лозинка",
"admin.users.edit.update.change-password.button": "Снимите нову лозинку",
"admin.users.edit.update.notify.password.success": "Лозинка је успешно промењена",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "Обришите корисника: {username} ?",
"admin.users.edit.delete.description": "Да ли заиста желите да обришете овог корисника и сва његова дељења?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Креирај корисника",
"admin.users.modal.create.username": "Корисничко име",
"admin.users.modal.create.email": "E-пошта",
"admin.users.modal.create.email": "Имејл",
"admin.users.modal.create.password": "Лозинка",
"admin.users.modal.create.manual-password": "Поставите лозинку ручно",
"admin.users.modal.create.manual-password.description": "Ако није означено, корисник ће добити е-пошту са везом за постављање лозинке.",
"admin.users.modal.create.manual-password.description": "Ако није означено, корисник ће добити имејл са везом за постављање лозинке.",
"admin.users.modal.create.admin": "Администраторске привилегије",
"admin.users.modal.create.admin.description": "Ако је означено, корисник ће моћи да приступи административном панелу.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Share management",
"admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Visitors",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
"admin.shares.title": "Управљање дељењем",
"admin.shares.table.id": "ID дељења",
"admin.shares.table.username": "Креатор",
"admin.shares.table.visitors": "Посетиоци",
"admin.shares.table.expires": "Истиче",
"admin.shares.edit.delete.title": "Обриши дељење: {id}",
"admin.shares.edit.delete.description": "Да ли заиста желите да обришете ово дељење?",
// END /admin/shares
// /upload
"upload.title": "Пошаљи",
"upload.notify.confirm-leave": "Да ли сте сигурни да желите да напустите ову страницу? Ваше отпремање ће бити отказано.",
"upload.notify.generic-error": "Дошло је до грешке при довршавању дељења.",
"upload.notify.count-failed": "Отпремање {count} датотека није успело. Покушавам поново.",
"upload.reverse-share.error.invalid.title": "Неправилан линк за обрнуто дељење",
"upload.reverse-share.error.invalid.description": "Ово обрнуто дељење је истекло или је неважеће.",
// Dropzone.tsx
"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}.",
// FileList.tsx
"upload.filelist.name": "Назив",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Нисте пријављени",
"upload.modal.not-signed-in-description": "Нећете моћи ручно да избришете своје дељење и видите број посетилаца.",
"upload.modal.expires.never": "никад",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "Трајно дељење",
"upload.modal.expires.error.too-long": "Датум истека превазилази максималну вредност од {max}.",
"upload.modal.link.label": "Линк",
"upload.modal.expires.label": "Истиче",
"upload.modal.expires.minute-singular": "Минут",
@@ -244,12 +250,12 @@ export default {
"upload.modal.expires.month-plural": "Месеци",
"upload.modal.expires.year-singular": "Година",
"upload.modal.expires.year-plural": "Године",
"upload.modal.accordion.name-and-description.title": "Name and description",
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
"upload.modal.accordion.email.title": "Примаоци е-поште",
"upload.modal.accordion.email.placeholder": "Унесите примаоце е-поште",
"upload.modal.accordion.email.invalid-email": "Неисправна адреса е-поште",
"upload.modal.accordion.name-and-description.title": "Име и опис",
"upload.modal.accordion.name-and-description.name.placeholder": "Име",
"upload.modal.accordion.name-and-description.description.placeholder": "Напомена за примаоце овог дељења",
"upload.modal.accordion.email.title": "Примаоци имејла",
"upload.modal.accordion.email.placeholder": "Унесите примаоце имејла",
"upload.modal.accordion.email.invalid-email": "Неисправна адреса имејла",
"upload.modal.accordion.security.title": "Сигурносна подешавања",
"upload.modal.accordion.security.password.label": "Заштита лозинком",
"upload.modal.accordion.security.password.placeholder": "Нема лозинке",
@@ -259,192 +265,247 @@ export default {
"upload.modal.completed.never-expires": "Ово дељење никада неће истећи.",
"upload.modal.completed.expires-on": "Ово дељење ће истећи {expiration}.",
"upload.modal.completed.share-ready": "Дељење је спремно",
"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": "Обавестили смо креатора реверзног дељења. Такође можете ручно поделити овај линк са њима на друге начине.",
// END /upload
// /share/[id]
"share.title": "Дељење {shareId}",
"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.description": "Ограничење посетилаца из овог дељења је премашено.",
"share.error.removed.title": "Дељење је уклоњено",
"share.error.not-found.title": "Дељење није пронађено",
"share.error.not-found.description": "Удео који тражите не постоји.",
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.error.access-denied.title": "Приватно дељење",
"share.error.access-denied.description": "Тренутни налог нема дозволу за приступ овом дељењу",
"share.modal.password.title": "Обавезна лозинка",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Лозинка",
"share.modal.error.invalid-password": "Неисправна лозинка",
"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.table.name": "Назив",
"share.table.size": "Величина",
"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]
// /share/[id]/edit
"share.edit.title": "Edit {shareId}",
"share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
"share.edit.title": "Уреди {shareId}",
"share.edit.append-upload": "Надодај фајл",
"share.edit.notify.generic-error": "Дошло је до грешке приликом завршетка вашег дељења.",
"share.edit.notify.save-success": "Дељење је успешно ажурирано",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Опште",
"admin.config.category.share": "Дељење",
"admin.config.category.email": "E-пошта",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Имејл",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Социал Логин",
"admin.config.category.oauth": "Social Login",
"admin.config.general.app-name": "Назив апликације",
"admin.config.general.app-name.description": "Назив апликације",
"admin.config.general.app-url": "URL апликације",
"admin.config.general.app-url.description": "На којој URL адреси је доступан Pingvin Share",
"admin.config.general.secure-cookies": "Безбедни колачићи",
"admin.config.general.secure-cookies.description": "Да ли желите да поставите заставицу за безбедност на колачиће? Ако је омогућено, сајт неће функционисати када му приступате преко HTTP-а.",
"admin.config.general.show-home-page": "Прикажи почетну страницу",
"admin.config.general.show-home-page.description": "Да ли да се прикаже почетна страница",
"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": "Трајање сесије",
"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.description": "Промените свој логотип тако што ћете отпремити нову слику. Слика мора да буде PNG и треба да има формат 1:1.",
"admin.config.general.logo.placeholder": "Изабери слику",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Омогући дељење са примаоцима имејлом",
"admin.config.email.enable-share-email-recipients.description": "Да ли дозволити дељење са примаоцима путем имејла. Омогућите ово само ако је SMTP активиран.",
"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.description": "Message which gets sent to the share recipients. Available variables:\n {creator} - The username 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} - URL дељења\n{desc} - Опис дељења\n{expires} - Датум истека дељења\nОве променљиве ће бити замењене стварним вредностима.",
"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.description": "Порука која се шаље када је неко направио дељење са вашом обрнутом везом за дељење. {shareUrl} ће бити замењен именом креатора и УРЛ-ом за дељење.",
"admin.config.email.reverse-share-message.description": "Порука која се шаље када је неко направио дељење са вашом обрнутом везом за дељење. {shareUrl} ће бити замењен именом креатора и URL-ом за дељење.",
"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.description": "Порука која се шаље када корисник затражи ресетовање лозинке. {url} ће бити замењен УРЛ-ом за ресетовање лозинке.",
"admin.config.email.reset-password-message.description": "Порука која се шаље када корисник затражи ресетовање лозинке. {url} ће бити замењен линком за ресетовање лозинке.",
"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.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.description": "Да ли је регистрација дозвољена",
"admin.config.share.allow-unauthenticated-shares": "Дозволи дељење без аутентификације",
"admin.config.share.allow-unauthenticated-shares.description": "Да ли корисници без аутентификације могу да креирају дељења",
"admin.config.share.max-expiration": "Максимални рок трајања",
"admin.config.share.max-expiration.description": "Максимални рок трајања дељења у сатима. Поставите на 0 да бисте омогућили неограничено трајање.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Дужина подразумеваног ID-а за дељење",
"admin.config.share.share-id-length.description": "Подразумевана дужина генерисаног ID-а за дељење. Ова вредност се такође користи за генерисање линкова за обрнуто дељење. Вредност испод 8 се не сматра безбедном.",
"admin.config.share.max-size": "Максимална величина",
"admin.config.share.max-size.description": "Максимална величина дељења у бајтовима",
"admin.config.share.zip-compression-level": "Ниво zip компресије",
"admin.config.share.max-size.description": "Максимална величина дељења",
"admin.config.share.zip-compression-level": "Ниво Zip компресије",
"admin.config.share.zip-compression-level.description": "Подесите ниво да бисте балансирали између величине датотеке и брзине компресије. Важеће вредности се крећу од 0 до 9, при чему је 0 без компресије, а 9 је максимална компресија. ",
"admin.config.share.chunk-size": "Chunk size",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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.description": "Да ли је SMTP омогућен. Поставите ово на тачно само ако сте унели хост, порт, е-пошту, корисника и лозинку вашег SMTP сервера.",
"admin.config.share.chunk-size": "Величина комада",
"admin.config.share.chunk-size.description": "Подесите величину дела за ваша отпремање како бисте уравнотежили ефикасност и поузданост у складу са вашом интернет везом. Мањи делови могу побољшати стопу успеха за нестабилне везе, док већи делови омогућавају брже отпремање за стабилне везе.",
"admin.config.share.auto-open-share-modal": "",
"admin.config.share.auto-open-share-modal.description": "Модал за креирање дељења аутоматски се појављује када корисник изабере датотеке, елиминишући потребу за ручним кликом на дугме.",
"admin.config.smtp.enabled": "Омогући",
"admin.config.smtp.enabled.description": "Да ли је SMTP омогућен. Поставите ово на тачно само ако сте унели хост, порт, имејл, корисника и лозинку вашег SMTP сервера.",
"admin.config.smtp.host": "Домаћин",
"admin.config.smtp.host.description": "Домаћин SMTP сервера",
"admin.config.smtp.port": "Порт",
"admin.config.smtp.port.description": "Порт домаћина SMTP сервера",
"admin.config.smtp.email": "E-пошта",
"admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.email": "Имејл",
"admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "Корисничко име",
"admin.config.smtp.username.description": "Корисничко име SMTP сервера",
"admin.config.smtp.password": "Лозинка",
"admin.config.smtp.password.description": "Лозинка SMTP сервера",
"admin.config.smtp.button.test": "Пошаљи тестну е-пошту",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
"admin.config.smtp.button.test": "Пошаљи тестни имејл",
"admin.config.smtp.allow-unauthorized-certificates": "Веровање неауторизованим SMTP серверским сертификатима",
"admin.config.smtp.allow-unauthorized-certificates.description": "Ово поставите на \"истина\" само ако је потребно веровати само-потписаним сертификатима.",
"admin.config.oauth.allow-registration": "Дозволи регистрацију",
"admin.config.oauth.allow-registration.description": "Дозволите корисницима да се региструју путем друштвене пријаве",
"admin.config.oauth.ignore-totp": "Занемари ТОТП",
"admin.config.oauth.ignore-totp.description": "Да ли да игноришете ТОТП када корисник користи пријаву на друштвеним мрежама",
"admin.config.oauth.disable-password": "Disable password login",
"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": "Онемогућите пријаву лозинком",
"admin.config.oauth.disable-password.description": "Омогућити пријаву лозинком или не\nУверите се да је провајдер за OAuth правилно конфигурисан пре активирања ове конфигурације како бисте избегли закључавање налога.",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Да ли је пријављивање на GitHub омогућено",
"admin.config.oauth.github-client-id": "GitHub ИД клијента",
"admin.config.oauth.github-client-id.description": "ИД клијента GitHub OAuth апликације",
"admin.config.oauth.github-client-id": "GitHub ID клијента",
"admin.config.oauth.github-client-id.description": "ID клијента GitHub OAuth апликације",
"admin.config.oauth.github-client-secret": "Тајна GitHub клијента",
"admin.config.oauth.github-client-secret.description": "Тајна клијента GitHub OAuth апликације",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Да ли је пријављивање на Google омогућено",
"admin.config.oauth.google-client-id": "ИД Google клијента",
"admin.config.oauth.google-client-id.description": "ИД клијента Google OAuth апликације",
"admin.config.oauth.google-client-id": "ID Google клијента",
"admin.config.oauth.google-client-id.description": "ID клијента Google OAuth апликације",
"admin.config.oauth.google-client-secret": "Тајна Google клијента",
"admin.config.oauth.google-client-secret.description": "Тајна клијента Google OAuth апликације",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Да ли је пријављивање на Microsoft омогућено",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
"admin.config.oauth.microsoft-tenant.description": "ИД закупца за Microsoft OAuth апликацију\nуобичајено: Корисници са личним Microsoft налогом и пословним или школским налогом са Microsoft Entra ID-а могу да се пријаве у апликацију. организације: Само корисници са пословним или школским налозима са Microsoft Entra ID-а могу да се пријаве у апликацију.\nпотрошачи: Само корисници са личним Microsoft налогом могу да се пријаве у апликацију.\nиме домена закупца Microsoft Entra ID или ИД закупца у ГУИД формату: Само корисници из одређеног Microsoft Entra ID станара (чланови директоријума са пословним или школским налогом или гости директоријума са личним Microsoft налогом) могу да се пријаве у апликацију.",
"admin.config.oauth.microsoft-client-id": "Microsotf Цлиент ИД",
"admin.config.oauth.microsoft-client-id.description": "ИД клијента Microsoft OAuth апликације",
"admin.config.oauth.microsoft-tenant.description": "ID закупца за Microsoft OAuth апликацију\nуобичајено: Корисници са личним Microsoft налогом и пословним или школским налогом са Microsoft Entra ID-а могу да се пријаве у апликацију. организације: Само корисници са пословним или школским налозима са Microsoft Entra ID-а могу да се пријаве у апликацију.\nпотрошачи: Само корисници са личним Microsoft налогом могу да се пријаве у апликацију.\nиме домена закупца Microsoft Entra ID или ИД закупца у ГУИД формату: Само корисници из одређеног Microsoft Entra ID станара (чланови директоријума са пословним или школским налогом или гости директоријума са личним Microsoft налогом) могу да се пријаве у апликацију.",
"admin.config.oauth.microsoft-client-id": "Microsoft ID клијента",
"admin.config.oauth.microsoft-client-id.description": "ID клијента Microsoft OAuth апликације",
"admin.config.oauth.microsoft-client-secret": "Тајна Microsoft клијента",
"admin.config.oauth.microsoft-client-secret.description": "Тајна клијента за Microsot OAuth апликацију",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Да ли је пријављивање на Discord омогућено",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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-guild": "Discord limited server 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-client-id": "Discord ИД клијента",
"admin.config.oauth.discord-client-id.description": "ИД клијента Discord OAuth апликације",
"admin.config.oauth.discord-limited-users": "Ограничење по Discord корисницима",
"admin.config.oauth.discord-limited-users.description": "Ограничите пријављивање на одређене кориснике помоћу њиховог Discord ID-а. Оставите празно да бисте онемогућили.",
"admin.config.oauth.discord-limited-guild": "Ограничење по Discord серверу",
"admin.config.oauth.discord-limited-guild.description": "Ограничите пријављивање на кориснике одређеног сервера. Оставите празно да бисте онемогућили.",
"admin.config.oauth.discord-client-id": "Discord ID клијента",
"admin.config.oauth.discord-client-id.description": "ID клијента Discord OAuth апликације",
"admin.config.oauth.discord-client-secret": "Discord клијент тајна",
"admin.config.oauth.discord-client-secret.description": "Тајна клијента Discord OAuth апликације",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
"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-general-access": "OpenID Connect role for general access",
"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-admin-access": "OpenID Connect role for admin access",
"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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-enabled.description": "Омогућити пријаву OpenID Connect-ом или не",
"admin.config.oauth.oidc-discovery-uri": "URI за OpenID Connect Discovery",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI за откривање OpenID Connect OAuth апликације",
"admin.config.oauth.oidc-sign-out": "Одјављивање са OpenID Connect-a",
"admin.config.oauth.oidc-sign-out.description": "Да ли ће дугме „Одјави се“ одјавити корисника и са OpenID Connect провајдера",
"admin.config.oauth.oidc-scope": "Опсег OpenID Connect-а",
"admin.config.oauth.oidc-scope.description": "Опсези који би требало да буду затражени од OpenID Connect провајдера.",
"admin.config.oauth.oidc-username-claim": "Потраживање корисничког имена у OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Потраживање корисничког имена у OpenID Connect ID токену. Оставите празно ако не знате шта је ова конфигурација.",
"admin.config.oauth.oidc-role-path": "Путања до улога у OpenID Connect токену",
"admin.config.oauth.oidc-role-path.description": "Мора бити валидна JMES путања која референцира низ улога. " + "Управљање правима приступа помоћу улога у OpenID Connect-у се препоручује само ако ниједан други провајдер идентитета није конфигурисан и ако је пријава лозинком онемогућена. " + "Оставите празно ако не знате шта је ова конфигурација.",
"admin.config.oauth.oidc-role-general-access": "Улога у OpenID Connect-у за општи приступ",
"admin.config.oauth.oidc-role-general-access.description": "Улога потребна за општи приступ. Мора бити присутна у улогама корисника како би се могао пријавити. " + "Оставите празно ако не знате шта је ова конфигурација.",
"admin.config.oauth.oidc-role-admin-access": "Улога у OpenID Connect-у за администраторски приступ",
"admin.config.oauth.oidc-role-admin-access.description": "Улога потребна за администраторски приступ. Мора бити присутна у улогама корисника како би могли приступити администраторском панелу. " + "Оставите празно ако не знате шта је ова конфигурација.",
"admin.config.oauth.oidc-client-id": "OpenID Connect ID клијента",
"admin.config.oauth.oidc-client-id.description": "ID клијента OpenID Connect OAuth апликације",
"admin.config.oauth.oidc-client-secret": "OpenID Connect тајна клијента",
"admin.config.oauth.oidc-client-secret.description": "Тајна клијента OpenID Connect OAuth апликације",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server",
"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-password": "Bind password",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"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-query": "User query",
"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.admin-groups": "Admin group",
"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.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.description": "LDAP attribute name for the email of an user.",
"admin.config.ldap.enabled": "Омогући LDAP",
"admin.config.ldap.enabled.description": "Користи LDAP аутентификацију за пријаву корисника",
"admin.config.ldap.url": "URL сервера",
"admin.config.ldap.url.description": "URL LDAP сервера",
"admin.config.ldap.bind-dn": "DN везивање",
"admin.config.ldap.bind-dn.description": "Подразумевани корисник који се користи за претрагу корисника",
"admin.config.ldap.bind-password": "Лозинка за везивање",
"admin.config.ldap.bind-password.description": "Лозинка која се користи за извршавање претраге корисника",
"admin.config.ldap.search-base": "База корисника",
"admin.config.ldap.search-base.description": "Локација базе, место где ће се извршити претрага корисника",
"admin.config.ldap.search-query": "Упит за корисника",
"admin.config.ldap.search-query.description": "Упит за корисника који ће се користити за претрагу „Базе корисника“ за LDAP корисника. %username% се може користити као ознака за унос корисника.",
"admin.config.ldap.admin-groups": "Администраторска група",
"admin.config.ldap.admin-groups.description": "Група која је потребна за администраторски приступ.",
"admin.config.ldap.field-name-member-of": "Назив атрибута корисничких група",
"admin.config.ldap.field-name-member-of.description": "LDAP назив атрибута за групе чији је корисник члан. Ово се користи при провери администраторске групе.",
"admin.config.ldap.field-name-email": "Назив атрибута за имејл корисника",
"admin.config.ldap.field-name-email.description": "LDAP назив атрибута за имејл корисника.",
"admin.config.notify.success": "Конфигурација је успешно ажурирана.",
"admin.config.notify.logo-success": "Лого је успешно ажуриран. Може бити потребно неколико минута да се ажурира на вебсајту.",
"admin.config.notify.no-changes": "Нема промена за чување.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Опа - Ова страна не постоји.",
"404.button.home": "Врати ме на почетак",
// error
"error.title": "Грешка",
"error.description": "Ooпс!",
"error.description": "Упс!",
"error.button.back": "Иди назад",
"error.msg.default": "Нешто је пошло наопако.",
"error.msg.access_denied": "Отказали сте процес аутентификације, покушајте поново.",
"error.msg.expired_token": "Процес аутентификације је трајао предуго, покушајте поново.",
"error.msg.invalid_token": "Internal Error",
"error.msg.invalid_token": "Интерна грешка",
"error.msg.no_user": "Корисник повезан са овим {0} налогом не постоји.",
"error.msg.no_email": "Не могу да добијем адресу е-поште са овог {0} налога.",
"error.msg.no_email": "Не могу да добијем адресу имејла са овог {0} налога.",
"error.msg.already_linked": "Овај {0} налог је већ повезан са другим налогом.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.user_not_allowed": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.msg.not_linked": "Овај {0} налог још увек није повезан ни са једним налогом.",
"error.msg.unverified_account": "Овај {0} налог је непотврђен, молимо покушајте поново након верификације.",
"error.msg.user_not_allowed": "Није вам дозвољено да се пријавите.",
"error.msg.cannot_get_user_info": "Не могу да добијем ваше корисничке информације са овог {0} налога.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
@@ -462,20 +523,21 @@ export default {
"common.button.generate": "Генериши",
"common.button.done": "Готово",
"common.text.link": "Линк",
"common.text.navigate-to-link": "Visit link",
"common.text.navigate-to-link": "Посетите линк",
"common.text.or": "или",
"common.text.redirecting": "Redirecting...",
"common.text.redirecting": "Преусмеравање...",
"common.button.go-back": "Иди назад",
"common.button.go-home": "Go home",
"common.notify.copied": "Ваша веза је копирана у clipboard",
"common.button.go-home": "Почетна страница",
"common.notify.copied": "Ваша веза је копирана у међуспремник",
"common.notify.copied-link": "Ваша веза је копирана у међуспремник",
"common.success": "Успешно",
"common.error": "Грешка",
"common.error.unknown": "Дошло је до непознате грешке",
"common.error.invalid-email": "Неисправна адреса е-поште",
"common.error.invalid-email": "Неисправна адреса имејла",
"common.error.too-short": "Мора да има најмање {length} знакова",
"common.error.too-long": "Мора да има највише {length} знакова",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.number-too-small": "Мора бити најмање {min}",
"common.error.number-too-large": "Мора бити највише {max}",
"common.error.exact-length": "Мора да има тачно {length} знакова",
"common.error.invalid-number": "Мора бити број",
"common.error.field-required": "Поље је обавезно"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Ladda upp",
"navbar.signin": "Logga in",
"navbar.home": "Startsida",
"navbar.signup": "Sign up",
"navbar.signup": "Registrera dig",
"navbar.links.shares": "Mina delningar",
"navbar.links.reverse": "Omvända delningar",
"navbar.avatar.account": "Mitt konto",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Lokalt installerad",
"home.bullet.a.description": "Hosta Pingvin Share på din egen maskin.",
"home.bullet.b.name": "Sekretess",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.b.description": "Dina filer är dina och kommer aldrig att nås av tredje part.",
"home.bullet.c.name": "Ingen irriterande filstorleksbegränsning",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.bullet.c.description": "Ladda upp filer så stora du vill. Endast hårddisken kommer vara din begränsning.",
"home.button.start": "Kom igång",
"home.button.source": "Källkod",
// END /
@@ -34,7 +34,7 @@ export default {
"signIn.notify.totp-required.title": "Tvåfaktorsautentisering krävs",
"signIn.notify.totp-required.description": "Vänligen ange din tvåfaktorsautentiseringskod",
"signIn.oauth.or": "ELLER",
"signIn.oauth.signInWith": "Sign in with",
"signIn.oauth.signInWith": "Logga in med",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password
"resetPassword.title": "Glömt ditt lösenord?",
"resetPassword.description": "Ange din e-postadress för att återställa ditt lösenord.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.notify.success": "Ett meddelande med en länk för att återställa ditt lösenord har skickats om den angivna e-postadressen finns registrerad.",
"resetPassword.button.back": "Tillbaka till inloggningssidan",
"resetPassword.text.resetPassword": "Återställ lösenord",
"resetPassword.text.enterNewPassword": "Ange ditt nya lösenord",
"resetPassword.input.password": "Nytt lösenord",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "Ditt lösenord har återställts.",
// /account
"account.title": "Mitt konto",
"account.card.info.title": "Kontoinformation",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Lösenord",
"account.card.password.old": "Gammalt lösenord",
"account.card.password.new": "Nytt lösenord",
"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": "Du har inget lösenord. För att logga in med din e-postadress och lösenord måste du skapa ett lösenord.",
"account.notify.password.success": "Lösenordet har ändrats",
"account.card.oauth.title": "Inloggning via sociala nätverk",
"account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Avlänka",
"account.card.oauth.unlinked": "Avlänkad",
"account.modal.unlink.title": "Avlänka konto",
"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": "Om du kopplar bort dina sociala konton kan det leda till att du förlorar ditt konto om du inte kommer ihåg dina inloggningsuppgifter",
"account.notify.oauth.unlinked.success": "Avlänkning utförd",
"account.card.security.title": "Säkerhet",
"account.card.security.totp.enable.description": "Ange ditt nuvarande lösenord för att aktivera TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Namn",
"account.shares.table.description": "Beskrivning",
"account.shares.table.visitors": "Besökare",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.expiresAt": "Förfaller",
"account.shares.table.createdAt": "Skapad",
"account.shares.table.size": "Storlek",
"account.shares.table.password-protected": "Lösenordsskyddad",
"account.shares.table.visitor-count": "{count} av {max}",
"account.shares.table.expiry-never": "Aldrig",
"account.shares.modal.share-informations": "Information om delning",
"account.shares.modal.share-link": "Delningslänk",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "Ta bort delning: {share}",
"account.shares.modal.delete.description": "Vill du verkligen ta bort denna delning?",
// END /account/shares
// /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "År",
"account.reverseShares.modal.expiration.year-plural": "År",
"account.reverseShares.modal.max-size.label": "Max storlek på delning",
"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.simplified": "Simple mode",
"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.public-access": "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.send-email": "Skicka e-postaviseringar",
"account.reverseShares.modal.send-email.description": "Skicka ett e-postavisering när en delning skapas med denna länk för omvänd delning.",
"account.reverseShares.modal.simplified": "Enkelt läge",
"account.reverseShares.modal.simplified.description": "Gör det enkelt för den som laddar upp filen att dela den med dig. De kommer bara att kunna anpassa namn och beskrivning av delningen.",
"account.reverseShares.modal.public-access": "Allmän åtkomst",
"account.reverseShares.modal.public-access.description": "Gör delningar skapade med denna länk för omvänd delning publik. Om inaktiverad, kommer endast du och delningsskaparen att ha tillgång till den.",
"account.reverseShares.modal.max-use.label": "Maxanvändningar",
"account.reverseShares.modal.max-use.description": "Den maximala mängden gånger denna URL kan användas för att skapa en delning.",
"account.reverseShare.never-expires": "Denna omvända delning kommer aldrig att förfalla.",
@@ -174,7 +177,7 @@ export default {
// /admin
"admin.title": "Administration",
"admin.button.users": "Användarhantering",
"admin.button.shares": "Share management",
"admin.button.shares": "Delningshantering",
"admin.button.config": "Konfiguration",
"admin.version": "Version",
// END /admin
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Användarnamn",
"admin.users.table.email": "E-post",
"admin.users.table.admin": "Administratör",
"admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.title": "Redigera användare: {username}",
"admin.users.edit.update.admin-privileges": "Administratörsbehörigheter",
"admin.users.edit.update.change-password.title": "Ändra lösenord",
"admin.users.edit.update.change-password.field": "Nytt lösenord",
"admin.users.edit.update.change-password.button": "Spara nytt lösenord",
"admin.users.edit.update.notify.password.success": "Lösenordet har ändrats",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "Ta bort användare: {username} ?",
"admin.users.edit.delete.description": "Vill du verkligen ta bort denna användare och alla deras delningar?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Skapa användare",
"admin.users.modal.create.username": "Användarnamn",
@@ -202,21 +205,24 @@ export default {
"admin.users.modal.create.admin.description": "Om detta markeras kommer användaren att kunna komma åt administratörspanelen.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Share management",
"admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Visitors",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
"admin.shares.title": "Delningshantering",
"admin.shares.table.id": "Delnings ID",
"admin.shares.table.username": "Skapare",
"admin.shares.table.visitors": "Besökare",
"admin.shares.table.expires": "Förfaller",
"admin.shares.edit.delete.title": "Ta bort delning: {id}",
"admin.shares.edit.delete.description": "Vill du verkligen ta bort denna delning?",
// END /admin/shares
// /upload
"upload.title": "Ladda upp",
"upload.notify.confirm-leave": "Är du säker på att du vill lämna denna sida? Din uppladdning kommer att avbrytas.",
"upload.notify.generic-error": "Ett fel uppstod när din delning skulle slutföras.",
"upload.notify.count-failed": "{count} filer kunde inte laddas upp. Försöker igen.",
"upload.reverse-share.error.invalid.title": "Ogiltig länk för omvänd delning",
"upload.reverse-share.error.invalid.description": "Denna omvänd delning har gått ut eller är ogiltig.",
// Dropzone.tsx
"upload.dropzone.title": "Ladda upp filer",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
"upload.dropzone.description": "Dra och släpp filer här för att starta din delning. Vi kan endast acceptera filer som är mindre än {maxSize} totalt.",
"upload.dropzone.notify.file-too-big": "Dina filer överskrider den maximala storleken på {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Namn",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Du är inte inloggad",
"upload.modal.not-signed-in-description": "Du kommer inte att kunna ta bort din delning manuellt och visa antalet besökare.",
"upload.modal.expires.never": "aldrig",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "Permanent delning",
"upload.modal.expires.error.too-long": "Förfallodatum överskrider maximalt av {max}.",
"upload.modal.link.label": "Länk",
"upload.modal.expires.label": "Förfaller",
"upload.modal.expires.minute-singular": "Minut",
@@ -244,9 +250,9 @@ export default {
"upload.modal.expires.month-plural": "Månader",
"upload.modal.expires.year-singular": "År",
"upload.modal.expires.year-plural": "År",
"upload.modal.accordion.name-and-description.title": "Name and description",
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
"upload.modal.accordion.name-and-description.title": "Namn och beskrivning",
"upload.modal.accordion.name-and-description.name.placeholder": "Namn",
"upload.modal.accordion.name-and-description.description.placeholder": "Anteckning till mottagare av denna delning",
"upload.modal.accordion.email.title": "E-postmottagare",
"upload.modal.accordion.email.placeholder": "Ange e-postmottagare",
"upload.modal.accordion.email.invalid-email": "Ogiltig e-postadress",
@@ -259,29 +265,30 @@ export default {
"upload.modal.completed.never-expires": "Denna delning kommer aldrig att upphöra.",
"upload.modal.completed.expires-on": "Denna delning upphör att gälla {expiration}.",
"upload.modal.completed.share-ready": "Delning redo",
"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": "Vi har meddelat skaparen av omvänd delning. Du kan också manuellt dela denna länk med dem på andra sätt.",
// END /upload
// /share/[id]
"share.title": "Delning {shareId}",
"share.description": "Titta vad jag har delat med dig!",
"share.fileCount": "{count, plural, =1 {# fil} other {# filer}} · {size} (zip-filen kan vara mindre på grund av komprimering)",
"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.removed.title": "Delning borttagen",
"share.error.not-found.title": "Delningen hittades inte",
"share.error.not-found.description": "Delningen du letar efter existerar inte.",
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.error.access-denied.title": "Privat delning",
"share.error.access-denied.description": "Det aktuella kontot har inte behörighet att komma åt denna delning",
"share.modal.password.title": "Lösenord krävs",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Ange lösenordet för att komma åt denna delning.",
"share.modal.password": "Lösenord",
"share.modal.error.invalid-password": "Ogiltigt lösenord",
"share.button.download-all": "Ladda ner allt",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.notify.download-all-preparing": "Delningen förbereds. Försök igen om några minuter.",
"share.modal.file-link": "Fillänk",
"share.table.name": "Namn",
"share.table.size": "Storlek",
"share.modal.file-preview.error.not-supported.title": "Förhandsgranskning stöds ej",
"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": "Förhandsvisningar stöds inte för denna typ av filer. Ladda ner filen för att se den.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Redigera {shareId}",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "Ett fel uppstod när din delning skulle slutföras.",
"share.edit.notify.save-success": "Delningen har uppdaterats",
// END /share/[id]/edit
// /imprint
"imprint.title": "Avtryck",
// END /imprint
// /privacy
"privacy.title": "Integritetspolicy",
// END /privacy
// /admin/config
"admin.config.config-file-warning.title": "Konfigurationsfil finns",
"admin.config.config-file-warning.description": "Eftersom du har en konfigurerad Pingvin Share med en konfigurationsfil kan du inte ändra konfigurationen genom UI.",
"admin.config.title": "Konfiguration",
"admin.config.category.general": "Allmänt",
"admin.config.category.share": "Delning",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "E-post",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Inloggning via sociala nätverk",
@@ -300,66 +316,78 @@ export default {
"admin.config.general.app-name.description": "Namn på applikationen",
"admin.config.general.app-url": "Appens URL",
"admin.config.general.app-url.description": "På vilken URL Pingvin Share finns",
"admin.config.general.secure-cookies": "Skydda kakor",
"admin.config.general.secure-cookies.description": "Om du vill ställa in den säkra flaggan på kakor. Om aktiverad, kommer webbplatsen inte att fungera när den används via HTTP.",
"admin.config.general.show-home-page": "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.description": "Time in hours after which a user must log in again (default: 3 months).",
"admin.config.general.session-duration": "Sessionsvaraktighet",
"admin.config.general.session-duration.description": "Tid efter vilken en användare måste logga in igen (standard: 3 månader).",
"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.placeholder": "Välj bild",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Aktivera delning av e-postmottagare",
"admin.config.email.enable-share-email-recipients.description": "Om du vill tillåta e-postdelning med mottagare. Aktivera endast detta om SMTP är aktiverat.",
"admin.config.email.share-recipients-subject": "Delning ämne",
"admin.config.email.share-recipients-subject.description": "Ämne för e-postmeddelandet som skickas till delningsmottagarna.",
"admin.config.email.share-recipients-message": "Delning meddelande",
"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 {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": "Meddelande som skickas till delningens mottagare. Tillgängliga variabler:\n {creator} - Användarnamnet för skaparen av delningen\n {creatorEmail} - E-postadressen för skaparen av delningen\n {shareUrl} - URL för delningen\n {desc} - Beskrivningen av delningen\n {expires} - Förfallodatumet för delningen\n Variablerna kommer att ersättas med det faktiska värdet.",
"admin.config.email.reverse-share-subject": "Omvänd delning ämne",
"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": "Ämne för det skickade e-postmeddelandet när någon skapade en delning med din omvända delningslänk.",
"admin.config.email.reverse-share-message": "Omvänd delning meddelande",
"admin.config.email.reverse-share-message.description": "Meddelande som skickas när någon skapade en delning med din länk för omvänd delning. {shareUrl} kommer att ersättas med skaparens namn och delningens URL.",
"admin.config.email.reset-password-subject": "Återställ lösenord ämne",
"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": "Ämne för det skickade e-postmeddelandet när en användare begär en återställning av lösenordet.",
"admin.config.email.reset-password-message": "Återställ lösenord meddelande",
"admin.config.email.reset-password-message.description": "Meddelande som skickas när en användare begär en lösenordsåterställning. {url} kommer att ersättas med länken för lösenordsåterställningen.",
"admin.config.email.invite-subject": "Inbjudan ämne",
"admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-subject.description": "Ämne för det skickade e-postmeddelandet när en administratör bjuder in en användare.",
"admin.config.email.invite-message": "Inbjudningsmeddelanden",
"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": "Meddelande som skickas när en administratör bjuder in en användare. {url} kommer att ersättas med inbjudningsadressen och {password} med lösenordet.",
"admin.config.share.allow-registration": "Tillåt registrering",
"admin.config.share.allow-registration.description": "Om registrering är tillåten",
"admin.config.share.allow-unauthenticated-shares": "Tillåt oautentiserade delningar",
"admin.config.share.allow-unauthenticated-shares.description": "Om oautentiserade användare kan skapa delningar",
"admin.config.share.max-expiration": "Max utgångsdatum",
"admin.config.share.max-expiration.description": "Max längd innan en delning förfaller i timmar. Sätt till 0 för att tillåta obegränsad förfallotid.",
"admin.config.share.max-expiration.description": "Max längd innan en delning förfaller. Sätt till 0 för att tillåta obegränsad förfallotid.",
"admin.config.share.share-id-length": "Standardlängd på delnings-ID",
"admin.config.share.share-id-length.description": "Standardlängd för genererat ID för en delning. Detta värde används också för att generera länkar för omvända delningar. Ett värde under 8 anses inte vara säkert.",
"admin.config.share.max-size": "Max storlek",
"admin.config.share.max-size.description": "Maximal storlek för delning i bytes",
"admin.config.share.max-size.description": "Maximal storlek för delning",
"admin.config.share.zip-compression-level": "Komprimeringsnivå för zip",
"admin.config.share.zip-compression-level.description": "Justera nivån för att balansera mellan filstorlek och komprimeringshastighet. Giltiga värden varierar från 0 till 9, med 0 som ingen komprimering och 9 som maximal komprimering. ",
"admin.config.share.chunk-size": "Bitstorleken",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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.share.chunk-size.description": "Justera bitstorleken för dina uppladdningar för att balansera effektivitet och tillförlitlighet enligt din internetanslutning. Mindre bitar kan öka framgångsgraden för instabila anslutningar, medan större bitar snabbar upp uppladdningar för stabila anslutningar.",
"admin.config.share.auto-open-share-modal": "Öppna automatiskt skapa delningsmodal",
"admin.config.share.auto-open-share-modal.description": "Modalen för att skapa delning visas automatiskt när en användare väljer filer, vilket tar bort behovet av att manuellt klicka på knappen.",
"admin.config.smtp.enabled": "Aktivera",
"admin.config.smtp.enabled.description": "Om SMTP skall vara aktiverat. Ange endast detta som sant om du angav adress, port, e-post, användare och lösenord för din SMTP-server.",
"admin.config.smtp.host": "Adress",
"admin.config.smtp.host.description": "Adress för SMTP-servern",
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port för SMTP-servern",
"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-postadress som e-postmeddelanden skickas från",
"admin.config.smtp.username": "Användarnamn",
"admin.config.smtp.username.description": "Användarnamn för SMTP-servern",
"admin.config.smtp.password": "Lösenord",
"admin.config.smtp.password.description": "Lösenord för SMTP-servern",
"admin.config.smtp.button.test": "Skicka testmeddelande",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
"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": "Lita på obehöriga SMTP-servercertifikat",
"admin.config.smtp.allow-unauthorized-certificates.description": "Sätt endast detta till sant om du behöver lita på självsignerade certifikat.",
"admin.config.oauth.allow-registration": "Tillåt registrering",
"admin.config.oauth.allow-registration.description": "Tillåt användare att registrera sig via social inloggning",
"admin.config.oauth.ignore-totp": "Ignorera TOTP",
"admin.config.oauth.ignore-totp.description": "Om du vill ignorera TOTP när användaren använder social inloggning",
"admin.config.oauth.disable-password": "Disable password login",
"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": "Inaktivera lösenordsinloggning",
"admin.config.oauth.disable-password.description": "Om du vill inaktivera lösenordsinloggning\nSe till att en OAuth leverantör är korrekt konfigurerad innan du aktiverar denna konfiguration för att undvika att bli låst.",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Om GitHub-inloggning är aktiverad",
"admin.config.oauth.github-client-id": "GitHub Client ID",
@@ -382,8 +410,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Client secret för Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Om inloggning via Discord är aktiverat",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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": "Discord begränsade användare",
"admin.config.oauth.discord-limited-users.description": "Begränsa inloggning till specifika användare genom deras Discord-ID. Lämna det tomt för att inaktivera.",
"admin.config.oauth.discord-limited-guild": "Discord begränsa till server ID",
"admin.config.oauth.discord-limited-guild.description": "Begränsa inloggning till användare på en specifik server. Lämna tomt för att inaktivera.",
"admin.config.oauth.discord-client-id": "Discord Client ID",
@@ -394,39 +422,72 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Om OpenID-inloggning är aktiverat",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI för OpenID Connect OAuth appen",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-username-claim": "OpenID Connect användarnamnsanspråk",
"admin.config.oauth.oidc-sign-out": "Logga ut från OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Om \"Logga ut\" knappen kommer att logga ut från OpenID Connect leverantör",
"admin.config.oauth.oidc-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes som ska begäras från OpenID Connect-provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect användarnamn claim",
"admin.config.oauth.oidc-username-claim.description": "Användarnamnsanspråk i OpenID Connect ID token. Lämna tomt om du inte vet vad denna konfiguration är.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
"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-general-access": "OpenID Connect role for general access",
"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-admin-access": "OpenID Connect role for admin access",
"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-path": "Sökväg till roller i OpenID Connect token",
"admin.config.oauth.oidc-role-path.description": "Måste vara en giltig JMES-sökväg som refererar till en lista med roller. " + "Hantera åtkomsträttigheter med OpenID Connect-roller rekommenderas endast om ingen annan identitetsleverantör är konfigurerad och lösenord inloggning är inaktiverad. " + "Lämna det tomt om du inte vet vad denna konfiguration är.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect-roll för allmän åtkomst",
"admin.config.oauth.oidc-role-general-access.description": "Roll som krävs för allmän åtkomst. Måste finnas i en användares roller för att de ska kunna logga in. " + "Lämna det tomt om du inte vet vad denna konfiguration är.",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect roll för administratörsåtkomst",
"admin.config.oauth.oidc-role-admin-access.description": "Roll som krävs för administratörsåtkomst. Måste finnas i en användares roller för att de ska kunna komma ät administratörspanelen. " + "Lämna det tomt om du inte vet vad denna konfiguration är.",
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID för OpenID OAuth",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret för OpenID OAuth",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.enabled": "Aktivera LDAP",
"admin.config.ldap.enabled.description": "Använd LDAP-autentisering för användarinloggning",
"admin.config.ldap.url": "Server-URL",
"admin.config.ldap.url.description": "URL till LDAP-servern",
"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-password": "Bind password",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"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-query": "User query",
"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.admin-groups": "Admin group",
"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.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.description": "LDAP attribute name for the email of an user.",
"admin.config.ldap.bind-dn.description": "Standardanvändaren som används för att utföra användarens sökning",
"admin.config.ldap.bind-password": "Bind lösenord",
"admin.config.ldap.bind-password.description": "Lösenord som används för att utföra användarsökningen",
"admin.config.ldap.search-base": "Användarbas",
"admin.config.ldap.search-base.description": "Bas plats, där användarsökningen kommer att utföras",
"admin.config.ldap.search-query": "Användar fråga",
"admin.config.ldap.search-query.description": "Användarfrågan kommer att användas för att söka i 'Användarbasen' för LDAP-användaren. %username% kan användas som platshållare för användaren angiven indata.",
"admin.config.ldap.admin-groups": "Administratörsgrupp",
"admin.config.ldap.admin-groups.description": "Grupp krävs för administrativ åtkomst.",
"admin.config.ldap.field-name-member-of": "Attributnamn för användargrupper",
"admin.config.ldap.field-name-member-of.description": "LDAP-attributnamn för grupperna, en användare är medlem av. Detta används när du söker efter administratörsgruppen.",
"admin.config.ldap.field-name-email": "Attributnamn för e-postadress",
"admin.config.ldap.field-name-email.description": "LDAP-attributnamn för e-postadress till en användare.",
"admin.config.notify.success": "Konfigurationen har uppdaterats.",
"admin.config.notify.logo-success": "Logotypen har uppdaterats. Det kan ta några minuter att uppdatera på webbplatsen.",
"admin.config.notify.no-changes": "Inga ändringar att spara.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Aktiverad",
"admin.config.s3.enabled.description": "Om S3 ska användas för att lagra de delade filerna istället för det lokala filsystemet.",
"admin.config.s3.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "Webbadressen till S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "Regionen av S3 bucket.",
"admin.config.s3.bucket-name": "Bucket namn",
"admin.config.s3.bucket-name.description": "Namnet på S3 bucket.",
"admin.config.s3.bucket-path": "Sökväg",
"admin.config.s3.bucket-path.description": "Standardsökvägen som ska användas för att lagra filerna i S3 bucket.",
"admin.config.s3.key": "Nyckel",
"admin.config.s3.key.description": "Nyckeln som gör att du kan komma åt S3 bucket.",
"admin.config.s3.secret": "Hemlighet",
"admin.config.s3.secret.description": "Hemligheten som gör att du kan komma åt S3 bucket.",
"admin.config.s3.use-checksum": "Använd kontrollsumma",
"admin.config.s3.use-checksum.description": "Stäng av för backends som inte stöder kontrollsumma (t.ex. B2).",
"admin.config.category.legal": "Juridisk",
"admin.config.legal.enabled": "Aktivera juridiska meddelanden",
"admin.config.legal.enabled.description": "Om en länk till utgivarinformation och integritetspolicy ska visas i sidfoten.",
"admin.config.legal.imprint-text": "Utgivarinformationstext",
"admin.config.legal.imprint-text.description": "Texten som ska visas i utgivarinformationen. Stödjer Markdown. Lämna tomt för att länka till en extern sida för utgivarinformation.",
"admin.config.legal.imprint-url": "Länk till utgivarinformation",
"admin.config.legal.imprint-url.description": "Om du redan har en sida för utgivarinformation kan du länka till den här istället för att använda textfältet.",
"admin.config.legal.privacy-policy-text": "Integritetspolicytext",
"admin.config.legal.privacy-policy-text.description": "Texten som ska visas i integritetspolicy. Stödjer Markdown. Lämna tomt för att länka till en extern sida för integritetspolicy.",
"admin.config.legal.privacy-policy-url": "Länk till integritetspolicy",
"admin.config.legal.privacy-policy-url.description": "Om du redan har en sida för integritetspolicy kan du länka till den här istället för att använda textfältet.",
// 404
"404.description": "Hoppsan den här sidan finns inte.",
"404.button.home": "Ta mig tillbaka hem",
@@ -441,10 +502,10 @@ export default {
"error.msg.no_user": "Användare som är länkad till detta {0} konto finns inte.",
"error.msg.no_email": "Kan inte hämta e-postadress från detta {0} konto.",
"error.msg.already_linked": "Detta {0} konto är redan länkat till ett annat konto.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.not_linked": "Detta {0} konto har ännu inte länkat till något konto.",
"error.msg.unverified_account": "Detta {0} -konto är overifierat, försök igen efter verifiering.",
"error.msg.user_not_allowed": "Du är inte tillåten att logga in.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.msg.cannot_get_user_info": "Kan inte hämta din användarinformation från detta {0} konto.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
@@ -462,20 +523,21 @@ export default {
"common.button.generate": "Generera",
"common.button.done": "Klar",
"common.text.link": "Länk",
"common.text.navigate-to-link": "Visit link",
"common.text.navigate-to-link": "Besök länk",
"common.text.or": "eller",
"common.text.redirecting": "Redirecting...",
"common.text.redirecting": "Omdirigerar...",
"common.button.go-back": "Gå tillbaka",
"common.button.go-home": "Gå hem",
"common.notify.copied": "Din länk har kopierats till urklipp",
"common.notify.copied-link": "Din länk har kopierats till urklipp",
"common.success": "Slutförd",
"common.error": "Fel",
"common.error.unknown": "Ett okänt fel har uppstått",
"common.error.invalid-email": "Ogiltig e-postadress",
"common.error.too-short": "Måste minst vara {length} tecken långt",
"common.error.too-long": "Får högst innehålla {length} tecken",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.number-too-small": "Måste vara minst {min}",
"common.error.number-too-large": "Måste vara som mest {max}",
"common.error.exact-length": "Måste vara exakt {length} tecken långt",
"common.error.invalid-number": "Måste vara ett tal",
"common.error.field-required": "Obligatoriskt fält"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "อัพโหลด",
"navbar.signin": "เข้าสู่ระบบ",
"navbar.home": "หน้าหลัก",
"navbar.signup": "Sign up",
"navbar.signup": "ลงทะเบียน",
"navbar.links.shares": "แชร์ของฉัน",
"navbar.links.reverse": "รีเวิร์สแชร์",
"navbar.avatar.account": "บัญชีของฉัน",
@@ -26,14 +26,14 @@ export default {
"signin.title": "ยินดีต้อนรับกลับ",
"signin.description": "ยังไม่มีบัญชี?",
"signin.button.signup": "สมัครบัญชี",
"signin.input.email-or-username": "อีเมล์์์์์์์์หรือชื่อผู้ใช้",
"signin.input.email-or-username.placeholder": "อีเมล์์์์์์์หรือชื่อผู้ใช้ของคุณ",
"signin.input.email-or-username": "อีเมลหรือชื่อผู้ใช้",
"signin.input.email-or-username.placeholder": "อีเมลหรือชื่อผู้ใช้ของคุณ",
"signin.input.password": "รหัสผ่าน",
"signin.input.password.placeholder": "รหัสผ่านของคุณ",
"signin.button.submit": "เข้าสู่ระบบ",
"signIn.notify.totp-required.title": "ยืนยันตรวจสอบสิทธิ์สองปัจจัย",
"signIn.notify.totp-required.description": "กรุณาใส่รหัสยืนยันตัวตนสองปัจจัย",
"signIn.oauth.or": "OR",
"signIn.oauth.or": "หรือ",
"signIn.oauth.signInWith": "Sign in with",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
@@ -47,8 +47,8 @@ export default {
"signup.button.signin": "เข้าสู่ระบบ",
"signup.input.username": "ชื่อผู้ใช้",
"signup.input.username.placeholder": "ชื่อผู้ใช้ของคุณ",
"signup.input.email": "อีเมล์์์์์์์์",
"signup.input.email.placeholder": "อีเมล์์์์์์์์ของคุณ",
"signup.input.email": "อีเมล",
"signup.input.email.placeholder": "อีเมลของคุณ",
"signup.button.submit": "เริ่มต้นกัน",
// END /auth/signup
// /auth/totp
@@ -57,7 +57,7 @@ export default {
// END /auth/totp
// /auth/reset-password
"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.button.back": "กลับไปที่หน้าลงชื่อเข้าใช้",
"resetPassword.text.resetPassword": "รีเซ็ตรหัสผ่าน",
@@ -68,7 +68,7 @@ export default {
"account.title": "บัญชีของฉัน",
"account.card.info.title": "ข้อมูลบัญชี",
"account.card.info.username": "ชื่อผู้ใช้",
"account.card.info.email": "อีเมล์์์์์์์",
"account.card.info.email": "อีเมล",
"account.notify.info.success": "อัปเดตบัญชีเรียบร้อยแล้ว",
"account.card.password.title": "รหัสผ่าน",
"account.card.password.old": "รหัสผ่านเก่า",
@@ -124,6 +124,9 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "ขนาด",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "ข้อมูลแชร์",
"account.shares.modal.share-link": "แชร์ลิงค์",
"account.shares.modal.delete.title": "Delete share: {share}",
@@ -181,7 +184,7 @@ export default {
// /admin/users
"admin.users.title": "การจัดการผู้ใช้",
"admin.users.table.username": "ชื่อผู้ใช้",
"admin.users.table.email": "อีเมล์์์์์์์",
"admin.users.table.email": "อีเมล",
"admin.users.table.admin": "ผู้ดูแลระบบ",
"admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "สิทธิ์ของผู้ดูแลระบบ",
@@ -194,10 +197,10 @@ export default {
// showCreateUserModal.tsx
"admin.users.modal.create.title": "สร้างผู้ใช้",
"admin.users.modal.create.username": "ชื่อผู้ใช้",
"admin.users.modal.create.email": "อีเมล",
"admin.users.modal.create.email": "อีเมล",
"admin.users.modal.create.password": "รหัสผ่าน",
"admin.users.modal.create.manual-password": "ตั้งรหัสผ่านด้วยตนเอง",
"admin.users.modal.create.manual-password.description": "หากไม่ติ๊กเลือก ผู้ใช้จะได้รับอีเมลพร้อมลิงก์เพื่อตั้งรหัสผ่านด้วยตนเอง",
"admin.users.modal.create.manual-password.description": "หากไม่ติ๊กเลือก ผู้ใช้จะได้รับอีเมลพร้อมลิงก์เพื่อตั้งรหัสผ่านด้วยตนเอง",
"admin.users.modal.create.admin": "สิทธิ์ของผู้ดูแลระบบ",
"admin.users.modal.create.admin.description": "หากติ๊กเลือก ผู้ใช้จะสามารถเข้าถึงแผงควบคุมระบบได้",
// END /admin/users
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "อัปโหลด",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "เกิดข้อผิดพลาดขณะที่กำลังจัดการการแชร์ของคุณ",
"upload.notify.count-failed": "มีไฟล์จำนวน {count} ไฟล์ที่ไม่สามารถอัปโหลดได้ กำลังลองอีกครั้ง",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "อัปโหลดไฟล์",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -247,9 +253,9 @@ export default {
"upload.modal.accordion.name-and-description.title": "Name and description",
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
"upload.modal.accordion.email.title": "ผู้รับอีเมล",
"upload.modal.accordion.email.placeholder": "ป้อนผู้รับอีเมล",
"upload.modal.accordion.email.invalid-email": "ที่อยู่อีเมลไม่ถูกต้อง",
"upload.modal.accordion.email.title": "ผู้รับอีเมล",
"upload.modal.accordion.email.placeholder": "ป้อนผู้รับอีเมล",
"upload.modal.accordion.email.invalid-email": "ที่อยู่อีเมลไม่ถูกต้อง",
"upload.modal.accordion.security.title": "ตัวเลือกความปลอดภัย",
"upload.modal.accordion.security.password.label": "การป้องกันรหัสผ่าน",
"upload.modal.accordion.security.password.placeholder": "ไม่มีรหัสผ่าน",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "แชร์ {shareId}",
"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.description": "การแชร์นี้ได้เกินขีดจำกัดผู้เข้าชมแล้ว",
"share.error.removed.title": "การแชร์ถูกลบ",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.modal.password.title": "ต้องการรหัสผ่าน",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "รหัสผ่าน",
"share.modal.error.invalid-password": "รหัสผ่านไม่ถูกต้อง",
"share.button.download-all": "ดาวน์โหลดทั้งหมด",
@@ -289,30 +296,49 @@ export default {
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "ทั่วไป",
"admin.config.category.share": "การแชร์",
"admin.config.category.email": "อีเมล์์์์์์",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "อีเมล",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login",
"admin.config.general.app-name": "ชื่อแอพ",
"admin.config.general.app-name.description": "ชื่อแอพพลิเคชัน",
"admin.config.general.app-url": "URL ของแอพ",
"admin.config.general.app-url.description": "URL ที่สามารถเข้าถึงแอพพลิเคชัน Pingvin Share ได้",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "แสดงหน้าแรก",
"admin.config.general.show-home-page.description": "หากติ๊ก เว็บไซต์จะแสดงหน้าหลักเวลาเข้าถึง URL หลัก",
"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.description": "เปลี่ยนโลโก้โดยอัปโหลดรูปภาพใหม่ รูปภาพต้องเป็น PNG และควรมีขนาดอัตราส่วน 1:1",
"admin.config.general.logo.placeholder": "คลิกที่นี่หรือลากไฟล์มา",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "หัวเรื่องผู้รับอีเมล์์์์์์ของการแชร์",
"admin.config.email.share-recipients-subject.description": "หัวเรื่องของอีเมล์์์์์์์์ที่ส่งไปยังผู้รับอีเมล์์์์์์ของการแชร์",
"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 {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-subject": "หัวเรื่องผู้รับอีเมลของการแชร์",
"admin.config.email.share-recipients-subject.description": "หัวเรื่องของอีเมลที่ส่งไปยังผู้รับอีเมลของการแชร์",
"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.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-message": "ข้อความการแชร์รีเวิร์ส",
@@ -330,23 +356,25 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "อนุญาตให้แชร์โดยไม่ต้องเข้าสู่ระบบ",
"admin.config.share.allow-unauthenticated-shares.description": "อนุญาตให้ผู้ใช้ที่ไม่ได้เข้าสู่ระบบสร้างแชร์",
"admin.config.share.max-expiration": "Max expiration",
"admin.config.share.max-expiration.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "ขนาดสูงสุด",
"admin.config.share.max-size.description": "ขนาดสูงสุดของแชร์",
"admin.config.share.zip-compression-level": "ระดับการบีบอัดไฟล์ Zip",
"admin.config.share.zip-compression-level.description": "ปรับระดับเพื่อปรับความสมดุลระหว่างขนาดไฟล์และความเร็วในการบีบอัด ค่าอยู่ระหว่าง 0-9 โดย 0 คือไม่มีการบีบอัดและ 9 คือการบีบอัดสูงสุด",
"admin.config.share.chunk-size": "Chunk size",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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.description": "เปิดใช้งาน SMTP สำหรับการส่งอีเมล์์์์์์ เปิดได้เท่านั้นต่อเมื่อคุณใส่ข้อมูลโฮสต์ พอร์ต อีเมล ผู้ใช้ และรหัสผ่านของเซิร์ฟเวอร์ SMTP ของคุณ",
"admin.config.smtp.enabled.description": "เปิดใช้งาน SMTP สำหรับการส่งอีเมล เปิดได้เท่านั้นต่อเมื่อคุณใส่ข้อมูลโฮสต์ พอร์ต อีเมล ผู้ใช้ และรหัสผ่านของเซิร์ฟเวอร์ SMTP ของค",
"admin.config.smtp.host": "โฮสต์",
"admin.config.smtp.host.description": "โฮสต์ของเซิร์ฟเวอร์ SMTP",
"admin.config.smtp.port": "พอร์ต",
"admin.config.smtp.port.description": "พอร์ตของเซิร์ฟเวอร์ SMTP",
"admin.config.smtp.email": "อีเมล์์์์์์์",
"admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.email": "อีเมล",
"admin.config.smtp.email.description": "Email address from which the emails get sent",
"admin.config.smtp.username": "ชื่อผู้ใช้",
"admin.config.smtp.username.description": "ชื่อผู้ใช้ของเซิร์ฟเวอร์ SMTP",
"admin.config.smtp.password": "รหัสผ่าน",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "ไม่พบหน้าที่คุณกำลังมองหา",
"404.button.home": "หน้าแรก",
@@ -434,7 +495,7 @@ export default {
"error.title": "Error",
"error.description": "Oops!",
"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.expired_token": "The authentication process took too long, please try again.",
"error.msg.invalid_token": "Internal Error",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "ย้อนกลับ",
"common.button.go-home": "Go home",
"common.notify.copied": "คัดลอกไปยังคลิปบอร์ดแล้ว",
"common.notify.copied-link": "คัดลอกไปยังคลิปบอร์ดแล้ว",
"common.success": "สำเร็จ",
"common.error": "เกิดข้อผิดพลาด",
"common.error.unknown": "เกิดข้อผิดพลาดที่ไม่รู้จัก",

View File

@@ -2,39 +2,39 @@ export default {
// Navbar
"navbar.upload": "Yükle",
"navbar.signin": "Giriş Yap",
"navbar.home": "Ana Sayfa",
"navbar.signup": "Sign up",
"navbar.home": "Anasayfa",
"navbar.signup": "Kayıt Ol",
"navbar.links.shares": "Paylaşımlarım",
"navbar.links.reverse": "Tersine Paylaşımlar",
"navbar.links.reverse": "Karşı Paylaşımlar",
"navbar.avatar.account": "Hesabım",
"navbar.avatar.admin": "Yönetim",
"navbar.avatar.signout": ıkış Yap",
// END navbar
// /
"home.title": "<h>Kişisel barındırılan</h> bir dosya paylaşım platformu.",
"home.description": "Kişisel dosyalarınızı WeTransfer gibi üçüncü tarafların eline gerçekten vermek istiyor musunuz?",
"home.bullet.a.name": "Kişisel Barındırılan",
"home.bullet.a.description": "Pingvin Share'i kendi makinenizde barındırın.",
"home.title": "Kendi sunucunuzda <h>barındırabileceğiniz</h> bir dosya paylaşım platformu.",
"home.description": "Kişisel dosyalarınızı gerçekten WeTransfer gibi üçüncü taraf hizmetlere emanet etmek istiyor musunuz?",
"home.bullet.a.name": "Kendi Sunucunda Barındır",
"home.bullet.a.description": "Pingvin Share'i kendi sunucunuzda barındırın.",
"home.bullet.b.name": "Gizlilik",
"home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "Can sıkıcı dosya boyutu sınırı yok",
"home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Başlayalım",
"home.button.source": "Kaynak kodu",
"home.bullet.b.description": "Dosyalarınız size aittir ve asla üçüncü taraflarca erişilemez.",
"home.bullet.c.name": "Can Sıkıcı Dosya Boyutu Limiti Yok",
"home.bullet.c.description": "İstediğiniz kadar büyük dosyalar yükleyin. Tek limitiniz sabit diskiniz olacak.",
"home.button.start": "Hemen Başlayın",
"home.button.source": "Kaynak Kodu",
// END /
// /auth/signin
"signin.title": "Tekrar hoşgeldiniz",
"signin.title": "Tekrar hoş geldiniz",
"signin.description": "Henüz bir hesabınız yok mu?",
"signin.button.signup": "Kaydol",
"signin.input.email-or-username": "Eposta veya kullanıcı adı",
"signin.input.email-or-username.placeholder": "E-Posta veya kullanıcı adı",
"signin.button.signup": "Kayıt Ol",
"signin.input.email-or-username": "E-posta veya kullanıcı adı",
"signin.input.email-or-username.placeholder": "E-postanız veya kullanıcı adınız",
"signin.input.password": "Şifre",
"signin.input.password.placeholder": "Şifreniz",
"signin.button.submit": "Giriş Yap",
"signIn.notify.totp-required.title": "İki faktörlü kimlik doğrulama gerekli",
"signIn.notify.totp-required.description": "Lütfen iki faktörlü doğrulama kodunuzu girin",
"signIn.oauth.or": "YA DA",
"signIn.oauth.signInWith": "Sign in with",
"signIn.notify.totp-required.description": "Lütfen iki faktörlü kimlik doğrulama kodunuzu girin",
"signIn.oauth.or": "VEYA",
"signIn.oauth.signInWith": "Şununla giriş yap",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
@@ -42,101 +42,104 @@ export default {
"signIn.oauth.oidc": "OpenID",
// END /auth/signin
// /auth/signup
"signup.title": "Bir hesap oluştur",
"signup.description": "Zaten bir hesabınız mı var?",
"signup.title": "Hesap oluştur",
"signup.description": "Zaten bir hesabınız var mı?",
"signup.button.signin": "Giriş Yap",
"signup.input.username": "Kullanıcı Adı",
"signup.input.username": "Kullanıcı adı",
"signup.input.username.placeholder": "Kullanıcı adınız",
"signup.input.email": "E-Posta",
"signup.input.email.placeholder": "E-Posta adresiniz",
"signup.button.submit": "Haydi Başlayalım",
"signup.input.email": "E-posta",
"signup.input.email.placeholder": "E-postanız",
"signup.button.submit": "Hadi başlayalım",
// END /auth/signup
// /auth/totp
"totp.title": "İki Faktörlü Doğrulama",
"totp.title": "TOTP ile Kimlik Doğrulama",
"totp.button.signIn": "Giriş Yap",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Şifrenizi mi unuttunuz?",
"resetPassword.description": "Şifrenizi sıfırlamak için E-Postanızı girin.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "Giriş sayfasına geri dön",
"resetPassword.description": "Şifrenizi sıfırlamak için e-postanızı girin.",
"resetPassword.notify.success": "Girilen e-posta adresi mevcutsa, şifrenizi sıfırlamanız için bir bağlantı içeren bir mesaj gönderilmiştir.",
"resetPassword.button.back": "Giriş yapma sayfasına geri dön",
"resetPassword.text.resetPassword": "Şifreyi sıfırla",
"resetPassword.text.enterNewPassword": "Yeni şifrenizi girin",
"resetPassword.input.password": "Yeni şifre",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "Şifreniz başarıyla sıfırlandı.",
// /account
"account.title": "Hesabım",
"account.card.info.title": "Hesap Bilgisi",
"account.card.info.username": "Kullanıcı Adı",
"account.card.info.email": "E-Posta",
"account.card.info.title": "Hesap bilgileri",
"account.card.info.username": "Kullanıcı adı",
"account.card.info.email": "E-posta",
"account.notify.info.success": "Hesap başarıyla güncellendi",
"account.card.password.title": "Şifre",
"account.card.password.old": "Eski şifre",
"account.card.password.new": "Yeni şifre",
"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": "Henüz bir şifre belirlemediniz. E-posta ve şifrenizle giriş yapabilmek için bir şifre oluşturmanız gerekmektedir.",
"account.notify.password.success": "Şifre başarıyla değiştirildi",
"account.card.oauth.title": "Sosyal Medya girişi",
"account.card.oauth.title": "Sosyal medya ile giriş",
"account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Bağlantı",
"account.card.oauth.unlink": "Bağlantıyı kes",
"account.card.oauth.unlinked": "Bağlantısız",
"account.modal.unlink.title": "Hesabın bağlantısını kaldır",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your login credentials",
"account.notify.oauth.unlinked.success": "Bağlantı Başarıyla Kaldırıldı",
"account.card.oauth.link": "Bağla",
"account.card.oauth.unlink": "Bağlantıyı kaldır",
"account.card.oauth.unlinked": "Bağlantı kaldırıldı",
"account.modal.unlink.title": "Hesap bağlantısını kaldır",
"account.modal.unlink.description": "Sosyal medya hesaplarınızın bağlantısını kaldırmak, giriş bilgilerinizi hatırlamıyorsanız hesabınıza erişiminizi kaybetmenize neden olabilir.",
"account.notify.oauth.unlinked.success": "Bağlantı başarıyla kaldırıldı",
"account.card.security.title": "Güvenlik",
"account.card.security.totp.enable.description": "İki faktörlü doğrulamayı aktif etmek için şu anki şifrenizi girin",
"account.card.security.totp.disable.description": "İki faktörlü doğrulamayı kaldırmak için şu anki şifrenizi girin",
"account.card.security.totp.enable.description": "TOTP'yi etkinleştirmeye başlamak için mevcut şifrenizi girin.",
"account.card.security.totp.disable.description": "TOTP'yi devre dışı bırakmak için mevcut şifrenizi girin.",
"account.card.security.totp.button.start": "Başlat",
"account.modal.totp.title": "2FA aç",
"account.modal.totp.title": "TOTP'yi etkinleştir",
"account.modal.totp.step1": "Adım 1: Kimlik doğrulayıcınızı ekleyin",
"account.modal.totp.step2": "Adım 2: Kodunuzu doğrulayın",
"account.modal.totp.enterManually": "Manuel olarak girin",
"account.modal.totp.enterManually": "Manuel olarak gir",
"account.modal.totp.code": "Kod",
"common.button.clickToCopy": "Kopyalamak için tıkla",
"account.modal.totp.verify": "Doğrula",
"account.notify.totp.disable": "2FA başarıyla kaldırıldı",
"account.notify.totp.enable": "2FA başarıyla etkinleştirildi",
"account.notify.totp.disable": "TOTP başarıyla devre dışı bırakıldı",
"account.notify.totp.enable": "TOTP başarıyla etkinleştirildi",
"account.card.language.title": "Dil",
"account.card.language.description": "Proje topluluk tarafından çevrilmiştir. Bazı diller eksik olabilir.",
"account.card.color.title": "Renk Şeması",
"account.card.language.description": "Proje topluluk tarafından çevrilmektedir. Bazı diller eksik olabilir.",
"account.card.color.title": "Renk şeması",
// ThemeSwitcher.tsx
"account.theme.dark": "Koyu",
"account.theme.light": "Açık",
"account.theme.dark": "Karanlık",
"account.theme.light": "Aydınlık",
"account.theme.system": "Sistem",
"account.button.delete": "Hesabı sil",
"account.modal.delete.title": "Hesabı sil",
"account.modal.delete.description": "Tüm aktif paylaşımlarınız dahil hesabınızı gerçekten silmek istiyor musunuz?",
"account.button.delete": "Hesabı Sil",
"account.modal.delete.title": "Hesabı Sil",
"account.modal.delete.description": "Tüm aktif paylaşımlarınızla birlikte hesabınızı gerçekten silmek istiyor musunuz?",
// END /account
// /account/shares
"account.shares.title": "Paylaşımlarım",
"account.shares.title.empty": "Burası bomboş 👀",
"account.shares.description.empty": "Hiç paylaşımınız yok.",
"account.shares.button.create": "Bir tane oluşturun",
"account.shares.info.title": "Bilgiler paylaşın",
"account.shares.title.empty": "Buralar boş 👀",
"account.shares.description.empty": "Henüz hiç paylaşımınız yok.",
"account.shares.button.create": "Bir tane oluştur",
"account.shares.info.title": "Paylaşım bilgileri",
"account.shares.table.id": "ID",
"account.shares.table.name": "İsim",
"account.shares.table.description": "Açıklama",
"account.shares.table.visitors": "Ziyaretçiler",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.visitors": "Ziyaretçi Sayısı",
"account.shares.table.expiresAt": "Bitiş Tarihi",
"account.shares.table.createdAt": "Oluşturulma Tarihi",
"account.shares.table.size": "Boyut",
"account.shares.modal.share-informations": "Bilgiler paylaşın",
"account.shares.modal.share-link": "Bağlantıyı paylaş",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Bu paylaşımı silmek istediğinize emin misiniz?",
"account.shares.table.password-protected": "Şifre korumalı",
"account.shares.table.visitor-count": "{max} üzerinden {count}",
"account.shares.table.expiry-never": "Asla",
"account.shares.modal.share-informations": "Paylaşım bilgileri",
"account.shares.modal.share-link": "Paylaşım bağlantısı",
"account.shares.modal.delete.title": "Paylaşımı sil: {share}",
"account.shares.modal.delete.description": "Bu paylaşımı gerçekten silmek istiyor musunuz?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Tersine Paylaşımlar",
"account.reverseShares.description": "Ters paylaşım, harici kullanıcıların bir paylaşım oluşturmasına olanak tanıyan benzersiz bir URL oluşturmanızı sağlar.",
"account.reverseShares.title.empty": "Burası bomboş 👀",
"account.reverseShares.description.empty": "Hiç tersine paylaşımınız yok.",
"account.reverseShares.title": "Karşı Paylaşımlar",
"account.reverseShares.description": "Bir karşı paylaşım, dış kullanıcıların bir paylaşım oluşturmasına olanak tanıyan benzersiz bir URL oluşturmanızı sağlar.",
"account.reverseShares.title.empty": "Buralar boş 👀",
"account.reverseShares.description.empty": "Henüz hiç karşı paylaşımınız yok.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Tersine paylaşım oluşturun",
"account.reverseShares.modal.expiration.label": "Sona erme",
"account.reverseShares.modal.title": "Karşı Paylaşım Oluştur",
"account.reverseShares.modal.expiration.label": "Geçerlilik Süresi",
"account.reverseShares.modal.expiration.minute-singular": "Dakika",
"account.reverseShares.modal.expiration.minute-plural": "Dakika",
"account.reverseShares.modal.expiration.hour-singular": "Saat",
@@ -149,89 +152,92 @@ export default {
"account.reverseShares.modal.expiration.month-plural": "Ay",
"account.reverseShares.modal.expiration.year-singular": "Yıl",
"account.reverseShares.modal.expiration.year-plural": "Yıl",
"account.reverseShares.modal.max-size.label": "Maks paylaşım boyutu",
"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.simplified": "Simple mode",
"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.public-access": "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.max-use.label": "Maks Kullanım",
"account.reverseShares.modal.max-size.label": "Maksimum paylaşım boyutu",
"account.reverseShares.modal.send-email": "E-posta bildirimleri gönder",
"account.reverseShares.modal.send-email.description": "Bu karşı paylaşım bağlantısıyla bir paylaşım oluşturulduğunda size bir e-posta bildirimi gönderir.",
"account.reverseShares.modal.simplified": "Basit mod",
"account.reverseShares.modal.simplified.description": "Dosyayı yükleyen kişinin sizinle paylaşmasını kolaylaştırın. Sadece paylaşımın adını ve açıklamasını özelleştirebileceklerdir.",
"account.reverseShares.modal.public-access": "Herkese açık erişim",
"account.reverseShares.modal.public-access.description": "Bu karşı paylaşım bağlantısıyla oluşturulan paylaşımları herkese açık yapın. Devre dışı bırakılırsa, yalnızca siz ve paylaşımı oluşturan kişi görüntüleyebilir.",
"account.reverseShares.modal.max-use.label": "Maksimum kullanım sayısı",
"account.reverseShares.modal.max-use.description": "Bu URL'nin bir paylaşım oluşturmak için kullanılabileceği maksimum sayı.",
"account.reverseShare.never-expires": "Bu tersine paylaşım asla sona ermeyecek.",
"account.reverseShare.expires-on": "Bu tersine paylaşım {expiration} tarihinde sona erecek.",
"account.reverseShare.never-expires": "Bu karşı paylaşımın süresi asla dolmayacak.",
"account.reverseShare.expires-on": "Bu karşı paylaşımın süresi {expiration} tarihinde dolacak.",
"account.reverseShares.table.no-shares": "Henüz paylaşım oluşturulmadı",
"account.reverseShares.table.count.singular": "paylaşım",
"account.reverseShares.table.count.plural": "paylaşım",
"account.reverseShares.table.shares": "Paylaşım",
"account.reverseShares.table.remaining": "Kalan kullanımların",
"account.reverseShares.table.max-size": "Maks paylaşım boyutu",
"account.reverseShares.table.expires": "Sona erme tarihi",
"account.reverseShares.modal.reverse-share-link": "Tersine paylaşım bağlantısı",
"account.reverseShares.modal.delete.title": "Tersine paylaşımı sil",
"account.reverseShares.modal.delete.description": "Bu tersine paylaşımı gerçekten silmek istiyor musunuz? Bunu yaparsanız, ilişkili paylaşımlar da silinecektir.",
"account.reverseShares.table.shares": "Paylaşımlar",
"account.reverseShares.table.remaining": "Kalan kullanım hakkı",
"account.reverseShares.table.max-size": "Maksimum paylaşım boyutu",
"account.reverseShares.table.expires": "Bitiş tarihi",
"account.reverseShares.modal.reverse-share-link": "Karşı paylaşım bağlantısı",
"account.reverseShares.modal.delete.title": "Karşı paylaşımı sil",
"account.reverseShares.modal.delete.description": "Bu karşı paylaşımı gerçekten silmek istiyor musunuz? Eğer silerseniz, ilişkili paylaşımlar da silinecektir.",
// END /account/reverseShares
// /admin
"admin.title": "Yönetim",
"admin.button.users": "Kullanıcı yönetimi",
"admin.button.shares": "Paylaşım yönetimi",
"admin.button.config": "Konfigürasyon",
"admin.button.users": "Kullanıcı Yönetimi",
"admin.button.shares": "Paylaşım Yönetimi",
"admin.button.config": "Yapılandırma",
"admin.version": "Sürüm",
// END /admin
// /admin/users
"admin.users.title": "Kullanıcı yönetimi",
"admin.users.table.username": "Kullanıcı Adı",
"admin.users.table.email": "E-Posta",
"admin.users.title": "Kullanıcı Yönetimi",
"admin.users.table.username": "Kullanıcı adı",
"admin.users.table.email": "E-posta",
"admin.users.table.admin": "Yönetici",
"admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Yönetici ayrıcalıkları",
"admin.users.edit.update.change-password.title": "Şifreyi değiştir",
"admin.users.edit.update.title": "Kullanıcıyı düzenle: {username}",
"admin.users.edit.update.admin-privileges": "Yönetici yetkileri",
"admin.users.edit.update.change-password.title": "Şifre değiştir",
"admin.users.edit.update.change-password.field": "Yeni şifre",
"admin.users.edit.update.change-password.button": "Yeni şifreyi kaydet",
"admin.users.edit.update.notify.password.success": "Şifre başarıyla değiştirildi",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "Kullanıcıyı sil: {username} ?",
"admin.users.edit.delete.description": "Bu kullanıcıyı ve tüm paylaşımlarını gerçekten silmek istiyor musunuz?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Kullanıcı oluştur",
"admin.users.modal.create.username": "Kullanıcı Adı",
"admin.users.modal.create.email": "E-Posta",
"admin.users.modal.create.title": "Kullanıcı Oluştur",
"admin.users.modal.create.username": "Kullanıcı adı",
"admin.users.modal.create.email": "E-posta",
"admin.users.modal.create.password": "Şifre",
"admin.users.modal.create.manual-password": "Şifreyi manuel olarak ayarla",
"admin.users.modal.create.manual-password.description": "İşaretlenmezse, kullanıcı şifresini ayarlamak için bağlantı içeren bir e-posta alacaktır.",
"admin.users.modal.create.admin": "Yönetici ayrıcalıkları",
"admin.users.modal.create.admin.description": "İşaretlenirse, kullanıcı yönetici paneline erişebilir.",
"admin.users.modal.create.manual-password.description": "İşaretlenmezse, kullanıcı şifresini ayarlaması için bir bağlantı içeren bir e-posta alacaktır.",
"admin.users.modal.create.admin": "Yönetici yetkileri",
"admin.users.modal.create.admin.description": "İşaretlenirse, kullanıcı yönetim paneline erişebilecektir.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Paylaşım yönetimi",
"admin.shares.title": "Paylaşım Yönetimi",
"admin.shares.table.id": "Paylaşım ID",
"admin.shares.table.username": "Yapımcı",
"admin.shares.table.visitors": "Ziyaretçi",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Bu paylaşımı gerçekten silmek istiyor musun?",
"admin.shares.table.username": "Oluşturan",
"admin.shares.table.visitors": "Ziyaretçi Sayısı",
"admin.shares.table.expires": "Bitiş Tarihi",
"admin.shares.edit.delete.title": "Paylaşımı sil: {id}",
"admin.shares.edit.delete.description": "Bu paylaşımı gerçekten silmek istiyor musunuz?",
// END /admin/shares
// /upload
"upload.title": "Yükle",
"upload.notify.generic-error": "Paylaşımını bitirirken bir hata meydana geldi.",
"upload.notify.count-failed": "{count} dosya yüklenemedi. Yeniden deneniyor.",
"upload.notify.confirm-leave": "Bu sayfadan ayrılmak istediğinizden emin misiniz? Yüklemeniz iptal edilecek.",
"upload.notify.generic-error": "Paylaşımınız tamamlanırken bir hata oluştu.",
"upload.notify.count-failed": "{count} dosya yüklenemedi. Tekrar deneniyor.",
"upload.reverse-share.error.invalid.title": "Geçersiz karşı paylaşım bağlantısı",
"upload.reverse-share.error.invalid.description": "Bu karşı paylaşımın süresi dolmuş veya geçersiz.",
// Dropzone.tsx
"upload.dropzone.title": "Dosya yükle",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
"upload.dropzone.notify.file-too-big": "Dosyalarınızın boyutu {maxSize} paylaşım sınırını geçti.",
"upload.dropzone.title": "Dosyaları Yükle",
"upload.dropzone.description": "Paylaşımınızı başlatmak için dosyaları buraya sürükleyip bırakın. Toplamda en fazla {maxSize} boyutunda dosya kabul ediyoruz.",
"upload.dropzone.notify.file-too-big": "Dosyalarınız maksimum paylaşım boyutu olan {maxSize} değerini aşıyor.",
// FileList.tsx
"upload.filelist.name": "İsim",
"upload.filelist.size": "Boyut",
// showCreateUploadModal.tsx
"upload.modal.title": "Paylaşım Oluştur",
"upload.modal.link.error.invalid": "Sadece harf, sayı, alt çizgi ve kısa çizgi içerebilir",
"upload.modal.link.error.taken": "Bu bağlantı halen kullanımda",
"upload.modal.not-signed-in": "Oturum açmadınız",
"upload.modal.not-signed-in-description": "Paylaşımınızı manuel olarak silemeyecek ve ziyaret sayısını göremeyeceksiniz.",
"upload.modal.link.error.invalid": "Sadece harf, rakam, alt çizgi ve tire içerebilir",
"upload.modal.link.error.taken": "Bu bağlantı zaten kullanılıyor",
"upload.modal.not-signed-in": "Giriş yapmadınız",
"upload.modal.not-signed-in-description": "Paylaşımınızı manuel olarak silemez ve ziyaretçi sayısını göremezsiniz.",
"upload.modal.expires.never": "asla",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "Kalıcı paylaşım",
"upload.modal.expires.error.too-long": "Geçerlilik süresi maksimum {max} değerini aşıyor.",
"upload.modal.link.label": "Bağlantı",
"upload.modal.expires.label": "Sona erme tarihi",
"upload.modal.expires.label": "Geçerlilik Süresi",
"upload.modal.expires.minute-singular": "Dakika",
"upload.modal.expires.minute-plural": "Dakika",
"upload.modal.expires.hour-singular": "Saat",
@@ -247,209 +253,264 @@ export default {
"upload.modal.accordion.name-and-description.title": "İsim ve açıklama",
"upload.modal.accordion.name-and-description.name.placeholder": "İsim",
"upload.modal.accordion.name-and-description.description.placeholder": "Bu paylaşımın alıcıları için not",
"upload.modal.accordion.email.title": "E-Posta alıcıları",
"upload.modal.accordion.email.placeholder": "E-Posta alıcılarını yazın",
"upload.modal.accordion.email.invalid-email": "Geçersiz E-Posta adresi",
"upload.modal.accordion.email.title": "E-posta alıcıları",
"upload.modal.accordion.email.placeholder": "E-posta alıcılarını girin",
"upload.modal.accordion.email.invalid-email": "Geçersiz e-posta adresi",
"upload.modal.accordion.security.title": "Güvenlik seçenekleri",
"upload.modal.accordion.security.password.label": "Şifre koruması",
"upload.modal.accordion.security.password.placeholder": "Şifresiz",
"upload.modal.accordion.security.max-views.label": "En fazla görüntüleme",
"upload.modal.accordion.security.max-views.placeholder": "Sınır yok",
"upload.modal.accordion.security.password.placeholder": "Şifre yok",
"upload.modal.accordion.security.max-views.label": "Maksimum görüntüleme sayısı",
"upload.modal.accordion.security.max-views.placeholder": "Limit yok",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Bu paylaşım asla sona ermeyecek.",
"upload.modal.completed.expires-on": "Bu paylaşım {expiration} tarihinde sona erecek.",
"upload.modal.completed.never-expires": "Bu paylaşımın süresi asla dolmayacak.",
"upload.modal.completed.expires-on": "Bu paylaşımın süresi {expiration} tarihinde dolacak.",
"upload.modal.completed.share-ready": "Paylaşım hazır",
"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": "Karşı paylaşımı oluşturan kişiyi bilgilendirdik. Bu bağlantıyı onlarla başka yollarla da manuel olarak paylaşabilirsiniz.",
// END /upload
// /share/[id]
"share.title": "Paylaş {shareId}",
"share.description": "Seninle ne paylaştığıma bak!",
"share.error.visitor-limit-exceeded.title": "Ziyaretçi sınırııldı",
"share.error.visitor-limit-exceeded.description": "Bu paylaşımdaki ziyaretçi sınırııldı.",
"share.title": "Paylaşım {shareId}",
"share.description": "Bak sana ne paylaştım!",
"share.fileCount": "{count, plural, =1 {# dosya} other {# dosya}} · {size} (zip dosyası sıkıştırma nedeniyle daha küçük olabilir)",
"share.error.visitor-limit-exceeded.title": "Ziyaretçi limitiı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.not-found.title": "Paylaşım bulunamadı",
"share.error.not-found.description": "Aradığınız paylaşım bulunmuyor.",
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.error.not-found.description": "Aradığınız paylaşım mevcut değil.",
"share.error.access-denied.title": "Özel paylaşım",
"share.error.access-denied.description": "Mevcut hesabın bu paylaşıma erişim izni yok.",
"share.modal.password.title": "Şifre gerekli",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Bu paylaşıma erişmek için lütfen şifreyi girin.",
"share.modal.password": "Şifre",
"share.modal.error.invalid-password": "Geçersiz şifre",
"share.button.download-all": "Tümünü indir",
"share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.notify.download-all-preparing": "Paylaşım hazırlanıyor. Lütfen birkaç dakika içinde tekrar deneyin.",
"share.modal.file-link": "Dosya bağlantısı",
"share.table.name": "İsim",
"share.table.size": "Boyut",
"share.modal.file-preview.error.not-supported.title": "Önizleme desteklenmiyor",
"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": "Bu dosya türü için önizleme desteklenmemektedir. Görüntülemek için lütfen dosyayı indirin.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "{shareId} düzenle",
"share.edit.title": "Düzenle {shareId}",
"share.edit.append-upload": "Dosya ekle",
"share.edit.notify.generic-error": "Paylaşımını bitirirken bir hata meydana geldi.",
"share.edit.notify.generic-error": "Paylaşımınız tamamlanırken bir hata oluştu.",
"share.edit.notify.save-success": "Paylaşım başarıyla güncellendi",
// END /share/[id]/edit
// /imprint
"imprint.title": "Künye",
// END /imprint
// /privacy
"privacy.title": "Gizlilik Politikası",
// END /privacy
// /admin/config
"admin.config.title": "Konfigürasyon",
"admin.config.config-file-warning.title": "Yapılandırma dosyası mevcut",
"admin.config.config-file-warning.description": "Pingvin Share'i bir yapılandırma dosyası ile kurduğunuz için, yapılandırmayı arayüz üzerinden değiştiremezsiniz.",
"admin.config.title": "Yapılandırma",
"admin.config.category.general": "Genel",
"admin.config.category.share": "Paylaş",
"admin.config.category.email": "E-Posta",
"admin.config.category.share": "Paylaşım",
"admin.config.category.cache": "Önbellek",
"admin.config.category.email": "E-posta",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Sosyal Medya Girişi",
"admin.config.category.oauth": "Sosyal Medya ile Giriş",
"admin.config.general.app-name": "Uygulama adı",
"admin.config.general.app-name.description": "Uygulamanın adı",
"admin.config.general.app-url": "Uygulama URL'si",
"admin.config.general.app-url.description": "Pingvin Share'in hangi bağlantıda kullanılacağı",
"admin.config.general.show-home-page": "Ana sayfayı göster",
"admin.config.general.show-home-page.description": "Ana sayfanın görünürlüğü",
"admin.config.general.app-url.description": "Pingvin Share'in erişilebilir olduğu URL",
"admin.config.general.secure-cookies": "Güvenli çerezler",
"admin.config.general.secure-cookies.description": "Çerezlerde güvenli bayrağının ayarlanıp ayarlanmayacağı. Etkinleştirilirse, site HTTP üzerinden erişildiğinde çalışmaz.",
"admin.config.general.show-home-page": "Anasayfayı göster",
"admin.config.general.show-home-page.description": "Anasayfanın gösterilip gösterilmeyeceği",
"admin.config.general.session-duration": "Oturum Süresi",
"admin.config.general.session-duration.description": "Kullanıcının ne kadar sürede bir tekrar giriş yapacağı (normalde 3 ay).",
"admin.config.general.session-duration.description": "Bir kullanıcının tekrar giriş yapması gereken süre (varsayılan: 3 ay).",
"admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Yeni resim yükleyerek logo'nuzu değiştirin. Resim PNG ve 1'e 1 ölçekte olmalı.",
"admin.config.general.logo.description": "Yeni bir resim yükleyerek logonuzu değiştirin. Resim PNG formatında ve 1:1 oranında olmalıdır.",
"admin.config.general.logo.placeholder": "Resim seç",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Paylaşım alıcılarının konusu",
"admin.config.email.share-recipients-subject.description": "Paylaşım alıcılarına gönderilecek e-postanın konusu.",
"admin.config.email.share-recipients-message": "Paylaşım alıcılarının mesajı",
"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 {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.reverse-share-subject": "Tersine paylaşım konusu",
"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-message": "Tersine paylaşım mesajı",
"admin.config.email.reverse-share-message.description": "Birisi sizin tersine paylaşım bağlantınızla bir paylaşım oluşturduğunda gönderilen mesaj. {shareUrl}, oluşturucunun adı ve paylaşım URL'si ile değiştirilecektir.",
"admin.config.email.reset-password-subject": "Şifre sıfırlama konusu",
"admin.config.email.reset-password-subject.description": "Subject of the sent email when a user requests a password reset.",
"admin.config.email.reset-password-message": "Şifre sıfırlama mesajı",
"admin.config.email.reset-password-message.description": "Bir kullanıcı şifre sıfırlama talebinde bulunduğunda gönderilecek mesaj. {url} şifre sıfırlama URL'si ile değiştirilecektir.",
"admin.config.email.invite-subject": "Davet konusu",
"admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Davet mesajı",
"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.share.allow-registration": "Kayda izin ver",
"admin.config.share.allow-registration.description": "Kaydın izin verilip verilmeyeceği",
"admin.config.share.allow-unauthenticated-shares": "Giriş yapmamış kullanıcılara izin ver",
"admin.config.share.allow-unauthenticated-shares.description": "Giriş yapmamış kullanıcıların paylaşım oluşturup oluşturamayacağı",
"admin.config.share.max-expiration": "Maks sona erme",
"admin.config.share.max-expiration.description": "Saat üzerinden maksimum paylaşım sona ermesi. Sınırsız için 0 yapın.",
"admin.config.share.max-size": "Maks boyut",
"admin.config.share.max-size.description": "Byte üzerinden maks paylaşım boyutu",
"admin.config.cache.ttl": "TTL (Yaşam Süresi)",
"admin.config.cache.ttl.description": "Bilgilerin önbellekte tutulacağı saniye cinsinden süre.",
"admin.config.cache.max-items": "Maksimum öğe sayısı",
"admin.config.cache.max-items.description": "Önbellekteki maksimum öğe sayısı.",
"admin.config.cache.redis-enabled": "Redis etkin",
"admin.config.cache.redis-enabled.description": "Normalde Pingvin Share bilgileri bellekte önbellekler. Birden fazla Pingvin Share örneği çalıştırıyorsanız, örnekler arasında önbelleği paylaşmak için Redis önbelleklemesini etkinleştirmeniz gerekir.",
"admin.config.cache.redis-url": "Redis URL'si",
"admin.config.cache.redis-url.description": "Önbellekleme için kullanılan Redis örneğine bağlanmak için URL.",
"admin.config.email.enable-share-email-recipients": "E-posta alıcılarıyla paylaşımı etkinleştir",
"admin.config.email.enable-share-email-recipients.description": "Alıcılarla e-posta paylaşımına izin verilip verilmeyeceği. Yalnızca SMTP etkinse bunu etkinleştirin.",
"admin.config.email.share-recipients-subject": "Paylaşım alıcıları e-posta konusu",
"admin.config.email.share-recipients-subject.description": "Paylaşım alıcılarına gönderilen e-postanın konusu.",
"admin.config.email.share-recipients-message": "Paylaşım alıcıları e-posta mesajı",
"admin.config.email.share-recipients-message.description": "Paylaşım alıcılarına gönderilen mesaj. Mevcut değişkenler:\n {creator} - Paylaşımı oluşturanın kullanıcı adı\n {creatorEmail} - Paylaşımı oluşturanın e-postası\n {shareUrl} - Paylaşımın URL'si\n {desc} - Paylaşımın açıklaması\n {expires} - Paylaşımın son kullanma tarihi\n Bu değişkenler gerçek değerle değiştirilecektir.",
"admin.config.email.reverse-share-subject": "Karşı paylaşım e-posta konusu",
"admin.config.email.reverse-share-subject.description": "Birisi karşı paylaşım bağlantınızla bir paylaşım oluşturduğunda gönderilen e-postanın konusu.",
"admin.config.email.reverse-share-message": "Karşı paylaşım e-posta mesajı",
"admin.config.email.reverse-share-message.description": "Birisi karşı paylaşım bağlantınızla bir paylaşım oluşturduğunda gönderilen mesaj. {shareUrl}, oluşturanın adı ve paylaşım URL'si ile değiştirilecektir.",
"admin.config.email.reset-password-subject": "Şifre sıfırlama e-posta konusu",
"admin.config.email.reset-password-subject.description": "Bir kullanıcı şifre sıfırlama talebinde bulunduğunda gönderilen e-postanın konusu.",
"admin.config.email.reset-password-message": "Şifre sıfırlama e-posta mesajı",
"admin.config.email.reset-password-message.description": "Bir kullanıcı şifre sıfırlama talebinde bulunduğunda gönderilen mesaj. {url}, şifre sıfırlama URL'si ile değiştirilecektir.",
"admin.config.email.invite-subject": "Davetiye e-posta konusu",
"admin.config.email.invite-subject.description": "Bir yönetici bir kullanıcıyı davet ettiğinde gönderilen e-postanın konusu.",
"admin.config.email.invite-message": "Davetiye e-posta mesajı",
"admin.config.email.invite-message.description": "Bir yönetici bir kullanıcıyı davet ettiğinde gönderilen mesaj. {url} davet URL'si, {email} e-posta ve {password} kullanıcının şifresi ile değiştirilecektir.",
"admin.config.share.allow-registration": "Kayıt olmaya izin ver",
"admin.config.share.allow-registration.description": "Kayıt olmaya izin verilip verilmeyeceği",
"admin.config.share.allow-unauthenticated-shares": "Kimliği doğrulanmamış paylaşımlara izin ver",
"admin.config.share.allow-unauthenticated-shares.description": "Kimliği doğrulanmamış kullanıcıların paylaşım oluşturup oluşturamayacağı",
"admin.config.share.max-expiration": "Maksimum geçerlilik süresi",
"admin.config.share.max-expiration.description": "Maksimum paylaşım geçerlilik süresi. Sınırsız geçerlilik süresine izin vermek için 0 olarak ayarlayın.",
"admin.config.share.share-id-length": "Varsayılan paylaşım ID uzunluğu",
"admin.config.share.share-id-length.description": "Bir paylaşımın oluşturulan ID'si için varsayılan uzunluk. Bu değer aynı zamanda karşı paylaşımlar için bağlantı oluşturmak için de kullanılır. 8'in altındaki bir değer güvenli kabul edilmez.",
"admin.config.share.max-size": "Maksimum boyut",
"admin.config.share.max-size.description": "Maksimum paylaşım boyutu",
"admin.config.share.zip-compression-level": "Zip sıkıştırma seviyesi",
"admin.config.share.zip-compression-level.description": "Dosya boyutu ve sıkıştırma hızı arasında denge kurmak için seviyeyi ayarlayın. Geçerli değerler 0 ile 9 arasında değişir; 0 sıkıştırma yok ve 9 maksimum sıkıştırma anlamına gelir. ",
"admin.config.share.chunk-size": "Yığın boyutu",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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": "Paylaşım oluşturma modalini otomatik aç",
"admin.config.share.auto-open-share-modal.description": "Bir kullanıcı dosyaları seçtiğinde paylaşım oluşturma modu otomatik olarak görünür ve düğmeye manuel olarak tıklama ihtiyacını ortadan kaldırır.",
"admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "SMTP'nin etkin olup olmadığı. Bunu yalnızca SMTP sunucunuzun ana bilgisayarını, bağlantı noktasını, e-postasını, kullanıcısını ve şifresini girdiyseniz true olarak ayarlayın.",
"admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "SMTP sunucusunun hostu",
"admin.config.share.zip-compression-level.description": "Dosya boyutu ve sıkıştırma hızı arasında denge kurmak için seviyeyi ayarlayın. Geçerli değerler 0 ile 9 arasındadır; 0 sıkıştırma yok, 9 ise maksimum sıkıştırma anlamına gelir.",
"admin.config.share.chunk-size": "Parça boyutu",
"admin.config.share.chunk-size.description": "İnternet bağlantınıza göre verimlilik ve güvenilirlik arasında denge kurmak için yüklemeleriniz için parça boyutunu ayarlayın. Daha küçük parçalar, kararsız bağlantılarda başarı oranlarını artırabilirken, daha büyük parçalar kararlı bağlantılarda yüklemeleri hızlandırır.",
"admin.config.share.auto-open-share-modal": "Paylaşım oluşturma penceresini otomatik aç",
"admin.config.share.auto-open-share-modal.description": "Bir kullanıcı dosya seçtiğinde paylaşım oluşturma penceresi otomatik olarak ılır, böylece düğmeye manuel olarak tıklama ihtiyacı ortadan kalkar.",
"admin.config.smtp.enabled": "Etkinleştir",
"admin.config.smtp.enabled.description": "SMTP'nin etkin olup olmadığı. Yalnızca SMTP sunucunuzun ana bilgisayarını, bağlantı noktasını, e-postasını, kullanıcısını ve şifresini girdiyseniz bunu true olarak ayarlayın.",
"admin.config.smtp.host": "Sunucu",
"admin.config.smtp.host.description": "SMTP sunucusunun adresi",
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "SMTP sunucusunun portu",
"admin.config.smtp.email": "E-Posta",
"admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Kullanıcı Adı",
"admin.config.smtp.email": "E-posta",
"admin.config.smtp.email.description": "E-postaların gönderileceği e-posta adresi",
"admin.config.smtp.username": "Kullanıcı adı",
"admin.config.smtp.username.description": "SMTP sunucusunun kullanıcı adı",
"admin.config.smtp.password": "Şifre",
"admin.config.smtp.password.description": "SMTP sunucusunun şifresi",
"admin.config.smtp.button.test": "Test e-postası gönder",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
"admin.config.oauth.allow-registration": "Kayıtlara izin ver",
"admin.config.oauth.allow-registration.description": "Sosyal Medya kayıtlarına izin verilip verilmeyeceği",
"admin.config.oauth.ignore-totp": "2FA görmezden gel",
"admin.config.oauth.ignore-totp.description": "Sosyal Medya ile giriş yapıldıktıktan sonra 2FA görmezden gelinip gelinmeyeceği",
"admin.config.oauth.disable-password": "Disable password login",
"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.smtp.allow-unauthorized-certificates": "Yetkisiz SMTP sunucu sertifikalarına güven",
"admin.config.smtp.allow-unauthorized-certificates.description": "Yalnızca kendinden imzalı sertifikalara güvenmeniz gerekiyorsa bunu true olarak ayarlayın.",
"admin.config.oauth.allow-registration": "Kayıt olmaya izin ver",
"admin.config.oauth.allow-registration.description": "Kullanıcıların sosyal medya ile giriş yaparak kayıt olmalarına izin ver",
"admin.config.oauth.ignore-totp": "TOTP'yi yoksay",
"admin.config.oauth.ignore-totp.description": "Kullanıcı sosyal medya ile giriş yaptığında TOTP'yi yoksayıp yoksaymayacağı",
"admin.config.oauth.disable-password": "Şifre ile girişi devre dışı bırak",
"admin.config.oauth.disable-password.description": "Şifre ile girişi devre dışı bırakıp bırakmayacağı.\nHesabınıza erişimi kaybetmemek için bu yapılandırmayı etkinleştirmeden önce bir OAuth sağlayıcısının doğru şekilde yapılandırıldığından emin olun.",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "GitHub girişine izin verilip verilmeyeceği",
"admin.config.oauth.github-client-id": "GitHub Client ID",
"admin.config.oauth.github-client-id.description": "GitHub OAuth uygulamasının Client ID'si",
"admin.config.oauth.github-client-secret": "GitHub Client Secret",
"admin.config.oauth.github-client-secret.description": "GitHub OAuth uygulamasının Client Secret'i",
"admin.config.oauth.github-enabled.description": "GitHub ile girişin etkin olup olmadığı",
"admin.config.oauth.github-client-id": "GitHub İstemci ID",
"admin.config.oauth.github-client-id.description": "GitHub OAuth uygulamasının İstemci ID'si",
"admin.config.oauth.github-client-secret": "GitHub İstemci Sırrı",
"admin.config.oauth.github-client-secret.description": "GitHub OAuth uygulamasının İstemci Sırrı",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Google girişi izin verilip verilmeyeceği",
"admin.config.oauth.google-client-id": "Google Client ID",
"admin.config.oauth.google-client-id.description": "Google OAuth uygulamasının Client ID'si",
"admin.config.oauth.google-client-secret": "Google Client Secret",
"admin.config.oauth.google-client-secret.description": "Google OAuth uygulamasının Client Secret'i",
"admin.config.oauth.google-enabled.description": "Google ile girişin etkin olup olmadığı",
"admin.config.oauth.google-client-id": "Google İstemci ID",
"admin.config.oauth.google-client-id.description": "Google OAuth uygulamasının İstemci ID'si",
"admin.config.oauth.google-client-secret": "Google İstemci Sırrı",
"admin.config.oauth.google-client-secret.description": "Google OAuth uygulamasının İstemci Sırrı",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Microsoft girişine izin verilip verilmeyeceği",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
"admin.config.oauth.microsoft-tenant.description": "Microsoft OAuth uygulamasının Tenant kimliği\nyaygın: Hem kişisel Microsoft hesabına hem de Microsoft Entra ID'den bir iş veya okul hesabına sahip kullanıcılar uygulamada oturum açabilir. kuruluşlar: Yalnızca Microsoft Entra ID'den iş veya okul hesabı olan kullanıcılar uygulamada oturum açabilir.\ntüketiciler: Yalnızca kişisel Microsoft hesabı olan kullanıcılar uygulamada oturum açabilir.\nMicrosoft Entra Tenant etki alanı adı veya GUID biçimindeki Tenant kimliği: Yalnızca belirli bir Microsoft Entra Tenant kullanıcısı (iş veya okul hesabına sahip dizin üyeleri veya kişisel Microsoft hesabına sahip dizin konukları) uygulamada oturum açabilir.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID",
"admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth uygulamasının Client ID'si",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth uygulamasının Client Secret'i",
"admin.config.oauth.microsoft-enabled.description": "Microsoft ile girişin etkin olup olmadığı",
"admin.config.oauth.microsoft-tenant": "Microsoft Kiracı ID",
"admin.config.oauth.microsoft-tenant.description": "Microsoft OAuth uygulamasının Kiracı ID'si\ncommon: Hem kişisel Microsoft hesabı hem de Microsoft Entra ID'den iş veya okul hesabı olan kullanıcılar uygulamaya giriş yapabilir. organizations: Yalnızca Microsoft Entra ID'den iş veya okul hesabı olan kullanıcılar uygulamaya giriş yapabilir.\nconsumers: Yalnızca kişisel Microsoft hesabı olan kullanıcılar uygulamaya giriş yapabilir.\nMicrosoft Entra kiracısının alan adı veya GUID formatındaki kiracı ID'si: Yalnızca belirli bir Microsoft Entra kiracısından kullanıcılar (iş veya okul hesabına sahip dizin üyeleri veya kişisel Microsoft hesabına sahip dizin misafirleri) uygulamaya giriş yapabilir.",
"admin.config.oauth.microsoft-client-id": "Microsoft İstemci ID",
"admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth uygulamasının İstemci ID'si",
"admin.config.oauth.microsoft-client-secret": "Microsoft İstemci Sırrı",
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth uygulamasının İstemci Sırrı",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Discord girişine izin verilip verilmeyeceği",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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-guild": "Discord limitli sunucu ID'si",
"admin.config.oauth.discord-limited-guild.description": "Oturum açmayı belirli bir sunucudaki kullanıcılarla sınırlayın. Devre dışı bırakmak için boş bırakın.",
"admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Discord OAuth uygulamasının Client ID'si",
"admin.config.oauth.discord-client-secret": "Discord Client secret",
"admin.config.oauth.discord-client-secret.description": "Discord OAuth uygulamasının Client Secret'i",
"admin.config.oauth.oidc-enabled": "OpenID Bağlantısı",
"admin.config.oauth.oidc-enabled.description": "OpenID girişine izin verilip verilmeyeceği",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Keşfetme URI'si",
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth uygulamasının Keşfetme URI'si",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-username-claim": "OpenID Connect kullanıcı adı sahiplenme",
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID belirtecinde kullanıcı adı sahiplenme. Bu yapılandırmanın ne olduğunu bilmiyorsanız boş bırakın.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
"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-general-access": "OpenID Connect role for general access",
"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-admin-access": "OpenID Connect role for admin access",
"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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth uygulamasının Client ID'si",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth uygulamasının Client Secret'i",
"admin.config.oauth.discord-enabled.description": "Discord ile girişin etkin olup olmadığı",
"admin.config.oauth.discord-limited-users": "Discord sınırlı kullanıcılar",
"admin.config.oauth.discord-limited-users.description": "Giriş yapmayı Discord ID'lerine göre belirli kullanıcılarla sınırlayın. Devre dışı bırakmak için boş bırakın.",
"admin.config.oauth.discord-limited-guild": "Discord sınırlı sunucu ID'si",
"admin.config.oauth.discord-limited-guild.description": "Giriş yapmayı belirli bir sunucudaki kullanıcılarla sınırlayın. Devre dışı bırakmak için boş bırakın.",
"admin.config.oauth.discord-client-id": "Discord İstemci ID",
"admin.config.oauth.discord-client-id.description": "Discord OAuth uygulamasının İstemci ID'si",
"admin.config.oauth.discord-client-secret": "Discord İstemci Sırrı",
"admin.config.oauth.discord-client-secret.description": "Discord OAuth uygulamasının İstemci Sırrı",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "OpenID Connect ile girişin etkin olup olmadığı",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Keşif URI'si",
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth uygulamasının Keşif URI'si",
"admin.config.oauth.oidc-sign-out": "OpenID Connect'ten çıkış yap",
"admin.config.oauth.oidc-sign-out.description": "“Çıkış Yap” düğmesinin OpenID Connect sağlayıcısından da çıkış yapıp yapmayacağı",
"admin.config.oauth.oidc-scope": "OpenID Connect kapsamı",
"admin.config.oauth.oidc-scope.description": "OpenID Connect sağlayıcısından istenmesi gereken kapsamlar.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect kullanıcı adı talebi",
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID jetonundaki kullanıcı adı talebi. Bu yapılandırmanın ne olduğunu bilmiyorsanız boş bırakın.",
"admin.config.oauth.oidc-role-path": "OpenID Connect jetonundaki rollerin yolu",
"admin.config.oauth.oidc-role-path.description": "Bir rol dizisine başvuran geçerli bir JMES yolu olmalıdır. " + "OpenID Connect rollerini kullanarak erişim haklarını yönetmek, yalnızca başka bir kimlik sağlayıcısı yapılandırılmamışsa ve şifre ile giriş devre dışı bırakılmışsa önerilir. " + "Bu yapılandırmanın ne olduğunu bilmiyorsanız boş bırakın.",
"admin.config.oauth.oidc-role-general-access": "Genel erişim için OpenID Connect rolü",
"admin.config.oauth.oidc-role-general-access.description": "Genel erişim için gereken rol. Bir kullanıcının giriş yapabilmesi için rollerinde bulunmalıdır. " + "Bu yapılandırmanın ne olduğunu bilmiyorsanız boş bırakın.",
"admin.config.oauth.oidc-role-admin-access": "Yönetici erişimi için OpenID Connect rolü",
"admin.config.oauth.oidc-role-admin-access.description": "Yönetici erişimi için gereken rol. Bir kullanıcının yönetici paneline erişebilmesi için rollerinde bulunmalıdır. " + "Bu yapılandırmanın ne olduğunu bilmiyorsanız boş bırakın.",
"admin.config.oauth.oidc-client-id": "OpenID Connect İstemci ID",
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth uygulamasının İstemci ID'si",
"admin.config.oauth.oidc-client-secret": "OpenID Connect İstemci Sırrı",
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth uygulamasının İstemci Sırrı",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.enabled": "LDAP'ı Etkinleştir",
"admin.config.ldap.enabled.description": "Kullanıcı girişi için LDAP kimlik doğrulamasını kullan",
"admin.config.ldap.url": "Sunucu URL'si",
"admin.config.ldap.url.description": "LDAP sunucusunun URL'si",
"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-password": "Bind password",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"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-query": "User query",
"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.admin-groups": "Admin group",
"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.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.description": "LDAP attribute name for the email of an user.",
"admin.config.ldap.bind-dn.description": "Kullanıcı aramasını gerçekleştirmek için kullanılan varsayılan kullanıcı",
"admin.config.ldap.bind-password": "Bind şifresi",
"admin.config.ldap.bind-password.description": "Kullanıcı aramasını gerçekleştirmek için kullanılan şifre",
"admin.config.ldap.search-base": "Kullanıcı tabanı",
"admin.config.ldap.search-base.description": "Kullanıcı aramasının yapılacağı temel konum",
"admin.config.ldap.search-query": "Kullanıcı sorgusu",
"admin.config.ldap.search-query.description": "Kullanıcı sorgusu, 'Kullanıcı tabanı'nda LDAP kullanıcısını aramak için kullanılacaktır. %username%, kullanıcının girdiği değer için yer tutucu olarak kullanılabilir.",
"admin.config.ldap.admin-groups": "Yönetici grubu",
"admin.config.ldap.admin-groups.description": "Yönetici erişimi için gereken grup.",
"admin.config.ldap.field-name-member-of": "Kullanıcı grupları öznitelik adı",
"admin.config.ldap.field-name-member-of.description": "Bir kullanıcının üye olduğu gruplar için LDAP öznitelik adı. Bu, yönetici grubunu kontrol ederken kullanılır.",
"admin.config.ldap.field-name-email": "Kullanıcı e-posta öznitelik adı",
"admin.config.ldap.field-name-email.description": "Bir kullanıcının e-postası için LDAP öznitelik adı.",
"admin.config.notify.success": "Yapılandırma başarıyla güncellendi.",
"admin.config.notify.logo-success": "Logo başarıyla güncellendi. Web sitesinde güncellenmesi birkaç dakika sürebilir.",
"admin.config.notify.no-changes": "Kaydedilecek değişiklik yok.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Etkin",
"admin.config.s3.enabled.description": "Paylaşılan dosyaları yerel dosya sistemi yerine depolamak için S3'ün kullanılıp kullanılmayacağı.",
"admin.config.s3.endpoint": "Uç Nokta (Endpoint)",
"admin.config.s3.endpoint.description": "S3 bucket'ının URL'si.",
"admin.config.s3.region": "Bölge (Region)",
"admin.config.s3.region.description": "S3 bucket'ının bölgesi.",
"admin.config.s3.bucket-name": "Bucket Adı",
"admin.config.s3.bucket-name.description": "S3 bucket'ının adı.",
"admin.config.s3.bucket-path": "Yol (Path)",
"admin.config.s3.bucket-path.description": "Dosyaları S3 bucket'ında depolamak için kullanılacak varsayılan yol.",
"admin.config.s3.key": "Anahtar (Key)",
"admin.config.s3.key.description": "S3 bucket'ına erişmenizi sağlayan anahtar.",
"admin.config.s3.secret": "Sır (Secret)",
"admin.config.s3.secret.description": "S3 bucket'ına erişmenizi sağlayan sır.",
"admin.config.s3.use-checksum": "Sağlama toplamı (checksum) kullan",
"admin.config.s3.use-checksum.description": "Sağlama toplamını desteklemeyen (ör. B2) arka uçlar için kapatın.",
"admin.config.category.legal": "Yasal",
"admin.config.legal.enabled": "Yasal bildirimleri etkinleştir",
"admin.config.legal.enabled.description": "Altbilgide künye ve gizlilik politikası bağlantısı gösterilip gösterilmeyeceği.",
"admin.config.legal.imprint-text": "Künye metni",
"admin.config.legal.imprint-text.description": "Künyede gösterilmesi gereken metin. Markdown destekler. Harici bir künye sayfasına bağlantı vermek için boş bırakın.",
"admin.config.legal.imprint-url": "Künye URL'si",
"admin.config.legal.imprint-url.description": "Zaten bir künye sayfanız varsa, metin alanı yerine buraya bağlantı verebilirsiniz.",
"admin.config.legal.privacy-policy-text": "Gizlilik politikası metni",
"admin.config.legal.privacy-policy-text.description": "Gizlilik politikasında gösterilmesi gereken metin. Markdown destekler. Harici bir gizlilik politikası sayfasına bağlantı vermek için boş bırakın.",
"admin.config.legal.privacy-policy-url": "Gizlilik politikası URL'si",
"admin.config.legal.privacy-policy-url.description": "Zaten bir gizlilik politikası sayfanız varsa, metin alanı yerine buraya bağlantı verebilirsiniz.",
// 404
"404.description": "Haydaa, böyle bir sayfa yok.",
"404.button.home": "Beni eve götür",
"404.description": "Hay aksi, bu sayfa mevcut değil.",
"404.button.home": "Beni anasayfaya götür",
// error
"error.title": "Hata",
"error.description": "Haydaa!",
"error.description": "Hay aksi!",
"error.button.back": "Geri dön",
"error.msg.default": "Bir şeyler ters gitti.",
"error.msg.access_denied": "Doğrulama aşamasını iptal ettin, lütfen yeniden dene.",
"error.msg.expired_token": "Doğrulama aşaması çok uzun sürdü, lütfen yeniden dene.",
"error.msg.invalid_token": "Dahili Hata",
"error.msg.access_denied": "Kimlik doğrulama işlemini iptal ettiniz, lütfen tekrar deneyin.",
"error.msg.expired_token": "Kimlik doğrulama işlemi çok uzun sürdü, lütfen tekrar deneyin.",
"error.msg.invalid_token": "İç Hata",
"error.msg.no_user": "Bu {0} hesabına bağlı kullanıcı mevcut değil.",
"error.msg.no_email": "Bu {0} hesaptan e-posta adresi alınamıyor.",
"error.msg.no_email": "Bu {0} hesabından e-posta adresi alınamıyor.",
"error.msg.already_linked": "Bu {0} hesabı zaten başka bir hesaba bağlı.",
"error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "Bu {0} hesabı doğrulanmamış, lütfen doğruladıktan sonra yeniden dene.",
"error.msg.user_not_allowed": "Giriş yapmana izin verilmiyor.",
"error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.msg.not_linked": "Bu {0} hesabı henüz hiçbir hesaba bağlanmamış.",
"error.msg.unverified_account": "Bu {0} hesabı doğrulanmamış, lütfen doğruladıktan sonra tekrar deneyin.",
"error.msg.user_not_allowed": "Giriş yapmanıza izin verilmiyor.",
"error.msg.cannot_get_user_info": "Bu {0} hesabından kullanıcı bilgileriniz alınamıyor.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID Bağlantısı",
"error.param.provider_oidc": "OpenID Connect",
// Common translations
"common.button.save": "Kaydet",
"common.button.create": "Oluştur",
@@ -457,26 +518,27 @@ export default {
"common.button.delete": "Sil",
"common.button.cancel": "İptal",
"common.button.confirm": "Onayla",
"common.button.disable": "Etkisizleştir",
"common.button.disable": "Devre Dışı Bırak",
"common.button.share": "Paylaş",
"common.button.generate": "Oluştur",
"common.button.done": "Tamam",
"common.button.done": "Bitti",
"common.text.link": "Bağlantı",
"common.text.navigate-to-link": "Visit link",
"common.text.or": "ya da",
"common.text.redirecting": "Redirecting...",
"common.text.navigate-to-link": "Bağlantıya git",
"common.text.or": "veya",
"common.text.redirecting": "Yönlendiriliyor...",
"common.button.go-back": "Geri dön",
"common.button.go-home": "Ana sayfaya dön",
"common.notify.copied": "Bağlantınız kopyalandı",
"common.button.go-home": "Anasayfaya git",
"common.notify.copied": "Bağlantınız panoya kopyalandı",
"common.notify.copied-link": "Bağlantınız panoya kopyalandı",
"common.success": "Başarılı",
"common.error": "Hata",
"common.error.unknown": "Bilinmeyen hata meydana geldi",
"common.error.invalid-email": "Geçersiz E-Posta adresi",
"common.error.too-short": "En azından {length} karakter olmalı",
"common.error.too-long": "En fazla {length} karakter olmalı",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Tam tamına {length} karakter olmalı",
"common.error.invalid-number": "Bir sayı olmalı",
"common.error.field-required": "Bu alan gerekli"
"common.error.unknown": "Bilinmeyen bir hata oluştu",
"common.error.invalid-email": "Geçersiz e-posta adresi",
"common.error.too-short": "En az {length} karakter olmalıdır",
"common.error.too-long": "En fazla {length} karakter olabilir",
"common.error.number-too-small": "En az {min} olmalıdır",
"common.error.number-too-large": "En fazla {max} olabilir",
"common.error.exact-length": "Tam olarak {length} karakter olmalıdır",
"common.error.invalid-number": "Bir sayı olmalıdır",
"common.error.field-required": "Bu alan zorunludur"
};

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Завантажити",
"navbar.signin": "Вхід",
"navbar.home": "Головна",
"navbar.signup": "Sign up",
"navbar.signup": "Реєстрація",
"navbar.links.shares": "Мої завантаження",
"navbar.links.reverse": "Зворотні завантаження",
"navbar.avatar.account": "Мій аккаунт",
@@ -12,13 +12,13 @@ export default {
// END navbar
// /
"home.title": "Платформа для обміну файлами із <h>власного хостингу</h>.",
"home.description": "Ви дійсно бажаєте надати свої особисті файли У руки третіх осіб, таких як WeTransfer?",
"home.description": "Ви дійсно ви хочете передати свої особисті файли в руки третіх осіб, таких як WeTransfer?",
"home.bullet.a.name": "На власному сервері",
"home.bullet.a.description": "Pingvin Share працює на вашій машині.",
"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.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.source": "Вихідний код",
// END /
@@ -34,7 +34,7 @@ export default {
"signIn.notify.totp-required.title": "Потрібна двофакторна аутентифікація",
"signIn.notify.totp-required.description": "Будь ласка, введіть код Вашої 2-х факторної аутентифікації",
"signIn.oauth.or": "АБО",
"signIn.oauth.signInWith": "Sign in with",
"signIn.oauth.signInWith": "Увійти з",
"signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password
"resetPassword.title": "Забули пароль?",
"resetPassword.description": "Введіть ваш email для відновлення пароля.",
"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.text.resetPassword": "Скинути пароль",
"resetPassword.text.enterNewPassword": "Введіть новий пароль",
"resetPassword.input.password": "Новий пароль",
"resetPassword.notify.passwordReset": "Your password has been successfully reset.",
"resetPassword.notify.passwordReset": "Ваш пароль успішно скинуто.",
// /account
"account.title": "Мій акаунт",
"account.card.info.title": "Інформація про акаунт",
@@ -73,9 +73,9 @@ export default {
"account.card.password.title": "Пароль",
"account.card.password.old": "Старий пароль",
"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.card.oauth.title": "Авторизація через соціальні мережі",
"account.card.oauth.title": "Вхід через соцмережі",
"account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Відключити",
"account.card.oauth.unlinked": "Відключено",
"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.card.security.title": "Безпека",
"account.card.security.totp.enable.description": "Введіть ваш поточний пароль для початку увімкнення TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Назва",
"account.shares.table.description": "Опис",
"account.shares.table.visitors": "Відвідувачів",
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.expiresAt": "Діє до",
"account.shares.table.createdAt": "Створено",
"account.shares.table.size": "Розмір",
"account.shares.table.password-protected": "Захищено паролем",
"account.shares.table.visitor-count": "{count} із {max}",
"account.shares.table.expiry-never": "Ніколи",
"account.shares.modal.share-informations": "Відомості",
"account.shares.modal.share-link": "Поділитися посиланням",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.title": "Видалити завантаження: {share}",
"account.shares.modal.delete.description": "Ви дійсно хочете видалити це завантаження?",
// END /account/shares
// /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Рік",
"account.reverseShares.modal.expiration.year-plural": "Роки (роки)",
"account.reverseShares.modal.max-size.label": "Макс. розмір завантаження",
"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.simplified": "Simple mode",
"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.public-access": "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.send-email": "Надсилати сповіщення ел. поштою",
"account.reverseShares.modal.send-email.description": "Надсилає вам сповіщення на ел. пошту, коли створюється завантаження за цим зворотнім посиланням.",
"account.reverseShares.modal.simplified": "Простий режим",
"account.reverseShares.modal.simplified.description": "Полегште людині, яка завантажує файл, поділитися ним з вами. Вони зможуть лише налаштувати назву та опис завантаження.",
"account.reverseShares.modal.public-access": "Публічний доступ",
"account.reverseShares.modal.public-access.description": "Зробіть процес завантаження файлу легшим для користувача, який буде з вами ділитися. Вони зможуть налаштувати лише назву та опис завантаження.",
"account.reverseShares.modal.max-use.label": "Максимум використань",
"account.reverseShares.modal.max-use.description": "Максимальна кількість разів, коли URL може бути використаний для створення завантаження.",
"account.reverseShare.never-expires": "Це зворотне завантаження ніколи не застаріє.",
@@ -174,7 +177,7 @@ export default {
// /admin
"admin.title": "Адміністрування",
"admin.button.users": "Управління користувачами",
"admin.button.shares": "Share management",
"admin.button.shares": "Управління поширенням",
"admin.button.config": "Конфігурація",
"admin.version": "Версія",
// END /admin
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Логін",
"admin.users.table.email": "Електронна пошта",
"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.change-password.title": "Змінити пароль",
"admin.users.edit.update.change-password.field": "Новий пароль",
"admin.users.edit.update.change-password.button": "Зберегти новий пароль",
"admin.users.edit.update.notify.password.success": "Пароль успішно змінено",
"admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
"admin.users.edit.delete.title": "Видалити користувача: {username}?",
"admin.users.edit.delete.description": "Ви дійсно хочете видалити цього користувача та всі його поширення?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Створити користувача",
"admin.users.modal.create.username": "Логін",
@@ -202,21 +205,24 @@ export default {
"admin.users.modal.create.admin.description": "Якщо зазначено, користувач матиме доступ до панелі адміністратора.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Share management",
"admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Visitors",
"admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
"admin.shares.title": "Керування завантаженнями",
"admin.shares.table.id": "ID Завантаження",
"admin.shares.table.username": "Автор",
"admin.shares.table.visitors": "Відвідувачі",
"admin.shares.table.expires": "Діє до",
"admin.shares.edit.delete.title": "Видалити завантаження: {id}",
"admin.shares.edit.delete.description": "Ви дійсно хочете видалити це завантаження?",
// END /admin/shares
// /upload
"upload.title": "Завантажити",
"upload.notify.confirm-leave": "Ви впевнені, що хочете залишити цю сторінку? Ваше завантаження буде скасовано.",
"upload.notify.generic-error": "Сталася помилка під час завершення вашого завантаження.",
"upload.notify.count-failed": "Не вдалося завантажити файли {count}. Повтор спроби.",
"upload.reverse-share.error.invalid.title": "Недійсне посилання на завантаження",
"upload.reverse-share.error.invalid.description": "Зворотне завантаження вже закінчилося або недійсне.",
// Dropzone.tsx
"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}.",
// FileList.tsx
"upload.filelist.name": "Назва",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Ви не авторизовані",
"upload.modal.not-signed-in-description": "Ви не зможете видалити свої файли вручну і переглянути кількість відвідувачів.",
"upload.modal.expires.never": "ніколи",
"upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.expires.never-long": "Постійне завантаження",
"upload.modal.expires.error.too-long": "Термін дії перевищує ліміт по {max}.",
"upload.modal.link.label": "Посилання",
"upload.modal.expires.label": "Закінчується",
"upload.modal.expires.minute-singular": "Хвилина",
@@ -244,9 +250,9 @@ export default {
"upload.modal.expires.month-plural": "Місяця(-ів)",
"upload.modal.expires.year-singular": "Рік",
"upload.modal.expires.year-plural": "Роки (роки)",
"upload.modal.accordion.name-and-description.title": "Name and description",
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
"upload.modal.accordion.name-and-description.title": "Назва та опис",
"upload.modal.accordion.name-and-description.name.placeholder": "Назва",
"upload.modal.accordion.name-and-description.description.placeholder": "Примітка для отримувачів цього завантаження",
"upload.modal.accordion.email.title": "Одержувачі листа",
"upload.modal.accordion.email.placeholder": "Одержувачі e-mail",
"upload.modal.accordion.email.invalid-email": "Неприпустима адреса електронної пошти",
@@ -259,29 +265,30 @@ export default {
"upload.modal.completed.never-expires": "Це завантаження ніколи не застаріє.",
"upload.modal.completed.expires-on": "Це завантаження застаріє {expiration}.",
"upload.modal.completed.share-ready": "Готово",
"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": "Ми сповістили створювача зворотного завантаження. Ви також можете вручну поділитися цим посиланням з ними іншим способом.",
// END /upload
// /share/[id]
"share.title": "Завантаження {shareId}",
"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.description": "Перевищено ліміт відвідувачів.",
"share.error.removed.title": "Завантаження видалено",
"share.error.not-found.title": "Завантаження не знайдено",
"share.error.not-found.description": "Сторінка, яку ви шукаєте, не існує.",
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.error.access-denied.title": "Приватне завантаження",
"share.error.access-denied.description": "Поточний акаунт не має дозволу на доступ до цього завантаження",
"share.modal.password.title": "Потрібен пароль",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Будь ласка, введіть пароль для доступу до цього завантаження.",
"share.modal.password": "Пароль",
"share.modal.error.invalid-password": "Невірний пароль",
"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.table.name": "Назва",
"share.table.size": "Розмір",
"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]
// /share/[id]/edit
"share.edit.title": "Редагувати {shareId}",
@@ -289,77 +296,98 @@ export default {
"share.edit.notify.generic-error": "Сталася помилка під час завершення вашого завантаження.",
"share.edit.notify.save-success": "Посилання на ресурс успішно оновлено",
// END /share/[id]/edit
// /imprint
"imprint.title": "Вихідні дані",
// END /imprint
// /privacy
"privacy.title": "Політика конфіденційності",
// END /privacy
// /admin/config
"admin.config.config-file-warning.title": "Файл конфігурації присутній",
"admin.config.config-file-warning.description": "Оскільки у вас налаштовано Pingvin Share за допомогою конфігураційного файлу, ви не можете змінювати конфігурацію через інтерфейс користувача.",
"admin.config.title": "Конфігурація",
"admin.config.category.general": "Загальне",
"admin.config.category.share": "Завантаження",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Електронна пошта",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Авторизація через соціальні мережі",
"admin.config.category.oauth": "Вхід через соцмережі",
"admin.config.general.app-name": "Назва програми",
"admin.config.general.app-name.description": "Видима назва додатка",
"admin.config.general.app-url": "URL-адреса програми",
"admin.config.general.app-url.description": "Адреса, на якій доступний Pingvin Share",
"admin.config.general.secure-cookies": "Безпечні cookies",
"admin.config.general.secure-cookies.description": "Чи встановлювати прапор безпеки для cookies. Якщо увімкнено, сайт не працюватиме при доступі через HTTP.",
"admin.config.general.show-home-page": "Показувати домашню сторінку",
"admin.config.general.show-home-page.description": "Показувати домашню сторінку чи ні",
"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": "Тривалість сеансу",
"admin.config.general.session-duration.description": "Час, після якого користувач повинен увійти в систему знову (за замовчуванням: 3 місяці).",
"admin.config.general.logo": "Логотип",
"admin.config.general.logo.description": "Змініть свій логотип, завантаживши нове зображення. Зображення має бути PNG і повинно мати формат 1:1.",
"admin.config.general.logo.placeholder": "Виберіть зображення",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow email sharing with recipients. Only enable this if SMTP is activated.",
"admin.config.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Увімкнути спільний доступ для отримувачів через ел. пошту",
"admin.config.email.enable-share-email-recipients.description": "Чи дозволяти спільний доступ через ел. пошту для отримувачів. Увімкніть це тільки, якщо SMTP активовано.",
"admin.config.email.share-recipients-subject": "Заголовок листа (завантаження)",
"admin.config.email.share-recipients-subject.description": "Тема листа, який надсилається одержувачам акції.",
"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 {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} - URL спільного доступу \n {desc} - Опис спільного доступу \n {expires} - Дата закінчення терміну дії спільного доступу \nЦі змінні будуть замінені на фактичні значення.",
"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.description": "Повідомлення, яке надсилається, коли хтось створив завантаження з вашим зворотним посиланням. {shareUrl} буде замінено ім'ям творця та URL-адресою загального доступу.",
"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.description": "Повідомлення, яке надсилається при запиті скидання пароля. {url} буде замінено посиланням.",
"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.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} буде замінено на URL запрошення, {email} на ел. пошту, а {password} на пароль користувача.",
"admin.config.share.allow-registration": "Дозволити реєстрацію",
"admin.config.share.allow-registration.description": "Чи дозволена реєстрація",
"admin.config.share.allow-unauthenticated-shares": "Дозволити неавторизовані завантаження",
"admin.config.share.allow-unauthenticated-shares.description": "Чи можуть неавторизовані користувачі створювати завантаження",
"admin.config.share.max-expiration": "Максимальний термін дії",
"admin.config.share.max-expiration.description": "Максимальний термін дії загального доступу в годинах. Встановіть значення 0, щоб дозволити необмежений термін дії.",
"admin.config.share.max-expiration.description": "Максимальний термін дії спільного доступу. Встановіть 0, щоб дозволити необмежений термін дії.",
"admin.config.share.share-id-length": "Стандартна довжина ID завантаження",
"admin.config.share.share-id-length.description": "Стандартна довжина для згенерованого ID завантаження. Це значення також використовується для створення посилань для зворотних завантажень. Значення менше 8 не вважається безпечним.",
"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.description": "Регулювання рівня балансу між розміром файлу і швидкістю стиснення. Допустимі значення від 0 до 9, з 0 без стиснення, а 9 - максимальне стиснення. ",
"admin.config.share.chunk-size": "Chunk size",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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.share.chunk-size": "Розмір блоку",
"admin.config.share.chunk-size.description": "Налаштуйте розмір блоку для ваших завантажень, щоб збалансувати ефективність та надійність відповідно до вашого інтернет-з'єднання. Менші частини можуть підвищити ймовірність успішного завантаження для нестабільних з'єднань, тоді як більші частини прискорюють завантаження для стабільних з'єднань.",
"admin.config.share.auto-open-share-modal": "Автоматично відкривати модальне вікно для завантаження",
"admin.config.share.auto-open-share-modal.description": "Модальне вікно для створення завантаження автоматично з'являється, коли користувач вибирає файли, що усуває необхідність вручну натискати кнопку.",
"admin.config.smtp.enabled": "Увімкнути",
"admin.config.smtp.enabled.description": "Чи увімкнено SMTP. Встановіть значення true тільки якщо ви ввели хост, порт, email, користувач і пароль вашого SMTP-сервера.",
"admin.config.smtp.host": "Хост",
"admin.config.smtp.host.description": "Сервер SMTP-сервера",
"admin.config.smtp.port": "Порт",
"admin.config.smtp.port.description": "Порт SMTP сервера",
"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.description": "Ім'я користувача SMTP-сервера",
"admin.config.smtp.password": "Пароль",
"admin.config.smtp.password.description": "Пароль SMTP-сервера",
"admin.config.smtp.button.test": "Відправити тестовий лист",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
"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": "Довіряти сертифікатам SMTP серверів без авторизації",
"admin.config.smtp.allow-unauthorized-certificates.description": "Увімкніть це тільки тоді, якщо потрібно довіряти самопідписаним сертифікатам.",
"admin.config.oauth.allow-registration": "Дозволити реєстрацію",
"admin.config.oauth.allow-registration.description": "Дозволити користувачам реєструватися, використовуючи облікові записи соціальних мереж",
"admin.config.oauth.ignore-totp": "Ігнорувати TOTP",
"admin.config.oauth.ignore-totp.description": "Ігнорувати TOTP при використанні соціальної авторизації",
"admin.config.oauth.disable-password": "Disable password login",
"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": "Вимкнути вхід за паролем",
"admin.config.oauth.disable-password.description": "Чи вимкнути вхід за паролем. \nПереконайтеся, що постачальник OAuth налаштований правильно, перед активацією цієї конфігурації, щоб уникнути блокування доступу.",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Чи ввімкнено логін на GitHub",
"admin.config.oauth.github-client-id": "ID клієнта GitHub",
@@ -382,51 +410,84 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Секретний ключ клієнта в додатку Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Чи увімкнено логін Discord",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"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": "Обмежені користувачі Discord",
"admin.config.oauth.discord-limited-users.description": "Обмежити вхід для конкретних користувачів за їх Discord ID. Залиште поле порожнім, щоб вимкнути.",
"admin.config.oauth.discord-limited-guild": "ID обмеженого сервера Discord",
"admin.config.oauth.discord-limited-guild.description": "Обмеження входу для користувачів певного сервера. Залиште порожнім, щоб відключити.",
"admin.config.oauth.discord-client-id": "ID клієнта Discord",
"admin.config.oauth.discord-client-id.description": "ID клієнта в додатку Discord OAuth",
"admin.config.oauth.discord-client-secret": "Секретний ключ клієнта Discord",
"admin.config.oauth.discord-client-secret.description": "Секретний ключ клієнта в додатку Discord OAuth",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled": "OpenID підключення",
"admin.config.oauth.oidc-enabled.description": "Чи ввімкнено логін OpenID Connect",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "URI Discovery URI додатка OpenID Connect OAuth",
"admin.config.oauth.oidc-sign-out": "Sign out from 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": "Вийти з OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Чи буде кнопка \"Вийти\" виводити користувача з постачальника OpenID Connect",
"admin.config.oauth.oidc-scope": "Область OpenID Connect",
"admin.config.oauth.oidc-scope.description": "Області (scopes), які слід запитати у постачальника OpenID Connect.",
"admin.config.oauth.oidc-username-claim": "Заява на ім'я користувача OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Заява про ім'я користувача в токені OpenID Connect ID. Залиште порожнім, якщо не знаєте, що це за конфіг.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
"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-general-access": "OpenID Connect role for general access",
"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-admin-access": "OpenID Connect role for admin access",
"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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-role-path": "Шлях до ролей у токені OpenID Connect",
"admin.config.oauth.oidc-role-path.description": "Повинен бути дійсним шляхом JMES, який посилається на масив ролей. " + "Управління правами доступу за допомогою ролей OpenID Connect рекомендується лише в тому випадку, якщо не налаштований інший постачальник ідентифікації та вхід за паролем вимкнено. " + "Залиште це поле порожнім, якщо ви не знаєте, для чого призначена ця конфігурація.",
"admin.config.oauth.oidc-role-general-access": "Роль OpenID Connect для загального доступу",
"admin.config.oauth.oidc-role-general-access.description": "Роль, необхідна для загального доступу. Має бути присутня в ролях користувача, щоб він міг увійти в систему. " + "Залиште це поле порожнім, якщо ви не знаєте, для чого призначена ця конфігурація.",
"admin.config.oauth.oidc-role-admin-access": "Роль OpenID Connect для адміністративного доступу",
"admin.config.oauth.oidc-role-admin-access.description": "Роль, необхідна для адміністративного доступу. Має бути присутня в ролях користувача, щоб він міг отримати доступ до адміністративної панелі. " + "Залиште це поле порожнім, якщо ви не знаєте, для чого призначена ця конфігурація.",
"admin.config.oauth.oidc-client-id": "Client ID для OpenID Connect",
"admin.config.oauth.oidc-client-id.description": "Клієнтський ідентифікатор додатка OpenID Connect OAuth",
"admin.config.oauth.oidc-client-secret": "Секрет клієнта OpenID Connect",
"admin.config.oauth.oidc-client-secret.description": "Клієнтський секрет програми OpenID Connect OAuth",
"admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server",
"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-password": "Bind password",
"admin.config.ldap.bind-password.description": "Password used to perform the user search",
"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-query": "User query",
"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.admin-groups": "Admin group",
"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.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.description": "LDAP attribute name for the email of an user.",
"admin.config.ldap.enabled": "Увімкнути LDAP",
"admin.config.ldap.enabled.description": "Використовувати LDAP автентифікацію для входу користувача",
"admin.config.ldap.url": "URL сервера",
"admin.config.ldap.url.description": "URL сервера LDAP",
"admin.config.ldap.bind-dn": "Прив'язати DN",
"admin.config.ldap.bind-dn.description": "Користувач за замовчуванням, який використовується для пошуку користувачів",
"admin.config.ldap.bind-password": "Прив'язати пароль",
"admin.config.ldap.bind-password.description": "Пароль, що використовується для пошуку користувача",
"admin.config.ldap.search-base": "База користувачів",
"admin.config.ldap.search-base.description": "Базове розташування, де буде виконано пошук користувача",
"admin.config.ldap.search-query": "Запит користувача",
"admin.config.ldap.search-query.description": "Запит користувача буде використовуватися для пошуку користувача LDAP в \"Базі користувачів\". %username% можна використовувати як заповнювач для введених користувачем даних.",
"admin.config.ldap.admin-groups": "Адмін-група",
"admin.config.ldap.admin-groups.description": "Група, необхідна для адміністративного доступу.",
"admin.config.ldap.field-name-member-of": "Назва атрибута груп користувачів",
"admin.config.ldap.field-name-member-of.description": "Назва атрибута LDAP для груп, до яких належить користувач. Це використовується при перевірці адміністративної групи.",
"admin.config.ldap.field-name-email": "Назва атрибута ел. пошти користувача",
"admin.config.ldap.field-name-email.description": "Назва атрибута LDAP для ел. пошти користувача.",
"admin.config.notify.success": "Конфігурацію оновлено успішно.",
"admin.config.notify.logo-success": "Логотип успішно оновлено. Це може зайняти кілька хвилин, щоб оновлення відобразилось на вебсайті.",
"admin.config.notify.no-changes": "Змін не потрібно зберігати.",
"admin.config.category.s3": "S3",
"admin.config.s3.enabled": "Увімкнено",
"admin.config.s3.enabled.description": "Чи S3 буде використовуватися для зберігання спільних файлів замість локальної файлової системи.",
"admin.config.s3.endpoint": "Точка підключення",
"admin.config.s3.endpoint.description": "URL сховища S3.",
"admin.config.s3.region": "Область",
"admin.config.s3.region.description": "Регион облачного хранилища S3.",
"admin.config.s3.bucket-name": "Ім'я бакета",
"admin.config.s3.bucket-name.description": "Назва S3 бакета.",
"admin.config.s3.bucket-path": "Шлях",
"admin.config.s3.bucket-path.description": "Шлях за замовчуванням, який має використовуватися для зберігання файлів у S3 бакеті.",
"admin.config.s3.key": "Ключ",
"admin.config.s3.key.description": "Ключ, який дозволяє отримати доступ до S3 бакету.",
"admin.config.s3.secret": "Секрет",
"admin.config.s3.secret.description": "Секрет, який дозволяє отримати доступ до S3 бакету.",
"admin.config.s3.use-checksum": "Використовувати контрольну суму",
"admin.config.s3.use-checksum.description": "Вимкніть для непідтримуваних контрольних сум (напр. B2).",
"admin.config.category.legal": "Юридична інформація",
"admin.config.legal.enabled": "Увімкнути правові сповіщення",
"admin.config.legal.enabled.description": "Чи відображати посилання на вихідні дані та політику конфіденційності у нижньому колонтитулі.",
"admin.config.legal.imprint-text": "Текст вихідних даних",
"admin.config.legal.imprint-text.description": "Текст, який має відображатися у вихідних даних. Підтримує Markdown. Залиште порожнім, щоб вставити посилання на зовнішню сторінку з вихідними даними.",
"admin.config.legal.imprint-url": "URL вихідних даних",
"admin.config.legal.imprint-url.description": "Якщо у вас вже є сторінка з вихідними даними, ви можете вставити посилання на неї тут замість використання текстового поля.",
"admin.config.legal.privacy-policy-text": "Текст політики конфіденційності",
"admin.config.legal.privacy-policy-text.description": "Текст, що має бути показано в політиці конфіденційності. Підтримує Markdown. Залиште порожнім, щоб надати посилання на сторінку зовнішньої політики конфіденційності.",
"admin.config.legal.privacy-policy-url": "Політика конфіденційності URL",
"admin.config.legal.privacy-policy-url.description": "Якщо у вас вже є сторінка політики конфіденційності, то ви можете зв'язати її тут замість використання текстового поля.",
// 404
"404.description": "Бляха, цієї строрінки не існує.",
"404.button.home": "Поверни мене додому",
@@ -441,15 +502,15 @@ export default {
"error.msg.no_user": "Користувач, пов'язаний з обліковим записом {0}, не існує.",
"error.msg.no_email": "Не вдається отримати адресу електронної пошти від облікового запису {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.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_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID Connect",
"error.param.provider_oidc": "OpenID підключення",
// Common translations
"common.button.save": "Зберегти",
"common.button.create": "Створити",
@@ -462,20 +523,21 @@ export default {
"common.button.generate": "Згенерувати",
"common.button.done": "Готово",
"common.text.link": "Посилання",
"common.text.navigate-to-link": "Visit link",
"common.text.navigate-to-link": "Відкрити посилання",
"common.text.or": "або",
"common.text.redirecting": "Redirecting...",
"common.text.redirecting": "Перенаправлення...",
"common.button.go-back": "Назад",
"common.button.go-home": "Перейти додому",
"common.notify.copied": "Ваше посилання скопійовано в буфер обміну",
"common.notify.copied-link": "Ваше посилання скопійовано в буфер обміну",
"common.success": "Успішно",
"common.error": "Помилка",
"common.error.unknown": "Сталася невідома помилка",
"common.error.invalid-email": "Неприпустима адреса електронної пошти",
"common.error.too-short": "Повинно бути не менше {length} символів",
"common.error.too-long": "Повинно бути не більше {length} символів",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.number-too-small": "Повинно бути щонайменше {min}",
"common.error.number-too-large": "Повинно бути не більше ніж {max}",
"common.error.exact-length": "Повинно бути рівно {length} символів",
"common.error.invalid-number": "Повинно бути числом",
"common.error.field-required": "Поле обов'язкове для заповнення"

View File

@@ -3,9 +3,9 @@ export default {
"navbar.upload": "Tải lên",
"navbar.signin": "Đăng nhập",
"navbar.home": "Trang chủ",
"navbar.signup": "Sign up",
"navbar.signup": "Đăng ký",
"navbar.links.shares": "Chia sẻ của tôi",
"navbar.links.reverse": "Reverse shares",
"navbar.links.reverse": "Chia sẻ ngược",
"navbar.avatar.account": "Tài khoản",
"navbar.avatar.admin": "Quản trị viên",
"navbar.avatar.signout": "Đăng xuất",
@@ -124,18 +124,21 @@ export default {
"account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Dung lượng",
"account.shares.table.password-protected": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"account.shares.modal.share-informations": "Share informations",
"account.shares.modal.share-link": "Chia sẻ liên kết",
"account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Do you really want to delete this share?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Reverse shares",
"account.reverseShares.description": "A reverse share allows you to generate a unique URL that allows external users to create a share.",
"account.reverseShares.title.empty": "It's empty here 👀",
"account.reverseShares.description.empty": "You don't have any reverse shares.",
"account.reverseShares.title": "Chia sẻ ngược",
"account.reverseShares.description": "Chia sẻ ngược cho phép bạn tạo một liên kết duy nhất để người ngoài có thể tải tệp lên cho bạn.",
"account.reverseShares.title.empty": "Chỗ này đang trống 👀",
"account.reverseShares.description.empty": "Bạn chưa có chia sẻ ngược nào.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Create reverse share",
"account.reverseShares.modal.title": "Tạo chia sẻ ngược",
"account.reverseShares.modal.expiration.label": "Thời hạn",
"account.reverseShares.modal.expiration.minute-singular": "Phút",
"account.reverseShares.modal.expiration.minute-plural": "Phút",
@@ -149,18 +152,18 @@ export default {
"account.reverseShares.modal.expiration.month-plural": "Tháng",
"account.reverseShares.modal.expiration.year-singular": "Năm",
"account.reverseShares.modal.expiration.year-plural": "Năm",
"account.reverseShares.modal.max-size.label": "Max share size",
"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.max-size.label": "Kích thước chia sẻ tối đa",
"account.reverseShares.modal.send-email": "Gửi thông báo qua email",
"account.reverseShares.modal.send-email.description": "Gửi thông báo qua email cho bạn khi có chia sẻ được tạo bằng liên kết chia sẻ ngược này.",
"account.reverseShares.modal.simplified": "Chế độ đơn giản",
"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.public-access": "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.simplified.description": "Giúp người gửi tệp dễ dàng chia sẻ với bạn.\nHọ chỉ có thể chỉnh sửa tên và mô tả của lượt chia sẻ.",
"account.reverseShares.modal.public-access": "Truy cập công khai",
"account.reverseShares.modal.public-access.description": "Cho phép bất kỳ ai cũng có thể xem các tệp được gửi qua liên kết chia sẻ ngược này. Nếu tắt, chỉ bạn với người gửi mới có thể xem được.",
"account.reverseShares.modal.max-use.label": "Max uses",
"account.reverseShares.modal.max-use.description": "The maximum amount of times this URL can be used to create a share.",
"account.reverseShare.never-expires": "This reverse share will never expire.",
"account.reverseShare.expires-on": "This reverse share will expire on {expiration}.",
"account.reverseShares.table.no-shares": "No shares created yet",
"account.reverseShares.table.no-shares": "Chưa tạo chia sẻ nào",
"account.reverseShares.table.count.singular": "share",
"account.reverseShares.table.count.plural": "shares",
"account.reverseShares.table.shares": "Shares",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares
// /upload
"upload.title": "Tải lên",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "An error occurred while finishing your share.",
"upload.notify.count-failed": "{count} files failed to upload. Trying again.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx
"upload.dropzone.title": "Upload files",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
@@ -264,6 +270,7 @@ export default {
// /share/[id]
"share.title": "Share {shareId}",
"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.description": "The visitor limit from this share has been exceeded.",
"share.error.removed.title": "Share removed",
@@ -272,7 +279,7 @@ export default {
"share.error.access-denied.title": "Private share",
"share.error.access-denied.description": "The current account does not have permission to access this share",
"share.modal.password.title": "Cần mật khẩu để mở khoá",
"share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password.description": "Please enter the password to access this share.",
"share.modal.password": "Mật khẩu",
"share.modal.error.invalid-password": "Mật khẩu không hợp lệ",
"share.button.download-all": "Tải xuống tất cả",
@@ -289,10 +296,19 @@ export default {
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /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.category.general": "Tổng quan",
"admin.config.category.share": "Share",
"admin.config.category.cache": "Cache",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login",
@@ -300,19 +316,29 @@ export default {
"admin.config.general.app-name.description": "Name of the application",
"admin.config.general.app-url": "URL ứng dụng",
"admin.config.general.app-url.description": "On which URL Pingvin Share is available",
"admin.config.general.secure-cookies": "Secure cookies",
"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.show-home-page": "Show 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.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.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.cache.ttl": "TTL",
"admin.config.cache.ttl.description": "Time in second to keep information inside the cache.",
"admin.config.cache.max-items": "Maximum items",
"admin.config.cache.max-items.description": "Maximum number of items inside the cache.",
"admin.config.cache.redis-enabled": "Redis enabled",
"admin.config.cache.redis-enabled.description": "Normally Pingvin Share caches information in memory. If you run multiple instances of Pingvin Share, you need to enable Redis caching to share the cache between the instances.",
"admin.config.cache.redis-url": "Redis URL",
"admin.config.cache.redis-url.description": "Url to connect to the Redis instance used for caching.",
"admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"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.share-recipients-subject": "Share recipients subject",
"admin.config.email.share-recipients-subject.description": "Subject of the email which gets sent to the share recipients.",
"admin.config.email.share-recipients-message": "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 {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": "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.reverse-share-subject": "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-message": "Reverse share message",
@@ -330,13 +356,15 @@ export default {
"admin.config.share.allow-unauthenticated-shares": "Allow unauthenticated shares",
"admin.config.share.allow-unauthenticated-shares.description": "Whether unauthenticated users can create shares",
"admin.config.share.max-expiration": "Max expiration",
"admin.config.share.max-expiration.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Default share ID length",
"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.max-size": "Kích thước tối đa",
"admin.config.share.max-size.description": "Kích thước tối đa (bytes)",
"admin.config.share.max-size.description": "Kích thước tối đa",
"admin.config.share.zip-compression-level": "Cấp độ nén Zip",
"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.chunk-size": "Kích cỡ mảnh",
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) 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.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",
@@ -346,7 +374,7 @@ export default {
"admin.config.smtp.port": "Cổng",
"admin.config.smtp.port.description": "Port of the SMTP server",
"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.description": "Username of the SMTP server",
"admin.config.smtp.password": "Mật khẩu",
@@ -396,6 +424,8 @@ export default {
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-sign-out": "Sign out from 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-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"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-role-path": "Path to roles in OpenID Connect token",
@@ -427,6 +457,37 @@ export default {
"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.description": "LDAP attribute name for the email of an user.",
"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.no-changes": "No changes to save.",
"admin.config.category.s3": "S3",
"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.endpoint": "Endpoint",
"admin.config.s3.endpoint.description": "The URL of the S3 bucket.",
"admin.config.s3.region": "Region",
"admin.config.s3.region.description": "The region of the S3 bucket.",
"admin.config.s3.bucket-name": "Bucket name",
"admin.config.s3.bucket-name.description": "The name of the S3 bucket.",
"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.key": "Key",
"admin.config.s3.key.description": "The key which allows you to access the S3 bucket.",
"admin.config.s3.secret": "Secret",
"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.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.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-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.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-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.",
// 404
"404.description": "Oops this page doesn't exist.",
"404.button.home": "Về trang chủ",
@@ -468,6 +529,7 @@ export default {
"common.button.go-back": "Quay lại",
"common.button.go-home": "Về trang chủ",
"common.notify.copied": "Đã sao chép liên kết vào bộ nhớ",
"common.notify.copied-link": "Đã sao chép liên kết vào bộ nhớ",
"common.success": "Thành công",
"common.error": "Error",
"common.error.unknown": "An unknown error occurred",

Some files were not shown because too many files have changed in this diff Show More