Compare commits

...

141 Commits

Author SHA1 Message Date
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
Elias Schneider
ab4f19e921 release: 1.2.4 2024-10-24 14:45:05 +02:00
Elias Schneider
428c1d2b99 fix: don't enforce password lenght for sign in form because of LDAP 2024-10-24 14:44:07 +02:00
Elias Schneider
c89ca7e64b fix: use app name as totp issuer 2024-10-24 13:59:54 +02:00
Elias Schneider
297e8c0ab1 release: 1.2.3 2024-10-23 15:49:09 +02:00
Elias Schneider
446f9dd209 refactor: run formatter 2024-10-23 15:48:55 +02:00
Elias Schneider
acbff6e129 fix: share password can be bypassed if a deleted share with the same id was visited before 2024-10-23 15:48:47 +02:00
Elias Schneider
546d2c1ce4 chore(translations): add Serbian Cyrillic language files 2024-10-23 14:10:29 +02:00
Elias Schneider
37839e6b18 chore(translations): update translations via Crowdin (#644)
* New translations en-us.ts (French)

* New translations en-us.ts (German)

* New translations en-us.ts (Polish)

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

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

* New translations en-us.ts (French)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Czech)

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

* New translations en-us.ts (Thai)

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

* New translations en-us.ts (Italian)

* New translations en-us.ts (French)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Czech)

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

* New translations en-us.ts (Thai)

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

* New translations en-us.ts (French)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Czech)

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

* New translations en-us.ts (Thai)

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

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

* New translations en-us.ts (Italian)
2024-10-23 14:04:41 +02:00
Alexander Lehmann
0b355b94c4 chore(translations): change his to their for describing user (#655) 2024-10-21 08:50:37 +02:00
edbourque0
6444a9d553 docs(installation): Add Portainer installation and upgrade steps (#651)
* Change general config icon

* Update package.json

* Add portainer installation documentation

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2024-10-18 20:56:14 +02:00
Elias Schneider
08079744a0 release: 1.2.2 2024-10-18 16:09:19 +02:00
Elias Schneider
558dd2fb15 chore(translations): add missing translations 2024-10-18 16:07:56 +02:00
Elias Schneider
fe085b58a5 fix: environment variable API_URL can't be changed 2024-10-18 16:07:32 +02:00
edbourque0
958b79d787 fix(admin): change general config icon to gear (#649)
* Change general config icon

* Update package.json

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2024-10-17 21:07:15 +02:00
Papyfloflo
ede9c2a816 refactor: updated wording and grammar in en-US.ts (#648)
Changes made: Revised wording, grammar, and punctuation in various sections such as navbar, home, account, admin, and error messages.
2024-10-17 20:43:14 +02:00
Elias Schneider
e195565630 release: 1.2.1 2024-10-15 20:58:36 +02:00
Elias Schneider
520f9abcf7 chore(translations): update translations via Crowdin (#637)
* New translations en-us.ts (Polish)

* New translations en-us.ts (Italian)

* New translations en-us.ts (French)

* New translations en-us.ts (German)

* New translations en-us.ts (French)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Czech)

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

* New translations en-us.ts (Thai)

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

* New translations en-us.ts (Arabic, Egypt)
2024-10-15 20:57:24 +02:00
Marvin A. Ruder
bfbe8de98a fix(oauth): add post_logout_redirect_uri to OAuth logout redirect URI (#638)
* Add `post_logout_redirect_uri` to OAuth logout redirect URI

Signed-off-by: Marvin A. Ruder <signed@mruder.dev>

* Update OAuth2 configuration documentation

Signed-off-by: Marvin A. Ruder <signed@mruder.dev>

---------

Signed-off-by: Marvin A. Ruder <signed@mruder.dev>
2024-10-15 20:49:43 +02:00
Elias Schneider
d5cd3002a1 fix: share can't be created if an invalid email is entered in mail recipients 2024-10-15 20:47:04 +02:00
Elias Schneider
77a092a3cf fix: trim username, email and password on sign in and sign up page 2024-10-15 20:29:34 +02:00
Elias Schneider
613bae9033 fix: error message for invalid max use count of reverse share 2024-10-15 20:28:05 +02:00
Elias Schneider
2e692241c5 fix: disallow passwort reset if it's a ldap user 2024-10-15 20:12:56 +02:00
Elias Schneider
1e96011793 refactor: run formatter 2024-10-15 20:12:09 +02:00
Elias Schneider
522a041ca1 release: 1.2.0 2024-10-14 18:19:02 +02:00
Elias Schneider
ce6430da9f chore(translations): update translations via Crowdin (#636)
* New translations en-us.ts (French)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Czech)

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

* New translations en-us.ts (Thai)

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

* New translations en-us.ts (Arabic, Egypt)
2024-10-14 18:18:47 +02:00
Marvin A. Ruder
2b3ce3ffd2 feat(oauth): Add option to logout from OpenID Connect provider
* Fixes #598

Signed-off-by: Marvin A. Ruder <signed@mruder.dev>
2024-10-14 18:16:47 +02:00
Elias Schneider
104cc06145 chore(translations): update translations via Crowdin (#622)
* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Danish)

* New translations en-us.ts (French)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Japanese)
2024-10-14 17:16:53 +02:00
Elias Schneider
4a50a5aa3b Merge branch 'main' of https://github.com/stonith404/pingvin-share 2024-10-14 17:15:42 +02:00
Elias Schneider
d6b8b56247 fix: use unique port env variable for backend 2024-10-14 17:15:38 +02:00
COMPLEX
5883dff4cf feat(oauth): add ability to limit user IDs for Discord authentication (#621) 2024-09-30 08:53:58 +02:00
Elias Schneider
511ae933fa release: 1.1.3 2024-09-27 16:10:48 +02:00
Elias Schneider
df2521b192 chore(translations): update translations via Crowdin (#602)
* 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 (French)

* New translations en-us.ts (French)

* New translations en-us.ts (German)

* New translations en-us.ts (Italian)

* New translations en-us.ts (French)

* New translations en-us.ts (Greek)

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

* New translations en-us.ts (Czech)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Danish)

* New translations en-us.ts (German)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

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

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

* New translations en-us.ts (Arabic, Egypt)
2024-09-27 16:10:18 +02:00
Elias Schneider
8f16d6b53e refactor: run formatter 2024-09-27 16:03:53 +02:00
WolverinDEV
3310fe53b3 feat: improve the LDAP implementation (#615)
* feat(logging): add PV_LOG_LEVEL environment variable to set backend log level

* feat(ldap): Adding a more verbose logging output to debug LDAP issues

* fix(ldap): fixed user logins with special characters within the users dn by switching to ldapts

* feat(ldap): made the member of and email attribute names configurable

* fix(ldap): properly handle email like usernames and fixing #601

* Revert "fix: disable email login if ldap is enabled"

This reverts commit d9cfe697d6.

* feat(ldap): disable the ability for a user to change his email when it's a LDAP user

* feat(ldap): relaxed username pattern by allowing the @ character in usernames
2024-09-27 16:02:49 +02:00
Elias Schneider
adc4af996d fix: omit invalid username characters in oidc registration 2024-09-26 21:50:23 +02:00
Elias Schneider
61edc4f4f6 docs: add demo link to docs sidebar 2024-09-25 15:37:05 +02:00
Elias Schneider
eba7984a0f release: 1.1.2 2024-09-24 12:21:56 +02:00
Elias Schneider
69752b8b41 fix: enable secure cookies if app url starts with https 2024-09-24 12:21:41 +02:00
Elias Schneider
ee73293c0f fix: disable auto complete for email recipients and share password 2024-09-24 10:24:48 +02:00
Elias Schneider
5553607ffe Merge branch 'main' of https://github.com/stonith404/pingvin-share 2024-09-22 22:08:39 +02:00
Elias Schneider
2ca6e6ee5f docs: change stand-alone installation command 2024-09-22 22:08:35 +02:00
Alexander Lehmann
18135b0ec0 Remove env line and add comment about update-env (#606) 2024-09-22 18:39:08 +02:00
Sven Kortekaas
f8bfb8ec3c chore(translations): Update nl-BE.ts
New translations and typos
2024-09-19 15:19:50 +02:00
Elias Schneider
187911e334 chore(translations): update translations via Crowdin (#596)
* New translations en-us.ts (Italian)

* New translations en-us.ts (French)

* New translations en-us.ts (Greek)

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

* New translations en-us.ts (Czech)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Danish)

* New translations en-us.ts (German)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

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

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

* New translations en-us.ts (Italian)

* New translations en-us.ts (French)

* New translations en-us.ts (Greek)

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

* New translations en-us.ts (Czech)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Danish)

* New translations en-us.ts (German)

* New translations en-us.ts (Finnish)

* New translations en-us.ts (Hungarian)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Korean)

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

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

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

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

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

* New translations en-us.ts (Italian)
2024-09-19 15:15:27 +02:00
Elias Schneider
64acae11a2 docs: update clamav docs 2024-09-19 08:35:28 +02:00
Elias Schneider
6b39adfd03 release: 1.1.1 2024-09-18 23:32:52 +02:00
Elias Schneider
d9cfe697d6 fix: disable email login if ldap is enabled 2024-09-18 23:32:09 +02:00
Elias Schneider
67a0fc6ea5 docs: improve ClamAV docs 2024-09-18 23:16:41 +02:00
Elias Schneider
b13a81a88c feat: add environment variable to trust the reverse proxy 2024-09-18 23:01:50 +02:00
Elias Schneider
97dc3ecfdd chore(docs): dump dependencies 2024-09-18 11:08:05 +02:00
Elias Schneider
d00d52baa9 chore: dump dependencies 2024-09-18 11:04:06 +02:00
Elias Schneider
4c8848a2d9 release: 1.1.0 2024-09-14 18:15:44 +02:00
Elias Schneider
3c8500008d chore: fix wrong versioning for minor releases 2024-09-14 18:15:36 +02:00
Elias Schneider
325122b802 refactor: run formatter 2024-09-14 18:13:32 +02:00
Elias Schneider
7dc2e56fee feat: auto redirect to oauth provider 2024-09-14 18:13:18 +02:00
Elias Schneider
8b3e28bac8 feat: allow smpt without username and password 2024-09-14 17:24:19 +02:00
Elias Schneider
347026b6d3 chore(translations): update translations via Crowdin (#589)
* New translations en-us.ts (Portuguese, Brazilian)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Polish)
2024-09-12 20:32:36 +02:00
Elias Schneider
5a204d38a4 docs: add contribute and sponsers section to README 2024-09-12 20:32:02 +02:00
Elias Schneider
2eeb858f36 docs: improve Pocket ID text in README 2024-09-06 16:37:29 +02:00
Elias Schneider
67faa860da Merge branch 'main' of https://github.com/stonith404/pingvin-share 2024-09-06 16:36:00 +02:00
Elias Schneider
beca26871d docs: add Pocket ID as a tip to the README 2024-09-06 16:35:56 +02:00
Helly
15d1756a4e Add basic configuration to the docs (#587)
* Created website for the docs inside /docs

* remove old docs and home page

* fix wrong redirection path

* remove most of the docs from the readme

* fix docs path

* undo package.json changes

* remove unused images

* rename "how to" route

* Add basic configuration to the docs

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2024-09-06 09:16:50 +02:00
Elias Schneider
be202d3d41 release: 1.0.4 2024-09-06 09:03:11 +02:00
Elias Schneider
f0e785b1a2 New translations en-us.ts (Greek) (#585) 2024-09-06 09:03:02 +02:00
Elias Schneider
92e1e82e09 fix: oauth2 login can fail in some cases because the user can't be found 2024-09-06 09:02:30 +02:00
Elias Schneider
0670aaa331 release: 1.0.3 2024-09-03 22:56:19 +02:00
Elias Schneider
10b71e7035 chore(translations): update translations via Crowdin (#580)
* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Czech)

* New translations en-us.ts (German)

* New translations en-us.ts (Czech)

* New translations en-us.ts (Bulgarian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (French)

* New translations en-us.ts (Czech)
2024-09-03 22:56:05 +02:00
Elias Schneider
dee70987eb fix: improve oidc error logging 2024-09-03 22:55:44 +02:00
Elias Schneider
3d2b978daf refactor: run formatter 2024-09-03 22:54:53 +02:00
Elias Schneider
e813da05ae chore(translations): add Bulgarian language files 2024-08-30 08:33:26 +02:00
Elias Schneider
1fba0fd546 chore(translations): update translations via Crowdin (#571)
* New translations en-us.ts (Vietnamese)

* New translations en-us.ts (Vietnamese)
2024-08-30 08:32:29 +02:00
134 changed files with 11847 additions and 5743 deletions

View File

@@ -11,24 +11,43 @@ jobs:
- name: checkout code - name: checkout code
uses: actions/checkout@v3 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 - name: Set up QEMU
uses: docker/setup-qemu-action@v2 uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2 uses: docker/setup-buildx-action@v2
- name: Login to Docker registry - name: Login to Docker Hub
uses: docker/login-action@v2 uses: docker/login-action@v2
with: with:
username: ${{ secrets.DOCKER_USERNAME }} username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }} 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 - name: Build and push
uses: docker/build-push-action@v4 uses: docker/build-push-action@v4
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
push: true push: true
tags: stonith404/pingvin-share:latest,stonith404/pingvin-share:${{ github.ref_name }} tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha cache-from: type=gha
cache-to: type=gha,mode=max cache-to: type=gha,mode=max

3
.gitignore vendored
View File

@@ -7,6 +7,9 @@ node_modules
/frontend/.next/ /frontend/.next/
/frontend/out/ /frontend/out/
# yarn
yarn.lock
# build # build
build/ build/
dist/ dist/

View File

@@ -1,3 +1,209 @@
## [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)
### Bug Fixes
* don't enforce password lenght for sign in form because of LDAP ([428c1d2](https://github.com/stonith404/pingvin-share/commit/428c1d2b993a05a25cc94aabe56216b9ab969fa1))
* use app name as totp issuer ([c89ca7e](https://github.com/stonith404/pingvin-share/commit/c89ca7e64b08f437dd1b7e9bf2b9d674cc612228))
## [1.2.3](https://github.com/stonith404/pingvin-share/compare/v1.2.2...v1.2.3) (2024-10-23)
### Bug Fixes
* share password can be bypassed if a deleted share with the same id was visited before ([acbff6e](https://github.com/stonith404/pingvin-share/commit/acbff6e129d236452180f8b96775457d135ac080))
## [1.2.2](https://github.com/stonith404/pingvin-share/compare/v1.2.1...v1.2.2) (2024-10-18)
### Bug Fixes
* **admin:** change general config icon to gear ([#649](https://github.com/stonith404/pingvin-share/issues/649)) ([958b79d](https://github.com/stonith404/pingvin-share/commit/958b79d787585c367a693872fd105a326e6e8d38))
* environment variable `API_URL` can't be changed ([fe085b5](https://github.com/stonith404/pingvin-share/commit/fe085b58a5f3c0152df12957aa150c0876c2a074))
## [1.2.1](https://github.com/stonith404/pingvin-share/compare/v1.2.0...v1.2.1) (2024-10-15)
### Bug Fixes
* disallow passwort reset if it's a ldap user ([2e69224](https://github.com/stonith404/pingvin-share/commit/2e692241c57b001c9312302523c6374c0c24ea0c))
* error message for invalid max use count of reverse share ([613bae9](https://github.com/stonith404/pingvin-share/commit/613bae90330a76c0964352a3fe927df3697309eb))
* **oauth:** add `post_logout_redirect_uri` to OAuth logout redirect URI ([#638](https://github.com/stonith404/pingvin-share/issues/638)) ([bfbe8de](https://github.com/stonith404/pingvin-share/commit/bfbe8de98a6a7a2d32dd8d4dddbcc1d4ce6388f4))
* share can't be created if an invalid email is entered in mail recipients ([d5cd300](https://github.com/stonith404/pingvin-share/commit/d5cd3002a1661e58d584e12280be36f17948c38c))
* trim username, email and password on sign in and sign up page ([77a092a](https://github.com/stonith404/pingvin-share/commit/77a092a3cf089a4aa8b9897b5ad14e5500181d10))
## [1.2.0](https://github.com/stonith404/pingvin-share/compare/v1.1.3...v1.2.0) (2024-10-14)
### Features
* **oauth:** add ability to limit user IDs for Discord authentication ([#621](https://github.com/stonith404/pingvin-share/issues/621)) ([5883dff](https://github.com/stonith404/pingvin-share/commit/5883dff4cf0abe99b3ac8f0b56fdc9d04e80b51c))
* **oauth:** Add option to logout from OpenID Connect provider ([2b3ce3f](https://github.com/stonith404/pingvin-share/commit/2b3ce3ffd250f7e3052d43c1c1e76947abf91e55)), closes [#598](https://github.com/stonith404/pingvin-share/issues/598)
### Bug Fixes
* use unique port env variable for backend ([d6b8b56](https://github.com/stonith404/pingvin-share/commit/d6b8b56247814087c2b676fe2367300172b5a94b))
## [1.1.3](https://github.com/stonith404/pingvin-share/compare/v1.1.2...v1.1.3) (2024-09-27)
### Features
* improve the LDAP implementation ([#615](https://github.com/stonith404/pingvin-share/issues/615)) ([3310fe5](https://github.com/stonith404/pingvin-share/commit/3310fe53b3e4c89db78d57ede6c8d57d8137ecc1)), closes [#601](https://github.com/stonith404/pingvin-share/issues/601)
### Bug Fixes
* omit invalid username characters in oidc registration ([adc4af9](https://github.com/stonith404/pingvin-share/commit/adc4af996d30b295b06e4ee517aa53be62c0f6c1))
## [1.1.2](https://github.com/stonith404/pingvin-share/compare/v1.1.1...v1.1.2) (2024-09-24)
### Bug Fixes
* disable auto complete for email recipients and share password ([ee73293](https://github.com/stonith404/pingvin-share/commit/ee73293c0f822d3e79cfefd096c656d4c36a12d1))
* enable secure cookies if app url starts with https ([69752b8](https://github.com/stonith404/pingvin-share/commit/69752b8b417edda1ab4a4acedbdda09d545d6df8))
## [1.1.1](https://github.com/stonith404/pingvin-share/compare/v1.1.0...v1.1.1) (2024-09-18)
### Features
* add environment variable to trust the reverse proxy ([b13a81a](https://github.com/stonith404/pingvin-share/commit/b13a81a88ca871c5714b2ed52d0e12fb7ceca176))
### Bug Fixes
* disable email login if ldap is enabled ([d9cfe69](https://github.com/stonith404/pingvin-share/commit/d9cfe697d66e9db7bfbc2252b3700580793ce9bb))
## [1.1.0](https://github.com/stonith404/pingvin-share/compare/v1.0.4...v1.1.0) (2024-09-14)
### Features
* allow smpt without username and password ([8b3e28b](https://github.com/stonith404/pingvin-share/commit/8b3e28bac83e5326234096445395046ebdb0c4d7))
* auto redirect to oauth provider ([7dc2e56](https://github.com/stonith404/pingvin-share/commit/7dc2e56fee1afc1078774cc702c0f1fee9bae938))
## [1.0.4](https://github.com/stonith404/pingvin-share/compare/v1.0.3...v1.0.4) (2024-09-06)
### Bug Fixes
* oauth2 login can fail in some cases because the user can't be found ([92e1e82](https://github.com/stonith404/pingvin-share/commit/92e1e82e095075edf04019887f9c2048c21d00d6))
## [1.0.3](https://github.com/stonith404/pingvin-share/compare/v1.0.2...v1.0.3) (2024-09-03)
### Bug Fixes
* improve oidc error logging ([dee7098](https://github.com/stonith404/pingvin-share/commit/dee70987eb74eda4a9ab7332522fa5540cee9761))
## [1.0.2](https://github.com/stonith404/pingvin-share/compare/v1.0.1...v1.0.2) (2024-08-28) ## [1.0.2](https://github.com/stonith404/pingvin-share/compare/v1.0.1...v1.0.2) (2024-08-28)

View File

@@ -1,15 +0,0 @@
:3000 {
# Reverse proxy for /api
reverse_proxy /api/* http://localhost:8080 {
header_up X-Forwarded-Host {host}:{server_port}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
# Reverse proxy for all other requests
reverse_proxy http://localhost:3333 {
header_up X-Forwarded-Host {host}:{server_port}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
}

View File

@@ -20,6 +20,8 @@ RUN npm ci
# Stage 4: Build backend # Stage 4: Build backend
FROM node:20-alpine AS backend-builder FROM node:20-alpine AS backend-builder
RUN apk add openssl
WORKDIR /opt/app WORKDIR /opt/app
COPY ./backend . COPY ./backend .
COPY --from=backend-dependencies /opt/app/node_modules ./node_modules COPY --from=backend-dependencies /opt/app/node_modules ./node_modules
@@ -30,9 +32,12 @@ RUN npm run build && npm prune --production
FROM node:20-alpine AS runner FROM node:20-alpine AS runner
ENV NODE_ENV=docker ENV NODE_ENV=docker
# Delete default node user
RUN deluser --remove-home node
RUN apk update --no-cache \ RUN apk update --no-cache \
&& apk upgrade --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 WORKDIR /opt/app/frontend
COPY --from=frontend-builder /opt/app/public ./public COPY --from=frontend-builder /opt/app/public ./public
@@ -46,13 +51,14 @@ COPY --from=backend-builder /opt/app/dist ./dist
COPY --from=backend-builder /opt/app/prisma ./prisma COPY --from=backend-builder /opt/app/prisma ./prisma
COPY --from=backend-builder /opt/app/package.json ./ COPY --from=backend-builder /opt/app/package.json ./
COPY ./Caddyfile /etc/caddy/Caddyfile
COPY ./scripts/docker-entrypoint.sh /opt/app/docker-entrypoint.sh
WORKDIR /opt/app WORKDIR /opt/app
COPY ./reverse-proxy /opt/app/reverse-proxy
COPY ./scripts ./scripts
EXPOSE 3000 EXPOSE 3000
HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://localhost:3000/api/health || exit 1 HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://localhost:3000/api/health || exit 1
CMD ["sh", "/opt/app/docker-entrypoint.sh"] ENTRYPOINT ["sh", "./scripts/docker/create-user.sh"]
CMD ["sh", "./scripts/docker/entrypoint.sh"]

View File

@@ -13,6 +13,8 @@ Pingvin Share is a self-hosted file sharing platform and an alternative for WeTr
- Set an expiration date for shares - Set an expiration date for shares
- Secure shares with visitor limits and passwords - Secure shares with visitor limits and passwords
- Email recipients - Email recipients
- Reverse shares
- OIDC and LDAP authentication
- Integration with ClamAV for security scans - Integration with ClamAV for security scans
## 🐧 Get to know Pingvin Share ## 🐧 Get to know Pingvin Share
@@ -31,6 +33,19 @@ Pingvin Share is a self-hosted file sharing platform and an alternative for WeTr
The website is now listening on `http://localhost:3000`, have fun with Pingvin Share 🐧! The website is now listening on `http://localhost:3000`, have fun with Pingvin Share 🐧!
> [!TIP]
> Checkout [Pocket ID](https://github.com/stonith404/pocket-id), a user-friendly OIDC provider that lets you easily log in to services like Pingvin Share using Passkeys.
## 📚 Documentation ## 📚 Documentation
For more installation options and advanced configurations, please refer to the [documentation](https://stonith404.github.io/pingvin-share). For more installation options and advanced configurations, please refer to the [documentation](https://stonith404.github.io/pingvin-share).
## 🖤 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)

4033
backend/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "pingvin-share-backend", "name": "pingvin-share-backend",
"version": "1.0.2", "version": "1.8.2",
"scripts": { "scripts": {
"build": "nest build", "build": "nest build",
"dev": "cross-env NODE_ENV=development nest start --watch", "dev": "cross-env NODE_ENV=development nest start --watch",
@@ -13,75 +13,76 @@
"seed": "ts-node prisma/seed/config.seed.ts" "seed": "ts-node prisma/seed/config.seed.ts"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.679.0",
"@nestjs/cache-manager": "^2.2.2", "@nestjs/cache-manager": "^2.2.2",
"@nestjs/common": "^10.3.9", "@nestjs/common": "^10.4.3",
"@nestjs/config": "^3.2.2", "@nestjs/config": "^3.2.3",
"@nestjs/core": "^10.3.9", "@nestjs/core": "^10.4.3",
"@nestjs/jwt": "^10.2.0", "@nestjs/jwt": "^10.2.0",
"@nestjs/passport": "^10.0.3", "@nestjs/passport": "^10.0.3",
"@nestjs/platform-express": "^10.3.9", "@nestjs/platform-express": "^10.4.3",
"@nestjs/schedule": "^4.0.2", "@nestjs/schedule": "^4.1.1",
"@nestjs/swagger": "^7.3.1", "@nestjs/swagger": "^7.4.2",
"@nestjs/throttler": "^5.2.0", "@nestjs/throttler": "^6.2.1",
"@prisma/client": "^5.16.1", "@prisma/client": "^5.19.1",
"@types/jmespath": "^0.15.2", "@types/jmespath": "^0.15.2",
"@types/ldapjs": "^3.0.6",
"archiver": "^7.0.1", "archiver": "^7.0.1",
"argon2": "^0.40.3", "argon2": "^0.41.1",
"body-parser": "^1.20.2", "body-parser": "^1.20.3",
"cache-manager": "^5.6.1", "cache-manager": "^5.7.6",
"clamscan": "^2.2.1", "clamscan": "^2.3.1",
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"class-validator": "^0.14.1", "class-validator": "^0.14.1",
"content-disposition": "^0.5.4", "content-disposition": "^0.5.4",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
"jmespath": "^0.16.0", "jmespath": "^0.16.0",
"ldapjs": "^3.0.7", "ldapts": "^7.2.0",
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
"moment": "^2.30.1", "moment": "^2.30.1",
"nanoid": "^3.3.7", "nanoid": "^3.3.7",
"nodemailer": "^6.9.14", "nodemailer": "^6.9.15",
"otplib": "^12.0.1", "otplib": "^12.0.1",
"passport": "^0.7.0", "passport": "^0.7.0",
"passport-jwt": "^4.0.1", "passport-jwt": "^4.0.1",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
"qrcode-svg": "^1.1.0", "qrcode-svg": "^1.1.0",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"rimraf": "^5.0.7", "rimraf": "^6.0.1",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"sharp": "^0.33.4", "sharp": "^0.33.5",
"ts-node": "^10.9.2" "ts-node": "^10.9.2"
}, },
"devDependencies": { "devDependencies": {
"@nestjs/cli": "^10.3.2", "@nestjs/cli": "^10.4.5",
"@nestjs/schematics": "^10.1.1", "@nestjs/schematics": "^10.1.4",
"@nestjs/testing": "^10.3.9", "@nestjs/testing": "^10.4.3",
"@types/archiver": "^6.0.2", "@types/archiver": "^6.0.2",
"@types/clamscan": "^2.0.8", "@types/clamscan": "^2.0.8",
"@types/cookie-parser": "^1.4.7", "@types/cookie-parser": "^1.4.7",
"@types/cron": "^2.0.1", "@types/cron": "^2.4.0",
"@types/express": "^4.17.21", "@types/express": "^4.17.21",
"@types/mime-types": "^2.1.4", "@types/mime-types": "^2.1.4",
"@types/multer": "^1.4.11", "@types/multer": "^1.4.12",
"@types/node": "^20.14.9", "@types/node": "^22.5.5",
"@types/nodemailer": "^6.4.15", "@types/nodemailer": "^6.4.16",
"@types/passport-jwt": "^4.0.1", "@types/passport-jwt": "^4.0.1",
"@types/qrcode-svg": "^1.1.4", "@types/qrcode-svg": "^1.1.5",
"@types/sharp": "^0.31.1", "@types/sharp": "^0.32.0",
"@types/supertest": "^6.0.2", "@types/supertest": "^6.0.2",
"@typescript-eslint/eslint-plugin": "^7.14.1", "@types/uuid": "^10.0.0",
"@typescript-eslint/parser": "^7.14.1", "@typescript-eslint/eslint-plugin": "^8.6.0",
"@typescript-eslint/parser": "^8.6.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"eslint": "^8.56.0", "eslint": "^9.10.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.2.1",
"newman": "^6.1.3", "newman": "^6.2.1",
"prettier": "^3.3.2", "prettier": "^3.3.3",
"prisma": "^5.16.1", "prisma": "^5.19.1",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"ts-loader": "^9.5.1", "ts-loader": "^9.5.1",
"tsconfig-paths": "4.2.0", "tsconfig-paths": "4.2.0",
"typescript": "^5.5.2", "typescript": "^5.6.2",
"wait-on": "^7.2.0" "wait-on": "^8.0.1"
} }
} }

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "RefreshToken" ADD COLUMN "oauthIDToken" TEXT;

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

@@ -40,6 +40,8 @@ model RefreshToken {
userId String userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade)
oauthIDToken String? // prefixed with the ID of the issuing OAuth provider, separated by a colon
} }
model LoginToken { model LoginToken {
@@ -93,6 +95,7 @@ model Share {
security ShareSecurity? security ShareSecurity?
recipients ShareRecipient[] recipients ShareRecipient[]
files File[] files File[]
storageProvider String @default("LOCAL")
} }
model ReverseShare { model ReverseShare {

View File

@@ -20,14 +20,18 @@ const configVariables: ConfigVariables = {
defaultValue: "http://localhost:3000", defaultValue: "http://localhost:3000",
secret: false, secret: false,
}, },
secureCookies: {
type: "boolean",
defaultValue: "false",
},
showHomePage: { showHomePage: {
type: "boolean", type: "boolean",
defaultValue: "true", defaultValue: "true",
secret: false, secret: false,
}, },
sessionDuration: { sessionDuration: {
type: "number", type: "timespan",
defaultValue: "2160", defaultValue: "3 months",
secret: false, secret: false,
}, },
}, },
@@ -43,12 +47,17 @@ const configVariables: ConfigVariables = {
secret: false, secret: false,
}, },
maxExpiration: { maxExpiration: {
type: "timespan",
defaultValue: "0 days",
secret: false,
},
shareIdLength: {
type: "number", type: "number",
defaultValue: "0", defaultValue: "8",
secret: false, secret: false,
}, },
maxSize: { maxSize: {
type: "number", type: "filesize",
defaultValue: "1000000000", defaultValue: "1000000000",
secret: false, secret: false,
}, },
@@ -57,7 +66,7 @@ const configVariables: ConfigVariables = {
defaultValue: "9", defaultValue: "9",
}, },
chunkSize: { chunkSize: {
type: "number", type: "filesize",
defaultValue: "10000000", defaultValue: "10000000",
secret: false, secret: false,
}, },
@@ -80,7 +89,7 @@ const configVariables: ConfigVariables = {
shareRecipientsMessage: { shareRecipientsMessage: {
type: "text", type: "text",
defaultValue: 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, view or download the files with this link: {shareUrl}\n\nThe share will expire {expires}.\n\nNote: {desc}\n\nShared securely with Pingvin Share 🐧",
}, },
reverseShareSubject: { reverseShareSubject: {
type: "string", type: "string",
@@ -178,6 +187,15 @@ const configVariables: ConfigVariables = {
adminGroups: { adminGroups: {
type: "string", type: "string",
defaultValue: "" defaultValue: ""
},
fieldNameMemberOf: {
type: "string",
defaultValue: "memberOf",
},
fieldNameEmail: {
type: "string",
defaultValue: "userPrincipalName",
} }
}, },
oauth: { oauth: {
@@ -245,6 +263,10 @@ const configVariables: ConfigVariables = {
type: "string", type: "string",
defaultValue: "", defaultValue: "",
}, },
"discord-limitedUsers": {
type: "string",
defaultValue: "",
},
"discord-clientId": { "discord-clientId": {
type: "string", type: "string",
defaultValue: "", defaultValue: "",
@@ -262,6 +284,14 @@ const configVariables: ConfigVariables = {
type: "string", type: "string",
defaultValue: "", defaultValue: "",
}, },
"oidc-signOut": {
type: "boolean",
defaultValue: "false",
},
"oidc-scope": {
type: "string",
defaultValue: "openid email profile",
},
"oidc-usernameClaim": { "oidc-usernameClaim": {
type: "string", type: "string",
defaultValue: "", defaultValue: "",
@@ -288,6 +318,65 @@ const configVariables: ConfigVariables = {
obscured: true, 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,
},
},
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,
},
}
}; };
type ConfigVariables = { type ConfigVariables = {

View File

@@ -120,7 +120,7 @@ export class AuthController {
}) })
@HttpCode(202) @HttpCode(202)
async requestResetPassword(@Param("email") email: string) { async requestResetPassword(@Param("email") email: string) {
this.authService.requestResetPassword(email); await this.authService.requestResetPassword(email);
} }
@Post("resetPassword") @Post("resetPassword")
@@ -172,13 +172,25 @@ export class AuthController {
@Req() request: Request, @Req() request: Request,
@Res({ passthrough: true }) response: Response, @Res({ passthrough: true }) response: Response,
) { ) {
await this.authService.signOut(request.cookies.access_token); const redirectURI = await this.authService.signOut(
response.cookie("access_token", "accessToken", { maxAge: -1 }); request.cookies.access_token,
);
const isSecure = this.config.get("general.secureCookies");
response.cookie("access_token", "", {
maxAge: -1,
secure: isSecure,
});
response.cookie("refresh_token", "", { response.cookie("refresh_token", "", {
path: "/api/auth/token", path: "/api/auth/token",
httpOnly: true, httpOnly: true,
maxAge: -1, maxAge: -1,
secure: isSecure,
}); });
if (typeof redirectURI === "string") {
return { redirectURI: redirectURI.toString() };
}
} }
@Post("totp/enable") @Post("totp/enable")

View File

@@ -1,4 +1,4 @@
import { Module } from "@nestjs/common"; import { forwardRef, Module } from "@nestjs/common";
import { JwtModule } from "@nestjs/jwt"; import { JwtModule } from "@nestjs/jwt";
import { EmailModule } from "src/email/email.module"; import { EmailModule } from "src/email/email.module";
import { AuthController } from "./auth.controller"; import { AuthController } from "./auth.controller";
@@ -7,6 +7,7 @@ import { AuthTotpService } from "./authTotp.service";
import { JwtStrategy } from "./strategy/jwt.strategy"; import { JwtStrategy } from "./strategy/jwt.strategy";
import { LdapService } from "./ldap.service"; import { LdapService } from "./ldap.service";
import { UserModule } from "../user/user.module"; import { UserModule } from "../user/user.module";
import { OAuthModule } from "../oauth/oauth.module";
@Module({ @Module({
imports: [ imports: [
@@ -14,10 +15,11 @@ import { UserModule } from "../user/user.module";
global: true, global: true,
}), }),
EmailModule, EmailModule,
forwardRef(() => OAuthModule),
UserModule, UserModule,
], ],
controllers: [AuthController], controllers: [AuthController],
providers: [AuthService, AuthTotpService, JwtStrategy, LdapService], providers: [AuthService, AuthTotpService, JwtStrategy, LdapService],
exports: [AuthService], exports: [AuthService],
}) })
export class AuthModule { } export class AuthModule {}

View File

@@ -1,6 +1,8 @@
import { import {
BadRequestException, BadRequestException,
ForbiddenException, ForbiddenException,
forwardRef,
Inject,
Injectable, Injectable,
Logger, Logger,
UnauthorizedException, UnauthorizedException,
@@ -14,11 +16,12 @@ import * as moment from "moment";
import { ConfigService } from "src/config/config.service"; import { ConfigService } from "src/config/config.service";
import { EmailService } from "src/email/email.service"; import { EmailService } from "src/email/email.service";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { OAuthService } from "../oauth/oauth.service";
import { GenericOidcProvider } from "../oauth/provider/genericOidc.provider";
import { UserSevice } from "../user/user.service";
import { AuthRegisterDTO } from "./dto/authRegister.dto"; import { AuthRegisterDTO } from "./dto/authRegister.dto";
import { AuthSignInDTO } from "./dto/authSignIn.dto"; import { AuthSignInDTO } from "./dto/authSignIn.dto";
import { LdapService } from "./ldap.service"; import { LdapService } from "./ldap.service";
import { inspect } from "util";
import { UserSevice } from "../user/user.service";
@Injectable() @Injectable()
export class AuthService { export class AuthService {
@@ -29,7 +32,8 @@ export class AuthService {
private emailService: EmailService, private emailService: EmailService,
private ldapService: LdapService, private ldapService: LdapService,
private userService: UserSevice, private userService: UserSevice,
) { } @Inject(forwardRef(() => OAuthService)) private oAuthService: OAuthService,
) {}
private readonly logger = new Logger(AuthService.name); private readonly logger = new Logger(AuthService.name);
async signUp(dto: AuthRegisterDTO, ip: string, isAdmin?: boolean) { async signUp(dto: AuthRegisterDTO, ip: string, isAdmin?: boolean) {
@@ -66,8 +70,9 @@ export class AuthService {
} }
async signIn(dto: AuthSignInDTO, ip: string) { async signIn(dto: AuthSignInDTO, ip: string) {
if (!dto.email && !dto.username) if (!dto.email && !dto.username) {
throw new BadRequestException("Email or username is required"); throw new BadRequestException("Email or username is required");
}
if (!this.config.get("oauth.disablePassword")) { if (!this.config.get("oauth.disablePassword")) {
const user = await this.prisma.user.findFirst({ const user = await this.prisma.user.findFirst({
@@ -76,18 +81,32 @@ export class AuthService {
}, },
}); });
if (user?.password && await argon.verify(user.password, dto.password)) { if (user?.password && (await argon.verify(user.password, dto.password))) {
this.logger.log(`Successful password login for user ${user.email} from IP ${ip}`); this.logger.log(
`Successful password login for user ${user.email} from IP ${ip}`,
);
return this.generateToken(user); return this.generateToken(user);
} }
} }
if (this.config.get("ldap.enabled")) { if (this.config.get("ldap.enabled")) {
this.logger.debug(`Trying LDAP login for user ${dto.username}`); /*
const ldapUser = await this.ldapService.authenticateUser(dto.username, dto.password); * E-mail-like user credentials are passed as the email property
* instead of the username. Since the username format does not matter
* when searching for users in LDAP, we simply use the username
* in whatever format it is provided.
*/
const ldapUsername = dto.username || dto.email;
this.logger.debug(`Trying LDAP login for user ${ldapUsername}`);
const ldapUser = await this.ldapService.authenticateUser(
ldapUsername,
dto.password,
);
if (ldapUser) { if (ldapUser) {
const user = await this.userService.findOrCreateFromLDAP(dto.username, ldapUser); const user = await this.userService.findOrCreateFromLDAP(dto, ldapUser);
this.logger.log(`Successful LDAP login for user ${user.email} from IP ${ip}`); this.logger.log(
`Successful LDAP login for user ${ldapUsername} (${user.id}) from IP ${ip}`,
);
return this.generateToken(user); return this.generateToken(user);
} }
} }
@@ -98,13 +117,10 @@ export class AuthService {
throw new UnauthorizedException("Wrong email or password"); throw new UnauthorizedException("Wrong email or password");
} }
async generateToken(user: User, isOAuth = false) { async generateToken(user: User, oauth?: { idToken?: string }) {
// TODO: Make all old loginTokens invalid when a new one is created // TODO: Make all old loginTokens invalid when a new one is created
// Check if the user has TOTP enabled // Check if the user has TOTP enabled
if ( if (user.totpVerified && !(oauth && this.config.get("oauth.ignoreTotp"))) {
user.totpVerified &&
!(isOAuth && this.config.get("oauth.ignoreTotp"))
) {
const loginToken = await this.createLoginToken(user.id); const loginToken = await this.createLoginToken(user.id);
return { loginToken }; return { loginToken };
@@ -112,6 +128,7 @@ export class AuthService {
const { refreshToken, refreshTokenId } = await this.createRefreshToken( const { refreshToken, refreshTokenId } = await this.createRefreshToken(
user.id, user.id,
oauth?.idToken,
); );
const accessToken = await this.createAccessToken(user, refreshTokenId); const accessToken = await this.createAccessToken(user, refreshTokenId);
@@ -129,6 +146,15 @@ export class AuthService {
if (!user) return; if (!user) return;
if (user.ldapDN) {
this.logger.log(
`Failed password reset request for user ${email} because it is an LDAP user`,
);
throw new BadRequestException(
"This account can't reset its password here. Please contact your administrator.",
);
}
// Delete old reset password token // Delete old reset password token
if (user.resetPasswordToken) { if (user.resetPasswordToken) {
await this.prisma.resetPasswordToken.delete({ await this.prisma.resetPasswordToken.delete({
@@ -143,7 +169,7 @@ export class AuthService {
}, },
}); });
await this.emailService.sendResetPasswordEmail(user.email, token); this.emailService.sendResetPasswordEmail(user.email, token);
} }
async resetPassword(token: string, newPassword: string) { async resetPassword(token: string, newPassword: string) {
@@ -210,12 +236,57 @@ export class AuthService {
}) || {}; }) || {};
if (refreshTokenId) { if (refreshTokenId) {
const oauthIDToken = await this.prisma.refreshToken
.findFirst({
select: { oauthIDToken: true },
where: { id: refreshTokenId },
})
.then((refreshToken) => refreshToken?.oauthIDToken)
.catch((e) => {
// Ignore error if refresh token doesn't exist
if (e.code != "P2025") throw e;
});
await this.prisma.refreshToken await this.prisma.refreshToken
.delete({ where: { id: refreshTokenId } }) .delete({ where: { id: refreshTokenId } })
.catch((e) => { .catch((e) => {
// Ignore error if refresh token doesn't exist // Ignore error if refresh token doesn't exist
if (e.code != "P2025") throw e; if (e.code != "P2025") throw e;
}); });
if (typeof oauthIDToken === "string") {
const [providerName, idTokenHint] = oauthIDToken.split(":");
const provider = this.oAuthService.availableProviders()[providerName];
let signOutFromProviderSupportedAndActivated = false;
try {
signOutFromProviderSupportedAndActivated = this.config.get(
`oauth.${providerName}-signOut`,
);
} catch (_) {
// Ignore error if the provider is not supported or if the provider sign out is not activated
}
if (
provider instanceof GenericOidcProvider &&
signOutFromProviderSupportedAndActivated
) {
const configuration = await provider.getConfiguration();
if (
configuration.frontchannel_logout_supported &&
URL.canParse(configuration.end_session_endpoint)
) {
const redirectURI = new URL(configuration.end_session_endpoint);
redirectURI.searchParams.append(
"post_logout_redirect_uri",
this.config.get("general.appUrl"),
);
redirectURI.searchParams.append("id_token_hint", idTokenHint);
redirectURI.searchParams.append(
"client_id",
this.config.get(`oauth.${providerName}-clientId`),
);
return redirectURI.toString();
}
}
}
} }
} }
@@ -234,13 +305,15 @@ export class AuthService {
); );
} }
async createRefreshToken(userId: string) { async createRefreshToken(userId: string, idToken?: string) {
const sessionDuration = this.config.get("general.sessionDuration");
const { id, token } = await this.prisma.refreshToken.create({ const { id, token } = await this.prisma.refreshToken.create({
data: { data: {
userId, userId,
expiresAt: moment() expiresAt: moment()
.add(this.config.get("general.sessionDuration"), "hours") .add(sessionDuration.value, sessionDuration.unit)
.toDate(), .toDate(),
oauthIDToken: idToken,
}, },
}); });
@@ -262,18 +335,27 @@ export class AuthService {
refreshToken?: string, refreshToken?: string,
accessToken?: string, accessToken?: string,
) { ) {
const isSecure = this.config.get("general.secureCookies");
if (accessToken) if (accessToken)
response.cookie("access_token", accessToken, { response.cookie("access_token", accessToken, {
sameSite: "lax", sameSite: "lax",
secure: isSecure,
maxAge: 1000 * 60 * 60 * 24 * 30 * 3, // 3 months 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, { response.cookie("refresh_token", refreshToken, {
path: "/api/auth/token", path: "/api/auth/token",
httpOnly: true, httpOnly: true,
sameSite: "strict", sameSite: "strict",
maxAge: 1000 * 60 * 60 * this.config.get("general.sessionDuration"), secure: isSecure,
maxAge,
}); });
}
} }
/** /**
@@ -293,4 +375,12 @@ export class AuthService {
return null; 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,9 +5,9 @@ import {
UnauthorizedException, UnauthorizedException,
} from "@nestjs/common"; } from "@nestjs/common";
import { User } from "@prisma/client"; import { User } from "@prisma/client";
import * as argon from "argon2";
import { authenticator, totp } from "otplib"; import { authenticator, totp } from "otplib";
import * as qrcode from "qrcode-svg"; import * as qrcode from "qrcode-svg";
import { ConfigService } from "src/config/config.service";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { AuthService } from "./auth.service"; import { AuthService } from "./auth.service";
import { AuthSignInTotpDTO } from "./dto/authSignInTotp.dto"; import { AuthSignInTotpDTO } from "./dto/authSignInTotp.dto";
@@ -16,6 +16,7 @@ import { AuthSignInTotpDTO } from "./dto/authSignInTotp.dto";
export class AuthTotpService { export class AuthTotpService {
constructor( constructor(
private prisma: PrismaService, private prisma: PrismaService,
private configService: ConfigService,
private authService: AuthService, private authService: AuthService,
) {} ) {}
@@ -63,7 +64,7 @@ export class AuthTotpService {
} }
async enableTotp(user: User, password: string) { async enableTotp(user: User, password: string) {
if (!(await argon.verify(user.password, password))) if (!this.authService.verifyPassword(user, password))
throw new ForbiddenException("Invalid password"); throw new ForbiddenException("Invalid password");
// Check if we have a secret already // Check if we have a secret already
@@ -76,13 +77,10 @@ export class AuthTotpService {
throw new BadRequestException("TOTP is already enabled"); throw new BadRequestException("TOTP is already enabled");
} }
const issuer = this.configService.get("general.appName");
const secret = authenticator.generateSecret(); const secret = authenticator.generateSecret();
const otpURL = totp.keyuri( const otpURL = totp.keyuri(user.username || user.email, issuer, secret);
user.username || user.email,
"pingvin-share",
secret,
);
await this.prisma.user.update({ await this.prisma.user.update({
where: { id: user.id }, where: { id: user.id },
@@ -107,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) { 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"); throw new ForbiddenException("Invalid password");
const { totpSecret } = await this.prisma.user.findUnique({ const { totpSecret } = await this.prisma.user.findUnique({
@@ -138,7 +135,7 @@ export class AuthTotpService {
} }
async disableTotp(user: User, password: string, code: string) { 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"); throw new ForbiddenException("Invalid password");
const { totpSecret } = await this.prisma.user.findUnique({ const { totpSecret } = await this.prisma.user.findUnique({

View File

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

View File

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

View File

@@ -1,154 +1,105 @@
import { Inject, Injectable, Logger } from "@nestjs/common"; import { Inject, Injectable, Logger } from "@nestjs/common";
import * as ldap from "ldapjs";
import { AttributeJson, InvalidCredentialsError, SearchCallbackResponse, SearchOptions } from "ldapjs";
import { inspect } from "node:util"; import { inspect } from "node:util";
import { ConfigService } from "../config/config.service"; import { ConfigService } from "../config/config.service";
import { Client, Entry, InvalidCredentialsError } from "ldapts";
type LdapSearchEntry = {
objectName: string,
attributes: AttributeJson[],
};
async function ldapExecuteSearch(client: ldap.Client, base: string, options: SearchOptions): Promise<LdapSearchEntry[]> {
const searchResponse = await new Promise<SearchCallbackResponse>((resolve, reject) => {
client.search(base, options, (err, res) => {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
return await new Promise<any[]>((resolve, reject) => {
const entries: LdapSearchEntry[] = [];
searchResponse.on("searchEntry", entry => entries.push({ attributes: entry.pojo.attributes, objectName: entry.pojo.objectName }));
searchResponse.once("error", reject);
searchResponse.once("end", () => resolve(entries));
});
}
async function ldapBindUser(client: ldap.Client, dn: string, password: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
client.bind(dn, password, error => {
if (error) {
reject(error);
} else {
resolve();
}
});
})
}
async function ldapCreateConnection(logger: Logger, url: string): Promise<ldap.Client> {
const ldapClient = ldap.createClient({
url: url.split(","),
connectTimeout: 10_000,
timeout: 10_000
});
await new Promise((resolve, reject) => {
ldapClient.once("error", reject);
ldapClient.on("setupError", reject);
ldapClient.on("socketTimeout", reject);
ldapClient.on("connectRefused", () => reject(new Error("connection has been refused")));
ldapClient.on("connectTimeout", () => reject(new Error("connect timed out")));
ldapClient.on("connectError", reject);
ldapClient.on("connect", resolve);
}).catch(error => {
logger.error(`Connect error: ${inspect(error)}`);
ldapClient.destroy();
throw error;
});
return ldapClient;
}
export type LdapAuthenticateResult = {
userDn: string,
attributes: Record<string, string[]>
};
@Injectable() @Injectable()
export class LdapService { export class LdapService {
private readonly logger = new Logger(LdapService.name); private readonly logger = new Logger(LdapService.name);
constructor( constructor(
@Inject(ConfigService) @Inject(ConfigService)
private readonly serviceConfig: ConfigService, private readonly serviceConfig: ConfigService,
) { } ) {}
private async createLdapConnection(): Promise<ldap.Client> { private async createLdapConnection(): Promise<Client> {
const ldapUrl = this.serviceConfig.get("ldap.url"); const ldapUrl = this.serviceConfig.get("ldap.url");
if (!ldapUrl) { if (!ldapUrl) {
throw new Error("LDAP server URL is not defined"); throw new Error("LDAP server URL is not defined");
}
const ldapClient = await ldapCreateConnection(this.logger, ldapUrl);
try {
const bindDn = this.serviceConfig.get("ldap.bindDn") || null;
if (bindDn) {
try {
await ldapBindUser(ldapClient, bindDn, this.serviceConfig.get("ldap.bindPassword"))
} catch (error) {
this.logger.warn(`Failed to bind to default user: ${error}`);
throw new Error("failed to bind to default user");
}
}
return ldapClient;
} catch (error) {
ldapClient.destroy();
throw error;
}
} }
public async authenticateUser(username: string, password: string): Promise<LdapAuthenticateResult | null> { const ldapClient = new Client({
if (!username.match(/^[a-zA-Z0-0]+$/)) { url: ldapUrl,
return null; timeout: 15_000,
} connectTimeout: 15_000,
});
const searchBase = this.serviceConfig.get("ldap.searchBase"); const bindDn = this.serviceConfig.get("ldap.bindDn") || null;
const searchQuery = this.serviceConfig.get("ldap.searchQuery") if (bindDn) {
.replaceAll("%username%", username); try {
await ldapClient.bind(
const ldapClient = await this.createLdapConnection(); bindDn,
try { this.serviceConfig.get("ldap.bindPassword"),
const [result] = await ldapExecuteSearch(ldapClient, searchBase, { );
filter: searchQuery, } catch (error) {
scope: "sub" this.logger.warn(`Failed to bind to default user: ${error}`);
}); throw new Error("failed to bind to default user");
}
if (!result) {
/* user not found */
return null;
}
try {
await ldapBindUser(ldapClient, result.objectName, password);
/*
* In theory we could query the user attributes now,
* but as we must query the user attributes for validation anyways
* we'll create a second ldap server connection.
*/
return {
userDn: result.objectName,
attributes: Object.fromEntries(result.attributes.map(attribute => [attribute.type, attribute.values])),
};
} catch (error) {
if (error instanceof InvalidCredentialsError) {
return null;
}
this.logger.warn(`LDAP user bind failure: ${inspect(error)}`);
return null;
} finally {
ldapClient.destroy();
}
} catch (error) {
this.logger.warn(`LDAP connect error: ${inspect(error)}`);
return null;
}
} }
}
return ldapClient;
}
public async authenticateUser(
username: string,
password: string,
): Promise<Entry | null> {
if (!username.match(/^[a-zA-Z0-9-_.@]+$/)) {
this.logger.verbose(
`Username ${username} does not match username pattern. Authentication failed.`,
);
return null;
}
const searchBase = this.serviceConfig.get("ldap.searchBase");
const searchQuery = this.serviceConfig
.get("ldap.searchQuery")
.replaceAll("%username%", username);
const ldapClient = await this.createLdapConnection();
try {
const { searchEntries } = await ldapClient.search(searchBase, {
filter: searchQuery,
scope: "sub",
attributes: ["*"],
returnAttributeValues: true,
});
if (searchEntries.length > 1) {
/* too many users found */
this.logger.verbose(
`Authentication for username ${username} failed. Too many users found with query ${searchQuery}`,
);
return null;
} else if (searchEntries.length == 0) {
/* user not found */
this.logger.verbose(
`Authentication for username ${username} failed. No user found with query ${searchQuery}`,
);
return null;
}
const targetEntity = searchEntries[0];
this.logger.verbose(
`Trying to authenticate ${username} against LDAP user ${targetEntity.dn}`,
);
try {
await ldapClient.bind(targetEntity.dn, password);
return targetEntity;
} catch (error) {
if (error instanceof InvalidCredentialsError) {
this.logger.verbose(
`Failed to authenticate ${username} against ${targetEntity.dn}. Invalid credentials.`,
);
return null;
}
this.logger.warn(`User bind failure: ${inspect(error)}`);
return null;
}
} catch (error) {
this.logger.warn(`Connect error: ${inspect(error)}`);
return null;
}
}
}

View File

@@ -5,8 +5,9 @@ import {
NotFoundException, NotFoundException,
} from "@nestjs/common"; } from "@nestjs/common";
import { Config } from "@prisma/client"; import { Config } from "@prisma/client";
import { PrismaService } from "src/prisma/prisma.service";
import { EventEmitter } from "events"; import { EventEmitter } from "events";
import { PrismaService } from "src/prisma/prisma.service";
import { stringToTimespan } from "src/utils/date.util";
/** /**
* ConfigService extends EventEmitter to allow listening for config updates, * ConfigService extends EventEmitter to allow listening for config updates,
@@ -30,10 +31,12 @@ export class ConfigService extends EventEmitter {
const value = configVariable.value ?? configVariable.defaultValue; 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 == "boolean") return value == "true";
if (configVariable.type == "string" || configVariable.type == "text") if (configVariable.type == "string" || configVariable.type == "text")
return value; return value;
if (configVariable.type == "timespan") return stringToTimespan(value);
} }
async getByCategory(category: string) { async getByCategory(category: string) {
@@ -93,13 +96,16 @@ export class ConfigService extends EventEmitter {
} else if ( } else if (
typeof value != configVariable.type && typeof value != configVariable.type &&
typeof value == "string" && typeof value == "string" &&
configVariable.type != "text" configVariable.type != "text" &&
configVariable.type != "timespan"
) { ) {
throw new BadRequestException( throw new BadRequestException(
`Config variable must be of type ${configVariable.type}`, `Config variable must be of type ${configVariable.type}`,
); );
} }
this.validateConfigVariable(key, value);
const updatedVariable = await this.prisma.config.update({ const updatedVariable = await this.prisma.config.update({
where: { where: {
name_category: { name_category: {
@@ -116,4 +122,25 @@ export class ConfigService extends EventEmitter {
return updatedVariable; 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);
}
}
} }

View File

@@ -1,3 +1,5 @@
import { LogLevel } from "@nestjs/common";
export const DATA_DIRECTORY = process.env.DATA_DIRECTORY || "./data"; export const DATA_DIRECTORY = process.env.DATA_DIRECTORY || "./data";
export const SHARE_DIRECTORY = `${DATA_DIRECTORY}/uploads/shares`; export const SHARE_DIRECTORY = `${DATA_DIRECTORY}/uploads/shares`;
export const DATABASE_URL = export const DATABASE_URL =
@@ -7,3 +9,7 @@ export const CLAMAV_HOST =
process.env.CLAMAV_HOST || process.env.CLAMAV_HOST ||
(process.env.NODE_ENV == "docker" ? "clamav" : "127.0.0.1"); (process.env.NODE_ENV == "docker" ? "clamav" : "127.0.0.1");
export const CLAMAV_PORT = parseInt(process.env.CLAMAV_PORT) || 3310; export const CLAMAV_PORT = parseInt(process.env.CLAMAV_PORT) || 3310;
export const LOG_LEVEL_AVAILABLE: LogLevel[] = ['verbose', 'debug', 'log', 'warn', 'error', 'fatal'];
export const LOG_LEVEL_DEFAULT: LogLevel = process.env.NODE_ENV === 'development' ? "verbose" : "log";
export const LOG_LEVEL_ENV = `${process.env.PV_LOG_LEVEL || ""}`;

View File

@@ -17,14 +17,15 @@ export class EmailService {
if (!this.config.get("smtp.enabled")) if (!this.config.get("smtp.enabled"))
throw new InternalServerErrorException("SMTP is disabled"); throw new InternalServerErrorException("SMTP is disabled");
const username = this.config.get("smtp.username");
const password = this.config.get("smtp.password");
return nodemailer.createTransport({ return nodemailer.createTransport({
host: this.config.get("smtp.host"), host: this.config.get("smtp.host"),
port: this.config.get("smtp.port"), port: this.config.get("smtp.port"),
secure: this.config.get("smtp.port") == 465, secure: this.config.get("smtp.port") == 465,
auth: { auth:
user: this.config.get("smtp.username"), username || password ? { user: username, pass: password } : undefined,
pass: this.config.get("smtp.password"),
},
tls: { tls: {
rejectUnauthorized: !this.config.get( rejectUnauthorized: !this.config.get(
"smtp.allowUnauthorizedCertificates", "smtp.allowUnauthorizedCertificates",
@@ -68,6 +69,7 @@ export class EmailService {
.get("email.shareRecipientsMessage") .get("email.shareRecipientsMessage")
.replaceAll("\\n", "\n") .replaceAll("\\n", "\n")
.replaceAll("{creator}", creator?.username ?? "Someone") .replaceAll("{creator}", creator?.username ?? "Someone")
.replaceAll("{creatorEmail}", creator?.email ?? "")
.replaceAll("{shareUrl}", shareUrl) .replaceAll("{shareUrl}", shareUrl)
.replaceAll("{desc}", description ?? "No description") .replaceAll("{desc}", description ?? "No description")
.replaceAll( .replaceAll(

View File

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

View File

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

View File

@@ -1,149 +1,88 @@
import { import { Injectable } from "@nestjs/common";
BadRequestException, import { LocalFileService } from "./local.service";
HttpException, import { S3FileService } from "./s3.service";
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 { ConfigService } from "src/config/config.service"; import { ConfigService } from "src/config/config.service";
import { PrismaService } from "src/prisma/prisma.service"; import { Readable } from "stream";
import { SHARE_DIRECTORY } from "../constants"; import { PrismaService } from "../prisma/prisma.service";
@Injectable() @Injectable()
export class FileService { export class FileService {
constructor( constructor(
private prisma: PrismaService, private prisma: PrismaService,
private jwtService: JwtService, private localFileService: LocalFileService,
private config: ConfigService, 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( async create(
data: string, data: string,
chunk: { index: number; total: number }, chunk: { index: number; total: number },
file: { id?: string; name: string }, file: {
id?: string;
name: string;
},
shareId: string, shareId: string,
) { ) {
if (!file.id) file.id = crypto.randomUUID(); const storageService = this.getStorageService();
return storageService.create(data, chunk, file, shareId);
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;
} }
async get(shareId: string, fileId: string) { async get(shareId: string, fileId: string): Promise<File> {
const fileMetaData = await this.prisma.file.findUnique({ const share = await this.prisma.share.findFirst({
where: { id: fileId }, where: { id: shareId },
}); });
const storageService = this.getStorageService(share.storageProvider);
if (!fileMetaData) throw new NotFoundException("File not found"); return storageService.get(shareId, fileId);
const file = fs.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) { async remove(shareId: string, fileId: string) {
const fileMetaData = await this.prisma.file.findUnique({ const storageService = this.getStorageService();
where: { id: fileId }, return storageService.remove(shareId, fileId);
});
if (!fileMetaData) throw new NotFoundException("File not found");
fs.unlinkSync(`${SHARE_DIRECTORY}/${shareId}/${fileId}`);
await this.prisma.file.delete({ where: { id: fileId } });
} }
async deleteAllFiles(shareId: string) { async deleteAllFiles(shareId: string) {
await fs.promises.rm(`${SHARE_DIRECTORY}/${shareId}`, { const storageService = this.getStorageService();
recursive: true, return storageService.deleteAllFiles(shareId);
force: true,
});
} }
getZip(shareId: string) { getZip(shareId: string) {
return fs.createReadStream(`${SHARE_DIRECTORY}/${shareId}/archive.zip`); const storageService = this.getStorageService();
return storageService.getZip(shareId) as Readable;
}
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,161 @@
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";
@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,
});
}
getZip(shareId: string) {
return createReadStream(`${SHARE_DIRECTORY}/${shareId}/archive.zip`);
}
}

View File

@@ -0,0 +1,299 @@
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";
@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 {
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,
});
}
getZip() {
throw new BadRequestException(
"ZIP download is not supported with S3 storage",
);
}
getS3Path(): string {
const configS3Path = this.config.get("s3.bucketPath");
return configS3Path ? `${configS3Path}/` : "";
}
}

View File

@@ -1,6 +1,7 @@
import { import {
ClassSerializerInterceptor, ClassSerializerInterceptor,
Logger, Logger,
LogLevel,
ValidationPipe, ValidationPipe,
} from "@nestjs/common"; } from "@nestjs/common";
import { NestFactory, Reflector } from "@nestjs/core"; import { NestFactory, Reflector } from "@nestjs/core";
@@ -12,10 +13,35 @@ import { NextFunction, Request, Response } from "express";
import * as fs from "fs"; import * as fs from "fs";
import { AppModule } from "./app.module"; import { AppModule } from "./app.module";
import { ConfigService } from "./config/config.service"; import { ConfigService } from "./config/config.service";
import { DATA_DIRECTORY } from "./constants"; import {
DATA_DIRECTORY,
LOG_LEVEL_AVAILABLE,
LOG_LEVEL_DEFAULT,
LOG_LEVEL_ENV,
} from "./constants";
function generateNestJsLogLevels(): LogLevel[] {
if (LOG_LEVEL_ENV) {
const levelIndex = LOG_LEVEL_AVAILABLE.indexOf(LOG_LEVEL_ENV as any);
if (levelIndex === -1) {
throw new Error(`log level ${LOG_LEVEL_ENV} unknown`);
}
return LOG_LEVEL_AVAILABLE.slice(levelIndex, LOG_LEVEL_AVAILABLE.length);
} else {
const levelIndex = LOG_LEVEL_AVAILABLE.indexOf(LOG_LEVEL_DEFAULT);
return LOG_LEVEL_AVAILABLE.slice(levelIndex, LOG_LEVEL_AVAILABLE.length);
}
}
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule); const logLevels = generateNestJsLogLevels();
Logger.log(`Showing ${logLevels.join(", ")} messages`);
const app = await NestFactory.create<NestExpressApplication>(AppModule, {
logger: logLevels,
});
app.useGlobalPipes(new ValidationPipe({ whitelist: true })); app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector))); app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
@@ -48,7 +74,9 @@ async function bootstrap() {
SwaggerModule.setup("api/swagger", app, document); SwaggerModule.setup("api/swagger", app, document);
} }
await app.listen(parseInt(process.env.PORT) || 8080); await app.listen(
parseInt(process.env.BACKEND_PORT || process.env.PORT || "8080"),
);
const logger = new Logger("UnhandledAsyncError"); const logger = new Logger("UnhandledAsyncError");
process.on("unhandledRejection", (e) => logger.error(e)); process.on("unhandledRejection", (e) => logger.error(e));

View File

@@ -4,4 +4,5 @@ export interface OAuthSignInDto {
providerUsername: string; providerUsername: string;
email: string; email: string;
isAdmin?: boolean; isAdmin?: boolean;
idToken?: string;
} }

View File

@@ -1,4 +1,4 @@
import { Module } from "@nestjs/common"; import { forwardRef, Module } from "@nestjs/common";
import { OAuthController } from "./oauth.controller"; import { OAuthController } from "./oauth.controller";
import { OAuthService } from "./oauth.service"; import { OAuthService } from "./oauth.service";
import { AuthModule } from "../auth/auth.module"; import { AuthModule } from "../auth/auth.module";
@@ -51,6 +51,7 @@ import { MicrosoftProvider } from "./provider/microsoft.provider";
inject: ["OAUTH_PROVIDERS"], inject: ["OAUTH_PROVIDERS"],
}, },
], ],
imports: [AuthModule], imports: [forwardRef(() => AuthModule)],
exports: [OAuthService],
}) })
export class OAuthModule {} export class OAuthModule {}

View File

@@ -1,4 +1,4 @@
import { Inject, Injectable, Logger } from "@nestjs/common"; import { forwardRef, Inject, Injectable, Logger } from "@nestjs/common";
import { User } from "@prisma/client"; import { User } from "@prisma/client";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import { AuthService } from "../auth/auth.service"; import { AuthService } from "../auth/auth.service";
@@ -6,14 +6,17 @@ import { ConfigService } from "../config/config.service";
import { PrismaService } from "../prisma/prisma.service"; import { PrismaService } from "../prisma/prisma.service";
import { OAuthSignInDto } from "./dto/oauthSignIn.dto"; import { OAuthSignInDto } from "./dto/oauthSignIn.dto";
import { ErrorPageException } from "./exceptions/errorPage.exception"; import { ErrorPageException } from "./exceptions/errorPage.exception";
import { OAuthProvider } from "./provider/oauthProvider.interface";
@Injectable() @Injectable()
export class OAuthService { export class OAuthService {
constructor( constructor(
private prisma: PrismaService, private prisma: PrismaService,
private config: ConfigService, private config: ConfigService,
private auth: AuthService, @Inject(forwardRef(() => AuthService)) private auth: AuthService,
@Inject("OAUTH_PLATFORMS") private platforms: string[], @Inject("OAUTH_PLATFORMS") private platforms: string[],
@Inject("OAUTH_PROVIDERS")
private oAuthProviders: Record<string, OAuthProvider<unknown>>,
) {} ) {}
private readonly logger = new Logger(OAuthService.name); private readonly logger = new Logger(OAuthService.name);
@@ -27,6 +30,18 @@ export class OAuthService {
.map(([platform, _]) => platform); .map(([platform, _]) => platform);
} }
availableProviders(): Record<string, OAuthProvider<unknown>> {
return Object.fromEntries(
Object.entries(this.oAuthProviders)
.map(([providerName, provider]) => [
[providerName, provider],
this.config.get(`oauth.${providerName}-enabled`),
])
.filter(([_, enabled]) => enabled)
.map(([provider, _]) => provider),
);
}
async status(user: User) { async status(user: User) {
const oauthUsers = await this.prisma.oAuthUser.findMany({ const oauthUsers = await this.prisma.oAuthUser.findMany({
select: { select: {
@@ -51,11 +66,11 @@ export class OAuthService {
await this.updateIsAdmin(user); await this.updateIsAdmin(user);
const updatedUser = await this.prisma.user.findFirst({ const updatedUser = await this.prisma.user.findFirst({
where: { where: {
email: user.email, id: oauthUser.userId,
}, },
}); });
this.logger.log(`Successful login for user ${user.email} from IP ${ip}`); this.logger.log(`Successful login for user ${user.email} from IP ${ip}`);
return this.auth.generateToken(updatedUser, true); return this.auth.generateToken(updatedUser, { idToken: user.idToken });
} }
return this.signUp(user, ip); return this.signUp(user, ip);
@@ -108,8 +123,10 @@ export class OAuthService {
} }
private async getAvailableUsername(preferredUsername: string) { private async getAvailableUsername(preferredUsername: string) {
// only remove + and - from preferred username for now (maybe not enough) // Only keep letters, numbers, dots, and underscores. Truncate to 20 characters.
let username = preferredUsername.replace(/[+-]/g, "").substring(0, 20); let username = preferredUsername
.replace(/[^a-zA-Z0-9._]/g, "")
.substring(0, 20);
while (true) { while (true) {
const user = await this.prisma.user.findFirst({ const user = await this.prisma.user.findFirst({
where: { where: {
@@ -154,7 +171,7 @@ export class OAuthService {
}, },
}); });
await this.updateIsAdmin(user); await this.updateIsAdmin(user);
return this.auth.generateToken(existingUser, true); return this.auth.generateToken(existingUser, { idToken: user.idToken });
} }
const result = await this.auth.signUp( const result = await this.auth.signUp(

View File

@@ -81,12 +81,17 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
if (guild) { if (guild) {
await this.checkLimitedGuild(token, guild); await this.checkLimitedGuild(token, guild);
} }
const limitedUsers = this.config.get("oauth.discord-limitedUsers");
if (limitedUsers) {
await this.checkLimitedUsers(user, limitedUsers);
}
return { return {
provider: "discord", provider: "discord",
providerId: user.id, providerId: user.id,
providerUsername: user.global_name ?? user.username, providerUsername: user.global_name ?? user.username,
email: user.email, email: user.email,
idToken: `discord:${token.idToken}`,
}; };
} }
@@ -107,6 +112,12 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
throw new ErrorPageException("user_not_allowed"); throw new ErrorPageException("user_not_allowed");
} }
} }
async checkLimitedUsers(user: DiscordUser, userIds: string) {
if (!userIds.split(",").includes(user.id)) {
throw new ErrorPageException("user_not_allowed");
}
}
} }
export interface DiscordToken { export interface DiscordToken {

View File

@@ -1,13 +1,13 @@
import { Logger } from "@nestjs/common"; import { InternalServerErrorException, Logger } from "@nestjs/common";
import { ConfigService } from "../../config/config.service";
import { JwtService } from "@nestjs/jwt"; import { JwtService } from "@nestjs/jwt";
import { Cache } from "cache-manager"; import { Cache } from "cache-manager";
import * as jmespath from "jmespath"; import * as jmespath from "jmespath";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import { ConfigService } from "../../config/config.service";
import { OAuthCallbackDto } from "../dto/oauthCallback.dto"; import { OAuthCallbackDto } from "../dto/oauthCallback.dto";
import { OAuthProvider, OAuthToken } from "./oauthProvider.interface";
import { OAuthSignInDto } from "../dto/oauthSignIn.dto"; import { OAuthSignInDto } from "../dto/oauthSignIn.dto";
import { ErrorPageException } from "../exceptions/errorPage.exception"; import { ErrorPageException } from "../exceptions/errorPage.exception";
import { OAuthProvider, OAuthToken } from "./oauthProvider.interface";
export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> { export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
protected discoveryUri: string; protected discoveryUri: string;
@@ -70,7 +70,10 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
new URLSearchParams({ new URLSearchParams({
client_id: this.config.get(`oauth.${this.name}-clientId`), client_id: this.config.get(`oauth.${this.name}-clientId`),
response_type: "code", response_type: "code",
scope: "openid profile email", scope:
this.name == "oidc"
? this.config.get(`oauth.oidc-scope`)
: "openid email profile",
redirect_uri: this.getRedirectUri(), redirect_uri: this.getRedirectUri(),
state, state,
nonce, nonce,
@@ -116,7 +119,13 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
}, },
): Promise<OAuthSignInDto> { ): Promise<OAuthSignInDto> {
const idTokenData = this.decodeIdToken(token.idToken); const idTokenData = this.decodeIdToken(token.idToken);
// maybe it's not necessary to verify the id token since it's directly obtained from the provider
if (!idTokenData) {
this.logger.error(
`Can not get ID Token from response ${JSON.stringify(token.rawToken, undefined, 2)}`,
);
throw new InternalServerErrorException();
}
const key = `oauth-${this.name}-nonce-${query.state}`; const key = `oauth-${this.name}-nonce-${query.state}`;
const nonce = await this.cache.get(key); const nonce = await this.cache.get(key);
@@ -191,6 +200,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
providerId: idTokenData.sub, providerId: idTokenData.sub,
providerUsername: username, providerUsername: username,
...(isAdmin !== undefined && { isAdmin }), ...(isAdmin !== undefined && { isAdmin }),
idToken: `${this.name}:${token.idToken}`,
}; };
} }
@@ -245,6 +255,8 @@ export interface OidcConfiguration {
id_token_signing_alg_values_supported: string[]; id_token_signing_alg_values_supported: string[];
scopes_supported?: string[]; scopes_supported?: string[];
claims_supported?: string[]; claims_supported?: string[];
frontchannel_logout_supported?: boolean;
end_session_endpoint?: string;
} }
export interface OidcJwk { export interface OidcJwk {

View File

@@ -61,6 +61,7 @@ export class GitHubProvider implements OAuthProvider<GitHubToken> {
providerId: user.id.toString(), providerId: user.id.toString(),
providerUsername: user.name ?? user.login, providerUsername: user.name ?? user.login,
email, email,
idToken: `github:${token.idToken}`,
}; };
} }

View File

@@ -1,9 +1,11 @@
import { Injectable } from "@nestjs/common"; import { Injectable, Logger } from "@nestjs/common";
import { PrismaClient } from "@prisma/client"; import { PrismaClient } from "@prisma/client";
import { DATABASE_URL } from "../constants"; import { DATABASE_URL } from "../constants";
@Injectable() @Injectable()
export class PrismaService extends PrismaClient { export class PrismaService extends PrismaClient {
private readonly logger = new Logger(PrismaService.name);
constructor() { constructor() {
super({ super({
datasources: { datasources: {
@@ -12,6 +14,6 @@ export class PrismaService extends PrismaClient {
}, },
}, },
}); });
super.$connect().then(() => console.info("Connected to the database")); super.$connect().then(() => this.logger.log("Connected to the database"));
} }
} }

View File

@@ -26,10 +26,11 @@ export class ReverseShareService {
.toDate(); .toDate();
const parsedExpiration = parseRelativeDateToAbsolute(data.shareExpiration); const parsedExpiration = parseRelativeDateToAbsolute(data.shareExpiration);
const maxExpiration = this.config.get("share.maxExpiration");
if ( if (
this.config.get("share.maxExpiration") !== 0 && maxExpiration.value !== 0 &&
parsedExpiration > parsedExpiration >
moment().add(this.config.get("share.maxExpiration"), "hours").toDate() moment().add(maxExpiration.value, maxExpiration.unit).toDate()
) { ) {
throw new BadRequestException( throw new BadRequestException(
"Expiration date exceeds maximum expiration date", "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 { ShareDTO } from "./share.dto";
import { FileDTO } from "../../file/dto/file.dto"; import { FileDTO } from "../../file/dto/file.dto";
import { OmitType } from "@nestjs/swagger"; import { OmitType } from "@nestjs/swagger";
import { MyShareSecurityDTO } from "./myShareSecurity.dto";
export class MyShareDTO extends OmitType(ShareDTO, [ export class MyShareDTO extends OmitType(ShareDTO, [
"files", "files",
@@ -21,6 +22,9 @@ export class MyShareDTO extends OmitType(ShareDTO, [
@Type(() => OmitType(FileDTO, ["share", "from"] as const)) @Type(() => OmitType(FileDTO, ["share", "from"] as const))
files: Omit<FileDTO, "share" | "from">[]; files: Omit<FileDTO, "share" | "from">[];
@Expose()
security?: MyShareSecurityDTO;
from(partial: Partial<MyShareDTO>) { from(partial: Partial<MyShareDTO>) {
return plainToClass(MyShareDTO, partial, { excludeExtraneousValues: true }); 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 { export class ShareService {
constructor( constructor(
private prisma: PrismaService, private prisma: PrismaService,
private configService: ConfigService,
private fileService: FileService, private fileService: FileService,
private emailService: EmailService, private emailService: EmailService,
private config: ConfigService, private config: ConfigService,
@@ -55,13 +56,12 @@ export class ShareService {
const expiresNever = moment(0).toDate() == parsedExpiration; const expiresNever = moment(0).toDate() == parsedExpiration;
const maxExpiration = this.config.get("share.maxExpiration");
if ( if (
this.config.get("share.maxExpiration") !== 0 && maxExpiration.value !== 0 &&
(expiresNever || (expiresNever ||
parsedExpiration > parsedExpiration >
moment() moment().add(maxExpiration.value, maxExpiration.unit).toDate())
.add(this.config.get("share.maxExpiration"), "hours")
.toDate())
) { ) {
throw new BadRequestException( throw new BadRequestException(
"Expiration date exceeds maximum expiration date", "Expiration date exceeds maximum expiration date",
@@ -86,6 +86,7 @@ export class ShareService {
? share.recipients.map((email) => ({ email })) ? share.recipients.map((email) => ({ email }))
: [], : [],
}, },
storageProvider: this.configService.get("s3.enabled") ? "S3" : "LOCAL",
}, },
}); });
@@ -105,6 +106,8 @@ export class ShareService {
} }
async createZip(shareId: string) { async createZip(shareId: string) {
if (this.config.get("s3.enabled")) return;
const path = `${SHARE_DIRECTORY}/${shareId}`; const path = `${SHARE_DIRECTORY}/${shareId}`;
const files = await this.prisma.file.findMany({ where: { shareId } }); const files = await this.prisma.file.findMany({ where: { shareId } });
@@ -229,7 +232,7 @@ export class ShareService {
orderBy: { orderBy: {
expiration: "desc", expiration: "desc",
}, },
include: { recipients: true, files: true }, include: { recipients: true, files: true, security: true },
}); });
return shares.map((share) => { return shares.map((share) => {
@@ -237,6 +240,10 @@ export class ShareService {
...share, ...share,
size: share.files.reduce((acc, file) => acc + parseInt(file.size), 0), size: share.files.reduce((acc, file) => acc + parseInt(file.size), 0),
recipients: share.recipients.map((recipients) => recipients.email), recipients: share.recipients.map((recipients) => recipients.email),
security: {
maxViews: share.security?.maxViews,
passwordProtected: !!share.security?.password,
},
}; };
}); });
} }
@@ -315,11 +322,21 @@ export class ShareService {
}, },
}); });
if ( if (share?.security?.password) {
share?.security?.password && if (!password) {
!(await argon.verify(share.security.password, password)) throw new ForbiddenException(
) { "This share is password protected",
throw new ForbiddenException("Wrong password", "wrong_password"); "share_password_required",
);
}
const isPasswordValid = await argon.verify(
share.security.password,
password,
);
if (!isPasswordValid) {
throw new ForbiddenException("Wrong password", "wrong_password");
}
} }
if (share.security?.maxViews && share.security.maxViews <= share.views) { if (share.security?.maxViews && share.security.maxViews <= share.views) {
@@ -335,12 +352,13 @@ export class ShareService {
} }
async generateShareToken(shareId: string) { async generateShareToken(shareId: string) {
const { expiration } = await this.prisma.share.findUnique({ const { expiration, createdAt } = await this.prisma.share.findUnique({
where: { id: shareId }, where: { id: shareId },
}); });
const tokenPayload = { const tokenPayload = {
shareId, shareId,
shareCreatedAt: moment(createdAt).unix(),
iat: moment().unix(), iat: moment().unix(),
}; };
@@ -356,7 +374,7 @@ export class ShareService {
} }
async verifyShareToken(shareId: string, token: string) { async verifyShareToken(shareId: string, token: string) {
const { expiration } = await this.prisma.share.findUnique({ const { expiration, createdAt } = await this.prisma.share.findUnique({
where: { id: shareId }, where: { id: shareId },
}); });
@@ -367,7 +385,10 @@ export class ShareService {
ignoreExpiration: moment(expiration).isSame(0), ignoreExpiration: moment(expiration).isSame(0),
}); });
return claims.shareId == shareId; return (
claims.shareId == shareId &&
claims.shareCreatedAt == moment(createdAt).unix()
);
} catch { } catch {
return false; return false;
} }

View File

@@ -34,7 +34,9 @@ export class UserDTO {
totpVerified: boolean; totpVerified: boolean;
from(partial: Partial<UserDTO>) { from(partial: Partial<UserDTO>) {
const result = plainToClass(UserDTO, partial, { excludeExtraneousValues: true }); const result = plainToClass(UserDTO, partial, {
excludeExtraneousValues: true,
});
result.isLdap = partial.ldapDN?.length > 0; result.isLdap = partial.ldapDN?.length > 0;
return result; return result;
} }

View File

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

View File

@@ -8,6 +8,6 @@ import { FileModule } from "src/file/file.module";
imports: [EmailModule, FileModule], imports: [EmailModule, FileModule],
providers: [UserSevice], providers: [UserSevice],
controllers: [UserController], controllers: [UserController],
exports: [UserSevice] exports: [UserSevice],
}) })
export class UserModule { } export class UserModule {}

View File

@@ -1,23 +1,27 @@
import { BadRequestException, Injectable } from "@nestjs/common"; import { BadRequestException, Injectable, Logger } from "@nestjs/common";
import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library"; import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library";
import * as argon from "argon2"; import * as argon from "argon2";
import * as crypto from "crypto"; 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 { EmailService } from "src/email/email.service";
import { PrismaService } from "src/prisma/prisma.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 { FileService } from "../file/file.service";
import { CreateUserDTO } from "./dto/createUser.dto"; import { CreateUserDTO } from "./dto/createUser.dto";
import { UpdateUserDto } from "./dto/updateUser.dto"; import { UpdateUserDto } from "./dto/updateUser.dto";
import { ConfigService } from "../config/config.service";
import { LdapAuthenticateResult } from "../auth/ldap.service";
@Injectable() @Injectable()
export class UserSevice { export class UserSevice {
private readonly logger = new Logger(UserSevice.name);
constructor( constructor(
private prisma: PrismaService, private prisma: PrismaService,
private emailService: EmailService, private emailService: EmailService,
private fileService: FileService, private fileService: FileService,
private configService: ConfigService, private configService: ConfigService,
) { } ) {}
async list() { async list() {
return await this.prisma.user.findMany(); return await this.prisma.user.findMany();
@@ -85,6 +89,16 @@ export class UserSevice {
}); });
if (!user) throw new BadRequestException("User not found"); 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( await Promise.all(
user.shares.map((share) => this.fileService.deleteAllFiles(share.id)), user.shares.map((share) => this.fileService.deleteAllFiles(share.id)),
); );
@@ -92,31 +106,114 @@ export class UserSevice {
return await this.prisma.user.delete({ where: { id } }); return await this.prisma.user.delete({ where: { id } });
} }
async findOrCreateFromLDAP(username: string, ldap: LdapAuthenticateResult) { async findOrCreateFromLDAP(
const passwordHash = await argon.hash(crypto.randomUUID()); providedCredentials: AuthSignInDTO,
const userEmail = ldap.attributes["userPrincipalName"]?.at(0) ?? `${crypto.randomUUID()}@ldap.local`; ldapEntry: Entry,
const adminGroup = this.configService.get("ldap.adminGroups"); ) {
const isAdmin = ldap.attributes["memberOf"]?.includes(adminGroup) ?? false; const fieldNameMemberOf = this.configService.get("ldap.fieldNameMemberOf");
const fieldNameEmail = this.configService.get("ldap.fieldNameEmail");
let isAdmin = false;
if (fieldNameMemberOf in ldapEntry) {
const adminGroup = this.configService.get("ldap.adminGroups");
const entryGroups = Array.isArray(ldapEntry[fieldNameMemberOf])
? ldapEntry[fieldNameMemberOf]
: [ldapEntry[fieldNameMemberOf]];
isAdmin = entryGroups.includes(adminGroup) ?? false;
} else {
this.logger.warn(
`Trying to create/update a ldap user but the member field ${fieldNameMemberOf} is not present.`,
);
}
let userEmail: string | null = null;
if (fieldNameEmail in ldapEntry) {
const value = Array.isArray(ldapEntry[fieldNameEmail])
? ldapEntry[fieldNameEmail][0]
: ldapEntry[fieldNameEmail];
if (value) {
userEmail = value.toString();
}
} else {
this.logger.warn(
`Trying to create/update a ldap user but the email field ${fieldNameEmail} is not present.`,
);
}
if (providedCredentials.email) {
/* if LDAP does not provides an users email address, take the user provided email address instead */
userEmail = providedCredentials.email;
}
const randomId = crypto.randomUUID();
const placeholderUsername = `ldap_user_${randomId}`;
const placeholderEMail = `${randomId}@ldap.local`;
try { try {
return await this.prisma.user.upsert({ const user = await this.prisma.user.upsert({
create: { create: {
username, username: providedCredentials.username ?? placeholderUsername,
email: userEmail, email: userEmail ?? placeholderEMail,
password: passwordHash, password: await argon.hash(crypto.randomUUID()),
isAdmin,
ldapDN: ldap.userDn,
},
update: {
username,
email: userEmail,
isAdmin, isAdmin,
ldapDN: ldap.userDn, ldapDN: ldapEntry.dn,
},
update: {
isAdmin,
ldapDN: ldapEntry.dn,
}, },
where: { where: {
ldapDN: ldap.userDn ldapDN: ldapEntry.dn,
} },
}); });
if (user.username === placeholderUsername) {
/* Give the user a human readable name if the user has been created with a placeholder username */
await this.prisma.user
.update({
where: {
id: user.id,
},
data: {
username: `user_${user.id}`,
},
})
.then((newUser) => {
user.username = newUser.username;
})
.catch((error) => {
this.logger.warn(
`Failed to update users ${user.id} placeholder username: ${inspect(error)}`,
);
});
}
if (userEmail && userEmail !== user.email) {
/* Sync users email if it has changed */
await this.prisma.user
.update({
where: {
id: user.id,
},
data: {
email: userEmail,
},
})
.then((newUser) => {
this.logger.log(
`Updated users ${user.id} email from ldap from ${user.email} to ${userEmail}.`,
);
user.email = newUser.email;
})
.catch((error) => {
this.logger.error(
`Failed to update users ${user.id} email to ${userEmail}: ${inspect(error)}`,
);
});
}
return user;
} catch (e) { } catch (e) {
if (e instanceof PrismaClientKnownRequestError) { if (e instanceof PrismaClientKnownRequestError) {
if (e.code == "P2002") { if (e.code == "P2002") {

View File

@@ -10,3 +10,20 @@ export function parseRelativeDateToAbsolute(relativeDate: string) {
) )
.toDate(); .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}`;
}

View File

@@ -1,18 +1,14 @@
services: services:
pingvin-share: pingvin-share:
image: stonith404/pingvin-share image: stonith404/pingvin-share # or ghcr.io/stonith404/pingvin-share
restart: unless-stopped restart: unless-stopped
ports: ports:
- 3000:3000 - 3000:3000
environment:
- TRUST_PROXY=false # Set to true if a reverse proxy is in front of the container
volumes: volumes:
- "./data:/opt/app/backend/data" - "./data:/opt/app/backend/data"
- "./data/images:/opt/app/frontend/public/img" - "./data/images:/opt/app/frontend/public/img"
# Optional: If you add ClamAV, uncomment the following to have ClamAV start first.
# depends_on: # To add ClamAV, to scan your shares for malicious files,
# clamav: # see https://stonith404.github.io/pingvin-share/setup/integrations/#clamav-docker-only
# condition: service_healthy
# Optional: Add ClamAV (see README.md)
# ClamAV is currently only available for AMD64 see https://github.com/Cisco-Talos/clamav/issues/482
# clamav:
# restart: unless-stopped
# image: clamav/clamav

View File

@@ -4,25 +4,55 @@ id: configuration
# Configuration # Configuration
You can customize Pingvin Share like changing your domain by going to the configuration page in your admin dashboard `/admin/config`. You can customize Pingvin Share by going to the configuration page in your admin dashboard `/admin/config`.
#### Environment variables ## General
The **General** Tab will let you customize your Pingvin Share instance to your liking.
### App name
To change the name of your instance, insert any text into `App name`.
### App URL
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://`.
### 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.
---
### Environment variables
For installation specific configuration, you can use environment variables. The following variables are available: For installation specific configuration, you can use environment variables. The following variables are available:
##### Backend #### Backend
| Variable | Default Value | Description | | Variable | Default Value | Description |
| ---------------- | -------------------------------------------------- | -------------------------------------- | | ---------------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `PORT` | `8080` | The port on which the backend listens. | | `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. | | `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. | | `DATA_DIRECTORY` | `./data` | The directory where data is stored. |
| `CLAMAV_HOST` | `127.0.0.1` | The IP address of the ClamAV server. | | `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. | | `CLAMAV_PORT` | `3310` | The port number of the ClamAV server. |
##### Frontend #### Frontend
| Variable | Default Value | Description | | Variable | Default Value | Description |
| --------- | ----------------------- | ---------------------------------------- | | --------- | ----------------------- | ---------------------------------------- |
| `PORT` | `3000` | The port on which the frontend listens. | | `PORT` | `3000` | The port on which the frontend listens. |
| `API_URL` | `http://localhost:8080` | The URL of the backend for the frontend. | | `API_URL` | `http://localhost:8080` | The URL of the backend for the frontend. |
#### Docker specific
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. |
| `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

@@ -11,6 +11,16 @@ id: installation
The website is now listening on `http://localhost:3000`, have fun with Pingvin Share 🐧! The website is now listening on `http://localhost:3000`, have fun with Pingvin Share 🐧!
### Installation with Portainer
1. In the **Stacks** menu, click the **Add stack** button
2. Give you stack a name (ex. pingvinshare)
3. In the web editor, paste the content of the [docker-compose](https://github.com/stonith404/pingvin-share/blob/main/docker-compose.yml) file.
4. Edit the external port and the environment variables (optional).
5. Click on **Deploy the stack**.
Your container is now listening on `http://localhost:<externalport>`, have fun with Pingvin Share 🐧!
### Stand-alone Installation ### Stand-alone Installation
Required tools: Required tools:
@@ -37,9 +47,9 @@ cd ../frontend
npm install npm install
npm run build npm run build
API_URL=http://localhost:8080 # Set the URL of the backend, default: http://localhost:8080 API_URL=http://localhost:8080 # Set the URL of the backend, default: http://localhost:8080
pm2 start --name="pingvin-share-frontend" .next/standalone/server.js pm2 start npm --name "pingvin-share-frontend" -- run start
``` ```
**Uploading Large Files**: By default, Pingvin Share uses a built-in reverse proxy to reduce the installation steps. However, this reverse proxy is not optimized for uploading large files. If you wish to upload larger files, you can either use the Docker installation or set up your own reverse proxy. An example configuration for Caddy can be found in `./Caddyfile`. **Uploading Large Files**: By default, Pingvin Share uses a built-in reverse proxy to reduce the installation steps. However, this reverse proxy is not optimized for uploading large files. If you wish to upload larger files, you can either use the Docker installation or set up your own reverse proxy. An example configuration for Caddy can be found in `./reverse-proxy/Caddyfile`.
The website is now listening on `http://localhost:3000`, have fun with Pingvin Share 🐧! The website is now listening on `http://localhost:3000`, have fun with Pingvin Share 🐧!

View File

@@ -4,12 +4,39 @@ id: integrations
# Integrations # Integrations
#### ClamAV (Docker only) ## ClamAV
ClamAV is used to scan shares for malicious files and remove them if found. ClamAV is used to scan shares for malicious files and remove them if found.
1. Add the ClamAV container to the Docker Compose stack (see `docker-compose.yml`) and start the container. Please note that ClamAV needs a lot of [ressources](https://docs.clamav.net/manual/Installing/Docker.html#memory-ram-requirements).
### Docker
If you are already running ClamAV elsewhere, you can specify the `CLAMAV_HOST` environment variable to point to that instance.
Else you have to add the ClamAV container to the Pingvin Share Docker Compose stack:
1. Add the ClamAV container to the Docker Compose stack and start the container.
```diff
services:
pingvin-share:
image: stonith404/pingvin-share
...
+ depends_on:
+ clamav:
+ condition: service_healthy
+ clamav:
+ restart: unless-stopped
+ image: clamav/clamav
```
2. Docker will wait for ClamAV to start before starting Pingvin Share. This may take a minute or two. 2. Docker will wait for ClamAV to start before starting Pingvin Share. This may take a minute or two.
3. The Pingvin Share logs should now log "ClamAV is active" 3. The Pingvin Share logs should now log "ClamAV is active"
Please note that ClamAV needs a lot of [ressources](https://docs.clamav.net/manual/Installing/Docker.html#memory-ram-requirements). ### Stand-Alone
1. Install ClamAV
2. Specify the `CLAMAV_HOST` environment variable for the backend and restart the Pingvin Share backend.

View File

@@ -40,9 +40,11 @@ Redirect URL: `https://<your-domain>/api/oauth/callback/discord`
### OpenID Connect ### OpenID Connect
Generic OpenID Connect provider is also supported, we have tested it on Keycloak, Authentik and Casdoor. Generic OpenID Connect provider is also supported, we have tested it on Keycloak, Authentik, Casdoor and [Pocket ID](https://github.com/stonith404/pocket-id).
Redirect URL: `https://<your-domain>/api/oauth/callback/oidc` Redirect URI: `https://<your-domain>/api/oauth/callback/oidc`
Post Logout Redirect URI: `https://<your-domain>`
## Custom your OAuth 2 Provider ## Custom your OAuth 2 Provider
@@ -50,7 +52,7 @@ If our built-in providers don't meet your needs, you can create your own OAuth 2
### 1. Create config ### 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 ```ts
const configVariables: ConfigVariables = { const configVariables: ConfigVariables = {
@@ -78,9 +80,9 @@ const configVariables: ConfigVariables = {
#### Generic OpenID Connect #### 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: Here are some discovery URIs for popular providers:
@@ -94,13 +96,13 @@ Here are some discovery URIs for popular providers:
#### OAuth 2 #### 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 ### 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 ```ts
@Module({ @Module({
@@ -140,7 +142,7 @@ export interface OAuthSignInDto {
### 4. Add frontend icon ### 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 ```tsx
const getOAuthIcon = (provider: string) => { const getOAuthIcon = (provider: string) => {
@@ -153,7 +155,7 @@ const getOAuthIcon = (provider: string) => {
### 5. Add i18n text ### 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` - `signIn.oauth.YOUR_PROVIDER_NAME`
- `account.card.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

@@ -14,6 +14,11 @@ As Pingvin Share is in early stage, see the release notes for breaking changes b
docker compose pull docker compose pull
docker compose up -d docker compose up -d
``` ```
### Portainer
1. In your container page, click on Recreate.
2. Check the Re-Pull image toggle.
3. Click on Recreate.
#### Stand-alone #### Stand-alone
@@ -39,6 +44,6 @@ docker compose up -d
cd ../frontend cd ../frontend
npm install npm install
npm run build npm run build
API_URL=http://localhost:8080 # Set the URL of the backend, default: http://localhost:8080
pm2 restart pingvin-share-frontend 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````

View File

@@ -7,7 +7,7 @@ const config: Config = {
tagline: tagline:
"Pingvin Share is self-hosted file sharing platform and an alternative for WeTransfer.", "Pingvin Share is self-hosted file sharing platform and an alternative for WeTransfer.",
favicon: "img/pingvinshare.svg", favicon: "img/pingvinshare.svg",
url: "https://stonith404.github.io", url: "https://stonith404.github.io",
baseUrl: "/pingvin-share/", baseUrl: "/pingvin-share/",
organizationName: "stonith404", organizationName: "stonith404",
@@ -37,7 +37,7 @@ const config: Config = {
themeConfig: { themeConfig: {
image: "img/pingvinshare.svg", image: "img/pingvinshare.svg",
colorMode:{ colorMode: {
respectPrefersColorScheme: true, respectPrefersColorScheme: true,
}, },
navbar: { navbar: {

828
docs/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@
"start": "docusaurus start", "start": "docusaurus start",
"build": "docusaurus build", "build": "docusaurus build",
"swizzle": "docusaurus swizzle", "swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy", "deploy": "GIT_USER=stonith404 docusaurus deploy",
"clear": "docusaurus clear", "clear": "docusaurus clear",
"serve": "docusaurus serve", "serve": "docusaurus serve",
"write-translations": "docusaurus write-translations", "write-translations": "docusaurus write-translations",
@@ -15,19 +15,19 @@
"typecheck": "tsc" "typecheck": "tsc"
}, },
"dependencies": { "dependencies": {
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.5.2",
"@docusaurus/preset-classic": "3.4.0", "@docusaurus/preset-classic": "3.5.2",
"@mdx-js/react": "^3.0.0", "@mdx-js/react": "^3.0.1",
"clsx": "^2.0.0", "clsx": "^2.1.1",
"prism-react-renderer": "^2.3.0", "prism-react-renderer": "^2.4.0",
"react": "^18.0.0", "react": "^18.3.1",
"react-dom": "^18.0.0" "react-dom": "^18.3.1"
}, },
"devDependencies": { "devDependencies": {
"@docusaurus/module-type-aliases": "3.4.0", "@docusaurus/module-type-aliases": "3.5.2",
"@docusaurus/tsconfig": "3.4.0", "@docusaurus/tsconfig": "3.5.2",
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.5.2",
"typescript": "~5.2.2" "typescript": "~5.6.2"
}, },
"browserslist": { "browserslist": {
"production": [ "production": [

View File

@@ -36,6 +36,10 @@ const sidebars: SidebarsConfig = {
type: "doc", type: "doc",
id: "setup/oauth2login", id: "setup/oauth2login",
}, },
{
type: "doc",
id: "setup/s3",
},
{ {
type: "doc", type: "doc",
id: "setup/upgrading", id: "setup/upgrading",
@@ -56,6 +60,11 @@ const sidebars: SidebarsConfig = {
}, },
], ],
}, },
{
type: "link",
label: "Demo",
href: "https://pingvin-share.dev.eliasschneider.com",
},
{ {
type: "link", type: "link",
label: "Discord", label: "Discord",

View File

@@ -2,4 +2,4 @@
/// <reference types="next/image-types/global" /> /// <reference types="next/image-types/global" />
// NOTE: This file should not be edited // NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information. // see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information.

View File

@@ -18,7 +18,4 @@ module.exports = withPWA({
output: "standalone", env: { output: "standalone", env: {
VERSION: version, VERSION: version,
}, },
serverRuntimeConfig: {
apiURL: process.env.API_URL ?? 'http://localhost:8080',
},
}); });

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "pingvin-share-frontend", "name": "pingvin-share-frontend",
"version": "1.0.2", "version": "1.8.2",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"build": "next build", "build": "next build",
@@ -9,7 +9,7 @@
"format": "prettier --end-of-line=auto --write \"src/**/*.ts*\"" "format": "prettier --end-of-line=auto --write \"src/**/*.ts*\""
}, },
"dependencies": { "dependencies": {
"@emotion/react": "^11.11.4", "@emotion/react": "^11.13.3",
"@emotion/server": "^11.11.0", "@emotion/server": "^11.11.0",
"@mantine/core": "^6.0.21", "@mantine/core": "^6.0.21",
"@mantine/dropzone": "^6.0.21", "@mantine/dropzone": "^6.0.21",
@@ -18,37 +18,37 @@
"@mantine/modals": "^6.0.21", "@mantine/modals": "^6.0.21",
"@mantine/next": "^6.0.21", "@mantine/next": "^6.0.21",
"@mantine/notifications": "^6.0.21", "@mantine/notifications": "^6.0.21",
"axios": "^1.7.2", "axios": "^1.7.7",
"cookies-next": "^2.1.2", "cookies-next": "^4.2.1",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"jose": "^4.15.5", "jose": "^5.9.2",
"jwt-decode": "^3.1.2", "jwt-decode": "^4.0.0",
"markdown-to-jsx": "^7.4.7", "markdown-to-jsx": "^7.5.0",
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
"moment": "^2.30.1", "moment": "^2.30.1",
"next": "^14.2.3", "next": "^14.2.12",
"next-http-proxy-middleware": "^1.2.6", "next-http-proxy-middleware": "^1.2.6",
"next-pwa": "^5.6.0", "next-pwa": "^5.6.0",
"p-limit": "^4.0.0", "p-limit": "^6.1.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-icons": "^4.12.0", "react-icons": "^5.3.0",
"react-intl": "^6.6.8", "react-intl": "^6.6.8",
"sharp": "^0.33.4", "sharp": "^0.33.5",
"yup": "^1.4.0" "yup": "^1.4.0"
}, },
"devDependencies": { "devDependencies": {
"@types/mime-types": "^2.1.4", "@types/mime-types": "^2.1.4",
"@types/node": "20.12.12", "@types/node": "22.5.5",
"@types/react": "18.3.2", "@types/react": "18.3.7",
"@types/react-dom": "18.3.0", "@types/react-dom": "18.3.0",
"@typescript-eslint/parser": "^7.10.0", "@typescript-eslint/parser": "^8.6.0",
"axios": "^1.7.2", "axios": "^1.7.7",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-config-next": "^13.5.6", "eslint-config-next": "^14.2.12",
"eslint-config-prettier": "^8.10.0", "eslint-config-prettier": "^9.1.0",
"prettier": "^3.2.5", "prettier": "^3.3.3",
"tar": "^6.2.1", "tar": "^7.4.3",
"typescript": "^5.4.5" "typescript": "^5.6.2"
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -8,6 +8,9 @@ import {
} from "@mantine/core"; } from "@mantine/core";
import { useForm } from "@mantine/form"; import { useForm } from "@mantine/form";
import { AdminConfig, UpdateConfig } from "../../../types/config.type"; import { AdminConfig, UpdateConfig } from "../../../types/config.type";
import TimespanInput from "../../core/TimespanInput";
import { stringToTimespan, timespanToString } from "../../../utils/date.util";
import FileSizeInput from "../../core/FileSizeInput";
const AdminConfigInput = ({ const AdminConfigInput = ({
configVariable, configVariable,
@@ -71,6 +74,15 @@ const AdminConfigInput = ({
{...form.getInputProps("numberValue")} {...form.getInputProps("numberValue")}
placeholder={configVariable.defaultValue} placeholder={configVariable.defaultValue}
onChange={(number) => onValueChange(configVariable, number)} onChange={(number) => onValueChange(configVariable, number)}
w={201}
/>
)}
{configVariable.type == "filesize" && (
<FileSizeInput
{...form.getInputProps("numberValue")}
value={parseInt(configVariable.value ?? configVariable.defaultValue)}
onChange={(bytes) => onValueChange(configVariable, bytes)}
w={201}
/> />
)} )}
{configVariable.type == "boolean" && ( {configVariable.type == "boolean" && (
@@ -81,6 +93,15 @@ const AdminConfigInput = ({
/> />
</> </>
)} )}
{configVariable.type == "timespan" && (
<TimespanInput
value={stringToTimespan(configVariable.value)}
onChange={(timespan) =>
onValueChange(configVariable, timespanToString(timespan))
}
w={201}
/>
)}
</Stack> </Stack>
); );
}; };

View File

@@ -16,18 +16,22 @@ import {
TbMail, TbMail,
TbShare, TbShare,
TbSocial, TbSocial,
TbSquare, TbBucket,
TbBinaryTree, TbBinaryTree,
TbSettings,
TbScale,
} from "react-icons/tb"; } from "react-icons/tb";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
const categories = [ const categories = [
{ name: "General", icon: <TbSquare /> }, { name: "General", icon: <TbSettings /> },
{ name: "Email", icon: <TbMail /> }, { name: "Email", icon: <TbMail /> },
{ name: "Share", icon: <TbShare /> }, { name: "Share", icon: <TbShare /> },
{ name: "SMTP", icon: <TbAt /> }, { name: "SMTP", icon: <TbAt /> },
{ name: "OAuth", icon: <TbSocial /> }, { name: "OAuth", icon: <TbSocial /> },
{ name: "LDAP", icon: <TbBinaryTree /> }, { name: "LDAP", icon: <TbBinaryTree /> },
{ name: "S3", icon: <TbBucket /> },
{ name: "Legal", icon: <TbScale /> },
]; ];
const useStyles = createStyles((theme) => ({ const useStyles = createStyles((theme) => ({

View File

@@ -89,15 +89,11 @@ const ManageShareTable = ({
onClick={() => { onClick={() => {
if (window.isSecureContext) { if (window.isSecureContext) {
clipboard.copy( 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 { } else {
showShareLinkModal( showShareLinkModal(modals, share.id);
modals,
share.id,
config.get("general.appUrl"),
);
} }
}} }}
> >

View File

@@ -4,6 +4,7 @@ import {
Container, Container,
createStyles, createStyles,
Group, Group,
Loader,
Paper, Paper,
PasswordInput, PasswordInput,
Stack, Stack,
@@ -15,7 +16,7 @@ import { useForm, yupResolver } from "@mantine/form";
import { showNotification } from "@mantine/notifications"; import { showNotification } from "@mantine/notifications";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import React from "react"; import { useEffect, useState } from "react";
import { TbInfoCircle } from "react-icons/tb"; import { TbInfoCircle } from "react-icons/tb";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
import * as yup from "yup"; import * as yup from "yup";
@@ -24,8 +25,8 @@ import useUser from "../../hooks/user.hook";
import useTranslate from "../../hooks/useTranslate.hook"; import useTranslate from "../../hooks/useTranslate.hook";
import authService from "../../services/auth.service"; import authService from "../../services/auth.service";
import { getOAuthIcon, getOAuthUrl } from "../../utils/oauth.util"; import { getOAuthIcon, getOAuthUrl } from "../../utils/oauth.util";
import toast from "../../utils/toast.util";
import { safeRedirectPath } from "../../utils/router.util"; import { safeRedirectPath } from "../../utils/router.util";
import toast from "../../utils/toast.util";
const useStyles = createStyles((theme) => ({ const useStyles = createStyles((theme) => ({
signInWith: { signInWith: {
@@ -74,14 +75,13 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
const { refreshUser } = useUser(); const { refreshUser } = useUser();
const { classes } = useStyles(); const { classes } = useStyles();
const [oauth, setOAuth] = React.useState<string[]>([]); const [oauthProviders, setOauthProviders] = useState<string[] | null>(null);
const [isRedirectingToOauthProvider, setIsRedirectingToOauthProvider] =
useState(false);
const validationSchema = yup.object().shape({ const validationSchema = yup.object().shape({
emailOrUsername: yup.string().required(t("common.error.field-required")), emailOrUsername: yup.string().required(t("common.error.field-required")),
password: yup password: yup.string().required(t("common.error.field-required")),
.string()
.min(8, t("common.error.too-short", { length: 8 }))
.required(t("common.error.field-required")),
}); });
const form = useForm({ const form = useForm({
@@ -94,7 +94,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
const signIn = async (email: string, password: string) => { const signIn = async (email: string, password: string) => {
await authService await authService
.signIn(email, password) .signIn(email.trim(), password.trim())
.then(async (response) => { .then(async (response) => {
if (response.data["loginToken"]) { if (response.data["loginToken"]) {
// Prompt the user to enter their totp code // Prompt the user to enter their totp code
@@ -118,15 +118,34 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
.catch(toast.axiosError); .catch(toast.axiosError);
}; };
const getAvailableOAuth = async () => { useEffect(() => {
const oauth = await authService.getAvailableOAuth(); authService
setOAuth(oauth.data); .getAvailableOAuth()
}; .then((providers) => {
setOauthProviders(providers.data);
React.useEffect(() => { if (
getAvailableOAuth().catch(toast.axiosError); providers.data.length === 1 &&
config.get("oauth.disablePassword")
) {
setIsRedirectingToOauthProvider(true);
router.push(getOAuthUrl(window.location.origin, providers.data[0]));
}
})
.catch(toast.axiosError);
}, []); }, []);
if (!oauthProviders) return null;
if (isRedirectingToOauthProvider)
return (
<Group align="center" position="center">
<Loader size="sm" />
<Text align="center">
<FormattedMessage id="common.text.redirecting" />
</Text>
</Group>
);
return ( return (
<Container size={420} my={40}> <Container size={420} my={40}>
<Title order={2} align="center" weight={900}> <Title order={2} align="center" weight={900}>
@@ -170,7 +189,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
</Button> </Button>
</form> </form>
)} )}
{oauth.length > 0 && ( {oauthProviders.length > 0 && (
<Stack mt={config.get("oauth.disablePassword") ? undefined : "xl"}> <Stack mt={config.get("oauth.disablePassword") ? undefined : "xl"}>
{config.get("oauth.disablePassword") ? ( {config.get("oauth.disablePassword") ? (
<Group align="center" className={classes.signInWith}> <Group align="center" className={classes.signInWith}>
@@ -182,12 +201,12 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
</Group> </Group>
)} )}
<Group position="center"> <Group position="center">
{oauth.map((provider) => ( {oauthProviders.map((provider) => (
<Button <Button
key={provider} key={provider}
component="a" component="a"
title={t(`signIn.oauth.${provider}`)} title={t(`signIn.oauth.${provider}`)}
href={getOAuthUrl(config.get("general.appUrl"), provider)} href={getOAuthUrl(window.location.origin, provider)}
variant="light" variant="light"
fullWidth fullWidth
> >

View File

@@ -48,7 +48,7 @@ const SignUpForm = () => {
const signUp = async (email: string, username: string, password: string) => { const signUp = async (email: string, username: string, password: string) => {
await authService await authService
.signUp(email, username, password) .signUp(email.trim(), username.trim(), password.trim())
.then(async () => { .then(async () => {
const user = await refreshUser(); const user = await refreshUser();
if (user?.isAdmin) { if (user?.isAdmin) {

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

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

@@ -9,25 +9,27 @@ import {
Switch, Switch,
Text, Text,
} from "@mantine/core"; } from "@mantine/core";
import { useForm } from "@mantine/form"; import { useForm, yupResolver } from "@mantine/form";
import { useModals } from "@mantine/modals"; import { useModals } from "@mantine/modals";
import { ModalsContextProps } from "@mantine/modals/lib/context"; import { ModalsContextProps } from "@mantine/modals/lib/context";
import { getCookie, setCookie } from "cookies-next";
import moment from "moment"; import moment from "moment";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
import * as yup from "yup";
import useTranslate, { import useTranslate, {
translateOutsideContext, translateOutsideContext,
} from "../../../hooks/useTranslate.hook"; } from "../../../hooks/useTranslate.hook";
import shareService from "../../../services/share.service"; import shareService from "../../../services/share.service";
import { Timespan } from "../../../types/timespan.type";
import { getExpirationPreview } from "../../../utils/date.util"; import { getExpirationPreview } from "../../../utils/date.util";
import toast from "../../../utils/toast.util"; import toast from "../../../utils/toast.util";
import FileSizeInput from "../FileSizeInput"; import FileSizeInput from "../../core/FileSizeInput";
import showCompletedReverseShareModal from "./showCompletedReverseShareModal"; import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
import { getCookie, setCookie } from "cookies-next";
const showCreateReverseShareModal = ( const showCreateReverseShareModal = (
modals: ModalsContextProps, modals: ModalsContextProps,
showSendEmailNotificationOption: boolean, showSendEmailNotificationOption: boolean,
maxExpirationInHours: number, maxExpiration: Timespan,
getReverseShares: () => void, getReverseShares: () => void,
) => { ) => {
const t = translateOutsideContext(); const t = translateOutsideContext();
@@ -37,7 +39,7 @@ const showCreateReverseShareModal = (
<Body <Body
showSendEmailNotificationOption={showSendEmailNotificationOption} showSendEmailNotificationOption={showSendEmailNotificationOption}
getReverseShares={getReverseShares} getReverseShares={getReverseShares}
maxExpirationInHours={maxExpirationInHours} maxExpiration={maxExpiration}
/> />
), ),
}); });
@@ -46,11 +48,11 @@ const showCreateReverseShareModal = (
const Body = ({ const Body = ({
getReverseShares, getReverseShares,
showSendEmailNotificationOption, showSendEmailNotificationOption,
maxExpirationInHours, maxExpiration,
}: { }: {
getReverseShares: () => void; getReverseShares: () => void;
showSendEmailNotificationOption: boolean; showSendEmailNotificationOption: boolean;
maxExpirationInHours: number; maxExpiration: Timespan;
}) => { }) => {
const modals = useModals(); const modals = useModals();
const t = useTranslate(); const t = useTranslate();
@@ -65,6 +67,16 @@ const Body = ({
simplified: !!(getCookie("reverse-share.simplified") ?? false), simplified: !!(getCookie("reverse-share.simplified") ?? false),
publicAccess: !!(getCookie("reverse-share.public-access") ?? true), publicAccess: !!(getCookie("reverse-share.public-access") ?? true),
}, },
validate: yupResolver(
yup.object().shape({
maxUseCount: yup
.number()
.typeError(t("common.error.invalid-number"))
.min(1, t("common.error.number-too-small", { min: 1 }))
.max(1000, t("common.error.number-too-large", { max: 1000 }))
.required(t("common.error.field-required")),
}),
),
}); });
const onSubmit = form.onSubmit(async (values) => { const onSubmit = form.onSubmit(async (values) => {
@@ -80,13 +92,17 @@ const Body = ({
) as moment.unitOfTime.DurationConstructor, ) as moment.unitOfTime.DurationConstructor,
); );
if ( if (
maxExpirationInHours != 0 && maxExpiration.value != 0 &&
expirationDate.isAfter(moment().add(maxExpirationInHours, "hours")) expirationDate.isAfter(
moment().add(maxExpiration.value, maxExpiration.unit),
)
) { ) {
form.setFieldError( form.setFieldError(
"expiration_num", "expiration_num",
t("upload.modal.expires.error.too-long", { t("upload.modal.expires.error.too-long", {
max: moment.duration(maxExpirationInHours, "hours").humanize(), max: moment
.duration(maxExpiration.value, maxExpiration.unit)
.humanize(),
}), }),
); );
return; return;

View File

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

View File

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

View File

@@ -19,7 +19,7 @@ import { useForm, yupResolver } from "@mantine/form";
import { useModals } from "@mantine/modals"; import { useModals } from "@mantine/modals";
import { ModalsContextProps } from "@mantine/modals/lib/context"; import { ModalsContextProps } from "@mantine/modals/lib/context";
import moment from "moment"; import moment from "moment";
import { useState } from "react"; import React, { useState } from "react";
import { TbAlertCircle } from "react-icons/tb"; import { TbAlertCircle } from "react-icons/tb";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
import * as yup from "yup"; import * as yup from "yup";
@@ -30,18 +30,18 @@ import shareService from "../../../services/share.service";
import { FileUpload } from "../../../types/File.type"; import { FileUpload } from "../../../types/File.type";
import { CreateShare } from "../../../types/share.type"; import { CreateShare } from "../../../types/share.type";
import { getExpirationPreview } from "../../../utils/date.util"; import { getExpirationPreview } from "../../../utils/date.util";
import React from "react";
import toast from "../../../utils/toast.util"; import toast from "../../../utils/toast.util";
import { Timespan } from "../../../types/timespan.type";
const showCreateUploadModal = ( const showCreateUploadModal = (
modals: ModalsContextProps, modals: ModalsContextProps,
options: { options: {
isUserSignedIn: boolean; isUserSignedIn: boolean;
isReverseShare: boolean; isReverseShare: boolean;
appUrl: string;
allowUnauthenticatedShares: boolean; allowUnauthenticatedShares: boolean;
enableEmailRecepients: boolean; enableEmailRecepients: boolean;
maxExpirationInHours: number; maxExpiration: Timespan;
shareIdLength: number;
simplified: boolean; simplified: boolean;
}, },
files: FileUpload[], files: FileUpload[],
@@ -74,18 +74,28 @@ const showCreateUploadModal = (
}); });
}; };
const generateLink = () => const generateShareId = (length: number = 16) => {
Buffer.from(Math.random().toString(), "utf8") const chars =
.toString("base64") "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
.substring(10, 17); 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) { if (times <= 0) {
throw new Error("Could not generate available link"); throw new Error("Could not generate available link");
} }
const _link = generateLink(); const _link = generateShareId(shareIdLength);
if (!(await shareService.isShareIdAvailable(_link))) { if (!(await shareService.isShareIdAvailable(_link))) {
return await generateAvailableLink(times - 1); return await generateAvailableLink(shareIdLength, times - 1);
} else { } else {
return _link; return _link;
} }
@@ -101,16 +111,16 @@ const CreateUploadModalBody = ({
options: { options: {
isUserSignedIn: boolean; isUserSignedIn: boolean;
isReverseShare: boolean; isReverseShare: boolean;
appUrl: string;
allowUnauthenticatedShares: boolean; allowUnauthenticatedShares: boolean;
enableEmailRecepients: boolean; enableEmailRecepients: boolean;
maxExpirationInHours: number; maxExpiration: Timespan;
shareIdLength: number;
}; };
}) => { }) => {
const modals = useModals(); const modals = useModals();
const t = useTranslate(); const t = useTranslate();
const generatedLink = generateLink(); const generatedLink = generateShareId(options.shareIdLength);
const [showNotSignedInAlert, setShowNotSignedInAlert] = useState(true); const [showNotSignedInAlert, setShowNotSignedInAlert] = useState(true);
@@ -171,17 +181,20 @@ const CreateUploadModalBody = ({
); );
if ( if (
options.maxExpirationInHours != 0 && options.maxExpiration.value != 0 &&
(form.values.never_expires || (form.values.never_expires ||
expirationDate.isAfter( expirationDate.isAfter(
moment().add(options.maxExpirationInHours, "hours"), moment().add(
options.maxExpiration.value,
options.maxExpiration.unit,
),
)) ))
) { ) {
form.setFieldError( form.setFieldError(
"expiration_num", "expiration_num",
t("upload.modal.expires.error.too-long", { t("upload.modal.expires.error.too-long", {
max: moment max: moment
.duration(options.maxExpirationInHours, "hours") .duration(options.maxExpiration.value, options.maxExpiration.unit)
.humanize(), .humanize(),
}), }),
); );
@@ -232,20 +245,26 @@ const CreateUploadModalBody = ({
<Button <Button
style={{ flex: "0 0 auto" }} style={{ flex: "0 0 auto" }}
variant="outline" variant="outline"
onClick={() => form.setFieldValue("link", generateLink())} onClick={() =>
form.setFieldValue(
"link",
generateShareId(options.shareIdLength),
)
}
> >
<FormattedMessage id="common.button.generate" /> <FormattedMessage id="common.button.generate" />
</Button> </Button>
</Group> </Group>
<Text <Text
truncate
italic italic
size="xs" size="xs"
sx={(theme) => ({ sx={(theme) => ({
color: theme.colors.gray[6], color: theme.colors.gray[6],
})} })}
> >
{`${options.appUrl}/s/${form.values.link}`} {`${window.location.origin}/s/${form.values.link}`}
</Text> </Text>
{!options.isReverseShare && ( {!options.isReverseShare && (
<> <>
@@ -312,7 +331,7 @@ const CreateUploadModalBody = ({
/> />
</Col> </Col>
</Grid> </Grid>
{options.maxExpirationInHours == 0 && ( {options.maxExpiration.value == 0 && (
<Checkbox <Checkbox
label={t("upload.modal.expires.never-long")} label={t("upload.modal.expires.never-long")}
{...form.getInputProps("never_expires")} {...form.getInputProps("never_expires")}
@@ -370,9 +389,8 @@ const CreateUploadModalBody = ({
placeholder={t("upload.modal.accordion.email.placeholder")} placeholder={t("upload.modal.accordion.email.placeholder")}
searchable searchable
creatable creatable
id="recipient_email" id="recipient-emails"
autoComplete="email" inputMode="email"
type="email"
getCreateLabel={(query) => `+ ${query}`} getCreateLabel={(query) => `+ ${query}`}
onCreate={(query) => { onCreate={(query) => {
if (!query.match(/^\S+@\S+\.\S+$/)) { if (!query.match(/^\S+@\S+\.\S+$/)) {
@@ -426,7 +444,7 @@ const CreateUploadModalBody = ({
"upload.modal.accordion.security.password.placeholder", "upload.modal.accordion.security.password.placeholder",
)} )}
label={t("upload.modal.accordion.security.password.label")} label={t("upload.modal.accordion.security.password.label")}
autoComplete="off" autoComplete="new-password"
{...form.getInputProps("password")} {...form.getInputProps("password")}
/> />
<NumberInput <NumberInput
@@ -462,10 +480,10 @@ const SimplifiedCreateUploadModalModal = ({
options: { options: {
isUserSignedIn: boolean; isUserSignedIn: boolean;
isReverseShare: boolean; isReverseShare: boolean;
appUrl: string;
allowUnauthenticatedShares: boolean; allowUnauthenticatedShares: boolean;
enableEmailRecepients: boolean; enableEmailRecepients: boolean;
maxExpirationInHours: number; maxExpiration: Timespan;
shareIdLength: number;
}; };
}) => { }) => {
const modals = useModals(); const modals = useModals();
@@ -490,10 +508,12 @@ const SimplifiedCreateUploadModalModal = ({
}); });
const onSubmit = form.onSubmit(async (values) => { const onSubmit = form.onSubmit(async (values) => {
const link = await generateAvailableLink().catch(() => { const link = await generateAvailableLink(options.shareIdLength).catch(
toast.error(t("upload.modal.link.error.taken")); () => {
return undefined; toast.error(t("upload.modal.link.error.taken"));
}); return undefined;
},
);
if (!link) { if (!link) {
return; 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,4 +1,5 @@
import arabic from "./translations/ar-EG"; import arabic from "./translations/ar-EG";
import czech from "./translations/cs-CZ";
import danish from "./translations/da-DK"; import danish from "./translations/da-DK";
import german from "./translations/de-DE"; import german from "./translations/de-DE";
import greek from "./translations/el-GR"; import greek from "./translations/el-GR";
@@ -6,6 +7,7 @@ import english from "./translations/en-US";
import spanish from "./translations/es-ES"; import spanish from "./translations/es-ES";
import finnish from "./translations/fi-FI"; import finnish from "./translations/fi-FI";
import french from "./translations/fr-FR"; import french from "./translations/fr-FR";
import croatian from "./translations/hr-HR";
import hungarian from "./translations/hu-HU"; import hungarian from "./translations/hu-HU";
import italian from "./translations/it-IT"; import italian from "./translations/it-IT";
import japanese from "./translations/ja-JP"; import japanese from "./translations/ja-JP";
@@ -15,15 +17,15 @@ import polish from "./translations/pl-PL";
import portuguese from "./translations/pt-BR"; import portuguese from "./translations/pt-BR";
import russian from "./translations/ru-RU"; import russian from "./translations/ru-RU";
import slovenian from "./translations/sl-SI"; 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 swedish from "./translations/sv-SE";
import thai from "./translations/th-TH"; import thai from "./translations/th-TH";
import turkish from "./translations/tr-TR";
import ukrainian from "./translations/uk-UA"; import ukrainian from "./translations/uk-UA";
import viatnamese from "./translations/vi-VN";
import chineseSimplified from "./translations/zh-CN"; import chineseSimplified from "./translations/zh-CN";
import chineseTraditional from "./translations/zh-TW"; import chineseTraditional from "./translations/zh-TW";
import turkish from "./translations/tr-TR";
import czech from "./translations/cs-CZ";
import viatnamese from "./translations/vi-VN";
export const LOCALES = { export const LOCALES = {
ENGLISH: { ENGLISH: {
@@ -87,9 +89,14 @@ export const LOCALES = {
messages: thai, messages: thai,
}, },
SERBIAN: { SERBIAN: {
name: "Srpski", name: "Српски",
code: "sr-SP", code: "sr-SP",
messages: serbian, messages: serbianCyrillic,
},
SERBIAN_LATIN: {
name: "Srpski",
code: "sr-CS",
messages: serbianLatin,
}, },
DUTCH: { DUTCH: {
name: "Nederlands", name: "Nederlands",
@@ -156,4 +163,9 @@ export const LOCALES = {
code: "vi-VN", code: "vi-VN",
messages: viatnamese, messages: viatnamese,
}, },
CROATIAN: {
name: "Hrvatski",
code: "hr-HR",
messages: croatian,
},
}; };

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "رفع", "navbar.upload": "رفع",
"navbar.signin": "تسجيل الدخول", "navbar.signin": "تسجيل الدخول",
"navbar.home": "الصفحة الرئيسية", "navbar.home": "الصفحة الرئيسية",
"navbar.signup": "إنشاء حساب", "navbar.signup": "Sign up",
"navbar.links.shares": "مشاركاتي", "navbar.links.shares": "مشاركاتي",
"navbar.links.reverse": "مشاركاتي العكسية", "navbar.links.reverse": "مشاركاتي العكسية",
"navbar.avatar.account": "حسابي", "navbar.avatar.account": "حسابي",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "استضافة ذاتية", "home.bullet.a.name": "استضافة ذاتية",
"home.bullet.a.description": "قم باستضافة Pingvin Share على جهازك.", "home.bullet.a.description": "قم باستضافة Pingvin Share على جهازك.",
"home.bullet.b.name": "الخصوصية", "home.bullet.b.name": "الخصوصية",
"home.bullet.b.description": "ملفاتك تخصّك وحدك فقط، ولا ينبغي أبدًا أن تقع بأيدي طرفٍ ثالث.", "home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "ليس هناك أية قيود على حجم الملفات", "home.bullet.c.name": "ليس هناك أية قيود على حجم الملفات",
"home.bullet.c.description": "ارفع أي ملف تريده مهما كان حجمه كبيرًا. إن مساحة قرصك الصلب هي المحدد الوحيد هنا.", "home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "ابدأ", "home.button.start": "ابدأ",
"home.button.source": "النص البرمجي المصدري", "home.button.source": "النص البرمجي المصدري",
// END / // END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "نسيت كلمة سرّك؟", "resetPassword.title": "نسيت كلمة سرّك؟",
"resetPassword.description": "اكتب بريدك لتعيد تعيين كلمة السر.", "resetPassword.description": "اكتب بريدك لتعيد تعيين كلمة السر.",
"resetPassword.notify.success": "إذا كان هذا البريد مسجلًا لدينا فستصله الآن رسالة فيها رابط لإعادة تعيين كلمة السرّ.", "resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "العودة لصفحة تسجيل الدخول", "resetPassword.button.back": "العودة لصفحة تسجيل الدخول",
"resetPassword.text.resetPassword": "إعادة تعيين كلمة السر", "resetPassword.text.resetPassword": "إعادة تعيين كلمة السر",
"resetPassword.text.enterNewPassword": "أدخل كلمة السر الجديدة", "resetPassword.text.enterNewPassword": "أدخل كلمة السر الجديدة",
"resetPassword.input.password": "كلمة السر الجديدة", "resetPassword.input.password": "كلمة السر الجديدة",
"resetPassword.notify.passwordReset": "أعدتَ تعيين كلمة السر بنجاح.", "resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account // /account
"account.title": "حسابي", "account.title": "حسابي",
"account.card.info.title": "معلومات الحساب", "account.card.info.title": "معلومات الحساب",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "كلمة السر", "account.card.password.title": "كلمة السر",
"account.card.password.old": "كلمة السر القديمة", "account.card.password.old": "كلمة السر القديمة",
"account.card.password.new": "كلمة السر الجديدة", "account.card.password.new": "كلمة السر الجديدة",
"account.card.password.noPasswordSet": "ليس لحسابك كلمة سر. إذا أردت تسجيل الدخول باستخدام البريد وكلمة سر، فعليك أن تُعيِّن كلمة سر.", "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": "غيرت كلمة السر بنجاح", "account.notify.password.success": "غيرت كلمة السر بنجاح",
"account.card.oauth.title": "الدخول بحساب تواصل اجتماعي", "account.card.oauth.title": "الدخول بحساب تواصل اجتماعي",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "فك الربط", "account.card.oauth.unlink": "فك الربط",
"account.card.oauth.unlinked": "تم فك الربط", "account.card.oauth.unlinked": "تم فك الربط",
"account.modal.unlink.title": "فك ربط الحساب", "account.modal.unlink.title": "فك ربط الحساب",
"account.modal.unlink.description": "قد يؤدي إلغاء ربط حساباتك الاجتماعية إلى فقدان وصولك لحسابك إذا كنت لا تتذكر اسم المستخدم وكلمة السر الخاصة بك.", "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": "تم فك الربط بنجاح", "account.notify.oauth.unlinked.success": "تم فك الربط بنجاح",
"account.card.security.title": "الأمان", "account.card.security.title": "الأمان",
"account.card.security.totp.enable.description": "اكتب كلمة سرّك لبدء تمكين TOTP", "account.card.security.totp.enable.description": "اكتب كلمة سرّك لبدء تمكين TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "الاسم", "account.shares.table.name": "الاسم",
"account.shares.table.description": "الوصف", "account.shares.table.description": "الوصف",
"account.shares.table.visitors": "الزوار", "account.shares.table.visitors": "الزوار",
"account.shares.table.expiresAt": "تاريخ انتهاء الصلاحية", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "تاريخ الإنشاء", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "الحجم", "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-informations": "معلومات المشاركة",
"account.shares.modal.share-link": "رابط المشاركة", "account.shares.modal.share-link": "رابط المشاركة",
"account.shares.modal.delete.title": "حذف المشاركة {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "هل تريد حذف هذه المشاركة حقاً؟", "account.shares.modal.delete.description": "هل تريد حذف هذه المشاركة حقاً؟",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "سنة", "account.reverseShares.modal.expiration.year-singular": "سنة",
"account.reverseShares.modal.expiration.year-plural": "سنوات", "account.reverseShares.modal.expiration.year-plural": "سنوات",
"account.reverseShares.modal.max-size.label": "الحد الأقصى لحجم المشاركة", "account.reverseShares.modal.max-size.label": "الحد الأقصى لحجم المشاركة",
"account.reverseShares.modal.send-email": "أرسل إشعارًا بالبريد", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "إرسال إشعار بالبريد الإلكتروني عند إنشاء مشاركة باستخدام رابط المشاركة العكسي هذا.", "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": "Simple mode",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.", "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": "Public access",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "الحد الأقصى لعدد الاستخدامات", "account.reverseShares.modal.max-use.label": "الحد الأقصى لعدد الاستخدامات",
"account.reverseShares.modal.max-use.description": "أقصى عدد من المرّات التي يمكن فيها استخدام هذا الرابط لإنشاء مشاركة.", "account.reverseShares.modal.max-use.description": "أقصى عدد من المرّات التي يمكن فيها استخدام هذا الرابط لإنشاء مشاركة.",
"account.reverseShare.never-expires": "لن تنتهي صلاحية هذه المشاركة العكسية أبدًا.", "account.reverseShare.never-expires": "لن تنتهي صلاحية هذه المشاركة العكسية أبدًا.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "اسم المستخدم", "admin.users.table.username": "اسم المستخدم",
"admin.users.table.email": "البريد", "admin.users.table.email": "البريد",
"admin.users.table.admin": "المدير", "admin.users.table.admin": "المدير",
"admin.users.edit.update.title": "تحديث المستخدم {username}", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "صلاحيات المدير", "admin.users.edit.update.admin-privileges": "صلاحيات المدير",
"admin.users.edit.update.change-password.title": "تغيير كلمة السر", "admin.users.edit.update.change-password.title": "تغيير كلمة السر",
"admin.users.edit.update.change-password.field": "كلمة السر الجديدة", "admin.users.edit.update.change-password.field": "كلمة السر الجديدة",
"admin.users.edit.update.change-password.button": "حفظ كلمة السر الجديدة", "admin.users.edit.update.change-password.button": "حفظ كلمة السر الجديدة",
"admin.users.edit.update.notify.password.success": "غيرت كلمة السر بنجاح", "admin.users.edit.update.notify.password.success": "غيرت كلمة السر بنجاح",
"admin.users.edit.delete.title": "حذف المستخدم {username}", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "هل تريد حقاً حذف هذا المستخدم وكل مشاركاته؟", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "أنشئ مستخدمًا", "admin.users.modal.create.title": "أنشئ مستخدمًا",
"admin.users.modal.create.username": "اسم المستخدم", "admin.users.modal.create.username": "اسم المستخدم",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "معرّف المشاركة", "admin.shares.table.id": "معرّف المشاركة",
"admin.shares.table.username": "المُنشئ", "admin.shares.table.username": "المُنشئ",
"admin.shares.table.visitors": "الزوار", "admin.shares.table.visitors": "الزوار",
"admin.shares.table.expires": "تاريخ انتهاء الصلاحية", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "حذف المشاركة {id}", "admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "هل تريد حذف هذه المشاركة حقاً؟", "admin.shares.edit.delete.description": "هل تريد حذف هذه المشاركة حقاً؟",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "رفع", "upload.title": "رفع",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "حدث خطأ أثناء إنهاء مشاركتك.", "upload.notify.generic-error": "حدث خطأ أثناء إنهاء مشاركتك.",
"upload.notify.count-failed": "فشل رفع {count} ملفات. تجري المحاولة مجددًا.", "upload.notify.count-failed": "فشل رفع {count} ملفات. تجري المحاولة مجددًا.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx // Dropzone.tsx
"upload.dropzone.title": "رفع الملفات", "upload.dropzone.title": "رفع الملفات",
"upload.dropzone.description": "اسحب الملفات إلى هنا لبدء مشاركتك. يمكننا فقط قبول الملفات التي لا يزيد حجمها عن {maxSize} بالمجمل.", "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.notify.file-too-big": "تتجاوز ملفاتك الحجم الأقصى للمشاركة والذي هو {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "الاسم", "upload.filelist.name": "الاسم",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "لم تقم بتسجيل الدخول", "upload.modal.not-signed-in": "لم تقم بتسجيل الدخول",
"upload.modal.not-signed-in-description": "لن تتمكن من حذف مشاركتك يدوياً أو عرض عدد الزوار.", "upload.modal.not-signed-in-description": "لن تتمكن من حذف مشاركتك يدوياً أو عرض عدد الزوار.",
"upload.modal.expires.never": "أبدًا", "upload.modal.expires.never": "أبدًا",
"upload.modal.expires.never-long": "لا تنتهي الصلاحية أبداً", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "انتهاء الصلاحية يتجاوز الحد الأقصى لتاريخ انتهاء الصلاحية والذي هو {max}.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "الرابط", "upload.modal.link.label": "الرابط",
"upload.modal.expires.label": "انتهاء الصلاحية", "upload.modal.expires.label": "انتهاء الصلاحية",
"upload.modal.expires.minute-singular": "دقيقة", "upload.modal.expires.minute-singular": "دقيقة",
@@ -272,16 +278,16 @@ export default {
"share.error.access-denied.title": "Private share", "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.description": "The current account does not have permission to access this share",
"share.modal.password.title": "كلمة السر مطلوبة", "share.modal.password.title": "كلمة السر مطلوبة",
"share.modal.password.description": "للوصول إلى هذه المشاركة الرجاء إدخال كلمة سر المشاركة.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "كلمة السر", "share.modal.password": "كلمة السر",
"share.modal.error.invalid-password": "كلمة السر غير صحيحة", "share.modal.error.invalid-password": "كلمة السر غير صحيحة",
"share.button.download-all": "تنزيل الكل", "share.button.download-all": "تنزيل الكل",
"share.notify.download-all-preparing": "يتم تحضير المشاركة. حاول مرة أخرى في بضع دقائق.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "رابط الملف", "share.modal.file-link": "رابط الملف",
"share.table.name": "الاسم", "share.table.name": "الاسم",
"share.table.size": "الحجم", "share.table.size": "الحجم",
"share.modal.file-preview.error.not-supported.title": "المعاينة غير مدعومة", "share.modal.file-preview.error.not-supported.title": "المعاينة غير مدعومة",
"share.modal.file-preview.error.not-supported.description": "معاينة هذا النوع من الملفات غير مدعومة. الرجاء تنزيل الملف لعرضه.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "تحرير {shareId}", "share.edit.title": "تحرير {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "حدث خطأ أثناء إنهاء مشاركتك.", "share.edit.notify.generic-error": "حدث خطأ أثناء إنهاء مشاركتك.",
"share.edit.notify.save-success": "تم تحديث المشاركة بنجاح", "share.edit.notify.save-success": "تم تحديث المشاركة بنجاح",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "الإعدادات", "admin.config.title": "الإعدادات",
"admin.config.category.general": "عام", "admin.config.category.general": "عام",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "اسم التطبيق", "admin.config.general.app-name.description": "اسم التطبيق",
"admin.config.general.app-url": "رابط التطبيق", "admin.config.general.app-url": "رابط التطبيق",
"admin.config.general.app-url.description": "الرابط الذي تكون مشاركة Pingvin صالحة عليه", "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": "إظهار الصفحة الرئيسية",
"admin.config.general.show-home-page.description": "تحديد ما إذا كان سيتم عرض الصفحة الرئيسية", "admin.config.general.show-home-page.description": "تحديد ما إذا كان سيتم عرض الصفحة الرئيسية",
"admin.config.general.session-duration": "مدة الجلسة", "admin.config.general.session-duration": "مدة الجلسة",
@@ -307,46 +321,48 @@ export default {
"admin.config.general.logo": "الشعار", "admin.config.general.logo": "الشعار",
"admin.config.general.logo.description": "يمكنك تغيير شعارك عن طريق تحميل صورة جديدة. يجب أن تكون الصورة PNG ويجب أن يكون تنسيقها 1:1.", "admin.config.general.logo.description": "يمكنك تغيير شعارك عن طريق تحميل صورة جديدة. يجب أن تكون الصورة PNG ويجب أن يكون تنسيقها 1:1.",
"admin.config.general.logo.placeholder": "اختر صورة", "admin.config.general.logo.placeholder": "اختر صورة",
"admin.config.email.enable-share-email-recipients": "تفعيل مستلمي البريد الإلكتروني لهذه المشاركة", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "السماح لرسائل البريد بأن تُشارك المستلمين. لا تفعّل هذا الخيار ما لم تفعّل SMTP مسبقًا.", "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": "عنوان الرسالة لمستلمي المشاركة",
"admin.config.email.share-recipients-subject.description": "عنوان البريد الذي سيُرسَل لمستقبِلي المشاركة.", "admin.config.email.share-recipients-subject.description": "عنوان البريد الذي سيُرسَل لمستقبِلي المشاركة.",
"admin.config.email.share-recipients-message": "رسالتك لمستقبِلي المشاركة", "admin.config.email.share-recipients-message": "رسالتك لمستقبِلي المشاركة",
"admin.config.email.share-recipients-message.description": "الرسالة التي ستُرسل لمستقبِلي المشاركة. يمكنك استخدام هذه المتغيرات:\n{creator} - اسم المستخدم الذي أنشأ المشاركة\n{shareUrl} - رابط المشاركة\n{desc} - وصف المشاركة\n{expires} - تاريخ انتهاء صلاحية المشاركة\nستتم كتابة قيم هذه المتغيرات تلقائيًا.", "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": "عنوان المشاركة العكسية",
"admin.config.email.reverse-share-subject.description": "عنوان البريد الذي سيُرسل عندما يُنشئ شخص ما مشاركةً باستخدام رابط المشاركة العكسية الخاص بك.", "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": "رسالة المشاركة العكسية", "admin.config.email.reverse-share-message": "رسالة المشاركة العكسية",
"admin.config.email.reverse-share-message.description": "الرسالة التي ستُرسل عندما يُنشئ شخص ما مشاركة باستخدام رابط المشاركة الخاص بك. سيُوضع اسم المُنشِئ ورابط المشاركة مكان {shareUrl}.", "admin.config.email.reverse-share-message.description": "الرسالة التي ستُرسل عندما يُنشئ شخص ما مشاركة باستخدام رابط المشاركة الخاص بك. سيُوضع اسم المُنشِئ ورابط المشاركة مكان {shareUrl}.",
"admin.config.email.reset-password-subject": "رسالة إعادة تعيين كلمة السر", "admin.config.email.reset-password-subject": "رسالة إعادة تعيين كلمة السر",
"admin.config.email.reset-password-subject.description": "عنوان البريد الذي سيُرسل حين يطلب مستخدم ما إعادة تعيين كلمة سرّه.", "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": "رسالة إعادة تعيين كلمة السر", "admin.config.email.reset-password-message": "رسالة إعادة تعيين كلمة السر",
"admin.config.email.reset-password-message.description": "الرسالة التي ستُرسل عندما يطلب المستخدم إعادة تعيين كلمة سرّه. سيُوضع رابط إعادة تعيين كلمة السر مكان {url}.", "admin.config.email.reset-password-message.description": "الرسالة التي ستُرسل عندما يطلب المستخدم إعادة تعيين كلمة سرّه. سيُوضع رابط إعادة تعيين كلمة السر مكان {url}.",
"admin.config.email.invite-subject": "عنوان الدعوة", "admin.config.email.invite-subject": "عنوان الدعوة",
"admin.config.email.invite-subject.description": "عنوان البريد الذي سيُرسل عندما يقوم المشرف بدعوة مستخدم ما.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "رسالة الدعوة", "admin.config.email.invite-message": "رسالة الدعوة",
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the password of the user.", "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": "السماح بالتسجيل", "admin.config.share.allow-registration": "السماح بالتسجيل",
"admin.config.share.allow-registration.description": "إتاحة تسجيل حساب جديد", "admin.config.share.allow-registration.description": "إتاحة تسجيل حساب جديد",
"admin.config.share.allow-unauthenticated-shares": "السماح بالمشاركات غير المصادق عليها", "admin.config.share.allow-unauthenticated-shares": "السماح بالمشاركات غير المصادق عليها",
"admin.config.share.allow-unauthenticated-shares.description": "إتاحة إنشاء المشاركات للمستخدمين غير الموثقين", "admin.config.share.allow-unauthenticated-shares.description": "إتاحة إنشاء المشاركات للمستخدمين غير الموثقين",
"admin.config.share.max-expiration": "أبعد زمن لانتهاء الصلاحية", "admin.config.share.max-expiration": "أبعد زمن لانتهاء الصلاحية",
"admin.config.share.max-expiration.description": "أطول زمن لانتهاء صلاحية المشاركات بالساعات. الصفر يعني أن المشاركة لن تنتهي صلاحيتها.", "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": "أكبر حجم",
"admin.config.share.max-size.description": "أكبر حجم للمشاركة مقيسًا بالبايت", "admin.config.share.max-size.description": "أكبر حجم للمشاركة",
"admin.config.share.zip-compression-level": "مستوى ضغط الZip", "admin.config.share.zip-compression-level": "مستوى ضغط الZip",
"admin.config.share.zip-compression-level.description": "ضبط الميزان بين حجم الملف وسرعة الضغط. يمكنك إدخال قيم بين 0 إلى 9، حيث 0 تعني بدون ضغط و9 تعني أقصى ضغط. ", "admin.config.share.zip-compression-level.description": "ضبط الميزان بين حجم الملف وسرعة الضغط. يمكنك إدخال قيم بين 0 إلى 9، حيث 0 تعني بدون ضغط و9 تعني أقصى ضغط. ",
"admin.config.share.chunk-size": "حجم القطعة", "admin.config.share.chunk-size": "حجم القطعة",
"admin.config.share.chunk-size.description": "ضبط حجم القطعة (بالبايت) لملفاتك المرفوعة للموازنة بين الكفاءة والفعالية حسب قوة اتصالك بالإنترنت. القطع الأصغر يمكن أن ترفع معدل النجاح في حال كان اتصالك بالإنترنت غير مستقر، بينما القطع الأكبر يمكنها أن تُسرّع رفع الملفات في حال كان الاتصال بالإنترنت مستقرًا.", "admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "مفعل", "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": "المُضيف",
"admin.config.smtp.host.description": "مضيف خادم الـSMTP", "admin.config.smtp.host.description": "مضيف خادم الـSMTP",
"admin.config.smtp.port": "المنفذ", "admin.config.smtp.port": "المنفذ",
"admin.config.smtp.port.description": "منفذ خادم الـSMTP", "admin.config.smtp.port.description": "منفذ خادم الـSMTP",
"admin.config.smtp.email": "البريد الإلكتروني", "admin.config.smtp.email": "البريد الإلكتروني",
"admin.config.smtp.email.description": "عنوان البريد الذي ستُرسَل الرسائل منه", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "اسم المستخدم", "admin.config.smtp.username": "اسم المستخدم",
"admin.config.smtp.username.description": "اسم المستخدم لخادم الـSMTP", "admin.config.smtp.username.description": "اسم المستخدم لخادم الـSMTP",
"admin.config.smtp.password": "كلمة السر", "admin.config.smtp.password": "كلمة السر",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "الرّمز السرّي للعميل لتطبيق Microsoft OAuth", "admin.config.oauth.microsoft-client-secret.description": "الرّمز السرّي للعميل لتطبيق Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "تفعيل خيار الدخول بحساب Discord", "admin.config.oauth.discord-enabled.description": "تفعيل خيار الدخول بحساب Discord",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"admin.config.oauth.discord-limited-users.description": "Limit signing in to specific users by their Discord ID. Leave it blank to disable.",
"admin.config.oauth.discord-limited-guild": "مُعرِّف خادم Discord المحدود", "admin.config.oauth.discord-limited-guild": "مُعرِّف خادم Discord المحدود",
"admin.config.oauth.discord-limited-guild.description": "حصر تسجيل الدخول على المستخدمين الموجودين في خادم محدّد. اترك هذا الخيار فارغًا لتعطيله.", "admin.config.oauth.discord-limited-guild.description": "حصر تسجيل الدخول على المستخدمين الموجودين في خادم محدّد. اترك هذا الخيار فارغًا لتعطيله.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord Client ID",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "تفعيل الدخول باستخدام OpenID Connect", "admin.config.oauth.oidc-enabled.description": "تفعيل الدخول باستخدام OpenID Connect",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "رابط الاستكشاف لتطبيق OpenID Connect OAuth", "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": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "طلب اسم المستخدم في رمز معرف OpenID Connect. إذا كنت لا تعرف معنى هذا الإعداد، اتركه فارغًا.", "admin.config.oauth.oidc-username-claim.description": "طلب اسم المستخدم في رمز معرف OpenID Connect. إذا كنت لا تعرف معنى هذا الإعداد، اتركه فارغًا.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token", "admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "الرّمز السرّي للعميل لتطبيق OpenID Connect OAuth", "admin.config.oauth.oidc-client-secret.description": "الرّمز السرّي للعميل لتطبيق OpenID Connect OAuth",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "هذه الصفحة غير موجودة.", "404.description": "هذه الصفحة غير موجودة.",
"404.button.home": "أعدني للصفحة الرئيسية", "404.button.home": "أعدني للصفحة الرئيسية",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "المستخدم المرتبط بهذا الحساب {0} غير موجود.", "error.msg.no_user": "المستخدم المرتبط بهذا الحساب {0} غير موجود.",
"error.msg.no_email": "لا يمكن الحصول على عنوان البريد الإلكتروني من هذا الحساب {0}.", "error.msg.no_email": "لا يمكن الحصول على عنوان البريد الإلكتروني من هذا الحساب {0}.",
"error.msg.already_linked": "حساب {0} هذا مرتبط بالفعل بحساب آخر.", "error.msg.already_linked": "حساب {0} هذا مرتبط بالفعل بحساب آخر.",
"error.msg.not_linked": "لم يتم ربط حساب {0} هذا بأي حساب حتى الآن.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "لم يتم التحقق من حساب {0} هذا، يرجى المحاولة مرة أخرى بعد التحقق.", "error.msg.unverified_account": "لم يتم التحقق من حساب {0} هذا، يرجى المحاولة مرة أخرى بعد التحقق.",
"error.msg.user_not_allowed": "غير مسموح لك بتسجيل الدخول.", "error.msg.user_not_allowed": "غير مسموح لك بتسجيل الدخول.",
"error.msg.cannot_get_user_info": "فشلت عملية جلب معلومات المستخدم الخاصة بك من حساب {0} هذا.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "توليد", "common.button.generate": "توليد",
"common.button.done": "تم", "common.button.done": "تم",
"common.text.link": "الرابط", "common.text.link": "الرابط",
"common.text.navigate-to-link": "الذهاب إلى الرابط", "common.text.navigate-to-link": "Visit link",
"common.text.or": "أو", "common.text.or": "أو",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "العودة", "common.button.go-back": "العودة",
"common.button.go-home": "العودة للصفحة الرئيسية", "common.button.go-home": "العودة للصفحة الرئيسية",
"common.notify.copied": "تم نسخ الرابط إلى الحافظة", "common.notify.copied": "تم نسخ الرابط إلى الحافظة",
"common.notify.copied-link": "تم نسخ الرابط إلى الحافظة",
"common.success": "تم", "common.success": "تم",
"common.error": "خطأ", "common.error": "خطأ",
"common.error.unknown": "حدث خطأ غير معروف", "common.error.unknown": "حدث خطأ غير معروف",
"common.error.invalid-email": "عنوان البريد غير صحيح", "common.error.invalid-email": "عنوان البريد غير صحيح",
"common.error.too-short": "يجب أن يكون على الأقل {length} حرفًا", "common.error.too-short": "يجب أن يكون على الأقل {length} حرفًا",
"common.error.too-long": "يجب أن يكون على الأكثر {length} حرفًا", "common.error.too-long": "يجب أن يكون على الأكثر {length} حرفًا",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "يجب أن يكون بالضبط {length} حرفًا", "common.error.exact-length": "يجب أن يكون بالضبط {length} حرفًا",
"common.error.invalid-number": "يجب أن يكون رقماً", "common.error.invalid-number": "يجب أن يكون رقماً",
"common.error.field-required": "هذا الحقل مطلوب" "common.error.field-required": "هذا الحقل مطلوب"

View File

@@ -3,9 +3,9 @@ export default {
"navbar.upload": "Nahrát", "navbar.upload": "Nahrát",
"navbar.signin": "Přihlásit se", "navbar.signin": "Přihlásit se",
"navbar.home": "Domů", "navbar.home": "Domů",
"navbar.signup": "Zaregistrovat se", "navbar.signup": "Sign up",
"navbar.links.shares": "Mé sdílení", "navbar.links.shares": "Má sdílení",
"navbar.links.reverse": "Zpětné sdílení", "navbar.links.reverse": "Zpětná sdílení",
"navbar.avatar.account": "Můj účet", "navbar.avatar.account": "Můj účet",
"navbar.avatar.admin": "Administrace", "navbar.avatar.admin": "Administrace",
"navbar.avatar.signout": "Odhlásit se", "navbar.avatar.signout": "Odhlásit se",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Self-Hosted", "home.bullet.a.name": "Self-Hosted",
"home.bullet.a.description": "Hostujte Pingvin Share na svém vlastním počítači.", "home.bullet.a.description": "Hostujte Pingvin Share na svém vlastním počítači.",
"home.bullet.b.name": "Soukromí", "home.bullet.b.name": "Soukromí",
"home.bullet.b.description": "Vaše soubory jsou vaše soubory a nikdy by se neměly dostat do rukou třetích stran.", "home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "Žádný otravný limit pro velikost souborů", "home.bullet.c.name": "Žádný otravný limit pro velikost souborů",
"home.bullet.c.description": "Nahrajte tak velké soubory, jak chcete. Limitem je pouze váš pevný disk.", "home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Začít", "home.button.start": "Začít",
"home.button.source": "Zdrojový kód", "home.button.source": "Zdrojový kód",
// END / // END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Zapomněli jste heslo?", "resetPassword.title": "Zapomněli jste heslo?",
"resetPassword.description": "Zadejte svůj e-mail pro obnovení hesla.", "resetPassword.description": "Zadejte svůj e-mail pro obnovení hesla.",
"resetPassword.notify.success": "Pokud e-mail existuje, byla na něj odeslána zpráva s odkazem k obnovení hesla.", "resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "Zpět na přihlašovací stránku", "resetPassword.button.back": "Zpět na přihlašovací stránku",
"resetPassword.text.resetPassword": "Obnovit heslo", "resetPassword.text.resetPassword": "Obnovit heslo",
"resetPassword.text.enterNewPassword": "Zadejte své nové heslo", "resetPassword.text.enterNewPassword": "Zadejte své nové heslo",
"resetPassword.input.password": "Nové heslo", "resetPassword.input.password": "Nové heslo",
"resetPassword.notify.passwordReset": "Vaše heslo bylo úspěšně obnoveno.", "resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account // /account
"account.title": "Můj účet", "account.title": "Můj účet",
"account.card.info.title": "Informace o účtu", "account.card.info.title": "Informace o účtu",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Heslo", "account.card.password.title": "Heslo",
"account.card.password.old": "Staré heslo", "account.card.password.old": "Staré heslo",
"account.card.password.new": "Nové heslo", "account.card.password.new": "Nové heslo",
"account.card.password.noPasswordSet": "Nemáte nastaveno heslo. Pokud se chcete přihlásit pomocí e-mailu a hesla, musíte si nastavit 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.notify.password.success": "Heslo bylo úspěšně změněno", "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.title": "Přihlášení přes sociální sítě",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,55 +85,58 @@ export default {
"account.card.oauth.unlink": "Odpojit", "account.card.oauth.unlink": "Odpojit",
"account.card.oauth.unlinked": "Odpojeno", "account.card.oauth.unlinked": "Odpojeno",
"account.modal.unlink.title": "Odpojit účet", "account.modal.unlink.title": "Odpojit účet",
"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.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": "Úspěšně odpojeno", "account.notify.oauth.unlinked.success": "Úspěšně odpojeno",
"account.card.security.title": "Zabezpečení", "account.card.security.title": "Zabezpečení",
"account.card.security.totp.enable.description": "Zadejte své současné heslo, abyste mohli povolit TOTP", "account.card.security.totp.enable.description": "Zadejte své současné heslo, abyste mohli povolit TOTP",
"account.card.security.totp.disable.description": "Zadejte své současné heslo pro zakázání TOTP", "account.card.security.totp.disable.description": "Zadejte své současné heslo pro zakázání TOTP",
"account.card.security.totp.button.start": "Start", "account.card.security.totp.button.start": "Začít",
"account.modal.totp.title": "Enable TOTP", "account.modal.totp.title": "Povolit TOTP",
"account.modal.totp.step1": "Step 1: Add your authenticator", "account.modal.totp.step1": "Krok 1: Přidejte váš autentifikátor",
"account.modal.totp.step2": "Step 2: Validate your code", "account.modal.totp.step2": "Krok 2: Ověřte váš kód",
"account.modal.totp.enterManually": "Enter manually", "account.modal.totp.enterManually": "Zadat ručně",
"account.modal.totp.code": "Code", "account.modal.totp.code": "Kód",
"common.button.clickToCopy": "Click to copy", "common.button.clickToCopy": "Kliknutím zkopírujete",
"account.modal.totp.verify": "Verify", "account.modal.totp.verify": "Ověřit",
"account.notify.totp.disable": "TOTP disabled successfully", "account.notify.totp.disable": "TOTP úspěšně zakázáno",
"account.notify.totp.enable": "TOTP enabled successfully", "account.notify.totp.enable": "TOTP úspěšně povoleno",
"account.card.language.title": "Language", "account.card.language.title": "Jazyk",
"account.card.language.description": "The project is translated by the community. Some languages might be incomplete.", "account.card.language.description": "Projekt je přeložen komunitou. Některé jazyky mohou být neúplné.",
"account.card.color.title": "Color scheme", "account.card.color.title": "Barevné schéma",
// ThemeSwitcher.tsx // ThemeSwitcher.tsx
"account.theme.dark": "Dark", "account.theme.dark": "Tmavé",
"account.theme.light": "Light", "account.theme.light": "Světlé",
"account.theme.system": "System", "account.theme.system": "Systémové",
"account.button.delete": "Delete Account", "account.button.delete": "Odstranit účet",
"account.modal.delete.title": "Delete Account", "account.modal.delete.title": "Odstranit účet",
"account.modal.delete.description": "Do you really want to delete your account including all your active shares?", "account.modal.delete.description": "Opravdu chcete odstranit svůj účet včetně všech aktivních sdílení?",
// END /account // END /account
// /account/shares // /account/shares
"account.shares.title": "My shares", "account.shares.title": "Má sdílení",
"account.shares.title.empty": "It's empty here 👀", "account.shares.title.empty": "Je tu prázdno 👀",
"account.shares.description.empty": "You don't have any shares.", "account.shares.description.empty": "Nemáte žádná sdílení.",
"account.shares.button.create": "Create one", "account.shares.button.create": "Create one",
"account.shares.info.title": "Share informations", "account.shares.info.title": "Share informations",
"account.shares.table.id": "ID", "account.shares.table.id": "ID",
"account.shares.table.name": "Name", "account.shares.table.name": "Název",
"account.shares.table.description": "Description", "account.shares.table.description": "Popis",
"account.shares.table.visitors": "Visitors", "account.shares.table.visitors": "Návštěvníci",
"account.shares.table.expiresAt": "Expires at", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created at", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Size", "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": "Share informations", "account.shares.modal.share-informations": "Share informations",
"account.shares.modal.share-link": "Share link", "account.shares.modal.share-link": "Odkaz na sdílení",
"account.shares.modal.delete.title": "Delete share {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Do you really want to delete this share?", "account.shares.modal.delete.description": "Opravdu chcete odstranit toto sdílení?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
"account.reverseShares.title": "Reverse shares", "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.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.empty": "Je tu prázdno 👀", "account.reverseShares.title.empty": "Je tu prázdno 👀",
"account.reverseShares.description.empty": "You don't have any reverse shares.", "account.reverseShares.description.empty": "Nemáte žádná zpětná sdílení.",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Vytvořit zpětné sdílení", "account.reverseShares.modal.title": "Vytvořit zpětné sdílení",
"account.reverseShares.modal.expiration.label": "Expirace", "account.reverseShares.modal.expiration.label": "Expirace",
@@ -146,18 +149,18 @@ export default {
"account.reverseShares.modal.expiration.week-singular": "Týden", "account.reverseShares.modal.expiration.week-singular": "Týden",
"account.reverseShares.modal.expiration.week-plural": "Týdnů", "account.reverseShares.modal.expiration.week-plural": "Týdnů",
"account.reverseShares.modal.expiration.month-singular": "Měsíc", "account.reverseShares.modal.expiration.month-singular": "Měsíc",
"account.reverseShares.modal.expiration.month-plural": "Months", "account.reverseShares.modal.expiration.month-plural": "Měsíců",
"account.reverseShares.modal.expiration.year-singular": "Year", "account.reverseShares.modal.expiration.year-singular": "Rok",
"account.reverseShares.modal.expiration.year-plural": "Years", "account.reverseShares.modal.expiration.year-plural": "Let",
"account.reverseShares.modal.max-size.label": "Max share size", "account.reverseShares.modal.max-size.label": "Max. velikost sdílení",
"account.reverseShares.modal.send-email": "Send email notification", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "Send an email notification when a share is created with this reverse share link.", "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": "Simple mode", "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 be able to customize only the name and description of the share.", "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": "Veřejný přístup",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "Max uses", "account.reverseShares.modal.max-use.label": "Max. použití",
"account.reverseShares.modal.max-use.description": "The maximum amount of times this URL can be used to create a share.", "account.reverseShares.modal.max-use.description": "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.never-expires": "Toto zpětné sdílení nikdy nevyprší.",
"account.reverseShare.expires-on": "Toto zpětné sdílení vyprší {expiration}.", "account.reverseShare.expires-on": "Toto zpětné sdílení vyprší {expiration}.",
"account.reverseShares.table.no-shares": "Zatím nebyla vytvořena žádná sdílení", "account.reverseShares.table.no-shares": "Zatím nebyla vytvořena žádná sdílení",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Uživatelské jméno", "admin.users.table.username": "Uživatelské jméno",
"admin.users.table.email": "E-mail", "admin.users.table.email": "E-mail",
"admin.users.table.admin": "Administrátor", "admin.users.table.admin": "Administrátor",
"admin.users.edit.update.title": "Aktualizovat uživatele {username}", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Administrátorská práva", "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.title": "Změnit heslo",
"admin.users.edit.update.change-password.field": "Nové 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.change-password.button": "Uložit nové heslo",
"admin.users.edit.update.notify.password.success": "Heslo bylo úspěšně změněno", "admin.users.edit.update.notify.password.success": "Heslo bylo úspěšně změněno",
"admin.users.edit.delete.title": "Odstranit uživatele {username}", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Opravdu chcete smazat tohoto uživatele a všechny jeho sdílení?", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Vytvořit uživatele", "admin.users.modal.create.title": "Vytvořit uživatele",
"admin.users.modal.create.username": "Uživatelské jméno", "admin.users.modal.create.username": "Uživatelské jméno",
@@ -206,44 +209,47 @@ export default {
"admin.shares.table.id": "ID sdílení", "admin.shares.table.id": "ID sdílení",
"admin.shares.table.username": "Autor", "admin.shares.table.username": "Autor",
"admin.shares.table.visitors": "Návštěvníci", "admin.shares.table.visitors": "Návštěvníci",
"admin.shares.table.expires": "Vyprší", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Odstranit sdílení {id}", "admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Opravdu chcete smazat toto sdílení?", "admin.shares.edit.delete.description": "Opravdu chcete smazat toto sdílení?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Nahrát", "upload.title": "Nahrát",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Při dokončování vašeho sdílení došlo k chybě.", "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.notify.count-failed": "{count} souborů se nepodařilo nahrát. Zkouším to znovu.",
"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 // Dropzone.tsx
"upload.dropzone.title": "Nahrát soubory", "upload.dropzone.title": "Nahrát soubory",
"upload.dropzone.description": "Pro zahájení sdílení přetáhněte soubory sem. Můžeme přijmout pouze soubory, které jsou menší než {maxSize}.", "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": "Vaše soubory přesahují maximální velikost {maxSize}.", "upload.dropzone.notify.file-too-big": "Vaše soubory přesahují maximální velikost {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Name", "upload.filelist.name": "Název",
"upload.filelist.size": "Velikost", "upload.filelist.size": "Velikost",
// showCreateUploadModal.tsx // showCreateUploadModal.tsx
"upload.modal.title": "Create Share", "upload.modal.title": "Vytvořit sdílení",
"upload.modal.link.error.invalid": "Může obsahovat pouze písmena, číslice, podtržítka a pomlčky", "upload.modal.link.error.invalid": "Může obsahovat pouze písmena, číslice, podtržítka a pomlčky",
"upload.modal.link.error.taken": "Tento odkaz je již používán", "upload.modal.link.error.taken": "Tento odkaz je již používán",
"upload.modal.not-signed-in": "Nejste přihlášeni", "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.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": "never", "upload.modal.expires.never": "nikdy",
"upload.modal.expires.never-long": "Nikdy nevyprší", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration exceeds maximum expiration date of {max}.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Odkaz", "upload.modal.link.label": "Odkaz",
"upload.modal.expires.label": "Expirace", "upload.modal.expires.label": "Expirace",
"upload.modal.expires.minute-singular": "Minute", "upload.modal.expires.minute-singular": "Minuta",
"upload.modal.expires.minute-plural": "Minutes", "upload.modal.expires.minute-plural": "Minut",
"upload.modal.expires.hour-singular": "Hour", "upload.modal.expires.hour-singular": "Hodina",
"upload.modal.expires.hour-plural": "Hours", "upload.modal.expires.hour-plural": "Hodin",
"upload.modal.expires.day-singular": "Day", "upload.modal.expires.day-singular": "Den",
"upload.modal.expires.day-plural": "Days", "upload.modal.expires.day-plural": "D",
"upload.modal.expires.week-singular": "Week", "upload.modal.expires.week-singular": "Týden",
"upload.modal.expires.week-plural": "Weeks", "upload.modal.expires.week-plural": "Týdnů",
"upload.modal.expires.month-singular": "Month", "upload.modal.expires.month-singular": "Měsíc",
"upload.modal.expires.month-plural": "Months", "upload.modal.expires.month-plural": "Měsíců",
"upload.modal.expires.year-singular": "Year", "upload.modal.expires.year-singular": "Rok",
"upload.modal.expires.year-plural": "Years", "upload.modal.expires.year-plural": "Let",
"upload.modal.accordion.name-and-description.title": "Název a popis", "upload.modal.accordion.name-and-description.title": "Název a popis",
"upload.modal.accordion.name-and-description.name.placeholder": "Název", "upload.modal.accordion.name-and-description.name.placeholder": "Název",
"upload.modal.accordion.name-and-description.description.placeholder": "Poznámka pro příjemce tohoto sdílení", "upload.modal.accordion.name-and-description.description.placeholder": "Poznámka pro příjemce tohoto sdílení",
@@ -272,81 +278,91 @@ export default {
"share.error.access-denied.title": "Soukromé sdílení", "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.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.title": "Heslo vyžadováno",
"share.modal.password.description": "Pro přístup k tomuto sdílení zadejte prosím heslo pro toto sdílení.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Heslo", "share.modal.password": "Heslo",
"share.modal.error.invalid-password": "Invalid password", "share.modal.error.invalid-password": "Neplatné heslo",
"share.button.download-all": "Download all", "share.button.download-all": "Stáhnout vše",
"share.notify.download-all-preparing": "The share is preparing. Try again in a few minutes.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "File link", "share.modal.file-link": "Odkaz na soubor",
"share.table.name": "Name", "share.table.name": "Název",
"share.table.size": "Size", "share.table.size": "Velikost",
"share.modal.file-preview.error.not-supported.title": "Preview not supported", "share.modal.file-preview.error.not-supported.title": "Náhled není podporován",
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Edit {shareId}", "share.edit.title": "Upravit {shareId}",
"share.edit.append-upload": "Append file", "share.edit.append-upload": "Připojit soubor",
"share.edit.notify.generic-error": "An error occurred while finishing your share.", "share.edit.notify.generic-error": "Při dokončování vašeho sdílení došlo k chybě.",
"share.edit.notify.save-success": "Share updated successfully", "share.edit.notify.save-success": "Sdílení úspěšně aktualizováno",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Configuration", "admin.config.title": "Nastavení",
"admin.config.category.general": "General", "admin.config.category.general": "Obecné",
"admin.config.category.share": "Share", "admin.config.category.share": "Sdílení",
"admin.config.category.email": "Email", "admin.config.category.email": "E-mail",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "admin.config.category.oauth": "Přihlášení přes sociální sítě",
"admin.config.general.app-name": "App name", "admin.config.general.app-name": "Název aplikace",
"admin.config.general.app-name.description": "Name of the application", "admin.config.general.app-name.description": "Název aplikace",
"admin.config.general.app-url": "App URL", "admin.config.general.app-url": "URL aplikace",
"admin.config.general.app-url.description": "On which URL Pingvin Share is available", "admin.config.general.app-url.description": "Na kterém URL je Pingvin Share k dispozici",
"admin.config.general.show-home-page": "Show home page", "admin.config.general.secure-cookies": "Bezpečné cookies",
"admin.config.general.show-home-page.description": "Whether to show the home page", "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.session-duration": "Session Duration", "admin.config.general.show-home-page": "Zobrazit domovskou stránku",
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).", "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.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.", "admin.config.general.logo.description": "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": "Pick image", "admin.config.general.logo.placeholder": "Vybrat obrázek",
"admin.config.email.enable-share-email-recipients": "Enable share email recipients", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow emails to share recipients. Only enable this if you have enabled SMTP.", "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": "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-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": "Share recipients message",
"admin.config.email.share-recipients-message.description": "Zpráva, která bude odeslána příjemcům sdílení. Dostupné proměnné:\n {creator} - Uživatelské jméno tvůrce sdílení\n {shareUrl} - URL sdílení\n {desc} - Popis sdílení\n {expires} - Datum vypršení platností sdílení\n Proměnné budou nahrazeny skutečnou hodnotou.", "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": "Předmět e-mailu o zpětném sdílení", "admin.config.email.reverse-share-subject": "Předmět e-mailu o zpětném sdílení",
"admin.config.email.reverse-share-subject.description": "Předmět e-mailu, který bude odeslán, když někdo vytvoří sdílení s vaším odkazem na zpětné 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": "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 reverzní sdílení. {shareUrl} bude nahrazeno jménem tvůrce a URL pro 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.email.reset-password-subject": "Předmět e-mailu pro obnovení hesla", "admin.config.email.reset-password-subject": "Předmět e-mailu pro obnovení hesla",
"admin.config.email.reset-password-subject.description": "Předmět e-mailu, který bude odeslán, když uživatel požádá o 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-message": "Zpráva 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.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": "Předmět pozvánky",
"admin.config.email.invite-subject.description": "Předmět e-mailu, který bude odeslán, když administrátor pozve uživatele.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Zpráva pozvánky", "admin.config.email.invite-message": "Zpráva pozvánky",
"admin.config.email.invite-message.description": "Zpráva, která bude odeslána, když administrátor pozve uživatele. {url} bude nahrazeno URL pozvánky, {email} e-mailem a {password} heslem uživatele.", "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": "Povolit registraci", "admin.config.share.allow-registration": "Povolit registraci",
"admin.config.share.allow-registration.description": "Zda je registrace povolena", "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": "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.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": "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": "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. velikost", "admin.config.share.max-size": "Max. velikost",
"admin.config.share.max-size.description": "Maximální velikost sdílení v bajtech", "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": "Ú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.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": "Velikost bloku",
"admin.config.share.chunk-size.description": "Upravte velikost bloku (v bajtech) 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.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": "Automaticky otevřít menu vytvoření sdílení", "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.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": "Povoleno", "admin.config.smtp.enabled": "Enable",
"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.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": "Hostitel",
"admin.config.smtp.host.description": "Hostitel SMTP serveru", "admin.config.smtp.host.description": "Hostitel SMTP serveru",
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port SMTP serveru", "admin.config.smtp.port.description": "Port SMTP serveru",
"admin.config.smtp.email": "E-mail", "admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "E-mailová adresa, ze které budou e-maily odesílány", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Uživatelské jméno", "admin.config.smtp.username": "Uživatelské jméno",
"admin.config.smtp.username.description": "Uživatelské jméno SMTP serveru", "admin.config.smtp.username.description": "Uživatelské jméno SMTP serveru",
"admin.config.smtp.password": "Heslo", "admin.config.smtp.password": "Heslo",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "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": "Discord",
"admin.config.oauth.discord-enabled.description": "Zda je povoleno přihlášení přes 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-guild": "Discord limited server ID",
"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-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": "Discord Client ID",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Zda je povoleno přihlášení přes 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": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app", "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": "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-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": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app", "admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Povolit LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "URL serveru", "admin.config.ldap.url": "URL serveru",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Výchozí uživatel, který bude použit pro vyhledávání uživatelů", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Heslo pro uživatele pro vyhledávání", "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": "User base",
"admin.config.ldap.search-base.description": "Základní umístění, kde budou prováděna hledání uživatelů", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Skupina potřebná pro administrativní přístup.", "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.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.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
"404.description": "Jejda, tato stránka neexistuje.", "404.description": "Jejda, tato stránka neexistuje.",
"404.button.home": "Bring me back home", "404.button.home": "Bring me back home",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "Uživatel propojený s tímto účtem {0} neexistuje.", "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.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.already_linked": "Tento účet {0} je již propojen s jiným účtem.",
"error.msg.not_linked": "Tento účet {0} ještě nebyl propojen s žádným účtem.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "Tento účet {0} není ověřen, zkuste to prosím znovu po ověření.", "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.user_not_allowed": "Nemáte oprávnění k přihlášení.",
"error.msg.cannot_get_user_info": "Nelze získat informace o vašem uživateli z tohoto účtu {0}.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,18 +509,22 @@ export default {
"common.button.generate": "Generovat", "common.button.generate": "Generovat",
"common.button.done": "Hotovo", "common.button.done": "Hotovo",
"common.text.link": "Odkaz", "common.text.link": "Odkaz",
"common.text.navigate-to-link": "Přejít na odkaz", "common.text.navigate-to-link": "Visit link",
"common.text.or": "nebo", "common.text.or": "nebo",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Vrátit se zpět", "common.button.go-back": "Vrátit se zpět",
"common.button.go-home": "Jít domů", "common.button.go-home": "Jít domů",
"common.notify.copied": "Váš odkaz byl zkopírován do schránky", "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.success": "Úspěch",
"common.error": "Chyba", "common.error": "Chyba",
"common.error.unknown": "Došlo k neznámé chybě", "common.error.unknown": "Došlo k neznámé chybě",
"common.error.invalid-email": "Invalid email address", "common.error.invalid-email": "Invalid email address",
"common.error.too-short": "Must be at least {length} characters", "common.error.too-short": "Musí mít alespoň {length} znaků",
"common.error.too-long": "Must be at most {length} characters", "common.error.too-long": "Musí mít maximálně {length} znaků",
"common.error.exact-length": "Must be exactly {length} characters", "common.error.number-too-small": "Must be at least {min}",
"common.error.invalid-number": "Must be a number", "common.error.number-too-large": "Must be at most {max}",
"common.error.field-required": "This field is required" "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

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Upload", "navbar.upload": "Upload",
"navbar.signin": "Log ind", "navbar.signin": "Log ind",
"navbar.home": "Hjem", "navbar.home": "Hjem",
"navbar.signup": "Opret bruger", "navbar.signup": "Sign up",
"navbar.links.shares": "Mine delte filer", "navbar.links.shares": "Mine delte filer",
"navbar.links.reverse": "Omvendt deling", "navbar.links.reverse": "Omvendt deling",
"navbar.avatar.account": "Min bruger", "navbar.avatar.account": "Min bruger",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Self-Hosted", "home.bullet.a.name": "Self-Hosted",
"home.bullet.a.description": "Host Pingvin Share på din egen maskine.", "home.bullet.a.description": "Host Pingvin Share på din egen maskine.",
"home.bullet.b.name": "Privatliv", "home.bullet.b.name": "Privatliv",
"home.bullet.b.description": "Dine filer er dine filer og bør ikke komme i hænderne på tredjeparter.", "home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "Ingen irriterende grænse for filstørrelse", "home.bullet.c.name": "Ingen irriterende grænse for filstørrelse",
"home.bullet.c.description": "Upload så store filer, som du vil. Kun din harddisk sætter grænsen.", "home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Kom i gang", "home.button.start": "Kom i gang",
"home.button.source": "Source code", "home.button.source": "Source code",
// END / // END /
@@ -34,7 +34,7 @@ export default {
"signIn.notify.totp-required.title": "2-faktor login påkrævet", "signIn.notify.totp-required.title": "2-faktor login påkrævet",
"signIn.notify.totp-required.description": "Indtast den aktuelle engangskode fra din 2-faktor Authenticator", "signIn.notify.totp-required.description": "Indtast den aktuelle engangskode fra din 2-faktor Authenticator",
"signIn.oauth.or": "OR", "signIn.oauth.or": "OR",
"signIn.oauth.signInWith": "Sign in with", "signIn.oauth.signInWith": "Log ind med",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Glemt din adgangskode?", "resetPassword.title": "Glemt din adgangskode?",
"resetPassword.description": "Indtast din e-mail for at nulstille din adgangskode.", "resetPassword.description": "Indtast din e-mail for at nulstille din adgangskode.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.", "resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "Tilbage til login", "resetPassword.button.back": "Tilbage til login",
"resetPassword.text.resetPassword": "Nulstil adgangskode", "resetPassword.text.resetPassword": "Nulstil adgangskode",
"resetPassword.text.enterNewPassword": "Indtast din nye adgangskode", "resetPassword.text.enterNewPassword": "Indtast din nye adgangskode",
"resetPassword.input.password": "Ny adgangskode", "resetPassword.input.password": "Ny adgangskode",
"resetPassword.notify.passwordReset": "Adgangskoden er blevet nulstillet.", "resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account // /account
"account.title": "Min bruger", "account.title": "Min bruger",
"account.card.info.title": "Brugerinfo", "account.card.info.title": "Brugerinfo",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Adgangskode", "account.card.password.title": "Adgangskode",
"account.card.password.old": "Gammel adgangskode", "account.card.password.old": "Gammel adgangskode",
"account.card.password.new": "Ny adgangskode", "account.card.password.new": "Ny adgangskode",
"account.card.password.noPasswordSet": "You don't have a password set. If you want to sign in with email and password you need to set a 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": "Adgangskoden er ændret", "account.notify.password.success": "Adgangskoden er ændret",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Social login",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Unlink",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Unlinked",
"account.modal.unlink.title": "Unlink account", "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 username and password.", "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.notify.oauth.unlinked.success": "Unlinked successfully",
"account.card.security.title": "Sikkerhed", "account.card.security.title": "Sikkerhed",
"account.card.security.totp.enable.description": "Indtast din nuværende adgangskode for at begynde opsætningen af 2-faktor login", "account.card.security.totp.enable.description": "Indtast din nuværende adgangskode for at begynde opsætningen af 2-faktor login",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Navn", "account.shares.table.name": "Navn",
"account.shares.table.description": "Beskrivelse", "account.shares.table.description": "Beskrivelse",
"account.shares.table.visitors": "Besøgende", "account.shares.table.visitors": "Besøgende",
"account.shares.table.expiresAt": "Udløber d", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Oprettet d.", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Størrelse", "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-informations": "Share informations",
"account.shares.modal.share-link": "Del link", "account.shares.modal.share-link": "Del link",
"account.shares.modal.delete.title": "Slet share {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Ønsker du virkelig at slette denne deling?", "account.shares.modal.delete.description": "Ønsker du virkelig at slette denne deling?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -135,7 +138,7 @@ export default {
"account.reverseShares.title.empty": "Der er tomt her 👀", "account.reverseShares.title.empty": "Der er tomt her 👀",
"account.reverseShares.description.empty": "You don't have any reverse shares.", "account.reverseShares.description.empty": "You don't have any reverse shares.",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Create reverse share", "account.reverseShares.modal.title": "Opret omvendt deling",
"account.reverseShares.modal.expiration.label": "Udløb", "account.reverseShares.modal.expiration.label": "Udløb",
"account.reverseShares.modal.expiration.minute-singular": "Minut", "account.reverseShares.modal.expiration.minute-singular": "Minut",
"account.reverseShares.modal.expiration.minute-plural": "Minutter", "account.reverseShares.modal.expiration.minute-plural": "Minutter",
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "År", "account.reverseShares.modal.expiration.year-singular": "År",
"account.reverseShares.modal.expiration.year-plural": "År", "account.reverseShares.modal.expiration.year-plural": "År",
"account.reverseShares.modal.max-size.label": "Maksimal størrelse for deling", "account.reverseShares.modal.max-size.label": "Maksimal størrelse for deling",
"account.reverseShares.modal.send-email": "Send e-mail notifikation", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "Send en e-mail notifikation, når der oprettes en deling med dette omvendte delingslink.", "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": "Simple mode",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.", "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": "Offentlig adgang",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "Maksimal anvendelser", "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.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.", "account.reverseShare.never-expires": "Denne omvendte deling udløber aldrig.",
@@ -168,7 +171,7 @@ export default {
"account.reverseShares.table.max-size": "Maksimal størrelse for deling", "account.reverseShares.table.max-size": "Maksimal størrelse for deling",
"account.reverseShares.table.expires": "Udløber d", "account.reverseShares.table.expires": "Udløber d",
"account.reverseShares.modal.reverse-share-link": "Reverse share link", "account.reverseShares.modal.reverse-share-link": "Reverse share link",
"account.reverseShares.modal.delete.title": "Delete reverse share", "account.reverseShares.modal.delete.title": "Slet omvendt deling",
"account.reverseShares.modal.delete.description": "Ønsker du virkelig at slette denne omvendte deling? Hvis du gør det, vil de tilknyttede delinger også blive slettet.", "account.reverseShares.modal.delete.description": "Ønsker du virkelig at slette denne omvendte deling? Hvis du gør det, vil de tilknyttede delinger også blive slettet.",
// END /account/reverseShares // END /account/reverseShares
// /admin // /admin
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Brugernavn", "admin.users.table.username": "Brugernavn",
"admin.users.table.email": "E-mail", "admin.users.table.email": "E-mail",
"admin.users.table.admin": "Admin", "admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Opdater bruger {username}", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Admin rettigheder", "admin.users.edit.update.admin-privileges": "Admin rettigheder",
"admin.users.edit.update.change-password.title": "Skift adgangskode", "admin.users.edit.update.change-password.title": "Skift adgangskode",
"admin.users.edit.update.change-password.field": "Ny adgangskode", "admin.users.edit.update.change-password.field": "Ny adgangskode",
"admin.users.edit.update.change-password.button": "Gem ny adgangskode", "admin.users.edit.update.change-password.button": "Gem ny adgangskode",
"admin.users.edit.update.notify.password.success": "Adgangskoden er ændret", "admin.users.edit.update.notify.password.success": "Adgangskoden er ændret",
"admin.users.edit.delete.title": "Slet bruger {username}", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Er du sikker på du vil slette denne bruger og tilhørende delinger?", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Opret bruger", "admin.users.modal.create.title": "Opret bruger",
"admin.users.modal.create.username": "Brugernavn", "admin.users.modal.create.username": "Brugernavn",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator", "admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Besøgende", "admin.shares.table.visitors": "Besøgende",
"admin.shares.table.expires": "Expires At", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share {id}", "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": "Do you really want to delete this share?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "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.generic-error": "Der opstod en fejl under afslutningen af din deling.",
"upload.notify.count-failed": "{count} files failed to upload. Trying again.", "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 // Dropzone.tsx
"upload.dropzone.title": "Upload filer", "upload.dropzone.title": "Upload filer",
"upload.dropzone.description": "Drag'n'drop files here to start your share. We can accept only files that are less than {maxSize} in total.", "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}.", "upload.dropzone.notify.file-too-big": "Your files exceed the maximum share size of {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Navn", "upload.filelist.name": "Navn",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Du er ikke logget ind", "upload.modal.not-signed-in": "Du er ikke logget ind",
"upload.modal.not-signed-in-description": "Du vil ikke være i stand til at slette din deling manuelt og se antallet af besøgende.", "upload.modal.not-signed-in-description": "Du vil ikke være i stand til at slette din deling manuelt og se antallet af besøgende.",
"upload.modal.expires.never": "aldrig", "upload.modal.expires.never": "aldrig",
"upload.modal.expires.never-long": "Udløber aldrig", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Udløbsdatoen overskrider den maksimalt tilladte udløbsdato på {max}.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Link", "upload.modal.link.label": "Link",
"upload.modal.expires.label": "Udløb", "upload.modal.expires.label": "Udløb",
"upload.modal.expires.minute-singular": "Minut", "upload.modal.expires.minute-singular": "Minut",
@@ -244,7 +250,7 @@ export default {
"upload.modal.expires.month-plural": "Måneder", "upload.modal.expires.month-plural": "Måneder",
"upload.modal.expires.year-singular": "År", "upload.modal.expires.year-singular": "År",
"upload.modal.expires.year-plural": "År", "upload.modal.expires.year-plural": "År",
"upload.modal.accordion.name-and-description.title": "Name and description", "upload.modal.accordion.name-and-description.title": "Navn og beskrivelse",
"upload.modal.accordion.name-and-description.name.placeholder": "Navn", "upload.modal.accordion.name-and-description.name.placeholder": "Navn",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share", "upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
"upload.modal.accordion.email.title": "E-mail modtagere", "upload.modal.accordion.email.title": "E-mail modtagere",
@@ -269,26 +275,32 @@ export default {
"share.error.removed.title": "Deling fjernet", "share.error.removed.title": "Deling fjernet",
"share.error.not-found.title": "Delingen blev ikke fundet", "share.error.not-found.title": "Delingen blev ikke fundet",
"share.error.not-found.description": "Den deling, du leder efter, eksisterer ikke.", "share.error.not-found.description": "Den deling, du leder efter, eksisterer ikke.",
"share.error.access-denied.title": "Private share", "share.error.access-denied.title": "Privat deling",
"share.error.access-denied.description": "The current account does not have permission to access this share", "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.title": "Adgangskode påkrævet",
"share.modal.password.description": "For at få adgang til denne deling, indtast venligst adgangskoden til delingen.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Adgangskode", "share.modal.password": "Adgangskode",
"share.modal.error.invalid-password": "Ugyldig adgangskode", "share.modal.error.invalid-password": "Ugyldig adgangskode",
"share.button.download-all": "Download alle", "share.button.download-all": "Download alle",
"share.notify.download-all-preparing": "Delingen forberedes. Prøv igen om et par minutter.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "Fil link", "share.modal.file-link": "Fil link",
"share.table.name": "Navn", "share.table.name": "Navn",
"share.table.size": "Størrelse", "share.table.size": "Størrelse",
"share.modal.file-preview.error.not-supported.title": "Forhåndsvisning ikke understøttet", "share.modal.file-preview.error.not-supported.title": "Forhåndsvisning ikke understøttet",
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Rediger {shareId}", "share.edit.title": "Rediger {shareId}",
"share.edit.append-upload": "Append file", "share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.", "share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully", "share.edit.notify.save-success": "Deling opdateret",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Konfiguration", "admin.config.title": "Konfiguration",
"admin.config.category.general": "Generelt", "admin.config.category.general": "Generelt",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "Navnet på applikationen", "admin.config.general.app-name.description": "Navnet på applikationen",
"admin.config.general.app-url": "App URL", "admin.config.general.app-url": "App URL",
"admin.config.general.app-url.description": "På hvilken URL Pingvin Share er tilgængelig", "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": "Vis forside",
"admin.config.general.show-home-page.description": "Om forsiden skal vises", "admin.config.general.show-home-page.description": "Om forsiden skal vises",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
@@ -307,46 +321,48 @@ export default {
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Skift dit logo ved at uploade et nyt billede. Billedet skal være PNG og skal have formatet 1:1.", "admin.config.general.logo.description": "Skift dit logo ved at uploade et nyt billede. Billedet skal være PNG og skal have formatet 1:1.",
"admin.config.general.logo.placeholder": "Vælg billede", "admin.config.general.logo.placeholder": "Vælg billede",
"admin.config.email.enable-share-email-recipients": "Aktiver deling til e-mail modtagere", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Whether to allow emails to share recipients. Only enable this if you have enabled SMTP.", "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": "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-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": "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 The 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": "Reverse share subject",
"admin.config.email.reverse-share-subject.description": "Subject of the email which gets sent when someone created a share with your reverse share link.", "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": "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.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": "Reset password subject",
"admin.config.email.reset-password-subject.description": "Subject of the email which gets sent when a user requests a password reset.", "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": "Nulstil adgangskode besked", "admin.config.email.reset-password-message": "Nulstil adgangskode besked",
"admin.config.email.reset-password-message.description": "Message which gets sent when a user requests a password reset. {url} will be replaced with the reset password URL.", "admin.config.email.reset-password-message.description": "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": "Invitations emne", "admin.config.email.invite-subject": "Invitations emne",
"admin.config.email.invite-subject.description": "Emne for den e-mail, der sendes, når en administrator inviterer en ny bruger.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Invitations besked", "admin.config.email.invite-message": "Invitations besked",
"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 password of the user.", "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": "Tillad oprettelser", "admin.config.share.allow-registration": "Tillad oprettelser",
"admin.config.share.allow-registration.description": "Om alle skal kunne oprette en bruger", "admin.config.share.allow-registration.description": "Om alle skal kunne oprette en bruger",
"admin.config.share.allow-unauthenticated-shares": "Tillad uautoriserede delinger", "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.allow-unauthenticated-shares.description": "Whether unauthenticated users can create shares",
"admin.config.share.max-expiration": "Maks. udløb", "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": "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": "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.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": "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 speed up uploads for stable connections.", "admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "Aktiveret", "admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "Om SMTP er aktiveret. Aktiver kun SMTP, hvis du har indtastet SMTP-server vært, port, e-mail, bruger og adgangskode.", "admin.config.smtp.enabled.description": "Om SMTP er aktiveret. Aktiver kun SMTP, hvis du har indtastet SMTP-server vært, port, e-mail, bruger og adgangskode.",
"admin.config.smtp.host": "Vært", "admin.config.smtp.host": "Vært",
"admin.config.smtp.host.description": "Vært for SMTP serveren", "admin.config.smtp.host.description": "Vært for SMTP serveren",
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Porten til SMTP serveren", "admin.config.smtp.port.description": "Porten til SMTP serveren",
"admin.config.smtp.email": "E-mail", "admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "E-mail adressen som der skal afsendes fra", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Brugernavn", "admin.config.smtp.username": "Brugernavn",
"admin.config.smtp.username.description": "Brugernavnet til SMTP serveren", "admin.config.smtp.username.description": "Brugernavnet til SMTP serveren",
"admin.config.smtp.password": "Adgangskode", "admin.config.smtp.password": "Adgangskode",
@@ -355,13 +371,13 @@ export default {
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates", "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.description": "Only set this to true if you need to trust self signed certificates.",
"admin.config.oauth.allow-registration": "Tillad registrering", "admin.config.oauth.allow-registration": "Tillad registrering",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Tillad brugere at registrere sig via socialt login",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "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.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": "Deaktiver login med password",
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.", "admin.config.oauth.disable-password.description": "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": "GitHub",
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled", "admin.config.oauth.github-enabled.description": "Om GitHub login er aktiveret",
"admin.config.oauth.github-client-id": "GitHub Client ID", "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-id.description": "Client ID of the GitHub OAuth app",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "GitHub Client secret",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "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": "Discord",
"admin.config.oauth.discord-enabled.description": "Whether Discord login is enabled", "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": "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-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": "Discord Client ID",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled", "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": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app", "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": "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-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": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app", "admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin gruppe",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Gruppe påkrævet for administrativ adgang.",
"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.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.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
"404.description": "Ups! Denne side findes ikke.", "404.description": "Ups! Denne side findes ikke.",
"404.button.home": "Gå tilbage", "404.button.home": "Gå tilbage",
@@ -426,17 +481,17 @@ export default {
"error.title": "Fejl", "error.title": "Fejl",
"error.description": "Hovsa!", "error.description": "Hovsa!",
"error.button.back": "Gå tilbage", "error.button.back": "Gå tilbage",
"error.msg.default": "Something went wrong.", "error.msg.default": "Noget gik galt.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "You canceled the authentication process, please try again.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "The authentication process took too long, please try again.",
"error.msg.invalid_token": "Intern Fejl", "error.msg.invalid_token": "Intern Fejl",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "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.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.already_linked": "This {0} account is already linked to another account.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "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.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.user_not_allowed": "Du har ikke tilladelse til at logge ind.", "error.msg.user_not_allowed": "Du har ikke tilladelse til at logge ind.",
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Generer", "common.button.generate": "Generer",
"common.button.done": "Færdig", "common.button.done": "Færdig",
"common.text.link": "Link", "common.text.link": "Link",
"common.text.navigate-to-link": "Go to the link", "common.text.navigate-to-link": "Visit link",
"common.text.or": "eller", "common.text.or": "eller",
"common.text.redirecting": "Omdirigerer...",
"common.button.go-back": "Gå tilbage", "common.button.go-back": "Gå tilbage",
"common.button.go-home": "Go home", "common.button.go-home": "Go home",
"common.notify.copied": "Linket blev kopieret til udklipsholderen", "common.notify.copied": "Linket blev kopieret til udklipsholderen",
"common.notify.copied-link": "Linket blev kopieret til udklipsholderen",
"common.success": "Success", "common.success": "Success",
"common.error": "Fejl", "common.error": "Fejl",
"common.error.unknown": "En ukendt fejl opstod", "common.error.unknown": "En ukendt fejl opstod",
"common.error.invalid-email": "Ugyldig e-mail", "common.error.invalid-email": "Ugyldig e-mail",
"common.error.too-short": "Skal være på mindst {length} tegn", "common.error.too-short": "Skal være på mindst {length} tegn",
"common.error.too-long": "Må højst være {length} tegn", "common.error.too-long": "Må højst være {length} tegn",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Skal være præcis {length} tegn", "common.error.exact-length": "Skal være præcis {length} tegn",
"common.error.invalid-number": "Skal være et tal", "common.error.invalid-number": "Skal være et tal",
"common.error.field-required": "Dette felt er påkrævet" "common.error.field-required": "Dette felt er påkrævet"

View File

@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Selbst gehostet", "home.bullet.a.name": "Selbst gehostet",
"home.bullet.a.description": "Betreibe Pingvin Share auf deinem eigenen Server.", "home.bullet.a.description": "Betreibe Pingvin Share auf deinem eigenen Server.",
"home.bullet.b.name": "Privatsphäre", "home.bullet.b.name": "Privatsphäre",
"home.bullet.b.description": "Deine Dateien gehören dir und sollten niemals in die Hände Dritter gelangen.", "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.name": "Keine lästige Dateigrößenbegrenzung",
"home.bullet.c.description": "Lade Dateien beliebiger Größe hoch. Nur dein Festplattenspeicher stellt die Grenze dar.", "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.start": "Lege los",
"home.button.source": "Quellcode", "home.button.source": "Quellcode",
// END / // END /
@@ -26,13 +26,13 @@ export default {
"signin.title": "Willkommen zurück", "signin.title": "Willkommen zurück",
"signin.description": "Du hast noch kein Konto?", "signin.description": "Du hast noch kein Konto?",
"signin.button.signup": "Registrieren", "signin.button.signup": "Registrieren",
"signin.input.email-or-username": "Email oder Benutzername", "signin.input.email-or-username": "E-Mail oder Benutzername",
"signin.input.email-or-username.placeholder": "Deine Email Adresse oder Benutzername", "signin.input.email-or-username.placeholder": "Deine E-Mail-Adresse oder Benutzername",
"signin.input.password": "Passwort", "signin.input.password": "Passwort",
"signin.input.password.placeholder": "Dein Passwort", "signin.input.password.placeholder": "Dein Passwort",
"signin.button.submit": "Anmelden", "signin.button.submit": "Anmelden",
"signIn.notify.totp-required.title": "Zwei-Faktor-Authentifizierung benötigt", "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.or": "ODER",
"signIn.oauth.signInWith": "Anmelden mit", "signIn.oauth.signInWith": "Anmelden mit",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
@@ -47,8 +47,8 @@ export default {
"signup.button.signin": "Anmelden", "signup.button.signin": "Anmelden",
"signup.input.username": "Benutzername", "signup.input.username": "Benutzername",
"signup.input.username.placeholder": "Dein Benutzername", "signup.input.username.placeholder": "Dein Benutzername",
"signup.input.email": "Email", "signup.input.email": "E-Mail",
"signup.input.email.placeholder": "Deine Emailadresse", "signup.input.email.placeholder": "Deine E-Mail-Adresse",
"signup.button.submit": "Lass uns loslegen", "signup.button.submit": "Lass uns loslegen",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
@@ -57,7 +57,7 @@ export default {
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Passwort vergessen?", "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.notify.success": "Wir haben dir einen Link gesendet, unter dem du dein Passwort zurücksetzen kannst.",
"resetPassword.button.back": "Zurück zur Anmeldeseite", "resetPassword.button.back": "Zurück zur Anmeldeseite",
"resetPassword.text.resetPassword": "Passwort zurücksetzen", "resetPassword.text.resetPassword": "Passwort zurücksetzen",
@@ -68,7 +68,7 @@ export default {
"account.title": "Mein Konto", "account.title": "Mein Konto",
"account.card.info.title": "Kontoinformationen", "account.card.info.title": "Kontoinformationen",
"account.card.info.username": "Benutzername", "account.card.info.username": "Benutzername",
"account.card.info.email": "Email", "account.card.info.email": "E-Mail",
"account.notify.info.success": "Konto erfolgreich aktualisiert", "account.notify.info.success": "Konto erfolgreich aktualisiert",
"account.card.password.title": "Passwort", "account.card.password.title": "Passwort",
"account.card.password.old": "Altes Passwort", "account.card.password.old": "Altes Passwort",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Verknüpfung aufheben", "account.card.oauth.unlink": "Verknüpfung aufheben",
"account.card.oauth.unlinked": "Verknüpfung aufgehoben", "account.card.oauth.unlinked": "Verknüpfung aufgehoben",
"account.modal.unlink.title": "Kontoverknüpfung aufheben", "account.modal.unlink.title": "Kontoverknüpfung aufheben",
"account.modal.unlink.description": "Das Entfernen der Verknüpfung mit deinem sozialen Konten kann dazu führen, dass du dein Konto verlierst, wenn du dich nicht an deinen Benutzernamen und dein Passwort erinnerst.", "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.notify.oauth.unlinked.success": "Verknüpfung erfolgreich aufgehoben",
"account.card.security.title": "Sicherheit", "account.card.security.title": "Sicherheit",
"account.card.security.totp.enable.description": "Gib dein aktuelles Passwort ein, um TOTP zu aktivieren", "account.card.security.totp.enable.description": "Gib dein aktuelles Passwort ein, um TOTP zu aktivieren",
@@ -122,18 +122,21 @@ export default {
"account.shares.table.description": "Beschreibung", "account.shares.table.description": "Beschreibung",
"account.shares.table.visitors": "Besucher", "account.shares.table.visitors": "Besucher",
"account.shares.table.expiresAt": "Läuft ab am", "account.shares.table.expiresAt": "Läuft ab am",
"account.shares.table.createdAt": "Erstellt am", "account.shares.table.createdAt": "Angelegt am",
"account.shares.table.size": "Größe", "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-informations": "Teile deine Information",
"account.shares.modal.share-link": "Freigabe teilen", "account.shares.modal.share-link": "Freigabe teilen",
"account.shares.modal.delete.title": "Lösche Freigabe {share}", "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 // END /account/shares
// /account/reverseShares // /account/reverseShares
"account.reverseShares.title": "Externe Freigaben", "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.description": "Eine externe Freigabe erlaubt dir eine einzigartige URL zu erstellen, die externen Benutzern erlaubt, Dateien hochzuladen.",
"account.reverseShares.title.empty": "Es ist leer hier 👀", "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 externen Freigaben.",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Externe Freigabe erstellen", "account.reverseShares.modal.title": "Externe Freigabe erstellen",
"account.reverseShares.modal.expiration.label": "Gültig bis", "account.reverseShares.modal.expiration.label": "Gültig bis",
@@ -149,13 +152,13 @@ export default {
"account.reverseShares.modal.expiration.month-plural": "Monate", "account.reverseShares.modal.expiration.month-plural": "Monate",
"account.reverseShares.modal.expiration.year-singular": "Jahr", "account.reverseShares.modal.expiration.year-singular": "Jahr",
"account.reverseShares.modal.expiration.year-plural": "Jahre", "account.reverseShares.modal.expiration.year-plural": "Jahre",
"account.reverseShares.modal.max-size.label": "Max. Freigabengröße", "account.reverseShares.modal.max-size.label": "Maximale Freigabegröße",
"account.reverseShares.modal.send-email": "Email Benachrichtigung senden", "account.reverseShares.modal.send-email": "E-Mail Benachrichtigungen senden",
"account.reverseShares.modal.send-email.description": "Sendet eine Email Benachrichtigung, wenn eine Datei auf einer externen Freigabe hochgeladen wurde.", "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": "Einfacher Modus",
"account.reverseShares.modal.simplified.description": "Mache es der Person einfach, die die Datei hochlädt, sie mit Dir zu teilen. Sie können nur den Namen und die Beschreibung der Freigabe ändern.", "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": "Öffentlicher Zugriff",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "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.label": "Maximale Nutzungen",
"account.reverseShares.modal.max-use.description": "Die maximale Anzahl von Verwendungen der URL, um Dateien hochzuladen.", "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.never-expires": "Diese externe Freigabe wird nicht ablaufen.",
@@ -168,55 +171,58 @@ export default {
"account.reverseShares.table.max-size": "Maximale Freigabegröße", "account.reverseShares.table.max-size": "Maximale Freigabegröße",
"account.reverseShares.table.expires": "Läuft ab am", "account.reverseShares.table.expires": "Läuft ab am",
"account.reverseShares.modal.reverse-share-link": "Link zu externer Freigabe", "account.reverseShares.modal.reverse-share-link": "Link zu externer Freigabe",
"account.reverseShares.modal.delete.title": "Lösche externe Freigabe", "account.reverseShares.modal.delete.title": "Externe Freigabe löschen",
"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.description": "Möchtest du diese externe Freigabe wirklich löschen? In diesem Fall werden auch hiermit verbundene Freigaben gelöscht.",
// END /account/reverseShares // END /account/reverseShares
// /admin // /admin
"admin.title": "Verwaltung", "admin.title": "Verwaltung",
"admin.button.users": "Benutzerverwaltung", "admin.button.users": "Benutzerverwaltung",
"admin.button.shares": "Freigabenverwaltung", "admin.button.shares": "Freigaben Verwaltung",
"admin.button.config": "Konfiguration", "admin.button.config": "Konfiguration",
"admin.version": "Version", "admin.version": "Version",
// END /admin // END /admin
// /admin/users // /admin/users
"admin.users.title": "Benutzerverwaltung", "admin.users.title": "Benutzerverwaltung",
"admin.users.table.username": "Benutzername", "admin.users.table.username": "Benutzername",
"admin.users.table.email": "Email", "admin.users.table.email": "E-Mail",
"admin.users.table.admin": "Administrator", "admin.users.table.admin": "Administrator",
"admin.users.edit.update.title": "Benutzer {username} aktualisieren", "admin.users.edit.update.title": "Benutzer bearbeiten: {username}",
"admin.users.edit.update.admin-privileges": "Administratorrechte", "admin.users.edit.update.admin-privileges": "Administratorrechte",
"admin.users.edit.update.change-password.title": "Passwort ändern", "admin.users.edit.update.change-password.title": "Passwort ändern",
"admin.users.edit.update.change-password.field": "Neues Passwort", "admin.users.edit.update.change-password.field": "Neues Passwort",
"admin.users.edit.update.change-password.button": "Neues Passwort speichern", "admin.users.edit.update.change-password.button": "Neues Passwort speichern",
"admin.users.edit.update.notify.password.success": "Passwort erfolgreich geändert", "admin.users.edit.update.notify.password.success": "Passwort erfolgreich geändert",
"admin.users.edit.delete.title": "Löschen des Nutzers {username}", "admin.users.edit.delete.title": "Benutzer löschen: {username}?",
"admin.users.edit.delete.description": "Möchtest du wirklich diesen Benutzer und all seine Freigaben löschen?", "admin.users.edit.delete.description": "Möchtest du wirklich diesen Benutzer und all seine Freigaben löschen?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Benutzer erstellen", "admin.users.modal.create.title": "Benutzer erstellen",
"admin.users.modal.create.username": "Benutzername", "admin.users.modal.create.username": "Benutzername",
"admin.users.modal.create.email": "Email", "admin.users.modal.create.email": "E-Mail",
"admin.users.modal.create.password": "Passwort", "admin.users.modal.create.password": "Passwort",
"admin.users.modal.create.manual-password": "Passwort manuell festlegen", "admin.users.modal.create.manual-password": "Passwort manuell festlegen",
"admin.users.modal.create.manual-password.description": "Wenn nicht aktiviert, erhält der Benutzer eine Email mit einem Link, um sein Passwort festzulegen.", "admin.users.modal.create.manual-password.description": "Wenn nicht aktiviert, erhält der Benutzer eine E-Mail mit einem Link, um sein Passwort festzulegen.",
"admin.users.modal.create.admin": "Administratorrechte", "admin.users.modal.create.admin": "Administratorrechte",
"admin.users.modal.create.admin.description": "Wenn aktiviert, kann der Benutzer auf das Administrator-Panel zugreifen.", "admin.users.modal.create.admin.description": "Wenn aktiviert, kann der Benutzer auf das Administrator-Panel zugreifen.",
// END /admin/users // END /admin/users
// /admin/shares // /admin/shares
"admin.shares.title": "Freigabenverwaltung", "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.username": "Ersteller",
"admin.shares.table.visitors": "Besucher", "admin.shares.table.visitors": "Besucher",
"admin.shares.table.expires": "Läuft ab am", "admin.shares.table.expires": "Läuft ab am",
"admin.shares.edit.delete.title": "Lösche Freigabe {id}", "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 // END /admin/shares
// /upload // /upload
"upload.title": "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.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.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 // Dropzone.tsx
"upload.dropzone.title": "Dateien hochladen", "upload.dropzone.title": "Dateien hochladen",
"upload.dropzone.description": "Ziehe Dateien hierher, um deine Freigabe zu starten. Wir können nur Dateien akzeptieren, die insgesamt weniger als {maxSize} groß sind.", "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}.",
"upload.dropzone.notify.file-too-big": "Ihre Dateien überschreiten die maximale Freigabegröße von {maxSize}.", "upload.dropzone.notify.file-too-big": "Ihre Dateien überschreiten die maximale Freigabegröße von {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Name", "upload.filelist.name": "Name",
@@ -227,9 +233,9 @@ export default {
"upload.modal.link.error.taken": "Dieser Link wird bereits verwendet", "upload.modal.link.error.taken": "Dieser Link wird bereits verwendet",
"upload.modal.not-signed-in": "Du bist nicht angemeldet", "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.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": "Läuft nicht ab", "upload.modal.expires.never-long": "Permanente Freigabe",
"upload.modal.expires.error.too-long": "Ablauf überschreitet das maximale Ablaufdatum von {max}.", "upload.modal.expires.error.too-long": "Das Ablaufdatum überschreitet das Maximum von {max}.",
"upload.modal.link.label": "Link", "upload.modal.link.label": "Link",
"upload.modal.expires.label": "Gültig bis", "upload.modal.expires.label": "Gültig bis",
"upload.modal.expires.minute-singular": "Minute", "upload.modal.expires.minute-singular": "Minute",
@@ -243,13 +249,13 @@ export default {
"upload.modal.expires.month-singular": "Monat", "upload.modal.expires.month-singular": "Monat",
"upload.modal.expires.month-plural": "Monate", "upload.modal.expires.month-plural": "Monate",
"upload.modal.expires.year-singular": "Jahr", "upload.modal.expires.year-singular": "Jahr",
"upload.modal.expires.year-plural": "Year", "upload.modal.expires.year-plural": "Jahre",
"upload.modal.accordion.name-and-description.title": "Name und Beschreibung", "upload.modal.accordion.name-and-description.title": "Name und Beschreibung",
"upload.modal.accordion.name-and-description.name.placeholder": "Name", "upload.modal.accordion.name-and-description.name.placeholder": "Name",
"upload.modal.accordion.name-and-description.description.placeholder": "Hinweis für die Empfänger dieser Freigabe", "upload.modal.accordion.name-and-description.description.placeholder": "Hinweis für die Empfänger dieser Freigabe",
"upload.modal.accordion.email.title": "Email Empfänger", "upload.modal.accordion.email.title": "E-Mail-Empfänger",
"upload.modal.accordion.email.placeholder": "Email der Empfänger eingeben", "upload.modal.accordion.email.placeholder": "E-Mail der Empfänger eingeben",
"upload.modal.accordion.email.invalid-email": "Ungültige Emailadresse", "upload.modal.accordion.email.invalid-email": "Ungültige E-Mail-Adresse",
"upload.modal.accordion.security.title": "Sicherheitseinstellungen", "upload.modal.accordion.security.title": "Sicherheitseinstellungen",
"upload.modal.accordion.security.password.label": "Passwortschutz", "upload.modal.accordion.security.password.label": "Passwortschutz",
"upload.modal.accordion.security.password.placeholder": "Kein Passwort", "upload.modal.accordion.security.password.placeholder": "Kein Passwort",
@@ -272,16 +278,16 @@ export default {
"share.error.access-denied.title": "Private Freigabe", "share.error.access-denied.title": "Private Freigabe",
"share.error.access-denied.description": "Das aktuelle Konto hat keine Berechtigung, um auf diese Freigabe zuzugreifen", "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.title": "Passwort erforderlich",
"share.modal.password.description": "Um auf diese Freigabe zuzugreifen, gib bitte das Passwort für die Freigabe ein.", "share.modal.password.description": "Bitte gib das Passwort ein, um auf diese Freigabe zuzugreifen.",
"share.modal.password": "Passwort", "share.modal.password": "Passwort",
"share.modal.error.invalid-password": "Ungültiges Passwort", "share.modal.error.invalid-password": "Ungültiges Passwort",
"share.button.download-all": "Alles herunterladen", "share.button.download-all": "Alles herunterladen",
"share.notify.download-all-preparing": "Die Freigabe wird vorbereitet. Versuche 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.modal.file-link": "Dateilink",
"share.table.name": "Name", "share.table.name": "Name",
"share.table.size": "Größe", "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.title": "Vorschau wird nicht unterstützt",
"share.modal.file-preview.error.not-supported.description": "Eine Vorschau für diesen Dateityp wird nicht unterstützt. Bitte lade die Datei herunter, um sie anzusehen.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "{shareId} bearbeiten", "share.edit.title": "{shareId} bearbeiten",
@@ -289,17 +295,25 @@ export default {
"share.edit.notify.generic-error": "Während der Erstellung der Freigabe ist ein Fehler aufgetreten.", "share.edit.notify.generic-error": "Während der Erstellung der Freigabe ist ein Fehler aufgetreten.",
"share.edit.notify.save-success": "Freigabe erfolgreich aktualisiert", "share.edit.notify.save-success": "Freigabe erfolgreich aktualisiert",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Impressum",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Einstellungen", "admin.config.title": "Einstellungen",
"admin.config.category.general": "Allgemein", "admin.config.category.general": "Allgemein",
"admin.config.category.share": "Freigabe", "admin.config.category.share": "Freigabe",
"admin.config.category.email": "E-Mail", "admin.config.category.email": "E-Mail",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "OAuth-Anmeldung", "admin.config.category.oauth": "Anmeldung über soziale Netzwerke",
"admin.config.general.app-name": "App-Name", "admin.config.general.app-name": "App-Name",
"admin.config.general.app-name.description": "Name der Applikation", "admin.config.general.app-name.description": "Name der Applikation",
"admin.config.general.app-url": "App-URL", "admin.config.general.app-url": "App-URL",
"admin.config.general.app-url.description": "Auf welcher URL Pingvin Share verfügbar ist", "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": "Startseite anzeigen",
"admin.config.general.show-home-page.description": "Ob die Startseite angezeigt werden soll", "admin.config.general.show-home-page.description": "Ob die Startseite angezeigt werden soll",
"admin.config.general.session-duration": "Session-Dauer", "admin.config.general.session-duration": "Session-Dauer",
@@ -307,40 +321,42 @@ export default {
"admin.config.general.logo": "Logo", "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.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.general.logo.placeholder": "Bild auswählen",
"admin.config.email.enable-share-email-recipients": "Erlaube das Teilen der Freigabe via Email", "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 Emails an Freigabe-Empfänger ermöglicht werden sollen. Aktiviere dies nur, wenn du SMTP aktivierst hast.", "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": "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-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": "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 tatsächlichen 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": "Name der externen Freigabe",
"admin.config.email.reverse-share-subject.description": "Betreff der Email, die gesendet wird, wenn jemand eine Datei mit deinem externen Freigabe-Link hochlädt.", "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", "admin.config.email.reverse-share-message": "Nachricht für externe Freigabe",
"admin.config.email.reverse-share-message.description": "Nachricht, die gesendet wird, wenn jemand eine Freigabe mit deinem externen Freigabe-Link erstellt. {shareUrl} wird durch den Namen des Erstellers und die Freigabe-URL ersetzt.", "admin.config.email.reverse-share-message.description": "Nachricht, die gesendet wird, wenn jemand eine Freigabe mit deinem externen Freigabe-Link erstellt. {shareUrl} wird durch den Namen des Erstellers und die Freigabe-URL ersetzt.",
"admin.config.email.reset-password-subject": "Betreff für Passwortzurücksetzung", "admin.config.email.reset-password-subject": "Betreff für Passwortzurücksetzung",
"admin.config.email.reset-password-subject.description": "Betreff der E-Mail, die gesendet wird, wenn ein Benutzer eine Passwortzurücksetzung anfordert.", "admin.config.email.reset-password-subject.description": "Betreff der gesendeten E-Mail, wenn ein Benutzer ein Passwort zurücksetzen möchte.",
"admin.config.email.reset-password-message": "Nachricht für Passwortzurücksetzung", "admin.config.email.reset-password-message": "Nachricht für Passwortzurücksetzung",
"admin.config.email.reset-password-message.description": "Nachricht, die gesendet wird, wenn ein Benutzer eine Passwortzurücksetzung anfordert. {url} wird durch die URL für das Zurücksetzen des Passworts ersetzt.", "admin.config.email.reset-password-message.description": "Nachricht, die gesendet wird, wenn ein Benutzer eine Passwortzurücksetzung anfordert. {url} wird durch die URL für das Zurücksetzen des Passworts ersetzt.",
"admin.config.email.invite-subject": "Betreff für Einladung", "admin.config.email.invite-subject": "Betreff für Einladung",
"admin.config.email.invite-subject.description": "Betreff der E-Mail, die gesendet wird, wenn ein Administrator einen Benutzer einlädt.", "admin.config.email.invite-subject.description": "Betreff der gesendeten E-Mail, wenn ein Administrator einen Benutzer einlädt.",
"admin.config.email.invite-message": "Nachricht für Einladung", "admin.config.email.invite-message": "Nachricht für Einladung",
"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 password of the user.", "admin.config.email.invite-message.description": "Nachricht, die gesendet wird, wenn ein Administrator einen Benutzer einlädt. {url} wird durch die Einladung-URL ersetzt und {password} durch das Passwort ersetzt.",
"admin.config.share.allow-registration": "Registrierung erlauben", "admin.config.share.allow-registration": "Registrierung erlauben",
"admin.config.share.allow-registration.description": "Gibt an, ob eine Registrierung erlaubt ist", "admin.config.share.allow-registration.description": "Gibt an, ob eine Registrierung erlaubt ist",
"admin.config.share.allow-unauthenticated-shares": "Nicht authentifizierte Freigaben erlauben", "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.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": "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": "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": "Maximale Größe", "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 Komprimierungsstufe", "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 Komprimierungsgeschwindigkeit 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.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": "Chunkgröße", "admin.config.share.chunk-size": "Chunk Größe",
"admin.config.share.chunk-size.description": "Passe die Chunkgröße (in Bytes) für deine Uploads an, um die Zuverlässigkeit deiner Internetverbindung auszugleichen. Kleinere Chunks können die Erfolgsraten für instabile Verbindungen verbessern, während größere Chunks Uploads für stabile Verbindungen beschleunigen können.", "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": "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.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": "Aktiviert", "admin.config.smtp.enabled": "Aktivieren",
"admin.config.smtp.enabled.description": "Gibt an, ob SMTP aktiviert ist. Aktiviere dies nur, wenn du den Host, den Port, die Email, den Benutzernamen und das Passwort deines SMTP-Servers eingegeben hast.", "admin.config.smtp.enabled.description": "Gibt an, ob SMTP aktiviert ist. Aktiviere dies nur, wenn du den Host, den Port, die E-Mail, den Benutzernamen und das Passwort deines SMTP-Servers eingegeben hast.",
"admin.config.smtp.host": "Host", "admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "Host des SMTP-Servers", "admin.config.smtp.host.description": "Host des SMTP-Servers",
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
@@ -353,50 +369,56 @@ export default {
"admin.config.smtp.password.description": "Passwort des SMTP-Servers", "admin.config.smtp.password.description": "Passwort des SMTP-Servers",
"admin.config.smtp.button.test": "Test-E-Mail senden", "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": "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": "Registrierung erlauben",
"admin.config.oauth.allow-registration.description": "Benutzern erlauben, sich über Soziale Netzwerke zu registrieren", "admin.config.oauth.allow-registration.description": "Benutzern erlauben, sich über soziale Netzwerke zu registrieren",
"admin.config.oauth.ignore-totp": "TOTP ignorieren", "admin.config.oauth.ignore-totp": "TOTP ignorieren",
"admin.config.oauth.ignore-totp.description": "Gibt an, ob TOTP ignoriert werden soll, wenn sich der Benutzer über Soziale Netzwerke anmeldet", "admin.config.oauth.ignore-totp.description": "Gibt an, ob TOTP ignoriert werden soll, wenn sich der Benutzer über soziale Netzwerke anmeldet",
"admin.config.oauth.disable-password": "Anmelden mit Passwort deaktivieren", "admin.config.oauth.disable-password": "Anmelden mit Passwort deaktivieren",
"admin.config.oauth.disable-password.description": "Deaktiviert das Anmelden mit Passwort\nStelle vor Aktivierung dieser Konfiguration sicher, dass ein OAuth-Provider korrekt konfiguriert ist, um nicht ausgesperrt zu werden.", "admin.config.oauth.disable-password.description": "Deaktiviert das Anmelden mit Passwort\nStelle vor Aktivierung dieser Konfiguration sicher, dass ein OAuth-Provider korrekt konfiguriert ist, um nicht ausgesperrt zu werden.",
"admin.config.oauth.github-enabled": "GitHub", "admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "GitHub Anmeldung erlaubt", "admin.config.oauth.github-enabled.description": "GitHub Anmeldung erlaubt",
"admin.config.oauth.github-client-id": "GitHub Client-ID", "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-id.description": "Client-ID der GitHub OAuth-App",
"admin.config.oauth.github-client-secret": "GitHub Client-Secret", "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.github-client-secret.description": "Client Secret der GitHub OAuth App",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Google Anmeldung erlaubt", "admin.config.oauth.google-enabled.description": "Google Anmeldung erlaubt",
"admin.config.oauth.google-client-id": "Google Client-ID", "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-id.description": "Client-ID der Google OAuth-App",
"admin.config.oauth.google-client-secret": "Google Client-Secret", "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.google-client-secret.description": "Client Secret der Google OAuth App",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Microsoft Anmeldung erlaubt", "admin.config.oauth.microsoft-enabled.description": "Microsoft Anmeldung erlaubt",
"admin.config.oauth.microsoft-tenant": "Microsoft Mandant", "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-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": "Microsoft Client-ID",
"admin.config.oauth.microsoft-client-id.description": "Client-ID der Microsoft OAuth-App", "admin.config.oauth.microsoft-client-id.description": "Client-ID der Microsoft OAuth-App",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client-Secret", "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.microsoft-client-secret.description": "Client Secret der Microsoft OAuth App",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Discord Anmeldung erlaubt", "admin.config.oauth.discord-enabled.description": "Discord Anmeldung erlaubt",
"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": "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-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": "Discord Client-ID",
"admin.config.oauth.discord-client-id.description": "Client-ID der Discord OAuth-App", "admin.config.oauth.discord-client-id.description": "Client-ID der Discord OAuth-App",
"admin.config.oauth.discord-client-secret": "Discord Client-Secret", "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.discord-client-secret.description": "Client Secret der Discord OAuth App",
"admin.config.oauth.oidc-enabled": "OpenID Connect", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "OpenID Connect Anmeldung erlaubt", "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": "OpenID Verbindung Discovery URL",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery-URL der OpenID OAuth App", "admin.config.oauth.oidc-discovery-uri.description": "Discovery-URL der OpenID OAuth App",
"admin.config.oauth.oidc-sign-out": "Abmelden von OpenID Connect",
"admin.config.oauth.oidc-sign-out.description": "Wenn aktiviert, wird der Benutzer mit der „Abmelden“-Schaltfläche vom OpenID-Connect-Provider abgemeldet.",
"admin.config.oauth.oidc-scope": "OpenID Connect scope",
"admin.config.oauth.oidc-scope.description": "Scopes which should be requested from the OpenID Connect provider.",
"admin.config.oauth.oidc-username-claim": "OpenID Connect Benutzername anfordern", "admin.config.oauth.oidc-username-claim": "OpenID Connect Benutzername anfordern",
"admin.config.oauth.oidc-username-claim.description": "Benutzername im OpenID Token. Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.", "admin.config.oauth.oidc-username-claim.description": "Benutzername im OpenID Token. Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token", "admin.config.oauth.oidc-role-path": "Pfad zu den Rollen im OpenID Verbindungs-Token",
"admin.config.oauth.oidc-role-path.description": "Muss ein valider JMES-Pfad sein, der zu einem Array an Rollen führt. " + "Die Zugangsverwaltung über Rollen in OpenID Connect ist nur empfohlen, wenn kein anderer Identitätsprovider konfiguriert und die Anmeldung per Password deaktiviert ist. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.", "admin.config.oauth.oidc-role-path.description": "Muss ein valider JMES-Pfad sein, der zu einem Array an Rollen führt. " + "Die Zugangsverwaltung über Rollen in OpenID Connect ist nur empfohlen, wenn kein anderer Identitätsprovider konfiguriert und die Anmeldung per Password deaktiviert ist. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access", "admin.config.oauth.oidc-role-general-access": "OpenID Connect Rolle für allgemeinen Zugriff",
"admin.config.oauth.oidc-role-general-access.description": "Rolle für generellen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser sich anmelden kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.", "admin.config.oauth.oidc-role-general-access.description": "Rolle für generellen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser sich anmelden kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect Rolle für Admin-Zugriff", "admin.config.oauth.oidc-role-admin-access": "OpenID Connect Rolle für Admin-Zugriff",
"admin.config.oauth.oidc-role-admin-access.description": "Rolle für administrativen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser auf das Administrator-Panel zugreifen kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.", "admin.config.oauth.oidc-role-admin-access.description": "Rolle für administrativen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser auf das Administrator-Panel zugreifen kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client-Secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client-Secret",
"admin.config.oauth.oidc-client-secret.description": "Client-Secret der OpenID Connect OAuth-App", "admin.config.oauth.oidc-client-secret.description": "Client-Secret der OpenID Connect OAuth-App",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "LDAP aktivieren",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "LDAP-Authentifizierung für die Benutzeranmeldung verwenden",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server-URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL des LDAP-Servers",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Binde DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "admin.config.ldap.bind-dn.description": "Standard-Benutzer, der zur Benutzersuche verwendet wird",
"admin.config.ldap.bind-password": "Bind password", "admin.config.ldap.bind-password": "Binde Passwort",
"admin.config.ldap.bind-password.description": "Password for the user search user", "admin.config.ldap.bind-password.description": "Passwort der zur Benutzersuche verwendet wird",
"admin.config.ldap.search-base": "User base", "admin.config.ldap.search-base": "Benutzerbasis",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "admin.config.ldap.search-base.description": "Basisstandort, an dem die Benutzersuche durchgeführt wird",
"admin.config.ldap.search-query": "User query", "admin.config.ldap.search-query": "Benutzerabfrage",
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.", "admin.config.ldap.search-query.description": "Die Benutzer Abfrage wird in der \"Benutzerdatenbank\" gesucht für den LDAP Benutzer. %username% kann als Platzhalter für den Benutzer eingegeben werden.",
"admin.config.ldap.admin-groups": "Admin group", "admin.config.ldap.admin-groups": "Admin-Gruppe",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Gruppe benötigt für den Administrationszugang.",
"admin.config.ldap.field-name-member-of": "Benutzergruppen-Attributname",
"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": "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": "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.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
"404.description": "Ups, diese Seite existiert nicht.", "404.description": "Ups, diese Seite existiert nicht.",
"404.button.home": "Zurück zur Startseite", "404.button.home": "Zurück zur Startseite",
@@ -426,7 +481,7 @@ export default {
"error.title": "Fehler", "error.title": "Fehler",
"error.description": "Ups!", "error.description": "Ups!",
"error.button.back": "Zurück", "error.button.back": "Zurück",
"error.msg.default": "Etwas ist schief gelaufen.", "error.msg.default": "Etwas ist schiefgelaufen.",
"error.msg.access_denied": "Du hast den Authentifizierungsprozess abgebrochen, bitte versuche es erneut.", "error.msg.access_denied": "Du hast den Authentifizierungsprozess abgebrochen, bitte versuche es erneut.",
"error.msg.expired_token": "Der Authentifizierungsprozess hat zu lange gedauert, bitte versuche es erneut.", "error.msg.expired_token": "Der Authentifizierungsprozess hat zu lange gedauert, bitte versuche es erneut.",
"error.msg.invalid_token": "Interner Fehler", "error.msg.invalid_token": "Interner Fehler",
@@ -436,7 +491,7 @@ export default {
"error.msg.not_linked": "Das Konto {0} wurde noch nicht mit einem Konto verknüpft.", "error.msg.not_linked": "Das Konto {0} wurde noch nicht mit einem Konto verknüpft.",
"error.msg.unverified_account": "Dieses Konto {0} wurde noch nicht verifiziert, bitte versuche es nach der Verifikation erneut.", "error.msg.unverified_account": "Dieses Konto {0} wurde noch nicht verifiziert, bitte versuche es nach der Verifikation erneut.",
"error.msg.user_not_allowed": "Du bist nicht berechtigt, dich anzumelden.", "error.msg.user_not_allowed": "Du bist nicht berechtigt, dich anzumelden.",
"error.msg.cannot_get_user_info": "Deine Benutzerinformationen können nicht von diesem Konto {0} abgerufen werden.", "error.msg.cannot_get_user_info": "Ihre Benutzerinformationen können von diesem {0} Konto nicht abgerufen werden.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -456,15 +511,19 @@ export default {
"common.text.link": "Link", "common.text.link": "Link",
"common.text.navigate-to-link": "Link öffnen", "common.text.navigate-to-link": "Link öffnen",
"common.text.or": "oder", "common.text.or": "oder",
"common.text.redirecting": "Umleitung...",
"common.button.go-back": "Zurück", "common.button.go-back": "Zurück",
"common.button.go-home": "Zur Startseite", "common.button.go-home": "Zur Startseite",
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert", "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.success": "Erfolg",
"common.error": "Fehler", "common.error": "Fehler",
"common.error.unknown": "Ein unbekannter Fehler ist aufgetreten", "common.error.unknown": "Ein unbekannter Fehler ist aufgetreten",
"common.error.invalid-email": "Ungültige E-Mail-Adresse", "common.error.invalid-email": "Ungültige E-Mail-Adresse",
"common.error.too-short": "Muss mindestens {length} Zeichen enthalten", "common.error.too-short": "Muss mindestens {length} Zeichen enthalten",
"common.error.too-long": "Muss maximal {length} Zeichen enthalten", "common.error.too-long": "Muss 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", "common.error.exact-length": "Muss genau {length} Zeichen lang sein",
"common.error.invalid-number": "Muss eine Zahl sein", "common.error.invalid-number": "Muss eine Zahl sein",
"common.error.field-required": "Dieses Feld ist erforderlich" "common.error.field-required": "Dieses Feld ist erforderlich"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Μεταφόρτωση", "navbar.upload": "Μεταφόρτωση",
"navbar.signin": "Είσοδος", "navbar.signin": "Είσοδος",
"navbar.home": "Αρχική", "navbar.home": "Αρχική",
"navbar.signup": "Εγγραφή", "navbar.signup": "Sign up",
"navbar.links.shares": "", "navbar.links.shares": "",
"navbar.links.reverse": "Αντίστροφος σύνδεσμος κοινής χρήσης", "navbar.links.reverse": "Αντίστροφος σύνδεσμος κοινής χρήσης",
"navbar.avatar.account": "Ο λογαριασμός μου", "navbar.avatar.account": "Ο λογαριασμός μου",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Ιδιωτική εγκατάσταση", "home.bullet.a.name": "Ιδιωτική εγκατάσταση",
"home.bullet.a.description": "Φιλοξενήστε το Pingvin Share στο δικό σας μηχάνημα.", "home.bullet.a.description": "Φιλοξενήστε το Pingvin Share στο δικό σας μηχάνημα.",
"home.bullet.b.name": "Απόρρητο", "home.bullet.b.name": "Απόρρητο",
"home.bullet.b.description": "Τα αρχεία σας είναι αρχεία σας και δεν πρέπει ποτέ να μπείτε στα χέρια τρίτων.", "home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "Χωρίς όριο μεγέθους αρχείου", "home.bullet.c.name": "Χωρίς όριο μεγέθους αρχείου",
"home.bullet.c.description": "Ανεβάστε όσο μεγάλα αρχεία θέλετε. Μόνο ο σκληρός σας δίσκος θα είναι το όριό σας.", "home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Ας αρχίσουμε", "home.button.start": "Ας αρχίσουμε",
"home.button.source": "Πηγαίος κώδικας", "home.button.source": "Πηγαίος κώδικας",
// END / // END /
@@ -34,7 +34,7 @@ export default {
"signIn.notify.totp-required.title": "Απαιτείται έλεγχος ταυτότητας δύο παραγόντων.", "signIn.notify.totp-required.title": "Απαιτείται έλεγχος ταυτότητας δύο παραγόντων.",
"signIn.notify.totp-required.description": "Παρακαλώ εισάγετε τον κωδικό 2FA.", "signIn.notify.totp-required.description": "Παρακαλώ εισάγετε τον κωδικό 2FA.",
"signIn.oauth.or": "Ή", "signIn.oauth.or": "Ή",
"signIn.oauth.signInWith": "Sign in with", "signIn.oauth.signInWith": "Σύνδεση με",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Ξεχάσατε τον κωδικό σας;", "resetPassword.title": "Ξεχάσατε τον κωδικό σας;",
"resetPassword.description": "A message with a link to reset your password has been sent if the email exists.", "resetPassword.description": "A message with a link to reset your password has been sent if the email exists.",
"resetPassword.notify.success": "Εισάγετε το email σας για επαναφορά κωδικού.", "resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "Πίσω στη σελίδα εισόδου", "resetPassword.button.back": "Πίσω στη σελίδα εισόδου",
"resetPassword.text.resetPassword": "Επαναφορά κωδικού πρόσβασης", "resetPassword.text.resetPassword": "Επαναφορά κωδικού πρόσβασης",
"resetPassword.text.enterNewPassword": "Εισάγετε το νέο σας κωδικό", "resetPassword.text.enterNewPassword": "Εισάγετε το νέο σας κωδικό",
"resetPassword.input.password": "Νέος κωδικός", "resetPassword.input.password": "Νέος κωδικός",
"resetPassword.notify.passwordReset": "Η επαναφορά του κωδικού πρόσβασης σας ολοκληρώθηκε με επιτυχία!", "resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account // /account
"account.title": "Ο λογαριασμός μου", "account.title": "Ο λογαριασμός μου",
"account.card.info.title": "Πληροφορίες λογαριασμού", "account.card.info.title": "Πληροφορίες λογαριασμού",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Κωδικόs πρόσβασης", "account.card.password.title": "Κωδικόs πρόσβασης",
"account.card.password.old": "Παλιός κωδικός", "account.card.password.old": "Παλιός κωδικός",
"account.card.password.new": "Νέος κωδικός", "account.card.password.new": "Νέος κωδικός",
"account.card.password.noPasswordSet": "Δεν έχετε ορίσει κωδικό πρόσβασης. Αν θέλετε να συνδεθείτε με email και κωδικό πρόσβασης, πρέπει να ορίσετε έναν κωδικό πρόσβασης.", "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": "Ο κωδικός πρόσβασης άλλαξε επιτυχώς", "account.notify.password.success": "Ο κωδικός πρόσβασης άλλαξε επιτυχώς",
"account.card.oauth.title": "Σύνδεση με λογαριασμό μέσων κοινωνικού δικτύου", "account.card.oauth.title": "Σύνδεση με λογαριασμό μέσων κοινωνικού δικτύου",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Αποσύνδεση", "account.card.oauth.unlink": "Αποσύνδεση",
"account.card.oauth.unlinked": "Αποσυνδεδεμένο", "account.card.oauth.unlinked": "Αποσυνδεδεμένο",
"account.modal.unlink.title": "Αποσύνδεση Λογαριασμού", "account.modal.unlink.title": "Αποσύνδεση Λογαριασμού",
"account.modal.unlink.description": "Η αποσύνδεση των κοινωνικών λογαριασμών σας μπορεί να προκαλέσει απώλεια του λογαριασμού σας αν δε θυμάστε το όνομα χρήστη και τον κωδικό πρόσβασης.", "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": "Επιτυχής αποσύνδεση", "account.notify.oauth.unlinked.success": "Επιτυχής αποσύνδεση",
"account.card.security.title": "Ασφάλεια", "account.card.security.title": "Ασφάλεια",
"account.card.security.totp.enable.description": "Εισάγετε τον τρέχοντα κωδικό σας για να ξεκινήσετε την ενεργοποίηση του TOTP", "account.card.security.totp.enable.description": "Εισάγετε τον τρέχοντα κωδικό σας για να ξεκινήσετε την ενεργοποίηση του TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Όνομα", "account.shares.table.name": "Όνομα",
"account.shares.table.description": "Περιγραφή", "account.shares.table.description": "Περιγραφή",
"account.shares.table.visitors": "Επισκέπτες", "account.shares.table.visitors": "Επισκέπτες",
"account.shares.table.expiresAt": "Λήξη", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Δημιουργήθηκε", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Μέγεθος", "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-informations": "Πληροφορίες διαμοιρασμού",
"account.shares.modal.share-link": "Κοινοποίηση συνδέσμου", "account.shares.modal.share-link": "Κοινοποίηση συνδέσμου",
"account.shares.modal.delete.title": "Διαγραφή κοινοποίησης {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Θέλετε πραγματικά να διαγράψετε αυτό το διαμοιρασμό;", "account.shares.modal.delete.description": "Θέλετε πραγματικά να διαγράψετε αυτό το διαμοιρασμό;",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Έτος", "account.reverseShares.modal.expiration.year-singular": "Έτος",
"account.reverseShares.modal.expiration.year-plural": "Έτη", "account.reverseShares.modal.expiration.year-plural": "Έτη",
"account.reverseShares.modal.max-size.label": "Μέγιστο μέγεθος κοινοποίησης", "account.reverseShares.modal.max-size.label": "Μέγιστο μέγεθος κοινοποίησης",
"account.reverseShares.modal.send-email": "Αποστολή ειδοποιήσεων με email", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "Στείλτε μια ειδοποίηση μέσω ηλεκτρονικού ταχυδρομείου όταν δημιουργείται ένας διαμοιρασμός με αυτόν τον σύνδεσμο ανάστροφης κοινοποίησης.", "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": "Απλή λειτουργία",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.", "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": "Δημόσια πρόσβαση",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "Μέγιστες χρήσεις", "account.reverseShares.modal.max-use.label": "Μέγιστες χρήσεις",
"account.reverseShares.modal.max-use.description": "Ο μέγιστος αριθμός που μπορεί να χρησιμοποιηθεί αυτό το URL για τη δημιουργία ενός διαμοιρασμού.", "account.reverseShares.modal.max-use.description": "Ο μέγιστος αριθμός που μπορεί να χρησιμοποιηθεί αυτό το URL για τη δημιουργία ενός διαμοιρασμού.",
"account.reverseShare.never-expires": "Αυτός ο αντίστροφος διαμοιρασμός δε λήγει.", "account.reverseShare.never-expires": "Αυτός ο αντίστροφος διαμοιρασμός δε λήγει.",
@@ -174,7 +177,7 @@ export default {
// /admin // /admin
"admin.title": "Διαχείριση", "admin.title": "Διαχείριση",
"admin.button.users": "Διαχείριση χρηστών", "admin.button.users": "Διαχείριση χρηστών",
"admin.button.shares": "Share management", "admin.button.shares": "Διαχείριση κοινοποιήσεων",
"admin.button.config": "Διαμόρφωση", "admin.button.config": "Διαμόρφωση",
"admin.version": "Έκδοση", "admin.version": "Έκδοση",
// END /admin // END /admin
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Όνομα χρήστη", "admin.users.table.username": "Όνομα χρήστη",
"admin.users.table.email": "E-mail", "admin.users.table.email": "E-mail",
"admin.users.table.admin": "Διαχειριστής", "admin.users.table.admin": "Διαχειριστής",
"admin.users.edit.update.title": "Ενημέρωση χρήστη {username}", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Δικαιώματα διαχειριστή", "admin.users.edit.update.admin-privileges": "Δικαιώματα διαχειριστή",
"admin.users.edit.update.change-password.title": "Αλλαγή κωδικού πρόσβασής", "admin.users.edit.update.change-password.title": "Αλλαγή κωδικού πρόσβασής",
"admin.users.edit.update.change-password.field": "Νέος κωδικός πρόσβασης", "admin.users.edit.update.change-password.field": "Νέος κωδικός πρόσβασης",
"admin.users.edit.update.change-password.button": "Αποθήκευση νέου κωδικού πρόσβασης", "admin.users.edit.update.change-password.button": "Αποθήκευση νέου κωδικού πρόσβασης",
"admin.users.edit.update.notify.password.success": "Ο κωδικός πρόσβασης άλλαξε επιτυχώς", "admin.users.edit.update.notify.password.success": "Ο κωδικός πρόσβασης άλλαξε επιτυχώς",
"admin.users.edit.delete.title": "Διαγραφή χρήστη {username}", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Θέλετε να διαγράψετε το χρήστη και όλες τις κοινοποιήσεις του;", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Δημιουργία χρήστη", "admin.users.modal.create.title": "Δημιουργία χρήστη",
"admin.users.modal.create.username": "Όνομα χρήστη", "admin.users.modal.create.username": "Όνομα χρήστη",
@@ -202,21 +205,24 @@ export default {
"admin.users.modal.create.admin.description": "Αν ενεργοποιηθεί, ο χρήστης θα μπορεί να έχει πρόσβαση στον πίνακα διαχείρισης.", "admin.users.modal.create.admin.description": "Αν ενεργοποιηθεί, ο χρήστης θα μπορεί να έχει πρόσβαση στον πίνακα διαχείρισης.",
// END /admin/users // END /admin/users
// /admin/shares // /admin/shares
"admin.shares.title": "Share management", "admin.shares.title": "Διαχείριση κοινοποιήσεων",
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "Αναγνωριστικό κοινοποίησης",
"admin.shares.table.username": "Creator", "admin.shares.table.username": "Δημιουργός",
"admin.shares.table.visitors": "Visitors", "admin.shares.table.visitors": "Επισκέπτες",
"admin.shares.table.expires": "Expires At", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share {id}", "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 // END /admin/shares
// /upload // /upload
"upload.title": "Μεταφόρτωση", "upload.title": "Μεταφόρτωση",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση της κοινής χρήσης σας.", "upload.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση της κοινής χρήσης σας.",
"upload.notify.count-failed": "Τα αρχεία {count} απέτυχαν να μεταφορτώσουν. Δοκιμάστε ξανά.", "upload.notify.count-failed": "Τα αρχεία {count} απέτυχαν να μεταφορτώσουν. Δοκιμάστε ξανά.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx // Dropzone.tsx
"upload.dropzone.title": "Μεταφόρτωση αρχείων", "upload.dropzone.title": "Μεταφόρτωση αρχείων",
"upload.dropzone.description": "Σύρετε και αποθέστε αρχεία εδώ για να ξεκινήσει η κοινή χρήση σας. Μπορούμε να δεχτούμε μόνο αρχεία που είναι λιγότερο από {maxSize} συνολικά.", "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.notify.file-too-big": "Τα αρχεία σας υπερβαίνουν το μέγιστο μέγεθος κοινής χρήσης του {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Όνομα", "upload.filelist.name": "Όνομα",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Δεν είστε συνδεδεμένος/η", "upload.modal.not-signed-in": "Δεν είστε συνδεδεμένος/η",
"upload.modal.not-signed-in-description": "Δεν θα μπορείτε να διαγράψετε την κοινή χρήση σας χειροκίνητα και να δείτε την αρίθμηση επισκεπτών.", "upload.modal.not-signed-in-description": "Δεν θα μπορείτε να διαγράψετε την κοινή χρήση σας χειροκίνητα και να δείτε την αρίθμηση επισκεπτών.",
"upload.modal.expires.never": "ποτέ", "upload.modal.expires.never": "ποτέ",
"upload.modal.expires.never-long": "Χωρίς λήξη", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Η λήξη υπερβαίνει τη μέγιστη ημερομηνία λήξης {max}.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Σύνδεσμος", "upload.modal.link.label": "Σύνδεσμος",
"upload.modal.expires.label": "Λήξη", "upload.modal.expires.label": "Λήξη",
"upload.modal.expires.minute-singular": "Λεπτό", "upload.modal.expires.minute-singular": "Λεπτό",
@@ -244,9 +250,9 @@ export default {
"upload.modal.expires.month-plural": "Μήνες", "upload.modal.expires.month-plural": "Μήνες",
"upload.modal.expires.year-singular": "Έτος", "upload.modal.expires.year-singular": "Έτος",
"upload.modal.expires.year-plural": "Έτη", "upload.modal.expires.year-plural": "Έτη",
"upload.modal.accordion.name-and-description.title": "Name and description", "upload.modal.accordion.name-and-description.title": "Όνομα και περιγραφή",
"upload.modal.accordion.name-and-description.name.placeholder": "Name", "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": "Αποδέκτες email", "upload.modal.accordion.email.title": "Αποδέκτες email",
"upload.modal.accordion.email.placeholder": "Εισάγετε αποδέκτες email", "upload.modal.accordion.email.placeholder": "Εισάγετε αποδέκτες email",
"upload.modal.accordion.email.invalid-email": "Μη έγκυρη διεύθυνση e-mail", "upload.modal.accordion.email.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
@@ -259,7 +265,7 @@ export default {
"upload.modal.completed.never-expires": "Αυτός ο διαμοιρασμός δεν λήγει.", "upload.modal.completed.never-expires": "Αυτός ο διαμοιρασμός δεν λήγει.",
"upload.modal.completed.expires-on": "Αυτός ο διαμοιρασμός θα λήξει {expiration}.", "upload.modal.completed.expires-on": "Αυτός ο διαμοιρασμός θα λήξει {expiration}.",
"upload.modal.completed.share-ready": "Κοινοποίηση έτοιμου", "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 // END /upload
// /share/[id] // /share/[id]
"share.title": "Διαμοιρασμός {shareId}", "share.title": "Διαμοιρασμός {shareId}",
@@ -269,19 +275,19 @@ export default {
"share.error.removed.title": "Κοινοποίηση αφαιρέθηκε", "share.error.removed.title": "Κοινοποίηση αφαιρέθηκε",
"share.error.not-found.title": "Η κοινοποίηση δε βρέθηκε", "share.error.not-found.title": "Η κοινοποίηση δε βρέθηκε",
"share.error.not-found.description": "Η κοινοποίηση που ψάχνετε δεν υπάρχει.", "share.error.not-found.description": "Η κοινοποίηση που ψάχνετε δεν υπάρχει.",
"share.error.access-denied.title": "Private share", "share.error.access-denied.title": "Ιδιωτική κοινοποίηση",
"share.error.access-denied.description": "The current account does not have permission to access this share", "share.error.access-denied.description": "Ο τρέχων λογαριασμός δεν έχει δικαίωμα πρόσβασης σε αυτήν την κοινοποίηση",
"share.modal.password.title": "Απαιτείται κωδικός", "share.modal.password.title": "Απαιτείται κωδικός",
"share.modal.password.description": "Για να αποκτήσετε πρόσβαση σε αυτή την κοινοποίηση εισάγετε τον κωδικό πρόσβασης.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Κωδικός πρόσβασης", "share.modal.password": "Κωδικός πρόσβασης",
"share.modal.error.invalid-password": "Μη έγκυρος κωδικός πρόσβασης", "share.modal.error.invalid-password": "Μη έγκυρος κωδικός πρόσβασης",
"share.button.download-all": "Λήψη όλων", "share.button.download-all": "Λήψη όλων",
"share.notify.download-all-preparing": "Αυτός ο διαμοιρασμός βρίσκεται σε επεξεργασία. Προσπαθήστε ξανά σε λίγο.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "Σύνδεσμος αρχείου", "share.modal.file-link": "Σύνδεσμος αρχείου",
"share.table.name": "Όνομα", "share.table.name": "Όνομα",
"share.table.size": "Μέγεθος", "share.table.size": "Μέγεθος",
"share.modal.file-preview.error.not-supported.title": "Η προεπισκόπηση δεν υποστηρίζεται", "share.modal.file-preview.error.not-supported.title": "Η προεπισκόπηση δεν υποστηρίζεται",
"share.modal.file-preview.error.not-supported.description": "Η προεπισκόπηση για αυτό τον τύπο αρχείου δεν υποστηρίζεται. Παρακαλώ κατεβάστε το αρχείο για να το δείτε.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Ενημέρωση {shareId}", "share.edit.title": "Ενημέρωση {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση του διαμοιρασμού.", "share.edit.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση του διαμοιρασμού.",
"share.edit.notify.save-success": "Ο διαμοιρασμός ενημερώθηκε επιτυχώς", "share.edit.notify.save-success": "Ο διαμοιρασμός ενημερώθηκε επιτυχώς",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Διαμόρφωση", "admin.config.title": "Διαμόρφωση",
"admin.config.category.general": "Γενικά", "admin.config.category.general": "Γενικά",
@@ -300,53 +312,57 @@ export default {
"admin.config.general.app-name.description": "Ονομασία της εφαρμογής", "admin.config.general.app-name.description": "Ονομασία της εφαρμογής",
"admin.config.general.app-url": "URL Εφαρμογής", "admin.config.general.app-url": "URL Εφαρμογής",
"admin.config.general.app-url.description": "Η διεύθυνση URL όπου το Pingvin Share είναι διαθέσιμο", "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": "Εμφάνιση αρχικής σελίδας",
"admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα", "admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.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": "Χρόνος σε ώρες μετά την οποία ένας χρήστης πρέπει να συνδεθεί ξανά (προεπιλογή: 3 μήνες).",
"admin.config.general.logo": "Λογότυπο", "admin.config.general.logo": "Λογότυπο",
"admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.", "admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.",
"admin.config.general.logo.placeholder": "Επιλέξτε εικόνα", "admin.config.general.logo.placeholder": "Επιλέξτε εικόνα",
"admin.config.email.enable-share-email-recipients": "Ενεργοποίηση κοινής χρήσης μέσω email", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Εάν θα ενεργοποιηθεί η κοινή χρήση μέσω email. Δυνατή μόνον με την ενεργοποίηση SMTP.", "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": "Θέμα στο email διαμοιρασμού",
"admin.config.email.share-recipients-subject.description": "Το θέμα του email διαμοιρασμού που θα φτάσει στον παραλήπτη.", "admin.config.email.share-recipients-subject.description": "Το θέμα του email διαμοιρασμού που θα φτάσει στον παραλήπτη.",
"admin.config.email.share-recipients-message": "Το θέμα του email για τον διαμοιρασμό που θα φτάσει στον παραλήπτη ", "admin.config.email.share-recipients-message": "Το θέμα του email για τον διαμοιρασμό που θα φτάσει στον παραλήπτη ",
"admin.config.email.share-recipients-message.description": "Μήνυμα που αποστέλλεται στους παραλήπτες κοινής χρήσης. Διαθέσιμες μεταβλητές:\n {creator} - Το όνομα χρήστη του δημιουργού της κοινής χρήσης\n {shareUrl} - Η διεύθυνση URL της κοινής χρήσης\n {desc} - Η περιγραφή της κοινής χρήσης\n {expires} - Η ημερομηνία λήξης της κοινής χρήσης\n Οι μεταβλητές θα αντικατασταθούν με την πραγματική τιμή.", "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": "Θέμα email αντίστροφου διαμοιρασμού",
"admin.config.email.reverse-share-subject.description": "Θέμα του ηλεκτρονικού ταχυδρομείου που αποστέλλεται όταν κάποιος δημιούργησε έναν αντίστροφο διαμοιρασμό.", "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 αντίστροφου διαμοιρασμού", "admin.config.email.reverse-share-message": "Μήνυμα email αντίστροφου διαμοιρασμού",
"admin.config.email.reverse-share-message.description": "Μήνυμα που αποστέλλεται όταν κάποιος δημιουργεί έναν σύνδεσμο αντίστροφου διαμοιρασμού. Το {shareUrl} θα αντικατασταθεί με το όνομα του δημιουργού και τη διεύθυνση URL κοινής χρήσης.", "admin.config.email.reverse-share-message.description": "Μήνυμα που αποστέλλεται όταν κάποιος δημιουργεί έναν σύνδεσμο αντίστροφου διαμοιρασμού. Το {shareUrl} θα αντικατασταθεί με το όνομα του δημιουργού και τη διεύθυνση URL κοινής χρήσης.",
"admin.config.email.reset-password-subject": "Θέμα μηνύματος επαναφοράς κωδικού πρόσβασης", "admin.config.email.reset-password-subject": "Θέμα μηνύματος επαναφοράς κωδικού πρόσβασης",
"admin.config.email.reset-password-subject.description": "Θέμα του email που αποστέλλεται όταν ένας χρήστης ζητήσει επαναφορά κωδικού πρόσβασης.", "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": "Κείμενο μηνύματος επαναφοράς κωδικού πρόσβασης", "admin.config.email.reset-password-message": "Κείμενο μηνύματος επαναφοράς κωδικού πρόσβασης",
"admin.config.email.reset-password-message.description": "Μήνυμα που αποστέλλεται όταν ένας χρήστης ζητά επαναφορά κωδικού πρόσβασης. Το {url} θα αντικατασταθεί με τη διεύθυνση URL επαναφοράς κωδικού πρόσβασης.", "admin.config.email.reset-password-message.description": "Μήνυμα που αποστέλλεται όταν ένας χρήστης ζητά επαναφορά κωδικού πρόσβασης. Το {url} θα αντικατασταθεί με τη διεύθυνση URL επαναφοράς κωδικού πρόσβασης.",
"admin.config.email.invite-subject": "Θέμα μηνύματος πρόσκλησης", "admin.config.email.invite-subject": "Θέμα μηνύματος πρόσκλησης",
"admin.config.email.invite-subject.description": "Θέμα του email που αποστέλλεται όταν ένας διαχειριστής προσκαλεί έναν χρήστη.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Μήνυμα μηνύματος πρόσκλησης", "admin.config.email.invite-message": "Μήνυμα μηνύματος πρόσκλησης",
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the password of the user.", "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": "Να επιτρέπεται η εγγραφή", "admin.config.share.allow-registration": "Να επιτρέπεται η εγγραφή",
"admin.config.share.allow-registration.description": "Αν επιτρέπεται η εγγραφή", "admin.config.share.allow-registration.description": "Αν επιτρέπεται η εγγραφή",
"admin.config.share.allow-unauthenticated-shares": "Επιτρέψτε κοινές χρήσεις χωρίς έλεγχο ταυτότητας", "admin.config.share.allow-unauthenticated-shares": "Επιτρέψτε κοινές χρήσεις χωρίς έλεγχο ταυτότητας",
"admin.config.share.allow-unauthenticated-shares.description": "Εάν οι χρήστες χωρίς έλεγχο ταυτότητας μπορούν να δημιουργήσουν κοινόχρηστα στοιχεία", "admin.config.share.allow-unauthenticated-shares.description": "Εάν οι χρήστες χωρίς έλεγχο ταυτότητας μπορούν να δημιουργήσουν κοινόχρηστα στοιχεία",
"admin.config.share.max-expiration": "Μέγιστη λήξη", "admin.config.share.max-expiration": "Μέγιστη λήξη",
"admin.config.share.max-expiration.description": "Μέγιστη λήξη κοινής χρήσης σε ώρες. Ορίστε το 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": "Μέγιστο μέγεθος",
"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": "Βαθμός συμπίεσης ZIP",
"admin.config.share.zip-compression-level.description": "Προσαρμόστε το βαθμό συμπίεσης για να εξισορροπηθεί το μέγεθος του αρχείου και η ταχύτητα επεξεργασίας. Έγκυρες τιμές κυμαίνονται από 0 έως 9, με 0 χωρίς συμπίεση και 9 μέγιστη συμπίεση.", "admin.config.share.zip-compression-level.description": "Προσαρμόστε το βαθμό συμπίεσης για να εξισορροπηθεί το μέγεθος του αρχείου και η ταχύτητα επεξεργασίας. Έγκυρες τιμές κυμαίνονται από 0 έως 9, με 0 χωρίς συμπίεση και 9 μέγιστη συμπίεση.",
"admin.config.share.chunk-size": "Μέγεθος κομματιών", "admin.config.share.chunk-size": "Μέγεθος κομματιών",
"admin.config.share.chunk-size.description": "Προσαρμόστε το μέγεθος κομματιών (σε bytes) για να εξισορροπήσετε την αποδοτικότητα και την αξιοπιστία του συστήματος σύμφωνα με τη σύνδεσή σας στο διαδίκτυο. Μικρότερα κομμάτια μπορούν να βελτιώσουν τα ποσοστά επιτυχίας σε ασταθείς συνδέσεις, ενώ μεγαλύτερα κομμάτια επιταχύνουν τις μεταφορτώσεις σε σταθερές συνδέσεις.", "admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "Ενεργοποιημένο", "admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "Εάν η λειτουργία SMTP είναι ενεργοποιημένη. Ενεργοποιήστε τη μόνον όταν ορίσετε σωστά τις παραμέτρους που ακολουθούν.", "admin.config.smtp.enabled.description": "Εάν η λειτουργία SMTP είναι ενεργοποιημένη. Ενεργοποιήστε τη μόνον όταν ορίσετε σωστά τις παραμέτρους που ακολουθούν.",
"admin.config.smtp.host": "Εξυπηρετητής", "admin.config.smtp.host": "Εξυπηρετητής",
"admin.config.smtp.host.description": "SMTP εξυπηρετητής", "admin.config.smtp.host.description": "SMTP εξυπηρετητής",
"admin.config.smtp.port": "Θύρα", "admin.config.smtp.port": "Θύρα",
"admin.config.smtp.port.description": "SMTP θύρα", "admin.config.smtp.port.description": "SMTP θύρα",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Διεύθυνση email από όπου αποστέλλονται τα μηνύματα", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Όνομα χρήστη", "admin.config.smtp.username": "Όνομα χρήστη",
"admin.config.smtp.username.description": "Όνομα χρήστη στον SMTP εξυπηρετητή", "admin.config.smtp.username.description": "Όνομα χρήστη στον SMTP εξυπηρετητή",
"admin.config.smtp.password": "Κωδικός πρόσβασης", "admin.config.smtp.password": "Κωδικός πρόσβασης",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Μυστικό πελάτη της εφαρμογής Microsoft OAuth", "admin.config.oauth.microsoft-client-secret.description": "Μυστικό πελάτη της εφαρμογής Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση στο Discord", "admin.config.oauth.discord-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση στο Discord",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"admin.config.oauth.discord-limited-users.description": "Limit signing in to specific users by their Discord ID. Leave it blank to disable.",
"admin.config.oauth.discord-limited-guild": "Αναγνωριστικό διακομιστή περιορισμένης ισχύος Discord", "admin.config.oauth.discord-limited-guild": "Αναγνωριστικό διακομιστή περιορισμένης ισχύος Discord",
"admin.config.oauth.discord-limited-guild.description": "Περιορισμός σύνδεσης σε χρήστες σε ένα συγκεκριμένο διακομιστή. Αφήστε κενό για να απενεργοποιήσετε.", "admin.config.oauth.discord-limited-guild.description": "Περιορισμός σύνδεσης σε χρήστες σε ένα συγκεκριμένο διακομιστή. Αφήστε κενό για να απενεργοποιήσετε.",
"admin.config.oauth.discord-client-id": "Αναγνωριστικό Πελάτη Discord", "admin.config.oauth.discord-client-id": "Αναγνωριστικό Πελάτη Discord",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση OpenID", "admin.config.oauth.oidc-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση OpenID",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app", "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": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Αφήστε κενό αν δε γνωρίζετε για αυτή τη ρύθμιση", "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", "admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app", "admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "Ουπς. Αυτή η σελίδα δεν υπάρχει.", "404.description": "Ουπς. Αυτή η σελίδα δεν υπάρχει.",
"404.button.home": "Πήγαινέ με πίσω", "404.button.home": "Πήγαινέ με πίσω",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "Ο χρήστης που συνδέεται με αυτόν τον λογαριασμό {0} δεν υπάρχει.", "error.msg.no_user": "Ο χρήστης που συνδέεται με αυτόν τον λογαριασμό {0} δεν υπάρχει.",
"error.msg.no_email": "Δεν είναι δυνατή η λήψη διεύθυνσης ηλεκτρονικού ταχυδρομείου για αυτόν τον λογαριασμό {0}.", "error.msg.no_email": "Δεν είναι δυνατή η λήψη διεύθυνσης ηλεκτρονικού ταχυδρομείου για αυτόν τον λογαριασμό {0}.",
"error.msg.already_linked": "Αυτός ο λογαριασμός {0} είναι ήδη συνδεδεμένος με άλλο λογαριασμό.", "error.msg.already_linked": "Αυτός ο λογαριασμός {0} είναι ήδη συνδεδεμένος με άλλο λογαριασμό.",
"error.msg.not_linked": "Αυτός ο λογαριασμός {0} δεν έχει συνδεθεί με κανένα λογαριασμό ακόμα.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "Αυτός ο λογαριασμός {0} δεν έχει επαληθευτεί, παρακαλώ προσπαθήστε ξανά μετά την επαλήθευση.", "error.msg.unverified_account": "Αυτός ο λογαριασμός {0} δεν έχει επαληθευτεί, παρακαλώ προσπαθήστε ξανά μετά την επαλήθευση.",
"error.msg.user_not_allowed": "Δεν σας επιτρέπεται η σύνδεση.", "error.msg.user_not_allowed": "Δεν σας επιτρέπεται η σύνδεση.",
"error.msg.cannot_get_user_info": "Δεν είναι δυνατή η λήψη των πληροφοριών χρήστη από αυτόν τον λογαριασμό {0}.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Δημιουργία", "common.button.generate": "Δημιουργία",
"common.button.done": "Ολοκληρώθηκε", "common.button.done": "Ολοκληρώθηκε",
"common.text.link": "Σύνδεσμος", "common.text.link": "Σύνδεσμος",
"common.text.navigate-to-link": "Μεταβείτε στο σύνδεσμο", "common.text.navigate-to-link": "Visit link",
"common.text.or": "ή", "common.text.or": "ή",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Επιστροφή", "common.button.go-back": "Επιστροφή",
"common.button.go-home": "Μετάβαση στην αρχική", "common.button.go-home": "Μετάβαση στην αρχική",
"common.notify.copied": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο", "common.notify.copied": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
"common.notify.copied-link": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
"common.success": "Επιτυχία", "common.success": "Επιτυχία",
"common.error": "Σφάλμα", "common.error": "Σφάλμα",
"common.error.unknown": "Προέκυψε άγνωστο σφάλμα", "common.error.unknown": "Προέκυψε άγνωστο σφάλμα",
"common.error.invalid-email": "Μη έγκυρη διεύθυνση e-mail", "common.error.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
"common.error.too-short": "Πρέπει να αποτελείται τουλάχιστον {length} χαρακτήρες", "common.error.too-short": "Πρέπει να αποτελείται τουλάχιστον {length} χαρακτήρες",
"common.error.too-long": "Πρέπει να αποτελείται το πολύ από {length} χαρακτήρες", "common.error.too-long": "Πρέπει να αποτελείται το πολύ από {length} χαρακτήρες",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Πρέπει να αποτελείται ακριβώς από {length} χαρακτήρες", "common.error.exact-length": "Πρέπει να αποτελείται ακριβώς από {length} χαρακτήρες",
"common.error.invalid-number": "Πρέπει να είναι αριθμός", "common.error.invalid-number": "Πρέπει να είναι αριθμός",
"common.error.field-required": "Αυτό το πεδίο είναι υποχρεωτικό" "common.error.field-required": "Αυτό το πεδίο είναι υποχρεωτικό"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Upload", "navbar.upload": "Upload",
"navbar.signin": "Sign in", "navbar.signin": "Sign in",
"navbar.home": "Home", "navbar.home": "Home",
"navbar.signup": "Sign Up", "navbar.signup": "Sign up",
"navbar.links.shares": "My shares", "navbar.links.shares": "My shares",
"navbar.links.reverse": "Reverse shares", "navbar.links.reverse": "Reverse shares",
@@ -22,10 +22,10 @@ export default {
"home.bullet.a.description": "Host Pingvin Share on your own machine.", "home.bullet.a.description": "Host Pingvin Share on your own machine.",
"home.bullet.b.name": "Privacy", "home.bullet.b.name": "Privacy",
"home.bullet.b.description": "home.bullet.b.description":
"Your files are your files and should never get into the hands of third parties.", "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "No annoying file size limit", "home.bullet.c.name": "No annoying file size limit",
"home.bullet.c.description": "home.bullet.c.description":
"Upload as big files as you want. Only your hard drive will be your limit.", "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Get started", "home.button.start": "Get started",
"home.button.source": "Source code", "home.button.source": "Source code",
@@ -75,13 +75,13 @@ export default {
"resetPassword.title": "Forgot your password?", "resetPassword.title": "Forgot your password?",
"resetPassword.description": "Enter your email to reset your password.", "resetPassword.description": "Enter your email to reset your password.",
"resetPassword.notify.success": "resetPassword.notify.success":
"A message with a link to reset your password has been sent if the email exists.", "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.button.back": "Back to sign in page",
"resetPassword.text.resetPassword": "Reset password", "resetPassword.text.resetPassword": "Reset password",
"resetPassword.text.enterNewPassword": "Enter your new password", "resetPassword.text.enterNewPassword": "Enter your new password",
"resetPassword.input.password": "New password", "resetPassword.input.password": "New password",
"resetPassword.notify.passwordReset": "resetPassword.notify.passwordReset":
"Your password has been reset successfully.", "Your password has been successfully reset.",
// /account // /account
"account.title": "My account", "account.title": "My account",
@@ -95,7 +95,7 @@ export default {
"account.card.password.old": "Old password", "account.card.password.old": "Old password",
"account.card.password.new": "New password", "account.card.password.new": "New password",
"account.card.password.noPasswordSet": "account.card.password.noPasswordSet":
"You don't have a password set. If you want to sign in with email and password you need to set a password.", "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.notify.password.success": "Password changed successfully",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Social login",
@@ -109,7 +109,7 @@ export default {
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Unlinked",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Unlink account",
"account.modal.unlink.description": "account.modal.unlink.description":
"Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.", "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.notify.oauth.unlinked.success": "Unlinked successfully",
"account.card.security.title": "Security", "account.card.security.title": "Security",
@@ -155,14 +155,17 @@ export default {
"account.shares.table.name": "Name", "account.shares.table.name": "Name",
"account.shares.table.description": "Description", "account.shares.table.description": "Description",
"account.shares.table.visitors": "Visitors", "account.shares.table.visitors": "Visitors",
"account.shares.table.expiresAt": "Expires at", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Created at", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Size", "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-informations": "Share informations",
"account.shares.modal.share-link": "Share link", "account.shares.modal.share-link": "Share link",
"account.shares.modal.delete.title": "Delete share {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "account.shares.modal.delete.description":
"Do you really want to delete this share?", "Do you really want to delete this share?",
@@ -195,17 +198,17 @@ export default {
"account.reverseShares.modal.max-size.label": "Max share size", "account.reverseShares.modal.max-size.label": "Max share size",
"account.reverseShares.modal.send-email": "Send email notification", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "account.reverseShares.modal.send-email.description":
"Send an email notification when a share is created with this reverse share link.", "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": "Simple mode",
"account.reverseShares.modal.simplified.description": "account.reverseShares.modal.simplified.description":
"Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.", "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": "Public access",
"account.reverseShares.modal.public-access.description": "account.reverseShares.modal.public-access.description":
"Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "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.label": "Max uses",
"account.reverseShares.modal.max-use.description": "account.reverseShares.modal.max-use.description":
@@ -244,7 +247,7 @@ export default {
"admin.users.table.email": "Email", "admin.users.table.email": "Email",
"admin.users.table.admin": "Admin", "admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Update user {username}", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Admin privileges", "admin.users.edit.update.admin-privileges": "Admin privileges",
"admin.users.edit.update.change-password.title": "Change password", "admin.users.edit.update.change-password.title": "Change password",
"admin.users.edit.update.change-password.field": "New password", "admin.users.edit.update.change-password.field": "New password",
@@ -252,9 +255,9 @@ export default {
"admin.users.edit.update.notify.password.success": "admin.users.edit.update.notify.password.success":
"Password changed successfully", "Password changed successfully",
"admin.users.edit.delete.title": "Delete user {username}", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "admin.users.edit.delete.description":
"Do you really want to delete this user and all his shares?", "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Create user", "admin.users.modal.create.title": "Create user",
@@ -275,9 +278,9 @@ export default {
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator", "admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Visitors", "admin.shares.table.visitors": "Visitors",
"admin.shares.table.expires": "Expires At", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share {id}", "admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "admin.shares.edit.delete.description":
"Do you really want to delete this share?", "Do you really want to delete this share?",
@@ -286,14 +289,19 @@ export default {
// /upload // /upload
"upload.title": "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": "upload.notify.generic-error":
"An error occurred while finishing your share.", "An error occurred while finishing your share.",
"upload.notify.count-failed": "{count} files failed to upload. Trying again.", "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 // Dropzone.tsx
"upload.dropzone.title": "Upload files", "upload.dropzone.title": "Upload files",
"upload.dropzone.description": "upload.dropzone.description":
"Drag'n'drop files here to start your share. We can accept only files that are less than {maxSize} in total.", "Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
"upload.dropzone.notify.file-too-big": "upload.dropzone.notify.file-too-big":
"Your files exceed the maximum share size of {maxSize}.", "Your files exceed the maximum share size of {maxSize}.",
@@ -311,9 +319,9 @@ export default {
"You will be unable to delete your share manually and view the visitor count.", "You will be unable to delete your share manually and view the visitor count.",
"upload.modal.expires.never": "never", "upload.modal.expires.never": "never",
"upload.modal.expires.never-long": "Never Expires", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "upload.modal.expires.error.too-long":
"Expiration exceeds maximum expiration date of {max}.", "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Link", "upload.modal.link.label": "Link",
"upload.modal.expires.label": "Expiration", "upload.modal.expires.label": "Expiration",
@@ -350,7 +358,8 @@ export default {
"upload.modal.completed.expires-on": "upload.modal.completed.expires-on":
"This share will expire on {expiration}.", "This share will expire on {expiration}.",
"upload.modal.completed.share-ready": "Share ready", "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.", "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 // END /upload
@@ -365,17 +374,18 @@ export default {
"share.error.not-found.description": "share.error.not-found.description":
"The share you're looking for doesn't exist.", "The share you're looking for doesn't exist.",
"share.error.access-denied.title": "Private share", "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.description":
"The current account does not have permission to access this share",
"share.modal.password.title": "Password required", "share.modal.password.title": "Password required",
"share.modal.password.description": "share.modal.password.description":
"To access this share please enter the password for the share.", "Please enter the password to acces this share.",
"share.modal.password": "Password", "share.modal.password": "Password",
"share.modal.error.invalid-password": "Invalid password", "share.modal.error.invalid-password": "Invalid password",
"share.button.download-all": "Download all", "share.button.download-all": "Download all",
"share.notify.download-all-preparing": "share.notify.download-all-preparing":
"The share is preparing. Try again in a few minutes.", "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "File link", "share.modal.file-link": "File link",
"share.table.name": "Name", "share.table.name": "Name",
@@ -383,7 +393,7 @@ export default {
"share.modal.file-preview.error.not-supported.title": "Preview not supported", "share.modal.file-preview.error.not-supported.title": "Preview not supported",
"share.modal.file-preview.error.not-supported.description": "share.modal.file-preview.error.not-supported.description":
"A preview for this file type is unsupported. Please download the file to view it.", "Previews are not supported for this type of files. Please download the file to view it.",
// END /share/[id] // END /share/[id]
@@ -395,6 +405,14 @@ export default {
"share.edit.notify.save-success": "Share updated successfully", "share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Configuration", "admin.config.title": "Configuration",
"admin.config.category.general": "General", "admin.config.category.general": "General",
@@ -408,6 +426,9 @@ export default {
"admin.config.general.app-url": "App URL", "admin.config.general.app-url": "App URL",
"admin.config.general.app-url.description": "admin.config.general.app-url.description":
"On which URL Pingvin Share is available", "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": "Show home page",
"admin.config.general.show-home-page.description": "admin.config.general.show-home-page.description":
"Whether to show the home page", "Whether to show the home page",
@@ -420,33 +441,33 @@ export default {
"admin.config.general.logo.placeholder": "Pick image", "admin.config.general.logo.placeholder": "Pick image",
"admin.config.email.enable-share-email-recipients": "admin.config.email.enable-share-email-recipients":
"Enable share email recipients", "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "admin.config.email.enable-share-email-recipients.description":
"Whether to allow emails to share recipients. Only enable this if you have enabled SMTP.", "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": "Share recipients subject",
"admin.config.email.share-recipients-subject.description": "admin.config.email.share-recipients-subject.description":
"Subject of the email which gets sent to the share recipients.", "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": "Share recipients message",
"admin.config.email.share-recipients-message.description": "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 The 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": "Reverse share subject",
"admin.config.email.reverse-share-subject.description": "admin.config.email.reverse-share-subject.description":
"Subject of the email which gets sent when someone created a share with your reverse share link.", "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": "Reverse share message",
"admin.config.email.reverse-share-message.description": "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.", "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": "Reset password subject",
"admin.config.email.reset-password-subject.description": "admin.config.email.reset-password-subject.description":
"Subject of the email which gets sent when a user requests a password reset.", "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": "Reset password message",
"admin.config.email.reset-password-message.description": "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.", "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": "Invite subject",
"admin.config.email.invite-subject.description": "admin.config.email.invite-subject.description":
"Subject of the email which gets sent when an admin invites a user.", "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Invite message", "admin.config.email.invite-message": "Invite message",
"admin.config.email.invite-message.description": "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 password of the user.", "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": "Allow registration",
"admin.config.share.allow-registration.description": "admin.config.share.allow-registration.description":
@@ -457,20 +478,23 @@ export default {
"Whether unauthenticated users can create shares", "Whether unauthenticated users can create shares",
"admin.config.share.max-expiration": "Max expiration", "admin.config.share.max-expiration": "Max expiration",
"admin.config.share.max-expiration.description": "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": "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": "Zip compression level",
"admin.config.share.zip-compression-level.description": "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. ", "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": "Chunk size",
"admin.config.share.chunk-size.description": "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 speed up uploads 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": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "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.", "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "Enabled", "admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "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.", "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": "Host",
@@ -479,7 +503,7 @@ export default {
"admin.config.smtp.port.description": "Port of the SMTP server", "admin.config.smtp.port.description": "Port of the SMTP server",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "admin.config.smtp.email.description":
"Email address which the emails get sent from", "Email address from wich the emails get sent",
"admin.config.smtp.username": "Username", "admin.config.smtp.username": "Username",
"admin.config.smtp.username.description": "Username of the SMTP server", "admin.config.smtp.username.description": "Username of the SMTP server",
"admin.config.smtp.password": "Password", "admin.config.smtp.password": "Password",
@@ -532,6 +556,9 @@ export default {
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "admin.config.oauth.discord-enabled.description":
"Whether Discord login is enabled", "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": "Discord limited server ID",
"admin.config.oauth.discord-limited-guild.description": "admin.config.oauth.discord-limited-guild.description":
"Limit signing in to users in a specific server. Leave it blank to disable.", "Limit signing in to users in a specific server. Leave it blank to disable.",
@@ -547,6 +574,12 @@ export default {
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "admin.config.oauth.oidc-discovery-uri.description":
"Discovery URI of the OpenID Connect OAuth app", "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": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "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.", "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
@@ -555,11 +588,13 @@ export default {
"Must be a valid JMES path referencing an array of roles. " + "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. " + "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.", "Leave it blank if you don't know what this config is.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access", "admin.config.oauth.oidc-role-general-access":
"OpenID Connect role for general access",
"admin.config.oauth.oidc-role-general-access.description": "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. " + "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.", "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":
"OpenID Connect role for admin access",
"admin.config.oauth.oidc-role-admin-access.description": "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. " + "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.", "Leave it blank if you don't know what this config is.",
@@ -571,20 +606,64 @@ export default {
"Client secret of the OpenID Connect OAuth app", "Client secret of the OpenID Connect OAuth app",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description":
"Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description":
"Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "Oops this page doesn't exist.", "404.description": "Oops this page doesn't exist.",
@@ -604,13 +683,13 @@ export default {
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_email": "Can't get email address from this {0} account.",
"error.msg.already_linked": "error.msg.already_linked":
"This {0} account is already linked to another account.", "This {0} account is already linked to another account.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.not_linked":
"This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "error.msg.unverified_account":
"This {0} account is unverified, please try again after verification.", "This {0} account is unverified, please try again after verification.",
"error.msg.user_not_allowed": "error.msg.user_not_allowed": "You are not allowed to sign in.",
"You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "error.msg.cannot_get_user_info":
"Can not get your user info from this {0} account.", "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -629,11 +708,13 @@ export default {
"common.button.generate": "Generate", "common.button.generate": "Generate",
"common.button.done": "Done", "common.button.done": "Done",
"common.text.link": "Link", "common.text.link": "Link",
"common.text.navigate-to-link": "Go to the link", "common.text.navigate-to-link": "Visit link",
"common.text.or": "or", "common.text.or": "or",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Go back", "common.button.go-back": "Go back",
"common.button.go-home": "Go home", "common.button.go-home": "Go home",
"common.notify.copied": "Your link was copied to the clipboard", "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.success": "Success",
"common.error": "Error", "common.error": "Error",
@@ -641,6 +722,8 @@ export default {
"common.error.invalid-email": "Invalid email address", "common.error.invalid-email": "Invalid email address",
"common.error.too-short": "Must be at least {length} characters", "common.error.too-short": "Must be at least {length} characters",
"common.error.too-long": "Must be at most {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.exact-length": "Must be exactly {length} characters",
"common.error.invalid-number": "Must be a number", "common.error.invalid-number": "Must be a number",
"common.error.field-required": "This field is required", "common.error.field-required": "This field is required",

View File

@@ -12,13 +12,13 @@ export default {
// END navbar // END navbar
// / // /
"home.title": "Una plataforma <h>autoalojada</h> para compartir archivos.", "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.name": "Autoalojada",
"home.bullet.a.description": "Aloja Pingvin Share en tu propio equipo.", "home.bullet.a.description": "Aloja Pingvin Share en tu propio equipo.",
"home.bullet.b.name": "Privacidad", "home.bullet.b.name": "Privacidad",
"home.bullet.b.description": "Tus archivos son tus archivos y nunca deberían terminar en manos de terceros.", "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.name": "Sin molestos límites de tamaño de archivo",
"home.bullet.c.description": "Sube archivos tan grandes como quieras. El único límite es la capacidad de tu disco duro.", "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.start": "Comenzar",
"home.button.source": "Código fuente", "home.button.source": "Código fuente",
// END / // END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "¿Olvidaste tu contraseña?", "resetPassword.title": "¿Olvidaste tu contraseña?",
"resetPassword.description": "Ingresa tu correo para restablecer tu contraseña.", "resetPassword.description": "Ingresa tu correo para restablecer tu contraseña.",
"resetPassword.notify.success": "Se ha enviado un mensaje con un enlace para restablecer tu contraseña.", "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.button.back": "Volver al inicio de sesión",
"resetPassword.text.resetPassword": "Restablecer contraseña", "resetPassword.text.resetPassword": "Restablecer contraseña",
"resetPassword.text.enterNewPassword": "Ingresa tu nueva contraseña", "resetPassword.text.enterNewPassword": "Ingresa tu nueva contraseña",
"resetPassword.input.password": "Nueva contraseña", "resetPassword.input.password": "Nueva contraseña",
"resetPassword.notify.passwordReset": "Tu contraseña se ha restablecido correctamente.", "resetPassword.notify.passwordReset": "Tu contraseña ha sido restablecida exitosamente.",
// /account // /account
"account.title": "Mi cuenta", "account.title": "Mi cuenta",
"account.card.info.title": "Información de cuenta", "account.card.info.title": "Información de cuenta",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Contraseña", "account.card.password.title": "Contraseña",
"account.card.password.old": "Anterior contraseña", "account.card.password.old": "Anterior contraseña",
"account.card.password.new": "Nueva contraseña", "account.card.password.new": "Nueva contraseña",
"account.card.password.noPasswordSet": "No tienes una establecida contraseña. Si deseas iniciar sesión con correo electrónico y una contraseña necesitas crear una contraseña.", "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.notify.password.success": "Contraseña cambiada correctamente",
"account.card.oauth.title": "Inicio de sesión con red social", "account.card.oauth.title": "Inicio de sesión con red social",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Desvincular", "account.card.oauth.unlink": "Desvincular",
"account.card.oauth.unlinked": "Desvinculado", "account.card.oauth.unlinked": "Desvinculado",
"account.modal.unlink.title": "Desvincular cuenta", "account.modal.unlink.title": "Desvincular cuenta",
"account.modal.unlink.description": "Desvincular tus cuentas sociales puede causar que pierdas tu cuenta si no recuerdas tu nombre de usuario y contraseña.", "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.notify.oauth.unlinked.success": "Desvinculado correctamente",
"account.card.security.title": "Seguridad", "account.card.security.title": "Seguridad",
"account.card.security.totp.enable.description": "Ingrese su contraseña actual para habilitar TOTP", "account.card.security.totp.enable.description": "Ingrese su contraseña actual para habilitar TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Nombre", "account.shares.table.name": "Nombre",
"account.shares.table.description": "Descripción", "account.shares.table.description": "Descripción",
"account.shares.table.visitors": "Visitas", "account.shares.table.visitors": "Visitas",
"account.shares.table.expiresAt": "Expira en", "account.shares.table.expiresAt": "Vence el",
"account.shares.table.createdAt": "Creado en", "account.shares.table.createdAt": "Creado el",
"account.shares.table.size": "Tamaño", "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-informations": "Información del compartido",
"account.shares.modal.share-link": "Enlace", "account.shares.modal.share-link": "Enlace",
"account.shares.modal.delete.title": "Eliminar compartido {share}", "account.shares.modal.delete.title": "Eliminar enlace compartido: {share}",
"account.shares.modal.delete.description": "¿Seguro que quieres eliminar este compartido?", "account.shares.modal.delete.description": "¿Seguro que quieres eliminar este compartido?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Año", "account.reverseShares.modal.expiration.year-singular": "Año",
"account.reverseShares.modal.expiration.year-plural": "Años", "account.reverseShares.modal.expiration.year-plural": "Años",
"account.reverseShares.modal.max-size.label": "Tamaño máximo del compartido", "account.reverseShares.modal.max-size.label": "Tamaño máximo del compartido",
"account.reverseShares.modal.send-email": "Enviar notificación por correo", "account.reverseShares.modal.send-email": "Enviar notificaciones por correo electrónico",
"account.reverseShares.modal.send-email.description": "Enviar una notificación por correo cuando se comparta algo con este enlace de compartición inversa.", "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": "Modo simple",
"account.reverseShares.modal.simplified.description": "Facilita que la persona que suba el archivo comparta el mismo contigo. Serán capaces de personalizar sólo el nombre y la descripción de la compartición.", "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": "Acceso público",
"account.reverseShares.modal.public-access.description": "Haz públicas las comparticiones creadas con esta compartición inversa. Si está desactivado, sólo tú y el creador de la compartición pueden verla.", "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.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.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á.", "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.username": "Nombre de usuario",
"admin.users.table.email": "Correo", "admin.users.table.email": "Correo",
"admin.users.table.admin": "Administrador", "admin.users.table.admin": "Administrador",
"admin.users.edit.update.title": "Actualizar usuario {username}", "admin.users.edit.update.title": "Editar usuario: {username}",
"admin.users.edit.update.admin-privileges": "Privilegios de administrador", "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.title": "Cambiar contraseña",
"admin.users.edit.update.change-password.field": "Nueva contraseña", "admin.users.edit.update.change-password.field": "Nueva contraseña",
"admin.users.edit.update.change-password.button": "Guardar nueva contraseña", "admin.users.edit.update.change-password.button": "Guardar nueva contraseña",
"admin.users.edit.update.notify.password.success": "Contraseña cambiada correctamente", "admin.users.edit.update.notify.password.success": "Contraseña cambiada correctamente",
"admin.users.edit.delete.title": "Eliminar usuario {username}", "admin.users.edit.delete.title": "Eliminar usuario: {username} ?",
"admin.users.edit.delete.description": "¿Realmente quiere eliminar este usuario y todos sus archivos compartidos?", "admin.users.edit.delete.description": "¿Realmente deseas eliminar a este usuario y todos sus enlaces compartidos?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Crear usuario", "admin.users.modal.create.title": "Crear usuario",
"admin.users.modal.create.username": "Nombre de 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.id": "ID de compartición",
"admin.shares.table.username": "Creador", "admin.shares.table.username": "Creador",
"admin.shares.table.visitors": "Visitantes", "admin.shares.table.visitors": "Visitantes",
"admin.shares.table.expires": "Expira el", "admin.shares.table.expires": "Vence el",
"admin.shares.edit.delete.title": "Eliminar compartido {id}", "admin.shares.edit.delete.title": "Eliminar enlace compartido: {id}",
"admin.shares.edit.delete.description": "¿Seguro que quieres eliminar este compartido?", "admin.shares.edit.delete.description": "¿Seguro que quieres eliminar este compartido?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Subir", "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.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.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 // Dropzone.tsx
"upload.dropzone.title": "Subir archivos", "upload.dropzone.title": "Subir archivos",
"upload.dropzone.description": "Arrastra archivos aquí para comenzar a compartir. Aceptamos archivos de un tamaño menor a {maxSize} en 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}.", "upload.dropzone.notify.file-too-big": "Tus archivos exceden el tamaño máximo de {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Nombre", "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": "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.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": "nunca",
"upload.modal.expires.never-long": "Nunca Expira", "upload.modal.expires.never-long": "Enlace compartido permanente",
"upload.modal.expires.error.too-long": "La caducidad excede la fecha de caducidad máxima de {max}.", "upload.modal.expires.error.too-long": "La fecha de expiración excede el máximo de {max}.",
"upload.modal.link.label": "Enlace", "upload.modal.link.label": "Enlace",
"upload.modal.expires.label": "Expiración", "upload.modal.expires.label": "Expiración",
"upload.modal.expires.minute-singular": "Minuto", "upload.modal.expires.minute-singular": "Minuto",
@@ -272,16 +278,16 @@ export default {
"share.error.access-denied.title": "Compartición privada", "share.error.access-denied.title": "Compartición privada",
"share.error.access-denied.description": "La cuenta actual no tiene permiso para acceder a este compartido", "share.error.access-denied.description": "La cuenta actual no tiene permiso para acceder a este compartido",
"share.modal.password.title": "Se requiere contraseña", "share.modal.password.title": "Se requiere contraseña",
"share.modal.password.description": "Por favor ingrese la contraseña para poder acceder a este compartido.", "share.modal.password.description": "Por favor, ingresa la contraseña para acceder a este enlace compartido.",
"share.modal.password": "Contraseña", "share.modal.password": "Contraseña",
"share.modal.error.invalid-password": "Contraseña inválida", "share.modal.error.invalid-password": "Contraseña inválida",
"share.button.download-all": "Descargar todo", "share.button.download-all": "Descargar todo",
"share.notify.download-all-preparing": "Se está preparando el compartido. Intente de nuevo en unos minutos.", "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.modal.file-link": "Enlace del archivo",
"share.table.name": "Nombre", "share.table.name": "Nombre",
"share.table.size": "Tamaño", "share.table.size": "Tamaño",
"share.modal.file-preview.error.not-supported.title": "Vista previa no disponible", "share.modal.file-preview.error.not-supported.title": "Vista previa no disponible",
"share.modal.file-preview.error.not-supported.description": "La vista previa para este tipo de archivo no está disponible. Por favor descargue el archivo para verlo.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Editar {shareId}", "share.edit.title": "Editar {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Ha ocurrido un error mientras se compartía tu archivo.", "share.edit.notify.generic-error": "Ha ocurrido un error mientras se compartía tu archivo.",
"share.edit.notify.save-success": "Compartir actualizado correctamente", "share.edit.notify.save-success": "Compartir actualizado correctamente",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Aviso legal",
// END /imprint
// /privacy
"privacy.title": "Política de privacidad",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Configuración", "admin.config.title": "Configuración",
"admin.config.category.general": "General", "admin.config.category.general": "General",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "Nombre de la aplicación", "admin.config.general.app-name.description": "Nombre de la aplicación",
"admin.config.general.app-url": "App URL", "admin.config.general.app-url": "App URL",
"admin.config.general.app-url.description": "En cuál URL está disponible Pingvin Share", "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": "Mostrar página de inicio",
"admin.config.general.show-home-page.description": "Mostrar o no la página de inicio", "admin.config.general.show-home-page.description": "Mostrar o no la página de inicio",
"admin.config.general.session-duration": "Duración de la sesión", "admin.config.general.session-duration": "Duración de la sesión",
@@ -307,46 +321,48 @@ export default {
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Cambia tu logo subiendo una nueva imagen. La imagen debe ser un PNG y debe estar en formato 1:1.", "admin.config.general.logo.description": "Cambia tu logo subiendo una nueva imagen. La imagen debe ser un PNG y debe estar en formato 1:1.",
"admin.config.general.logo.placeholder": "Elegir imagen", "admin.config.general.logo.placeholder": "Elegir imagen",
"admin.config.email.enable-share-email-recipients": "Activar destinatarios por correo", "admin.config.email.enable-share-email-recipients": "Habilitar compartir por correo electrónico",
"admin.config.email.enable-share-email-recipients.description": "Si desea permitir a los destinatarios compartir por correo. Activa esto solo si tienes habilitado SMTP.", "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": "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-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": "Mensaje destinatario",
"admin.config.email.share-recipients-message.description": "Mensaje el cual es enviado al destinatario del compartido. Variables disponibles:\n{creator} - Nombre del creador del compartido\n {shareUrl} - URL del compartido\n {desc} - Descripción del compartido\n {expires} - Fecha de expiración del compartido\nLas variables serán remplazadas con los valores reales.", "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": "Asunto de la compartición inversa",
"admin.config.email.reverse-share-subject.description": "Asunto del correo el cual se envía cuando alguien comparte algo con tu enlace de compartición inversa.", "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": "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.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": "Asunto restablecer contraseña",
"admin.config.email.reset-password-subject.description": "Asunto del correo que se envía cuando un usuario solicita restablecer la contraseña.", "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": "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.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": "Asunto de la invitación",
"admin.config.email.invite-subject.description": "Asunto del correo que se envía cuando un administrador invita a un usuario.", "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": "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 password of the user.", "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": "Permitir registro",
"admin.config.share.allow-registration.description": "Si se permite el 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": "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.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": "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": "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": "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.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": "Tamaño de los fragmentos",
"admin.config.share.chunk-size.description": "Ajusta el tamaño de los fragmentos (en bytes) para tus cargas para equilibrar la eficiencia y la fiabilidad según tu conexión a internet. Fragmentos más pequeños pueden mejorar las tasas de éxito para conexiones inestables, mientras que fragmentos más grandes aceleran las cargas para conexiones estables.", "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": "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.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": "Habilitado", "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.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": "Host",
"admin.config.smtp.host.description": "Host del servidor SMTP", "admin.config.smtp.host.description": "Host del servidor SMTP",
"admin.config.smtp.port": "Puerto", "admin.config.smtp.port": "Puerto",
"admin.config.smtp.port.description": "Puerto del servidor SMTP", "admin.config.smtp.port.description": "Puerto del servidor SMTP",
"admin.config.smtp.email": "Correo", "admin.config.smtp.email": "Correo",
"admin.config.smtp.email.description": "Dirección de correo desde la cual se envían los correos", "admin.config.smtp.email.description": "Dirección desde la cual se envían los correos electrónicos",
"admin.config.smtp.username": "Usuario", "admin.config.smtp.username": "Usuario",
"admin.config.smtp.username.description": "Usuario del servidor SMTP", "admin.config.smtp.username.description": "Usuario del servidor SMTP",
"admin.config.smtp.password": "Contraseña", "admin.config.smtp.password": "Contraseña",
@@ -375,50 +391,89 @@ export default {
"admin.config.oauth.microsoft-enabled": "Microsoft", "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-enabled.description": "Si el inicio de sesión de Microsoft está habilitado",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant", "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": "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-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": "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": "Discord",
"admin.config.oauth.discord-enabled.description": "Si el inicio de sesión de Discord está habilitado", "admin.config.oauth.discord-enabled.description": "Si el inicio de sesión de Discord está habilitado",
"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-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": "ID de cliente de Discord",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "ID de cliente de la aplicación OAuth de Discord",
"admin.config.oauth.discord-client-secret": "Discord Client secret", "admin.config.oauth.discord-client-secret": "Secreto de cliente de Discord",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "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": "Conexión OpenID",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled", "admin.config.oauth.oidc-enabled.description": "Si el inicio de sesión de OpenID Connect está habilitado",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "URI de descubrimiento de OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "URI de descubrimiento de la aplicación OAuth de OpenID Connect",
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim", "admin.config.oauth.oidc-sign-out": "Cerrar sesión de OpenID Connect",
"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-sign-out.description": "Si el botón \"Cerrar sesión\" cerrará la sesión del proveedor de OpenID Connect",
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token", "admin.config.oauth.oidc-scope": "Ámbito 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. " + "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-scope.description": "Ámbitos que se deberían solicitar al proveedor OpenID Connect.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access", "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-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-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": "ID de Cliente OpenID Connect",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app", "admin.config.oauth.oidc-client-id.description": "ID de cliente de la aplicación OAuth de OpenID Connect",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "Secreto de cliente de OpenID Connect",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app", "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.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Habilitar LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Usar autenticación LDAP para el inicio de sesión de usuarios",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "URL del servidor",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL del servidor LDAP",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "admin.config.ldap.bind-dn.description": "Usuario predeterminado utilizado para realizar la búsqueda de usuarios",
"admin.config.ldap.bind-password": "Bind password", "admin.config.ldap.bind-password": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "admin.config.ldap.bind-password.description": "Contraseña utilizada para realizar la búsqueda de usuarios",
"admin.config.ldap.search-base": "User base", "admin.config.ldap.search-base": "Base de usuarios",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "admin.config.ldap.search-base.description": "Ubicación base, donde se llevará a cabo la búsqueda de usuarios",
"admin.config.ldap.search-query": "User query", "admin.config.ldap.search-query": "Consulta de usuario",
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.", "admin.config.ldap.search-query.description": "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": "Admin group", "admin.config.ldap.admin-groups": "Grupo de administración",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "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.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
"404.description": "Oops esta página no existe.", "404.description": "Oops esta página no existe.",
"404.button.home": "Regrésame al inicio", "404.button.home": "Regrésame al inicio",
@@ -436,7 +491,7 @@ export default {
"error.msg.not_linked": "Esta cuenta {0} aún no ha sido vinculada a ninguna cuenta.", "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.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.user_not_allowed": "No tienes permitido iniciar sesion.",
"error.msg.cannot_get_user_info": "No se puede obtener la información de usuario de la cuenta {0}.", "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_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Generar", "common.button.generate": "Generar",
"common.button.done": "Listo", "common.button.done": "Listo",
"common.text.link": "Enlace", "common.text.link": "Enlace",
"common.text.navigate-to-link": "Ir al enlace", "common.text.navigate-to-link": "Visitar enlace",
"common.text.or": "o", "common.text.or": "o",
"common.text.redirecting": "Redirigiendo...",
"common.button.go-back": "Volver", "common.button.go-back": "Volver",
"common.button.go-home": "Página de inicio", "common.button.go-home": "Página de inicio",
"common.notify.copied": "Tu enlace se ha copiado al portapapeles", "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.success": "Éxito",
"common.error": "Error", "common.error": "Error",
"common.error.unknown": "Ocurrió un error desconocido", "common.error.unknown": "Ocurrió un error desconocido",
"common.error.invalid-email": "Correo electrónico no válido", "common.error.invalid-email": "Correo electrónico no válido",
"common.error.too-short": "Debe tener al menos {length} caracteres", "common.error.too-short": "Debe tener al menos {length} caracteres",
"common.error.too-long": "Debe tener como máximo {length} caracteres", "common.error.too-long": "Debe tener como máximo {length} caracteres",
"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.exact-length": "Debe tener exactamente {length} caracteres",
"common.error.invalid-number": "Debe ser un número", "common.error.invalid-number": "Debe ser un número",
"common.error.field-required": "Este campo es requerido" "common.error.field-required": "Este campo es requerido"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Pilvetä", "navbar.upload": "Pilvetä",
"navbar.signin": "Kirjaudu Sisään", "navbar.signin": "Kirjaudu Sisään",
"navbar.home": "Koti", "navbar.home": "Koti",
"navbar.signup": "Rekisteröidy", "navbar.signup": "Sign up",
"navbar.links.shares": "Minun jakaukset", "navbar.links.shares": "Minun jakaukset",
"navbar.links.reverse": "Takaperin jaetut", "navbar.links.reverse": "Takaperin jaetut",
"navbar.avatar.account": "Oma tIli", "navbar.avatar.account": "Oma tIli",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Itse-Isännöitty", "home.bullet.a.name": "Itse-Isännöitty",
"home.bullet.a.description": "Isännöi \"Pingvin Share\" omalla palvelimellasi.", "home.bullet.a.description": "Isännöi \"Pingvin Share\" omalla palvelimellasi.",
"home.bullet.b.name": "Yksityisyys", "home.bullet.b.name": "Yksityisyys",
"home.bullet.b.description": "Sinun tiedostosi ovat sinun ja niiden ei ikinä pidä päättyä kolmannen osapuolen käsiin.", "home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "Ei ärsyttävää tiedoston kokorajoitusta", "home.bullet.c.name": "Ei ärsyttävää tiedoston kokorajoitusta",
"home.bullet.c.description": "Lataa niin paljon isoja tiedostoja kuin tykkäät. Vain kovalevysi on rajana.", "home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Aloita", "home.button.start": "Aloita",
"home.button.source": "Lähdekoodi", "home.button.source": "Lähdekoodi",
// END / // END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Unohditko salasanan?", "resetPassword.title": "Unohditko salasanan?",
"resetPassword.description": "Kirjoita sähköpostiosoitteesi palauttaaksesi salasanasi.", "resetPassword.description": "Kirjoita sähköpostiosoitteesi palauttaaksesi salasanasi.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.", "resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "Takaisin kirjautumiseen", "resetPassword.button.back": "Takaisin kirjautumiseen",
"resetPassword.text.resetPassword": "Nollaa salasana", "resetPassword.text.resetPassword": "Nollaa salasana",
"resetPassword.text.enterNewPassword": "Anna uusi salasana", "resetPassword.text.enterNewPassword": "Anna uusi salasana",
"resetPassword.input.password": "Uusi salasana", "resetPassword.input.password": "Uusi salasana",
"resetPassword.notify.passwordReset": "Salasanan nollaus onnistui.", "resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account // /account
"account.title": "Oma tIli", "account.title": "Oma tIli",
"account.card.info.title": "Tilin tiedot", "account.card.info.title": "Tilin tiedot",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Salasana", "account.card.password.title": "Salasana",
"account.card.password.old": "Vanha salasana", "account.card.password.old": "Vanha salasana",
"account.card.password.new": "Uusi salasana", "account.card.password.new": "Uusi salasana",
"account.card.password.noPasswordSet": "You don't have a password set. If you want to sign in with email and password you need to set a 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": "Salasana vaihdettu", "account.notify.password.success": "Salasana vaihdettu",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Social login",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Unlink",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Unlinked",
"account.modal.unlink.title": "Unlink account", "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 username and password.", "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.notify.oauth.unlinked.success": "Unlinked successfully",
"account.card.security.title": "Turvallisuus", "account.card.security.title": "Turvallisuus",
"account.card.security.totp.enable.description": "Anna nykyinen salasanasi aloittaaksesi TOTP käytön", "account.card.security.totp.enable.description": "Anna nykyinen salasanasi aloittaaksesi TOTP käytön",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Nimi", "account.shares.table.name": "Nimi",
"account.shares.table.description": "Kuvaus", "account.shares.table.description": "Kuvaus",
"account.shares.table.visitors": "Vierailijat", "account.shares.table.visitors": "Vierailijat",
"account.shares.table.expiresAt": "Vanhenee", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Luotu", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Koko", "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-informations": "Jaetun tiedot",
"account.shares.modal.share-link": "Jaa linkki", "account.shares.modal.share-link": "Jaa linkki",
"account.shares.modal.delete.title": "Poista jaettu {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Haluatko todella poistaa tämän jaetun tiedoston/ot?", "account.shares.modal.delete.description": "Haluatko todella poistaa tämän jaetun tiedoston/ot?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Vuosi", "account.reverseShares.modal.expiration.year-singular": "Vuosi",
"account.reverseShares.modal.expiration.year-plural": "Vuotta", "account.reverseShares.modal.expiration.year-plural": "Vuotta",
"account.reverseShares.modal.max-size.label": "Suurin tiedostonkoko", "account.reverseShares.modal.max-size.label": "Suurin tiedostonkoko",
"account.reverseShares.modal.send-email": "Lähetä sähköposti-ilmoitus", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "Lähetä sähköpostiilmoitus kun jako on luotu tällä käänteisellä jakolinkillä.", "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": "Simple mode",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.", "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": "Public access",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "Käyttökertoja enintään", "account.reverseShares.modal.max-use.label": "Käyttökertoja enintään",
"account.reverseShares.modal.max-use.description": "Enimmäismäärä kertoja, joilla tämä URL-osoite voidaan käyttää joita luomiseen.", "account.reverseShares.modal.max-use.description": "Enimmäismäärä kertoja, joilla tämä URL-osoite voidaan käyttää joita luomiseen.",
"account.reverseShare.never-expires": "Tämä käänteinen jako ei koskaan vanhene.", "account.reverseShare.never-expires": "Tämä käänteinen jako ei koskaan vanhene.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Käyttäjätunnus", "admin.users.table.username": "Käyttäjätunnus",
"admin.users.table.email": "Sähköposti", "admin.users.table.email": "Sähköposti",
"admin.users.table.admin": "Ylläpitäjä", "admin.users.table.admin": "Ylläpitäjä",
"admin.users.edit.update.title": "Päivitä käyttäjä {username}", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Ylläpitäjän oikeudet", "admin.users.edit.update.admin-privileges": "Ylläpitäjän oikeudet",
"admin.users.edit.update.change-password.title": "Vaihda salasana", "admin.users.edit.update.change-password.title": "Vaihda salasana",
"admin.users.edit.update.change-password.field": "Uusi salasana", "admin.users.edit.update.change-password.field": "Uusi salasana",
"admin.users.edit.update.change-password.button": "Tallenna uusi salasana", "admin.users.edit.update.change-password.button": "Tallenna uusi salasana",
"admin.users.edit.update.notify.password.success": "Salasana vaihdettu", "admin.users.edit.update.notify.password.success": "Salasana vaihdettu",
"admin.users.edit.delete.title": "Poista käyttäjä {username}", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Haluatko varmasti poistaa tämän käyttäjän ja kaikki hänen jaot?", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Luo käyttäjä", "admin.users.modal.create.title": "Luo käyttäjä",
"admin.users.modal.create.username": "Käyttäjätunnus", "admin.users.modal.create.username": "Käyttäjätunnus",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator", "admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Visitors", "admin.shares.table.visitors": "Visitors",
"admin.shares.table.expires": "Expires At", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share {id}", "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": "Do you really want to delete this share?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Pilvetä", "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.generic-error": "Kohdattiin odottamaton virhe jaon luomisessa.",
"upload.notify.count-failed": "{count} tiedostoa ei voitu ladata. Yritetään uudelleen.", "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 // Dropzone.tsx
"upload.dropzone.title": "Pilvetä tiedostoja", "upload.dropzone.title": "Pilvetä tiedostoja",
"upload.dropzone.description": "Vedä ja pudota tiedostot tähän aloittaaksesi jakamisen. Voimme hyväksyä vain tiedostot, jotka ovat yhteensä alle {maxSize}.", "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": "Tiedostojen enimmäiskoko ylittää {maxSize} -arvon enimmäismäärän.", "upload.dropzone.notify.file-too-big": "Tiedostojen enimmäiskoko ylittää {maxSize} -arvon enimmäismäärän.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Nimi", "upload.filelist.name": "Nimi",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Et ole kirjautunut sisään", "upload.modal.not-signed-in": "Et ole kirjautunut sisään",
"upload.modal.not-signed-in-description": "Et voi poistaa jakoasi manuaalisesti ja tarkastella kävijöiden määrää.", "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": "ei koskaan",
"upload.modal.expires.never-long": "Ei vanhene koskaan", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Expiration exceeds maximum expiration date of {max}.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Linkki", "upload.modal.link.label": "Linkki",
"upload.modal.expires.label": "Vanhentuminen", "upload.modal.expires.label": "Vanhentuminen",
"upload.modal.expires.minute-singular": "Minuutti", "upload.modal.expires.minute-singular": "Minuutti",
@@ -272,16 +278,16 @@ export default {
"share.error.access-denied.title": "Private share", "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.description": "The current account does not have permission to access this share",
"share.modal.password.title": "Salasana vaaditaan", "share.modal.password.title": "Salasana vaaditaan",
"share.modal.password.description": "Päästäksesi käsiksi tähän jakoon anna jaon salasana.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Salasana", "share.modal.password": "Salasana",
"share.modal.error.invalid-password": "Virheellinen salasana", "share.modal.error.invalid-password": "Virheellinen salasana",
"share.button.download-all": "Lataa kaikki", "share.button.download-all": "Lataa kaikki",
"share.notify.download-all-preparing": "Jako on valmistumassa. Yritä uudelleen muutaman minuutin kuluttua.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "Tiedoston linkki", "share.modal.file-link": "Tiedoston linkki",
"share.table.name": "Nimi", "share.table.name": "Nimi",
"share.table.size": "Koko", "share.table.size": "Koko",
"share.modal.file-preview.error.not-supported.title": "Esikatselua ei tuettu", "share.modal.file-preview.error.not-supported.title": "Esikatselua ei tuettu",
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Edit {shareId}", "share.edit.title": "Edit {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "An error occurred while finishing your share.", "share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully", "share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Asetukset", "admin.config.title": "Asetukset",
"admin.config.category.general": "Yleiset", "admin.config.category.general": "Yleiset",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "Sovelluksen nimi", "admin.config.general.app-name.description": "Sovelluksen nimi",
"admin.config.general.app-url": "Sovelluksen URL", "admin.config.general.app-url": "Sovelluksen URL",
"admin.config.general.app-url.description": "Millä URL-osoitteella Pingvin Share on saatavilla", "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": "Näytä kotisivu",
"admin.config.general.show-home-page.description": "Näytetäänkö kotisivu vai ei", "admin.config.general.show-home-page.description": "Näytetäänkö kotisivu vai ei",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
@@ -307,46 +321,48 @@ export default {
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Muuta logoa lataamalla uusi kuva. Kuvan on oltava PNG ja sen on oltava formaatti 1:1.", "admin.config.general.logo.description": "Muuta logoa lataamalla uusi kuva. Kuvan on oltava PNG ja sen on oltava formaatti 1:1.",
"admin.config.general.logo.placeholder": "Valitse kuva", "admin.config.general.logo.placeholder": "Valitse kuva",
"admin.config.email.enable-share-email-recipients": "Salli sähköpostin vastaanottajien jakaminen", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Salli sähköpostien jakaminen vastaanottajille. Ota tämä käyttöön vain, jos olet ottanut SMTP:n käyttöön.", "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": "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-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": "Sähköpostijaon viesti",
"admin.config.email.share-recipients-message.description": "Viesti joka lähetetään jaon vastaanottajille. Saatavilla olevat muuttujat:\n {creator} - Jaon luojan käyttäjänimi\n {shareUrl} - Jaon URL\n {desc} - Jaon kuvaus\n {expires} - Jaon päättymispäivä\n Muuttujat korvataan todellisella arvolla.", "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": "Käänteisen jaon aihe",
"admin.config.email.reverse-share-subject.description": "Aihe sähköpostin joka lähetetään kun joku loi jaon käänteisen jakolinkin kanssa.", "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", "admin.config.email.reverse-share-message": "Käänteisen jakoviestin viesti",
"admin.config.email.reverse-share-message.description": "Viesti joka lähetetään kun joku loi jaon käänteisen jakolinkin kanssa. {shareUrl} korvataan luojan nimellä ja jaon URL:lla.", "admin.config.email.reverse-share-message.description": "Viesti joka lähetetään kun joku loi jaon käänteisen jakolinkin kanssa. {shareUrl} korvataan luojan nimellä ja jaon URL:lla.",
"admin.config.email.reset-password-subject": "Nollaa salasanan aihe", "admin.config.email.reset-password-subject": "Nollaa salasanan aihe",
"admin.config.email.reset-password-subject.description": "Sähköpostin aihe, joka lähetetään kun käyttäjä pyytää salasanan palauttamista.", "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": "Nollaa salasanan viesti", "admin.config.email.reset-password-message": "Nollaa salasanan viesti",
"admin.config.email.reset-password-message.description": "Viesti joka lähetetään kun käyttäjä pyytää salasanan nollausta. {url} korvataan nollaussalasanan URL-osoitteella.", "admin.config.email.reset-password-message.description": "Viesti joka lähetetään kun käyttäjä pyytää salasanan nollausta. {url} korvataan nollaussalasanan URL-osoitteella.",
"admin.config.email.invite-subject": "Kutsun aihe", "admin.config.email.invite-subject": "Kutsun aihe",
"admin.config.email.invite-subject.description": "Sähköpostin aihe, mikä lähetetään kun ylläpitäjä kutsuu käyttäjää.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Kutsun viesti", "admin.config.email.invite-message": "Kutsun viesti",
"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 password of the user.", "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": "Salli rekisteröinti", "admin.config.share.allow-registration": "Salli rekisteröinti",
"admin.config.share.allow-registration.description": "Onko rekisteröinti sallittu", "admin.config.share.allow-registration.description": "Onko rekisteröinti sallittu",
"admin.config.share.allow-unauthenticated-shares": "Salli anonyymit jaot", "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.allow-unauthenticated-shares.description": "Voiko tunnistamattomat käyttäjät luoda jakoja",
"admin.config.share.max-expiration": "Max expiration", "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": "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": "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.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": "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 speed up uploads for stable connections.", "admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "Käytössä", "admin.config.smtp.enabled": "Enable",
"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.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": "Isäntä",
"admin.config.smtp.host.description": "SMTP palvelimen isäntä", "admin.config.smtp.host.description": "SMTP palvelimen isäntä",
"admin.config.smtp.port": "Portti", "admin.config.smtp.port": "Portti",
"admin.config.smtp.port.description": "SMTP palvelimen portti", "admin.config.smtp.port.description": "SMTP palvelimen portti",
"admin.config.smtp.email": "Sähköposti", "admin.config.smtp.email": "Sähköposti",
"admin.config.smtp.email.description": "Sähköpostiosoite, josta sähköpostit on lähetetty", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Käyttäjätunnus", "admin.config.smtp.username": "Käyttäjätunnus",
"admin.config.smtp.username.description": "SMTP palvelimen käyttäjänimi", "admin.config.smtp.username.description": "SMTP palvelimen käyttäjänimi",
"admin.config.smtp.password": "Salasana", "admin.config.smtp.password": "Salasana",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "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": "Discord",
"admin.config.oauth.discord-enabled.description": "Whether Discord login is enabled", "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": "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-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": "Discord Client ID",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled", "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": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app", "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": "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-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": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app", "admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "Hups tätä sivua ei ole olemassa.", "404.description": "Hups tätä sivua ei ole olemassa.",
"404.button.home": "Tuo minut takaisin kotiin", "404.button.home": "Tuo minut takaisin kotiin",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "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.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.already_linked": "This {0} account is already linked to another account.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "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.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.user_not_allowed": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Luo", "common.button.generate": "Luo",
"common.button.done": "Valmis", "common.button.done": "Valmis",
"common.text.link": "Linkki", "common.text.link": "Linkki",
"common.text.navigate-to-link": "Go to the link", "common.text.navigate-to-link": "Visit link",
"common.text.or": "tai", "common.text.or": "tai",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Takaisin", "common.button.go-back": "Takaisin",
"common.button.go-home": "Go home", "common.button.go-home": "Go home",
"common.notify.copied": "Linkki kopioitiin leikepöydälle", "common.notify.copied": "Linkki kopioitiin leikepöydälle",
"common.notify.copied-link": "Linkki kopioitiin leikepöydälle",
"common.success": "Suoritettu", "common.success": "Suoritettu",
"common.error": "Virhe", "common.error": "Virhe",
"common.error.unknown": "Tapahtui tuntematon virhe", "common.error.unknown": "Tapahtui tuntematon virhe",
"common.error.invalid-email": "Virheellinen sähköpostiosoite", "common.error.invalid-email": "Virheellinen sähköpostiosoite",
"common.error.too-short": "Täytyy olla vähintään {length} merkkiä", "common.error.too-short": "Täytyy olla vähintään {length} merkkiä",
"common.error.too-long": "Täytyy olla enintään {length} merkkiä", "common.error.too-long": "Täytyy olla enintään {length} merkkiä",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "On oltava tarkasti {length} merkkiä pitkä", "common.error.exact-length": "On oltava tarkasti {length} merkkiä pitkä",
"common.error.invalid-number": "Pitää olla luku", "common.error.invalid-number": "Pitää olla luku",
"common.error.field-required": "Tämä kenttä on pakollinen" "common.error.field-required": "Tämä kenttä on pakollinen"

View File

@@ -11,23 +11,23 @@ export default {
"navbar.avatar.signout": "Se déconnecter", "navbar.avatar.signout": "Se déconnecter",
// END navbar // END navbar
// / // /
"home.title": "Une plateforme de partage de fichier <h>auto-hébergée</h>.", "home.title": "Une plateforme de partage de fichiers <h>autohébergée</h>.",
"home.description": "Voulez-vous vraiment remettre vos fichiers personnels dans les mains de tiers comme WeTransfer ?", "home.description": "Voulez-vous vraiment remettre vos fichiers personnels dans les mains de tiers comme WeTransfer ?",
"home.bullet.a.name": "Auto-hébergé", "home.bullet.a.name": "Auto-hébergé",
"home.bullet.a.description": "Hébergez Pingvin Share sur votre propre machine.", "home.bullet.a.description": "Hébergez Pingvin Share sur votre propre machine.",
"home.bullet.b.name": "Confidentialité", "home.bullet.b.name": "Confidentialité",
"home.bullet.b.description": "Vos fichiers sont vos fichiers et ne devraient jamais être mis entre les mains de tiers.", "home.bullet.b.description": "Vos fichiers sont les vôtres et ne seront jamais consultés par des tiers.",
"home.bullet.c.name": "Aucune rébarbative limite de taille", "home.bullet.c.name": "Aucune rébarbative limite de taille",
"home.bullet.c.description": "Téléchargez des fichiers aussi volumineux que vous le souhaitez. Seul votre disque dur est la limite.", "home.bullet.c.description": "Téléchargez des fichiers aussi volumineux que vous le souhaitez. Votre disque dur est votre limite.",
"home.button.start": "Commencer", "home.button.start": "Commencer",
"home.button.source": "Code source", "home.button.source": "Code source",
// END / // END /
// /auth/signin // /auth/signin
"signin.title": "Content de vous revoir", "signin.title": "Content de vous revoir",
"signin.description": "Pas encore de compte ?", "signin.description": "Vous n'avez pas encore de compte ?",
"signin.button.signup": "Sinscrire", "signin.button.signup": "Sinscrire",
"signin.input.email-or-username": "Courriel ou surnom", "signin.input.email-or-username": "Courriel ou nom d'utilisateur",
"signin.input.email-or-username.placeholder": "Votre courriel ou surnom", "signin.input.email-or-username.placeholder": "Votre courriel ou nom d'utilisateur",
"signin.input.password": "Mot de passe", "signin.input.password": "Mot de passe",
"signin.input.password.placeholder": "Votre mot de passe", "signin.input.password.placeholder": "Votre mot de passe",
"signin.button.submit": "Se connecter", "signin.button.submit": "Se connecter",
@@ -45,8 +45,8 @@ export default {
"signup.title": "Créer un compte", "signup.title": "Créer un compte",
"signup.description": "Vous avez déjà un compte ?", "signup.description": "Vous avez déjà un compte ?",
"signup.button.signin": "Se connecter", "signup.button.signin": "Se connecter",
"signup.input.username": "Surnom", "signup.input.username": "Nom d'utilisateur",
"signup.input.username.placeholder": "Votre surnom", "signup.input.username.placeholder": "Votre nom d'utilisateur",
"signup.input.email": "Adresse email", "signup.input.email": "Adresse email",
"signup.input.email.placeholder": "Votre courriel", "signup.input.email.placeholder": "Votre courriel",
"signup.button.submit": "Commençons", "signup.button.submit": "Commençons",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Mot de passe oublié ?", "resetPassword.title": "Mot de passe oublié ?",
"resetPassword.description": "Saisissez votre courriel pour réinitialiser votre mot de passe.", "resetPassword.description": "Saisissez votre courriel pour réinitialiser votre mot de passe.",
"resetPassword.notify.success": "Un message avec un lien pour réinitialiser votre mot de passe a été envoyé si le courriel existe.", "resetPassword.notify.success": "Un message avec un lien pour réinitialiser votre mot de passe a été envoyé si le courriel fourni existe.",
"resetPassword.button.back": "Retour à la page de connexion", "resetPassword.button.back": "Retour à la page de connexion",
"resetPassword.text.resetPassword": "Réinitialiser le mot de passe", "resetPassword.text.resetPassword": "Réinitialiser le mot de passe",
"resetPassword.text.enterNewPassword": "Saisissez votre nouveau mot de passe", "resetPassword.text.enterNewPassword": "Saisissez votre nouveau mot de passe",
"resetPassword.input.password": "Nouveau mot de passe", "resetPassword.input.password": "Nouveau mot de passe",
"resetPassword.notify.passwordReset": "Votre mot de passe a bien été réinitialisé.", "resetPassword.notify.passwordReset": "Votre mot de passe a été réinitialisé avec succès.",
// /account // /account
"account.title": "Mon compte", "account.title": "Mon compte",
"account.card.info.title": "Détails du compte", "account.card.info.title": "Détails du compte",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Mot de passe", "account.card.password.title": "Mot de passe",
"account.card.password.old": "Ancien mot de passe", "account.card.password.old": "Ancien mot de passe",
"account.card.password.new": "Nouveau mot de passe", "account.card.password.new": "Nouveau mot de passe",
"account.card.password.noPasswordSet": "Vous navez pas de mot de passe défini. Si vous voulez vous connecter avec un e-mail et un mot de passe, vous devez définir un mot de passe.", "account.card.password.noPasswordSet": "Vous navez pas de mot de passe défini. Si vous voulez vous connecter avec un courriel et un mot de passe, vous devez définir un mot de passe.",
"account.notify.password.success": "Le mot de passe a été modifié avec succès", "account.notify.password.success": "Le mot de passe a été modifié avec succès",
"account.card.oauth.title": "Identifiant social", "account.card.oauth.title": "Identifiant social",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,20 +85,20 @@ export default {
"account.card.oauth.unlink": "Dissocier", "account.card.oauth.unlink": "Dissocier",
"account.card.oauth.unlinked": "Dissocié", "account.card.oauth.unlinked": "Dissocié",
"account.modal.unlink.title": "Dissocier le compte", "account.modal.unlink.title": "Dissocier le compte",
"account.modal.unlink.description": "Dissocier vos comptes de réseaux sociaux peut vous faire perdre votre compte si jamais vous ne vous souvenez pas de votre nom dutilisateur et de votre mot de passe.", "account.modal.unlink.description": "Délier vos réseaux sociaux peut vous faire perdre votre compte si vous ne vous souvenez pas de vos identifiants de connexion",
"account.notify.oauth.unlinked.success": "Dissocié avec succès", "account.notify.oauth.unlinked.success": "Dissocié avec succès",
"account.card.security.title": "Sécurité", "account.card.security.title": "Sécurité",
"account.card.security.totp.enable.description": "Entrez votre mot de passe actuel pour activer TOTP", "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.disable.description": "Entrez votre mot de passe actuel pour désactiver TOTP",
"account.card.security.totp.button.start": "Démarrer", "account.card.security.totp.button.start": "Démarrer",
"account.modal.totp.title": "Activer TOTP", "account.modal.totp.title": "Activer la double authentification",
"account.modal.totp.step1": "Étape 1 : Ajouter votre authentificateur", "account.modal.totp.step1": "Étape 1 : Ajouter votre authentification",
"account.modal.totp.step2": "Étape 2 : Valider votre code", "account.modal.totp.step2": "Étape 2 : Valider votre code",
"account.modal.totp.enterManually": "Saisir manuellement", "account.modal.totp.enterManually": "Saisir manuellement",
"account.modal.totp.code": "Code", "account.modal.totp.code": "Code",
"common.button.clickToCopy": "Cliquez pour copier", "common.button.clickToCopy": "Cliquez pour copier",
"account.modal.totp.verify": "Vérifier", "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.notify.totp.enable": "TOTP activé avec succès",
"account.card.language.title": "Langue", "account.card.language.title": "Langue",
"account.card.language.description": "Le projet est traduit par la communauté. Certaines traductions peuvent être incomplètes.", "account.card.language.description": "Le projet est traduit par la communauté. Certaines traductions peuvent être incomplètes.",
@@ -124,9 +124,12 @@ export default {
"account.shares.table.expiresAt": "Expire le", "account.shares.table.expiresAt": "Expire le",
"account.shares.table.createdAt": "Créé le", "account.shares.table.createdAt": "Créé le",
"account.shares.table.size": "Taille", "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-informations": "Détails du partage",
"account.shares.modal.share-link": "Lien de partage", "account.shares.modal.share-link": "Lien de partage",
"account.shares.modal.delete.title": "Supprimer le partage {share}", "account.shares.modal.delete.title": "Supprimer le partage : {share}",
"account.shares.modal.delete.description": "Voulez-vous vraiment supprimer ce partage ?", "account.shares.modal.delete.description": "Voulez-vous vraiment supprimer ce partage ?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,13 +153,13 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "An", "account.reverseShares.modal.expiration.year-singular": "An",
"account.reverseShares.modal.expiration.year-plural": "Ans", "account.reverseShares.modal.expiration.year-plural": "Ans",
"account.reverseShares.modal.max-size.label": "Taille maximale du partage", "account.reverseShares.modal.max-size.label": "Taille maximale du partage",
"account.reverseShares.modal.send-email": "Envoyer un courriel de notification", "account.reverseShares.modal.send-email": "Envoyer des notifications par courriel",
"account.reverseShares.modal.send-email.description": "Envoyer une notification par courriel lorsqu'un partage est créé depuis ce 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": "Mode simple",
"account.reverseShares.modal.simplified.description": "Simplifiez la tâche de la personne qui télécharge le fichier pour le partager avec vous. Ils ne pourront personnaliser que le nom et la description du partage.", "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", "account.reverseShares.modal.public-access": "Accès public",
"account.reverseShares.modal.public-access.description": "Rendre les partages créés avec ce partage inversé public. Si désactivé, seul vous et le créateur du partage pouvez le voir.", "account.reverseShares.modal.public-access.description": "Rendre les partages créés avec ce partage inversé public. Si désactivé, seul vous et le créateur du partage pourrez le voir.",
"account.reverseShares.modal.max-use.label": "Nombre d'utilisation max", "account.reverseShares.modal.max-use.label": "Nombre d'utilisations max",
"account.reverseShares.modal.max-use.description": "Le nombre maximal de fois que cette URL peut être utilisée pour créer un partage.", "account.reverseShares.modal.max-use.description": "Le nombre maximal de fois que cette URL peut être utilisée pour créer un partage.",
"account.reverseShare.never-expires": "Ce partage inversé n'expirera jamais.", "account.reverseShare.never-expires": "Ce partage inversé n'expirera jamais.",
"account.reverseShare.expires-on": "Ce partage inversé expirera le {expiration}.", "account.reverseShare.expires-on": "Ce partage inversé expirera le {expiration}.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Surnom", "admin.users.table.username": "Surnom",
"admin.users.table.email": "Courriel", "admin.users.table.email": "Courriel",
"admin.users.table.admin": "Admin", "admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Modifier l'utilisateur {username}", "admin.users.edit.update.title": "Modifier l'utilisateur : {username}",
"admin.users.edit.update.admin-privileges": "Privilèges dadmin", "admin.users.edit.update.admin-privileges": "Privilèges dadmin",
"admin.users.edit.update.change-password.title": "Changer le mot de passe", "admin.users.edit.update.change-password.title": "Changer le mot de passe",
"admin.users.edit.update.change-password.field": "Nouveau mot de passe", "admin.users.edit.update.change-password.field": "Nouveau mot de passe",
"admin.users.edit.update.change-password.button": "Enregistrer le nouveau mot de passe", "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.update.notify.password.success": "Le mot de passe a été modifié",
"admin.users.edit.delete.title": "Supprimer l'utilisateur {username}", "admin.users.edit.delete.title": "Supprimer l'utilisateur : {username} ?",
"admin.users.edit.delete.description": "Voulez-vous vraiment supprimer cet utilisateur et toutes ses partages ?", "admin.users.edit.delete.description": "Souhaitez-vous vraiment supprimer cet utilisateur et tous ses partages ?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Créer un utilisateur", "admin.users.modal.create.title": "Créer un utilisateur",
"admin.users.modal.create.username": "Surnom", "admin.users.modal.create.username": "Surnom",
@@ -207,16 +210,19 @@ export default {
"admin.shares.table.username": "Créateur", "admin.shares.table.username": "Créateur",
"admin.shares.table.visitors": "Visiteurs", "admin.shares.table.visitors": "Visiteurs",
"admin.shares.table.expires": "Expire le", "admin.shares.table.expires": "Expire le",
"admin.shares.edit.delete.title": "Supprimer le partage {id}", "admin.shares.edit.delete.title": "Supprimer le partage : {id}",
"admin.shares.edit.delete.description": "Voulez-vous vraiment supprimer ce partage ?", "admin.shares.edit.delete.description": "Voulez-vous vraiment supprimer ce partage ?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Envoyer", "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.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.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 // Dropzone.tsx
"upload.dropzone.title": "Téléverser des fichiers", "upload.dropzone.title": "Téléverser des fichiers",
"upload.dropzone.description": "Glissez-déposez des fichiers ici pour commencer votre partage. Ils ne peuvent avoir une taille supérieure à {maxSize} au total.", "upload.dropzone.description": "Glisser-déposer les fichiers ici pour commencer votre partage. Nous n'acceptons que les fichiers jusqu'à {maxSize} au total.",
"upload.dropzone.notify.file-too-big": "Vos fichiers dépassent la taille maximale de {maxSize}.", "upload.dropzone.notify.file-too-big": "Vos fichiers dépassent la taille maximale de {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Nom", "upload.filelist.name": "Nom",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Vous n'êtes pas connecté", "upload.modal.not-signed-in": "Vous n'êtes pas connecté",
"upload.modal.not-signed-in-description": "Vous ne pourrez pas supprimer votre partage manuellement et afficher le nombre de visiteurs.", "upload.modal.not-signed-in-description": "Vous ne pourrez pas supprimer votre partage manuellement et afficher le nombre de visiteurs.",
"upload.modal.expires.never": "jamais", "upload.modal.expires.never": "jamais",
"upload.modal.expires.never-long": "Nexpire jamais", "upload.modal.expires.never-long": "Partage permanent",
"upload.modal.expires.error.too-long": "Lexpiration dépasse la date d'expiration du {max}.", "upload.modal.expires.error.too-long": "La date d'expiration dépasse le maximum de {max}.",
"upload.modal.link.label": "Lien", "upload.modal.link.label": "Lien",
"upload.modal.expires.label": "Expiration", "upload.modal.expires.label": "Expiration",
"upload.modal.expires.minute-singular": "Minute", "upload.modal.expires.minute-singular": "Minute",
@@ -272,7 +278,7 @@ export default {
"share.error.access-denied.title": "Partage privé", "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.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.title": "Mot de passe requis",
"share.modal.password.description": "Pour accéder à ce partage, veuillez entrer le mot de passe du partage.", "share.modal.password.description": "Veuillez entrer le mot de passe d'accès à ce partage.",
"share.modal.password": "Mot de passe", "share.modal.password": "Mot de passe",
"share.modal.error.invalid-password": "Mot de passe incorrect", "share.modal.error.invalid-password": "Mot de passe incorrect",
"share.button.download-all": "Télécharger tout", "share.button.download-all": "Télécharger tout",
@@ -281,7 +287,7 @@ export default {
"share.table.name": "Nom", "share.table.name": "Nom",
"share.table.size": "Taille", "share.table.size": "Taille",
"share.modal.file-preview.error.not-supported.title": "Aperçu non supporté", "share.modal.file-preview.error.not-supported.title": "Aperçu non supporté",
"share.modal.file-preview.error.not-supported.description": "Un aperçu de ce type de fichier n'est pas pris en charge. Veuillez télécharger le fichier pour le visualiser.", "share.modal.file-preview.error.not-supported.description": "Les aperçus ne sont pas pris en charge pour ce type de fichiers. Veuillez télécharger le fichier pour le voir.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Modifier {shareId}", "share.edit.title": "Modifier {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Une erreur est survenue durant le traitement de votre partage.", "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", "share.edit.notify.save-success": "Partage mis à jour avec succès",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Mentions légales",
// END /imprint
// /privacy
"privacy.title": "Politique de confidentialité",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Paramètres", "admin.config.title": "Paramètres",
"admin.config.category.general": "Général", "admin.config.category.general": "Général",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "Le nom de lapplication", "admin.config.general.app-name.description": "Le nom de lapplication",
"admin.config.general.app-url": "URL de lappli", "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.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": "Afficher la page daccueil",
"admin.config.general.show-home-page.description": "Afficher ou non la page daccueil", "admin.config.general.show-home-page.description": "Afficher ou non la page daccueil",
"admin.config.general.session-duration": "Durée de la session", "admin.config.general.session-duration": "Durée de la session",
@@ -307,12 +321,12 @@ export default {
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Changez de logo en envoyant une nouvelle image. Limage doit être au format PNG et doit avoir un ratio 1:1.", "admin.config.general.logo.description": "Changez de logo en envoyant une nouvelle image. Limage doit être au format PNG et doit avoir un ratio 1:1.",
"admin.config.general.logo.placeholder": "Sélectionner une image", "admin.config.general.logo.placeholder": "Sélectionner une image",
"admin.config.email.enable-share-email-recipients": "Autoriser le partage par courriel", "admin.config.email.enable-share-email-recipients": "Activer le partage par courriel",
"admin.config.email.enable-share-email-recipients.description": "Permet d'envoyer le lien du partage par courriel. N'activez cette option que si vous avez activé SMTP.", "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": "Sujet dun partage",
"admin.config.email.share-recipients-subject.description": "Intitulé du courriel envoyé aux destinataires 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": "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\nLes 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": "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-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é", "admin.config.email.reverse-share-message": "Message dun partage inversé",
@@ -324,19 +338,21 @@ export default {
"admin.config.email.invite-subject": "Sujet dune invitation", "admin.config.email.invite-subject": "Sujet dune invitation",
"admin.config.email.invite-subject.description": "Intitulé du courriel envoyé lorsquun administrateur invite un utilisateur.", "admin.config.email.invite-subject.description": "Intitulé du courriel envoyé lorsquun administrateur invite un utilisateur.",
"admin.config.email.invite-message": "Message dune invitation", "admin.config.email.invite-message": "Message dune invitation",
"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 password of the user.", "admin.config.email.invite-message.description": "Message qui est envoyé lorsqu'un administrateur invite un utilisateur. {url} sera remplacé avec l'URL d'invitation, {email} avec le courriel et {password} avec le mot de passe de l'utilisateur.",
"admin.config.share.allow-registration": "Autoriser les inscriptions", "admin.config.share.allow-registration": "Autoriser les inscriptions",
"admin.config.share.allow-registration.description": "Permet aux visiteurs de créer un compte.", "admin.config.share.allow-registration.description": "Permet aux visiteurs de créer un compte",
"admin.config.share.allow-unauthenticated-shares": "Autoriser les partages anonymes", "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.allow-unauthenticated-shares.description": "Permet aux visiteurs de créer des partages",
"admin.config.share.max-expiration": "Échéance", "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": "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": "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.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": "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": "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.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", "admin.config.smtp.enabled": "Activer",
@@ -356,8 +372,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.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": "Autoriser linscription",
"admin.config.oauth.allow-registration.description": "Permettre aux utilisateurs de sinscrire via leur identifiant social", "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": "Ignorer double authentification TOTP",
"admin.config.oauth.ignore-totp.description": "Ignorer le TOTP lorsque lutilisateur utilise un identifiant social.", "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": "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.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", "admin.config.oauth.github-enabled": "GitHub",
@@ -381,7 +397,9 @@ export default {
"admin.config.oauth.microsoft-client-secret": "Secret du client Microsoft", "admin.config.oauth.microsoft-client-secret": "Secret du client Microsoft",
"admin.config.oauth.microsoft-client-secret.description": "Le secret du client de lapplication Microsoft OAuth", "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": "Discord",
"admin.config.oauth.discord-enabled.description": "Permettre la connexion via Discord.", "admin.config.oauth.discord-enabled.description": "Permettre la connexion via Discord",
"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": "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-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", "admin.config.oauth.discord-client-id": "ID du client Discord",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Permettre la connexion via OpenID", "admin.config.oauth.oidc-enabled.description": "Permettre la connexion via OpenID",
"admin.config.oauth.oidc-discovery-uri": "URI de découverte OpenID", "admin.config.oauth.oidc-discovery-uri": "URI de découverte OpenID",
"admin.config.oauth.oidc-discovery-uri.description": "LURI de découverte de la connexion à l'application OpenID OAuth", "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": "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-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", "admin.config.oauth.oidc-role-path": "Chemin vers les rôles dans le jeton OpenID Connect",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "Secret du client OpenID", "admin.config.oauth.oidc-client-secret": "Secret du client OpenID",
"admin.config.oauth.oidc-client-secret.description": "Le secret du client de lapplication OAuth OpenID Connect", "admin.config.oauth.oidc-client-secret.description": "Le secret du client de lapplication OAuth OpenID Connect",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Activer LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Utiliser l'authentification LDAP pour la connexion de l'utilisateur",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "URL du serveur",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL du serveur LDAP",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "DN de liaison",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "admin.config.ldap.bind-dn.description": "Utilisateur par défaut utilisé pour effectuer la recherche de l'utilisateur",
"admin.config.ldap.bind-password": "Bind password", "admin.config.ldap.bind-password": "Mot de passe de liaison",
"admin.config.ldap.bind-password.description": "Password for the user search user", "admin.config.ldap.bind-password.description": "Mot de passe utilisé pour effectuer la recherche de l'utilisateur",
"admin.config.ldap.search-base": "User base", "admin.config.ldap.search-base": "Base d'utilisateurs",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "admin.config.ldap.search-base.description": "Emplacement de base, où la recherche de l'utilisateur sera effectuée",
"admin.config.ldap.search-query": "User query", "admin.config.ldap.search-query": "Requête utilisateur",
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.", "admin.config.ldap.search-query.description": "La requête utilisateur sera utilisée pour rechercher dans la base d'utilisateurs de l'utilisateur LDAP. %username% peut être utilisé comme espace réservé pour les entrées données par l'utilisateur.",
"admin.config.ldap.admin-groups": "Admin group", "admin.config.ldap.admin-groups": "Groupe administrateur",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Un groupe est nécessaire pour un accès administratif.",
"admin.config.ldap.field-name-member-of": "Nom de l'attribut des groupes d'utilisateurs",
"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.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
"404.description": "Désolé, mais cette page nexiste pas.", "404.description": "Désolé, mais cette page nexiste pas.",
"404.button.home": "Retour à laccueil", "404.button.home": "Retour à laccueil",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Générer", "common.button.generate": "Générer",
"common.button.done": "Terminer", "common.button.done": "Terminer",
"common.text.link": "Lien", "common.text.link": "Lien",
"common.text.navigate-to-link": "Accéder au lien", "common.text.navigate-to-link": "Visiter le lien",
"common.text.or": "ou", "common.text.or": "ou",
"common.text.redirecting": "Redirection...",
"common.button.go-back": "Précédent", "common.button.go-back": "Précédent",
"common.button.go-home": "Accueil", "common.button.go-home": "Accueil",
"common.notify.copied": "Votre lien a été copié dans le presse-papiers", "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.success": "Opération réussie",
"common.error": "Erreur", "common.error": "Erreur",
"common.error.unknown": "Une erreur inconnue est survenue", "common.error.unknown": "Une erreur inconnue est survenue",
"common.error.invalid-email": "Adresse courriel invalide", "common.error.invalid-email": "Adresse courriel invalide",
"common.error.too-short": "Doit comporter au moins {length} caractères", "common.error.too-short": "Doit comporter au moins {length} caractères",
"common.error.too-long": "Doit comporter au plus {length} caractères", "common.error.too-long": "Doit comporter au plus {length} caractères",
"common.error.number-too-small": "Doit être au moins {min}",
"common.error.number-too-large": "Doit être au plus {max}",
"common.error.exact-length": "Doit comporter exactement {length} caractères", "common.error.exact-length": "Doit comporter exactement {length} caractères",
"common.error.invalid-number": "Doit être un nombre", "common.error.invalid-number": "Doit être un nombre",
"common.error.field-required": "Ce champ est obligatoire" "common.error.field-required": "Ce champ est obligatoire"

View File

@@ -0,0 +1,530 @@
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": "Password protected",
"account.shares.table.visitor-count": "{count} of {max}",
"account.shares.table.expiry-never": "Never",
"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.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": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config
"admin.config.title": "Konfiguracija",
"admin.config.category.general": "Opće",
"admin.config.category.share": "Dijeljenje",
"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": "Vrijeme u satima nakon kojeg se korisnik mora ponovno prijaviti (zadano: 3 mjeseca).",
"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.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 adresa s koje se poruke šalju",
"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": "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.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.upload": "Feltöltés",
"navbar.signin": "Bejelentkezés", "navbar.signin": "Bejelentkezés",
"navbar.home": "Home", "navbar.home": "Home",
"navbar.signup": "Feliratkozás", "navbar.signup": "Regisztráció",
"navbar.links.shares": "Megosztásaim", "navbar.links.shares": "Megosztásaim",
"navbar.links.reverse": "Fordított megosztások", "navbar.links.reverse": "Fordított megosztások",
"navbar.avatar.account": "Fiókom", "navbar.avatar.account": "Fiókom",
@@ -16,7 +16,7 @@ export default {
"home.bullet.a.name": "Saját üzemeltetés", "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.a.description": "A Pingvin Share megosztót saját gépéről futtathatja.",
"home.bullet.b.name": "Adatvédelem", "home.bullet.b.name": "Adatvédelem",
"home.bullet.b.description": "A saját fájlok személyesek és semmi keresnivalójuk harmadik feleknél.", "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.name": "Nincs bosszantó fájl méretkorlát",
"home.bullet.c.description": "Akkora fájlokat oszt meg, amekkorákat csak akar. Határt csak a lemezterület szab.", "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.start": "Nosza, kezdjük",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Elfelejtette jelszavát?", "resetPassword.title": "Elfelejtette jelszavát?",
"resetPassword.description": "Adja meg emailcímét a jelszó alaphelyzetbe állításához.", "resetPassword.description": "Adja meg emailcímét a jelszó alaphelyzetbe állításához.",
"resetPassword.notify.success": "A jelszó visszaállítására szolgáló linket tartalmazó üzenetet küldtünk, ha az e-mail létezik.", "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.button.back": "Vissza a bejelentkezési oldalra",
"resetPassword.text.resetPassword": "Jelszó alaphelyzetbe állítása", "resetPassword.text.resetPassword": "Jelszó alaphelyzetbe állítása",
"resetPassword.text.enterNewPassword": "Adja meg új jelszavát", "resetPassword.text.enterNewPassword": "Adja meg új jelszavát",
"resetPassword.input.password": "Új jelszó", "resetPassword.input.password": "Új jelszó",
"resetPassword.notify.passwordReset": "Sikeresen megadta az új jelszót.", "resetPassword.notify.passwordReset": "A jelszavát sikeresen helyreállította.",
// /account // /account
"account.title": "Fiókom", "account.title": "Fiókom",
"account.card.info.title": "Fiókinformáció", "account.card.info.title": "Fiókinformáció",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Leválasztás", "account.card.oauth.unlink": "Leválasztás",
"account.card.oauth.unlinked": "Leválasztva", "account.card.oauth.unlinked": "Leválasztva",
"account.modal.unlink.title": "Fiók leválasztása", "account.modal.unlink.title": "Fiók leválasztása",
"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.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.notify.oauth.unlinked.success": "Leválasztás sikeres",
"account.card.security.title": "Biztonság", "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", "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.name": "Megnevezés",
"account.shares.table.description": "Leírás", "account.shares.table.description": "Leírás",
"account.shares.table.visitors": "Látogatók", "account.shares.table.visitors": "Látogatók",
"account.shares.table.expiresAt": "Lejárat", "account.shares.table.expiresAt": "Lejár",
"account.shares.table.createdAt": "Létrehozás időpontja", "account.shares.table.createdAt": "Létrehozva",
"account.shares.table.size": "Méret", "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-informations": "Megosztás adatai",
"account.shares.modal.share-link": "Hivatkozás", "account.shares.modal.share-link": "Hivatkozás",
"account.shares.modal.delete.title": "Törlés: {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?", "account.shares.modal.delete.description": "Biztos abban, hogy törölni kívánja ezt a megosztást?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,8 +153,8 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "év", "account.reverseShares.modal.expiration.year-singular": "év",
"account.reverseShares.modal.expiration.year-plural": "év", "account.reverseShares.modal.expiration.year-plural": "év",
"account.reverseShares.modal.max-size.label": "Megosztás megengedett max mérete", "account.reverseShares.modal.max-size.label": "Megosztás megengedett max mérete",
"account.reverseShares.modal.send-email": "Email értesítés küldése", "account.reverseShares.modal.send-email": "E-mail értesítések",
"account.reverseShares.modal.send-email.description": "Email értesítés arról, amikor a fordított megosztási hivatkozást használva megosztást hoznak létre.", "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": "Egyszerű mód",
"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.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": "Nyilvános megosztás",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Felhasználónév", "admin.users.table.username": "Felhasználónév",
"admin.users.table.email": "Email", "admin.users.table.email": "Email",
"admin.users.table.admin": "Admin ügyek", "admin.users.table.admin": "Admin ügyek",
"admin.users.edit.update.title": "{username} felhasználó frissítése", "admin.users.edit.update.title": "{username} felhasználó szerkesztése",
"admin.users.edit.update.admin-privileges": "Adminisztrátori jogosultságok", "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.title": "Jelszó módosítása",
"admin.users.edit.update.change-password.field": "Új jelszó", "admin.users.edit.update.change-password.field": "Új jelszó",
"admin.users.edit.update.change-password.button": "Új jelszó mentése", "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.update.notify.password.success": "A jelszó sikeresen frissítésre került",
"admin.users.edit.delete.title": "{username} felhasználó törlése", "admin.users.edit.delete.title": "{username} felhasználó törlése ?",
"admin.users.edit.delete.description": "Valóban törölni kívánja ezt a felhasználót és vele az ő minden egyes megosztását?", "admin.users.edit.delete.description": "Biztosan törölni szeretné ezt a felhasználót és az összes megosztását?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Felhasználó létrehozása", "admin.users.modal.create.title": "Felhasználó létrehozása",
"admin.users.modal.create.username": "Felhasználónév", "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.id": "Megosztás ID",
"admin.shares.table.username": "Létrehozó", "admin.shares.table.username": "Létrehozó",
"admin.shares.table.visitors": "Látogatók", "admin.shares.table.visitors": "Látogatók",
"admin.shares.table.expires": "Lejárat", "admin.shares.table.expires": "Lejár",
"admin.shares.edit.delete.title": "{id} megosztás törlése", "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?", "admin.shares.edit.delete.description": "Valóban törölni kívánja ezt a megosztást?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Feltöltés", "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.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.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 // Dropzone.tsx
"upload.dropzone.title": "Fájlok feltöltése", "upload.dropzone.title": "Fájlok feltöltése",
"upload.dropzone.description": "Húzza ide a fájlokat a megosztás elkészítéséhez. Összesen legfeljebb {maxSize} fájl húzható egy megosztásba.", "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.", "upload.dropzone.notify.file-too-big": "A fájlok mérete meghaladja a megengedett {maxSize} méretet.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Megnevezés", "upload.filelist.name": "Megnevezés",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Nincs bejelentkezve", "upload.modal.not-signed-in": "Nincs bejelentkezve",
"upload.modal.not-signed-in-description": "Nem lesz képes megosztását kézzel törölni vagy megtekinteni a látogatók számát.", "upload.modal.not-signed-in-description": "Nem lesz képes megosztását kézzel törölni vagy megtekinteni a látogatók számát.",
"upload.modal.expires.never": "soha", "upload.modal.expires.never": "soha",
"upload.modal.expires.never-long": "Nincs lejárat", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "A lejárat meghaladja a megengedett max {max} értéket.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Hivatkozás", "upload.modal.link.label": "Hivatkozás",
"upload.modal.expires.label": "Lejárat", "upload.modal.expires.label": "Lejárat",
"upload.modal.expires.minute-singular": "perc", "upload.modal.expires.minute-singular": "perc",
@@ -272,16 +278,16 @@ export default {
"share.error.access-denied.title": "Privát megosztás", "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.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.title": "Jelszó szükséges",
"share.modal.password.description": "A megosztott tartalom eléréséhez adja meg a megosztás jelszavát.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Jelszó", "share.modal.password": "Jelszó",
"share.modal.error.invalid-password": "Érvénytelen jelszó", "share.modal.error.invalid-password": "Érvénytelen jelszó",
"share.button.download-all": "Mindet letölti", "share.button.download-all": "Mindet letölti",
"share.notify.download-all-preparing": "A megosztás éppen előkészületben. Kérjük próbálja újra néhány perc múlva.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "Fájl hivatkozás", "share.modal.file-link": "Fájl hivatkozás",
"share.table.name": "Megnevezés", "share.table.name": "Megnevezés",
"share.table.size": "Méret", "share.table.size": "Méret",
"share.modal.file-preview.error.not-supported.title": "Az előnézetek nem támogatottak", "share.modal.file-preview.error.not-supported.title": "Az előnézetek nem támogatottak",
"share.modal.file-preview.error.not-supported.description": "E fájltípushoz nincsen támogatott előnézet. Töltse le a fájlt a megtekintéshez.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Módosítás: {shareId}", "share.edit.title": "Módosítás: {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Hiba lépett fel a megosztás befejezése közben.", "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", "share.edit.notify.save-success": "A megosztás frissítésre került",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Konfiguráció", "admin.config.title": "Konfiguráció",
"admin.config.category.general": "Általános", "admin.config.category.general": "Általános",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "Az alkalmazás neve", "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": "Alkalmazás URL hivatkozás",
"admin.config.general.app-url.description": "A Pingvin Share megosztáskezelőre mutató 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": "Kezdőlap mutatása",
"admin.config.general.show-home-page.description": "A kezdőlap mutatásának ki- és bekapcsolása", "admin.config.general.show-home-page.description": "A kezdőlap mutatásának ki- és bekapcsolása",
"admin.config.general.session-duration": "Munkamenet időtartama", "admin.config.general.session-duration": "Munkamenet időtartama",
@@ -307,46 +321,48 @@ export default {
"admin.config.general.logo": "Logó", "admin.config.general.logo": "Logó",
"admin.config.general.logo.description": "A logó személyessé tételéhez töltsön fel egy új képet. A formátum legyen PNG, az oldalarány 1:1.", "admin.config.general.logo.description": "A logó személyessé tételéhez töltsön fel egy új képet. A formátum legyen PNG, az oldalarány 1:1.",
"admin.config.general.logo.placeholder": "Kép kiválasztása", "admin.config.general.logo.placeholder": "Kép kiválasztása",
"admin.config.email.enable-share-email-recipients": "Megosztás emailben küldésének engedélyezése", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Email küldése a megosztásról a címzetteknek. Csak akkor engedélyezze, ha az SMTP már engedélyezett.", "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": "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-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": "Megosztási email szövege",
"admin.config.email.share-recipients-message.description": "A megosztás címzettjeinek küldött email tartalma. Beépíthető változók:\n {creator} - A megosztás létrehozójának neve\n {shareUrl} - A megosztás URL hivatkozása\n {desc} - A megosztás ismertetése\n {expires} - A megosztás lejáratának dátuma\n A változók helyén az aktuális tartalom fog szerepelni.", "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": "Fordított megosztás tárgya",
"admin.config.email.reverse-share-subject.description": "Annak az emailnek a tárgya, ami a fordított megosztást használva készített megosztásról kerül kiküldésre.", "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", "admin.config.email.reverse-share-message": "Fordított megosztás üzenete",
"admin.config.email.reverse-share-message.description": "Az Ön által kiküldött fordított megosztási hivatkozás használatával készített megosztás emailjének szövege. A(z) {shareUrl} helyére a létrehozó neve és a megosztás URL hivatkozása kerül.", "admin.config.email.reverse-share-message.description": "Az Ön által kiküldött fordított megosztási hivatkozás használatával készített megosztás emailjének szövege. A(z) {shareUrl} helyére a létrehozó neve és a megosztás URL hivatkozása kerül.",
"admin.config.email.reset-password-subject": "Jelszó visszaállítási tárgy", "admin.config.email.reset-password-subject": "Jelszó visszaállítási tárgy",
"admin.config.email.reset-password-subject.description": "A felhasználó által kezdeményezett jelszó visszaállításkor küldött email tárgya.", "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": "Jelszó visszaállítási üzenet", "admin.config.email.reset-password-message": "Jelszó visszaállítási üzenet",
"admin.config.email.reset-password-message.description": "A felhasználó által kezdeményezett jelszó visszaállításkor küldött email szövege. A(z) {url} helyére a jelszó visszaállítási URL hivatkozás kerül.", "admin.config.email.reset-password-message.description": "A felhasználó által kezdeményezett jelszó visszaállításkor küldött email szövege. A(z) {url} helyére a jelszó visszaállítási URL hivatkozás kerül.",
"admin.config.email.invite-subject": "Meghívó tárgya", "admin.config.email.invite-subject": "Meghívó tárgya",
"admin.config.email.invite-subject.description": "Az adminisztrátortól a meghívott felhasználó felé küldött email tárgya.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Meghívó szövege", "admin.config.email.invite-message": "Meghívó szövege",
"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 password of the user.", "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": "Regisztráció engedélyezése", "admin.config.share.allow-registration": "Regisztráció engedélyezése",
"admin.config.share.allow-registration.description": "Regisztráció engedélyezésének ki- és bekapcsolása", "admin.config.share.allow-registration.description": "Regisztráció engedélyezésének ki- és bekapcsolása",
"admin.config.share.allow-unauthenticated-shares": "Hitelesítés nélküli megosztások engedélyezése", "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.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": "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": "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": "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.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": "Darabolási méret",
"admin.config.share.chunk-size.description": "Az internet kapcsolat megbízhatóságának és átvitelének megfelelően választható feltöltési darabok mérete bájtban. A kisebb darabok növelhetik a szakadozó kapcsolatok használatának sikerességét, a nagyobb darabok a stabil kapcsolatokat gyorsítják.", "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": "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.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": "Engedélyezett", "admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "A(z) SMTP bekapcsolása. Csak akkor engedélyezze, ha már megadta a kiszolgáló, port, email, felhasználónév és jelszó beállításokat az SMTP kiszolgálóhoz.", "admin.config.smtp.enabled.description": "A(z) SMTP bekapcsolása. Csak akkor engedélyezze, ha már megadta a kiszolgáló, port, email, felhasználónév és jelszó beállításokat az SMTP kiszolgálóhoz.",
"admin.config.smtp.host": "Kiszolgáló", "admin.config.smtp.host": "Kiszolgáló",
"admin.config.smtp.host.description": "Az SMTP szerver kiszolgáló gépe", "admin.config.smtp.host.description": "Az SMTP szerver kiszolgáló gépe",
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Az SMTP kiszolgáló portja", "admin.config.smtp.port.description": "Az SMTP kiszolgáló portja",
"admin.config.smtp.email": "Email", "admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Az emailek kiküldésére használt email cím", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Felhasználónév", "admin.config.smtp.username": "Felhasználónév",
"admin.config.smtp.username.description": "Felhasználónév az SMTP kiszolgálón", "admin.config.smtp.username.description": "Felhasználónév az SMTP kiszolgálón",
"admin.config.smtp.password": "Jelszó", "admin.config.smtp.password": "Jelszó",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "A Microsoft Oauth applikáció ügyfél titka", "admin.config.oauth.microsoft-client-secret.description": "A Microsoft Oauth applikáció ügyfél titka",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Discord bejelentkezés engedélyezése", "admin.config.oauth.discord-enabled.description": "Discord bejelentkezés engedélyezése",
"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 limitált kiszolgáló ID azonosítója", "admin.config.oauth.discord-limited-guild": "Discord limitált kiszolgáló ID azonosítója",
"admin.config.oauth.discord-limited-guild.description": "A kiszolgálón engedélyezett bejelentkezett felhasználók száma. Hagyja üresen a kikapcsoláshoz.", "admin.config.oauth.discord-limited-guild.description": "A kiszolgálón engedélyezett bejelentkezett felhasználók száma. Hagyja üresen a kikapcsoláshoz.",
"admin.config.oauth.discord-client-id": "Discord ügyfél ID azonosító", "admin.config.oauth.discord-client-id": "Discord ügyfél ID azonosító",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "OpenID Connect bejelentkezés engedélyezése", "admin.config.oauth.oidc-enabled.description": "OpenID Connect bejelentkezés engedélyezése",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Az OpenID Connect OAuth applikáció Discovery URI azonosítója", "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": "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-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", "admin.config.oauth.oidc-role-path": "Az OpenID Connect token szerepeinek elérési útvonala",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect ügyfél titok", "admin.config.oauth.oidc-client-secret": "OpenID Connect ügyfél titok",
"admin.config.oauth.oidc-client-secret.description": "Az OpenID Connect OAuth applikáció ügyfél titka", "admin.config.oauth.oidc-client-secret.description": "Az OpenID Connect OAuth applikáció ügyfél titka",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "LDAP engedélyezve", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "LDAP hitelesítés használata a felhasználói beléptetéshez", "admin.config.ldap.enabled.description": "LDAP hitelesítés használata a felhasználói beléptetéshez",
"admin.config.ldap.url": "Kiszolgáló URL", "admin.config.ldap.url": "Kiszolgáló URL",
"admin.config.ldap.url.description": "Az LDAP kiszolgáló URL címe", "admin.config.ldap.url.description": "Az LDAP kiszolgáló URL címe",
"admin.config.ldap.bind-dn": "DN csatolása", "admin.config.ldap.bind-dn": "DN csatolása",
"admin.config.ldap.bind-dn.description": "A felhasználókeresés végrehajtásában használt alapértelmezett felhasználó", "admin.config.ldap.bind-dn.description": "Default user used to perform the user search",
"admin.config.ldap.bind-password": "Jelszó csatolása", "admin.config.ldap.bind-password": "Jelszó csatolása",
"admin.config.ldap.bind-password.description": "A felhasználókeresés felhasználójának jelszava", "admin.config.ldap.bind-password.description": "Password used to perform the user search",
"admin.config.ldap.search-base": "Felhasználóbázis", "admin.config.ldap.search-base": "Felhasználóbázis",
"admin.config.ldap.search-base.description": "A felhasználókeresés végrehajtásának helye", "admin.config.ldap.search-base.description": "A felhasználókeresés végrehajtásának helye",
"admin.config.ldap.search-query": "Felhasználó lekérdezés", "admin.config.ldap.search-query": "Felhasználó lekérdezés",
"admin.config.ldap.search-query.description": "A felhasználó lekérdezés kísérli meg az LDAP felhasználó elérését a felhasználóbázisban. %username% helyettesítheti az adott felhasználónevet.", "admin.config.ldap.search-query.description": "A felhasználó lekérdezés kísérli meg az LDAP felhasználó elérését a felhasználóbázisban. %username% helyettesítheti az adott felhasználónevet.",
"admin.config.ldap.admin-groups": "Admin csoport", "admin.config.ldap.admin-groups": "Admin csoport",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "Hoppá - ez az oldal nem létezik.", "404.description": "Hoppá - ez az oldal nem létezik.",
"404.button.home": "Vissza a Kezdőlapra", "404.button.home": "Vissza a Kezdőlapra",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "A(z) {0} fiókhoz kapcsolt felhasználó nem létezik.", "error.msg.no_user": "A(z) {0} fiókhoz kapcsolt felhasználó nem létezik.",
"error.msg.no_email": "Nem nyerhető ki a(z) {0} fiók emailcíme.", "error.msg.no_email": "Nem nyerhető ki a(z) {0} fiók emailcíme.",
"error.msg.already_linked": "Ez a(z) {0} fiók már kapcsolódik egy másik fiókhoz.", "error.msg.already_linked": "Ez a(z) {0} fiók már kapcsolódik egy másik fiókhoz.",
"error.msg.not_linked": "Ez a(z){0} fiók még nem kapcsolódott egyetlen fiókhoz sem.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "Ezt a(z) {0} fiókot még nem igazolták vissza, kérem próbálja újra a megerősítés után.", "error.msg.unverified_account": "Ezt a(z) {0} fiókot még nem igazolták vissza, kérem próbálja újra a megerősítés után.",
"error.msg.user_not_allowed": "Nem jelentkezhet be.", "error.msg.user_not_allowed": "Nem jelentkezhet be.",
"error.msg.cannot_get_user_info": "Nem nyerhető ki felhasználói információ ebből a(z) {0} fiókból.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Létrehozás", "common.button.generate": "Létrehozás",
"common.button.done": "Kész", "common.button.done": "Kész",
"common.text.link": "Hivatkozás", "common.text.link": "Hivatkozás",
"common.text.navigate-to-link": "Ugrás a hivatkozásra", "common.text.navigate-to-link": "Visit link",
"common.text.or": "vagy", "common.text.or": "vagy",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Vissza", "common.button.go-back": "Vissza",
"common.button.go-home": "Kezdőlap", "common.button.go-home": "Kezdőlap",
"common.notify.copied": "A hivatkozást a Vágólapra másoltuk", "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.success": "Siker",
"common.error": "Hiba", "common.error": "Hiba",
"common.error.unknown": "Ismeretlen hiba lépett fel", "common.error.unknown": "Ismeretlen hiba lépett fel",
"common.error.invalid-email": "Érvénytelen emailcím", "common.error.invalid-email": "Érvénytelen emailcím",
"common.error.too-short": "Legalább {length} karakter kell", "common.error.too-short": "Legalább {length} karakter kell",
"common.error.too-long": "Legfejlebb {length} karakter adható meg", "common.error.too-long": "Legfejlebb {length} karakter adható meg",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Pontosan {length} karakter szükséges", "common.error.exact-length": "Pontosan {length} karakter szükséges",
"common.error.invalid-number": "Számot kell megadnia", "common.error.invalid-number": "Számot kell megadnia",
"common.error.field-required": "Ez egy kötelező mező" "common.error.field-required": "Ez egy kötelező mező"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Carica", "navbar.upload": "Carica",
"navbar.signin": "Accedi", "navbar.signin": "Accedi",
"navbar.home": "Home", "navbar.home": "Home",
"navbar.signup": "Registrati", "navbar.signup": "Registrazione",
"navbar.links.shares": "Le mie condivisioni", "navbar.links.shares": "Le mie condivisioni",
"navbar.links.reverse": "Condivisioni Inverse", "navbar.links.reverse": "Condivisioni Inverse",
"navbar.avatar.account": "Il mio account", "navbar.avatar.account": "Il mio account",
@@ -16,7 +16,7 @@ export default {
"home.bullet.a.name": "Self-hosted", "home.bullet.a.name": "Self-hosted",
"home.bullet.a.description": "Configura Pingvin Share sul tuo server.", "home.bullet.a.description": "Configura Pingvin Share sul tuo server.",
"home.bullet.b.name": "Privacy", "home.bullet.b.name": "Privacy",
"home.bullet.b.description": "I tuoi file sono i tuoi file e non dovrebbero mai entrare nelle mani di terzi.", "home.bullet.b.description": "I tuoi file sono tuoi e non saranno mai accessibili da terze parti.",
"home.bullet.c.name": "Nessun fastidioso limite alle dimensioni dei files", "home.bullet.c.name": "Nessun fastidioso limite alle dimensioni dei files",
"home.bullet.c.description": "Carica file grandi quanto vuoi. Solo il tuo disco rigido sarà il tuo limite.", "home.bullet.c.description": "Carica file grandi quanto vuoi. Solo il tuo disco rigido sarà il tuo limite.",
"home.button.start": "Inizia adesso", "home.button.start": "Inizia adesso",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Scollega", "account.card.oauth.unlink": "Scollega",
"account.card.oauth.unlinked": "Scollegato", "account.card.oauth.unlinked": "Scollegato",
"account.modal.unlink.title": "Scollega account", "account.modal.unlink.title": "Scollega account",
"account.modal.unlink.description": "Scollegare i tuoi account social potrebbe causare la perdita del tuo account se non ricordi il tuo nome utente e la password.", "account.modal.unlink.description": "Scollegare i tuoi account social potrebbe causare la perdita del tuo account se non ricordi il tuo nome utente e la password",
"account.notify.oauth.unlinked.success": "Disconnessione Riuscita", "account.notify.oauth.unlinked.success": "Disconnessione Riuscita",
"account.card.security.title": "Sicurezza", "account.card.security.title": "Sicurezza",
"account.card.security.totp.enable.description": "Inserisci la tua password attuale per iniziare ad abilitare TOTP", "account.card.security.totp.enable.description": "Inserisci la tua password attuale per iniziare ad abilitare TOTP",
@@ -121,9 +121,12 @@ export default {
"account.shares.table.name": "Nome", "account.shares.table.name": "Nome",
"account.shares.table.description": "Descrizione", "account.shares.table.description": "Descrizione",
"account.shares.table.visitors": "Visitatori", "account.shares.table.visitors": "Visitatori",
"account.shares.table.expiresAt": "Scadenza", "account.shares.table.expiresAt": "Scade il",
"account.shares.table.createdAt": "Creato il", "account.shares.table.createdAt": "Creato il",
"account.shares.table.size": "Dimensione", "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-informations": "Condividi le informazioni",
"account.shares.modal.share-link": "Condividi link", "account.shares.modal.share-link": "Condividi link",
"account.shares.modal.delete.title": "Elimina condivisione {share}", "account.shares.modal.delete.title": "Elimina condivisione {share}",
@@ -150,7 +153,7 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Anno", "account.reverseShares.modal.expiration.year-singular": "Anno",
"account.reverseShares.modal.expiration.year-plural": "Anni", "account.reverseShares.modal.expiration.year-plural": "Anni",
"account.reverseShares.modal.max-size.label": "Dimensione massima della condivisione", "account.reverseShares.modal.max-size.label": "Dimensione massima della condivisione",
"account.reverseShares.modal.send-email": "Invia una notifica via email", "account.reverseShares.modal.send-email": "Invio notifiche email",
"account.reverseShares.modal.send-email.description": "Invia una notifica email quando viene creata una condivisione con questo link di condivisione inversa.", "account.reverseShares.modal.send-email.description": "Invia una notifica email quando viene creata una condivisione con questo link di condivisione inversa.",
"account.reverseShares.modal.simplified": "Modalità semplificata", "account.reverseShares.modal.simplified": "Modalità semplificata",
"account.reverseShares.modal.simplified.description": "Rendi facile la condivisione con te per la persona che carica il file. Potranno personalizzare solo il nome e la descrizione della condivisione.", "account.reverseShares.modal.simplified.description": "Rendi facile la condivisione con te per la persona che carica il file. Potranno personalizzare solo il nome e la descrizione della condivisione.",
@@ -189,7 +192,7 @@ export default {
"admin.users.edit.update.change-password.field": "Nuova password", "admin.users.edit.update.change-password.field": "Nuova password",
"admin.users.edit.update.change-password.button": "Salva la nuova password", "admin.users.edit.update.change-password.button": "Salva la nuova password",
"admin.users.edit.update.notify.password.success": "Password cambiata con successo", "admin.users.edit.update.notify.password.success": "Password cambiata con successo",
"admin.users.edit.delete.title": "Elimina l'utente: {username}", "admin.users.edit.delete.title": "Elimina l'utente: {username} ?",
"admin.users.edit.delete.description": "Vuoi davvero eliminare questo utente e tutte le sue condivisioni?", "admin.users.edit.delete.description": "Vuoi davvero eliminare questo utente e tutte le sue condivisioni?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Crea utente", "admin.users.modal.create.title": "Crea utente",
@@ -212,8 +215,11 @@ export default {
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Carica", "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.generic-error": "Si è verificato un errore durante il completamento della condivisione.",
"upload.notify.count-failed": "Impossibile caricare {count} file. Riprovare.", "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 // Dropzone.tsx
"upload.dropzone.title": "Carica File", "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.", "upload.dropzone.description": "Trascina qui i file per iniziare la tua condivisione. Possiamo accettare solo i file che sono inferiori a {maxSize} in totale.",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Non sei loggato", "upload.modal.not-signed-in": "Non sei loggato",
"upload.modal.not-signed-in-description": "Non sarai in grado di eliminare la tua condivisione manualmente e visualizzare il numero dei visitatori.", "upload.modal.not-signed-in-description": "Non sarai in grado di eliminare la tua condivisione manualmente e visualizzare il numero dei visitatori.",
"upload.modal.expires.never": "mai", "upload.modal.expires.never": "mai",
"upload.modal.expires.never-long": "Non Scade Mai", "upload.modal.expires.never-long": "Condivisione permanente",
"upload.modal.expires.error.too-long": "La scadenza supera la data di scadenza massima di {max}.", "upload.modal.expires.error.too-long": "La data di scadenza supera il massimo di {max}.",
"upload.modal.link.label": "Collegamento", "upload.modal.link.label": "Collegamento",
"upload.modal.expires.label": "Valido fino a", "upload.modal.expires.label": "Valido fino a",
"upload.modal.expires.minute-singular": "Minuto", "upload.modal.expires.minute-singular": "Minuto",
@@ -272,7 +278,7 @@ export default {
"share.error.access-denied.title": "Condivisione privata", "share.error.access-denied.title": "Condivisione privata",
"share.error.access-denied.description": "L' account non ha il premesso di accedere a questa condivisione", "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.title": "Password richiesta",
"share.modal.password.description": "Per accedere a questa condivisione inserisci la password.", "share.modal.password.description": "Inserisci la password per accedere a questa condivisione.",
"share.modal.password": "Password", "share.modal.password": "Password",
"share.modal.error.invalid-password": "Password non valida", "share.modal.error.invalid-password": "Password non valida",
"share.button.download-all": "Scarica tutto", "share.button.download-all": "Scarica tutto",
@@ -281,7 +287,7 @@ export default {
"share.table.name": "Nome", "share.table.name": "Nome",
"share.table.size": "Dimensione", "share.table.size": "Dimensione",
"share.modal.file-preview.error.not-supported.title": "Anteprima non supportata", "share.modal.file-preview.error.not-supported.title": "Anteprima non supportata",
"share.modal.file-preview.error.not-supported.description": "Un'anteprima per questo tipo di file non è supportata. Per favore scarica il file per visualizzarlo.", "share.modal.file-preview.error.not-supported.description": "Le anteprime non sono supportate per questo tipo di file. Scarica il file per visualizzarlo.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Modifica {shareId}", "share.edit.title": "Modifica {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Si è verificato un errore durante il completamento della condivisione.", "share.edit.notify.generic-error": "Si è verificato un errore durante il completamento della condivisione.",
"share.edit.notify.save-success": "Condivisione aggiornata correttamente", "share.edit.notify.save-success": "Condivisione aggiornata correttamente",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Note legali",
// END /imprint
// /privacy
"privacy.title": "Informativa sulla privacy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Configurazione", "admin.config.title": "Configurazione",
"admin.config.category.general": "Generale", "admin.config.category.general": "Generale",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "Nome dell' applicazione", "admin.config.general.app-name.description": "Nome dell' applicazione",
"admin.config.general.app-url": "URL dell'App", "admin.config.general.app-url": "URL dell'App",
"admin.config.general.app-url.description": "Su quale URL Pingvin Share è pubblicato", "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": "Visualizza Home Page",
"admin.config.general.show-home-page.description": "Indica se mostrare la home page", "admin.config.general.show-home-page.description": "Indica se mostrare la home page",
"admin.config.general.session-duration": "Durata della sessione", "admin.config.general.session-duration": "Durata della sessione",
@@ -307,12 +321,12 @@ export default {
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Cambia il tuo logo caricando una nuova immagine. L'immagine deve essere un PNG e dovrebbe avere il formato 1:1.", "admin.config.general.logo.description": "Cambia il tuo logo caricando una nuova immagine. L'immagine deve essere un PNG e dovrebbe avere il formato 1:1.",
"admin.config.general.logo.placeholder": "Scegli un'immagine", "admin.config.general.logo.placeholder": "Scegli un'immagine",
"admin.config.email.enable-share-email-recipients": "Abilita le email di notifica", "admin.config.email.enable-share-email-recipients": "Abilita condivisione del destinatario email",
"admin.config.email.enable-share-email-recipients.description": "Indica se consentire la spedizione di email di notifica sulle share. Abilita questa opzione solo se hai abilitato SMTP.", "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": "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-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": "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": "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-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", "admin.config.email.reverse-share-message": "Testo dell'email di condivisione inversa",
@@ -324,22 +338,24 @@ export default {
"admin.config.email.invite-subject": "Oggetto dell'email di invito", "admin.config.email.invite-subject": "Oggetto dell'email di invito",
"admin.config.email.invite-subject.description": "Oggetto dell'email che viene inviata quando un amministratore invita un utente.", "admin.config.email.invite-subject.description": "Oggetto dell'email che viene inviata quando un amministratore invita un utente.",
"admin.config.email.invite-message": "Testo dell'email di invito", "admin.config.email.invite-message": "Testo dell'email di invito",
"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 password of the user.", "admin.config.email.invite-message.description": "Messaggio che viene inviato quando un amministratore invita un utente. {url} sarà sostituito con l'URL di invito, {email} con l'email e {password} con la password dell'utente.",
"admin.config.share.allow-registration": "Consenti la registrazione", "admin.config.share.allow-registration": "Consenti la registrazione",
"admin.config.share.allow-registration.description": "Indica se la registrazione è autorizzata", "admin.config.share.allow-registration.description": "Indica se la registrazione è autorizzata",
"admin.config.share.allow-unauthenticated-shares": "Consenti condivisioni non autenticate", "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.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": "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": "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": "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.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": "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": "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.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": "Abilitato", "admin.config.smtp.enabled": "Abilita",
"admin.config.smtp.enabled.description": "Indica se SMTP è abilitato. Impostalo a VERO solo se hai inserito host, porta, email, utente e password del tuo server SMTP.", "admin.config.smtp.enabled.description": "Indica se SMTP è abilitato. Impostalo a VERO solo se hai inserito host, porta, email, utente e password del tuo server SMTP.",
"admin.config.smtp.host": "Host", "admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "Host del server SMTP", "admin.config.smtp.host.description": "Host del server SMTP",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Client secret dell'app Microsoft OAuth", "admin.config.oauth.microsoft-client-secret.description": "Client secret dell'app Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Se l'accesso tramite Discord è abilitato", "admin.config.oauth.discord-enabled.description": "Se l'accesso tramite Discord è abilitato",
"admin.config.oauth.discord-limited-users": "Utenti limitati Discord",
"admin.config.oauth.discord-limited-users.description": "Limita l'accesso a specifici utenti dal loro ID Discord. Lascialo vuoto per disabilitare.",
"admin.config.oauth.discord-limited-guild": "Limita a un particolare server ID", "admin.config.oauth.discord-limited-guild": "Limita a un particolare server ID",
"admin.config.oauth.discord-limited-guild.description": "Limita l'accesso agli utenti in un server specifico. Lascialo vuoto per disabilitare.", "admin.config.oauth.discord-limited-guild.description": "Limita l'accesso agli utenti in un server specifico. Lascialo vuoto per disabilitare.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord Client ID",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Se il login tramite OpenID Connect è abilitato", "admin.config.oauth.oidc-enabled.description": "Se il login tramite OpenID Connect è abilitato",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect", "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": "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-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", "admin.config.oauth.oidc-role-path": "Percorso verso i ruoli in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret dell'app OAuth OpenID Connect", "admin.config.oauth.oidc-client-secret.description": "Client secret dell'app OAuth OpenID Connect",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Abilita LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Usa autenticazione LDAP per l'accesso utente",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server Url",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL del server LDAP",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Associa DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "admin.config.ldap.bind-dn.description": "Utente predefinito usato per eseguire la ricerca utente",
"admin.config.ldap.bind-password": "Bind password", "admin.config.ldap.bind-password": "Associa password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "admin.config.ldap.bind-password.description": "Password utilizzata per eseguire la ricerca utente",
"admin.config.ldap.search-base": "User base", "admin.config.ldap.search-base": "Base utenti",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "admin.config.ldap.search-base.description": "Posizione di base, dove verrà eseguita la ricerca dell'utente",
"admin.config.ldap.search-query": "User query", "admin.config.ldap.search-query": "Interrogazione utente",
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.", "admin.config.ldap.search-query.description": "La query utente verrà utilizzata per cercare la 'base utente' per l'utente LDAP. %username% può essere usato come segnaposto per l'input dato dall'utente.",
"admin.config.ldap.admin-groups": "Admin group", "admin.config.ldap.admin-groups": "Gruppo di amministrazione",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Gruppo richiesto per laccesso amministrativo.",
"admin.config.ldap.field-name-member-of": "Nome dell'attributo per il gruppo utenti",
"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.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
"404.description": "Ops, questa pagina non esiste.", "404.description": "Ops, questa pagina non esiste.",
"404.button.home": "Riportami a casa", "404.button.home": "Riportami a casa",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Genera", "common.button.generate": "Genera",
"common.button.done": "Fatto", "common.button.done": "Fatto",
"common.text.link": "Collegamento", "common.text.link": "Collegamento",
"common.text.navigate-to-link": "Vai al collegamento", "common.text.navigate-to-link": "Visita il link",
"common.text.or": "o", "common.text.or": "o",
"common.text.redirecting": "Reindirizzamento...",
"common.button.go-back": "Torna indietro", "common.button.go-back": "Torna indietro",
"common.button.go-home": "Vai alla Home Page", "common.button.go-home": "Vai alla Home Page",
"common.notify.copied": "Il tuo collegamento e' stato copiato negli appunti", "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.success": "Successo",
"common.error": "Errore", "common.error": "Errore",
"common.error.unknown": "Si è verificato un errore sconosciuto", "common.error.unknown": "Si è verificato un errore sconosciuto",
"common.error.invalid-email": "Indirizzo email non valido", "common.error.invalid-email": "Indirizzo email non valido",
"common.error.too-short": "Deve contenere almeno {length} caratteri", "common.error.too-short": "Deve contenere almeno {length} caratteri",
"common.error.too-long": "Deve contenere al massimo {length} caratteri", "common.error.too-long": "Deve contenere al massimo {length} caratteri",
"common.error.number-too-small": "Deve essere almeno {min}",
"common.error.number-too-large": "Deve essere al massimo {max}",
"common.error.exact-length": "Deve essere esattamente {length} caratteri", "common.error.exact-length": "Deve essere esattamente {length} caratteri",
"common.error.invalid-number": "Deve essere un numero", "common.error.invalid-number": "Deve essere un numero",
"common.error.field-required": "Questo campo è obbligatorio" "common.error.field-required": "Questo campo è obbligatorio"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "アップロード", "navbar.upload": "アップロード",
"navbar.signin": "サインイン", "navbar.signin": "サインイン",
"navbar.home": "ホーム", "navbar.home": "ホーム",
"navbar.signup": "会員登録", "navbar.signup": "新規登録",
"navbar.links.shares": "自分の共有", "navbar.links.shares": "自分の共有",
"navbar.links.reverse": "ファイルリクエスト", "navbar.links.reverse": "ファイルリクエスト",
"navbar.avatar.account": "マイアカウント", "navbar.avatar.account": "マイアカウント",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "セルフホスト", "home.bullet.a.name": "セルフホスト",
"home.bullet.a.description": "Pingvin Shareをあなたのマシンでホストしましょう。", "home.bullet.a.description": "Pingvin Shareをあなたのマシンでホストしましょう。",
"home.bullet.b.name": "プライバシー", "home.bullet.b.name": "プライバシー",
"home.bullet.b.description": "あなたのファイルはあなたのものであり、決して第三者の手に入るべきではありません。", "home.bullet.b.description": "あなたのファイルはあなたのものであり、第三者がアクセスすることは決してありません。",
"home.bullet.c.name": "ファイルサイズ制限に悩まされることはありません", "home.bullet.c.name": "ファイルサイズ制限に悩まされることはありません",
"home.bullet.c.description": "大きなファイルアップロード。ストレージのサイズだけが唯一の制限です。", "home.bullet.c.description": "必要なだけ大きなファイルアップロードできます。制限があるのはハードドライブのみです。",
"home.button.start": "始めましょう", "home.button.start": "始めましょう",
"home.button.source": "ソースコード", "home.button.source": "ソースコード",
// END / // END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "パスワードを忘れてしまいましたか?", "resetPassword.title": "パスワードを忘れてしまいましたか?",
"resetPassword.description": "登録しているメールアドレスを入力してください。", "resetPassword.description": "登録しているメールアドレスを入力してください。",
"resetPassword.notify.success": "電子メールが存在する場合、パスワードをリセットするためのリンクを含むメッセージが送信されました。", "resetPassword.notify.success": "指定されたメールアドレスが存在する場合、パスワードをリセットするためのリンクを含むメッセージが送信されました。",
"resetPassword.button.back": "サインインページに戻る", "resetPassword.button.back": "サインインページに戻る",
"resetPassword.text.resetPassword": "パスワードをリセット", "resetPassword.text.resetPassword": "パスワードをリセット",
"resetPassword.text.enterNewPassword": "新規パスワードを入力", "resetPassword.text.enterNewPassword": "新規パスワードを入力",
"resetPassword.input.password": "新規パスワード", "resetPassword.input.password": "新規パスワード",
"resetPassword.notify.passwordReset": "パスワードのリセットに成功しました。", "resetPassword.notify.passwordReset": "パスワードが正常にリセットされました。",
// /account // /account
"account.title": "マイアカウント", "account.title": "マイアカウント",
"account.card.info.title": "アカウント情報", "account.card.info.title": "アカウント情報",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "パスワード", "account.card.password.title": "パスワード",
"account.card.password.old": "現在のパスワード", "account.card.password.old": "現在のパスワード",
"account.card.password.new": "新規パスワード", "account.card.password.new": "新規パスワード",
"account.card.password.noPasswordSet": "パスワードが設定されていません。メールアドレスとパスワードでサインインしたい場合は、パスワードの設定が必要です。", "account.card.password.noPasswordSet": "パスワードが設定されていません。メールアドレスとパスワードを使用してサインインするには、パスワードを作成する必要があります。",
"account.notify.password.success": "パスワードの変更に成功しました", "account.notify.password.success": "パスワードの変更に成功しました",
"account.card.oauth.title": "ソーシャルログイン", "account.card.oauth.title": "ソーシャルログイン",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "リンク解除", "account.card.oauth.unlink": "リンク解除",
"account.card.oauth.unlinked": "リンクされていません", "account.card.oauth.unlinked": "リンクされていません",
"account.modal.unlink.title": "アカウントのリンクを解除", "account.modal.unlink.title": "アカウントのリンクを解除",
"account.modal.unlink.description": "ソーシャルアカウントのリンクを解除すると、ユーザー名とパスワードを覚えていない場合アカウントへのアクセスが失われる可能性があります。", "account.modal.unlink.description": "ソーシャルアカウントのリンクを解除すると、ログイン認証情報を忘れた場合アカウントを失う可能性があります。",
"account.notify.oauth.unlinked.success": "リンク解除に成功しました", "account.notify.oauth.unlinked.success": "リンク解除に成功しました",
"account.card.security.title": "セキュリティ", "account.card.security.title": "セキュリティ",
"account.card.security.totp.enable.description": "2段階認証を有効にするため、現在のパスワードを入力してください", "account.card.security.totp.enable.description": "2段階認証を有効にするため、現在のパスワードを入力してください",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "名前", "account.shares.table.name": "名前",
"account.shares.table.description": "説明", "account.shares.table.description": "説明",
"account.shares.table.visitors": "訪問者", "account.shares.table.visitors": "訪問者",
"account.shares.table.expiresAt": "有効期限:", "account.shares.table.expiresAt": "有効期限",
"account.shares.table.createdAt": "作成日:", "account.shares.table.createdAt": "作成日",
"account.shares.table.size": "サイズ", "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-informations": "共有情報",
"account.shares.modal.share-link": "共有リンク", "account.shares.modal.share-link": "共有リンク",
"account.shares.modal.delete.title": "共有を削除 {share}", "account.shares.modal.delete.title": "共有を削除: {share}",
"account.shares.modal.delete.description": "この共有を削除してもよろしいですか?", "account.shares.modal.delete.description": "この共有を削除してもよろしいですか?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -151,11 +154,11 @@ export default {
"account.reverseShares.modal.expiration.year-plural": "年間", "account.reverseShares.modal.expiration.year-plural": "年間",
"account.reverseShares.modal.max-size.label": "最大ファイルサイズ", "account.reverseShares.modal.max-size.label": "最大ファイルサイズ",
"account.reverseShares.modal.send-email": "メール通知を送信", "account.reverseShares.modal.send-email": "メール通知を送信",
"account.reverseShares.modal.send-email.description": "このファイルリクエストリンクを使用して、ファイルがアップロードされた場合にメール通知ます。", "account.reverseShares.modal.send-email.description": "このファイルリクエストリンクを使用して共有が作成されるとメール通知が送信されます。",
"account.reverseShares.modal.simplified": "シンプルモード", "account.reverseShares.modal.simplified": "シンプルモード",
"account.reverseShares.modal.simplified.description": "ファイルをアップロードする人が簡単に共有できるようにします。共有の名前と説明のみをカスタマイズできます。", "account.reverseShares.modal.simplified.description": "ファイルをアップロードした人が簡単に共有できるようにします。共有の名前と説明のみをカスタマイズできます。",
"account.reverseShares.modal.public-access": "公開アクセス", "account.reverseShares.modal.public-access": "公開アクセス",
"account.reverseShares.modal.public-access.description": "このファイルリクエストで作成された共有を公開します。無効にするとあなたと共有作成者のみが閲覧できます。", "account.reverseShares.modal.public-access.description": "このファイルリクエストで作成された共有を公開します。無効にするとあなたと共有作成者だけが共有を表示できます。",
"account.reverseShares.modal.max-use.label": "最大回数", "account.reverseShares.modal.max-use.label": "最大回数",
"account.reverseShares.modal.max-use.description": "このURLを使用してファイルをアップロードできる最大回数です。", "account.reverseShares.modal.max-use.description": "このURLを使用してファイルをアップロードできる最大回数です。",
"account.reverseShare.never-expires": "このファイルリクエストリンクは期限切れになりません。", "account.reverseShare.never-expires": "このファイルリクエストリンクは期限切れになりません。",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "ユーザー名", "admin.users.table.username": "ユーザー名",
"admin.users.table.email": "メールアドレス", "admin.users.table.email": "メールアドレス",
"admin.users.table.admin": "管理画面", "admin.users.table.admin": "管理画面",
"admin.users.edit.update.title": "ユーザー{username}」を更新", "admin.users.edit.update.title": "ユーザーの編集: {username}",
"admin.users.edit.update.admin-privileges": "管理者権限", "admin.users.edit.update.admin-privileges": "管理者権限",
"admin.users.edit.update.change-password.title": "パスワードを変更", "admin.users.edit.update.change-password.title": "パスワードを変更",
"admin.users.edit.update.change-password.field": "新規パスワード", "admin.users.edit.update.change-password.field": "新規パスワード",
"admin.users.edit.update.change-password.button": "新しいパスワードを保存", "admin.users.edit.update.change-password.button": "新しいパスワードを保存",
"admin.users.edit.update.notify.password.success": "パスワードの変更に成功しました", "admin.users.edit.update.notify.password.success": "パスワードの変更に成功しました",
"admin.users.edit.delete.title": "ユーザーを削除 {username}", "admin.users.edit.delete.title": "ユーザーを削除: {username}",
"admin.users.edit.delete.description": "このユーザーとこのユーザーに関連する全てのファイルアップロードを削除してもよろしいですか", "admin.users.edit.delete.description": "このユーザーとそのすべての共有を本当に削除しますか?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "ユーザーを作成", "admin.users.modal.create.title": "ユーザーを作成",
"admin.users.modal.create.username": "ユーザー名", "admin.users.modal.create.username": "ユーザー名",
@@ -207,16 +210,19 @@ export default {
"admin.shares.table.username": "作成者", "admin.shares.table.username": "作成者",
"admin.shares.table.visitors": "訪問者", "admin.shares.table.visitors": "訪問者",
"admin.shares.table.expires": "有効期限", "admin.shares.table.expires": "有効期限",
"admin.shares.edit.delete.title": "共有 {id} を削除", "admin.shares.edit.delete.title": "共有を削除: {id}",
"admin.shares.edit.delete.description": "この共有を削除してもよろしいですか?", "admin.shares.edit.delete.description": "この共有を削除してもよろしいですか?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "アップロード", "upload.title": "アップロード",
"upload.notify.confirm-leave": "このページから離れますか?アップロードはキャンセルされます。",
"upload.notify.generic-error": "共有を仕上げている最中にエラーが発生しました。", "upload.notify.generic-error": "共有を仕上げている最中にエラーが発生しました。",
"upload.notify.count-failed": "{count} ファイルがアップロードに失敗しました。再度お試しください。", "upload.notify.count-failed": "{count} ファイルがアップロードに失敗しました。再度お試しください。",
"upload.reverse-share.error.invalid.title": "無効なファイルリクエストリンク",
"upload.reverse-share.error.invalid.description": "このファイルリクエストは期限が切れているか無効です。",
// Dropzone.tsx // Dropzone.tsx
"upload.dropzone.title": "ファイルをアップロード", "upload.dropzone.title": "ファイルをアップロード",
"upload.dropzone.description": "ここにファイルをドラッグしてアップロードを開始しましょう。{maxSize} 以下のファイルがアップロードできます。", "upload.dropzone.description": "共有を開始するにはここにファイルをドラッグ&ドロップしてください。受け入れ可能なファイルの合計サイズは{maxSize}までです。",
"upload.dropzone.notify.file-too-big": "アップロードしようとしたファイルは、最大ファイルサイズの{maxSize} を超えています。", "upload.dropzone.notify.file-too-big": "アップロードしようとしたファイルは、最大ファイルサイズの{maxSize} を超えています。",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "ファイル名", "upload.filelist.name": "ファイル名",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "サインインしていません", "upload.modal.not-signed-in": "サインインしていません",
"upload.modal.not-signed-in-description": "共有の手動削除と訪問者カウンターは表示できません。", "upload.modal.not-signed-in-description": "共有の手動削除と訪問者カウンターは表示できません。",
"upload.modal.expires.never": "永久", "upload.modal.expires.never": "永久",
"upload.modal.expires.never-long": "期限切れにさせない", "upload.modal.expires.never-long": "永久シェア",
"upload.modal.expires.error.too-long": "設定可能な有効期限を越えています。有効期限の上限は{max} です。", "upload.modal.expires.error.too-long": "有効期限が最大値{max}を超えています。",
"upload.modal.link.label": "リンク", "upload.modal.link.label": "リンク",
"upload.modal.expires.label": "有効期限", "upload.modal.expires.label": "有効期限",
"upload.modal.expires.minute-singular": "分間", "upload.modal.expires.minute-singular": "分間",
@@ -272,16 +278,16 @@ export default {
"share.error.access-denied.title": "プライベートシェア", "share.error.access-denied.title": "プライベートシェア",
"share.error.access-denied.description": "現在のアカウントにはこの共有にアクセスする権限がありません", "share.error.access-denied.description": "現在のアカウントにはこの共有にアクセスする権限がありません",
"share.modal.password.title": "パスワードが必要です", "share.modal.password.title": "パスワードが必要です",
"share.modal.password.description": "この共有にアクセスするには、共有相手から伝えられているパスワードを入力してください。", "share.modal.password.description": "この共有にアクセスするにはパスワードを入力してください。",
"share.modal.password": "パスワード", "share.modal.password": "パスワード",
"share.modal.error.invalid-password": "パスワードが間違っています", "share.modal.error.invalid-password": "パスワードが間違っています",
"share.button.download-all": "全てダウンロード", "share.button.download-all": "全てダウンロード",
"share.notify.download-all-preparing": "共有準備中です。数分後に度お試しください。", "share.notify.download-all-preparing": "共有準備中です。数分後にもう一度お試しください。",
"share.modal.file-link": "ファイルリンク", "share.modal.file-link": "ファイルリンク",
"share.table.name": "ファイル名", "share.table.name": "ファイル名",
"share.table.size": "サイズ", "share.table.size": "サイズ",
"share.modal.file-preview.error.not-supported.title": "プレビューに対応していません", "share.modal.file-preview.error.not-supported.title": "プレビューに対応していません",
"share.modal.file-preview.error.not-supported.description": "このファイルタイプのプレビューはサポートされていません。ファイルをダウンロードして表示してください。", "share.modal.file-preview.error.not-supported.description": "このファイル形式のプレビューはサポートされていません。ファイルをダウンロードして表示してください。",
// END /share/[id] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "編集 {shareId}", "share.edit.title": "編集 {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "共有の最終処理でエラーが発生しました。", "share.edit.notify.generic-error": "共有の最終処理でエラーが発生しました。",
"share.edit.notify.save-success": "共有の更新に成功しました", "share.edit.notify.save-success": "共有の更新に成功しました",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "インプリント",
// END /imprint
// /privacy
"privacy.title": "プライバシーポリシー",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "設定", "admin.config.title": "設定",
"admin.config.category.general": "一般", "admin.config.category.general": "一般",
@@ -298,8 +310,10 @@ export default {
"admin.config.category.oauth": "ソーシャルログイン", "admin.config.category.oauth": "ソーシャルログイン",
"admin.config.general.app-name": "アプリ名", "admin.config.general.app-name": "アプリ名",
"admin.config.general.app-name.description": "アプリの名前", "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.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": "ホームページを表示する",
"admin.config.general.show-home-page.description": "ホームページを表示するかどうか選択", "admin.config.general.show-home-page.description": "ホームページを表示するかどうか選択",
"admin.config.general.session-duration": "セッション期間", "admin.config.general.session-duration": "セッション期間",
@@ -307,36 +321,38 @@ export default {
"admin.config.general.logo": "ロゴ", "admin.config.general.logo": "ロゴ",
"admin.config.general.logo.description": "新しい画像をアップロードしてロゴを変更できます。画像は、PNG形式でアスペクト比が1:1である必要があります。", "admin.config.general.logo.description": "新しい画像をアップロードしてロゴを変更できます。画像は、PNG形式でアスペクト比が1:1である必要があります。",
"admin.config.general.logo.placeholder": "画像を選択", "admin.config.general.logo.placeholder": "画像を選択",
"admin.config.email.enable-share-email-recipients": "メールの共有を有効にする", "admin.config.email.enable-share-email-recipients": "メール受信者の共有を有効にする",
"admin.config.email.enable-share-email-recipients.description": "メール共有を送信できるようにするか選択してください。SMTPが有効になっている場合にのみ機能します。", "admin.config.email.enable-share-email-recipients.description": "受信者とのメール共有を許可するかどうか。SMTPが有効な場合にのみこれを有効にします。",
"admin.config.email.share-recipients-subject": "宛先への件名", "admin.config.email.share-recipients-subject": "宛先への件名",
"admin.config.email.share-recipients-subject.description": "メールで共有された相手に送信メールの件名です。", "admin.config.email.share-recipients-subject.description": "メールで共有された相手に送信メールの件名です。",
"admin.config.email.share-recipients-message": "宛先への本文", "admin.config.email.share-recipients-message": "宛先への本文",
"admin.config.email.share-recipients-message.description": "メールで共有された相手に送信されるメールの本文です。次の変数が利用できます:\n{creator} - 共有作成者のユーザー名\n{shareUrl} - 共有のURL\n{desc} - 共有の説明\n{expires} - 共有の有効期限\n変数は実際の値によって置き換えられます。", "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": "ファイルリクエストの件名",
"admin.config.email.reverse-share-subject.description": "あなたが作成したファイルリクエストリンクからファイルがアップロードされた場合に送信されるメールの件名です。", "admin.config.email.reverse-share-subject.description": "誰かがあなたのファイルリクエストリンクを使用して共有を作成したときに送信されるメールの件名。",
"admin.config.email.reverse-share-message": "ファイルリクエストの本文", "admin.config.email.reverse-share-message": "ファイルリクエストの本文",
"admin.config.email.reverse-share-message.description": "あなたが作成したファイルリクエストリンクからファイルがアップロードされた場合に送信されるメールの本文です。{shareUrl} は、作成者の名前とURLにより置き換えられます。", "admin.config.email.reverse-share-message.description": "あなたが作成したファイルリクエストリンクからファイルがアップロードされた場合に送信されるメールの本文です。{shareUrl} は、作成者の名前とURLにより置き換えられます。",
"admin.config.email.reset-password-subject": "パスワードリセットの件名", "admin.config.email.reset-password-subject": "パスワードリセットの件名",
"admin.config.email.reset-password-subject.description": "パスワードリセットのリクエストがされた時に送信されるメールの件名です。", "admin.config.email.reset-password-subject.description": "ユーザーがパスワードリセットを要求したときに送信されるメールの件名。",
"admin.config.email.reset-password-message": "パスワードリセットの本文", "admin.config.email.reset-password-message": "パスワードリセットの本文",
"admin.config.email.reset-password-message.description": "あなたが作成したファイルリクエストリンクからファイルがアップロードされた場合に送信されるメールの本文です。{url} は、実際のパスワードリセットURLによって置き換えられます。", "admin.config.email.reset-password-message.description": "あなたが作成したファイルリクエストリンクからファイルがアップロードされた場合に送信されるメールの本文です。{url} は、実際のパスワードリセットURLによって置き換えられます。",
"admin.config.email.invite-subject": "無効な件名", "admin.config.email.invite-subject": "無効な件名",
"admin.config.email.invite-subject.description": "管理者がユーザーを招待したときに送信されるメールの件名です。", "admin.config.email.invite-subject.description": "管理者がユーザーを招待するときに送信されるメールの件名。",
"admin.config.email.invite-message": "無効な本文", "admin.config.email.invite-message": "無効な本文",
"admin.config.email.invite-message.description": "管理者がユーザーを招待したときに送信されるメッセージ。{url} は招待 URL に置き換えられ、{email} はユーザーの電子メールに置き換えられ、{password} はユーザーのパスワードに置き換えられます。", "admin.config.email.invite-message.description": "管理者がユーザーを招待したときに送信されるメッセージ。{url}は招待URLに、{email}はメールアドレスに、{password}はユーザーのパスワードに置き換えられます。",
"admin.config.share.allow-registration": "登録を許可する", "admin.config.share.allow-registration": "登録を許可する",
"admin.config.share.allow-registration.description": "登録を許可するかどうかを選択してください。", "admin.config.share.allow-registration.description": "登録を許可するかどうかを選択してください。",
"admin.config.share.allow-unauthenticated-shares": "ログインしていない状態での共有を許可する", "admin.config.share.allow-unauthenticated-shares": "ログインしていない状態での共有を許可する",
"admin.config.share.allow-unauthenticated-shares.description": "ログインしていないユーザーに共有の作成を許可するかどうかを選択してください。", "admin.config.share.allow-unauthenticated-shares.description": "ログインしていないユーザーに共有の作成を許可するかどうかを選択してください。",
"admin.config.share.max-expiration": "有効期限の上限", "admin.config.share.max-expiration": "有効期限の上限",
"admin.config.share.max-expiration.description": "共有に設定可能な有効期限の上限を時間単位で設定できます。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": "最大ファイルサイズ",
"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": "Zip圧縮レベル",
"admin.config.share.zip-compression-level.description": "ファイルサイズと圧縮速度のバランスを取るように、レベルを調整できます。有効な値は09の間で、0が無圧縮、9で最大限の圧縮となります。 ", "admin.config.share.zip-compression-level.description": "ファイルサイズと圧縮速度のバランスを取るように、レベルを調整できます。有効な値は09の間で、0が無圧縮、9で最大限の圧縮となります。 ",
"admin.config.share.chunk-size": "チャンクサイズ", "admin.config.share.chunk-size": "チャンクサイズ",
"admin.config.share.chunk-size.description": "インターネット接続に応じてアップロードのチャンクサイズ(バイト単位)を調整し、効率と信頼性のバランスを取ってください。不安定な接続の場合、チャンクサイズを小さくすることでアップロード成功率を高めることができ、安定した接続の場合、チャンクサイズを大きくすることでアップロード速度を速めることができます。", "admin.config.share.chunk-size.description": "インターネット接続に応じて、効率と信頼性のバランスをとるためにアップロードのチャンクサイズ を調整します。チャンクを小さくすると、不安定な接続での成功率が向上し、チャンクを大きくすると、安定した接続でのアップロードが速くなります。",
"admin.config.share.auto-open-share-modal": "共有モーダルを自動的に開く", "admin.config.share.auto-open-share-modal": "共有モーダルを自動的に開く",
"admin.config.share.auto-open-share-modal.description": "ユーザーがファイルを選択すると、共有作成モーダルが自動的に表示されるため、手動でボタンをクリックする必要がありません。", "admin.config.share.auto-open-share-modal.description": "ユーザーがファイルを選択すると、共有作成モーダルが自動的に表示されるため、手動でボタンをクリックする必要がありません。",
"admin.config.smtp.enabled": "有効", "admin.config.smtp.enabled": "有効",
@@ -346,7 +362,7 @@ export default {
"admin.config.smtp.port": "ポート番号", "admin.config.smtp.port": "ポート番号",
"admin.config.smtp.port.description": "SMTPサーバーのポート番号", "admin.config.smtp.port.description": "SMTPサーバーのポート番号",
"admin.config.smtp.email": "メールアドレス", "admin.config.smtp.email": "メールアドレス",
"admin.config.smtp.email.description": "送信メールに設定するメールアドレス", "admin.config.smtp.email.description": "メールの送信元となるメールアドレス",
"admin.config.smtp.username": "ユーザー名", "admin.config.smtp.username": "ユーザー名",
"admin.config.smtp.username.description": "SMTPサーバーのユーザー名", "admin.config.smtp.username.description": "SMTPサーバーのユーザー名",
"admin.config.smtp.password": "パスワード", "admin.config.smtp.password": "パスワード",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuthアプリのクライアントシークレット", "admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuthアプリのクライアントシークレット",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Discordアカウントを使用したログインを許可するかどうかを設定します", "admin.config.oauth.discord-enabled.description": "Discordアカウントを使用したログインを許可するかどうかを設定します",
"admin.config.oauth.discord-limited-users": "Discord限定ユーザー",
"admin.config.oauth.discord-limited-users.description": "Discord IDによって特定のユーザーのサインインを制限します。無効にするには空白のままにします。",
"admin.config.oauth.discord-limited-guild": "Discord限定サーバーID", "admin.config.oauth.discord-limited-guild": "Discord限定サーバーID",
"admin.config.oauth.discord-limited-guild.description": "特定のサーバーのユーザーにサインインを制限します。無効にするには空白のままにしてください。", "admin.config.oauth.discord-limited-guild.description": "特定のサーバーのユーザーにサインインを制限します。無効にするには空白のままにしてください。",
"admin.config.oauth.discord-client-id": "Discord クライアントID", "admin.config.oauth.discord-client-id": "Discord クライアントID",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "OpenID Connect のログインが有効かを設定します", "admin.config.oauth.oidc-enabled.description": "OpenID Connect のログインが有効かを設定します",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "OpenID OAuthアプリのDiscovery URI", "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": "OpenID Connect ユーザー名の要求",
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID トークンのユーザー名要求。この設定が何かわからない場合は空白のままにしてください。", "admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID トークンのユーザー名要求。この設定が何かわからない場合は空白のままにしてください。",
"admin.config.oauth.oidc-role-path": "OpenID Connectトークンのロールへのパス", "admin.config.oauth.oidc-role-path": "OpenID Connectトークンのロールへのパス",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuthアプリのクライアントシークレット", "admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuthアプリのクライアントシークレット",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "LDAP を有効化", "admin.config.ldap.enabled": "LDAPを有効化",
"admin.config.ldap.enabled.description": "ユーザーログインにLDAP認証を使用する", "admin.config.ldap.enabled.description": "ユーザーログインにLDAP認証を使用する",
"admin.config.ldap.url": "サーバーURL", "admin.config.ldap.url": "サーバーURL",
"admin.config.ldap.url.description": "LDAPサーバーのURL", "admin.config.ldap.url.description": "LDAPサーバーのURL",
"admin.config.ldap.bind-dn": "バインド DN", "admin.config.ldap.bind-dn": "バインド DN",
"admin.config.ldap.bind-dn.description": "ユーザー検索実行に使用されるデフォルトのユーザー", "admin.config.ldap.bind-dn.description": "ユーザー検索実行するために使用されるデフォルトのユーザー",
"admin.config.ldap.bind-password": "パスワードをバインド", "admin.config.ldap.bind-password": "パスワードをバインド",
"admin.config.ldap.bind-password.description": "ユーザー検索ユーザーのパスワード", "admin.config.ldap.bind-password.description": "ユーザー検索を実行するために使用するパスワード",
"admin.config.ldap.search-base": "ユーザーベース", "admin.config.ldap.search-base": "ユーザーベース",
"admin.config.ldap.search-base.description": "ユーザーの検索が実行されるベースの場所", "admin.config.ldap.search-base.description": "ユーザーの検索が実行されるベースの場所",
"admin.config.ldap.search-query": "ユーザークエリ", "admin.config.ldap.search-query": "ユーザークエリ",
"admin.config.ldap.search-query.description": "ユーザークエリはLDAPユーザーの「ユーザーベース」を検索するために使用されます。 %username% は、入力されたユーザーのプレースホルダとして使用できます。", "admin.config.ldap.search-query.description": "ユーザークエリはLDAPユーザーの「ユーザーベース」を検索するために使用されます。 %username% は、入力されたユーザーのプレースホルダとして使用できます。",
"admin.config.ldap.admin-groups": "管理者グループ", "admin.config.ldap.admin-groups": "管理者グループ",
"admin.config.ldap.admin-groups.description": "管理者アクセスに必要なグループです。", "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": "ロゴが正常に更新されました。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.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
"404.description": "ページが見つかりません。", "404.description": "ページが見つかりません。",
"404.button.home": "ホームに戻る", "404.button.home": "ホームに戻る",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "この{0} アカウントにリンクしたユーザーが存在しません。", "error.msg.no_user": "この{0} アカウントにリンクしたユーザーが存在しません。",
"error.msg.no_email": "この{0} アカウントからメールアドレスを取得出来ません。", "error.msg.no_email": "この{0} アカウントからメールアドレスを取得出来ません。",
"error.msg.already_linked": "この{0} アカウントは、既に別のアカウントにリンクされています。", "error.msg.already_linked": "この{0} アカウントは、既に別のアカウントにリンクされています。",
"error.msg.not_linked": "この{0} アカウントはどのアカウントにもリンクされていません。", "error.msg.not_linked": "この{0}アカウントはまだどのアカウントにもリンクされていません。",
"error.msg.unverified_account": "この {0} アカウントは認証されていません。認証後にもう一度お試しください。", "error.msg.unverified_account": "この {0} アカウントは認証されていません。認証後にもう一度お試しください。",
"error.msg.user_not_allowed": "サインインできません。", "error.msg.user_not_allowed": "サインインできません。",
"error.msg.cannot_get_user_info": "この {0} アカウントからユーザー情報を取得できません。", "error.msg.cannot_get_user_info": "この{0}アカウントからユーザー情報を取得できません。",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "生成", "common.button.generate": "生成",
"common.button.done": "完了", "common.button.done": "完了",
"common.text.link": "リンク", "common.text.link": "リンク",
"common.text.navigate-to-link": "リンクへ移動", "common.text.navigate-to-link": "リンクを開く",
"common.text.or": "または", "common.text.or": "または",
"common.text.redirecting": "リダイレクトしています...",
"common.button.go-back": "戻る", "common.button.go-back": "戻る",
"common.button.go-home": "ホームに戻る", "common.button.go-home": "ホームに戻る",
"common.notify.copied": "リンクをクリップボードにコピーしました", "common.notify.copied": "リンクをクリップボードにコピーしました",
"common.notify.copied-link": "リンクをクリップボードにコピーしました",
"common.success": "成功", "common.success": "成功",
"common.error": "エラー", "common.error": "エラー",
"common.error.unknown": "不明なエラーが発生しました", "common.error.unknown": "不明なエラーが発生しました",
"common.error.invalid-email": "無効なメールアドレス", "common.error.invalid-email": "無効なメールアドレス",
"common.error.too-short": "最低{length} 文字である必要があります", "common.error.too-short": "最低{length} 文字である必要があります",
"common.error.too-long": "最大{length} 文字である必要があります", "common.error.too-long": "最大{length} 文字である必要があります",
"common.error.number-too-small": "少なくとも{min} でなければなりません",
"common.error.number-too-large": "最大で{max} である必要があります",
"common.error.exact-length": "{length} 文字である必要があります", "common.error.exact-length": "{length} 文字である必要があります",
"common.error.invalid-number": "数字でなければなりません", "common.error.invalid-number": "数字でなければなりません",
"common.error.field-required": "これは必須項目です" "common.error.field-required": "これは必須項目です"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "업로드", "navbar.upload": "업로드",
"navbar.signin": "로그인", "navbar.signin": "로그인",
"navbar.home": "홈", "navbar.home": "홈",
"navbar.signup": "계정 만들기", "navbar.signup": "Sign up",
"navbar.links.shares": "내 공유", "navbar.links.shares": "내 공유",
"navbar.links.reverse": "역방향 공유", "navbar.links.reverse": "역방향 공유",
"navbar.avatar.account": "내 계정", "navbar.avatar.account": "내 계정",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "직접 호스팅", "home.bullet.a.name": "직접 호스팅",
"home.bullet.a.description": "자신의 컴퓨터에서 Pingvin Share를 호스팅하세요.", "home.bullet.a.description": "자신의 컴퓨터에서 Pingvin Share를 호스팅하세요.",
"home.bullet.b.name": "개인 정보 보호", "home.bullet.b.name": "개인 정보 보호",
"home.bullet.b.description": "당신의 파일은 당신의 것이므로 절대로 제3자의 손에 들어가서는 안 됩니다.", "home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "귀찮은 파일 크기 제한 없음", "home.bullet.c.name": "귀찮은 파일 크기 제한 없음",
"home.bullet.c.description": "원하는 만큼 큰 파일을 업로드하세요. 오직 여러분의 하드 디스크만이 한계가 될 것입니다.", "home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "시작하기", "home.button.start": "시작하기",
"home.button.source": "소스 코드", "home.button.source": "소스 코드",
// END / // END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "비밀번호를 잊으셨나요?", "resetPassword.title": "비밀번호를 잊으셨나요?",
"resetPassword.description": "비밀번호를 재설정하려면 이메일을 입력하세요.", "resetPassword.description": "비밀번호를 재설정하려면 이메일을 입력하세요.",
"resetPassword.notify.success": "이메일이 존재한다면 비밀번호를 재설정하는 링크를 포함한 메시지가 발송되었습니다.", "resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "로그인 페이지로 돌아가기", "resetPassword.button.back": "로그인 페이지로 돌아가기",
"resetPassword.text.resetPassword": "비밀번호 재설정", "resetPassword.text.resetPassword": "비밀번호 재설정",
"resetPassword.text.enterNewPassword": "새로운 비밀번호를 입력하세요", "resetPassword.text.enterNewPassword": "새로운 비밀번호를 입력하세요",
"resetPassword.input.password": "새로운 비밀번호", "resetPassword.input.password": "새로운 비밀번호",
"resetPassword.notify.passwordReset": "비밀번호가 성공적으로 재설정되었습니다.", "resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account // /account
"account.title": "내 계정", "account.title": "내 계정",
"account.card.info.title": "계정 정보", "account.card.info.title": "계정 정보",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "비밀번호", "account.card.password.title": "비밀번호",
"account.card.password.old": "기존 비밀번호", "account.card.password.old": "기존 비밀번호",
"account.card.password.new": "새로운 비밀번호", "account.card.password.new": "새로운 비밀번호",
"account.card.password.noPasswordSet": "비밀번호를 설정하지 않았습니다. 이메일과 비밀번호로 로그인하려면 비밀번호를 설정해야 합니다.", "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": "비밀번호 변경 완료", "account.notify.password.success": "비밀번호 변경 완료",
"account.card.oauth.title": "소셜 로그인", "account.card.oauth.title": "소셜 로그인",
"account.card.oauth.github": "깃허브", "account.card.oauth.github": "깃허브",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "연결 해제", "account.card.oauth.unlink": "연결 해제",
"account.card.oauth.unlinked": "연결 해제", "account.card.oauth.unlinked": "연결 해제",
"account.modal.unlink.title": "계정 연결 해제", "account.modal.unlink.title": "계정 연결 해제",
"account.modal.unlink.description": "소셜 계정 연결을 해제하면 사용자 이름과 비밀번호를 기억하지 못할 경우 계정을 잃을 수 있습니다.", "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": "연결 해제됨", "account.notify.oauth.unlinked.success": "연결 해제됨",
"account.card.security.title": "보안", "account.card.security.title": "보안",
"account.card.security.totp.enable.description": "TOTP 활성화를 시작하려면 현재 비밀번호를 입력하세요.", "account.card.security.totp.enable.description": "TOTP 활성화를 시작하려면 현재 비밀번호를 입력하세요.",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "이름", "account.shares.table.name": "이름",
"account.shares.table.description": "설명", "account.shares.table.description": "설명",
"account.shares.table.visitors": "방문자", "account.shares.table.visitors": "방문자",
"account.shares.table.expiresAt": "만료일", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "생성일", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "크기", "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-informations": "공유 정보",
"account.shares.modal.share-link": "공유 링크", "account.shares.modal.share-link": "공유 링크",
"account.shares.modal.delete.title": "공유 삭제 {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "정말로 이 공유를 삭제하시겠습니까?", "account.shares.modal.delete.description": "정말로 이 공유를 삭제하시겠습니까?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "년", "account.reverseShares.modal.expiration.year-singular": "년",
"account.reverseShares.modal.expiration.year-plural": "년", "account.reverseShares.modal.expiration.year-plural": "년",
"account.reverseShares.modal.max-size.label": "최대 공유 크기", "account.reverseShares.modal.max-size.label": "최대 공유 크기",
"account.reverseShares.modal.send-email": "이메일 알림 보내기", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "이 역방향 공유 링크를 사용하여 공유가 생성되면 이메일 알림을 보냅니다.", "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": "Simple mode",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.", "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": "Public access",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "공유 생성 제한", "account.reverseShares.modal.max-use.label": "공유 생성 제한",
"account.reverseShares.modal.max-use.description": "이 URL을 사용하여 공유를 생성할 수 있는 최대 횟수입니다.", "account.reverseShares.modal.max-use.description": "이 URL을 사용하여 공유를 생성할 수 있는 최대 횟수입니다.",
"account.reverseShare.never-expires": "이 역공유 링크는 만료되지 않습니다.", "account.reverseShare.never-expires": "이 역공유 링크는 만료되지 않습니다.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "사용자 이름", "admin.users.table.username": "사용자 이름",
"admin.users.table.email": "이메일", "admin.users.table.email": "이메일",
"admin.users.table.admin": "관리자", "admin.users.table.admin": "관리자",
"admin.users.edit.update.title": "{username} 사용자 업데이트", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Admin Privilege", "admin.users.edit.update.admin-privileges": "Admin Privilege",
"admin.users.edit.update.change-password.title": "비밀번호 변경", "admin.users.edit.update.change-password.title": "비밀번호 변경",
"admin.users.edit.update.change-password.field": "새로운 비밀번호", "admin.users.edit.update.change-password.field": "새로운 비밀번호",
"admin.users.edit.update.change-password.button": "새 비밀번호 저장", "admin.users.edit.update.change-password.button": "새 비밀번호 저장",
"admin.users.edit.update.notify.password.success": "비밀번호 변경 완료", "admin.users.edit.update.notify.password.success": "비밀번호 변경 완료",
"admin.users.edit.delete.title": "{username} 사용자 삭제", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "이 사용자의 모든 공유를 삭제하시겠습니까?", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "사용자 생성", "admin.users.modal.create.title": "사용자 생성",
"admin.users.modal.create.username": "사용자 이름", "admin.users.modal.create.username": "사용자 이름",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "공유 ID", "admin.shares.table.id": "공유 ID",
"admin.shares.table.username": "만든이", "admin.shares.table.username": "만든이",
"admin.shares.table.visitors": "방문자", "admin.shares.table.visitors": "방문자",
"admin.shares.table.expires": "만료일", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "공유 삭제 {id}", "admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "정말로 이 공유를 삭제하시겠습니까?", "admin.shares.edit.delete.description": "정말로 이 공유를 삭제하시겠습니까?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "업로드", "upload.title": "업로드",
"upload.notify.confirm-leave": "Are you sure you want to leave this page? Your upload will be canceled.",
"upload.notify.generic-error": "공유를 완료하는 동안 오류가 발생했습니다.", "upload.notify.generic-error": "공유를 완료하는 동안 오류가 발생했습니다.",
"upload.notify.count-failed": "{count}개의 파일을 업로드하지 못했습니다. 다시 시도하세요.", "upload.notify.count-failed": "{count}개의 파일을 업로드하지 못했습니다. 다시 시도하세요.",
"upload.reverse-share.error.invalid.title": "Invalid reverse share link",
"upload.reverse-share.error.invalid.description": "This reverse share has expired or is invalid.",
// Dropzone.tsx // Dropzone.tsx
"upload.dropzone.title": "파일 업로드", "upload.dropzone.title": "파일 업로드",
"upload.dropzone.description": "파일을 여기로 드래그&드랍하여 파일 업로드를 시작합니다. {maxSize} 를 초과하지 않는 파일만 업로드할 수 있습니다.", "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.notify.file-too-big": "파일이 {maxSize} 의 최대 공유 크기를 초과합니다.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "이름", "upload.filelist.name": "이름",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "로그인하지 않았습니다", "upload.modal.not-signed-in": "로그인하지 않았습니다",
"upload.modal.not-signed-in-description": "공유를 수동으로 삭제하고 방문자 수를 볼 수 없습니다.", "upload.modal.not-signed-in-description": "공유를 수동으로 삭제하고 방문자 수를 볼 수 없습니다.",
"upload.modal.expires.never": "절대 안 함", "upload.modal.expires.never": "절대 안 함",
"upload.modal.expires.never-long": "만료 없음", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "만료가 {max} 의 최대 만료일을 초과합니다.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "링크", "upload.modal.link.label": "링크",
"upload.modal.expires.label": "만료일", "upload.modal.expires.label": "만료일",
"upload.modal.expires.minute-singular": "분", "upload.modal.expires.minute-singular": "분",
@@ -272,16 +278,16 @@ export default {
"share.error.access-denied.title": "Private share", "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.description": "The current account does not have permission to access this share",
"share.modal.password.title": "비밀번호 필요", "share.modal.password.title": "비밀번호 필요",
"share.modal.password.description": "이 공유에 접근하려면 공유의 암호를 입력하십시오.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "비밀번호", "share.modal.password": "비밀번호",
"share.modal.error.invalid-password": "잘못된 비밀번호", "share.modal.error.invalid-password": "잘못된 비밀번호",
"share.button.download-all": "모두 다운로드", "share.button.download-all": "모두 다운로드",
"share.notify.download-all-preparing": "공유가 준비 중입니다. 잠시 후에 다시 시도하십시오.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "파일 링크", "share.modal.file-link": "파일 링크",
"share.table.name": "이름", "share.table.name": "이름",
"share.table.size": "크기", "share.table.size": "크기",
"share.modal.file-preview.error.not-supported.title": "미리보기는 지원되지 않습니다", "share.modal.file-preview.error.not-supported.title": "미리보기는 지원되지 않습니다",
"share.modal.file-preview.error.not-supported.description": "이 파일 형식의 미리보기가 지원되지 않습니다. 파일을 다운로드하여 확인하십시오.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "수정 {shareId}", "share.edit.title": "수정 {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "공유를 완료하는 동안 오류가 발생했습니다.", "share.edit.notify.generic-error": "공유를 완료하는 동안 오류가 발생했습니다.",
"share.edit.notify.save-success": "공유가 업데이트 되었습니다.", "share.edit.notify.save-success": "공유가 업데이트 되었습니다.",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "구성", "admin.config.title": "구성",
"admin.config.category.general": "일반", "admin.config.category.general": "일반",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "이 앱의 이름", "admin.config.general.app-name.description": "이 앱의 이름",
"admin.config.general.app-url": "앱 URL", "admin.config.general.app-url": "앱 URL",
"admin.config.general.app-url.description": "Pingvin Share를 사용할 수 있는 URL", "admin.config.general.app-url.description": "Pingvin Share를 사용할 수 있는 URL",
"admin.config.general.secure-cookies": "Secure cookies",
"admin.config.general.secure-cookies.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": "홈 페이지 표시",
"admin.config.general.show-home-page.description": "홈 페이지를 표시할지 여부", "admin.config.general.show-home-page.description": "홈 페이지를 표시할지 여부",
"admin.config.general.session-duration": "세션 기간", "admin.config.general.session-duration": "세션 기간",
@@ -307,46 +321,48 @@ export default {
"admin.config.general.logo": "로고", "admin.config.general.logo": "로고",
"admin.config.general.logo.description": "새 이미지를 업로드하여 로고를 변경하십시오. 이미지는 PNG여야 하며 1:1 비율이어야 합니다.", "admin.config.general.logo.description": "새 이미지를 업로드하여 로고를 변경하십시오. 이미지는 PNG여야 하며 1:1 비율이어야 합니다.",
"admin.config.general.logo.placeholder": "이미지 선택", "admin.config.general.logo.placeholder": "이미지 선택",
"admin.config.email.enable-share-email-recipients": "메일 수신 허용", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "메일이 수신자를 공유하도록 허용할지 여부. SMTP를 사용 가능으로 설정한 경우에만 이 옵션을 사용 가능으로 설정합니다.", "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": "공유 제목",
"admin.config.email.share-recipients-subject.description": "공유 수신자에게 전송되는 이메일의 제목입니다.", "admin.config.email.share-recipients-subject.description": "공유 수신자에게 전송되는 이메일의 제목입니다.",
"admin.config.email.share-recipients-message": "수신자 메시지 공유", "admin.config.email.share-recipients-message": "수신자 메시지 공유",
"admin.config.email.share-recipients-message.description": "공유 수신자에게 보내는 메시지입니다. 사용 가능한 변수:\n {creator} - 공유 작성자의 사용자 이름\n {shareUrl} - 공유의 URL\n {desc} - 공유에 대한 설명\n {expires} - 공유 만료일\n 변수는 실제 값으로 대체됩니다.", "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": "역방향 공유 제목",
"admin.config.email.reverse-share-subject.description": "누군가 당신이 공유한 역방향 공유 링크를 사용하여 공유를 생성했을 때 전송되는 이메일의 제목입니다.", "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": "역방향 공유 메시지", "admin.config.email.reverse-share-message": "역방향 공유 메시지",
"admin.config.email.reverse-share-message.description": "누군가 귀하의 역방향 공유 링크를 사용하여 공유를 생성하면 전송되는 메시지입니다.. {shareUrl} 은 작성자 이름 및 공유 URL로 대체됩니다.", "admin.config.email.reverse-share-message.description": "누군가 귀하의 역방향 공유 링크를 사용하여 공유를 생성하면 전송되는 메시지입니다.. {shareUrl} 은 작성자 이름 및 공유 URL로 대체됩니다.",
"admin.config.email.reset-password-subject": "비밀번호 재설정 제목", "admin.config.email.reset-password-subject": "비밀번호 재설정 제목",
"admin.config.email.reset-password-subject.description": "사용자가 암호 재설정을 요청할 때 전송되는 메일의 제목입니다.", "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": "비밀번호 재설정 메시지", "admin.config.email.reset-password-message": "비밀번호 재설정 메시지",
"admin.config.email.reset-password-message.description": "사용자가 비밀번호 재설정을 요청할 때 전송되는 메시지입니다. {url} 은 비밀번호 재설정 URL로 대체됩니다.", "admin.config.email.reset-password-message.description": "사용자가 비밀번호 재설정을 요청할 때 전송되는 메시지입니다. {url} 은 비밀번호 재설정 URL로 대체됩니다.",
"admin.config.email.invite-subject": "초대 제목", "admin.config.email.invite-subject": "초대 제목",
"admin.config.email.invite-subject.description": "관리자가 사용자를 초대할 때 전송되는 이메일의 제목입니다.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "초대 메시지", "admin.config.email.invite-message": "초대 메시지",
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the password of the user.", "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": "가입 허용", "admin.config.share.allow-registration": "가입 허용",
"admin.config.share.allow-registration.description": "등록 가능 여부", "admin.config.share.allow-registration.description": "등록 가능 여부",
"admin.config.share.allow-unauthenticated-shares": "인증되지 않은 공유 허용", "admin.config.share.allow-unauthenticated-shares": "인증되지 않은 공유 허용",
"admin.config.share.allow-unauthenticated-shares.description": "인증되지 않은 사용자가 공유를 생성할 수 있는지 여부", "admin.config.share.allow-unauthenticated-shares.description": "인증되지 않은 사용자가 공유를 생성할 수 있는지 여부",
"admin.config.share.max-expiration": "최대 만료 시간", "admin.config.share.max-expiration": "최대 만료 시간",
"admin.config.share.max-expiration.description": "공유의 최대 만료 시간. 무제한 만료를 허용하려면 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": "최대 크기",
"admin.config.share.max-size.description": "공유의 최대 크기 (바이트)", "admin.config.share.max-size.description": "공유의 최대 크기",
"admin.config.share.zip-compression-level": "Zip 압축 레벨", "admin.config.share.zip-compression-level": "Zip 압축 레벨",
"admin.config.share.zip-compression-level.description": "파일 크기와 압축 속도 간의 균형을 맞추도록 레벨을 조정합니다. 유효한 값의 범위는 0에서 9까지이며, 0은 압축되지 않고 9는 최대 압축입니다. ", "admin.config.share.zip-compression-level.description": "파일 크기와 압축 속도 간의 균형을 맞추도록 레벨을 조정합니다. 유효한 값의 범위는 0에서 9까지이며, 0은 압축되지 않고 9는 최대 압축입니다. ",
"admin.config.share.chunk-size": "청크 크기", "admin.config.share.chunk-size": "청크 크기",
"admin.config.share.chunk-size.description": "업로드할 청크 크기(바이트 단위)를 조정하여 인터넷 연결에 따라 효율성과 신뢰성의 균형을 유지합니다. 더 작은 청크는 불안정한 연결에 대한 성공률을 향상시킬 수 있고, 더 큰 청크는 안정적인 연결에 대한 업로드 속도를 높일 수 있습니다.", "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": "공유 생성 창 자동 열기",
"admin.config.share.auto-open-share-modal.description": "사용자가 파일을 선택하면 공유 생성 창이 자동으로 나타나서 버튼을 수동으로 클릭할 필요가 없습니다.", "admin.config.share.auto-open-share-modal.description": "사용자가 파일을 선택하면 공유 생성 창이 자동으로 나타나서 버튼을 수동으로 클릭할 필요가 없습니다.",
"admin.config.smtp.enabled": "활성화됨", "admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "SMTP 사용 여부 SMTP 서버의 호스트, 포트, 전자 메일, 사용자 및 암호를 입력한 경우에만 true로 설정합니다.", "admin.config.smtp.enabled.description": "SMTP 사용 여부 SMTP 서버의 호스트, 포트, 전자 메일, 사용자 및 암호를 입력한 경우에만 true로 설정합니다.",
"admin.config.smtp.host": "호스트", "admin.config.smtp.host": "호스트",
"admin.config.smtp.host.description": "SMTP 서버의 호스트", "admin.config.smtp.host.description": "SMTP 서버의 호스트",
"admin.config.smtp.port": "포트", "admin.config.smtp.port": "포트",
"admin.config.smtp.port.description": "SMTP 서버 포트", "admin.config.smtp.port.description": "SMTP 서버 포트",
"admin.config.smtp.email": "이메일", "admin.config.smtp.email": "이메일",
"admin.config.smtp.email.description": "전자 메일을 보낸 전자 메일 주소", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "사용자 이름", "admin.config.smtp.username": "사용자 이름",
"admin.config.smtp.username.description": "SMTP 사용자 이름, 서버 비밀번호", "admin.config.smtp.username.description": "SMTP 사용자 이름, 서버 비밀번호",
"admin.config.smtp.password": "비밀번호", "admin.config.smtp.password": "비밀번호",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth 앱의 클라이언트 비밀", "admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth 앱의 클라이언트 비밀",
"admin.config.oauth.discord-enabled": "디스코드", "admin.config.oauth.discord-enabled": "디스코드",
"admin.config.oauth.discord-enabled.description": "Discord 로그인 활성화 여부", "admin.config.oauth.discord-enabled.description": "Discord 로그인 활성화 여부",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"admin.config.oauth.discord-limited-users.description": "Limit signing in to specific users by their Discord ID. Leave it blank to disable.",
"admin.config.oauth.discord-limited-guild": "디스코드 제한 서버 ID", "admin.config.oauth.discord-limited-guild": "디스코드 제한 서버 ID",
"admin.config.oauth.discord-limited-guild.description": "특정 서버의 사용자로 로그인을 제한합니다. 사용하지 않으려면 비워 둡니다.", "admin.config.oauth.discord-limited-guild.description": "특정 서버의 사용자로 로그인을 제한합니다. 사용하지 않으려면 비워 둡니다.",
"admin.config.oauth.discord-client-id": "디스코드 클라이언트 ID", "admin.config.oauth.discord-client-id": "디스코드 클라이언트 ID",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "OpenID Connect 로그인 사용 여부", "admin.config.oauth.oidc-enabled.description": "OpenID Connect 로그인 사용 여부",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app", "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": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID 토큰의 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", "admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID 클라이언트 secret", "admin.config.oauth.oidc-client-secret": "OpenID 클라이언트 secret",
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth 앱의 클라이언트 secret", "admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth 앱의 클라이언트 secret",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "이런, 이 페이지는 존재하지 않습니다.", "404.description": "이런, 이 페이지는 존재하지 않습니다.",
"404.button.home": "나를 집으로 데려다 줘", "404.button.home": "나를 집으로 데려다 줘",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "{0} 계정에 연결된 사용자가 없습니다.", "error.msg.no_user": "{0} 계정에 연결된 사용자가 없습니다.",
"error.msg.no_email": "이 {0} 계정에서 메일 주소를 가져올 수 없습니다.", "error.msg.no_email": "이 {0} 계정에서 메일 주소를 가져올 수 없습니다.",
"error.msg.already_linked": "이 {0} 계정은 이미 다른 계정에 연결되어 있습니다.", "error.msg.already_linked": "이 {0} 계정은 이미 다른 계정에 연결되어 있습니다.",
"error.msg.not_linked": " {0} 계정은 아직 어떤 계정에도 연결되지 않았습니다.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "이 {0} 계정은 확인되지 않았습니다. 확인 후 다시 시도하십시오.", "error.msg.unverified_account": "이 {0} 계정은 확인되지 않았습니다. 확인 후 다시 시도하십시오.",
"error.msg.user_not_allowed": "로그인할 수 없습니다.", "error.msg.user_not_allowed": "로그인할 수 없습니다.",
"error.msg.cannot_get_user_info": "이 {0} 계정에서 사용자 정보를 가져올 수 없습니다", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "깃허브", "error.param.provider_github": "깃허브",
"error.param.provider_google": "구글", "error.param.provider_google": "구글",
"error.param.provider_microsoft": "마이크로소프트", "error.param.provider_microsoft": "마이크로소프트",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "생성", "common.button.generate": "생성",
"common.button.done": "완료", "common.button.done": "완료",
"common.text.link": "링크", "common.text.link": "링크",
"common.text.navigate-to-link": "링크로 이동", "common.text.navigate-to-link": "Visit link",
"common.text.or": "또는", "common.text.or": "또는",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "뒤로 가기", "common.button.go-back": "뒤로 가기",
"common.button.go-home": "첫 페이지", "common.button.go-home": "첫 페이지",
"common.notify.copied": "당신의 링크가 클립보드에 복사되었습니다.", "common.notify.copied": "당신의 링크가 클립보드에 복사되었습니다.",
"common.notify.copied-link": "당신의 링크가 클립보드에 복사되었습니다.",
"common.success": "성공", "common.success": "성공",
"common.error": "에러", "common.error": "에러",
"common.error.unknown": "알 수 없는 오류가 발생했습니다.", "common.error.unknown": "알 수 없는 오류가 발생했습니다.",
"common.error.invalid-email": "이메일 주소가 틀립니다", "common.error.invalid-email": "이메일 주소가 틀립니다",
"common.error.too-short": "최소 {length} 자 이상이어야 합니다", "common.error.too-short": "최소 {length} 자 이상이어야 합니다",
"common.error.too-long": "최대 {length} 자 까지 입력가능합니다.", "common.error.too-long": "최대 {length} 자 까지 입력가능합니다.",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "{length} 자 이어야 합니다.", "common.error.exact-length": "{length} 자 이어야 합니다.",
"common.error.invalid-number": "숫자만 가능합니다.", "common.error.invalid-number": "숫자만 가능합니다.",
"common.error.field-required": "이 필드는 필수입니다" "common.error.field-required": "이 필드는 필수입니다"

View File

@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Zelfgehost", "home.bullet.a.name": "Zelfgehost",
"home.bullet.a.description": "Host Pingvin Share op uw eigen machine.", "home.bullet.a.description": "Host Pingvin Share op uw eigen machine.",
"home.bullet.b.name": "Privacy", "home.bullet.b.name": "Privacy",
"home.bullet.b.description": "Uw bestanden zijn van u en mogen nooit in handen komen van derden.", "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.name": "Geen vervelende limiet voor bestandsgrootte",
"home.bullet.c.description": "Upload zo grote bestanden als je wilt. Alleen je harde schijf is je limiet.", "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.start": "Aan de slag",
"home.button.source": "Broncode", "home.button.source": "Broncode",
// END / // END /
@@ -34,7 +34,7 @@ export default {
"signIn.notify.totp-required.title": "Tweestapsverificatie vereist", "signIn.notify.totp-required.title": "Tweestapsverificatie vereist",
"signIn.notify.totp-required.description": "Voer uw tweestapsverificatiecode in", "signIn.notify.totp-required.description": "Voer uw tweestapsverificatiecode in",
"signIn.oauth.or": "OF", "signIn.oauth.or": "OF",
"signIn.oauth.signInWith": "Sign in with", "signIn.oauth.signInWith": "Registreer met",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Wachtwoord vergeten?", "resetPassword.title": "Wachtwoord vergeten?",
"resetPassword.description": "Voer uw e-mailadres in om uw wachtwoord opnieuw in te stellen.", "resetPassword.description": "Voer uw e-mailadres in om uw wachtwoord opnieuw in te stellen.",
"resetPassword.notify.success": "Er is een bericht verzonden met een link om uw wachtwoord te resetten als het e-mail adres bestaat.", "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.button.back": "Terug naar login pagina",
"resetPassword.text.resetPassword": "Wachtwoord opnieuw instellen", "resetPassword.text.resetPassword": "Wachtwoord opnieuw instellen",
"resetPassword.text.enterNewPassword": "Voer uw nieuwe wachtwoord in", "resetPassword.text.enterNewPassword": "Voer uw nieuwe wachtwoord in",
"resetPassword.input.password": "Nieuw wachtwoord", "resetPassword.input.password": "Nieuw wachtwoord",
"resetPassword.notify.passwordReset": "Uw wachtwoord is met succes opnieuw ingesteld.", "resetPassword.notify.passwordReset": "Je wachtwoord is succesvol gereset.",
// /account // /account
"account.title": "Mijn account", "account.title": "Mijn account",
"account.card.info.title": "Accountinformatie", "account.card.info.title": "Accountinformatie",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Wachtwoord", "account.card.password.title": "Wachtwoord",
"account.card.password.old": "Oude wachtwoord", "account.card.password.old": "Oude wachtwoord",
"account.card.password.new": "Nieuw wachtwoord", "account.card.password.new": "Nieuw wachtwoord",
"account.card.password.noPasswordSet": "U hebt nog geen wachtwoord ingesteld. Stel deze eerst in als u via email wilt inloggen.", "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.notify.password.success": "Wachtwoord succesvol gewijzigd!",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Social login",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Ontkoppel", "account.card.oauth.unlink": "Ontkoppel",
"account.card.oauth.unlinked": "Niet-gekoppeld", "account.card.oauth.unlinked": "Niet-gekoppeld",
"account.modal.unlink.title": "Ontkoppel account", "account.modal.unlink.title": "Ontkoppel account",
"account.modal.unlink.description": "Het ontkoppelen van uw sociale accounts kan leiden tot verlies van uw account. Vergeet uw gebruikersnaam en wachtwoord niet.", "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.notify.oauth.unlinked.success": "Ontkoppelen succesvol",
"account.card.security.title": "Beveiliging", "account.card.security.title": "Beveiliging",
"account.card.security.totp.enable.description": "Voer uw huidige wachtwoord in om TOTP in te schakelen", "account.card.security.totp.enable.description": "Voer uw huidige wachtwoord in om TOTP in te schakelen",
@@ -122,11 +122,14 @@ export default {
"account.shares.table.description": "Beschrijving", "account.shares.table.description": "Beschrijving",
"account.shares.table.visitors": "Bezoekers", "account.shares.table.visitors": "Bezoekers",
"account.shares.table.expiresAt": "Verloopt op", "account.shares.table.expiresAt": "Verloopt op",
"account.shares.table.createdAt": "Aangemaakt op", "account.shares.table.createdAt": "Gemaakt op",
"account.shares.table.size": "Grootte", "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-informations": "Gegevens delen",
"account.shares.modal.share-link": "Deel link", "account.shares.modal.share-link": "Deel link",
"account.shares.modal.delete.title": "Verwijder share {share}", "account.shares.modal.delete.title": "Share verwijderd: {share}",
"account.shares.modal.delete.description": "Weet u zeker dat u deze share wilt verwijderen?", "account.shares.modal.delete.description": "Weet u zeker dat u deze share wilt verwijderen?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Jaar", "account.reverseShares.modal.expiration.year-singular": "Jaar",
"account.reverseShares.modal.expiration.year-plural": "Jaren", "account.reverseShares.modal.expiration.year-plural": "Jaren",
"account.reverseShares.modal.max-size.label": "Maximale share-grootte", "account.reverseShares.modal.max-size.label": "Maximale share-grootte",
"account.reverseShares.modal.send-email": "Stuur e-mailnotificatie", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "Stuur een e-mailnotificatie wanneer er bestanden zijn gedeeld via deze omgekeerde share link.", "account.reverseShares.modal.send-email.description": "Sends you an email notification when a share is created with this reverse share link.",
"account.reverseShares.modal.simplified": "Simple mode", "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 be able to customize only the name and description of the share.", "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": "Public access",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "Maximaal gebruikte keren", "account.reverseShares.modal.max-use.label": "Maximaal gebruikte keren",
"account.reverseShares.modal.max-use.description": "Maximale keren dat deze URL gebruikt kan worden om een share aan te maken.", "account.reverseShares.modal.max-use.description": "Maximale keren dat deze URL gebruikt kan worden om een share aan te maken.",
"account.reverseShare.never-expires": "Deze omgekeerde share zal nooit verlopen.", "account.reverseShare.never-expires": "Deze omgekeerde share zal nooit verlopen.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Gebruikersnaam", "admin.users.table.username": "Gebruikersnaam",
"admin.users.table.email": "E-mailadres", "admin.users.table.email": "E-mailadres",
"admin.users.table.admin": "Beheerder", "admin.users.table.admin": "Beheerder",
"admin.users.edit.update.title": "Gebruiker {username} bijwerken", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Beheerdersrechten", "admin.users.edit.update.admin-privileges": "Beheerdersrechten",
"admin.users.edit.update.change-password.title": "Wachtwoord wijzigen", "admin.users.edit.update.change-password.title": "Wachtwoord wijzigen",
"admin.users.edit.update.change-password.field": "Nieuw wachtwoord", "admin.users.edit.update.change-password.field": "Nieuw wachtwoord",
"admin.users.edit.update.change-password.button": "Nieuw wachtwoord opslaan", "admin.users.edit.update.change-password.button": "Nieuw wachtwoord opslaan",
"admin.users.edit.update.notify.password.success": "Wachtwoord succesvol gewijzigd", "admin.users.edit.update.notify.password.success": "Wachtwoord succesvol gewijzigd",
"admin.users.edit.delete.title": "Gebruiker {username} verwijderen", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Wilt u echt deze gebruiker en al zijn shares verwijderen?", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Gebruiker aanmaken", "admin.users.modal.create.title": "Gebruiker aanmaken",
"admin.users.modal.create.username": "Gebruikersnaam", "admin.users.modal.create.username": "Gebruikersnaam",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Auteur", "admin.shares.table.username": "Auteur",
"admin.shares.table.visitors": "Bezoekers", "admin.shares.table.visitors": "Bezoekers",
"admin.shares.table.expires": "Vervalt op", "admin.shares.table.expires": "Verloopt op",
"admin.shares.edit.delete.title": "Verwijder share {id}", "admin.shares.edit.delete.title": "Delete share: {id}",
"admin.shares.edit.delete.description": "Weet u zeker dat u deze share wilt verwijderen?", "admin.shares.edit.delete.description": "Weet u zeker dat u deze share wilt verwijderen?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Uploaden", "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.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.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 // Dropzone.tsx
"upload.dropzone.title": "Bestanden uploaden", "upload.dropzone.title": "Bestanden uploaden",
"upload.dropzone.description": "Sleep uw bestanden hier om uw share te beginnen. We kunnen alleen bestanden accepteren die kleiner zijn dan {maxSize} in totaal.", "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": "Uw bestanden overschrijden de maximale share-grootte van {maxSize}.", "upload.dropzone.notify.file-too-big": "Uw bestanden overschrijden de maximale share-grootte van {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Naam", "upload.filelist.name": "Naam",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "U bent niet aangemeld", "upload.modal.not-signed-in": "U bent niet aangemeld",
"upload.modal.not-signed-in-description": "Het is niet mogelijk uw gedeelde bestanden handmatig te verwijderen en het aantal bezoekers te bekijken.", "upload.modal.not-signed-in-description": "Het is niet mogelijk uw gedeelde bestanden handmatig te verwijderen en het aantal bezoekers te bekijken.",
"upload.modal.expires.never": "nooit", "upload.modal.expires.never": "nooit",
"upload.modal.expires.never-long": "Verloopt nooit", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "De maximale vervaldatum van {max} is overschreven.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Koppeling", "upload.modal.link.label": "Koppeling",
"upload.modal.expires.label": "Vervaldatum", "upload.modal.expires.label": "Vervaldatum",
"upload.modal.expires.minute-singular": "Minuut", "upload.modal.expires.minute-singular": "Minuut",
@@ -246,7 +252,7 @@ export default {
"upload.modal.expires.year-plural": "Jaren", "upload.modal.expires.year-plural": "Jaren",
"upload.modal.accordion.name-and-description.title": "Naam en beschrijving", "upload.modal.accordion.name-and-description.title": "Naam en beschrijving",
"upload.modal.accordion.name-and-description.name.placeholder": "Naam", "upload.modal.accordion.name-and-description.name.placeholder": "Naam",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share", "upload.modal.accordion.name-and-description.description.placeholder": "Opmerking voor de ontvangers van deze share",
"upload.modal.accordion.email.title": "E-mail van de ontvangers", "upload.modal.accordion.email.title": "E-mail van de ontvangers",
"upload.modal.accordion.email.placeholder": "Voer e-mail ontvangers in", "upload.modal.accordion.email.placeholder": "Voer e-mail ontvangers in",
"upload.modal.accordion.email.invalid-email": "Ongeldig e-mailadres", "upload.modal.accordion.email.invalid-email": "Ongeldig e-mailadres",
@@ -259,7 +265,7 @@ export default {
"upload.modal.completed.never-expires": "Deze omgekeerde share zal nooit verlopen.", "upload.modal.completed.never-expires": "Deze omgekeerde share zal nooit verlopen.",
"upload.modal.completed.expires-on": "Deze omgekeerde share verloopt op {expiration}.", "upload.modal.completed.expires-on": "Deze omgekeerde share verloopt op {expiration}.",
"upload.modal.completed.share-ready": "Share is gereed", "upload.modal.completed.share-ready": "Share is gereed",
"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": "We hebben de maker van de reverse share op de hoogte gesteld. U kunt deze link ook handmatig met hen delen via andere middelen.",
// END /upload // END /upload
// /share/[id] // /share/[id]
"share.title": "Share {shareId}", "share.title": "Share {shareId}",
@@ -270,18 +276,18 @@ export default {
"share.error.not-found.title": "Share niet gevonden", "share.error.not-found.title": "Share niet gevonden",
"share.error.not-found.description": "De share die u zoekt kan niet gevonden worden.", "share.error.not-found.description": "De share die u zoekt kan niet gevonden worden.",
"share.error.access-denied.title": "Private share", "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.description": "Dit account heeft geen toestemming om toegang te krijgen tot deze share",
"share.modal.password.title": "Wachtwoord vereist", "share.modal.password.title": "Wachtwoord vereist",
"share.modal.password.description": "Vul een wachtwoord in om toegang te krijgen tot deze share.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Wachtwoord", "share.modal.password": "Wachtwoord",
"share.modal.error.invalid-password": "Ongeldig wachtwoord", "share.modal.error.invalid-password": "Ongeldig wachtwoord",
"share.button.download-all": "Alles downloaden", "share.button.download-all": "Alles downloaden",
"share.notify.download-all-preparing": "De share word gebundeld. Probeer het over een paar minuten opnieuw.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "Link naar bestand", "share.modal.file-link": "Link naar bestand",
"share.table.name": "Naam", "share.table.name": "Naam",
"share.table.size": "Grootte", "share.table.size": "Grootte",
"share.modal.file-preview.error.not-supported.title": "Voorbeeld niet ondersteund", "share.modal.file-preview.error.not-supported.title": "Voorbeeld niet ondersteund",
"share.modal.file-preview.error.not-supported.description": "Een voorbeeld voor dit bestandstype wordt niet ondersteund. Download het bestand om het te bekijken.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "{shareId} bewerken", "share.edit.title": "{shareId} bewerken",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Er is een fout opgetreden tijdens het voltooien van uw share.", "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", "share.edit.notify.save-success": "Share is succesvol bijgewerkt",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Configuratie", "admin.config.title": "Configuratie",
"admin.config.category.general": "Algemeen", "admin.config.category.general": "Algemeen",
@@ -300,66 +312,70 @@ export default {
"admin.config.general.app-name.description": "Naam van de applicatie", "admin.config.general.app-name.description": "Naam van de applicatie",
"admin.config.general.app-url": "App-URL", "admin.config.general.app-url": "App-URL",
"admin.config.general.app-url.description": "De URL waar Pingvin Share bereikbaar is", "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": "Toon startpagina",
"admin.config.general.show-home-page.description": "Toon of verberg de home pagina", "admin.config.general.show-home-page.description": "Toon of verberg de home pagina",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Sessieduur",
"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": "Tijd in uren waarna een gebruiker zich opnieuw moet aanmelden (standaard: 3 maanden).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Verander uw logo door een nieuwe afbeelding te uploaden. De afbeelding moet PNG zijn en het formaat moet 1:1 hebben.", "admin.config.general.logo.description": "Verander uw logo door een nieuwe afbeelding te uploaden. De afbeelding moet PNG zijn en het formaat moet 1:1 hebben.",
"admin.config.general.logo.placeholder": "Afbeelding kiezen", "admin.config.general.logo.placeholder": "Afbeelding kiezen",
"admin.config.email.enable-share-email-recipients": "Voer e-mail ontvangers in", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Sta e-mails toe om de ontvangers de deel link te versturen. Schakel dit alleen in als je SMTP hebt ingeschakeld.", "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": "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-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": "Bericht voor ontvangers van de share",
"admin.config.email.share-recipients-message.description": "Bericht dat wordt verzonden naar de share ontvangers. Beschikbare variabelen:\n {creator} - De gebruikersnaam van de maker van de share\n {shareUrl} - De URL van de share\n {desc} - De beschrijving van de share\n {expires} - De vervaldatum van de share\n De variabelen worden vervangen door hun werkelijke waarde bij verzending.", "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": "Omgekeerde share email onderwerp",
"admin.config.email.reverse-share-subject.description": "Het onderwerp van de e-mail die wordt verzonden wanneer iemand een share heeft gemaakt met uw omgekeerde share link.", "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", "admin.config.email.reverse-share-message": "Omgekeerde share-bericht",
"admin.config.email.reverse-share-message.description": "Het bericht dat wordt verzonden wanneer iemand een share heeft aangemaakt via de omgekeerde share-link. {shareUrl} zal worden vervangen door de naam van de maker en de URL van de share.", "admin.config.email.reverse-share-message.description": "Het bericht dat wordt verzonden wanneer iemand een share heeft aangemaakt via de omgekeerde share-link. {shareUrl} zal worden vervangen door de naam van de maker en de URL van de share.",
"admin.config.email.reset-password-subject": "E-mailonderwerp voor wachtwoordherstel", "admin.config.email.reset-password-subject": "E-mailonderwerp voor wachtwoordherstel",
"admin.config.email.reset-password-subject.description": "Het onderwerp van de e-mail die wordt verzonden wanneer een gebruiker een wachtwoordherstel aanvraagt.", "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": "Bericht voor wachtwoordherstel", "admin.config.email.reset-password-message": "Bericht voor wachtwoordherstel",
"admin.config.email.reset-password-message.description": "Bericht dat wordt verzonden wanneer een gebruiker een wachtwoordherstel aanvraagt. {url} zal worden vervangen door de wachtwoordherstel-URL.", "admin.config.email.reset-password-message.description": "Bericht dat wordt verzonden wanneer een gebruiker een wachtwoordherstel aanvraagt. {url} zal worden vervangen door de wachtwoordherstel-URL.",
"admin.config.email.invite-subject": "Onderwerp voor uitnodiging", "admin.config.email.invite-subject": "Onderwerp voor uitnodiging",
"admin.config.email.invite-subject.description": "Onderwerp van de e-mail die wordt verzonden wanneer een beheerder een gebruiker uitnodigt.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Bericht voor uitnodiging", "admin.config.email.invite-message": "Bericht voor uitnodiging",
"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 password of the user.", "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": "Sta registratie toe", "admin.config.share.allow-registration": "Sta registratie toe",
"admin.config.share.allow-registration.description": "Of registratie is toegestaan", "admin.config.share.allow-registration.description": "Of registratie is toegestaan",
"admin.config.share.allow-unauthenticated-shares": "Ongeverifieerde shares toestaan", "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.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": "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": "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": "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.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": "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 speed up uploads for stable connections.", "admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "Inschakelen", "admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "Of SMTP is ingeschakeld. Stel dit alleen in op true als u de host hebt ingevoerd, poort, e-mail, gebruiker en wachtwoord van uw SMTP-server.", "admin.config.smtp.enabled.description": "Of SMTP is ingeschakeld. Stel dit alleen in op true als u de host hebt ingevoerd, poort, e-mail, gebruiker en wachtwoord van uw SMTP-server.",
"admin.config.smtp.host": "Host", "admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "Host van de SMTP-server", "admin.config.smtp.host.description": "Host van de SMTP-server",
"admin.config.smtp.port": "Poort", "admin.config.smtp.port": "Poort",
"admin.config.smtp.port.description": "Poort van de SMTP-server", "admin.config.smtp.port.description": "Poort van de SMTP-server",
"admin.config.smtp.email": "E-mail", "admin.config.smtp.email": "E-mail",
"admin.config.smtp.email.description": "E-mailadres waar de e-mails van worden verzonden", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Gebruikersnaam", "admin.config.smtp.username": "Gebruikersnaam",
"admin.config.smtp.username.description": "Gebruikersnaam van de SMTP-server", "admin.config.smtp.username.description": "Gebruikersnaam van de SMTP-server",
"admin.config.smtp.password": "Wachtwoord", "admin.config.smtp.password": "Wachtwoord",
"admin.config.smtp.password.description": "Wachtwoord van de SMTP-server", "admin.config.smtp.password.description": "Wachtwoord van de SMTP-server",
"admin.config.smtp.button.test": "Teste-mail verzenden", "admin.config.smtp.button.test": "Teste-mail verzenden",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates", "admin.config.smtp.allow-unauthorized-certificates": "Vertrouw ongeautoriseerde SMTP-servercertificaten",
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.", "admin.config.smtp.allow-unauthorized-certificates.description": "Zet dit alleen aan als je de self signed certificates vertrouwt.",
"admin.config.oauth.allow-registration": "Sta registratie toe", "admin.config.oauth.allow-registration": "Sta registratie toe",
"admin.config.oauth.allow-registration.description": "Gebruikers toestaan zich te registreren via sociale login", "admin.config.oauth.allow-registration.description": "Gebruikers toestaan zich te registreren via sociale login",
"admin.config.oauth.ignore-totp": "TOTP negeren", "admin.config.oauth.ignore-totp": "TOTP negeren",
"admin.config.oauth.ignore-totp.description": "TOTP negeren wanneer gebruiker sociale login gebruikt", "admin.config.oauth.ignore-totp.description": "TOTP negeren wanneer gebruiker sociale login gebruikt",
"admin.config.oauth.disable-password": "Disable password login", "admin.config.oauth.disable-password": "Zet password login uit",
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.", "admin.config.oauth.disable-password.description": "Of password login moet worden uitgeschakeld\nZorg ervoor dat een OAuth-provider correct is geconfigureerd voordat u deze configuratie activeert om te voorkomen dat u wordt buitengesloten.",
"admin.config.oauth.github-enabled": "GitHub", "admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Ofdat GitHub login is ingeschakeld", "admin.config.oauth.github-enabled.description": "Ofdat GitHub login is ingeschakeld",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "GitHub Client ID",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Client-secret van de Microsoft OAuth app", "admin.config.oauth.microsoft-client-secret.description": "Client-secret van de Microsoft OAuth app",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Ofdat discord login is ingeschakeld", "admin.config.oauth.discord-enabled.description": "Ofdat discord login is ingeschakeld",
"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 beperkte server ID", "admin.config.oauth.discord-limited-guild": "Discord beperkte server ID",
"admin.config.oauth.discord-limited-guild.description": "Beperk het inloggen tot gebruikers in een specifieke server. Laat leeg om uit te schakelen.", "admin.config.oauth.discord-limited-guild.description": "Beperk het inloggen tot gebruikers in een specifieke server. Laat leeg om uit te schakelen.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord Client ID",
@@ -392,33 +410,70 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Ofdat OpenID Connect login is ingeschakeld", "admin.config.oauth.oidc-enabled.description": "Ofdat OpenID Connect login is ingeschakeld",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI van de OpenID Connect OAuth app", "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": "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-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", "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-path.description": "Moet een geldig JMES-pad zijn dat verwijst naar een reeks rollen. " + "Het beheren van toegangsrechten met behulp van OpenID Connect-rollen wordt alleen aanbevolen als er geen andere identiteitsprovider is geconfigureerd en wachtwoordaanmelding is uitgeschakeld. " + "Laat dit leeg als u niet weet wat deze configuratie is.",
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access", "admin.config.oauth.oidc-role-general-access": "OpenID Connect role voor algemene toegang",
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a users roles for them to log in. " + "Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-role-general-access.description": "Rol vereist voor algemene toegang. Moet aanwezig zijn in de rollen van een gebruiker om in te loggen. " + "Laat het leeg als u niet weet wat deze configuratie is.",
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access", "admin.config.oauth.oidc-role-admin-access": "OpenID Connect role voor admin toegang",
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a users roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.", "admin.config.oauth.oidc-role-admin-access.description": "Rol vereist voor administratieve toegang. Moet aanwezig zijn in de rollen van een gebruiker om toegang te krijgen tot het admin-paneel. " + "Laat dit leeg als u niet weet wat deze configuratie is.",
"admin.config.oauth.oidc-client-id": "Client-ID OpenID Connect", "admin.config.oauth.oidc-client-id": "Client-ID OpenID Connect",
"admin.config.oauth.oidc-client-id.description": "Client-ID van de OpenID Connect OAuth app", "admin.config.oauth.oidc-client-id.description": "Client-ID van de OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret van de OpenID Connect OAuth app", "admin.config.oauth.oidc-client-secret.description": "Client secret van de OpenID Connect OAuth app",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Gebruik LDAP authentication voor gebruiker login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL van de LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin groep",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Groep vereist voor administratieve toegang.",
"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.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.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
"404.description": "Oeps, deze pagina bestaat niet.", "404.description": "Oeps, deze pagina bestaat niet.",
"404.button.home": "Breng me terug naar huis", "404.button.home": "Breng me terug naar huis",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "De gekoppelde gebruiker aan {0} account bestaat niet.", "error.msg.no_user": "De gekoppelde gebruiker aan {0} account bestaat niet.",
"error.msg.no_email": "Kan geen e-mailadres ophalen van dit {0} account.", "error.msg.no_email": "Kan geen e-mailadres ophalen van dit {0} account.",
"error.msg.already_linked": "Dit {0} account is al gekoppeld aan een ander account.", "error.msg.already_linked": "Dit {0} account is al gekoppeld aan een ander account.",
"error.msg.not_linked": "Dit {0} account is nog aan geen enkel account gekoppeld.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "Dit {0} account is nog niet geverifieerd, probeer het opnieuw na de verificatie.", "error.msg.unverified_account": "Dit {0} account is nog niet geverifieerd, probeer het opnieuw na de verificatie.",
"error.msg.user_not_allowed": "U heeft geen toestemming om in te loggen.", "error.msg.user_not_allowed": "U heeft geen toestemming om in te loggen.",
"error.msg.cannot_get_user_info": "Kan uw gebruikersgegevens van dit {0} account niet ophalen.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Genereren", "common.button.generate": "Genereren",
"common.button.done": "Voltooid", "common.button.done": "Voltooid",
"common.text.link": "Koppeling", "common.text.link": "Koppeling",
"common.text.navigate-to-link": "Ga naar de koppeling", "common.text.navigate-to-link": "Visit link",
"common.text.or": "of", "common.text.or": "of",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Ga terug", "common.button.go-back": "Ga terug",
"common.button.go-home": "Go home", "common.button.go-home": "Go home",
"common.notify.copied": "Uw link is gekopieerd naar het klembord", "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.success": "Succes",
"common.error": "Fout", "common.error": "Fout",
"common.error.unknown": "Er is een onbekende fout opgetreden", "common.error.unknown": "Er is een onbekende fout opgetreden",
"common.error.invalid-email": "Ongeldig e-mailadres", "common.error.invalid-email": "Ongeldig e-mailadres",
"common.error.too-short": "Moet ten minste {length} tekens bevatten", "common.error.too-short": "Moet ten minste {length} tekens bevatten",
"common.error.too-long": "Moet maximaal {length} tekens bevatten", "common.error.too-long": "Moet maximaal {length} tekens bevatten",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Moet precies {length} tekens bevatten", "common.error.exact-length": "Moet precies {length} tekens bevatten",
"common.error.invalid-number": "Moet een getal zijn", "common.error.invalid-number": "Moet een getal zijn",
"common.error.field-required": "Dit veld is verplicht" "common.error.field-required": "Dit veld is verplicht"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Prześlij", "navbar.upload": "Prześlij",
"navbar.signin": "Zaloguj się", "navbar.signin": "Zaloguj się",
"navbar.home": "Strona główna", "navbar.home": "Strona główna",
"navbar.signup": "Zarejestruj się", "navbar.signup": "Sign up",
"navbar.links.shares": "Moje udziały", "navbar.links.shares": "Moje udziały",
"navbar.links.reverse": "Udziały odwrotne", "navbar.links.reverse": "Udziały odwrotne",
"navbar.avatar.account": "Moje konto", "navbar.avatar.account": "Moje konto",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Samodzielnie Utrzymywana", "home.bullet.a.name": "Samodzielnie Utrzymywana",
"home.bullet.a.description": "Utrzymuj Pingvin Share na własnym serwerze.", "home.bullet.a.description": "Utrzymuj Pingvin Share na własnym serwerze.",
"home.bullet.b.name": "Prywatność", "home.bullet.b.name": "Prywatność",
"home.bullet.b.description": "To są twoje pliki i nigdy nie powinny trafiać w ręce osób trzecich.", "home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "Brak irytującego ograniczenia rozmiaru pliku", "home.bullet.c.name": "Brak irytującego ograniczenia rozmiaru pliku",
"home.bullet.c.description": "Prześlij tak duże pliki, jak chcesz. Ograniczeniem będzie tylko twój dysk twardy.", "home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Zaczynajmy", "home.button.start": "Zaczynajmy",
"home.button.source": "Kod źródłowy", "home.button.source": "Kod źródłowy",
// END / // END /
@@ -34,7 +34,7 @@ export default {
"signIn.notify.totp-required.title": "Wymagane jest uwierzytelnianie dwuetapowe", "signIn.notify.totp-required.title": "Wymagane jest uwierzytelnianie dwuetapowe",
"signIn.notify.totp-required.description": "Wprowadź kod uwierzytelniania dwuetapowego", "signIn.notify.totp-required.description": "Wprowadź kod uwierzytelniania dwuetapowego",
"signIn.oauth.or": "LUB", "signIn.oauth.or": "LUB",
"signIn.oauth.signInWith": "Sign in with", "signIn.oauth.signInWith": "Zaloguj się przez",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Nie pamiętasz hasła?", "resetPassword.title": "Nie pamiętasz hasła?",
"resetPassword.description": "Wprowadź swój e-mail, aby zresetować swoje hasło.", "resetPassword.description": "Wprowadź swój e-mail, aby zresetować swoje hasło.",
"resetPassword.notify.success": "Jeśli e-mail istnieje, to została wysłana wiadomość z linkiem do zresetowania hasła.", "resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "Powrót do strony logowania", "resetPassword.button.back": "Powrót do strony logowania",
"resetPassword.text.resetPassword": "Resetuj hasło", "resetPassword.text.resetPassword": "Resetuj hasło",
"resetPassword.text.enterNewPassword": "Wprowadź nowe hasło", "resetPassword.text.enterNewPassword": "Wprowadź nowe hasło",
"resetPassword.input.password": "Nowe hasło", "resetPassword.input.password": "Nowe hasło",
"resetPassword.notify.passwordReset": "Hasło zostało pomyślnie zresetowane.", "resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account // /account
"account.title": "Moje konto", "account.title": "Moje konto",
"account.card.info.title": "Informacje o koncie", "account.card.info.title": "Informacje o koncie",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Hasło", "account.card.password.title": "Hasło",
"account.card.password.old": "Dotychczasowe hasło", "account.card.password.old": "Dotychczasowe hasło",
"account.card.password.new": "Nowe hasło", "account.card.password.new": "Nowe hasło",
"account.card.password.noPasswordSet": "Nie masz ustawionego hasła. Jeśli chcesz zalogować się za pomocą adresu e-mail i hasła, musisz ustawić hasło.", "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": "Hasło zostało pomyślnie zmienione", "account.notify.password.success": "Hasło zostało pomyślnie zmienione",
"account.card.oauth.title": "Logowanie za pomocą konta społecznościowego", "account.card.oauth.title": "Logowanie za pomocą konta społecznościowego",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Odłącz", "account.card.oauth.unlink": "Odłącz",
"account.card.oauth.unlinked": "Rozłączono", "account.card.oauth.unlinked": "Rozłączono",
"account.modal.unlink.title": "Odłącz konto", "account.modal.unlink.title": "Odłącz konto",
"account.modal.unlink.description": "Odłączenie kont społecznościowych, jeśli nie pamiętasz nazwy użytkownika i hasła, może spowodować utratę konta.", "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": "Odłączono pomyślnie", "account.notify.oauth.unlinked.success": "Odłączono pomyślnie",
"account.card.security.title": "Zabezpieczenia", "account.card.security.title": "Zabezpieczenia",
"account.card.security.totp.enable.description": "Wprowadź aktualne hasło, aby móc włączyć TOTP", "account.card.security.totp.enable.description": "Wprowadź aktualne hasło, aby móc włączyć TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Nazwa", "account.shares.table.name": "Nazwa",
"account.shares.table.description": "Opis", "account.shares.table.description": "Opis",
"account.shares.table.visitors": "Odwiedzający", "account.shares.table.visitors": "Odwiedzający",
"account.shares.table.expiresAt": "Wygasa", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Utworzono", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Rozmiar", "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-informations": "Informacje udziału",
"account.shares.modal.share-link": "Udostępnij link", "account.shares.modal.share-link": "Udostępnij link",
"account.shares.modal.delete.title": "Usuń udostępnianie {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Czy na pewno chcesz usunąć to udostępnianie?", "account.shares.modal.delete.description": "Czy na pewno chcesz usunąć to udostępnianie?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Rok", "account.reverseShares.modal.expiration.year-singular": "Rok",
"account.reverseShares.modal.expiration.year-plural": "Lata/lat", "account.reverseShares.modal.expiration.year-plural": "Lata/lat",
"account.reverseShares.modal.max-size.label": "Maksymalny rozmiar udziału", "account.reverseShares.modal.max-size.label": "Maksymalny rozmiar udziału",
"account.reverseShares.modal.send-email": "Wysyłanie powiadomienia e-mail", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "Wyślij powiadomienie e-mail, gdy udostępnianie zostanie utworzone za pomocą linku udostępniania odwrotnego.", "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": "Tryb uproszczony",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.", "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": "Dostęp publiczny",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "Limit użyć", "account.reverseShares.modal.max-use.label": "Limit użyć",
"account.reverseShares.modal.max-use.description": "Maksymalna ilość razy, kiedy ten adres URL może być użyty do utworzenia udostępniania.", "account.reverseShares.modal.max-use.description": "Maksymalna ilość razy, kiedy ten adres URL może być użyty do utworzenia udostępniania.",
"account.reverseShare.never-expires": "To udostępnienie odwrotne nigdy nie wygasa.", "account.reverseShare.never-expires": "To udostępnienie odwrotne nigdy nie wygasa.",
@@ -174,7 +177,7 @@ export default {
// /admin // /admin
"admin.title": "Administracja", "admin.title": "Administracja",
"admin.button.users": "Zarządzanie użytkownikami", "admin.button.users": "Zarządzanie użytkownikami",
"admin.button.shares": "Share management", "admin.button.shares": "Zarządzanie udostępnieniami",
"admin.button.config": "Konfiguracja", "admin.button.config": "Konfiguracja",
"admin.version": "Wersja", "admin.version": "Wersja",
// END /admin // END /admin
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Nazwa użytkownika", "admin.users.table.username": "Nazwa użytkownika",
"admin.users.table.email": "Adres e-mail", "admin.users.table.email": "Adres e-mail",
"admin.users.table.admin": "Administrator", "admin.users.table.admin": "Administrator",
"admin.users.edit.update.title": "Zaktualizuj użytkownika {username}", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Uprawnienia administratora", "admin.users.edit.update.admin-privileges": "Uprawnienia administratora",
"admin.users.edit.update.change-password.title": "Zmień hasło", "admin.users.edit.update.change-password.title": "Zmień hasło",
"admin.users.edit.update.change-password.field": "Nowe hasło", "admin.users.edit.update.change-password.field": "Nowe hasło",
"admin.users.edit.update.change-password.button": "Zapisz nowe hasło", "admin.users.edit.update.change-password.button": "Zapisz nowe hasło",
"admin.users.edit.update.notify.password.success": "Hasło pomyślnie zmienione", "admin.users.edit.update.notify.password.success": "Hasło pomyślnie zmienione",
"admin.users.edit.delete.title": "Usuń użytkownika {username}", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Czy na pewno chcesz usunąć tego użytkownika i wszystkie jego udziały?", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Utwórz użytkownika", "admin.users.modal.create.title": "Utwórz użytkownika",
"admin.users.modal.create.username": "Nazwa użytkownika", "admin.users.modal.create.username": "Nazwa użytkownika",
@@ -202,21 +205,24 @@ export default {
"admin.users.modal.create.admin.description": "Jeśli zaznaczone, użytkownik będzie miał dostęp do panelu administratora.", "admin.users.modal.create.admin.description": "Jeśli zaznaczone, użytkownik będzie miał dostęp do panelu administratora.",
// END /admin/users // END /admin/users
// /admin/shares // /admin/shares
"admin.shares.title": "Share management", "admin.shares.title": "Zarządzanie udostępnieniami",
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "ID Udostępnienia",
"admin.shares.table.username": "Creator", "admin.shares.table.username": "Twórca",
"admin.shares.table.visitors": "Visitors", "admin.shares.table.visitors": "Odwiedzający",
"admin.shares.table.expires": "Expires At", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share {id}", "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": "Czy na pewno chcesz usunąć to udostępnienie?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Prześlij", "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.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.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 // Dropzone.tsx
"upload.dropzone.title": "Prześlij pliki", "upload.dropzone.title": "Prześlij pliki",
"upload.dropzone.description": "Przeciągnij i upuść pliki tutaj, aby rozpocząć udostępnianie. Możemy zaakceptować tylko pliki mniejsze niż {maxSize}.", "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": "Twoje pliki przekraczają maksymalny rozmiar {maxSize}.", "upload.dropzone.notify.file-too-big": "Twoje pliki przekraczają maksymalny rozmiar {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Nazwa", "upload.filelist.name": "Nazwa",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Nie jesteś zalogowany/a", "upload.modal.not-signed-in": "Nie jesteś zalogowany/a",
"upload.modal.not-signed-in-description": "Nie możesz ręcznie usunąć swojego udziału ani wyświetlić licznika odwiedzających.", "upload.modal.not-signed-in-description": "Nie możesz ręcznie usunąć swojego udziału ani wyświetlić licznika odwiedzających.",
"upload.modal.expires.never": "nigdy", "upload.modal.expires.never": "nigdy",
"upload.modal.expires.never-long": "Nigdy nie wygasa", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Termin ważności przekracza maksymalną datę wygaśnięcia {max}.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Link", "upload.modal.link.label": "Link",
"upload.modal.expires.label": "Wygasanie", "upload.modal.expires.label": "Wygasanie",
"upload.modal.expires.minute-singular": "Minuta", "upload.modal.expires.minute-singular": "Minuta",
@@ -244,9 +250,9 @@ export default {
"upload.modal.expires.month-plural": "Miesiące/ęcy", "upload.modal.expires.month-plural": "Miesiące/ęcy",
"upload.modal.expires.year-singular": "Rok", "upload.modal.expires.year-singular": "Rok",
"upload.modal.expires.year-plural": "Lat/a", "upload.modal.expires.year-plural": "Lat/a",
"upload.modal.accordion.name-and-description.title": "Name and description", "upload.modal.accordion.name-and-description.title": "Nazwa i opis",
"upload.modal.accordion.name-and-description.name.placeholder": "Name", "upload.modal.accordion.name-and-description.name.placeholder": "Nazwa",
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share", "upload.modal.accordion.name-and-description.description.placeholder": "Notatka dla odbiorców",
"upload.modal.accordion.email.title": "Odbiorcy wiadomości e-mail", "upload.modal.accordion.email.title": "Odbiorcy wiadomości e-mail",
"upload.modal.accordion.email.placeholder": "Wprowadź adresatów wiadomości e-mail", "upload.modal.accordion.email.placeholder": "Wprowadź adresatów wiadomości e-mail",
"upload.modal.accordion.email.invalid-email": "Adres e-mail jest nieprawidłowy", "upload.modal.accordion.email.invalid-email": "Adres e-mail jest nieprawidłowy",
@@ -259,7 +265,7 @@ export default {
"upload.modal.completed.never-expires": "To udostępnienie nigdy nie wygaśnie.", "upload.modal.completed.never-expires": "To udostępnienie nigdy nie wygaśnie.",
"upload.modal.completed.expires-on": "To udostępnienie wygaśnie dnia {expiration}.", "upload.modal.completed.expires-on": "To udostępnienie wygaśnie dnia {expiration}.",
"upload.modal.completed.share-ready": "Udostępnianie gotowe", "upload.modal.completed.share-ready": "Udostępnianie gotowe",
"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": "Powiadomiliśmy twórcę odwrotnego udostępnienia. Możesz również ręcznie udostępnić ten link w inny sposób.",
// END /upload // END /upload
// /share/[id] // /share/[id]
"share.title": "Udostępnij {shareId}", "share.title": "Udostępnij {shareId}",
@@ -269,19 +275,19 @@ export default {
"share.error.removed.title": "Udostępnianie usunięte", "share.error.removed.title": "Udostępnianie usunięte",
"share.error.not-found.title": "Nie znaleziono udziału", "share.error.not-found.title": "Nie znaleziono udziału",
"share.error.not-found.description": "Udział, który szukasz, nie istnieje.", "share.error.not-found.description": "Udział, który szukasz, nie istnieje.",
"share.error.access-denied.title": "Private share", "share.error.access-denied.title": "Prywatne udostępnienie",
"share.error.access-denied.description": "The current account does not have permission to access this share", "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.title": "Wymagane hasło",
"share.modal.password.description": "Aby uzyskać dostęp do tego udziału, wprowadź hasło.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Hasło", "share.modal.password": "Hasło",
"share.modal.error.invalid-password": "Hasło jest nieprawidłowe", "share.modal.error.invalid-password": "Hasło jest nieprawidłowe",
"share.button.download-all": "Pobierz wszystko", "share.button.download-all": "Pobierz wszystko",
"share.notify.download-all-preparing": "Udostępnianie jest przygotowywane. Spróbuj ponownie za kilka minut.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "Link do pliku", "share.modal.file-link": "Link do pliku",
"share.table.name": "Nazwa", "share.table.name": "Nazwa",
"share.table.size": "Rozmiar", "share.table.size": "Rozmiar",
"share.modal.file-preview.error.not-supported.title": "Podgląd nie jest obsługiwany", "share.modal.file-preview.error.not-supported.title": "Podgląd nie jest obsługiwany",
"share.modal.file-preview.error.not-supported.description": "Podgląd dla tego typu pliku nie jest obsługiwany. Pobierz plik, aby go zobaczyć.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Edytuj {shareId}", "share.edit.title": "Edytuj {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "W trakcie zakańczania tworzenia udziału wystąpił błąd.", "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", "share.edit.notify.save-success": "Udział zaktualizowany pomyślnie",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Konfiguracja", "admin.config.title": "Konfiguracja",
"admin.config.category.general": "Ogólne", "admin.config.category.general": "Ogólne",
@@ -300,53 +312,57 @@ export default {
"admin.config.general.app-name.description": "Nazwa aplikacji", "admin.config.general.app-name.description": "Nazwa aplikacji",
"admin.config.general.app-url": "Adres URL 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.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": "Pokaż stronę główną",
"admin.config.general.show-home-page.description": "Czy wyświetlać stronę główną", "admin.config.general.show-home-page.description": "Czy wyświetlać stronę główną",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Czas trwania sesji",
"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": "Czas w godzinach, po którym użytkownik musi zalogować się ponownie (domyślnie: 3 miesiące).",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Zmień logo, przesyłając nowy obraz. Obraz musi być plikiem PNG i mieć proporcje 1:1.", "admin.config.general.logo.description": "Zmień logo, przesyłając nowy obraz. Obraz musi być plikiem PNG i mieć proporcje 1:1.",
"admin.config.general.logo.placeholder": "Wybierz obraz", "admin.config.general.logo.placeholder": "Wybierz obraz",
"admin.config.email.enable-share-email-recipients": "Włącz adresatów wiadomości e-mail dla udziału", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Czy zezwolić na wysyłanie e-maili do adresatów udziału? Włącz to tylko wtedy, gdy włączyłeś SMTP.", "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": "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-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": "Wiadomość dla odbiorców udziału",
"admin.config.email.share-recipients-message.description": "Wiadomość, która zostanie wysłana do odbiorców udziału. Dostępne zmienne:\n {creator} - Nazwa użytkownika twórcy udziału\n {shareUrl} - Adres URL udziału\n {desc} - Opis udziału\n {expires} - Data wygaśnięcia udziału\n Zmienne zostaną zastąpione rzeczywistą wartością.", "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": "Temat udziału odwrotnego",
"admin.config.email.reverse-share-subject.description": "Temat wiadomości e-mail, która zostanie wysłana, gdy ktoś utworzy udostępnienie za pomocą linku 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", "admin.config.email.reverse-share-message": "Wiadomość udziału odwrotnego",
"admin.config.email.reverse-share-message.description": "Wiadomość, która zostanie wysłana, gdy ktoś utworzy udział za pomocą twojego linku udziału odwrotnego. {shareUrl} zostanie zastąpiony nazwą twórcy i adresem URL udziału.", "admin.config.email.reverse-share-message.description": "Wiadomość, która zostanie wysłana, gdy ktoś utworzy udział za pomocą twojego linku udziału odwrotnego. {shareUrl} zostanie zastąpiony nazwą twórcy i adresem URL udziału.",
"admin.config.email.reset-password-subject": "Temat resetowania hasła", "admin.config.email.reset-password-subject": "Temat resetowania hasła",
"admin.config.email.reset-password-subject.description": "Temat wiadomości e-mail, która zostanie wysłana, gdy użytkownik zażąda zresetowania hasł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-message": "Wiadomość resetowania hasła", "admin.config.email.reset-password-message": "Wiadomość resetowania hasła",
"admin.config.email.reset-password-message.description": "Wiadomość, która zostanie wysłana, gdy użytkownik zażąda zresetowania hasła. {url} zostanie zastąpiony adresem URL resetowania hasła.", "admin.config.email.reset-password-message.description": "Wiadomość, która zostanie wysłana, gdy użytkownik zażąda zresetowania hasła. {url} zostanie zastąpiony adresem URL resetowania hasła.",
"admin.config.email.invite-subject": "Temat zaproszenia", "admin.config.email.invite-subject": "Temat zaproszenia",
"admin.config.email.invite-subject.description": "Temat wiadomości e-mail, która zostanie wysłana, gdy administrator zaprasza użytkownika.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Wiadomość zaproszenia", "admin.config.email.invite-message": "Wiadomość zaproszenia",
"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 password of the user.", "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": "Zezwól na rejestrację", "admin.config.share.allow-registration": "Zezwól na rejestrację",
"admin.config.share.allow-registration.description": "Czy dozwolona jest rejestracja", "admin.config.share.allow-registration.description": "Czy dozwolona jest rejestracja",
"admin.config.share.allow-unauthenticated-shares": "Zezwalaj na nieuwierzytelnione udostępnianie", "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.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": "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": "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": "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.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": "Chunk size", "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 speed up uploads for stable connections.", "admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "Włączony", "admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "Czy SMTP ma zostać włączony. Ustaw to, tylko jeśli wprowadziłeś host, port, e-mail, nazwę użytkownika i hasło serwera SMTP.", "admin.config.smtp.enabled.description": "Czy SMTP ma zostać włączony. Ustaw to, tylko jeśli wprowadziłeś host, port, e-mail, nazwę użytkownika i hasło serwera SMTP.",
"admin.config.smtp.host": "Host", "admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "Host serwera SMTP", "admin.config.smtp.host.description": "Host serwera SMTP",
"admin.config.smtp.port": "Numer portu", "admin.config.smtp.port": "Numer portu",
"admin.config.smtp.port.description": "Numer portu serwera SMTP", "admin.config.smtp.port.description": "Numer portu serwera SMTP",
"admin.config.smtp.email": "Adres e-mail", "admin.config.smtp.email": "Adres e-mail",
"admin.config.smtp.email.description": "Adres e-mail, z którego e-maile są wysyłane", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Nazwa użytkownika", "admin.config.smtp.username": "Nazwa użytkownika",
"admin.config.smtp.username.description": "Nazwa użytkownika serwera SMTP", "admin.config.smtp.username.description": "Nazwa użytkownika serwera SMTP",
"admin.config.smtp.password": "Hasło", "admin.config.smtp.password": "Hasło",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Sekret klienta aplikacji Microsoft OAuth", "admin.config.oauth.microsoft-client-secret.description": "Sekret klienta aplikacji Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Czy jest włączony login na Discord", "admin.config.oauth.discord-enabled.description": "Czy jest włączony login na 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": "ID ograniczonego serwera Discord", "admin.config.oauth.discord-limited-guild": "ID ograniczonego serwera Discord",
"admin.config.oauth.discord-limited-guild.description": "Ogranicz logowanie do użytkowników na określonym serwerze. Pozostaw puste, aby wyłączyć.", "admin.config.oauth.discord-limited-guild.description": "Ogranicz logowanie do użytkowników na określonym serwerze. Pozostaw puste, aby wyłączyć.",
"admin.config.oauth.discord-client-id": "ID klienta Discord", "admin.config.oauth.discord-client-id": "ID klienta Discord",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Czy jest włączony login OpenID Connect", "admin.config.oauth.oidc-enabled.description": "Czy jest włączony login OpenID Connect",
"admin.config.oauth.oidc-discovery-uri": "Wykrywanie URI OpenID Connect", "admin.config.oauth.oidc-discovery-uri": "Wykrywanie URI OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect", "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": "Żą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-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", "admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "Sekret klienta OpenID Connect", "admin.config.oauth.oidc-client-secret": "Sekret klienta OpenID Connect",
"admin.config.oauth.oidc-client-secret.description": "Sekret klienta OAuth aplikacji OpenID Connect", "admin.config.oauth.oidc-client-secret.description": "Sekret klienta OAuth aplikacji OpenID Connect",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "Ups! Ta strona nie istnieje.", "404.description": "Ups! Ta strona nie istnieje.",
"404.button.home": "Wróć do strony domowej", "404.button.home": "Wróć do strony domowej",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "Użytkownik powiązany z tym kontem {0} nie istnieje.", "error.msg.no_user": "Użytkownik powiązany z tym kontem {0} nie istnieje.",
"error.msg.no_email": "Nie można pobrać adresu e-mail z tego konta {0}.", "error.msg.no_email": "Nie można pobrać adresu e-mail z tego konta {0}.",
"error.msg.already_linked": "To konto {0} zostało już połączone z innym kontem.", "error.msg.already_linked": "To konto {0} zostało już połączone z innym kontem.",
"error.msg.not_linked": "To konto {0} nie zostało jeszcze połączone z żadnym kontem.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "To konto {0} nie zostało zweryfikowane, spróbuj ponownie po weryfikacji.", "error.msg.unverified_account": "To konto {0} nie zostało zweryfikowane, spróbuj ponownie po weryfikacji.",
"error.msg.user_not_allowed": "Nie możesz się zalogować.", "error.msg.user_not_allowed": "Nie możesz się zalogować.",
"error.msg.cannot_get_user_info": "Nie można uzyskać informacji o użytkowniku z tego konta {0}.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Wygeneruj", "common.button.generate": "Wygeneruj",
"common.button.done": "Gotowe", "common.button.done": "Gotowe",
"common.text.link": "Link", "common.text.link": "Link",
"common.text.navigate-to-link": "Przejdź do linku", "common.text.navigate-to-link": "Visit link",
"common.text.or": "lub", "common.text.or": "lub",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Wróć", "common.button.go-back": "Wróć",
"common.button.go-home": "Wróć do ekranu głównego", "common.button.go-home": "Wróć do ekranu głównego",
"common.notify.copied": "Link został skopiowany do schowka", "common.notify.copied": "Link został skopiowany do schowka",
"common.notify.copied-link": "Link został skopiowany do schowka",
"common.success": "Zakończono pomyślnie", "common.success": "Zakończono pomyślnie",
"common.error": "Błąd", "common.error": "Błąd",
"common.error.unknown": "Wystąpił nieznany błąd", "common.error.unknown": "Wystąpił nieznany błąd",
"common.error.invalid-email": "Adres e-mail jest nieprawidłowy", "common.error.invalid-email": "Adres e-mail jest nieprawidłowy",
"common.error.too-short": "Musi mieć co najmniej {length} znaków", "common.error.too-short": "Musi mieć co najmniej {length} znaków",
"common.error.too-long": "Musi mieć co najmniej {length} znaków", "common.error.too-long": "Musi mieć co najmniej {length} znaków",
"common.error.number-too-small": "Musi mieć co najmniej {min}",
"common.error.number-too-large": "Musi wynosić co najwyżej {max}",
"common.error.exact-length": "Musi mieć dokładnie {length} znaków", "common.error.exact-length": "Musi mieć dokładnie {length} znaków",
"common.error.invalid-number": "Musi być liczbą", "common.error.invalid-number": "Musi być liczbą",
"common.error.field-required": "To pole jest wymagane" "common.error.field-required": "To pole jest wymagane"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Carregar", "navbar.upload": "Carregar",
"navbar.signin": "Iniciar sessão", "navbar.signin": "Iniciar sessão",
"navbar.home": "Início", "navbar.home": "Início",
"navbar.signup": "Registar-se", "navbar.signup": "Cadastre-se",
"navbar.links.shares": "Meus compartilhamentos", "navbar.links.shares": "Meus compartilhamentos",
"navbar.links.reverse": "Compartilhamentos reversos", "navbar.links.reverse": "Compartilhamentos reversos",
"navbar.avatar.account": "Minha conta", "navbar.avatar.account": "Minha conta",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Auto-Hospedado", "home.bullet.a.name": "Auto-Hospedado",
"home.bullet.a.description": "Hospede o Pingvin Share em sua própria máquina.", "home.bullet.a.description": "Hospede o Pingvin Share em sua própria máquina.",
"home.bullet.b.name": "Privacidade", "home.bullet.b.name": "Privacidade",
"home.bullet.b.description": "Seus arquivos são seus arquivos e nunca devem cair nas mãos de terceiros.", "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.name": "Sem limite de tamanho de arquivo irritante",
"home.bullet.c.description": "Carregue os arquivos grandes que desejar. Apenas o seu disco rígido será o seu limite.", "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.start": "Começar",
"home.button.source": "Código-fonte", "home.button.source": "Código-fonte",
// END / // END /
@@ -58,7 +58,7 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Esqueceu a sua senha?", "resetPassword.title": "Esqueceu a sua senha?",
"resetPassword.description": "Insira o seu e-mail para redefinir a sua senha.", "resetPassword.description": "Insira o seu e-mail para redefinir a sua senha.",
"resetPassword.notify.success": "Uma mensagem com um link para redefinir sua senha foi enviada se o e-mail existir.", "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.button.back": "Voltar para a página inicial",
"resetPassword.text.resetPassword": "Redefinir senha", "resetPassword.text.resetPassword": "Redefinir senha",
"resetPassword.text.enterNewPassword": "Digite uma nova senha", "resetPassword.text.enterNewPassword": "Digite uma nova senha",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Senha", "account.card.password.title": "Senha",
"account.card.password.old": "Senha antiga", "account.card.password.old": "Senha antiga",
"account.card.password.new": "Nova senha", "account.card.password.new": "Nova senha",
"account.card.password.noPasswordSet": "Você não tem uma senha definida. Se quiser entrar com e-mail e senha você precisa definir uma senha.", "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.notify.password.success": "Senha alterada com sucesso",
"account.card.oauth.title": "Login com Redes Sociais", "account.card.oauth.title": "Login com Redes Sociais",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Desvincular", "account.card.oauth.unlink": "Desvincular",
"account.card.oauth.unlinked": "Desvinculado", "account.card.oauth.unlinked": "Desvinculado",
"account.modal.unlink.title": "Desvincular conta", "account.modal.unlink.title": "Desvincular conta",
"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.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.notify.oauth.unlinked.success": "Desvinculado com sucesso",
"account.card.security.title": "Segurança", "account.card.security.title": "Segurança",
"account.card.security.totp.enable.description": "Digite a sua senha atual para começar a habilitar o TOTP", "account.card.security.totp.enable.description": "Digite a sua senha atual para começar a habilitar o TOTP",
@@ -122,8 +122,11 @@ export default {
"account.shares.table.description": "Descrição", "account.shares.table.description": "Descrição",
"account.shares.table.visitors": "Visitantes", "account.shares.table.visitors": "Visitantes",
"account.shares.table.expiresAt": "Expira em", "account.shares.table.expiresAt": "Expira em",
"account.shares.table.createdAt": "Criado em", "account.shares.table.createdAt": "Criada em",
"account.shares.table.size": "Tamanho", "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-informations": "Informações do compartilhamento",
"account.shares.modal.share-link": "Link do compartilhamento", "account.shares.modal.share-link": "Link do compartilhamento",
"account.shares.modal.delete.title": "Excluir o compartilhamento {share}", "account.shares.modal.delete.title": "Excluir o compartilhamento {share}",
@@ -150,7 +153,7 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Ano", "account.reverseShares.modal.expiration.year-singular": "Ano",
"account.reverseShares.modal.expiration.year-plural": "Anos", "account.reverseShares.modal.expiration.year-plural": "Anos",
"account.reverseShares.modal.max-size.label": "Tamanho máximo do compartilhamento", "account.reverseShares.modal.max-size.label": "Tamanho máximo do compartilhamento",
"account.reverseShares.modal.send-email": "Enviar notificação por e-mail", "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.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": "Modo simples",
"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.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.",
@@ -183,13 +186,13 @@ export default {
"admin.users.table.username": "Nome de usuário", "admin.users.table.username": "Nome de usuário",
"admin.users.table.email": "E-mail", "admin.users.table.email": "E-mail",
"admin.users.table.admin": "Admin", "admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Atualizar usuário {username}", "admin.users.edit.update.title": "Editar usuário: {username}",
"admin.users.edit.update.admin-privileges": "Privilégios de administrador", "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.title": "Alterar senha",
"admin.users.edit.update.change-password.field": "Nova senha", "admin.users.edit.update.change-password.field": "Nova senha",
"admin.users.edit.update.change-password.button": "Salvar 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.update.notify.password.success": "Senha alterada com sucesso",
"admin.users.edit.delete.title": "Excluir usuário {username}", "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?", "admin.users.edit.delete.description": "Você realmente quer excluir este usuário e todos os seus compartilhamentos?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Criar usuário", "admin.users.modal.create.title": "Criar usuário",
@@ -207,16 +210,19 @@ export default {
"admin.shares.table.username": "Criador", "admin.shares.table.username": "Criador",
"admin.shares.table.visitors": "Visitantes", "admin.shares.table.visitors": "Visitantes",
"admin.shares.table.expires": "Expira em", "admin.shares.table.expires": "Expira em",
"admin.shares.edit.delete.title": "Excluir compartilhamento {id}", "admin.shares.edit.delete.title": "Excluir o compartilhamento {id}",
"admin.shares.edit.delete.description": "Tem certeza que deseja excluir este compartilhamento?", "admin.shares.edit.delete.description": "Tem certeza que deseja excluir este compartilhamento?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Carregar", "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.generic-error": "Ocorreu um erro ao terminar seu compartilhamento.",
"upload.notify.count-failed": "Falha ao enviar {count} arquivos. Tentando novamente.", "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 // Dropzone.tsx
"upload.dropzone.title": "Carregar arquivos", "upload.dropzone.title": "Carregar arquivos",
"upload.dropzone.description": "Arraste os arquivos aqui para iniciar o seu compartilhamento. Podemos aceitar apenas arquivos que são menores que {maxSize} no 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}.", "upload.dropzone.notify.file-too-big": "Seus arquivos excedem o tamanho máximo do compartilhamento {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Nome", "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": "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.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": "nunca",
"upload.modal.expires.never-long": "Nunca expira", "upload.modal.expires.never-long": "Compartilhamento permanente",
"upload.modal.expires.error.too-long": "Expiração excede a data de expiração máxima de {max}.", "upload.modal.expires.error.too-long": "Data de expiração excede o máximo de {max}.",
"upload.modal.link.label": "Link", "upload.modal.link.label": "Link",
"upload.modal.expires.label": "Expiração", "upload.modal.expires.label": "Expiração",
"upload.modal.expires.minute-singular": "Minuto", "upload.modal.expires.minute-singular": "Minuto",
@@ -272,7 +278,7 @@ export default {
"share.error.access-denied.title": "Compartilhamento privado", "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.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.title": "Senha necessária",
"share.modal.password.description": "Para acessar este compartilhamento, por favor digite a senha para o compartilhamento.", "share.modal.password.description": "Por favor, digite a senha para acessar este compartilhamento.",
"share.modal.password": "Senha", "share.modal.password": "Senha",
"share.modal.error.invalid-password": "Senha inválida", "share.modal.error.invalid-password": "Senha inválida",
"share.button.download-all": "Transferir tudo", "share.button.download-all": "Transferir tudo",
@@ -281,7 +287,7 @@ export default {
"share.table.name": "Nome", "share.table.name": "Nome",
"share.table.size": "Tamanho", "share.table.size": "Tamanho",
"share.modal.file-preview.error.not-supported.title": "Visualização não suportada", "share.modal.file-preview.error.not-supported.title": "Visualização não suportada",
"share.modal.file-preview.error.not-supported.description": "Uma pré-visualização para este tipo de arquivo não é suportada. Faça o download do arquivo para visualizá-lo.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Editar {shareId}", "share.edit.title": "Editar {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Ocorreu um erro ao terminar seu compartilhamento.", "share.edit.notify.generic-error": "Ocorreu um erro ao terminar seu compartilhamento.",
"share.edit.notify.save-success": "Compartilhamento atualizado com sucesso", "share.edit.notify.save-success": "Compartilhamento atualizado com sucesso",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Política de Privacidade",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Configuração", "admin.config.title": "Configuração",
"admin.config.category.general": "Geral", "admin.config.category.general": "Geral",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "Nome da aplicação", "admin.config.general.app-name.description": "Nome da aplicação",
"admin.config.general.app-url": "URL do Aplicativo", "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.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": "Mostrar a página inicial",
"admin.config.general.show-home-page.description": "Mostrar ou não a página inicial", "admin.config.general.show-home-page.description": "Mostrar ou não a página inicial",
"admin.config.general.session-duration": "Duração de sessão", "admin.config.general.session-duration": "Duração de sessão",
@@ -307,12 +321,12 @@ export default {
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Alterar o seu logo carregando uma nova imagem. A imagem deve ser PNG e deve ter o formato 1:1.", "admin.config.general.logo.description": "Alterar o seu logo carregando uma nova imagem. A imagem deve ser PNG e deve ter o formato 1:1.",
"admin.config.general.logo.placeholder": "Escolhe uma imagem", "admin.config.general.logo.placeholder": "Escolhe uma imagem",
"admin.config.email.enable-share-email-recipients": "Ativar compartilhamento de e-mails destinatários", "admin.config.email.enable-share-email-recipients": "Ativar compartilhamento por email",
"admin.config.email.enable-share-email-recipients.description": "Se quiser permitir que e-mails compartilhem destinatários. Apenas habilite isso se você tiver ativado o SMTP.", "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": "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-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": "Assunto dos destinatários do compartilhamento",
"admin.config.email.share-recipients-message.description": "Mensagem que é enviada aos destinatários do compartilhamento. Variáveis disponíveis:\n {creator} - O nome de usuário do criador do compartilhamento\n {shareUrl} - O URL do compartilhamento\n {desc} - A descrição do compartilhamento\n {expires} - A data de expiração do compartilhamento\n As variáveis serão substituídas pelo valor real.", "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": "Assunto do compartilhamento reverso",
"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-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": "Mensagem do compartilhamento reverso",
@@ -324,22 +338,24 @@ export default {
"admin.config.email.invite-subject": "Assunto do convite", "admin.config.email.invite-subject": "Assunto do convite",
"admin.config.email.invite-subject.description": "Assunto do e-mail enviado quando um administrador convida um usuário.", "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": "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 password of the user.", "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": "Permitir novos registos",
"admin.config.share.allow-registration.description": "Se o registro é permitido", "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": "Permitir compartilhamentos sem autenticação",
"admin.config.share.allow-unauthenticated-shares.description": "Se usuários não autenticados podem criar compartilhamentos", "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": "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": "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": "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.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": "Tamanho do pedaço",
"admin.config.share.chunk-size.description": "Ajuste o tamanho do pedaço (em bytes) 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.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": "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.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": "Ativado", "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.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": "Servidor",
"admin.config.smtp.host.description": "Nome do Servidor SMTP", "admin.config.smtp.host.description": "Nome do Servidor SMTP",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Client secret do aplicativo Microsoft OAuth", "admin.config.oauth.microsoft-client-secret.description": "Client secret do aplicativo Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Se o login do Discord está habilitado", "admin.config.oauth.discord-enabled.description": "Se o login do Discord está habilitado",
"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": "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-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", "admin.config.oauth.discord-client-id": "ID do Cliente Discord",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Se o login do OpenID Connect está ativado", "admin.config.oauth.oidc-enabled.description": "Se o login do OpenID Connect está ativado",
"admin.config.oauth.oidc-discovery-uri": "URI de descoberta do OpenID Connect", "admin.config.oauth.oidc-discovery-uri": "URI de descoberta do OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "URI da descoberta do aplicativo OpenID Connect OAuth", "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": "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-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", "admin.config.oauth.oidc-role-path": "Caminho para as funções no token OpenID Connect",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "Segredo do cliente OpenID Connect", "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.oauth.oidc-client-secret.description": "ID do cliente do aplicativo OpenID OAuth",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "LDAP Habilitado", "admin.config.ldap.enabled": "Habilitar LDAP",
"admin.config.ldap.enabled.description": "Usar autenticação LDAP para login de usuário", "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": "URL do Servidor",
"admin.config.ldap.url.description": "URL do Servidor LDAP", "admin.config.ldap.url.description": "URL do Servidor LDAP",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Usuário padrão que será usado para executar a pesquisa de usuário", "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": "Bind Password",
"admin.config.ldap.bind-password.description": "Senha para o usuário de busca", "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": "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-base.description": "Localização base, onde a pesquisa do usuário será realizada",
"admin.config.ldap.search-query": "Consulta de usuário", "admin.config.ldap.search-query": "Consulta de usuário",
"admin.config.ldap.search-query.description": "A consulta do usuário será usada para pesquisar a 'base de usuários' para o usuário LDAP. %username% pode ser usado como espaço reservado para o usuário fornecido na entrada.", "admin.config.ldap.search-query.description": "A consulta do usuário será usada para pesquisar a 'base de usuários' para o usuário LDAP. %username% pode ser usado como espaço reservado para o usuário fornecido na entrada.",
"admin.config.ldap.admin-groups": "Grupo de administração", "admin.config.ldap.admin-groups": "Grupo de administração",
"admin.config.ldap.admin-groups.description": "Grupo necessário para acesso administrativo.", "admin.config.ldap.admin-groups.description": "Grupo necessário para acesso administrativo.",
"admin.config.ldap.field-name-member-of": "Nome do atributo do grupo de usuários",
"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.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
"404.description": "Ops, esta página não existe.", "404.description": "Ops, esta página não existe.",
"404.button.home": "Me traga de volta para casa", "404.button.home": "Me traga de volta para casa",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Gerar", "common.button.generate": "Gerar",
"common.button.done": "Concluído", "common.button.done": "Concluído",
"common.text.link": "Link", "common.text.link": "Link",
"common.text.navigate-to-link": "Ir para o link", "common.text.navigate-to-link": "Visitar Link",
"common.text.or": "ou", "common.text.or": "ou",
"common.text.redirecting": "Redirecionando...",
"common.button.go-back": "Voltar", "common.button.go-back": "Voltar",
"common.button.go-home": "Voltar para o Início", "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": "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.success": "Sucesso",
"common.error": "Erro", "common.error": "Erro",
"common.error.unknown": "Ocorreu um erro desconhecido", "common.error.unknown": "Ocorreu um erro desconhecido",
"common.error.invalid-email": "Endereço de e-mail inválido", "common.error.invalid-email": "Endereço de e-mail inválido",
"common.error.too-short": "Deve ter no mínimo {length} caracteres", "common.error.too-short": "Deve ter no mínimo {length} caracteres",
"common.error.too-long": "Deve ter no máximo {length} caracteres", "common.error.too-long": "Deve ter no máximo {length} caracteres",
"common.error.number-too-small": "Deve ser pelo menos {min}",
"common.error.number-too-large": "Deve ser no máximo {max}",
"common.error.exact-length": "Deve ter exatamente {length} caracteres", "common.error.exact-length": "Deve ter exatamente {length} caracteres",
"common.error.invalid-number": "Tem que ser um número", "common.error.invalid-number": "Tem que ser um número",
"common.error.field-required": "Este campo é obrigatório" "common.error.field-required": "Este campo é obrigatório"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Загрузить", "navbar.upload": "Загрузить",
"navbar.signin": "Вход", "navbar.signin": "Вход",
"navbar.home": "Главная", "navbar.home": "Главная",
"navbar.signup": "Зарегистрироваться", "navbar.signup": "Sign up",
"navbar.links.shares": "Мои загрузки", "navbar.links.shares": "Мои загрузки",
"navbar.links.reverse": "Обратные загрузки", "navbar.links.reverse": "Обратные загрузки",
"navbar.avatar.account": "Мой аккаунт", "navbar.avatar.account": "Мой аккаунт",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "На собственном сервере", "home.bullet.a.name": "На собственном сервере",
"home.bullet.a.description": "Pingvin Share работает на вашей машине.", "home.bullet.a.description": "Pingvin Share работает на вашей машине.",
"home.bullet.b.name": "Конфиденциальность", "home.bullet.b.name": "Конфиденциальность",
"home.bullet.b.description": "Ваши файлы - это ваши файлы и никогда не должны попадать в руки третьих лиц.", "home.bullet.b.description": "Ваши файлы принадлежат защищены от действия третьих лиц.",
"home.bullet.c.name": "Без раздражающего ограничения размера файла", "home.bullet.c.name": "Без раздражающего ограничения размера файла",
"home.bullet.c.description": "Загружайте файлы с любым размером. Только ваш жесткий диск будет пределом.", "home.bullet.c.description": "Загружайте файлы любого размера. Ваш жёсткий диск - это ваше ограничение.",
"home.button.start": "Начнем", "home.button.start": "Начнем",
"home.button.source": "Исходный код", "home.button.source": "Исходный код",
// END / // END /
@@ -34,7 +34,7 @@ export default {
"signIn.notify.totp-required.title": "Требуется двухфакторная аутентификация", "signIn.notify.totp-required.title": "Требуется двухфакторная аутентификация",
"signIn.notify.totp-required.description": "Пожалуйста, введите код Вашей 2-х факторной аутентификации", "signIn.notify.totp-required.description": "Пожалуйста, введите код Вашей 2-х факторной аутентификации",
"signIn.oauth.or": "ИЛИ", "signIn.oauth.or": "ИЛИ",
"signIn.oauth.signInWith": "Sign in with", "signIn.oauth.signInWith": "Войдите с помощью",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Забыли пароль?", "resetPassword.title": "Забыли пароль?",
"resetPassword.description": "Введите ваш email для восстановления пароля.", "resetPassword.description": "Введите ваш email для восстановления пароля.",
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.", "resetPassword.notify.success": "На указанный адрес электронной почты, будет направлено письмо для сброса пароля.",
"resetPassword.button.back": "Вернуться на страницу входа", "resetPassword.button.back": "Вернуться на страницу входа",
"resetPassword.text.resetPassword": "Сбросить пароль", "resetPassword.text.resetPassword": "Сбросить пароль",
"resetPassword.text.enterNewPassword": "Введите новый пароль", "resetPassword.text.enterNewPassword": "Введите новый пароль",
"resetPassword.input.password": "Новый пароль", "resetPassword.input.password": "Новый пароль",
"resetPassword.notify.passwordReset": "Ваш пароль был успешно сброшен!", "resetPassword.notify.passwordReset": "Ваш пароль успешно изменён.",
// /account // /account
"account.title": "Мой аккаунт", "account.title": "Мой аккаунт",
"account.card.info.title": "Информация об аккаунте", "account.card.info.title": "Информация об аккаунте",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Пароль", "account.card.password.title": "Пароль",
"account.card.password.old": "Старый пароль", "account.card.password.old": "Старый пароль",
"account.card.password.new": "Новый пароль", "account.card.password.new": "Новый пароль",
"account.card.password.noPasswordSet": "У вас не установлен пароль. Если вы хотите войти с помощью электронной почты и пароля, вам необходимо установить пароль.", "account.card.password.noPasswordSet": "У вас не установлен пароль. Чтобы войти в систему, используя свой адрес электронной почты и пароль, вам необходимо создать пароль.",
"account.notify.password.success": "Пароль успешно изменён", "account.notify.password.success": "Пароль успешно изменён",
"account.card.oauth.title": "Авторизация через социальные сети", "account.card.oauth.title": "Авторизация через социальные сети",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Отключить", "account.card.oauth.unlink": "Отключить",
"account.card.oauth.unlinked": "Отключен", "account.card.oauth.unlinked": "Отключен",
"account.modal.unlink.title": "Отключить связь с учетной записью", "account.modal.unlink.title": "Отключить связь с учетной записью",
"account.modal.unlink.description": "Отключение связи с учетной записью социальных аккаунтов может привести к потере вашей учетной записи, если вы не помните свое имя пользователя и пароль.", "account.modal.unlink.description": "Отключение связи с вашими аккаунтами в социальных сетях может привести к потере вашей учетной записи, если вы не помните свои учетные данные для входа",
"account.notify.oauth.unlinked.success": "Отключение прошло успешно", "account.notify.oauth.unlinked.success": "Отключение прошло успешно",
"account.card.security.title": "Безопасность", "account.card.security.title": "Безопасность",
"account.card.security.totp.enable.description": "Введите ваш текущий пароль для начала включения TOTP", "account.card.security.totp.enable.description": "Введите ваш текущий пароль для начала включения TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Название", "account.shares.table.name": "Название",
"account.shares.table.description": "Описание", "account.shares.table.description": "Описание",
"account.shares.table.visitors": "Посетителей", "account.shares.table.visitors": "Посетителей",
"account.shares.table.expiresAt": "Действительно до", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Создано", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Размер", "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-informations": "Сведения",
"account.shares.modal.share-link": "Поделиться ссылкой", "account.shares.modal.share-link": "Поделиться ссылкой",
"account.shares.modal.delete.title": "Удалить загрузку {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Вы действительно хотите удалить эту загрузку?", "account.shares.modal.delete.description": "Вы действительно хотите удалить эту загрузку?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Год", "account.reverseShares.modal.expiration.year-singular": "Год",
"account.reverseShares.modal.expiration.year-plural": "Года (лет)", "account.reverseShares.modal.expiration.year-plural": "Года (лет)",
"account.reverseShares.modal.max-size.label": "Макс. размер загрузки", "account.reverseShares.modal.max-size.label": "Макс. размер загрузки",
"account.reverseShares.modal.send-email": "Отправить уведомление по эл. почте", "account.reverseShares.modal.send-email": "Отправлять уведомления по эл. почте",
"account.reverseShares.modal.send-email.description": "Отправлять уведомление по электронной почте, когда загрузка создается с помощью этой обратной ссылки.", "account.reverseShares.modal.send-email.description": "Отправлять уведомление по электронной почте, когда загрузка создается с помощью этой обратной ссылки.",
"account.reverseShares.modal.simplified": "Simple mode", "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 be able to customize only the name and description of the share.", "account.reverseShares.modal.simplified.description": "Получатель приглашения легко сможет загружать файл для того, чтобы поделиться им с Вами. Они смогут только настроить имя и описание доли.",
"account.reverseShares.modal.public-access": "Public access", "account.reverseShares.modal.public-access": "Публичный доступ",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Сделать файлы общедоступными, созданные с этим обратным общим публичным доступом. Если отключено, только вы и создатель ресурса будут иметь доступ к ним для просмотра.",
"account.reverseShares.modal.max-use.label": "Максимум использований", "account.reverseShares.modal.max-use.label": "Максимум использований",
"account.reverseShares.modal.max-use.description": "Максимальное количество раз, когда URL может быть использован для создания загрузки.", "account.reverseShares.modal.max-use.description": "Максимальное количество раз, когда URL может быть использован для создания загрузки.",
"account.reverseShare.never-expires": "Эта обратная загрузка никогда не устареет.", "account.reverseShare.never-expires": "Эта обратная загрузка никогда не устареет.",
@@ -183,13 +186,13 @@ export default {
"admin.users.table.username": "Логин", "admin.users.table.username": "Логин",
"admin.users.table.email": "Электронная почта", "admin.users.table.email": "Электронная почта",
"admin.users.table.admin": "Администратор", "admin.users.table.admin": "Администратор",
"admin.users.edit.update.title": "Обновить пользователя {username}", "admin.users.edit.update.title": "Редактировать пользователя: {username}",
"admin.users.edit.update.admin-privileges": "Права администратора", "admin.users.edit.update.admin-privileges": "Права администратора",
"admin.users.edit.update.change-password.title": "Изменить пароль", "admin.users.edit.update.change-password.title": "Изменить пароль",
"admin.users.edit.update.change-password.field": "Новый пароль", "admin.users.edit.update.change-password.field": "Новый пароль",
"admin.users.edit.update.change-password.button": "Сохранить новый пароль", "admin.users.edit.update.change-password.button": "Сохранить новый пароль",
"admin.users.edit.update.notify.password.success": "Пароль успешно изменён", "admin.users.edit.update.notify.password.success": "Пароль успешно изменён",
"admin.users.edit.delete.title": "Удалить пользователя {username}", "admin.users.edit.delete.title": "Удалить пользователя {username} ?",
"admin.users.edit.delete.description": "Вы действительно хотите удалить этого пользователя и все его загрузки?", "admin.users.edit.delete.description": "Вы действительно хотите удалить этого пользователя и все его загрузки?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Создать пользователя", "admin.users.modal.create.title": "Создать пользователя",
@@ -202,22 +205,25 @@ export default {
"admin.users.modal.create.admin.description": "Если отмечено, пользователь будет иметь доступ к панели администратора.", "admin.users.modal.create.admin.description": "Если отмечено, пользователь будет иметь доступ к панели администратора.",
// END /admin/users // END /admin/users
// /admin/shares // /admin/shares
"admin.shares.title": "Share management", "admin.shares.title": "Управление Share",
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator", "admin.shares.table.username": "Автор",
"admin.shares.table.visitors": "Visitors", "admin.shares.table.visitors": "Посетители",
"admin.shares.table.expires": "Expires At", "admin.shares.table.expires": "Срок действия до",
"admin.shares.edit.delete.title": "Delete share {id}", "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 // END /admin/shares
// /upload // /upload
"upload.title": "Загрузить", "upload.title": "Загрузить",
"upload.notify.confirm-leave": "Вы уверены, что хотите покинуть эту страницу? Загрузка будет отменена.",
"upload.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.", "upload.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.",
"upload.notify.count-failed": "Не удалось загрузить файлы {count}. Повтор попытки.", "upload.notify.count-failed": "Не удалось загрузить файлы {count}. Повтор попытки.",
"upload.reverse-share.error.invalid.title": "Неверная обратная ссылка",
"upload.reverse-share.error.invalid.description": "Эта обратная доля устарела или является недействительной.",
// Dropzone.tsx // Dropzone.tsx
"upload.dropzone.title": "Загрузить файлы", "upload.dropzone.title": "Загрузить файлы",
"upload.dropzone.description": "Перетащите сюда файлы для начала загрузки. Мы можем принимать только файлы, которые меньше {maxSize}.", "upload.dropzone.description": "Перетащите сюда файлы для начала загрузки. Размер всех файлов не должен превышать {maxSize}.",
"upload.dropzone.notify.file-too-big": "Ваши файлы превышают максимальный размер в {maxSize}.", "upload.dropzone.notify.file-too-big": "Ваши файлы превышают максимальный размер {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Название", "upload.filelist.name": "Название",
"upload.filelist.size": "Размер", "upload.filelist.size": "Размер",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Вы не авторизованы", "upload.modal.not-signed-in": "Вы не авторизованы",
"upload.modal.not-signed-in-description": "Вы не сможете удалить свои файлы вручную и просмотреть количество посетителей.", "upload.modal.not-signed-in-description": "Вы не сможете удалить свои файлы вручную и просмотреть количество посетителей.",
"upload.modal.expires.never": "никогда", "upload.modal.expires.never": "никогда",
"upload.modal.expires.never-long": "Никогда не истекает", "upload.modal.expires.never-long": "Постоянный доступ",
"upload.modal.expires.error.too-long": "Срок действия превышает максимальную дату окончания срока действия {max}.", "upload.modal.expires.error.too-long": "Срок действия превышает максимальный предел {max}.",
"upload.modal.link.label": "Ссылка", "upload.modal.link.label": "Ссылка",
"upload.modal.expires.label": "Истекает", "upload.modal.expires.label": "Истекает",
"upload.modal.expires.minute-singular": "Минута", "upload.modal.expires.minute-singular": "Минута",
@@ -246,7 +252,7 @@ export default {
"upload.modal.expires.year-plural": "Года (лет)", "upload.modal.expires.year-plural": "Года (лет)",
"upload.modal.accordion.name-and-description.title": "Имя и описание", "upload.modal.accordion.name-and-description.title": "Имя и описание",
"upload.modal.accordion.name-and-description.name.placeholder": "Имя", "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.title": "Получатели письма",
"upload.modal.accordion.email.placeholder": "Получатели e-mail", "upload.modal.accordion.email.placeholder": "Получатели e-mail",
"upload.modal.accordion.email.invalid-email": "Недопустимый адрес электронной почты", "upload.modal.accordion.email.invalid-email": "Недопустимый адрес электронной почты",
@@ -259,7 +265,7 @@ export default {
"upload.modal.completed.never-expires": "Эта загрузка никогда не устареет.", "upload.modal.completed.never-expires": "Эта загрузка никогда не устареет.",
"upload.modal.completed.expires-on": "Эта загрузка устареет {expiration}.", "upload.modal.completed.expires-on": "Эта загрузка устареет {expiration}.",
"upload.modal.completed.share-ready": "Готово", "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 // END /upload
// /share/[id] // /share/[id]
"share.title": "Загрузка {shareId}", "share.title": "Загрузка {shareId}",
@@ -269,10 +275,10 @@ export default {
"share.error.removed.title": "Загрузка удалена", "share.error.removed.title": "Загрузка удалена",
"share.error.not-found.title": "Загрузка не найдена", "share.error.not-found.title": "Загрузка не найдена",
"share.error.not-found.description": "Страница, которую вы ищете, не существует.", "share.error.not-found.description": "Страница, которую вы ищете, не существует.",
"share.error.access-denied.title": "Private share", "share.error.access-denied.title": "Приватное доступ",
"share.error.access-denied.description": "The current account does not have permission to access this share", "share.error.access-denied.description": "У текущей учетной записи нет разрешения на доступ к этому ресурсу",
"share.modal.password.title": "Требуется пароль", "share.modal.password.title": "Требуется пароль",
"share.modal.password.description": "Для доступа к этому ресурсу введите пароль для общего доступа.", "share.modal.password.description": "Пожалуйста, введите пароль, чтобы получить доступ.",
"share.modal.password": "Пароль", "share.modal.password": "Пароль",
"share.modal.error.invalid-password": "Неверный пароль", "share.modal.error.invalid-password": "Неверный пароль",
"share.button.download-all": "Скачать все", "share.button.download-all": "Скачать все",
@@ -281,7 +287,7 @@ export default {
"share.table.name": "Название", "share.table.name": "Название",
"share.table.size": "Размер", "share.table.size": "Размер",
"share.modal.file-preview.error.not-supported.title": "Предпросмотр не поддерживается", "share.modal.file-preview.error.not-supported.title": "Предпросмотр не поддерживается",
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.", "share.modal.file-preview.error.not-supported.description": "Предпросмотр не поддерживается для этого типа файлов. Пожалуйста, скачайте файл для просмотра.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Редактировать {shareId}", "share.edit.title": "Редактировать {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.", "share.edit.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.",
"share.edit.notify.save-success": "Ссылка на ресурс успешна обновлена", "share.edit.notify.save-success": "Ссылка на ресурс успешна обновлена",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Конфигурация", "admin.config.title": "Конфигурация",
"admin.config.category.general": "Общее", "admin.config.category.general": "Общее",
@@ -300,19 +312,21 @@ export default {
"admin.config.general.app-name.description": "Видимое название приложения", "admin.config.general.app-name.description": "Видимое название приложения",
"admin.config.general.app-url": "URL-адрес приложения", "admin.config.general.app-url": "URL-адрес приложения",
"admin.config.general.app-url.description": "Адрес на котором доступен Pingvin Share", "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": "Показывать домашнюю страницу",
"admin.config.general.show-home-page.description": "Показывать ли домашнюю страницу или нет", "admin.config.general.show-home-page.description": "Показывать ли домашнюю страницу или нет",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.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": "Время в часах, после которого пользователь должен снова войти (по умолчанию: 3 месяца).",
"admin.config.general.logo": "Логотип", "admin.config.general.logo": "Логотип",
"admin.config.general.logo.description": "Измените свой логотип, загрузив новое изображение. Изображение должно быть PNG и должно иметь формат 1:1.", "admin.config.general.logo.description": "Измените свой логотип, загрузив новое изображение. Изображение должно быть PNG и должно иметь формат 1:1.",
"admin.config.general.logo.placeholder": "Выберите изображение", "admin.config.general.logo.placeholder": "Выберите изображение",
"admin.config.email.enable-share-email-recipients": "Включить обмен с получателями электронной почты", "admin.config.email.enable-share-email-recipients": "Включить отправку email получателю",
"admin.config.email.enable-share-email-recipients.description": "Разрешить ли отправку писем получателям. Включите, только если вы включили SMTP.", "admin.config.email.enable-share-email-recipients.description": "Разрешить ли обмен электронной почтой с получателями. Включите, только если включен SMTP.",
"admin.config.email.share-recipients-subject": "Заголовок письма (загрузка)", "admin.config.email.share-recipients-subject": "Заголовок письма (загрузка)",
"admin.config.email.share-recipients-subject.description": "Тема письма, которое отправляется получателям акции.", "admin.config.email.share-recipients-subject.description": "Тема письма, которое отправляется получателям акции.",
"admin.config.email.share-recipients-message": "Сообщение письма загрузки", "admin.config.email.share-recipients-message": "Сообщение письма загрузки",
"admin.config.email.share-recipients-message.description": "Сообщение, которое отправляется получателям публикации. Доступные переменные:\n {creator} - Имя пользователя создателя загрузки\n {shareUrl} - URL загрузки\n {desc} - Описание загрузки\n {expires} - Дата истечения загрузки\n Переменные будут заменены на фактическое значение.", "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": "Заголовок письма (обратная загрузка)",
"admin.config.email.reverse-share-subject.description": "Тема письма, которое отправляется, когда кто-то создал загрузку с вашей обратной ссылкой.", "admin.config.email.reverse-share-subject.description": "Тема письма, которое отправляется, когда кто-то создал загрузку с вашей обратной ссылкой.",
"admin.config.email.reverse-share-message": "Сообщение письма обратной загрузки", "admin.config.email.reverse-share-message": "Сообщение письма обратной загрузки",
@@ -324,21 +338,23 @@ export default {
"admin.config.email.invite-subject": "Тема приглашения", "admin.config.email.invite-subject": "Тема приглашения",
"admin.config.email.invite-subject.description": "Тема письма, которое отправляется, когда администратор приглашает пользователя.", "admin.config.email.invite-subject.description": "Тема письма, которое отправляется, когда администратор приглашает пользователя.",
"admin.config.email.invite-message": "Сообщение с приглашением", "admin.config.email.invite-message": "Сообщение с приглашением",
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the password of the user.", "admin.config.email.invite-message.description": "Сообщение приглашения. {url} будет заменён ссылкой приглашения, а {password} паролем.",
"admin.config.share.allow-registration": "Разрешить регистрацию", "admin.config.share.allow-registration": "Разрешить регистрацию",
"admin.config.share.allow-registration.description": "Разрешена ли регистрация", "admin.config.share.allow-registration.description": "Разрешена ли регистрация",
"admin.config.share.allow-unauthenticated-shares": "Разрешить неавторизованные загрузки", "admin.config.share.allow-unauthenticated-shares": "Разрешить неавторизованные загрузки",
"admin.config.share.allow-unauthenticated-shares.description": "Могут ли неавторизованные пользователи создавать загрузки", "admin.config.share.allow-unauthenticated-shares.description": "Могут ли неавторизованные пользователи создавать загрузки",
"admin.config.share.max-expiration": "Максимальная срок действия", "admin.config.share.max-expiration": "Максимальная срок действия",
"admin.config.share.max-expiration.description": "Максимальный срок действия общего доступа в часах. Установите значение 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": "Максимальный размер",
"admin.config.share.max-size.description": "Максимальный размер файла в байтах", "admin.config.share.max-size.description": "Максимальный размер файла",
"admin.config.share.zip-compression-level": "Уровень сжатия Zip", "admin.config.share.zip-compression-level": "Уровень сжатия Zip",
"admin.config.share.zip-compression-level.description": "Регулировка уровня баланса между размером файла и скоростью сжатия. Допустимые значения от 0 до 9, с 0 без сжатия, а 9 - максимальное сжатие. ", "admin.config.share.zip-compression-level.description": "Регулировка уровня баланса между размером файла и скоростью сжатия. Допустимые значения от 0 до 9, с 0 без сжатия, а 9 - максимальное сжатие. ",
"admin.config.share.chunk-size": "Размер чанка", "admin.config.share.chunk-size": "Размер чанка",
"admin.config.share.chunk-size.description": "Adjust the chunk size (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 speed up uploads for stable connections.", "admin.config.share.chunk-size.description": "Отрегулируйте размер чанка для ваших загрузок, чтобы сбалансировать эффективность и надежность в соответствии с вашим интернет-соединением. Меньшие чанки могут повысить успешность нестабильных соединений, а большие чанки ускоряют загрузку для стабильных соединений.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Автоматически открыть общий доступ",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "Модуль создания общего доступа автоматически появляется, когда пользователь выбирает файлы, устраняя необходимость вручную нажать кнопку.",
"admin.config.smtp.enabled": "Включено", "admin.config.smtp.enabled": "Включено",
"admin.config.smtp.enabled.description": "Включено ли SMTP. Установите значение true только если вы ввели хост, порт, email, пользователь и пароль вашего SMTP-сервера.", "admin.config.smtp.enabled.description": "Включено ли SMTP. Установите значение true только если вы ввели хост, порт, email, пользователь и пароль вашего SMTP-сервера.",
"admin.config.smtp.host": "Хост", "admin.config.smtp.host": "Хост",
@@ -346,20 +362,20 @@ export default {
"admin.config.smtp.port": "Порт", "admin.config.smtp.port": "Порт",
"admin.config.smtp.port.description": "Порт SMTP сервера", "admin.config.smtp.port.description": "Порт SMTP сервера",
"admin.config.smtp.email": "Электронная почта", "admin.config.smtp.email": "Электронная почта",
"admin.config.smtp.email.description": "Адрес электронной почты, от которого отправляются письма", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Логин", "admin.config.smtp.username": "Логин",
"admin.config.smtp.username.description": "Имя пользователя SMTP сервера", "admin.config.smtp.username.description": "Имя пользователя SMTP сервера",
"admin.config.smtp.password": "Пароль", "admin.config.smtp.password": "Пароль",
"admin.config.smtp.password.description": "Пароль SMTP-сервера", "admin.config.smtp.password.description": "Пароль SMTP-сервера",
"admin.config.smtp.button.test": "Отправить тестовое письмо", "admin.config.smtp.button.test": "Отправить тестовое письмо",
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates", "admin.config.smtp.allow-unauthorized-certificates": "Доверять несанкционированным сертификатам SMTP-сервера",
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.", "admin.config.smtp.allow-unauthorized-certificates.description": "Установите это значение только в том случае, если вам нужно доверять самоподписанным сертификатам.",
"admin.config.oauth.allow-registration": "Разрешить регистрацию", "admin.config.oauth.allow-registration": "Разрешить регистрацию",
"admin.config.oauth.allow-registration.description": "Разрешить пользователям регистрироваться используя учетные записи социальных сетей", "admin.config.oauth.allow-registration.description": "Разрешить пользователям регистрироваться используя учетные записи социальных сетей",
"admin.config.oauth.ignore-totp": "Игнорировать TOTP", "admin.config.oauth.ignore-totp": "Игнорировать TOTP",
"admin.config.oauth.ignore-totp.description": "Игнорировать TOTP при использовании социальной авторизации", "admin.config.oauth.ignore-totp.description": "Игнорировать TOTP при использовании социальной авторизации",
"admin.config.oauth.disable-password": "Disable password login", "admin.config.oauth.disable-password": "Отключить логин и пароль",
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.", "admin.config.oauth.disable-password.description": "Следует ли отключать вход по паролю? \nПеред активацией этой конфигурации убедитесь, что поставщик OAuth настроен должным образом, чтобы избежать блокировки.",
"admin.config.oauth.github-enabled": "GitHub", "admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Включен ли логин на GitHub", "admin.config.oauth.github-enabled.description": "Включен ли логин на GitHub",
"admin.config.oauth.github-client-id": "ID клиента GitHub", "admin.config.oauth.github-client-id": "ID клиента GitHub",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Секретный ключ клиента в приложении Microsoft OAuth", "admin.config.oauth.microsoft-client-secret.description": "Секретный ключ клиента в приложении Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Включен ли логин Discord", "admin.config.oauth.discord-enabled.description": "Включен ли логин Discord",
"admin.config.oauth.discord-limited-users": "Discord limited users",
"admin.config.oauth.discord-limited-users.description": "Limit signing in to specific users by their Discord ID. Leave it blank to disable.",
"admin.config.oauth.discord-limited-guild": "ID ограниченного сервера Discord", "admin.config.oauth.discord-limited-guild": "ID ограниченного сервера Discord",
"admin.config.oauth.discord-limited-guild.description": "Ограничение входа для пользователей определенного сервера. Оставьте пустым, чтобы отключить.", "admin.config.oauth.discord-limited-guild.description": "Ограничение входа для пользователей определенного сервера. Оставьте пустым, чтобы отключить.",
"admin.config.oauth.discord-client-id": "ID клиента Discord", "admin.config.oauth.discord-client-id": "ID клиента Discord",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled", "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": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app", "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": "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-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": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret", "admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app", "admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "Упс, этой страницы не существует.", "404.description": "Упс, этой страницы не существует.",
"404.button.home": "Верните меня домой", "404.button.home": "Верните меня домой",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "Пользователь связанный с учетной записью {0} не существует.", "error.msg.no_user": "Пользователь связанный с учетной записью {0} не существует.",
"error.msg.no_email": "Не удается получить адрес электронной почты от учетной записи {0}.", "error.msg.no_email": "Не удается получить адрес электронной почты от учетной записи {0}.",
"error.msg.already_linked": "Эта учетная запись {0} уже привязана к другому аккаунту.", "error.msg.already_linked": "Эта учетная запись {0} уже привязана к другому аккаунту.",
"error.msg.not_linked": "Эта учетная запись {0} ещё не привязана ни к одному аккаунту.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "Эта учетная запись {0} не подтверждена, повторите попытку после подтверждения.", "error.msg.unverified_account": "Эта учетная запись {0} не подтверждена, повторите попытку после подтверждения.",
"error.msg.user_not_allowed": "У вас нет разрешения на вход.", "error.msg.user_not_allowed": "У вас нет разрешения на вход.",
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Сгенерировать", "common.button.generate": "Сгенерировать",
"common.button.done": "Готово", "common.button.done": "Готово",
"common.text.link": "Ссылка", "common.text.link": "Ссылка",
"common.text.navigate-to-link": "Go to the link", "common.text.navigate-to-link": "Перейти по ссылке",
"common.text.or": "или", "common.text.or": "или",
"common.text.redirecting": "Идет перенаправление...",
"common.button.go-back": "Назад", "common.button.go-back": "Назад",
"common.button.go-home": "Домой", "common.button.go-home": "Домой",
"common.notify.copied": "Ваша ссылка скопирована в буфер обмена", "common.notify.copied": "Ваша ссылка скопирована в буфер обмена",
"common.success": "Успешно", "common.notify.copied-link": "Ваша ссылка скопирована в буфер обмена",
"common.success": "Успех",
"common.error": "Ошибочка", "common.error": "Ошибочка",
"common.error.unknown": "Произошла неизвестная ошибка", "common.error.unknown": "Произошла неизвестная ошибка",
"common.error.invalid-email": "Недопустимый адрес электронной почты", "common.error.invalid-email": "Недопустимый адрес электронной почты",
"common.error.too-short": "Должно быть не менее {length} символов", "common.error.too-short": "Должно быть не менее {length} символов",
"common.error.too-long": "Должно быть не больше {length} символов", "common.error.too-long": "Должно быть не больше {length} символов",
"common.error.number-too-small": "Должно быть не меньше {min}",
"common.error.number-too-large": "Должно быть не больше {max}",
"common.error.exact-length": "Должно быть ровно {length} символов", "common.error.exact-length": "Должно быть ровно {length} символов",
"common.error.invalid-number": "Должно быть числом", "common.error.invalid-number": "Должно быть числом",
"common.error.field-required": "Поле обязательно для заполнения" "common.error.field-required": "Поле обязательно для заполнения"

View File

@@ -3,7 +3,7 @@ export default {
"navbar.upload": "Naloži", "navbar.upload": "Naloži",
"navbar.signin": "Vpis", "navbar.signin": "Vpis",
"navbar.home": "Domov", "navbar.home": "Domov",
"navbar.signup": "Registracija", "navbar.signup": "Sign up",
"navbar.links.shares": "Moja deljenja", "navbar.links.shares": "Moja deljenja",
"navbar.links.reverse": "Deljenja v obratni smeri", "navbar.links.reverse": "Deljenja v obratni smeri",
"navbar.avatar.account": "Moj račun", "navbar.avatar.account": "Moj račun",
@@ -16,9 +16,9 @@ export default {
"home.bullet.a.name": "Lastno-Gostovanje", "home.bullet.a.name": "Lastno-Gostovanje",
"home.bullet.a.description": "Gostuj Pingvin Share na svoji lastni napravi.", "home.bullet.a.description": "Gostuj Pingvin Share na svoji lastni napravi.",
"home.bullet.b.name": "Zasebnost", "home.bullet.b.name": "Zasebnost",
"home.bullet.b.description": "Vaše datoteke so samo vaše in ne bi nikoli smele pristati v rokah tretjih oseb.", "home.bullet.b.description": "Your files are yours and will never be accessed by third parties.",
"home.bullet.c.name": "Brez nadležnih omejitev velikosti datoteke", "home.bullet.c.name": "Brez nadležnih omejitev velikosti datoteke",
"home.bullet.c.description": "Naložite datoteke, velike kolikor želite. Omejuje vas samo vaš disk.", "home.bullet.c.description": "Upload files as big as you want. Only your hard drive will be your limit.",
"home.button.start": "Začnite zdaj", "home.button.start": "Začnite zdaj",
"home.button.source": "Izvorna koda", "home.button.source": "Izvorna koda",
// END / // END /
@@ -58,12 +58,12 @@ export default {
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Ste pozabili svoje geslo?", "resetPassword.title": "Ste pozabili svoje geslo?",
"resetPassword.description": "Vnesite svoj e-poštni naslov za ponastavitev gesla.", "resetPassword.description": "Vnesite svoj e-poštni naslov za ponastavitev gesla.",
"resetPassword.notify.success": "Sporočilo s povezavo za ponastavitev vašega gesla je bilo poslano, če vaš e-poštni naslov obstaja.", "resetPassword.notify.success": "A message with a link to reset your password has been sent if the provided email exists.",
"resetPassword.button.back": "Nazaj na stran za prijavo", "resetPassword.button.back": "Nazaj na stran za prijavo",
"resetPassword.text.resetPassword": "Ponastavi geslo", "resetPassword.text.resetPassword": "Ponastavi geslo",
"resetPassword.text.enterNewPassword": "Vnesite novo geslo", "resetPassword.text.enterNewPassword": "Vnesite novo geslo",
"resetPassword.input.password": "Novo geslo", "resetPassword.input.password": "Novo geslo",
"resetPassword.notify.passwordReset": "Vaše geslo je bilo uspešno ponastavljeno.", "resetPassword.notify.passwordReset": "Your password has been successfully reset.",
// /account // /account
"account.title": "Moj račun", "account.title": "Moj račun",
"account.card.info.title": "Informacije o računu", "account.card.info.title": "Informacije o računu",
@@ -73,7 +73,7 @@ export default {
"account.card.password.title": "Geslo", "account.card.password.title": "Geslo",
"account.card.password.old": "Staro geslo", "account.card.password.old": "Staro geslo",
"account.card.password.new": "Novo geslo", "account.card.password.new": "Novo geslo",
"account.card.password.noPasswordSet": "Vaše geslo ni nastavljeno. Če se želite prijaviti z e-pošto in geslom, morate imeti nastavljeno geslo.", "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": "Geslo je bilo uspešno posodobljeno", "account.notify.password.success": "Geslo je bilo uspešno posodobljeno",
"account.card.oauth.title": "Prijava z računi družbenih omrežij", "account.card.oauth.title": "Prijava z računi družbenih omrežij",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
@@ -85,7 +85,7 @@ export default {
"account.card.oauth.unlink": "Odstrani povezavo", "account.card.oauth.unlink": "Odstrani povezavo",
"account.card.oauth.unlinked": "Povezava je odstranjena", "account.card.oauth.unlinked": "Povezava je odstranjena",
"account.modal.unlink.title": "Odstrani povezavo z računom", "account.modal.unlink.title": "Odstrani povezavo z računom",
"account.modal.unlink.description": "Odstranitev povezave z računom družbenih omrežij lahko privede do izgube vašega računa, če se ne spomnite vašega uporabniškega imena in gesla.", "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": "Povezava je bila uspešno odstranjena", "account.notify.oauth.unlinked.success": "Povezava je bila uspešno odstranjena",
"account.card.security.title": "Varnost", "account.card.security.title": "Varnost",
"account.card.security.totp.enable.description": "Vnesite vašo trenutno geslo, da omogočite TOTP", "account.card.security.totp.enable.description": "Vnesite vašo trenutno geslo, da omogočite TOTP",
@@ -121,12 +121,15 @@ export default {
"account.shares.table.name": "Ime", "account.shares.table.name": "Ime",
"account.shares.table.description": "Opis", "account.shares.table.description": "Opis",
"account.shares.table.visitors": "Obiskovalci", "account.shares.table.visitors": "Obiskovalci",
"account.shares.table.expiresAt": "Poteče dne", "account.shares.table.expiresAt": "Expires on",
"account.shares.table.createdAt": "Ustvarjeno dne", "account.shares.table.createdAt": "Created on",
"account.shares.table.size": "Velikost", "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-informations": "Delite informacije",
"account.shares.modal.share-link": "Delite povezavo", "account.shares.modal.share-link": "Delite povezavo",
"account.shares.modal.delete.title": "Izbrišite delitev {share}", "account.shares.modal.delete.title": "Delete share: {share}",
"account.shares.modal.delete.description": "Ali res želite izbrisati to delitev?", "account.shares.modal.delete.description": "Ali res želite izbrisati to delitev?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
@@ -150,12 +153,12 @@ export default {
"account.reverseShares.modal.expiration.year-singular": "Leto", "account.reverseShares.modal.expiration.year-singular": "Leto",
"account.reverseShares.modal.expiration.year-plural": "Leta", "account.reverseShares.modal.expiration.year-plural": "Leta",
"account.reverseShares.modal.max-size.label": "Največja velikost delitve", "account.reverseShares.modal.max-size.label": "Največja velikost delitve",
"account.reverseShares.modal.send-email": "Pošlji e-poštno obvestilo", "account.reverseShares.modal.send-email": "Send email notifications",
"account.reverseShares.modal.send-email.description": "Pošlji e-poštno obvestilo, ko je ustvarjena delitev s povezavo te delitve v obratni smeri.", "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": "Simple mode",
"account.reverseShares.modal.simplified.description": "Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.", "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": "Public access",
"account.reverseShares.modal.public-access.description": "Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.", "account.reverseShares.modal.public-access.description": "Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
"account.reverseShares.modal.max-use.label": "Največ uporab", "account.reverseShares.modal.max-use.label": "Največ uporab",
"account.reverseShares.modal.max-use.description": "Največje število uporab URL-ja za ustvarjanje delitve.", "account.reverseShares.modal.max-use.description": "Največje število uporab URL-ja za ustvarjanje delitve.",
"account.reverseShare.never-expires": "Ta povezava delitve v obratni smeri ne bo nikoli potekla.", "account.reverseShare.never-expires": "Ta povezava delitve v obratni smeri ne bo nikoli potekla.",
@@ -183,14 +186,14 @@ export default {
"admin.users.table.username": "Uporabniško ime", "admin.users.table.username": "Uporabniško ime",
"admin.users.table.email": "E-pošta", "admin.users.table.email": "E-pošta",
"admin.users.table.admin": "Administrator", "admin.users.table.admin": "Administrator",
"admin.users.edit.update.title": "Uredi uporabnika {username}", "admin.users.edit.update.title": "Edit user: {username}",
"admin.users.edit.update.admin-privileges": "Administratorski privilegiji", "admin.users.edit.update.admin-privileges": "Administratorski privilegiji",
"admin.users.edit.update.change-password.title": "Spremenite geslo", "admin.users.edit.update.change-password.title": "Spremenite geslo",
"admin.users.edit.update.change-password.field": "Novo geslo", "admin.users.edit.update.change-password.field": "Novo geslo",
"admin.users.edit.update.change-password.button": "Shranite novo geslo", "admin.users.edit.update.change-password.button": "Shranite novo geslo",
"admin.users.edit.update.notify.password.success": "Geslo je bilo uspešno posodobljeno", "admin.users.edit.update.notify.password.success": "Geslo je bilo uspešno posodobljeno",
"admin.users.edit.delete.title": "Izbrišite uporabnika {username}", "admin.users.edit.delete.title": "Delete user: {username} ?",
"admin.users.edit.delete.description": "Ali res želite izbrisati tega uporabnika in vsa njegova deljenja?", "admin.users.edit.delete.description": "Do you really want to delete this user and all their shares?",
// showCreateUserModal.tsx // showCreateUserModal.tsx
"admin.users.modal.create.title": "Ustvarite uporabnika", "admin.users.modal.create.title": "Ustvarite uporabnika",
"admin.users.modal.create.username": "Uporabniško ime", "admin.users.modal.create.username": "Uporabniško ime",
@@ -206,17 +209,20 @@ export default {
"admin.shares.table.id": "Share ID", "admin.shares.table.id": "Share ID",
"admin.shares.table.username": "Creator", "admin.shares.table.username": "Creator",
"admin.shares.table.visitors": "Visitors", "admin.shares.table.visitors": "Visitors",
"admin.shares.table.expires": "Expires At", "admin.shares.table.expires": "Expires on",
"admin.shares.edit.delete.title": "Delete share {id}", "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": "Do you really want to delete this share?",
// END /admin/shares // END /admin/shares
// /upload // /upload
"upload.title": "Naložite", "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.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.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 // Dropzone.tsx
"upload.dropzone.title": "Naloži datoteke", "upload.dropzone.title": "Naloži datoteke",
"upload.dropzone.description": "Tukaj spustite datoteke, da začnete z delitvijo. Sprejemamo samo datoteke, ki so skupaj manjše od {maxSize}.", "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": "Vaše datoteke presegajo največjo dovoljeno velikost {maxSize}.", "upload.dropzone.notify.file-too-big": "Vaše datoteke presegajo največjo dovoljeno velikost {maxSize}.",
// FileList.tsx // FileList.tsx
"upload.filelist.name": "Ime", "upload.filelist.name": "Ime",
@@ -228,8 +234,8 @@ export default {
"upload.modal.not-signed-in": "Niste prijavljeni", "upload.modal.not-signed-in": "Niste prijavljeni",
"upload.modal.not-signed-in-description": "Ne boste mogli izbrisati vaših delitev in pregledati števila obiskovalcev.", "upload.modal.not-signed-in-description": "Ne boste mogli izbrisati vaših delitev in pregledati števila obiskovalcev.",
"upload.modal.expires.never": "nikoli", "upload.modal.expires.never": "nikoli",
"upload.modal.expires.never-long": "Nikoli ne poteče", "upload.modal.expires.never-long": "Permanent share",
"upload.modal.expires.error.too-long": "Dan poteka presega najvišji datum poteka {max}.", "upload.modal.expires.error.too-long": "Expiration date exceeds the maximum of {max}.",
"upload.modal.link.label": "Povezava", "upload.modal.link.label": "Povezava",
"upload.modal.expires.label": "Zapadlost", "upload.modal.expires.label": "Zapadlost",
"upload.modal.expires.minute-singular": "Minuta", "upload.modal.expires.minute-singular": "Minuta",
@@ -272,16 +278,16 @@ export default {
"share.error.access-denied.title": "Private share", "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.description": "The current account does not have permission to access this share",
"share.modal.password.title": "Zahtevano geslo", "share.modal.password.title": "Zahtevano geslo",
"share.modal.password.description": "Za ogled delitve vnesite geslo te delitve.", "share.modal.password.description": "Please enter the password to acces this share.",
"share.modal.password": "Geslo", "share.modal.password": "Geslo",
"share.modal.error.invalid-password": "Napačno geslo", "share.modal.error.invalid-password": "Napačno geslo",
"share.button.download-all": "Prenesi vse", "share.button.download-all": "Prenesi vse",
"share.notify.download-all-preparing": "Delitev je v pripravi. Prosimo poskusite ponovno čez nekaj minut.", "share.notify.download-all-preparing": "The share is being prepared. Please try again in a few minutes.",
"share.modal.file-link": "Povezava do datoteke", "share.modal.file-link": "Povezava do datoteke",
"share.table.name": "Ime", "share.table.name": "Ime",
"share.table.size": "Velikost", "share.table.size": "Velikost",
"share.modal.file-preview.error.not-supported.title": "Predogled ni mogoč", "share.modal.file-preview.error.not-supported.title": "Predogled ni mogoč",
"share.modal.file-preview.error.not-supported.description": "Predogled za to datoteko ni podprt. Prosimo prenesite datoteko, da si jo ogledate.", "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] // END /share/[id]
// /share/[id]/edit // /share/[id]/edit
"share.edit.title": "Uredite {shareId}", "share.edit.title": "Uredite {shareId}",
@@ -289,6 +295,12 @@ export default {
"share.edit.notify.generic-error": "Prišlo je do napake pri ustvarjanju vaše delitve.", "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", "share.edit.notify.save-success": "Delitev je bila uspešno posodbljena",
// END /share/[id]/edit // END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config // /admin/config
"admin.config.title": "Nastavitve", "admin.config.title": "Nastavitve",
"admin.config.category.general": "Splošno", "admin.config.category.general": "Splošno",
@@ -300,6 +312,8 @@ export default {
"admin.config.general.app-name.description": "Ime vaše aplikacije", "admin.config.general.app-name.description": "Ime vaše aplikacije",
"admin.config.general.app-url": "URL 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.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": "Prikaži domačo stran",
"admin.config.general.show-home-page.description": "Ali prikazati domačo stran", "admin.config.general.show-home-page.description": "Ali prikazati domačo stran",
"admin.config.general.session-duration": "Session Duration", "admin.config.general.session-duration": "Session Duration",
@@ -307,46 +321,48 @@ export default {
"admin.config.general.logo": "Logotip", "admin.config.general.logo": "Logotip",
"admin.config.general.logo.description": "Naložite novo sliko, da spremenite logotip. Datoteka mora biti tipa PNG in imeti razmerje 1:1.", "admin.config.general.logo.description": "Naložite novo sliko, da spremenite logotip. Datoteka mora biti tipa PNG in imeti razmerje 1:1.",
"admin.config.general.logo.placeholder": "Izberite sliko", "admin.config.general.logo.placeholder": "Izberite sliko",
"admin.config.email.enable-share-email-recipients": "Omogoči prejemnike delitve po e-pošti", "admin.config.email.enable-share-email-recipients": "Enable email recipient sharing",
"admin.config.email.enable-share-email-recipients.description": "Ali dovolite pošiljanje delitve po e-pošti. Omogočite samo v primeru, da imate omogočen SMTP.", "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": "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-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": "Vsebina poslane delitve",
"admin.config.email.share-recipients-message.description": "Vsebina e-poštnega sporočila, ki bo poslana prejemnikom delitve. Spremenljivke, ki so na voljo:\n{creator} - uporabniško ime ustvarjalca delitve\n{shareUrl} - URL delitve\n{desc} - vsebina delitve\n{expires} - datum poteka delitve\n Spremenljivke bodo zamenjane z dejanskimi vrednostmi.", "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": "Zadeva delitve v obratni smeri",
"admin.config.email.reverse-share-subject.description": "Zadeva e-poštnega sporočila, ki bo poslan, ko nekdo ustvari delitev z vašo povezavo.", "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", "admin.config.email.reverse-share-message": "Vsebina delitve v obratni smeri",
"admin.config.email.reverse-share-message.description": "Vsebina e-poštnega sporočila, ki bo poslan, ko nekdo ustvari delitev v obratni smeri. {shareUrl} bo zamenjan z uporabniškim imenom ustvarjalca in URL-jom delitve.", "admin.config.email.reverse-share-message.description": "Vsebina e-poštnega sporočila, ki bo poslan, ko nekdo ustvari delitev v obratni smeri. {shareUrl} bo zamenjan z uporabniškim imenom ustvarjalca in URL-jom delitve.",
"admin.config.email.reset-password-subject": "Zadeva ponastavitve gesla", "admin.config.email.reset-password-subject": "Zadeva ponastavitve gesla",
"admin.config.email.reset-password-subject.description": "Zadeva e-poštnega sporočila, ki bo poslan, ko uporabnik zahteva ponastavitev gesla.", "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": "Vsebina za ponastavitev gesla", "admin.config.email.reset-password-message": "Vsebina za ponastavitev gesla",
"admin.config.email.reset-password-message.description": "Vsebina e-poštnega sporočila, ki bo poslan, ko uporabnik zahteva ponastavitev gesla. {url} bo zamenjan z URL-jem za ponastavitev gesla.", "admin.config.email.reset-password-message.description": "Vsebina e-poštnega sporočila, ki bo poslan, ko uporabnik zahteva ponastavitev gesla. {url} bo zamenjan z URL-jem za ponastavitev gesla.",
"admin.config.email.invite-subject": "Zadeva povabila", "admin.config.email.invite-subject": "Zadeva povabila",
"admin.config.email.invite-subject.description": "Zadeva e-poštnega sporočila, ki je poslan, ko administrator povabi uporabnika.", "admin.config.email.invite-subject.description": "Subject of the sent email when an admin invites a user.",
"admin.config.email.invite-message": "Vsebina povabila", "admin.config.email.invite-message": "Vsebina povabila",
"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 password of the user.", "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": "Dovoli registracijo", "admin.config.share.allow-registration": "Dovoli registracijo",
"admin.config.share.allow-registration.description": "Če je registracija dovoljena", "admin.config.share.allow-registration.description": "Če je registracija dovoljena",
"admin.config.share.allow-unauthenticated-shares": "Dovoli delitve s strani neprijavljenih uporabnikov", "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.allow-unauthenticated-shares.description": "Če lahko neprijavljeni uporabniki ustvarijo delitve",
"admin.config.share.max-expiration": "Najvišja zapadlost", "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": "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": "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.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": "Velikost delcev",
"admin.config.share.chunk-size.description": "Prilagodite velikost delcev (v bajtih) vaših nalaganj, da uravnovesite med učinkovitostjo in zanesljivostjo glede na vašo internetno povezavo. Manjša velikost delcev lahko zviša uspešnost nalaganj pri nestabilni povezavi, medtem ko večja velikost delcev poviša hitrost nalaganja pri stabilni povezavi.", "admin.config.share.chunk-size.description": "Adjust the chunk size for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
"admin.config.share.auto-open-share-modal": "Auto open create share modal", "admin.config.share.auto-open-share-modal": "Auto open create share modal",
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.", "admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
"admin.config.smtp.enabled": "Omogočeno", "admin.config.smtp.enabled": "Enable",
"admin.config.smtp.enabled.description": "Če je SMTP omogočen. Omogočite samo, če ste vnesli strežnik, vrata, e-pošto, uporabniško ime in geslo vašega SMTP strežnika.", "admin.config.smtp.enabled.description": "Če je SMTP omogočen. Omogočite samo, če ste vnesli strežnik, vrata, e-pošto, uporabniško ime in geslo vašega SMTP strežnika.",
"admin.config.smtp.host": "Gostitelj", "admin.config.smtp.host": "Gostitelj",
"admin.config.smtp.host.description": "Gostitelj SMTP strežnika", "admin.config.smtp.host.description": "Gostitelj SMTP strežnika",
"admin.config.smtp.port": "Vrata", "admin.config.smtp.port": "Vrata",
"admin.config.smtp.port.description": "Vrata SMTP strežnika", "admin.config.smtp.port.description": "Vrata SMTP strežnika",
"admin.config.smtp.email": "E-pošta", "admin.config.smtp.email": "E-pošta",
"admin.config.smtp.email.description": "E-poštni naslov, s katerega bodo poslana e-poštna sporočila", "admin.config.smtp.email.description": "Email address from wich the emails get sent",
"admin.config.smtp.username": "Uporabniško ime", "admin.config.smtp.username": "Uporabniško ime",
"admin.config.smtp.username.description": "Uporabniško ime SMTP strežnika", "admin.config.smtp.username.description": "Uporabniško ime SMTP strežnika",
"admin.config.smtp.password": "Geslo", "admin.config.smtp.password": "Geslo",
@@ -382,6 +398,8 @@ export default {
"admin.config.oauth.microsoft-client-secret.description": "Skrivnost klienta Microsoft OAuth aplikacije", "admin.config.oauth.microsoft-client-secret.description": "Skrivnost klienta Microsoft OAuth aplikacije",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Če je dovoljena prijava z Discord računom", "admin.config.oauth.discord-enabled.description": "Če je dovoljena prijava z Discord računom",
"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": "ID omejenega Discord strežnika", "admin.config.oauth.discord-limited-guild": "ID omejenega Discord strežnika",
"admin.config.oauth.discord-limited-guild.description": "Omogoči omejitev prijave uporabnika v specifičen strežnik. Pustite prazno, da onemogočite.", "admin.config.oauth.discord-limited-guild.description": "Omogoči omejitev prijave uporabnika v specifičen strežnik. Pustite prazno, da onemogočite.",
"admin.config.oauth.discord-client-id": "Discord ID klienta", "admin.config.oauth.discord-client-id": "Discord ID klienta",
@@ -392,6 +410,10 @@ export default {
"admin.config.oauth.oidc-enabled.description": "Če je dovoljena prijava z OpenID Connect", "admin.config.oauth.oidc-enabled.description": "Če je dovoljena prijava z OpenID Connect",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect URI za odkrivanje", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect URI za odkrivanje",
"admin.config.oauth.oidc-discovery-uri.description": "URI za odkrivanje OpenID Connect OAuth aplikacije", "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": "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-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", "admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
@@ -405,20 +427,53 @@ export default {
"admin.config.oauth.oidc-client-secret": "OpenID Connect skrivnost klienta", "admin.config.oauth.oidc-client-secret": "OpenID Connect skrivnost klienta",
"admin.config.oauth.oidc-client-secret.description": "Skrivnost klienta OpenID Connect OAuth aplikacije", "admin.config.oauth.oidc-client-secret.description": "Skrivnost klienta OpenID Connect OAuth aplikacije",
"admin.config.category.ldap": "LDAP", "admin.config.category.ldap": "LDAP",
"admin.config.ldap.enabled": "Enabled LDAP", "admin.config.ldap.enabled": "Enable LDAP",
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login", "admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
"admin.config.ldap.url": "Server URL", "admin.config.ldap.url": "Server URL",
"admin.config.ldap.url.description": "URL of the LDAP server", "admin.config.ldap.url.description": "URL of the LDAP server",
"admin.config.ldap.bind-dn": "Bind DN", "admin.config.ldap.bind-dn": "Bind DN",
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search", "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": "Bind password",
"admin.config.ldap.bind-password.description": "Password for the user search user", "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": "User base",
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed", "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": "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.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": "Admin group",
"admin.config.ldap.admin-groups.description": "Group required for administrative access.", "admin.config.ldap.admin-groups.description": "Group required for administrative access.",
"admin.config.ldap.field-name-member-of": "User groups attribute name",
"admin.config.ldap.field-name-member-of.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.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
"404.description": "Ups! Ta stran ne obstaja.", "404.description": "Ups! Ta stran ne obstaja.",
"404.button.home": "Pelji me domov", "404.button.home": "Pelji me domov",
@@ -433,10 +488,10 @@ export default {
"error.msg.no_user": "Uporabnik povezan na račun {0} ne obstaja.", "error.msg.no_user": "Uporabnik povezan na račun {0} ne obstaja.",
"error.msg.no_email": "Ne najdemo e-poštnega naslova za račun {0}.", "error.msg.no_email": "Ne najdemo e-poštnega naslova za račun {0}.",
"error.msg.already_linked": "Račun {0} je že povezan na drug račun.", "error.msg.already_linked": "Račun {0} je že povezan na drug račun.",
"error.msg.not_linked": "Račun {0} še ni povezan z nobenim računom.", "error.msg.not_linked": "This {0} account hasn't been linked to any account yet.",
"error.msg.unverified_account": "Račun {0} je nepreverjen, prosimo poskusite ponovno po preverjanju.", "error.msg.unverified_account": "Račun {0} je nepreverjen, prosimo poskusite ponovno po preverjanju.",
"error.msg.user_not_allowed": "Nimate dovoljenja za prijavo.", "error.msg.user_not_allowed": "Nimate dovoljenja za prijavo.",
"error.msg.cannot_get_user_info": "Ne moremo najti uporabniških informacij za račun {0}.", "error.msg.cannot_get_user_info": "Cannot get your user info from this {0} account.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
@@ -454,17 +509,21 @@ export default {
"common.button.generate": "Generiraj", "common.button.generate": "Generiraj",
"common.button.done": "Končano", "common.button.done": "Končano",
"common.text.link": "Poveži", "common.text.link": "Poveži",
"common.text.navigate-to-link": "Pojdi na povezavo", "common.text.navigate-to-link": "Visit link",
"common.text.or": "ali", "common.text.or": "ali",
"common.text.redirecting": "Redirecting...",
"common.button.go-back": "Nazaj", "common.button.go-back": "Nazaj",
"common.button.go-home": "Pojdi domov", "common.button.go-home": "Pojdi domov",
"common.notify.copied": "Povezava je bila kopirana v odložišče", "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.success": "Uspešno",
"common.error": "Napaka", "common.error": "Napaka",
"common.error.unknown": "Prišlo je do neznane napake", "common.error.unknown": "Prišlo je do neznane napake",
"common.error.invalid-email": "Neveljaven e-poštni naslov", "common.error.invalid-email": "Neveljaven e-poštni naslov",
"common.error.too-short": "Vsebovati mora vsaj {length} znakov", "common.error.too-short": "Vsebovati mora vsaj {length} znakov",
"common.error.too-long": "Vsebuje lahko največ {length} znakov", "common.error.too-long": "Vsebuje lahko največ {length} znakov",
"common.error.number-too-small": "Must be at least {min}",
"common.error.number-too-large": "Must be at most {max}",
"common.error.exact-length": "Dolžina mora biti točno {length} znakov", "common.error.exact-length": "Dolžina mora biti točno {length} znakov",
"common.error.invalid-number": "Mora biti številka", "common.error.invalid-number": "Mora biti številka",
"common.error.field-required": "To polje je obvezno" "common.error.field-required": "To polje je obvezno"

View File

@@ -0,0 +1,530 @@
export default {
// Navbar
"navbar.upload": "Otpremi",
"navbar.signin": "Prijava",
"navbar.home": "Početna",
"navbar.signup": "Registracija",
"navbar.links.shares": "Moja deljenja",
"navbar.links.reverse": "Obrnuto deljenje",
"navbar.avatar.account": "Moj nalog",
"navbar.avatar.admin": "Administracija",
"navbar.avatar.signout": "Odjavi se",
// END navbar
// /
"home.title": "<h>Samo-hostovana</h> platforma za deljenje fajlova.",
"home.description": "Da li zaista želite da date svoje lične datoteke u ruke trećih strana kao što je WeTransfer?",
"home.bullet.a.name": "Samo-hostovano",
"home.bullet.a.description": "Hostujte Pingvin Share na svojoj mašini.",
"home.bullet.b.name": "Privatnost",
"home.bullet.b.description": "Vaše datoteke su vaše i nikada neće biti dostupne trećim stranama.",
"home.bullet.c.name": "Nema dosadnog ograničenja veličine datoteke",
"home.bullet.c.description": "Otpremite onoliko velikih datoteka koliko želite. Samo vaš čvrsti disk je granica.",
"home.button.start": "Započni",
"home.button.source": "Izvorni kod",
// END /
// /auth/signin
"signin.title": "Dobrodošli nazad",
"signin.description": "Još uvek nemate nalog?",
"signin.button.signup": "Registruj se",
"signin.input.email-or-username": "Imejl ili korisničko ime",
"signin.input.email-or-username.placeholder": "Vaš imejl 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": "Napravi nalog",
"signup.description": "Već imate nalog?",
"signup.button.signin": "Prijavite se",
"signup.input.username": "Korisničko ime",
"signup.input.username.placeholder": "Vaše korisničko ime",
"signup.input.email": "Imejl",
"signup.input.email.placeholder": "Vaš imejl",
"signup.button.submit": "Hajde da počnemo",
// 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 imejl da biste resetovali lozinku.",
"resetPassword.notify.success": "Poruka sa linkom za resetovanje lozinke je poslata ako uneta i-mejl adresa postoji.",
"resetPassword.button.back": "Nazad na stranicu za prijavu",
"resetPassword.text.resetPassword": "Obnovi lozinku",
"resetPassword.text.enterNewPassword": "Unesite vašu novu lozinku",
"resetPassword.input.password": "Nova lozinka",
"resetPassword.notify.passwordReset": "Vaša lozinka je uspešno resetovana.",
// /account
"account.title": "Moj nalog",
"account.card.info.title": "Podaci o nalogu",
"account.card.info.username": "Korisničko ime",
"account.card.info.email": "Imejl",
"account.notify.info.success": "Nalog je uspeš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. Da biste se prijavili koristeći i-mejl i lozinku, potrebno je da napravite lozinku.",
"account.notify.password.success": "Lozinka je uspešno promenjena",
"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": "Prekini vezu",
"account.card.oauth.unlinked": "Veza je prekinuta",
"account.modal.unlink.title": "Prekini vezu sa nalogom",
"account.modal.unlink.description": "Uklanjanje veze sa vašim društvenim nalozima može dovesti do gubitka vašeg naloga ako se ne sećate svojih pristupnih podataka",
"account.notify.oauth.unlinked.success": "Veza je prekinuta",
"account.card.security.title": "Bezbednost",
"account.card.security.totp.enable.description": "Unesite svoju trenutnu lozinku da biste počeli da omogućavate TOTP",
"account.card.security.totp.disable.description": "Unesite svoju trenutnu lozinku da 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": "Verifikuj",
"account.notify.totp.disable": "TOTP je uspešno onemogućen",
"account.notify.totp.enable": "TOTP je uspešno omogućen",
"account.card.language.title": "Jezik",
"account.card.language.description": "Projekat je preveden od strane zajednice. Neki jezici mogu biti nepotpuni.",
"account.card.color.title": "Šema boja",
// ThemeSwitcher.tsx
"account.theme.dark": "Tamno",
"account.theme.light": "Svetlo",
"account.theme.system": "Sistem",
"account.button.delete": "Izbriši Nalog",
"account.modal.delete.title": "Izbriši Nalog",
"account.modal.delete.description": "Da li zaista želite da izbrišete svoj nalog uključujući sve vaše aktivne deljenja?",
// END /account
// /account/shares
"account.shares.title": "Moja deljenja",
"account.shares.title.empty": "Ovde je prazno 👀",
"account.shares.description.empty": "Nemate nikakva deljenja.",
"account.shares.button.create": "Napravite",
"account.shares.info.title": "Delite informacije",
"account.shares.table.id": "ID",
"account.shares.table.name": "Naziv",
"account.shares.table.description": "Opis",
"account.shares.table.visitors": "Posetioci",
"account.shares.table.expiresAt": "Ističe",
"account.shares.table.createdAt": "Napravljeno",
"account.shares.table.size": "Veličina",
"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": "Deli vezu",
"account.shares.modal.delete.title": "Izbriši deljenje {share}",
"account.shares.modal.delete.description": "Da li zaista želite da izbrišete ovo deljenje?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Obrnuto deljenje",
"account.reverseShares.description": "Obrnuto deljenje vam omogućava da generišete jedinstveni URL koji omogućava spoljnim korisnicima da kreiraju deljenje.",
"account.reverseShares.title.empty": "Ovde je prazno 👀",
"account.reverseShares.description.empty": "Nemate obrnutih deljenja.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Kreirajte obrnuto deljenje",
"account.reverseShares.modal.expiration.label": "Ističe",
"account.reverseShares.modal.expiration.minute-singular": "Minut",
"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": "Sedmica",
"account.reverseShares.modal.expiration.week-plural": "Sedmice",
"account.reverseShares.modal.expiration.month-singular": "Mesec",
"account.reverseShares.modal.expiration.month-plural": "Meseci",
"account.reverseShares.modal.expiration.year-singular": "Godina",
"account.reverseShares.modal.expiration.year-plural": "Godine",
"account.reverseShares.modal.max-size.label": "Maksimalna veličina deljenja",
"account.reverseShares.modal.send-email": "Pošalji obaveštenja i-mejlom",
"account.reverseShares.modal.send-email.description": "Pošalji obaveštenje imejlom kada se kreira deljenje pomoću ove obrnute veze za deljenje.",
"account.reverseShares.modal.simplified": "Jednostavan režim",
"account.reverseShares.modal.simplified.description": "Olakšajte osobi koja otprema fajl da ga podeli sa vama. Oni će moći da prilagode samo ime i opis deljenja.",
"account.reverseShares.modal.public-access": "Javni pristup",
"account.reverseShares.modal.public-access.description": "Učini da deljenja kreirana ovim reverznim linkom za deljenje budu javna. Ako je onemogućeno, samo vi i kreator deljenja ćete imati pristup za pregled.",
"account.reverseShares.modal.max-use.label": "Maksimalan broj korišćenja",
"account.reverseShares.modal.max-use.description": "Maksimalan broj puta koji ovaj URL može da se koristi za pravljenje deljenja.",
"account.reverseShare.never-expires": "Ovo obrnuto deljenje nikada neće isteći.",
"account.reverseShare.expires-on": "Ovo obrnuto deljenje će isteći {expiration}.",
"account.reverseShares.table.no-shares": "Još nema kreiranih deljenja",
"account.reverseShares.table.count.singular": "deljenje",
"account.reverseShares.table.count.plural": "deljenja",
"account.reverseShares.table.shares": "Deljenja",
"account.reverseShares.table.remaining": "Preostala upotreba",
"account.reverseShares.table.max-size": "Maksimalna veličina deljenja",
"account.reverseShares.table.expires": "Ističe u",
"account.reverseShares.modal.reverse-share-link": "Link za obrnuto deljenje",
"account.reverseShares.modal.delete.title": "Obrišite obrnuto deljenje",
"account.reverseShares.modal.delete.description": "Da li zaista želite da izbrišete ovo obrnuto deljenje? Ako to učinite, pridružena deljenja će takođe biti izbrisana.",
// END /account/reverseShares
// /admin
"admin.title": "Administracija",
"admin.button.users": "Upravljanje korisnicima",
"admin.button.shares": "Upravljanje deljenjem",
"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": "Imejl",
"admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Uredite korisnika: {username}",
"admin.users.edit.update.admin-privileges": "Administratorske privilegije",
"admin.users.edit.update.change-password.title": "Promenite lozinku",
"admin.users.edit.update.change-password.field": "Nova lozinka",
"admin.users.edit.update.change-password.button": "Snimite novu lozinku",
"admin.users.edit.update.notify.password.success": "Lozinka je uspešno promenjena",
"admin.users.edit.delete.title": "Obrišite korisnika: {username} ?",
"admin.users.edit.delete.description": "Da li zaista želite da obrišete ovog korisnika i sva njegova deljenja?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Kreiraj korisnika",
"admin.users.modal.create.username": "Korisničko ime",
"admin.users.modal.create.email": "Imejl",
"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 imejl sa vezom za postavljanje lozinke.",
"admin.users.modal.create.admin": "Administratorske privilegije",
"admin.users.modal.create.admin.description": "Ako je označeno, korisnik će moći da pristupi administrativnom panelu.",
// END /admin/users
// /admin/shares
"admin.shares.title": "Upravljanje deljenjem",
"admin.shares.table.id": "ID deljenja",
"admin.shares.table.username": "Kreator",
"admin.shares.table.visitors": "Posetioci",
"admin.shares.table.expires": "Ističe",
"admin.shares.edit.delete.title": "Obriši deljenje: {id}",
"admin.shares.edit.delete.description": "Da li zaista želite da obrišete ovo deljenje?",
// END /admin/shares
// /upload
"upload.title": "Pošalji",
"upload.notify.confirm-leave": "Da li ste sigurni da želite da napustite ovu stranicu? Vaše otpremanje će biti otkazano.",
"upload.notify.generic-error": "Došlo je do greške pri dovršavanju deljenja.",
"upload.notify.count-failed": "Otpremanje {count} datoteka nije uspelo. Pokušavam ponovo.",
"upload.reverse-share.error.invalid.title": "Nepravilan link za obrnuto deljenje",
"upload.reverse-share.error.invalid.description": "Ovo obrnuto deljenje je isteklo ili je nevažeće.",
// Dropzone.tsx
"upload.dropzone.title": "Pošalji datoteke",
"upload.dropzone.description": "Prevucite i otpustite datoteke ovde da biste započeli deljenje. Prihvatamo samo fajlove ukupne veličine do {maxSize}.",
"upload.dropzone.notify.file-too-big": "Vaše datoteke premašuju maksimalnu veličinu deljenja od {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Naziv",
"upload.filelist.size": "Veličina",
// showCreateUploadModal.tsx
"upload.modal.title": "Napravi deljenje",
"upload.modal.link.error.invalid": "Može da sadrži samo slova, brojeve, donje crte i crtice",
"upload.modal.link.error.taken": "Ovaj link je već u upotrebi",
"upload.modal.not-signed-in": "Niste prijavljeni",
"upload.modal.not-signed-in-description": "Nećete moći ručno da izbrišete svoje deljenje i vidite broj posetilaca.",
"upload.modal.expires.never": "nikad",
"upload.modal.expires.never-long": "Trajno deljenje",
"upload.modal.expires.error.too-long": "Datum isteka prevazilazi maksimalnu vrednost od {max}.",
"upload.modal.link.label": "Link",
"upload.modal.expires.label": "Ističe",
"upload.modal.expires.minute-singular": "Minut",
"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": "Sedmica",
"upload.modal.expires.week-plural": "Sedmice",
"upload.modal.expires.month-singular": "Mesec",
"upload.modal.expires.month-plural": "Meseci",
"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 primaoce ovog deljenja",
"upload.modal.accordion.email.title": "Primaoci imejla",
"upload.modal.accordion.email.placeholder": "Unesite primaoce imejla",
"upload.modal.accordion.email.invalid-email": "Neispravna adresa imejla",
"upload.modal.accordion.security.title": "Sigurnosna podešavanja",
"upload.modal.accordion.security.password.label": "Zaštita lozinkom",
"upload.modal.accordion.security.password.placeholder": "Nema lozinke",
"upload.modal.accordion.security.max-views.label": "Maksimalan broj pregleda",
"upload.modal.accordion.security.max-views.placeholder": "Bez limita",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Ovo deljenje nikada neće isteći.",
"upload.modal.completed.expires-on": "Ovo deljenje će isteći {expiration}.",
"upload.modal.completed.share-ready": "Deljenje je spremno",
"upload.modal.completed.notified-reverse-share-creator": "Obavestili smo kreatora reverznog deljenja. Takođe možete ručno podeliti ovaj link sa njima na druge načine.",
// END /upload
// /share/[id]
"share.title": "Deljenje {shareId}",
"share.description": "Pogledajte šta sam podelio sa vama!",
"share.error.visitor-limit-exceeded.title": "Prekoračeno je ograničenje posetilaca",
"share.error.visitor-limit-exceeded.description": "Ograničenje posetilaca iz ovog deljenja je premašeno.",
"share.error.removed.title": "Deljenje je uklonjeno",
"share.error.not-found.title": "Deljenje nije pronađeno",
"share.error.not-found.description": "Udeo koji tražite ne postoji.",
"share.error.access-denied.title": "Privatno deljenje",
"share.error.access-denied.description": "Trenutni nalog nema dozvolu za pristup ovom deljenju",
"share.modal.password.title": "Obavezna lozinka",
"share.modal.password.description": "Molimo unesite lozinku za pristup ovom deljenju.",
"share.modal.password": "Lozinka",
"share.modal.error.invalid-password": "Neispravna lozinka",
"share.button.download-all": "Preuzmi sve",
"share.notify.download-all-preparing": "Deljenje se priprema. Molimo pokušajte ponovo za nekoliko minuta.",
"share.modal.file-link": "Veza 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 ovaj tip datoteka. Molimo preuzmite fajl da biste ga pregledali.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Uredi {shareId}",
"share.edit.append-upload": "Nadodaj fajl",
"share.edit.notify.generic-error": "Došlo je do greške prilikom završetka vašeg deljenja.",
"share.edit.notify.save-success": "Deljenje je uspešno ažurirano",
// END /share/[id]/edit
// /imprint
"imprint.title": "Imprint",
// END /imprint
// /privacy
"privacy.title": "Privacy Policy",
// END /privacy
// /admin/config
"admin.config.title": "Konfiguracija",
"admin.config.category.general": "Opšte",
"admin.config.category.share": "Deljenje",
"admin.config.category.email": "Imejl",
"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": "Bezbedni kolačići",
"admin.config.general.secure-cookies.description": "Da li želite da postavite zastavicu za bezbednost na kolačiće? Ako je omogućeno, sajt neće funkcionisati kada mu pristupate preko HTTP-a.",
"admin.config.general.show-home-page": "Prikaži početnu stranicu",
"admin.config.general.show-home-page.description": "Da li da se prikaže početna stranica",
"admin.config.general.session-duration": "Trajanje sesije",
"admin.config.general.session-duration.description": "Vreme u satima nakon kojeg korisnik mora ponovo da se prijavi (podrazumevano: 3 meseca).",
"admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Promenite svoj logotip tako što ćete otpremiti novu sliku. Slika mora da bude PNG i treba da ima format 1:1.",
"admin.config.general.logo.placeholder": "Izaberi sliku",
"admin.config.email.enable-share-email-recipients": "Omogući deljenje sa primaocima imejlom",
"admin.config.email.enable-share-email-recipients.description": "Da li dozvoliti deljenje sa primaocima putem imejla. Omogućite ovo samo ako je SMTP aktiviran.",
"admin.config.email.share-recipients-subject": "Podelite naslov primaoca",
"admin.config.email.share-recipients-subject.description": "Tema imejla koja se šalje primaocima deljenja.",
"admin.config.email.share-recipients-message": "Delite poruku primaoca",
"admin.config.email.share-recipients-message.description": "Poruka koja se šalje primaocima deljenja. Dostupne promenljive:\n{creator} - Korisničko ime kreatora deljenja\n{creatorEmail} - Imejl kreatora deljenja\n{shareUrl} - URL deljenja\n{desc} - Opis deljenja\n{expires} - Datum isteka deljenja\nOve promenljive će biti zamenjene stvarnim vrednostima.",
"admin.config.email.reverse-share-subject": "Tema obrnutog deljenja",
"admin.config.email.reverse-share-subject.description": "Naslov imejla koji se šalje kada neko kreira deljenje sa vašim reverznim linkom za deljenje.",
"admin.config.email.reverse-share-message": "Obrnuto deljenje poruka",
"admin.config.email.reverse-share-message.description": "Poruka koja se šalje kada je neko napravio deljenje sa vašom obrnutom vezom za deljenje. {shareUrl} će biti zamenjen imenom kreatora i URL-om za deljenje.",
"admin.config.email.reset-password-subject": "Resetujte temu lozinke",
"admin.config.email.reset-password-subject.description": "Naslov imejla koji se šalje kada korisnik zatraži resetovanje lozinke.",
"admin.config.email.reset-password-message": "Poruka za resetovanje lozinke",
"admin.config.email.reset-password-message.description": "Poruka koja se šalje kada korisnik zatraži resetovanje lozinke. {url} će biti zamenjen linkom za resetovanje lozinke.",
"admin.config.email.invite-subject": "Pozivna tema",
"admin.config.email.invite-subject.description": "Naslov e-pošte koja se šalje kada administrator pozove korisnika.",
"admin.config.email.invite-message": "Pozivna poruka",
"admin.config.email.invite-message.description": "Poruka koja se šalje kada administrator pozove korisnika. {url} će biti zamenjen linkom za poziv, {email} imejlom, a {password} lozinkom korisnika.",
"admin.config.share.allow-registration": "Dozvoli registraciju",
"admin.config.share.allow-registration.description": "Da li je registracija dozvoljena",
"admin.config.share.allow-unauthenticated-shares": "Dozvoli deljenje bez autentifikacije",
"admin.config.share.allow-unauthenticated-shares.description": "Da li korisnici bez autentifikacije mogu da kreiraju deljenja",
"admin.config.share.max-expiration": "Maksimalni rok trajanja",
"admin.config.share.max-expiration.description": "Maximum share expiration. Set to 0 to allow unlimited expiration.",
"admin.config.share.share-id-length": "Dužina podrazumevanog ID-a za deljenje",
"admin.config.share.share-id-length.description": "Podrazumevana dužina generisanog ID-a za deljenje. Ova vrednost se takođe koristi za generisanje linkova za obrnuto deljenje. Vrednost ispod 8 se ne smatra bezbednom.",
"admin.config.share.max-size": "Maksimalna veličina",
"admin.config.share.max-size.description": "Maksimalna veličina deljenja",
"admin.config.share.zip-compression-level": "Nivo Zip kompresije",
"admin.config.share.zip-compression-level.description": "Podesite nivo da biste balansirali između veličine datoteke i brzine kompresije. Važeće vrednosti se kreću od 0 do 9, pri čemu je 0 bez kompresije, a 9 je maksimalna kompresija. ",
"admin.config.share.chunk-size": "Veličina komada",
"admin.config.share.chunk-size.description": "Podesite veličinu dela za vaša otpremanje kako biste uravnotežili efikasnost i pouzdanost u skladu sa vašom internet vezom. Manji delovi mogu poboljšati stopu uspeha za nestabilne veze, dok veći delovi omogućavaju brže otpremanje za stabilne veze.",
"admin.config.share.auto-open-share-modal": "Automatski otvori stvaranje modala deljenja",
"admin.config.share.auto-open-share-modal.description": "Modal za kreiranje deljenja automatski se pojavljuje kada korisnik izabere datoteke, eliminišući potrebu za ručnim klikom na dugme.",
"admin.config.smtp.enabled": "Omogući",
"admin.config.smtp.enabled.description": "Da li je SMTP omogućen. Postavite ovo na tačno samo ako ste uneli host, port, imejl, korisnika 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": "Imejl",
"admin.config.smtp.email.description": "Adresa imejla sa kojeg se poruke šalju",
"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šalji testni imejl",
"admin.config.smtp.allow-unauthorized-certificates": "Verovanje neautorizovanim SMTP serverskim sertifikatima",
"admin.config.smtp.allow-unauthorized-certificates.description": "Ovo postavite na \"istina\" samo ako je potrebno verovati samo-potpisanim sertifikatima.",
"admin.config.oauth.allow-registration": "Dozvoli registraciju",
"admin.config.oauth.allow-registration.description": "Dozvolite korisnicima da se registruju putem društvene prijave",
"admin.config.oauth.ignore-totp": "Zanemari TOTP",
"admin.config.oauth.ignore-totp.description": "Da li da ignorišete TOTP kada korisnik koristi prijavu na društvenim mrežama",
"admin.config.oauth.disable-password": "Onemogućite prijavu lozinkom",
"admin.config.oauth.disable-password.description": "Omogućiti prijavu lozinkom ili ne\nUverite se da je provajder za OAuth pravilno konfigurisan pre aktiviranja ove konfiguracije kako biste izbegli zaključavanje naloga.",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Da li je prijavljivanje na GitHub omogućeno",
"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": "Da li je prijavljivanje na Google omogućeno",
"admin.config.oauth.google-client-id": "ID Google 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": "Da li je prijavljivanje na Microsoft omogućeno",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
"admin.config.oauth.microsoft-tenant.description": "ID zakupca za Microsoft OAuth aplikaciju\nuobičajeno: Korisnici sa ličnim Microsoft nalogom i poslovnim ili školskim nalogom sa Microsoft Entra ID-a mogu da se prijave u aplikaciju. organizacije: Samo korisnici sa poslovnim ili školskim nalozima sa Microsoft Entra ID-a mogu da se prijave u aplikaciju.\npotrošači: Samo korisnici sa ličnim Microsoft nalogom mogu da se prijave u aplikaciju.\nime domena zakupca Microsoft Entra ID ili ID zakupca u GUID formatu: Samo korisnici iz određenog Microsoft Entra ID stanara (članovi direktorijuma sa poslovnim ili školskim nalogom ili gosti direktorijuma sa ličnim Microsoft nalogom) mogu da se prijave 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 Microsot OAuth aplikaciju",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Da li je prijavljivanje na Discord omogućeno",
"admin.config.oauth.discord-limited-users": "Ograničenje po Discord korisnicima",
"admin.config.oauth.discord-limited-users.description": "Ograničite prijavljivanje na određene korisnike pomoću njihovog Discord ID-a. Ostavite prazno da biste onemogućili.",
"admin.config.oauth.discord-limited-guild": "Ograničenje po Discord serveru",
"admin.config.oauth.discord-limited-guild.description": "Ograničite prijavljivanje na korisnike određenog servera. Ostavite prazno da 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 OpenID Connect-om 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": "Odjavljivanje sa OpenID Connect-a",
"admin.config.oauth.oidc-sign-out.description": "Da li će dugme „Odjavi se“ odjaviti korisnika i sa OpenID Connect provajdera",
"admin.config.oauth.oidc-scope": "Opseg OpenID Connect-a",
"admin.config.oauth.oidc-scope.description": "Opsezi koji bi trebalo da budu zatraženi od OpenID Connect provajdera.",
"admin.config.oauth.oidc-username-claim": "Potraživanje korisničkog imena u OpenID Connect",
"admin.config.oauth.oidc-username-claim.description": "Potraživanje korisničkog imena u OpenID Connect ID tokenu. Ostavite prazno ako ne znate šta 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 validna JMES putanja koja referencira niz uloga. " + "Upravljanje pravima pristupa pomoću uloga u OpenID Connect-u se preporučuje samo ako nijedan drugi provajder identiteta nije konfigurisan i ako je prijava lozinkom onemogućena. " + "Ostavite prazno ako ne znate šta je ova konfiguracija.",
"admin.config.oauth.oidc-role-general-access": "Uloga u OpenID Connect-u za opšti pristup",
"admin.config.oauth.oidc-role-general-access.description": "Uloga potrebna za opšti pristup. Mora biti prisutna u ulogama korisnika kako bi se mogao prijaviti. " + "Ostavite prazno ako ne znate šta 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 ne znate šta 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 servera",
"admin.config.ldap.url.description": "URL LDAP servera",
"admin.config.ldap.bind-dn": "DN vezivanje",
"admin.config.ldap.bind-dn.description": "Podrazumevani 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, mesto gde ć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 proveri administratorske grupe.",
"admin.config.ldap.field-name-email": "Naziv atributa za imejl korisnika",
"admin.config.ldap.field-name-email.description": "LDAP naziv atributa za imejl korisnika.",
"admin.config.notify.success": "Konfiguracija je uspešno ažurirana.",
"admin.config.notify.logo-success": "Logo je uspešno ažuriran. Može biti potrebno nekoliko minuta da se ažurira na vebsajtu.",
"admin.config.notify.no-changes": "Nema promena za čuvanje.",
"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.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": "Opa - Ova strana ne postoji.",
"404.button.home": "Vrati me na početak",
// error
"error.title": "Greška",
"error.description": "Ups!",
"error.button.back": "Idi nazad",
"error.msg.default": "Nešto je pošlo naopako.",
"error.msg.access_denied": "Otkazali ste proces autentifikacije, pokušajte ponovo.",
"error.msg.expired_token": "Proces autentifikacije je trajao predugo, pokušajte ponovo.",
"error.msg.invalid_token": "Interna greška",
"error.msg.no_user": "Korisnik povezan sa ovim {0} nalogom ne postoji.",
"error.msg.no_email": "Ne mogu da dobijem adresu imejla sa ovog {0} naloga.",
"error.msg.already_linked": "Ovaj {0} nalog je već povezan sa drugim nalogom.",
"error.msg.not_linked": "Ovaj {0} nalog još uvek nije povezan ni sa jednim nalogom.",
"error.msg.unverified_account": "Ovaj {0} nalog je nepotvrđen, molimo pokušajte ponovo nakon verifikacije.",
"error.msg.user_not_allowed": "Nije vam dozvoljeno da se prijavite.",
"error.msg.cannot_get_user_info": "Ne mogu da dobijem vaše korisničke informacije sa ovog {0} naloga.",
"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": "Sačuvaj",
"common.button.create": "Napravi",
"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": "Deljenje",
"common.button.generate": "Generiši",
"common.button.done": "Gotovo",
"common.text.link": "Link",
"common.text.navigate-to-link": "Posetite link",
"common.text.or": "ili",
"common.text.redirecting": "Preusmeravanje...",
"common.button.go-back": "Idi nazad",
"common.button.go-home": "Početna stranica",
"common.notify.copied": "Vaša veza je kopirana u međuspremnik",
"common.notify.copied-link": "Vaša veza je kopirana u međuspremnik",
"common.success": "Uspešno",
"common.error": "Greška",
"common.error.unknown": "Došlo je do nepoznate greške",
"common.error.invalid-email": "Neispravna adresa imejla",
"common.error.too-short": "Mora da ima najmanje {length} znakova",
"common.error.too-long": "Mora da ima 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 da ima tačno {length} znakova",
"common.error.invalid-number": "Mora biti broj",
"common.error.field-required": "Polje je obavezno"
};

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