Compare commits

..

54 Commits

Author SHA1 Message Date
Elias Schneider
416eba6ae6 release: 0.22.0 2024-02-04 18:57:49 +01:00
Elias Schneider
3880854240 chore(translations): update translations via Crowdin (#385)
* New translations en-us.ts (Greek)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Greek)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (French)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Slovenian)

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

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Swedish)

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

* New translations en-us.ts (Greek)

* New translations en-us.ts (Slovenian)

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

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Slovenian)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (French)

* New translations en-us.ts (French)

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

* New translations en-us.ts (Dutch, Belgium)
2024-02-04 18:54:48 +01:00
Maurice Schorn
43d186a370 Markdown support for TextPreviews (#396)
* add markdown-to-jsx dependency

* replace TextPreview with Markdown

* basic table styling

* add light mode backgroundColor
2024-02-04 18:50:43 +01:00
Elias Schneider
c189cd97a5 fix(translations): typo in string 2024-01-18 09:13:31 +01:00
Elias Schneider
d83e28a1c3 chore(translations): add Slovenian files 2024-01-14 18:53:55 +01:00
Elias Schneider
3299f767d3 release: 0.21.5 2024-01-14 14:16:47 +01:00
Elias Schneider
16a9724693 chore(translations): update translations via Crowdin (#378)
* 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 (Finnish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Swedish)

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

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

* New translations en-us.ts (German)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Italian)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Greek)
2024-01-14 14:15:44 +01:00
Elias Schneider
0ccb836444 fix: password can be changed with wrong password 2024-01-14 14:14:07 +01:00
Elias Schneider
067652aa80 chore(translations): add Greek files 2024-01-14 13:19:51 +01:00
Elias Schneider
1523d1b5b2 release: 0.21.4 2024-01-09 21:29:29 +01:00
Elias Schneider
ea14e28dd8 chore(translations): update translations via Crowdin (#370)
* New translations en-us.ts (Italian)

* New translations en-us.ts (Italian)

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

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

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

* New translations en-us.ts (German)

* New translations en-us.ts (German)
2024-01-09 15:51:04 +01:00
Ivan Li
d7750086b5 feat(frontend): add navigateToLink button for CopyTextField. close #372. (#376)
* feat(frontend): add navigateToLink button for CopyTextField. close #372.

* chore(frontend): remove unused props for CopyTextField.
2024-01-09 15:50:42 +01:00
Ivan Li
eb7216b4b1 chore(frontend/share): displays the never expire checkbox if the system allows. (#371) 2024-01-07 22:13:59 +01:00
Elias Schneider
1d62225019 Merge branch 'main' of https://github.com/stonith404/pingvin-share 2024-01-04 15:46:43 +01:00
Elias Schneider
bf5250c4a7 ci/cd: remove close inactive issue action 2024-01-04 15:46:40 +01:00
Elias Schneider
cdd0a864d1 chore(translations): update translations via Crowdin (#365)
* New translations en-us.ts (Italian)

* New translations en-us.ts (Danish)

* New translations en-us.ts (Italian)

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

* New translations en-us.ts (Italian)

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

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

* New translations en-us.ts (Dutch, Belgium)
2024-01-03 13:48:42 +01:00
Elias Schneider
692c1bef25 release: 0.21.3 2024-01-02 21:40:49 +01:00
Elias Schneider
fe09d0e25f fix: don't show validation error on upload modal if password or max views are empty 2024-01-02 21:33:15 +01:00
Elias Schneider
3ce18dc1dc release: 0.21.2 2023-12-29 18:15:42 +01:00
Elias Schneider
6fb31abd84 fix: missing logo images on fresh installation 2023-12-29 18:12:02 +01:00
Elias Schneider
7a301b455c fix: missing translations on reset password page 2023-12-29 18:09:31 +01:00
Elias Schneider
5781a7b540 chore(translations): add Italian files 2023-12-27 13:54:37 +01:00
Elias Schneider
2efbeee5bf chore(translations): update translations via Crowdin (#359)
* 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 (Finnish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Swedish)

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

* New translations en-us.ts (Polish)
2023-12-27 13:45:07 +01:00
Elias Schneider
be4ff0f0f0 release: 0.21.1 2023-12-20 12:33:36 +01:00
Qing Fu
3ea52a24ef feat(oauth): add oidc username claim (#357)
* feat(oauth): add oidc username claim

* style: remove undefined
2023-12-20 12:32:42 +01:00
No Solo Hacking
f179189b59 docs: add review by "No Solo Hacking" to the Spanish README (#356)
* Update README.es.md

* Update docs/README.es.md

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

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2023-12-15 07:27:01 +01:00
Elias Schneider
bc333f768f chore(translations): update translations via Crowdin (#349)
* New translations en-us.ts (Swedish)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Polish)

* New translations en-us.ts (French)
2023-12-13 08:41:42 +01:00
Elias Schneider
26c98e2b41 chore: fix deps vulnerabilities 2023-12-01 11:03:03 +01:00
Elias Schneider
4b7732838d release: 0.21.0 2023-12-01 10:28:09 +01:00
Elias Schneider
021b9ac5d5 chore(translations): update translations via Crowdin (#347)
* New translations en-us.ts (Swedish)

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

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (German)

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

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

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

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

* New translations en-us.ts (Swedish)

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

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

* New translations en-us.ts (Thai)

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

* New translations en-us.ts (Polish)
2023-12-01 10:27:40 +01:00
Qing Fu
5f94c7295a feat(oauth): limited discord server sign-in (#346)
* feat(oauth): limited discord server sign-in

* fix: typo

* style: change undefined to optional

* style: remove conditional operator
2023-11-30 22:41:06 +01:00
Rhys Chang
d9a9523c9a New translations zh-TW.ts (#339) 2023-11-26 12:49:08 +01:00
Elias Schneider
384d2343d5 New translations en-us.ts (Portuguese, Brazilian) (#336) 2023-11-26 12:48:22 +01:00
Elias Schneider
7a387d86d6 release: 0.20.3 2023-11-17 15:27:31 +01:00
Elias Schneider
330eef51e4 fix: max expiration gets ignored if expiration is set to "never" 2023-11-17 15:27:22 +01:00
Elias Schneider
2e1a2b60c4 release: 0.20.2 2023-11-11 20:29:24 +01:00
Elias Schneider
9896ca0e8c chore(translations): update translations via Crowdin (#313)
* New translations en-us.ts (French)

* New translations en-us.ts (Spanish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Swedish)

* New translations en-us.ts (Russian)

* New translations en-us.ts (Russian)
2023-11-11 20:27:03 +01:00
Qing Fu
fd44f42f28 fix(oauth): github and discord login error (#323)
* fix(oauth): github and discord login error
fixed #322, fixed #302

* feat(oauth): print log when ErrorPageException occurs

* refactor(oauth): migrate to Logger

* feat(oauth): add logger for OAuthExceptionFilter

* docs(oauth): update oauth login docs
2023-11-11 20:25:05 +01:00
Elias Schneider
966ce261cb fix: reverse shares couldn't be created unauthenticated 2023-11-11 18:57:54 +01:00
Elias Schneider
5503e7a54f chore(translations): add Swedish translation files 2023-11-08 08:18:10 +01:00
Elias Schneider
b49ec93c54 release: 0.20.1 2023-11-05 12:38:13 +01:00
Elias Schneider
e6584322fa chore(translations): update translations via Crowdin (#310)
* 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 (Finnish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

* 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 (Dutch, Belgium)

* New translations en-us.ts (Polish)

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

* New translations en-us.ts (German)
2023-11-05 12:37:48 +01:00
Elias Schneider
1138cd02b0 fix: share information text color in light mode 2023-11-05 12:36:42 +01:00
Elias Schneider
1ba8d0cbd1 release: 0.20.0 2023-11-04 20:40:20 +01:00
Ivan Li
98380e2d48 feat: ability to add and delete files of existing share (#306)
* feat(share): delete file api, revert complete share api.

* feat(share): share edit page.

* feat(share): Modify the DropZone title of the edit sharing UI.

* feat(share): i18n for edit share. (en, zh)

* feat(share): allow creator get share by id.

* feat(share): add edit button in account/shares.

* style(share): lint.

* chore: some minor adjustments.

* refactor: run formatter

* refactor: remove unused return

---------

Co-authored-by: Elias Schneider <login@eliasschneider.com>
2023-11-04 20:39:58 +01:00
Elias Schneider
e377ed10e1 release: 0.19.2 2023-11-03 14:07:25 +01:00
Elias Schneider
acc35f4717 fix: wrong validation of setting max share expiration to 0 2023-11-03 14:05:43 +01:00
Elias Schneider
33742a043d fix: jwt secret changes on application restart 2023-11-03 13:06:59 +01:00
Elias Schneider
5cee9cbbb9 chore(translations): update translations via Crowdin (#298)
* 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 (Finnish)

* New translations en-us.ts (Japanese)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Russian)

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

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

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

* New translations en-us.ts (Danish)

* New translations en-us.ts (French)

* New translations en-us.ts (French)

* New translations en-us.ts (French)

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

* New translations en-us.ts (Polish)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Polish)

* New translations en-us.ts (Polish)
2023-11-03 10:39:13 +01:00
Elias Schneider
e0fbbeca3c feat: change totp issuer to display logo in 2FAS app 2023-11-03 08:38:23 +01:00
Elias Schneider
bbfc9d6f14 feat: ability to limit the max expiration of a share 2023-10-23 15:17:47 +02:00
Elias Schneider
46b6e56c06 release: 0.19.1 2023-10-22 21:21:37 +02:00
Elias Schneider
05f6582739 chore(translations): update translations via Crowdin (#295)
* New translations en-us.ts (German)

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

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

* New translations en-us.ts (Portuguese, Brazilian)
2023-10-22 21:21:17 +02:00
Qing Fu
119b1ec840 fix(oauth): fix wrong redirectUri in oidc after change appUrl (#296) 2023-10-22 21:20:50 +02:00
63 changed files with 4621 additions and 1316 deletions

View File

@@ -1,23 +0,0 @@
name: Close inactive issues
on:
schedule:
- cron: "00 00 * * *"
jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v4
with:
days-before-issue-stale: 30
days-before-issue-close: 14
exempt-issue-labels: "feature"
stale-issue-label: "stale"
stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
days-before-pr-stale: -1
days-before-pr-close: -1
repo-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,3 +1,103 @@
## [0.22.0](https://github.com/stonith404/pingvin-share/compare/v0.21.5...v0.22.0) (2024-02-04)
### Bug Fixes
* **translations:** typo in string ([c189cd9](https://github.com/stonith404/pingvin-share/commit/c189cd97a502cee8ea79e5187d9288d636d4983c))
## [0.21.5](https://github.com/stonith404/pingvin-share/compare/v0.21.4...v0.21.5) (2024-01-14)
### Bug Fixes
* password can be changed with wrong password ([0ccb836](https://github.com/stonith404/pingvin-share/commit/0ccb8364448d27ea07c8b11972ff454d610893c6))
## [0.21.4](https://github.com/stonith404/pingvin-share/compare/v0.21.3...v0.21.4) (2024-01-09)
### Features
* **frontend:** add navigateToLink button for CopyTextField. close [#372](https://github.com/stonith404/pingvin-share/issues/372). ([#376](https://github.com/stonith404/pingvin-share/issues/376)) ([d775008](https://github.com/stonith404/pingvin-share/commit/d7750086b5b796cfc70d8dc0c7d0ab4bd1996ca0))
## [0.21.3](https://github.com/stonith404/pingvin-share/compare/v0.21.2...v0.21.3) (2024-01-02)
### Bug Fixes
* don't show validation error on upload modal if password or max views are empty ([fe09d0e](https://github.com/stonith404/pingvin-share/commit/fe09d0e25f6fbfc4e1c9302054d3387fe8b1f0ea))
## [0.21.2](https://github.com/stonith404/pingvin-share/compare/v0.21.1...v0.21.2) (2023-12-29)
### Bug Fixes
* missing logo images on fresh installation ([6fb31ab](https://github.com/stonith404/pingvin-share/commit/6fb31abd84b22cd464b6b45bf7ca6f83853e8720))
* missing translations on reset password page ([7a301b4](https://github.com/stonith404/pingvin-share/commit/7a301b455cdea4b1dbc04cc6223e094fee9aca7b))
## [0.21.1](https://github.com/stonith404/pingvin-share/compare/v0.21.0...v0.21.1) (2023-12-20)
### Features
* **oauth:** add oidc username claim ([#357](https://github.com/stonith404/pingvin-share/issues/357)) ([3ea52a2](https://github.com/stonith404/pingvin-share/commit/3ea52a24ef7c3b6845bc13382616ea0c8d784585))
## [0.21.0](https://github.com/stonith404/pingvin-share/compare/v0.20.3...v0.21.0) (2023-12-01)
### Features
* **oauth:** limited discord server sign-in ([#346](https://github.com/stonith404/pingvin-share/issues/346)) ([5f94c72](https://github.com/stonith404/pingvin-share/commit/5f94c7295ab8594ed2ed615628214e869a02da2d))
## [0.20.3](https://github.com/stonith404/pingvin-share/compare/v0.20.2...v0.20.3) (2023-11-17)
### Bug Fixes
* max expiration gets ignored if expiration is set to "never" ([330eef5](https://github.com/stonith404/pingvin-share/commit/330eef51e4f3f3fb29833bc9337e705553340aaa))
## [0.20.2](https://github.com/stonith404/pingvin-share/compare/v0.20.1...v0.20.2) (2023-11-11)
### Bug Fixes
* **oauth:** github and discord login error ([#323](https://github.com/stonith404/pingvin-share/issues/323)) ([fd44f42](https://github.com/stonith404/pingvin-share/commit/fd44f42f28c0fa2091876b138f170202d9fde04e)), closes [#322](https://github.com/stonith404/pingvin-share/issues/322) [#302](https://github.com/stonith404/pingvin-share/issues/302)
* reverse shares couldn't be created unauthenticated ([966ce26](https://github.com/stonith404/pingvin-share/commit/966ce261cb4ad99efaadef5c36564fdfaed0d5c4))
## [0.20.1](https://github.com/stonith404/pingvin-share/compare/v0.20.0...v0.20.1) (2023-11-05)
### Bug Fixes
* share information text color in light mode ([1138cd0](https://github.com/stonith404/pingvin-share/commit/1138cd02b0b6ac1d71c4dbc2808110c672237190))
## [0.20.0](https://github.com/stonith404/pingvin-share/compare/v0.19.2...v0.20.0) (2023-11-04)
### Features
* ability to add and delete files of existing share ([#306](https://github.com/stonith404/pingvin-share/issues/306)) ([98380e2](https://github.com/stonith404/pingvin-share/commit/98380e2d48cc8ffa831d9b69cf5c0e8a40e28862))
## [0.19.2](https://github.com/stonith404/pingvin-share/compare/v0.19.1...v0.19.2) (2023-11-03)
### Features
* ability to limit the max expiration of a share ([bbfc9d6](https://github.com/stonith404/pingvin-share/commit/bbfc9d6f147eea404f011c3af9d7dc7655c3d21d))
* change totp issuer to display logo in 2FAS app ([e0fbbec](https://github.com/stonith404/pingvin-share/commit/e0fbbeca3c1a858838b20aeead52694772b7d871))
### Bug Fixes
* jwt secret changes on application restart ([33742a0](https://github.com/stonith404/pingvin-share/commit/33742a043d6549783984ae7e8a3c30f0fe3917de))
* wrong validation of setting max share expiration to `0` ([acc35f4](https://github.com/stonith404/pingvin-share/commit/acc35f47178e230f50ce54d6f1ad5370caa3382d))
## [0.19.1](https://github.com/stonith404/pingvin-share/compare/v0.19.0...v0.19.1) (2023-10-22)
### Bug Fixes
* **oauth:** fix wrong redirectUri in oidc after change appUrl ([#296](https://github.com/stonith404/pingvin-share/issues/296)) ([119b1ec](https://github.com/stonith404/pingvin-share/commit/119b1ec840ad7f4e1c7c4bb476bf1eeed91d9a1a))
## [0.19.0](https://github.com/stonith404/pingvin-share/compare/v0.18.2...v0.19.0) (2023-10-22) ## [0.19.0](https://github.com/stonith404/pingvin-share/compare/v0.18.2...v0.19.0) (2023-10-22)

View File

@@ -58,4 +58,4 @@ HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://localhost:3000/api/he
# Application startup # Application startup
# HOSTNAME=0.0.0.0 fixes https://github.com/vercel/next.js/issues/51684. It can be removed as soon as the issue is fixed # HOSTNAME=0.0.0.0 fixes https://github.com/vercel/next.js/issues/51684. It can be removed as soon as the issue is fixed
CMD cp -rn /tmp/img /opt/app/frontend/public && nginx && PORT=3333 HOSTNAME=0.0.0.0 node frontend/server.js & cd backend && npm run prod CMD cp -rn /tmp/img/* /opt/app/frontend/public/img && nginx && PORT=3333 HOSTNAME=0.0.0.0 node frontend/server.js & cd backend && npm run prod

View File

@@ -1,12 +1,12 @@
{ {
"name": "pingvin-share-backend", "name": "pingvin-share-backend",
"version": "0.19.0", "version": "0.22.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pingvin-share-backend", "name": "pingvin-share-backend",
"version": "0.19.0", "version": "0.22.0",
"dependencies": { "dependencies": {
"@nestjs/cache-manager": "^2.1.0", "@nestjs/cache-manager": "^2.1.0",
"@nestjs/common": "^10.1.2", "@nestjs/common": "^10.1.2",
@@ -1308,24 +1308,15 @@
} }
}, },
"node_modules/@types/clamscan": { "node_modules/@types/clamscan": {
"version": "2.0.4", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.0.4.tgz", "resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.0.7.tgz",
"integrity": "sha512-NpD+EmE+ZK5WRJOAmeDuSYJIv15BUnc4PxQA+m3QNkutaPBZ7bmLDTvqBu2iDchs7YKQjiEQEwEMvsdwtdtImA==", "integrity": "sha512-YopQF+D1pqbvMbvqTQx2MdxEqFbQAiPJKtjj/KnK9xxgmYkdt3dInkj/k6a+bztT4TexQ+tCUi/5D3LqDZIdhg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/node": "*", "@types/node": "*",
"axios": "^0.24.0" "axios": "^0.24.0"
} }
}, },
"node_modules/@types/clamscan/node_modules/axios": {
"version": "0.24.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
"integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
"dev": true,
"dependencies": {
"follow-redirects": "^1.14.4"
}
},
"node_modules/@types/connect": { "node_modules/@types/connect": {
"version": "3.4.35", "version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@@ -2277,13 +2268,12 @@
"dev": true "dev": true
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "0.27.2", "version": "0.24.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
"integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"follow-redirects": "^1.14.9", "follow-redirects": "^1.14.4"
"form-data": "^4.0.0"
} }
}, },
"node_modules/b4a": { "node_modules/b4a": {
@@ -5069,15 +5059,15 @@
} }
}, },
"node_modules/joi": { "node_modules/joi": {
"version": "17.7.0", "version": "17.11.0",
"resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz",
"integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@hapi/hoek": "^9.0.0", "@hapi/hoek": "^9.0.0",
"@hapi/topo": "^5.0.0", "@hapi/topo": "^5.0.0",
"@sideway/address": "^4.1.3", "@sideway/address": "^4.1.3",
"@sideway/formula": "^3.0.0", "@sideway/formula": "^3.0.1",
"@sideway/pinpoint": "^2.0.0" "@sideway/pinpoint": "^2.0.0"
} }
}, },
@@ -5556,9 +5546,9 @@
} }
}, },
"node_modules/minimist": { "node_modules/minimist": {
"version": "1.2.7", "version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
@@ -6649,6 +6639,12 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"dev": true
},
"node_modules/psl": { "node_modules/psl": {
"version": "1.9.0", "version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -7262,9 +7258,9 @@
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
}, },
"node_modules/sharp": { "node_modules/sharp": {
"version": "0.32.4", "version": "0.32.6",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.4.tgz", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
"integrity": "sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==", "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"color": "^4.2.3", "color": "^4.2.3",
@@ -8253,16 +8249,16 @@
"dev": true "dev": true
}, },
"node_modules/wait-on": { "node_modules/wait-on": {
"version": "7.0.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz",
"integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"axios": "^0.27.2", "axios": "^1.6.1",
"joi": "^17.7.0", "joi": "^17.11.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"minimist": "^1.2.7", "minimist": "^1.2.8",
"rxjs": "^7.8.0" "rxjs": "^7.8.1"
}, },
"bin": { "bin": {
"wait-on": "bin/wait-on" "wait-on": "bin/wait-on"
@@ -8271,6 +8267,17 @@
"node": ">=12.0.0" "node": ">=12.0.0"
} }
}, },
"node_modules/wait-on/node_modules/axios": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
"integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
"dev": true,
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/watchpack": { "node_modules/watchpack": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
@@ -9459,24 +9466,13 @@
} }
}, },
"@types/clamscan": { "@types/clamscan": {
"version": "2.0.4", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.0.4.tgz", "resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.0.7.tgz",
"integrity": "sha512-NpD+EmE+ZK5WRJOAmeDuSYJIv15BUnc4PxQA+m3QNkutaPBZ7bmLDTvqBu2iDchs7YKQjiEQEwEMvsdwtdtImA==", "integrity": "sha512-YopQF+D1pqbvMbvqTQx2MdxEqFbQAiPJKtjj/KnK9xxgmYkdt3dInkj/k6a+bztT4TexQ+tCUi/5D3LqDZIdhg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/node": "*", "@types/node": "*",
"axios": "^0.24.0" "axios": "^0.24.0"
},
"dependencies": {
"axios": {
"version": "0.24.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
"integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
"dev": true,
"requires": {
"follow-redirects": "^1.14.4"
}
}
} }
}, },
"@types/connect": { "@types/connect": {
@@ -10261,13 +10257,12 @@
"dev": true "dev": true
}, },
"axios": { "axios": {
"version": "0.27.2", "version": "0.24.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
"integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
"dev": true, "dev": true,
"requires": { "requires": {
"follow-redirects": "^1.14.9", "follow-redirects": "^1.14.4"
"form-data": "^4.0.0"
} }
}, },
"b4a": { "b4a": {
@@ -12299,15 +12294,15 @@
} }
}, },
"joi": { "joi": {
"version": "17.7.0", "version": "17.11.0",
"resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz",
"integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@hapi/hoek": "^9.0.0", "@hapi/hoek": "^9.0.0",
"@hapi/topo": "^5.0.0", "@hapi/topo": "^5.0.0",
"@sideway/address": "^4.1.3", "@sideway/address": "^4.1.3",
"@sideway/formula": "^3.0.0", "@sideway/formula": "^3.0.1",
"@sideway/pinpoint": "^2.0.0" "@sideway/pinpoint": "^2.0.0"
} }
}, },
@@ -12683,9 +12678,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.7", "version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
}, },
"minipass": { "minipass": {
"version": "3.3.4", "version": "3.3.4",
@@ -13490,6 +13485,12 @@
"ipaddr.js": "1.9.1" "ipaddr.js": "1.9.1"
} }
}, },
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"dev": true
},
"psl": { "psl": {
"version": "1.9.0", "version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -13947,9 +13948,9 @@
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
}, },
"sharp": { "sharp": {
"version": "0.32.4", "version": "0.32.6",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.4.tgz", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
"integrity": "sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==", "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
"requires": { "requires": {
"color": "^4.2.3", "color": "^4.2.3",
"detect-libc": "^2.0.2", "detect-libc": "^2.0.2",
@@ -14655,16 +14656,29 @@
} }
}, },
"wait-on": { "wait-on": {
"version": "7.0.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz",
"integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"axios": "^0.27.2", "axios": "^1.6.1",
"joi": "^17.7.0", "joi": "^17.11.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"minimist": "^1.2.7", "minimist": "^1.2.8",
"rxjs": "^7.8.0" "rxjs": "^7.8.1"
},
"dependencies": {
"axios": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
"integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
"dev": true,
"requires": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
}
} }
}, },
"watchpack": { "watchpack": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "pingvin-share-backend", "name": "pingvin-share-backend",
"version": "0.19.0", "version": "0.22.0",
"scripts": { "scripts": {
"build": "nest build", "build": "nest build",
"dev": "cross-env NODE_ENV=development nest start --watch", "dev": "cross-env NODE_ENV=development nest start --watch",

View File

@@ -5,7 +5,7 @@ const configVariables: ConfigVariables = {
internal: { internal: {
jwtSecret: { jwtSecret: {
type: "string", type: "string",
defaultValue: crypto.randomBytes(256).toString("base64"), value: crypto.randomBytes(256).toString("base64"),
locked: true, locked: true,
}, },
}, },
@@ -37,6 +37,11 @@ const configVariables: ConfigVariables = {
defaultValue: "false", defaultValue: "false",
secret: false, secret: false,
}, },
maxExpiration: {
type: "number",
defaultValue: "0",
secret: false,
},
maxSize: { maxSize: {
type: "number", type: "number",
defaultValue: "1000000000", defaultValue: "1000000000",
@@ -175,6 +180,10 @@ const configVariables: ConfigVariables = {
type: "boolean", type: "boolean",
defaultValue: "false", defaultValue: "false",
}, },
"discord-limitedGuild": {
type: "string",
defaultValue: "",
},
"discord-clientId": { "discord-clientId": {
type: "string", type: "string",
defaultValue: "", defaultValue: "",
@@ -192,6 +201,10 @@ const configVariables: ConfigVariables = {
type: "string", type: "string",
defaultValue: "", defaultValue: "",
}, },
"oidc-usernameClaim": {
type: "string",
defaultValue: "",
},
"oidc-clientId": { "oidc-clientId": {
type: "string", type: "string",
defaultValue: "", defaultValue: "",
@@ -257,8 +270,8 @@ async function migrateConfigVariables() {
for (const existingConfigVariable of existingConfigVariables) { for (const existingConfigVariable of existingConfigVariables) {
const configVariable = const configVariable =
configVariables[existingConfigVariable.category]?.[ configVariables[existingConfigVariable.category]?.[
existingConfigVariable.name existingConfigVariable.name
]; ];
if (!configVariable) { if (!configVariable) {
await prisma.config.delete({ await prisma.config.delete({
where: { where: {

View File

@@ -139,7 +139,7 @@ export class AuthService {
async updatePassword(user: User, newPassword: string, oldPassword?: string) { async updatePassword(user: User, newPassword: string, oldPassword?: string) {
const isPasswordValid = const isPasswordValid =
!user.password || !(await argon.verify(user.password, oldPassword)); !user.password || await argon.verify(user.password, oldPassword);
if (!isPasswordValid) throw new ForbiddenException("Invalid password"); if (!isPasswordValid) throw new ForbiddenException("Invalid password");

View File

@@ -8,7 +8,6 @@ import { User } from "@prisma/client";
import * as argon from "argon2"; 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";
@@ -18,7 +17,6 @@ export class AuthTotpService {
constructor( constructor(
private prisma: PrismaService, private prisma: PrismaService,
private authService: AuthService, private authService: AuthService,
private config: ConfigService,
) {} ) {}
async signInTotp(dto: AuthSignInTotpDTO) { async signInTotp(dto: AuthSignInTotpDTO) {
@@ -78,12 +76,11 @@ export class AuthTotpService {
throw new BadRequestException("TOTP is already enabled"); throw new BadRequestException("TOTP is already enabled");
} }
// TODO: Maybe make the issuer configurable with env vars?
const secret = authenticator.generateSecret(); const secret = authenticator.generateSecret();
const otpURL = totp.keyuri( const otpURL = totp.keyuri(
user.username || user.email, user.username || user.email,
this.config.get("general.appName"), "pingvin-share",
secret, secret,
); );

View File

@@ -1,6 +1,7 @@
import { import {
Body, Body,
Controller, Controller,
Delete,
Get, Get,
Param, Param,
Post, Post,
@@ -81,4 +82,14 @@ export class FileController {
return new StreamableFile(file.file); return new StreamableFile(file.file);
} }
@Delete(":fileId")
@SkipThrottle()
@UseGuards(ShareOwnerGuard)
async remove(
@Param("fileId") fileId: string,
@Param("shareId") shareId: string,
) {
await this.fileService.remove(shareId, fileId);
}
} }

View File

@@ -124,6 +124,18 @@ export class FileService {
}; };
} }
async remove(shareId: string, fileId: string) {
const fileMetaData = await this.prisma.file.findUnique({
where: { id: fileId },
});
if (!fileMetaData) throw new NotFoundException("File not found");
fs.unlinkSync(`${SHARE_DIRECTORY}/${shareId}/${fileId}`);
await this.prisma.file.delete({ where: { id: fileId } });
}
async deleteAllFiles(shareId: string) { async deleteAllFiles(shareId: string) {
await fs.promises.rm(`${SHARE_DIRECTORY}/${shareId}`, { await fs.promises.rm(`${SHARE_DIRECTORY}/${shareId}`, {
recursive: true, recursive: true,

View File

@@ -7,7 +7,7 @@ export class ErrorPageException extends Error {
*/ */
constructor( constructor(
public readonly key: string = "default", public readonly key: string = "default",
public readonly redirect: string = "/", public readonly redirect?: string,
public readonly params?: string[], public readonly params?: string[],
) { ) {
super("error"); super("error");

View File

@@ -1,18 +1,35 @@
import { ArgumentsHost, Catch, ExceptionFilter } from "@nestjs/common"; import { ArgumentsHost, Catch, ExceptionFilter, Logger } from "@nestjs/common";
import { ConfigService } from "../../config/config.service"; import { ConfigService } from "../../config/config.service";
import { ErrorPageException } from "../exceptions/errorPage.exception"; import { ErrorPageException } from "../exceptions/errorPage.exception";
@Catch(ErrorPageException) @Catch(ErrorPageException)
export class ErrorPageExceptionFilter implements ExceptionFilter { export class ErrorPageExceptionFilter implements ExceptionFilter {
private readonly logger = new Logger(ErrorPageExceptionFilter.name);
constructor(private config: ConfigService) {} constructor(private config: ConfigService) {}
catch(exception: ErrorPageException, host: ArgumentsHost) { catch(exception: ErrorPageException, host: ArgumentsHost) {
this.logger.error(
JSON.stringify({
error: exception.key,
params: exception.params,
redirect: exception.redirect,
}),
);
const ctx = host.switchToHttp(); const ctx = host.switchToHttp();
const response = ctx.getResponse(); const response = ctx.getResponse();
const url = new URL(`${this.config.get("general.appUrl")}/error`); const url = new URL(`${this.config.get("general.appUrl")}/error`);
url.searchParams.set("redirect", exception.redirect);
url.searchParams.set("error", exception.key); url.searchParams.set("error", exception.key);
if (exception.redirect) {
url.searchParams.set("redirect", exception.redirect);
} else {
const redirect = ctx.getRequest().cookies.access_token
? "/account"
: "/auth/signIn";
url.searchParams.set("redirect", redirect);
}
if (exception.params) { if (exception.params) {
url.searchParams.set("params", exception.params.join(",")); url.searchParams.set("params", exception.params.join(","));
} }

View File

@@ -3,6 +3,7 @@ import {
Catch, Catch,
ExceptionFilter, ExceptionFilter,
HttpException, HttpException,
Logger,
} from "@nestjs/common"; } from "@nestjs/common";
import { ConfigService } from "../../config/config.service"; import { ConfigService } from "../../config/config.service";
@@ -12,14 +13,20 @@ export class OAuthExceptionFilter implements ExceptionFilter {
access_denied: "access_denied", access_denied: "access_denied",
expired_token: "expired_token", expired_token: "expired_token",
}; };
private readonly logger = new Logger(OAuthExceptionFilter.name);
constructor(private config: ConfigService) {} constructor(private config: ConfigService) {}
catch(_exception: HttpException, host: ArgumentsHost) { catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp(); const ctx = host.switchToHttp();
const response = ctx.getResponse(); const response = ctx.getResponse();
const request = ctx.getRequest(); const request = ctx.getRequest();
this.logger.error(exception.message);
this.logger.error(
"Request query: " + JSON.stringify(request.query, null, 2),
);
const key = this.errorKeys[request.query.error] || "default"; const key = this.errorKeys[request.query.error] || "default";
const url = new URL(`${this.config.get("general.appUrl")}/error`); const url = new URL(`${this.config.get("general.appUrl")}/error`);

View File

@@ -1,15 +1,19 @@
import { OAuthProvider, OAuthToken } from "./oauthProvider.interface"; import { Injectable } from "@nestjs/common";
import fetch from "node-fetch";
import { ConfigService } from "../../config/config.service";
import { OAuthCallbackDto } from "../dto/oauthCallback.dto"; import { OAuthCallbackDto } from "../dto/oauthCallback.dto";
import { OAuthSignInDto } from "../dto/oauthSignIn.dto"; import { OAuthSignInDto } from "../dto/oauthSignIn.dto";
import { ConfigService } from "../../config/config.service"; import { ErrorPageException } from "../exceptions/errorPage.exception";
import { BadRequestException, Injectable } from "@nestjs/common"; import { OAuthProvider, OAuthToken } from "./oauthProvider.interface";
import fetch from "node-fetch";
@Injectable() @Injectable()
export class DiscordProvider implements OAuthProvider<DiscordToken> { export class DiscordProvider implements OAuthProvider<DiscordToken> {
constructor(private config: ConfigService) {} constructor(private config: ConfigService) {}
getAuthEndpoint(state: string): Promise<string> { getAuthEndpoint(state: string): Promise<string> {
let scope = "identify email";
if (this.config.get("oauth.discord-limitedGuild")) {
scope += " guilds";
}
return Promise.resolve( return Promise.resolve(
"https://discord.com/api/oauth2/authorize?" + "https://discord.com/api/oauth2/authorize?" +
new URLSearchParams({ new URLSearchParams({
@@ -17,8 +21,8 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
redirect_uri: redirect_uri:
this.config.get("general.appUrl") + "/api/oauth/callback/discord", this.config.get("general.appUrl") + "/api/oauth/callback/discord",
response_type: "code", response_type: "code",
state: state, state,
scope: "identify email", scope,
}).toString(), }).toString(),
); );
} }
@@ -60,8 +64,8 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
} }
async getUserInfo(token: OAuthToken<DiscordToken>): Promise<OAuthSignInDto> { async getUserInfo(token: OAuthToken<DiscordToken>): Promise<OAuthSignInDto> {
const res = await fetch("https://discord.com/api/v10/user/@me", { const res = await fetch("https://discord.com/api/v10/users/@me", {
method: "post", method: "get",
headers: { headers: {
Accept: "application/json", Accept: "application/json",
Authorization: `${token.tokenType || "Bearer"} ${token.accessToken}`, Authorization: `${token.tokenType || "Bearer"} ${token.accessToken}`,
@@ -69,7 +73,14 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
}); });
const user = (await res.json()) as DiscordUser; const user = (await res.json()) as DiscordUser;
if (user.verified === false) { if (user.verified === false) {
throw new BadRequestException("Unverified account."); throw new ErrorPageException("unverified_account", undefined, [
"provider_discord",
]);
}
const guild = this.config.get("oauth.discord-limitedGuild");
if (guild) {
await this.checkLimitedGuild(token, guild);
} }
return { return {
@@ -79,6 +90,24 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
email: user.email, email: user.email,
}; };
} }
async checkLimitedGuild(token: OAuthToken<DiscordToken>, guildId: string) {
try {
const res = await fetch("https://discord.com/api/v10/users/@me/guilds", {
method: "get",
headers: {
Accept: "application/json",
Authorization: `${token.tokenType || "Bearer"} ${token.accessToken}`,
},
});
const guilds = (await res.json()) as DiscordPartialGuild[];
if (!guilds.some((guild) => guild.id === guildId)) {
throw new ErrorPageException("discord_guild_permission_denied");
}
} catch {
throw new ErrorPageException("discord_guild_permission_denied");
}
}
} }
export interface DiscordToken { export interface DiscordToken {
@@ -96,3 +125,12 @@ export interface DiscordUser {
email: string; email: string;
verified: boolean; verified: boolean;
} }
export interface DiscordPartialGuild {
id: string;
name: string;
icon: string;
owner: boolean;
permissions: string;
features: string[];
}

View File

@@ -1,4 +1,4 @@
import { BadRequestException } from "@nestjs/common"; import { Logger } from "@nestjs/common";
import fetch from "node-fetch"; import fetch from "node-fetch";
import { ConfigService } from "../../config/config.service"; import { ConfigService } from "../../config/config.service";
import { JwtService } from "@nestjs/jwt"; import { JwtService } from "@nestjs/jwt";
@@ -7,12 +7,15 @@ import { nanoid } from "nanoid";
import { OAuthCallbackDto } from "../dto/oauthCallback.dto"; import { OAuthCallbackDto } from "../dto/oauthCallback.dto";
import { OAuthProvider, OAuthToken } from "./oauthProvider.interface"; import { OAuthProvider, OAuthToken } from "./oauthProvider.interface";
import { OAuthSignInDto } from "../dto/oauthSignIn.dto"; import { OAuthSignInDto } from "../dto/oauthSignIn.dto";
import { ErrorPageException } from "../exceptions/errorPage.exception";
export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> { export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
protected redirectUri: string;
protected discoveryUri: string; protected discoveryUri: string;
private configuration: OidcConfigurationCache; private configuration: OidcConfigurationCache;
private jwk: OidcJwkCache; private jwk: OidcJwkCache;
private logger: Logger = new Logger(
Object.getPrototypeOf(this).constructor.name,
);
protected constructor( protected constructor(
protected name: string, protected name: string,
@@ -22,9 +25,6 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
protected cache: Cache, protected cache: Cache,
) { ) {
this.discoveryUri = this.getDiscoveryUri(); this.discoveryUri = this.getDiscoveryUri();
this.redirectUri = `${this.config.get(
"general.appUrl",
)}/api/oauth/callback/${this.name}`;
this.config.addListener("update", (key: string, _: unknown) => { this.config.addListener("update", (key: string, _: unknown) => {
if (this.keyOfConfigUpdateEvents.includes(key)) { if (this.keyOfConfigUpdateEvents.includes(key)) {
this.deinit(); this.deinit();
@@ -33,6 +33,12 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
}); });
} }
protected getRedirectUri(): string {
return `${this.config.get("general.appUrl")}/api/oauth/callback/${
this.name
}`;
}
async getConfiguration(): Promise<OidcConfiguration> { async getConfiguration(): Promise<OidcConfiguration> {
if (!this.configuration || this.configuration.expires < Date.now()) { if (!this.configuration || this.configuration.expires < Date.now()) {
await this.fetchConfiguration(); await this.fetchConfiguration();
@@ -65,7 +71,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
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: "openid profile email",
redirect_uri: this.redirectUri, redirect_uri: this.getRedirectUri(),
state, state,
nonce, nonce,
}).toString() }).toString()
@@ -85,7 +91,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
client_secret: this.config.get(`oauth.${this.name}-clientSecret`), client_secret: this.config.get(`oauth.${this.name}-clientSecret`),
grant_type: "authorization_code", grant_type: "authorization_code",
code: query.code, code: query.code,
redirect_uri: this.redirectUri, redirect_uri: this.getRedirectUri(),
}).toString(), }).toString(),
}); });
const token: OidcToken = await res.json(); const token: OidcToken = await res.json();
@@ -102,6 +108,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
async getUserInfo( async getUserInfo(
token: OAuthToken<OidcToken>, token: OAuthToken<OidcToken>,
query: OAuthCallbackDto, query: OAuthCallbackDto,
claim?: string,
): 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 // maybe it's not necessary to verify the id token since it's directly obtained from the provider
@@ -110,14 +117,36 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
const nonce = await this.cache.get(key); const nonce = await this.cache.get(key);
await this.cache.del(key); await this.cache.del(key);
if (nonce !== idTokenData.nonce) { if (nonce !== idTokenData.nonce) {
throw new BadRequestException("Invalid token"); this.logger.error(
`Invalid nonce. Expected ${nonce}, but got ${idTokenData.nonce}`,
);
throw new ErrorPageException("invalid_token");
}
const username = claim
? idTokenData[claim]
: idTokenData.name ||
idTokenData.nickname ||
idTokenData.preferred_username;
if (!username) {
this.logger.error(
`Can not get username from ID Token ${JSON.stringify(
idTokenData,
undefined,
2,
)}`,
);
throw new ErrorPageException("cannot_get_user_info", undefined, [
`provider_${this.name}`,
]);
} }
return { return {
provider: this.name as any, provider: this.name as any,
email: idTokenData.email, email: idTokenData.email,
providerId: idTokenData.sub, providerId: idTokenData.sub,
providerUsername: idTokenData.name, providerUsername: username,
}; };
} }
@@ -202,5 +231,7 @@ export interface OidcIdToken {
iat: number; iat: number;
email: string; email: string;
name: string; name: string;
nickname: string;
preferred_username: string;
nonce: string; nonce: string;
} }

View File

@@ -1,9 +1,10 @@
import { OAuthProvider, OAuthToken } from "./oauthProvider.interface"; import { Injectable } from "@nestjs/common";
import fetch from "node-fetch";
import { ConfigService } from "../../config/config.service";
import { OAuthCallbackDto } from "../dto/oauthCallback.dto"; import { OAuthCallbackDto } from "../dto/oauthCallback.dto";
import { OAuthSignInDto } from "../dto/oauthSignIn.dto"; import { OAuthSignInDto } from "../dto/oauthSignIn.dto";
import { ConfigService } from "../../config/config.service"; import { ErrorPageException } from "../exceptions/errorPage.exception";
import fetch from "node-fetch"; import { OAuthProvider, OAuthToken } from "./oauthProvider.interface";
import { BadRequestException, Injectable } from "@nestjs/common";
@Injectable() @Injectable()
export class GitHubProvider implements OAuthProvider<GitHubToken> { export class GitHubProvider implements OAuthProvider<GitHubToken> {
@@ -41,18 +42,19 @@ export class GitHubProvider implements OAuthProvider<GitHubToken> {
return { return {
accessToken: token.access_token, accessToken: token.access_token,
tokenType: token.token_type, tokenType: token.token_type,
scope: token.scope,
rawToken: token, rawToken: token,
}; };
} }
async getUserInfo(token: OAuthToken<GitHubToken>): Promise<OAuthSignInDto> { async getUserInfo(token: OAuthToken<GitHubToken>): Promise<OAuthSignInDto> {
const user = await this.getGitHubUser(token);
if (!token.scope.includes("user:email")) { if (!token.scope.includes("user:email")) {
throw new BadRequestException("No email permission granted"); throw new ErrorPageException("no_email", undefined, ["provider_github"]);
} }
const user = await this.getGitHubUser(token);
const email = await this.getGitHubEmail(token); const email = await this.getGitHubEmail(token);
if (!email) { if (!email) {
throw new BadRequestException("No email found"); throw new ErrorPageException("no_email", undefined, ["provider_github"]);
} }
return { return {

View File

@@ -1,9 +1,12 @@
import { GenericOidcProvider } from "./genericOidc.provider"; import { GenericOidcProvider, OidcToken } from "./genericOidc.provider";
import { Inject, Injectable } from "@nestjs/common"; import { Inject, Injectable } from "@nestjs/common";
import { ConfigService } from "../../config/config.service"; import { ConfigService } from "../../config/config.service";
import { JwtService } from "@nestjs/jwt"; import { JwtService } from "@nestjs/jwt";
import { CACHE_MANAGER } from "@nestjs/cache-manager"; import { CACHE_MANAGER } from "@nestjs/cache-manager";
import { Cache } from "cache-manager"; import { Cache } from "cache-manager";
import { OAuthCallbackDto } from "../dto/oauthCallback.dto";
import { OAuthSignInDto } from "../dto/oauthSignIn.dto";
import { OAuthToken } from "./oauthProvider.interface";
@Injectable() @Injectable()
export class OidcProvider extends GenericOidcProvider { export class OidcProvider extends GenericOidcProvider {
@@ -24,4 +27,13 @@ export class OidcProvider extends GenericOidcProvider {
protected getDiscoveryUri(): string { protected getDiscoveryUri(): string {
return this.config.get("oauth.oidc-discoveryUri"); return this.config.get("oauth.oidc-discoveryUri");
} }
getUserInfo(
token: OAuthToken<OidcToken>,
query: OAuthCallbackDto,
_?: string,
): Promise<OAuthSignInDto> {
const claim = this.config.get("oauth.oidc-usernameClaim") || undefined;
return super.getUserInfo(token, query, claim);
}
} }

View File

@@ -3,6 +3,7 @@ import * as moment from "moment";
import { ConfigService } from "src/config/config.service"; import { ConfigService } from "src/config/config.service";
import { FileService } from "src/file/file.service"; import { FileService } from "src/file/file.service";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { parseRelativeDateToAbsolute } from "src/utils/date.util";
import { CreateReverseShareDTO } from "./dto/createReverseShare.dto"; import { CreateReverseShareDTO } from "./dto/createReverseShare.dto";
@Injectable() @Injectable()
@@ -24,6 +25,17 @@ export class ReverseShareService {
) )
.toDate(); .toDate();
const parsedExpiration = parseRelativeDateToAbsolute(data.shareExpiration);
if (
this.config.get("share.maxExpiration") !== 0 &&
parsedExpiration >
moment().add(this.config.get("share.maxExpiration"), "hours").toDate()
) {
throw new BadRequestException(
"Expiration date exceeds maximum expiration date",
);
}
const globalMaxShareSize = this.config.get("share.maxSize"); const globalMaxShareSize = this.config.get("share.maxSize");
if (globalMaxShareSize < data.maxShareSize) if (globalMaxShareSize < data.maxShareSize)

View File

@@ -1,5 +1,4 @@
import { import {
CanActivate,
ExecutionContext, ExecutionContext,
Injectable, Injectable,
NotFoundException, NotFoundException,
@@ -7,10 +6,17 @@ import {
import { User } from "@prisma/client"; import { User } from "@prisma/client";
import { Request } from "express"; import { Request } from "express";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { JwtGuard } from "../../auth/guard/jwt.guard";
import { ConfigService } from "src/config/config.service";
@Injectable() @Injectable()
export class ShareOwnerGuard implements CanActivate { export class ShareOwnerGuard extends JwtGuard {
constructor(private prisma: PrismaService) {} constructor(
configService: ConfigService,
private prisma: PrismaService,
) {
super(configService);
}
async canActivate(context: ExecutionContext) { async canActivate(context: ExecutionContext) {
const request: Request = context.switchToHttp().getRequest(); const request: Request = context.switchToHttp().getRequest();
@@ -30,6 +36,8 @@ export class ShareOwnerGuard implements CanActivate {
if (!share.creatorId) return true; if (!share.creatorId) return true;
if (!(await super.canActivate(context))) return false;
return share.creatorId == (request.user as User).id; return share.creatorId == (request.user as User).id;
} }
} }

View File

@@ -43,6 +43,12 @@ export class ShareController {
return new ShareDTO().from(await this.shareService.get(id)); return new ShareDTO().from(await this.shareService.get(id));
} }
@Get(":id/from-owner")
@UseGuards(ShareOwnerGuard)
async getFromOwner(@Param("id") id: string) {
return new ShareDTO().from(await this.shareService.get(id));
}
@Get(":id/metaData") @Get(":id/metaData")
@UseGuards(ShareSecurityGuard) @UseGuards(ShareSecurityGuard)
async getMetaData(@Param("id") id: string) { async getMetaData(@Param("id") id: string) {
@@ -62,12 +68,6 @@ export class ShareController {
); );
} }
@Delete(":id")
@UseGuards(JwtGuard, ShareOwnerGuard)
async remove(@Param("id") id: string) {
await this.shareService.remove(id);
}
@Post(":id/complete") @Post(":id/complete")
@HttpCode(202) @HttpCode(202)
@UseGuards(CreateShareGuard, ShareOwnerGuard) @UseGuards(CreateShareGuard, ShareOwnerGuard)
@@ -78,6 +78,18 @@ export class ShareController {
); );
} }
@Delete(":id/complete")
@UseGuards(ShareOwnerGuard)
async revertComplete(@Param("id") id: string) {
return new ShareDTO().from(await this.shareService.revertComplete(id));
}
@Delete(":id")
@UseGuards(ShareOwnerGuard)
async remove(@Param("id") id: string) {
await this.shareService.remove(id);
}
@Throttle(10, 60) @Throttle(10, 60)
@Get("isShareIdAvailable/:id") @Get("isShareIdAvailable/:id")
async isShareIdAvailable(@Param("id") id: string) { async isShareIdAvailable(@Param("id") id: string) {

View File

@@ -16,6 +16,7 @@ import { EmailService } from "src/email/email.service";
import { FileService } from "src/file/file.service"; import { FileService } from "src/file/file.service";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { ReverseShareService } from "src/reverseShare/reverseShare.service"; import { ReverseShareService } from "src/reverseShare/reverseShare.service";
import { parseRelativeDateToAbsolute } from "src/utils/date.util";
import { SHARE_DIRECTORY } from "../constants"; import { SHARE_DIRECTORY } from "../constants";
import { CreateShareDTO } from "./dto/createShare.dto"; import { CreateShareDTO } from "./dto/createShare.dto";
@@ -51,19 +52,24 @@ export class ShareService {
if (reverseShare) { if (reverseShare) {
expirationDate = reverseShare.shareExpiration; expirationDate = reverseShare.shareExpiration;
} else { } else {
// We have to add an exception for "never" (since moment won't like that) const parsedExpiration = parseRelativeDateToAbsolute(share.expiration);
if (share.expiration !== "never") {
expirationDate = moment() const expiresNever = moment(0).toDate() == parsedExpiration;
.add(
share.expiration.split("-")[0], if (
share.expiration.split( this.config.get("share.maxExpiration") !== 0 &&
"-", (expiresNever ||
)[1] as moment.unitOfTime.DurationConstructor, parsedExpiration >
) moment()
.toDate(); .add(this.config.get("share.maxExpiration"), "hours")
} else { .toDate())
expirationDate = moment(0).toDate(); ) {
throw new BadRequestException(
"Expiration date exceeds maximum expiration date",
);
} }
expirationDate = parsedExpiration;
} }
fs.mkdirSync(`${SHARE_DIRECTORY}/${share.id}`, { fs.mkdirSync(`${SHARE_DIRECTORY}/${share.id}`, {
@@ -181,6 +187,13 @@ export class ShareService {
}); });
} }
async revertComplete(id: string) {
return this.prisma.share.update({
where: { id },
data: { uploadLocked: false, isZipReady: false },
});
}
async getSharesByUser(userId: string) { async getSharesByUser(userId: string) {
const shares = await this.prisma.share.findMany({ const shares = await this.prisma.share.findMany({
where: { where: {

View File

@@ -0,0 +1,12 @@
import * as moment from "moment";
export function parseRelativeDateToAbsolute(relativeDate: string) {
if (relativeDate == "never") return moment(0).toDate();
return moment()
.add(
relativeDate.split("-")[0],
relativeDate.split("-")[1] as moment.unitOfTime.DurationConstructor,
)
.toDate();
}

View File

@@ -20,7 +20,8 @@ Pingvin Share es una plataforma de intercambio de archivos autoalojada y una alt
## 🐧 Conoce Pingvin Share ## 🐧 Conoce Pingvin Share
- [Demo](https://pingvin-share.dev.eliasschneider.com) - [Demo](https://pingvin-share.dev.eliasschneider.com)
- [Reseña por DB Tech](https://www.youtube.com/watch?v=rWwNeZCOPJA) - [Reseña realizada por No Solo Hacking (español)](https://www.youtube.com/watch?v=ocd4EpLTYkU)
- [Reseña por DB Tech (inglés)](https://www.youtube.com/watch?v=rWwNeZCOPJA)
<img src="https://user-images.githubusercontent.com/58886915/225038319-b2ef742c-3a74-4eb6-9689-4207a36842a4.png" width="700"/> <img src="https://user-images.githubusercontent.com/58886915/225038319-b2ef742c-3a74-4eb6-9689-4207a36842a4.png" width="700"/>

View File

@@ -10,23 +10,22 @@
### GitHub ### GitHub
Please follow the [official guide](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) Please follow the [official guide](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) to create an OAuth app.
to create an OAuth app.
Redirect URL: `https://<your-domain>/api/oauth/callback/github` Redirect URL: `https://<your-domain>/api/oauth/callback/github`
### Google ### Google
Please follow the [official guide](https://developers.google.com/identity/protocols/oauth2/web-server#prerequisites) to Please follow the [official guide](https://developers.google.com/identity/protocols/oauth2/web-server#prerequisites) to create an OAuth 2.0 App.
create an OAuth 2.0 App.
Redirect URL: `https://<your-domain>/api/oauth/callback/google` Redirect URL: `https://<your-domain>/api/oauth/callback/google`
### Microsoft ### Microsoft
Please follow Please follow the [official guide](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app) to register an application.
the [official guide](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app)
to register an application. > [!IMPORTANT]
> **Microsoft Tenant** you set in the admin panel must match the **supported account types** you set in the Microsoft Entra admin center, otherwise the OAuth login will not work. Refer to the [official documentation](https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols-oidc#find-your-apps-openid-configuration-document-uri) for more details.
Redirect URL: `https://<your-domain>/api/oauth/callback/microsoft` Redirect URL: `https://<your-domain>/api/oauth/callback/microsoft`
@@ -38,7 +37,7 @@ 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 and Authentik. Generic OpenID Connect provider is also supported, we have tested it on Keycloak, Authentik and Casdoor.
Redirect URL: `https://<your-domain>/api/oauth/callback/oidc` Redirect URL: `https://<your-domain>/api/oauth/callback/oidc`
@@ -74,14 +73,11 @@ const configVariables: ConfigVariables = {
### 2. Create provider class ### 2. Create provider class
#### OpenID Connect #### Generic OpenID Connect
If your provider supports OpenID connect, it's extremely easy to 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.
extend [`GenericOidcProvider`](../backend/src/oauth/provider/genericOidc.provider.ts) to add a new OpenID Connect
provider.
The [Google provider](../backend/src/oauth/provider/google.provider.ts) The [Google provider](../backend/src/oauth/provider/google.provider.ts) and [Microsoft provider](../backend/src/oauth/provider/microsoft.provider.ts) are good examples.
and [Microsoft provider](../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:
@@ -95,17 +91,13 @@ Here are some discovery URIs for popular providers:
#### OAuth 2 #### OAuth 2
If your provider only supports OAuth 2, you can 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.
implement [`OAuthProvider`](../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) The [GitHub provider](../backend/src/oauth/provider/github.provider.ts) and [Discord provider](../backend/src/oauth/provider/discord.provider.ts) are good examples.
and [Discord provider](../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) Register your provider in [`OAuthModule`](../backend/src/oauth/oauth.module.ts) and [`OAuthSignInDto`](../backend/src/oauth/dto/oauthSignIn.dto.ts):
and [`OAuthSignInDto`](../backend/src/oauth/dto/oauthSignIn.dto.ts):
```ts ```ts
@Module({ @Module({
@@ -117,8 +109,7 @@ and [`OAuthSignInDto`](../backend/src/oauth/dto/oauthSignIn.dto.ts):
useFactory(github: GitHubProvider, /* your provider */): Record<string, OAuthProvider<unknown>> { useFactory(github: GitHubProvider, /* your provider */): Record<string, OAuthProvider<unknown>> {
return { return {
github, github,
google, /* your provider */
oidc,
}; };
}, },
inject: [GitHubProvider, /* your provider */], inject: [GitHubProvider, /* your provider */],
@@ -131,8 +122,7 @@ export class OAuthModule {
```ts ```ts
export interface OAuthSignInDto { export interface OAuthSignInDto {
provider: 'github' | 'google' | 'microsoft' | 'discord' | 'oidc' /* your provider*/ provider: 'github' | 'google' | 'microsoft' | 'discord' | 'oidc' /* your provider*/;
;
providerId: string; providerId: string;
providerUsername: string; providerUsername: string;
email: string; email: string;
@@ -161,8 +151,7 @@ Add keys below to your i18n text in [locale file](../frontend/src/i18n/translati
- `admin.config.oauth.YOUR_PROVIDER_NAME-enabled` - `admin.config.oauth.YOUR_PROVIDER_NAME-enabled`
- `admin.config.oauth.YOUR_PROVIDER_NAME-client-id` - `admin.config.oauth.YOUR_PROVIDER_NAME-client-id`
- `admin.config.oauth.YOUR_PROVIDER_NAME-client-secret` - `admin.config.oauth.YOUR_PROVIDER_NAME-client-secret`
- `error.param.provider_YOUR_PROVIDER_NAME`
- Other config keys you defined in step 1 - Other config keys you defined in step 1
Congratulations! 🎉 You have successfully added a new OAuth 2 provider! Pull requests are welcome if you want to share Congratulations! 🎉 You have successfully added a new OAuth 2 provider! Pull requests are welcome if you want to share your provider with others.
your provider with others.

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": "0.19.0", "version": "0.22.0",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"build": "next build", "build": "next build",
@@ -23,6 +23,7 @@
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"jose": "^4.14.4", "jose": "^4.14.4",
"jwt-decode": "^3.1.2", "jwt-decode": "^3.1.2",
"markdown-to-jsx": "^7.4.1",
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
"moment": "^2.29.4", "moment": "^2.29.4",
"next": "^13.4.12", "next": "^13.4.12",

View File

@@ -36,28 +36,28 @@ const showShareInformationsModal = (
children: ( children: (
<Stack align="stretch" spacing="md"> <Stack align="stretch" spacing="md">
<Text size="sm" color="lightgray"> <Text size="sm">
<b> <b>
<FormattedMessage id="account.shares.table.id" />:{" "} <FormattedMessage id="account.shares.table.id" />:{" "}
</b> </b>
{share.id} {share.id}
</Text> </Text>
<Text size="sm" color="lightgray"> <Text size="sm">
<b> <b>
<FormattedMessage id="account.shares.table.description" />:{" "} <FormattedMessage id="account.shares.table.description" />:{" "}
</b> </b>
{share.description || "No description"} {share.description || "No description"}
</Text> </Text>
<Text size="sm" color="lightgray"> <Text size="sm">
<b> <b>
<FormattedMessage id="account.shares.table.createdAt" />:{" "} <FormattedMessage id="account.shares.table.createdAt" />:{" "}
</b> </b>
{formattedCreatedAt} {formattedCreatedAt}
</Text> </Text>
<Text size="sm" color="lightgray"> <Text size="sm">
<b> <b>
<FormattedMessage id="account.shares.table.expiresAt" />:{" "} <FormattedMessage id="account.shares.table.expiresAt" />:{" "}
</b> </b>
@@ -66,7 +66,7 @@ const showShareInformationsModal = (
<Divider /> <Divider />
<CopyTextField link={link} /> <CopyTextField link={link} />
<Divider /> <Divider />
<Text size="sm" color="lightgray"> <Text size="sm">
<b> <b>
<FormattedMessage id="account.shares.table.size" />:{" "} <FormattedMessage id="account.shares.table.size" />:{" "}
</b> </b>
@@ -76,7 +76,7 @@ const showShareInformationsModal = (
<Flex align="center" justify="center"> <Flex align="center" justify="center">
{shareSize / maxShareSize < 0.1 && ( {shareSize / maxShareSize < 0.1 && (
<Text size="xs" color="lightgray" style={{ marginRight: "4px" }}> <Text size="xs" style={{ marginRight: "4px" }}>
{formattedShareSize} {formattedShareSize}
</Text> </Text>
)} )}
@@ -87,7 +87,7 @@ const showShareInformationsModal = (
size="xl" size="xl"
radius="xl" radius="xl"
/> />
<Text size="xs" color="lightgray" style={{ marginLeft: "4px" }}> <Text size="xs" style={{ marginLeft: "4px" }}>
{formattedMaxShareSize} {formattedMaxShareSize}
</Text> </Text>
</Flex> </Flex>

View File

@@ -1,9 +1,10 @@
import { Button, Center, Stack, Text, Title } from "@mantine/core"; import { Button, Center, Stack, Text, Title, useMantineTheme } from "@mantine/core";
import { modals } from "@mantine/modals"; import { modals } from "@mantine/modals";
import Link from "next/link"; import Link from "next/link";
import React, { Dispatch, SetStateAction, useEffect, useState } from "react"; import React, { Dispatch, SetStateAction, useEffect, useState } from "react";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
import api from "../../services/api.service"; import api from "../../services/api.service";
import Markdown from "markdown-to-jsx";
const FilePreviewContext = React.createContext<{ const FilePreviewContext = React.createContext<{
shareId: string; shareId: string;
@@ -115,22 +116,40 @@ const ImagePreview = () => {
const TextPreview = () => { const TextPreview = () => {
const { shareId, fileId } = React.useContext(FilePreviewContext); const { shareId, fileId } = React.useContext(FilePreviewContext);
const [text, setText] = useState<string | null>(null); const [ text, setText ] = useState<string>("");
const { colorScheme } = useMantineTheme();
useEffect(() => { useEffect(() => {
api api
.get(`/shares/${shareId}/files/${fileId}?download=false`) .get(`/shares/${shareId}/files/${fileId}?download=false`)
.then((res) => setText(res.data)); .then((res) => setText(res.data ?? "Preview couldn't be fetched."));
}, [shareId, fileId]); }, [ shareId, fileId ]);
const options = {
overrides: {
pre: {
props: {
style: {
backgroundColor: colorScheme == "dark"
? "rgba(50, 50, 50, 0.5)"
: "rgba(220, 220, 220, 0.5)",
padding: "0.75em",
whiteSpace: "pre-wrap",
}
}
},
table: {
props: {
className: "md"
}
}
}
};
return ( return (
<Center style={{ minHeight: 200 }}> <Markdown options={options}>
<Stack align="center" spacing={10} style={{ width: "100%" }}> {text}
<Text sx={{ whiteSpace: "pre-wrap" }} size="sm"> </Markdown>
{text}
</Text>
</Stack>
</Center>
); );
}; };

View File

@@ -12,6 +12,7 @@ import {
import { useForm } from "@mantine/form"; import { useForm } 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 { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
import useTranslate, { import useTranslate, {
translateOutsideContext, translateOutsideContext,
@@ -25,6 +26,7 @@ import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
const showCreateReverseShareModal = ( const showCreateReverseShareModal = (
modals: ModalsContextProps, modals: ModalsContextProps,
showSendEmailNotificationOption: boolean, showSendEmailNotificationOption: boolean,
maxExpirationInHours: number,
getReverseShares: () => void, getReverseShares: () => void,
) => { ) => {
const t = translateOutsideContext(); const t = translateOutsideContext();
@@ -34,6 +36,7 @@ const showCreateReverseShareModal = (
<Body <Body
showSendEmailNotificationOption={showSendEmailNotificationOption} showSendEmailNotificationOption={showSendEmailNotificationOption}
getReverseShares={getReverseShares} getReverseShares={getReverseShares}
maxExpirationInHours={maxExpirationInHours}
/> />
), ),
}); });
@@ -42,9 +45,11 @@ const showCreateReverseShareModal = (
const Body = ({ const Body = ({
getReverseShares, getReverseShares,
showSendEmailNotificationOption, showSendEmailNotificationOption,
maxExpirationInHours,
}: { }: {
getReverseShares: () => void; getReverseShares: () => void;
showSendEmailNotificationOption: boolean; showSendEmailNotificationOption: boolean;
maxExpirationInHours: number;
}) => { }) => {
const modals = useModals(); const modals = useModals();
const t = useTranslate(); const t = useTranslate();
@@ -58,27 +63,48 @@ const Body = ({
expiration_unit: "-days", expiration_unit: "-days",
}, },
}); });
const onSubmit = form.onSubmit(async (values) => {
const expirationDate = moment().add(
form.values.expiration_num,
form.values.expiration_unit.replace(
"-",
"",
) as moment.unitOfTime.DurationConstructor,
);
if (
maxExpirationInHours != 0 &&
expirationDate.isAfter(moment().add(maxExpirationInHours, "hours"))
) {
form.setFieldError(
"expiration_num",
t("upload.modal.expires.error.too-long", {
max: moment.duration(maxExpirationInHours, "hours").humanize(),
}),
);
return;
}
shareService
.createReverseShare(
values.expiration_num + values.expiration_unit,
values.maxShareSize,
values.maxUseCount,
values.sendEmailNotification,
)
.then(({ link }) => {
modals.closeAll();
showCompletedReverseShareModal(modals, link, getReverseShares);
})
.catch(toast.axiosError);
});
return ( return (
<Group> <Group>
<form <form onSubmit={onSubmit}>
onSubmit={form.onSubmit(async (values) => {
shareService
.createReverseShare(
values.expiration_num + values.expiration_unit,
values.maxShareSize,
values.maxUseCount,
values.sendEmailNotification,
)
.then(({ link }) => {
modals.closeAll();
showCompletedReverseShareModal(modals, link, getReverseShares);
})
.catch(toast.axiosError);
})}
>
<Stack align="stretch"> <Stack align="stretch">
<div> <div>
<Grid align={form.errors.link ? "center" : "flex-end"}> <Grid align={form.errors.expiration_num ? "center" : "flex-end"}>
<Col xs={6}> <Col xs={6}>
<NumberInput <NumberInput
min={1} min={1}

View File

@@ -1,7 +1,8 @@
import { ActionIcon, TextInput } 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 { TbCheck, TbCopy } from "react-icons/tb";
import { IoOpenOutline } from "react-icons/io5";
import useTranslate from "../../hooks/useTranslate.hook"; import useTranslate from "../../hooks/useTranslate.hook";
import toast from "../../utils/toast.util"; import toast from "../../utils/toast.util";
@@ -37,12 +38,27 @@ function CopyTextField(props: { link: string }) {
setTextClicked(true); setTextClicked(true);
} }
}} }}
rightSectionWidth={62}
rightSection={ rightSection={
window.isSecureContext && ( <>
<ActionIcon onClick={copyLink}> <Tooltip
{checkState ? <TbCheck /> : <TbCopy />} label={t("common.text.navigate-to-link")}
</ActionIcon> position="top"
) offset={-2}
openDelay={200}
>
<a href={props.link}>
<ActionIcon>
<IoOpenOutline />
</ActionIcon>
</a>
</Tooltip>
{window.isSecureContext && (
<ActionIcon onClick={copyLink}>
{checkState ? <TbCheck /> : <TbCopy />}
</ActionIcon>
)}
</>
} }
/> />
); );

View File

@@ -33,10 +33,12 @@ const useStyles = createStyles((theme) => ({
})); }));
const Dropzone = ({ const Dropzone = ({
title,
isUploading, isUploading,
maxShareSize, maxShareSize,
showCreateUploadModalCallback, showCreateUploadModalCallback,
}: { }: {
title?: string;
isUploading: boolean; isUploading: boolean;
maxShareSize: number; maxShareSize: number;
showCreateUploadModalCallback: (files: FileUpload[]) => void; showCreateUploadModalCallback: (files: FileUpload[]) => void;
@@ -78,7 +80,7 @@ const Dropzone = ({
<TbCloudUpload size={50} /> <TbCloudUpload size={50} />
</Group> </Group>
<Text align="center" weight={700} size="lg" mt="xl"> <Text align="center" weight={700} size="lg" mt="xl">
<FormattedMessage id="upload.dropzone.title" /> {title || <FormattedMessage id="upload.dropzone.title" />}
</Text> </Text>
<Text align="center" size="sm" mt="xs" color="dimmed"> <Text align="center" size="sm" mt="xs" color="dimmed">
<FormattedMessage <FormattedMessage

View File

@@ -0,0 +1,238 @@
import { Button, Group } from "@mantine/core";
import { useModals } from "@mantine/modals";
import { cleanNotifications } from "@mantine/notifications";
import { AxiosError } from "axios";
import pLimit from "p-limit";
import { useEffect, useMemo, useState } from "react";
import { FormattedMessage } from "react-intl";
import Dropzone from "../../components/upload/Dropzone";
import FileList from "../../components/upload/FileList";
import showCompletedUploadModal from "../../components/upload/modals/showCompletedUploadModal";
import useConfig from "../../hooks/config.hook";
import useTranslate from "../../hooks/useTranslate.hook";
import shareService from "../../services/share.service";
import { FileListItem, FileMetaData, FileUpload } from "../../types/File.type";
import toast from "../../utils/toast.util";
import { useRouter } from "next/router";
const promiseLimit = pLimit(3);
const chunkSize = 10 * 1024 * 1024; // 10MB
let errorToastShown = false;
const EditableUpload = ({
maxShareSize,
shareId,
files: savedFiles = [],
}: {
maxShareSize?: number;
isReverseShare?: boolean;
shareId: string;
files?: FileMetaData[];
}) => {
const t = useTranslate();
const router = useRouter();
const config = useConfig();
const [existingFiles, setExistingFiles] =
useState<Array<FileMetaData & { deleted?: boolean }>>(savedFiles);
const [uploadingFiles, setUploadingFiles] = useState<FileUpload[]>([]);
const [isUploading, setIsUploading] = useState(false);
const existingAndUploadedFiles: FileListItem[] = useMemo(
() => [...uploadingFiles, ...existingFiles],
[existingFiles, uploadingFiles],
);
const dirty = useMemo(() => {
return (
existingFiles.some((file) => !!file.deleted) || !!uploadingFiles.length
);
}, [existingFiles, uploadingFiles]);
const setFiles = (files: FileListItem[]) => {
const _uploadFiles = files.filter(
(file) => "uploadingProgress" in file,
) as FileUpload[];
const _existingFiles = files.filter(
(file) => !("uploadingProgress" in file),
) as FileMetaData[];
setUploadingFiles(_uploadFiles);
setExistingFiles(_existingFiles);
};
maxShareSize ??= parseInt(config.get("share.maxSize"));
const uploadFiles = async (files: FileUpload[]) => {
const fileUploadPromises = files.map(async (file, fileIndex) =>
// Limit the number of concurrent uploads to 3
promiseLimit(async () => {
let fileId: string;
const setFileProgress = (progress: number) => {
setUploadingFiles((files) =>
files.map((file, callbackIndex) => {
if (fileIndex == callbackIndex) {
file.uploadingProgress = progress;
}
return file;
}),
);
};
setFileProgress(1);
let chunks = Math.ceil(file.size / chunkSize);
// If the file is 0 bytes, we still need to upload 1 chunk
if (chunks == 0) chunks++;
for (let chunkIndex = 0; chunkIndex < chunks; chunkIndex++) {
const from = chunkIndex * chunkSize;
const to = from + chunkSize;
const blob = file.slice(from, to);
try {
await new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = async (event) =>
await shareService
.uploadFile(
shareId,
event,
{
id: fileId,
name: file.name,
},
chunkIndex,
chunks,
)
.then((response) => {
fileId = response.id;
resolve(response);
})
.catch(reject);
reader.readAsDataURL(blob);
});
setFileProgress(((chunkIndex + 1) / chunks) * 100);
} catch (e) {
if (
e instanceof AxiosError &&
e.response?.data.error == "unexpected_chunk_index"
) {
// Retry with the expected chunk index
chunkIndex = e.response!.data!.expectedChunkIndex - 1;
continue;
} else {
setFileProgress(-1);
// Retry after 5 seconds
await new Promise((resolve) => setTimeout(resolve, 5000));
chunkIndex = -1;
continue;
}
}
}
}),
);
await Promise.all(fileUploadPromises);
};
const removeFiles = async () => {
const removedFiles = existingFiles.filter((file) => !!file.deleted);
if (removedFiles.length > 0) {
await Promise.all(
removedFiles.map(async (file) => {
await shareService.removeFile(shareId, file.id);
}),
);
setExistingFiles(existingFiles.filter((file) => !file.deleted));
}
};
const revertComplete = async () => {
await shareService.revertComplete(shareId).then();
};
const completeShare = async () => {
return await shareService.completeShare(shareId);
};
const save = async () => {
setIsUploading(true);
try {
await revertComplete();
await uploadFiles(uploadingFiles);
const hasFailed = uploadingFiles.some(
(file) => file.uploadingProgress == -1,
);
if (!hasFailed) {
await removeFiles();
}
await completeShare();
if (!hasFailed) {
toast.success(t("share.edit.notify.save-success"));
router.back();
}
} catch {
toast.error(t("share.edit.notify.generic-error"));
} finally {
setIsUploading(false);
}
};
const appendFiles = (appendingFiles: FileUpload[]) => {
setUploadingFiles([...appendingFiles, ...uploadingFiles]);
};
useEffect(() => {
// Check if there are any files that failed to upload
const fileErrorCount = uploadingFiles.filter(
(file) => file.uploadingProgress == -1,
).length;
if (fileErrorCount > 0) {
if (!errorToastShown) {
toast.error(
t("upload.notify.count-failed", { count: fileErrorCount }),
{
withCloseButton: false,
autoClose: false,
},
);
}
errorToastShown = true;
} else {
cleanNotifications();
errorToastShown = false;
}
}, [uploadingFiles]);
return (
<>
<Group position="right" mb={20}>
<Button loading={isUploading} disabled={!dirty} onClick={() => save()}>
<FormattedMessage id="common.button.save" />
</Button>
</Group>
<Dropzone
title={t("share.edit.append-upload")}
maxShareSize={maxShareSize}
showCreateUploadModalCallback={appendFiles}
isUploading={isUploading}
/>
{existingAndUploadedFiles.length > 0 && (
<FileList files={existingAndUploadedFiles} setFiles={setFiles} />
)}
</>
);
};
export default EditableUpload;

View File

@@ -1,41 +1,106 @@
import { ActionIcon, Table } from "@mantine/core"; import { ActionIcon, Table } from "@mantine/core";
import { Dispatch, SetStateAction } from "react";
import { TbTrash } from "react-icons/tb"; import { TbTrash } from "react-icons/tb";
import { FileUpload } from "../../types/File.type"; import { GrUndo } from "react-icons/gr";
import { FileListItem } from "../../types/File.type";
import { byteToHumanSizeString } from "../../utils/fileSize.util"; import { byteToHumanSizeString } from "../../utils/fileSize.util";
import UploadProgressIndicator from "./UploadProgressIndicator"; import UploadProgressIndicator from "./UploadProgressIndicator";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
const FileList = ({ const FileListRow = ({
file,
onRemove,
onRestore,
}: {
file: FileListItem;
onRemove?: () => void;
onRestore?: () => void;
}) => {
{
const uploadable = "uploadingProgress" in file;
const uploading = uploadable && file.uploadingProgress !== 0;
const removable = uploadable
? file.uploadingProgress === 0
: onRemove && !file.deleted;
const restorable = onRestore && !uploadable && !!file.deleted; // maybe undefined, force boolean
const deleted = !uploadable && !!file.deleted;
return (
<tr
style={{
color: deleted ? "rgba(120, 120, 120, 0.5)" : "inherit",
textDecoration: deleted ? "line-through" : "none",
}}
>
<td>{file.name}</td>
<td>{byteToHumanSizeString(+file.size)}</td>
<td>
{removable && (
<ActionIcon
color="red"
variant="light"
size={25}
onClick={onRemove}
>
<TbTrash />
</ActionIcon>
)}
{uploading && (
<UploadProgressIndicator progress={file.uploadingProgress} />
)}
{restorable && (
<ActionIcon
color="primary"
variant="light"
size={25}
onClick={onRestore}
>
<GrUndo />
</ActionIcon>
)}
</td>
</tr>
);
}
};
const FileList = <T extends FileListItem = FileListItem>({
files, files,
setFiles, setFiles,
}: { }: {
files: FileUpload[]; files: T[];
setFiles: Dispatch<SetStateAction<FileUpload[]>>; setFiles: (files: T[]) => void;
}) => { }) => {
const remove = (index: number) => { const remove = (index: number) => {
files.splice(index, 1); const file = files[index];
if ("uploadingProgress" in file) {
files.splice(index, 1);
} else {
files[index] = { ...file, deleted: true };
}
setFiles([...files]); setFiles([...files]);
}; };
const restore = (index: number) => {
const file = files[index];
if ("uploadingProgress" in file) {
return;
} else {
files[index] = { ...file, deleted: false };
}
setFiles([...files]);
};
const rows = files.map((file, i) => ( const rows = files.map((file, i) => (
<tr key={i}> <FileListRow
<td>{file.name}</td> key={i}
<td>{byteToHumanSizeString(file.size)}</td> file={file}
<td> onRemove={() => remove(i)}
{file.uploadingProgress == 0 ? ( onRestore={() => restore(i)}
<ActionIcon />
color="red"
variant="light"
size={25}
onClick={() => remove(i)}
>
<TbTrash />
</ActionIcon>
) : (
<UploadProgressIndicator progress={file.uploadingProgress} />
)}
</td>
</tr>
)); ));
return ( return (

View File

@@ -18,6 +18,7 @@ import {
import { useForm, yupResolver } 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 moment from "moment";
import { useState } from "react"; import { 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";
@@ -38,6 +39,7 @@ const showCreateUploadModal = (
appUrl: string; appUrl: string;
allowUnauthenticatedShares: boolean; allowUnauthenticatedShares: boolean;
enableEmailRecepients: boolean; enableEmailRecepients: boolean;
maxExpirationInHours: number;
}, },
files: FileUpload[], files: FileUpload[],
uploadCallback: (createShare: CreateShare, files: FileUpload[]) => void, uploadCallback: (createShare: CreateShare, files: FileUpload[]) => void,
@@ -69,6 +71,7 @@ const CreateUploadModalBody = ({
appUrl: string; appUrl: string;
allowUnauthenticatedShares: boolean; allowUnauthenticatedShares: boolean;
enableEmailRecepients: boolean; enableEmailRecepients: boolean;
maxExpirationInHours: number;
}; };
}) => { }) => {
const modals = useModals(); const modals = useModals();
@@ -89,9 +92,17 @@ const CreateUploadModalBody = ({
.matches(new RegExp("^[a-zA-Z0-9_-]*$"), { .matches(new RegExp("^[a-zA-Z0-9_-]*$"), {
message: t("upload.modal.link.error.invalid"), message: t("upload.modal.link.error.invalid"),
}), }),
password: yup.string().min(3).max(30), password: yup
maxViews: yup.number().min(1), .string()
.transform((value) => value || undefined)
.min(3)
.max(30),
maxViews: yup
.number()
.transform((value) => value || undefined)
.min(1),
}); });
const form = useForm({ const form = useForm({
initialValues: { initialValues: {
link: generatedLink, link: generatedLink,
@@ -105,6 +116,58 @@ const CreateUploadModalBody = ({
}, },
validate: yupResolver(validationSchema), validate: yupResolver(validationSchema),
}); });
const onSubmit = form.onSubmit(async (values) => {
if (!(await shareService.isShareIdAvailable(values.link))) {
form.setFieldError("link", t("upload.modal.link.error.taken"));
} else {
const expirationString = form.values.never_expires
? "never"
: form.values.expiration_num + form.values.expiration_unit;
const expirationDate = moment().add(
form.values.expiration_num,
form.values.expiration_unit.replace(
"-",
"",
) as moment.unitOfTime.DurationConstructor,
);
if (
options.maxExpirationInHours != 0 &&
(form.values.never_expires ||
expirationDate.isAfter(
moment().add(options.maxExpirationInHours, "hours"),
))
) {
form.setFieldError(
"expiration_num",
t("upload.modal.expires.error.too-long", {
max: moment
.duration(options.maxExpirationInHours, "hours")
.humanize(),
}),
);
return;
}
uploadCallback(
{
id: values.link,
expiration: expirationString,
recipients: values.recipients,
description: values.description,
security: {
password: values.password || undefined,
maxViews: values.maxViews || undefined,
},
},
files,
);
modals.closeAll();
}
});
return ( return (
<> <>
{showNotSignedInAlert && !options.isUserSignedIn && ( {showNotSignedInAlert && !options.isUserSignedIn && (
@@ -118,33 +181,9 @@ const CreateUploadModalBody = ({
<FormattedMessage id="upload.modal.not-signed-in-description" /> <FormattedMessage id="upload.modal.not-signed-in-description" />
</Alert> </Alert>
)} )}
<form <form onSubmit={onSubmit}>
onSubmit={form.onSubmit(async (values) => {
if (!(await shareService.isShareIdAvailable(values.link))) {
form.setFieldError("link", t("upload.modal.link.error.taken"));
} else {
const expiration = form.values.never_expires
? "never"
: form.values.expiration_num + form.values.expiration_unit;
uploadCallback(
{
id: values.link,
expiration: expiration,
recipients: values.recipients,
description: values.description,
security: {
password: values.password,
maxViews: values.maxViews,
},
},
files,
);
modals.closeAll();
}
})}
>
<Stack align="stretch"> <Stack align="stretch">
<Group align="end"> <Group align={form.errors.link ? "center" : "flex-end"}>
<TextInput <TextInput
style={{ flex: "1" }} style={{ flex: "1" }}
variant="filled" variant="filled"
@@ -179,7 +218,7 @@ const CreateUploadModalBody = ({
</Text> </Text>
{!options.isReverseShare && ( {!options.isReverseShare && (
<> <>
<Grid align={form.errors.link ? "center" : "flex-end"}> <Grid align={form.errors.expiration_num ? "center" : "flex-end"}>
<Col xs={6}> <Col xs={6}>
<NumberInput <NumberInput
min={1} min={1}
@@ -243,10 +282,12 @@ const CreateUploadModalBody = ({
/> />
</Col> </Col>
</Grid> </Grid>
<Checkbox {options.maxExpirationInHours == 0 && (
label={t("upload.modal.expires.never-long")} <Checkbox
{...form.getInputProps("never_expires")} label={t("upload.modal.expires.never-long")}
/> {...form.getInputProps("never_expires")}
/>
)}
<Text <Text
italic italic
size="xs" size="xs"

View File

@@ -1,17 +1,22 @@
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 english from "./translations/en-US"; 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 italian from "./translations/it-IT";
import japanese from "./translations/ja-JP"; import japanese from "./translations/ja-JP";
import dutch from "./translations/nl-BE"; import dutch from "./translations/nl-BE";
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 serbian from "./translations/sr-SP"; import serbian from "./translations/sr-SP";
import swedish from "./translations/sv-SE";
import thai from "./translations/th-TH"; import thai from "./translations/th-TH";
import chineseSimplified from "./translations/zh-CN"; import chineseSimplified from "./translations/zh-CN";
import polish from "./translations/pl-PL"; import chineseTraditional from "./translations/zh-TW";
export const LOCALES = { export const LOCALES = {
ENGLISH: { ENGLISH: {
@@ -49,6 +54,11 @@ export const LOCALES = {
code: "zh-CN", code: "zh-CN",
messages: chineseSimplified, messages: chineseSimplified,
}, },
CHINESE_TRADITIONAL: {
name: "正體中文",
code: "zh-TW",
messages: chineseTraditional,
},
FINNISH: { FINNISH: {
name: "Suomi", name: "Suomi",
code: "fi-FI", code: "fi-FI",
@@ -84,4 +94,24 @@ export const LOCALES = {
code: "pl-PL", code: "pl-PL",
messages: polish, messages: polish,
}, },
SWEDISH: {
name: "Svenska",
code: "sv-SE",
messages: swedish,
},
ITALIAN: {
name: "Italiano",
code: "it-IT",
messages: italian,
},
GREEK: {
name: "Ελληνικά",
code: "el-GR",
messages: greek,
},
SLOVENIAN: {
name: "Slovenščina",
code: "sl-SI",
messages: slovenian,
},
}; };

View File

@@ -52,7 +52,7 @@ export default {
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "TOTP Authentication",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Log ind",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Glemt din adgangskode?", "resetPassword.title": "Glemt din adgangskode?",
@@ -214,6 +214,7 @@ export default {
"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": "Udløber aldrig",
"upload.modal.expires.error.too-long": "Udløbsdatoen overskrider den maksimalt tilladte udløbsdato på {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",
@@ -261,8 +262,14 @@ export default {
"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": "En forhåndsvisning for thise filtype er ikke understøttet. Download venligst filen for at se den.", "share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Edit {shareId}",
"share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Konfiguration", "admin.config.title": "Konfiguration",
"admin.config.category.general": "Generelt", "admin.config.category.general": "Generelt",
@@ -301,6 +308,8 @@ export default {
"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.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"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 i bytes",
"admin.config.share.zip-compression-level": "Zip compression level", "admin.config.share.zip-compression-level": "Zip compression level",
@@ -344,37 +353,45 @@ 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-guild": "Discord limited server ID",
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Client ID of the 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 of the Discord OAuth app", "admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "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-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 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",
// error // error
"error.title": "Error", "error.title": "Fejl",
"error.description": "Oops!", "error.description": "Hovsa!",
"error.button.back": "Go back", "error.button.back": "Gå tilbage",
"error.msg.default": "Something went wrong.", "error.msg.default": "Something went wrong.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "You canceled the authentication process, please try again.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "The authentication process took too long, please try again.",
"error.msg.invalid_token": "Internal Error",
"error.msg.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 haven't linked to any account yet.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.discord_guild_permission_denied": "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.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Gem", "common.button.save": "Gem",
"common.button.create": "Opret", "common.button.create": "Opret",
@@ -387,6 +404,7 @@ 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.or": "eller", "common.text.or": "eller",
"common.button.go-back": "Gå tilbage", "common.button.go-back": "Gå tilbage",
"common.notify.copied": "Linket blev kopieret til udklipsholderen", "common.notify.copied": "Linket blev kopieret til udklipsholderen",

View File

@@ -33,7 +33,7 @@ export default {
"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 füge deinen Zwei-Faktor-Authentifizierungscode ein",
"signIn.oauth.or": "OR", "signIn.oauth.or": "ODER",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -51,13 +51,13 @@ export default {
"signup.button.submit": "Lass uns loslegen", "signup.button.submit": "Lass uns loslegen",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "TOTP Authentifizierung",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Anmelden",
// 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 Email Adresse ein, um dein Passwort zurückzusetzen.",
"resetPassword.notify.success": "Ein Link zum Rücksetzen des Passwortes wurde an deine Emailadresse versandt.", "resetPassword.notify.success": "Ein Link zum Zurücksetzen des Passwortes wurde an deine Emailadresse versandt.",
"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",
"resetPassword.text.enterNewPassword": "Gib dein neues Passwort ein", "resetPassword.text.enterNewPassword": "Gib dein neues Passwort ein",
@@ -72,20 +72,20 @@ export default {
"account.card.password.title": "Passwort", "account.card.password.title": "Passwort",
"account.card.password.old": "Altes Passwort", "account.card.password.old": "Altes Passwort",
"account.card.password.new": "Neues Passwort", "account.card.password.new": "Neues Passwort",
"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": "Du hast kein Passwort erstellt. Wenn Du Dich mit E-Mail und Passwort anmelden möchtest, musst Du ein Passwort festlegen.",
"account.notify.password.success": "Passwort erfolgreich geändert", "account.notify.password.success": "Passwort erfolgreich geändert",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Anmeldung über soziale Netzwerke",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Verknüpfen",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Verknüpfung aufheben",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Verknüpfung aufgehoben",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Kontoverknüpfung aufheben",
"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": "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.notify.oauth.unlinked.success": "Unlinked successfully", "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",
"account.card.security.totp.disable.description": "Gib dein aktuelles Passwort ein, um TOTP zu deaktivieren", "account.card.security.totp.disable.description": "Gib dein aktuelles Passwort ein, um TOTP zu deaktivieren",
@@ -115,7 +115,7 @@ export default {
"account.shares.title.empty": "Es ist so leer hier 👀", "account.shares.title.empty": "Es ist so leer hier 👀",
"account.shares.description.empty": "Du hast keine Freigaben erstellt.", "account.shares.description.empty": "Du hast keine Freigaben erstellt.",
"account.shares.button.create": "Erstelle eine", "account.shares.button.create": "Erstelle eine",
"account.shares.info.title": "Teile deine Information", "account.shares.info.title": "Freigabe Informationen",
"account.shares.table.id": "ID", "account.shares.table.id": "ID",
"account.shares.table.name": "Name", "account.shares.table.name": "Name",
"account.shares.table.description": "Beschreibung", "account.shares.table.description": "Beschreibung",
@@ -214,6 +214,7 @@ export default {
"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": "niemals",
"upload.modal.expires.never-long": "Läuft nicht ab", "upload.modal.expires.never-long": "Läuft nicht ab",
"upload.modal.expires.error.too-long": "Ablauf überschreitet das maximale Ablaufdatum 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",
@@ -261,15 +262,21 @@ export default {
"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 anzuzeigen.", "share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "{shareId} bearbeiten",
"share.edit.append-upload": "Datei anfügen",
"share.edit.notify.generic-error": "Während der Erstellung der Freigabe ist ein Fehler aufgetreten.",
"share.edit.notify.save-success": "Freigabe erfolgreich aktualisiert",
// END /share/[id]/edit
// /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": "Social Login", "admin.config.category.oauth": "OAuth-Anmeldung",
"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",
@@ -301,6 +308,8 @@ export default {
"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.description": "Maximale Ablaufzeit in Stunden. Auf 0 setzen, um kein Ablaufdatum zu definieren.",
"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 in Bytes",
"admin.config.share.zip-compression-level": "Zip Komprimierungsstufe", "admin.config.share.zip-compression-level": "Zip Komprimierungsstufe",
@@ -318,63 +327,71 @@ export default {
"admin.config.smtp.password": "Passwort", "admin.config.smtp.password": "Passwort",
"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.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Registrierung erlauben",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Benutzern erlauben, sich über Soziale Netzwerke zu registrieren",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "TOTP ignorieren",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "Gibt an, ob TOTP ignoriert werden soll, wenn sich der Benutzer über Soziale Netzwerke anmeldet",
"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": "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 of the 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 of the 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": "Whether Google login is enabled", "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 of the 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 of the 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": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Microsoft Anmeldung erlaubt",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant", "admin.config.oauth.microsoft-tenant": "Microsoft Mandant",
"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": "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 of the 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 of the 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": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "Discord Anmeldung erlaubt",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-limited-guild": "Discord limited server ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "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-secret": "Discord Client secret", "admin.config.oauth.discord-client-id": "Discord Client-ID",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Client-ID der Discord OAuth-App",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.discord-client-secret": "Discord Client-Secret",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.discord-client-secret.description": "Client-Secret der Discord OAuth-App",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-enabled.description": "OpenID Connect Anmeldung erlaubt",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "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-client-id": "OpenID Connect Client-ID",
"admin.config.oauth.oidc-client-id.description": "Client-ID der OpenID Connect OAuth-App",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client-Secret",
"admin.config.oauth.oidc-client-secret.description": "Client-Secret der OpenID Connect OAuth-App",
// 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",
// error // error
"error.title": "Error", "error.title": "Fehler",
"error.description": "Oops!", "error.description": "Ups!",
"error.button.back": "Go back", "error.button.back": "Zurück",
"error.msg.default": "Something went wrong.", "error.msg.default": "Etwas ist schief gelaufen.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "Du hast den Authentifizierungsprozess abgebrochen, bitte versuche es erneut.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "Der Authentifizierungsprozess hat zu lange gedauert, bitte versuche es erneut.",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Interner Fehler",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "Der mit diesem {0} Konto verknüpfte Benutzer existiert nicht.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "Kann die E-Mail-Adresse von dem Konto {0} nicht abrufen.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.already_linked": "Das Konto {0} ist bereits mit einem anderen 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 versuchen Sie es nach der Verifikation erneut.",
"error.msg.discord_guild_permission_denied": "Du bist nicht berechtigt, Dich anzumelden.",
"error.msg.cannot_get_user_info": "Deine Benutzerinformationen können nicht von diesem Konto {0} 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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Speichern", "common.button.save": "Speichern",
"common.button.create": "Erstellen", "common.button.create": "Erstellen",
@@ -387,6 +404,7 @@ export default {
"common.button.generate": "Generieren", "common.button.generate": "Generieren",
"common.button.done": "Fertig", "common.button.done": "Fertig",
"common.text.link": "Link", "common.text.link": "Link",
"common.text.navigate-to-link": "Link öffnen",
"common.text.or": "oder", "common.text.or": "oder",
"common.button.go-back": "Zurück", "common.button.go-back": "Zurück",
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert", "common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",

View File

@@ -0,0 +1,420 @@
export default {
// Navbar
"navbar.upload": "Μεταφόρτωση",
"navbar.signin": "Είσοδος",
"navbar.home": "Αρχική",
"navbar.signup": "Εγγραφή",
"navbar.links.shares": "",
"navbar.links.reverse": "Αντίστροφος σύνδεσμος κοινής χρήσης",
"navbar.avatar.account": "Ο λογαριασμός μου",
"navbar.avatar.admin": "Διαχείριση",
"navbar.avatar.signout": "Αποσύνδεση",
// END navbar
// /
"home.title": "Μια πλατφόρμα κοινής χρήσης αρχείων <h>σε ιδιωτική εγκατάσταση</h>.",
"home.description": "Θέλετε πραγματικά να δώσετε τα προσωπικά σας αρχεία στο χέρι τρίτων όπως WeTransfer?",
"home.bullet.a.name": "Ιδιωτική εγκατάσταση",
"home.bullet.a.description": "Φιλοξενήστε το Pingvin Share στο δικό σας μηχάνημα.",
"home.bullet.b.name": "Απόρρητο",
"home.bullet.b.description": "Τα αρχεία σας είναι αρχεία σας και δεν πρέπει ποτέ να μπείτε στα χέρια τρίτων.",
"home.bullet.c.name": "Χωρίς όριο μεγέθους αρχείου",
"home.bullet.c.description": "Ανεβάστε όσο μεγάλα αρχεία θέλετε. Μόνο ο σκληρός σας δίσκος θα είναι το όριό σας.",
"home.button.start": "Ας αρχίσουμε",
"home.button.source": "Πηγαίος κώδικας",
// END /
// /auth/signin
"signin.title": "Καλώς ήρθατε ξανά",
"signin.description": "Δεν έχετε ακόμα λογαριασμό;",
"signin.button.signup": "Εγγραφή",
"signin.input.email-or-username": "E-mail ή όνομα χρήστη",
"signin.input.email-or-username.placeholder": "Το email ή το όνομα χρήστη",
"signin.input.password": "Κωδικόs πρόσβασης",
"signin.input.password.placeholder": "Ο κωδικός πρόσβασής σας",
"signin.button.submit": "Είσοδος",
"signIn.notify.totp-required.title": "Απαιτείται έλεγχος ταυτότητας δύο παραγόντων.",
"signIn.notify.totp-required.description": "Παρακαλώ εισάγετε τον κωδικό 2FA.",
"signIn.oauth.or": "Ή",
"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": "Δημιουργία λογαριασμού",
"signup.description": "Έχετε ήδη λογαριασμό;",
"signup.button.signin": "Είσοδος",
"signup.input.username": "Όνομα χρήστη",
"signup.input.username.placeholder": "Το όνομα χρήστη σας",
"signup.input.email": "E-mail",
"signup.input.email.placeholder": "Το email σας",
"signup.button.submit": "Ας ξεκινήσουμε",
// END /auth/signup
// /auth/totp
"totp.title": "Ταυτοποίηση TOTP",
"totp.button.signIn": "Είσοδος",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Ξεχάσατε τον κωδικό σας;",
"resetPassword.description": "Ελέγξτε το e-mail σας για να κάνετε επαναφορά του κωδικού πρόσβασής σας.",
"resetPassword.notify.success": "Εισάγετε το email σας για επαναφορά κωδικού.",
"resetPassword.button.back": "Πίσω στη σελίδα εισόδου",
"resetPassword.text.resetPassword": "Επαναφορά κωδικού πρόσβασης",
"resetPassword.text.enterNewPassword": "Εισάγετε το νέο σας κωδικό",
"resetPassword.input.password": "Νέος κωδικός",
"resetPassword.notify.passwordReset": "Η επαναφορά του κωδικού πρόσβασης σας ολοκληρώθηκε με επιτυχία!",
// /account
"account.title": "Ο λογαριασμός μου",
"account.card.info.title": "Πληροφορίες λογαριασμού",
"account.card.info.username": "Όνομα χρήστη",
"account.card.info.email": "E-mail",
"account.notify.info.success": "Ο λογαριασμός ενημερώθηκε επιτυχώς!",
"account.card.password.title": "Κωδικόs πρόσβασης",
"account.card.password.old": "Παλιός κωδικός",
"account.card.password.new": "Νέος κωδικός",
"account.card.password.noPasswordSet": "Δεν έχετε ορίσει κωδικό πρόσβασης. Αν θέλετε να συνδεθείτε με email και κωδικό πρόσβασης, πρέπει να ορίσετε έναν κωδικό πρόσβασης.",
"account.notify.password.success": "Ο κωδικός πρόσβασης άλλαξε επιτυχώς",
"account.card.oauth.title": "Σύνδεση με λογαριασμό μέσων κοινωνικού δικτύου",
"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": "Σύνδεσμος",
"account.card.oauth.unlink": "Αποσύνδεση",
"account.card.oauth.unlinked": "Αποσυνδεδεμένο",
"account.modal.unlink.title": "Αποσύνδεση Λογαριασμού",
"account.modal.unlink.description": "Η αποσύνδεση των κοινωνικών λογαριασμών σας μπορεί να προκαλέσει απώλεια του λογαριασμού σας αν δε θυμάστε το όνομα χρήστη και τον κωδικό πρόσβασης.",
"account.notify.oauth.unlinked.success": "Επιτυχής αποσύνδεση",
"account.card.security.title": "Ασφάλεια",
"account.card.security.totp.enable.description": "Εισάγετε τον τρέχοντα κωδικό σας για να ξεκινήσετε την ενεργοποίηση του TOTP",
"account.card.security.totp.disable.description": "Εισάγετε τον τρέχοντα κωδικό πρόσβασης για να απενεργοποιήσετε το TOTP",
"account.card.security.totp.button.start": "Έναρξη",
"account.modal.totp.title": "Ενεργοποίηση TOTP",
"account.modal.totp.step1": "Βήμα 1: Προσθέστε τον έλεγχο ταυτότητας",
"account.modal.totp.step2": "Βήμα 2: Επικυρώστε τον κωδικό σας",
"account.modal.totp.enterManually": "Χειροκίνητη εισαγωγή",
"account.modal.totp.code": "Κώδικας",
"account.modal.totp.clickToCopy": "Κάνε κλικ για αντιγραφή",
"account.modal.totp.verify": "Επαλήθευση",
"account.notify.totp.disable": "Το TOTP απενεργοποιήθηκε επιτυχώς",
"account.notify.totp.enable": "Το TOTP ενεργοποιήθηκε επιτυχώς",
"account.card.language.title": "Γλώσσα",
"account.card.language.description": "Η μετάφραση της εφαρμογής γίνεται από την εθελοντές της κοινότητας. Μερικές γλώσσες μπορεί να είναι ελλιπείς.",
"account.card.color.title": "Συνδυασμός χρωμάτων",
// ThemeSwitcher.tsx
"account.theme.dark": "Σκοτεινό",
"account.theme.light": "Φωτεινό",
"account.theme.system": "Σύστημα",
"account.button.delete": "Διαγραφή Λογαριασμού",
"account.modal.delete.title": "Διαγραφή Λογαριασμού",
"account.modal.delete.description": "Θέλετε πραγματικά να διαγράψετε το λογαριασμό σας, συμπεριλαμβανομένων όλων των ενεργών μετοχών σας?",
// END /account
// /account/shares
"account.shares.title": "Οι κοινοποιήσεις μου",
"account.shares.title.empty": "Είναι κενό εδώ 👀",
"account.shares.description.empty": "Δεν διαμοιράζεστε τίποτα.",
"account.shares.button.create": "Δημιουργία",
"account.shares.info.title": "Πληροφορίες διαμοιρασμού",
"account.shares.table.id": "Αναγνωριστικό",
"account.shares.table.name": "Όνομα",
"account.shares.table.description": "Περιγραφή",
"account.shares.table.visitors": "Επισκέπτες",
"account.shares.table.expiresAt": "Λήξη",
"account.shares.table.createdAt": "Δημιουργήθηκε",
"account.shares.table.size": "Μέγεθος",
"account.shares.modal.share-informations": "Πληροφορίες διαμοιρασμού",
"account.shares.modal.share-link": "Κοινοποίηση συνδέσμου",
"account.shares.modal.delete.title": "Διαγραφή κοινοποίησης {share}",
"account.shares.modal.delete.description": "Θέλετε πραγματικά να διαγράψετε αυτό το διαμοιρασμό;",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Αντίστροφες κοινοποιήσεις",
"account.reverseShares.description": "Μια αντίστροφη κοινοποίηση σάς επιτρέπει να δημιουργήσετε μια μοναδική διεύθυνση URL που επιτρέπει σε εξωτερικούς χρήστες να δημιουργήσουν μια κοινή χρήση.",
"account.reverseShares.title.empty": "Είναι κενό εδώ 👀",
"account.reverseShares.description.empty": "Δεν έχετε καμία αντίστροφη μετοχή.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Δημιουργία αντίστροφης κοινοποίησης",
"account.reverseShares.modal.expiration.label": "Λήξη",
"account.reverseShares.modal.expiration.minute-singular": "Λεπτό",
"account.reverseShares.modal.expiration.minute-plural": "Λεπτά",
"account.reverseShares.modal.expiration.hour-singular": "Ώρα",
"account.reverseShares.modal.expiration.hour-plural": "Ώρες",
"account.reverseShares.modal.expiration.day-singular": "Ημέρα",
"account.reverseShares.modal.expiration.day-plural": "Ημέρες",
"account.reverseShares.modal.expiration.week-singular": "Εβδομάδα",
"account.reverseShares.modal.expiration.week-plural": "Εβδομάδες",
"account.reverseShares.modal.expiration.month-singular": "Μήνας",
"account.reverseShares.modal.expiration.month-plural": "Μήνες",
"account.reverseShares.modal.expiration.year-singular": "Έτος",
"account.reverseShares.modal.expiration.year-plural": "Έτη",
"account.reverseShares.modal.max-size.label": "Μέγιστο μέγεθος κοινοποίησης",
"account.reverseShares.modal.send-email": "Αποστολή ειδοποιήσεων με email",
"account.reverseShares.modal.send-email.description": "Στείλτε μια ειδοποίηση μέσω ηλεκτρονικού ταχυδρομείου όταν δημιουργείται ένας διαμοιρασμός με αυτόν τον σύνδεσμο ανάστροφης κοινοποίησης.",
"account.reverseShares.modal.max-use.label": "Μέγιστες χρήσεις",
"account.reverseShares.modal.max-use.description": "Ο μέγιστος αριθμός που μπορεί να χρησιμοποιηθεί αυτό το URL για τη δημιουργία ενός διαμοιρασμού.",
"account.reverseShare.never-expires": "Αυτός ο αντίστροφος διαμοιρασμός δε λήγει.",
"account.reverseShare.expires-on": "Αυτός ο αντίστροφος διαμοιρασμός θα λήξει {expiration}.",
"account.reverseShares.table.no-shares": "Δε δημιουργήθηκαν κοινοποιήσεις ακόμα",
"account.reverseShares.table.count.singular": "διαμοιρασμός",
"account.reverseShares.table.count.plural": "διαμοιρασμοί",
"account.reverseShares.table.shares": "Διαμοιρασμοί",
"account.reverseShares.table.remaining": "Υπόλοιπες χρήσεις",
"account.reverseShares.table.max-size": "Μέγιστο μέγεθος κοινοποίησης",
"account.reverseShares.table.expires": "Λήγει στις",
"account.reverseShares.modal.reverse-share-link": "Αντίστροφος σύνδεσμος κοινής χρήσης",
"account.reverseShares.modal.delete.title": "Διαγραφή αντίστροφης κοινοποίησης",
"account.reverseShares.modal.delete.description": "Θέλετε πραγματικά να διαγράψετε αυτή την αντίστροφη κοινοποίηση; Εάν το κάνετε, οι συνδεδεμένες κοινοποιήσεις θα διαγραφούν επίσης.",
// END /account/reverseShares
// /admin
"admin.title": "Διαχείριση",
"admin.button.users": "Διαχείριση χρηστών",
"admin.button.config": "Διαμόρφωση",
"admin.version": "Έκδοση",
// END /admin
// /admin/users
"admin.users.title": "Διαχείριση χρηστών",
"admin.users.table.username": "Όνομα χρήστη",
"admin.users.table.email": "E-mail",
"admin.users.table.admin": "Διαχειριστής",
"admin.users.edit.update.title": "Ενημέρωση χρήστη {username}",
"admin.users.edit.update.admin-privileges": "Δικαιώματα διαχειριστή",
"admin.users.edit.update.change-password.title": "Αλλαγή κωδικού πρόσβασής",
"admin.users.edit.update.change-password.field": "Νέος κωδικός πρόσβασης",
"admin.users.edit.update.change-password.button": "Αποθήκευση νέου κωδικού πρόσβασης",
"admin.users.edit.update.notify.password.success": "Ο κωδικός πρόσβασης άλλαξε επιτυχώς",
"admin.users.edit.delete.title": "Διαγραφή χρήστη {username}",
"admin.users.edit.delete.description": "Θέλετε να διαγράψετε το χρήστη και όλες τις κοινοποιήσεις του;",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Δημιουργία χρήστη",
"admin.users.modal.create.username": "Όνομα χρήστη",
"admin.users.modal.create.email": "E-mail",
"admin.users.modal.create.password": "Κωδικός πρόσβασης",
"admin.users.modal.create.manual-password": "Χειροκίνητος ορισμός κωδικού πρόσβασης",
"admin.users.modal.create.manual-password.description": "Εάν δεν είναι επιλεγμένο, ο χρήστης θα λάβει ένα email με ένα σύνδεσμο για να ορίσει τον κωδικό πρόσβασής του.",
"admin.users.modal.create.admin": "Δικαιώματα διαχειριστή",
"admin.users.modal.create.admin.description": "Αν ενεργοποιηθεί, ο χρήστης θα μπορεί να έχει πρόσβαση στον πίνακα διαχείρισης.",
// END /admin/users
// /upload
"upload.title": "Μεταφόρτωση",
"upload.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση της κοινής χρήσης σας.",
"upload.notify.count-failed": "Τα αρχεία {count} απέτυχαν να μεταφορτώσουν. Δοκιμάστε ξανά.",
// Dropzone.tsx
"upload.dropzone.title": "Μεταφόρτωση αρχείων",
"upload.dropzone.description": "Σύρετε και αποθέστε αρχεία εδώ για να ξεκινήσει η κοινή χρήση σας. Μπορούμε να δεχτούμε μόνο αρχεία που είναι λιγότερο από {maxSize} συνολικά.",
"upload.dropzone.notify.file-too-big": "Τα αρχεία σας υπερβαίνουν το μέγιστο μέγεθος κοινής χρήσης του {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Όνομα",
"upload.filelist.size": "Μέγεθος",
// showCreateUploadModal.tsx
"upload.modal.title": "Δημιουργία Κοινοποίησης",
"upload.modal.link.error.invalid": "Μπορεί να περιέχει μόνο γράμματα, αριθμούς, κάτω παύλες και παύλες",
"upload.modal.link.error.taken": "Αυτός ο σύνδεσμος χρησιμοποιείται ήδη",
"upload.modal.not-signed-in": "Δεν είστε συνδεδεμένος/η",
"upload.modal.not-signed-in-description": "Δεν θα μπορείτε να διαγράψετε την κοινή χρήση σας χειροκίνητα και να δείτε την αρίθμηση επισκεπτών.",
"upload.modal.expires.never": "ποτέ",
"upload.modal.expires.never-long": "Χωρίς λήξη",
"upload.modal.expires.error.too-long": "Η λήξη υπερβαίνει τη μέγιστη ημερομηνία λήξης {max}.",
"upload.modal.link.label": "Σύνδεσμος",
"upload.modal.expires.label": "Λήξη",
"upload.modal.expires.minute-singular": "Λεπτό",
"upload.modal.expires.minute-plural": "Λεπτά",
"upload.modal.expires.hour-singular": "Ώρα",
"upload.modal.expires.hour-plural": "Ώρες",
"upload.modal.expires.day-singular": "Ημέρα",
"upload.modal.expires.day-plural": "Ημέρες",
"upload.modal.expires.week-singular": "Εβδομάδα",
"upload.modal.expires.week-plural": "Εβδομάδες",
"upload.modal.expires.month-singular": "Μήνας",
"upload.modal.expires.month-plural": "Μήνες",
"upload.modal.expires.year-singular": "Έτος",
"upload.modal.expires.year-plural": "Έτη",
"upload.modal.accordion.description.title": "Περιγραφή",
"upload.modal.accordion.description.placeholder": "Σημείωση για τους παραλήπτες αυτής της κοινοποίησης",
"upload.modal.accordion.email.title": "Αποδέκτες email",
"upload.modal.accordion.email.placeholder": "Εισάγετε αποδέκτες email",
"upload.modal.accordion.email.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
"upload.modal.accordion.security.title": "Επιλογές ασφαλείας",
"upload.modal.accordion.security.password.label": "Προστασία με κωδικό πρόσβασης",
"upload.modal.accordion.security.password.placeholder": "Χωρίς Κωδικό",
"upload.modal.accordion.security.max-views.label": "Μέγιστος αριθμός εμφανίσεων",
"upload.modal.accordion.security.max-views.placeholder": "Χωρίς όριο",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Αυτός ο διαμοιρασμός δεν λήγει.",
"upload.modal.completed.expires-on": "Αυτός ο διαμοιρασμός θα λήξει {expiration}.",
"upload.modal.completed.share-ready": "Κοινοποίηση έτοιμου",
// END /upload
// /share/[id]
"share.title": "Διαμοιρασμός {shareId}",
"share.description": "Σας προωθώ αρχεία προς κοινοποίηση.",
"share.error.visitor-limit-exceeded.title": "Υπέρβαση ορίου επισκέπτη",
"share.error.visitor-limit-exceeded.description": "Ξεπεράστηκε το όριο επισκεπτών σε αυτή την κοινοποίηση.",
"share.error.removed.title": "Κοινοποίηση αφαιρέθηκε",
"share.error.not-found.title": "Η κοινοποίηση δε βρέθηκε",
"share.error.not-found.description": "Η κοινοποίηση που ψάχνετε δεν υπάρχει.",
"share.modal.password.title": "Απαιτείται κωδικός",
"share.modal.password.description": "Για να αποκτήσετε πρόσβαση σε αυτή την κοινοποίηση εισάγετε τον κωδικό πρόσβασης.",
"share.modal.password": "Κωδικός πρόσβασης",
"share.modal.error.invalid-password": "Μη έγκυρος κωδικός πρόσβασης",
"share.button.download-all": "Λήψη όλων",
"share.notify.download-all-preparing": "Αυτός ο διαμοιρασμός βρίσκεται σε επεξεργασία. Προσπαθήστε ξανά σε λίγο.",
"share.modal.file-link": "Σύνδεσμος αρχείου",
"share.table.name": "Όνομα",
"share.table.size": "Μέγεθος",
"share.modal.file-preview.error.not-supported.title": "Η προεπισκόπηση δεν υποστηρίζεται",
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Ενημέρωση {shareId}",
"share.edit.append-upload": "Προσθήκη αρχείου",
"share.edit.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση του διαμοιρασμού.",
"share.edit.notify.save-success": "Ο διαμοιρασμός ενημερώθηκε επιτυχώς",
// END /share/[id]/edit
// /admin/config
"admin.config.title": "Διαμόρφωση",
"admin.config.category.general": "Γενικά",
"admin.config.category.share": "Διαμοιρασμός",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Σύνδεση με λογαριασμό μέσων κοινωνικού δικτύου",
"admin.config.general.app-name": "Όνομα εφαρμογής",
"admin.config.general.app-name.description": "Ονομασία της εφαρμογής",
"admin.config.general.app-url": "URL Εφαρμογής",
"admin.config.general.app-url.description": "Η διεύθυνση URL όπου το Pingvin Share είναι διαθέσιμο",
"admin.config.general.show-home-page": "Εμφάνιση αρχικής σελίδας",
"admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα",
"admin.config.general.logo": "Λογότυπο",
"admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.",
"admin.config.general.logo.placeholder": "Επιλέξτε εικόνα",
"admin.config.email.enable-share-email-recipients": "Ενεργοποίηση κοινής χρήσης μέσω email",
"admin.config.email.enable-share-email-recipients.description": "Εάν θα ενεργοποιηθεί η κοινή χρήση μέσω email. Δυνατή μόνον με την ενεργοποίηση SMTP.",
"admin.config.email.share-recipients-subject": "Θέμα στο email διαμοιρασμού",
"admin.config.email.share-recipients-subject.description": "Το θέμα του email διαμοιρασμού που θα φτάσει στον παραλήπτη.",
"admin.config.email.share-recipients-message": "Το θέμα του email για τον διαμοιρασμό που θα φτάσει στον παραλήπτη ",
"admin.config.email.share-recipients-message.description": "Μήνυμα που αποστέλλεται στους παραλήπτες κοινής χρήσης. Διαθέσιμες μεταβλητές:\n {creator} - Το όνομα χρήστη του δημιουργού της κοινής χρήσης\n {shareUrl} - Η διεύθυνση URL της κοινής χρήσης\n {desc} - Η περιγραφή της κοινής χρήσης\n {expires} - Η ημερομηνία λήξης της κοινής χρήσης\n Οι μεταβλητές θα αντικατασταθούν με την πραγματική τιμή.",
"admin.config.email.reverse-share-subject": "Θέμα email αντίστροφου διαμοιρασμού",
"admin.config.email.reverse-share-subject.description": "Θέμα του ηλεκτρονικού ταχυδρομείου που αποστέλλεται όταν κάποιος δημιούργησε έναν αντίστροφο διαμοιρασμό.",
"admin.config.email.reverse-share-message": "Μήνυμα email αντίστροφου διαμοιρασμού",
"admin.config.email.reverse-share-message.description": "Μήνυμα που αποστέλλεται όταν κάποιος δημιουργεί έναν σύνδεσμο αντίστροφου διαμοιρασμού. Το {shareUrl} θα αντικατασταθεί με το όνομα του δημιουργού και τη διεύθυνση URL κοινής χρήσης.",
"admin.config.email.reset-password-subject": "Θέμα μηνύματος επαναφοράς κωδικού πρόσβασης",
"admin.config.email.reset-password-subject.description": "Θέμα του email που αποστέλλεται όταν ένας χρήστης ζητήσει επαναφορά κωδικού πρόσβασης.",
"admin.config.email.reset-password-message": "Κείμενο μηνύματος επαναφοράς κωδικού πρόσβασης",
"admin.config.email.reset-password-message.description": "Μήνυμα που αποστέλλεται όταν ένας χρήστης ζητά επαναφορά κωδικού πρόσβασης. Το {url} θα αντικατασταθεί με τη διεύθυνση URL επαναφοράς κωδικού πρόσβασης.",
"admin.config.email.invite-subject": "Θέμα μηνύματος πρόσκλησης",
"admin.config.email.invite-subject.description": "Θέμα του email που αποστέλλεται όταν ένας διαχειριστής προσκαλεί έναν χρήστη.",
"admin.config.email.invite-message": "Μήνυμα μηνύματος πρόσκλησης",
"admin.config.email.invite-message.description": "Το μήνυμα που αποστέλλεται όταν ένας διαχειριστής προσκαλεί έναν χρήστη. Το {url} θα αντικατασταθεί με το URL πρόσκλησης και το {password} με τον κωδικό πρόσβασης.",
"admin.config.share.allow-registration": "Να επιτρέπεται η εγγραφή",
"admin.config.share.allow-registration.description": "Αν επιτρέπεται η εγγραφή",
"admin.config.share.allow-unauthenticated-shares": "Επιτρέψτε κοινές χρήσεις χωρίς έλεγχο ταυτότητας",
"admin.config.share.allow-unauthenticated-shares.description": "Εάν οι χρήστες χωρίς έλεγχο ταυτότητας μπορούν να δημιουργήσουν κοινόχρηστα στοιχεία",
"admin.config.share.max-expiration": "Μέγιστη λήξη",
"admin.config.share.max-expiration.description": "Μέγιστη λήξη κοινής χρήσης σε ώρες. Ορίστε το 0 για να επιτρέψετε απεριόριστη λήξη.",
"admin.config.share.max-size": "Μέγιστο μέγεθος",
"admin.config.share.max-size.description": "Μέγιστο μέγεθος κοινοποίησης σε bytes",
"admin.config.share.zip-compression-level": "Βαθμός συμπίεσης ZIP",
"admin.config.share.zip-compression-level.description": "Προσαρμόστε το βαθμό συμπίεσης για να εξισορροπηθεί το μέγεθος του αρχείου και η ταχύτητα επεξεργασίας. Έγκυρες τιμές κυμαίνονται από 0 έως 9, με 0 χωρίς συμπίεση και 9 μέγιστη συμπίεση.",
"admin.config.smtp.enabled": "Ενεργοποιημένο",
"admin.config.smtp.enabled.description": "Εάν η λειτουργία SMTP είναι ενεργοποιημένη. Ενεργοποιήστε τη μόνον όταν ορίσετε σωστά τις παραμέτρους που ακολουθούν.",
"admin.config.smtp.host": "Εξυπηρετητής",
"admin.config.smtp.host.description": "SMTP εξυπηρετητής",
"admin.config.smtp.port": "Θύρα",
"admin.config.smtp.port.description": "SMTP θύρα",
"admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Διεύθυνση email από όπου αποστέλλονται τα μηνύματα",
"admin.config.smtp.username": "Όνομα χρήστη",
"admin.config.smtp.username.description": "Όνομα χρήστη στον SMTP εξυπηρετητή",
"admin.config.smtp.password": "Κωδικός πρόσβασης",
"admin.config.smtp.password.description": "Κωδικός πρόσβασης στον εξυπηρετητή SMTP",
"admin.config.smtp.button.test": "Αποστολή δοκιμαστικού email",
"admin.config.oauth.allow-registration": "Να επιτρέπεται η εγγραφή",
"admin.config.oauth.allow-registration.description": "Επιτρέψτε στους χρήστες να εγγραφούν μέσω λογαριασμών κοινωνικής δικτύωσης",
"admin.config.oauth.ignore-totp": "Παράβλεψη TOTP",
"admin.config.oauth.ignore-totp.description": "Αν θα αγνοηθεί το TOTP όταν ο χρήστης χρησιμοποιεί την κοινωνική σύνδεση",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση GitHub",
"admin.config.oauth.github-client-id": "GitHub Client ID",
"admin.config.oauth.github-client-id.description": "Αναγνωριστικό πελάτη της εφαρμογής GitHub OAuth",
"admin.config.oauth.github-client-secret": "GitHub Client secret",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Αν θα είναι ενεργοποιημένη η σύνδεση Google",
"admin.config.oauth.google-client-id": "Αναγνωριστικό Πελάτη Google",
"admin.config.oauth.google-client-id.description": "Αναγνωριστικό πελάτη της εφαρμογής Google OAuth",
"admin.config.oauth.google-client-secret": "Google κωδικός",
"admin.config.oauth.google-client-secret.description": "Κωδικός της εφαρμογής Google OAuth",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση της Microsoft",
"admin.config.oauth.microsoft-tenant": "Αναγνωριστικό Microsoft",
"admin.config.oauth.microsoft-tenant.description": "Αναγνωριστικό για την εφαρμογή Microsoft OAuth\nΚοινή: Οι χρήστες με προσωπικό λογαριασμό Microsoft και λογαριασμό εργασίας ή σχολείου από το Microsoft Entra ID μπορούν να συνδεθούν στην εφαρμογή.\nΟργανισμοί: Μόνο χρήστες με λογαριασμούς εργασίας ή σχολείου από το Microsoft Entra ID μπορούν να συνδεθούν στην εφαρμογή.\nΚαταναλωτές: Μόνο οι χρήστες με προσωπικό λογαριασμό Microsoft μπορούν να συνδεθούν στην εφαρμογή.\nΜε όνομα τομέα του μισθωτή Microsoft Entra ή το αναγνωριστικό μισθωτή σε μορφή GUID: Μόνο χρήστες από έναν συγκεκριμένο μισθωτή της Microsoft Entra (μέλη καταλόγου με λογαριασμό εργασίας ή σχολείου ή επισκέπτες καταλόγου με προσωπικό λογαριασμό Microsoft) μπορούν να συνδεθούν στην εφαρμογή.",
"admin.config.oauth.microsoft-client-id": "Αναγνωριστικό πελάτη Microsoft",
"admin.config.oauth.microsoft-client-id.description": "Αναγνωριστικό πελάτη της εφαρμογής Microsoft OAuth",
"admin.config.oauth.microsoft-client-secret": "Μυστικό πελάτη Microsoft",
"admin.config.oauth.microsoft-client-secret.description": "Μυστικό πελάτη της εφαρμογής Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση στο Discord",
"admin.config.oauth.discord-limited-guild": "Αναγνωριστικό διακομιστή περιορισμένης ισχύος Discord",
"admin.config.oauth.discord-limited-guild.description": "Περιορισμός σύνδεσης σε χρήστες σε ένα συγκεκριμένο διακομιστή. Αφήστε κενό για να απενεργοποιήσετε.",
"admin.config.oauth.discord-client-id": "Αναγνωριστικό Πελάτη Discord",
"admin.config.oauth.discord-client-id.description": "Αναγνωριστικό πελάτη της εφαρμογής Discord OAuth",
"admin.config.oauth.discord-client-secret": "Μυστικό πελάτη Discord",
"admin.config.oauth.discord-client-secret.description": "Μυστικό πελάτη της εφαρμογής Discord OAuth",
"admin.config.oauth.oidc-enabled": "Σύνδεση OpenID",
"admin.config.oauth.oidc-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση OpenID",
"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-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Αφήστε κενό αν δε γνωρίζετε για αυτή τη ρύθμιση",
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 404
"404.description": "Ουπς. Αυτή η σελίδα δεν υπάρχει.",
"404.button.home": "Πήγαινέ με πίσω",
// error
"error.title": "Σφάλμα",
"error.description": "Ωχ!",
"error.button.back": "Πάμε πίσω",
"error.msg.default": "Κάτι πήγε στραβά.",
"error.msg.access_denied": "Ακυρώσατε τη διαδικασία ελέγχου ταυτότητας, παρακαλώ προσπαθήστε ξανά.",
"error.msg.expired_token": "Η διαδικασία ελέγχου ταυτότητας διήρκεσε πολύ, παρακαλώ προσπαθήστε ξανά.",
"error.msg.invalid_token": "Εσωτερικό σφάλμα",
"error.msg.no_user": "Ο χρήστης που συνδέεται με αυτόν τον λογαριασμό {0} δεν υπάρχει.",
"error.msg.no_email": "Δεν είναι δυνατή η λήψη διεύθυνσης ηλεκτρονικού ταχυδρομείου για αυτόν τον λογαριασμό {0}.",
"error.msg.already_linked": "Αυτός ο λογαριασμός {0} είναι ήδη συνδεδεμένος με άλλο λογαριασμό.",
"error.msg.not_linked": "Αυτός ο λογαριασμός {0} δεν έχει συνδεθεί με κανένα λογαριασμό ακόμα.",
"error.msg.unverified_account": "Αυτός ο λογαριασμός {0} δεν έχει επαληθευτεί, παρακαλώ προσπαθήστε ξανά μετά την επαλήθευση.",
"error.msg.discord_guild_permission_denied": "Δεν σας επιτρέπεται η σύνδεση.",
"error.msg.cannot_get_user_info": "Δεν είναι δυνατή η λήψη των πληροφοριών χρήστη από αυτόν τον λογαριασμό {0}.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "Σύνδεση OpenID",
// Common translations
"common.button.save": "Αποθήκευση",
"common.button.create": "Δημιουργία",
"common.button.submit": "Υποβολή",
"common.button.delete": "Διαγραφή",
"common.button.cancel": "Ακύρωση",
"common.button.confirm": "Επιβεβαίωση",
"common.button.disable": "Απενεργοποίηση",
"common.button.share": "Διαμοιρασμός",
"common.button.generate": "Δημιουργία",
"common.button.done": "Ολοκληρώθηκε",
"common.text.link": "Σύνδεσμος",
"common.text.navigate-to-link": "Μεταβείτε στο σύνδεσμο",
"common.text.or": "ή",
"common.button.go-back": "Επιστροφή",
"common.notify.copied": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
"common.success": "Επιτυχία",
"common.error": "Σφάλμα",
"common.error.unknown": "Προέκυψε άγνωστο σφάλμα",
"common.error.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
"common.error.too-short": "Πρέπει να αποτελείται τουλάχιστον {length} χαρακτήρες",
"common.error.too-long": "Πρέπει να αποτελείται το πολύ από {length} χαρακτήρες",
"common.error.exact-length": "Πρέπει να αποτελείται ακριβώς από {length} χαρακτήρες",
"common.error.invalid-number": "Πρέπει να είναι αριθμός",
"common.error.field-required": "Αυτό το πεδίο είναι υποχρεωτικό"
};

View File

@@ -288,6 +288,7 @@ export default {
"upload.modal.expires.never": "never", "upload.modal.expires.never": "never",
"upload.modal.expires.never-long": "Never Expires", "upload.modal.expires.never-long": "Never Expires",
"upload.modal.expires.error.too-long": "Expiration exceeds maximum expiration date of {max}.",
"upload.modal.link.label": "Link", "upload.modal.link.label": "Link",
"upload.modal.expires.label": "Expiration", "upload.modal.expires.label": "Expiration",
@@ -353,10 +354,17 @@ 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 thise file type is unsupported. Please download the file to view it.", "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Edit {shareId}",
"share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Configuration", "admin.config.title": "Configuration",
"admin.config.category.general": "General", "admin.config.category.general": "General",
@@ -413,6 +421,9 @@ export default {
"Allow unauthenticated shares", "Allow unauthenticated shares",
"admin.config.share.allow-unauthenticated-shares.description": "admin.config.share.allow-unauthenticated-shares.description":
"Whether unauthenticated users can create shares", "Whether unauthenticated users can create shares",
"admin.config.share.max-expiration": "Max expiration",
"admin.config.share.max-expiration.description":
"Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"admin.config.share.max-size": "Max size", "admin.config.share.max-size": "Max size",
"admin.config.share.max-size.description": "Maximum share size in bytes", "admin.config.share.max-size.description": "Maximum share size in bytes",
"admin.config.share.zip-compression-level": "Zip compression level", "admin.config.share.zip-compression-level": "Zip compression level",
@@ -461,18 +472,22 @@ 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-guild": "Discord limited server ID",
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Client ID of the 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 of the Discord OAuth app", "admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "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-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 404 // 404
"404.description": "Oops this page doesn't exist.", "404.description": "Oops this page doesn't exist.",
@@ -485,15 +500,19 @@ export default {
"error.msg.default": "Something went wrong.", "error.msg.default": "Something went wrong.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "You canceled the authentication process, please try again.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "The authentication process took too long, please try again.",
"error.msg.invalid_token": "Internal Error",
"error.msg.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 haven't linked to any account yet.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Can not 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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Save", "common.button.save": "Save",
@@ -507,6 +526,7 @@ 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.or": "or", "common.text.or": "or",
"common.button.go-back": "Go back", "common.button.go-back": "Go back",
"common.notify.copied": "Your link was copied to the clipboard", "common.notify.copied": "Your link was copied to the clipboard",

View File

@@ -33,7 +33,7 @@ export default {
"signin.button.submit": "Iniciar sesión", "signin.button.submit": "Iniciar sesión",
"signIn.notify.totp-required.title": "Se requiere autenticación de dos factores", "signIn.notify.totp-required.title": "Se requiere autenticación de dos factores",
"signIn.notify.totp-required.description": "Por favor ingrese su código de autenticación de dos factores", "signIn.notify.totp-required.description": "Por favor ingrese su código de autenticación de dos factores",
"signIn.oauth.or": "OR", "signIn.oauth.or": "O",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -51,8 +51,8 @@ export default {
"signup.button.submit": "Comencemos", "signup.button.submit": "Comencemos",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "Autenticación TOTP",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Iniciar sesión",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "¿Olvidaste tu contraseña?", "resetPassword.title": "¿Olvidaste tu contraseña?",
@@ -72,20 +72,20 @@ 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": "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": "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.notify.password.success": "Contraseña cambiada correctamente", "account.notify.password.success": "Contraseña cambiada correctamente",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Inicio de sesión con red social",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Vincular",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Desvincular",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Desvinculado",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Desvincular cuenta",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.", "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.notify.oauth.unlinked.success": "Unlinked successfully", "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",
"account.card.security.totp.disable.description": "Ingrese su contraseña actual para deshabilitar TOTP", "account.card.security.totp.disable.description": "Ingrese su contraseña actual para deshabilitar TOTP",
@@ -214,6 +214,7 @@ export default {
"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": "Nunca Expira",
"upload.modal.expires.error.too-long": "La caducidad excede la fecha de caducidad máxima 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",
@@ -263,13 +264,19 @@ export default {
"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": "La vista previa para este tipo de archivo no está disponible. Por favor descargue el archivo para verlo.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Editar {shareId}",
"share.edit.append-upload": "Agregar archivo",
"share.edit.notify.generic-error": "Ha ocurrido un error mientras se compartía tu archivo.",
"share.edit.notify.save-success": "Compartir actualizado correctamente",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Configuración", "admin.config.title": "Configuración",
"admin.config.category.general": "General", "admin.config.category.general": "General",
"admin.config.category.share": "Compartido", "admin.config.category.share": "Compartido",
"admin.config.category.email": "Correo", "admin.config.category.email": "Correo",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "admin.config.category.oauth": "Inicio de sesión social",
"admin.config.general.app-name": "Nombre de la App", "admin.config.general.app-name": "Nombre de la App",
"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",
@@ -301,6 +308,8 @@ export default {
"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.description": "Expiración máxima para compartir en horas. Establezca en 0 para permitir una expiración ilimitada.",
"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, en bytes",
"admin.config.share.zip-compression-level": "Nivel de compresión del Zip", "admin.config.share.zip-compression-level": "Nivel de compresión del Zip",
@@ -318,63 +327,71 @@ export default {
"admin.config.smtp.password": "Contraseña", "admin.config.smtp.password": "Contraseña",
"admin.config.smtp.password.description": "Contraseña del servidor SMTP", "admin.config.smtp.password.description": "Contraseña del servidor SMTP",
"admin.config.smtp.button.test": "Enviar correo de prueba", "admin.config.smtp.button.test": "Enviar correo de prueba",
"admin.config.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Permitir registro",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Permitir a los usuarios registrarse mediante login social",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "Ignorar TOTP",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "Ignorar TOTP cuando el usuario utiliza inicio de sesión social",
"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": "Si el inicio de sesión de GitHub está habilitado",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "ID del Cliente de GitHub",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app", "admin.config.oauth.github-client-id.description": "ID de cliente de la aplicación OAuth de GitHub",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "Palabra secreta del Cliente de GitHub",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "Secreto de cliente de la aplicación OAuth de GitHub",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Si el inicio de sesión de Google está habilitado",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "ID del Cliente de Google",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "ID de cliente de la aplicación de Google OAuth",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "Palabra secreta del cliente de Google",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Secreto del cliente de la aplicación Google OAuth",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "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 of the Microsoft OAuth app\ncommon: Users with both a personal Microsoft account and a work or school account from Microsoft Entra ID can sign in to the application. organizations: Only users with work or school accounts from Microsoft Entra ID can sign in to the application.\nconsumers: Only users with a personal Microsoft account can sign in to the application.\ndomain name of the Microsoft Entra tenant or the tenant ID in GUID format: Only users from a specific Microsoft Entra tenant (directory members with a work or school account or directory guests with a personal Microsoft account) can sign in to the application.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "ID del cliente de Microsoft",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "ID de cliente de la app OAuth de Microsoft",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret", "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": "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": "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-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": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Client ID of the 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 of the Discord OAuth app", "admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.oidc-enabled": "Conexión OpenID",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "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-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 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",
// error // error
"error.title": "Error", "error.title": "Error",
"error.description": "Oops!", "error.description": "¡Ups!",
"error.button.back": "Go back", "error.button.back": "Volver",
"error.msg.default": "Something went wrong.", "error.msg.default": "Algo ha salido mal.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "Ha cancelado el proceso de autenticación, por favor inténtelo de nuevo.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "El proceso de autenticación ha tardado demasiado, por favor inténtelo de nuevo.",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Error interno",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "El usuario vinculado a esta cuenta {0} no existe.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "No se puede obtener la dirección de correo electrónico de esta cuenta {0}.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.already_linked": "Esta cuenta {0} ya está vinculada a otra 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.discord_guild_permission_denied": "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.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "Conexión OpenID",
// Common translations // Common translations
"common.button.save": "Guardar", "common.button.save": "Guardar",
"common.button.create": "Crear", "common.button.create": "Crear",
@@ -387,6 +404,7 @@ 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.or": "o", "common.text.or": "o",
"common.button.go-back": "Volver", "common.button.go-back": "Volver",
"common.notify.copied": "Tu enlace se ha copiado al portapapeles", "common.notify.copied": "Tu enlace se ha copiado al portapapeles",

View File

@@ -214,6 +214,7 @@ export default {
"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": "Ei vanhene koskaan",
"upload.modal.expires.error.too-long": "Expiration exceeds maximum expiration date 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",
@@ -261,8 +262,14 @@ export default {
"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": "Esikatselua thise tiedostotyypille ei tueta. Ole hyvä ja lataa tiedosto nähdäksesi sen.", "share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Edit {shareId}",
"share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Asetukset", "admin.config.title": "Asetukset",
"admin.config.category.general": "Yleiset", "admin.config.category.general": "Yleiset",
@@ -301,6 +308,8 @@ export default {
"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.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"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 (bytes)",
"admin.config.share.zip-compression-level": "Zip puristustaso", "admin.config.share.zip-compression-level": "Zip puristustaso",
@@ -344,18 +353,22 @@ 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-guild": "Discord limited server ID",
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Client ID of the 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 of the Discord OAuth app", "admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "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-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 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",
@@ -366,15 +379,19 @@ export default {
"error.msg.default": "Something went wrong.", "error.msg.default": "Something went wrong.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "You canceled the authentication process, please try again.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "The authentication process took too long, please try again.",
"error.msg.invalid_token": "Internal Error",
"error.msg.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 haven't linked to any account yet.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Can not 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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Tallenna", "common.button.save": "Tallenna",
"common.button.create": "Luo", "common.button.create": "Luo",
@@ -387,6 +404,7 @@ 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.or": "tai", "common.text.or": "tai",
"common.button.go-back": "Takaisin", "common.button.go-back": "Takaisin",
"common.notify.copied": "Linkki kopioitiin leikepöydälle", "common.notify.copied": "Linkki kopioitiin leikepöydälle",

View File

@@ -1,9 +1,9 @@
export default { export default {
// Navbar // Navbar
"navbar.upload": "Envoyer", "navbar.upload": "Téléverser",
"navbar.signin": "Se connecter", "navbar.signin": "Se connecter",
"navbar.home": "Accueil", "navbar.home": "Accueil",
"navbar.signup": "S'inscrire", "navbar.signup": "Sinscrire",
"navbar.links.shares": "Mes partages", "navbar.links.shares": "Mes partages",
"navbar.links.reverse": "Partages inversés", "navbar.links.reverse": "Partages inversés",
"navbar.avatar.account": "Mon compte", "navbar.avatar.account": "Mon compte",
@@ -18,22 +18,22 @@ export default {
"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 vos fichiers et ne devraient jamais être mis entre les mains de 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 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. Seul votre disque dur est la 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": "Pas encore de compte ?",
"signin.button.signup": "S'inscrire", "signin.button.signup": "Sinscrire",
"signin.input.email-or-username": "Courriel ou pseudo", "signin.input.email-or-username": "Courriel ou surnom",
"signin.input.email-or-username.placeholder": "Votre courriel ou pseudo", "signin.input.email-or-username.placeholder": "Votre courriel ou surnom",
"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",
"signIn.notify.totp-required.title": "Une authentification à deux facteurs est requise", "signIn.notify.totp-required.title": "Une authentification à deux facteurs est requise",
"signIn.notify.totp-required.description": "Veuillez entrer votre code d'authentification à deux facteurs", "signIn.notify.totp-required.description": "Veuillez entrer votre code d'authentification à deux facteurs",
"signIn.oauth.or": "OR", "signIn.oauth.or": "OU",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -44,20 +44,20 @@ 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": "Pseudo", "signup.input.username": "Surnom",
"signup.input.username.placeholder": "Votre pseudo", "signup.input.username.placeholder": "Votre surnom",
"signup.input.email": "Adresse email", "signup.input.email": "Adresse email",
"signup.input.email.placeholder": "Votre adresse email", "signup.input.email.placeholder": "Votre courriel",
"signup.button.submit": "Commençons", "signup.button.submit": "Commençons",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "Authentification TOTP",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Se connecter",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Mot de passe oublié ?", "resetPassword.title": "Mot de passe oublié ?",
"resetPassword.description": "Saisissez votre email pour réinitialiser votre mot de passe.", "resetPassword.description": "Saisissez votre courriel pour réinitialiser votre mot de passe.",
"resetPassword.notify.success": "Un email a été envoyé avec un lien pour réinitialiser votre mot de passe.", "resetPassword.notify.success": "Un courriel a été envoyé avec un lien pour réinitialiser votre mot de passe.",
"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",
@@ -66,30 +66,30 @@ export default {
// /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",
"account.card.info.username": "Pseudo", "account.card.info.username": "Surnom",
"account.card.info.email": "Adresse email", "account.card.info.email": "Adresse email",
"account.notify.info.success": "Compte mis à jour avec succès", "account.notify.info.success": "Compte mis à jour avec succès",
"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": "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": "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.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": "Social login", "account.card.oauth.title": "Identifiant social",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Associer",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Dissocier",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Dissocié",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Dissocier le compte",
"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": "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.notify.oauth.unlinked.success": "Unlinked successfully", "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 commencer à 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 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": "Commencer", "account.card.security.totp.button.start": "Démarrer",
"account.modal.totp.title": "Activer TOTP", "account.modal.totp.title": "Activer TOTP",
"account.modal.totp.step1": "Étape 1 : Ajouter votre authentificateur", "account.modal.totp.step1": "Étape 1 : Ajouter votre authentificateur",
"account.modal.totp.step2": "Étape 2 : Valider votre code", "account.modal.totp.step2": "Étape 2 : Valider votre code",
@@ -97,8 +97,8 @@ export default {
"account.modal.totp.code": "Code", "account.modal.totp.code": "Code",
"account.modal.totp.clickToCopy": "Cliquez pour copier", "account.modal.totp.clickToCopy": "Cliquez pour copier",
"account.modal.totp.verify": "Vérifier", "account.modal.totp.verify": "Vérifier",
"account.notify.totp.disable": "TOTP désactivé", "account.notify.totp.disable": "TOTP désactivé avec succès",
"account.notify.totp.enable": "TOTP activé", "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.",
"account.card.color.title": "Thème de couleurs", "account.card.color.title": "Thème de couleurs",
@@ -131,8 +131,8 @@ export default {
// /account/reverseShares // /account/reverseShares
"account.reverseShares.title": "Partages inversés", "account.reverseShares.title": "Partages inversés",
"account.reverseShares.description": "Un partage inversé vous permet de générer une URL unique qui permet à des utilisateurs externes de créer un partage.", "account.reverseShares.description": "Un partage inversé vous permet de générer une URL unique qui permet à des utilisateurs externes de créer un partage.",
"account.reverseShares.title.empty": "Il n'y a rien ici 👀", "account.reverseShares.title.empty": "Cest plutôt vide 👀",
"account.reverseShares.description.empty": "Vous n'avez aucun partage inversé.", "account.reverseShares.description.empty": "Vous navez aucun partage inversé.",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Créer un partage inversé", "account.reverseShares.modal.title": "Créer un partage inversé",
"account.reverseShares.modal.expiration.label": "Expiration", "account.reverseShares.modal.expiration.label": "Expiration",
@@ -149,8 +149,8 @@ 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 email de notification", "account.reverseShares.modal.send-email": "Envoyer un courriel de notification",
"account.reverseShares.modal.send-email.description": "Envoyer une notification par email lorsqu'un partage est créé depuis ce partage inversé.", "account.reverseShares.modal.send-email.description": "Envoyer une notification par courriel lorsqu'un partage est créé depuis ce partage inversé.",
"account.reverseShares.modal.max-use.label": "Nombre d'utilisation max", "account.reverseShares.modal.max-use.label": "Nombre d'utilisation 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.",
@@ -161,10 +161,10 @@ export default {
"account.reverseShares.table.shares": "Partages", "account.reverseShares.table.shares": "Partages",
"account.reverseShares.table.remaining": "Utilisations restantes", "account.reverseShares.table.remaining": "Utilisations restantes",
"account.reverseShares.table.max-size": "Taille maximale du partage", "account.reverseShares.table.max-size": "Taille maximale du partage",
"account.reverseShares.table.expires": "Expire dans", "account.reverseShares.table.expires": "Expire le",
"account.reverseShares.modal.reverse-share-link": "Lien du partage inversé", "account.reverseShares.modal.reverse-share-link": "Lien du partage inversé",
"account.reverseShares.modal.delete.title": "Supprimer le partage inversé", "account.reverseShares.modal.delete.title": "Supprimer le partage inversé",
"account.reverseShares.modal.delete.description": "Voulez-vous vraiment supprimer ce partage inversé ? Si vous le faites, les partages qu'il contient seront également supprimés.", "account.reverseShares.modal.delete.description": "Voulez-vous vraiment supprimer ce partage inversé ? Si vous le faites, les partages quil contient seront également supprimés.",
// END /account/reverseShares // END /account/reverseShares
// /admin // /admin
"admin.title": "Administration", "admin.title": "Administration",
@@ -174,11 +174,11 @@ export default {
// END /admin // END /admin
// /admin/users // /admin/users
"admin.users.title": "Gestion des utilisateurs", "admin.users.title": "Gestion des utilisateurs",
"admin.users.table.username": "Pseudo", "admin.users.table.username": "Surnom",
"admin.users.table.email": "Adresse email", "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 admin", "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",
@@ -188,20 +188,20 @@ export default {
// 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",
"admin.users.modal.create.email": "Email", "admin.users.modal.create.email": "Courriel",
"admin.users.modal.create.password": "Mot de passe", "admin.users.modal.create.password": "Mot de passe",
"admin.users.modal.create.manual-password": "Définir le mot de passe manuellement", "admin.users.modal.create.manual-password": "Définir le mot de passe manuellement",
"admin.users.modal.create.manual-password.description": "S'il n'est pas coché, l'utilisateur recevra un email avec un lien pour définir son mot de passe.", "admin.users.modal.create.manual-password.description": "Sil n'est pas coché, lutilisateur recevra un email avec un lien pour définir son mot de passe.",
"admin.users.modal.create.admin": "Privilèges admin", "admin.users.modal.create.admin": "Privilèges dadmin",
"admin.users.modal.create.admin.description": "Si coché, l'utilisateur pourra accéder au panneau d'administration.", "admin.users.modal.create.admin.description": "Si coché, lutilisateur pourra accéder au panneau d'administration.",
// END /admin/users // END /admin/users
// /upload // /upload
"upload.title": "Envoyer", "upload.title": "Envoyer",
"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) n'a(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.",
// 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érieur à {maxSize} au total.", "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.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",
@@ -213,7 +213,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": "N'expire jamais", "upload.modal.expires.never-long": "Nexpire jamais",
"upload.modal.expires.error.too-long": "Lexpiration dépasse la date d'expiration du {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",
@@ -232,25 +233,25 @@ export default {
"upload.modal.accordion.description.placeholder": "Note pour les destinataires de ce partage", "upload.modal.accordion.description.placeholder": "Note pour les destinataires de ce partage",
"upload.modal.accordion.email.title": "Adresse courriel des destinataires", "upload.modal.accordion.email.title": "Adresse courriel des destinataires",
"upload.modal.accordion.email.placeholder": "Saisir les destinataires de ce partage", "upload.modal.accordion.email.placeholder": "Saisir les destinataires de ce partage",
"upload.modal.accordion.email.invalid-email": "Adresse email invalide", "upload.modal.accordion.email.invalid-email": "Courriel invalide",
"upload.modal.accordion.security.title": "Options de sécurité", "upload.modal.accordion.security.title": "Options de sécurité",
"upload.modal.accordion.security.password.label": "Protection par mot de passe", "upload.modal.accordion.security.password.label": "Protection par mot de passe",
"upload.modal.accordion.security.password.placeholder": "Aucun mot de passe", "upload.modal.accordion.security.password.placeholder": "Aucun mot de passe",
"upload.modal.accordion.security.max-views.label": "Nombre de vues maximum", "upload.modal.accordion.security.max-views.label": "Nombre de vues maximum",
"upload.modal.accordion.security.max-views.placeholder": "Aucune limite", "upload.modal.accordion.security.max-views.placeholder": "Aucune limite",
// showCompletedUploadModal.tsx // showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Ce partage n'expirera jamais.", "upload.modal.completed.never-expires": "Ce partage nexpirera jamais.",
"upload.modal.completed.expires-on": "Ce partage expirera le {expiration}.", "upload.modal.completed.expires-on": "Ce partage expirera le {expiration}.",
"upload.modal.completed.share-ready": "Partage prêt", "upload.modal.completed.share-ready": "Partage prêt",
// END /upload // END /upload
// /share/[id] // /share/[id]
"share.title": "Partage {shareId}", "share.title": "Partage {shareId}",
"share.description": "Regardez ce que j'ai partagé !", "share.description": "Regardez ce que jai partagé !",
"share.error.visitor-limit-exceeded.title": "Limite de visiteurs dépassée", "share.error.visitor-limit-exceeded.title": "Limite de visiteurs dépassée",
"share.error.visitor-limit-exceeded.description": "La limite de visiteurs de ce partage a été dépassée.", "share.error.visitor-limit-exceeded.description": "La limite de visiteurs de ce partage a été dépassée.",
"share.error.removed.title": "Partage supprimé", "share.error.removed.title": "Partage supprimé",
"share.error.not-found.title": "Partage introuvable", "share.error.not-found.title": "Partage introuvable",
"share.error.not-found.description": "Le partage que vous cherchez n'existe pas.", "share.error.not-found.description": "Le partage que vous cherchez nexiste pas.",
"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": "Pour accéder à ce partage, veuillez entrer le mot de passe du partage.",
"share.modal.password": "Mot de passe", "share.modal.password": "Mot de passe",
@@ -261,120 +262,136 @@ 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 pour ce type de fichier n'est pas pris en charge. Veuillez télécharger le fichier pour le voir.", "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.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Modifier {shareId}",
"share.edit.append-upload": "Ajouter un fichier",
"share.edit.notify.generic-error": "Une erreur est survenue durant le traitement de votre partage.",
"share.edit.notify.save-success": "Partage mis à jour avec succès",
// END /share/[id]/edit
// /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",
"admin.config.category.share": "Partage", "admin.config.category.share": "Partage",
"admin.config.category.email": "Courriel", "admin.config.category.email": "Courriel",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "admin.config.category.oauth": "Identifiant social",
"admin.config.general.app-name": "Nom de l'appli", "admin.config.general.app-name": "Nom de lappli",
"admin.config.general.app-name.description": "Le nom de l'application", "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.show-home-page": "Afficher la page d'accueil", "admin.config.general.show-home-page": "Afficher la page daccueil",
"admin.config.general.show-home-page.description": "Afficher ou non la page d'accueil", "admin.config.general.show-home-page.description": "Afficher ou non la page daccueil",
"admin.config.general.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Changez de logo en envoyant une nouvelle image. L'image 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": "Autoriser 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": "Permet d'envoyer le lien du partage par courriel. N'activez cette option que si vous avez activé SMTP.",
"admin.config.email.share-recipients-subject": "Sujet d'un partage", "admin.config.email.share-recipients-subject": "Sujet dun partage",
"admin.config.email.share-recipients-subject.description": "Intitulé du courriel envoyé aux destinataires d'un partage.", "admin.config.email.share-recipients-subject.description": "Intitulé du courriel envoyé aux destinataires dun partage.",
"admin.config.email.share-recipients-message": "Message d'un 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 l'auteur du partage\n• {shareUrl} : L'URL 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 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.reverse-share-subject": "Sujet d'un partage inversé", "admin.config.email.reverse-share-subject": "Sujet dun partage inversé",
"admin.config.email.reverse-share-subject.description": "Intitulé du courriel envoyé lorsque quelqu'un 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 du partage inversé", "admin.config.email.reverse-share-message": "Message dun partage inversé",
"admin.config.email.reverse-share-message.description": "Contenu du courriel envoyé lorsque quelqu'un partage des fichiers depuis votre partage inversé. {shareUrl} sera remplacé par le nom du créateur et l'URL de partage.", "admin.config.email.reverse-share-message.description": "Contenu du courriel envoyé lorsque quelquun partage des fichiers depuis votre partage inversé. {shareUrl} sera remplacé par le nom du créateur et lURL de partage.",
"admin.config.email.reset-password-subject": "Sujet d'une réinitialisation du mot de passe", "admin.config.email.reset-password-subject": "Sujet dune réinitialisation du mot de passe",
"admin.config.email.reset-password-subject.description": "Intitulé du courriel envoyé lorsqu'un utilisateur demande une réinitialisation de son mot de passe.", "admin.config.email.reset-password-subject.description": "Intitulé du courriel envoyé lorsquun utilisateur demande une réinitialisation de son mot de passe.",
"admin.config.email.reset-password-message": "Message de réinitialisation du mot de passe", "admin.config.email.reset-password-message": "Message de réinitialisation du mot de passe",
"admin.config.email.reset-password-message.description": "Contenu du courriel envoyé lorsqu'un utilisateur demande à réinitialiser son mot de passe. {url} sera remplacé par l'URL de réinitialisation du mot de passe.", "admin.config.email.reset-password-message.description": "Contenu du courriel envoyé lorsquun utilisateur demande à réinitialiser son mot de passe. {url} sera remplacé par lURL de réinitialisation du mot de passe.",
"admin.config.email.invite-subject": "Sujet d'une invitation", "admin.config.email.invite-subject": "Sujet dune invitation",
"admin.config.email.invite-subject.description": "Intitulé du courriel envoyé lorsqu'un 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 de l'invitation", "admin.config.email.invite-message": "Message dune invitation",
"admin.config.email.invite-message.description": "Contenu du courriel envoyé lorsqu'un administrateur invite un utilisateur. {url} sera remplacé par l'URL d'invitation et {password} par le mot de passe.", "admin.config.email.invite-message.description": "Contenu du courriel envoyé lorsquun administrateur invite un utilisateur. {url} sera remplacé par lURL d'invitation et {password} par le mot de passe.",
"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": "Autorise des utilisateurs non authentifiés à 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.description": "Échéance du partage en heures. Indiquez 0 pour quil nexpire jamais.",
"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 en octets",
"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.smtp.enabled": "Activer", "admin.config.smtp.enabled": "Activer",
"admin.config.smtp.enabled.description": "Active SMTP. Activez ceci uniquement si vous avez saisi l'hôte, le port, le courriel, l'utilisateur et le mot de passe de votre serveur SMTP.", "admin.config.smtp.enabled.description": "Active SMTP. Activez ceci uniquement si vous avez saisi lhôte, le port, le courriel, lutilisateur et son mot de passe, de votre serveur SMTP.",
"admin.config.smtp.host": "Hôte", "admin.config.smtp.host": "Hôte",
"admin.config.smtp.host.description": "Nom du serveur SMTP", "admin.config.smtp.host.description": "Nom du serveur SMTP",
"admin.config.smtp.port": "Port", "admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port du serveur SMTP", "admin.config.smtp.port.description": "Port du serveur SMTP",
"admin.config.smtp.email": "Adresse email", "admin.config.smtp.email": "Courriel",
"admin.config.smtp.email.description": "Adresse à partir de laquelle les emails sont envoyés", "admin.config.smtp.email.description": "Adresse à partir de laquelle les courriels sont envoyés",
"admin.config.smtp.username": "Nom d'utilisateur", "admin.config.smtp.username": "Nom dutilisateur",
"admin.config.smtp.username.description": "Nom d'utilisateur du serveur SMTP", "admin.config.smtp.username.description": "Nom dutilisateur du serveur SMTP",
"admin.config.smtp.password": "Mot de passe", "admin.config.smtp.password": "Mot de passe",
"admin.config.smtp.password.description": "Mot de passe du serveur SMTP", "admin.config.smtp.password.description": "Mot de passe du serveur SMTP",
"admin.config.smtp.button.test": "Envoyer un email de test", "admin.config.smtp.button.test": "Envoyer un courriel de test",
"admin.config.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Autoriser linscription",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Permettre aux utilisateurs de sinscrire via leur identifiant social",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "Ignorer TOTP",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "Ignorer le TOTP lorsque lutilisateur utilise un identifiant social.",
"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": "Permettre la connexion via GitHub.",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "ID client de GitHub",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app", "admin.config.oauth.github-client-id.description": "LID du client de lapplication OAuth GitHub",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "Secret du client GitHub",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "Le secret du client de lapplication OAuth GitHub",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Permettre la connexion via Google.",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "ID du client Google",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "LID du client de lapplication OAuth Google",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "Secret client de Google",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Le secret du client de lapplication OAuth Google",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Permettre la connexion via Microsoft.",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant", "admin.config.oauth.microsoft-tenant": "Locataire Microsoft",
"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": "ID locataire de l'application OAuth Microsoft\nCommun : les utilisateurs ayant au choix un compte personnel ou dentreprise issue de Microsoft Entra.\nOrganisations : limité aux utilisateurs ayant un compte dentreprise ou duniversité issue de Microsoft Entra.\nPersonnel : limité aux utilisateurs ayant un compte personnel\nDomanial : limité aux utilisateurs d'un domaine Microsoft Entra spécifié ou dun ID locataire (au format GUID), quils soient membres dun registre dentreprise ou duniversité ou bien enregistrés en tant quinvités avec un compte personnel.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "ID du client Microsoft",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "LID du client de lapplication Microsoft OAuth",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret", "admin.config.oauth.microsoft-client-secret": "Secret du client Microsoft",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "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": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "Permettre la connexion via Discord.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-limited-guild": "ID de serveur restreint Discord",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "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-secret": "Discord Client secret", "admin.config.oauth.discord-client-id": "ID du client Discord",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "LID du client de lapplication OAuth Discord",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.discord-client-secret": "Secret du client Discord",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.discord-client-secret.description": "Le secret du client de lapplication OAuth Discord",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-enabled": "Connexion OpenID",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-enabled.description": "Permettre la connexion via OpenID",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-discovery-uri": "URI de découverte OpenID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "LURI de découverte de la connexion à l'application OpenID OAuth",
"admin.config.oauth.oidc-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-username-claim": "Revendication du nom dutilisateur OpenID",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "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-client-id": "ID du client OpenID",
"admin.config.oauth.oidc-client-id.description": "LID du client de lapplication OAuth OpenID Connect",
"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",
// 404 // 404
"404.description": "Désolé, mais cette page nexiste pas.", "404.description": "Désolé, mais cette page nexiste pas.",
"404.button.home": "Retour à l'accueil", "404.button.home": "Retour à laccueil",
// error // error
"error.title": "Error", "error.title": "Erreur",
"error.description": "Oops!", "error.description": "Oups !",
"error.button.back": "Go back", "error.button.back": "Retour",
"error.msg.default": "Something went wrong.", "error.msg.default": "Quelque chose a mal tourné.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "Vous avez annulé le processus dauthentification, veuillez réessayer.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "Le processus dauthentification a pris trop de temps, veuillez réessayer.",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Erreur Interne",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "Lutilisateur associé au compte {0} nexiste pas.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "Impossible dobtenir le courriel du compte {0}.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.already_linked": "Le compte {0} est déjà associé à un autre compte.",
"error.msg.not_linked": "Le compte {0} nest pas encore associé à compte.",
"error.msg.unverified_account": "Le compte {0} n'est pas vérifié, veuillez réessayer après vérification.",
"error.msg.discord_guild_permission_denied": "Vous nêtes pas autorisé à vous authentifier.",
"error.msg.cannot_get_user_info": "Impossible dobtenir vos informations utilisateur à partir du compte {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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "Connexion OpenID",
// Common translations // Common translations
"common.button.save": "Sauvegarder", "common.button.save": "Sauvegarder",
"common.button.create": "Créer", "common.button.create": "Créer",
@@ -387,6 +404,7 @@ 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.or": "ou", "common.text.or": "ou",
"common.button.go-back": "Précédent", "common.button.go-back": "Précédent",
"common.notify.copied": "Votre lien a été copié dans le presse-papiers", "common.notify.copied": "Votre lien a été copié dans le presse-papiers",

View File

@@ -0,0 +1,420 @@
export default {
// Navbar
"navbar.upload": "Carica",
"navbar.signin": "Registrati",
"navbar.home": "Home",
"navbar.signup": "Registrati",
"navbar.links.shares": "Le mie condivisioni",
"navbar.links.reverse": "Condivisioni Inverse",
"navbar.avatar.account": "Il mio account",
"navbar.avatar.admin": "Amministrazione",
"navbar.avatar.signout": "Disconetti",
// END navbar
// /
"home.title": "Una piattaforma di condivisione di file <h>autohosted</h>.",
"home.description": "Vuoi davvero dare i tuoi file personali in mano a terzi come WeTransfer?",
"home.bullet.a.name": "Self-hosted",
"home.bullet.a.description": "Ospita Pingvin Condividi sulla tua macchina.",
"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.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.button.start": "Inizia adesso",
"home.button.source": "Codice sorgente",
// END /
// /auth/signin
"signin.title": "Bentornato",
"signin.description": "Non hai ancora un account?",
"signin.button.signup": "Registrazione",
"signin.input.email-or-username": "Email o nome utente",
"signin.input.email-or-username.placeholder": "La tua email o nome utente",
"signin.input.password": "Password",
"signin.input.password.placeholder": "Password",
"signin.button.submit": "Accedi",
"signIn.notify.totp-required.title": "Autenticazione a due fattori richiesta",
"signIn.notify.totp-required.description": "Inserisci il tuo codice di autenticazione a due fattori",
"signIn.oauth.or": "OPPURE",
"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": "Crea un account",
"signup.description": "Hai già un account?",
"signup.button.signin": "Accedi",
"signup.input.username": "Nome utente",
"signup.input.username.placeholder": "Il tuo nome utente",
"signup.input.email": "Email",
"signup.input.email.placeholder": "La tua email",
"signup.button.submit": "Iniziamo",
// END /auth/signup
// /auth/totp
"totp.title": "Autenticazione TOTP",
"totp.button.signIn": "Accedi",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Hai dimenticato la password?",
"resetPassword.description": "Inserisci la tua email per reimpostare la password.",
"resetPassword.notify.success": "Abbiamo inviato un'e-mail all'indirizzo da te indicato. Clicca sul link contenuto nell'e-mail per reimpostare la password del tuo account.",
"resetPassword.button.back": "Torna alla pagina di login",
"resetPassword.text.resetPassword": "Reimposta password",
"resetPassword.text.enterNewPassword": "Inserisci la tua nuova password",
"resetPassword.input.password": "Nuova password",
"resetPassword.notify.passwordReset": "La password è stata reimpostata correttamente.",
// /account
"account.title": "Il mio account",
"account.card.info.title": "Informazioni sull'account",
"account.card.info.username": "Nome utente",
"account.card.info.email": "Email",
"account.notify.info.success": "Account aggiornato correttamente",
"account.card.password.title": "Password",
"account.card.password.old": "Vecchia password",
"account.card.password.new": "Nuova password",
"account.card.password.noPasswordSet": "Non hai una password impostata. Se vuoi accedere con email e password devi impostare una password.",
"account.notify.password.success": "Password cambiata con successo",
"account.card.oauth.title": "Effettua il login con i Social",
"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": "Collegamento",
"account.card.oauth.unlink": "Scollega",
"account.card.oauth.unlinked": "Scollegato",
"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.notify.oauth.unlinked.success": "Disconnessione Riuscita",
"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.disable.description": "Inserisci la tua password attuale per iniziare ad abilitare TOTP",
"account.card.security.totp.button.start": "Iniziare",
"account.modal.totp.title": "Abilita TOTP",
"account.modal.totp.step1": "Passo 1: Aggiungi il tuo autenticatore",
"account.modal.totp.step2": "Passo 2: Convalida il tuo codice",
"account.modal.totp.enterManually": "Inserisci manualmente",
"account.modal.totp.code": "Codice",
"account.modal.totp.clickToCopy": "Clicca per copiare",
"account.modal.totp.verify": "Verifica",
"account.notify.totp.disable": "TOTP disabilitato con successo",
"account.notify.totp.enable": "TOTP abilitato con successo",
"account.card.language.title": "Lingua",
"account.card.language.description": "Il progetto è tradotto dalla community. Alcune lingue potrebbero essere incomplete.",
"account.card.color.title": "Schema di colori",
// ThemeSwitcher.tsx
"account.theme.dark": "Scuro",
"account.theme.light": "Chiaro",
"account.theme.system": "Sistema",
"account.button.delete": "Elimina account",
"account.modal.delete.title": "Cancella Account",
"account.modal.delete.description": "Vuoi davvero eliminare il tuo account, incluse tutte le tue condivisioni attive?",
// END /account
// /account/shares
"account.shares.title": "Le mie condivisioni",
"account.shares.title.empty": "È vuoto qui 👀",
"account.shares.description.empty": "Non hai nessuna condivisione.",
"account.shares.button.create": "Creane uno",
"account.shares.info.title": "Condividi le informazioni",
"account.shares.table.id": "ID",
"account.shares.table.name": "Nome",
"account.shares.table.description": "Descrizione",
"account.shares.table.visitors": "Visitatori",
"account.shares.table.expiresAt": "Scadenza",
"account.shares.table.createdAt": "Creato il",
"account.shares.table.size": "Dimensione",
"account.shares.modal.share-informations": "Condividi le informazioni",
"account.shares.modal.share-link": "Condividi link",
"account.shares.modal.delete.title": "Elimina condivisione {share}",
"account.shares.modal.delete.description": "Vuoi davvero cancellare questa condivisione?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Condivisione Inversa",
"account.reverseShares.description": "Una condivisione inversa consente di generare un URL univoco che consente agli utenti esterni di creare una condivisione.",
"account.reverseShares.title.empty": "È vuoto qui 👀",
"account.reverseShares.description.empty": "Non hai nessuna condivisione inversa.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Crea condivisione inversa",
"account.reverseShares.modal.expiration.label": "Valido fino a",
"account.reverseShares.modal.expiration.minute-singular": "Minuto",
"account.reverseShares.modal.expiration.minute-plural": "Minuti",
"account.reverseShares.modal.expiration.hour-singular": "Ora",
"account.reverseShares.modal.expiration.hour-plural": "Ore",
"account.reverseShares.modal.expiration.day-singular": "Giorno",
"account.reverseShares.modal.expiration.day-plural": "Giorni",
"account.reverseShares.modal.expiration.week-singular": "Settimana",
"account.reverseShares.modal.expiration.week-plural": "Settimane",
"account.reverseShares.modal.expiration.month-singular": "Mese",
"account.reverseShares.modal.expiration.month-plural": "Mesi",
"account.reverseShares.modal.expiration.year-singular": "Anno",
"account.reverseShares.modal.expiration.year-plural": "Anni",
"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.description": "Invia una notifica email quando viene creata una condivisione con questo link di condivisione inversa.",
"account.reverseShares.modal.max-use.label": "Utilizzo massimo",
"account.reverseShares.modal.max-use.description": "La quantità massima di volte che questo URL può essere usato per creare una condivisione.",
"account.reverseShare.never-expires": "Questa condivisione inversa non scadrà mai.",
"account.reverseShare.expires-on": "Questa condivisione inversa scadrà il {expiration}.",
"account.reverseShares.table.no-shares": "Nessuna condivisione è stata creata",
"account.reverseShares.table.count.singular": "condivisione",
"account.reverseShares.table.count.plural": "condivisioni",
"account.reverseShares.table.shares": "Condivisioni",
"account.reverseShares.table.remaining": "Utenti rimanenti",
"account.reverseShares.table.max-size": "Dimensione massima della condivisione",
"account.reverseShares.table.expires": "Scade il",
"account.reverseShares.modal.reverse-share-link": "Link di condivisione inversa",
"account.reverseShares.modal.delete.title": "Elimina condivisione inversa",
"account.reverseShares.modal.delete.description": "Vuoi davvero eliminare questa condivisione inversa? Se lo fai, anche le azioni associate verranno eliminate.",
// END /account/reverseShares
// /admin
"admin.title": "Amministrazione",
"admin.button.users": "Gestione degli utenti",
"admin.button.config": "Configurazione",
"admin.version": "Versione",
// END /admin
// /admin/users
"admin.users.title": "Gestione degli utenti",
"admin.users.table.username": "Nome utente",
"admin.users.table.email": "Email",
"admin.users.table.admin": "Admin",
"admin.users.edit.update.title": "Aggiorna utente {username}",
"admin.users.edit.update.admin-privileges": "Privilegi di amministrazione",
"admin.users.edit.update.change-password.title": "Cambia la 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.notify.password.success": "Password cambiata con successo",
"admin.users.edit.delete.title": "Elimina l'utente: {username}",
"admin.users.edit.delete.description": "Vuoi davvero eliminare questo utente e tutte le sue condivisioni?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Crea utente",
"admin.users.modal.create.username": "Nome utente",
"admin.users.modal.create.email": "Email",
"admin.users.modal.create.password": "Password",
"admin.users.modal.create.manual-password": "Imposta la password manualmente",
"admin.users.modal.create.manual-password.description": "Se non selezionato, l'utente riceverà un'email con un link per impostare la propria password.",
"admin.users.modal.create.admin": "Privilegi di amministrazione",
"admin.users.modal.create.admin.description": "Se selezionato, l'utente sarà in grado di accedere al pannello amministratore.",
// END /admin/users
// /upload
"upload.title": "Upload",
"upload.notify.generic-error": "Si è verificato un errore durante il completamento della condivisione.",
"upload.notify.count-failed": "Impossibile caricare {count} file. Riprovare.",
// Dropzone.tsx
"upload.dropzone.title": "Upload files",
"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.notify.file-too-big": "I tuoi file superano la dimensione massima di condivisione di {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Nome",
"upload.filelist.size": "Dimensione",
// showCreateUploadModal.tsx
"upload.modal.title": "Crea Condivisione",
"upload.modal.link.error.invalid": "Può contenere solo lettere, numeri, underscore e trattini",
"upload.modal.link.error.taken": "Questo link è gia in uso",
"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.expires.never": "mai",
"upload.modal.expires.never-long": "Non Scade Mai",
"upload.modal.expires.error.too-long": "La scadenza supera la data di scadenza massima di {max}.",
"upload.modal.link.label": "Collegamento",
"upload.modal.expires.label": "Valido fino a",
"upload.modal.expires.minute-singular": "Minuto",
"upload.modal.expires.minute-plural": "Minuti",
"upload.modal.expires.hour-singular": "Ora",
"upload.modal.expires.hour-plural": "Ore",
"upload.modal.expires.day-singular": "Giorno",
"upload.modal.expires.day-plural": "Giorni",
"upload.modal.expires.week-singular": "Settimana",
"upload.modal.expires.week-plural": "Settimane",
"upload.modal.expires.month-singular": "Mese",
"upload.modal.expires.month-plural": "Mesi",
"upload.modal.expires.year-singular": "Anno",
"upload.modal.expires.year-plural": "Anni",
"upload.modal.accordion.description.title": "Descrizione",
"upload.modal.accordion.description.placeholder": "Nota per i destinatari di questa condivisione",
"upload.modal.accordion.email.title": "Destinatari di posta elettronica",
"upload.modal.accordion.email.placeholder": "Inserisci le email dei destinatari",
"upload.modal.accordion.email.invalid-email": "Indirizzo email non valido",
"upload.modal.accordion.security.title": "Opzioni di sicurezza",
"upload.modal.accordion.security.password.label": "Protezione con password",
"upload.modal.accordion.security.password.placeholder": "Nessuna password",
"upload.modal.accordion.security.max-views.label": "Visualizzazioni massime",
"upload.modal.accordion.security.max-views.placeholder": "Nessun limite",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Questa condivisione non scadrà mai.",
"upload.modal.completed.expires-on": "Questa condivisione scadrà il {expiration}.",
"upload.modal.completed.share-ready": "Condivisione pronta",
// END /upload
// /share/[id]
"share.title": "Condividi {shareId}",
"share.description": "Guarda cosa ho condiviso con te!",
"share.error.visitor-limit-exceeded.title": "Limite visitatori superato",
"share.error.visitor-limit-exceeded.description": "Il limite di visitatori di questa condivisione è stato superato.",
"share.error.removed.title": "Condivisione rimossa",
"share.error.not-found.title": "Condivisione non trovata",
"share.error.not-found.description": "La condivisione che stai cercando non esiste.",
"share.modal.password.title": "Password richiesta",
"share.modal.password.description": "Per accedere a questa condivisione inserisci la password.",
"share.modal.password": "Password",
"share.modal.error.invalid-password": "Password non valida",
"share.button.download-all": "Scarica tutto",
"share.notify.download-all-preparing": "La condivisione è in preparazione. Riprova tra qualche minuto.",
"share.modal.file-link": "Link dei File",
"share.table.name": "Nome",
"share.table.size": "Dimensione",
"share.modal.file-preview.error.not-supported.title": "Anteprima non supportata",
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Modifica {shareId}",
"share.edit.append-upload": "Aggiungi file",
"share.edit.notify.generic-error": "Si è verificato un errore durante il completamento della condivisione.",
"share.edit.notify.save-success": "Condivisione aggiornata correttamente",
// END /share/[id]/edit
// /admin/config
"admin.config.title": "Configurazione",
"admin.config.category.general": "Generale",
"admin.config.category.share": "Condivisioni",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Effettua il login con i Social",
"admin.config.general.app-name": "Nome dell'App",
"admin.config.general.app-name.description": "Nome dell' applicazione",
"admin.config.general.app-url": "URL dell'App",
"admin.config.general.app-url.description": "Su quale URL Pingvin Share è pubblicato",
"admin.config.general.show-home-page": "Visualizza Home Page",
"admin.config.general.show-home-page.description": "Indica se mostrare la home page",
"admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "Cambia il tuo logo caricando una nuova immagine. L'immagine deve essere un PNG e dovrebbe avere il formato 1:1.",
"admin.config.general.logo.placeholder": "Scegli un'immagine",
"admin.config.email.enable-share-email-recipients": "Abilita le email di notifica",
"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.share-recipients-subject": "Oggetto dell'email di condivisione",
"admin.config.email.share-recipients-subject.description": "Oggetto dell'email che viene inviata ai destinatari della condivisione.",
"admin.config.email.share-recipients-message": "Testo dell'email di condivisione",
"admin.config.email.share-recipients-message.description": "Messaggio che viene inviato ai destinatari della condivisione. Variabili disponibili:\n {creator} - Il nome utente del creatore della condivisione\n {shareUrl} - L'URL della condivisione\n {desc} - La descrizione della condivisione\n {expires} - La data di scadenza della condivisione\n Le variabili saranno sostituite con il valore effettivo.",
"admin.config.email.reverse-share-subject": "Oggetto dell'email di condivisione inversa",
"admin.config.email.reverse-share-subject.description": "Oggetto dell'email che viene inviata quando qualcuno ha creato una condivisione con il tuo link di condivisione inversa.",
"admin.config.email.reverse-share-message": "Testo dell'email di condivisione inversa",
"admin.config.email.reverse-share-message.description": "Messaggio che viene inviato quando qualcuno ha creato una condivisione con il tuo link di condivisione inversa. {shareUrl} sarà sostituito con il nome del creatore e l'URL di condivisione.",
"admin.config.email.reset-password-subject": "Oggetto della mail per il reset della password",
"admin.config.email.reset-password-subject.description": "Oggetto dell'email che viene inviata quando un utente richiede il ripristino della password.",
"admin.config.email.reset-password-message": "Testo dell'email per il reset della password",
"admin.config.email.reset-password-message.description": "Messaggio che viene inviato quando un utente richiede un reset della password. {url} verrà sostituito con l'URL di reset della password.",
"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-message": "Testo dell'email di invito",
"admin.config.email.invite-message.description": "Messaggio che viene inviato quando un amministratore invita un utente. {url} verrà sostituito con l'URL di invito e {password} con la password.",
"admin.config.share.allow-registration": "Consenti la registrazione",
"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.description": "Indica se gli utenti non autenticati possono creare condivisioni",
"admin.config.share.max-expiration": "Scadenza massima",
"admin.config.share.max-expiration.description": "Scadenza massima di condivisione in ore. Impostare a 0 per consentire la scadenza illimitata.",
"admin.config.share.max-size": "Dim. massima",
"admin.config.share.max-size.description": "Dimensione massima di condivisione in byte",
"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.smtp.enabled": "Abilitato",
"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.description": "Host del server SMTP",
"admin.config.smtp.port": "Porta",
"admin.config.smtp.port.description": "Porta del server SMTP",
"admin.config.smtp.email": "Email",
"admin.config.smtp.email.description": "Indirizzo da cui vengono inviate le email",
"admin.config.smtp.username": "Nome utente",
"admin.config.smtp.username.description": "Nome utente del server SMTP",
"admin.config.smtp.password": "Password",
"admin.config.smtp.password.description": "Password del server SMTP",
"admin.config.smtp.button.test": "Invia e-mail di prova",
"admin.config.oauth.allow-registration": "Consenti la registrazione",
"admin.config.oauth.allow-registration.description": "Consenti agli utenti di registrarsi tramite social login",
"admin.config.oauth.ignore-totp": "Ignora TOTP",
"admin.config.oauth.ignore-totp.description": "Indica se ignorare TOTP quando l'utente utilizza il social login",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Se l'accesso tramite GitHub è abilitato",
"admin.config.oauth.github-client-id": "GitHub Client ID",
"admin.config.oauth.github-client-id.description": "ID client dell'app GitHub OAuth",
"admin.config.oauth.github-client-secret": "GitHub Client secret",
"admin.config.oauth.github-client-secret.description": "Client secret dell'app GitHub OAuth",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Se il login tramite Google è abilitato",
"admin.config.oauth.google-client-id": "Id Client Goole",
"admin.config.oauth.google-client-id.description": "ID client dell'app Google OAuth",
"admin.config.oauth.google-client-secret": "Google Client secret",
"admin.config.oauth.google-client-secret.description": "Client secret dell'app Google OAuth",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Se il login tramite Microsoft è abilitato",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
"admin.config.oauth.microsoft-tenant.description": "Tenant ID dell'app Microsoft OAuth\ngenerico: Gli utenti con un account Microsoft personale e un account di lavoro o scuola da Microsoft Entra ID possono accedere all'applicazione. organizzazioni: Solo gli utenti con account di lavoro o scolastici di Microsoft Entra ID possono accedere all'applicazione.\nclienti: Solo gli utenti con un account Microsoft personale possono accedere all'applicazione.\nnome di dominio del tenant Microsoft Entra o l'ID del tenant in formato GUID: Solo gli utenti di uno specifico tenant Microsoft Entra (membri di directory con un account di lavoro o di scuola o ospiti di directory con un account Microsoft personale) possono accedere all'applicazione.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID",
"admin.config.oauth.microsoft-client-id.description": "ID client dell'app Microsoft OAuth",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
"admin.config.oauth.microsoft-client-secret.description": "Client secret dell'app Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Se l'accesso tramite Discord è abilitato",
"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-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "ID client dell'app Discord OAuth",
"admin.config.oauth.discord-client-secret": "Discord Client secret",
"admin.config.oauth.discord-client-secret.description": "Client secret dell'applicazione Discord OAuth",
"admin.config.oauth.oidc-enabled": "OpenId Connect",
"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.description": "URI di scoperta dell'app OAuth di 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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID dell'app OAuth di OpenID Connect",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret dell'app OAuth OpenID Connect",
// 404
"404.description": "Ops, questa pagina non esiste.",
"404.button.home": "Riportami a casa",
// error
"error.title": "Errore",
"error.description": "Oops!",
"error.button.back": "Torna indietro",
"error.msg.default": "Si è verificato un errore.",
"error.msg.access_denied": "Hai annullato il processo di autenticazione, per favore riprova.",
"error.msg.expired_token": "Il processo di autenticazione ha richiesto troppo tempo, per favore riprova.",
"error.msg.invalid_token": "Errore Interno",
"error.msg.no_user": "L'utente collegato a questo account {0} non esiste.",
"error.msg.no_email": "Impossibile ottenere l'indirizzo email da questo account {0}.",
"error.msg.already_linked": "Questo account {0} è già collegato ad un altro account.",
"error.msg.not_linked": "Questo account {0} non è ancora collegato ad alcun account.",
"error.msg.unverified_account": "Questo account {0} non è verificato, per favore riprova dopo la verifica.",
"error.msg.discord_guild_permission_denied": "Non sei autorizzato ad accedere.",
"error.msg.cannot_get_user_info": "Non è possibile ottenere le informazioni utente da questo account {0}.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenId Connect",
// Common translations
"common.button.save": "Salva",
"common.button.create": "Crea",
"common.button.submit": "Invia",
"common.button.delete": "Cancella",
"common.button.cancel": "Annulla",
"common.button.confirm": "Conferma",
"common.button.disable": "Disabilita",
"common.button.share": "Condividi",
"common.button.generate": "Genera",
"common.button.done": "Fatto",
"common.text.link": "Collegamento",
"common.text.navigate-to-link": "Vai al collegamento",
"common.text.or": "o",
"common.button.go-back": "Torna indietro",
"common.notify.copied": "Il tuo collegamento e' stato copiato negli appunti",
"common.success": "Successo",
"common.error": "Errore",
"common.error.unknown": "Si è verificato un errore sconosciuto",
"common.error.invalid-email": "Indirizzo email non valido",
"common.error.too-short": "Deve contenere almeno {length} caratteri",
"common.error.too-long": "Deve contenere al massimo {length} caratteri",
"common.error.exact-length": "Deve essere esattamente {length} caratteri",
"common.error.invalid-number": "Deve essere un numero",
"common.error.field-required": "Questo campo è obbligatorio"
};

View File

@@ -33,7 +33,7 @@ export default {
"signin.button.submit": "サインイン", "signin.button.submit": "サインイン",
"signIn.notify.totp-required.title": "二段階認証が必要です", "signIn.notify.totp-required.title": "二段階認証が必要です",
"signIn.notify.totp-required.description": "二段階認証コードを入力してください", "signIn.notify.totp-required.description": "二段階認証コードを入力してください",
"signIn.oauth.or": "OR", "signIn.oauth.or": "または",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -51,8 +51,8 @@ export default {
"signup.button.submit": "さあ始めましょう", "signup.button.submit": "さあ始めましょう",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "二段階認証",
"totp.button.signIn": "Sign in", "totp.button.signIn": "サインイン",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "パスワードを忘れてしまいましたか?", "resetPassword.title": "パスワードを忘れてしまいましたか?",
@@ -72,20 +72,20 @@ export default {
"account.card.password.title": "パスワード", "account.card.password.title": "パスワード",
"account.card.password.old": "現在のパスワード", "account.card.password.old": "現在のパスワード",
"account.card.password.new": "新規パスワード", "account.card.password.new": "新規パスワード",
"account.card.password.noPasswordSet": "You 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": "パスワードが設定されていません。メールアドレスとパスワードでサインインしたい場合は、パスワードの設定が必要です。",
"account.notify.password.success": "パスワードの変更に成功しました", "account.notify.password.success": "パスワードの変更に成功しました",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "ソーシャルログイン",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "リンク",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "リンク解除",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "リンクされていません",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "アカウントのリンクを解除",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.", "account.modal.unlink.description": "ソーシャルアカウントのリンクを解除すると、ユーザー名とパスワードを覚えていない場合にアカウントへのアクセスが失われる可能性があります。",
"account.notify.oauth.unlinked.success": "Unlinked successfully", "account.notify.oauth.unlinked.success": "リンク解除に成功しました",
"account.card.security.title": "セキュリティ", "account.card.security.title": "セキュリティ",
"account.card.security.totp.enable.description": "2段階認証を有効にするため、現在のパスワードを入力してください", "account.card.security.totp.enable.description": "2段階認証を有効にするため、現在のパスワードを入力してください",
"account.card.security.totp.disable.description": "2段階認証を無効にするため、現在のパスワードを入力してください", "account.card.security.totp.disable.description": "2段階認証を無効にするため、現在のパスワードを入力してください",
@@ -214,6 +214,7 @@ export default {
"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.link.label": "リンク", "upload.modal.link.label": "リンク",
"upload.modal.expires.label": "有効期限", "upload.modal.expires.label": "有効期限",
"upload.modal.expires.minute-singular": "分間", "upload.modal.expires.minute-singular": "分間",
@@ -261,15 +262,21 @@ 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": "これらのファイルのプレビューには対応していません。ファイルをダウンロードして、直接確認してください。", "share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "編集 {shareId}",
"share.edit.append-upload": "ファイルを追加",
"share.edit.notify.generic-error": "共有の最終処理でエラーが発生しました。",
"share.edit.notify.save-success": "共有の更新に成功しました",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "設定", "admin.config.title": "設定",
"admin.config.category.general": "一般", "admin.config.category.general": "一般",
"admin.config.category.share": "共有", "admin.config.category.share": "共有",
"admin.config.category.email": "メール", "admin.config.category.email": "メール",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "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": "アプリ名",
@@ -301,6 +308,8 @@ export default {
"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.description": "共有に設定可能な有効期限の上限を時間単位で設定できます。0を設定すると、有効期限が無制限になります。",
"admin.config.share.max-size": "最大ファイルサイズ", "admin.config.share.max-size": "最大ファイルサイズ",
"admin.config.share.max-size.description": "最大ファイルサイズbyte単位", "admin.config.share.max-size.description": "最大ファイルサイズbyte単位",
"admin.config.share.zip-compression-level": "Zip圧縮レベル", "admin.config.share.zip-compression-level": "Zip圧縮レベル",
@@ -318,63 +327,71 @@ export default {
"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.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "登録を許可する",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "ユーザーにソーシャルアカウント経由での登録を許可します",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "二段階認証を無視する",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "ソーシャルログイン時に二段階認証を無視するかどうかを設定します",
"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": "GitHubアカウントを使用したログインを許可するかどうかを設定します",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "GitHub クライアントID",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app", "admin.config.oauth.github-client-id.description": "GitHub OAuthアプリのクライアントID",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "GitHub クライアントシークレット",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "GitHub OAuthアプリのクライアントシークレット",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Googleアカウントを使用したログインを許可するかどうかを設定します",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "Google クライアントID",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "Google OAuthアプリのクライアントID",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "Google クライアントシークレット",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Google OAuthアプリのクライアントシークレット",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Microsoftアカウントを使用したログインを許可するかどうかを設定します",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant", "admin.config.oauth.microsoft-tenant": "Microsoftテナント",
"admin.config.oauth.microsoft-tenant.description": "Tenant ID of the Microsoft OAuth app\ncommon: Users with both a personal Microsoft account and a work or school account from Microsoft Entra ID can sign in to the application. organizations: Only users with work or school accounts from Microsoft Entra ID can sign in to the application.\nconsumers: Only users with a personal Microsoft account can sign in to the application.\ndomain name of the Microsoft Entra tenant or the tenant ID in GUID format: Only users from a specific Microsoft Entra tenant (directory members with a work or school account or directory guests with a personal Microsoft account) can sign in to the application.", "admin.config.oauth.microsoft-tenant.description": "Microsoft OAuthアプリのテナントID\ncommon: 個人のMicrosoftアカウントとMicrosoft Entra IDの職場または学校のアカウントを持つユーザーは、アプリケーションにサインインできます。 \norganizations: Microsoft Entra IDからの職場または学校のアカウントを持つユーザーのみがアプリケーションにサインインできます。\nconsumers: 個人のMicrosoftアカウントを持つユーザーのみがアプリケーションにサインインできます。\nMicrosoft Entraテナントのドメイン名またはGUID形式のテナントID: 特定のMicrosoft Entraテナント (職場または学校のアカウントを持つディレクトリメンバーまたはパーソナルMicrosoftアカウントを持つディレクトリゲスト) からのユーザーのみがアプリケーションにサインインできます。",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "Microsoft クライアントID",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "Microsoft OAuthアプリのクライアントID",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret", "admin.config.oauth.microsoft-client-secret": "Microsoft クライアントシークレット",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "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": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "Discordアカウントを使用したログインを許可するかどうかを設定します",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-limited-guild": "Discord limited server ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "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-secret": "Discord Client secret", "admin.config.oauth.discord-client-id": "Discord クライアントID",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Discord OAuthアプリのクライアントID",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.discord-client-secret": "Discord クライアントシークレット",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.discord-client-secret.description": "Discord OAuthアプリのクライアントシークレット",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 404 // 404
"404.description": "ページが見つかりません。", "404.description": "ページが見つかりません。",
"404.button.home": "ホームに戻る", "404.button.home": "ホームに戻る",
// error // error
"error.title": "Error", "error.title": "エラー",
"error.description": "Oops!", "error.description": "申し訳ありません",
"error.button.back": "Go back", "error.button.back": "戻る",
"error.msg.default": "Something went wrong.", "error.msg.default": "問題が発生しました。",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "認証処理を中止しました、後で再度お試しください。",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "認証処理に時間がかかりすぎています、後で再度お試しください。",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Internal Error",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "この{0} アカウントにリンクしたユーザーが存在しません。",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "この{0} アカウントからメールアドレスを取得出来ません。",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.already_linked": "この{0} アカウントは、既に別のアカウントにリンクされています。",
"error.msg.not_linked": "この{0} アカウントはどのアカウントにもリンクされていません。",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Can not 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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "保存", "common.button.save": "保存",
"common.button.create": "作成", "common.button.create": "作成",
@@ -387,6 +404,7 @@ 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.or": "または", "common.text.or": "または",
"common.button.go-back": "戻る", "common.button.go-back": "戻る",
"common.notify.copied": "リンクをクリップボードにコピーしました", "common.notify.copied": "リンクをクリップボードにコピーしました",

View File

@@ -1,11 +1,11 @@
export default { export default {
// Navbar // Navbar
"navbar.upload": "Verzenden", "navbar.upload": "Delen",
"navbar.signin": "Aanmelden", "navbar.signin": "Aanmelden",
"navbar.home": "Startpagina", "navbar.home": "Startpagina",
"navbar.signup": "Registreren", "navbar.signup": "Registreren",
"navbar.links.shares": "Mijn gedeelde bestanden", "navbar.links.shares": "Mijn gedeelde bestanden",
"navbar.links.reverse": "Reverse shares", "navbar.links.reverse": "Omgekeerd delen",
"navbar.avatar.account": "Mijn account", "navbar.avatar.account": "Mijn account",
"navbar.avatar.admin": "Beheer", "navbar.avatar.admin": "Beheer",
"navbar.avatar.signout": "Afmelden", "navbar.avatar.signout": "Afmelden",
@@ -13,14 +13,14 @@ export default {
// / // /
"home.title": "Een <h>zelfgehost</h> platform voor het delen van bestanden.", "home.title": "Een <h>zelfgehost</h> platform voor het delen van bestanden.",
"home.description": "Wil je echt je persoonlijke bestanden geven aan derden zoals WeTransfer?", "home.description": "Wil je echt je persoonlijke bestanden geven aan derden zoals WeTransfer?",
"home.bullet.a.name": "Zelf-gehost", "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": "Uw bestanden zijn van u en mogen nooit in handen komen van 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 zo grote bestanden als je wilt. Alleen je harde schijf is je limiet.",
"home.button.start": "Aan de slag", "home.button.start": "Aan de slag",
"home.button.source": "Bron code", "home.button.source": "Broncode",
// END / // END /
// /auth/signin // /auth/signin
"signin.title": "Welkom terug", "signin.title": "Welkom terug",
@@ -33,7 +33,7 @@ export default {
"signin.button.submit": "Aanmelden", "signin.button.submit": "Aanmelden",
"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": "OR", "signIn.oauth.or": "OF",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -51,8 +51,8 @@ export default {
"signup.button.submit": "Laten we beginnen", "signup.button.submit": "Laten we beginnen",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "TOTP Authenticatie",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Aanmelden",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Wachtwoord vergeten?", "resetPassword.title": "Wachtwoord vergeten?",
@@ -65,27 +65,27 @@ export default {
"resetPassword.notify.passwordReset": "Uw wachtwoord is met succes opnieuw ingesteld.", "resetPassword.notify.passwordReset": "Uw wachtwoord is met succes opnieuw ingesteld.",
// /account // /account
"account.title": "Mijn account", "account.title": "Mijn account",
"account.card.info.title": "Account informatie", "account.card.info.title": "Accountinformatie",
"account.card.info.username": "Gebruikersnaam", "account.card.info.username": "Gebruikersnaam",
"account.card.info.email": "E-mailadres", "account.card.info.email": "E-mailadres",
"account.notify.info.success": "Account succesvol bijgewerkt", "account.notify.info.success": "Account succesvol bijgewerkt",
"account.card.password.title": "Wachtwoord", "account.card.password.title": "Wachtwoord",
"account.card.password.old": "Oud wachtwoord", "account.card.password.old": "Oude wachtwoord",
"account.card.password.new": "Nieuw wachtwoord", "account.card.password.new": "Nieuw wachtwoord",
"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": "U hebt nog geen wachtwoord ingesteld. Stel deze eerst in als u via email wilt inloggen.",
"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",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Koppelen",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Ontkoppel",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Niet-gekoppeld",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Ontkoppel account",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.", "account.modal.unlink.description": "Het ontkoppelen van uw sociale accounts kan leiden tot verlies van uw account. Vergeet uw gebruikersnaam en wachtwoord niet.",
"account.notify.oauth.unlinked.success": "Unlinked successfully", "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",
"account.card.security.totp.disable.description": "Voer uw huidige wachtwoord in om TOTP uit te schakelen", "account.card.security.totp.disable.description": "Voer uw huidige wachtwoord in om TOTP uit te schakelen",
@@ -101,7 +101,7 @@ export default {
"account.notify.totp.enable": "TOTP succesvol ingeschakeld", "account.notify.totp.enable": "TOTP succesvol ingeschakeld",
"account.card.language.title": "Taal", "account.card.language.title": "Taal",
"account.card.language.description": "Het project is vertaald door de community. Sommige talen zijn mogelijk onvolledig.", "account.card.language.description": "Het project is vertaald door de community. Sommige talen zijn mogelijk onvolledig.",
"account.card.color.title": "Kleuren schema", "account.card.color.title": "Kleurenschema",
// ThemeSwitcher.tsx // ThemeSwitcher.tsx
"account.theme.dark": "Donker", "account.theme.dark": "Donker",
"account.theme.light": "Licht", "account.theme.light": "Licht",
@@ -125,16 +125,16 @@ export default {
"account.shares.table.size": "Grootte", "account.shares.table.size": "Grootte",
"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": "Delete share {share}", "account.shares.modal.delete.title": "Verwijder share {share}",
"account.shares.modal.delete.description": "Do you really want to delete this share?", "account.shares.modal.delete.description": "Weet u zeker dat u deze share wilt verwijderen?",
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
"account.reverseShares.title": "Reverse shares", "account.reverseShares.title": "Omgekeerde share",
"account.reverseShares.description": "A reverse share allows you to generate a unique URL that allows external users to create a share.", "account.reverseShares.description": "Met een omgekeerde share kan een externe gebruiker via unieke genereerde URL bestanden uploaden.",
"account.reverseShares.title.empty": "Het is hier leeg 👀", "account.reverseShares.title.empty": "Het is hier leeg 👀",
"account.reverseShares.description.empty": "You don't have any reverse shares.", "account.reverseShares.description.empty": "U hebt nog geen omgekeerde shares. Maak er een aan.",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Create reverse share", "account.reverseShares.modal.title": "Creeër een omgekeerde share",
"account.reverseShares.modal.expiration.label": "Vervaldatum", "account.reverseShares.modal.expiration.label": "Vervaldatum",
"account.reverseShares.modal.expiration.minute-singular": "Minuut", "account.reverseShares.modal.expiration.minute-singular": "Minuut",
"account.reverseShares.modal.expiration.minute-plural": "Minuten", "account.reverseShares.modal.expiration.minute-plural": "Minuten",
@@ -148,26 +148,26 @@ export default {
"account.reverseShares.modal.expiration.month-plural": "Maanden", "account.reverseShares.modal.expiration.month-plural": "Maanden",
"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": "Max share size", "account.reverseShares.modal.max-size.label": "Maximale share-grootte",
"account.reverseShares.modal.send-email": "Stuur e-mail notificatie", "account.reverseShares.modal.send-email": "Stuur e-mailnotificatie",
"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": "Stuur een e-mailnotificatie wanneer er bestanden zijn gedeeld via deze omgekeerde share link.",
"account.reverseShares.modal.max-use.label": "Max uses", "account.reverseShares.modal.max-use.label": "Maximaal gebruikte keren",
"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": "Maximale keren dat deze URL gebruikt kan worden om een share aan te maken.",
"account.reverseShare.never-expires": "This reverse share will never expire.", "account.reverseShare.never-expires": "Deze omgekeerde share zal nooit verlopen.",
"account.reverseShare.expires-on": "This reverse share will expire on {expiration}.", "account.reverseShare.expires-on": "Dit omgekeerde share verloopt op {expiration}.",
"account.reverseShares.table.no-shares": "No shares created yet", "account.reverseShares.table.no-shares": "Nog geen omgekeerde share aangemaakt",
"account.reverseShares.table.count.singular": "share", "account.reverseShares.table.count.singular": "deel",
"account.reverseShares.table.count.plural": "shares", "account.reverseShares.table.count.plural": "delen",
"account.reverseShares.table.shares": "Shares", "account.reverseShares.table.shares": "Delen",
"account.reverseShares.table.remaining": "Remaining uses", "account.reverseShares.table.remaining": "Nog te gebruiken",
"account.reverseShares.table.max-size": "Max share size", "account.reverseShares.table.max-size": "Maximale sharegrootte",
"account.reverseShares.table.expires": "Verloopt op", "account.reverseShares.table.expires": "Verloopt op",
"account.reverseShares.modal.reverse-share-link": "Reverse share link", "account.reverseShares.modal.reverse-share-link": "Omgekeerde share link",
"account.reverseShares.modal.delete.title": "Delete reverse share", "account.reverseShares.modal.delete.title": "Omgekeerde share verwijderen",
"account.reverseShares.modal.delete.description": "Do you really want to delete this reverse share? If you do, the associated shares will be deleted as well.", "account.reverseShares.modal.delete.description": "Weet u zeker dat u deze omgekeerde share wilt verwijderen? Als u dit doet, worden de bijbehorende bestanden ook verwijderd.",
// END /account/reverseShares // END /account/reverseShares
// /admin // /admin
"admin.title": "Beheer", "admin.title": "Instellingen",
"admin.button.users": "Gebruikers beheer", "admin.button.users": "Gebruikers beheer",
"admin.button.config": "Configuratie", "admin.button.config": "Configuratie",
"admin.version": "Versie", "admin.version": "Versie",
@@ -178,13 +178,13 @@ export default {
"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": "Gebruiker {username} bijwerken",
"admin.users.edit.update.admin-privileges": "Beheerder privileges", "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": "Gebruiker {username} verwijderen",
"admin.users.edit.delete.description": "Do you really want to delete this user and all his shares?", "admin.users.edit.delete.description": "Wilt u echt deze gebruiker en al zijn shares verwijderen?",
// 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",
@@ -192,28 +192,29 @@ export default {
"admin.users.modal.create.password": "Wachtwoord", "admin.users.modal.create.password": "Wachtwoord",
"admin.users.modal.create.manual-password": "Wachtwoord handmatig instellen", "admin.users.modal.create.manual-password": "Wachtwoord handmatig instellen",
"admin.users.modal.create.manual-password.description": "Indien niet aangevinkt, ontvangt de gebruiker een e-mail met een link om zijn wachtwoord in te stellen.", "admin.users.modal.create.manual-password.description": "Indien niet aangevinkt, ontvangt de gebruiker een e-mail met een link om zijn wachtwoord in te stellen.",
"admin.users.modal.create.admin": "Beheerder privileges", "admin.users.modal.create.admin": "Beheerdersrechten",
"admin.users.modal.create.admin.description": "Indien aangevinkt, heeft de gebruiker toegang tot de beheeromgeving.", "admin.users.modal.create.admin.description": "Indien aangevinkt, heeft de gebruiker toegang tot de beheeromgeving.",
// END /admin/users // END /admin/users
// /upload // /upload
"upload.title": "Uploaden", "upload.title": "Uploaden",
"upload.notify.generic-error": "An error occurred while finishing your 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. Opnieuw proberen.", "upload.notify.count-failed": "{count} bestanden konden niet worden geüpload. Probeer het nogmaals.",
// Dropzone.tsx // Dropzone.tsx
"upload.dropzone.title": "Bestanden uploaden", "upload.dropzone.title": "Bestanden uploaden",
"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": "Sleep uw bestanden hier om uw share te beginnen. We kunnen alleen bestanden accepteren die kleiner zijn dan {maxSize} in totaal.",
"upload.dropzone.notify.file-too-big": "Your files exceed the maximum share size of {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",
"upload.filelist.size": "Grootte", "upload.filelist.size": "Grootte",
// showCreateUploadModal.tsx // showCreateUploadModal.tsx
"upload.modal.title": "Create Share", "upload.modal.title": "Share aanmaken",
"upload.modal.link.error.invalid": "Can only contain letters, numbers, underscores, and hyphens", "upload.modal.link.error.invalid": "Het mag alleen letters, cijfers, onderstrepingstekens en koppeltekens bevatten",
"upload.modal.link.error.taken": "Deze link is al in gebruik", "upload.modal.link.error.taken": "Deze link is al in gebruik",
"upload.modal.not-signed-in": "U bent niet aangemeld", "upload.modal.not-signed-in": "U bent niet aangemeld",
"upload.modal.not-signed-in-description": "You will be unable to delete your share manually and view the visitor count.", "upload.modal.not-signed-in-description": "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": "Verloopt nooit",
"upload.modal.expires.error.too-long": "De maximale vervaldatum van {max} is overschreven.",
"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",
@@ -229,80 +230,88 @@ export default {
"upload.modal.expires.year-singular": "Jaar", "upload.modal.expires.year-singular": "Jaar",
"upload.modal.expires.year-plural": "Jaren", "upload.modal.expires.year-plural": "Jaren",
"upload.modal.accordion.description.title": "Beschrijving", "upload.modal.accordion.description.title": "Beschrijving",
"upload.modal.accordion.description.placeholder": "Note for the recipients of this share", "upload.modal.accordion.description.placeholder": "Opmerking voor de ontvangers van deze share",
"upload.modal.accordion.email.title": "E-mail 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",
"upload.modal.accordion.security.title": "Beveiliging opties", "upload.modal.accordion.security.title": "Beveiligingsopties",
"upload.modal.accordion.security.password.label": "Paswoord beveiling", "upload.modal.accordion.security.password.label": "Wachtwoordbeveiling",
"upload.modal.accordion.security.password.placeholder": "Geen wachtwoord", "upload.modal.accordion.security.password.placeholder": "Geen wachtwoord",
"upload.modal.accordion.security.max-views.label": "Maximum aantal weergaven", "upload.modal.accordion.security.max-views.label": "Maximum aantal weergaven",
"upload.modal.accordion.security.max-views.placeholder": "Onbeperkt", "upload.modal.accordion.security.max-views.placeholder": "Onbeperkt",
// showCompletedUploadModal.tsx // showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "This share will never expire.", "upload.modal.completed.never-expires": "Deze omgekeerde share zal nooit verlopen.",
"upload.modal.completed.expires-on": "This share will expire on {expiration}.", "upload.modal.completed.expires-on": "Deze omgekeerde share verloopt op {expiration}.",
"upload.modal.completed.share-ready": "Share ready", "upload.modal.completed.share-ready": "Share is gereed",
// END /upload // END /upload
// /share/[id] // /share/[id]
"share.title": "Share {shareId}", "share.title": "Share {shareId}",
"share.description": "Kijk eens wat ik met je heb gedeeld!", "share.description": "Kijk eens wat ik met je heb gedeeld!",
"share.error.visitor-limit-exceeded.title": "Bezoekerslimiet overschreden", "share.error.visitor-limit-exceeded.title": "Bezoekerslimiet overschreden",
"share.error.visitor-limit-exceeded.description": "The visitor limit from this share has been exceeded.", "share.error.visitor-limit-exceeded.description": "De bezoekerslimiet van deze share is overschreden.",
"share.error.removed.title": "Share removed", "share.error.removed.title": "Share was verwijderd",
"share.error.not-found.title": "Share not found", "share.error.not-found.title": "Share niet gevonden",
"share.error.not-found.description": "The share you're looking for doesn't exist.", "share.error.not-found.description": "De share die u zoekt kan niet gevonden worden.",
"share.modal.password.title": "Wachtwoord vereist", "share.modal.password.title": "Wachtwoord vereist",
"share.modal.password.description": "To access this share please enter the password for the share.", "share.modal.password.description": "Vul een wachtwoord in om toegang te krijgen tot deze 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": "The share is preparing. Try again in a few minutes.", "share.notify.download-all-preparing": "De share word gebundeld. Probeer het over een paar minuten opnieuw.",
"share.modal.file-link": "Bestand koppeling", "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": "Een voorbeeld voor dit bestandstype wordt niet ondersteund. Download het bestand om het te bekijken.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "{shareId} bewerken",
"share.edit.append-upload": "Bestand toevoegen",
"share.edit.notify.generic-error": "Er is een fout opgetreden tijdens het voltooien van uw share.",
"share.edit.notify.save-success": "Share is succesvol bijgewerkt",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Configuratie", "admin.config.title": "Configuratie",
"admin.config.category.general": "Algemeen", "admin.config.category.general": "Algemeen",
"admin.config.category.share": "Delen", "admin.config.category.share": "Delen",
"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": "Social Login", "admin.config.category.oauth": "Social login",
"admin.config.general.app-name": "App naam", "admin.config.general.app-name": "App-naam",
"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": "On which URL Pingvin Share is available", "admin.config.general.app-url.description": "De URL waar Pingvin Share bereikbaar is",
"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.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": "Enable share email recipients", "admin.config.email.enable-share-email-recipients": "Voer e-mail ontvangers in",
"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": "Sta e-mails toe om de ontvangers de deel link te versturen. Schakel dit alleen in als je SMTP hebt ingeschakeld.",
"admin.config.email.share-recipients-subject": "Share recipients subject", "admin.config.email.share-recipients-subject": "Onderwerp van ontvangers' share",
"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": "Het onderwerp van de e-mail die wordt verzonden naar de share-ontvangers.",
"admin.config.email.share-recipients-message": "Share recipients message", "admin.config.email.share-recipients-message": "Bericht voor ontvangers van de share",
"admin.config.email.share-recipients-message.description": "Message which gets sent to the share recipients. Available variables:\n {creator} - The username of the creator of the share\n {shareUrl} - The URL of the share\n {desc} - The description of the share\n {expires} - The expiration date of the share\n The variables will be replaced with the actual value.", "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.reverse-share-subject": "Reverse share subject", "admin.config.email.reverse-share-subject": "Omgekeerde share email onderwerp",
"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": "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-message": "Reverse share message", "admin.config.email.reverse-share-message": "Omgekeerde share-bericht",
"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": "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": "Reset wachtwoord onderwerp", "admin.config.email.reset-password-subject": "E-mailonderwerp voor wachtwoordherstel",
"admin.config.email.reset-password-subject.description": "Onderwerp van de e-mail die wordt verzonden wanneer een gebruiker een wachtwoordreset aanvraagt.", "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-message": "Wachtwoord opnieuw instellen bericht", "admin.config.email.reset-password-message": "Bericht voor wachtwoordherstel",
"admin.config.email.reset-password-message.description": "Bericht dat wordt verzonden wanneer een gebruiker een wachtwoord reset aanvraagt. {url} zal worden vervangen door de wachtwoord reset 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 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": "Onderwerp van de e-mail die wordt verzonden wanneer een beheerder een gebruiker uitnodigt.",
"admin.config.email.invite-message": "Bericht uitnodiging", "admin.config.email.invite-message": "Bericht voor uitnodiging",
"admin.config.email.invite-message.description": "Bericht dat wordt verzonden wanneer een beheerder een gebruiker uitnodigt. {url} zal worden vervangen door de uitnodigings-URL en {password} met het wachtwoord.", "admin.config.email.invite-message.description": "Bericht dat wordt verzonden wanneer een beheerder een gebruiker uitnodigt. {url} zal worden vervangen door de uitnodigings-URL en {password} met het wachtwoord.",
"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": "Allow unauthenticated shares", "admin.config.share.allow-unauthenticated-shares": "Ongeverifieerde shares toestaan",
"admin.config.share.allow-unauthenticated-shares.description": "Whether unauthenticated users can create shares", "admin.config.share.allow-unauthenticated-shares.description": "Sta niet-geverifieerde gebruikers toe shares te kunnen aanmaken",
"admin.config.share.max-size": "Max grootte", "admin.config.share.max-expiration": "Max. vervaldatum",
"admin.config.share.max-size.description": "Maximum share size in bytes", "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-size": "Max. grootte",
"admin.config.share.max-size.description": "Maximale share grootte in bytes",
"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.smtp.enabled": "Inschakelen", "admin.config.smtp.enabled": "Inschakelen",
@@ -317,64 +326,72 @@ export default {
"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": "Test e-mail verzenden", "admin.config.smtp.button.test": "Teste-mail verzenden",
"admin.config.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Sta registratie toe",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Gebruikers toestaan zich te registreren via sociale login",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "TOTP negeren",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "TOTP negeren wanneer gebruiker sociale login gebruikt",
"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": "Ofdat GitHub login is ingeschakeld",
"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 van de 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 of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "Client secret van de GitHub OAuth app",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Ofdat GitHub login is ingeschakeld",
"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 of the Google OAuth app", "admin.config.oauth.google-client-id.description": "Client-ID van de 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 of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Client secret van de Google OAuth app",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Ofdat Microsoft login is ingeschakeld",
"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 van de Microsoft OAuth app\ncommon: Gebruikers met zowel een persoonlijk Microsoft-account als een werk- of schoolaccount van Microsoft Entra ID kunnen zich aanmelden bij de applicatie. organisaties: alleen gebruikers met werk of schoolaccounts van Microsoft Entra ID kunnen zich aanmelden bij de applicatie.\nconsumenten: Alleen gebruikers met een persoonlijk Microsoft-account kunnen zich aanmelden bij de applicatie.\ndomeinnaam van de Microsoft Entra tenant of de tenant ID in GUID formaat: alleen gebruikers van een specifieke Microsoft Entra tenant (directory leden met een werk- of schoolaccount of map gasten met een persoonlijk Microsoft-account) kunnen zich aanmelden bij de toepassing.",
"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 of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "Client-ID van de 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 of the 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": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "Ofdat discord login is ingeschakeld",
"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-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Client-ID van de 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 of the Discord OAuth app", "admin.config.oauth.discord-client-secret.description": "Client-secret van de discord OAuth app",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.oidc-enabled.description": "Ofdat OpenID Connect login is ingeschakeld",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI van de OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "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-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-client-id": "Client-ID OpenID Connect",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID 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.description": "Client secret van de OpenID Connect OAuth app",
// 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",
// error // error
"error.title": "Error", "error.title": "Fout",
"error.description": "Oops!", "error.description": "Oeps!",
"error.button.back": "Go back", "error.button.back": "Terug",
"error.msg.default": "Something went wrong.", "error.msg.default": "Er ging iets mis.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "U heeft het verificatieproces geannuleerd, probeer het opnieuw.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "Het verificatieproces duurde te lang. Probeer het opnieuw.",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Interne fout",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "De gekoppelde gebruiker aan {0} account bestaat niet.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "Kan geen e-mailadres ophalen van dit {0} account.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "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.unverified_account": "Dit {0} account is nog niet geverifieerd, probeer het opnieuw na de verificatie.",
"error.msg.discord_guild_permission_denied": "U heeft geen toestemming om in te loggen.",
"error.msg.cannot_get_user_info": "Kan uw gebruikersgegevens van dit {0} account niet ophalen.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Opslaan", "common.button.save": "Opslaan",
"common.button.create": "Aanmaken", "common.button.create": "Aanmaken",
@@ -387,6 +404,7 @@ 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.or": "of", "common.text.or": "of",
"common.button.go-back": "Ga terug", "common.button.go-back": "Ga terug",
"common.notify.copied": "Uw link is gekopieerd naar het klembord", "common.notify.copied": "Uw link is gekopieerd naar het klembord",

View File

@@ -32,8 +32,8 @@ export default {
"signin.input.password.placeholder": "Twoje hasło", "signin.input.password.placeholder": "Twoje hasło",
"signin.button.submit": "Zaloguj się", "signin.button.submit": "Zaloguj się",
"signIn.notify.totp-required.title": "Wymagane jest uwierzytelnianie dwuetapowe", "signIn.notify.totp-required.title": "Wymagane jest uwierzytelnianie dwuetapowe",
"signIn.notify.totp-required.description": "Podaj kod logowania dwuetapowego", "signIn.notify.totp-required.description": "Wprowadź kod uwierzytelniania dwuetapowego",
"signIn.oauth.or": "OR", "signIn.oauth.or": "LUB",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -51,8 +51,8 @@ export default {
"signup.button.submit": "Zaczynajmy", "signup.button.submit": "Zaczynajmy",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "Uwierzytelnianie TOTP",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Zaloguj się",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Nie pamiętasz hasła?", "resetPassword.title": "Nie pamiętasz hasła?",
@@ -72,20 +72,20 @@ 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": "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": "Nie masz ustawionego hasła. Jeśli chcesz zalogować się za pomocą adresu e-mail i hasła, musisz ustawić hasło.",
"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": "Social login", "account.card.oauth.title": "Logowanie za pomocą konta społecznościowego",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Połącz",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Odłącz",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Rozłączono",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Odłącz konto",
"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": "Odłączenie kont społecznościowych, jeśli nie pamiętasz nazwy użytkownika i hasła, może spowodować utratę konta.",
"account.notify.oauth.unlinked.success": "Unlinked successfully", "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",
"account.card.security.totp.disable.description": "Wprowadź aktualne hasło, aby wyłączyć TOTP", "account.card.security.totp.disable.description": "Wprowadź aktualne hasło, aby wyłączyć TOTP",
@@ -112,7 +112,7 @@ export default {
// END /account // END /account
// /account/shares // /account/shares
"account.shares.title": "Moje udziały", "account.shares.title": "Moje udziały",
"account.shares.title.empty": "Tu jest pusto :eys:", "account.shares.title.empty": "Tu jest pusto 👀",
"account.shares.description.empty": "Nie masz żadnych udziałów.", "account.shares.description.empty": "Nie masz żadnych udziałów.",
"account.shares.button.create": "Utwórz go", "account.shares.button.create": "Utwórz go",
"account.shares.info.title": "Informacje udziału", "account.shares.info.title": "Informacje udziału",
@@ -131,7 +131,7 @@ export default {
// /account/reverseShares // /account/reverseShares
"account.reverseShares.title": "Udziały odwrotne", "account.reverseShares.title": "Udziały odwrotne",
"account.reverseShares.description": "Udostępnianie odwrotne pozwala na wygenerowanie unikalnego adresu URL, który umożliwia użytkownikom zewnętrznym na tworzenie udostępniania.", "account.reverseShares.description": "Udostępnianie odwrotne pozwala na wygenerowanie unikalnego adresu URL, który umożliwia użytkownikom zewnętrznym na tworzenie udostępniania.",
"account.reverseShares.title.empty": "Tu jest pusto :eys:", "account.reverseShares.title.empty": "Tu jest pusto 👀",
"account.reverseShares.description.empty": "Nie masz żadnych udostępnień odwrotnych.", "account.reverseShares.description.empty": "Nie masz żadnych udostępnień odwrotnych.",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Utwórz udostępnianie odwrotne", "account.reverseShares.modal.title": "Utwórz udostępnianie odwrotne",
@@ -214,6 +214,7 @@ export default {
"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": "Nigdy nie wygasa",
"upload.modal.expires.error.too-long": "Termin ważności przekracza maksymalną datę wygaśnięcia {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",
@@ -261,15 +262,21 @@ export default {
"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": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Edytuj {shareId}",
"share.edit.append-upload": "Dołącz plik",
"share.edit.notify.generic-error": "W trakcie zakańczania tworzenia udziału wystąpił błąd.",
"share.edit.notify.save-success": "Udział zaktualizowany pomyślnie",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Konfiguracja", "admin.config.title": "Konfiguracja",
"admin.config.category.general": "Ogólne", "admin.config.category.general": "Ogólne",
"admin.config.category.share": "Udostępnij", "admin.config.category.share": "Udostępnij",
"admin.config.category.email": "Adres e-mail", "admin.config.category.email": "Adres e-mail",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "admin.config.category.oauth": "Logowanie za pomocą konta społecznościowego",
"admin.config.general.app-name": "Nazwa aplikacji", "admin.config.general.app-name": "Nazwa aplikacji",
"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",
@@ -301,6 +308,8 @@ export default {
"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.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-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 w bajtach",
"admin.config.share.zip-compression-level": "Poziom kompresji Zip", "admin.config.share.zip-compression-level": "Poziom kompresji Zip",
@@ -318,67 +327,75 @@ export default {
"admin.config.smtp.password": "Hasło", "admin.config.smtp.password": "Hasło",
"admin.config.smtp.password.description": "Hasło serwera SMTP", "admin.config.smtp.password.description": "Hasło serwera SMTP",
"admin.config.smtp.button.test": "Wyślij testowego e-maila", "admin.config.smtp.button.test": "Wyślij testowego e-maila",
"admin.config.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Zezwól na rejestrację",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Zezwalaj użytkownikom na rejestrację za pomocą konta społecznościowego",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "Ignoruj TOTP",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "Czy zignorować TOTP, kiedy użytkownik loguje się za pomocą konta społecznościowego",
"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": "Czy login na GitHub jest włączony",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "ID klienta GitHub",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app", "admin.config.oauth.github-client-id.description": "ID klienta aplikacji GitHub OAuth",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "Sekret klienta GitHub",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "Sekret klienta aplikacji GitHub OAuth",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Czy jest włączony login na GitHub",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "ID klienta Google",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "ID klienta aplikacji GitHub OAuth",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "Sekret klienta Google",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Sekret klienta aplikacji Google OAuth",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Czy jest włączony login na GitHub",
"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 aplikacji Microsoft OAuth\nogólnie: Użytkownicy zarówno z osobistym kontem Microsoft, jak i kontem do pracy lub szkoły z Microsoft Entra ID mogą się zalogować do aplikacji. organizacje: Zalogować do aplikacji mogą tylko użytkownicy z kontami pracowniczymi lub szkolnymi z Microsoft Entra ID.\nkonsumenci: Zalogować się do aplikacji mogą tylko użytkownicy z osobistym kontem Microsoft.\nNazwa domeny lokatora Microsoft Entra lub identyfikator lokatora w formacie GUID: Zalogować się do aplikacji mogą tylko użytkownicy określonego najemcy Microsoft Entra (z listy członków na koncie służbowym lub szkolnym albo z listy gości na koncie osobistym Microsoft).",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "ID klienta Microsoft",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "ID klienta aplikacji Microsoft OAuth",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret", "admin.config.oauth.microsoft-client-secret": "Sekret klienta Microsoft",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "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": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "Czy jest włączony login na Discord",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-limited-guild": "ID ograniczonego serwera Discord",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "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-secret": "Discord Client secret", "admin.config.oauth.discord-client-id": "ID klienta Discord",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "ID klienta aplikacji Discord OAuth",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.discord-client-secret": "Sekret klienta Discord",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.discord-client-secret.description": "Sekret klienta aplikacji Discord OAuth",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-enabled.description": "Czy jest włączony login OpenID Connect",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-discovery-uri": "Wykrywanie URI OpenID Connect",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
"admin.config.oauth.oidc-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-username-claim": "Żądanie nazwy użytkownika OpenID Connect",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "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-client-id": "Identyfikator klienta OpenID Connect",
"admin.config.oauth.oidc-client-id.description": "Identyfikator klienta OAuth aplikacji 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",
// 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",
// error // error
"error.title": "Error", "error.title": "Błąd",
"error.description": "Oops!", "error.description": "Ups!",
"error.button.back": "Go back", "error.button.back": "Wróć",
"error.msg.default": "Something went wrong.", "error.msg.default": "Coś poszło nie tak.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "Anulowałeś proces uwierzytelniania, spróbuj ponownie.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "Proces uwierzytelniania trwał zbyt długo, spróbuj ponownie.",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Błąd wewnętrzny",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "Użytkownik powiązany z tym kontem {0} nie istnieje.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "Nie można pobrać adresu e-mail z tego konta {0}.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "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.unverified_account": "To konto {0} nie zostało zweryfikowane, spróbuj ponownie po weryfikacji.",
"error.msg.discord_guild_permission_denied": "Nie możesz się zalogować.",
"error.msg.cannot_get_user_info": "Nie można uzyskać informacji o użytkowniku z tego konta {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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Zapisz", "common.button.save": "Zapisz",
"common.button.create": "Utwórz", "common.button.create": "Utwórz",
"common.button.submit": "Zgłoś", "common.button.submit": "Prześlij",
"common.button.delete": "Usuń", "common.button.delete": "Usuń",
"common.button.cancel": "Anuluj", "common.button.cancel": "Anuluj",
"common.button.confirm": "Potwierdź", "common.button.confirm": "Potwierdź",
@@ -387,6 +404,7 @@ 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": "Go to the link",
"common.text.or": "lub", "common.text.or": "lub",
"common.button.go-back": "Wróć", "common.button.go-back": "Wróć",
"common.notify.copied": "Link został skopiowany do schowka", "common.notify.copied": "Link został skopiowany do schowka",

View File

@@ -33,7 +33,7 @@ export default {
"signin.button.submit": "Iniciar sessão", "signin.button.submit": "Iniciar sessão",
"signIn.notify.totp-required.title": "Autenticação de dois fatores necessária", "signIn.notify.totp-required.title": "Autenticação de dois fatores necessária",
"signIn.notify.totp-required.description": "Insira seu código de autenticação de dois fatores", "signIn.notify.totp-required.description": "Insira seu código de autenticação de dois fatores",
"signIn.oauth.or": "OR", "signIn.oauth.or": "OU",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -51,8 +51,8 @@ export default {
"signup.button.submit": "Vamos começar", "signup.button.submit": "Vamos começar",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "Autenticação TOTP",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Iniciar sessão",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Esqueceu a sua senha?", "resetPassword.title": "Esqueceu a sua senha?",
@@ -72,20 +72,20 @@ 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": "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": "Você não tem uma senha definida. Se quiser entrar com e-mail e senha você precisa definir uma senha.",
"account.notify.password.success": "Senha alterada com sucesso", "account.notify.password.success": "Senha alterada com sucesso",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Login com Redes Sociais",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Vincular",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Desvincular",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Desvinculado",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Desvincular conta",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.", "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": "Unlinked successfully", "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",
"account.card.security.totp.disable.description": "Digite a sua senha atual para desabilitar o TOTP", "account.card.security.totp.disable.description": "Digite a sua senha atual para desabilitar o TOTP",
@@ -214,6 +214,7 @@ export default {
"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": "Nunca expira",
"upload.modal.expires.error.too-long": "Expiração excede a data de expiração máxima 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",
@@ -234,7 +235,7 @@ export default {
"upload.modal.accordion.email.placeholder": "Insira os destinatários do e-mail", "upload.modal.accordion.email.placeholder": "Insira os destinatários do e-mail",
"upload.modal.accordion.email.invalid-email": "Endereço de e-mail inválido", "upload.modal.accordion.email.invalid-email": "Endereço de e-mail inválido",
"upload.modal.accordion.security.title": "Opções de segurança", "upload.modal.accordion.security.title": "Opções de segurança",
"upload.modal.accordion.security.password.label": "Protecção por senha", "upload.modal.accordion.security.password.label": "Proteção por senha",
"upload.modal.accordion.security.password.placeholder": "Sem senha", "upload.modal.accordion.security.password.placeholder": "Sem senha",
"upload.modal.accordion.security.max-views.label": "Máximo de visualizações", "upload.modal.accordion.security.max-views.label": "Máximo de visualizações",
"upload.modal.accordion.security.max-views.placeholder": "Sem limite", "upload.modal.accordion.security.max-views.placeholder": "Sem limite",
@@ -261,15 +262,21 @@ 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 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": "Uma pré-visualização para este tipo de arquivo não é suportada. Faça o download do arquivo para visualizá-lo.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Editar {shareId}",
"share.edit.append-upload": "Anexar arquivo",
"share.edit.notify.generic-error": "Ocorreu um erro ao terminar seu compartilhamento.",
"share.edit.notify.save-success": "Compartilhamento atualizado com sucesso",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Configuração", "admin.config.title": "Configuração",
"admin.config.category.general": "Geral", "admin.config.category.general": "Geral",
"admin.config.category.share": "Compartilhamento", "admin.config.category.share": "Compartilhamento",
"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": "Social Login", "admin.config.category.oauth": "Login com Redes Sociais",
"admin.config.general.app-name": "Nome da aplicação", "admin.config.general.app-name": "Nome da aplicação",
"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",
@@ -301,6 +308,8 @@ export default {
"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.description": "Validade máxima de ações em horas. Defina 0 para permitir expiração ilimitada.",
"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 em bytes",
"admin.config.share.zip-compression-level": "Nível de compressão", "admin.config.share.zip-compression-level": "Nível de compressão",
@@ -318,63 +327,71 @@ export default {
"admin.config.smtp.password": "Senha", "admin.config.smtp.password": "Senha",
"admin.config.smtp.password.description": "Senha do servidor SMTP", "admin.config.smtp.password.description": "Senha do servidor SMTP",
"admin.config.smtp.button.test": "Enviar email de teste", "admin.config.smtp.button.test": "Enviar email de teste",
"admin.config.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Permitir registro",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Permitir que os usuários se registrem através do login de redes sociais",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "Ignorar TOTP",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "Ignorar o TOTP quando usuário usando login social",
"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": "Se o login GitHub está habilitado",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "Client ID do GitHub",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app", "admin.config.oauth.github-client-id.description": "ID do cliente do aplicativo GitHub OAuth",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "Client Secret do GitHub",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "ID do cliente do aplicativo GitHub OAuth",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Se o login GitHub está habilitado",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "Client ID do Google",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "ID do cliente do aplicativo GitHub OAuth",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "Client Secret do Google",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Client secret do aplicativo GitHub OAuth",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Se o Microsoft login 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": "O ID do Tenant do app Microsoft OAuth\ncomum: Usuários com uma conta pessoal da Microsoft e uma conta de trabalho ou escola do Microsoft Entra podem entrar no aplicativo. organizações: somente usuários com contas de trabalho ou de escola do Microsoft Entra ID podem entrar no aplicativo.\nconsumidores: Somente usuários com uma conta pessoal da Microsoft podem acessar o aplicativo.\nnome de domínio do tenant Microsoft Entra ou do ID do inquilino no formato GUID: Somente usuários de um tenant Microsoft Entra específico (membros do diretório com uma conta de trabalho ou de diretório com uma conta pessoal da Microsoft) podem entrar no aplicativo.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "ID do Cliente Microsoft",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "ID do cliente do aplicativo Microsoft OAuth",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret", "admin.config.oauth.microsoft-client-secret": "Segredo do Cliente Microsoft",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "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": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "Se o login do Discord está habilitado",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-limited-guild": "ID do servidor limitado do Discord",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "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-secret": "Discord Client secret", "admin.config.oauth.discord-client-id": "ID do Cliente Discord",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "ID do cliente do aplicativo Discord OAuth",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.discord-client-secret": "Segredo do Cliente Discord",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.discord-client-secret.description": "ID do cliente do aplicativo Discord OAuth",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-enabled": "Conectar o OpenID",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-enabled.description": "Se o login do OpenID Connect está ativado",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-discovery-uri": "URI de descoberta do OpenID Connect",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "URI da descoberta do aplicativo OpenID Connect OAuth",
"admin.config.oauth.oidc-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-username-claim": "Reivindicação de nome de usuário OpenID Connect",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "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-client-id": "ID do cliente OpenID Connect",
"admin.config.oauth.oidc-client-id.description": "ID do cliente do aplicativo OpenID OAuth",
"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",
// 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",
// error // error
"error.title": "Error", "error.title": "Erro",
"error.description": "Oops!", "error.description": "Oops!",
"error.button.back": "Go back", "error.button.back": "Voltar",
"error.msg.default": "Something went wrong.", "error.msg.default": "Algo deu errado.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "Você cancelou o processo de autenticação, por favor, tente novamente.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "O processo de autenticação demorou muito. Por favor, tente novamente.",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Erro interno",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "O usuário vinculado a esta conta {0} não existe.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "Não é possível obter o endereço de e-mail desta conta {0}.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.already_linked": "Esta conta {0} já está vinculada a outra conta.",
"error.msg.not_linked": "Esta conta {0} ainda não foi vinculada a nenhuma conta.",
"error.msg.unverified_account": "Esta conta {0} não foi verificada, tente novamente após a verificação.",
"error.msg.discord_guild_permission_denied": "Você não tem permissão para acessar.",
"error.msg.cannot_get_user_info": "Não é possível obter suas informações de usuário desta conta {0}.",
"error.param.provider_github": "GitHub", "error.param.provider_github": "GitHub",
"error.param.provider_google": "Google", "error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Salvar", "common.button.save": "Salvar",
"common.button.create": "Criar", "common.button.create": "Criar",
@@ -387,6 +404,7 @@ 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.or": "ou", "common.text.or": "ou",
"common.button.go-back": "Voltar", "common.button.go-back": "Voltar",
"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",

View File

@@ -33,7 +33,7 @@ export default {
"signin.button.submit": "Вход", "signin.button.submit": "Вход",
"signIn.notify.totp-required.title": "Требуется двухфакторная аутентификация", "signIn.notify.totp-required.title": "Требуется двухфакторная аутентификация",
"signIn.notify.totp-required.description": "Пожалуйста, введите код Вашей 2-х факторной аутентификации", "signIn.notify.totp-required.description": "Пожалуйста, введите код Вашей 2-х факторной аутентификации",
"signIn.oauth.or": "OR", "signIn.oauth.or": "ИЛИ",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -51,8 +51,8 @@ export default {
"signup.button.submit": "Давайте начнём", "signup.button.submit": "Давайте начнём",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "Авторизация TOTP",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Войти",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Забыли пароль?", "resetPassword.title": "Забыли пароль?",
@@ -72,20 +72,20 @@ export default {
"account.card.password.title": "Пароль", "account.card.password.title": "Пароль",
"account.card.password.old": "Старый пароль", "account.card.password.old": "Старый пароль",
"account.card.password.new": "Новый пароль", "account.card.password.new": "Новый пароль",
"account.card.password.noPasswordSet": "You 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": "У вас не установлен пароль. Если вы хотите войти с помощью электронной почты и пароля, вам необходимо установить пароль.",
"account.notify.password.success": "Пароль успешно изменён", "account.notify.password.success": "Пароль успешно изменён",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Авторизация через социальные сети",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Подключить",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Отключить",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Отключен",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Отключить связь с учетной записью",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.", "account.modal.unlink.description": "Отключение связи с учетной записью социальных аккаунтов может привести к потере вашей учетной записи, если вы не помните свое имя пользователя и пароль.",
"account.notify.oauth.unlinked.success": "Unlinked successfully", "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",
"account.card.security.totp.disable.description": "Введите ваш текущий пароль, чтобы отключить TOTP", "account.card.security.totp.disable.description": "Введите ваш текущий пароль, чтобы отключить TOTP",
@@ -134,7 +134,7 @@ export default {
"account.reverseShares.title.empty": "Тут пусто 👀", "account.reverseShares.title.empty": "Тут пусто 👀",
"account.reverseShares.description.empty": "У вас пока нет обратных загрузок.", "account.reverseShares.description.empty": "У вас пока нет обратных загрузок.",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Create reverse share", "account.reverseShares.modal.title": "Создать обратную ссылку на файл",
"account.reverseShares.modal.expiration.label": "Истекает", "account.reverseShares.modal.expiration.label": "Истекает",
"account.reverseShares.modal.expiration.minute-singular": "Минута", "account.reverseShares.modal.expiration.minute-singular": "Минута",
"account.reverseShares.modal.expiration.minute-plural": "Минут(ы)", "account.reverseShares.modal.expiration.minute-plural": "Минут(ы)",
@@ -214,6 +214,7 @@ export default {
"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.link.label": "Ссылка", "upload.modal.link.label": "Ссылка",
"upload.modal.expires.label": "Истекает", "upload.modal.expires.label": "Истекает",
"upload.modal.expires.minute-singular": "Минута", "upload.modal.expires.minute-singular": "Минута",
@@ -261,15 +262,21 @@ 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": "Предварительный просмотр этого типа файла не поддерживается. Пожалуйста, скачайте файл для его просмотра.", "share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Редактировать {shareId}",
"share.edit.append-upload": "Добавить файл",
"share.edit.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.",
"share.edit.notify.save-success": "Ссылка на ресурс успешна обновлена",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Конфигурация", "admin.config.title": "Конфигурация",
"admin.config.category.general": "Общее", "admin.config.category.general": "Общее",
"admin.config.category.share": "Загрузки", "admin.config.category.share": "Загрузки",
"admin.config.category.email": "Электронная почта", "admin.config.category.email": "Электронная почта",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "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": "URL-адрес приложения", "admin.config.general.app-url": "URL-адрес приложения",
@@ -301,6 +308,8 @@ export default {
"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.description": "Максимальный срок действия общего доступа в часах. Установите значение 0, чтобы разрешить неограниченный срок действия.",
"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",
@@ -318,63 +327,71 @@ export default {
"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.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Разрешить регистрацию",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Разрешить пользователям регистрироваться используя учетные записи социальных сетей",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "Игнорировать TOTP",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "Игнорировать TOTP при использовании социальной авторизации",
"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": "Включен ли логин на GitHub",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "ID клиента GitHub",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app", "admin.config.oauth.github-client-id.description": "ID клиента в приложении GitHub OAuth",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "Секретный ключ клиента GitHub",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "Секретный ключ клиента в приложении GitHub OAuth",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Включен ли логин Google на GitHub",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "ID клиента Google",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "ID клиента в приложении Google OAuth",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "Секретный ключ клиента Google",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Секретный ключ клиента в приложении Google OAuth",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Включен ли логин Microsoft",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant", "admin.config.oauth.microsoft-tenant": "Корпоративный аккаунт Microsoft",
"admin.config.oauth.microsoft-tenant.description": "Tenant ID of the Microsoft OAuth app\ncommon: Users with both a personal Microsoft account and a work or school account from Microsoft Entra ID can sign in to the application. organizations: Only users with work or school accounts from Microsoft Entra ID can sign in to the application.\nconsumers: Only users with a personal Microsoft account can sign in to the application.\ndomain name of the Microsoft Entra tenant or the tenant ID in GUID format: Only users from a specific Microsoft Entra tenant (directory members with a work or school account or directory guests with a personal Microsoft account) can sign in to the application.", "admin.config.oauth.microsoft-tenant.description": "Идентификатор арендатора приложения Microsoft OAuth\ncommon: Пользователи с личным аккаунтом Microsoft и рабочим или учебным аккаунтом от Microsoft Entra ID могут войти в приложение. organizations: Только пользователи с рабочим или учебным аккаунтом от Microsoft Entra ID могут войти в приложение.\nconsumers: Только пользователи с личным аккаунтом Microsoft могут войти в приложение.\nимя домена арендатора Microsoft Entra или идентификатор арендатора в формате GUID: Только пользователи из определенного арендатора Microsoft Entra (участники каталога с рабочим или учебным аккаунтом или гости каталога с личным аккаунтом Microsoft) могут войти в приложение.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "Идентификатор клиента Microsoft",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "ID клиента в приложении Microsoft OAuth",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret", "admin.config.oauth.microsoft-client-secret": "Секретный ключ клиента Microsoft",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "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": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "Включен ли логин Discord",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-limited-guild": "ID ограниченного сервера Discord",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-limited-guild.description": "Ограничение входа для пользователей определенного сервера. Оставьте пустым, чтобы отключить.",
"admin.config.oauth.discord-client-secret": "Discord Client secret", "admin.config.oauth.discord-client-id": "ID клиента Discord",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "ID клиента в приложении Discord OAuth",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.discord-client-secret": "Секретный ключ клиента Discord",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.discord-client-secret.description": "Секретный ключ клиента в приложении Discord OAuth",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 404 // 404
"404.description": "Упс, этой страницы не существует.", "404.description": "Упс, этой страницы не существует.",
"404.button.home": "Верните меня домой", "404.button.home": "Верните меня домой",
// error // error
"error.title": "Error", "error.title": "Ошибка",
"error.description": "Oops!", "error.description": "Что-то пошло не так!",
"error.button.back": "Go back", "error.button.back": "Назад",
"error.msg.default": "Something went wrong.", "error.msg.default": "Что-то пошло не так.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "Вы отменили процесс аутентификации, пожалуйста, попробуйте еще раз.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "Процесс аутентификации занял слишком много времени, пожалуйста, попробуйте еще раз.",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Внутренняя ошибка",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "Пользователь связанный с учетной записью {0} не существует.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "Не удается получить адрес электронной почты от учетной записи {0}.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.already_linked": "Эта учетная запись {0} уже привязана к другому аккаунту.",
"error.msg.not_linked": "Эта учетная запись {0} ещё не привязана ни к одному аккаунту.",
"error.msg.unverified_account": "Эта учетная запись {0} не подтверждена, повторите попытку после подтверждения.",
"error.msg.discord_guild_permission_denied": "У вас нет разрешения на вход.",
"error.msg.cannot_get_user_info": "Can not 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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Сохранить", "common.button.save": "Сохранить",
"common.button.create": "Создать", "common.button.create": "Создать",
@@ -387,6 +404,7 @@ 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.or": "или", "common.text.or": "или",
"common.button.go-back": "Назад", "common.button.go-back": "Назад",
"common.notify.copied": "Ваша ссылка скопирована в буфер обмена", "common.notify.copied": "Ваша ссылка скопирована в буфер обмена",

View File

@@ -0,0 +1,420 @@
export default {
// Navbar
"navbar.upload": "Naloži",
"navbar.signin": "Vpis",
"navbar.home": "Domov",
"navbar.signup": "Registracija",
"navbar.links.shares": "Moja deljenja",
"navbar.links.reverse": "Deljenja v obratni smeri",
"navbar.avatar.account": "Moj račun",
"navbar.avatar.admin": "Administracija",
"navbar.avatar.signout": "Odjava",
// END navbar
// /
"home.title": "Platforma za deljenje datotek z <h>lastnim gostovanjem</h>.",
"home.description": "Ali res želite predati svoje osebne datoteke v roke tretjih oseb, kot je WeTransfer?",
"home.bullet.a.name": "Lastno-Gostovanje",
"home.bullet.a.description": "Gostuj Pingvin Share na svoji lastni napravi.",
"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.c.name": "Brez nadležnih omejitev velikosti datoteke",
"home.bullet.c.description": "Naložite datoteke, velike kolikor želite. Omejuje vas samo vaš disk.",
"home.button.start": "Začnite zdaj",
"home.button.source": "Izvorna koda",
// END /
// /auth/signin
"signin.title": "Dobrodošli nazaj",
"signin.description": "Še nimate računa?",
"signin.button.signup": "Registrirajte se",
"signin.input.email-or-username": "E-pošta ali uporabniško ime",
"signin.input.email-or-username.placeholder": "Vaša e-pošta ali uporabniško ime",
"signin.input.password": "Geslo",
"signin.input.password.placeholder": "Vaše geslo",
"signin.button.submit": "Prijava",
"signIn.notify.totp-required.title": "Zahtevana je dvofaktorska avtentikacija",
"signIn.notify.totp-required.description": "Prosim vnesite vašo kodo dvofaktorske avtentikacije",
"signIn.oauth.or": "ALI",
"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": "Ustvarite račun",
"signup.description": "Že imate račun?",
"signup.button.signin": "Prijava",
"signup.input.username": "Uporabniško ime",
"signup.input.username.placeholder": "Vaše uporabniško ime",
"signup.input.email": "E-pošta",
"signup.input.email.placeholder": "Vaš e-poštni naslov",
"signup.button.submit": "Pa začnimo",
// END /auth/signup
// /auth/totp
"totp.title": "TOTP Avtentikacija",
"totp.button.signIn": "Prijava",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Ste pozabili svoje geslo?",
"resetPassword.description": "Vnesite svoj e-poštni naslov za ponastavitev gesla.",
"resetPassword.notify.success": "Poslali smo e-pošto s povezavo do spremembe gesla.",
"resetPassword.button.back": "Nazaj na stran za prijavo",
"resetPassword.text.resetPassword": "Ponastavi geslo",
"resetPassword.text.enterNewPassword": "Vnesite novo geslo",
"resetPassword.input.password": "Novo geslo",
"resetPassword.notify.passwordReset": "Vaše geslo je bilo uspešno ponastavljeno.",
// /account
"account.title": "Moj račun",
"account.card.info.title": "Informacije o računu",
"account.card.info.username": "Uporabniško ime",
"account.card.info.email": "E-pošta",
"account.notify.info.success": "Račun je bil uspešno posodobljen",
"account.card.password.title": "Geslo",
"account.card.password.old": "Staro 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.notify.password.success": "Geslo je bilo uspešno posodobljeno",
"account.card.oauth.title": "Prijava z računi družbenih omrežij",
"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": "Odstrani povezavo",
"account.card.oauth.unlinked": "Povezava je odstranjena",
"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.notify.oauth.unlinked.success": "Povezava je bila uspešno odstranjena",
"account.card.security.title": "Varnost",
"account.card.security.totp.enable.description": "Vnesite vašo trenutno geslo, da omogočite TOTP",
"account.card.security.totp.disable.description": "Vnesite vašo trenutno geslo, da onemogočite TOTP",
"account.card.security.totp.button.start": "Začni",
"account.modal.totp.title": "Omogoči TOTP",
"account.modal.totp.step1": "1. Korak: Dodajte avtentikator",
"account.modal.totp.step2": "2. Korak: Potrdite svojo kodo",
"account.modal.totp.enterManually": "Vnesite ročno",
"account.modal.totp.code": "Koda",
"account.modal.totp.clickToCopy": "Kliknite za kopiranje",
"account.modal.totp.verify": "Preveri",
"account.notify.totp.disable": "TOTP je uspešno onemogočen",
"account.notify.totp.enable": "TOTP je uspešno omogočen",
"account.card.language.title": "Jezik",
"account.card.language.description": "Projekt je preveden s pomočjo skupnosti. Nekateri jeziki morda niso popolno prevedeni.",
"account.card.color.title": "Barvna shema",
// ThemeSwitcher.tsx
"account.theme.dark": "Temna",
"account.theme.light": "Svetla",
"account.theme.system": "Sistemska",
"account.button.delete": "Izbrišite račun",
"account.modal.delete.title": "Izbrišite račun",
"account.modal.delete.description": "Ali res želite izbrisati vaš račun vključno z vsemi vašimi deljenji?",
// END /account
// /account/shares
"account.shares.title": "Moja deljenja",
"account.shares.title.empty": "Prazno je 👀",
"account.shares.description.empty": "Nimate nobenih deljenj.",
"account.shares.button.create": "Ustvarite ga",
"account.shares.info.title": "Delite informacije",
"account.shares.table.id": "ID",
"account.shares.table.name": "Ime",
"account.shares.table.description": "Opis",
"account.shares.table.visitors": "Obiskovalci",
"account.shares.table.expiresAt": "Poteče dne",
"account.shares.table.createdAt": "Ustvarjeno dne",
"account.shares.table.size": "Velikost",
"account.shares.modal.share-informations": "Delite informacije",
"account.shares.modal.share-link": "Delite povezavo",
"account.shares.modal.delete.title": "Izbrišite delitev {share}",
"account.shares.modal.delete.description": "Ali res želite izbrisati to delitev?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Delitev v obratni smeri",
"account.reverseShares.description": "Delitev v obratni smeri vam omogoča, da generirate unikaten URL, ki omogoča zunanjim uporabnikom ustvariti delitev.",
"account.reverseShares.title.empty": "Prazno je 👀",
"account.reverseShares.description.empty": "Nimate nobenih delitev v obratni smeri.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Ustvari delitev v obratni smeri",
"account.reverseShares.modal.expiration.label": "Zapadlost",
"account.reverseShares.modal.expiration.minute-singular": "Minuta",
"account.reverseShares.modal.expiration.minute-plural": "Minute",
"account.reverseShares.modal.expiration.hour-singular": "Ura",
"account.reverseShares.modal.expiration.hour-plural": "Ure",
"account.reverseShares.modal.expiration.day-singular": "Dan",
"account.reverseShares.modal.expiration.day-plural": "Dnevi",
"account.reverseShares.modal.expiration.week-singular": "Teden",
"account.reverseShares.modal.expiration.week-plural": "Tedni",
"account.reverseShares.modal.expiration.month-singular": "Mesec",
"account.reverseShares.modal.expiration.month-plural": "Meseci",
"account.reverseShares.modal.expiration.year-singular": "Leto",
"account.reverseShares.modal.expiration.year-plural": "Leta",
"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.description": "Pošlji e-poštno obvestilo, ko je ustvarjena delitev s povezavo te delitve v obratni smeri.",
"account.reverseShares.modal.max-use.label": "Največ uporab",
"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.expires-on": "Ta delitev v obratni smeri bo potekla {expiration}.",
"account.reverseShares.table.no-shares": "Nimate še ustvarjenih delitev",
"account.reverseShares.table.count.singular": "delitev",
"account.reverseShares.table.count.plural": "delitve",
"account.reverseShares.table.shares": "Delitve",
"account.reverseShares.table.remaining": "Preostale uporabe",
"account.reverseShares.table.max-size": "Največja velikost delitve",
"account.reverseShares.table.expires": "Poteče dne",
"account.reverseShares.modal.reverse-share-link": "Povezava delitve v obratni smeri",
"account.reverseShares.modal.delete.title": "Izbriši delitev v obratni smeri",
"account.reverseShares.modal.delete.description": "Ali res želite izbrisati to delitev v obratni smeri? Če boste izbrisali, bodo izbrisane tudi povezane delitve.",
// END /account/reverseShares
// /admin
"admin.title": "Administracija",
"admin.button.users": "Upravljanje uporabnikov",
"admin.button.config": "Nastavitve",
"admin.version": "Različica",
// END /admin
// /admin/users
"admin.users.title": "Upravljanje uporabnikov",
"admin.users.table.username": "Uporabniško ime",
"admin.users.table.email": "E-pošta",
"admin.users.table.admin": "Administrator",
"admin.users.edit.update.title": "Uredi uporabnika {username}",
"admin.users.edit.update.admin-privileges": "Administratorski privilegiji",
"admin.users.edit.update.change-password.title": "Spremenite geslo",
"admin.users.edit.update.change-password.field": "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.delete.title": "Izbrišite uporabnika {username}",
"admin.users.edit.delete.description": "Ali res želite izbrisati tega uporabnika in vsa njegova deljenja?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Ustvarite uporabnika",
"admin.users.modal.create.username": "Uporabniško ime",
"admin.users.modal.create.email": "E-pošta",
"admin.users.modal.create.password": "Geslo",
"admin.users.modal.create.manual-password": "Ročno nastavite geslo",
"admin.users.modal.create.manual-password.description": "Če je omogočeno, bo uporabnik prejel e-poštno sporočilo s povezavo do nastavitve gesla.",
"admin.users.modal.create.admin": "Administratorski privilegiji",
"admin.users.modal.create.admin.description": "Če je omogočeno, bo lahko porabnik dostopal do administratorskega vmesnika.",
// END /admin/users
// /upload
"upload.title": "Naložite",
"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.",
// Dropzone.tsx
"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.notify.file-too-big": "Vaše datoteke presegajo največjo dovoljeno velikost {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Ime",
"upload.filelist.size": "Velikost",
// showCreateUploadModal.tsx
"upload.modal.title": "Ustvarite delitev",
"upload.modal.link.error.invalid": "Lahko vsebuje samo črke, številke, podčrtaje in pomišljaje",
"upload.modal.link.error.taken": "Ta povezava je že v uporabi",
"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.expires.never": "nikoli",
"upload.modal.expires.never-long": "Nikoli ne poteče",
"upload.modal.expires.error.too-long": "Dan poteka presega najvišji datum poteka {max}.",
"upload.modal.link.label": "Povezava",
"upload.modal.expires.label": "Zapadlost",
"upload.modal.expires.minute-singular": "Minuta",
"upload.modal.expires.minute-plural": "Minute",
"upload.modal.expires.hour-singular": "Ura",
"upload.modal.expires.hour-plural": "Ure",
"upload.modal.expires.day-singular": "Dan",
"upload.modal.expires.day-plural": "Dnevi",
"upload.modal.expires.week-singular": "Teden",
"upload.modal.expires.week-plural": "Tedni",
"upload.modal.expires.month-singular": "Mesec",
"upload.modal.expires.month-plural": "Meseci",
"upload.modal.expires.year-singular": "Leto",
"upload.modal.expires.year-plural": "Leta",
"upload.modal.accordion.description.title": "Opis",
"upload.modal.accordion.description.placeholder": "Sporočilo za prejemnika te delitve",
"upload.modal.accordion.email.title": "Prejemnik e-pošte",
"upload.modal.accordion.email.placeholder": "Vnesite prejemnika e-pošte",
"upload.modal.accordion.email.invalid-email": "Neveljaven e-poštni naslov",
"upload.modal.accordion.security.title": "Varnostne možnosti",
"upload.modal.accordion.security.password.label": "Zaščita z geslom",
"upload.modal.accordion.security.password.placeholder": "Brez gesla",
"upload.modal.accordion.security.max-views.label": "Največje število ogledov",
"upload.modal.accordion.security.max-views.placeholder": "Brez omejitve",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Ta delitev ne bo nikoli potekla.",
"upload.modal.completed.expires-on": "Ta delitev bo potekla {expiration}.",
"upload.modal.completed.share-ready": "Delitev je pripravljena",
// END /upload
// /share/[id]
"share.title": "Deli {shareId}",
"share.description": "Poglej kaj sem delil s taboj!",
"share.error.visitor-limit-exceeded.title": "Število ogledov je prekoračena",
"share.error.visitor-limit-exceeded.description": "Število ogledov za to delitev je bila prekoračena.",
"share.error.removed.title": "Delitev je odstranjena",
"share.error.not-found.title": "Delitve ni mogoče najti",
"share.error.not-found.description": "Delitev, ki jo iščete ne obstaja.",
"share.modal.password.title": "Zahtevano geslo",
"share.modal.password.description": "Za ogled delitve vnesite geslo te delitve.",
"share.modal.password": "Geslo",
"share.modal.error.invalid-password": "Napačno geslo",
"share.button.download-all": "Prenesi vse",
"share.notify.download-all-preparing": "Delitev je v pripravi. Prosimo poskusite ponovno čez nekaj minut.",
"share.modal.file-link": "Povezava do datoteke",
"share.table.name": "Ime",
"share.table.size": "Velikost",
"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.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Uredite {shareId}",
"share.edit.append-upload": "Dodaj datoteko",
"share.edit.notify.generic-error": "Prišlo je do napake pri ustvarjanju vaše delitve.",
"share.edit.notify.save-success": "Delitev je bila uspešno posodbljena",
// END /share/[id]/edit
// /admin/config
"admin.config.title": "Nastavitve",
"admin.config.category.general": "Splošno",
"admin.config.category.share": "Delitev",
"admin.config.category.email": "E-pošta",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Prijava z računi družbenih omrežij",
"admin.config.general.app-name": "Ime aplikacije",
"admin.config.general.app-name.description": "Ime vaše aplikacije",
"admin.config.general.app-url": "URL aplikacije",
"admin.config.general.app-url.description": "Na katerem URL-ju je dostopen Pingvin Share",
"admin.config.general.show-home-page": "Prikaži domačo stran",
"admin.config.general.show-home-page.description": "Ali prikazati domačo stran",
"admin.config.general.logo": "Logotip",
"admin.config.general.logo.description": "Naložite novo sliko, da spremenite logotip. Datoteka mora biti tipa PNG in imeti razmerje 1:1.",
"admin.config.general.logo.placeholder": "Izberite sliko",
"admin.config.email.enable-share-email-recipients": "Omogoči prejemnike delitve po e-pošti",
"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.share-recipients-subject": "Zadeva poslane delitve",
"admin.config.email.share-recipients-subject.description": "Zadeva e-poštnega sporočila, ki bo poslan prejemnikom delitve.",
"admin.config.email.share-recipients-message": "Vsebina poslane delitve",
"admin.config.email.share-recipients-message.description": "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.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-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.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-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.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-message": "Vsebina povabila",
"admin.config.email.invite-message.description": "Sporočilo, ki se pošlje, ko administrator povabi uporabnika. {url} bo zamenjan s povezavo do povabila, {password} pa z geslom.",
"admin.config.share.allow-registration": "Dovoli registracijo",
"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.description": "Če lahko neprijavljeni uporabniki ustvarijo delitve",
"admin.config.share.max-expiration": "Najvišja zapadlost",
"admin.config.share.max-expiration.description": "Najvišja zapadlost delitve v urah. Nastavljeno na 0 pomeni brez zapadlosti.",
"admin.config.share.max-size": "Največja velikost",
"admin.config.share.max-size.description": "Največja velikost delitve v bytih",
"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.smtp.enabled": "Omogočeno",
"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.description": "Gostitelj SMTP strežnika",
"admin.config.smtp.port": "Vrata",
"admin.config.smtp.port.description": "Vrata SMTP strežnika",
"admin.config.smtp.email": "E-pošta",
"admin.config.smtp.email.description": "E-poštni naslov, s katerega bodo poslana e-poštna sporočila",
"admin.config.smtp.username": "Uporabniško ime",
"admin.config.smtp.username.description": "Uporabniško ime SMTP strežnika",
"admin.config.smtp.password": "Geslo",
"admin.config.smtp.password.description": "Geslo SMTP strežnika",
"admin.config.smtp.button.test": "Pošlji testno sporočilo",
"admin.config.oauth.allow-registration": "Dovoli registracijo",
"admin.config.oauth.allow-registration.description": "Dovoli registracijo uporabnika prek družbenih omrežij",
"admin.config.oauth.ignore-totp": "Ignoriraj TOTP",
"admin.config.oauth.ignore-totp.description": "Če ignorirati TOTP, ko se uporabnik registrira prek družbenih omrežij",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Če je dovoljena prijava z GitHub računom",
"admin.config.oauth.github-client-id": "GitHub ID klienta",
"admin.config.oauth.github-client-id.description": "ID klienta GitHub OAuth aplikacije",
"admin.config.oauth.github-client-secret": "GitHub skrivnost klienta",
"admin.config.oauth.github-client-secret.description": "Skrivnost klienta GitHub OAuth aplikacije",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Če je dovoljena prijava z Google računom",
"admin.config.oauth.google-client-id": "Google ID klienta",
"admin.config.oauth.google-client-id.description": "ID Klienta Google OAuth aplikacije",
"admin.config.oauth.google-client-secret": "Skrivnost Google klienta",
"admin.config.oauth.google-client-secret.description": "Skrivnost klienta Google OAuth aplikacije",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Če je dovoljena prijava z Microsoft računom",
"admin.config.oauth.microsoft-tenant": "Microsoft najemnik",
"admin.config.oauth.microsoft-tenant.description": "ID identitete Microsoft OAuth aplikacije\nobičajno: V aplikacijo se lahko prijavijo uporabniki osebnega Microsoft računa in službenega ali šolskega računa z Microsoft Entra ID.\norganizacije: V aplikacijo se lahko prijavijo samo uporabniki službenega ali šolskega računa z Microsoft Entra ID.\nuporabniki: V aplikacijo se lahko prijavijo samo uporabniki osebnega Microsoft računa.\ndomensko ime Microsoft Entra identitete ali ID identitete v formatu GUID: V aplikacijo se lahko prijavijo samo uporabniki specifične Microsoft Entra identitete (člani imenika s službenim ali šolskim računom ali gosti imenika z osebnim Microsoft računom).",
"admin.config.oauth.microsoft-client-id": "Microsoft ID klienta",
"admin.config.oauth.microsoft-client-id.description": "ID Klienta Microsoft OAuth aplikacije",
"admin.config.oauth.microsoft-client-secret": "Skrivnost Microsoft klienta",
"admin.config.oauth.microsoft-client-secret.description": "Skrivnost klienta Microsoft OAuth aplikacije",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Če je dovoljena prijava z Discord računom",
"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-client-id": "Discord ID klienta",
"admin.config.oauth.discord-client-id.description": "ID klienta Discord OAuth aplikacije",
"admin.config.oauth.discord-client-secret": "Discord skrivnost klienta",
"admin.config.oauth.discord-client-secret.description": "Skrivnost klienta Discord OAuth aplikacije",
"admin.config.oauth.oidc-enabled": "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.description": "URI za odkrivanje OpenID Connect OAuth aplikacije",
"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-client-id": "OpenID Connect ID klienta",
"admin.config.oauth.oidc-client-id.description": "ID Klienta OpenID Connect OAuth aplikacije",
"admin.config.oauth.oidc-client-secret": "OpenID Connect skrivnost klienta",
"admin.config.oauth.oidc-client-secret.description": "Skrivnost klienta OpenID Connect OAuth aplikacije",
// 404
"404.description": "Ups! Ta stran ne obstaja.",
"404.button.home": "Pelji me domov",
// error
"error.title": "Napaka",
"error.description": "Ups!",
"error.button.back": "Nazaj",
"error.msg.default": "Prišlo je do napake.",
"error.msg.access_denied": "Prekinili ste proces prijave, prosimo poskusite ponovno.",
"error.msg.expired_token": "Proces prijave je trajal predolgo, prosimo poskusite ponovno.",
"error.msg.invalid_token": "Interna napaka",
"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.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.unverified_account": "Račun {0} je nepreverjen, prosimo poskusite ponovno po preverjanju.",
"error.msg.discord_guild_permission_denied": "Nimate dovoljenja za prijavo.",
"error.msg.cannot_get_user_info": "Ne moremo najti uporabniških informacij za račun {0}.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID Connect",
// Common translations
"common.button.save": "Shrani",
"common.button.create": "Ustvari",
"common.button.submit": "Pošlji",
"common.button.delete": "Izbriši",
"common.button.cancel": "Prekliči",
"common.button.confirm": "Potrdi",
"common.button.disable": "Onemogoči",
"common.button.share": "Deli",
"common.button.generate": "Generiraj",
"common.button.done": "Končano",
"common.text.link": "Poveži",
"common.text.navigate-to-link": "Pojdi na povezavo",
"common.text.or": "ali",
"common.button.go-back": "Nazaj",
"common.notify.copied": "Povezava je bila kopirana v odložišče",
"common.success": "Uspešno",
"common.error": "Napaka",
"common.error.unknown": "Prišlo je do neznane napake",
"common.error.invalid-email": "Neveljaven e-poštni naslov",
"common.error.too-short": "Vsebovati mora vsaj {length} znakov",
"common.error.too-long": "Vsebuje lahko največ {length} znakov",
"common.error.exact-length": "Dolžina mora biti točno {length} znakov",
"common.error.invalid-number": "Mora biti številka",
"common.error.field-required": "To polje je obvezno"
};

View File

@@ -33,7 +33,7 @@ export default {
"signin.button.submit": "Пријавите се", "signin.button.submit": "Пријавите се",
"signIn.notify.totp-required.title": "Потребна је двофакторска аутентификација", "signIn.notify.totp-required.title": "Потребна је двофакторска аутентификација",
"signIn.notify.totp-required.description": "Унесите свој двофакторски код за аутентификацију", "signIn.notify.totp-required.description": "Унесите свој двофакторски код за аутентификацију",
"signIn.oauth.or": "OR", "signIn.oauth.or": "Или",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "Google",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
@@ -51,8 +51,8 @@ export default {
"signup.button.submit": "Хајде да почнемо", "signup.button.submit": "Хајде да почнемо",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "ТОТП аутентификација",
"totp.button.signIn": "Sign in", "totp.button.signIn": "Пријавите се",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "Заборавили сте лозинку?", "resetPassword.title": "Заборавили сте лозинку?",
@@ -72,20 +72,20 @@ export default {
"account.card.password.title": "Лозинка", "account.card.password.title": "Лозинка",
"account.card.password.old": "Стара лозинка", "account.card.password.old": "Стара лозинка",
"account.card.password.new": "Нова лозинка", "account.card.password.new": "Нова лозинка",
"account.card.password.noPasswordSet": "You 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": "Немате постављену лозинку. Ако желите да се пријавите помоћу е-поште и лозинке, потребно је да поставите лозинку.",
"account.notify.password.success": "Лозинка је успешно промењена", "account.notify.password.success": "Лозинка је успешно промењена",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "Социал логин",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Link", "account.card.oauth.link": "Link",
"account.card.oauth.unlink": "Unlink", "account.card.oauth.unlink": "Прекини везу",
"account.card.oauth.unlinked": "Unlinked", "account.card.oauth.unlinked": "Веза је прекинута",
"account.modal.unlink.title": "Unlink account", "account.modal.unlink.title": "Прекини везу са налогом",
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.", "account.modal.unlink.description": "Прекидање везе са вашим друштвеним налозима може довести до губитка налога ако се не сећате корисничког имена и лозинке.",
"account.notify.oauth.unlinked.success": "Unlinked successfully", "account.notify.oauth.unlinked.success": "Веза је прекинута",
"account.card.security.title": "Безбедност", "account.card.security.title": "Безбедност",
"account.card.security.totp.enable.description": "Унесите своју тренутну лозинку да бисте почели да омогућавате ТОТП", "account.card.security.totp.enable.description": "Унесите своју тренутну лозинку да бисте почели да омогућавате ТОТП",
"account.card.security.totp.disable.description": "Унесите своју тренутну лозинку да бисте онемогућили ТОТП", "account.card.security.totp.disable.description": "Унесите своју тренутну лозинку да бисте онемогућили ТОТП",
@@ -214,6 +214,7 @@ export default {
"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.link.label": "Линк", "upload.modal.link.label": "Линк",
"upload.modal.expires.label": "Истиче", "upload.modal.expires.label": "Истиче",
"upload.modal.expires.minute-singular": "Минут", "upload.modal.expires.minute-singular": "Минут",
@@ -261,15 +262,21 @@ 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": "Преглед за овај тип датотеке није подржан. Преузмите датотеку да бисте је видели.", "share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Edit {shareId}",
"share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "Конфигурација", "admin.config.title": "Конфигурација",
"admin.config.category.general": "Опште", "admin.config.category.general": "Опште",
"admin.config.category.share": "Дељење", "admin.config.category.share": "Дељење",
"admin.config.category.email": "E-пошта", "admin.config.category.email": "E-пошта",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "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": "URL апликације", "admin.config.general.app-url": "URL апликације",
@@ -301,6 +308,8 @@ export default {
"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.description": "Максимални рок трајања дељења у сатима. Поставите на 0 да бисте омогућили неограничено трајање.",
"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 компресије",
@@ -318,63 +327,71 @@ export default {
"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.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "Дозволи регистрацију",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "Дозволите корисницима да се региструју путем друштвене пријаве",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "Занемари ТОТП",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "Да ли да игноришете ТОТП када корисник користи пријаву на друштвеним мрежама",
"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": "Да ли је пријављивање на GitHub омогућено",
"admin.config.oauth.github-client-id": "GitHub Client ID", "admin.config.oauth.github-client-id": "GitHub ИД клијента",
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app", "admin.config.oauth.github-client-id.description": "ИД клијента GitHub OAuth апликације",
"admin.config.oauth.github-client-secret": "GitHub Client secret", "admin.config.oauth.github-client-secret": "Тајна GitHub клијента",
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "Тајна клијента GitHub OAuth апликације",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "Да ли је пријављивање на Google омогућено",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "ИД Google клијента",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "ИД клијента Google OAuth апликације",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "Тајна Google клијента",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Тајна клијента Google OAuth апликације",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "Да ли је пријављивање на Microsoft омогућено",
"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": "ИД закупца за Microsoft OAuth апликацију\nуобичајено: Корисници са личним Microsoft налогом и пословним или школским налогом са Microsoft Entra ID-а могу да се пријаве у апликацију. организације: Само корисници са пословним или школским налозима са Microsoft Entra ID-а могу да се пријаве у апликацију.\nпотрошачи: Само корисници са личним Microsoft налогом могу да се пријаве у апликацију.\nиме домена закупца Microsoft Entra ID или ИД закупца у ГУИД формату: Само корисници из одређеног Microsoft Entra ID станара (чланови директоријума са пословним или школским налогом или гости директоријума са личним Microsoft налогом) могу да се пријаве у апликацију.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "Microsotf Цлиент ИД",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "ИД клијента Microsoft OAuth апликације",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret", "admin.config.oauth.microsoft-client-secret": "Тајна Microsoft клијента",
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-secret.description": "Тајна клијента за Microsot OAuth апликацију",
"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": "Да ли је пријављивање на Discord омогућено",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-limited-guild": "Discord limited server ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "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-secret": "Discord Client secret", "admin.config.oauth.discord-client-id": "Discord ИД клијента",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "ИД клијента Discord OAuth апликације",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.discord-client-secret": "Discord клијент тајна",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.discord-client-secret.description": "Тајна клијента Discord OAuth апликације",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 404 // 404
"404.description": "Опа - Ова страна не постоји.", "404.description": "Опа - Ова страна не постоји.",
"404.button.home": "Врати ме на почетак", "404.button.home": "Врати ме на почетак",
// error // error
"error.title": "Error", "error.title": "Грешка",
"error.description": "Oops!", "error.description": "Ooпс!",
"error.button.back": "Go back", "error.button.back": "Иди назад",
"error.msg.default": "Something went wrong.", "error.msg.default": "Нешто је пошло наопако.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "Отказали сте процес аутентификације, покушајте поново.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "Процес аутентификације је трајао предуго, покушајте поново.",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "Internal Error",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "Корисник повезан са овим {0} налогом не постоји.",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "Не могу да добијем адресу е-поште са овог {0} налога.",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.already_linked": "Овај {0} налог је већ повезан са другим налогом.",
"error.msg.not_linked": "Овај {0} налог још увек није повезан ни са једним налогом.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Can not 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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "Сачувај", "common.button.save": "Сачувај",
"common.button.create": "Направи", "common.button.create": "Направи",
@@ -387,6 +404,7 @@ 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.or": "или", "common.text.or": "или",
"common.button.go-back": "Иди назад", "common.button.go-back": "Иди назад",
"common.notify.copied": "Ваша веза је копирана у clipboard", "common.notify.copied": "Ваша веза је копирана у clipboard",

View File

@@ -0,0 +1,420 @@
export default {
// Navbar
"navbar.upload": "Ladda upp",
"navbar.signin": "Logga in",
"navbar.home": "Startsida",
"navbar.signup": "Skapa konto",
"navbar.links.shares": "Mina delningar",
"navbar.links.reverse": "Omvända delningar",
"navbar.avatar.account": "Mitt konto",
"navbar.avatar.admin": "Administration",
"navbar.avatar.signout": "Logga ut",
// END navbar
// /
"home.title": "En <h>egen</h> fildelningsplattform.",
"home.description": "Vill du verkligen lägga dina personliga filer hos en tredje part som WeTransfer?",
"home.bullet.a.name": "Lokalt installerad",
"home.bullet.a.description": "Hosta Pingvin Share på din egen maskin.",
"home.bullet.b.name": "Sekretess",
"home.bullet.b.description": "Dina filer är dina filer och bör aldrig hamna i händerna på tredje part.",
"home.bullet.c.name": "Ingen irriterande filstorleksbegränsning",
"home.bullet.c.description": "Ladda upp så stora filer som du vill. Endast din hårddisk kommer att vara din gräns.",
"home.button.start": "Kom igång",
"home.button.source": "Källkod",
// END /
// /auth/signin
"signin.title": "Välkommen tillbaka",
"signin.description": "Har du inget konto än?",
"signin.button.signup": "Skapa konto",
"signin.input.email-or-username": "E-post eller användarnamn",
"signin.input.email-or-username.placeholder": "Din e-postadress eller ditt användarnamn",
"signin.input.password": "Lösenord",
"signin.input.password.placeholder": "Lösenord",
"signin.button.submit": "Logga in",
"signIn.notify.totp-required.title": "Tvåfaktorsautentisering krävs",
"signIn.notify.totp-required.description": "Vänligen ange din tvåfaktorsautentiseringskod",
"signIn.oauth.or": "ELLER",
"signIn.oauth.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": "Skapa ett konto",
"signup.description": "Har du redan ett konto?",
"signup.button.signin": "Logga in",
"signup.input.username": "Användarnamn",
"signup.input.username.placeholder": "Ditt användarnamn",
"signup.input.email": "E-post",
"signup.input.email.placeholder": "Din e-post",
"signup.button.submit": "Kom igång",
// END /auth/signup
// /auth/totp
"totp.title": "TOTP-autentisering",
"totp.button.signIn": "Logga in",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "Glömt ditt lösenord?",
"resetPassword.description": "Ange din e-postadress för att återställa ditt lösenord.",
"resetPassword.notify.success": "Ett e-postmeddelande har skickats till dig med en länk för att återställa lösenordet.",
"resetPassword.button.back": "Tillbaka till inloggningssidan",
"resetPassword.text.resetPassword": "Återställ lösenord",
"resetPassword.text.enterNewPassword": "Ange ditt nya lösenord",
"resetPassword.input.password": "Nytt lösenord",
"resetPassword.notify.passwordReset": "Ditt lösenord har återställts.",
// /account
"account.title": "Mitt konto",
"account.card.info.title": "Kontoinformation",
"account.card.info.username": "Användarnamn",
"account.card.info.email": "E-post",
"account.notify.info.success": "Kontot uppdaterades",
"account.card.password.title": "Lösenord",
"account.card.password.old": "Gammalt lösenord",
"account.card.password.new": "Nytt lösenord",
"account.card.password.noPasswordSet": "Du har inget lösenord. Om du vill logga in med e-post och lösenord måste du ange ett lösenord.",
"account.notify.password.success": "Lösenordet har ändrats",
"account.card.oauth.title": "Inloggning via sociala nätverk",
"account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google",
"account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID",
"account.card.oauth.link": "Länka",
"account.card.oauth.unlink": "Avlänka",
"account.card.oauth.unlinked": "Avlänkad",
"account.modal.unlink.title": "Avlänka konto",
"account.modal.unlink.description": "Om du kopplar bort dina sociala konton kan det leda till att du förlorar ditt konto om du inte kommer ihåg ditt användarnamn och lösenord.",
"account.notify.oauth.unlinked.success": "Avlänkning utförd",
"account.card.security.title": "Säkerhet",
"account.card.security.totp.enable.description": "Ange ditt nuvarande lösenord för att aktivera TOTP",
"account.card.security.totp.disable.description": "Ange ditt lösenord för att inaktivera TOTP",
"account.card.security.totp.button.start": "Start",
"account.modal.totp.title": "Aktivera TOTP",
"account.modal.totp.step1": "Steg 1: Lägg till din autentiserare",
"account.modal.totp.step2": "Steg 2: Bekräfta din kod",
"account.modal.totp.enterManually": "Ange manuellt",
"account.modal.totp.code": "Kod",
"account.modal.totp.clickToCopy": "Klicka för att kopiera",
"account.modal.totp.verify": "Verifiera",
"account.notify.totp.disable": "TOTP har inaktiverats",
"account.notify.totp.enable": "TOTP aktiverat",
"account.card.language.title": "Språk",
"account.card.language.description": "Projektet är översatt av gemenskapen. Vissa översättningar kan vara ofullständiga.",
"account.card.color.title": "Färgschema",
// ThemeSwitcher.tsx
"account.theme.dark": "Mörk",
"account.theme.light": "Ljus",
"account.theme.system": "System",
"account.button.delete": "Ta bort konto",
"account.modal.delete.title": "Ta bort konto",
"account.modal.delete.description": "Vill du verkligen ta bort ditt konto inklusive alla dina aktiva delningar?",
// END /account
// /account/shares
"account.shares.title": "Mina delningar",
"account.shares.title.empty": "Här var det tomt 👀",
"account.shares.description.empty": "Du har inga delningar.",
"account.shares.button.create": "Skapa en",
"account.shares.info.title": "Information om delning",
"account.shares.table.id": "ID",
"account.shares.table.name": "Namn",
"account.shares.table.description": "Beskrivning",
"account.shares.table.visitors": "Besökare",
"account.shares.table.expiresAt": "Förfaller den",
"account.shares.table.createdAt": "Skapad den",
"account.shares.table.size": "Storlek",
"account.shares.modal.share-informations": "Information om delning",
"account.shares.modal.share-link": "Delningslänk",
"account.shares.modal.delete.title": "Ta bort delning {share}",
"account.shares.modal.delete.description": "Vill du verkligen ta bort denna delning?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "Omvända delningar",
"account.reverseShares.description": "En omvänd delning gör att du kan generera en unik URL som tillåter externa användare att skapa en delning.",
"account.reverseShares.title.empty": "Här var det tomt 👀",
"account.reverseShares.description.empty": "Du har inga omvända delningar.",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Skapa omvänd delning",
"account.reverseShares.modal.expiration.label": "Förfaller",
"account.reverseShares.modal.expiration.minute-singular": "Minut",
"account.reverseShares.modal.expiration.minute-plural": "Minuter",
"account.reverseShares.modal.expiration.hour-singular": "Timme",
"account.reverseShares.modal.expiration.hour-plural": "Timmar",
"account.reverseShares.modal.expiration.day-singular": "Dag",
"account.reverseShares.modal.expiration.day-plural": "Dagar",
"account.reverseShares.modal.expiration.week-singular": "Vecka",
"account.reverseShares.modal.expiration.week-plural": "Veckor",
"account.reverseShares.modal.expiration.month-singular": "Månad",
"account.reverseShares.modal.expiration.month-plural": "Månader",
"account.reverseShares.modal.expiration.year-singular": "År",
"account.reverseShares.modal.expiration.year-plural": "År",
"account.reverseShares.modal.max-size.label": "Max storlek på delning",
"account.reverseShares.modal.send-email": "Skicka e-postavisering",
"account.reverseShares.modal.send-email.description": "Skicka ett e-postmeddelande när en delning skapas med denna länk för omvänd delning.",
"account.reverseShares.modal.max-use.label": "Maxanvändningar",
"account.reverseShares.modal.max-use.description": "Den maximala mängden gånger denna URL kan användas för att skapa en delning.",
"account.reverseShare.never-expires": "Denna omvända delning kommer aldrig att förfalla.",
"account.reverseShare.expires-on": "Denna sammanlagda delning löper ut på {expiration}.",
"account.reverseShares.table.no-shares": "Inga delningar har skapats ännu",
"account.reverseShares.table.count.singular": "delning",
"account.reverseShares.table.count.plural": "delningar",
"account.reverseShares.table.shares": "Delningar",
"account.reverseShares.table.remaining": "Återstående användningar",
"account.reverseShares.table.max-size": "Max storlek på delning",
"account.reverseShares.table.expires": "Förfaller den",
"account.reverseShares.modal.reverse-share-link": "Omvänd delningslänk",
"account.reverseShares.modal.delete.title": "Ta bort omvänd delning",
"account.reverseShares.modal.delete.description": "Vill du verkligen ta bort denna omvänd delning? Om du gör det, kommer de tillhörande delningarna också att raderas.",
// END /account/reverseShares
// /admin
"admin.title": "Administration",
"admin.button.users": "Användarhantering",
"admin.button.config": "Konfiguration",
"admin.version": "Version",
// END /admin
// /admin/users
"admin.users.title": "Användarhantering",
"admin.users.table.username": "Användarnamn",
"admin.users.table.email": "E-post",
"admin.users.table.admin": "Administratör",
"admin.users.edit.update.title": "Uppdatera användare {username}",
"admin.users.edit.update.admin-privileges": "Administratörsbehörigheter",
"admin.users.edit.update.change-password.title": "Ändra lösenord",
"admin.users.edit.update.change-password.field": "Nytt lösenord",
"admin.users.edit.update.change-password.button": "Spara nytt lösenord",
"admin.users.edit.update.notify.password.success": "Lösenordet har ändrats",
"admin.users.edit.delete.title": "Ta bort användare {username}",
"admin.users.edit.delete.description": "Vill du verkligen ta bort denna användare och alla deras delningar?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "Skapa användare",
"admin.users.modal.create.username": "Användarnamn",
"admin.users.modal.create.email": "E-post",
"admin.users.modal.create.password": "Lösenord",
"admin.users.modal.create.manual-password": "Sätt lösenord manuellt",
"admin.users.modal.create.manual-password.description": "Om den inte är markerad kommer användaren att få ett e-postmeddelande med en länk för att ange lösenordet.",
"admin.users.modal.create.admin": "Administratörsbehörigheter",
"admin.users.modal.create.admin.description": "Om detta markeras kommer användaren att kunna komma åt administratörspanelen.",
// END /admin/users
// /upload
"upload.title": "Ladda upp",
"upload.notify.generic-error": "Ett fel uppstod när din delning skulle slutföras.",
"upload.notify.count-failed": "{count} filer kunde inte laddas upp. Försöker igen.",
// Dropzone.tsx
"upload.dropzone.title": "Ladda upp filer",
"upload.dropzone.description": "Drag och släpp filer här för att starta din delning. Vi kan endast acceptera filer som är mindre än {maxSize} totalt.",
"upload.dropzone.notify.file-too-big": "Dina filer överskrider den maximala storleken på {maxSize}.",
// FileList.tsx
"upload.filelist.name": "Namn",
"upload.filelist.size": "Storlek",
// showCreateUploadModal.tsx
"upload.modal.title": "Skapa delning",
"upload.modal.link.error.invalid": "Kan endast innehålla bokstäver, siffror, understreck och bindestreck",
"upload.modal.link.error.taken": "Denna länk används redan",
"upload.modal.not-signed-in": "Du är inte inloggad",
"upload.modal.not-signed-in-description": "Du kommer inte att kunna ta bort din delning manuellt och visa antalet besökare.",
"upload.modal.expires.never": "aldrig",
"upload.modal.expires.never-long": "Upphör aldrig",
"upload.modal.expires.error.too-long": "Förfallodatum överskrider maximalt utgångsdatum för {max}.",
"upload.modal.link.label": "Länk",
"upload.modal.expires.label": "Förfaller",
"upload.modal.expires.minute-singular": "Minut",
"upload.modal.expires.minute-plural": "Minuter",
"upload.modal.expires.hour-singular": "Timme",
"upload.modal.expires.hour-plural": "Timmar",
"upload.modal.expires.day-singular": "Dag",
"upload.modal.expires.day-plural": "Dagar",
"upload.modal.expires.week-singular": "Vecka",
"upload.modal.expires.week-plural": "Veckor",
"upload.modal.expires.month-singular": "Månad",
"upload.modal.expires.month-plural": "Månader",
"upload.modal.expires.year-singular": "År",
"upload.modal.expires.year-plural": "År",
"upload.modal.accordion.description.title": "Beskrivning",
"upload.modal.accordion.description.placeholder": "Anteckning till mottagare av denna delning",
"upload.modal.accordion.email.title": "E-postmottagare",
"upload.modal.accordion.email.placeholder": "Ange e-postmottagare",
"upload.modal.accordion.email.invalid-email": "Ogiltig e-postadress",
"upload.modal.accordion.security.title": "Säkerhetsalternativ",
"upload.modal.accordion.security.password.label": "Lösenordsskydd",
"upload.modal.accordion.security.password.placeholder": "Inget lösenord",
"upload.modal.accordion.security.max-views.label": "Max antal visningar",
"upload.modal.accordion.security.max-views.placeholder": "Ingen gräns",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "Denna delning kommer aldrig att upphöra.",
"upload.modal.completed.expires-on": "Denna delning upphör att gälla {expiration}.",
"upload.modal.completed.share-ready": "Delning redo",
// END /upload
// /share/[id]
"share.title": "Delning {shareId}",
"share.description": "Titta vad jag har delat med dig!",
"share.error.visitor-limit-exceeded.title": "Besökargränsen överskriden",
"share.error.visitor-limit-exceeded.description": "Gränsen för antalet besökare för denna delning har överskridits.",
"share.error.removed.title": "Delning borttagen",
"share.error.not-found.title": "Delningen hittades inte",
"share.error.not-found.description": "Delningen du letar efter existerar inte.",
"share.modal.password.title": "Lösenord krävs",
"share.modal.password.description": "För att komma åt denna delning, vänligen ange lösenordet för delningen.",
"share.modal.password": "Lösenord",
"share.modal.error.invalid-password": "Ogiltigt lösenord",
"share.button.download-all": "Ladda ner allt",
"share.notify.download-all-preparing": "Delningen förbereds. Försök igen om några minuter.",
"share.modal.file-link": "Fillänk",
"share.table.name": "Namn",
"share.table.size": "Storlek",
"share.modal.file-preview.error.not-supported.title": "Förhandsgranskning stöds ej",
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "Redigera {shareId}",
"share.edit.append-upload": "Lägg till fil",
"share.edit.notify.generic-error": "Ett fel uppstod när din delning skulle slutföras.",
"share.edit.notify.save-success": "Delningen har uppdaterats",
// END /share/[id]/edit
// /admin/config
"admin.config.title": "Konfiguration",
"admin.config.category.general": "Allmänt",
"admin.config.category.share": "Delning",
"admin.config.category.email": "E-post",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Inloggning via sociala nätverk",
"admin.config.general.app-name": "Appnamn",
"admin.config.general.app-name.description": "Namn på applikationen",
"admin.config.general.app-url": "Appens URL",
"admin.config.general.app-url.description": "På vilken URL Pingvin Share finns",
"admin.config.general.show-home-page": "Visa startsidan",
"admin.config.general.show-home-page.description": "Om du vill visa startsidan",
"admin.config.general.logo": "Logotyp",
"admin.config.general.logo.description": "Ändra din logotyp genom att ladda upp en ny bild. Bilden måste vara en PNG och bör ha formatet 1:1.",
"admin.config.general.logo.placeholder": "Välj bild",
"admin.config.email.enable-share-email-recipients": "Aktivera e-postmottagare för delning",
"admin.config.email.enable-share-email-recipients.description": "Om du vill tillåta e-post till delningsmottagare. Aktivera endast detta om du har aktiverat SMTP.",
"admin.config.email.share-recipients-subject": "Delning ämne",
"admin.config.email.share-recipients-subject.description": "Ämne för e-postmeddelandet som skickas till delningsmottagarna.",
"admin.config.email.share-recipients-message": "Delning meddelande",
"admin.config.email.share-recipients-message.description": "Meddelande som skickas till delningens mottagare. Tillgängliga variabler:\n {creator} - Användarnamnet för skaparen av delningen\n {shareUrl} - URL för delningen\n {desc} - Beskrivningen av delningen\n {expires} - Förfallodatumet för delningen\n Variablerna kommer att ersättas med det faktiska värdet.",
"admin.config.email.reverse-share-subject": "Omvänd delning ämne",
"admin.config.email.reverse-share-subject.description": "Ämne i e-postmeddelandet som skickas när någon skapade en delning med din omvända delningslänk.",
"admin.config.email.reverse-share-message": "Omvänd delning meddelande",
"admin.config.email.reverse-share-message.description": "Meddelande som skickas när någon skapade en delning med din länk för omvänd delning. {shareUrl} kommer att ersättas med skaparens namn och delningens URL.",
"admin.config.email.reset-password-subject": "Återställ lösenord ämne",
"admin.config.email.reset-password-subject.description": "Ämne i e-postmeddelandet som skickas när en användare begär en lösenordsåterställning.",
"admin.config.email.reset-password-message": "Återställ lösenord meddelande",
"admin.config.email.reset-password-message.description": "Meddelande som skickas när en användare begär en lösenordsåterställning. {url} kommer att ersättas med länken för lösenordsåterställningen.",
"admin.config.email.invite-subject": "Inbjudan ämne",
"admin.config.email.invite-subject.description": "Ämne i e-postmeddelandet som skickas när en administratör bjuder in en användare.",
"admin.config.email.invite-message": "Inbjudningsmeddelanden",
"admin.config.email.invite-message.description": "Meddelande som skickas när en administratör bjuder in en användare. {url} kommer att ersättas med inbjudningsadressen och {password} med lösenordet.",
"admin.config.share.allow-registration": "Tillåt registrering",
"admin.config.share.allow-registration.description": "Om registrering är tillåten",
"admin.config.share.allow-unauthenticated-shares": "Tillåt oautentiserade delningar",
"admin.config.share.allow-unauthenticated-shares.description": "Om oautentiserade användare kan skapa delningar",
"admin.config.share.max-expiration": "Max utgångsdatum",
"admin.config.share.max-expiration.description": "Max längd innan en delning förfaller i timmar. Sätt till 0 för att tillåta obegränsad förfallotid.",
"admin.config.share.max-size": "Max storlek",
"admin.config.share.max-size.description": "Maximal storlek för delning i bytes",
"admin.config.share.zip-compression-level": "Komprimeringsnivå för zip",
"admin.config.share.zip-compression-level.description": "Justera nivån för att balansera mellan filstorlek och komprimeringshastighet. Giltiga värden varierar från 0 till 9, med 0 som ingen komprimering och 9 som maximal komprimering. ",
"admin.config.smtp.enabled": "Aktiverad",
"admin.config.smtp.enabled.description": "Om SMTP skall vara aktiverat. Ange endast detta som sant om du angav adress, port, e-post, användare och lösenord för din SMTP-server.",
"admin.config.smtp.host": "Adress",
"admin.config.smtp.host.description": "Adress för SMTP-servern",
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "Port för SMTP-servern",
"admin.config.smtp.email": "E-post",
"admin.config.smtp.email.description": "E-postadress som e-postmeddelanden skickas från",
"admin.config.smtp.username": "Användarnamn",
"admin.config.smtp.username.description": "Användarnamn för SMTP-servern",
"admin.config.smtp.password": "Lösenord",
"admin.config.smtp.password.description": "Lösenord för SMTP-servern",
"admin.config.smtp.button.test": "Skicka testmeddelande",
"admin.config.oauth.allow-registration": "Tillåt registrering",
"admin.config.oauth.allow-registration.description": "Tillåt användare att registrera sig via social inloggning",
"admin.config.oauth.ignore-totp": "Ignorera TOTP",
"admin.config.oauth.ignore-totp.description": "Om du vill ignorera TOTP när användaren använder social inloggning",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "Om GitHub-inloggning är aktiverad",
"admin.config.oauth.github-client-id": "GitHub Client ID",
"admin.config.oauth.github-client-id.description": "Client-ID för GitHub OAuth appen",
"admin.config.oauth.github-client-secret": "GitHub Client secret",
"admin.config.oauth.github-client-secret.description": "Client secret för GitHub OAuth appen",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "Om Google-inloggning är aktiverad",
"admin.config.oauth.google-client-id": "Google Client ID",
"admin.config.oauth.google-client-id.description": "Client-ID för Google OAuth appen",
"admin.config.oauth.google-client-secret": "Google Client secret",
"admin.config.oauth.google-client-secret.description": "Client secret för Google OAuth appen",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Om Microsoftinloggning skall vara aktiverat",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
"admin.config.oauth.microsoft-tenant.description": "Tenant-ID för Microsoft OAuth app\ngemensamt: Användare med både ett personligt Microsoft-konto och ett arbets- eller skolkonto från Microsoft Entra ID kan logga in på programmet.\norganisationer: Endast användare med arbets- eller skolkonton från Microsoft Entra ID kan logga in på programmet.\nkonsumenter: Endast användare med ett personligt Microsoft-konto kan logga in på programmet.\ndomännamn för Microsoft Entra tenant eller tenant ID i GUID-format: Endast användare från en specifik Microsoft Entra tenant (katalogmedlemmar med ett arbets- eller skolkonto eller kataloggäster med ett personligt Microsoft-konto) kan logga in på ansökan.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID",
"admin.config.oauth.microsoft-client-id.description": "Client ID för Microsoft OAuth",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
"admin.config.oauth.microsoft-client-secret.description": "Client secret för Microsoft OAuth",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Om inloggning via Discord är aktiverat",
"admin.config.oauth.discord-limited-guild": "Discord begränsa till server ID",
"admin.config.oauth.discord-limited-guild.description": "Begränsa inloggning till användare på en specifik server. Lämna tomt för att inaktivera.",
"admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID för Discord OAuth",
"admin.config.oauth.discord-client-secret": "Discord Client secret",
"admin.config.oauth.discord-client-secret.description": "Client secret för Discord OAuth",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Om OpenID-inloggning är aktiverat",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI för OpenID Connect OAuth appen",
"admin.config.oauth.oidc-username-claim": "OpenID Connect användarnamnsanspråk",
"admin.config.oauth.oidc-username-claim.description": "Användarnamnsanspråk i OpenID Connect ID token. Lämna tomt om du inte vet vad denna konfiguration är.",
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID för OpenID OAuth",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret för OpenID OAuth",
// 404
"404.description": "Hoppsan den här sidan finns inte.",
"404.button.home": "Ta mig tillbaka hem",
// error
"error.title": "Fel",
"error.description": "Hoppsan!",
"error.button.back": "Gå tillbaka",
"error.msg.default": "Någonting gick fel.",
"error.msg.access_denied": "Du avbröt autentiseringsprocessen, försök igen.",
"error.msg.expired_token": "Autentiseringsprocessen tog för lång tid, försök igen.",
"error.msg.invalid_token": "Internt fel",
"error.msg.no_user": "Användare som är länkad till detta {0} konto finns inte.",
"error.msg.no_email": "Kan inte hämta e-postadress från detta {0} konto.",
"error.msg.already_linked": "Detta {0} konto är redan länkat till ett annat konto.",
"error.msg.not_linked": "Detta {0} konto har ännu inte länkat till något konto.",
"error.msg.unverified_account": "Detta {0} -konto är overifierat, försök igen efter verifiering.",
"error.msg.discord_guild_permission_denied": "Du är inte tillåten att logga in.",
"error.msg.cannot_get_user_info": "Kan inte hämta din användarinformation från detta {0} konto.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID Connect",
// Common translations
"common.button.save": "Spara",
"common.button.create": "Skapa",
"common.button.submit": "Skicka",
"common.button.delete": "Ta bort",
"common.button.cancel": "Avbryt",
"common.button.confirm": "Bekräfta",
"common.button.disable": "Inaktivera",
"common.button.share": "Delning",
"common.button.generate": "Generera",
"common.button.done": "Klar",
"common.text.link": "Länk",
"common.text.navigate-to-link": "Gå till länken",
"common.text.or": "eller",
"common.button.go-back": "Gå tillbaka",
"common.notify.copied": "Din länk har kopierats till urklipp",
"common.success": "Slutförd",
"common.error": "Fel",
"common.error.unknown": "Ett okänt fel har uppstått",
"common.error.invalid-email": "Ogiltig e-postadress",
"common.error.too-short": "Måste minst vara {length} tecken långt",
"common.error.too-long": "Får högst innehålla {length} tecken",
"common.error.exact-length": "Måste vara exakt {length} tecken långt",
"common.error.invalid-number": "Måste vara ett tal",
"common.error.field-required": "Obligatoriskt fält"
};

View File

@@ -214,6 +214,7 @@ export default {
"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": "Expiration exceeds maximum expiration date 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": "นาที",
@@ -261,8 +262,14 @@ 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": "ไม่รองรับการแสดงตัวอย่างสำหรับไฟล์ประเภทนี้ โปรดดาวน์โหลดไฟล์เพื่อดู", "share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "Edit {shareId}",
"share.edit.append-upload": "Append file",
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
"share.edit.notify.save-success": "Share updated successfully",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "การตั้งค่า", "admin.config.title": "การตั้งค่า",
"admin.config.category.general": "ทั่วไป", "admin.config.category.general": "ทั่วไป",
@@ -301,6 +308,8 @@ export default {
"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": "Max expiration",
"admin.config.share.max-expiration.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
"admin.config.share.max-size": "ขนาดสูงสุด", "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",
@@ -344,18 +353,22 @@ 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-guild": "Discord limited server ID",
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Client ID of the 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 of the Discord OAuth app", "admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "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-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 404 // 404
"404.description": "ไม่พบหน้าที่คุณกำลังมองหา", "404.description": "ไม่พบหน้าที่คุณกำลังมองหา",
"404.button.home": "หน้าแรก", "404.button.home": "หน้าแรก",
@@ -366,15 +379,19 @@ export default {
"error.msg.default": "Something went wrong.", "error.msg.default": "Something went wrong.",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "You canceled the authentication process, please try again.",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "The authentication process took too long, please try again.",
"error.msg.invalid_token": "Internal Error",
"error.msg.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 haven't linked to any account yet.",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Can not 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",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "บันทึก", "common.button.save": "บันทึก",
"common.button.create": "สร้าง", "common.button.create": "สร้าง",
@@ -387,6 +404,7 @@ 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.or": "หรือ", "common.text.or": "หรือ",
"common.button.go-back": "ย้อนกลับ", "common.button.go-back": "ย้อนกลับ",
"common.notify.copied": "คัดลอกไปยังคลิปบอร์ดแล้ว", "common.notify.copied": "คัดลอกไปยังคลิปบอร์ดแล้ว",

View File

@@ -35,7 +35,7 @@ export default {
"signIn.notify.totp-required.description": "请输入一次性验证码", "signIn.notify.totp-required.description": "请输入一次性验证码",
"signIn.oauth.or": "OR", "signIn.oauth.or": "OR",
"signIn.oauth.github": "GitHub", "signIn.oauth.github": "GitHub",
"signIn.oauth.google": "Google", "signIn.oauth.google": "谷歌",
"signIn.oauth.microsoft": "Microsoft", "signIn.oauth.microsoft": "Microsoft",
"signIn.oauth.discord": "Discord", "signIn.oauth.discord": "Discord",
"signIn.oauth.oidc": "OpenID", "signIn.oauth.oidc": "OpenID",
@@ -51,8 +51,8 @@ export default {
"signup.button.submit": "注册", "signup.button.submit": "注册",
// END /auth/signup // END /auth/signup
// /auth/totp // /auth/totp
"totp.title": "TOTP Authentication", "totp.title": "两步验证",
"totp.button.signIn": "Sign in", "totp.button.signIn": "登录",
// END /auth/totp // END /auth/totp
// /auth/reset-password // /auth/reset-password
"resetPassword.title": "忘记密码?", "resetPassword.title": "忘记密码?",
@@ -72,11 +72,11 @@ export default {
"account.card.password.title": "密码", "account.card.password.title": "密码",
"account.card.password.old": "旧密码", "account.card.password.old": "旧密码",
"account.card.password.new": "新密码", "account.card.password.new": "新密码",
"account.card.password.noPasswordSet": "You 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": "您还未设置密码。如果您想通过邮箱和密码登录,请先设置密码。",
"account.notify.password.success": "密码更改成功!", "account.notify.password.success": "密码更改成功!",
"account.card.oauth.title": "Social login", "account.card.oauth.title": "社交账号登录",
"account.card.oauth.github": "GitHub", "account.card.oauth.github": "GitHub",
"account.card.oauth.google": "Google", "account.card.oauth.google": "谷歌",
"account.card.oauth.microsoft": "Microsoft", "account.card.oauth.microsoft": "Microsoft",
"account.card.oauth.discord": "Discord", "account.card.oauth.discord": "Discord",
"account.card.oauth.oidc": "OpenID", "account.card.oauth.oidc": "OpenID",
@@ -84,8 +84,8 @@ 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": "如果您不记得您的用户名和密码,解除和社交账号的关联可能会导致丢失账户。",
"account.notify.oauth.unlinked.success": "Unlinked successfully", "account.notify.oauth.unlinked.success": "解除关联成功",
"account.card.security.title": "安全", "account.card.security.title": "安全",
"account.card.security.totp.enable.description": "请输入当前密码开启两步验证", "account.card.security.totp.enable.description": "请输入当前密码开启两步验证",
"account.card.security.totp.disable.description": "请输入当前密码关闭两步验证", "account.card.security.totp.disable.description": "请输入当前密码关闭两步验证",
@@ -100,7 +100,7 @@ export default {
"account.notify.totp.disable": "成功关闭两步验证!", "account.notify.totp.disable": "成功关闭两步验证!",
"account.notify.totp.enable": "成功开启两步验证!", "account.notify.totp.enable": "成功开启两步验证!",
"account.card.language.title": "语言", "account.card.language.title": "语言",
"account.card.language.description": "The project is translated by the community. Some languages might be incomplete.", "account.card.language.description": "本项目由社区成员翻译,部分语言可能暂未提供翻译。",
"account.card.color.title": "颜色外观", "account.card.color.title": "颜色外观",
// ThemeSwitcher.tsx // ThemeSwitcher.tsx
"account.theme.dark": "暗黑模式", "account.theme.dark": "暗黑模式",
@@ -130,11 +130,11 @@ export default {
// END /account/shares // END /account/shares
// /account/reverseShares // /account/reverseShares
"account.reverseShares.title": "预留共享", "account.reverseShares.title": "预留共享",
"account.reverseShares.description": "预留共享允许你创建一个特定共享链接,以便外部用户以此创建共享", "account.reverseShares.description": "预留共享允许你创建一个特定共享链接,以便外部用户以此链接创建共享",
"account.reverseShares.title.empty": "这里空空如也 👀", "account.reverseShares.title.empty": "这里空空如也 👀",
"account.reverseShares.description.empty": "你没有创建任何预留共享", "account.reverseShares.description.empty": "你没有创建任何预留共享",
// showCreateReverseShareModal.tsx // showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "Create reverse share", "account.reverseShares.modal.title": "创建反向共享",
"account.reverseShares.modal.expiration.label": "过期时间", "account.reverseShares.modal.expiration.label": "过期时间",
"account.reverseShares.modal.expiration.minute-singular": "1 分钟", "account.reverseShares.modal.expiration.minute-singular": "1 分钟",
"account.reverseShares.modal.expiration.minute-plural": "分钟", "account.reverseShares.modal.expiration.minute-plural": "分钟",
@@ -214,6 +214,7 @@ export default {
"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.link.label": "共享链接", "upload.modal.link.label": "共享链接",
"upload.modal.expires.label": "过期时间", "upload.modal.expires.label": "过期时间",
"upload.modal.expires.minute-singular": "1 分钟", "upload.modal.expires.minute-singular": "1 分钟",
@@ -261,30 +262,36 @@ 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": "该文件类型不支持预览,请下载后打开查看", "share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id] // END /share/[id]
// /share/[id]/edit
"share.edit.title": "编辑 {shareId}",
"share.edit.append-upload": "追加文件",
"share.edit.notify.generic-error": "保存共享的过程中发生了错误",
"share.edit.notify.save-success": "共享已更新成功",
// END /share/[id]/edit
// /admin/config // /admin/config
"admin.config.title": "配置管理", "admin.config.title": "配置管理",
"admin.config.category.general": "通用", "admin.config.category.general": "通用",
"admin.config.category.share": "共享", "admin.config.category.share": "共享",
"admin.config.category.email": "电子邮件", "admin.config.category.email": "电子邮件",
"admin.config.category.smtp": "SMTP", "admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "Social Login", "admin.config.category.oauth": "社交账号登录",
"admin.config.general.app-name": "App 名称", "admin.config.general.app-name": "App 名称",
"admin.config.general.app-name.description": "这个 App 的名称", "admin.config.general.app-name.description": "自定义 App 的名称",
"admin.config.general.app-url": "App 的地址", "admin.config.general.app-url": "App 的地址",
"admin.config.general.app-url.description": "Pingvin Share 的 URL 地址", "admin.config.general.app-url.description": "Pingvin Share 的 URL 地址",
"admin.config.general.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.logo": "Logo", "admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "上传个性化 Logo图片必须是长宽比 1:1 的 PNG 格式", "admin.config.general.logo.description": "上传你的个性化 Logo图片必须是长宽比 1:1 的 PNG 格式",
"admin.config.general.logo.placeholder": "选择图片", "admin.config.general.logo.placeholder": "选择图片",
"admin.config.email.enable-share-email-recipients": "开启共享邮件通知", "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} - 共享链接\n {desc} - 共享描述\n {expires} - 共享过期时间\n 这些变量会被实际的值所替代", "admin.config.email.share-recipients-message.description": "发接收者的共享邮件通知具体内容。可选的变量有:\n {creator} - 共享创建者\n {shareUrl} - 共享链接\n {desc} - 共享描述\n {expires} - 共享过期时间\n 这些变量会被实际的值所替代",
"admin.config.email.reverse-share-subject": "预留共享邮件通知主题", "admin.config.email.reverse-share-subject": "预留共享邮件通知主题",
"admin.config.email.reverse-share-subject.description": "当有人使用了你的预留共享链接时,发送的预留共享邮件通知主题", "admin.config.email.reverse-share-subject.description": "当有人使用了你的预留共享链接时,发送的预留共享邮件通知主题",
"admin.config.email.reverse-share-message": "预留共享邮件通知内容", "admin.config.email.reverse-share-message": "预留共享邮件通知内容",
@@ -301,10 +308,12 @@ export default {
"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.description": "“最长过期时间”以小时为单位如果将其设置为“0”则为永不过期。",
"admin.config.share.max-size": "最大文件上限", "admin.config.share.max-size": "最大文件上限",
"admin.config.share.max-size.description": "最大文件上限,单位 bytes (1GB=1024MB=1048576KB=1073741824bytes)", "admin.config.share.max-size.description": "最大文件上限,单位 bytes (1GB=1024MB=1048576KB=1073741824bytes)",
"admin.config.share.zip-compression-level": "Zip compression level", "admin.config.share.zip-compression-level": "Zip 文件压缩质量",
"admin.config.share.zip-compression-level.description": "Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression. ", "admin.config.share.zip-compression-level.description": "调整压缩质量来平衡压缩文件的大小和压缩的速度。有效值介于 0 和 9 之间0 为不压缩9 为最高质量压缩。 ",
"admin.config.smtp.enabled": "启用", "admin.config.smtp.enabled": "启用",
"admin.config.smtp.enabled.description": "是否开启 SMTP仅当输入主机名、端口、发送邮箱、用户名和密码后开启", "admin.config.smtp.enabled.description": "是否开启 SMTP仅当输入主机名、端口、发送邮箱、用户名和密码后开启",
"admin.config.smtp.host": "主机名", "admin.config.smtp.host": "主机名",
@@ -318,63 +327,71 @@ export default {
"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.oauth.allow-registration": "Allow registration", "admin.config.oauth.allow-registration": "允许注册",
"admin.config.oauth.allow-registration.description": "Allow users to register via social login", "admin.config.oauth.allow-registration.description": "允许用户通过登录社交账号来注册",
"admin.config.oauth.ignore-totp": "Ignore TOTP", "admin.config.oauth.ignore-totp": "忽略两步验证",
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login", "admin.config.oauth.ignore-totp.description": "用户通过社交账号登录时是否忽略两步验证",
"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": "是否启用 GitHub 账号登录",
"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": "GitHub OAuth App 的 Client ID",
"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 of the GitHub OAuth app", "admin.config.oauth.github-client-secret.description": "GitHub OAuth App 的 Client secret",
"admin.config.oauth.google-enabled": "Google", "admin.config.oauth.google-enabled": "谷歌",
"admin.config.oauth.google-enabled.description": "Whether Google login is enabled", "admin.config.oauth.google-enabled.description": "是否启用谷歌账号登录",
"admin.config.oauth.google-client-id": "Google Client ID", "admin.config.oauth.google-client-id": "谷歌 Client ID",
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app", "admin.config.oauth.google-client-id.description": "Google OAuth App 的 Client ID",
"admin.config.oauth.google-client-secret": "Google Client secret", "admin.config.oauth.google-client-secret": "谷歌 Client secret",
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app", "admin.config.oauth.google-client-secret.description": "Google OAuth App 的 Client secret",
"admin.config.oauth.microsoft-enabled": "Microsoft", "admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "Whether Microsoft login is enabled", "admin.config.oauth.microsoft-enabled.description": "是否启用微软账号登录",
"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 of the Microsoft OAuth app\ncommon: Users with both a personal Microsoft account and a work or school account from Microsoft Entra ID can sign in to the application. organizations: Only users with work or school accounts from Microsoft Entra ID can sign in to the application.\nconsumers: Only users with a personal Microsoft account can sign in to the application.\ndomain name of the Microsoft Entra tenant or the tenant ID in GUID format: Only users from a specific Microsoft Entra tenant (directory members with a work or school account or directory guests with a personal Microsoft account) can sign in to the application.",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID", "admin.config.oauth.microsoft-client-id": "Microsoft Client ID",
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth App 的 Client ID",
"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 of the Microsoft OAuth app", "admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth App 的 Client secret",
"admin.config.oauth.discord-enabled": "Discord", "admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "Whether Discord login is enabled", "admin.config.oauth.discord-enabled.description": "是否启用 Discord 账号登录",
"admin.config.oauth.discord-client-id": "Discord Client ID", "admin.config.oauth.discord-limited-guild": "Discord 的 limited server ID",
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app", "admin.config.oauth.discord-limited-guild.description": "限制特定服务器中的用户登录。留空来禁用。",
"admin.config.oauth.discord-client-secret": "Discord Client secret", "admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app", "admin.config.oauth.discord-client-id.description": "Discord OAuth App 的 Client ID",
"admin.config.oauth.oidc-enabled": "OpenID", "admin.config.oauth.discord-client-secret": "Discord 的 Client secret",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID login is enabled", "admin.config.oauth.discord-client-secret.description": "Discord OAuth App 的 Client secret",
"admin.config.oauth.oidc-discovery-uri": "OpenID Discovery URI", "admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID OAuth app", "admin.config.oauth.oidc-enabled.description": "是否启用 OpenID Connect 登录",
"admin.config.oauth.oidc-client-id": "OpenID Client ID", "admin.config.oauth.oidc-discovery-uri": "OpenID Connect 的 Discovery URI",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID OAuth app", "admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth App 的 Discovery URI",
"admin.config.oauth.oidc-client-secret": "OpenID Client secret", "admin.config.oauth.oidc-username-claim": "OpenID Connect 用户名请求",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID OAuth app", "admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID token 中的用户名请求。如果您不知道这项配置是什么,请留空。",
"admin.config.oauth.oidc-client-id": "OpenID Connect 的 Client ID",
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth App 的 Client ID",
"admin.config.oauth.oidc-client-secret": "OpenID Connect 的 Client secret",
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth App 的 Client secret",
// 404 // 404
"404.description": "当前的页面走丢啦", "404.description": "当前的页面走丢啦",
"404.button.home": "返回主页", "404.button.home": "返回主页",
// error // error
"error.title": "Error", "error.title": "出错了",
"error.description": "Oops!", "error.description": "糟糕!",
"error.button.back": "Go back", "error.button.back": "返回上一页",
"error.msg.default": "Something went wrong.", "error.msg.default": "发生未知错误。",
"error.msg.access_denied": "You canceled the authentication process, please try again.", "error.msg.access_denied": "您取消了认证过程,请重试。",
"error.msg.expired_token": "The authentication process took too long, please try again.", "error.msg.expired_token": "认证过程耗时异常,请重试。",
"error.msg.no_user": "User linked to this {0} account doesn't exist.", "error.msg.invalid_token": "内部错误",
"error.msg.no_email": "Can't get email address from this {0} account.", "error.msg.no_user": "用户关联的这个 {0} 账户不存在。",
"error.msg.already_linked": "This {0} account is already linked to another account.", "error.msg.no_email": "无法从 {0} 这个账户获取邮箱地址。",
"error.msg.not_linked": "This {0} account haven't linked to any account yet.", "error.msg.already_linked": "{0} 这个账户已经关联到另一个账号。",
"error.msg.not_linked": "{0} 这个账户尚未关联到任何账号。",
"error.msg.unverified_account": "{0} 这个账户尚未验证,请在验证后重试。",
"error.msg.discord_guild_permission_denied": "您无权登录。",
"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": "谷歌",
"error.param.provider_microsoft": "Microsoft", "error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord", "error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID", "error.param.provider_oidc": "OpenID Connect",
// Common translations // Common translations
"common.button.save": "保存", "common.button.save": "保存",
"common.button.create": "创建", "common.button.create": "创建",
@@ -387,10 +404,11 @@ 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.or": "或", "common.text.or": "或",
"common.button.go-back": "返回", "common.button.go-back": "返回",
"common.notify.copied": "已复制到剪贴板", "common.notify.copied": "已复制到剪贴板",
"common.success": "Success", "common.success": "成功",
"common.error": "错误", "common.error": "错误",
"common.error.unknown": "发生未知错误", "common.error.unknown": "发生未知错误",
"common.error.invalid-email": "邮件地址不可用", "common.error.invalid-email": "邮件地址不可用",

View File

@@ -0,0 +1,420 @@
export default {
// Navbar
"navbar.upload": "上傳",
"navbar.signin": "登入",
"navbar.home": "首頁",
"navbar.signup": "註冊",
"navbar.links.shares": "我的分享",
"navbar.links.reverse": "檔案請求",
"navbar.avatar.account": "帳號設定",
"navbar.avatar.admin": "管理",
"navbar.avatar.signout": "登出",
// END navbar
// /
"home.title": "<h>自建</h> 檔案分享平台!",
"home.description": "您真的放心把檔案交到第三方檔案平台手中嗎?",
"home.bullet.a.name": "完全自建",
"home.bullet.a.description": "輕松使用私有服務器搭建檔案分享平台",
"home.bullet.b.name": "完全隱私",
"home.bullet.b.description": "您的檔案只屬於您!不需將它放到第三方檔案平台",
"home.bullet.c.name": "完全無限",
"home.bullet.c.description": "想上傳多大都可以,更需要擔心的是您的存儲空間容量",
"home.button.start": "開始使用",
"home.button.source": "原始碼",
// END /
// /auth/signin
"signin.title": "歡迎回來",
"signin.description": "還沒有帳號嗎?請",
"signin.button.signup": "註冊",
"signin.input.email-or-username": "電子郵件或使用者名稱",
"signin.input.email-or-username.placeholder": "請輸入電子郵件或使用者名稱",
"signin.input.password": "密碼",
"signin.input.password.placeholder": "請輸入密碼",
"signin.button.submit": "登入",
"signIn.notify.totp-required.title": "請繼續兩步驗證",
"signIn.notify.totp-required.description": "請輸入一次性驗證碼",
"signIn.oauth.or": "OR",
"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": "建立帳號",
"signup.description": "已經有帳號了?請",
"signup.button.signin": "登入",
"signup.input.username": "使用者名稱",
"signup.input.username.placeholder": "請輸入使用者名稱",
"signup.input.email": "電子郵件",
"signup.input.email.placeholder": "請輸入電子郵件",
"signup.button.submit": "註冊",
// END /auth/signup
// /auth/totp
"totp.title": "TOTP Authentication",
"totp.button.signIn": "Sign in",
// END /auth/totp
// /auth/reset-password
"resetPassword.title": "忘記密碼?",
"resetPassword.description": "請輸入Email以讓系統寄送重置密碼郵件",
"resetPassword.notify.success": "一封包含密碼重置地址的郵件已發送到您的Email",
"resetPassword.button.back": "返回登入頁面",
"resetPassword.text.resetPassword": "重置密碼",
"resetPassword.text.enterNewPassword": "請輸入新密碼",
"resetPassword.input.password": "新密碼",
"resetPassword.notify.passwordReset": "密碼更新成功!",
// /account
"account.title": "我的帳號",
"account.card.info.title": "帳號資訊",
"account.card.info.username": "使用者名稱",
"account.card.info.email": "Email",
"account.notify.info.success": "帳號資訊更新成功!",
"account.card.password.title": "密碼",
"account.card.password.old": "舊密碼",
"account.card.password.new": "新密碼",
"account.card.password.noPasswordSet": "並未設定密碼若希望使用E-mail與密碼進行登入則必須要設定密碼。",
"account.notify.password.success": "密碼更改成功!",
"account.card.oauth.title": "第三方登入",
"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": "聯結",
"account.card.oauth.unlink": "取消聯結",
"account.card.oauth.unlinked": "已取消聯結",
"account.modal.unlink.title": "取消聯結第三方登入",
"account.modal.unlink.description": "若不記得使用者名稱與密碼,取消聯結第三方登入可能會使您無法登入。",
"account.notify.oauth.unlinked.success": "已完成取消聯結",
"account.card.security.title": "安控",
"account.card.security.totp.enable.description": "請輸入當前密碼開啟兩步驗證",
"account.card.security.totp.disable.description": "請輸入當前密碼關閉兩步驗證",
"account.card.security.totp.button.start": "開啟",
"account.modal.totp.title": "開啟兩步驗證",
"account.modal.totp.step1": "第一步:添加驗證應用程式 Authenticator",
"account.modal.totp.step2": "第二步:輸入一次性驗證碼",
"account.modal.totp.enterManually": "手動輸入",
"account.modal.totp.code": "驗證碼",
"account.modal.totp.clickToCopy": "複製",
"account.modal.totp.verify": "確認",
"account.notify.totp.disable": "成功關閉兩步驗證!",
"account.notify.totp.enable": "成功開啟兩步驗證!",
"account.card.language.title": "語言",
"account.card.language.description": "此專案由社群進行翻譯,部分語言可能尚未完成翻譯。",
"account.card.color.title": "顏色外觀",
// ThemeSwitcher.tsx
"account.theme.dark": "深色模式",
"account.theme.light": "淺色模式",
"account.theme.system": "比照系統",
"account.button.delete": "刪除帳號",
"account.modal.delete.title": "刪除帳號",
"account.modal.delete.description": "您真的想刪除您的帳號,並刪除所有的分享嗎?",
// END /account
// /account/shares
"account.shares.title": "我的分享",
"account.shares.title.empty": "這裡空空如也 👀",
"account.shares.description.empty": "您沒有建立任何分享",
"account.shares.button.create": "建立分享",
"account.shares.info.title": "分享資訊",
"account.shares.table.id": "ID",
"account.shares.table.name": "分享代號",
"account.shares.table.description": "描述",
"account.shares.table.visitors": "造訪次數",
"account.shares.table.expiresAt": "過期時間",
"account.shares.table.createdAt": "建立時間",
"account.shares.table.size": "檔案大小",
"account.shares.modal.share-informations": "分享資訊",
"account.shares.modal.share-link": "分享聯結",
"account.shares.modal.delete.title": "刪除 {share}",
"account.shares.modal.delete.description": "您真的想刪除這個分享嗎?",
// END /account/shares
// /account/reverseShares
"account.reverseShares.title": "檔案請求",
"account.reverseShares.description": "檔案請求允許您建立一個特定的上船畫面,以便外部使用者與您分享檔案",
"account.reverseShares.title.empty": "這里空空如也 👀",
"account.reverseShares.description.empty": "您沒有建立任何檔案請求",
// showCreateReverseShareModal.tsx
"account.reverseShares.modal.title": "建立檔案請求",
"account.reverseShares.modal.expiration.label": "過期時間",
"account.reverseShares.modal.expiration.minute-singular": "分鐘",
"account.reverseShares.modal.expiration.minute-plural": "分鐘",
"account.reverseShares.modal.expiration.hour-singular": "小時",
"account.reverseShares.modal.expiration.hour-plural": "小時",
"account.reverseShares.modal.expiration.day-singular": "天",
"account.reverseShares.modal.expiration.day-plural": "天",
"account.reverseShares.modal.expiration.week-singular": "周",
"account.reverseShares.modal.expiration.week-plural": "周",
"account.reverseShares.modal.expiration.month-singular": "月",
"account.reverseShares.modal.expiration.month-plural": "月",
"account.reverseShares.modal.expiration.year-singular": "年",
"account.reverseShares.modal.expiration.year-plural": "年",
"account.reverseShares.modal.max-size.label": "上傳大小上限",
"account.reverseShares.modal.send-email": "發送Email提醒",
"account.reverseShares.modal.send-email.description": "當這個檔案請求聯結被用於分享時發送Email提醒",
"account.reverseShares.modal.max-use.label": "最大使用次數",
"account.reverseShares.modal.max-use.description": "這個檔案請求聯結可被用於建立分享的最大使用次數",
"account.reverseShare.never-expires": "這個檔案請求永不過期",
"account.reverseShare.expires-on": "這個檔案請求將過期於 {expiration}",
"account.reverseShares.table.no-shares": "當前沒有建立任何分享",
"account.reverseShares.table.count.singular": "分享",
"account.reverseShares.table.count.plural": "分享",
"account.reverseShares.table.shares": "分享",
"account.reverseShares.table.remaining": "剩餘使用次數",
"account.reverseShares.table.max-size": "上傳大小上限",
"account.reverseShares.table.expires": "過期時間",
"account.reverseShares.modal.reverse-share-link": "檔案請求聯結",
"account.reverseShares.modal.delete.title": "刪除檔案請求聯結",
"account.reverseShares.modal.delete.description": "您真的想刪除此檔案請求聯結嗎?聯結下所有關聯的檔案都將被刪除",
// END /account/reverseShares
// /admin
"admin.title": "管理",
"admin.button.users": "使用者管理",
"admin.button.config": "配置管理",
"admin.version": "版本",
// END /admin
// /admin/users
"admin.users.title": "使用者管理",
"admin.users.table.username": "使用者名稱",
"admin.users.table.email": "Email",
"admin.users.table.admin": "管理員",
"admin.users.edit.update.title": "更新使用者 {username}",
"admin.users.edit.update.admin-privileges": "管理員",
"admin.users.edit.update.change-password.title": "更改密碼",
"admin.users.edit.update.change-password.field": "新密碼",
"admin.users.edit.update.change-password.button": "保存新密碼",
"admin.users.edit.update.notify.password.success": "密碼更新成功!",
"admin.users.edit.delete.title": "刪除使用者 {username}",
"admin.users.edit.delete.description": "您真的想刪除這個帳號,並刪除該使用者所有的分享嗎?",
// showCreateUserModal.tsx
"admin.users.modal.create.title": "建立使用者",
"admin.users.modal.create.username": "使用者名稱",
"admin.users.modal.create.email": "Email",
"admin.users.modal.create.password": "密碼",
"admin.users.modal.create.manual-password": "手動設置密碼",
"admin.users.modal.create.manual-password.description": "如果不勾選使用者將會收到一封Email來設置他們的密碼",
"admin.users.modal.create.admin": "管理員",
"admin.users.modal.create.admin.description": "如果勾選,使用者將能查看管理員面板",
// END /admin/users
// /upload
"upload.title": "上傳",
"upload.notify.generic-error": "建立分享的過程中發生了錯誤",
"upload.notify.count-failed": "{count} 檔案上傳失敗,請重試",
// Dropzone.tsx
"upload.dropzone.title": "上傳檔案",
"upload.dropzone.description": "將檔案拖曳至此以上傳,檔案大小不能超過上限 {maxSize}",
"upload.dropzone.notify.file-too-big": "您的檔案超過了最大上傳限制 {maxSize}",
// FileList.tsx
"upload.filelist.name": "檔案名稱",
"upload.filelist.size": "檔案大小",
// showCreateUploadModal.tsx
"upload.modal.title": "建立分享",
"upload.modal.link.error.invalid": "只能包括字母,數字,下劃線(_),和橫線(-)",
"upload.modal.link.error.taken": "這個分享代號已經存在了",
"upload.modal.not-signed-in": "當前沒有登入",
"upload.modal.not-signed-in-description": "您將不能刪除您的分享或查看查看次數",
"upload.modal.expires.never": "永不",
"upload.modal.expires.never-long": "永不過期",
"upload.modal.expires.error.too-long": "過期時間超出了系統上限設定 {max}。",
"upload.modal.link.label": "分享聯結",
"upload.modal.expires.label": "過期時間",
"upload.modal.expires.minute-singular": "分鐘",
"upload.modal.expires.minute-plural": "分鐘",
"upload.modal.expires.hour-singular": "小時",
"upload.modal.expires.hour-plural": "小時",
"upload.modal.expires.day-singular": "天",
"upload.modal.expires.day-plural": "天",
"upload.modal.expires.week-singular": "周",
"upload.modal.expires.week-plural": "周",
"upload.modal.expires.month-singular": "月",
"upload.modal.expires.month-plural": "月",
"upload.modal.expires.year-singular": "年",
"upload.modal.expires.year-plural": "年",
"upload.modal.accordion.description.title": "描述",
"upload.modal.accordion.description.placeholder": "分享檔案備註資訊",
"upload.modal.accordion.email.title": "Email提醒",
"upload.modal.accordion.email.placeholder": "收件人Email地址",
"upload.modal.accordion.email.invalid-email": "Email地址不可用",
"upload.modal.accordion.security.title": "安控",
"upload.modal.accordion.security.password.label": "密碼保護",
"upload.modal.accordion.security.password.placeholder": "無密碼",
"upload.modal.accordion.security.max-views.label": "最大查看次數",
"upload.modal.accordion.security.max-views.placeholder": "無限",
// showCompletedUploadModal.tsx
"upload.modal.completed.never-expires": "這個分享永不過期",
"upload.modal.completed.expires-on": "這個分享將過期於 {expiration}。",
"upload.modal.completed.share-ready": "分享建立完畢",
// END /upload
// /share/[id]
"share.title": "分享 {shareId}",
"share.description": "瞧瞧我給您分享了些什麽!",
"share.error.visitor-limit-exceeded.title": "查看次數達到上限",
"share.error.visitor-limit-exceeded.description": "查看次數達到上限",
"share.error.removed.title": "分享已刪除",
"share.error.not-found.title": "分享未找到",
"share.error.not-found.description": "分享檔案遺失了",
"share.modal.password.title": "需要密碼",
"share.modal.password.description": "請輸入密碼來查看此分享",
"share.modal.password": "密碼",
"share.modal.error.invalid-password": "密碼錯誤",
"share.button.download-all": "全部下載",
"share.notify.download-all-preparing": "正在處理中,請稍等片刻",
"share.modal.file-link": "檔案聯結",
"share.table.name": "檔案名稱",
"share.table.size": "檔案大小",
"share.modal.file-preview.error.not-supported.title": "該檔案類型不支持預覽",
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
// END /share/[id]
// /share/[id]/edit
"share.edit.title": "編輯 {shareId}",
"share.edit.append-upload": "追加檔案",
"share.edit.notify.generic-error": "保存分享的過程中發生了錯誤",
"share.edit.notify.save-success": "分享已更新成功",
// END /share/[id]/edit
// /admin/config
"admin.config.title": "配置管理",
"admin.config.category.general": "通用",
"admin.config.category.share": "分享",
"admin.config.category.email": "Email",
"admin.config.category.smtp": "SMTP",
"admin.config.category.oauth": "第三方登入",
"admin.config.general.app-name": "App 名稱",
"admin.config.general.app-name.description": "這個 App 的名稱",
"admin.config.general.app-url": "App URL",
"admin.config.general.app-url.description": "Pingvin Share 的 URL",
"admin.config.general.show-home-page": "顯示首頁",
"admin.config.general.show-home-page.description": "是否顯示首頁",
"admin.config.general.logo": "Logo",
"admin.config.general.logo.description": "上傳個性化 Logo圖片必須是長寬比 1:1 的 PNG 格式",
"admin.config.general.logo.placeholder": "選擇圖片",
"admin.config.email.enable-share-email-recipients": "開啟分享Email通知",
"admin.config.email.enable-share-email-recipients.description": "是否允許通過Email通知發送分享資訊需進行 SMTP 設定後此選項才有效",
"admin.config.email.share-recipients-subject": "分享Email通知主題",
"admin.config.email.share-recipients-subject.description": "發送分享Email通知的主題",
"admin.config.email.share-recipients-message": "分享Email通知內容",
"admin.config.email.share-recipients-message.description": "發送到接收者的分享Email通知具體內容。可使用的參數有\n {creator} - 分享建立者\n {shareUrl} - 分享聯結\n {desc} - 分享描述\n {expires} - 分享過期時間\n 這些參數會被實際的值所替代",
"admin.config.email.reverse-share-subject": "檔案請求Email通知主題",
"admin.config.email.reverse-share-subject.description": "當有人使用了您的檔案請求聯結時,發送的檔案請求通知主題",
"admin.config.email.reverse-share-message": "檔案請求Email通知內容",
"admin.config.email.reverse-share-message.description": "當有人使用了您的檔案請求聯結時,發送的通知內容。{shareUrl} 會被建立者的使用者名稱和分享聯結代替",
"admin.config.email.reset-password-subject": "重置密碼Email通知主題",
"admin.config.email.reset-password-subject.description": "當使用者發動重置密碼時,發送的重置密碼通知主題",
"admin.config.email.reset-password-message": "重置密碼Email通知內容",
"admin.config.email.reset-password-message.description": "當使用者發動重置密碼時,重置密碼通知內容。{url} 會被重置密碼聯結代替",
"admin.config.email.invite-subject": "邀請Email通知主題",
"admin.config.email.invite-subject.description": "當管理員邀請使用者時,發送的邀請通知主題",
"admin.config.email.invite-message": "邀請Email通知內容",
"admin.config.email.invite-message.description": "當管理員邀請使用者時,發送的邀請通知內容。{url} 會被邀請聯結代替,{password} 會被密碼代替",
"admin.config.share.allow-registration": "允許註冊",
"admin.config.share.allow-registration.description": "是否允許註冊",
"admin.config.share.allow-unauthenticated-shares": "是否允許未登入進行分享",
"admin.config.share.allow-unauthenticated-shares.description": "是否允許未登入的使用者建立分享",
"admin.config.share.max-expiration": "最大過期時間",
"admin.config.share.max-expiration.description": "最大過期時間(小時)若設定為0則為永不過期",
"admin.config.share.max-size": "最大檔案上限",
"admin.config.share.max-size.description": "最大檔案上限,單位 bytes (1GB=1024MB=1048576KB=1073741824bytes)",
"admin.config.share.zip-compression-level": "Zip 壓縮等級",
"admin.config.share.zip-compression-level.description": "調整壓縮等級以平衡檔案大小和壓縮速度。 有效值範圍從 0 到 9其中 0 表示無壓縮9 表示最大壓縮",
"admin.config.smtp.enabled": "啟用",
"admin.config.smtp.enabled.description": "是否開啟 SMTP需輸入Host、Port、發送郵箱、使用者名稱和密碼後才有作用",
"admin.config.smtp.host": "Host",
"admin.config.smtp.host.description": "SMTP Host",
"admin.config.smtp.port": "Port",
"admin.config.smtp.port.description": "SMTP Port",
"admin.config.smtp.email": "發送郵箱",
"admin.config.smtp.email.description": "發送郵箱地址",
"admin.config.smtp.username": "使用者名稱",
"admin.config.smtp.username.description": "SMTP 主機使用者名稱",
"admin.config.smtp.password": "密碼",
"admin.config.smtp.password.description": "SMTP 主機密碼",
"admin.config.smtp.button.test": "發送測試Email",
"admin.config.oauth.allow-registration": "允許註冊",
"admin.config.oauth.allow-registration.description": "允許使用者以第三方登入註冊",
"admin.config.oauth.ignore-totp": "略過 TOTP",
"admin.config.oauth.ignore-totp.description": "當使用者使用第三方登入時,略過 TOTP 驗證",
"admin.config.oauth.github-enabled": "GitHub",
"admin.config.oauth.github-enabled.description": "啟用 Github 登入",
"admin.config.oauth.github-client-id": "GitHub Client ID",
"admin.config.oauth.github-client-id.description": "GitHub OAuth 的 Client ID",
"admin.config.oauth.github-client-secret": "GitHub Client secret",
"admin.config.oauth.github-client-secret.description": "GitHub OAuth 的 Client secret",
"admin.config.oauth.google-enabled": "Google",
"admin.config.oauth.google-enabled.description": "啟用 Google 登入",
"admin.config.oauth.google-client-id": "Google Client ID",
"admin.config.oauth.google-client-id.description": "Google OAuth 的 Client ID",
"admin.config.oauth.google-client-secret": "Google Client secret",
"admin.config.oauth.google-client-secret.description": "Google OAuth 的 Client secret",
"admin.config.oauth.microsoft-enabled": "Microsoft",
"admin.config.oauth.microsoft-enabled.description": "啟用 Microsoft 登入",
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
"admin.config.oauth.microsoft-tenant.description": "Microsoft OAuth 的 Tenant ID\ncommon: 擁有 Microsoft Entra ID 的個人 Microsoft 帳號和工作或學校帳號的使用者可以登入該應用程式。\norganizations: 擁有 Microsoft Entra ID 的工作或學校帳號的使用者才能登入應用程式。\nconsumers: 只有擁有個人 Microsoft 帳號的使用者才能登入該應用程式。\ndomain name of the Microsoft Entra tenant or the tenant ID in GUID format: 只有來自特定 Microsoft Entra 租戶的使用者(具有工作或學校帳號的目錄成員或具有個人 Microsoft 帳號的目錄成員)才能登入應用程式。",
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID",
"admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth 的 Client ID",
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth 的 Client secret",
"admin.config.oauth.discord-enabled": "Discord",
"admin.config.oauth.discord-enabled.description": "啟用 Discord 登入",
"admin.config.oauth.discord-limited-guild": "Discord limited server ID",
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
"admin.config.oauth.discord-client-id": "Discord Client ID",
"admin.config.oauth.discord-client-id.description": "Discord OAuth 的 Client ID",
"admin.config.oauth.discord-client-secret": "Discord Client secret",
"admin.config.oauth.discord-client-secret.description": "Discord OAuth 的 Client secret",
"admin.config.oauth.oidc-enabled": "OpenID Connect",
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-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-client-id": "OpenID Connect Client ID",
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
// 404
"404.description": "查無此頁",
"404.button.home": "返回主頁",
// error
"error.title": "Error",
"error.description": "Oops!",
"error.button.back": "返回上一頁",
"error.msg.default": "發生預期外的問題。",
"error.msg.access_denied": "您取消了身分驗證,請重試。",
"error.msg.expired_token": "身分驗證過程逾時,請重試。",
"error.msg.invalid_token": "Internal Error",
"error.msg.no_user": "與此 {0} 帳號關聯的使用者不存在。",
"error.msg.no_email": "無法從此 {0} 帳號取得Email地址。",
"error.msg.already_linked": "此 {0} 帳號已與另一個帳號關聯。",
"error.msg.not_linked": "此 {0} 帳號尚未關聯到任何帳號。",
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
"error.param.provider_github": "GitHub",
"error.param.provider_google": "Google",
"error.param.provider_microsoft": "Microsoft",
"error.param.provider_discord": "Discord",
"error.param.provider_oidc": "OpenID Connect",
// Common translations
"common.button.save": "儲存",
"common.button.create": "建立",
"common.button.submit": "送出",
"common.button.delete": "刪除",
"common.button.cancel": "取消",
"common.button.confirm": "確認",
"common.button.disable": "關閉",
"common.button.share": "分享",
"common.button.generate": "自動產生",
"common.button.done": "完成",
"common.text.link": "聯結",
"common.text.navigate-to-link": "Go to the link",
"common.text.or": "或",
"common.button.go-back": "返回",
"common.notify.copied": "已複製到剪貼簿",
"common.success": "成功",
"common.error": "錯誤",
"common.error.unknown": "發生預期外錯誤",
"common.error.invalid-email": "Email地址不可用",
"common.error.too-short": "必須不少於 {length} 個字元",
"common.error.too-long": "必須不超過 {length} 個字元",
"common.error.exact-length": "必須為 {length} 個字元",
"common.error.invalid-number": "必須為數字",
"common.error.field-required": "必填"
};

View File

@@ -77,6 +77,7 @@ const MyShares = () => {
showCreateReverseShareModal( showCreateReverseShareModal(
modals, modals,
config.get("smtp.enabled"), config.get("smtp.enabled"),
config.get("share.maxExpiration"),
getReverseShares, getReverseShares,
) )
} }

View File

@@ -16,7 +16,7 @@ import { useModals } from "@mantine/modals";
import moment from "moment"; import moment from "moment";
import Link from "next/link"; import Link from "next/link";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { TbInfoCircle, TbLink, TbTrash } from "react-icons/tb"; import { TbEdit, TbInfoCircle, TbLink, TbTrash } from "react-icons/tb";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
import Meta from "../../components/Meta"; import Meta from "../../components/Meta";
import showShareInformationsModal from "../../components/account/showShareInformationsModal"; import showShareInformationsModal from "../../components/account/showShareInformationsModal";
@@ -110,6 +110,11 @@ const MyShares = () => {
</td> </td>
<td> <td>
<Group position="right"> <Group position="right">
<Link href={`/share/${share.id}/edit`}>
<ActionIcon color="orange" variant="light" size={25}>
<TbEdit />
</ActionIcon>
</Link>
<ActionIcon <ActionIcon
color="blue" color="blue"
variant="light" variant="light"

View File

@@ -68,13 +68,13 @@ const ResetPassword = () => {
})} })}
> >
<PasswordInput <PasswordInput
label={t("resetPassword.text.password")} label={t("resetPassword.input.password")}
placeholder="••••••••••" placeholder="••••••••••"
{...form.getInputProps("password")} {...form.getInputProps("password")}
/> />
<Group position="right" mt="lg"> <Group position="right" mt="lg">
<Button type="submit" className={classes.control}> <Button type="submit" className={classes.control}>
<FormattedMessage id="resetPassword.button.resetPassword" /> <FormattedMessage id="resetPassword.text.resetPassword" />
</Button> </Button>
</Group> </Group>
</form> </form>

View File

@@ -0,0 +1,65 @@
import { LoadingOverlay } from "@mantine/core";
import { useModals } from "@mantine/modals";
import { GetServerSidePropsContext } from "next";
import { useEffect, useState } from "react";
import showErrorModal from "../../../components/share/showErrorModal";
import shareService from "../../../services/share.service";
import { Share as ShareType } from "../../../types/share.type";
import useTranslate from "../../../hooks/useTranslate.hook";
import EditableUpload from "../../../components/upload/EditableUpload";
import Meta from "../../../components/Meta";
export function getServerSideProps(context: GetServerSidePropsContext) {
return {
props: { shareId: context.params!.shareId },
};
}
const Share = ({ shareId }: { shareId: string }) => {
const t = useTranslate();
const modals = useModals();
const [isLoading, setIsLoading] = useState(true);
const [share, setShare] = useState<ShareType>();
useEffect(() => {
shareService
.getFromOwner(shareId)
.then((share) => {
setShare(share);
})
.catch((e) => {
const { error } = e.response.data;
if (e.response.status == 404) {
if (error == "share_removed") {
showErrorModal(
modals,
t("share.error.removed.title"),
e.response.data.message,
);
} else {
showErrorModal(
modals,
t("share.error.not-found.title"),
t("share.error.not-found.description"),
);
}
} else {
showErrorModal(modals, t("common.error"), t("common.error.unknown"));
}
})
.finally(() => {
setIsLoading(false);
});
}, []);
if (isLoading) return <LoadingOverlay visible />;
return (
<>
<Meta title={t("share.edit.title", { shareId })} />
<EditableUpload shareId={shareId} files={share?.files || []} />
</>
);
};
export default Share;

View File

@@ -42,7 +42,14 @@ const Upload = ({
const uploadFiles = async (share: CreateShare, files: FileUpload[]) => { const uploadFiles = async (share: CreateShare, files: FileUpload[]) => {
setisUploading(true); setisUploading(true);
createdShare = await shareService.create(share);
try {
createdShare = await shareService.create(share);
} catch (e) {
toast.axiosError(e);
setisUploading(false);
return;
}
const fileUploadPromises = files.map(async (file, fileIndex) => const fileUploadPromises = files.map(async (file, fileIndex) =>
// Limit the number of concurrent uploads to 3 // Limit the number of concurrent uploads to 3
@@ -132,6 +139,7 @@ const Upload = ({
"share.allowUnauthenticatedShares", "share.allowUnauthenticatedShares",
), ),
enableEmailRecepients: config.get("email.enableShareEmailRecipients"), enableEmailRecepients: config.get("email.enableShareEmailRecipients"),
maxExpirationInHours: config.get("share.maxExpiration"),
}, },
files, files,
uploadFiles, uploadFiles,
@@ -194,7 +202,9 @@ const Upload = ({
showCreateUploadModalCallback={showCreateUploadModalCallback} showCreateUploadModalCallback={showCreateUploadModalCallback}
isUploading={isUploading} isUploading={isUploading}
/> />
{files.length > 0 && <FileList files={files} setFiles={setFiles} />} {files.length > 0 && (
<FileList<FileUpload> files={files} setFiles={setFiles} />
)}
</> </>
); );
}; };

View File

@@ -19,10 +19,18 @@ const completeShare = async (id: string) => {
return (await api.post(`shares/${id}/complete`)).data; return (await api.post(`shares/${id}/complete`)).data;
}; };
const revertComplete = async (id: string) => {
return (await api.delete(`shares/${id}/complete`)).data;
};
const get = async (id: string): Promise<Share> => { const get = async (id: string): Promise<Share> => {
return (await api.get(`shares/${id}`)).data; return (await api.get(`shares/${id}`)).data;
}; };
const getFromOwner = async (id: string): Promise<Share> => {
return (await api.get(`shares/${id}/from-owner`)).data;
};
const getMetaData = async (id: string): Promise<ShareMetaData> => { const getMetaData = async (id: string): Promise<ShareMetaData> => {
return (await api.get(`shares/${id}/metaData`)).data; return (await api.get(`shares/${id}/metaData`)).data;
}; };
@@ -63,6 +71,10 @@ const downloadFile = async (shareId: string, fileId: string) => {
window.location.href = `${window.location.origin}/api/shares/${shareId}/files/${fileId}`; window.location.href = `${window.location.origin}/api/shares/${shareId}/files/${fileId}`;
}; };
const removeFile = async (shareId: string, fileId: string) => {
await api.delete(`shares/${shareId}/files/${fileId}`);
};
const uploadFile = async ( const uploadFile = async (
shareId: string, shareId: string,
readerEvent: ProgressEvent<FileReader>, readerEvent: ProgressEvent<FileReader>,
@@ -121,14 +133,17 @@ const removeReverseShare = async (id: string) => {
export default { export default {
create, create,
completeShare, completeShare,
revertComplete,
getShareToken, getShareToken,
get, get,
getFromOwner,
remove, remove,
getMetaData, getMetaData,
doesFileSupportPreview, doesFileSupportPreview,
getMyShares, getMyShares,
isShareIdAvailable, isShareIdAvailable,
downloadFile, downloadFile,
removeFile,
uploadFile, uploadFile,
setReverseShare, setReverseShare,
createReverseShare, createReverseShare,

View File

@@ -3,11 +3,20 @@ import { Global } from "@mantine/core";
const GlobalStyle = () => { const GlobalStyle = () => {
return ( return (
<Global <Global
styles={() => ({ styles={(theme) => ({
a: { a: {
color: "inherit", color: "inherit",
textDecoration: "none", textDecoration: "none",
}, },
"table.md, table.md th:nth-of-type(odd), table.md td:nth-of-type(odd)": {
background: theme.colorScheme == "dark"
? "rgba(50, 50, 50, 0.5)"
: "rgba(220, 220, 220, 0.5)",
},
"table.md td": {
paddingLeft: "0.5em",
paddingRight: "0.5em",
},
})} })}
/> />
); );

View File

@@ -7,3 +7,5 @@ export type FileMetaData = {
name: string; name: string;
size: string; size: string;
}; };
export type FileListItem = FileUpload | (FileMetaData & { deleted?: boolean });

View File

@@ -1,6 +1,6 @@
{ {
"name": "pingvin-share", "name": "pingvin-share",
"version": "0.19.0", "version": "0.22.0",
"scripts": { "scripts": {
"format": "cd frontend && npm run format && cd ../backend && npm run format", "format": "cd frontend && npm run format && cd ../backend && npm run format",
"lint": "cd frontend && npm run lint && cd ../backend && npm run lint", "lint": "cd frontend && npm run lint && cd ../backend && npm run lint",