Compare commits
71 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a963bfaf1 | ||
|
|
472c93d548 | ||
|
|
93aacca9b4 | ||
|
|
3505669135 | ||
|
|
fe735f9704 | ||
|
|
3563715f57 | ||
|
|
14c2185e6f | ||
|
|
27ee9fb6cb | ||
|
|
601772d2f4 | ||
|
|
0e66be5f08 | ||
|
|
4cabcfb715 | ||
|
|
e5e9d85d39 | ||
|
|
70fd2d94be | ||
|
|
e5a0c649e3 | ||
|
|
414bcecbb5 | ||
|
|
968352cb6c | ||
|
|
355f860387 | ||
|
|
083d82c28b | ||
|
|
046c630abf | ||
|
|
d2bfb9a55f | ||
|
|
fccf57e9e4 | ||
|
|
e1a68f75f7 | ||
|
|
9d9cc7b4ab | ||
|
|
d1cde75a66 | ||
|
|
bbc81d8dd0 | ||
|
|
0cdc04bfb5 | ||
|
|
367f804a49 | ||
|
|
9193a79b9a | ||
|
|
31366d961f | ||
|
|
2dac38560b | ||
|
|
db2720ab7b | ||
|
|
6d6b9e81ff | ||
|
|
f9ddd7bacd | ||
|
|
3773432eb5 | ||
|
|
46783ce463 | ||
|
|
c0cc16fa43 | ||
|
|
4fd29037a0 | ||
|
|
1c7832ad1f | ||
|
|
962ec27df4 | ||
|
|
9268e35141 | ||
|
|
e8be0d60e6 | ||
|
|
0eabf78f13 | ||
|
|
4136bf5778 | ||
|
|
42b3604e2a | ||
|
|
84f4c39c1e | ||
|
|
bfef246d98 | ||
|
|
3b89fb950a | ||
|
|
7afda85f03 | ||
|
|
a3a7a5d9ab | ||
|
|
74cd520cb8 | ||
|
|
a511f24a6b | ||
|
|
b3862f3f3e | ||
|
|
d147614f76 | ||
|
|
c999df15e0 | ||
|
|
908d6e298f | ||
|
|
44c4a2e269 | ||
|
|
dc060f258b | ||
|
|
3b1c9f1efb | ||
|
|
a45184995f | ||
|
|
b717663b5c | ||
|
|
0e12ba87bc | ||
|
|
ec1feadee9 | ||
|
|
2e0d8d4fed | ||
|
|
b7f0f9d3ee | ||
|
|
c303454db3 | ||
|
|
3972589f76 | ||
|
|
3c5e0ad513 | ||
|
|
384fd19203 | ||
|
|
9d1a12b0d1 | ||
|
|
24e100bd7b | ||
|
|
1da4feeb89 |
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: 💬 Discord
|
||||||
|
url: https://discord.gg/wHRQ9nFRcK
|
||||||
|
about: For help and chatting with the community
|
||||||
17
.github/ISSUE_TEMPLATE/question.yml
vendored
17
.github/ISSUE_TEMPLATE/question.yml
vendored
@@ -1,17 +0,0 @@
|
|||||||
name: ❓ Question
|
|
||||||
description: "Submit a question"
|
|
||||||
title: "❓ Question:"
|
|
||||||
labels: [question]
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
id: feature-description
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
attributes:
|
|
||||||
label: "🙋♂️ Question"
|
|
||||||
description: "A clear question. Please provide as much detail as possible."
|
|
||||||
placeholder: "How do I ...?"
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Before submitting, please check if the question hasn't been asked before.
|
|
||||||
95
CHANGELOG.md
95
CHANGELOG.md
@@ -1,3 +1,98 @@
|
|||||||
|
## [0.29.0](https://github.com/stonith404/pingvin-share/compare/v0.28.0...v0.29.0) (2024-07-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add more options to reverse shares ([#495](https://github.com/stonith404/pingvin-share/issues/495)) ([fe735f9](https://github.com/stonith404/pingvin-share/commit/fe735f9704c9d96398f3127a559e17848b08d140)), closes [#155](https://github.com/stonith404/pingvin-share/issues/155)
|
||||||
|
* sort share files by name by default ([27ee9fb](https://github.com/stonith404/pingvin-share/commit/27ee9fb6cb98177661bed20a0baa399b27e70b7e))
|
||||||
|
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "fix: set max age of access token cookie to 15 minutes" ([14c2185](https://github.com/stonith404/pingvin-share/commit/14c2185e6f1a81d63e25fbeec3e30a54cf6a44c5))
|
||||||
|
|
||||||
|
## [0.28.0](https://github.com/stonith404/pingvin-share/compare/v0.27.0...v0.28.0) (2024-07-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **auth:** Add role-based access management from OpenID Connect ([#535](https://github.com/stonith404/pingvin-share/issues/535)) ([70fd2d9](https://github.com/stonith404/pingvin-share/commit/70fd2d94be3411cc430f5c56e522028398127efb))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* store only 10 share tokens in the cookies and clear the expired ones ([e5a0c64](https://github.com/stonith404/pingvin-share/commit/e5a0c649e36e0db419d04446affe2564c45cf321))
|
||||||
|
|
||||||
|
## [0.27.0](https://github.com/stonith404/pingvin-share/compare/v0.26.0...v0.27.0) (2024-07-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add logs for successful registration, successful login and failed login ([d2bfb9a](https://github.com/stonith404/pingvin-share/commit/d2bfb9a55fdad6a05377b8552471cf1151304c90))
|
||||||
|
* **auth:** Allow to hide username / password login form when OAuth is enabled ([#518](https://github.com/stonith404/pingvin-share/issues/518)) ([e1a68f7](https://github.com/stonith404/pingvin-share/commit/e1a68f75f7b034f1ef9e45f26de584f13e355589)), closes [#489](https://github.com/stonith404/pingvin-share/issues/489)
|
||||||
|
* **smtp:** allow unauthorized mail server certificates ([#525](https://github.com/stonith404/pingvin-share/issues/525)) ([083d82c](https://github.com/stonith404/pingvin-share/commit/083d82c28b835c178f076e89ef8f5885e8ea31cb))
|
||||||
|
|
||||||
|
## [0.26.0](https://github.com/stonith404/pingvin-share/compare/v0.25.0...v0.26.0) (2024-07-03)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **backend:** Make session duration configurable ([#512](https://github.com/stonith404/pingvin-share/issues/512)) ([367f804](https://github.com/stonith404/pingvin-share/commit/367f804a494c85b4caf879d51982339fb6b86ba1)), closes [#507](https://github.com/stonith404/pingvin-share/issues/507)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **oauth:** provider username is ignored when signing up using OAuth ([#511](https://github.com/stonith404/pingvin-share/issues/511)) ([31366d9](https://github.com/stonith404/pingvin-share/commit/31366d961f5827c200038b65ec9de5d4ddc8b898)), closes [#505](https://github.com/stonith404/pingvin-share/issues/505)
|
||||||
|
* set max age of access token cookie to 15 minutes ([2dac385](https://github.com/stonith404/pingvin-share/commit/2dac38560b6c54b6e7676dcd4682bfa57973292f))
|
||||||
|
|
||||||
|
## [0.25.0](https://github.com/stonith404/pingvin-share/compare/v0.24.2...v0.25.0) (2024-06-10)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add auto open share modal config for global. ([#474](https://github.com/stonith404/pingvin-share/issues/474)) ([4fd2903](https://github.com/stonith404/pingvin-share/commit/4fd29037a08dbe505bdd8cf20f6f114cbade8483))
|
||||||
|
* **frontend:** locale for dates and tooltip for copy link button ([#492](https://github.com/stonith404/pingvin-share/issues/492)) ([1c7832a](https://github.com/stonith404/pingvin-share/commit/1c7832ad1fb445fd1dbe1c111be5a331eaa4b797))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* share size not displayed on my shares page ([c0cc16f](https://github.com/stonith404/pingvin-share/commit/c0cc16fa430bc64afb024c19d5faf24456bd417c))
|
||||||
|
|
||||||
|
## [0.24.2](https://github.com/stonith404/pingvin-share/compare/v0.24.1...v0.24.2) (2024-05-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* admin couldn't delete shares created by anonymous users ([7afda85](https://github.com/stonith404/pingvin-share/commit/7afda85f03d410a6c611860d0c3fb2b88a2e3679))
|
||||||
|
* whitespace in title on homepage ([74cd520](https://github.com/stonith404/pingvin-share/commit/74cd520cb8c4ea87822ab6d54c0bf010455f401b))
|
||||||
|
|
||||||
|
## [0.24.1](https://github.com/stonith404/pingvin-share/compare/v0.24.0...v0.24.1) (2024-05-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* error on admin share management page if a share was created by an anonymous user ([c999df1](https://github.com/stonith404/pingvin-share/commit/c999df15e04a927f6e952db3c807b9591fb14894))
|
||||||
|
|
||||||
|
## [0.24.0](https://github.com/stonith404/pingvin-share/compare/v0.23.1...v0.24.0) (2024-05-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add admin-exclusive share-management page ([#461](https://github.com/stonith404/pingvin-share/issues/461)) ([3b1c9f1](https://github.com/stonith404/pingvin-share/commit/3b1c9f1efb7d02469e92537a2d1378b6cb412878))
|
||||||
|
* add name property to share ([#462](https://github.com/stonith404/pingvin-share/issues/462)) ([b717663](https://github.com/stonith404/pingvin-share/commit/b717663b5c3a4a98e361e7e39b680f4852537c59))
|
||||||
|
|
||||||
|
## [0.23.1](https://github.com/stonith404/pingvin-share/compare/v0.23.0...v0.23.1) (2024-04-05)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **backend:** crash on unhandled promise rejections ([1da4fee](https://github.com/stonith404/pingvin-share/commit/1da4feeb895a13d0a0ae754bd716a84e8186d081))
|
||||||
|
* changing the chunk size needed an app restart ([24e100b](https://github.com/stonith404/pingvin-share/commit/24e100bd7be8bf20778bdf2767aa35cae8d7e502))
|
||||||
|
* disable js execution on raw file view ([9d1a12b](https://github.com/stonith404/pingvin-share/commit/9d1a12b0d1812214f1fe6fa56e3848091ce4945c))
|
||||||
|
* incorrect layout on 404 page ([3c5e0ad](https://github.com/stonith404/pingvin-share/commit/3c5e0ad5134ee2d405ac420152b5825102f65bfc))
|
||||||
|
* normal shares were added to the previous reverse share ([3972589](https://github.com/stonith404/pingvin-share/commit/3972589f76519b03074d916fb2460c795b1f0737))
|
||||||
|
* redirect vulnerability on error, sign in and totp page ([384fd19](https://github.com/stonith404/pingvin-share/commit/384fd19203b63eeb4b952f83a9e1eaab1b19b90d))
|
||||||
|
|
||||||
## [0.23.0](https://github.com/stonith404/pingvin-share/compare/v0.22.2...v0.23.0) (2024-04-04)
|
## [0.23.0](https://github.com/stonith404/pingvin-share/compare/v0.22.2...v0.23.0) (2024-04-04)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,4 +57,7 @@ EXPOSE 3000
|
|||||||
HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://localhost:3000/api/health || exit 1
|
HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://localhost:3000/api/health || exit 1
|
||||||
|
|
||||||
# Application startup updated for Caddy
|
# Application startup updated for Caddy
|
||||||
CMD cp -rn /tmp/img/* /opt/app/frontend/public/img && caddy run --config /etc/caddy/Caddyfile & 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 && \
|
||||||
|
caddy run --config /etc/caddy/Caddyfile 2> caddy.log & \
|
||||||
|
PORT=3333 HOSTNAME=0.0.0.0 node frontend/server.js & \
|
||||||
|
cd backend && npm run prod
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# <div align="center"><img src="https://user-images.githubusercontent.com/58886915/166198400-c2134044-1198-4647-a8b6-da9c4a204c68.svg" width="40"/> </br>Pingvin Share</div>
|
# <div align="center"><img src="https://user-images.githubusercontent.com/58886915/166198400-c2134044-1198-4647-a8b6-da9c4a204c68.svg" width="40"/> </br>Pingvin Share</div>
|
||||||
|
|
||||||
---
|
[](https://discord.gg/wHRQ9nFRcK) [](https://crowdin.com/project/pingvin-share) [](https://github.com/sponsors/stonith404)
|
||||||
|
|
||||||
_Read this in another language: [Spanish](/docs/README.es.md), [English](/README.md), [Simplified Chinese](/docs/README.zh-cn.md), [日本語](/docs/README.ja-jp.md)_
|
_Read this in another language: [Spanish](/docs/README.es.md), [English](/README.md), [简体中文](/docs/README.zh-cn.md), [日本語](/docs/README.ja-jp.md)_
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ Pingvin Share is self-hosted file sharing platform and an alternative for WeTran
|
|||||||
### Installation with Docker (recommended)
|
### Installation with Docker (recommended)
|
||||||
|
|
||||||
1. Download the `docker-compose.yml` file
|
1. Download the `docker-compose.yml` file
|
||||||
2. Run `docker-compose up -d`
|
2. Run `docker compose up -d`
|
||||||
|
|
||||||
The website is now listening on `http://localhost:3000`, have fun with Pingvin Share 🐧!
|
The website is now listening on `http://localhost:3000`, have fun with Pingvin Share 🐧!
|
||||||
|
|
||||||
@@ -87,6 +87,7 @@ View the [OAuth 2 guide](/docs/oauth2-guide.md) for more information.
|
|||||||
### Additional resources
|
### Additional resources
|
||||||
|
|
||||||
- [Synology NAS installation](https://mariushosting.com/how-to-install-pingvin-share-on-your-synology-nas/)
|
- [Synology NAS installation](https://mariushosting.com/how-to-install-pingvin-share-on-your-synology-nas/)
|
||||||
|
- [Zeabur installation](https://zeabur.com/templates/19G6OK)
|
||||||
|
|
||||||
### Upgrade to a new version
|
### Upgrade to a new version
|
||||||
|
|
||||||
|
|||||||
10748
backend/package-lock.json
generated
10748
backend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-backend",
|
"name": "pingvin-share-backend",
|
||||||
"version": "0.23.0",
|
"version": "0.29.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "nest build",
|
"build": "nest build",
|
||||||
"dev": "cross-env NODE_ENV=development nest start --watch",
|
"dev": "cross-env NODE_ENV=development nest start --watch",
|
||||||
@@ -13,73 +13,73 @@
|
|||||||
"seed": "ts-node prisma/seed/config.seed.ts"
|
"seed": "ts-node prisma/seed/config.seed.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nestjs/cache-manager": "^2.1.0",
|
"@nestjs/cache-manager": "^2.2.2",
|
||||||
"@nestjs/common": "^10.1.2",
|
"@nestjs/common": "^10.3.9",
|
||||||
"@nestjs/config": "^3.0.0",
|
"@nestjs/config": "^3.2.2",
|
||||||
"@nestjs/core": "^10.1.2",
|
"@nestjs/core": "^10.3.9",
|
||||||
"@nestjs/jwt": "^10.1.0",
|
"@nestjs/jwt": "^10.2.0",
|
||||||
"@nestjs/passport": "^10.0.0",
|
"@nestjs/passport": "^10.0.3",
|
||||||
"@nestjs/platform-express": "^10.1.2",
|
"@nestjs/platform-express": "^10.3.9",
|
||||||
"@nestjs/schedule": "^3.0.1",
|
"@nestjs/schedule": "^4.0.2",
|
||||||
"@nestjs/swagger": "^7.1.4",
|
"@nestjs/swagger": "^7.3.1",
|
||||||
"@nestjs/throttler": "^4.2.1",
|
"@nestjs/throttler": "^5.2.0",
|
||||||
"@prisma/client": "^5.0.0",
|
"@prisma/client": "^5.16.1",
|
||||||
"archiver": "^5.3.1",
|
"@types/jmespath": "^0.15.2",
|
||||||
"argon2": "^0.30.3",
|
"archiver": "^7.0.1",
|
||||||
|
"argon2": "^0.40.3",
|
||||||
"body-parser": "^1.20.2",
|
"body-parser": "^1.20.2",
|
||||||
"cache-manager": "^5.2.4",
|
"cache-manager": "^5.6.1",
|
||||||
"clamscan": "^2.1.2",
|
"clamscan": "^2.2.1",
|
||||||
"class-transformer": "^0.5.1",
|
"class-transformer": "^0.5.1",
|
||||||
"class-validator": "^0.14.0",
|
"class-validator": "^0.14.1",
|
||||||
"content-disposition": "^0.5.4",
|
"content-disposition": "^0.5.4",
|
||||||
"cookie-parser": "^1.4.6",
|
"cookie-parser": "^1.4.6",
|
||||||
|
"jmespath": "^0.16.0",
|
||||||
"mime-types": "^2.1.35",
|
"mime-types": "^2.1.35",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.30.1",
|
||||||
"nanoid": "^3.3.6",
|
"nanoid": "^3.3.7",
|
||||||
"node-fetch": "^2.7.0",
|
"nodemailer": "^6.9.14",
|
||||||
"nodemailer": "^6.9.4",
|
|
||||||
"otplib": "^12.0.1",
|
"otplib": "^12.0.1",
|
||||||
"passport": "^0.6.0",
|
"passport": "^0.7.0",
|
||||||
"passport-jwt": "^4.0.1",
|
"passport-jwt": "^4.0.1",
|
||||||
"passport-local": "^1.0.0",
|
"passport-local": "^1.0.0",
|
||||||
"qrcode-svg": "^1.1.0",
|
"qrcode-svg": "^1.1.0",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.2.2",
|
||||||
"rimraf": "^5.0.1",
|
"rimraf": "^5.0.7",
|
||||||
"rxjs": "^7.8.1",
|
"rxjs": "^7.8.1",
|
||||||
"sharp": "^0.32.4",
|
"sharp": "^0.33.4",
|
||||||
"ts-node": "^10.9.1"
|
"ts-node": "^10.9.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nestjs/cli": "^10.1.10",
|
"@nestjs/cli": "^10.3.2",
|
||||||
"@nestjs/schematics": "^10.0.1",
|
"@nestjs/schematics": "^10.1.1",
|
||||||
"@nestjs/testing": "^10.1.2",
|
"@nestjs/testing": "^10.3.9",
|
||||||
"@types/archiver": "^5.3.2",
|
"@types/archiver": "^6.0.2",
|
||||||
"@types/clamscan": "^2.0.4",
|
"@types/clamscan": "^2.0.8",
|
||||||
"@types/cookie-parser": "^1.4.3",
|
"@types/cookie-parser": "^1.4.7",
|
||||||
"@types/cron": "^2.0.1",
|
"@types/cron": "^2.0.1",
|
||||||
"@types/express": "^4.17.17",
|
"@types/express": "^4.17.21",
|
||||||
"@types/mime-types": "^2.1.1",
|
"@types/mime-types": "^2.1.4",
|
||||||
"@types/multer": "^1.4.7",
|
"@types/multer": "^1.4.11",
|
||||||
"@types/node": "^20.4.5",
|
"@types/node": "^20.14.9",
|
||||||
"@types/node-fetch": "^2.6.6",
|
"@types/nodemailer": "^6.4.15",
|
||||||
"@types/nodemailer": "^6.4.9",
|
"@types/passport-jwt": "^4.0.1",
|
||||||
"@types/passport-jwt": "^3.0.9",
|
"@types/qrcode-svg": "^1.1.4",
|
||||||
"@types/qrcode-svg": "^1.1.1",
|
|
||||||
"@types/sharp": "^0.31.1",
|
"@types/sharp": "^0.31.1",
|
||||||
"@types/supertest": "^2.0.12",
|
"@types/supertest": "^6.0.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.2.0",
|
"@typescript-eslint/eslint-plugin": "^7.14.1",
|
||||||
"@typescript-eslint/parser": "^6.2.0",
|
"@typescript-eslint/parser": "^7.14.1",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"eslint": "^8.46.0",
|
"eslint": "^8.56.0",
|
||||||
"eslint-config-prettier": "^8.9.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-prettier": "^5.0.0",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"newman": "^5.3.2",
|
"newman": "^6.1.3",
|
||||||
"prettier": "^3.0.0",
|
"prettier": "^3.3.2",
|
||||||
"prisma": "^5.0.0",
|
"prisma": "^5.16.1",
|
||||||
"source-map-support": "^0.5.21",
|
"source-map-support": "^0.5.21",
|
||||||
"ts-loader": "^9.4.4",
|
"ts-loader": "^9.5.1",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"typescript": "^5.1.6",
|
"typescript": "^5.5.2",
|
||||||
"wait-on": "^7.0.1"
|
"wait-on": "^7.2.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Share" ADD COLUMN "name" TEXT;
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
-- RedefineTables
|
||||||
|
PRAGMA foreign_keys=OFF;
|
||||||
|
CREATE TABLE "new_ReverseShare" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"token" TEXT NOT NULL,
|
||||||
|
"shareExpiration" DATETIME NOT NULL,
|
||||||
|
"maxShareSize" TEXT NOT NULL,
|
||||||
|
"sendEmailNotification" BOOLEAN NOT NULL,
|
||||||
|
"remainingUses" INTEGER NOT NULL,
|
||||||
|
"simplified" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"creatorId" TEXT NOT NULL,
|
||||||
|
CONSTRAINT "ReverseShare_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
INSERT INTO "new_ReverseShare" ("createdAt", "creatorId", "id", "maxShareSize", "remainingUses", "sendEmailNotification", "shareExpiration", "token") SELECT "createdAt", "creatorId", "id", "maxShareSize", "remainingUses", "sendEmailNotification", "shareExpiration", "token" FROM "ReverseShare";
|
||||||
|
DROP TABLE "ReverseShare";
|
||||||
|
ALTER TABLE "new_ReverseShare" RENAME TO "ReverseShare";
|
||||||
|
CREATE UNIQUE INDEX "ReverseShare_token_key" ON "ReverseShare"("token");
|
||||||
|
PRAGMA foreign_key_check;
|
||||||
|
PRAGMA foreign_keys=ON;
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
-- RedefineTables
|
||||||
|
PRAGMA defer_foreign_keys=ON;
|
||||||
|
PRAGMA foreign_keys=OFF;
|
||||||
|
CREATE TABLE "new_ReverseShare" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"token" TEXT NOT NULL,
|
||||||
|
"shareExpiration" DATETIME NOT NULL,
|
||||||
|
"maxShareSize" TEXT NOT NULL,
|
||||||
|
"sendEmailNotification" BOOLEAN NOT NULL,
|
||||||
|
"remainingUses" INTEGER NOT NULL,
|
||||||
|
"simplified" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"publicAccess" BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
"creatorId" TEXT NOT NULL,
|
||||||
|
CONSTRAINT "ReverseShare_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
INSERT INTO "new_ReverseShare" ("createdAt", "creatorId", "id", "maxShareSize", "remainingUses", "sendEmailNotification", "shareExpiration", "simplified", "token") SELECT "createdAt", "creatorId", "id", "maxShareSize", "remainingUses", "sendEmailNotification", "shareExpiration", "simplified", "token" FROM "ReverseShare";
|
||||||
|
DROP TABLE "ReverseShare";
|
||||||
|
ALTER TABLE "new_ReverseShare" RENAME TO "ReverseShare";
|
||||||
|
CREATE UNIQUE INDEX "ReverseShare_token_key" ON "ReverseShare"("token");
|
||||||
|
PRAGMA foreign_keys=ON;
|
||||||
|
PRAGMA defer_foreign_keys=OFF;
|
||||||
@@ -75,6 +75,7 @@ model Share {
|
|||||||
id String @id @default(uuid())
|
id String @id @default(uuid())
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
|
|
||||||
|
name String?
|
||||||
uploadLocked Boolean @default(false)
|
uploadLocked Boolean @default(false)
|
||||||
isZipReady Boolean @default(false)
|
isZipReady Boolean @default(false)
|
||||||
views Int @default(0)
|
views Int @default(0)
|
||||||
@@ -102,6 +103,8 @@ model ReverseShare {
|
|||||||
maxShareSize String
|
maxShareSize String
|
||||||
sendEmailNotification Boolean
|
sendEmailNotification Boolean
|
||||||
remainingUses Int
|
remainingUses Int
|
||||||
|
simplified Boolean @default(false)
|
||||||
|
publicAccess Boolean @default(true)
|
||||||
|
|
||||||
creatorId String
|
creatorId String
|
||||||
creator User @relation(fields: [creatorId], references: [id], onDelete: Cascade)
|
creator User @relation(fields: [creatorId], references: [id], onDelete: Cascade)
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ const configVariables: ConfigVariables = {
|
|||||||
defaultValue: "true",
|
defaultValue: "true",
|
||||||
secret: false,
|
secret: false,
|
||||||
},
|
},
|
||||||
|
sessionDuration: {
|
||||||
|
type: "number",
|
||||||
|
defaultValue: "2160",
|
||||||
|
secret: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
share: {
|
share: {
|
||||||
allowRegistration: {
|
allowRegistration: {
|
||||||
@@ -56,12 +61,16 @@ const configVariables: ConfigVariables = {
|
|||||||
defaultValue: "10000000",
|
defaultValue: "10000000",
|
||||||
secret: false,
|
secret: false,
|
||||||
},
|
},
|
||||||
|
autoOpenShareModal: {
|
||||||
|
type: "boolean",
|
||||||
|
defaultValue: "false",
|
||||||
|
secret: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
email: {
|
email: {
|
||||||
enableShareEmailRecipients: {
|
enableShareEmailRecipients: {
|
||||||
type: "boolean",
|
type: "boolean",
|
||||||
defaultValue: "false",
|
defaultValue: "false",
|
||||||
|
|
||||||
secret: false,
|
secret: false,
|
||||||
},
|
},
|
||||||
shareRecipientsSubject: {
|
shareRecipientsSubject: {
|
||||||
@@ -107,6 +116,12 @@ const configVariables: ConfigVariables = {
|
|||||||
defaultValue: "false",
|
defaultValue: "false",
|
||||||
secret: false,
|
secret: false,
|
||||||
},
|
},
|
||||||
|
allowUnauthorizedCertificates: {
|
||||||
|
type: "boolean",
|
||||||
|
defaultValue: "false",
|
||||||
|
|
||||||
|
secret: false,
|
||||||
|
},
|
||||||
host: {
|
host: {
|
||||||
type: "string",
|
type: "string",
|
||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
@@ -138,6 +153,11 @@ const configVariables: ConfigVariables = {
|
|||||||
type: "boolean",
|
type: "boolean",
|
||||||
defaultValue: "true",
|
defaultValue: "true",
|
||||||
},
|
},
|
||||||
|
"disablePassword": {
|
||||||
|
type: "boolean",
|
||||||
|
defaultValue: "false",
|
||||||
|
secret: false,
|
||||||
|
},
|
||||||
"github-enabled": {
|
"github-enabled": {
|
||||||
type: "boolean",
|
type: "boolean",
|
||||||
defaultValue: "false",
|
defaultValue: "false",
|
||||||
@@ -210,6 +230,18 @@ const configVariables: ConfigVariables = {
|
|||||||
type: "string",
|
type: "string",
|
||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
},
|
},
|
||||||
|
"oidc-rolePath": {
|
||||||
|
type: "string",
|
||||||
|
defaultValue: "",
|
||||||
|
},
|
||||||
|
"oidc-roleGeneralAccess": {
|
||||||
|
type: "string",
|
||||||
|
defaultValue: "",
|
||||||
|
},
|
||||||
|
"oidc-roleAdminAccess": {
|
||||||
|
type: "string",
|
||||||
|
defaultValue: "",
|
||||||
|
},
|
||||||
"oidc-clientId": {
|
"oidc-clientId": {
|
||||||
type: "string",
|
type: "string",
|
||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
@@ -219,7 +251,7 @@ const configVariables: ConfigVariables = {
|
|||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
obscured: true,
|
obscured: true,
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
type ConfigVariables = {
|
type ConfigVariables = {
|
||||||
@@ -271,12 +303,15 @@ async function seedConfigVariables() {
|
|||||||
|
|
||||||
async function migrateConfigVariables() {
|
async function migrateConfigVariables() {
|
||||||
const existingConfigVariables = await prisma.config.findMany();
|
const existingConfigVariables = await prisma.config.findMany();
|
||||||
|
const orderMap: { [category: string]: number } = {};
|
||||||
|
|
||||||
for (const existingConfigVariable of existingConfigVariables) {
|
for (const existingConfigVariable of existingConfigVariables) {
|
||||||
const configVariable =
|
const configVariable =
|
||||||
configVariables[existingConfigVariable.category]?.[
|
configVariables[existingConfigVariable.category]?.[
|
||||||
existingConfigVariable.name
|
existingConfigVariable.name
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Delete the config variable if it doesn't exist in the seed
|
||||||
if (!configVariable) {
|
if (!configVariable) {
|
||||||
await prisma.config.delete({
|
await prisma.config.delete({
|
||||||
where: {
|
where: {
|
||||||
@@ -287,15 +322,11 @@ async function migrateConfigVariables() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// Update the config variable if the metadata changed
|
// Update the config variable if it exists in the seed
|
||||||
} else if (
|
} else {
|
||||||
JSON.stringify({
|
const variableOrder = Object.keys(
|
||||||
...configVariable,
|
configVariables[existingConfigVariable.category]
|
||||||
name: existingConfigVariable.name,
|
).indexOf(existingConfigVariable.name);
|
||||||
category: existingConfigVariable.category,
|
|
||||||
value: existingConfigVariable.value,
|
|
||||||
}) != JSON.stringify(existingConfigVariable)
|
|
||||||
) {
|
|
||||||
await prisma.config.update({
|
await prisma.config.update({
|
||||||
where: {
|
where: {
|
||||||
name_category: {
|
name_category: {
|
||||||
@@ -308,8 +339,10 @@ async function migrateConfigVariables() {
|
|||||||
name: existingConfigVariable.name,
|
name: existingConfigVariable.name,
|
||||||
category: existingConfigVariable.category,
|
category: existingConfigVariable.category,
|
||||||
value: existingConfigVariable.value,
|
value: existingConfigVariable.value,
|
||||||
|
order: variableOrder,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
orderMap[existingConfigVariable.category] = variableOrder + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,20 +3,20 @@ import { Module } from "@nestjs/common";
|
|||||||
import { ScheduleModule } from "@nestjs/schedule";
|
import { ScheduleModule } from "@nestjs/schedule";
|
||||||
import { AuthModule } from "./auth/auth.module";
|
import { AuthModule } from "./auth/auth.module";
|
||||||
|
|
||||||
|
import { CacheModule } from "@nestjs/cache-manager";
|
||||||
import { APP_GUARD } from "@nestjs/core";
|
import { APP_GUARD } from "@nestjs/core";
|
||||||
import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler";
|
import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler";
|
||||||
|
import { AppController } from "./app.controller";
|
||||||
|
import { ClamScanModule } from "./clamscan/clamscan.module";
|
||||||
import { ConfigModule } from "./config/config.module";
|
import { ConfigModule } from "./config/config.module";
|
||||||
import { EmailModule } from "./email/email.module";
|
import { EmailModule } from "./email/email.module";
|
||||||
import { FileModule } from "./file/file.module";
|
import { FileModule } from "./file/file.module";
|
||||||
import { JobsModule } from "./jobs/jobs.module";
|
import { JobsModule } from "./jobs/jobs.module";
|
||||||
|
import { OAuthModule } from "./oauth/oauth.module";
|
||||||
import { PrismaModule } from "./prisma/prisma.module";
|
import { PrismaModule } from "./prisma/prisma.module";
|
||||||
|
import { ReverseShareModule } from "./reverseShare/reverseShare.module";
|
||||||
import { ShareModule } from "./share/share.module";
|
import { ShareModule } from "./share/share.module";
|
||||||
import { UserModule } from "./user/user.module";
|
import { UserModule } from "./user/user.module";
|
||||||
import { ClamScanModule } from "./clamscan/clamscan.module";
|
|
||||||
import { ReverseShareModule } from "./reverseShare/reverseShare.module";
|
|
||||||
import { AppController } from "./app.controller";
|
|
||||||
import { OAuthModule } from "./oauth/oauth.module";
|
|
||||||
import { CacheModule } from "@nestjs/cache-manager";
|
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
@@ -28,10 +28,12 @@ import { CacheModule } from "@nestjs/cache-manager";
|
|||||||
ConfigModule,
|
ConfigModule,
|
||||||
JobsModule,
|
JobsModule,
|
||||||
UserModule,
|
UserModule,
|
||||||
ThrottlerModule.forRoot({
|
ThrottlerModule.forRoot([
|
||||||
ttl: 60,
|
{
|
||||||
limit: 100,
|
ttl: 60,
|
||||||
}),
|
limit: 100,
|
||||||
|
},
|
||||||
|
]),
|
||||||
ScheduleModule.forRoot(),
|
ScheduleModule.forRoot(),
|
||||||
ClamScanModule,
|
ClamScanModule,
|
||||||
ReverseShareModule,
|
ReverseShareModule,
|
||||||
|
|||||||
@@ -37,15 +37,21 @@ export class AuthController {
|
|||||||
) {}
|
) {}
|
||||||
|
|
||||||
@Post("signUp")
|
@Post("signUp")
|
||||||
@Throttle(10, 5 * 60)
|
@Throttle({
|
||||||
|
default: {
|
||||||
|
limit: 20,
|
||||||
|
ttl: 5 * 60,
|
||||||
|
},
|
||||||
|
})
|
||||||
async signUp(
|
async signUp(
|
||||||
@Body() dto: AuthRegisterDTO,
|
@Body() dto: AuthRegisterDTO,
|
||||||
|
@Req() { ip }: Request,
|
||||||
@Res({ passthrough: true }) response: Response,
|
@Res({ passthrough: true }) response: Response,
|
||||||
) {
|
) {
|
||||||
if (!this.config.get("share.allowRegistration"))
|
if (!this.config.get("share.allowRegistration"))
|
||||||
throw new ForbiddenException("Registration is not allowed");
|
throw new ForbiddenException("Registration is not allowed");
|
||||||
|
|
||||||
const result = await this.authService.signUp(dto);
|
const result = await this.authService.signUp(dto, ip);
|
||||||
|
|
||||||
this.authService.addTokensToResponse(
|
this.authService.addTokensToResponse(
|
||||||
response,
|
response,
|
||||||
@@ -57,13 +63,19 @@ export class AuthController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Post("signIn")
|
@Post("signIn")
|
||||||
@Throttle(10, 5 * 60)
|
@Throttle({
|
||||||
|
default: {
|
||||||
|
limit: 20,
|
||||||
|
ttl: 5 * 60,
|
||||||
|
},
|
||||||
|
})
|
||||||
@HttpCode(200)
|
@HttpCode(200)
|
||||||
async signIn(
|
async signIn(
|
||||||
@Body() dto: AuthSignInDTO,
|
@Body() dto: AuthSignInDTO,
|
||||||
|
@Req() { ip }: Request,
|
||||||
@Res({ passthrough: true }) response: Response,
|
@Res({ passthrough: true }) response: Response,
|
||||||
) {
|
) {
|
||||||
const result = await this.authService.signIn(dto);
|
const result = await this.authService.signIn(dto, ip);
|
||||||
|
|
||||||
if (result.accessToken && result.refreshToken) {
|
if (result.accessToken && result.refreshToken) {
|
||||||
this.authService.addTokensToResponse(
|
this.authService.addTokensToResponse(
|
||||||
@@ -77,7 +89,12 @@ export class AuthController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Post("signIn/totp")
|
@Post("signIn/totp")
|
||||||
@Throttle(10, 5 * 60)
|
@Throttle({
|
||||||
|
default: {
|
||||||
|
limit: 20,
|
||||||
|
ttl: 5 * 60,
|
||||||
|
},
|
||||||
|
})
|
||||||
@HttpCode(200)
|
@HttpCode(200)
|
||||||
async signInTotp(
|
async signInTotp(
|
||||||
@Body() dto: AuthSignInTotpDTO,
|
@Body() dto: AuthSignInTotpDTO,
|
||||||
@@ -95,14 +112,24 @@ export class AuthController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Post("resetPassword/:email")
|
@Post("resetPassword/:email")
|
||||||
@Throttle(5, 5 * 60)
|
@Throttle({
|
||||||
|
default: {
|
||||||
|
limit: 20,
|
||||||
|
ttl: 5 * 60,
|
||||||
|
},
|
||||||
|
})
|
||||||
@HttpCode(202)
|
@HttpCode(202)
|
||||||
async requestResetPassword(@Param("email") email: string) {
|
async requestResetPassword(@Param("email") email: string) {
|
||||||
this.authService.requestResetPassword(email);
|
this.authService.requestResetPassword(email);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Post("resetPassword")
|
@Post("resetPassword")
|
||||||
@Throttle(5, 5 * 60)
|
@Throttle({
|
||||||
|
default: {
|
||||||
|
limit: 20,
|
||||||
|
ttl: 5 * 60,
|
||||||
|
},
|
||||||
|
})
|
||||||
@HttpCode(204)
|
@HttpCode(204)
|
||||||
async resetPassword(@Body() dto: ResetPasswordDTO) {
|
async resetPassword(@Body() dto: ResetPasswordDTO) {
|
||||||
return await this.authService.resetPassword(dto.token, dto.password);
|
return await this.authService.resetPassword(dto.token, dto.password);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import {
|
|||||||
BadRequestException,
|
BadRequestException,
|
||||||
ForbiddenException,
|
ForbiddenException,
|
||||||
Injectable,
|
Injectable,
|
||||||
|
Logger,
|
||||||
UnauthorizedException,
|
UnauthorizedException,
|
||||||
} from "@nestjs/common";
|
} from "@nestjs/common";
|
||||||
import { JwtService } from "@nestjs/jwt";
|
import { JwtService } from "@nestjs/jwt";
|
||||||
@@ -24,8 +25,9 @@ export class AuthService {
|
|||||||
private config: ConfigService,
|
private config: ConfigService,
|
||||||
private emailService: EmailService,
|
private emailService: EmailService,
|
||||||
) {}
|
) {}
|
||||||
|
private readonly logger = new Logger(AuthService.name);
|
||||||
|
|
||||||
async signUp(dto: AuthRegisterDTO) {
|
async signUp(dto: AuthRegisterDTO, ip: string, isAdmin?: boolean) {
|
||||||
const isFirstUser = (await this.prisma.user.count()) == 0;
|
const isFirstUser = (await this.prisma.user.count()) == 0;
|
||||||
|
|
||||||
const hash = dto.password ? await argon.hash(dto.password) : null;
|
const hash = dto.password ? await argon.hash(dto.password) : null;
|
||||||
@@ -35,7 +37,7 @@ export class AuthService {
|
|||||||
email: dto.email,
|
email: dto.email,
|
||||||
username: dto.username,
|
username: dto.username,
|
||||||
password: hash,
|
password: hash,
|
||||||
isAdmin: isFirstUser,
|
isAdmin: isAdmin ?? isFirstUser,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -44,6 +46,7 @@ export class AuthService {
|
|||||||
);
|
);
|
||||||
const accessToken = await this.createAccessToken(user, refreshTokenId);
|
const accessToken = await this.createAccessToken(user, refreshTokenId);
|
||||||
|
|
||||||
|
this.logger.log(`User ${user.email} signed up from IP ${ip}`);
|
||||||
return { accessToken, refreshToken, user };
|
return { accessToken, refreshToken, user };
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof PrismaClientKnownRequestError) {
|
if (e instanceof PrismaClientKnownRequestError) {
|
||||||
@@ -57,19 +60,27 @@ export class AuthService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async signIn(dto: AuthSignInDTO) {
|
async signIn(dto: AuthSignInDTO, ip: string) {
|
||||||
if (!dto.email && !dto.username)
|
if (!dto.email && !dto.username)
|
||||||
throw new BadRequestException("Email or username is required");
|
throw new BadRequestException("Email or username is required");
|
||||||
|
|
||||||
|
if (this.config.get("oauth.disablePassword"))
|
||||||
|
throw new ForbiddenException("Password sign in is disabled");
|
||||||
|
|
||||||
const user = await this.prisma.user.findFirst({
|
const user = await this.prisma.user.findFirst({
|
||||||
where: {
|
where: {
|
||||||
OR: [{ email: dto.email }, { username: dto.username }],
|
OR: [{ email: dto.email }, { username: dto.username }],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!user || !(await argon.verify(user.password, dto.password)))
|
if (!user || !(await argon.verify(user.password, dto.password))) {
|
||||||
|
this.logger.log(
|
||||||
|
`Failed login attempt for user ${dto.email} from IP ${ip}`,
|
||||||
|
);
|
||||||
throw new UnauthorizedException("Wrong email or password");
|
throw new UnauthorizedException("Wrong email or password");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.logger.log(`Successful login for user ${user.email} from IP ${ip}`);
|
||||||
return this.generateToken(user);
|
return this.generateToken(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,12 +105,15 @@ export class AuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async requestResetPassword(email: string) {
|
async requestResetPassword(email: string) {
|
||||||
|
if (this.config.get("oauth.disablePassword"))
|
||||||
|
throw new ForbiddenException("Password sign in is disabled");
|
||||||
|
|
||||||
const user = await this.prisma.user.findFirst({
|
const user = await this.prisma.user.findFirst({
|
||||||
where: { email },
|
where: { email },
|
||||||
include: { resetPasswordToken: true },
|
include: { resetPasswordToken: true },
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!user) throw new BadRequestException("User not found");
|
if (!user) return;
|
||||||
|
|
||||||
// Delete old reset password token
|
// Delete old reset password token
|
||||||
if (user.resetPasswordToken) {
|
if (user.resetPasswordToken) {
|
||||||
@@ -119,6 +133,9 @@ export class AuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async resetPassword(token: string, newPassword: string) {
|
async resetPassword(token: string, newPassword: string) {
|
||||||
|
if (this.config.get("oauth.disablePassword"))
|
||||||
|
throw new ForbiddenException("Password sign in is disabled");
|
||||||
|
|
||||||
const user = await this.prisma.user.findFirst({
|
const user = await this.prisma.user.findFirst({
|
||||||
where: { resetPasswordToken: { token } },
|
where: { resetPasswordToken: { token } },
|
||||||
});
|
});
|
||||||
@@ -205,7 +222,12 @@ export class AuthService {
|
|||||||
|
|
||||||
async createRefreshToken(userId: string) {
|
async createRefreshToken(userId: string) {
|
||||||
const { id, token } = await this.prisma.refreshToken.create({
|
const { id, token } = await this.prisma.refreshToken.create({
|
||||||
data: { userId, expiresAt: moment().add(3, "months").toDate() },
|
data: {
|
||||||
|
userId,
|
||||||
|
expiresAt: moment()
|
||||||
|
.add(this.config.get("general.sessionDuration"), "hours")
|
||||||
|
.toDate(),
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return { refreshTokenId: id, refreshToken: token };
|
return { refreshTokenId: id, refreshToken: token };
|
||||||
@@ -236,7 +258,7 @@ export class AuthService {
|
|||||||
path: "/api/auth/token",
|
path: "/api/auth/token",
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
sameSite: "strict",
|
sameSite: "strict",
|
||||||
maxAge: 1000 * 60 * 60 * 24 * 30 * 3, // 3 months
|
maxAge: 1000 * 60 * 60 * this.config.get("general.sessionDuration"),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ export class EmailService {
|
|||||||
user: this.config.get("smtp.username"),
|
user: this.config.get("smtp.username"),
|
||||||
pass: this.config.get("smtp.password"),
|
pass: this.config.get("smtp.password"),
|
||||||
},
|
},
|
||||||
|
tls: {
|
||||||
|
rejectUnauthorized: !this.config.get(
|
||||||
|
"smtp.allowUnauthorizedCertificates",
|
||||||
|
),
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,13 @@ export class FileController {
|
|||||||
@SkipThrottle()
|
@SkipThrottle()
|
||||||
@UseGuards(CreateShareGuard, ShareOwnerGuard)
|
@UseGuards(CreateShareGuard, ShareOwnerGuard)
|
||||||
async create(
|
async create(
|
||||||
@Query() query: any,
|
@Query()
|
||||||
|
query: {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
chunkIndex: string;
|
||||||
|
totalChunks: string;
|
||||||
|
},
|
||||||
@Body() body: string,
|
@Body() body: string,
|
||||||
@Param("shareId") shareId: string,
|
@Param("shareId") shareId: string,
|
||||||
) {
|
) {
|
||||||
@@ -69,6 +75,7 @@ export class FileController {
|
|||||||
const headers = {
|
const headers = {
|
||||||
"Content-Type": file.metaData.mimeType,
|
"Content-Type": file.metaData.mimeType,
|
||||||
"Content-Length": file.metaData.size,
|
"Content-Length": file.metaData.size,
|
||||||
|
"Content-Security-Policy": "script-src 'none'",
|
||||||
};
|
};
|
||||||
|
|
||||||
if (download === "true") {
|
if (download === "true") {
|
||||||
|
|||||||
@@ -9,14 +9,16 @@ import * as moment from "moment";
|
|||||||
import { PrismaService } from "src/prisma/prisma.service";
|
import { PrismaService } from "src/prisma/prisma.service";
|
||||||
import { ShareSecurityGuard } from "src/share/guard/shareSecurity.guard";
|
import { ShareSecurityGuard } from "src/share/guard/shareSecurity.guard";
|
||||||
import { ShareService } from "src/share/share.service";
|
import { ShareService } from "src/share/share.service";
|
||||||
|
import { ConfigService } from "src/config/config.service";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class FileSecurityGuard extends ShareSecurityGuard {
|
export class FileSecurityGuard extends ShareSecurityGuard {
|
||||||
constructor(
|
constructor(
|
||||||
private _shareService: ShareService,
|
private _shareService: ShareService,
|
||||||
private _prisma: PrismaService,
|
private _prisma: PrismaService,
|
||||||
|
_config: ConfigService,
|
||||||
) {
|
) {
|
||||||
super(_shareService, _prisma);
|
super(_shareService, _prisma, _config);
|
||||||
}
|
}
|
||||||
|
|
||||||
async canActivate(context: ExecutionContext) {
|
async canActivate(context: ExecutionContext) {
|
||||||
|
|||||||
@@ -1,13 +1,18 @@
|
|||||||
import { ClassSerializerInterceptor, ValidationPipe } from "@nestjs/common";
|
import {
|
||||||
|
ClassSerializerInterceptor,
|
||||||
|
Logger,
|
||||||
|
ValidationPipe,
|
||||||
|
} from "@nestjs/common";
|
||||||
import { NestFactory, Reflector } from "@nestjs/core";
|
import { NestFactory, Reflector } from "@nestjs/core";
|
||||||
import { NestExpressApplication } from "@nestjs/platform-express";
|
import { NestExpressApplication } from "@nestjs/platform-express";
|
||||||
import { DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
|
import { DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
|
||||||
import * as bodyParser from "body-parser";
|
import * as bodyParser from "body-parser";
|
||||||
import * as cookieParser from "cookie-parser";
|
import * as cookieParser from "cookie-parser";
|
||||||
|
import { NextFunction, Request, Response } from "express";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { AppModule } from "./app.module";
|
import { AppModule } from "./app.module";
|
||||||
import { DATA_DIRECTORY } from "./constants";
|
|
||||||
import { ConfigService } from "./config/config.service";
|
import { ConfigService } from "./config/config.service";
|
||||||
|
import { DATA_DIRECTORY } from "./constants";
|
||||||
|
|
||||||
async function bootstrap() {
|
async function bootstrap() {
|
||||||
const app = await NestFactory.create<NestExpressApplication>(AppModule);
|
const app = await NestFactory.create<NestExpressApplication>(AppModule);
|
||||||
@@ -15,12 +20,14 @@ async function bootstrap() {
|
|||||||
app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
|
app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
|
||||||
|
|
||||||
const config = app.get<ConfigService>(ConfigService);
|
const config = app.get<ConfigService>(ConfigService);
|
||||||
app.use(
|
|
||||||
|
app.use((req: Request, res: Response, next: NextFunction) => {
|
||||||
|
const chunkSize = config.get("share.chunkSize");
|
||||||
bodyParser.raw({
|
bodyParser.raw({
|
||||||
type: "application/octet-stream",
|
type: "application/octet-stream",
|
||||||
limit: `${config.get("share.chunkSize")}B`,
|
limit: `${chunkSize}B`,
|
||||||
}),
|
})(req, res, next);
|
||||||
);
|
});
|
||||||
|
|
||||||
app.use(cookieParser());
|
app.use(cookieParser());
|
||||||
app.set("trust proxy", true);
|
app.set("trust proxy", true);
|
||||||
@@ -42,5 +49,8 @@ async function bootstrap() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await app.listen(parseInt(process.env.PORT) || 8080);
|
await app.listen(parseInt(process.env.PORT) || 8080);
|
||||||
|
|
||||||
|
const logger = new Logger("UnhandledAsyncError");
|
||||||
|
process.on("unhandledRejection", (e) => logger.error(e));
|
||||||
}
|
}
|
||||||
bootstrap();
|
bootstrap();
|
||||||
|
|||||||
@@ -3,4 +3,5 @@ export interface OAuthSignInDto {
|
|||||||
providerId: string;
|
providerId: string;
|
||||||
providerUsername: string;
|
providerUsername: string;
|
||||||
email: string;
|
email: string;
|
||||||
|
isAdmin?: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ export class OAuthController {
|
|||||||
accessToken?: string;
|
accessToken?: string;
|
||||||
refreshToken?: string;
|
refreshToken?: string;
|
||||||
loginToken?: string;
|
loginToken?: string;
|
||||||
} = await this.oauthService.signIn(user);
|
} = await this.oauthService.signIn(user, request.ip);
|
||||||
if (token.accessToken) {
|
if (token.accessToken) {
|
||||||
this.authService.addTokensToResponse(
|
this.authService.addTokensToResponse(
|
||||||
response,
|
response,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Inject, Injectable } from "@nestjs/common";
|
import { Inject, Injectable, Logger } from "@nestjs/common";
|
||||||
import { User } from "@prisma/client";
|
import { User } from "@prisma/client";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import { AuthService } from "../auth/auth.service";
|
import { AuthService } from "../auth/auth.service";
|
||||||
@@ -15,6 +15,7 @@ export class OAuthService {
|
|||||||
private auth: AuthService,
|
private auth: AuthService,
|
||||||
@Inject("OAUTH_PLATFORMS") private platforms: string[],
|
@Inject("OAUTH_PLATFORMS") private platforms: string[],
|
||||||
) {}
|
) {}
|
||||||
|
private readonly logger = new Logger(OAuthService.name);
|
||||||
|
|
||||||
available(): string[] {
|
available(): string[] {
|
||||||
return this.platforms
|
return this.platforms
|
||||||
@@ -39,21 +40,25 @@ export class OAuthService {
|
|||||||
return Object.fromEntries(oauthUsers.map((u) => [u.provider, u]));
|
return Object.fromEntries(oauthUsers.map((u) => [u.provider, u]));
|
||||||
}
|
}
|
||||||
|
|
||||||
async signIn(user: OAuthSignInDto) {
|
async signIn(user: OAuthSignInDto, ip: string) {
|
||||||
const oauthUser = await this.prisma.oAuthUser.findFirst({
|
const oauthUser = await this.prisma.oAuthUser.findFirst({
|
||||||
where: {
|
where: {
|
||||||
provider: user.provider,
|
provider: user.provider,
|
||||||
providerUserId: user.providerId,
|
providerUserId: user.providerId,
|
||||||
},
|
},
|
||||||
include: {
|
|
||||||
user: true,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
if (oauthUser) {
|
if (oauthUser) {
|
||||||
return this.auth.generateToken(oauthUser.user, true);
|
await this.updateIsAdmin(user);
|
||||||
|
const updatedUser = await this.prisma.user.findFirst({
|
||||||
|
where: {
|
||||||
|
email: user.email,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
this.logger.log(`Successful login for user ${user.email} from IP ${ip}`);
|
||||||
|
return this.auth.generateToken(updatedUser, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.signUp(user);
|
return this.signUp(user, ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
async link(
|
async link(
|
||||||
@@ -102,9 +107,9 @@ export class OAuthService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getAvailableUsername(email: string) {
|
private async getAvailableUsername(preferredUsername: string) {
|
||||||
// only remove + and - from email for now (maybe not enough)
|
// only remove + and - from preferred username for now (maybe not enough)
|
||||||
let username = email.split("@")[0].replace(/[+-]/g, "").substring(0, 20);
|
let username = preferredUsername.replace(/[+-]/g, "").substring(0, 20);
|
||||||
while (true) {
|
while (true) {
|
||||||
const user = await this.prisma.user.findFirst({
|
const user = await this.prisma.user.findFirst({
|
||||||
where: {
|
where: {
|
||||||
@@ -119,7 +124,7 @@ export class OAuthService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async signUp(user: OAuthSignInDto) {
|
private async signUp(user: OAuthSignInDto, ip: string) {
|
||||||
// register
|
// register
|
||||||
if (!this.config.get("oauth.allowRegistration")) {
|
if (!this.config.get("oauth.allowRegistration")) {
|
||||||
throw new ErrorPageException("no_user", "/auth/signIn", [
|
throw new ErrorPageException("no_user", "/auth/signIn", [
|
||||||
@@ -148,14 +153,19 @@ export class OAuthService {
|
|||||||
userId: existingUser.id,
|
userId: existingUser.id,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
await this.updateIsAdmin(user);
|
||||||
return this.auth.generateToken(existingUser, true);
|
return this.auth.generateToken(existingUser, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await this.auth.signUp({
|
const result = await this.auth.signUp(
|
||||||
email: user.email,
|
{
|
||||||
username: await this.getAvailableUsername(user.email),
|
email: user.email,
|
||||||
password: null,
|
username: await this.getAvailableUsername(user.providerUsername),
|
||||||
});
|
password: null,
|
||||||
|
},
|
||||||
|
ip,
|
||||||
|
user.isAdmin,
|
||||||
|
);
|
||||||
|
|
||||||
await this.prisma.oAuthUser.create({
|
await this.prisma.oAuthUser.create({
|
||||||
data: {
|
data: {
|
||||||
@@ -168,4 +178,16 @@ export class OAuthService {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async updateIsAdmin(user: OAuthSignInDto) {
|
||||||
|
if ("isAdmin" in user)
|
||||||
|
await this.prisma.user.update({
|
||||||
|
where: {
|
||||||
|
email: user.email,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
isAdmin: user.isAdmin,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Injectable } from "@nestjs/common";
|
import { Injectable } from "@nestjs/common";
|
||||||
import fetch from "node-fetch";
|
|
||||||
import { ConfigService } from "../../config/config.service";
|
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";
|
||||||
@@ -52,7 +51,7 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
|
|||||||
this.config.get("general.appUrl") + "/api/oauth/callback/discord",
|
this.config.get("general.appUrl") + "/api/oauth/callback/discord",
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
const token: DiscordToken = await res.json();
|
const token = (await res.json()) as DiscordToken;
|
||||||
return {
|
return {
|
||||||
accessToken: token.access_token,
|
accessToken: token.access_token,
|
||||||
refreshToken: token.refresh_token,
|
refreshToken: token.refresh_token,
|
||||||
@@ -102,10 +101,10 @@ export class DiscordProvider implements OAuthProvider<DiscordToken> {
|
|||||||
});
|
});
|
||||||
const guilds = (await res.json()) as DiscordPartialGuild[];
|
const guilds = (await res.json()) as DiscordPartialGuild[];
|
||||||
if (!guilds.some((guild) => guild.id === guildId)) {
|
if (!guilds.some((guild) => guild.id === guildId)) {
|
||||||
throw new ErrorPageException("discord_guild_permission_denied");
|
throw new ErrorPageException("user_not_allowed");
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
throw new ErrorPageException("discord_guild_permission_denied");
|
throw new ErrorPageException("user_not_allowed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { Logger } from "@nestjs/common";
|
import { Logger } from "@nestjs/common";
|
||||||
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";
|
||||||
import { Cache } from "cache-manager";
|
import { Cache } from "cache-manager";
|
||||||
|
import * as jmespath from "jmespath";
|
||||||
import { nanoid } from "nanoid";
|
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";
|
||||||
@@ -25,7 +25,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
|
|||||||
protected cache: Cache,
|
protected cache: Cache,
|
||||||
) {
|
) {
|
||||||
this.discoveryUri = this.getDiscoveryUri();
|
this.discoveryUri = this.getDiscoveryUri();
|
||||||
this.config.addListener("update", (key: string, _: unknown) => {
|
this.config.addListener("update", (key: string) => {
|
||||||
if (this.keyOfConfigUpdateEvents.includes(key)) {
|
if (this.keyOfConfigUpdateEvents.includes(key)) {
|
||||||
this.deinit();
|
this.deinit();
|
||||||
this.discoveryUri = this.getDiscoveryUri();
|
this.discoveryUri = this.getDiscoveryUri();
|
||||||
@@ -94,7 +94,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
|
|||||||
redirect_uri: this.getRedirectUri(),
|
redirect_uri: this.getRedirectUri(),
|
||||||
}).toString(),
|
}).toString(),
|
||||||
});
|
});
|
||||||
const token: OidcToken = await res.json();
|
const token = (await res.json()) as OidcToken;
|
||||||
return {
|
return {
|
||||||
accessToken: token.access_token,
|
accessToken: token.access_token,
|
||||||
expiresIn: token.expires_in,
|
expiresIn: token.expires_in,
|
||||||
@@ -109,6 +109,11 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
|
|||||||
token: OAuthToken<OidcToken>,
|
token: OAuthToken<OidcToken>,
|
||||||
query: OAuthCallbackDto,
|
query: OAuthCallbackDto,
|
||||||
claim?: string,
|
claim?: string,
|
||||||
|
roleConfig?: {
|
||||||
|
path?: string;
|
||||||
|
generalAccess?: string;
|
||||||
|
adminAccess?: 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
|
||||||
@@ -125,9 +130,47 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
|
|||||||
|
|
||||||
const username = claim
|
const username = claim
|
||||||
? idTokenData[claim]
|
? idTokenData[claim]
|
||||||
: idTokenData.name ||
|
: idTokenData.preferred_username ||
|
||||||
idTokenData.nickname ||
|
idTokenData.name ||
|
||||||
idTokenData.preferred_username;
|
idTokenData.nickname;
|
||||||
|
|
||||||
|
let isAdmin: boolean;
|
||||||
|
|
||||||
|
if (roleConfig?.path) {
|
||||||
|
// A path to read roles from the token is configured
|
||||||
|
let roles: string[] | null;
|
||||||
|
try {
|
||||||
|
roles = jmespath.search(idTokenData, roleConfig.path);
|
||||||
|
} catch (e) {
|
||||||
|
roles = null;
|
||||||
|
}
|
||||||
|
if (Array.isArray(roles)) {
|
||||||
|
// Roles are found in the token
|
||||||
|
if (
|
||||||
|
roleConfig.generalAccess &&
|
||||||
|
!roles.includes(roleConfig.generalAccess)
|
||||||
|
) {
|
||||||
|
// Role for general access is configured and the user does not have it
|
||||||
|
this.logger.error(
|
||||||
|
`User roles ${roles} do not include ${roleConfig.generalAccess}`,
|
||||||
|
);
|
||||||
|
throw new ErrorPageException("user_not_allowed");
|
||||||
|
}
|
||||||
|
if (roleConfig.adminAccess) {
|
||||||
|
// Role for admin access is configured
|
||||||
|
isAdmin = roles.includes(roleConfig.adminAccess);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.logger.error(
|
||||||
|
`Roles not found at path ${roleConfig.path} in ID Token ${JSON.stringify(
|
||||||
|
idTokenData,
|
||||||
|
undefined,
|
||||||
|
2,
|
||||||
|
)}`,
|
||||||
|
);
|
||||||
|
throw new ErrorPageException("user_not_allowed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!username) {
|
if (!username) {
|
||||||
this.logger.error(
|
this.logger.error(
|
||||||
@@ -147,6 +190,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
|
|||||||
email: idTokenData.email,
|
email: idTokenData.email,
|
||||||
providerId: idTokenData.sub,
|
providerId: idTokenData.sub,
|
||||||
providerUsername: username,
|
providerUsername: username,
|
||||||
|
...(isAdmin !== undefined && { isAdmin }),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +203,7 @@ export abstract class GenericOidcProvider implements OAuthProvider<OidcToken> {
|
|||||||
: Date.now() + 1000 * 60 * 60 * 24;
|
: Date.now() + 1000 * 60 * 60 * 24;
|
||||||
this.configuration = {
|
this.configuration = {
|
||||||
expires,
|
expires,
|
||||||
data: await res.json(),
|
data: (await res.json()) as OidcConfiguration,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Injectable } from "@nestjs/common";
|
import { Injectable } from "@nestjs/common";
|
||||||
import fetch from "node-fetch";
|
|
||||||
import { ConfigService } from "../../config/config.service";
|
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";
|
||||||
@@ -38,7 +37,7 @@ export class GitHubProvider implements OAuthProvider<GitHubToken> {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
const token: GitHubToken = await res.json();
|
const token = (await res.json()) as GitHubToken;
|
||||||
return {
|
return {
|
||||||
accessToken: token.access_token,
|
accessToken: token.access_token,
|
||||||
tokenType: token.token_type,
|
tokenType: token.token_type,
|
||||||
|
|||||||
@@ -34,6 +34,15 @@ export class OidcProvider extends GenericOidcProvider {
|
|||||||
_?: string,
|
_?: string,
|
||||||
): Promise<OAuthSignInDto> {
|
): Promise<OAuthSignInDto> {
|
||||||
const claim = this.config.get("oauth.oidc-usernameClaim") || undefined;
|
const claim = this.config.get("oauth.oidc-usernameClaim") || undefined;
|
||||||
return super.getUserInfo(token, query, claim);
|
const rolePath = this.config.get("oauth.oidc-rolePath") || undefined;
|
||||||
|
const roleGeneralAccess =
|
||||||
|
this.config.get("oauth.oidc-roleGeneralAccess") || undefined;
|
||||||
|
const roleAdminAccess =
|
||||||
|
this.config.get("oauth.oidc-roleAdminAccess") || undefined;
|
||||||
|
return super.getUserInfo(token, query, claim, {
|
||||||
|
path: rolePath,
|
||||||
|
generalAccess: roleGeneralAccess,
|
||||||
|
adminAccess: roleAdminAccess,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,4 +13,10 @@ export class CreateReverseShareDTO {
|
|||||||
@Min(1)
|
@Min(1)
|
||||||
@Max(1000)
|
@Max(1000)
|
||||||
maxUseCount: number;
|
maxUseCount: number;
|
||||||
|
|
||||||
|
@IsBoolean()
|
||||||
|
simplified: boolean;
|
||||||
|
|
||||||
|
@IsBoolean()
|
||||||
|
publicAccess: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ export class ReverseShareDTO {
|
|||||||
@Expose()
|
@Expose()
|
||||||
token: string;
|
token: string;
|
||||||
|
|
||||||
|
@Expose()
|
||||||
|
simplified: boolean;
|
||||||
|
|
||||||
from(partial: Partial<ReverseShareDTO>) {
|
from(partial: Partial<ReverseShareDTO>) {
|
||||||
return plainToClass(ReverseShareDTO, partial, {
|
return plainToClass(ReverseShareDTO, partial, {
|
||||||
excludeExtraneousValues: true,
|
excludeExtraneousValues: true,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export class ReverseShareTokenWithShares extends OmitType(ReverseShareDTO, [
|
|||||||
@Type(() => OmitType(MyShareDTO, ["recipients", "hasPassword"] as const))
|
@Type(() => OmitType(MyShareDTO, ["recipients", "hasPassword"] as const))
|
||||||
shares: Omit<
|
shares: Omit<
|
||||||
MyShareDTO,
|
MyShareDTO,
|
||||||
"recipients" | "files" | "from" | "fromList" | "hasPassword"
|
"recipients" | "files" | "from" | "fromList" | "hasPassword" | "size"
|
||||||
>[];
|
>[];
|
||||||
|
|
||||||
@Expose()
|
@Expose()
|
||||||
|
|||||||
@@ -36,7 +36,12 @@ export class ReverseShareController {
|
|||||||
return { token, link };
|
return { token, link };
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throttle(20, 60)
|
@Throttle({
|
||||||
|
default: {
|
||||||
|
limit: 20,
|
||||||
|
ttl: 60,
|
||||||
|
},
|
||||||
|
})
|
||||||
@Get(":reverseShareToken")
|
@Get(":reverseShareToken")
|
||||||
async getByToken(@Param("reverseShareToken") reverseShareToken: string) {
|
async getByToken(@Param("reverseShareToken") reverseShareToken: string) {
|
||||||
const isValid = await this.reverseShareService.isValid(reverseShareToken);
|
const isValid = await this.reverseShareService.isValid(reverseShareToken);
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ export class ReverseShareService {
|
|||||||
remainingUses: data.maxUseCount,
|
remainingUses: data.maxUseCount,
|
||||||
maxShareSize: data.maxShareSize,
|
maxShareSize: data.maxShareSize,
|
||||||
sendEmailNotification: data.sendEmailNotification,
|
sendEmailNotification: data.sendEmailNotification,
|
||||||
|
simplified: data.simplified,
|
||||||
|
publicAccess: data.publicAccess,
|
||||||
creatorId,
|
creatorId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
27
backend/src/share/dto/adminShare.dto.ts
Normal file
27
backend/src/share/dto/adminShare.dto.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { OmitType } from "@nestjs/swagger";
|
||||||
|
import { Expose, plainToClass } from "class-transformer";
|
||||||
|
import { ShareDTO } from "./share.dto";
|
||||||
|
|
||||||
|
export class AdminShareDTO extends OmitType(ShareDTO, [
|
||||||
|
"files",
|
||||||
|
"from",
|
||||||
|
"fromList",
|
||||||
|
] as const) {
|
||||||
|
@Expose()
|
||||||
|
views: number;
|
||||||
|
|
||||||
|
@Expose()
|
||||||
|
createdAt: Date;
|
||||||
|
|
||||||
|
from(partial: Partial<AdminShareDTO>) {
|
||||||
|
return plainToClass(AdminShareDTO, partial, {
|
||||||
|
excludeExtraneousValues: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fromList(partial: Partial<AdminShareDTO>[]) {
|
||||||
|
return partial.map((part) =>
|
||||||
|
plainToClass(AdminShareDTO, part, { excludeExtraneousValues: true }),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,10 @@ export class CreateShareDTO {
|
|||||||
@Length(3, 50)
|
@Length(3, 50)
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
|
@Length(3, 30)
|
||||||
|
@IsOptional()
|
||||||
|
name: string;
|
||||||
|
|
||||||
@IsString()
|
@IsString()
|
||||||
expiration: string;
|
expiration: string;
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ export class ShareDTO {
|
|||||||
@Expose()
|
@Expose()
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
|
@Expose()
|
||||||
|
name?: string;
|
||||||
|
|
||||||
@Expose()
|
@Expose()
|
||||||
expiration: Date;
|
expiration: Date;
|
||||||
|
|
||||||
@@ -23,6 +26,9 @@ export class ShareDTO {
|
|||||||
@Expose()
|
@Expose()
|
||||||
hasPassword: boolean;
|
hasPassword: boolean;
|
||||||
|
|
||||||
|
@Expose()
|
||||||
|
size: number;
|
||||||
|
|
||||||
from(partial: Partial<ShareDTO>) {
|
from(partial: Partial<ShareDTO>) {
|
||||||
return plainToClass(ShareDTO, partial, { excludeExtraneousValues: true });
|
return plainToClass(ShareDTO, partial, { excludeExtraneousValues: true });
|
||||||
}
|
}
|
||||||
|
|||||||
19
backend/src/share/dto/shareComplete.dto.ts
Normal file
19
backend/src/share/dto/shareComplete.dto.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { Expose, plainToClass } from "class-transformer";
|
||||||
|
import { ShareDTO } from "./share.dto";
|
||||||
|
|
||||||
|
export class CompletedShareDTO extends ShareDTO {
|
||||||
|
@Expose()
|
||||||
|
notifyReverseShareCreator?: boolean;
|
||||||
|
|
||||||
|
from(partial: Partial<CompletedShareDTO>) {
|
||||||
|
return plainToClass(CompletedShareDTO, partial, {
|
||||||
|
excludeExtraneousValues: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fromList(partial: Partial<CompletedShareDTO>[]) {
|
||||||
|
return partial.map((part) =>
|
||||||
|
plainToClass(CompletedShareDTO, part, { excludeExtraneousValues: true }),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,9 +20,8 @@ export class CreateShareGuard extends JwtGuard {
|
|||||||
|
|
||||||
if (!reverseShareTokenId) return false;
|
if (!reverseShareTokenId) return false;
|
||||||
|
|
||||||
const isReverseShareTokenValid = await this.reverseShareService.isValid(
|
const isReverseShareTokenValid =
|
||||||
reverseShareTokenId,
|
await this.reverseShareService.isValid(reverseShareTokenId);
|
||||||
);
|
|
||||||
|
|
||||||
return isReverseShareTokenValid;
|
return isReverseShareTokenValid;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import {
|
|||||||
} from "@nestjs/common";
|
} from "@nestjs/common";
|
||||||
import { User } from "@prisma/client";
|
import { User } from "@prisma/client";
|
||||||
import { Request } from "express";
|
import { Request } from "express";
|
||||||
|
import { ConfigService } from "src/config/config.service";
|
||||||
import { PrismaService } from "src/prisma/prisma.service";
|
import { PrismaService } from "src/prisma/prisma.service";
|
||||||
import { JwtGuard } from "../../auth/guard/jwt.guard";
|
import { JwtGuard } from "../../auth/guard/jwt.guard";
|
||||||
import { ConfigService } from "src/config/config.service";
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ShareOwnerGuard extends JwtGuard {
|
export class ShareOwnerGuard extends JwtGuard {
|
||||||
@@ -34,10 +34,20 @@ export class ShareOwnerGuard extends JwtGuard {
|
|||||||
|
|
||||||
if (!share) throw new NotFoundException("Share not found");
|
if (!share) throw new NotFoundException("Share not found");
|
||||||
|
|
||||||
|
// Run the JWTGuard to set the user
|
||||||
|
await super.canActivate(context);
|
||||||
|
const user = request.user as User;
|
||||||
|
|
||||||
|
// If the user is an admin, allow access
|
||||||
|
if (user?.isAdmin) return true;
|
||||||
|
|
||||||
|
// If it's a anonymous share, allow access
|
||||||
if (!share.creatorId) return true;
|
if (!share.creatorId) return true;
|
||||||
|
|
||||||
if (!(await super.canActivate(context))) return false;
|
// If not signed in, deny access
|
||||||
|
if (!user) return false;
|
||||||
|
|
||||||
return share.creatorId == (request.user as User).id;
|
// If the user is the creator of the share, allow access
|
||||||
|
return share.creatorId == user.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import {
|
import {
|
||||||
CanActivate,
|
|
||||||
ExecutionContext,
|
ExecutionContext,
|
||||||
ForbiddenException,
|
ForbiddenException,
|
||||||
Injectable,
|
Injectable,
|
||||||
@@ -9,13 +8,19 @@ import { Request } from "express";
|
|||||||
import * as moment from "moment";
|
import * as moment from "moment";
|
||||||
import { PrismaService } from "src/prisma/prisma.service";
|
import { PrismaService } from "src/prisma/prisma.service";
|
||||||
import { ShareService } from "src/share/share.service";
|
import { ShareService } from "src/share/share.service";
|
||||||
|
import { ConfigService } from "src/config/config.service";
|
||||||
|
import { JwtGuard } from "src/auth/guard/jwt.guard";
|
||||||
|
import { User } from "@prisma/client";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ShareSecurityGuard implements CanActivate {
|
export class ShareSecurityGuard extends JwtGuard {
|
||||||
constructor(
|
constructor(
|
||||||
private shareService: ShareService,
|
private shareService: ShareService,
|
||||||
private prisma: PrismaService,
|
private prisma: PrismaService,
|
||||||
) {}
|
configService: ConfigService,
|
||||||
|
) {
|
||||||
|
super(configService);
|
||||||
|
}
|
||||||
|
|
||||||
async canActivate(context: ExecutionContext) {
|
async canActivate(context: ExecutionContext) {
|
||||||
const request: Request = context.switchToHttp().getRequest();
|
const request: Request = context.switchToHttp().getRequest();
|
||||||
@@ -31,7 +36,7 @@ export class ShareSecurityGuard implements CanActivate {
|
|||||||
|
|
||||||
const share = await this.prisma.share.findUnique({
|
const share = await this.prisma.share.findUnique({
|
||||||
where: { id: shareId },
|
where: { id: shareId },
|
||||||
include: { security: true },
|
include: { security: true, reverseShare: true },
|
||||||
});
|
});
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -53,6 +58,22 @@ export class ShareSecurityGuard implements CanActivate {
|
|||||||
"share_token_required",
|
"share_token_required",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Run the JWTGuard to set the user
|
||||||
|
await super.canActivate(context);
|
||||||
|
const user = request.user as User;
|
||||||
|
|
||||||
|
// Only the creator and reverse share creator can access the reverse share if it's not public
|
||||||
|
if (
|
||||||
|
share.reverseShare &&
|
||||||
|
!share.reverseShare.publicAccess &&
|
||||||
|
share.creatorId !== user?.id &&
|
||||||
|
share.reverseShare.creatorId !== user?.id
|
||||||
|
)
|
||||||
|
throw new ForbiddenException(
|
||||||
|
"Only reverse share creator can access this share",
|
||||||
|
"private_share",
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,11 +10,15 @@ import {
|
|||||||
Res,
|
Res,
|
||||||
UseGuards,
|
UseGuards,
|
||||||
} from "@nestjs/common";
|
} from "@nestjs/common";
|
||||||
|
import { JwtService } from "@nestjs/jwt";
|
||||||
import { Throttle } from "@nestjs/throttler";
|
import { Throttle } from "@nestjs/throttler";
|
||||||
import { User } from "@prisma/client";
|
import { User } from "@prisma/client";
|
||||||
import { Request, Response } from "express";
|
import { Request, Response } from "express";
|
||||||
|
import * as moment from "moment";
|
||||||
import { GetUser } from "src/auth/decorator/getUser.decorator";
|
import { GetUser } from "src/auth/decorator/getUser.decorator";
|
||||||
|
import { AdministratorGuard } from "src/auth/guard/isAdmin.guard";
|
||||||
import { JwtGuard } from "src/auth/guard/jwt.guard";
|
import { JwtGuard } from "src/auth/guard/jwt.guard";
|
||||||
|
import { AdminShareDTO } from "./dto/adminShare.dto";
|
||||||
import { CreateShareDTO } from "./dto/createShare.dto";
|
import { CreateShareDTO } from "./dto/createShare.dto";
|
||||||
import { MyShareDTO } from "./dto/myShare.dto";
|
import { MyShareDTO } from "./dto/myShare.dto";
|
||||||
import { ShareDTO } from "./dto/share.dto";
|
import { ShareDTO } from "./dto/share.dto";
|
||||||
@@ -25,9 +29,19 @@ import { ShareOwnerGuard } from "./guard/shareOwner.guard";
|
|||||||
import { ShareSecurityGuard } from "./guard/shareSecurity.guard";
|
import { ShareSecurityGuard } from "./guard/shareSecurity.guard";
|
||||||
import { ShareTokenSecurity } from "./guard/shareTokenSecurity.guard";
|
import { ShareTokenSecurity } from "./guard/shareTokenSecurity.guard";
|
||||||
import { ShareService } from "./share.service";
|
import { ShareService } from "./share.service";
|
||||||
|
import { CompletedShareDTO } from "./dto/shareComplete.dto";
|
||||||
@Controller("shares")
|
@Controller("shares")
|
||||||
export class ShareController {
|
export class ShareController {
|
||||||
constructor(private shareService: ShareService) {}
|
constructor(
|
||||||
|
private shareService: ShareService,
|
||||||
|
private jwtService: JwtService,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
@Get("all")
|
||||||
|
@UseGuards(JwtGuard, AdministratorGuard)
|
||||||
|
async getAllShares() {
|
||||||
|
return new AdminShareDTO().fromList(await this.shareService.getShares());
|
||||||
|
}
|
||||||
|
|
||||||
@Get()
|
@Get()
|
||||||
@UseGuards(JwtGuard)
|
@UseGuards(JwtGuard)
|
||||||
@@ -73,7 +87,7 @@ export class ShareController {
|
|||||||
@UseGuards(CreateShareGuard, ShareOwnerGuard)
|
@UseGuards(CreateShareGuard, ShareOwnerGuard)
|
||||||
async complete(@Param("id") id: string, @Req() request: Request) {
|
async complete(@Param("id") id: string, @Req() request: Request) {
|
||||||
const { reverse_share_token } = request.cookies;
|
const { reverse_share_token } = request.cookies;
|
||||||
return new ShareDTO().from(
|
return new CompletedShareDTO().from(
|
||||||
await this.shareService.complete(id, reverse_share_token),
|
await this.shareService.complete(id, reverse_share_token),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -86,26 +100,40 @@ export class ShareController {
|
|||||||
|
|
||||||
@Delete(":id")
|
@Delete(":id")
|
||||||
@UseGuards(ShareOwnerGuard)
|
@UseGuards(ShareOwnerGuard)
|
||||||
async remove(@Param("id") id: string) {
|
async remove(@Param("id") id: string, @GetUser() user: User) {
|
||||||
await this.shareService.remove(id);
|
const isDeleterAdmin = user?.isAdmin === true;
|
||||||
|
await this.shareService.remove(id, isDeleterAdmin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throttle(10, 60)
|
@Throttle({
|
||||||
|
default: {
|
||||||
|
limit: 10,
|
||||||
|
ttl: 60,
|
||||||
|
},
|
||||||
|
})
|
||||||
@Get("isShareIdAvailable/:id")
|
@Get("isShareIdAvailable/:id")
|
||||||
async isShareIdAvailable(@Param("id") id: string) {
|
async isShareIdAvailable(@Param("id") id: string) {
|
||||||
return this.shareService.isShareIdAvailable(id);
|
return this.shareService.isShareIdAvailable(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@HttpCode(200)
|
@HttpCode(200)
|
||||||
@Throttle(20, 5 * 60)
|
@Throttle({
|
||||||
|
default: {
|
||||||
|
limit: 20,
|
||||||
|
ttl: 5 * 60,
|
||||||
|
},
|
||||||
|
})
|
||||||
@UseGuards(ShareTokenSecurity)
|
@UseGuards(ShareTokenSecurity)
|
||||||
@Post(":id/token")
|
@Post(":id/token")
|
||||||
async getShareToken(
|
async getShareToken(
|
||||||
@Param("id") id: string,
|
@Param("id") id: string,
|
||||||
|
@Req() request: Request,
|
||||||
@Res({ passthrough: true }) response: Response,
|
@Res({ passthrough: true }) response: Response,
|
||||||
@Body() body: SharePasswordDto,
|
@Body() body: SharePasswordDto,
|
||||||
) {
|
) {
|
||||||
const token = await this.shareService.getShareToken(id, body.password);
|
const token = await this.shareService.getShareToken(id, body.password);
|
||||||
|
|
||||||
|
this.clearShareTokenCookies(request, response);
|
||||||
response.cookie(`share_${id}_token`, token, {
|
response.cookie(`share_${id}_token`, token, {
|
||||||
path: "/",
|
path: "/",
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
@@ -113,4 +141,32 @@ export class ShareController {
|
|||||||
|
|
||||||
return { token };
|
return { token };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keeps the 10 most recent share token cookies and deletes the rest and all expired ones
|
||||||
|
*/
|
||||||
|
private clearShareTokenCookies(request: Request, response: Response) {
|
||||||
|
const shareTokenCookies = Object.entries(request.cookies)
|
||||||
|
.filter(([key]) => key.startsWith("share_") && key.endsWith("_token"))
|
||||||
|
.map(([key, value]) => ({
|
||||||
|
key,
|
||||||
|
payload: this.jwtService.decode(value),
|
||||||
|
}));
|
||||||
|
|
||||||
|
const expiredTokens = shareTokenCookies.filter(
|
||||||
|
(cookie) => cookie.payload.exp < moment().unix(),
|
||||||
|
);
|
||||||
|
const validTokens = shareTokenCookies.filter(
|
||||||
|
(cookie) => cookie.payload.exp >= moment().unix(),
|
||||||
|
);
|
||||||
|
|
||||||
|
expiredTokens.forEach((cookie) => response.clearCookie(cookie.key));
|
||||||
|
|
||||||
|
if (validTokens.length > 10) {
|
||||||
|
validTokens
|
||||||
|
.sort((a, b) => a.payload.exp - b.payload.exp)
|
||||||
|
.slice(0, -10)
|
||||||
|
.forEach((cookie) => response.clearCookie(cookie.key));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { ShareService } from "./share.service";
|
|||||||
imports: [
|
imports: [
|
||||||
JwtModule.register({}),
|
JwtModule.register({}),
|
||||||
EmailModule,
|
EmailModule,
|
||||||
ClamScanModule,
|
forwardRef(() => ClamScanModule),
|
||||||
ReverseShareModule,
|
ReverseShareModule,
|
||||||
forwardRef(() => FileModule),
|
forwardRef(() => FileModule),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import {
|
|||||||
Injectable,
|
Injectable,
|
||||||
NotFoundException,
|
NotFoundException,
|
||||||
} from "@nestjs/common";
|
} from "@nestjs/common";
|
||||||
import { JwtService } from "@nestjs/jwt";
|
import { JwtService, JwtSignOptions } from "@nestjs/jwt";
|
||||||
import { Share, User } from "@prisma/client";
|
import { Share, User } from "@prisma/client";
|
||||||
import * as archiver from "archiver";
|
import * as archiver from "archiver";
|
||||||
import * as argon from "argon2";
|
import * as argon from "argon2";
|
||||||
@@ -46,9 +46,8 @@ export class ShareService {
|
|||||||
let expirationDate: Date;
|
let expirationDate: Date;
|
||||||
|
|
||||||
// If share is created by a reverse share token override the expiration date
|
// If share is created by a reverse share token override the expiration date
|
||||||
const reverseShare = await this.reverseShareService.getByToken(
|
const reverseShare =
|
||||||
reverseShareToken,
|
await this.reverseShareService.getByToken(reverseShareToken);
|
||||||
);
|
|
||||||
if (reverseShare) {
|
if (reverseShare) {
|
||||||
expirationDate = reverseShare.shareExpiration;
|
expirationDate = reverseShare.shareExpiration;
|
||||||
} else {
|
} else {
|
||||||
@@ -160,11 +159,12 @@ export class ShareService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
const notifyReverseShareCreator = share.reverseShare
|
||||||
share.reverseShare &&
|
? this.config.get("smtp.enabled") &&
|
||||||
this.config.get("smtp.enabled") &&
|
share.reverseShare.sendEmailNotification
|
||||||
share.reverseShare.sendEmailNotification
|
: undefined;
|
||||||
) {
|
|
||||||
|
if (notifyReverseShareCreator) {
|
||||||
await this.emailService.sendMailToReverseShareCreator(
|
await this.emailService.sendMailToReverseShareCreator(
|
||||||
share.reverseShare.creator.email,
|
share.reverseShare.creator.email,
|
||||||
share.id,
|
share.id,
|
||||||
@@ -181,10 +181,15 @@ export class ShareService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.prisma.share.update({
|
const updatedShare = await this.prisma.share.update({
|
||||||
where: { id },
|
where: { id },
|
||||||
data: { uploadLocked: true },
|
data: { uploadLocked: true },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
...updatedShare,
|
||||||
|
notifyReverseShareCreator,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async revertComplete(id: string) {
|
async revertComplete(id: string) {
|
||||||
@@ -194,6 +199,22 @@ export class ShareService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getShares() {
|
||||||
|
const shares = await this.prisma.share.findMany({
|
||||||
|
orderBy: {
|
||||||
|
expiration: "desc",
|
||||||
|
},
|
||||||
|
include: { files: true, creator: true },
|
||||||
|
});
|
||||||
|
|
||||||
|
return shares.map((share) => {
|
||||||
|
return {
|
||||||
|
...share,
|
||||||
|
size: share.files.reduce((acc, file) => acc + parseInt(file.size), 0),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async getSharesByUser(userId: string) {
|
async getSharesByUser(userId: string) {
|
||||||
const shares = await this.prisma.share.findMany({
|
const shares = await this.prisma.share.findMany({
|
||||||
where: {
|
where: {
|
||||||
@@ -214,6 +235,7 @@ export class ShareService {
|
|||||||
return shares.map((share) => {
|
return shares.map((share) => {
|
||||||
return {
|
return {
|
||||||
...share,
|
...share,
|
||||||
|
size: share.files.reduce((acc, file) => acc + parseInt(file.size), 0),
|
||||||
recipients: share.recipients.map((recipients) => recipients.email),
|
recipients: share.recipients.map((recipients) => recipients.email),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -223,7 +245,11 @@ export class ShareService {
|
|||||||
const share = await this.prisma.share.findUnique({
|
const share = await this.prisma.share.findUnique({
|
||||||
where: { id },
|
where: { id },
|
||||||
include: {
|
include: {
|
||||||
files: true,
|
files: {
|
||||||
|
orderBy: {
|
||||||
|
name: "asc",
|
||||||
|
},
|
||||||
|
},
|
||||||
creator: true,
|
creator: true,
|
||||||
security: true,
|
security: true,
|
||||||
},
|
},
|
||||||
@@ -251,13 +277,14 @@ export class ShareService {
|
|||||||
return share;
|
return share;
|
||||||
}
|
}
|
||||||
|
|
||||||
async remove(shareId: string) {
|
async remove(shareId: string, isDeleterAdmin = false) {
|
||||||
const share = await this.prisma.share.findUnique({
|
const share = await this.prisma.share.findUnique({
|
||||||
where: { id: shareId },
|
where: { id: shareId },
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!share) throw new NotFoundException("Share not found");
|
if (!share) throw new NotFoundException("Share not found");
|
||||||
if (!share.creatorId)
|
|
||||||
|
if (!share.creatorId && !isDeleterAdmin)
|
||||||
throw new ForbiddenException("Anonymous shares can't be deleted");
|
throw new ForbiddenException("Anonymous shares can't be deleted");
|
||||||
|
|
||||||
await this.fileService.deleteAllFiles(shareId);
|
await this.fileService.deleteAllFiles(shareId);
|
||||||
@@ -311,15 +338,21 @@ export class ShareService {
|
|||||||
const { expiration } = await this.prisma.share.findUnique({
|
const { expiration } = await this.prisma.share.findUnique({
|
||||||
where: { id: shareId },
|
where: { id: shareId },
|
||||||
});
|
});
|
||||||
return this.jwtService.sign(
|
|
||||||
{
|
const tokenPayload = {
|
||||||
shareId,
|
shareId,
|
||||||
},
|
iat: moment().unix(),
|
||||||
{
|
};
|
||||||
expiresIn: moment(expiration).diff(new Date(), "seconds") + "s",
|
|
||||||
secret: this.config.get("internal.jwtSecret"),
|
const tokenOptions: JwtSignOptions = {
|
||||||
},
|
secret: this.config.get("internal.jwtSecret"),
|
||||||
);
|
};
|
||||||
|
|
||||||
|
if (!moment(expiration).isSame(0)) {
|
||||||
|
tokenOptions.expiresIn = moment(expiration).diff(new Date(), "seconds");
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.jwtService.sign(tokenPayload, tokenOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
async verifyShareToken(shareId: string, token: string) {
|
async verifyShareToken(shareId: string, token: string) {
|
||||||
|
|||||||
@@ -432,7 +432,7 @@
|
|||||||
" const responseBody = pm.response.json();",
|
" const responseBody = pm.response.json();",
|
||||||
" pm.expect(responseBody).to.have.property(\"id\")",
|
" pm.expect(responseBody).to.have.property(\"id\")",
|
||||||
" pm.expect(responseBody).to.have.property(\"expiration\")",
|
" pm.expect(responseBody).to.have.property(\"expiration\")",
|
||||||
" pm.expect(Object.keys(responseBody).length).be.equal(3)",
|
" pm.expect(Object.keys(responseBody).length).be.equal(4)",
|
||||||
"});",
|
"});",
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
@@ -626,7 +626,7 @@
|
|||||||
" const responseBody = pm.response.json();",
|
" const responseBody = pm.response.json();",
|
||||||
" pm.expect(responseBody).to.have.property(\"id\")",
|
" pm.expect(responseBody).to.have.property(\"id\")",
|
||||||
" pm.expect(responseBody).to.have.property(\"expiration\")",
|
" pm.expect(responseBody).to.have.property(\"expiration\")",
|
||||||
" pm.expect(Object.keys(responseBody).length).be.equal(3)",
|
" pm.expect(Object.keys(responseBody).length).be.equal(4)",
|
||||||
"});",
|
"});",
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
version: '3.8'
|
|
||||||
services:
|
services:
|
||||||
clamav:
|
clamav:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
version: '3.8'
|
|
||||||
services:
|
services:
|
||||||
pingvin-share:
|
pingvin-share:
|
||||||
image: stonith404/pingvin-share
|
image: stonith404/pingvin-share
|
||||||
|
|||||||
5543
frontend/package-lock.json
generated
5543
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-frontend",
|
"name": "pingvin-share-frontend",
|
||||||
"version": "0.23.0",
|
"version": "0.29.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
@@ -9,46 +9,46 @@
|
|||||||
"format": "prettier --end-of-line=auto --write \"src/**/*.ts*\""
|
"format": "prettier --end-of-line=auto --write \"src/**/*.ts*\""
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.11.1",
|
"@emotion/react": "^11.11.4",
|
||||||
"@emotion/server": "^11.11.0",
|
"@emotion/server": "^11.11.0",
|
||||||
"@mantine/core": "^6.0.17",
|
"@mantine/core": "^6.0.21",
|
||||||
"@mantine/dropzone": "^6.0.17",
|
"@mantine/dropzone": "^6.0.21",
|
||||||
"@mantine/form": "^6.0.17",
|
"@mantine/form": "^6.0.21",
|
||||||
"@mantine/hooks": "^6.0.17",
|
"@mantine/hooks": "^6.0.21",
|
||||||
"@mantine/modals": "^6.0.17",
|
"@mantine/modals": "^6.0.21",
|
||||||
"@mantine/next": "^6.0.17",
|
"@mantine/next": "^6.0.21",
|
||||||
"@mantine/notifications": "^6.0.17",
|
"@mantine/notifications": "^6.0.21",
|
||||||
"axios": "^1.4.0",
|
"axios": "^1.7.2",
|
||||||
"cookies-next": "^2.1.2",
|
"cookies-next": "^2.1.2",
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
"jose": "^4.14.4",
|
"jose": "^4.15.5",
|
||||||
"jwt-decode": "^3.1.2",
|
"jwt-decode": "^3.1.2",
|
||||||
"markdown-to-jsx": "^7.4.1",
|
"markdown-to-jsx": "^7.4.7",
|
||||||
"mime-types": "^2.1.35",
|
"mime-types": "^2.1.35",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.30.1",
|
||||||
"next": "^13.4.12",
|
"next": "^14.2.3",
|
||||||
"next-cookies": "^2.0.3",
|
"next-http-proxy-middleware": "^1.2.6",
|
||||||
"next-http-proxy-middleware": "^1.2.5",
|
|
||||||
"next-pwa": "^5.6.0",
|
"next-pwa": "^5.6.0",
|
||||||
"p-limit": "^4.0.0",
|
"p-limit": "^4.0.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.3.1",
|
||||||
"react-icons": "^4.10.1",
|
"react-icons": "^4.12.0",
|
||||||
"react-intl": "^6.4.4",
|
"react-intl": "^6.6.8",
|
||||||
"sharp": "^0.32.4",
|
"sharp": "^0.33.4",
|
||||||
"yup": "^1.2.0"
|
"yup": "^1.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/mime-types": "^2.1.1",
|
"@types/mime-types": "^2.1.4",
|
||||||
"@types/node": "20.4.5",
|
"@types/node": "20.12.12",
|
||||||
"@types/react": "18.2.17",
|
"@types/react": "18.3.2",
|
||||||
"@types/react-dom": "18.2.7",
|
"@types/react-dom": "18.3.0",
|
||||||
"axios": "^1.4.0",
|
"@typescript-eslint/parser": "^7.10.0",
|
||||||
"eslint": "8.46.0",
|
"axios": "^1.7.2",
|
||||||
"eslint-config-next": "^13.4.12",
|
"eslint": "8.57.0",
|
||||||
"eslint-config-prettier": "^8.9.0",
|
"eslint-config-next": "^13.5.6",
|
||||||
"prettier": "^3.0.0",
|
"eslint-config-prettier": "^8.10.0",
|
||||||
"tar": "^6.1.15",
|
"prettier": "^3.2.5",
|
||||||
"typescript": "^5.1.6"
|
"tar": "^6.2.1",
|
||||||
|
"typescript": "^5.4.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ const CreateEnableTotpModal = ({
|
|||||||
</span>
|
</span>
|
||||||
</Center>
|
</Center>
|
||||||
|
|
||||||
<Tooltip label={t("account.modal.totp.clickToCopy")}>
|
<Tooltip label={t("common.button.clickToCopy")}>
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navigator.clipboard.writeText(options.secret);
|
navigator.clipboard.writeText(options.secret);
|
||||||
|
|||||||
@@ -17,13 +17,9 @@ const showShareInformationsModal = (
|
|||||||
const t = translateOutsideContext();
|
const t = translateOutsideContext();
|
||||||
const link = `${appUrl}/s/${share.id}`;
|
const link = `${appUrl}/s/${share.id}`;
|
||||||
|
|
||||||
let shareSize: number = 0;
|
const formattedShareSize = byteToHumanSizeString(share.size);
|
||||||
for (let file of share.files as FileMetaData[])
|
|
||||||
shareSize += parseInt(file.size);
|
|
||||||
|
|
||||||
const formattedShareSize = byteToHumanSizeString(shareSize);
|
|
||||||
const formattedMaxShareSize = byteToHumanSizeString(maxShareSize);
|
const formattedMaxShareSize = byteToHumanSizeString(maxShareSize);
|
||||||
const shareSizeProgress = (shareSize / maxShareSize) * 100;
|
const shareSizeProgress = (share.size / maxShareSize) * 100;
|
||||||
|
|
||||||
const formattedCreatedAt = moment(share.createdAt).format("LLL");
|
const formattedCreatedAt = moment(share.createdAt).format("LLL");
|
||||||
const formattedExpiration =
|
const formattedExpiration =
|
||||||
@@ -42,12 +38,18 @@ const showShareInformationsModal = (
|
|||||||
</b>
|
</b>
|
||||||
{share.id}
|
{share.id}
|
||||||
</Text>
|
</Text>
|
||||||
|
<Text size="sm">
|
||||||
|
<b>
|
||||||
|
<FormattedMessage id="account.shares.table.name" />:{" "}
|
||||||
|
</b>
|
||||||
|
{share.name || "-"}
|
||||||
|
</Text>
|
||||||
|
|
||||||
<Text size="sm">
|
<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 || "-"}
|
||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
<Text size="sm">
|
<Text size="sm">
|
||||||
@@ -75,15 +77,15 @@ const showShareInformationsModal = (
|
|||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
<Flex align="center" justify="center">
|
<Flex align="center" justify="center">
|
||||||
{shareSize / maxShareSize < 0.1 && (
|
{share.size / maxShareSize < 0.1 && (
|
||||||
<Text size="xs" style={{ marginRight: "4px" }}>
|
<Text size="xs" style={{ marginRight: "4px" }}>
|
||||||
{formattedShareSize}
|
{formattedShareSize}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
<Progress
|
<Progress
|
||||||
value={shareSizeProgress}
|
value={shareSizeProgress}
|
||||||
label={shareSize / maxShareSize >= 0.1 ? formattedShareSize : ""}
|
label={share.size / maxShareSize >= 0.1 ? formattedShareSize : ""}
|
||||||
style={{ width: shareSize / maxShareSize < 0.1 ? "70%" : "80%" }}
|
style={{ width: share.size / maxShareSize < 0.1 ? "70%" : "80%" }}
|
||||||
size="xl"
|
size="xl"
|
||||||
radius="xl"
|
radius="xl"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ const LogoConfigInput = ({
|
|||||||
value={logo}
|
value={logo}
|
||||||
onChange={(v) => setLogo(v)}
|
onChange={(v) => setLogo(v)}
|
||||||
accept=".png"
|
accept=".png"
|
||||||
|
// @ts-ignore (https://github.com/mantinedev/mantine/issues/5401)
|
||||||
placeholder={t("admin.config.general.logo.placeholder")}
|
placeholder={t("admin.config.general.logo.placeholder")}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
149
frontend/src/components/admin/shares/ManageShareTable.tsx
Normal file
149
frontend/src/components/admin/shares/ManageShareTable.tsx
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
import {
|
||||||
|
ActionIcon,
|
||||||
|
Box,
|
||||||
|
Group,
|
||||||
|
MediaQuery,
|
||||||
|
Skeleton,
|
||||||
|
Table,
|
||||||
|
Text,
|
||||||
|
} from "@mantine/core";
|
||||||
|
import { useClipboard } from "@mantine/hooks";
|
||||||
|
import { useModals } from "@mantine/modals";
|
||||||
|
import moment from "moment";
|
||||||
|
import { TbLink, TbTrash } from "react-icons/tb";
|
||||||
|
import { FormattedMessage } from "react-intl";
|
||||||
|
import useConfig from "../../../hooks/config.hook";
|
||||||
|
import useTranslate from "../../../hooks/useTranslate.hook";
|
||||||
|
import { MyShare } from "../../../types/share.type";
|
||||||
|
import { byteToHumanSizeString } from "../../../utils/fileSize.util";
|
||||||
|
import toast from "../../../utils/toast.util";
|
||||||
|
import showShareLinkModal from "../../account/showShareLinkModal";
|
||||||
|
|
||||||
|
const ManageShareTable = ({
|
||||||
|
shares,
|
||||||
|
deleteShare,
|
||||||
|
isLoading,
|
||||||
|
}: {
|
||||||
|
shares: MyShare[];
|
||||||
|
deleteShare: (share: MyShare) => void;
|
||||||
|
isLoading: boolean;
|
||||||
|
}) => {
|
||||||
|
const modals = useModals();
|
||||||
|
const clipboard = useClipboard();
|
||||||
|
const config = useConfig();
|
||||||
|
const t = useTranslate();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box sx={{ display: "block", overflowX: "auto" }}>
|
||||||
|
<Table verticalSpacing="sm">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<FormattedMessage id="account.shares.table.id" />
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<FormattedMessage id="account.shares.table.name" />
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<FormattedMessage id="admin.shares.table.username" />
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<FormattedMessage id="account.shares.table.visitors" />
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<FormattedMessage id="account.shares.table.size" />
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<FormattedMessage id="account.shares.table.expiresAt" />
|
||||||
|
</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{isLoading
|
||||||
|
? skeletonRows
|
||||||
|
: shares.map((share) => (
|
||||||
|
<tr key={share.id}>
|
||||||
|
<td>{share.id}</td>
|
||||||
|
<td>{share.name}</td>
|
||||||
|
<td>
|
||||||
|
{share.creator ? (
|
||||||
|
share.creator.username
|
||||||
|
) : (
|
||||||
|
<Text color="dimmed">Anonymous</Text>
|
||||||
|
)}
|
||||||
|
</td>
|
||||||
|
<td>{share.views}</td>
|
||||||
|
<td>{byteToHumanSizeString(share.size)}</td>
|
||||||
|
<td>
|
||||||
|
{moment(share.expiration).unix() === 0
|
||||||
|
? "Never"
|
||||||
|
: moment(share.expiration).format("LLL")}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Group position="right">
|
||||||
|
<ActionIcon
|
||||||
|
color="victoria"
|
||||||
|
variant="light"
|
||||||
|
size={25}
|
||||||
|
onClick={() => {
|
||||||
|
if (window.isSecureContext) {
|
||||||
|
clipboard.copy(
|
||||||
|
`${config.get("general.appUrl")}/s/${share.id}`,
|
||||||
|
);
|
||||||
|
toast.success(t("common.notify.copied"));
|
||||||
|
} else {
|
||||||
|
showShareLinkModal(
|
||||||
|
modals,
|
||||||
|
share.id,
|
||||||
|
config.get("general.appUrl"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<TbLink />
|
||||||
|
</ActionIcon>
|
||||||
|
<ActionIcon
|
||||||
|
variant="light"
|
||||||
|
color="red"
|
||||||
|
size="sm"
|
||||||
|
onClick={() => deleteShare(share)}
|
||||||
|
>
|
||||||
|
<TbTrash />
|
||||||
|
</ActionIcon>
|
||||||
|
</Group>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const skeletonRows = [...Array(10)].map((v, i) => (
|
||||||
|
<tr key={i}>
|
||||||
|
<td>
|
||||||
|
<Skeleton key={i} height={20} />
|
||||||
|
</td>
|
||||||
|
<MediaQuery smallerThan="md" styles={{ display: "none" }}>
|
||||||
|
<td>
|
||||||
|
<Skeleton key={i} height={20} />
|
||||||
|
</td>
|
||||||
|
</MediaQuery>
|
||||||
|
<td>
|
||||||
|
<Skeleton key={i} height={20} />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Skeleton key={i} height={20} />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Skeleton key={i} height={20} />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Skeleton key={i} height={20} />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
));
|
||||||
|
|
||||||
|
export default ManageShareTable;
|
||||||
@@ -25,8 +25,22 @@ import useTranslate from "../../hooks/useTranslate.hook";
|
|||||||
import authService from "../../services/auth.service";
|
import authService from "../../services/auth.service";
|
||||||
import { getOAuthIcon, getOAuthUrl } from "../../utils/oauth.util";
|
import { getOAuthIcon, getOAuthUrl } from "../../utils/oauth.util";
|
||||||
import toast from "../../utils/toast.util";
|
import toast from "../../utils/toast.util";
|
||||||
|
import { safeRedirectPath } from "../../utils/router.util";
|
||||||
|
|
||||||
const useStyles = createStyles((theme) => ({
|
const useStyles = createStyles((theme) => ({
|
||||||
|
signInWith: {
|
||||||
|
fontWeight: 500,
|
||||||
|
"&:before": {
|
||||||
|
content: "''",
|
||||||
|
flex: 1,
|
||||||
|
display: "block",
|
||||||
|
},
|
||||||
|
"&:after": {
|
||||||
|
content: "''",
|
||||||
|
flex: 1,
|
||||||
|
display: "block",
|
||||||
|
},
|
||||||
|
},
|
||||||
or: {
|
or: {
|
||||||
"&:before": {
|
"&:before": {
|
||||||
content: "''",
|
content: "''",
|
||||||
@@ -98,7 +112,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
await refreshUser();
|
await refreshUser();
|
||||||
router.replace(redirectPath);
|
router.replace(safeRedirectPath(redirectPath));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(toast.axiosError);
|
.catch(toast.axiosError);
|
||||||
@@ -127,49 +141,58 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
|
|||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
<Paper withBorder shadow="md" p={30} mt={30} radius="md">
|
<Paper withBorder shadow="md" p={30} mt={30} radius="md">
|
||||||
<form
|
{config.get("oauth.disablePassword") || (
|
||||||
onSubmit={form.onSubmit((values) => {
|
<form
|
||||||
signIn(values.emailOrUsername, values.password);
|
onSubmit={form.onSubmit((values) => {
|
||||||
})}
|
signIn(values.emailOrUsername, values.password);
|
||||||
>
|
})}
|
||||||
<TextInput
|
>
|
||||||
label={t("signin.input.email-or-username")}
|
<TextInput
|
||||||
placeholder={t("signin.input.email-or-username.placeholder")}
|
label={t("signin.input.email-or-username")}
|
||||||
{...form.getInputProps("emailOrUsername")}
|
placeholder={t("signin.input.email-or-username.placeholder")}
|
||||||
/>
|
{...form.getInputProps("emailOrUsername")}
|
||||||
<PasswordInput
|
/>
|
||||||
label={t("signin.input.password")}
|
<PasswordInput
|
||||||
placeholder={t("signin.input.password.placeholder")}
|
label={t("signin.input.password")}
|
||||||
mt="md"
|
placeholder={t("signin.input.password.placeholder")}
|
||||||
{...form.getInputProps("password")}
|
mt="md"
|
||||||
/>
|
{...form.getInputProps("password")}
|
||||||
{config.get("smtp.enabled") && (
|
/>
|
||||||
<Group position="right" mt="xs">
|
{config.get("smtp.enabled") && (
|
||||||
<Anchor component={Link} href="/auth/resetPassword" size="xs">
|
<Group position="right" mt="xs">
|
||||||
<FormattedMessage id="resetPassword.title" />
|
<Anchor component={Link} href="/auth/resetPassword" size="xs">
|
||||||
</Anchor>
|
<FormattedMessage id="resetPassword.title" />
|
||||||
</Group>
|
</Anchor>
|
||||||
)}
|
</Group>
|
||||||
<Button fullWidth mt="xl" type="submit">
|
)}
|
||||||
<FormattedMessage id="signin.button.submit" />
|
<Button fullWidth mt="xl" type="submit">
|
||||||
</Button>
|
<FormattedMessage id="signin.button.submit" />
|
||||||
</form>
|
</Button>
|
||||||
|
</form>
|
||||||
|
)}
|
||||||
{oauth.length > 0 && (
|
{oauth.length > 0 && (
|
||||||
<Stack mt="xl">
|
<Stack mt={config.get("oauth.disablePassword") ? undefined : "xl"}>
|
||||||
<Group align="center" className={classes.or}>
|
{config.get("oauth.disablePassword") ? (
|
||||||
<Text>{t("signIn.oauth.or")}</Text>
|
<Group align="center" className={classes.signInWith}>
|
||||||
</Group>
|
<Text>{t("signIn.oauth.signInWith")}</Text>
|
||||||
|
</Group>
|
||||||
|
) : (
|
||||||
|
<Group align="center" className={classes.or}>
|
||||||
|
<Text>{t("signIn.oauth.or")}</Text>
|
||||||
|
</Group>
|
||||||
|
)}
|
||||||
<Group position="center">
|
<Group position="center">
|
||||||
{oauth.map((provider) => (
|
{oauth.map((provider) => (
|
||||||
<Button
|
<Button
|
||||||
key={provider}
|
key={provider}
|
||||||
component="a"
|
component="a"
|
||||||
target="_blank"
|
|
||||||
title={t(`signIn.oauth.${provider}`)}
|
title={t(`signIn.oauth.${provider}`)}
|
||||||
href={getOAuthUrl(config.get("general.appUrl"), provider)}
|
href={getOAuthUrl(config.get("general.appUrl"), provider)}
|
||||||
variant="light"
|
variant="light"
|
||||||
|
fullWidth
|
||||||
>
|
>
|
||||||
{getOAuthIcon(provider)}
|
{getOAuthIcon(provider)}
|
||||||
|
{"\u2002" + t(`signIn.oauth.${provider}`)}
|
||||||
</Button>
|
</Button>
|
||||||
))}
|
))}
|
||||||
</Group>
|
</Group>
|
||||||
|
|||||||
@@ -6,15 +6,16 @@ import {
|
|||||||
PinInput,
|
PinInput,
|
||||||
Title,
|
Title,
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
|
import { useForm, yupResolver } from "@mantine/form";
|
||||||
|
import { useRouter } from "next/router";
|
||||||
|
import { useState } from "react";
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage } from "react-intl";
|
||||||
import * as yup from "yup";
|
import * as yup from "yup";
|
||||||
import useTranslate from "../../hooks/useTranslate.hook";
|
import useTranslate from "../../hooks/useTranslate.hook";
|
||||||
import { useForm, yupResolver } from "@mantine/form";
|
|
||||||
import { useState } from "react";
|
|
||||||
import authService from "../../services/auth.service";
|
|
||||||
import toast from "../../utils/toast.util";
|
|
||||||
import { useRouter } from "next/router";
|
|
||||||
import useUser from "../../hooks/user.hook";
|
import useUser from "../../hooks/user.hook";
|
||||||
|
import authService from "../../services/auth.service";
|
||||||
|
import { safeRedirectPath } from "../../utils/router.util";
|
||||||
|
import toast from "../../utils/toast.util";
|
||||||
|
|
||||||
function TotpForm({ redirectPath }: { redirectPath: string }) {
|
function TotpForm({ redirectPath }: { redirectPath: string }) {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
@@ -46,7 +47,7 @@ function TotpForm({ redirectPath }: { redirectPath: string }) {
|
|||||||
router.query.loginToken as string,
|
router.query.loginToken as string,
|
||||||
);
|
);
|
||||||
await refreshUser();
|
await refreshUser();
|
||||||
await router.replace(redirectPath);
|
await router.replace(safeRedirectPath(redirectPath));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
toast.axiosError(e);
|
toast.axiosError(e);
|
||||||
form.setFieldError("code", "error");
|
form.setFieldError("code", "error");
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ const FileList = ({
|
|||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
|
|
||||||
const [sort, setSort] = useState<TableSort>({
|
const [sort, setSort] = useState<TableSort>({
|
||||||
property: undefined,
|
property: "name",
|
||||||
direction: "desc",
|
direction: "desc",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import { getExpirationPreview } from "../../../utils/date.util";
|
|||||||
import toast from "../../../utils/toast.util";
|
import toast from "../../../utils/toast.util";
|
||||||
import FileSizeInput from "../FileSizeInput";
|
import FileSizeInput from "../FileSizeInput";
|
||||||
import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
|
import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
|
||||||
|
import { getCookie, setCookie } from "cookies-next";
|
||||||
|
|
||||||
const showCreateReverseShareModal = (
|
const showCreateReverseShareModal = (
|
||||||
modals: ModalsContextProps,
|
modals: ModalsContextProps,
|
||||||
@@ -61,10 +62,16 @@ const Body = ({
|
|||||||
sendEmailNotification: false,
|
sendEmailNotification: false,
|
||||||
expiration_num: 1,
|
expiration_num: 1,
|
||||||
expiration_unit: "-days",
|
expiration_unit: "-days",
|
||||||
|
simplified: !!(getCookie("reverse-share.simplified") ?? false),
|
||||||
|
publicAccess: !!(getCookie("reverse-share.public-access") ?? true),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const onSubmit = form.onSubmit(async (values) => {
|
const onSubmit = form.onSubmit(async (values) => {
|
||||||
|
// remember simplified and publicAccess in cookies
|
||||||
|
setCookie("reverse-share.simplified", values.simplified);
|
||||||
|
setCookie("reverse-share.public-access", values.publicAccess);
|
||||||
|
|
||||||
const expirationDate = moment().add(
|
const expirationDate = moment().add(
|
||||||
form.values.expiration_num,
|
form.values.expiration_num,
|
||||||
form.values.expiration_unit.replace(
|
form.values.expiration_unit.replace(
|
||||||
@@ -91,6 +98,8 @@ const Body = ({
|
|||||||
values.maxShareSize,
|
values.maxShareSize,
|
||||||
values.maxUseCount,
|
values.maxUseCount,
|
||||||
values.sendEmailNotification,
|
values.sendEmailNotification,
|
||||||
|
values.simplified,
|
||||||
|
values.publicAccess,
|
||||||
)
|
)
|
||||||
.then(({ link }) => {
|
.then(({ link }) => {
|
||||||
modals.closeAll();
|
modals.closeAll();
|
||||||
@@ -210,7 +219,28 @@ const Body = ({
|
|||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
<Switch
|
||||||
|
mt="xs"
|
||||||
|
labelPosition="left"
|
||||||
|
label={t("account.reverseShares.modal.simplified")}
|
||||||
|
description={t(
|
||||||
|
"account.reverseShares.modal.simplified.description",
|
||||||
|
)}
|
||||||
|
{...form.getInputProps("simplified", {
|
||||||
|
type: "checkbox",
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<Switch
|
||||||
|
mt="xs"
|
||||||
|
labelPosition="left"
|
||||||
|
label={t("account.reverseShares.modal.public-access")}
|
||||||
|
description={t(
|
||||||
|
"account.reverseShares.modal.public-access.description",
|
||||||
|
)}
|
||||||
|
{...form.getInputProps("publicAccess", {
|
||||||
|
type: "checkbox",
|
||||||
|
})}
|
||||||
|
/>
|
||||||
<Button mt="md" type="submit">
|
<Button mt="md" type="submit">
|
||||||
<FormattedMessage id="common.button.create" />
|
<FormattedMessage id="common.button.create" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -53,10 +53,18 @@ function CopyTextField(props: { link: string }) {
|
|||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</a>
|
</a>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
||||||
{window.isSecureContext && (
|
{window.isSecureContext && (
|
||||||
<ActionIcon onClick={copyLink}>
|
<Tooltip
|
||||||
{checkState ? <TbCheck /> : <TbCopy />}
|
label={t("common.button.clickToCopy")}
|
||||||
</ActionIcon>
|
position="top"
|
||||||
|
offset={-2}
|
||||||
|
openDelay={200}
|
||||||
|
>
|
||||||
|
<ActionIcon onClick={copyLink}>
|
||||||
|
{checkState ? <TbCheck /> : <TbCopy />}
|
||||||
|
</ActionIcon>
|
||||||
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,12 +36,12 @@ const Dropzone = ({
|
|||||||
title,
|
title,
|
||||||
isUploading,
|
isUploading,
|
||||||
maxShareSize,
|
maxShareSize,
|
||||||
showCreateUploadModalCallback,
|
onFilesChanged,
|
||||||
}: {
|
}: {
|
||||||
title?: string;
|
title?: string;
|
||||||
isUploading: boolean;
|
isUploading: boolean;
|
||||||
maxShareSize: number;
|
maxShareSize: number;
|
||||||
showCreateUploadModalCallback: (files: FileUpload[]) => void;
|
onFilesChanged: (files: FileUpload[]) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ const Dropzone = ({
|
|||||||
newFile.uploadingProgress = 0;
|
newFile.uploadingProgress = 0;
|
||||||
return newFile;
|
return newFile;
|
||||||
});
|
});
|
||||||
showCreateUploadModalCallback(files);
|
onFilesChanged(files);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
className={classes.dropzone}
|
className={classes.dropzone}
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ const EditableUpload = ({
|
|||||||
<Dropzone
|
<Dropzone
|
||||||
title={t("share.edit.append-upload")}
|
title={t("share.edit.append-upload")}
|
||||||
maxShareSize={maxShareSize}
|
maxShareSize={maxShareSize}
|
||||||
showCreateUploadModalCallback={appendFiles}
|
onFilesChanged={appendFiles}
|
||||||
isUploading={isUploading}
|
isUploading={isUploading}
|
||||||
/>
|
/>
|
||||||
{existingAndUploadedFiles.length > 0 && (
|
{existingAndUploadedFiles.length > 0 && (
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ import { FormattedMessage } from "react-intl";
|
|||||||
import useTranslate, {
|
import useTranslate, {
|
||||||
translateOutsideContext,
|
translateOutsideContext,
|
||||||
} from "../../../hooks/useTranslate.hook";
|
} from "../../../hooks/useTranslate.hook";
|
||||||
import { Share } from "../../../types/share.type";
|
import { CompletedShare } from "../../../types/share.type";
|
||||||
import CopyTextField from "../CopyTextField";
|
import CopyTextField from "../CopyTextField";
|
||||||
|
|
||||||
const showCompletedUploadModal = (
|
const showCompletedUploadModal = (
|
||||||
modals: ModalsContextProps,
|
modals: ModalsContextProps,
|
||||||
share: Share,
|
share: CompletedShare,
|
||||||
appUrl: string,
|
appUrl: string,
|
||||||
) => {
|
) => {
|
||||||
const t = translateOutsideContext();
|
const t = translateOutsideContext();
|
||||||
@@ -25,7 +25,7 @@ const showCompletedUploadModal = (
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const Body = ({ share, appUrl }: { share: Share; appUrl: string }) => {
|
const Body = ({ share, appUrl }: { share: CompletedShare; appUrl: string }) => {
|
||||||
const modals = useModals();
|
const modals = useModals();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
@@ -35,6 +35,19 @@ const Body = ({ share, appUrl }: { share: Share; appUrl: string }) => {
|
|||||||
return (
|
return (
|
||||||
<Stack align="stretch">
|
<Stack align="stretch">
|
||||||
<CopyTextField link={link} />
|
<CopyTextField link={link} />
|
||||||
|
{share.notifyReverseShareCreator === true && (
|
||||||
|
<Text
|
||||||
|
size="sm"
|
||||||
|
sx={(theme) => ({
|
||||||
|
color:
|
||||||
|
theme.colorScheme === "dark"
|
||||||
|
? theme.colors.gray[3]
|
||||||
|
: theme.colors.dark[4],
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
{t("upload.modal.completed.notified-reverse-share-creator")}
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
<Text
|
<Text
|
||||||
size="xs"
|
size="xs"
|
||||||
sx={(theme) => ({
|
sx={(theme) => ({
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ import shareService from "../../../services/share.service";
|
|||||||
import { FileUpload } from "../../../types/File.type";
|
import { FileUpload } from "../../../types/File.type";
|
||||||
import { CreateShare } from "../../../types/share.type";
|
import { CreateShare } from "../../../types/share.type";
|
||||||
import { getExpirationPreview } from "../../../utils/date.util";
|
import { getExpirationPreview } from "../../../utils/date.util";
|
||||||
|
import React from "react";
|
||||||
|
import toast from "../../../utils/toast.util";
|
||||||
|
|
||||||
const showCreateUploadModal = (
|
const showCreateUploadModal = (
|
||||||
modals: ModalsContextProps,
|
modals: ModalsContextProps,
|
||||||
@@ -40,12 +42,26 @@ const showCreateUploadModal = (
|
|||||||
allowUnauthenticatedShares: boolean;
|
allowUnauthenticatedShares: boolean;
|
||||||
enableEmailRecepients: boolean;
|
enableEmailRecepients: boolean;
|
||||||
maxExpirationInHours: number;
|
maxExpirationInHours: number;
|
||||||
|
simplified: boolean;
|
||||||
},
|
},
|
||||||
files: FileUpload[],
|
files: FileUpload[],
|
||||||
uploadCallback: (createShare: CreateShare, files: FileUpload[]) => void,
|
uploadCallback: (createShare: CreateShare, files: FileUpload[]) => void,
|
||||||
) => {
|
) => {
|
||||||
const t = translateOutsideContext();
|
const t = translateOutsideContext();
|
||||||
|
|
||||||
|
if (options.simplified) {
|
||||||
|
return modals.openModal({
|
||||||
|
title: t("upload.modal.title"),
|
||||||
|
children: (
|
||||||
|
<SimplifiedCreateUploadModalModal
|
||||||
|
options={options}
|
||||||
|
files={files}
|
||||||
|
uploadCallback={uploadCallback}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return modals.openModal({
|
return modals.openModal({
|
||||||
title: t("upload.modal.title"),
|
title: t("upload.modal.title"),
|
||||||
children: (
|
children: (
|
||||||
@@ -58,6 +74,23 @@ const showCreateUploadModal = (
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const generateLink = () =>
|
||||||
|
Buffer.from(Math.random().toString(), "utf8")
|
||||||
|
.toString("base64")
|
||||||
|
.substring(10, 17);
|
||||||
|
|
||||||
|
const generateAvailableLink = async (times = 10): Promise<string> => {
|
||||||
|
if (times <= 0) {
|
||||||
|
throw new Error("Could not generate available link");
|
||||||
|
}
|
||||||
|
const _link = generateLink();
|
||||||
|
if (!(await shareService.isShareIdAvailable(_link))) {
|
||||||
|
return await generateAvailableLink(times - 1);
|
||||||
|
} else {
|
||||||
|
return _link;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const CreateUploadModalBody = ({
|
const CreateUploadModalBody = ({
|
||||||
uploadCallback,
|
uploadCallback,
|
||||||
files,
|
files,
|
||||||
@@ -77,9 +110,7 @@ const CreateUploadModalBody = ({
|
|||||||
const modals = useModals();
|
const modals = useModals();
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
|
|
||||||
const generatedLink = Buffer.from(Math.random().toString(), "utf8")
|
const generatedLink = generateLink();
|
||||||
.toString("base64")
|
|
||||||
.substr(10, 7);
|
|
||||||
|
|
||||||
const [showNotSignedInAlert, setShowNotSignedInAlert] = useState(true);
|
const [showNotSignedInAlert, setShowNotSignedInAlert] = useState(true);
|
||||||
|
|
||||||
@@ -92,11 +123,16 @@ 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"),
|
||||||
}),
|
}),
|
||||||
|
name: yup
|
||||||
|
.string()
|
||||||
|
.transform((value) => value || undefined)
|
||||||
|
.min(3, t("common.error.too-short", { length: 3 }))
|
||||||
|
.max(30, t("common.error.too-long", { length: 30 })),
|
||||||
password: yup
|
password: yup
|
||||||
.string()
|
.string()
|
||||||
.transform((value) => value || undefined)
|
.transform((value) => value || undefined)
|
||||||
.min(3)
|
.min(3, t("common.error.too-short", { length: 3 }))
|
||||||
.max(30),
|
.max(30, t("common.error.too-long", { length: 30 })),
|
||||||
maxViews: yup
|
maxViews: yup
|
||||||
.number()
|
.number()
|
||||||
.transform((value) => value || undefined)
|
.transform((value) => value || undefined)
|
||||||
@@ -105,6 +141,7 @@ const CreateUploadModalBody = ({
|
|||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
initialValues: {
|
initialValues: {
|
||||||
|
name: undefined,
|
||||||
link: generatedLink,
|
link: generatedLink,
|
||||||
recipients: [] as string[],
|
recipients: [] as string[],
|
||||||
password: undefined,
|
password: undefined,
|
||||||
@@ -154,6 +191,7 @@ const CreateUploadModalBody = ({
|
|||||||
uploadCallback(
|
uploadCallback(
|
||||||
{
|
{
|
||||||
id: values.link,
|
id: values.link,
|
||||||
|
name: values.name,
|
||||||
expiration: expirationString,
|
expiration: expirationString,
|
||||||
recipients: values.recipients,
|
recipients: values.recipients,
|
||||||
description: values.description,
|
description: values.description,
|
||||||
@@ -194,14 +232,7 @@ const CreateUploadModalBody = ({
|
|||||||
<Button
|
<Button
|
||||||
style={{ flex: "0 0 auto" }}
|
style={{ flex: "0 0 auto" }}
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onClick={() =>
|
onClick={() => form.setFieldValue("link", generateLink())}
|
||||||
form.setFieldValue(
|
|
||||||
"link",
|
|
||||||
Buffer.from(Math.random().toString(), "utf8")
|
|
||||||
.toString("base64")
|
|
||||||
.substr(10, 7),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
<FormattedMessage id="common.button.generate" />
|
<FormattedMessage id="common.button.generate" />
|
||||||
</Button>
|
</Button>
|
||||||
@@ -235,7 +266,6 @@ const CreateUploadModalBody = ({
|
|||||||
disabled={form.values.never_expires}
|
disabled={form.values.never_expires}
|
||||||
{...form.getInputProps("expiration_unit")}
|
{...form.getInputProps("expiration_unit")}
|
||||||
data={[
|
data={[
|
||||||
// Set the label to singular if the number is 1, else plural
|
|
||||||
{
|
{
|
||||||
value: "-minutes",
|
value: "-minutes",
|
||||||
label:
|
label:
|
||||||
@@ -308,14 +338,21 @@ const CreateUploadModalBody = ({
|
|||||||
<Accordion>
|
<Accordion>
|
||||||
<Accordion.Item value="description" sx={{ borderBottom: "none" }}>
|
<Accordion.Item value="description" sx={{ borderBottom: "none" }}>
|
||||||
<Accordion.Control>
|
<Accordion.Control>
|
||||||
<FormattedMessage id="upload.modal.accordion.description.title" />
|
<FormattedMessage id="upload.modal.accordion.name-and-description.title" />
|
||||||
</Accordion.Control>
|
</Accordion.Control>
|
||||||
<Accordion.Panel>
|
<Accordion.Panel>
|
||||||
<Stack align="stretch">
|
<Stack align="stretch">
|
||||||
|
<TextInput
|
||||||
|
variant="filled"
|
||||||
|
placeholder={t(
|
||||||
|
"upload.modal.accordion.name-and-description.name.placeholder",
|
||||||
|
)}
|
||||||
|
{...form.getInputProps("name")}
|
||||||
|
/>
|
||||||
<Textarea
|
<Textarea
|
||||||
variant="filled"
|
variant="filled"
|
||||||
placeholder={t(
|
placeholder={t(
|
||||||
"upload.modal.accordion.description.placeholder",
|
"upload.modal.accordion.name-and-description.description.placeholder",
|
||||||
)}
|
)}
|
||||||
{...form.getInputProps("description")}
|
{...form.getInputProps("description")}
|
||||||
/>
|
/>
|
||||||
@@ -333,7 +370,9 @@ const CreateUploadModalBody = ({
|
|||||||
placeholder={t("upload.modal.accordion.email.placeholder")}
|
placeholder={t("upload.modal.accordion.email.placeholder")}
|
||||||
searchable
|
searchable
|
||||||
creatable
|
creatable
|
||||||
autoComplete="email-recipients"
|
id="recipient_email"
|
||||||
|
autoComplete="email"
|
||||||
|
type="email"
|
||||||
getCreateLabel={(query) => `+ ${query}`}
|
getCreateLabel={(query) => `+ ${query}`}
|
||||||
onCreate={(query) => {
|
onCreate={(query) => {
|
||||||
if (!query.match(/^\S+@\S+\.\S+$/)) {
|
if (!query.match(/^\S+@\S+\.\S+$/)) {
|
||||||
@@ -351,6 +390,25 @@ const CreateUploadModalBody = ({
|
|||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
{...form.getInputProps("recipients")}
|
{...form.getInputProps("recipients")}
|
||||||
|
onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => {
|
||||||
|
// Add email on comma or semicolon
|
||||||
|
if (e.key === "," || e.key === ";") {
|
||||||
|
e.preventDefault();
|
||||||
|
const inputValue = (
|
||||||
|
e.target as HTMLInputElement
|
||||||
|
).value.trim();
|
||||||
|
if (inputValue.match(/^\S+@\S+\.\S+$/)) {
|
||||||
|
form.setFieldValue("recipients", [
|
||||||
|
...form.values.recipients,
|
||||||
|
inputValue,
|
||||||
|
]);
|
||||||
|
(e.target as HTMLInputElement).value = "";
|
||||||
|
}
|
||||||
|
} else if (e.key === " ") {
|
||||||
|
e.preventDefault();
|
||||||
|
(e.target as HTMLInputElement).value = "";
|
||||||
|
}
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</Accordion.Panel>
|
</Accordion.Panel>
|
||||||
</Accordion.Item>
|
</Accordion.Item>
|
||||||
@@ -394,4 +452,108 @@ const CreateUploadModalBody = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const SimplifiedCreateUploadModalModal = ({
|
||||||
|
uploadCallback,
|
||||||
|
files,
|
||||||
|
options,
|
||||||
|
}: {
|
||||||
|
files: FileUpload[];
|
||||||
|
uploadCallback: (createShare: CreateShare, files: FileUpload[]) => void;
|
||||||
|
options: {
|
||||||
|
isUserSignedIn: boolean;
|
||||||
|
isReverseShare: boolean;
|
||||||
|
appUrl: string;
|
||||||
|
allowUnauthenticatedShares: boolean;
|
||||||
|
enableEmailRecepients: boolean;
|
||||||
|
maxExpirationInHours: number;
|
||||||
|
};
|
||||||
|
}) => {
|
||||||
|
const modals = useModals();
|
||||||
|
const t = useTranslate();
|
||||||
|
|
||||||
|
const [showNotSignedInAlert, setShowNotSignedInAlert] = useState(true);
|
||||||
|
|
||||||
|
const validationSchema = yup.object().shape({
|
||||||
|
name: yup
|
||||||
|
.string()
|
||||||
|
.transform((value) => value || undefined)
|
||||||
|
.min(3, t("common.error.too-short", { length: 3 }))
|
||||||
|
.max(30, t("common.error.too-long", { length: 30 })),
|
||||||
|
});
|
||||||
|
|
||||||
|
const form = useForm({
|
||||||
|
initialValues: {
|
||||||
|
name: undefined,
|
||||||
|
description: undefined,
|
||||||
|
},
|
||||||
|
validate: yupResolver(validationSchema),
|
||||||
|
});
|
||||||
|
|
||||||
|
const onSubmit = form.onSubmit(async (values) => {
|
||||||
|
const link = await generateAvailableLink().catch(() => {
|
||||||
|
toast.error(t("upload.modal.link.error.taken"));
|
||||||
|
return undefined;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!link) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uploadCallback(
|
||||||
|
{
|
||||||
|
id: link,
|
||||||
|
name: values.name,
|
||||||
|
expiration: "never",
|
||||||
|
recipients: [],
|
||||||
|
description: values.description,
|
||||||
|
security: {
|
||||||
|
password: undefined,
|
||||||
|
maxViews: undefined,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
files,
|
||||||
|
);
|
||||||
|
modals.closeAll();
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack>
|
||||||
|
{showNotSignedInAlert && !options.isUserSignedIn && (
|
||||||
|
<Alert
|
||||||
|
withCloseButton
|
||||||
|
onClose={() => setShowNotSignedInAlert(false)}
|
||||||
|
icon={<TbAlertCircle size={16} />}
|
||||||
|
title={t("upload.modal.not-signed-in")}
|
||||||
|
color="yellow"
|
||||||
|
>
|
||||||
|
<FormattedMessage id="upload.modal.not-signed-in-description" />
|
||||||
|
</Alert>
|
||||||
|
)}
|
||||||
|
<form onSubmit={onSubmit}>
|
||||||
|
<Stack align="stretch">
|
||||||
|
<Stack align="stretch">
|
||||||
|
<TextInput
|
||||||
|
variant="filled"
|
||||||
|
placeholder={t(
|
||||||
|
"upload.modal.accordion.name-and-description.name.placeholder",
|
||||||
|
)}
|
||||||
|
{...form.getInputProps("name")}
|
||||||
|
/>
|
||||||
|
<Textarea
|
||||||
|
variant="filled"
|
||||||
|
placeholder={t(
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder",
|
||||||
|
)}
|
||||||
|
{...form.getInputProps("description")}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
<Button type="submit" data-autofocus>
|
||||||
|
<FormattedMessage id="common.button.share" />
|
||||||
|
</Button>
|
||||||
|
</Stack>
|
||||||
|
</form>
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default showCreateUploadModal;
|
export default showCreateUploadModal;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import arabic from "./translations/ar-EG";
|
||||||
import danish from "./translations/da-DK";
|
import danish from "./translations/da-DK";
|
||||||
import german from "./translations/de-DE";
|
import german from "./translations/de-DE";
|
||||||
import greek from "./translations/el-GR";
|
import greek from "./translations/el-GR";
|
||||||
@@ -5,19 +6,22 @@ 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 hungarian from "./translations/hu-HU";
|
||||||
import italian from "./translations/it-IT";
|
import italian from "./translations/it-IT";
|
||||||
import japanese from "./translations/ja-JP";
|
import japanese from "./translations/ja-JP";
|
||||||
|
import korean from "./translations/ko-KR";
|
||||||
import dutch from "./translations/nl-BE";
|
import dutch from "./translations/nl-BE";
|
||||||
import polish from "./translations/pl-PL";
|
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 ukrainian from "./translations/uk-UA";
|
|
||||||
import slovenian from "./translations/sl-SI";
|
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 swedish from "./translations/sv-SE";
|
||||||
import thai from "./translations/th-TH";
|
import thai from "./translations/th-TH";
|
||||||
|
import ukrainian from "./translations/uk-UA";
|
||||||
import chineseSimplified from "./translations/zh-CN";
|
import chineseSimplified from "./translations/zh-CN";
|
||||||
import chineseTraditional from "./translations/zh-TW";
|
import chineseTraditional from "./translations/zh-TW";
|
||||||
|
import turkish from "./translations/tr-TR";
|
||||||
|
|
||||||
export const LOCALES = {
|
export const LOCALES = {
|
||||||
ENGLISH: {
|
ENGLISH: {
|
||||||
@@ -123,11 +127,21 @@ export const LOCALES = {
|
|||||||
ARABIC: {
|
ARABIC: {
|
||||||
name: "العربية",
|
name: "العربية",
|
||||||
code: "ar-EG",
|
code: "ar-EG",
|
||||||
messages: {},
|
messages: arabic,
|
||||||
},
|
},
|
||||||
HUNGARIAN: {
|
HUNGARIAN: {
|
||||||
name: "Hungarian",
|
name: "Hungarian",
|
||||||
code: "hu-HU",
|
code: "hu-HU",
|
||||||
messages: {},
|
messages: hungarian,
|
||||||
|
},
|
||||||
|
KOREAN: {
|
||||||
|
name: "한국어",
|
||||||
|
code: "ko-KR",
|
||||||
|
messages: korean,
|
||||||
|
},
|
||||||
|
TURKISH: {
|
||||||
|
name: "Türkçe",
|
||||||
|
code: "tr-TR",
|
||||||
|
messages: turkish,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,39 +1,40 @@
|
|||||||
export default {
|
export default {
|
||||||
// Navbar
|
// Navbar
|
||||||
"navbar.upload": "Upload",
|
"navbar.upload": "رفع",
|
||||||
"navbar.signin": "Sign in",
|
"navbar.signin": "تسجيل الدخول",
|
||||||
"navbar.home": "Home",
|
"navbar.home": "الصفحة الرئيسية",
|
||||||
"navbar.signup": "Sign Up",
|
"navbar.signup": "إنشاء حساب",
|
||||||
"navbar.links.shares": "My shares",
|
"navbar.links.shares": "مشاركاتي",
|
||||||
"navbar.links.reverse": "Reverse shares",
|
"navbar.links.reverse": "مشاركاتي العكسية",
|
||||||
"navbar.avatar.account": "My account",
|
"navbar.avatar.account": "حسابي",
|
||||||
"navbar.avatar.admin": "Administration",
|
"navbar.avatar.admin": "الإدارة",
|
||||||
"navbar.avatar.signout": "Sign out",
|
"navbar.avatar.signout": "تسجيل الخروج",
|
||||||
// END navbar
|
// END navbar
|
||||||
// /
|
// /
|
||||||
"home.title": "A <h>self-hosted</h> file sharing platform.",
|
"home.title": "منصة لمشاركة الملفات <h>باستضافة ذاتية</h>.",
|
||||||
"home.description": "Do you really want to give your personal files in the hand of third parties like WeTransfer?",
|
"home.description": "أحقًا تريد تسليم ملفاتك الشخصية لطرف ثالث مثل WeTransfer؟",
|
||||||
"home.bullet.a.name": "Self-Hosted",
|
"home.bullet.a.name": "استضافة ذاتية",
|
||||||
"home.bullet.a.description": "Host Pingvin Share on your own machine.",
|
"home.bullet.a.description": "قم باستضافة Pingvin Share على جهازك.",
|
||||||
"home.bullet.b.name": "Privacy",
|
"home.bullet.b.name": "الخصوصية",
|
||||||
"home.bullet.b.description": "Your files are your files and should never get into the hands of third parties.",
|
"home.bullet.b.description": "ملفاتك تخصّك وحدك فقط، ولا ينبغي أبدًا أن تقع بأيدي طرفٍ ثالث.",
|
||||||
"home.bullet.c.name": "No annoying file size limit",
|
"home.bullet.c.name": "ليس هناك أية قيود على حجم الملفات",
|
||||||
"home.bullet.c.description": "Upload as big files as you want. Only your hard drive will be your limit.",
|
"home.bullet.c.description": "ارفع أي ملف تريده مهما كان حجمه كبيرًا. إن مساحة قرصك الصلب هي المحدد الوحيد هنا.",
|
||||||
"home.button.start": "Get started",
|
"home.button.start": "ابدأ",
|
||||||
"home.button.source": "Source code",
|
"home.button.source": "النص البرمجي المصدري",
|
||||||
// END /
|
// END /
|
||||||
// /auth/signin
|
// /auth/signin
|
||||||
"signin.title": "Welcome back",
|
"signin.title": "أهلًا بعودتك",
|
||||||
"signin.description": "You don't have an account yet?",
|
"signin.description": "ليس لديك حساب؟",
|
||||||
"signin.button.signup": "Sign up",
|
"signin.button.signup": "إنشاء حساب",
|
||||||
"signin.input.email-or-username": "Email or username",
|
"signin.input.email-or-username": "البريد أو اسم المستخدم",
|
||||||
"signin.input.email-or-username.placeholder": "Your email or username",
|
"signin.input.email-or-username.placeholder": "بريدك أو اسم المستخدم",
|
||||||
"signin.input.password": "Password",
|
"signin.input.password": "كلمة السر",
|
||||||
"signin.input.password.placeholder": "Your password",
|
"signin.input.password.placeholder": "كلمة السر",
|
||||||
"signin.button.submit": "Sign in",
|
"signin.button.submit": "تسجيل الدخول",
|
||||||
"signIn.notify.totp-required.title": "Two-factor authentication required",
|
"signIn.notify.totp-required.title": "إن المصادقة الثنائية ضرورية",
|
||||||
"signIn.notify.totp-required.description": "Please enter your two-factor authentication code",
|
"signIn.notify.totp-required.description": "فضلًا أدخل رمز المصادقة الثنائية",
|
||||||
"signIn.oauth.or": "OR",
|
"signIn.oauth.or": "أو",
|
||||||
|
"signIn.oauth.signInWith": "تسجيل الدخول بواسطة تطبيق",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -41,381 +42,408 @@ export default {
|
|||||||
"signIn.oauth.oidc": "OpenID",
|
"signIn.oauth.oidc": "OpenID",
|
||||||
// END /auth/signin
|
// END /auth/signin
|
||||||
// /auth/signup
|
// /auth/signup
|
||||||
"signup.title": "Create an account",
|
"signup.title": "أنشئ حسابًا",
|
||||||
"signup.description": "Already have an account?",
|
"signup.description": "لديك حساب بالفعل؟",
|
||||||
"signup.button.signin": "Sign in",
|
"signup.button.signin": "تسجيل الدخول",
|
||||||
"signup.input.username": "Username",
|
"signup.input.username": "اسم المستخدم",
|
||||||
"signup.input.username.placeholder": "Your username",
|
"signup.input.username.placeholder": "اسم المستخدم",
|
||||||
"signup.input.email": "Email",
|
"signup.input.email": "البريد",
|
||||||
"signup.input.email.placeholder": "Your email",
|
"signup.input.email.placeholder": "بريدك",
|
||||||
"signup.button.submit": "Let's get started",
|
"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": "Forgot your password?",
|
"resetPassword.title": "نسيت كلمة سرّك؟",
|
||||||
"resetPassword.description": "Enter your email to reset your password.",
|
"resetPassword.description": "اكتب بريدك لتعيد تعيين كلمة السر.",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "إذا كان هذا البريد مسجلًا لدينا فستصله الآن رسالة فيها رابط لإعادة تعيين كلمة السرّ.",
|
||||||
"resetPassword.button.back": "Back to sign in page",
|
"resetPassword.button.back": "العودة لصفحة تسجيل الدخول",
|
||||||
"resetPassword.text.resetPassword": "Reset password",
|
"resetPassword.text.resetPassword": "إعادة تعيين كلمة السر",
|
||||||
"resetPassword.text.enterNewPassword": "Enter your new password",
|
"resetPassword.text.enterNewPassword": "أدخل كلمة السر الجديدة",
|
||||||
"resetPassword.input.password": "New password",
|
"resetPassword.input.password": "كلمة السر الجديدة",
|
||||||
"resetPassword.notify.passwordReset": "Your password has been reset successfully.",
|
"resetPassword.notify.passwordReset": "أعدتَ تعيين كلمة السر بنجاح.",
|
||||||
// /account
|
// /account
|
||||||
"account.title": "My account",
|
"account.title": "حسابي",
|
||||||
"account.card.info.title": "Account info",
|
"account.card.info.title": "معلومات الحساب",
|
||||||
"account.card.info.username": "Username",
|
"account.card.info.username": "اسم المستخدم",
|
||||||
"account.card.info.email": "Email",
|
"account.card.info.email": "البريد",
|
||||||
"account.notify.info.success": "Account updated successfully",
|
"account.notify.info.success": "تم تحديث الحساب بنجاح",
|
||||||
"account.card.password.title": "Password",
|
"account.card.password.title": "كلمة السر",
|
||||||
"account.card.password.old": "Old password",
|
"account.card.password.old": "كلمة السر القديمة",
|
||||||
"account.card.password.new": "New password",
|
"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": "Password changed successfully",
|
"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": "Security",
|
"account.card.security.title": "الأمان",
|
||||||
"account.card.security.totp.enable.description": "Enter your current password to start enabling TOTP",
|
"account.card.security.totp.enable.description": "اكتب كلمة سرّك لبدء تمكين TOTP",
|
||||||
"account.card.security.totp.disable.description": "Enter your current password to disable TOTP",
|
"account.card.security.totp.disable.description": "اكتب كلمة سرّك لتعطيل TOTP",
|
||||||
"account.card.security.totp.button.start": "Start",
|
"account.card.security.totp.button.start": "ابدأ",
|
||||||
"account.modal.totp.title": "Enable TOTP",
|
"account.modal.totp.title": "تمكين TOTP",
|
||||||
"account.modal.totp.step1": "Step 1: Add your authenticator",
|
"account.modal.totp.step1": "الخطوة 1: أضف تطبيق المصادقة",
|
||||||
"account.modal.totp.step2": "Step 2: Validate your code",
|
"account.modal.totp.step2": "الخطوة 2: تحقّق من صحة رمزك",
|
||||||
"account.modal.totp.enterManually": "Enter manually",
|
"account.modal.totp.enterManually": "أدخل يدوياً",
|
||||||
"account.modal.totp.code": "Code",
|
"account.modal.totp.code": "الرمز",
|
||||||
"account.modal.totp.clickToCopy": "Click to copy",
|
"common.button.clickToCopy": "انقر للنسخ",
|
||||||
"account.modal.totp.verify": "Verify",
|
"account.modal.totp.verify": "تحقق",
|
||||||
"account.notify.totp.disable": "TOTP disabled successfully",
|
"account.notify.totp.disable": "تم تعطيل TOTP بنجاح",
|
||||||
"account.notify.totp.enable": "TOTP enabled successfully",
|
"account.notify.totp.enable": "تم تمكين TOTP بنجاح",
|
||||||
"account.card.language.title": "Language",
|
"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": "Color scheme",
|
"account.card.color.title": "نظام الألوان",
|
||||||
// ThemeSwitcher.tsx
|
// ThemeSwitcher.tsx
|
||||||
"account.theme.dark": "Dark",
|
"account.theme.dark": "داكن",
|
||||||
"account.theme.light": "Light",
|
"account.theme.light": "فاتح",
|
||||||
"account.theme.system": "System",
|
"account.theme.system": "حسب النظام",
|
||||||
"account.button.delete": "Delete Account",
|
"account.button.delete": "حذف الحساب",
|
||||||
"account.modal.delete.title": "Delete Account",
|
"account.modal.delete.title": "حذف الحساب",
|
||||||
"account.modal.delete.description": "Do you really want to delete your account including all your active shares?",
|
"account.modal.delete.description": "هل تريد حقاً حذف حسابك بما في ذلك جميع مشاركاتك النشطة؟",
|
||||||
// END /account
|
// END /account
|
||||||
// /account/shares
|
// /account/shares
|
||||||
"account.shares.title": "My shares",
|
"account.shares.title": "مشاركاتي",
|
||||||
"account.shares.title.empty": "It's empty here 👀",
|
"account.shares.title.empty": "المكان خالٍ هنا 👀",
|
||||||
"account.shares.description.empty": "You don't have any shares.",
|
"account.shares.description.empty": "ليس لديك أي مشاركات.",
|
||||||
"account.shares.button.create": "Create one",
|
"account.shares.button.create": "أنشئ واحدًا",
|
||||||
"account.shares.info.title": "Share informations",
|
"account.shares.info.title": "معلومات المشاركة",
|
||||||
"account.shares.table.id": "ID",
|
"account.shares.table.id": "الرقم التعريفي",
|
||||||
"account.shares.table.name": "Name",
|
"account.shares.table.name": "الاسم",
|
||||||
"account.shares.table.description": "Description",
|
"account.shares.table.description": "الوصف",
|
||||||
"account.shares.table.visitors": "Visitors",
|
"account.shares.table.visitors": "الزوار",
|
||||||
"account.shares.table.expiresAt": "Expires at",
|
"account.shares.table.expiresAt": "تاريخ انتهاء الصلاحية",
|
||||||
"account.shares.table.createdAt": "Created at",
|
"account.shares.table.createdAt": "تاريخ الإنشاء",
|
||||||
"account.shares.table.size": "Size",
|
"account.shares.table.size": "الحجم",
|
||||||
"account.shares.modal.share-informations": "Share informations",
|
"account.shares.modal.share-informations": "معلومات المشاركة",
|
||||||
"account.shares.modal.share-link": "Share link",
|
"account.shares.modal.share-link": "رابط المشاركة",
|
||||||
"account.shares.modal.delete.title": "Delete share {share}",
|
"account.shares.modal.delete.title": "حذف المشاركة {share}",
|
||||||
"account.shares.modal.delete.description": "Do you really want to delete this share?",
|
"account.shares.modal.delete.description": "هل تريد حذف هذه المشاركة حقاً؟",
|
||||||
// END /account/shares
|
// END /account/shares
|
||||||
// /account/reverseShares
|
// /account/reverseShares
|
||||||
"account.reverseShares.title": "Reverse shares",
|
"account.reverseShares.title": "المشاركات العكسية",
|
||||||
"account.reverseShares.description": "A reverse share allows you to generate a unique URL that allows external users to create a share.",
|
"account.reverseShares.description": "تسمح لك المشاركة العكسية بإنشاء رابط فريد يسمح للمستخدمين الخارجيين بإنشاء مشاركة.",
|
||||||
"account.reverseShares.title.empty": "It's empty here 👀",
|
"account.reverseShares.title.empty": "المكان خالٍ هنا 👀",
|
||||||
"account.reverseShares.description.empty": "You don't have any reverse shares.",
|
"account.reverseShares.description.empty": "ليس لديك أي مشاركات عكسية.",
|
||||||
// showCreateReverseShareModal.tsx
|
// showCreateReverseShareModal.tsx
|
||||||
"account.reverseShares.modal.title": "Create reverse share",
|
"account.reverseShares.modal.title": "إنشاء مشاركة عكسية",
|
||||||
"account.reverseShares.modal.expiration.label": "Expiration",
|
"account.reverseShares.modal.expiration.label": "انتهاء الصلاحية",
|
||||||
"account.reverseShares.modal.expiration.minute-singular": "Minute",
|
"account.reverseShares.modal.expiration.minute-singular": "دقيقة",
|
||||||
"account.reverseShares.modal.expiration.minute-plural": "Minutes",
|
"account.reverseShares.modal.expiration.minute-plural": "دقائق",
|
||||||
"account.reverseShares.modal.expiration.hour-singular": "Hour",
|
"account.reverseShares.modal.expiration.hour-singular": "ساعة",
|
||||||
"account.reverseShares.modal.expiration.hour-plural": "Hours",
|
"account.reverseShares.modal.expiration.hour-plural": "ساعات",
|
||||||
"account.reverseShares.modal.expiration.day-singular": "Day",
|
"account.reverseShares.modal.expiration.day-singular": "يوم",
|
||||||
"account.reverseShares.modal.expiration.day-plural": "Days",
|
"account.reverseShares.modal.expiration.day-plural": "أيام",
|
||||||
"account.reverseShares.modal.expiration.week-singular": "Week",
|
"account.reverseShares.modal.expiration.week-singular": "أسبوع",
|
||||||
"account.reverseShares.modal.expiration.week-plural": "Weeks",
|
"account.reverseShares.modal.expiration.week-plural": "أسابيع",
|
||||||
"account.reverseShares.modal.expiration.month-singular": "Month",
|
"account.reverseShares.modal.expiration.month-singular": "شهر",
|
||||||
"account.reverseShares.modal.expiration.month-plural": "Months",
|
"account.reverseShares.modal.expiration.month-plural": "أشهر",
|
||||||
"account.reverseShares.modal.expiration.year-singular": "Year",
|
"account.reverseShares.modal.expiration.year-singular": "سنة",
|
||||||
"account.reverseShares.modal.expiration.year-plural": "Years",
|
"account.reverseShares.modal.expiration.year-plural": "سنوات",
|
||||||
"account.reverseShares.modal.max-size.label": "Max share size",
|
"account.reverseShares.modal.max-size.label": "الحد الأقصى لحجم المشاركة",
|
||||||
"account.reverseShares.modal.send-email": "Send email notification",
|
"account.reverseShares.modal.send-email": "أرسل إشعارًا بالبريد",
|
||||||
"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": "إرسال إشعار بالبريد الإلكتروني عند إنشاء مشاركة باستخدام رابط المشاركة العكسي هذا.",
|
||||||
"account.reverseShares.modal.max-use.label": "Max uses",
|
"account.reverseShares.modal.max-use.label": "الحد الأقصى لعدد الاستخدامات",
|
||||||
"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": "أقصى عدد من المرّات التي يمكن فيها استخدام هذا الرابط لإنشاء مشاركة.",
|
||||||
"account.reverseShare.never-expires": "This reverse share will never expire.",
|
"account.reverseShare.never-expires": "لن تنتهي صلاحية هذه المشاركة العكسية أبدًا.",
|
||||||
"account.reverseShare.expires-on": "This reverse share will expire on {expiration}.",
|
"account.reverseShare.expires-on": "هذه المشاركة العكسية ستنتهي صلاحيتها في {expiration}.",
|
||||||
"account.reverseShares.table.no-shares": "No shares created yet",
|
"account.reverseShares.table.no-shares": "لم يتم إنشاء أي مشاركة بعد",
|
||||||
"account.reverseShares.table.count.singular": "share",
|
"account.reverseShares.table.count.singular": "مشاركة",
|
||||||
"account.reverseShares.table.count.plural": "shares",
|
"account.reverseShares.table.count.plural": "مشاركات",
|
||||||
"account.reverseShares.table.shares": "Shares",
|
"account.reverseShares.table.shares": "مشاركات",
|
||||||
"account.reverseShares.table.remaining": "Remaining uses",
|
"account.reverseShares.table.remaining": "الاستخدامات المتبقية",
|
||||||
"account.reverseShares.table.max-size": "Max share size",
|
"account.reverseShares.table.max-size": "الحد الأقصى لحجم المشاركة",
|
||||||
"account.reverseShares.table.expires": "Expires at",
|
"account.reverseShares.table.expires": "تاريخ انتهاء الصلاحية",
|
||||||
"account.reverseShares.modal.reverse-share-link": "Reverse share link",
|
"account.reverseShares.modal.reverse-share-link": "رابط المشاركة العكسية",
|
||||||
"account.reverseShares.modal.delete.title": "Delete reverse share",
|
"account.reverseShares.modal.delete.title": "حذف المشاركة العكسية",
|
||||||
"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": "هل تريد حقاً حذف هذه المشاركة العكسية؟ إذا قمت بذلك، فسيتم حذف المشاركات المرتبطة بها أيضاً.",
|
||||||
// END /account/reverseShares
|
// END /account/reverseShares
|
||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administration",
|
"admin.title": "الإدارة",
|
||||||
"admin.button.users": "User management",
|
"admin.button.users": "إدارة المستخدم",
|
||||||
"admin.button.config": "Configuration",
|
"admin.button.shares": "إدارة المشاركة",
|
||||||
"admin.version": "Version",
|
"admin.button.config": "الإعدادات",
|
||||||
|
"admin.version": "الإصدار",
|
||||||
// END /admin
|
// END /admin
|
||||||
// /admin/users
|
// /admin/users
|
||||||
"admin.users.title": "User management",
|
"admin.users.title": "إدارة المستخدم",
|
||||||
"admin.users.table.username": "Username",
|
"admin.users.table.username": "اسم المستخدم",
|
||||||
"admin.users.table.email": "Email",
|
"admin.users.table.email": "البريد",
|
||||||
"admin.users.table.admin": "Admin",
|
"admin.users.table.admin": "المدير",
|
||||||
"admin.users.edit.update.title": "Update user {username}",
|
"admin.users.edit.update.title": "تحديث المستخدم {username}",
|
||||||
"admin.users.edit.update.admin-privileges": "Admin privileges",
|
"admin.users.edit.update.admin-privileges": "صلاحيات المدير",
|
||||||
"admin.users.edit.update.change-password.title": "Change password",
|
"admin.users.edit.update.change-password.title": "تغيير كلمة السر",
|
||||||
"admin.users.edit.update.change-password.field": "New password",
|
"admin.users.edit.update.change-password.field": "كلمة السر الجديدة",
|
||||||
"admin.users.edit.update.change-password.button": "Save new password",
|
"admin.users.edit.update.change-password.button": "حفظ كلمة السر الجديدة",
|
||||||
"admin.users.edit.update.notify.password.success": "Password changed successfully",
|
"admin.users.edit.update.notify.password.success": "غيرت كلمة السر بنجاح",
|
||||||
"admin.users.edit.delete.title": "Delete user {username}",
|
"admin.users.edit.delete.title": "حذف المستخدم {username}",
|
||||||
"admin.users.edit.delete.description": "Do you really want to delete this user and all his shares?",
|
"admin.users.edit.delete.description": "هل تريد حقاً حذف هذا المستخدم وكل مشاركاته؟",
|
||||||
// showCreateUserModal.tsx
|
// showCreateUserModal.tsx
|
||||||
"admin.users.modal.create.title": "Create user",
|
"admin.users.modal.create.title": "أنشئ مستخدمًا",
|
||||||
"admin.users.modal.create.username": "Username",
|
"admin.users.modal.create.username": "اسم المستخدم",
|
||||||
"admin.users.modal.create.email": "Email",
|
"admin.users.modal.create.email": "البريد",
|
||||||
"admin.users.modal.create.password": "Password",
|
"admin.users.modal.create.password": "كلمة السر",
|
||||||
"admin.users.modal.create.manual-password": "Set password manually",
|
"admin.users.modal.create.manual-password": "تعيين كلمة السر يدوياً",
|
||||||
"admin.users.modal.create.manual-password.description": "If not checked, the user will receive an email with a link to set their password.",
|
"admin.users.modal.create.manual-password.description": "بدون هذا الخيار، سيتلقى المستخدم رسالة بريد إلكتروني فيها رابط لتعيين كلمة السر الخاصة به.",
|
||||||
"admin.users.modal.create.admin": "Admin privileges",
|
"admin.users.modal.create.admin": "صلاحيات المدير",
|
||||||
"admin.users.modal.create.admin.description": "If checked, the user will be able to access the admin panel.",
|
"admin.users.modal.create.admin.description": "مع هذا الخيار، سيتمكن المستخدم من الدخول إلى لوحة الإدارة.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "إدارة المشاركة",
|
||||||
|
"admin.shares.table.id": "معرّف المشاركة",
|
||||||
|
"admin.shares.table.username": "المُنشئ",
|
||||||
|
"admin.shares.table.visitors": "الزوار",
|
||||||
|
"admin.shares.table.expires": "تاريخ انتهاء الصلاحية",
|
||||||
|
"admin.shares.edit.delete.title": "حذف المشاركة {id}",
|
||||||
|
"admin.shares.edit.delete.description": "هل تريد حذف هذه المشاركة حقاً؟",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Upload",
|
"upload.title": "رفع",
|
||||||
"upload.notify.generic-error": "An error occurred while finishing your share.",
|
"upload.notify.generic-error": "حدث خطأ أثناء إنهاء مشاركتك.",
|
||||||
"upload.notify.count-failed": "{count} files failed to upload. Trying again.",
|
"upload.notify.count-failed": "فشل رفع {count} ملفات. تجري المحاولة مجددًا.",
|
||||||
// Dropzone.tsx
|
// Dropzone.tsx
|
||||||
"upload.dropzone.title": "Upload files",
|
"upload.dropzone.title": "رفع الملفات",
|
||||||
"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": "اسحب الملفات إلى هنا لبدء مشاركتك. يمكننا فقط قبول الملفات التي لا يزيد حجمها عن {maxSize} بالمجمل.",
|
||||||
"upload.dropzone.notify.file-too-big": "Your files exceed the maximum share size of {maxSize}.",
|
"upload.dropzone.notify.file-too-big": "تتجاوز ملفاتك الحجم الأقصى للمشاركة والذي هو {maxSize}.",
|
||||||
// FileList.tsx
|
// FileList.tsx
|
||||||
"upload.filelist.name": "Name",
|
"upload.filelist.name": "الاسم",
|
||||||
"upload.filelist.size": "Size",
|
"upload.filelist.size": "الحجم",
|
||||||
// showCreateUploadModal.tsx
|
// showCreateUploadModal.tsx
|
||||||
"upload.modal.title": "Create Share",
|
"upload.modal.title": "إنشاء مشاركة",
|
||||||
"upload.modal.link.error.invalid": "Can only contain letters, numbers, underscores, and hyphens",
|
"upload.modal.link.error.invalid": "يمكن أن يحتوي فقط على الأحرف والأرقام والشرطات السفلية والواصلات",
|
||||||
"upload.modal.link.error.taken": "This link is already in use",
|
"upload.modal.link.error.taken": "هذا الرابط مستخدم مسبقاً",
|
||||||
"upload.modal.not-signed-in": "You're not signed in",
|
"upload.modal.not-signed-in": "لم تقم بتسجيل الدخول",
|
||||||
"upload.modal.not-signed-in-description": "You will be unable to delete your share manually and view the visitor count.",
|
"upload.modal.not-signed-in-description": "لن تتمكن من حذف مشاركتك يدوياً أو عرض عدد الزوار.",
|
||||||
"upload.modal.expires.never": "never",
|
"upload.modal.expires.never": "أبدًا",
|
||||||
"upload.modal.expires.never-long": "Never Expires",
|
"upload.modal.expires.never-long": "لا تنتهي الصلاحية أبداً",
|
||||||
"upload.modal.expires.error.too-long": "Expiration exceeds maximum expiration date of {max}.",
|
"upload.modal.expires.error.too-long": "انتهاء الصلاحية يتجاوز الحد الأقصى لتاريخ انتهاء الصلاحية والذي هو {max}.",
|
||||||
"upload.modal.link.label": "Link",
|
"upload.modal.link.label": "الرابط",
|
||||||
"upload.modal.expires.label": "Expiration",
|
"upload.modal.expires.label": "انتهاء الصلاحية",
|
||||||
"upload.modal.expires.minute-singular": "Minute",
|
"upload.modal.expires.minute-singular": "دقيقة",
|
||||||
"upload.modal.expires.minute-plural": "Minutes",
|
"upload.modal.expires.minute-plural": "دقائق",
|
||||||
"upload.modal.expires.hour-singular": "Hour",
|
"upload.modal.expires.hour-singular": "ساعة",
|
||||||
"upload.modal.expires.hour-plural": "Hours",
|
"upload.modal.expires.hour-plural": "ساعات",
|
||||||
"upload.modal.expires.day-singular": "Day",
|
"upload.modal.expires.day-singular": "يوم",
|
||||||
"upload.modal.expires.day-plural": "Days",
|
"upload.modal.expires.day-plural": "أيام",
|
||||||
"upload.modal.expires.week-singular": "Week",
|
"upload.modal.expires.week-singular": "أسبوع",
|
||||||
"upload.modal.expires.week-plural": "Weeks",
|
"upload.modal.expires.week-plural": "أسابيع",
|
||||||
"upload.modal.expires.month-singular": "Month",
|
"upload.modal.expires.month-singular": "شهر",
|
||||||
"upload.modal.expires.month-plural": "Months",
|
"upload.modal.expires.month-plural": "أشهر",
|
||||||
"upload.modal.expires.year-singular": "Year",
|
"upload.modal.expires.year-singular": "سنة",
|
||||||
"upload.modal.expires.year-plural": "Years",
|
"upload.modal.expires.year-plural": "سنوات",
|
||||||
"upload.modal.accordion.description.title": "Description",
|
"upload.modal.accordion.name-and-description.title": "الاسم والوصف",
|
||||||
"upload.modal.accordion.description.placeholder": "Note for the recipients of this share",
|
"upload.modal.accordion.name-and-description.name.placeholder": "الاسم",
|
||||||
"upload.modal.accordion.email.title": "Email recipients",
|
"upload.modal.accordion.name-and-description.description.placeholder": "ملاحظة لمستقبلي هذه المشاركة",
|
||||||
"upload.modal.accordion.email.placeholder": "Enter email recipients",
|
"upload.modal.accordion.email.title": "مستلمو البريد الإلكتروني",
|
||||||
"upload.modal.accordion.email.invalid-email": "Invalid email address",
|
"upload.modal.accordion.email.placeholder": "أدخل مستلمي البريد",
|
||||||
"upload.modal.accordion.security.title": "Security options",
|
"upload.modal.accordion.email.invalid-email": "عنوان البريد غير صحيح",
|
||||||
"upload.modal.accordion.security.password.label": "Password protection",
|
"upload.modal.accordion.security.title": "خيارات الأمان",
|
||||||
"upload.modal.accordion.security.password.placeholder": "No password",
|
"upload.modal.accordion.security.password.label": "الحماية بكلمة السر",
|
||||||
"upload.modal.accordion.security.max-views.label": "Maximum views",
|
"upload.modal.accordion.security.password.placeholder": "لا توجد كلمة سر",
|
||||||
"upload.modal.accordion.security.max-views.placeholder": "No limit",
|
"upload.modal.accordion.security.max-views.label": "الحد الأقصى للمشاهدات",
|
||||||
|
"upload.modal.accordion.security.max-views.placeholder": "لا يوجد حد",
|
||||||
// showCompletedUploadModal.tsx
|
// showCompletedUploadModal.tsx
|
||||||
"upload.modal.completed.never-expires": "This share will never expire.",
|
"upload.modal.completed.never-expires": "لن تنتهي صلاحية هذه المشاركة أبدًا.",
|
||||||
"upload.modal.completed.expires-on": "This share will expire on {expiration}.",
|
"upload.modal.completed.expires-on": "هذه المشاركة ستنتهي صلاحيتها في {expiration}.",
|
||||||
"upload.modal.completed.share-ready": "Share ready",
|
"upload.modal.completed.share-ready": "المشاركة جاهزة",
|
||||||
// END /upload
|
// END /upload
|
||||||
// /share/[id]
|
// /share/[id]
|
||||||
"share.title": "Share {shareId}",
|
"share.title": "المشاركة {shareId}",
|
||||||
"share.description": "Look what I've shared with you!",
|
"share.description": "انظر ما الذي شاركته معك!",
|
||||||
"share.error.visitor-limit-exceeded.title": "Visitor limit exceeded",
|
"share.error.visitor-limit-exceeded.title": "تم تجاوز حد المشاهدات",
|
||||||
"share.error.visitor-limit-exceeded.description": "The visitor limit from this share has been exceeded.",
|
"share.error.visitor-limit-exceeded.description": "تم تجاوز الحد الأقصى لزوار هذه المشاركة.",
|
||||||
"share.error.removed.title": "Share removed",
|
"share.error.removed.title": "تمت إزالة المشاركة",
|
||||||
"share.error.not-found.title": "Share not found",
|
"share.error.not-found.title": "المشاركة غير موجودة",
|
||||||
"share.error.not-found.description": "The share you're looking for doesn't exist.",
|
"share.error.not-found.description": "المشاركة التي تبحث عنها غير موجودة.",
|
||||||
"share.modal.password.title": "Password required",
|
"share.modal.password.title": "كلمة السر مطلوبة",
|
||||||
"share.modal.password.description": "To access this share please enter the password for the share.",
|
"share.modal.password.description": "للوصول إلى هذه المشاركة الرجاء إدخال كلمة سر المشاركة.",
|
||||||
"share.modal.password": "Password",
|
"share.modal.password": "كلمة السر",
|
||||||
"share.modal.error.invalid-password": "Invalid password",
|
"share.modal.error.invalid-password": "كلمة السر غير صحيحة",
|
||||||
"share.button.download-all": "Download all",
|
"share.button.download-all": "تنزيل الكل",
|
||||||
"share.notify.download-all-preparing": "The share is preparing. Try again in a few minutes.",
|
"share.notify.download-all-preparing": "يتم تحضير المشاركة. حاول مرة أخرى في بضع دقائق.",
|
||||||
"share.modal.file-link": "File link",
|
"share.modal.file-link": "رابط الملف",
|
||||||
"share.table.name": "Name",
|
"share.table.name": "الاسم",
|
||||||
"share.table.size": "Size",
|
"share.table.size": "الحجم",
|
||||||
"share.modal.file-preview.error.not-supported.title": "Preview not supported",
|
"share.modal.file-preview.error.not-supported.title": "المعاينة غير مدعومة",
|
||||||
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
|
"share.modal.file-preview.error.not-supported.description": "معاينة هذا النوع من الملفات غير مدعومة. الرجاء تنزيل الملف لعرضه.",
|
||||||
// END /share/[id]
|
// END /share/[id]
|
||||||
// /share/[id]/edit
|
// /share/[id]/edit
|
||||||
"share.edit.title": "Edit {shareId}",
|
"share.edit.title": "تحرير {shareId}",
|
||||||
"share.edit.append-upload": "Append file",
|
"share.edit.append-upload": "إضافة ملف",
|
||||||
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
|
"share.edit.notify.generic-error": "حدث خطأ أثناء إنهاء مشاركتك.",
|
||||||
"share.edit.notify.save-success": "Share updated successfully",
|
"share.edit.notify.save-success": "تم تحديث المشاركة بنجاح",
|
||||||
// END /share/[id]/edit
|
// END /share/[id]/edit
|
||||||
// /admin/config
|
// /admin/config
|
||||||
"admin.config.title": "Configuration",
|
"admin.config.title": "الإعدادات",
|
||||||
"admin.config.category.general": "General",
|
"admin.config.category.general": "عام",
|
||||||
"admin.config.category.share": "Share",
|
"admin.config.category.share": "مشاركة",
|
||||||
"admin.config.category.email": "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 name",
|
"admin.config.general.app-name": "اسم التطبيق",
|
||||||
"admin.config.general.app-name.description": "Name of the application",
|
"admin.config.general.app-name.description": "اسم التطبيق",
|
||||||
"admin.config.general.app-url": "App URL",
|
"admin.config.general.app-url": "رابط التطبيق",
|
||||||
"admin.config.general.app-url.description": "On which URL Pingvin Share is available",
|
"admin.config.general.app-url.description": "الرابط الذي تكون مشاركة Pingvin صالحة عليه",
|
||||||
"admin.config.general.show-home-page": "Show home page",
|
"admin.config.general.show-home-page": "إظهار الصفحة الرئيسية",
|
||||||
"admin.config.general.show-home-page.description": "Whether to show the home page",
|
"admin.config.general.show-home-page.description": "تحديد ما إذا كان سيتم عرض الصفحة الرئيسية",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.session-duration": "مدة الجلسة",
|
||||||
"admin.config.general.logo.description": "Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.",
|
"admin.config.general.session-duration.description": "الوقت بالساعات الذي يجب على المستخدم بعده إعادة تسجيل الدخول (الافتراضي: 3 أشهر).",
|
||||||
"admin.config.general.logo.placeholder": "Pick image",
|
"admin.config.general.logo": "الشعار",
|
||||||
"admin.config.email.enable-share-email-recipients": "Enable share email recipients",
|
"admin.config.general.logo.description": "يمكنك تغيير شعارك عن طريق تحميل صورة جديدة. يجب أن تكون الصورة PNG ويجب أن يكون تنسيقها 1:1.",
|
||||||
"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.general.logo.placeholder": "اختر صورة",
|
||||||
"admin.config.email.share-recipients-subject": "Share recipients subject",
|
"admin.config.email.enable-share-email-recipients": "تفعيل مستلمي البريد الإلكتروني لهذه المشاركة",
|
||||||
"admin.config.email.share-recipients-subject.description": "Subject of the email which gets sent to the share recipients.",
|
"admin.config.email.enable-share-email-recipients.description": "السماح لرسائل البريد بأن تُشارك المستلمين. لا تفعّل هذا الخيار ما لم تفعّل SMTP مسبقًا.",
|
||||||
"admin.config.email.share-recipients-message": "Share recipients message",
|
"admin.config.email.share-recipients-subject": "عنوان الرسالة لمستلمي المشاركة",
|
||||||
"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-subject.description": "عنوان البريد الذي سيُرسَل لمستقبِلي المشاركة.",
|
||||||
"admin.config.email.reverse-share-subject": "Reverse share subject",
|
"admin.config.email.share-recipients-message": "رسالتك لمستقبِلي المشاركة",
|
||||||
"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.share-recipients-message.description": "الرسالة التي ستُرسل لمستقبِلي المشاركة. يمكنك استخدام هذه المتغيرات:\n{creator} - اسم المستخدم الذي أنشأ المشاركة\n{shareUrl} - رابط المشاركة\n{desc} - وصف المشاركة\n{expires} - تاريخ انتهاء صلاحية المشاركة\nستتم كتابة قيم هذه المتغيرات تلقائيًا.",
|
||||||
"admin.config.email.reverse-share-message": "Reverse share message",
|
"admin.config.email.reverse-share-subject": "عنوان المشاركة العكسية",
|
||||||
"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-subject.description": "عنوان البريد الذي سيُرسل عندما يُنشئ شخص ما مشاركةً باستخدام رابط المشاركة العكسية الخاص بك.",
|
||||||
"admin.config.email.reset-password-subject": "Reset password subject",
|
"admin.config.email.reverse-share-message": "رسالة المشاركة العكسية",
|
||||||
"admin.config.email.reset-password-subject.description": "Subject of the email which gets sent when a user requests a password reset.",
|
"admin.config.email.reverse-share-message.description": "الرسالة التي ستُرسل عندما يُنشئ شخص ما مشاركة باستخدام رابط المشاركة الخاص بك. سيُوضع اسم المُنشِئ ورابط المشاركة مكان {shareUrl}.",
|
||||||
"admin.config.email.reset-password-message": "Reset password message",
|
"admin.config.email.reset-password-subject": "رسالة إعادة تعيين كلمة السر",
|
||||||
"admin.config.email.reset-password-message.description": "Message which gets sent when a user requests a password reset. {url} will be replaced with the reset password URL.",
|
"admin.config.email.reset-password-subject.description": "عنوان البريد الذي سيُرسل حين يطلب مستخدم ما إعادة تعيين كلمة سرّه.",
|
||||||
"admin.config.email.invite-subject": "Invite subject",
|
"admin.config.email.reset-password-message": "رسالة إعادة تعيين كلمة السر",
|
||||||
"admin.config.email.invite-subject.description": "Subject of the email which gets sent when an admin invites a user.",
|
"admin.config.email.reset-password-message.description": "الرسالة التي ستُرسل عندما يطلب المستخدم إعادة تعيين كلمة سرّه. سيُوضع رابط إعادة تعيين كلمة السر مكان {url}.",
|
||||||
"admin.config.email.invite-message": "Invite message",
|
"admin.config.email.invite-subject": "عنوان الدعوة",
|
||||||
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL and {password} with the password.",
|
"admin.config.email.invite-subject.description": "عنوان البريد الذي سيُرسل عندما يقوم المشرف بدعوة مستخدم ما.",
|
||||||
"admin.config.share.allow-registration": "Allow registration",
|
"admin.config.email.invite-message": "رسالة الدعوة",
|
||||||
"admin.config.share.allow-registration.description": "Whether registration is allowed",
|
"admin.config.email.invite-message.description": "الرسالة التي ستُرسل عندما يدعو مشرفٌ مستخدمًا. سيُوضع رابط الدعوة مكان {url} وكلمة السر مكان {password}.",
|
||||||
"admin.config.share.allow-unauthenticated-shares": "Allow unauthenticated shares",
|
"admin.config.share.allow-registration": "السماح بالتسجيل",
|
||||||
"admin.config.share.allow-unauthenticated-shares.description": "Whether unauthenticated users can create shares",
|
"admin.config.share.allow-registration.description": "إتاحة تسجيل حساب جديد",
|
||||||
"admin.config.share.max-expiration": "Max expiration",
|
"admin.config.share.allow-unauthenticated-shares": "السماح بالمشاركات غير المصادق عليها",
|
||||||
"admin.config.share.max-expiration.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
|
"admin.config.share.allow-unauthenticated-shares.description": "إتاحة إنشاء المشاركات للمستخدمين غير الموثقين",
|
||||||
"admin.config.share.max-size": "Max size",
|
"admin.config.share.max-expiration": "أبعد زمن لانتهاء الصلاحية",
|
||||||
"admin.config.share.max-size.description": "Maximum share size in bytes",
|
"admin.config.share.max-expiration.description": "أطول زمن لانتهاء صلاحية المشاركات بالساعات. الصفر يعني أن المشاركة لن تنتهي صلاحيتها.",
|
||||||
"admin.config.share.zip-compression-level": "Zip compression level",
|
"admin.config.share.max-size": "أكبر حجم",
|
||||||
"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.max-size.description": "أكبر حجم للمشاركة مقيسًا بالبايت",
|
||||||
"admin.config.smtp.enabled": "Enabled",
|
"admin.config.share.zip-compression-level": "مستوى ضغط الZip",
|
||||||
"admin.config.smtp.enabled.description": "Whether SMTP is enabled. Only set this to true if you entered the host, port, email, user and password of your SMTP server.",
|
"admin.config.share.zip-compression-level.description": "ضبط الميزان بين حجم الملف وسرعة الضغط. يمكنك إدخال قيم بين 0 إلى 9، حيث 0 تعني بدون ضغط و9 تعني أقصى ضغط. ",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.share.chunk-size": "حجم القطعة",
|
||||||
"admin.config.smtp.host.description": "Host of the SMTP server",
|
"admin.config.share.chunk-size.description": "ضبط حجم القطعة (بالبايت) لملفاتك المرفوعة للموازنة بين الكفاءة والفعالية حسب قوة اتصالك بالإنترنت. القطع الأصغر يمكن أن ترفع معدل النجاح في حال كان اتصالك بالإنترنت غير مستقر، بينما القطع الأكبر يمكنها أن تُسرّع رفع الملفات في حال كان الاتصال بالإنترنت مستقرًا.",
|
||||||
"admin.config.smtp.port": "Port",
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
"admin.config.smtp.port.description": "Port of the SMTP server",
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.email": "Email",
|
"admin.config.smtp.enabled": "مفعل",
|
||||||
"admin.config.smtp.email.description": "Email address which the emails get sent from",
|
"admin.config.smtp.enabled.description": "تفعيل الـSMTP. لا تفعّله إلا إذا قمت بإدخال المضيف، والمنفذ، والبريد الإلكتروني، واسم المستخدم، وكلمة السر لخادم الـSMTP.",
|
||||||
"admin.config.smtp.username": "Username",
|
"admin.config.smtp.host": "المُضيف",
|
||||||
"admin.config.smtp.username.description": "Username of the SMTP server",
|
"admin.config.smtp.host.description": "مضيف خادم الـSMTP",
|
||||||
"admin.config.smtp.password": "Password",
|
"admin.config.smtp.port": "المنفذ",
|
||||||
"admin.config.smtp.password.description": "Password of the SMTP server",
|
"admin.config.smtp.port.description": "منفذ خادم الـSMTP",
|
||||||
"admin.config.smtp.button.test": "Send test email",
|
"admin.config.smtp.email": "البريد الإلكتروني",
|
||||||
"admin.config.oauth.allow-registration": "Allow registration",
|
"admin.config.smtp.email.description": "عنوان البريد الذي ستُرسَل الرسائل منه",
|
||||||
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
"admin.config.smtp.username": "اسم المستخدم",
|
||||||
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
"admin.config.smtp.username.description": "اسم المستخدم لخادم الـSMTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
"admin.config.smtp.password": "كلمة السر",
|
||||||
|
"admin.config.smtp.password.description": "كلمة السر لخادم الـSMTP",
|
||||||
|
"admin.config.smtp.button.test": "إرسال رسالة بريد تجريبية",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
|
"admin.config.oauth.allow-registration": "السماح بتسجيل الحسابات الجديدة",
|
||||||
|
"admin.config.oauth.allow-registration.description": "السماح للمستخدمين بالدخول بواسطة حساباتهم الاجتماعية",
|
||||||
|
"admin.config.oauth.ignore-totp": "تجاهل TOTP",
|
||||||
|
"admin.config.oauth.ignore-totp.description": "تجاهل TOTP إذا دخل المستخدم بحسابه الاجتماعي",
|
||||||
|
"admin.config.oauth.disable-password": "تعطيل تسجيل الدخول باستخدام كلمة السر",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
|
"admin.config.oauth.github-enabled.description": "تفعيل خيار الدخول بحساب 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",
|
||||||
"admin.config.oauth.github-client-secret": "GitHub Client secret",
|
"admin.config.oauth.github-client-secret": "الرمز السرّي لـGitHub Client",
|
||||||
"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 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",
|
||||||
"admin.config.oauth.google-client-secret": "Google Client secret",
|
"admin.config.oauth.google-client-secret": "الرمز السرّي لـ Google Client",
|
||||||
"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": "معرف Tenant لتطبيق مايكروسوفت OAuth\nالشائع: يمكن للمستخدمين الذين لديهم حساب مايكروسوفت شخصي وحساب عمل أو مدرسة من معرف Microsoft Entra أن يسجلوا الدخول إلى التطبيق. بالنسبة المؤسسات: يمكن فقط للمستخدمين الذين لديهم حسابات عمل أو مدرسة من Microsoft Entra ID تسجيل الدخول إلى التطبيق.\nالمستهلكين: يمكن فقط للمستخدمين الذين لديهم حساب مايكروسوفت الشخصي تسجيل الدخول إلى التطبيق.\nاسم نطاق مستأجر Microsoft Entra أو معرف المستأجر بتنسيق GUID: يمكن فقط للمستخدمين من مستأجر Microsoft Entra محدد (أعضاء الإدارة الذين لديهم حساب عمل أو مدرسة أو ضيوف الإدارة الذين لديهم حساب شخصي لمايكروسوفت) تسجيل الدخول إلى التطبيق.",
|
||||||
"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",
|
||||||
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
|
"admin.config.oauth.microsoft-client-secret": "الرمز السرّي لـMicrosoft Client",
|
||||||
"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-limited-guild": "Discord limited server ID",
|
"admin.config.oauth.discord-limited-guild": "مُعرِّف خادم Discord المحدود",
|
||||||
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
|
"admin.config.oauth.discord-limited-guild.description": "حصر تسجيل الدخول على المستخدمين الموجودين في خادم محدّد. اترك هذا الخيار فارغًا لتعطيله.",
|
||||||
"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": "معرف العميل لتطبيق Discord OAuth",
|
||||||
"admin.config.oauth.discord-client-secret": "Discord Client secret",
|
"admin.config.oauth.discord-client-secret": "الرمز السرّي لـDiscord Client",
|
||||||
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
|
"admin.config.oauth.discord-client-secret.description": "الرّمز السرّي للعميل لتطبيق Discord OAuth",
|
||||||
"admin.config.oauth.oidc-enabled": "OpenID Connect",
|
"admin.config.oauth.oidc-enabled": "OpenID Connect",
|
||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "تفعيل الدخول باستخدام OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "رابط الاستكشاف لتطبيق OpenID Connect OAuth",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "طلب اسم المستخدم في رمز معرف OpenID Connect. إذا كنت لا تعرف معنى هذا الإعداد، اتركه فارغًا.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-client-id.description": "معرف العميل لتطبيق OpenID Connect OAuth",
|
||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
|
||||||
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-client-secret.description": "الرّمز السرّي للعميل لتطبيق OpenID Connect OAuth",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Oops this page doesn't exist.",
|
"404.description": "هذه الصفحة غير موجودة.",
|
||||||
"404.button.home": "Bring me back 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.invalid_token": "Internal Error",
|
"error.msg.invalid_token": "خطأ داخلي",
|
||||||
"error.msg.no_user": "User linked to this {0} account doesn't exist.",
|
"error.msg.no_user": "المستخدم المرتبط بهذا الحساب {0} غير موجود.",
|
||||||
"error.msg.no_email": "Can't get email address from this {0} account.",
|
"error.msg.no_email": "لا يمكن الحصول على عنوان البريد الإلكتروني من هذا الحساب {0}.",
|
||||||
"error.msg.already_linked": "This {0} account is already linked to another account.",
|
"error.msg.already_linked": "حساب {0} هذا مرتبط بالفعل بحساب آخر.",
|
||||||
"error.msg.not_linked": "This {0} account haven't linked to any account yet.",
|
"error.msg.not_linked": "لم يتم ربط حساب {0} هذا بأي حساب حتى الآن.",
|
||||||
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
"error.msg.unverified_account": "لم يتم التحقق من حساب {0} هذا، يرجى المحاولة مرة أخرى بعد التحقق.",
|
||||||
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
|
"error.msg.user_not_allowed": "غير مسموح لك بتسجيل الدخول.",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "فشلت عملية جلب معلومات المستخدم الخاصة بك من حساب {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 Connect",
|
"error.param.provider_oidc": "OpenID Connect",
|
||||||
// Common translations
|
// Common translations
|
||||||
"common.button.save": "Save",
|
"common.button.save": "حفظ",
|
||||||
"common.button.create": "Create",
|
"common.button.create": "إنشاء",
|
||||||
"common.button.submit": "Submit",
|
"common.button.submit": "إرسال",
|
||||||
"common.button.delete": "Delete",
|
"common.button.delete": "حذف",
|
||||||
"common.button.cancel": "Cancel",
|
"common.button.cancel": "إلغاء",
|
||||||
"common.button.confirm": "Confirm",
|
"common.button.confirm": "تأكيد",
|
||||||
"common.button.disable": "Disable",
|
"common.button.disable": "إيقاف",
|
||||||
"common.button.share": "Share",
|
"common.button.share": "مشاركة",
|
||||||
"common.button.generate": "Generate",
|
"common.button.generate": "توليد",
|
||||||
"common.button.done": "Done",
|
"common.button.done": "تم",
|
||||||
"common.text.link": "Link",
|
"common.text.link": "الرابط",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "الذهاب إلى الرابط",
|
||||||
"common.text.or": "or",
|
"common.text.or": "أو",
|
||||||
"common.button.go-back": "Go back",
|
"common.button.go-back": "العودة",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "العودة للصفحة الرئيسية",
|
||||||
"common.notify.copied": "Your link was copied to the clipboard",
|
"common.notify.copied": "تم نسخ الرابط إلى الحافظة",
|
||||||
"common.success": "Success",
|
"common.success": "تم",
|
||||||
"common.error": "Error",
|
"common.error": "خطأ",
|
||||||
"common.error.unknown": "An unknown error occurred",
|
"common.error.unknown": "حدث خطأ غير معروف",
|
||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "عنوان البريد غير صحيح",
|
||||||
"common.error.too-short": "Must be at least {length} characters",
|
"common.error.too-short": "يجب أن يكون على الأقل {length} حرفًا",
|
||||||
"common.error.too-long": "Must be at most {length} characters",
|
"common.error.too-long": "يجب أن يكون على الأكثر {length} حرفًا",
|
||||||
"common.error.exact-length": "Must be exactly {length} characters",
|
"common.error.exact-length": "يجب أن يكون بالضبط {length} حرفًا",
|
||||||
"common.error.invalid-number": "Must be a number",
|
"common.error.invalid-number": "يجب أن يكون رقماً",
|
||||||
"common.error.field-required": "This field is required"
|
"common.error.field-required": "هذا الحقل مطلوب"
|
||||||
};
|
};
|
||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "2-faktor login påkrævet",
|
"signIn.notify.totp-required.title": "2-faktor login påkrævet",
|
||||||
"signIn.notify.totp-required.description": "Indtast den aktuelle engangskode fra din 2-faktor Authenticator",
|
"signIn.notify.totp-required.description": "Indtast den aktuelle engangskode fra din 2-faktor Authenticator",
|
||||||
"signIn.oauth.or": "OR",
|
"signIn.oauth.or": "OR",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Trin 2: Valider din kode",
|
"account.modal.totp.step2": "Trin 2: Valider din kode",
|
||||||
"account.modal.totp.enterManually": "Indtast manuelt",
|
"account.modal.totp.enterManually": "Indtast manuelt",
|
||||||
"account.modal.totp.code": "Kode",
|
"account.modal.totp.code": "Kode",
|
||||||
"account.modal.totp.clickToCopy": "Klik for at kopiere",
|
"common.button.clickToCopy": "Klik for at kopiere",
|
||||||
"account.modal.totp.verify": "Bekræft",
|
"account.modal.totp.verify": "Bekræft",
|
||||||
"account.notify.totp.disable": "2-faktor blev deaktiveret",
|
"account.notify.totp.disable": "2-faktor blev deaktiveret",
|
||||||
"account.notify.totp.enable": "2-faktor blev deaktiveret",
|
"account.notify.totp.enable": "2-faktor blev deaktiveret",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administration",
|
"admin.title": "Administration",
|
||||||
"admin.button.users": "Brugeradministration",
|
"admin.button.users": "Brugeradministration",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Konfiguration",
|
"admin.button.config": "Konfiguration",
|
||||||
"admin.version": "Version",
|
"admin.version": "Version",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Admin rettigheder",
|
"admin.users.modal.create.admin": "Admin rettigheder",
|
||||||
"admin.users.modal.create.admin.description": "If checked, the user will be able to access the admin panel.",
|
"admin.users.modal.create.admin.description": "If checked, the user will be able to access the admin panel.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Besøgende",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Upload",
|
"upload.title": "Upload",
|
||||||
"upload.notify.generic-error": "Der opstod en fejl under afslutningen af din deling.",
|
"upload.notify.generic-error": "Der opstod en fejl under afslutningen af din deling.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Måneder",
|
"upload.modal.expires.month-plural": "Måneder",
|
||||||
"upload.modal.expires.year-singular": "År",
|
"upload.modal.expires.year-singular": "År",
|
||||||
"upload.modal.expires.year-plural": "År",
|
"upload.modal.expires.year-plural": "År",
|
||||||
"upload.modal.accordion.description.title": "Beskrivelse",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "Bemærkning til modtagerne af dette share",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Navn",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "E-mail modtagere",
|
"upload.modal.accordion.email.title": "E-mail modtagere",
|
||||||
"upload.modal.accordion.email.placeholder": "Indtast e-mail modtagere",
|
"upload.modal.accordion.email.placeholder": "Indtast e-mail modtagere",
|
||||||
"upload.modal.accordion.email.invalid-email": "Ugyldig e-mailadresse",
|
"upload.modal.accordion.email.invalid-email": "Ugyldig e-mailadresse",
|
||||||
@@ -265,7 +277,7 @@ export default {
|
|||||||
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
|
"share.modal.file-preview.error.not-supported.description": "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/[id]/edit
|
||||||
"share.edit.title": "Edit {shareId}",
|
"share.edit.title": "Rediger {shareId}",
|
||||||
"share.edit.append-upload": "Append file",
|
"share.edit.append-upload": "Append file",
|
||||||
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
|
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
|
||||||
"share.edit.notify.save-success": "Share updated successfully",
|
"share.edit.notify.save-success": "Share updated successfully",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "På hvilken URL Pingvin Share er tilgængelig",
|
"admin.config.general.app-url.description": "På hvilken URL Pingvin Share er tilgængelig",
|
||||||
"admin.config.general.show-home-page": "Vis forside",
|
"admin.config.general.show-home-page": "Vis forside",
|
||||||
"admin.config.general.show-home-page.description": "Om forsiden skal vises",
|
"admin.config.general.show-home-page.description": "Om forsiden skal vises",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Skift dit logo ved at uploade et nyt billede. Billedet skal være PNG og skal have formatet 1:1.",
|
"admin.config.general.logo.description": "Skift dit logo ved at uploade et nyt billede. Billedet skal være PNG og skal have formatet 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Vælg billede",
|
"admin.config.general.logo.placeholder": "Vælg billede",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"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",
|
||||||
"admin.config.share.zip-compression-level.description": "Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression. ",
|
"admin.config.share.zip-compression-level.description": "Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression. ",
|
||||||
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Aktiveret",
|
"admin.config.smtp.enabled": "Aktiveret",
|
||||||
"admin.config.smtp.enabled.description": "Om SMTP er aktiveret. Aktiver kun SMTP, hvis du har indtastet SMTP-server vært, port, e-mail, bruger og adgangskode.",
|
"admin.config.smtp.enabled.description": "Om SMTP er aktiveret. Aktiver kun SMTP, hvis du har indtastet SMTP-server vært, port, e-mail, bruger og adgangskode.",
|
||||||
"admin.config.smtp.host": "Vært",
|
"admin.config.smtp.host": "Vært",
|
||||||
@@ -327,10 +345,14 @@ export default {
|
|||||||
"admin.config.smtp.password": "Adgangskode",
|
"admin.config.smtp.password": "Adgangskode",
|
||||||
"admin.config.smtp.password.description": "Adgangskoden til SMTP serveren",
|
"admin.config.smtp.password.description": "Adgangskoden til SMTP serveren",
|
||||||
"admin.config.smtp.button.test": "Send test e-mail",
|
"admin.config.smtp.button.test": "Send test e-mail",
|
||||||
"admin.config.oauth.allow-registration": "Allow registration",
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
|
"admin.config.oauth.allow-registration": "Tillad registrering",
|
||||||
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
||||||
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
|
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect 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": "OpenID Connect Client secret",
|
||||||
@@ -379,13 +407,13 @@ 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.invalid_token": "Intern Fejl",
|
||||||
"error.msg.no_user": "User linked to this {0} account doesn't exist.",
|
"error.msg.no_user": "User linked to this {0} account doesn't exist.",
|
||||||
"error.msg.no_email": "Can't get email address from this {0} account.",
|
"error.msg.no_email": "Can't get email address from this {0} account.",
|
||||||
"error.msg.already_linked": "This {0} account is already linked to another account.",
|
"error.msg.already_linked": "This {0} account is already linked to another account.",
|
||||||
"error.msg.not_linked": "This {0} account haven't linked to any account yet.",
|
"error.msg.not_linked": "This {0} account haven't linked to any account yet.",
|
||||||
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
||||||
"error.msg.discord_guild_permission_denied": "Du har ikke tilladelse til at logge ind.",
|
"error.msg.user_not_allowed": "Du har ikke tilladelse til at logge ind.",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"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": "ODER",
|
"signIn.oauth.or": "ODER",
|
||||||
|
"signIn.oauth.signInWith": "Anmelden mit",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -57,7 +58,7 @@ export default {
|
|||||||
// /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": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "Wir haben dir einen Link gesendet, unter dem du dein Passwort zurücksetzen kannst.",
|
||||||
"resetPassword.button.back": "Zurück zur Anmeldeseite",
|
"resetPassword.button.back": "Zurück zur Anmeldeseite",
|
||||||
"resetPassword.text.resetPassword": "Passwort zurücksetzen",
|
"resetPassword.text.resetPassword": "Passwort zurücksetzen",
|
||||||
"resetPassword.text.enterNewPassword": "Gib dein neues Passwort ein",
|
"resetPassword.text.enterNewPassword": "Gib dein neues Passwort ein",
|
||||||
@@ -72,7 +73,7 @@ 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": "Du hast kein Passwort erstellt. Wenn Du Dich mit E-Mail und Passwort anmelden möchtest, musst Du ein Passwort festlegen.",
|
"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": "Anmeldung über soziale Netzwerke",
|
"account.card.oauth.title": "Anmeldung über soziale Netzwerke",
|
||||||
"account.card.oauth.github": "GitHub",
|
"account.card.oauth.github": "GitHub",
|
||||||
@@ -84,7 +85,7 @@ export default {
|
|||||||
"account.card.oauth.unlink": "Verknüpfung aufheben",
|
"account.card.oauth.unlink": "Verknüpfung aufheben",
|
||||||
"account.card.oauth.unlinked": "Verknüpfung aufgehoben",
|
"account.card.oauth.unlinked": "Verknüpfung aufgehoben",
|
||||||
"account.modal.unlink.title": "Kontoverknüpfung aufheben",
|
"account.modal.unlink.title": "Kontoverknüpfung aufheben",
|
||||||
"account.modal.unlink.description": "Das Entfernen der Verknüpfung mit Deinem sozialen Konten kann dazu führen, dass Du Dein Konto verlierst, wenn Du Dich nicht an Deinen Benutzernamen und Dein Passwort erinnerst.",
|
"account.modal.unlink.description": "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": "Verknüpfung erfolgreich aufgehoben",
|
"account.notify.oauth.unlinked.success": "Verknüpfung erfolgreich aufgehoben",
|
||||||
"account.card.security.title": "Sicherheit",
|
"account.card.security.title": "Sicherheit",
|
||||||
"account.card.security.totp.enable.description": "Gib dein aktuelles Passwort ein, um TOTP zu aktivieren",
|
"account.card.security.totp.enable.description": "Gib dein aktuelles Passwort ein, um TOTP zu aktivieren",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Schritt 2: Bestätige deinen Code",
|
"account.modal.totp.step2": "Schritt 2: Bestätige deinen Code",
|
||||||
"account.modal.totp.enterManually": "Manuell eingeben",
|
"account.modal.totp.enterManually": "Manuell eingeben",
|
||||||
"account.modal.totp.code": "Code",
|
"account.modal.totp.code": "Code",
|
||||||
"account.modal.totp.clickToCopy": "Klicken zum Kopieren",
|
"common.button.clickToCopy": "Klicken zum Kopieren",
|
||||||
"account.modal.totp.verify": "Überprüfen",
|
"account.modal.totp.verify": "Überprüfen",
|
||||||
"account.notify.totp.disable": "TOTP erfolgreich deaktiviert",
|
"account.notify.totp.disable": "TOTP erfolgreich deaktiviert",
|
||||||
"account.notify.totp.enable": "TOTP erfolgreich aktiviert",
|
"account.notify.totp.enable": "TOTP erfolgreich aktiviert",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Verwaltung",
|
"admin.title": "Verwaltung",
|
||||||
"admin.button.users": "Benutzerverwaltung",
|
"admin.button.users": "Benutzerverwaltung",
|
||||||
|
"admin.button.shares": "Freigabenverwaltung",
|
||||||
"admin.button.config": "Konfiguration",
|
"admin.button.config": "Konfiguration",
|
||||||
"admin.version": "Version",
|
"admin.version": "Version",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Administratorrechte",
|
"admin.users.modal.create.admin": "Administratorrechte",
|
||||||
"admin.users.modal.create.admin.description": "Wenn aktiviert, kann der Benutzer auf das Administrator-Panel zugreifen.",
|
"admin.users.modal.create.admin.description": "Wenn aktiviert, kann der Benutzer auf das Administrator-Panel zugreifen.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Freigabenverwaltung",
|
||||||
|
"admin.shares.table.id": "ID teilen",
|
||||||
|
"admin.shares.table.username": "Ersteller",
|
||||||
|
"admin.shares.table.visitors": "Besucher",
|
||||||
|
"admin.shares.table.expires": "Läuft ab am",
|
||||||
|
"admin.shares.edit.delete.title": "Lösche Freigabe {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Möchtest du wirklich diese Freigabe löschen?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Upload",
|
"upload.title": "Upload",
|
||||||
"upload.notify.generic-error": "Während der Erstellung der Freigabe ist ein Fehler aufgetreten.",
|
"upload.notify.generic-error": "Während der Erstellung der Freigabe ist ein Fehler aufgetreten.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Monate",
|
"upload.modal.expires.month-plural": "Monate",
|
||||||
"upload.modal.expires.year-singular": "Jahr",
|
"upload.modal.expires.year-singular": "Jahr",
|
||||||
"upload.modal.expires.year-plural": "Year",
|
"upload.modal.expires.year-plural": "Year",
|
||||||
"upload.modal.accordion.description.title": "Beschreibung",
|
"upload.modal.accordion.name-and-description.title": "Name und Beschreibung",
|
||||||
"upload.modal.accordion.description.placeholder": "Hinweis für die Empfänger dieser Freigabe",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Hinweis für die Empfänger dieser Freigabe",
|
||||||
"upload.modal.accordion.email.title": "Email Empfänger",
|
"upload.modal.accordion.email.title": "Email Empfänger",
|
||||||
"upload.modal.accordion.email.placeholder": "Email der Empfänger eingeben",
|
"upload.modal.accordion.email.placeholder": "Email der Empfänger eingeben",
|
||||||
"upload.modal.accordion.email.invalid-email": "Ungültige Emailadresse",
|
"upload.modal.accordion.email.invalid-email": "Ungültige Emailadresse",
|
||||||
@@ -262,7 +274,7 @@ 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": "A preview for this file type is unsupported. Please download the file to view it.",
|
"share.modal.file-preview.error.not-supported.description": "Eine Vorschau für diesen Dateityp wird nicht unterstützt. Bitte lade die Datei herunter, um sie anzusehen.",
|
||||||
// END /share/[id]
|
// END /share/[id]
|
||||||
// /share/[id]/edit
|
// /share/[id]/edit
|
||||||
"share.edit.title": "{shareId} bearbeiten",
|
"share.edit.title": "{shareId} bearbeiten",
|
||||||
@@ -283,11 +295,13 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Auf welcher URL Pingvin Share verfügbar ist",
|
"admin.config.general.app-url.description": "Auf welcher URL Pingvin Share verfügbar ist",
|
||||||
"admin.config.general.show-home-page": "Startseite anzeigen",
|
"admin.config.general.show-home-page": "Startseite anzeigen",
|
||||||
"admin.config.general.show-home-page.description": "Ob die Startseite angezeigt werden soll",
|
"admin.config.general.show-home-page.description": "Ob die Startseite angezeigt werden soll",
|
||||||
|
"admin.config.general.session-duration": "Session-Dauer",
|
||||||
|
"admin.config.general.session-duration.description": "Zeit in Stunden, nach der ein Benutzer sich erneut anmelden muss (Voreinstellung: 3 Monate).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Ändere dein Logo durch Hochladen eines Bildes. Das Bild muss im PNG-Format vorliegen und sollte mit Seitenverhältnis 1:1 sein.",
|
"admin.config.general.logo.description": "Ändere dein Logo durch Hochladen eines Bildes. Das Bild muss im PNG-Format vorliegen und sollte mit Seitenverhältnis 1:1 sein.",
|
||||||
"admin.config.general.logo.placeholder": "Bild auswählen",
|
"admin.config.general.logo.placeholder": "Bild auswählen",
|
||||||
"admin.config.email.enable-share-email-recipients": "Erlaube das Teilen der Freigabe via Email",
|
"admin.config.email.enable-share-email-recipients": "Erlaube das Teilen der Freigabe via Email",
|
||||||
"admin.config.email.enable-share-email-recipients.description": "Gibt an, ob Emails an Freigabe-Empfänger ermöglicht werden sollen. Aktiviere dies nur, wenn Du SMTP aktivierst hast.",
|
"admin.config.email.enable-share-email-recipients.description": "Gibt an, ob Emails an Freigabe-Empfänger ermöglicht werden sollen. Aktiviere dies nur, wenn du SMTP aktivierst hast.",
|
||||||
"admin.config.email.share-recipients-subject": "Betreff für Freigabe-Empfänger",
|
"admin.config.email.share-recipients-subject": "Betreff für Freigabe-Empfänger",
|
||||||
"admin.config.email.share-recipients-subject.description": "Betreff der E-Mail, die an die Freigabe-Empfänger gesendet wird.",
|
"admin.config.email.share-recipients-subject.description": "Betreff der E-Mail, die an die Freigabe-Empfänger gesendet wird.",
|
||||||
"admin.config.email.share-recipients-message": "Nachricht für Freigabe-Empfänger",
|
"admin.config.email.share-recipients-message": "Nachricht für Freigabe-Empfänger",
|
||||||
@@ -314,8 +328,12 @@ export default {
|
|||||||
"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",
|
||||||
"admin.config.share.zip-compression-level.description": "Passe den Wert an, um ein Gleichgewicht zwischen Dateigröße und Komprimierungsgeschwindigkeit herzustellen. Gültige Werte liegen zwischen 0 und 9, wobei 0 für keine Komprimierung und 9 für maximale Komprimierung steht.",
|
"admin.config.share.zip-compression-level.description": "Passe den Wert an, um ein Gleichgewicht zwischen Dateigröße und Komprimierungsgeschwindigkeit herzustellen. Gültige Werte liegen zwischen 0 und 9, wobei 0 für keine Komprimierung und 9 für maximale Komprimierung steht.",
|
||||||
|
"admin.config.share.chunk-size": "Chunkgröße",
|
||||||
|
"admin.config.share.chunk-size.description": "Passe die Chunkgröße (in Bytes) für deine Uploads an, um die Zuverlässigkeit deiner Internetverbindung auszugleichen. Kleinere Chunks können die Erfolgsraten für instabile Verbindungen verbessern, während größere Chunks Uploads für stabile Verbindungen beschleunigen können.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Aktiviert",
|
"admin.config.smtp.enabled": "Aktiviert",
|
||||||
"admin.config.smtp.enabled.description": "Gibt an, ob SMTP aktiviert ist. Aktiviere dies nur, wenn Du den Host, den Port, die Email, den Benutzernamen und das Passwort deines SMTP-Servers eingegeben hast.",
|
"admin.config.smtp.enabled.description": "Gibt an, ob SMTP aktiviert ist. Aktiviere dies nur, wenn du den Host, den Port, die Email, den Benutzernamen und das Passwort deines SMTP-Servers eingegeben hast.",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.smtp.host": "Host",
|
||||||
"admin.config.smtp.host.description": "Host des SMTP-Servers",
|
"admin.config.smtp.host.description": "Host des SMTP-Servers",
|
||||||
"admin.config.smtp.port": "Port",
|
"admin.config.smtp.port": "Port",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "Vertrauen von nicht authentifizierten SMTP-Server-Zertifikaten",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Verwenden Sie diese Option nur, wenn Sie selbst signierten Zertifikaten vertrauen müssen.",
|
||||||
"admin.config.oauth.allow-registration": "Registrierung erlauben",
|
"admin.config.oauth.allow-registration": "Registrierung erlauben",
|
||||||
"admin.config.oauth.allow-registration.description": "Benutzern erlauben, sich über Soziale Netzwerke zu registrieren",
|
"admin.config.oauth.allow-registration.description": "Benutzern erlauben, sich über Soziale Netzwerke zu registrieren",
|
||||||
"admin.config.oauth.ignore-totp": "TOTP ignorieren",
|
"admin.config.oauth.ignore-totp": "TOTP ignorieren",
|
||||||
"admin.config.oauth.ignore-totp.description": "Gibt an, ob TOTP ignoriert werden soll, wenn sich der Benutzer über Soziale Netzwerke anmeldet",
|
"admin.config.oauth.ignore-totp.description": "Gibt an, ob TOTP ignoriert werden soll, wenn sich der Benutzer über Soziale Netzwerke anmeldet",
|
||||||
|
"admin.config.oauth.disable-password": "Anmelden mit Passwort deaktivieren",
|
||||||
|
"admin.config.oauth.disable-password.description": "Deaktiviert das Anmelden mit Passwort\nStelle vor Aktivierung dieser Konfiguration sicher, dass ein OAuth-Provider korrekt konfiguriert ist, um nicht ausgesperrt zu werden.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "GitHub Anmeldung erlaubt",
|
"admin.config.oauth.github-enabled.description": "GitHub Anmeldung erlaubt",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client-ID",
|
"admin.config.oauth.github-client-id": "GitHub Client-ID",
|
||||||
@@ -353,18 +375,24 @@ export default {
|
|||||||
"admin.config.oauth.microsoft-client-secret.description": "Client-Secret der Microsoft OAuth-App",
|
"admin.config.oauth.microsoft-client-secret.description": "Client-Secret der Microsoft OAuth-App",
|
||||||
"admin.config.oauth.discord-enabled": "Discord",
|
"admin.config.oauth.discord-enabled": "Discord",
|
||||||
"admin.config.oauth.discord-enabled.description": "Discord Anmeldung erlaubt",
|
"admin.config.oauth.discord-enabled.description": "Discord Anmeldung erlaubt",
|
||||||
"admin.config.oauth.discord-limited-guild": "Discord limited server ID",
|
"admin.config.oauth.discord-limited-guild": "Discord Server-ID",
|
||||||
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
|
"admin.config.oauth.discord-limited-guild.description": "Die Anmeldung auf Benutzer in einem bestimmten Server beschränken. Leer lassen, um zu deaktivieren.",
|
||||||
"admin.config.oauth.discord-client-id": "Discord Client-ID",
|
"admin.config.oauth.discord-client-id": "Discord Client-ID",
|
||||||
"admin.config.oauth.discord-client-id.description": "Client-ID der Discord OAuth-App",
|
"admin.config.oauth.discord-client-id.description": "Client-ID der Discord OAuth-App",
|
||||||
"admin.config.oauth.discord-client-secret": "Discord Client-Secret",
|
"admin.config.oauth.discord-client-secret": "Discord Client-Secret",
|
||||||
"admin.config.oauth.discord-client-secret.description": "Client-Secret der Discord OAuth-App",
|
"admin.config.oauth.discord-client-secret.description": "Client-Secret der Discord OAuth-App",
|
||||||
"admin.config.oauth.oidc-enabled": "OpenID Connect",
|
"admin.config.oauth.oidc-enabled": "OpenID Connect",
|
||||||
"admin.config.oauth.oidc-enabled.description": "OpenID Connect Anmeldung erlaubt",
|
"admin.config.oauth.oidc-enabled.description": "OpenID Connect Anmeldung erlaubt",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Verbindung Discovery URL",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery-URL der OpenID OAuth App",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect Benutzername anfordern",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Benutzername im OpenID Token. Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Muss ein valider JMES-Pfad sein, der zu einem Array an Rollen führt. " + "Die Zugangsverwaltung über Rollen in OpenID Connect ist nur empfohlen, wenn kein anderer Identitätsprovider konfiguriert und die Anmeldung per Password deaktiviert ist. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Rolle für generellen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser sich anmelden kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Rolle für administrativen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser auf das Administrator-Panel zugreifen kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client-ID",
|
"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-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": "OpenID Connect Client-Secret",
|
||||||
@@ -384,8 +412,8 @@ export default {
|
|||||||
"error.msg.no_email": "Kann die E-Mail-Adresse von dem Konto {0} nicht abrufen.",
|
"error.msg.no_email": "Kann die E-Mail-Adresse von dem Konto {0} nicht abrufen.",
|
||||||
"error.msg.already_linked": "Das Konto {0} ist bereits mit einem anderen Konto verknüpft.",
|
"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.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.unverified_account": "Dieses Konto {0} wurde noch nicht verifiziert, bitte versuche es nach der Verifikation erneut.",
|
||||||
"error.msg.discord_guild_permission_denied": "Du bist nicht berechtigt, Dich anzumelden.",
|
"error.msg.user_not_allowed": "Du bist nicht berechtigt, dich anzumelden.",
|
||||||
"error.msg.cannot_get_user_info": "Deine Benutzerinformationen können nicht von diesem Konto {0} abgerufen werden.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
@@ -407,7 +435,7 @@ export default {
|
|||||||
"common.text.navigate-to-link": "Link öffnen",
|
"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.button.go-home": "Go home",
|
"common.button.go-home": "Zur Startseite",
|
||||||
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",
|
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",
|
||||||
"common.success": "Erfolg",
|
"common.success": "Erfolg",
|
||||||
"common.error": "Fehler",
|
"common.error": "Fehler",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Απαιτείται έλεγχος ταυτότητας δύο παραγόντων.",
|
"signIn.notify.totp-required.title": "Απαιτείται έλεγχος ταυτότητας δύο παραγόντων.",
|
||||||
"signIn.notify.totp-required.description": "Παρακαλώ εισάγετε τον κωδικό 2FA.",
|
"signIn.notify.totp-required.description": "Παρακαλώ εισάγετε τον κωδικό 2FA.",
|
||||||
"signIn.oauth.or": "Ή",
|
"signIn.oauth.or": "Ή",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Βήμα 2: Επικυρώστε τον κωδικό σας",
|
"account.modal.totp.step2": "Βήμα 2: Επικυρώστε τον κωδικό σας",
|
||||||
"account.modal.totp.enterManually": "Χειροκίνητη εισαγωγή",
|
"account.modal.totp.enterManually": "Χειροκίνητη εισαγωγή",
|
||||||
"account.modal.totp.code": "Κώδικας",
|
"account.modal.totp.code": "Κώδικας",
|
||||||
"account.modal.totp.clickToCopy": "Κάνε κλικ για αντιγραφή",
|
"common.button.clickToCopy": "Κάνε κλικ για αντιγραφή",
|
||||||
"account.modal.totp.verify": "Επαλήθευση",
|
"account.modal.totp.verify": "Επαλήθευση",
|
||||||
"account.notify.totp.disable": "Το TOTP απενεργοποιήθηκε επιτυχώς",
|
"account.notify.totp.disable": "Το TOTP απενεργοποιήθηκε επιτυχώς",
|
||||||
"account.notify.totp.enable": "Το TOTP ενεργοποιήθηκε επιτυχώς",
|
"account.notify.totp.enable": "Το TOTP ενεργοποιήθηκε επιτυχώς",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Διαχείριση",
|
"admin.title": "Διαχείριση",
|
||||||
"admin.button.users": "Διαχείριση χρηστών",
|
"admin.button.users": "Διαχείριση χρηστών",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Διαμόρφωση",
|
"admin.button.config": "Διαμόρφωση",
|
||||||
"admin.version": "Έκδοση",
|
"admin.version": "Έκδοση",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Δικαιώματα διαχειριστή",
|
"admin.users.modal.create.admin": "Δικαιώματα διαχειριστή",
|
||||||
"admin.users.modal.create.admin.description": "Αν ενεργοποιηθεί, ο χρήστης θα μπορεί να έχει πρόσβαση στον πίνακα διαχείρισης.",
|
"admin.users.modal.create.admin.description": "Αν ενεργοποιηθεί, ο χρήστης θα μπορεί να έχει πρόσβαση στον πίνακα διαχείρισης.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Μεταφόρτωση",
|
"upload.title": "Μεταφόρτωση",
|
||||||
"upload.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση της κοινής χρήσης σας.",
|
"upload.notify.generic-error": "Παρουσιάστηκε σφάλμα κατά την ολοκλήρωση της κοινής χρήσης σας.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Μήνες",
|
"upload.modal.expires.month-plural": "Μήνες",
|
||||||
"upload.modal.expires.year-singular": "Έτος",
|
"upload.modal.expires.year-singular": "Έτος",
|
||||||
"upload.modal.expires.year-plural": "Έτη",
|
"upload.modal.expires.year-plural": "Έτη",
|
||||||
"upload.modal.accordion.description.title": "Περιγραφή",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "Σημείωση για τους παραλήπτες αυτής της κοινοποίησης",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "Αποδέκτες email",
|
"upload.modal.accordion.email.title": "Αποδέκτες email",
|
||||||
"upload.modal.accordion.email.placeholder": "Εισάγετε αποδέκτες email",
|
"upload.modal.accordion.email.placeholder": "Εισάγετε αποδέκτες email",
|
||||||
"upload.modal.accordion.email.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
|
"upload.modal.accordion.email.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
|
||||||
@@ -262,7 +274,7 @@ export default {
|
|||||||
"share.table.name": "Όνομα",
|
"share.table.name": "Όνομα",
|
||||||
"share.table.size": "Μέγεθος",
|
"share.table.size": "Μέγεθος",
|
||||||
"share.modal.file-preview.error.not-supported.title": "Η προεπισκόπηση δεν υποστηρίζεται",
|
"share.modal.file-preview.error.not-supported.title": "Η προεπισκόπηση δεν υποστηρίζεται",
|
||||||
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
|
"share.modal.file-preview.error.not-supported.description": "Η προεπισκόπηση για αυτό τον τύπο αρχείου δεν υποστηρίζεται. Παρακαλώ κατεβάστε το αρχείο για να το δείτε.",
|
||||||
// END /share/[id]
|
// END /share/[id]
|
||||||
// /share/[id]/edit
|
// /share/[id]/edit
|
||||||
"share.edit.title": "Ενημέρωση {shareId}",
|
"share.edit.title": "Ενημέρωση {shareId}",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Η διεύθυνση URL όπου το Pingvin Share είναι διαθέσιμο",
|
"admin.config.general.app-url.description": "Η διεύθυνση URL όπου το Pingvin Share είναι διαθέσιμο",
|
||||||
"admin.config.general.show-home-page": "Εμφάνιση αρχικής σελίδας",
|
"admin.config.general.show-home-page": "Εμφάνιση αρχικής σελίδας",
|
||||||
"admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα",
|
"admin.config.general.show-home-page.description": "Εάν θα εμφανίζεται η αρχική σελίδα",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Λογότυπο",
|
"admin.config.general.logo": "Λογότυπο",
|
||||||
"admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.",
|
"admin.config.general.logo.description": "Αλλάξτε το λογότυπό σας ανεβάζοντας μια νέα εικόνα. Η εικόνα πρέπει να είναι PNG και αναλογία 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Επιλέξτε εικόνα",
|
"admin.config.general.logo.placeholder": "Επιλέξτε εικόνα",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "Μέγιστο μέγεθος κοινοποίησης σε bytes",
|
"admin.config.share.max-size.description": "Μέγιστο μέγεθος κοινοποίησης σε bytes",
|
||||||
"admin.config.share.zip-compression-level": "Βαθμός συμπίεσης ZIP",
|
"admin.config.share.zip-compression-level": "Βαθμός συμπίεσης ZIP",
|
||||||
"admin.config.share.zip-compression-level.description": "Προσαρμόστε το βαθμό συμπίεσης για να εξισορροπηθεί το μέγεθος του αρχείου και η ταχύτητα επεξεργασίας. Έγκυρες τιμές κυμαίνονται από 0 έως 9, με 0 χωρίς συμπίεση και 9 μέγιστη συμπίεση.",
|
"admin.config.share.zip-compression-level.description": "Προσαρμόστε το βαθμό συμπίεσης για να εξισορροπηθεί το μέγεθος του αρχείου και η ταχύτητα επεξεργασίας. Έγκυρες τιμές κυμαίνονται από 0 έως 9, με 0 χωρίς συμπίεση και 9 μέγιστη συμπίεση.",
|
||||||
|
"admin.config.share.chunk-size": "Μέγεθος κομματιών",
|
||||||
|
"admin.config.share.chunk-size.description": "Προσαρμόστε το μέγεθος κομματιών (σε bytes) για να εξισορροπήσετε την αποδοτικότητα και την αξιοπιστία του συστήματος σύμφωνα με τη σύνδεσή σας στο διαδίκτυο. Μικρότερα κομμάτια μπορούν να βελτιώσουν τα ποσοστά επιτυχίας σε ασταθείς συνδέσεις, ενώ μεγαλύτερα κομμάτια επιταχύνουν τις μεταφορτώσεις σε σταθερές συνδέσεις.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Ενεργοποιημένο",
|
"admin.config.smtp.enabled": "Ενεργοποιημένο",
|
||||||
"admin.config.smtp.enabled.description": "Εάν η λειτουργία SMTP είναι ενεργοποιημένη. Ενεργοποιήστε τη μόνον όταν ορίσετε σωστά τις παραμέτρους που ακολουθούν.",
|
"admin.config.smtp.enabled.description": "Εάν η λειτουργία SMTP είναι ενεργοποιημένη. Ενεργοποιήστε τη μόνον όταν ορίσετε σωστά τις παραμέτρους που ακολουθούν.",
|
||||||
"admin.config.smtp.host": "Εξυπηρετητής",
|
"admin.config.smtp.host": "Εξυπηρετητής",
|
||||||
@@ -327,10 +345,14 @@ 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": "Αποστολή δοκιμαστικού email",
|
"admin.config.smtp.button.test": "Αποστολή δοκιμαστικού email",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Να επιτρέπεται η εγγραφή",
|
"admin.config.oauth.allow-registration": "Να επιτρέπεται η εγγραφή",
|
||||||
"admin.config.oauth.allow-registration.description": "Επιτρέψτε στους χρήστες να εγγραφούν μέσω λογαριασμών κοινωνικής δικτύωσης",
|
"admin.config.oauth.allow-registration.description": "Επιτρέψτε στους χρήστες να εγγραφούν μέσω λογαριασμών κοινωνικής δικτύωσης",
|
||||||
"admin.config.oauth.ignore-totp": "Παράβλεψη TOTP",
|
"admin.config.oauth.ignore-totp": "Παράβλεψη TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Αν θα αγνοηθεί το TOTP όταν ο χρήστης χρησιμοποιεί την κοινωνική σύνδεση",
|
"admin.config.oauth.ignore-totp.description": "Αν θα αγνοηθεί το TOTP όταν ο χρήστης χρησιμοποιεί την κοινωνική σύνδεση",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Αν είναι ενεργοποιημένη η σύνδεση GitHub",
|
"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",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Αφήστε κενό αν δε γνωρίζετε για αυτή τη ρύθμιση",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Αφήστε κενό αν δε γνωρίζετε για αυτή τη ρύθμιση",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect 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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Αυτός ο λογαριασμός {0} είναι ήδη συνδεδεμένος με άλλο λογαριασμό.",
|
"error.msg.already_linked": "Αυτός ο λογαριασμός {0} είναι ήδη συνδεδεμένος με άλλο λογαριασμό.",
|
||||||
"error.msg.not_linked": "Αυτός ο λογαριασμός {0} δεν έχει συνδεθεί με κανένα λογαριασμό ακόμα.",
|
"error.msg.not_linked": "Αυτός ο λογαριασμός {0} δεν έχει συνδεθεί με κανένα λογαριασμό ακόμα.",
|
||||||
"error.msg.unverified_account": "Αυτός ο λογαριασμός {0} δεν έχει επαληθευτεί, παρακαλώ προσπαθήστε ξανά μετά την επαλήθευση.",
|
"error.msg.unverified_account": "Αυτός ο λογαριασμός {0} δεν έχει επαληθευτεί, παρακαλώ προσπαθήστε ξανά μετά την επαλήθευση.",
|
||||||
"error.msg.discord_guild_permission_denied": "Δεν σας επιτρέπεται η σύνδεση.",
|
"error.msg.user_not_allowed": "Δεν σας επιτρέπεται η σύνδεση.",
|
||||||
"error.msg.cannot_get_user_info": "Δεν είναι δυνατή η λήψη των πληροφοριών χρήστη από αυτόν τον λογαριασμό {0}.",
|
"error.msg.cannot_get_user_info": "Δεν είναι δυνατή η λήψη των πληροφοριών χρήστη από αυτόν τον λογαριασμό {0}.",
|
||||||
"error.param.provider_github": "GitHub",
|
"error.param.provider_github": "GitHub",
|
||||||
"error.param.provider_google": "Google",
|
"error.param.provider_google": "Google",
|
||||||
@@ -407,7 +435,7 @@ export default {
|
|||||||
"common.text.navigate-to-link": "Μεταβείτε στο σύνδεσμο",
|
"common.text.navigate-to-link": "Μεταβείτε στο σύνδεσμο",
|
||||||
"common.text.or": "ή",
|
"common.text.or": "ή",
|
||||||
"common.button.go-back": "Επιστροφή",
|
"common.button.go-back": "Επιστροφή",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Μετάβαση στην αρχική",
|
||||||
"common.notify.copied": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
|
"common.notify.copied": "Ο σύνδεσμος σας αντιγράφηκε στο πρόχειρο",
|
||||||
"common.success": "Επιτυχία",
|
"common.success": "Επιτυχία",
|
||||||
"common.error": "Σφάλμα",
|
"common.error": "Σφάλμα",
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.description":
|
"signIn.notify.totp-required.description":
|
||||||
"Please enter your two-factor authentication code",
|
"Please enter your two-factor authentication code",
|
||||||
"signIn.oauth.or": "OR",
|
"signIn.oauth.or": "OR",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -122,7 +123,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Step 2: Validate your code",
|
"account.modal.totp.step2": "Step 2: Validate your code",
|
||||||
"account.modal.totp.enterManually": "Enter manually",
|
"account.modal.totp.enterManually": "Enter manually",
|
||||||
"account.modal.totp.code": "Code",
|
"account.modal.totp.code": "Code",
|
||||||
"account.modal.totp.clickToCopy": "Click to copy",
|
"common.button.clickToCopy": "Click to copy",
|
||||||
"account.modal.totp.verify": "Verify",
|
"account.modal.totp.verify": "Verify",
|
||||||
"account.notify.totp.disable": "TOTP disabled successfully",
|
"account.notify.totp.disable": "TOTP disabled successfully",
|
||||||
"account.notify.totp.enable": "TOTP enabled successfully",
|
"account.notify.totp.enable": "TOTP enabled successfully",
|
||||||
@@ -198,6 +199,14 @@ export default {
|
|||||||
"account.reverseShares.modal.send-email.description":
|
"account.reverseShares.modal.send-email.description":
|
||||||
"Send an email notification when a share is created with this reverse share link.",
|
"Send an email notification when a share is created with this reverse share link.",
|
||||||
|
|
||||||
|
"account.reverseShares.modal.simplified": "Simple mode",
|
||||||
|
"account.reverseShares.modal.simplified.description":
|
||||||
|
"Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.",
|
||||||
|
|
||||||
|
"account.reverseShares.modal.public-access": "Public access",
|
||||||
|
"account.reverseShares.modal.public-access.description":
|
||||||
|
"Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.",
|
||||||
|
|
||||||
"account.reverseShares.modal.max-use.label": "Max uses",
|
"account.reverseShares.modal.max-use.label": "Max uses",
|
||||||
"account.reverseShares.modal.max-use.description":
|
"account.reverseShares.modal.max-use.description":
|
||||||
"The maximum amount of times this URL can be used to create a share.",
|
"The maximum amount of times this URL can be used to create a share.",
|
||||||
@@ -224,6 +233,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administration",
|
"admin.title": "Administration",
|
||||||
"admin.button.users": "User management",
|
"admin.button.users": "User management",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Configuration",
|
"admin.button.config": "Configuration",
|
||||||
"admin.version": "Version",
|
"admin.version": "Version",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -260,6 +270,19 @@ export default {
|
|||||||
|
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description":
|
||||||
|
"Do you really want to delete this share?",
|
||||||
|
|
||||||
|
// END /admin/shares
|
||||||
|
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Upload",
|
"upload.title": "Upload",
|
||||||
|
|
||||||
@@ -307,8 +330,9 @@ export default {
|
|||||||
"upload.modal.expires.year-singular": "Year",
|
"upload.modal.expires.year-singular": "Year",
|
||||||
"upload.modal.expires.year-plural": "Years",
|
"upload.modal.expires.year-plural": "Years",
|
||||||
|
|
||||||
"upload.modal.accordion.description.title": "Description",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder":
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder":
|
||||||
"Note for the recipients of this share",
|
"Note for the recipients of this share",
|
||||||
|
|
||||||
"upload.modal.accordion.email.title": "Email recipients",
|
"upload.modal.accordion.email.title": "Email recipients",
|
||||||
@@ -326,6 +350,7 @@ export default {
|
|||||||
"upload.modal.completed.expires-on":
|
"upload.modal.completed.expires-on":
|
||||||
"This share will expire on {expiration}.",
|
"This share will expire on {expiration}.",
|
||||||
"upload.modal.completed.share-ready": "Share ready",
|
"upload.modal.completed.share-ready": "Share ready",
|
||||||
|
"upload.modal.completed.notified-reverse-share-creator": "We have notified the creator of the reverse share. You can also manually share this link with them through other means.",
|
||||||
|
|
||||||
// END /upload
|
// END /upload
|
||||||
|
|
||||||
@@ -339,6 +364,8 @@ export default {
|
|||||||
"share.error.not-found.title": "Share not found",
|
"share.error.not-found.title": "Share not found",
|
||||||
"share.error.not-found.description":
|
"share.error.not-found.description":
|
||||||
"The share you're looking for doesn't exist.",
|
"The share you're looking for doesn't exist.",
|
||||||
|
"share.error.access-denied.title": "Private share",
|
||||||
|
"share.error.access-denied.description": "The current account does not have permission to access this share",
|
||||||
|
|
||||||
"share.modal.password.title": "Password required",
|
"share.modal.password.title": "Password required",
|
||||||
"share.modal.password.description":
|
"share.modal.password.description":
|
||||||
@@ -384,6 +411,9 @@ export default {
|
|||||||
"admin.config.general.show-home-page": "Show home page",
|
"admin.config.general.show-home-page": "Show home page",
|
||||||
"admin.config.general.show-home-page.description":
|
"admin.config.general.show-home-page.description":
|
||||||
"Whether to show the home page",
|
"Whether to show the home page",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description":
|
||||||
|
"Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description":
|
"admin.config.general.logo.description":
|
||||||
"Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.",
|
"Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.",
|
||||||
@@ -417,6 +447,7 @@ export default {
|
|||||||
"admin.config.email.invite-message": "Invite message",
|
"admin.config.email.invite-message": "Invite message",
|
||||||
"admin.config.email.invite-message.description":
|
"admin.config.email.invite-message.description":
|
||||||
"Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL and {password} with the password.",
|
"Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL and {password} with the password.",
|
||||||
|
|
||||||
"admin.config.share.allow-registration": "Allow registration",
|
"admin.config.share.allow-registration": "Allow registration",
|
||||||
"admin.config.share.allow-registration.description":
|
"admin.config.share.allow-registration.description":
|
||||||
"Whether registration is allowed",
|
"Whether registration is allowed",
|
||||||
@@ -433,8 +464,12 @@ export default {
|
|||||||
"admin.config.share.zip-compression-level.description":
|
"admin.config.share.zip-compression-level.description":
|
||||||
"Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression. ",
|
"Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression. ",
|
||||||
"admin.config.share.chunk-size": "Chunk size",
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
"admin.config.share.chunk-size.description":
|
||||||
|
"Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description":
|
||||||
|
"The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
|
|
||||||
"admin.config.smtp.enabled": "Enabled",
|
"admin.config.smtp.enabled": "Enabled",
|
||||||
"admin.config.smtp.enabled.description":
|
"admin.config.smtp.enabled.description":
|
||||||
"Whether SMTP is enabled. Only set this to true if you entered the host, port, email, user and password of your SMTP server.",
|
"Whether SMTP is enabled. Only set this to true if you entered the host, port, email, user and password of your SMTP server.",
|
||||||
@@ -450,6 +485,10 @@ export default {
|
|||||||
"admin.config.smtp.password": "Password",
|
"admin.config.smtp.password": "Password",
|
||||||
"admin.config.smtp.password.description": "Password of the SMTP server",
|
"admin.config.smtp.password.description": "Password of the SMTP server",
|
||||||
"admin.config.smtp.button.test": "Send test email",
|
"admin.config.smtp.button.test": "Send test email",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates":
|
||||||
|
"Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description":
|
||||||
|
"Only set this to true if you need to trust self signed certificates.",
|
||||||
|
|
||||||
"admin.config.oauth.allow-registration": "Allow registration",
|
"admin.config.oauth.allow-registration": "Allow registration",
|
||||||
"admin.config.oauth.allow-registration.description":
|
"admin.config.oauth.allow-registration.description":
|
||||||
@@ -457,6 +496,9 @@ export default {
|
|||||||
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description":
|
"admin.config.oauth.ignore-totp.description":
|
||||||
"Whether to ignore TOTP when user using social login",
|
"Whether to ignore TOTP when user using social login",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description":
|
||||||
|
"Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description":
|
"admin.config.oauth.github-enabled.description":
|
||||||
"Whether GitHub login is enabled",
|
"Whether GitHub login is enabled",
|
||||||
@@ -508,6 +550,19 @@ export default {
|
|||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description":
|
"admin.config.oauth.oidc-username-claim.description":
|
||||||
"Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description":
|
||||||
|
"Must be a valid JMES path referencing an array of roles. " +
|
||||||
|
"Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " +
|
||||||
|
"Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description":
|
||||||
|
"Role required for general access. Must be present in a user’s roles for them to log in. " +
|
||||||
|
"Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description":
|
||||||
|
"Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " +
|
||||||
|
"Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description":
|
"admin.config.oauth.oidc-client-id.description":
|
||||||
"Client ID of the OpenID Connect OAuth app",
|
"Client ID of the OpenID Connect OAuth app",
|
||||||
@@ -536,7 +591,7 @@ export default {
|
|||||||
"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":
|
"error.msg.unverified_account":
|
||||||
"This {0} account is unverified, please try again after verification.",
|
"This {0} account is unverified, please try again after verification.",
|
||||||
"error.msg.discord_guild_permission_denied":
|
"error.msg.user_not_allowed":
|
||||||
"You are not allowed to sign in.",
|
"You are not allowed to sign in.",
|
||||||
"error.msg.cannot_get_user_info":
|
"error.msg.cannot_get_user_info":
|
||||||
"Can not get your user info from this {0} account.",
|
"Can not get your user info from this {0} account.",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"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": "O",
|
"signIn.oauth.or": "O",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -57,7 +58,7 @@ export default {
|
|||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "¿Olvidaste tu contraseña?",
|
"resetPassword.title": "¿Olvidaste tu contraseña?",
|
||||||
"resetPassword.description": "Ingresa tu correo para restablecer tu contraseña.",
|
"resetPassword.description": "Ingresa tu correo para restablecer tu contraseña.",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "Se ha enviado un mensaje con un enlace para restablecer tu contraseña.",
|
||||||
"resetPassword.button.back": "Volver al inicio de sesión",
|
"resetPassword.button.back": "Volver al inicio de sesión",
|
||||||
"resetPassword.text.resetPassword": "Restablecer contraseña",
|
"resetPassword.text.resetPassword": "Restablecer contraseña",
|
||||||
"resetPassword.text.enterNewPassword": "Ingresa tu nueva contraseña",
|
"resetPassword.text.enterNewPassword": "Ingresa tu nueva contraseña",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Paso 2: Validar tu código",
|
"account.modal.totp.step2": "Paso 2: Validar tu código",
|
||||||
"account.modal.totp.enterManually": "Ingresar manualmente",
|
"account.modal.totp.enterManually": "Ingresar manualmente",
|
||||||
"account.modal.totp.code": "Código",
|
"account.modal.totp.code": "Código",
|
||||||
"account.modal.totp.clickToCopy": "Clic para copiar",
|
"common.button.clickToCopy": "Clic para copiar",
|
||||||
"account.modal.totp.verify": "Verificar",
|
"account.modal.totp.verify": "Verificar",
|
||||||
"account.notify.totp.disable": "TOTP deshabilitado correctamente",
|
"account.notify.totp.disable": "TOTP deshabilitado correctamente",
|
||||||
"account.notify.totp.enable": "TOTP habilitado correctamente",
|
"account.notify.totp.enable": "TOTP habilitado correctamente",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administración",
|
"admin.title": "Administración",
|
||||||
"admin.button.users": "Gestión de usuarios",
|
"admin.button.users": "Gestión de usuarios",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Configuración",
|
"admin.button.config": "Configuración",
|
||||||
"admin.version": "Versión",
|
"admin.version": "Versión",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Privilegios de administrador",
|
"admin.users.modal.create.admin": "Privilegios de administrador",
|
||||||
"admin.users.modal.create.admin.description": "Si se marca, el usuario podrá acceder al panel de administrador.",
|
"admin.users.modal.create.admin.description": "Si se marca, el usuario podrá acceder al panel de administrador.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Subir",
|
"upload.title": "Subir",
|
||||||
"upload.notify.generic-error": "Ha ocurrido un error mientras se compartía tu archivo.",
|
"upload.notify.generic-error": "Ha ocurrido un error mientras se compartía tu archivo.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Meses",
|
"upload.modal.expires.month-plural": "Meses",
|
||||||
"upload.modal.expires.year-singular": "Año",
|
"upload.modal.expires.year-singular": "Año",
|
||||||
"upload.modal.expires.year-plural": "Años",
|
"upload.modal.expires.year-plural": "Años",
|
||||||
"upload.modal.accordion.description.title": "Descripción",
|
"upload.modal.accordion.name-and-description.title": "Nombre y descripción",
|
||||||
"upload.modal.accordion.description.placeholder": "Nota para los destinatarios de este compartido",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Nombre",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Nota para los destinatarios de este compartido",
|
||||||
"upload.modal.accordion.email.title": "Correo de los destinatarios",
|
"upload.modal.accordion.email.title": "Correo de los destinatarios",
|
||||||
"upload.modal.accordion.email.placeholder": "Ingresa los correos de los destinatarios",
|
"upload.modal.accordion.email.placeholder": "Ingresa los correos de los destinatarios",
|
||||||
"upload.modal.accordion.email.invalid-email": "Dirección de correo inválida",
|
"upload.modal.accordion.email.invalid-email": "Dirección de correo inválida",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "En cuál URL está disponible Pingvin Share",
|
"admin.config.general.app-url.description": "En cuál URL está disponible Pingvin Share",
|
||||||
"admin.config.general.show-home-page": "Mostrar página de inicio",
|
"admin.config.general.show-home-page": "Mostrar página de inicio",
|
||||||
"admin.config.general.show-home-page.description": "Mostrar o no la página de inicio",
|
"admin.config.general.show-home-page.description": "Mostrar o no la página de inicio",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Cambia tu logo subiendo una nueva imagen. La imagen debe ser un PNG y debe estar en formato 1:1.",
|
"admin.config.general.logo.description": "Cambia tu logo subiendo una nueva imagen. La imagen debe ser un PNG y debe estar en formato 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Elegir imagen",
|
"admin.config.general.logo.placeholder": "Elegir imagen",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"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",
|
||||||
"admin.config.share.zip-compression-level.description": "Ajustar el nivel para equilibrar entre el tamaño del archivo y la velocidad de compresión. Los valores válidos van del 0 al 9, siendo 0 sin compresión y 9 el nivel máximo de compresión. ",
|
"admin.config.share.zip-compression-level.description": "Ajustar el nivel para equilibrar entre el tamaño del archivo y la velocidad de compresión. Los valores válidos van del 0 al 9, siendo 0 sin compresión y 9 el nivel máximo de compresión. ",
|
||||||
|
"admin.config.share.chunk-size": "Tamaño de los fragmentos",
|
||||||
|
"admin.config.share.chunk-size.description": "Ajusta el tamaño de los fragmentos (en bytes) para tus cargas para equilibrar la eficiencia y la fiabilidad según tu conexión a internet. Fragmentos más pequeños pueden mejorar las tasas de éxito para conexiones inestables, mientras que fragmentos más grandes aceleran las cargas para conexiones estables.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Habilitado",
|
"admin.config.smtp.enabled": "Habilitado",
|
||||||
"admin.config.smtp.enabled.description": "Si SMTP está habilitado. Active solo si ha introducido el host, el puerto, el correo, el usuario y la contraseña de su servidor SMTP.",
|
"admin.config.smtp.enabled.description": "Si SMTP está habilitado. Active solo si ha introducido el host, el puerto, el correo, el usuario y la contraseña de su servidor SMTP.",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.smtp.host": "Host",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Permitir registro",
|
"admin.config.oauth.allow-registration": "Permitir registro",
|
||||||
"admin.config.oauth.allow-registration.description": "Permitir a los usuarios registrarse mediante login social",
|
"admin.config.oauth.allow-registration.description": "Permitir a los usuarios registrarse mediante login social",
|
||||||
"admin.config.oauth.ignore-totp": "Ignorar TOTP",
|
"admin.config.oauth.ignore-totp": "Ignorar TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Ignorar TOTP cuando el usuario utiliza inicio de sesión social",
|
"admin.config.oauth.ignore-totp.description": "Ignorar TOTP cuando el usuario utiliza inicio de sesión social",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Si el inicio de sesión de GitHub está habilitado",
|
"admin.config.oauth.github-enabled.description": "Si el inicio de sesión de GitHub está habilitado",
|
||||||
"admin.config.oauth.github-client-id": "ID del Cliente de GitHub",
|
"admin.config.oauth.github-client-id": "ID del Cliente de GitHub",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect 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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Esta cuenta {0} ya está vinculada a otra cuenta.",
|
"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.not_linked": "Esta cuenta {0} aún no ha sido vinculada a ninguna cuenta.",
|
||||||
"error.msg.unverified_account": "Esta cuenta {0} no está verificada, por favor inténtalo de nuevo después de la verificación.",
|
"error.msg.unverified_account": "Esta cuenta {0} no está verificada, por favor inténtalo de nuevo después de la verificación.",
|
||||||
"error.msg.discord_guild_permission_denied": "No tienes permitido iniciar sesion.",
|
"error.msg.user_not_allowed": "No tienes permitido iniciar sesion.",
|
||||||
"error.msg.cannot_get_user_info": "No se puede obtener la información de usuario de la cuenta {0}.",
|
"error.msg.cannot_get_user_info": "No se puede obtener 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",
|
||||||
@@ -407,7 +435,7 @@ export default {
|
|||||||
"common.text.navigate-to-link": "Ir al 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.button.go-home": "Go home",
|
"common.button.go-home": "Página de inicio",
|
||||||
"common.notify.copied": "Tu enlace se ha copiado al portapapeles",
|
"common.notify.copied": "Tu enlace se ha copiado al portapapeles",
|
||||||
"common.success": "Éxito",
|
"common.success": "Éxito",
|
||||||
"common.error": "Error",
|
"common.error": "Error",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Kaksivaiheinen tunnistautuminen vaadittu",
|
"signIn.notify.totp-required.title": "Kaksivaiheinen tunnistautuminen vaadittu",
|
||||||
"signIn.notify.totp-required.description": "Syötä kaksivaiheisen tunnistautumisen koodi tähän",
|
"signIn.notify.totp-required.description": "Syötä kaksivaiheisen tunnistautumisen koodi tähän",
|
||||||
"signIn.oauth.or": "OR",
|
"signIn.oauth.or": "OR",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Vaihe 2: Vahvista koodisi",
|
"account.modal.totp.step2": "Vaihe 2: Vahvista koodisi",
|
||||||
"account.modal.totp.enterManually": "Syötä manuaalisesti",
|
"account.modal.totp.enterManually": "Syötä manuaalisesti",
|
||||||
"account.modal.totp.code": "Koodi",
|
"account.modal.totp.code": "Koodi",
|
||||||
"account.modal.totp.clickToCopy": "Klikkaa kopioidaksesi",
|
"common.button.clickToCopy": "Klikkaa kopioidaksesi",
|
||||||
"account.modal.totp.verify": "Vahvista",
|
"account.modal.totp.verify": "Vahvista",
|
||||||
"account.notify.totp.disable": "TOTP poistettu käytöstä",
|
"account.notify.totp.disable": "TOTP poistettu käytöstä",
|
||||||
"account.notify.totp.enable": "TOTP otettu käyttöön onnistuneesti",
|
"account.notify.totp.enable": "TOTP otettu käyttöön onnistuneesti",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Ylläpito",
|
"admin.title": "Ylläpito",
|
||||||
"admin.button.users": "Käyttäjien Hallinta",
|
"admin.button.users": "Käyttäjien Hallinta",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Asetukset",
|
"admin.button.config": "Asetukset",
|
||||||
"admin.version": "Versio",
|
"admin.version": "Versio",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Ylläpitäjän oikeudet",
|
"admin.users.modal.create.admin": "Ylläpitäjän oikeudet",
|
||||||
"admin.users.modal.create.admin.description": "Jos valittu, käyttäjä voi käyttää hallintapaneelia.",
|
"admin.users.modal.create.admin.description": "Jos valittu, käyttäjä voi käyttää hallintapaneelia.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Pilvetä",
|
"upload.title": "Pilvetä",
|
||||||
"upload.notify.generic-error": "Kohdattiin odottamaton virhe jaon luomisessa.",
|
"upload.notify.generic-error": "Kohdattiin odottamaton virhe jaon luomisessa.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Kuukautta",
|
"upload.modal.expires.month-plural": "Kuukautta",
|
||||||
"upload.modal.expires.year-singular": "Vuosi",
|
"upload.modal.expires.year-singular": "Vuosi",
|
||||||
"upload.modal.expires.year-plural": "Vuotta",
|
"upload.modal.expires.year-plural": "Vuotta",
|
||||||
"upload.modal.accordion.description.title": "Kuvaus",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "Huomautus tämän jaon vastaanottajille",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "Sähköpostin vastaanottajat",
|
"upload.modal.accordion.email.title": "Sähköpostin vastaanottajat",
|
||||||
"upload.modal.accordion.email.placeholder": "Syötä sähköpostin vastaanottajat",
|
"upload.modal.accordion.email.placeholder": "Syötä sähköpostin vastaanottajat",
|
||||||
"upload.modal.accordion.email.invalid-email": "Virheellinen sähköpostiosoite",
|
"upload.modal.accordion.email.invalid-email": "Virheellinen sähköpostiosoite",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Millä URL-osoitteella Pingvin Share on saatavilla",
|
"admin.config.general.app-url.description": "Millä URL-osoitteella Pingvin Share on saatavilla",
|
||||||
"admin.config.general.show-home-page": "Näytä kotisivu",
|
"admin.config.general.show-home-page": "Näytä kotisivu",
|
||||||
"admin.config.general.show-home-page.description": "Näytetäänkö kotisivu vai ei",
|
"admin.config.general.show-home-page.description": "Näytetäänkö kotisivu vai ei",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Muuta logoa lataamalla uusi kuva. Kuvan on oltava PNG ja sen on oltava formaatti 1:1.",
|
"admin.config.general.logo.description": "Muuta logoa lataamalla uusi kuva. Kuvan on oltava PNG ja sen on oltava formaatti 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Valitse kuva",
|
"admin.config.general.logo.placeholder": "Valitse kuva",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"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",
|
||||||
"admin.config.share.zip-compression-level.description": "Säädä tasoa tiedoston koon ja pakkausnopeuden välillä. Kelvolliset arvot vaihtelevat 0–9, 0 ei puristusta ja 9 on suurin puristusvoima. ",
|
"admin.config.share.zip-compression-level.description": "Säädä tasoa tiedoston koon ja pakkausnopeuden välillä. Kelvolliset arvot vaihtelevat 0–9, 0 ei puristusta ja 9 on suurin puristusvoima. ",
|
||||||
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Käytössä",
|
"admin.config.smtp.enabled": "Käytössä",
|
||||||
"admin.config.smtp.enabled.description": "Onko SMTP käytössä. Aseta tämä todeksi vain, jos olet syöttänyt SMTP-palvelimen isäntän, portin, sähköpostin, käyttäjän ja salasanan.",
|
"admin.config.smtp.enabled.description": "Onko SMTP käytössä. Aseta tämä todeksi vain, jos olet syöttänyt SMTP-palvelimen isäntän, portin, sähköpostin, käyttäjän ja salasanan.",
|
||||||
"admin.config.smtp.host": "Isäntä",
|
"admin.config.smtp.host": "Isäntä",
|
||||||
@@ -327,10 +345,14 @@ export default {
|
|||||||
"admin.config.smtp.password": "Salasana",
|
"admin.config.smtp.password": "Salasana",
|
||||||
"admin.config.smtp.password.description": "SMTP palvelimen salasana",
|
"admin.config.smtp.password.description": "SMTP palvelimen salasana",
|
||||||
"admin.config.smtp.button.test": "Lähetä testisähköposti",
|
"admin.config.smtp.button.test": "Lähetä testisähköposti",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Allow registration",
|
"admin.config.oauth.allow-registration": "Allow registration",
|
||||||
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
||||||
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
|
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect 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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"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.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.user_not_allowed": "You are not allowed to sign in.",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"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": "OU",
|
"signIn.oauth.or": "OU",
|
||||||
|
"signIn.oauth.signInWith": "Se connecter avec",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Étape 2 : Valider votre code",
|
"account.modal.totp.step2": "Étape 2 : Valider votre code",
|
||||||
"account.modal.totp.enterManually": "Saisir manuellement",
|
"account.modal.totp.enterManually": "Saisir manuellement",
|
||||||
"account.modal.totp.code": "Code",
|
"account.modal.totp.code": "Code",
|
||||||
"account.modal.totp.clickToCopy": "Cliquez pour copier",
|
"common.button.clickToCopy": "Cliquez pour copier",
|
||||||
"account.modal.totp.verify": "Vérifier",
|
"account.modal.totp.verify": "Vérifier",
|
||||||
"account.notify.totp.disable": "TOTP désactivé avec succès",
|
"account.notify.totp.disable": "TOTP désactivé avec succès",
|
||||||
"account.notify.totp.enable": "TOTP activé avec succès",
|
"account.notify.totp.enable": "TOTP activé avec succès",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administration",
|
"admin.title": "Administration",
|
||||||
"admin.button.users": "Gestion des utilisateurs",
|
"admin.button.users": "Gestion des utilisateurs",
|
||||||
|
"admin.button.shares": "Gestion des partages",
|
||||||
"admin.button.config": "Paramètres",
|
"admin.button.config": "Paramètres",
|
||||||
"admin.version": "Version",
|
"admin.version": "Version",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Privilèges d’admin",
|
"admin.users.modal.create.admin": "Privilèges d’admin",
|
||||||
"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é, l’utilisateur pourra accéder au panneau d'administration.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Gestion des partages",
|
||||||
|
"admin.shares.table.id": "ID de partage",
|
||||||
|
"admin.shares.table.username": "Créateur",
|
||||||
|
"admin.shares.table.visitors": "Visiteurs",
|
||||||
|
"admin.shares.table.expires": "Expire le",
|
||||||
|
"admin.shares.edit.delete.title": "Supprimer le partage {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Voulez-vous vraiment supprimer ce partage ?",
|
||||||
|
// END /admin/shares
|
||||||
// /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.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Mois",
|
"upload.modal.expires.month-plural": "Mois",
|
||||||
"upload.modal.expires.year-singular": "An",
|
"upload.modal.expires.year-singular": "An",
|
||||||
"upload.modal.expires.year-plural": "Ans",
|
"upload.modal.expires.year-plural": "Ans",
|
||||||
"upload.modal.accordion.description.title": "Description",
|
"upload.modal.accordion.name-and-description.title": "Nom et description",
|
||||||
"upload.modal.accordion.description.placeholder": "Note pour les destinataires de ce partage",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Nom",
|
||||||
|
"upload.modal.accordion.name-and-description.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": "Courriel invalide",
|
"upload.modal.accordion.email.invalid-email": "Courriel invalide",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"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 d’accueil",
|
||||||
"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 d’accueil",
|
||||||
|
"admin.config.general.session-duration": "Durée de la session",
|
||||||
|
"admin.config.general.session-duration.description": "Nombre d’heures après lesquelles un utilisateur doit se reconnecter (par défaut : 3 mois).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Changez de logo en envoyant une nouvelle image. 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. L’image 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",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"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.share.chunk-size": "Taille des tronçons",
|
||||||
|
"admin.config.share.chunk-size.description": "Ajustez la taille des tronçons (en octets) pour que vos téléchargements équilibrent efficacité et fiabilité en fonction de votre connexion Internet. Les petits tronçons peuvent améliorer les taux de succès sur les connexions instables, tandis que les tronçons plus importants accélèrent les téléchargements sur les connexions stables.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Ouvrir automatiquement la modale de partage",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "La modale de création de partage apparaît automatiquement lorsqu’un utilisateur sélectionne des fichiers, ce qui élimine le besoin de cliquer manuellement sur le bouton.",
|
||||||
"admin.config.smtp.enabled": "Activer",
|
"admin.config.smtp.enabled": "Activer",
|
||||||
"admin.config.smtp.enabled.description": "Active SMTP. Activez ceci uniquement si vous avez saisi l’hôte, le port, le courriel, l’utilisateur et son mot de passe, de votre serveur SMTP.",
|
"admin.config.smtp.enabled.description": "Active SMTP. Activez ceci uniquement si vous avez saisi l’hôte, le port, le courriel, l’utilisateur et son mot de passe, de votre serveur SMTP.",
|
||||||
"admin.config.smtp.host": "Hôte",
|
"admin.config.smtp.host": "Hôte",
|
||||||
@@ -327,10 +345,14 @@ export default {
|
|||||||
"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 courriel de test",
|
"admin.config.smtp.button.test": "Envoyer un courriel de test",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Faire confiance aux certificats de serveurs SMTP non autorisés",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Ne permettez ceci que si vous avez besoin de faire confiance aux certificats autosignés.",
|
||||||
"admin.config.oauth.allow-registration": "Autoriser l’inscription",
|
"admin.config.oauth.allow-registration": "Autoriser l’inscription",
|
||||||
"admin.config.oauth.allow-registration.description": "Permettre aux utilisateurs de s’inscrire via leur identifiant social",
|
"admin.config.oauth.allow-registration.description": "Permettre aux utilisateurs de s’inscrire via leur identifiant social",
|
||||||
"admin.config.oauth.ignore-totp": "Ignorer TOTP",
|
"admin.config.oauth.ignore-totp": "Ignorer TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Ignorer le TOTP lorsque l’utilisateur utilise un identifiant social.",
|
"admin.config.oauth.ignore-totp.description": "Ignorer le TOTP lorsque l’utilisateur utilise un identifiant social.",
|
||||||
|
"admin.config.oauth.disable-password": "Désactiver la connexion par mot de passe",
|
||||||
|
"admin.config.oauth.disable-password.description": "Désactive la connexion par mot de passe\nAssurez-vous qu’un fournisseur OAuth soit correctement configuré avant d’activer cette configuration pour éviter d'être enfermé.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Permettre la connexion via GitHub.",
|
"admin.config.oauth.github-enabled.description": "Permettre la connexion via GitHub.",
|
||||||
"admin.config.oauth.github-client-id": "ID client de GitHub",
|
"admin.config.oauth.github-client-id": "ID client de GitHub",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "L’URI de découverte de la connexion à l'application OpenID OAuth",
|
"admin.config.oauth.oidc-discovery-uri.description": "L’URI de découverte de la connexion à l'application OpenID OAuth",
|
||||||
"admin.config.oauth.oidc-username-claim": "Revendication du nom d’utilisateur OpenID",
|
"admin.config.oauth.oidc-username-claim": "Revendication du nom d’utilisateur OpenID",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Le champ contenant la revendication du nom d’utilisateur dans le jeton OpenID Connect. Laissez vide si vous ne savez pas quoi indiquer.",
|
"admin.config.oauth.oidc-username-claim.description": "Le champ contenant la revendication du nom d’utilisateur dans le jeton OpenID Connect. Laissez vide si vous ne savez pas quoi indiquer.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Chemin vers les rôles dans le jeton OpenID Connect",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Doit être un chemin JMES valide référençant un tableau de rôles. " + "La gestion des droits d'accès en utilisant les rôles OpenID Connect n'est recommandée que si aucun autre fournisseur d'identité n'est configuré et que la connexion par mot de passe est désactivée. " + "Laissez vide si vous ne savez pas ce qu'est cette configuration.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "Rôle OpenID Connect pour un accès général",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Rôle requis pour un accès général. Doit être présent dans les rôles d'un utilisateur pour qu'il se connecte. " + "Laissez vide si vous ne savez pas ce qu'est cette configuration.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "Rôle OpenID Connect pour l'accès admin",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Rôle requis pour l'accès administratif. Doit être présent dans les rôles d'un utilisateur pour accéder au panneau d'administration. " + "Laissez vide si vous ne savez pas ce qu'est cette configuration.",
|
||||||
"admin.config.oauth.oidc-client-id": "ID du client OpenID",
|
"admin.config.oauth.oidc-client-id": "ID du client OpenID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "L’ID du client de l’application OAuth OpenID Connect",
|
"admin.config.oauth.oidc-client-id.description": "L’ID du client de l’application OAuth OpenID Connect",
|
||||||
"admin.config.oauth.oidc-client-secret": "Secret du client OpenID",
|
"admin.config.oauth.oidc-client-secret": "Secret du client OpenID",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Le compte {0} est déjà associé à un autre compte.",
|
"error.msg.already_linked": "Le compte {0} est déjà associé à un autre compte.",
|
||||||
"error.msg.not_linked": "Le compte {0} n’est pas encore associé à compte.",
|
"error.msg.not_linked": "Le compte {0} n’est 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.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.user_not_allowed": "Vous n’êtes pas autorisé à vous authentifier.",
|
||||||
"error.msg.cannot_get_user_info": "Impossible d’obtenir vos informations utilisateur à partir du compte {0}.",
|
"error.msg.cannot_get_user_info": "Impossible d’obtenir 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",
|
||||||
|
|||||||
@@ -1,39 +1,40 @@
|
|||||||
export default {
|
export default {
|
||||||
// Navbar
|
// Navbar
|
||||||
"navbar.upload": "Upload",
|
"navbar.upload": "Feltöltés",
|
||||||
"navbar.signin": "Sign in",
|
"navbar.signin": "Bejelentkezés",
|
||||||
"navbar.home": "Home",
|
"navbar.home": "Home",
|
||||||
"navbar.signup": "Sign Up",
|
"navbar.signup": "Feliratkozás",
|
||||||
"navbar.links.shares": "My shares",
|
"navbar.links.shares": "Megosztásaim",
|
||||||
"navbar.links.reverse": "Reverse shares",
|
"navbar.links.reverse": "Fordított megosztások",
|
||||||
"navbar.avatar.account": "My account",
|
"navbar.avatar.account": "Fiókom",
|
||||||
"navbar.avatar.admin": "Administration",
|
"navbar.avatar.admin": "Admin ügyek",
|
||||||
"navbar.avatar.signout": "Sign out",
|
"navbar.avatar.signout": "Kijelentkezés",
|
||||||
// END navbar
|
// END navbar
|
||||||
// /
|
// /
|
||||||
"home.title": "A <h>self-hosted</h> file sharing platform.",
|
"home.title": "<h>Saját üzemeltetésű</h> fájl megosztó platform.",
|
||||||
"home.description": "Do you really want to give your personal files in the hand of third parties like WeTransfer?",
|
"home.description": "Valóban hozzáférhetővé akarja tenni fájljait a WeTransfer és más hasonló harmadik felek számára?",
|
||||||
"home.bullet.a.name": "Self-Hosted",
|
"home.bullet.a.name": "Saját üzemeltetés",
|
||||||
"home.bullet.a.description": "Host Pingvin Share on your own machine.",
|
"home.bullet.a.description": "A Pingvin Share megosztót saját gépéről futtathatja.",
|
||||||
"home.bullet.b.name": "Privacy",
|
"home.bullet.b.name": "Adatvédelem",
|
||||||
"home.bullet.b.description": "Your files are your files and should never get into the hands of third parties.",
|
"home.bullet.b.description": "A saját fájlok személyesek és semmi keresnivalójuk harmadik feleknél.",
|
||||||
"home.bullet.c.name": "No annoying file size limit",
|
"home.bullet.c.name": "Nincs bosszantó fájl méretkorlát",
|
||||||
"home.bullet.c.description": "Upload as big files as you want. Only your hard drive will be your limit.",
|
"home.bullet.c.description": "Akkora fájlokat oszt meg, amekkorákat csak akar. Határt csak a lemezterület szab.",
|
||||||
"home.button.start": "Get started",
|
"home.button.start": "Nosza, kezdjük",
|
||||||
"home.button.source": "Source code",
|
"home.button.source": "Forráskód",
|
||||||
// END /
|
// END /
|
||||||
// /auth/signin
|
// /auth/signin
|
||||||
"signin.title": "Welcome back",
|
"signin.title": "Üdv ismét itt",
|
||||||
"signin.description": "You don't have an account yet?",
|
"signin.description": "Nincsen még fiókja?",
|
||||||
"signin.button.signup": "Sign up",
|
"signin.button.signup": "Feliratkozás",
|
||||||
"signin.input.email-or-username": "Email or username",
|
"signin.input.email-or-username": "Email vagy felhasználónév",
|
||||||
"signin.input.email-or-username.placeholder": "Your email or username",
|
"signin.input.email-or-username.placeholder": "Az Ön emailcíme vagy felhasználóneve",
|
||||||
"signin.input.password": "Password",
|
"signin.input.password": "Jelszó",
|
||||||
"signin.input.password.placeholder": "Your password",
|
"signin.input.password.placeholder": "Az Ön jelszava",
|
||||||
"signin.button.submit": "Sign in",
|
"signin.button.submit": "Bejelentkezés",
|
||||||
"signIn.notify.totp-required.title": "Two-factor authentication required",
|
"signIn.notify.totp-required.title": "Kétfaktoros hitelesítésre van szükség",
|
||||||
"signIn.notify.totp-required.description": "Please enter your two-factor authentication code",
|
"signIn.notify.totp-required.description": "Adja meg a másik úton kapott kódját",
|
||||||
"signIn.oauth.or": "OR",
|
"signIn.oauth.or": "VAGY",
|
||||||
|
"signIn.oauth.signInWith": "Bejelentkezés a következővel",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -41,381 +42,408 @@ export default {
|
|||||||
"signIn.oauth.oidc": "OpenID",
|
"signIn.oauth.oidc": "OpenID",
|
||||||
// END /auth/signin
|
// END /auth/signin
|
||||||
// /auth/signup
|
// /auth/signup
|
||||||
"signup.title": "Create an account",
|
"signup.title": "Fiók létrehozása",
|
||||||
"signup.description": "Already have an account?",
|
"signup.description": "Már van fiókja?",
|
||||||
"signup.button.signin": "Sign in",
|
"signup.button.signin": "Bejelentkezés",
|
||||||
"signup.input.username": "Username",
|
"signup.input.username": "Felhasználónév",
|
||||||
"signup.input.username.placeholder": "Your username",
|
"signup.input.username.placeholder": "Az Ön felhasználói neve",
|
||||||
"signup.input.email": "Email",
|
"signup.input.email": "Email",
|
||||||
"signup.input.email.placeholder": "Your email",
|
"signup.input.email.placeholder": "Az Ön emailcíme",
|
||||||
"signup.button.submit": "Let's get started",
|
"signup.button.submit": "Kezdhetjük",
|
||||||
// END /auth/signup
|
// END /auth/signup
|
||||||
// /auth/totp
|
// /auth/totp
|
||||||
"totp.title": "TOTP Authentication",
|
"totp.title": "TOTP hitelesítés",
|
||||||
"totp.button.signIn": "Sign in",
|
"totp.button.signIn": "Bejelentkezés",
|
||||||
// END /auth/totp
|
// END /auth/totp
|
||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "Forgot your password?",
|
"resetPassword.title": "Elfelejtette jelszavát?",
|
||||||
"resetPassword.description": "Enter your email to reset your password.",
|
"resetPassword.description": "Adja meg emailcímét a jelszó alaphelyzetbe állításához.",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "A jelszó visszaállítására szolgáló linket tartalmazó üzenetet küldtünk, ha az e-mail létezik.",
|
||||||
"resetPassword.button.back": "Back to sign in page",
|
"resetPassword.button.back": "Vissza a bejelentkezési oldalra",
|
||||||
"resetPassword.text.resetPassword": "Reset password",
|
"resetPassword.text.resetPassword": "Jelszó alaphelyzetbe állítása",
|
||||||
"resetPassword.text.enterNewPassword": "Enter your new password",
|
"resetPassword.text.enterNewPassword": "Adja meg új jelszavát",
|
||||||
"resetPassword.input.password": "New password",
|
"resetPassword.input.password": "Új jelszó",
|
||||||
"resetPassword.notify.passwordReset": "Your password has been reset successfully.",
|
"resetPassword.notify.passwordReset": "Sikeresen megadta az új jelszót.",
|
||||||
// /account
|
// /account
|
||||||
"account.title": "My account",
|
"account.title": "Fiókom",
|
||||||
"account.card.info.title": "Account info",
|
"account.card.info.title": "Fiókinformáció",
|
||||||
"account.card.info.username": "Username",
|
"account.card.info.username": "Felhasználónév",
|
||||||
"account.card.info.email": "Email",
|
"account.card.info.email": "Email",
|
||||||
"account.notify.info.success": "Account updated successfully",
|
"account.notify.info.success": "A fiók sikeresen frissítésre került",
|
||||||
"account.card.password.title": "Password",
|
"account.card.password.title": "Jelszó",
|
||||||
"account.card.password.old": "Old password",
|
"account.card.password.old": "Régi jelszó",
|
||||||
"account.card.password.new": "New password",
|
"account.card.password.new": "Új jelszó",
|
||||||
"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": "Még nincs jelszava. Ha email és jelszó kombinációval kíván bejelentkezni, létre kell hoznia egy jelszót.",
|
||||||
"account.notify.password.success": "Password changed successfully",
|
"account.notify.password.success": "A jelszó sikeresen frissítésre került",
|
||||||
"account.card.oauth.title": "Social login",
|
"account.card.oauth.title": "Közösségi bejelentkezés",
|
||||||
"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": "Összekapcsolás",
|
||||||
"account.card.oauth.unlink": "Unlink",
|
"account.card.oauth.unlink": "Leválasztás",
|
||||||
"account.card.oauth.unlinked": "Unlinked",
|
"account.card.oauth.unlinked": "Leválasztva",
|
||||||
"account.modal.unlink.title": "Unlink account",
|
"account.modal.unlink.title": "Fiók leválasztása",
|
||||||
"account.modal.unlink.description": "Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.",
|
"account.modal.unlink.description": "A közösségi hálón keresztül csatolt fiók leválasztásával elveszítheti hozzáférését a fiókhoz, ha a név és jelszó kombinációra nem emlékszik.",
|
||||||
"account.notify.oauth.unlinked.success": "Unlinked successfully",
|
"account.notify.oauth.unlinked.success": "Leválasztás sikeres",
|
||||||
"account.card.security.title": "Security",
|
"account.card.security.title": "Biztonság",
|
||||||
"account.card.security.totp.enable.description": "Enter your current password to start enabling TOTP",
|
"account.card.security.totp.enable.description": "Adja meg az aktuális jelszavát a TOTP engedélyezéséhez",
|
||||||
"account.card.security.totp.disable.description": "Enter your current password to disable TOTP",
|
"account.card.security.totp.disable.description": "Adja meg aktuális jelszavát a TOTP letiltásához",
|
||||||
"account.card.security.totp.button.start": "Start",
|
"account.card.security.totp.button.start": "Kezdés",
|
||||||
"account.modal.totp.title": "Enable TOTP",
|
"account.modal.totp.title": "TOTP engedélyezése",
|
||||||
"account.modal.totp.step1": "Step 1: Add your authenticator",
|
"account.modal.totp.step1": "1. lépés: Hitelesítő megadása",
|
||||||
"account.modal.totp.step2": "Step 2: Validate your code",
|
"account.modal.totp.step2": "2. lépés: Kód érvényesítése",
|
||||||
"account.modal.totp.enterManually": "Enter manually",
|
"account.modal.totp.enterManually": "Kézi megadás",
|
||||||
"account.modal.totp.code": "Code",
|
"account.modal.totp.code": "Kód",
|
||||||
"account.modal.totp.clickToCopy": "Click to copy",
|
"common.button.clickToCopy": "Kattintson a másoláshoz",
|
||||||
"account.modal.totp.verify": "Verify",
|
"account.modal.totp.verify": "Hitelesítés",
|
||||||
"account.notify.totp.disable": "TOTP disabled successfully",
|
"account.notify.totp.disable": "TOTP sikeresen letiltva",
|
||||||
"account.notify.totp.enable": "TOTP enabled successfully",
|
"account.notify.totp.enable": "TOTP sikeresen engedélyezve",
|
||||||
"account.card.language.title": "Language",
|
"account.card.language.title": "Nyelv",
|
||||||
"account.card.language.description": "The project is translated by the community. Some languages might be incomplete.",
|
"account.card.language.description": "A projekt nyelvi verzióit a közösség fordítja. Egyes nyelvi verziók nem feltétlenül teljesek.",
|
||||||
"account.card.color.title": "Color scheme",
|
"account.card.color.title": "Színséma",
|
||||||
// ThemeSwitcher.tsx
|
// ThemeSwitcher.tsx
|
||||||
"account.theme.dark": "Dark",
|
"account.theme.dark": "Sötét",
|
||||||
"account.theme.light": "Light",
|
"account.theme.light": "Világos",
|
||||||
"account.theme.system": "System",
|
"account.theme.system": "Rendszer",
|
||||||
"account.button.delete": "Delete Account",
|
"account.button.delete": "Fiók törlése",
|
||||||
"account.modal.delete.title": "Delete Account",
|
"account.modal.delete.title": "Fiók törlése",
|
||||||
"account.modal.delete.description": "Do you really want to delete your account including all your active shares?",
|
"account.modal.delete.description": "Valóban törölni kívánja a fiókot és vele az összes meglévő aktív megosztást?",
|
||||||
// END /account
|
// END /account
|
||||||
// /account/shares
|
// /account/shares
|
||||||
"account.shares.title": "My shares",
|
"account.shares.title": "Megosztásaim",
|
||||||
"account.shares.title.empty": "It's empty here 👀",
|
"account.shares.title.empty": "Üres 👀, itt nincs semmi",
|
||||||
"account.shares.description.empty": "You don't have any shares.",
|
"account.shares.description.empty": "Nincsenek megosztások.",
|
||||||
"account.shares.button.create": "Create one",
|
"account.shares.button.create": "Létrehozás",
|
||||||
"account.shares.info.title": "Share informations",
|
"account.shares.info.title": "Megosztás adatai",
|
||||||
"account.shares.table.id": "ID",
|
"account.shares.table.id": "ID",
|
||||||
"account.shares.table.name": "Name",
|
"account.shares.table.name": "Megnevezés",
|
||||||
"account.shares.table.description": "Description",
|
"account.shares.table.description": "Leírás",
|
||||||
"account.shares.table.visitors": "Visitors",
|
"account.shares.table.visitors": "Látogatók",
|
||||||
"account.shares.table.expiresAt": "Expires at",
|
"account.shares.table.expiresAt": "Lejárat",
|
||||||
"account.shares.table.createdAt": "Created at",
|
"account.shares.table.createdAt": "Létrehozás időpontja",
|
||||||
"account.shares.table.size": "Size",
|
"account.shares.table.size": "Méret",
|
||||||
"account.shares.modal.share-informations": "Share informations",
|
"account.shares.modal.share-informations": "Megosztás adatai",
|
||||||
"account.shares.modal.share-link": "Share link",
|
"account.shares.modal.share-link": "Hivatkozás",
|
||||||
"account.shares.modal.delete.title": "Delete share {share}",
|
"account.shares.modal.delete.title": "Törlés: {share}",
|
||||||
"account.shares.modal.delete.description": "Do you really want to delete this share?",
|
"account.shares.modal.delete.description": "Biztos abban, hogy törölni kívánja ezt a megosztást?",
|
||||||
// END /account/shares
|
// END /account/shares
|
||||||
// /account/reverseShares
|
// /account/reverseShares
|
||||||
"account.reverseShares.title": "Reverse shares",
|
"account.reverseShares.title": "Fordított megosztás",
|
||||||
"account.reverseShares.description": "A reverse share allows you to generate a unique URL that allows external users to create a share.",
|
"account.reverseShares.description": "A fordított megosztással egy egyedi URL azonosító készül, amivel a rendszeren kívülről készíthető megosztás.",
|
||||||
"account.reverseShares.title.empty": "It's empty here 👀",
|
"account.reverseShares.title.empty": "Üres 👀, itt nincs semmi",
|
||||||
"account.reverseShares.description.empty": "You don't have any reverse shares.",
|
"account.reverseShares.description.empty": "Nincsenek fordított megosztások.",
|
||||||
// showCreateReverseShareModal.tsx
|
// showCreateReverseShareModal.tsx
|
||||||
"account.reverseShares.modal.title": "Create reverse share",
|
"account.reverseShares.modal.title": "Fordított megosztás létrehozása",
|
||||||
"account.reverseShares.modal.expiration.label": "Expiration",
|
"account.reverseShares.modal.expiration.label": "Lejárat",
|
||||||
"account.reverseShares.modal.expiration.minute-singular": "Minute",
|
"account.reverseShares.modal.expiration.minute-singular": "perc",
|
||||||
"account.reverseShares.modal.expiration.minute-plural": "Minutes",
|
"account.reverseShares.modal.expiration.minute-plural": "perc",
|
||||||
"account.reverseShares.modal.expiration.hour-singular": "Hour",
|
"account.reverseShares.modal.expiration.hour-singular": "óra",
|
||||||
"account.reverseShares.modal.expiration.hour-plural": "Hours",
|
"account.reverseShares.modal.expiration.hour-plural": "óra",
|
||||||
"account.reverseShares.modal.expiration.day-singular": "Day",
|
"account.reverseShares.modal.expiration.day-singular": "nap",
|
||||||
"account.reverseShares.modal.expiration.day-plural": "Days",
|
"account.reverseShares.modal.expiration.day-plural": "nap",
|
||||||
"account.reverseShares.modal.expiration.week-singular": "Week",
|
"account.reverseShares.modal.expiration.week-singular": "hét",
|
||||||
"account.reverseShares.modal.expiration.week-plural": "Weeks",
|
"account.reverseShares.modal.expiration.week-plural": "hét",
|
||||||
"account.reverseShares.modal.expiration.month-singular": "Month",
|
"account.reverseShares.modal.expiration.month-singular": "hónap",
|
||||||
"account.reverseShares.modal.expiration.month-plural": "Months",
|
"account.reverseShares.modal.expiration.month-plural": "hónap",
|
||||||
"account.reverseShares.modal.expiration.year-singular": "Year",
|
"account.reverseShares.modal.expiration.year-singular": "év",
|
||||||
"account.reverseShares.modal.expiration.year-plural": "Years",
|
"account.reverseShares.modal.expiration.year-plural": "év",
|
||||||
"account.reverseShares.modal.max-size.label": "Max share size",
|
"account.reverseShares.modal.max-size.label": "Megosztás megengedett max mérete",
|
||||||
"account.reverseShares.modal.send-email": "Send email notification",
|
"account.reverseShares.modal.send-email": "Email értesítés küldése",
|
||||||
"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": "Email értesítés arról, amikor a fordított megosztási hivatkozást használva megosztást hoznak létre.",
|
||||||
"account.reverseShares.modal.max-use.label": "Max uses",
|
"account.reverseShares.modal.max-use.label": "Megengedett alkalmak száma",
|
||||||
"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": "A megosztási hivatkozás megengedett felhasználási alkalmainak száma.",
|
||||||
"account.reverseShare.never-expires": "This reverse share will never expire.",
|
"account.reverseShare.never-expires": "Ez a fordított megosztás soha nem fog lejárni.",
|
||||||
"account.reverseShare.expires-on": "This reverse share will expire on {expiration}.",
|
"account.reverseShare.expires-on": "A fordított megosztás lejárata: {expiration}.",
|
||||||
"account.reverseShares.table.no-shares": "No shares created yet",
|
"account.reverseShares.table.no-shares": "Még nincsenek megosztások",
|
||||||
"account.reverseShares.table.count.singular": "share",
|
"account.reverseShares.table.count.singular": "megosztás",
|
||||||
"account.reverseShares.table.count.plural": "shares",
|
"account.reverseShares.table.count.plural": "megosztás",
|
||||||
"account.reverseShares.table.shares": "Shares",
|
"account.reverseShares.table.shares": "Megosztások",
|
||||||
"account.reverseShares.table.remaining": "Remaining uses",
|
"account.reverseShares.table.remaining": "Fennmaradó alkalmak",
|
||||||
"account.reverseShares.table.max-size": "Max share size",
|
"account.reverseShares.table.max-size": "Megengedett max méret",
|
||||||
"account.reverseShares.table.expires": "Expires at",
|
"account.reverseShares.table.expires": "Lejárat",
|
||||||
"account.reverseShares.modal.reverse-share-link": "Reverse share link",
|
"account.reverseShares.modal.reverse-share-link": "Fordított megosztási hivatkozás",
|
||||||
"account.reverseShares.modal.delete.title": "Delete reverse share",
|
"account.reverseShares.modal.delete.title": "Fordított megosztás törlése",
|
||||||
"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": "Valóban törölni kívánja ezt a fordított megosztást? A használatával készített megosztások is törlésre kerülnek.",
|
||||||
// END /account/reverseShares
|
// END /account/reverseShares
|
||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administration",
|
"admin.title": "Admin ügyek",
|
||||||
"admin.button.users": "User management",
|
"admin.button.users": "Felhasználókezelés",
|
||||||
"admin.button.config": "Configuration",
|
"admin.button.shares": "Megosztáskezelés",
|
||||||
"admin.version": "Version",
|
"admin.button.config": "Konfiguráció",
|
||||||
|
"admin.version": "Verzió",
|
||||||
// END /admin
|
// END /admin
|
||||||
// /admin/users
|
// /admin/users
|
||||||
"admin.users.title": "User management",
|
"admin.users.title": "Felhasználókezelés",
|
||||||
"admin.users.table.username": "Username",
|
"admin.users.table.username": "Felhasználónév",
|
||||||
"admin.users.table.email": "Email",
|
"admin.users.table.email": "Email",
|
||||||
"admin.users.table.admin": "Admin",
|
"admin.users.table.admin": "Admin ügyek",
|
||||||
"admin.users.edit.update.title": "Update user {username}",
|
"admin.users.edit.update.title": "{username} felhasználó frissítése",
|
||||||
"admin.users.edit.update.admin-privileges": "Admin privileges",
|
"admin.users.edit.update.admin-privileges": "Adminisztrátori jogosultságok",
|
||||||
"admin.users.edit.update.change-password.title": "Change password",
|
"admin.users.edit.update.change-password.title": "Jelszó módosítása",
|
||||||
"admin.users.edit.update.change-password.field": "New password",
|
"admin.users.edit.update.change-password.field": "Új jelszó",
|
||||||
"admin.users.edit.update.change-password.button": "Save new password",
|
"admin.users.edit.update.change-password.button": "Új jelszó mentése",
|
||||||
"admin.users.edit.update.notify.password.success": "Password changed successfully",
|
"admin.users.edit.update.notify.password.success": "A jelszó sikeresen frissítésre került",
|
||||||
"admin.users.edit.delete.title": "Delete user {username}",
|
"admin.users.edit.delete.title": "{username} felhasználó törlése",
|
||||||
"admin.users.edit.delete.description": "Do you really want to delete this user and all his shares?",
|
"admin.users.edit.delete.description": "Valóban törölni kívánja ezt a felhasználót és vele az ő minden egyes megosztását?",
|
||||||
// showCreateUserModal.tsx
|
// showCreateUserModal.tsx
|
||||||
"admin.users.modal.create.title": "Create user",
|
"admin.users.modal.create.title": "Felhasználó létrehozása",
|
||||||
"admin.users.modal.create.username": "Username",
|
"admin.users.modal.create.username": "Felhasználónév",
|
||||||
"admin.users.modal.create.email": "Email",
|
"admin.users.modal.create.email": "Email",
|
||||||
"admin.users.modal.create.password": "Password",
|
"admin.users.modal.create.password": "Jelszó",
|
||||||
"admin.users.modal.create.manual-password": "Set password manually",
|
"admin.users.modal.create.manual-password": "Jelszó kézi megadása",
|
||||||
"admin.users.modal.create.manual-password.description": "If not checked, the user will receive an email with a link to set their password.",
|
"admin.users.modal.create.manual-password.description": "Ha nincs bejelölve, akkor a felhasználó egy emailt és benne egy jelszó létrehozási hivatkozást kap.",
|
||||||
"admin.users.modal.create.admin": "Admin privileges",
|
"admin.users.modal.create.admin": "Adminisztrátori jogosultságok",
|
||||||
"admin.users.modal.create.admin.description": "If checked, the user will be able to access the admin panel.",
|
"admin.users.modal.create.admin.description": "Bejelölt állapotában a felhasználó hozzáfér az admin beállító oldalhoz.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Megosztáskezelés",
|
||||||
|
"admin.shares.table.id": "Megosztás ID",
|
||||||
|
"admin.shares.table.username": "Létrehozó",
|
||||||
|
"admin.shares.table.visitors": "Látogatók",
|
||||||
|
"admin.shares.table.expires": "Lejárat",
|
||||||
|
"admin.shares.edit.delete.title": "{id} megosztás törlése",
|
||||||
|
"admin.shares.edit.delete.description": "Valóban törölni kívánja ezt a megosztást?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Upload",
|
"upload.title": "Feltöltés",
|
||||||
"upload.notify.generic-error": "An error occurred while finishing your share.",
|
"upload.notify.generic-error": "Hiba lépett fel a megosztás befejezése közben.",
|
||||||
"upload.notify.count-failed": "{count} files failed to upload. Trying again.",
|
"upload.notify.count-failed": "{count} darab fájlt nem sikerült feltölteni. Próbálja ismét.",
|
||||||
// Dropzone.tsx
|
// Dropzone.tsx
|
||||||
"upload.dropzone.title": "Upload files",
|
"upload.dropzone.title": "Fájlok feltöltése",
|
||||||
"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": "Húzza ide a fájlokat a megosztás elkészítéséhez. Összesen legfeljebb {maxSize} fájl húzható egy megosztásba.",
|
||||||
"upload.dropzone.notify.file-too-big": "Your files exceed the maximum share size of {maxSize}.",
|
"upload.dropzone.notify.file-too-big": "A fájlok mérete meghaladja a megengedett {maxSize} méretet.",
|
||||||
// FileList.tsx
|
// FileList.tsx
|
||||||
"upload.filelist.name": "Name",
|
"upload.filelist.name": "Megnevezés",
|
||||||
"upload.filelist.size": "Size",
|
"upload.filelist.size": "Méret",
|
||||||
// showCreateUploadModal.tsx
|
// showCreateUploadModal.tsx
|
||||||
"upload.modal.title": "Create Share",
|
"upload.modal.title": "Megosztás létrehozása",
|
||||||
"upload.modal.link.error.invalid": "Can only contain letters, numbers, underscores, and hyphens",
|
"upload.modal.link.error.invalid": "Csak betű, szám, aláhúzás és kötőjel karaktereket tartalmazhat",
|
||||||
"upload.modal.link.error.taken": "This link is already in use",
|
"upload.modal.link.error.taken": "Ez a hivatkozás név már használatban van",
|
||||||
"upload.modal.not-signed-in": "You're not signed in",
|
"upload.modal.not-signed-in": "Nincs bejelentkezve",
|
||||||
"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": "Nem lesz képes megosztását kézzel törölni vagy megtekinteni a látogatók számát.",
|
||||||
"upload.modal.expires.never": "never",
|
"upload.modal.expires.never": "soha",
|
||||||
"upload.modal.expires.never-long": "Never Expires",
|
"upload.modal.expires.never-long": "Nincs lejárat",
|
||||||
"upload.modal.expires.error.too-long": "Expiration exceeds maximum expiration date of {max}.",
|
"upload.modal.expires.error.too-long": "A lejárat meghaladja a megengedett max {max} értéket.",
|
||||||
"upload.modal.link.label": "Link",
|
"upload.modal.link.label": "Hivatkozás",
|
||||||
"upload.modal.expires.label": "Expiration",
|
"upload.modal.expires.label": "Lejárat",
|
||||||
"upload.modal.expires.minute-singular": "Minute",
|
"upload.modal.expires.minute-singular": "perc",
|
||||||
"upload.modal.expires.minute-plural": "Minutes",
|
"upload.modal.expires.minute-plural": "perc",
|
||||||
"upload.modal.expires.hour-singular": "Hour",
|
"upload.modal.expires.hour-singular": "óra",
|
||||||
"upload.modal.expires.hour-plural": "Hours",
|
"upload.modal.expires.hour-plural": "óra",
|
||||||
"upload.modal.expires.day-singular": "Day",
|
"upload.modal.expires.day-singular": "nap",
|
||||||
"upload.modal.expires.day-plural": "Days",
|
"upload.modal.expires.day-plural": "nap",
|
||||||
"upload.modal.expires.week-singular": "Week",
|
"upload.modal.expires.week-singular": "hét",
|
||||||
"upload.modal.expires.week-plural": "Weeks",
|
"upload.modal.expires.week-plural": "hét",
|
||||||
"upload.modal.expires.month-singular": "Month",
|
"upload.modal.expires.month-singular": "hónap",
|
||||||
"upload.modal.expires.month-plural": "Months",
|
"upload.modal.expires.month-plural": "hónap",
|
||||||
"upload.modal.expires.year-singular": "Year",
|
"upload.modal.expires.year-singular": "év",
|
||||||
"upload.modal.expires.year-plural": "Years",
|
"upload.modal.expires.year-plural": "év",
|
||||||
"upload.modal.accordion.description.title": "Description",
|
"upload.modal.accordion.name-and-description.title": "Megnevezés és leírás",
|
||||||
"upload.modal.accordion.description.placeholder": "Note for the recipients of this share",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Megnevezés",
|
||||||
"upload.modal.accordion.email.title": "Email recipients",
|
"upload.modal.accordion.name-and-description.description.placeholder": "A megosztást kapóknak küldendő üzenet",
|
||||||
"upload.modal.accordion.email.placeholder": "Enter email recipients",
|
"upload.modal.accordion.email.title": "Email címzettek",
|
||||||
"upload.modal.accordion.email.invalid-email": "Invalid email address",
|
"upload.modal.accordion.email.placeholder": "Adja meg az email címzetteket",
|
||||||
"upload.modal.accordion.security.title": "Security options",
|
"upload.modal.accordion.email.invalid-email": "Érvénytelen emailcím",
|
||||||
"upload.modal.accordion.security.password.label": "Password protection",
|
"upload.modal.accordion.security.title": "Biztonsági beállítások",
|
||||||
"upload.modal.accordion.security.password.placeholder": "No password",
|
"upload.modal.accordion.security.password.label": "Jelszavas védelem",
|
||||||
"upload.modal.accordion.security.max-views.label": "Maximum views",
|
"upload.modal.accordion.security.password.placeholder": "Nincs jelszó",
|
||||||
"upload.modal.accordion.security.max-views.placeholder": "No limit",
|
"upload.modal.accordion.security.max-views.label": "Megtekintések max száma",
|
||||||
|
"upload.modal.accordion.security.max-views.placeholder": "Nincs korlát",
|
||||||
// showCompletedUploadModal.tsx
|
// showCompletedUploadModal.tsx
|
||||||
"upload.modal.completed.never-expires": "This share will never expire.",
|
"upload.modal.completed.never-expires": "Ez a megosztás soha nem fog lejárni.",
|
||||||
"upload.modal.completed.expires-on": "This share will expire on {expiration}.",
|
"upload.modal.completed.expires-on": "A megosztás lejárata: {expiration}.",
|
||||||
"upload.modal.completed.share-ready": "Share ready",
|
"upload.modal.completed.share-ready": "A megosztás készen áll",
|
||||||
// END /upload
|
// END /upload
|
||||||
// /share/[id]
|
// /share/[id]
|
||||||
"share.title": "Share {shareId}",
|
"share.title": "Megosztás: {shareId}",
|
||||||
"share.description": "Look what I've shared with you!",
|
"share.description": "Megosztottak Önnel valami fontosat!",
|
||||||
"share.error.visitor-limit-exceeded.title": "Visitor limit exceeded",
|
"share.error.visitor-limit-exceeded.title": "Túl sok látogató",
|
||||||
"share.error.visitor-limit-exceeded.description": "The visitor limit from this share has been exceeded.",
|
"share.error.visitor-limit-exceeded.description": "A látogatók száma elérte a megszabott korlátot.",
|
||||||
"share.error.removed.title": "Share removed",
|
"share.error.removed.title": "Korábban már eltávolított megosztás",
|
||||||
"share.error.not-found.title": "Share not found",
|
"share.error.not-found.title": "Fel nem lelhető megosztás",
|
||||||
"share.error.not-found.description": "The share you're looking for doesn't exist.",
|
"share.error.not-found.description": "A keresett megosztás nem létezik.",
|
||||||
"share.modal.password.title": "Password required",
|
"share.modal.password.title": "Jelszó szükséges",
|
||||||
"share.modal.password.description": "To access this share please enter the password for the share.",
|
"share.modal.password.description": "A megosztott tartalom eléréséhez adja meg a megosztás jelszavát.",
|
||||||
"share.modal.password": "Password",
|
"share.modal.password": "Jelszó",
|
||||||
"share.modal.error.invalid-password": "Invalid password",
|
"share.modal.error.invalid-password": "Érvénytelen jelszó",
|
||||||
"share.button.download-all": "Download all",
|
"share.button.download-all": "Mindet letölti",
|
||||||
"share.notify.download-all-preparing": "The share is preparing. Try again in a few minutes.",
|
"share.notify.download-all-preparing": "A megosztás éppen előkészületben. Kérjük próbálja újra néhány perc múlva.",
|
||||||
"share.modal.file-link": "File link",
|
"share.modal.file-link": "Fájl hivatkozás",
|
||||||
"share.table.name": "Name",
|
"share.table.name": "Megnevezés",
|
||||||
"share.table.size": "Size",
|
"share.table.size": "Méret",
|
||||||
"share.modal.file-preview.error.not-supported.title": "Preview not supported",
|
"share.modal.file-preview.error.not-supported.title": "Az előnézetek nem támogatottak",
|
||||||
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
|
"share.modal.file-preview.error.not-supported.description": "E fájltípushoz nincsen támogatott előnézet. Töltse le a fájlt a megtekintéshez.",
|
||||||
// END /share/[id]
|
// END /share/[id]
|
||||||
// /share/[id]/edit
|
// /share/[id]/edit
|
||||||
"share.edit.title": "Edit {shareId}",
|
"share.edit.title": "Módosítás: {shareId}",
|
||||||
"share.edit.append-upload": "Append file",
|
"share.edit.append-upload": "Fájl hozzáfűzése",
|
||||||
"share.edit.notify.generic-error": "An error occurred while finishing your share.",
|
"share.edit.notify.generic-error": "Hiba lépett fel a megosztás befejezése közben.",
|
||||||
"share.edit.notify.save-success": "Share updated successfully",
|
"share.edit.notify.save-success": "A megosztás frissítésre került",
|
||||||
// END /share/[id]/edit
|
// END /share/[id]/edit
|
||||||
// /admin/config
|
// /admin/config
|
||||||
"admin.config.title": "Configuration",
|
"admin.config.title": "Konfiguráció",
|
||||||
"admin.config.category.general": "General",
|
"admin.config.category.general": "Általános",
|
||||||
"admin.config.category.share": "Share",
|
"admin.config.category.share": "Megosztás",
|
||||||
"admin.config.category.email": "Email",
|
"admin.config.category.email": "Email",
|
||||||
"admin.config.category.smtp": "SMTP",
|
"admin.config.category.smtp": "SMTP",
|
||||||
"admin.config.category.oauth": "Social Login",
|
"admin.config.category.oauth": "Közösségi bejelentkezés",
|
||||||
"admin.config.general.app-name": "App name",
|
"admin.config.general.app-name": "Alkalmazás neve",
|
||||||
"admin.config.general.app-name.description": "Name of the application",
|
"admin.config.general.app-name.description": "Az alkalmazás neve",
|
||||||
"admin.config.general.app-url": "App URL",
|
"admin.config.general.app-url": "Alkalmazás URL hivatkozás",
|
||||||
"admin.config.general.app-url.description": "On which URL Pingvin Share is available",
|
"admin.config.general.app-url.description": "A Pingvin Share megosztáskezelőre mutató hivatkozás",
|
||||||
"admin.config.general.show-home-page": "Show home page",
|
"admin.config.general.show-home-page": "Kezdőlap mutatása",
|
||||||
"admin.config.general.show-home-page.description": "Whether to show the home page",
|
"admin.config.general.show-home-page.description": "A kezdőlap mutatásának ki- és bekapcsolása",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.session-duration": "Munkamenet időtartama",
|
||||||
"admin.config.general.logo.description": "Change your logo by uploading a new image. The image must be a PNG and should have the format 1:1.",
|
"admin.config.general.session-duration.description": "Annak az időtartamnak a megadása, amit követően a felhasználónak ismét be kell jelentkeznie (alapérték: 3 hónap).",
|
||||||
"admin.config.general.logo.placeholder": "Pick image",
|
"admin.config.general.logo": "Logó",
|
||||||
"admin.config.email.enable-share-email-recipients": "Enable share email recipients",
|
"admin.config.general.logo.description": "A logó személyessé tételéhez töltsön fel egy új képet. A formátum legyen PNG, az oldalarány 1:1.",
|
||||||
"admin.config.email.enable-share-email-recipients.description": "Whether to allow emails to share recipients. Only enable this if you have enabled SMTP.",
|
"admin.config.general.logo.placeholder": "Kép kiválasztása",
|
||||||
"admin.config.email.share-recipients-subject": "Share recipients subject",
|
"admin.config.email.enable-share-email-recipients": "Megosztás emailben küldésének engedélyezése",
|
||||||
"admin.config.email.share-recipients-subject.description": "Subject of the email which gets sent to the share recipients.",
|
"admin.config.email.enable-share-email-recipients.description": "Email küldése a megosztásról a címzetteknek. Csak akkor engedélyezze, ha az SMTP már engedélyezett.",
|
||||||
"admin.config.email.share-recipients-message": "Share recipients message",
|
"admin.config.email.share-recipients-subject": "Megosztási email tárgya",
|
||||||
"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-subject.description": "A megosztások címzettjeinek küldött email tárgya.",
|
||||||
"admin.config.email.reverse-share-subject": "Reverse share subject",
|
"admin.config.email.share-recipients-message": "Megosztási email szövege",
|
||||||
"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.share-recipients-message.description": "A megosztás címzettjeinek küldött email tartalma. Beépíthető változók:\n {creator} - A megosztás létrehozójának neve\n {shareUrl} - A megosztás URL hivatkozása\n {desc} - A megosztás ismertetése\n {expires} - A megosztás lejáratának dátuma\n A változók helyén az aktuális tartalom fog szerepelni.",
|
||||||
"admin.config.email.reverse-share-message": "Reverse share message",
|
"admin.config.email.reverse-share-subject": "Fordított megosztás tárgya",
|
||||||
"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-subject.description": "Annak az emailnek a tárgya, ami a fordított megosztást használva készített megosztásról kerül kiküldésre.",
|
||||||
"admin.config.email.reset-password-subject": "Reset password subject",
|
"admin.config.email.reverse-share-message": "Fordított megosztás üzenete",
|
||||||
"admin.config.email.reset-password-subject.description": "Subject of the email which gets sent when a user requests a password reset.",
|
"admin.config.email.reverse-share-message.description": "Az Ön által kiküldött fordított megosztási hivatkozás használatával készített megosztás emailjének szövege. A(z) {shareUrl} helyére a létrehozó neve és a megosztás URL hivatkozása kerül.",
|
||||||
"admin.config.email.reset-password-message": "Reset password message",
|
"admin.config.email.reset-password-subject": "Jelszó visszaállítási tárgy",
|
||||||
"admin.config.email.reset-password-message.description": "Message which gets sent when a user requests a password reset. {url} will be replaced with the reset password URL.",
|
"admin.config.email.reset-password-subject.description": "A felhasználó által kezdeményezett jelszó visszaállításkor küldött email tárgya.",
|
||||||
"admin.config.email.invite-subject": "Invite subject",
|
"admin.config.email.reset-password-message": "Jelszó visszaállítási üzenet",
|
||||||
"admin.config.email.invite-subject.description": "Subject of the email which gets sent when an admin invites a user.",
|
"admin.config.email.reset-password-message.description": "A felhasználó által kezdeményezett jelszó visszaállításkor küldött email szövege. A(z) {url} helyére a jelszó visszaállítási URL hivatkozás kerül.",
|
||||||
"admin.config.email.invite-message": "Invite message",
|
"admin.config.email.invite-subject": "Meghívó tárgya",
|
||||||
"admin.config.email.invite-message.description": "Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL and {password} with the password.",
|
"admin.config.email.invite-subject.description": "Az adminisztrátortól a meghívott felhasználó felé küldött email tárgya.",
|
||||||
"admin.config.share.allow-registration": "Allow registration",
|
"admin.config.email.invite-message": "Meghívó szövege",
|
||||||
"admin.config.share.allow-registration.description": "Whether registration is allowed",
|
"admin.config.email.invite-message.description": "Az adminisztrátortól a meghívott felhasználó felé küldött email szövege. A(z) {url} helyére a meghívó URL hivatkozása kerül, a(z) {password} helyére a jelszó.",
|
||||||
"admin.config.share.allow-unauthenticated-shares": "Allow unauthenticated shares",
|
"admin.config.share.allow-registration": "Regisztráció engedélyezése",
|
||||||
"admin.config.share.allow-unauthenticated-shares.description": "Whether unauthenticated users can create shares",
|
"admin.config.share.allow-registration.description": "Regisztráció engedélyezésének ki- és bekapcsolása",
|
||||||
"admin.config.share.max-expiration": "Max expiration",
|
"admin.config.share.allow-unauthenticated-shares": "Hitelesítés nélküli megosztások engedélyezése",
|
||||||
"admin.config.share.max-expiration.description": "Maximum share expiration in hours. Set to 0 to allow unlimited expiration.",
|
"admin.config.share.allow-unauthenticated-shares.description": "Hitelesítés nélküli felhasználók létre hozhatnak-e megosztásokat",
|
||||||
"admin.config.share.max-size": "Max size",
|
"admin.config.share.max-expiration": "Max lejárat",
|
||||||
"admin.config.share.max-size.description": "Maximum share size in bytes",
|
"admin.config.share.max-expiration.description": "A megosztások megengedett leghosszabb lejárata órában. 0 értékkel a lejárat kikapcsolható.",
|
||||||
"admin.config.share.zip-compression-level": "Zip compression level",
|
"admin.config.share.max-size": "Max méret",
|
||||||
"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.max-size.description": "A megosztások megengedett legnagyobb mérete bájtban",
|
||||||
"admin.config.smtp.enabled": "Enabled",
|
"admin.config.share.zip-compression-level": "Zip tömörítési szint",
|
||||||
"admin.config.smtp.enabled.description": "Whether SMTP is enabled. Only set this to true if you entered the host, port, email, user and password of your SMTP server.",
|
"admin.config.share.zip-compression-level.description": "A fájlméret és a tömörítésre fordított idő közötti választás. Az érték 0 - 9 közül választható, 0: nincs tömörítés, 9: legnagyobb mértékű tömörítés. ",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.share.chunk-size": "Darabolási méret",
|
||||||
"admin.config.smtp.host.description": "Host of the SMTP server",
|
"admin.config.share.chunk-size.description": "Az internet kapcsolat megbízhatóságának és átvitelének megfelelően választható feltöltési darabok mérete bájtban. A kisebb darabok növelhetik a szakadozó kapcsolatok használatának sikerességét, a nagyobb darabok a stabil kapcsolatokat gyorsítják.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Megosztás létrehozása felület automatikus megjelenítése",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "A mgosztás létrehozása előugró elem automatikusan megjelenik a fájlok kiválasztásakor, ehhez nem szükséges külön kattintani.",
|
||||||
|
"admin.config.smtp.enabled": "Engedélyezett",
|
||||||
|
"admin.config.smtp.enabled.description": "A(z) SMTP bekapcsolása. Csak akkor engedélyezze, ha már megadta a kiszolgáló, port, email, felhasználónév és jelszó beállításokat az SMTP kiszolgálóhoz.",
|
||||||
|
"admin.config.smtp.host": "Kiszolgáló",
|
||||||
|
"admin.config.smtp.host.description": "Az SMTP szerver kiszolgáló gépe",
|
||||||
"admin.config.smtp.port": "Port",
|
"admin.config.smtp.port": "Port",
|
||||||
"admin.config.smtp.port.description": "Port of the SMTP server",
|
"admin.config.smtp.port.description": "Az SMTP kiszolgáló portja",
|
||||||
"admin.config.smtp.email": "Email",
|
"admin.config.smtp.email": "Email",
|
||||||
"admin.config.smtp.email.description": "Email address which the emails get sent from",
|
"admin.config.smtp.email.description": "Az emailek kiküldésére használt email cím",
|
||||||
"admin.config.smtp.username": "Username",
|
"admin.config.smtp.username": "Felhasználónév",
|
||||||
"admin.config.smtp.username.description": "Username of the SMTP server",
|
"admin.config.smtp.username.description": "Felhasználónév az SMTP kiszolgálón",
|
||||||
"admin.config.smtp.password": "Password",
|
"admin.config.smtp.password": "Jelszó",
|
||||||
"admin.config.smtp.password.description": "Password of the SMTP server",
|
"admin.config.smtp.password.description": "Jelszó az SMTP kiszolgálón",
|
||||||
"admin.config.smtp.button.test": "Send test email",
|
"admin.config.smtp.button.test": "Teszt email küldése",
|
||||||
"admin.config.oauth.allow-registration": "Allow registration",
|
"admin.config.smtp.allow-unauthorized-certificates": "A jogosulatlan SMTP kiszolgáló tanúsítványok is megbízhatók",
|
||||||
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Csak akkor engedélyezze ha saját aláírású tanúsítványok elfogadása is szükséges.",
|
||||||
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
"admin.config.oauth.allow-registration": "Regisztráció engedélyezése",
|
||||||
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
"admin.config.oauth.allow-registration.description": "A felhasználók közösségi bejelentkezésen át is regisztrálhatnak",
|
||||||
|
"admin.config.oauth.ignore-totp": "TOTP mellőzése",
|
||||||
|
"admin.config.oauth.ignore-totp.description": "TOTP mellőzése a közösségi bejelentkezést használó felhasználónál",
|
||||||
|
"admin.config.oauth.disable-password": "Jelszavas bejelentkezés letiltása",
|
||||||
|
"admin.config.oauth.disable-password.description": "A jelszavas bejelentkezés be- és kikapcsolása\nA letiltás előtt a kizáródás elkerülésére mindenképpen ellenőrizendő az OAuth szolgáltató megfelelő konfigurációja.",
|
||||||
"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 bejelentkezés engedélyezése",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
"admin.config.oauth.github-client-id": "GitHub ügyfél ID",
|
||||||
"admin.config.oauth.github-client-id.description": "Client ID of the GitHub OAuth app",
|
"admin.config.oauth.github-client-id.description": "A GitHub OAuth applikáció ügyfél ID azonosítója",
|
||||||
"admin.config.oauth.github-client-secret": "GitHub Client secret",
|
"admin.config.oauth.github-client-secret": "GitHub ügyfél titok",
|
||||||
"admin.config.oauth.github-client-secret.description": "Client secret of the GitHub OAuth app",
|
"admin.config.oauth.github-client-secret.description": "A GitHub OAuth applikáció ügyfél titka",
|
||||||
"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 bejelentkezés engedélyezése",
|
||||||
"admin.config.oauth.google-client-id": "Google Client ID",
|
"admin.config.oauth.google-client-id": "Google ügyfél ID azonosító",
|
||||||
"admin.config.oauth.google-client-id.description": "Client ID of the Google OAuth app",
|
"admin.config.oauth.google-client-id.description": "A Google OAuth applikáció ügyfél ID azonosítója",
|
||||||
"admin.config.oauth.google-client-secret": "Google Client secret",
|
"admin.config.oauth.google-client-secret": "Google ügyfél titok",
|
||||||
"admin.config.oauth.google-client-secret.description": "Client secret of the Google OAuth app",
|
"admin.config.oauth.google-client-secret.description": "A Google OAuth applikáció ügyfél titka",
|
||||||
"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 login engedélyezése",
|
||||||
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
|
"admin.config.oauth.microsoft-tenant": "Microsoft bérlő",
|
||||||
"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": "A Microsoft OAuth applikáció bérlő ID azonosítója\náltalános (common): személyes Microsoft fiókkal és munkahelyi vagy iskolai fiókkal rendelkező Microsoft Entra ID azonosítókkal egyaránt lehetséges a bejelentkezés. \nszervezetek (organizations): Csak a Microsoft Entra ID munkahelyi vagy iskolai fiókkal rendelkező felhasználók jelentkezhetnek be az alkalmazásba.\nfogyasztók (consumers): Csak személyes Microsoft-fiókkal rendelkező felhasználók jelentkezhetnek be az alkalmazásba.\nA Microsoft Entra bérlő tartományneve vagy a bérlő azonosítója GUID formátumban: Az alkalmazásba csak egy adott Microsoft Entra bérlő felhasználói jelentkezhetnek be (munkahelyi vagy iskolai fiókkal rendelkező könyvtártagok vagy személyes Microsoft-fiókkal rendelkező könyvtárvendégek).",
|
||||||
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID",
|
"admin.config.oauth.microsoft-client-id": "Microsoft ügyfél ID azonosító",
|
||||||
"admin.config.oauth.microsoft-client-id.description": "Client ID of the Microsoft OAuth app",
|
"admin.config.oauth.microsoft-client-id.description": "A Microsoft OAuth applikáció ügyfél ID azonosítója",
|
||||||
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
|
"admin.config.oauth.microsoft-client-secret": "Microsoft ügyfél titok",
|
||||||
"admin.config.oauth.microsoft-client-secret.description": "Client secret of the Microsoft OAuth app",
|
"admin.config.oauth.microsoft-client-secret.description": "A Microsoft Oauth applikáció ügyfél titka",
|
||||||
"admin.config.oauth.discord-enabled": "Discord",
|
"admin.config.oauth.discord-enabled": "Discord",
|
||||||
"admin.config.oauth.discord-enabled.description": "Whether Discord login is enabled",
|
"admin.config.oauth.discord-enabled.description": "Discord bejelentkezés engedélyezése",
|
||||||
"admin.config.oauth.discord-limited-guild": "Discord limited server ID",
|
"admin.config.oauth.discord-limited-guild": "Discord limitált kiszolgáló ID azonosítója",
|
||||||
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
|
"admin.config.oauth.discord-limited-guild.description": "A kiszolgálón engedélyezett bejelentkezett felhasználók száma. Hagyja üresen a kikapcsoláshoz.",
|
||||||
"admin.config.oauth.discord-client-id": "Discord Client ID",
|
"admin.config.oauth.discord-client-id": "Discord ügyfél ID azonosító",
|
||||||
"admin.config.oauth.discord-client-id.description": "Client ID of the Discord OAuth app",
|
"admin.config.oauth.discord-client-id.description": "A Discord OAuth applikáció ügyfél ID azonosítója",
|
||||||
"admin.config.oauth.discord-client-secret": "Discord Client secret",
|
"admin.config.oauth.discord-client-secret": "Discord ügyfél titok",
|
||||||
"admin.config.oauth.discord-client-secret.description": "Client secret of the Discord OAuth app",
|
"admin.config.oauth.discord-client-secret.description": "A Discord OAuth applikáció ügyfél titka",
|
||||||
"admin.config.oauth.oidc-enabled": "OpenID Connect",
|
"admin.config.oauth.oidc-enabled": "OpenID Connect",
|
||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "OpenID Connect bejelentkezés engedélyezése",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Az OpenID Connect OAuth applikáció Discovery URI azonosítója",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect felhasználónév igény",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Az OpenID Connect ID token felhasználónév igénye. Hagyja üresen ha nincs információja a beállításról.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-role-path": "Az OpenID Connect token szerepeinek elérési útvonala",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-role-path.description": "Szerepkörökből álló tömbre hivatkozó érvényes JMES-útvonalnak kell lennie. " + "A belépési jogosultságok kezelésére az OpenID Connect szerepkörök csak más azonosító szolgáltatások hiányában és a jelszavas bejelentkezés letiltottsága mellett javasolt. " + "Hagyja üresen, ha nem tudja, mi ez a konfiguráció.",
|
||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect szerepkör általános hozzáféréshez",
|
||||||
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Hagyja üresen, ha nem tudja, mi ez a konfiguráció.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect szerepkör admin hozzáféréshez",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "A rendszergazdai hozzáféréshez szükséges szerepkör. Meg kell lennie a felhasználó szerepkörében ahhoz, hogy hozzáférhessen az adminisztrációs panelhez. " + "Hagyja üresen, ha nem tudja, mi ez a konfiguráció.",
|
||||||
|
"admin.config.oauth.oidc-client-id": "OpenID Connect ügyfél ID azonosító",
|
||||||
|
"admin.config.oauth.oidc-client-id.description": "Az OpenID Connect OAuth applikáció ügyfél ID azonosítója",
|
||||||
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect ügyfél titok",
|
||||||
|
"admin.config.oauth.oidc-client-secret.description": "Az OpenID Connect OAuth applikáció ügyfél titka",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Oops this page doesn't exist.",
|
"404.description": "Hoppá - ez az oldal nem létezik.",
|
||||||
"404.button.home": "Bring me back home",
|
"404.button.home": "Vissza a Kezdőlapra",
|
||||||
// error
|
// error
|
||||||
"error.title": "Error",
|
"error.title": "Hiba",
|
||||||
"error.description": "Oops!",
|
"error.description": "Hoppá!",
|
||||||
"error.button.back": "Go back",
|
"error.button.back": "Vissza",
|
||||||
"error.msg.default": "Something went wrong.",
|
"error.msg.default": "Hiba történt.",
|
||||||
"error.msg.access_denied": "You canceled the authentication process, please try again.",
|
"error.msg.access_denied": "Megszakította a hitelesítési folyamatot, kérem próbálja újra.",
|
||||||
"error.msg.expired_token": "The authentication process took too long, please try again.",
|
"error.msg.expired_token": "A hitelesítési folyamat túl sokáig tartott, kérem próbálja újra.",
|
||||||
"error.msg.invalid_token": "Internal Error",
|
"error.msg.invalid_token": "Belső hiba",
|
||||||
"error.msg.no_user": "User linked to this {0} account doesn't exist.",
|
"error.msg.no_user": "A(z) {0} fiókhoz kapcsolt felhasználó nem létezik.",
|
||||||
"error.msg.no_email": "Can't get email address from this {0} account.",
|
"error.msg.no_email": "Nem nyerhető ki a(z) {0} fiók emailcíme.",
|
||||||
"error.msg.already_linked": "This {0} account is already linked to another account.",
|
"error.msg.already_linked": "Ez a(z) {0} fiók már kapcsolódik egy másik fiókhoz.",
|
||||||
"error.msg.not_linked": "This {0} account haven't linked to any account yet.",
|
"error.msg.not_linked": "Ez a(z){0} fiók még nem kapcsolódott egyetlen fiókhoz sem.",
|
||||||
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
"error.msg.unverified_account": "Ezt a(z) {0} fiókot még nem igazolták vissza, kérem próbálja újra a megerősítés után.",
|
||||||
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
|
"error.msg.user_not_allowed": "Nem jelentkezhet be.",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "Nem nyerhető ki felhasználói információ ebből a(z) {0} fiókból.",
|
||||||
"error.param.provider_github": "GitHub",
|
"error.param.provider_github": "GitHub",
|
||||||
"error.param.provider_google": "Google",
|
"error.param.provider_google": "Google",
|
||||||
"error.param.provider_microsoft": "Microsoft",
|
"error.param.provider_microsoft": "Microsoft",
|
||||||
"error.param.provider_discord": "Discord",
|
"error.param.provider_discord": "Discord",
|
||||||
"error.param.provider_oidc": "OpenID Connect",
|
"error.param.provider_oidc": "OpenID Connect",
|
||||||
// Common translations
|
// Common translations
|
||||||
"common.button.save": "Save",
|
"common.button.save": "Mentés",
|
||||||
"common.button.create": "Create",
|
"common.button.create": "Létrehozás",
|
||||||
"common.button.submit": "Submit",
|
"common.button.submit": "Küldés",
|
||||||
"common.button.delete": "Delete",
|
"common.button.delete": "Törlés",
|
||||||
"common.button.cancel": "Cancel",
|
"common.button.cancel": "Mégse",
|
||||||
"common.button.confirm": "Confirm",
|
"common.button.confirm": "Megerősítés",
|
||||||
"common.button.disable": "Disable",
|
"common.button.disable": "Letiltás",
|
||||||
"common.button.share": "Share",
|
"common.button.share": "Megosztás",
|
||||||
"common.button.generate": "Generate",
|
"common.button.generate": "Létrehozás",
|
||||||
"common.button.done": "Done",
|
"common.button.done": "Kész",
|
||||||
"common.text.link": "Link",
|
"common.text.link": "Hivatkozás",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Ugrás a hivatkozásra",
|
||||||
"common.text.or": "or",
|
"common.text.or": "vagy",
|
||||||
"common.button.go-back": "Go back",
|
"common.button.go-back": "Vissza",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "Kezdőlap",
|
||||||
"common.notify.copied": "Your link was copied to the clipboard",
|
"common.notify.copied": "A hivatkozást a Vágólapra másoltuk",
|
||||||
"common.success": "Success",
|
"common.success": "Siker",
|
||||||
"common.error": "Error",
|
"common.error": "Hiba",
|
||||||
"common.error.unknown": "An unknown error occurred",
|
"common.error.unknown": "Ismeretlen hiba lépett fel",
|
||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Érvénytelen emailcím",
|
||||||
"common.error.too-short": "Must be at least {length} characters",
|
"common.error.too-short": "Legalább {length} karakter kell",
|
||||||
"common.error.too-long": "Must be at most {length} characters",
|
"common.error.too-long": "Legfejlebb {length} karakter adható meg",
|
||||||
"common.error.exact-length": "Must be exactly {length} characters",
|
"common.error.exact-length": "Pontosan {length} karakter szükséges",
|
||||||
"common.error.invalid-number": "Must be a number",
|
"common.error.invalid-number": "Számot kell megadnia",
|
||||||
"common.error.field-required": "This field is required"
|
"common.error.field-required": "Ez egy kötelező mező"
|
||||||
};
|
};
|
||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Autenticazione a due fattori richiesta",
|
"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.notify.totp-required.description": "Inserisci il tuo codice di autenticazione a due fattori",
|
||||||
"signIn.oauth.or": "OPPURE",
|
"signIn.oauth.or": "OPPURE",
|
||||||
|
"signIn.oauth.signInWith": "Registrati con",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Passo 2: Convalida il tuo codice",
|
"account.modal.totp.step2": "Passo 2: Convalida il tuo codice",
|
||||||
"account.modal.totp.enterManually": "Inserisci manualmente",
|
"account.modal.totp.enterManually": "Inserisci manualmente",
|
||||||
"account.modal.totp.code": "Codice",
|
"account.modal.totp.code": "Codice",
|
||||||
"account.modal.totp.clickToCopy": "Clicca per copiare",
|
"common.button.clickToCopy": "Clicca per copiare",
|
||||||
"account.modal.totp.verify": "Verifica",
|
"account.modal.totp.verify": "Verifica",
|
||||||
"account.notify.totp.disable": "TOTP disabilitato con successo",
|
"account.notify.totp.disable": "TOTP disabilitato con successo",
|
||||||
"account.notify.totp.enable": "TOTP abilitato con successo",
|
"account.notify.totp.enable": "TOTP abilitato con successo",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Amministrazione",
|
"admin.title": "Amministrazione",
|
||||||
"admin.button.users": "Gestione degli utenti",
|
"admin.button.users": "Gestione degli utenti",
|
||||||
|
"admin.button.shares": "Gestione condivisioni",
|
||||||
"admin.button.config": "Configurazione",
|
"admin.button.config": "Configurazione",
|
||||||
"admin.version": "Versione",
|
"admin.version": "Versione",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Privilegi di amministrazione",
|
"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.",
|
"admin.users.modal.create.admin.description": "Se selezionato, l'utente sarà in grado di accedere al pannello amministratore.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Gestione condivisioni",
|
||||||
|
"admin.shares.table.id": "ID Condivisione",
|
||||||
|
"admin.shares.table.username": "Autore",
|
||||||
|
"admin.shares.table.visitors": "Visitatori",
|
||||||
|
"admin.shares.table.expires": "Scade il",
|
||||||
|
"admin.shares.edit.delete.title": "Elimina condivisione {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Vuoi davvero cancellare questa condivisione?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Upload",
|
"upload.title": "Upload",
|
||||||
"upload.notify.generic-error": "Si è verificato un errore durante il completamento della condivisione.",
|
"upload.notify.generic-error": "Si è verificato un errore durante il completamento della condivisione.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Mesi",
|
"upload.modal.expires.month-plural": "Mesi",
|
||||||
"upload.modal.expires.year-singular": "Anno",
|
"upload.modal.expires.year-singular": "Anno",
|
||||||
"upload.modal.expires.year-plural": "Anni",
|
"upload.modal.expires.year-plural": "Anni",
|
||||||
"upload.modal.accordion.description.title": "Descrizione",
|
"upload.modal.accordion.name-and-description.title": "Nome e descrizione",
|
||||||
"upload.modal.accordion.description.placeholder": "Nota per i destinatari di questa condivisione",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Nome",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Nota per i destinatari di questa condivisione",
|
||||||
"upload.modal.accordion.email.title": "Destinatari di posta elettronica",
|
"upload.modal.accordion.email.title": "Destinatari di posta elettronica",
|
||||||
"upload.modal.accordion.email.placeholder": "Inserisci le email dei destinatari",
|
"upload.modal.accordion.email.placeholder": "Inserisci le email dei destinatari",
|
||||||
"upload.modal.accordion.email.invalid-email": "Indirizzo email non valido",
|
"upload.modal.accordion.email.invalid-email": "Indirizzo email non valido",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Su quale URL Pingvin Share è pubblicato",
|
"admin.config.general.app-url.description": "Su quale URL Pingvin Share è pubblicato",
|
||||||
"admin.config.general.show-home-page": "Visualizza Home Page",
|
"admin.config.general.show-home-page": "Visualizza Home Page",
|
||||||
"admin.config.general.show-home-page.description": "Indica se mostrare la home page",
|
"admin.config.general.show-home-page.description": "Indica se mostrare la home page",
|
||||||
|
"admin.config.general.session-duration": "Durata della sessione",
|
||||||
|
"admin.config.general.session-duration.description": "Tempo in ore dopo il quale un utente deve accedere nuovamente (default: 3 mesi).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Cambia il tuo logo caricando una nuova immagine. L'immagine deve essere un PNG e dovrebbe avere il formato 1:1.",
|
"admin.config.general.logo.description": "Cambia il tuo logo caricando una nuova immagine. L'immagine deve essere un PNG e dovrebbe avere il formato 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Scegli un'immagine",
|
"admin.config.general.logo.placeholder": "Scegli un'immagine",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "Dimensione massima di condivisione in byte",
|
"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": "Livello di compressione Zip",
|
||||||
"admin.config.share.zip-compression-level.description": "Regola il livello per bilanciare la dimensione del file e la velocità di compressione. Valori validi da 0 a 9, con 0 senza compressione e 9 con compressione massima. ",
|
"admin.config.share.zip-compression-level.description": "Regola il livello per bilanciare la dimensione del file e la velocità di compressione. Valori validi da 0 a 9, con 0 senza compressione e 9 con compressione massima. ",
|
||||||
|
"admin.config.share.chunk-size": "Dimensione dei chunk",
|
||||||
|
"admin.config.share.chunk-size.description": "Regola la dimensione del chunk (in byte) per i tuoi caricamenti per bilanciare l'efficienza e l'affidabilità in base alla tua connessione internet. I chunk più piccoli possono migliorare i tassi di successo per connessioni instabili, mentre i chunks più grandi velocizzano i caricamenti per connessioni stabili.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Apertura automatica creazione modalità condivisione",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "La modalità di creazione della condivisione viene visualizzata automaticamente quando un utente seleziona i file, eliminando la necessità di fare clic manualmente sul pulsante.",
|
||||||
"admin.config.smtp.enabled": "Abilitato",
|
"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.enabled.description": "Indica se SMTP è abilitato. Impostalo a VERO solo se hai inserito host, porta, email, utente e password del tuo server SMTP.",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.smtp.host": "Host",
|
||||||
@@ -327,10 +345,14 @@ export default {
|
|||||||
"admin.config.smtp.password": "Password",
|
"admin.config.smtp.password": "Password",
|
||||||
"admin.config.smtp.password.description": "Password del server SMTP",
|
"admin.config.smtp.password.description": "Password del server SMTP",
|
||||||
"admin.config.smtp.button.test": "Invia e-mail di prova",
|
"admin.config.smtp.button.test": "Invia e-mail di prova",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Fidati di certificati server SMTP non autorizzati",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Imposta il parametro a \"vero\" solo se vuoi fidarti di certificati self signed.",
|
||||||
"admin.config.oauth.allow-registration": "Consenti la registrazione",
|
"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.allow-registration.description": "Consenti agli utenti di registrarsi tramite social login",
|
||||||
"admin.config.oauth.ignore-totp": "Ignora TOTP",
|
"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.ignore-totp.description": "Indica se ignorare TOTP quando l'utente utilizza il social login",
|
||||||
|
"admin.config.oauth.disable-password": "Disabilita l'accesso tramite password",
|
||||||
|
"admin.config.oauth.disable-password.description": "Nel caso di disabilitazione della password di accesso\nAssicurarti di aver configurato correttamente un provider OAuth prima di attivare questa configurazione, per evitare di essere bloccato fuori dal servizio.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Se l'accesso tramite GitHub è abilitato",
|
"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": "GitHub Client ID",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim": "Richiesta nome utente OpenID Connect",
|
"admin.config.oauth.oidc-username-claim": "Richiesta nome utente OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Nome utente nel token OpenID Connect. Lascialo vuoto se non sai cos'è questa configurazione.",
|
"admin.config.oauth.oidc-username-claim.description": "Nome utente nel token OpenID Connect. Lascialo vuoto se non sai cos'è questa configurazione.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Percorso verso i ruoli in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Deve essere un percorso JMES valido che faccia riferimento a una serie di ruoli. " + "La gestione dei diritti di accesso utilizzando i ruoli OpenID Connect è consigliata solo se nessun altro provider d'identità è configurato e l'accesso tramite password è disabilitato. " + "Lascialo vuoto se non sai cosa sia questa configurazione.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "Ruolo OpenID Connect per l'accesso generale",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Ruolo richiesto per l'accesso generale. Deve essere presente nei ruoli di un utente affinché possa accedere. " + "Lascialo vuoto se non sai cosa sia questa configurazione.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "Ruolo OpenID Connect per l'accesso amministrativo",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Ruolo richiesto per l'accesso amministrativo. Deve essere presente nei ruoli di un utente per accedere al pannello di amministrazione. " + "Lascialo vuoto se non sai cosa sia questa configurazione.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID dell'app OAuth di OpenID Connect",
|
"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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Questo account {0} è già collegato ad un altro account.",
|
"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.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.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.user_not_allowed": "Non sei autorizzato ad accedere.",
|
||||||
"error.msg.cannot_get_user_info": "Non è possibile ottenere le informazioni utente da questo account {0}.",
|
"error.msg.cannot_get_user_info": "Non è possibile ottenere le informazioni utente da questo account {0}.",
|
||||||
"error.param.provider_github": "GitHub",
|
"error.param.provider_github": "GitHub",
|
||||||
"error.param.provider_google": "Google",
|
"error.param.provider_google": "Google",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "二段階認証が必要です",
|
"signIn.notify.totp-required.title": "二段階認証が必要です",
|
||||||
"signIn.notify.totp-required.description": "二段階認証コードを入力してください",
|
"signIn.notify.totp-required.description": "二段階認証コードを入力してください",
|
||||||
"signIn.oauth.or": "または",
|
"signIn.oauth.or": "または",
|
||||||
|
"signIn.oauth.signInWith": "サインインの方法",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -57,7 +58,7 @@ export default {
|
|||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "パスワードを忘れてしまいましたか?",
|
"resetPassword.title": "パスワードを忘れてしまいましたか?",
|
||||||
"resetPassword.description": "登録しているメールアドレスを入力してください。",
|
"resetPassword.description": "登録しているメールアドレスを入力してください。",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "電子メールが存在する場合、パスワードをリセットするためのリンクを含むメッセージが送信されました。",
|
||||||
"resetPassword.button.back": "サインインページに戻る",
|
"resetPassword.button.back": "サインインページに戻る",
|
||||||
"resetPassword.text.resetPassword": "パスワードをリセット",
|
"resetPassword.text.resetPassword": "パスワードをリセット",
|
||||||
"resetPassword.text.enterNewPassword": "新規パスワードを入力",
|
"resetPassword.text.enterNewPassword": "新規パスワードを入力",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "ステップ2: コードを検証",
|
"account.modal.totp.step2": "ステップ2: コードを検証",
|
||||||
"account.modal.totp.enterManually": "手動で入力",
|
"account.modal.totp.enterManually": "手動で入力",
|
||||||
"account.modal.totp.code": "コピー",
|
"account.modal.totp.code": "コピー",
|
||||||
"account.modal.totp.clickToCopy": "ここをクリックしてコピー",
|
"common.button.clickToCopy": "ここをクリックしてコピー",
|
||||||
"account.modal.totp.verify": "検証",
|
"account.modal.totp.verify": "検証",
|
||||||
"account.notify.totp.disable": "2段階認証の無効化に成功しました",
|
"account.notify.totp.disable": "2段階認証の無効化に成功しました",
|
||||||
"account.notify.totp.enable": "2段階認証の有効化に成功しました",
|
"account.notify.totp.enable": "2段階認証の有効化に成功しました",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "管理画面",
|
"admin.title": "管理画面",
|
||||||
"admin.button.users": "ユーザー管理",
|
"admin.button.users": "ユーザー管理",
|
||||||
|
"admin.button.shares": "共有管理",
|
||||||
"admin.button.config": "設定",
|
"admin.button.config": "設定",
|
||||||
"admin.version": "バージョン",
|
"admin.version": "バージョン",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "管理者権限",
|
"admin.users.modal.create.admin": "管理者権限",
|
||||||
"admin.users.modal.create.admin.description": "チェックされている場合、ユーザーは管理画面にアクセスできるようになります。",
|
"admin.users.modal.create.admin.description": "チェックされている場合、ユーザーは管理画面にアクセスできるようになります。",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "共有管理",
|
||||||
|
"admin.shares.table.id": "共有ID",
|
||||||
|
"admin.shares.table.username": "作成者",
|
||||||
|
"admin.shares.table.visitors": "訪問者",
|
||||||
|
"admin.shares.table.expires": "有効期限",
|
||||||
|
"admin.shares.edit.delete.title": "共有 {id} を削除",
|
||||||
|
"admin.shares.edit.delete.description": "この共有を削除してもよろしいですか?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "アップロード",
|
"upload.title": "アップロード",
|
||||||
"upload.notify.generic-error": "共有を仕上げている最中にエラーが発生しました。",
|
"upload.notify.generic-error": "共有を仕上げている最中にエラーが発生しました。",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "ヶ月間",
|
"upload.modal.expires.month-plural": "ヶ月間",
|
||||||
"upload.modal.expires.year-singular": "年間",
|
"upload.modal.expires.year-singular": "年間",
|
||||||
"upload.modal.expires.year-plural": "年間",
|
"upload.modal.expires.year-plural": "年間",
|
||||||
"upload.modal.accordion.description.title": "説明",
|
"upload.modal.accordion.name-and-description.title": "名前と説明",
|
||||||
"upload.modal.accordion.description.placeholder": "この共有に関する受信者へのメモ",
|
"upload.modal.accordion.name-and-description.name.placeholder": "名前",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "この共有に関する受信者へのメモ",
|
||||||
"upload.modal.accordion.email.title": "メールで受け取る相手",
|
"upload.modal.accordion.email.title": "メールで受け取る相手",
|
||||||
"upload.modal.accordion.email.placeholder": "メールの宛先を入力",
|
"upload.modal.accordion.email.placeholder": "メールの宛先を入力",
|
||||||
"upload.modal.accordion.email.invalid-email": "無効なメールアドレスです",
|
"upload.modal.accordion.email.invalid-email": "無効なメールアドレスです",
|
||||||
@@ -262,7 +274,7 @@ export default {
|
|||||||
"share.table.name": "ファイル名",
|
"share.table.name": "ファイル名",
|
||||||
"share.table.size": "サイズ",
|
"share.table.size": "サイズ",
|
||||||
"share.modal.file-preview.error.not-supported.title": "プレビューに対応していません",
|
"share.modal.file-preview.error.not-supported.title": "プレビューに対応していません",
|
||||||
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
|
"share.modal.file-preview.error.not-supported.description": "このファイルタイプのプレビューはサポートされていません。ファイルをダウンロードして表示してください。",
|
||||||
// END /share/[id]
|
// END /share/[id]
|
||||||
// /share/[id]/edit
|
// /share/[id]/edit
|
||||||
"share.edit.title": "編集 {shareId}",
|
"share.edit.title": "編集 {shareId}",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"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.session-duration": "セッション期間",
|
||||||
|
"admin.config.general.session-duration.description": "ユーザーが再度ログインする必要がある時間(時間単位)(デフォルト: 3 か月)。",
|
||||||
"admin.config.general.logo": "ロゴ",
|
"admin.config.general.logo": "ロゴ",
|
||||||
"admin.config.general.logo.description": "新しい画像をアップロードしてロゴを変更できます。画像は、PNG形式でアスペクト比が1:1である必要があります。",
|
"admin.config.general.logo.description": "新しい画像をアップロードしてロゴを変更できます。画像は、PNG形式でアスペクト比が1:1である必要があります。",
|
||||||
"admin.config.general.logo.placeholder": "画像を選択",
|
"admin.config.general.logo.placeholder": "画像を選択",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"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圧縮レベル",
|
||||||
"admin.config.share.zip-compression-level.description": "ファイルサイズと圧縮速度のバランスを取るように、レベルを調整できます。有効な値は0~9の間で、0が無圧縮、9で最大限の圧縮となります。 ",
|
"admin.config.share.zip-compression-level.description": "ファイルサイズと圧縮速度のバランスを取るように、レベルを調整できます。有効な値は0~9の間で、0が無圧縮、9で最大限の圧縮となります。 ",
|
||||||
|
"admin.config.share.chunk-size": "チャンクサイズ",
|
||||||
|
"admin.config.share.chunk-size.description": "インターネット接続に応じてアップロードのチャンクサイズ(バイト単位)を調整し、効率と信頼性のバランスを取ってください。不安定な接続の場合、チャンクサイズを小さくすることでアップロード成功率を高めることができ、安定した接続の場合、チャンクサイズを大きくすることでアップロード速度を速めることができます。",
|
||||||
|
"admin.config.share.auto-open-share-modal": "共有モーダルを自動的に開く",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "ユーザーがファイルを選択すると、共有作成モーダルが自動的に表示されるため、手動でボタンをクリックする必要がありません。",
|
||||||
"admin.config.smtp.enabled": "有効",
|
"admin.config.smtp.enabled": "有効",
|
||||||
"admin.config.smtp.enabled.description": "SMTPを有効にするかどうかを選択してください。SMTPサーバーのホスト名、ポート番号、電子メールアドレス、ユーザー名、パスワードが入力されている場合にのみ、有効にしてください。",
|
"admin.config.smtp.enabled.description": "SMTPを有効にするかどうかを選択してください。SMTPサーバーのホスト名、ポート番号、電子メールアドレス、ユーザー名、パスワードが入力されている場合にのみ、有効にしてください。",
|
||||||
"admin.config.smtp.host": "ホスト名",
|
"admin.config.smtp.host": "ホスト名",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "許可されていない SMTP サーバー証明書を信頼します",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "自己署名証明書を信頼する必要がある場合にのみ、これをtrueに設定してください。",
|
||||||
"admin.config.oauth.allow-registration": "登録を許可する",
|
"admin.config.oauth.allow-registration": "登録を許可する",
|
||||||
"admin.config.oauth.allow-registration.description": "ユーザーにソーシャルアカウント経由での登録を許可します",
|
"admin.config.oauth.allow-registration.description": "ユーザーにソーシャルアカウント経由での登録を許可します",
|
||||||
"admin.config.oauth.ignore-totp": "二段階認証を無視する",
|
"admin.config.oauth.ignore-totp": "二段階認証を無視する",
|
||||||
"admin.config.oauth.ignore-totp.description": "ソーシャルログイン時に二段階認証を無視するかどうかを設定します",
|
"admin.config.oauth.ignore-totp.description": "ソーシャルログイン時に二段階認証を無視するかどうかを設定します",
|
||||||
|
"admin.config.oauth.disable-password": "パスワードログインを無効にする",
|
||||||
|
"admin.config.oauth.disable-password.description": "パスワードログインを無効にするかどうか\nロックアウトされないように、この設定を有効にする前にOAuthプロバイダーが適切に設定されていることを確認してください。",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "GitHubアカウントを使用したログインを許可するかどうかを設定します",
|
"admin.config.oauth.github-enabled.description": "GitHubアカウントを使用したログインを許可するかどうかを設定します",
|
||||||
"admin.config.oauth.github-client-id": "GitHub クライアントID",
|
"admin.config.oauth.github-client-id": "GitHub クライアントID",
|
||||||
@@ -353,22 +375,28 @@ export default {
|
|||||||
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuthアプリのクライアントシークレット",
|
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuthアプリのクライアントシークレット",
|
||||||
"admin.config.oauth.discord-enabled": "Discord",
|
"admin.config.oauth.discord-enabled": "Discord",
|
||||||
"admin.config.oauth.discord-enabled.description": "Discordアカウントを使用したログインを許可するかどうかを設定します",
|
"admin.config.oauth.discord-enabled.description": "Discordアカウントを使用したログインを許可するかどうかを設定します",
|
||||||
"admin.config.oauth.discord-limited-guild": "Discord limited server ID",
|
"admin.config.oauth.discord-limited-guild": "Discord限定サーバーID",
|
||||||
"admin.config.oauth.discord-limited-guild.description": "Limit signing in to users in a specific server. Leave it blank to disable.",
|
"admin.config.oauth.discord-limited-guild.description": "特定のサーバーのユーザーにサインインを制限します。無効にするには空白のままにしてください。",
|
||||||
"admin.config.oauth.discord-client-id": "Discord クライアントID",
|
"admin.config.oauth.discord-client-id": "Discord クライアントID",
|
||||||
"admin.config.oauth.discord-client-id.description": "Discord OAuthアプリのクライアントID",
|
"admin.config.oauth.discord-client-id.description": "Discord OAuthアプリのクライアントID",
|
||||||
"admin.config.oauth.discord-client-secret": "Discord クライアントシークレット",
|
"admin.config.oauth.discord-client-secret": "Discord クライアントシークレット",
|
||||||
"admin.config.oauth.discord-client-secret.description": "Discord OAuthアプリのクライアントシークレット",
|
"admin.config.oauth.discord-client-secret.description": "Discord OAuthアプリのクライアントシークレット",
|
||||||
"admin.config.oauth.oidc-enabled": "OpenID Connect",
|
"admin.config.oauth.oidc-enabled": "OpenID Connect",
|
||||||
"admin.config.oauth.oidc-enabled.description": "Whether OpenID Connect login is enabled",
|
"admin.config.oauth.oidc-enabled.description": "OpenID Connect のログインが有効かを設定します",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "OpenID OAuthアプリのDiscovery URI",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect ユーザー名の要求",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID トークンのユーザー名要求。この設定が何かわからない場合は空白のままにしてください。",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-role-path": "OpenID Connectトークンのロールへのパス",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-role-path.description": "ロールの配列を参照する有効なJMESパスでなければなりません。" + "OpenID Connectのロールを使用してアクセス権を管理することは、他のIDプロバイダが設定されておらず、パスワードログインが無効になっている場合にのみ推奨されます。この構成がわからない場合は空白のままにしてください。" + "この設定が何であるか分からない場合は空白のままにしてください。",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "一般的なアクセスのためのOpenID Connectのロール",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "一般的なアクセスに必要なロール。ログインするユーザーのロールに存在する必要があります。 " + "この設定が何であるか分からない場合は空白のままにしてください。",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "管理者アクセスのための OpenID Connectのロール",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "管理者アクセスに必要なロール。管理パネルにアクセスするためには、ユーザのロールに存在する必要があります。" + "この設定が何であるか分からない場合は空白のままにしてください。",
|
||||||
|
"admin.config.oauth.oidc-client-id": "OpenID Connect クライアントID",
|
||||||
|
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth アプリのクライアント ID",
|
||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
|
||||||
"admin.config.oauth.oidc-client-secret.description": "Client secret of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuthアプリのクライアントシークレット",
|
||||||
// 404
|
// 404
|
||||||
"404.description": "ページが見つかりません。",
|
"404.description": "ページが見つかりません。",
|
||||||
"404.button.home": "ホームに戻る",
|
"404.button.home": "ホームに戻る",
|
||||||
@@ -379,14 +407,14 @@ export default {
|
|||||||
"error.msg.default": "問題が発生しました。",
|
"error.msg.default": "問題が発生しました。",
|
||||||
"error.msg.access_denied": "認証処理を中止しました、後で再度お試しください。",
|
"error.msg.access_denied": "認証処理を中止しました、後で再度お試しください。",
|
||||||
"error.msg.expired_token": "認証処理に時間がかかりすぎています、後で再度お試しください。",
|
"error.msg.expired_token": "認証処理に時間がかかりすぎています、後で再度お試しください。",
|
||||||
"error.msg.invalid_token": "Internal Error",
|
"error.msg.invalid_token": "内部エラー",
|
||||||
"error.msg.no_user": "この{0} アカウントにリンクしたユーザーが存在しません。",
|
"error.msg.no_user": "この{0} アカウントにリンクしたユーザーが存在しません。",
|
||||||
"error.msg.no_email": "この{0} アカウントからメールアドレスを取得出来ません。",
|
"error.msg.no_email": "この{0} アカウントからメールアドレスを取得出来ません。",
|
||||||
"error.msg.already_linked": "この{0} アカウントは、既に別のアカウントにリンクされています。",
|
"error.msg.already_linked": "この{0} アカウントは、既に別のアカウントにリンクされています。",
|
||||||
"error.msg.not_linked": "この{0} アカウントはどのアカウントにもリンクされていません。",
|
"error.msg.not_linked": "この{0} アカウントはどのアカウントにもリンクされていません。",
|
||||||
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
"error.msg.unverified_account": "この {0} アカウントは認証されていません。認証後にもう一度お試しください。",
|
||||||
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
|
"error.msg.user_not_allowed": "サインインできません。",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "この {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",
|
||||||
@@ -404,10 +432,10 @@ export default {
|
|||||||
"common.button.generate": "生成",
|
"common.button.generate": "生成",
|
||||||
"common.button.done": "完了",
|
"common.button.done": "完了",
|
||||||
"common.text.link": "リンク",
|
"common.text.link": "リンク",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "リンクへ移動",
|
||||||
"common.text.or": "または",
|
"common.text.or": "または",
|
||||||
"common.button.go-back": "戻る",
|
"common.button.go-back": "戻る",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "ホームに戻る",
|
||||||
"common.notify.copied": "リンクをクリップボードにコピーしました",
|
"common.notify.copied": "リンクをクリップボードにコピーしました",
|
||||||
"common.success": "成功",
|
"common.success": "成功",
|
||||||
"common.error": "エラー",
|
"common.error": "エラー",
|
||||||
|
|||||||
449
frontend/src/i18n/translations/ko-KR.ts
Normal file
449
frontend/src/i18n/translations/ko-KR.ts
Normal file
@@ -0,0 +1,449 @@
|
|||||||
|
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와 같은 제3자에게 개인 파일을 맡기고 싶으세요?",
|
||||||
|
"home.bullet.a.name": "직접 호스팅",
|
||||||
|
"home.bullet.a.description": "자신의 컴퓨터에서 Pingvin Share를 호스팅하세요.",
|
||||||
|
"home.bullet.b.name": "개인 정보 보호",
|
||||||
|
"home.bullet.b.description": "당신의 파일은 당신의 것이므로 절대로 제3자의 손에 들어가서는 안 됩니다.",
|
||||||
|
"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": "2단계 인증이 필요합니다",
|
||||||
|
"signIn.notify.totp-required.description": "2단계 인증 코드를 입력해주세요",
|
||||||
|
"signIn.oauth.or": "또는",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
|
"signIn.oauth.github": "깃허브",
|
||||||
|
"signIn.oauth.google": "구글",
|
||||||
|
"signIn.oauth.microsoft": "마이크로소프트",
|
||||||
|
"signIn.oauth.discord": "디스코드",
|
||||||
|
"signIn.oauth.oidc": "오픈ID",
|
||||||
|
// 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 인증",
|
||||||
|
"totp.button.signIn": "로그인",
|
||||||
|
// END /auth/totp
|
||||||
|
// /auth/reset-password
|
||||||
|
"resetPassword.title": "비밀번호를 잊으셨나요?",
|
||||||
|
"resetPassword.description": "비밀번호를 재설정하려면 이메일을 입력하세요.",
|
||||||
|
"resetPassword.notify.success": "이메일이 존재한다면 비밀번호를 재설정하는 링크를 포함한 메시지가 발송되었습니다.",
|
||||||
|
"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": "이메일",
|
||||||
|
"account.notify.info.success": "계정이 업데이트되었습니다.",
|
||||||
|
"account.card.password.title": "비밀번호",
|
||||||
|
"account.card.password.old": "기존 비밀번호",
|
||||||
|
"account.card.password.new": "새로운 비밀번호",
|
||||||
|
"account.card.password.noPasswordSet": "비밀번호를 설정하지 않았습니다. 이메일과 비밀번호로 로그인하려면 비밀번호를 설정해야 합니다.",
|
||||||
|
"account.notify.password.success": "비밀번호 변경 완료",
|
||||||
|
"account.card.oauth.title": "소셜 로그인",
|
||||||
|
"account.card.oauth.github": "깃허브",
|
||||||
|
"account.card.oauth.google": "구글",
|
||||||
|
"account.card.oauth.microsoft": "마이크로소프트",
|
||||||
|
"account.card.oauth.discord": "디스코드",
|
||||||
|
"account.card.oauth.oidc": "오픈ID",
|
||||||
|
"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": "코드",
|
||||||
|
"common.button.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": "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": "이메일 알림 보내기",
|
||||||
|
"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.shares": "공유 관리",
|
||||||
|
"admin.button.config": "구성",
|
||||||
|
"admin.version": "버전",
|
||||||
|
// END /admin
|
||||||
|
// /admin/users
|
||||||
|
"admin.users.title": "사용자 관리",
|
||||||
|
"admin.users.table.username": "사용자 이름",
|
||||||
|
"admin.users.table.email": "이메일",
|
||||||
|
"admin.users.table.admin": "관리자",
|
||||||
|
"admin.users.edit.update.title": "{username} 사용자 업데이트",
|
||||||
|
"admin.users.edit.update.admin-privileges": "Admin Privilege",
|
||||||
|
"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": "이메일",
|
||||||
|
"admin.users.modal.create.password": "비밀번호",
|
||||||
|
"admin.users.modal.create.manual-password": "수동 암호 설정",
|
||||||
|
"admin.users.modal.create.manual-password.description": "선택하지 않으면 사용자는 암호를 설정할 수 있는 링크가 포함된 이메일을 받게 됩니다.",
|
||||||
|
"admin.users.modal.create.admin": "Admin Privilege",
|
||||||
|
"admin.users.modal.create.admin.description": "이 옵션을 선택하면 사용자는 관리 패널에 액세스할 수 있습니다.",
|
||||||
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "공유 관리",
|
||||||
|
"admin.shares.table.id": "공유 ID",
|
||||||
|
"admin.shares.table.username": "만든이",
|
||||||
|
"admin.shares.table.visitors": "방문자",
|
||||||
|
"admin.shares.table.expires": "만료일",
|
||||||
|
"admin.shares.edit.delete.title": "공유 삭제 {id}",
|
||||||
|
"admin.shares.edit.delete.description": "정말로 이 공유를 삭제하시겠습니까?",
|
||||||
|
// END /admin/shares
|
||||||
|
// /upload
|
||||||
|
"upload.title": "업로드",
|
||||||
|
"upload.notify.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.name-and-description.title": "이름과 설명",
|
||||||
|
"upload.modal.accordion.name-and-description.name.placeholder": "이름",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "공유를 받을 사람에게 메모",
|
||||||
|
"upload.modal.accordion.email.title": "받는 사람 메일 주소",
|
||||||
|
"upload.modal.accordion.email.placeholder": "메일 주소 입력",
|
||||||
|
"upload.modal.accordion.email.invalid-email": "이메일 주소가 틀립니다",
|
||||||
|
"upload.modal.accordion.security.title": "보안 설정",
|
||||||
|
"upload.modal.accordion.security.password.label": "비밀번호로 보호",
|
||||||
|
"upload.modal.accordion.security.password.placeholder": "비밀번호 없음",
|
||||||
|
"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": "이 파일 형식의 미리보기가 지원되지 않습니다. 파일을 다운로드하여 확인하십시오.",
|
||||||
|
// 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": "이메일",
|
||||||
|
"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": "Pingvin Share를 사용할 수 있는 URL",
|
||||||
|
"admin.config.general.show-home-page": "홈 페이지 표시",
|
||||||
|
"admin.config.general.show-home-page.description": "홈 페이지를 표시할지 여부",
|
||||||
|
"admin.config.general.session-duration": "세션 기간",
|
||||||
|
"admin.config.general.session-duration.description": "사용자가 다시 로그인해야 하는 시간 (기본값: 3개월)",
|
||||||
|
"admin.config.general.logo": "로고",
|
||||||
|
"admin.config.general.logo.description": "새 이미지를 업로드하여 로고를 변경하십시오. 이미지는 PNG여야 하며 1:1 비율이어야 합니다.",
|
||||||
|
"admin.config.general.logo.placeholder": "이미지 선택",
|
||||||
|
"admin.config.email.enable-share-email-recipients": "메일 수신 허용",
|
||||||
|
"admin.config.email.enable-share-email-recipients.description": "메일이 수신자를 공유하도록 허용할지 여부. SMTP를 사용 가능으로 설정한 경우에만 이 옵션을 사용 가능으로 설정합니다.",
|
||||||
|
"admin.config.email.share-recipients-subject": "공유 제목",
|
||||||
|
"admin.config.email.share-recipients-subject.description": "공유 수신자에게 전송되는 이메일의 제목입니다.",
|
||||||
|
"admin.config.email.share-recipients-message": "수신자 메시지 공유",
|
||||||
|
"admin.config.email.share-recipients-message.description": "공유 수신자에게 보내는 메시지입니다. 사용 가능한 변수:\n {creator} - 공유 작성자의 사용자 이름\n {shareUrl} - 공유의 URL\n {desc} - 공유에 대한 설명\n {expires} - 공유 만료일\n 변수는 실제 값으로 대체됩니다.",
|
||||||
|
"admin.config.email.reverse-share-subject": "역방향 공유 제목",
|
||||||
|
"admin.config.email.reverse-share-subject.description": "누군가 당신이 공유한 역방향 공유 링크를 사용하여 공유를 생성했을 때 전송되는 이메일의 제목입니다.",
|
||||||
|
"admin.config.email.reverse-share-message": "역방향 공유 메시지",
|
||||||
|
"admin.config.email.reverse-share-message.description": "누군가 귀하의 역방향 공유 링크를 사용하여 공유를 생성하면 전송되는 메시지입니다.. {shareUrl} 은 작성자 이름 및 공유 URL로 대체됩니다.",
|
||||||
|
"admin.config.email.reset-password-subject": "비밀번호 재설정 제목",
|
||||||
|
"admin.config.email.reset-password-subject.description": "사용자가 암호 재설정을 요청할 때 전송되는 메일의 제목입니다.",
|
||||||
|
"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": "관리자가 사용자를 초대할 때 전송되는 이메일의 제목입니다.",
|
||||||
|
"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": "공유의 최대 크기 (바이트)",
|
||||||
|
"admin.config.share.zip-compression-level": "Zip 압축 레벨",
|
||||||
|
"admin.config.share.zip-compression-level.description": "파일 크기와 압축 속도 간의 균형을 맞추도록 레벨을 조정합니다. 유효한 값의 범위는 0에서 9까지이며, 0은 압축되지 않고 9는 최대 압축입니다. ",
|
||||||
|
"admin.config.share.chunk-size": "청크 크기",
|
||||||
|
"admin.config.share.chunk-size.description": "업로드할 청크 크기(바이트 단위)를 조정하여 인터넷 연결에 따라 효율성과 신뢰성의 균형을 유지합니다. 더 작은 청크는 불안정한 연결에 대한 성공률을 향상시킬 수 있고, 더 큰 청크는 안정적인 연결에 대한 업로드 속도를 높일 수 있습니다.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "공유 생성 창 자동 열기",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "사용자가 파일을 선택하면 공유 생성 창이 자동으로 나타나서 버튼을 수동으로 클릭할 필요가 없습니다.",
|
||||||
|
"admin.config.smtp.enabled": "활성화됨",
|
||||||
|
"admin.config.smtp.enabled.description": "SMTP 사용 여부 SMTP 서버의 호스트, 포트, 전자 메일, 사용자 및 암호를 입력한 경우에만 true로 설정합니다.",
|
||||||
|
"admin.config.smtp.host": "호스트",
|
||||||
|
"admin.config.smtp.host.description": "SMTP 서버의 호스트",
|
||||||
|
"admin.config.smtp.port": "포트",
|
||||||
|
"admin.config.smtp.port.description": "SMTP 서버 포트",
|
||||||
|
"admin.config.smtp.email": "이메일",
|
||||||
|
"admin.config.smtp.email.description": "전자 메일을 보낸 전자 메일 주소",
|
||||||
|
"admin.config.smtp.username": "사용자 이름",
|
||||||
|
"admin.config.smtp.username.description": "SMTP 사용자 이름, 서버 비밀번호",
|
||||||
|
"admin.config.smtp.password": "비밀번호",
|
||||||
|
"admin.config.smtp.password.description": "SMTP 서버 비밀번호",
|
||||||
|
"admin.config.smtp.button.test": "테스트 이메일 보내기",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
|
"admin.config.oauth.allow-registration": "가입 허용",
|
||||||
|
"admin.config.oauth.allow-registration.description": "사용자가 소셜 로그인을 통해 등록할 수 있도록 허용",
|
||||||
|
"admin.config.oauth.ignore-totp": "TOTP 무시",
|
||||||
|
"admin.config.oauth.ignore-totp.description": "사용자가 소셜 로그인을 사용하는 경우 TOTP를 무시할 것인지 여부",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
|
"admin.config.oauth.github-enabled": "깃허브",
|
||||||
|
"admin.config.oauth.github-enabled.description": "깃허브 로그인 사용 여부",
|
||||||
|
"admin.config.oauth.github-client-id": "GitHub 클라이언트 ID",
|
||||||
|
"admin.config.oauth.github-client-id.description": "GitHub OAuth 앱의 클라이언트 ID",
|
||||||
|
"admin.config.oauth.github-client-secret": "GitHub 클라이언트 secret",
|
||||||
|
"admin.config.oauth.github-client-secret.description": "GitHub OAuth 앱의 클라이언트 secret",
|
||||||
|
"admin.config.oauth.google-enabled": "구글",
|
||||||
|
"admin.config.oauth.google-enabled.description": "구글 로그인 활성화 여부",
|
||||||
|
"admin.config.oauth.google-client-id": "Google 클라이언트 ID",
|
||||||
|
"admin.config.oauth.google-client-id.description": "Google OAuth 앱의 클라이언트 ID",
|
||||||
|
"admin.config.oauth.google-client-secret": "Google 클라이언트 secret",
|
||||||
|
"admin.config.oauth.google-client-secret.description": "Google OAuth 앱의 클라이언트 secret",
|
||||||
|
"admin.config.oauth.microsoft-enabled": "마이크로소프트",
|
||||||
|
"admin.config.oauth.microsoft-enabled.description": "마이크로소프트 로그인 사용 여부",
|
||||||
|
"admin.config.oauth.microsoft-tenant": "마이크로소프트 테넌트",
|
||||||
|
"admin.config.oauth.microsoft-tenant.description": "Microsoft OAuth 앱의 테넌트 ID\n공통: Microsoft 개인 계정과 Microsoft Entra ID의 직장 또는 학교 계정을 모두 가진 사용자는 응용 프로그램에 로그인할 수 있습니다. 조직: Microsoft Entra ID의 직장 또는 학교 계정을 가진 사용자만 응용 프로그램에 로그인할 수 있습니다.\n소비자: 개인 마이크로소프트 계정을 가진 사용자만 애플리케이션에 로그인할 수 있습니다.\nMicrosoft Entra 테넌트의 도메인 이름 또는 GUID 형식의 테넌트 ID: 특정 Microsoft Entra 테넌트의 사용자(직장 또는 학교 계정을 가진 디렉토리 구성원 또는 개인 Microsoft 계정을 가진 디렉토리 게스트)만 응용 프로그램에 로그인할 수 있습니다.",
|
||||||
|
"admin.config.oauth.microsoft-client-id": "마이크로소프트 클라이언트 ID",
|
||||||
|
"admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth 앱의 클라이언트 ID",
|
||||||
|
"admin.config.oauth.microsoft-client-secret": "Microsoft 클라이언트 secret",
|
||||||
|
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth 앱의 클라이언트 비밀",
|
||||||
|
"admin.config.oauth.discord-enabled": "디스코드",
|
||||||
|
"admin.config.oauth.discord-enabled.description": "Discord 로그인 활성화 여부",
|
||||||
|
"admin.config.oauth.discord-limited-guild": "디스코드 제한 서버 ID",
|
||||||
|
"admin.config.oauth.discord-limited-guild.description": "특정 서버의 사용자로 로그인을 제한합니다. 사용하지 않으려면 비워 둡니다.",
|
||||||
|
"admin.config.oauth.discord-client-id": "디스코드 클라이언트 ID",
|
||||||
|
"admin.config.oauth.discord-client-id.description": "Discord OAuth 앱의 클라이언트 ID",
|
||||||
|
"admin.config.oauth.discord-client-secret": "Discord 클라이언트 secret",
|
||||||
|
"admin.config.oauth.discord-client-secret.description": "Discord OAuth 앱의 클라이언트 secret",
|
||||||
|
"admin.config.oauth.oidc-enabled": "OpenID 연결",
|
||||||
|
"admin.config.oauth.oidc-enabled.description": "OpenID Connect 로그인 사용 여부",
|
||||||
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
|
"admin.config.oauth.oidc-discovery-uri.description": "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": "OpenID Connect ID 토큰의 Username claim 입니다. 이 구성이 무엇인지 모르면 비워 둡니다.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-client-id": "OpenID Connect 클라이언트 ID",
|
||||||
|
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth 앱의 클라이언트 ID",
|
||||||
|
"admin.config.oauth.oidc-client-secret": "OpenID 클라이언트 secret",
|
||||||
|
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth 앱의 클라이언트 secret",
|
||||||
|
// 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.user_not_allowed": "로그인할 수 없습니다.",
|
||||||
|
"error.msg.cannot_get_user_info": "이 {0} 계정에서 사용자 정보를 가져올 수 없습니다",
|
||||||
|
"error.param.provider_github": "깃허브",
|
||||||
|
"error.param.provider_google": "구글",
|
||||||
|
"error.param.provider_microsoft": "마이크로소프트",
|
||||||
|
"error.param.provider_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.button.go-home": "첫 페이지",
|
||||||
|
"common.notify.copied": "당신의 링크가 클립보드에 복사되었습니다.",
|
||||||
|
"common.success": "성공",
|
||||||
|
"common.error": "에러",
|
||||||
|
"common.error.unknown": "알 수 없는 오류가 발생했습니다.",
|
||||||
|
"common.error.invalid-email": "이메일 주소가 틀립니다",
|
||||||
|
"common.error.too-short": "최소 {length} 자 이상이어야 합니다",
|
||||||
|
"common.error.too-long": "최대 {length} 자 까지 입력가능합니다.",
|
||||||
|
"common.error.exact-length": "{length} 자 이어야 합니다.",
|
||||||
|
"common.error.invalid-number": "숫자만 가능합니다.",
|
||||||
|
"common.error.field-required": "이 필드는 필수입니다"
|
||||||
|
};
|
||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Tweestapsverificatie vereist",
|
"signIn.notify.totp-required.title": "Tweestapsverificatie vereist",
|
||||||
"signIn.notify.totp-required.description": "Voer uw tweestapsverificatiecode in",
|
"signIn.notify.totp-required.description": "Voer uw tweestapsverificatiecode in",
|
||||||
"signIn.oauth.or": "OF",
|
"signIn.oauth.or": "OF",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -57,7 +58,7 @@ export default {
|
|||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "Wachtwoord vergeten?",
|
"resetPassword.title": "Wachtwoord vergeten?",
|
||||||
"resetPassword.description": "Voer uw e-mailadres in om uw wachtwoord opnieuw in te stellen.",
|
"resetPassword.description": "Voer uw e-mailadres in om uw wachtwoord opnieuw in te stellen.",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "Er is een bericht verzonden met een link om uw wachtwoord te resetten als het e-mail adres bestaat.",
|
||||||
"resetPassword.button.back": "Terug naar login pagina",
|
"resetPassword.button.back": "Terug naar login pagina",
|
||||||
"resetPassword.text.resetPassword": "Wachtwoord opnieuw instellen",
|
"resetPassword.text.resetPassword": "Wachtwoord opnieuw instellen",
|
||||||
"resetPassword.text.enterNewPassword": "Voer uw nieuwe wachtwoord in",
|
"resetPassword.text.enterNewPassword": "Voer uw nieuwe wachtwoord in",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Stap 2: Valideer uw code",
|
"account.modal.totp.step2": "Stap 2: Valideer uw code",
|
||||||
"account.modal.totp.enterManually": "Handmatig invoeren",
|
"account.modal.totp.enterManually": "Handmatig invoeren",
|
||||||
"account.modal.totp.code": "Code",
|
"account.modal.totp.code": "Code",
|
||||||
"account.modal.totp.clickToCopy": "Klik om te kopiëren",
|
"common.button.clickToCopy": "Klik om te kopiëren",
|
||||||
"account.modal.totp.verify": "Verifiëren",
|
"account.modal.totp.verify": "Verifiëren",
|
||||||
"account.notify.totp.disable": "TOTP succesvol uitgeschakeld",
|
"account.notify.totp.disable": "TOTP succesvol uitgeschakeld",
|
||||||
"account.notify.totp.enable": "TOTP succesvol ingeschakeld",
|
"account.notify.totp.enable": "TOTP succesvol ingeschakeld",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Instellingen",
|
"admin.title": "Instellingen",
|
||||||
"admin.button.users": "Gebruikers beheer",
|
"admin.button.users": "Gebruikers beheer",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Configuratie",
|
"admin.button.config": "Configuratie",
|
||||||
"admin.version": "Versie",
|
"admin.version": "Versie",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Beheerdersrechten",
|
"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
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Auteur",
|
||||||
|
"admin.shares.table.visitors": "Bezoekers",
|
||||||
|
"admin.shares.table.expires": "Vervalt op",
|
||||||
|
"admin.shares.edit.delete.title": "Verwijder share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Weet u zeker dat u deze share wilt verwijderen?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Uploaden",
|
"upload.title": "Uploaden",
|
||||||
"upload.notify.generic-error": "Er is een fout opgetreden tijdens het voltooien van uw share.",
|
"upload.notify.generic-error": "Er is een fout opgetreden tijdens het voltooien van uw share.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Maanden",
|
"upload.modal.expires.month-plural": "Maanden",
|
||||||
"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.name-and-description.title": "Naam en beschrijving",
|
||||||
"upload.modal.accordion.description.placeholder": "Opmerking voor de ontvangers van deze share",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Naam",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "E-mail van de ontvangers",
|
"upload.modal.accordion.email.title": "E-mail van de ontvangers",
|
||||||
"upload.modal.accordion.email.placeholder": "Voer e-mail ontvangers in",
|
"upload.modal.accordion.email.placeholder": "Voer e-mail ontvangers in",
|
||||||
"upload.modal.accordion.email.invalid-email": "Ongeldig e-mailadres",
|
"upload.modal.accordion.email.invalid-email": "Ongeldig e-mailadres",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "De URL waar Pingvin Share bereikbaar is",
|
"admin.config.general.app-url.description": "De URL waar Pingvin Share bereikbaar is",
|
||||||
"admin.config.general.show-home-page": "Toon startpagina",
|
"admin.config.general.show-home-page": "Toon startpagina",
|
||||||
"admin.config.general.show-home-page.description": "Toon of verberg de home pagina",
|
"admin.config.general.show-home-page.description": "Toon of verberg de home pagina",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Verander uw logo door een nieuwe afbeelding te uploaden. De afbeelding moet PNG zijn en het formaat moet 1:1 hebben.",
|
"admin.config.general.logo.description": "Verander uw logo door een nieuwe afbeelding te uploaden. De afbeelding moet PNG zijn en het formaat moet 1:1 hebben.",
|
||||||
"admin.config.general.logo.placeholder": "Afbeelding kiezen",
|
"admin.config.general.logo.placeholder": "Afbeelding kiezen",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "Maximale share grootte in bytes",
|
"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.share.chunk-size": "Chunk size",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Inschakelen",
|
"admin.config.smtp.enabled": "Inschakelen",
|
||||||
"admin.config.smtp.enabled.description": "Of SMTP is ingeschakeld. Stel dit alleen in op true als u de host hebt ingevoerd, poort, e-mail, gebruiker en wachtwoord van uw SMTP-server.",
|
"admin.config.smtp.enabled.description": "Of SMTP is ingeschakeld. Stel dit alleen in op true als u de host hebt ingevoerd, poort, e-mail, gebruiker en wachtwoord van uw SMTP-server.",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.smtp.host": "Host",
|
||||||
@@ -327,10 +345,14 @@ export default {
|
|||||||
"admin.config.smtp.password": "Wachtwoord",
|
"admin.config.smtp.password": "Wachtwoord",
|
||||||
"admin.config.smtp.password.description": "Wachtwoord van de SMTP-server",
|
"admin.config.smtp.password.description": "Wachtwoord van de SMTP-server",
|
||||||
"admin.config.smtp.button.test": "Teste-mail verzenden",
|
"admin.config.smtp.button.test": "Teste-mail verzenden",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Sta registratie toe",
|
"admin.config.oauth.allow-registration": "Sta registratie toe",
|
||||||
"admin.config.oauth.allow-registration.description": "Gebruikers toestaan zich te registreren via sociale login",
|
"admin.config.oauth.allow-registration.description": "Gebruikers toestaan zich te registreren via sociale login",
|
||||||
"admin.config.oauth.ignore-totp": "TOTP negeren",
|
"admin.config.oauth.ignore-totp": "TOTP negeren",
|
||||||
"admin.config.oauth.ignore-totp.description": "TOTP negeren wanneer gebruiker sociale login gebruikt",
|
"admin.config.oauth.ignore-totp.description": "TOTP negeren wanneer gebruiker sociale login gebruikt",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Ofdat GitHub login is ingeschakeld",
|
"admin.config.oauth.github-enabled.description": "Ofdat GitHub login is ingeschakeld",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI van de OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI van de OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Gebruikersnaam claim in OpenID Connect-ID-token. Laat het leeg als u niet weet wat deze configuratie is.",
|
"admin.config.oauth.oidc-username-claim.description": "Gebruikersnaam claim in OpenID Connect-ID-token. Laat het leeg als u niet weet wat deze configuratie is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "Client-ID OpenID Connect",
|
"admin.config.oauth.oidc-client-id": "Client-ID OpenID Connect",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client-ID van de OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-client-id.description": "Client-ID van de OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect client secret",
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Dit {0} account is al gekoppeld aan een ander account.",
|
"error.msg.already_linked": "Dit {0} account is al gekoppeld aan een ander account.",
|
||||||
"error.msg.not_linked": "Dit {0} account is nog aan geen enkel account gekoppeld.",
|
"error.msg.not_linked": "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.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.user_not_allowed": "U heeft geen toestemming om in te loggen.",
|
||||||
"error.msg.cannot_get_user_info": "Kan uw gebruikersgegevens van dit {0} account niet ophalen.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Wymagane jest uwierzytelnianie dwuetapowe",
|
"signIn.notify.totp-required.title": "Wymagane jest uwierzytelnianie dwuetapowe",
|
||||||
"signIn.notify.totp-required.description": "Wprowadź kod uwierzytelniania dwuetapowego",
|
"signIn.notify.totp-required.description": "Wprowadź kod uwierzytelniania dwuetapowego",
|
||||||
"signIn.oauth.or": "LUB",
|
"signIn.oauth.or": "LUB",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Krok 2: Potwierdź swój kod",
|
"account.modal.totp.step2": "Krok 2: Potwierdź swój kod",
|
||||||
"account.modal.totp.enterManually": "Wpisz ręcznie",
|
"account.modal.totp.enterManually": "Wpisz ręcznie",
|
||||||
"account.modal.totp.code": "Kod",
|
"account.modal.totp.code": "Kod",
|
||||||
"account.modal.totp.clickToCopy": "Kliknij, aby skopiować",
|
"common.button.clickToCopy": "Kliknij, aby skopiować",
|
||||||
"account.modal.totp.verify": "Weryfikuj",
|
"account.modal.totp.verify": "Weryfikuj",
|
||||||
"account.notify.totp.disable": "%s wyłączono pomyślnie",
|
"account.notify.totp.disable": "%s wyłączono pomyślnie",
|
||||||
"account.notify.totp.enable": "TOTP włączono pomyślnie",
|
"account.notify.totp.enable": "TOTP włączono pomyślnie",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administracja",
|
"admin.title": "Administracja",
|
||||||
"admin.button.users": "Zarządzanie użytkownikami",
|
"admin.button.users": "Zarządzanie użytkownikami",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Konfiguracja",
|
"admin.button.config": "Konfiguracja",
|
||||||
"admin.version": "Wersja",
|
"admin.version": "Wersja",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Uprawnienia administratora",
|
"admin.users.modal.create.admin": "Uprawnienia administratora",
|
||||||
"admin.users.modal.create.admin.description": "Jeśli zaznaczone, użytkownik będzie miał dostęp do panelu administratora.",
|
"admin.users.modal.create.admin.description": "Jeśli zaznaczone, użytkownik będzie miał dostęp do panelu administratora.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Prześlij",
|
"upload.title": "Prześlij",
|
||||||
"upload.notify.generic-error": "Wystąpił błąd podczas zakończenia tworzenia udziału.",
|
"upload.notify.generic-error": "Wystąpił błąd podczas zakończenia tworzenia udziału.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Miesiące/ęcy",
|
"upload.modal.expires.month-plural": "Miesiące/ęcy",
|
||||||
"upload.modal.expires.year-singular": "Rok",
|
"upload.modal.expires.year-singular": "Rok",
|
||||||
"upload.modal.expires.year-plural": "Lat/a",
|
"upload.modal.expires.year-plural": "Lat/a",
|
||||||
"upload.modal.accordion.description.title": "Opis",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "Notatka dla odbiorców tego udziału",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "Odbiorcy wiadomości e-mail",
|
"upload.modal.accordion.email.title": "Odbiorcy wiadomości e-mail",
|
||||||
"upload.modal.accordion.email.placeholder": "Wprowadź adresatów wiadomości e-mail",
|
"upload.modal.accordion.email.placeholder": "Wprowadź adresatów wiadomości e-mail",
|
||||||
"upload.modal.accordion.email.invalid-email": "Adres e-mail jest nieprawidłowy",
|
"upload.modal.accordion.email.invalid-email": "Adres e-mail jest nieprawidłowy",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Pod którym adresem URL Pingvin Share jest dostępny",
|
"admin.config.general.app-url.description": "Pod którym adresem URL Pingvin Share jest dostępny",
|
||||||
"admin.config.general.show-home-page": "Pokaż stronę główną",
|
"admin.config.general.show-home-page": "Pokaż stronę główną",
|
||||||
"admin.config.general.show-home-page.description": "Czy wyświetlać stronę główną",
|
"admin.config.general.show-home-page.description": "Czy wyświetlać stronę główną",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Zmień logo, przesyłając nowy obraz. Obraz musi być plikiem PNG i mieć proporcje 1:1.",
|
"admin.config.general.logo.description": "Zmień logo, przesyłając nowy obraz. Obraz musi być plikiem PNG i mieć proporcje 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Wybierz obraz",
|
"admin.config.general.logo.placeholder": "Wybierz obraz",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"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",
|
||||||
"admin.config.share.zip-compression-level.description": "Dostosuj poziom do równowagi między rozmiarem pliku a szybkością kompresji. Prawidłowe wartości mieszczą się w zakresie od 0 do 9, przy czym 0 to brak kompresji a 9 maksymalną kompresją. ",
|
"admin.config.share.zip-compression-level.description": "Dostosuj poziom do równowagi między rozmiarem pliku a szybkością kompresji. Prawidłowe wartości mieszczą się w zakresie od 0 do 9, przy czym 0 to brak kompresji a 9 maksymalną kompresją. ",
|
||||||
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Włączony",
|
"admin.config.smtp.enabled": "Włączony",
|
||||||
"admin.config.smtp.enabled.description": "Czy SMTP ma zostać włączony. Ustaw to, tylko jeśli wprowadziłeś host, port, e-mail, nazwę użytkownika i hasło serwera SMTP.",
|
"admin.config.smtp.enabled.description": "Czy SMTP ma zostać włączony. Ustaw to, tylko jeśli wprowadziłeś host, port, e-mail, nazwę użytkownika i hasło serwera SMTP.",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.smtp.host": "Host",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Zezwól na rejestrację",
|
"admin.config.oauth.allow-registration": "Zezwól na rejestrację",
|
||||||
"admin.config.oauth.allow-registration.description": "Zezwalaj użytkownikom na rejestrację za pomocą konta społecznościowego",
|
"admin.config.oauth.allow-registration.description": "Zezwalaj użytkownikom na rejestrację za pomocą konta społecznościowego",
|
||||||
"admin.config.oauth.ignore-totp": "Ignoruj TOTP",
|
"admin.config.oauth.ignore-totp": "Ignoruj TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Czy zignorować TOTP, kiedy użytkownik loguje się za pomocą konta społecznościowego",
|
"admin.config.oauth.ignore-totp.description": "Czy zignorować TOTP, kiedy użytkownik loguje się za pomocą konta społecznościowego",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Czy login na GitHub jest włączony",
|
"admin.config.oauth.github-enabled.description": "Czy login na GitHub jest włączony",
|
||||||
"admin.config.oauth.github-client-id": "ID klienta GitHub",
|
"admin.config.oauth.github-client-id": "ID klienta GitHub",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
|
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim": "Żądanie nazwy użytkownika OpenID Connect",
|
"admin.config.oauth.oidc-username-claim": "Żądanie nazwy użytkownika OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Żądanie nazwy użytkownika w tokenie identyfikatora OpenID Connect. Jeśli nie wiesz, czym jest ta konfiguracja, pozostaw pustą.",
|
"admin.config.oauth.oidc-username-claim.description": "Żądanie nazwy użytkownika w tokenie identyfikatora OpenID Connect. Jeśli nie wiesz, czym jest ta konfiguracja, pozostaw pustą.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "Identyfikator klienta OpenID Connect",
|
"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-id.description": "Identyfikator klienta OAuth aplikacji OpenID Connect",
|
||||||
"admin.config.oauth.oidc-client-secret": "Sekret klienta OpenID Connect",
|
"admin.config.oauth.oidc-client-secret": "Sekret klienta OpenID Connect",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "To konto {0} zostało już połączone z innym kontem.",
|
"error.msg.already_linked": "To konto {0} zostało już połączone z innym kontem.",
|
||||||
"error.msg.not_linked": "To konto {0} nie zostało jeszcze połączone z żadnym kontem.",
|
"error.msg.not_linked": "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.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.user_not_allowed": "Nie możesz się zalogować.",
|
||||||
"error.msg.cannot_get_user_info": "Nie można uzyskać informacji o użytkowniku z tego konta {0}.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"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": "OU",
|
"signIn.oauth.or": "OU",
|
||||||
|
"signIn.oauth.signInWith": "Iniciar sessão com",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Passo 2: Valide o seu código",
|
"account.modal.totp.step2": "Passo 2: Valide o seu código",
|
||||||
"account.modal.totp.enterManually": "Inserir manualmente",
|
"account.modal.totp.enterManually": "Inserir manualmente",
|
||||||
"account.modal.totp.code": "Código",
|
"account.modal.totp.code": "Código",
|
||||||
"account.modal.totp.clickToCopy": "Clique para copiar",
|
"common.button.clickToCopy": "Clique para copiar",
|
||||||
"account.modal.totp.verify": "Verificar",
|
"account.modal.totp.verify": "Verificar",
|
||||||
"account.notify.totp.disable": "TOTP desabilitado com sucesso",
|
"account.notify.totp.disable": "TOTP desabilitado com sucesso",
|
||||||
"account.notify.totp.enable": "TOTP habilitado com sucesso",
|
"account.notify.totp.enable": "TOTP habilitado com sucesso",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administração",
|
"admin.title": "Administração",
|
||||||
"admin.button.users": "Gerenciamento de usuários",
|
"admin.button.users": "Gerenciamento de usuários",
|
||||||
|
"admin.button.shares": "Gerenciamento de compartilhamentos",
|
||||||
"admin.button.config": "Configuração",
|
"admin.button.config": "Configuração",
|
||||||
"admin.version": "Versão",
|
"admin.version": "Versão",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Privilégios de administrador",
|
"admin.users.modal.create.admin": "Privilégios de administrador",
|
||||||
"admin.users.modal.create.admin.description": "Se marcado, o usuário poderá acessar o painel de administração.",
|
"admin.users.modal.create.admin.description": "Se marcado, o usuário poderá acessar o painel de administração.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Gerenciamento de compartilhamentos",
|
||||||
|
"admin.shares.table.id": "ID do Compartilhamento",
|
||||||
|
"admin.shares.table.username": "Criador",
|
||||||
|
"admin.shares.table.visitors": "Visitantes",
|
||||||
|
"admin.shares.table.expires": "Expira em",
|
||||||
|
"admin.shares.edit.delete.title": "Excluir compartilhamento {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Tem certeza que deseja excluir este compartilhamento?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Carregar",
|
"upload.title": "Carregar",
|
||||||
"upload.notify.generic-error": "Ocorreu um erro ao terminar seu compartilhamento.",
|
"upload.notify.generic-error": "Ocorreu um erro ao terminar seu compartilhamento.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Meses",
|
"upload.modal.expires.month-plural": "Meses",
|
||||||
"upload.modal.expires.year-singular": "Ano",
|
"upload.modal.expires.year-singular": "Ano",
|
||||||
"upload.modal.expires.year-plural": "Anos",
|
"upload.modal.expires.year-plural": "Anos",
|
||||||
"upload.modal.accordion.description.title": "Descrição",
|
"upload.modal.accordion.name-and-description.title": "Nome e descrição",
|
||||||
"upload.modal.accordion.description.placeholder": "Nota para os destinatários deste compartilhamento",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Nome",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Nota para os destinatários deste compartilhamento",
|
||||||
"upload.modal.accordion.email.title": "Destinatários de e-mail",
|
"upload.modal.accordion.email.title": "Destinatários de e-mail",
|
||||||
"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",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Em qual URL o Pingvin Share está disponível",
|
"admin.config.general.app-url.description": "Em qual URL o Pingvin Share está disponível",
|
||||||
"admin.config.general.show-home-page": "Mostrar a página inicial",
|
"admin.config.general.show-home-page": "Mostrar a página inicial",
|
||||||
"admin.config.general.show-home-page.description": "Mostrar ou não a página inicial",
|
"admin.config.general.show-home-page.description": "Mostrar ou não a página inicial",
|
||||||
|
"admin.config.general.session-duration": "Duração de sessão",
|
||||||
|
"admin.config.general.session-duration.description": "Tempo em horas após o qual um usuário deve iniciar a sessão novamente (padrão: 3 meses).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "Logo",
|
||||||
"admin.config.general.logo.description": "Alterar o seu logo carregando uma nova imagem. A imagem deve ser PNG e deve ter o formato 1:1.",
|
"admin.config.general.logo.description": "Alterar o seu logo carregando uma nova imagem. A imagem deve ser PNG e deve ter o formato 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Escolhe uma imagem",
|
"admin.config.general.logo.placeholder": "Escolhe uma imagem",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"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",
|
||||||
"admin.config.share.zip-compression-level.description": "Ajuste o nível para equilibrar entre o tamanho do arquivo e a velocidade de compressão. Valores válidos vão de 0 a 9, com 0 sendo sem compressão e 9 sendo compressão máxima. ",
|
"admin.config.share.zip-compression-level.description": "Ajuste o nível para equilibrar entre o tamanho do arquivo e a velocidade de compressão. Valores válidos vão de 0 a 9, com 0 sendo sem compressão e 9 sendo compressão máxima. ",
|
||||||
|
"admin.config.share.chunk-size": "Tamanho do pedaço",
|
||||||
|
"admin.config.share.chunk-size.description": "Ajuste o tamanho do pedaço (em bytes) para seus uploads equilibrarem eficiência e confiabilidade de acordo com sua conexão com a internet. Pedaços menores podem aumentar as taxas de sucesso para conexões instáveis, enquanto partes maiores aceleram uploads para conexões estáveis.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Abertura automática do modal de criação de compartilhamento",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "O modal de criação de compartilhamento aparece automaticamente quando um usuário seleciona arquivos, eliminando a necessidade de clicar manualmente no botão.",
|
||||||
"admin.config.smtp.enabled": "Ativado",
|
"admin.config.smtp.enabled": "Ativado",
|
||||||
"admin.config.smtp.enabled.description": "Se o SMTP está habilitado. Apenas defina como verdadeiro se você digitou o servidor, porta, e-mail, usuário e senha do seu servidor SMTP.",
|
"admin.config.smtp.enabled.description": "Se o SMTP está habilitado. Apenas defina como verdadeiro se você digitou o servidor, porta, e-mail, usuário e senha do seu servidor SMTP.",
|
||||||
"admin.config.smtp.host": "Servidor",
|
"admin.config.smtp.host": "Servidor",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "Confiar em certificados de servidor SMTP não autorizados",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Apenas defina isso como verdadeiro se você precisar confiar nos certificados auto-assinados.",
|
||||||
"admin.config.oauth.allow-registration": "Permitir registro",
|
"admin.config.oauth.allow-registration": "Permitir registro",
|
||||||
"admin.config.oauth.allow-registration.description": "Permitir que os usuários se registrem através do login de redes sociais",
|
"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": "Ignorar TOTP",
|
"admin.config.oauth.ignore-totp": "Ignorar TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Ignorar o TOTP quando usuário usando login social",
|
"admin.config.oauth.ignore-totp.description": "Ignorar o TOTP quando usuário usando login social",
|
||||||
|
"admin.config.oauth.disable-password": "Desativar login por senha",
|
||||||
|
"admin.config.oauth.disable-password.description": "Se deseja desativar o login por senha\nCertifique-se de que um provedor OAuth está configurado corretamente antes de ativar essa configuração para evitar ser bloqueado.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Se o login GitHub está habilitado",
|
"admin.config.oauth.github-enabled.description": "Se o login GitHub está habilitado",
|
||||||
"admin.config.oauth.github-client-id": "Client ID do GitHub",
|
"admin.config.oauth.github-client-id": "Client ID do GitHub",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI da descoberta do aplicativo OpenID Connect OAuth",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI da descoberta do aplicativo OpenID Connect OAuth",
|
||||||
"admin.config.oauth.oidc-username-claim": "Reivindicação de nome de usuário OpenID Connect",
|
"admin.config.oauth.oidc-username-claim": "Reivindicação de nome de usuário OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Nome de usuário no token de ID OpenID Connect. Deixe em branco se você não sabe o que é esta configuração.",
|
"admin.config.oauth.oidc-username-claim.description": "Nome de usuário no token de ID OpenID Connect. Deixe em branco se você não sabe o que é esta configuração.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Caminho para as funções no token OpenID Connect",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Deve ser um caminho JMES válido, fazendo referência a uma matriz de funções. " + "Gerenciar direitos de acesso usando as funções OpenID Connect só é recomendado se nenhum outro provedor de identidade for configurado e o login por senha for desativado. " + "Deixe em branco se você não sabe o que é esta configuração.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "Função OpenID Connect para acesso geral",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Função necessária para acesso geral. Deve estar presente nas funções de um usuário para que ele faça o login. " + "Deixe em branco se você não sabe o que é esta configuração.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "Função OpenID Connect para acesso de administrador",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Função necessária para acesso administrativo. Deve estar presente nos papéis de um usuário para ele acessar o painel de administração. " + "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": "ID do cliente OpenID Connect",
|
||||||
"admin.config.oauth.oidc-client-id.description": "ID do cliente do aplicativo OpenID OAuth",
|
"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": "Segredo do cliente OpenID Connect",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Esta conta {0} já está vinculada a outra conta.",
|
"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.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.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.user_not_allowed": "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.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",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Требуется двухфакторная аутентификация",
|
"signIn.notify.totp-required.title": "Требуется двухфакторная аутентификация",
|
||||||
"signIn.notify.totp-required.description": "Пожалуйста, введите код Вашей 2-х факторной аутентификации",
|
"signIn.notify.totp-required.description": "Пожалуйста, введите код Вашей 2-х факторной аутентификации",
|
||||||
"signIn.oauth.or": "ИЛИ",
|
"signIn.oauth.or": "ИЛИ",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Шаг 2: Проверка кода",
|
"account.modal.totp.step2": "Шаг 2: Проверка кода",
|
||||||
"account.modal.totp.enterManually": "Ввести вручную",
|
"account.modal.totp.enterManually": "Ввести вручную",
|
||||||
"account.modal.totp.code": "Код",
|
"account.modal.totp.code": "Код",
|
||||||
"account.modal.totp.clickToCopy": "Нажмите, чтобы скопировать",
|
"common.button.clickToCopy": "Нажмите, чтобы скопировать",
|
||||||
"account.modal.totp.verify": "Подтвердить",
|
"account.modal.totp.verify": "Подтвердить",
|
||||||
"account.notify.totp.disable": "TOTP успешно отключен",
|
"account.notify.totp.disable": "TOTP успешно отключен",
|
||||||
"account.notify.totp.enable": "TOTP успешно включен",
|
"account.notify.totp.enable": "TOTP успешно включен",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Администрирование",
|
"admin.title": "Администрирование",
|
||||||
"admin.button.users": "Управление пользователями",
|
"admin.button.users": "Управление пользователями",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Конфигурация",
|
"admin.button.config": "Конфигурация",
|
||||||
"admin.version": "Версия",
|
"admin.version": "Версия",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Права администратора",
|
"admin.users.modal.create.admin": "Права администратора",
|
||||||
"admin.users.modal.create.admin.description": "Если отмечено, пользователь будет иметь доступ к панели администратора.",
|
"admin.users.modal.create.admin.description": "Если отмечено, пользователь будет иметь доступ к панели администратора.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Загрузить",
|
"upload.title": "Загрузить",
|
||||||
"upload.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.",
|
"upload.notify.generic-error": "Произошла ошибка при завершении вашей загрузки.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Месяца(-ев)",
|
"upload.modal.expires.month-plural": "Месяца(-ев)",
|
||||||
"upload.modal.expires.year-singular": "Год",
|
"upload.modal.expires.year-singular": "Год",
|
||||||
"upload.modal.expires.year-plural": "Года (лет)",
|
"upload.modal.expires.year-plural": "Года (лет)",
|
||||||
"upload.modal.accordion.description.title": "Описание",
|
"upload.modal.accordion.name-and-description.title": "Имя и описание",
|
||||||
"upload.modal.accordion.description.placeholder": "Примечание для получателей этой загрузки",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Имя",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "Получатели письма",
|
"upload.modal.accordion.email.title": "Получатели письма",
|
||||||
"upload.modal.accordion.email.placeholder": "Получатели e-mail",
|
"upload.modal.accordion.email.placeholder": "Получатели e-mail",
|
||||||
"upload.modal.accordion.email.invalid-email": "Недопустимый адрес электронной почты",
|
"upload.modal.accordion.email.invalid-email": "Недопустимый адрес электронной почты",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Адрес на котором доступен Pingvin Share",
|
"admin.config.general.app-url.description": "Адрес на котором доступен Pingvin Share",
|
||||||
"admin.config.general.show-home-page": "Показывать домашнюю страницу",
|
"admin.config.general.show-home-page": "Показывать домашнюю страницу",
|
||||||
"admin.config.general.show-home-page.description": "Показывать ли домашнюю страницу или нет",
|
"admin.config.general.show-home-page.description": "Показывать ли домашнюю страницу или нет",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Логотип",
|
"admin.config.general.logo": "Логотип",
|
||||||
"admin.config.general.logo.description": "Измените свой логотип, загрузив новое изображение. Изображение должно быть PNG и должно иметь формат 1:1.",
|
"admin.config.general.logo.description": "Измените свой логотип, загрузив новое изображение. Изображение должно быть PNG и должно иметь формат 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Выберите изображение",
|
"admin.config.general.logo.placeholder": "Выберите изображение",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "Максимальный размер файла в байтах",
|
"admin.config.share.max-size.description": "Максимальный размер файла в байтах",
|
||||||
"admin.config.share.zip-compression-level": "Уровень сжатия Zip",
|
"admin.config.share.zip-compression-level": "Уровень сжатия Zip",
|
||||||
"admin.config.share.zip-compression-level.description": "Регулировка уровня баланса между размером файла и скоростью сжатия. Допустимые значения от 0 до 9, с 0 без сжатия, а 9 - максимальное сжатие. ",
|
"admin.config.share.zip-compression-level.description": "Регулировка уровня баланса между размером файла и скоростью сжатия. Допустимые значения от 0 до 9, с 0 без сжатия, а 9 - максимальное сжатие. ",
|
||||||
|
"admin.config.share.chunk-size": "Размер чанка",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Включено",
|
"admin.config.smtp.enabled": "Включено",
|
||||||
"admin.config.smtp.enabled.description": "Включено ли SMTP. Установите значение true только если вы ввели хост, порт, email, пользователь и пароль вашего SMTP-сервера.",
|
"admin.config.smtp.enabled.description": "Включено ли SMTP. Установите значение true только если вы ввели хост, порт, email, пользователь и пароль вашего SMTP-сервера.",
|
||||||
"admin.config.smtp.host": "Хост",
|
"admin.config.smtp.host": "Хост",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Разрешить регистрацию",
|
"admin.config.oauth.allow-registration": "Разрешить регистрацию",
|
||||||
"admin.config.oauth.allow-registration.description": "Разрешить пользователям регистрироваться используя учетные записи социальных сетей",
|
"admin.config.oauth.allow-registration.description": "Разрешить пользователям регистрироваться используя учетные записи социальных сетей",
|
||||||
"admin.config.oauth.ignore-totp": "Игнорировать TOTP",
|
"admin.config.oauth.ignore-totp": "Игнорировать TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Игнорировать TOTP при использовании социальной авторизации",
|
"admin.config.oauth.ignore-totp.description": "Игнорировать TOTP при использовании социальной авторизации",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Включен ли логин на GitHub",
|
"admin.config.oauth.github-enabled.description": "Включен ли логин на GitHub",
|
||||||
"admin.config.oauth.github-client-id": "ID клиента GitHub",
|
"admin.config.oauth.github-client-id": "ID клиента GitHub",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect 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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Эта учетная запись {0} уже привязана к другому аккаунту.",
|
"error.msg.already_linked": "Эта учетная запись {0} уже привязана к другому аккаунту.",
|
||||||
"error.msg.not_linked": "Эта учетная запись {0} ещё не привязана ни к одному аккаунту.",
|
"error.msg.not_linked": "Эта учетная запись {0} ещё не привязана ни к одному аккаунту.",
|
||||||
"error.msg.unverified_account": "Эта учетная запись {0} не подтверждена, повторите попытку после подтверждения.",
|
"error.msg.unverified_account": "Эта учетная запись {0} не подтверждена, повторите попытку после подтверждения.",
|
||||||
"error.msg.discord_guild_permission_denied": "У вас нет разрешения на вход.",
|
"error.msg.user_not_allowed": "У вас нет разрешения на вход.",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
@@ -407,7 +435,7 @@ export default {
|
|||||||
"common.text.navigate-to-link": "Go to the 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.button.go-home": "Go home",
|
"common.button.go-home": "Домой",
|
||||||
"common.notify.copied": "Ваша ссылка скопирована в буфер обмена",
|
"common.notify.copied": "Ваша ссылка скопирована в буфер обмена",
|
||||||
"common.success": "Успешно",
|
"common.success": "Успешно",
|
||||||
"common.error": "Ошибочка",
|
"common.error": "Ошибочка",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Zahtevana je dvofaktorska avtentikacija",
|
"signIn.notify.totp-required.title": "Zahtevana je dvofaktorska avtentikacija",
|
||||||
"signIn.notify.totp-required.description": "Prosim vnesite vašo kodo dvofaktorske avtentikacije",
|
"signIn.notify.totp-required.description": "Prosim vnesite vašo kodo dvofaktorske avtentikacije",
|
||||||
"signIn.oauth.or": "ALI",
|
"signIn.oauth.or": "ALI",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -57,7 +58,7 @@ export default {
|
|||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "Ste pozabili svoje geslo?",
|
"resetPassword.title": "Ste pozabili svoje geslo?",
|
||||||
"resetPassword.description": "Vnesite svoj e-poštni naslov za ponastavitev gesla.",
|
"resetPassword.description": "Vnesite svoj e-poštni naslov za ponastavitev gesla.",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "Sporočilo s povezavo za ponastavitev vašega gesla je bilo poslano, če vaš e-poštni naslov obstaja.",
|
||||||
"resetPassword.button.back": "Nazaj na stran za prijavo",
|
"resetPassword.button.back": "Nazaj na stran za prijavo",
|
||||||
"resetPassword.text.resetPassword": "Ponastavi geslo",
|
"resetPassword.text.resetPassword": "Ponastavi geslo",
|
||||||
"resetPassword.text.enterNewPassword": "Vnesite novo geslo",
|
"resetPassword.text.enterNewPassword": "Vnesite novo geslo",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "2. Korak: Potrdite svojo kodo",
|
"account.modal.totp.step2": "2. Korak: Potrdite svojo kodo",
|
||||||
"account.modal.totp.enterManually": "Vnesite ročno",
|
"account.modal.totp.enterManually": "Vnesite ročno",
|
||||||
"account.modal.totp.code": "Koda",
|
"account.modal.totp.code": "Koda",
|
||||||
"account.modal.totp.clickToCopy": "Kliknite za kopiranje",
|
"common.button.clickToCopy": "Kliknite za kopiranje",
|
||||||
"account.modal.totp.verify": "Preveri",
|
"account.modal.totp.verify": "Preveri",
|
||||||
"account.notify.totp.disable": "TOTP je uspešno onemogočen",
|
"account.notify.totp.disable": "TOTP je uspešno onemogočen",
|
||||||
"account.notify.totp.enable": "TOTP je uspešno omogočen",
|
"account.notify.totp.enable": "TOTP je uspešno omogočen",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administracija",
|
"admin.title": "Administracija",
|
||||||
"admin.button.users": "Upravljanje uporabnikov",
|
"admin.button.users": "Upravljanje uporabnikov",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Nastavitve",
|
"admin.button.config": "Nastavitve",
|
||||||
"admin.version": "Različica",
|
"admin.version": "Različica",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Administratorski privilegiji",
|
"admin.users.modal.create.admin": "Administratorski privilegiji",
|
||||||
"admin.users.modal.create.admin.description": "Če je omogočeno, bo lahko porabnik dostopal do administratorskega vmesnika.",
|
"admin.users.modal.create.admin.description": "Če je omogočeno, bo lahko porabnik dostopal do administratorskega vmesnika.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Naložite",
|
"upload.title": "Naložite",
|
||||||
"upload.notify.generic-error": "Prišlo je do napake pri ustvarjanju vašega deljenja.",
|
"upload.notify.generic-error": "Prišlo je do napake pri ustvarjanju vašega deljenja.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Meseci",
|
"upload.modal.expires.month-plural": "Meseci",
|
||||||
"upload.modal.expires.year-singular": "Leto",
|
"upload.modal.expires.year-singular": "Leto",
|
||||||
"upload.modal.expires.year-plural": "Leta",
|
"upload.modal.expires.year-plural": "Leta",
|
||||||
"upload.modal.accordion.description.title": "Opis",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "Sporočilo za prejemnika te delitve",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "Prejemnik e-pošte",
|
"upload.modal.accordion.email.title": "Prejemnik e-pošte",
|
||||||
"upload.modal.accordion.email.placeholder": "Vnesite prejemnika 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.email.invalid-email": "Neveljaven e-poštni naslov",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Na katerem URL-ju je dostopen Pingvin Share",
|
"admin.config.general.app-url.description": "Na katerem URL-ju je dostopen Pingvin Share",
|
||||||
"admin.config.general.show-home-page": "Prikaži domačo stran",
|
"admin.config.general.show-home-page": "Prikaži domačo stran",
|
||||||
"admin.config.general.show-home-page.description": "Ali prikazati domačo stran",
|
"admin.config.general.show-home-page.description": "Ali prikazati domačo stran",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logotip",
|
"admin.config.general.logo": "Logotip",
|
||||||
"admin.config.general.logo.description": "Naložite novo sliko, da spremenite logotip. Datoteka mora biti tipa PNG in imeti razmerje 1:1.",
|
"admin.config.general.logo.description": "Naložite novo sliko, da spremenite logotip. Datoteka mora biti tipa PNG in imeti razmerje 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Izberite sliko",
|
"admin.config.general.logo.placeholder": "Izberite sliko",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "Največja velikost delitve v bytih",
|
"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": "Nivo Zip stiskanja",
|
||||||
"admin.config.share.zip-compression-level.description": "Nivo stiskanja, ki uravnoveša med velikostjo datoteke in hitrostjo stiskanja. Veljavne vrednosti so med 0 in 9, kjer 0 pomeni brez kompresije in 9 pomeni največjo kompresijo. ",
|
"admin.config.share.zip-compression-level.description": "Nivo stiskanja, ki uravnoveša med velikostjo datoteke in hitrostjo stiskanja. Veljavne vrednosti so med 0 in 9, kjer 0 pomeni brez kompresije in 9 pomeni največjo kompresijo. ",
|
||||||
|
"admin.config.share.chunk-size": "Velikost delcev",
|
||||||
|
"admin.config.share.chunk-size.description": "Prilagodite velikost delcev (v bajtih) vaših nalaganj, da uravnovesite med učinkovitostjo in zanesljivostjo glede na vašo internetno povezavo. Manjša velikost delcev lahko zviša uspešnost nalaganj pri nestabilni povezavi, medtem ko večja velikost delcev poviša hitrost nalaganja pri stabilni povezavi.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Omogočeno",
|
"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.enabled.description": "Če je SMTP omogočen. Omogočite samo, če ste vnesli strežnik, vrata, e-pošto, uporabniško ime in geslo vašega SMTP strežnika.",
|
||||||
"admin.config.smtp.host": "Gostitelj",
|
"admin.config.smtp.host": "Gostitelj",
|
||||||
@@ -327,10 +345,14 @@ export default {
|
|||||||
"admin.config.smtp.password": "Geslo",
|
"admin.config.smtp.password": "Geslo",
|
||||||
"admin.config.smtp.password.description": "Geslo SMTP strežnika",
|
"admin.config.smtp.password.description": "Geslo SMTP strežnika",
|
||||||
"admin.config.smtp.button.test": "Pošlji testno sporočilo",
|
"admin.config.smtp.button.test": "Pošlji testno sporočilo",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Dovoli registracijo",
|
"admin.config.oauth.allow-registration": "Dovoli registracijo",
|
||||||
"admin.config.oauth.allow-registration.description": "Dovoli registracijo uporabnika prek družbenih omrežij",
|
"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": "Ignoriraj TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Če ignorirati TOTP, ko se uporabnik registrira prek družbenih omrežij",
|
"admin.config.oauth.ignore-totp.description": "Če ignorirati TOTP, ko se uporabnik registrira prek družbenih omrežij",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Če je dovoljena prijava z GitHub računom",
|
"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": "GitHub ID klienta",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI za odkrivanje OpenID Connect OAuth aplikacije",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI za odkrivanje OpenID Connect OAuth aplikacije",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect zahteva za uporabniško ime",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect zahteva za uporabniško ime",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Zahteva za uporabniško ime za OpenID Connect ID žetona. Pustite prazno, če ne poznate te nastavitve.",
|
"admin.config.oauth.oidc-username-claim.description": "Zahteva za uporabniško ime za OpenID Connect ID žetona. Pustite prazno, če ne poznate te nastavitve.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect ID klienta",
|
"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-id.description": "ID Klienta OpenID Connect OAuth aplikacije",
|
||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect skrivnost klienta",
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect skrivnost klienta",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Račun {0} je že povezan na drug račun.",
|
"error.msg.already_linked": "Račun {0} je že povezan na drug račun.",
|
||||||
"error.msg.not_linked": "Račun {0} še ni povezan z nobenim računom.",
|
"error.msg.not_linked": "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.unverified_account": "Račun {0} je nepreverjen, prosimo poskusite ponovno po preverjanju.",
|
||||||
"error.msg.discord_guild_permission_denied": "Nimate dovoljenja za prijavo.",
|
"error.msg.user_not_allowed": "Nimate dovoljenja za prijavo.",
|
||||||
"error.msg.cannot_get_user_info": "Ne moremo najti uporabniških informacij za račun {0}.",
|
"error.msg.cannot_get_user_info": "Ne moremo najti uporabniških informacij za račun {0}.",
|
||||||
"error.param.provider_github": "GitHub",
|
"error.param.provider_github": "GitHub",
|
||||||
"error.param.provider_google": "Google",
|
"error.param.provider_google": "Google",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Потребна је двофакторска аутентификација",
|
"signIn.notify.totp-required.title": "Потребна је двофакторска аутентификација",
|
||||||
"signIn.notify.totp-required.description": "Унесите свој двофакторски код за аутентификацију",
|
"signIn.notify.totp-required.description": "Унесите свој двофакторски код за аутентификацију",
|
||||||
"signIn.oauth.or": "Или",
|
"signIn.oauth.or": "Или",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Корак 2: Потврдите свој код",
|
"account.modal.totp.step2": "Корак 2: Потврдите свој код",
|
||||||
"account.modal.totp.enterManually": "Унесите ручно",
|
"account.modal.totp.enterManually": "Унесите ручно",
|
||||||
"account.modal.totp.code": "Код",
|
"account.modal.totp.code": "Код",
|
||||||
"account.modal.totp.clickToCopy": "Кликните за копирање",
|
"common.button.clickToCopy": "Кликните за копирање",
|
||||||
"account.modal.totp.verify": "Верификуј",
|
"account.modal.totp.verify": "Верификуј",
|
||||||
"account.notify.totp.disable": "ТОТП је успешно онемогућен",
|
"account.notify.totp.disable": "ТОТП је успешно онемогућен",
|
||||||
"account.notify.totp.enable": "ТОТП је успешно омогућен",
|
"account.notify.totp.enable": "ТОТП је успешно омогућен",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Администрација",
|
"admin.title": "Администрација",
|
||||||
"admin.button.users": "Управљање корисницима",
|
"admin.button.users": "Управљање корисницима",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Конфигурација",
|
"admin.button.config": "Конфигурација",
|
||||||
"admin.version": "Верзија",
|
"admin.version": "Верзија",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Администраторске привилегије",
|
"admin.users.modal.create.admin": "Администраторске привилегије",
|
||||||
"admin.users.modal.create.admin.description": "Ако је означено, корисник ће моћи да приступи административном панелу.",
|
"admin.users.modal.create.admin.description": "Ако је означено, корисник ће моћи да приступи административном панелу.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Пошаљи",
|
"upload.title": "Пошаљи",
|
||||||
"upload.notify.generic-error": "Дошло је до грешке при довршавању дељења.",
|
"upload.notify.generic-error": "Дошло је до грешке при довршавању дељења.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Месеци",
|
"upload.modal.expires.month-plural": "Месеци",
|
||||||
"upload.modal.expires.year-singular": "Година",
|
"upload.modal.expires.year-singular": "Година",
|
||||||
"upload.modal.expires.year-plural": "Године",
|
"upload.modal.expires.year-plural": "Године",
|
||||||
"upload.modal.accordion.description.title": "Опис",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "Напомена за примаоце овог дељења",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "Примаоци е-поште",
|
"upload.modal.accordion.email.title": "Примаоци е-поште",
|
||||||
"upload.modal.accordion.email.placeholder": "Унесите примаоце е-поште",
|
"upload.modal.accordion.email.placeholder": "Унесите примаоце е-поште",
|
||||||
"upload.modal.accordion.email.invalid-email": "Неисправна адреса е-поште",
|
"upload.modal.accordion.email.invalid-email": "Неисправна адреса е-поште",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "На којој URL адреси је доступан Pingvin Share",
|
"admin.config.general.app-url.description": "На којој URL адреси је доступан Pingvin Share",
|
||||||
"admin.config.general.show-home-page": "Прикажи почетну страницу",
|
"admin.config.general.show-home-page": "Прикажи почетну страницу",
|
||||||
"admin.config.general.show-home-page.description": "Да ли да се прикаже почетна страница",
|
"admin.config.general.show-home-page.description": "Да ли да се прикаже почетна страница",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Лого",
|
"admin.config.general.logo": "Лого",
|
||||||
"admin.config.general.logo.description": "Промените свој логотип тако што ћете отпремити нову слику. Слика мора да буде PNG и треба да има формат 1:1.",
|
"admin.config.general.logo.description": "Промените свој логотип тако што ћете отпремити нову слику. Слика мора да буде PNG и треба да има формат 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Изабери слику",
|
"admin.config.general.logo.placeholder": "Изабери слику",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "Максимална величина дељења у бајтовима",
|
"admin.config.share.max-size.description": "Максимална величина дељења у бајтовима",
|
||||||
"admin.config.share.zip-compression-level": "Ниво zip компресије",
|
"admin.config.share.zip-compression-level": "Ниво zip компресије",
|
||||||
"admin.config.share.zip-compression-level.description": "Подесите ниво да бисте балансирали између величине датотеке и брзине компресије. Важеће вредности се крећу од 0 до 9, при чему је 0 без компресије, а 9 је максимална компресија. ",
|
"admin.config.share.zip-compression-level.description": "Подесите ниво да бисте балансирали између величине датотеке и брзине компресије. Важеће вредности се крећу од 0 до 9, при чему је 0 без компресије, а 9 је максимална компресија. ",
|
||||||
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Омогућено",
|
"admin.config.smtp.enabled": "Омогућено",
|
||||||
"admin.config.smtp.enabled.description": "Да ли је SMTP омогућен. Поставите ово на тачно само ако сте унели хост, порт, е-пошту, корисника и лозинку вашег SMTP сервера.",
|
"admin.config.smtp.enabled.description": "Да ли је SMTP омогућен. Поставите ово на тачно само ако сте унели хост, порт, е-пошту, корисника и лозинку вашег SMTP сервера.",
|
||||||
"admin.config.smtp.host": "Домаћин",
|
"admin.config.smtp.host": "Домаћин",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Дозволи регистрацију",
|
"admin.config.oauth.allow-registration": "Дозволи регистрацију",
|
||||||
"admin.config.oauth.allow-registration.description": "Дозволите корисницима да се региструју путем друштвене пријаве",
|
"admin.config.oauth.allow-registration.description": "Дозволите корисницима да се региструју путем друштвене пријаве",
|
||||||
"admin.config.oauth.ignore-totp": "Занемари ТОТП",
|
"admin.config.oauth.ignore-totp": "Занемари ТОТП",
|
||||||
"admin.config.oauth.ignore-totp.description": "Да ли да игноришете ТОТП када корисник користи пријаву на друштвеним мрежама",
|
"admin.config.oauth.ignore-totp.description": "Да ли да игноришете ТОТП када корисник користи пријаву на друштвеним мрежама",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Да ли је пријављивање на GitHub омогућено",
|
"admin.config.oauth.github-enabled.description": "Да ли је пријављивање на GitHub омогућено",
|
||||||
"admin.config.oauth.github-client-id": "GitHub ИД клијента",
|
"admin.config.oauth.github-client-id": "GitHub ИД клијента",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect 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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Овај {0} налог је већ повезан са другим налогом.",
|
"error.msg.already_linked": "Овај {0} налог је већ повезан са другим налогом.",
|
||||||
"error.msg.not_linked": "Овај {0} налог још увек није повезан ни са једним налогом.",
|
"error.msg.not_linked": "Овај {0} налог још увек није повезан ни са једним налогом.",
|
||||||
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
||||||
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
|
"error.msg.user_not_allowed": "You are not allowed to sign in.",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Tvåfaktorsautentisering krävs",
|
"signIn.notify.totp-required.title": "Tvåfaktorsautentisering krävs",
|
||||||
"signIn.notify.totp-required.description": "Vänligen ange din tvåfaktorsautentiseringskod",
|
"signIn.notify.totp-required.description": "Vänligen ange din tvåfaktorsautentiseringskod",
|
||||||
"signIn.oauth.or": "ELLER",
|
"signIn.oauth.or": "ELLER",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -57,7 +58,7 @@ export default {
|
|||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "Glömt ditt lösenord?",
|
"resetPassword.title": "Glömt ditt lösenord?",
|
||||||
"resetPassword.description": "Ange din e-postadress för att återställa ditt lösenord.",
|
"resetPassword.description": "Ange din e-postadress för att återställa ditt lösenord.",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "Ett meddelande med en länk för att återställa ditt lösenord har skickats om e-postadressen finns.",
|
||||||
"resetPassword.button.back": "Tillbaka till inloggningssidan",
|
"resetPassword.button.back": "Tillbaka till inloggningssidan",
|
||||||
"resetPassword.text.resetPassword": "Återställ lösenord",
|
"resetPassword.text.resetPassword": "Återställ lösenord",
|
||||||
"resetPassword.text.enterNewPassword": "Ange ditt nya lösenord",
|
"resetPassword.text.enterNewPassword": "Ange ditt nya lösenord",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Steg 2: Bekräfta din kod",
|
"account.modal.totp.step2": "Steg 2: Bekräfta din kod",
|
||||||
"account.modal.totp.enterManually": "Ange manuellt",
|
"account.modal.totp.enterManually": "Ange manuellt",
|
||||||
"account.modal.totp.code": "Kod",
|
"account.modal.totp.code": "Kod",
|
||||||
"account.modal.totp.clickToCopy": "Klicka för att kopiera",
|
"common.button.clickToCopy": "Klicka för att kopiera",
|
||||||
"account.modal.totp.verify": "Verifiera",
|
"account.modal.totp.verify": "Verifiera",
|
||||||
"account.notify.totp.disable": "TOTP har inaktiverats",
|
"account.notify.totp.disable": "TOTP har inaktiverats",
|
||||||
"account.notify.totp.enable": "TOTP aktiverat",
|
"account.notify.totp.enable": "TOTP aktiverat",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Administration",
|
"admin.title": "Administration",
|
||||||
"admin.button.users": "Användarhantering",
|
"admin.button.users": "Användarhantering",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Konfiguration",
|
"admin.button.config": "Konfiguration",
|
||||||
"admin.version": "Version",
|
"admin.version": "Version",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Administratörsbehörigheter",
|
"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.",
|
"admin.users.modal.create.admin.description": "Om detta markeras kommer användaren att kunna komma åt administratörspanelen.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Ladda upp",
|
"upload.title": "Ladda upp",
|
||||||
"upload.notify.generic-error": "Ett fel uppstod när din delning skulle slutföras.",
|
"upload.notify.generic-error": "Ett fel uppstod när din delning skulle slutföras.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Månader",
|
"upload.modal.expires.month-plural": "Månader",
|
||||||
"upload.modal.expires.year-singular": "År",
|
"upload.modal.expires.year-singular": "År",
|
||||||
"upload.modal.expires.year-plural": "År",
|
"upload.modal.expires.year-plural": "År",
|
||||||
"upload.modal.accordion.description.title": "Beskrivning",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "Anteckning till mottagare av denna delning",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "E-postmottagare",
|
"upload.modal.accordion.email.title": "E-postmottagare",
|
||||||
"upload.modal.accordion.email.placeholder": "Ange e-postmottagare",
|
"upload.modal.accordion.email.placeholder": "Ange e-postmottagare",
|
||||||
"upload.modal.accordion.email.invalid-email": "Ogiltig e-postadress",
|
"upload.modal.accordion.email.invalid-email": "Ogiltig e-postadress",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "På vilken URL Pingvin Share finns",
|
"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": "Visa startsidan",
|
||||||
"admin.config.general.show-home-page.description": "Om du vill visa startsidan",
|
"admin.config.general.show-home-page.description": "Om du vill visa startsidan",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logotyp",
|
"admin.config.general.logo": "Logotyp",
|
||||||
"admin.config.general.logo.description": "Ändra din logotyp genom att ladda upp en ny bild. Bilden måste vara en PNG och bör ha formatet 1:1.",
|
"admin.config.general.logo.description": "Ändra din logotyp genom att ladda upp en ny bild. Bilden måste vara en PNG och bör ha formatet 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Välj bild",
|
"admin.config.general.logo.placeholder": "Välj bild",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "Maximal storlek för delning i bytes",
|
"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": "Komprimeringsnivå för zip",
|
||||||
"admin.config.share.zip-compression-level.description": "Justera nivån för att balansera mellan filstorlek och komprimeringshastighet. Giltiga värden varierar från 0 till 9, med 0 som ingen komprimering och 9 som maximal komprimering. ",
|
"admin.config.share.zip-compression-level.description": "Justera nivån för att balansera mellan filstorlek och komprimeringshastighet. Giltiga värden varierar från 0 till 9, med 0 som ingen komprimering och 9 som maximal komprimering. ",
|
||||||
|
"admin.config.share.chunk-size": "Bitstorleken",
|
||||||
|
"admin.config.share.chunk-size.description": "Justera bitstorleken (i bytes) för dina uppladdningar för att balansera effektivitet och tillförlitlighet enligt din internetanslutning. Mindre bitar kan öka framgångsgraden för instabila anslutningar, medan större bitar snabbar upp uppladdningar för stabila anslutningar.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Aktiverad",
|
"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.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": "Adress",
|
||||||
@@ -327,10 +345,14 @@ export default {
|
|||||||
"admin.config.smtp.password": "Lösenord",
|
"admin.config.smtp.password": "Lösenord",
|
||||||
"admin.config.smtp.password.description": "Lösenord för SMTP-servern",
|
"admin.config.smtp.password.description": "Lösenord för SMTP-servern",
|
||||||
"admin.config.smtp.button.test": "Skicka testmeddelande",
|
"admin.config.smtp.button.test": "Skicka testmeddelande",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Tillåt registrering",
|
"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.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": "Ignorera TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Om du vill ignorera TOTP när användaren använder social inloggning",
|
"admin.config.oauth.ignore-totp.description": "Om du vill ignorera TOTP när användaren använder social inloggning",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Om GitHub-inloggning är aktiverad",
|
"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": "GitHub Client ID",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI för OpenID Connect OAuth appen",
|
"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": "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-username-claim.description": "Användarnamnsanspråk i OpenID Connect ID token. Lämna tomt om du inte vet vad denna konfiguration är.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID för OpenID OAuth",
|
"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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Detta {0} konto är redan länkat till ett annat 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.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.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.user_not_allowed": "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.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_github": "GitHub",
|
||||||
"error.param.provider_google": "Google",
|
"error.param.provider_google": "Google",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"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": "OR",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "ขั้นตอนที่ 2: ป้อนรหัสยืนยันตัวตน",
|
"account.modal.totp.step2": "ขั้นตอนที่ 2: ป้อนรหัสยืนยันตัวตน",
|
||||||
"account.modal.totp.enterManually": "ป้อนด้วยตนเอง",
|
"account.modal.totp.enterManually": "ป้อนด้วยตนเอง",
|
||||||
"account.modal.totp.code": "รหัส",
|
"account.modal.totp.code": "รหัส",
|
||||||
"account.modal.totp.clickToCopy": "คลิกเพื่อคัดลอก",
|
"common.button.clickToCopy": "คลิกเพื่อคัดลอก",
|
||||||
"account.modal.totp.verify": "ยืนยัน",
|
"account.modal.totp.verify": "ยืนยัน",
|
||||||
"account.notify.totp.disable": "TOTP ถูกปิดใช้งานเรียบร้อยแล้ว",
|
"account.notify.totp.disable": "TOTP ถูกปิดใช้งานเรียบร้อยแล้ว",
|
||||||
"account.notify.totp.enable": "TOTP ถูกเปิดใช้งานเรียบร้อยแล้ว",
|
"account.notify.totp.enable": "TOTP ถูกเปิดใช้งานเรียบร้อยแล้ว",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "แผงควบคุมระบบ",
|
"admin.title": "แผงควบคุมระบบ",
|
||||||
"admin.button.users": "การจัดการผู้ใช้",
|
"admin.button.users": "การจัดการผู้ใช้",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "การตั้งค่า",
|
"admin.button.config": "การตั้งค่า",
|
||||||
"admin.version": "เวอร์ชัน",
|
"admin.version": "เวอร์ชัน",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "สิทธิ์ของผู้ดูแลระบบ",
|
"admin.users.modal.create.admin": "สิทธิ์ของผู้ดูแลระบบ",
|
||||||
"admin.users.modal.create.admin.description": "หากติ๊กเลือก ผู้ใช้จะสามารถเข้าถึงแผงควบคุมระบบได้",
|
"admin.users.modal.create.admin.description": "หากติ๊กเลือก ผู้ใช้จะสามารถเข้าถึงแผงควบคุมระบบได้",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "อัปโหลด",
|
"upload.title": "อัปโหลด",
|
||||||
"upload.notify.generic-error": "เกิดข้อผิดพลาดขณะที่กำลังจัดการการแชร์ของคุณ",
|
"upload.notify.generic-error": "เกิดข้อผิดพลาดขณะที่กำลังจัดการการแชร์ของคุณ",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "เดือน",
|
"upload.modal.expires.month-plural": "เดือน",
|
||||||
"upload.modal.expires.year-singular": "ปี",
|
"upload.modal.expires.year-singular": "ปี",
|
||||||
"upload.modal.expires.year-plural": "ปี",
|
"upload.modal.expires.year-plural": "ปี",
|
||||||
"upload.modal.accordion.description.title": "คำอธิบาย",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "หมายเหตุสำหรับผู้รับการแชร์นี้",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "ผู้รับอีเมล์",
|
"upload.modal.accordion.email.title": "ผู้รับอีเมล์",
|
||||||
"upload.modal.accordion.email.placeholder": "ป้อนผู้รับอีเมล์",
|
"upload.modal.accordion.email.placeholder": "ป้อนผู้รับอีเมล์",
|
||||||
"upload.modal.accordion.email.invalid-email": "ที่อยู่อีเมล์ไม่ถูกต้อง",
|
"upload.modal.accordion.email.invalid-email": "ที่อยู่อีเมล์ไม่ถูกต้อง",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "URL ที่สามารถเข้าถึงแอพพลิเคชัน Pingvin Share ได้",
|
"admin.config.general.app-url.description": "URL ที่สามารถเข้าถึงแอพพลิเคชัน Pingvin Share ได้",
|
||||||
"admin.config.general.show-home-page": "แสดงหน้าแรก",
|
"admin.config.general.show-home-page": "แสดงหน้าแรก",
|
||||||
"admin.config.general.show-home-page.description": "หากติ๊ก เว็บไซต์จะแสดงหน้าหลักเวลาเข้าถึง URL หลัก",
|
"admin.config.general.show-home-page.description": "หากติ๊ก เว็บไซต์จะแสดงหน้าหลักเวลาเข้าถึง URL หลัก",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "โลโก้",
|
"admin.config.general.logo": "โลโก้",
|
||||||
"admin.config.general.logo.description": "เปลี่ยนโลโก้โดยอัปโหลดรูปภาพใหม่ รูปภาพต้องเป็น PNG และควรมีขนาดอัตราส่วน 1:1",
|
"admin.config.general.logo.description": "เปลี่ยนโลโก้โดยอัปโหลดรูปภาพใหม่ รูปภาพต้องเป็น PNG และควรมีขนาดอัตราส่วน 1:1",
|
||||||
"admin.config.general.logo.placeholder": "คลิกที่นี่หรือลากไฟล์มา",
|
"admin.config.general.logo.placeholder": "คลิกที่นี่หรือลากไฟล์มา",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "ขนาดสูงสุดของแชร์",
|
"admin.config.share.max-size.description": "ขนาดสูงสุดของแชร์",
|
||||||
"admin.config.share.zip-compression-level": "ระดับการบีบอัดไฟล์ Zip",
|
"admin.config.share.zip-compression-level": "ระดับการบีบอัดไฟล์ Zip",
|
||||||
"admin.config.share.zip-compression-level.description": "ปรับระดับเพื่อปรับความสมดุลระหว่างขนาดไฟล์และความเร็วในการบีบอัด ค่าอยู่ระหว่าง 0-9 โดย 0 คือไม่มีการบีบอัดและ 9 คือการบีบอัดสูงสุด",
|
"admin.config.share.zip-compression-level.description": "ปรับระดับเพื่อปรับความสมดุลระหว่างขนาดไฟล์และความเร็วในการบีบอัด ค่าอยู่ระหว่าง 0-9 โดย 0 คือไม่มีการบีบอัดและ 9 คือการบีบอัดสูงสุด",
|
||||||
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "เปิด",
|
"admin.config.smtp.enabled": "เปิด",
|
||||||
"admin.config.smtp.enabled.description": "เปิดใช้งาน SMTP สำหรับการส่งอีเมล์์์์์์ เปิดได้เท่านั้นต่อเมื่อคุณใส่ข้อมูลโฮสต์ พอร์ต อีเมล์ ผู้ใช้ และรหัสผ่านของเซิร์ฟเวอร์ SMTP ของคุณ",
|
"admin.config.smtp.enabled.description": "เปิดใช้งาน SMTP สำหรับการส่งอีเมล์์์์์์ เปิดได้เท่านั้นต่อเมื่อคุณใส่ข้อมูลโฮสต์ พอร์ต อีเมล์ ผู้ใช้ และรหัสผ่านของเซิร์ฟเวอร์ SMTP ของคุณ",
|
||||||
"admin.config.smtp.host": "โฮสต์",
|
"admin.config.smtp.host": "โฮสต์",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Allow registration",
|
"admin.config.oauth.allow-registration": "Allow registration",
|
||||||
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
"admin.config.oauth.allow-registration.description": "Allow users to register via social login",
|
||||||
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
"admin.config.oauth.ignore-totp": "Ignore TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
"admin.config.oauth.ignore-totp.description": "Whether to ignore TOTP when user using social login",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
|
"admin.config.oauth.github-enabled.description": "Whether GitHub login is enabled",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect 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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"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.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.user_not_allowed": "You are not allowed to sign in.",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
|
|||||||
449
frontend/src/i18n/translations/tr-TR.ts
Normal file
449
frontend/src/i18n/translations/tr-TR.ts
Normal file
@@ -0,0 +1,449 @@
|
|||||||
|
export default {
|
||||||
|
// Navbar
|
||||||
|
"navbar.upload": "Yükle",
|
||||||
|
"navbar.signin": "Giriş Yap",
|
||||||
|
"navbar.home": "Ana Sayfa",
|
||||||
|
"navbar.signup": "Kaydol",
|
||||||
|
"navbar.links.shares": "Paylaşımlarım",
|
||||||
|
"navbar.links.reverse": "Tersine Paylaşımlar",
|
||||||
|
"navbar.avatar.account": "Hesabım",
|
||||||
|
"navbar.avatar.admin": "Yönetim",
|
||||||
|
"navbar.avatar.signout": "Çıkış Yap",
|
||||||
|
// END navbar
|
||||||
|
// /
|
||||||
|
"home.title": "<h>Kişisel barındırılan</h> bir dosya paylaşım platformu.",
|
||||||
|
"home.description": "Kişisel dosyalarınızı WeTransfer gibi üçüncü tarafların eline gerçekten vermek istiyor musunuz?",
|
||||||
|
"home.bullet.a.name": "Kişisel Barındırılan",
|
||||||
|
"home.bullet.a.description": "Pingvin Share'i kendi makinenizde barındırın.",
|
||||||
|
"home.bullet.b.name": "Gizlilik",
|
||||||
|
"home.bullet.b.description": "Dosyalarınız sizin dosyalarınızdır ve asla üçüncü şahısların ellerinde bulunmamalıdır.",
|
||||||
|
"home.bullet.c.name": "Can sıkıcı dosya boyutu sınırı yok",
|
||||||
|
"home.bullet.c.description": "İstediğiniz kadar büyük dosya yükleyin. Sınırınız sadece sabit diskiniz olacaktır.",
|
||||||
|
"home.button.start": "Başlayalım",
|
||||||
|
"home.button.source": "Kaynak kodu",
|
||||||
|
// END /
|
||||||
|
// /auth/signin
|
||||||
|
"signin.title": "Tekrar hoşgeldiniz",
|
||||||
|
"signin.description": "Henüz bir hesabınız yok mu?",
|
||||||
|
"signin.button.signup": "Kaydol",
|
||||||
|
"signin.input.email-or-username": "Eposta veya kullanıcı adı",
|
||||||
|
"signin.input.email-or-username.placeholder": "E-Posta veya kullanıcı adı",
|
||||||
|
"signin.input.password": "Şifre",
|
||||||
|
"signin.input.password.placeholder": "Şifreniz",
|
||||||
|
"signin.button.submit": "Giriş Yap",
|
||||||
|
"signIn.notify.totp-required.title": "İki faktörlü kimlik doğrulama gerekli",
|
||||||
|
"signIn.notify.totp-required.description": "Lütfen iki faktörlü doğrulama kodunuzu girin",
|
||||||
|
"signIn.oauth.or": "YA DA",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
|
"signIn.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": "Bir hesap oluştur",
|
||||||
|
"signup.description": "Zaten bir hesabınız mı var?",
|
||||||
|
"signup.button.signin": "Giriş Yap",
|
||||||
|
"signup.input.username": "Kullanıcı Adı",
|
||||||
|
"signup.input.username.placeholder": "Kullanıcı adınız",
|
||||||
|
"signup.input.email": "E-Posta",
|
||||||
|
"signup.input.email.placeholder": "E-Posta adresiniz",
|
||||||
|
"signup.button.submit": "Haydi Başlayalım",
|
||||||
|
// END /auth/signup
|
||||||
|
// /auth/totp
|
||||||
|
"totp.title": "İki Faktörlü Doğrulama",
|
||||||
|
"totp.button.signIn": "Giriş Yap",
|
||||||
|
// END /auth/totp
|
||||||
|
// /auth/reset-password
|
||||||
|
"resetPassword.title": "Şifrenizi mi unuttunuz?",
|
||||||
|
"resetPassword.description": "Şifrenizi sıfırlamak için E-Postanızı girin.",
|
||||||
|
"resetPassword.notify.success": "E-postanız mevcutsa, şifrenizi sıfırlamak için bağlantı içeren bir mesaj gönderilmiştir.",
|
||||||
|
"resetPassword.button.back": "Giriş sayfasına geri dön",
|
||||||
|
"resetPassword.text.resetPassword": "Şifreyi sıfırla",
|
||||||
|
"resetPassword.text.enterNewPassword": "Yeni şifrenizi girin",
|
||||||
|
"resetPassword.input.password": "Yeni şifre",
|
||||||
|
"resetPassword.notify.passwordReset": "Şifreniz başarıyla sıfırlandı.",
|
||||||
|
// /account
|
||||||
|
"account.title": "Hesabım",
|
||||||
|
"account.card.info.title": "Hesap Bilgisi",
|
||||||
|
"account.card.info.username": "Kullanıcı Adı",
|
||||||
|
"account.card.info.email": "E-Posta",
|
||||||
|
"account.notify.info.success": "Hesap başarıyla güncellendi",
|
||||||
|
"account.card.password.title": "Şifre",
|
||||||
|
"account.card.password.old": "Eski şifre",
|
||||||
|
"account.card.password.new": "Yeni şifre",
|
||||||
|
"account.card.password.noPasswordSet": "Belirlenmiş bir şifreniz yok. E-posta ve şifre ile oturum açmak istiyorsanız bir şifre belirlemeniz gerekir.",
|
||||||
|
"account.notify.password.success": "Şifre başarıyla değiştirildi",
|
||||||
|
"account.card.oauth.title": "Sosyal Medya girişi",
|
||||||
|
"account.card.oauth.github": "GitHub",
|
||||||
|
"account.card.oauth.google": "Google",
|
||||||
|
"account.card.oauth.microsoft": "Microsoft",
|
||||||
|
"account.card.oauth.discord": "Discord",
|
||||||
|
"account.card.oauth.oidc": "OpenID",
|
||||||
|
"account.card.oauth.link": "Bağlantı",
|
||||||
|
"account.card.oauth.unlink": "Bağlantıyı kes",
|
||||||
|
"account.card.oauth.unlinked": "Bağlantısız",
|
||||||
|
"account.modal.unlink.title": "Hesabın bağlantısını kaldır",
|
||||||
|
"account.modal.unlink.description": "Sosyal hesaplarınızın bağlantısını kesmek, kullanıcı adınızı ve şifrenizi hatırlamıyorsanız hesabınızı kaybetmenize neden olabilir.",
|
||||||
|
"account.notify.oauth.unlinked.success": "Bağlantı Başarıyla Kaldırıldı",
|
||||||
|
"account.card.security.title": "Güvenlik",
|
||||||
|
"account.card.security.totp.enable.description": "İki faktörlü doğrulamayı aktif etmek için şu anki şifrenizi girin",
|
||||||
|
"account.card.security.totp.disable.description": "İki faktörlü doğrulamayı kaldırmak için şu anki şifrenizi girin",
|
||||||
|
"account.card.security.totp.button.start": "Başlat",
|
||||||
|
"account.modal.totp.title": "2FA aç",
|
||||||
|
"account.modal.totp.step1": "Adım 1: Kimlik doğrulayıcınızı ekleyin",
|
||||||
|
"account.modal.totp.step2": "Adım 2: Kodunuzu doğrulayın",
|
||||||
|
"account.modal.totp.enterManually": "Manuel olarak girin",
|
||||||
|
"account.modal.totp.code": "Kod",
|
||||||
|
"common.button.clickToCopy": "Kopyalamak için tıkla",
|
||||||
|
"account.modal.totp.verify": "Doğrula",
|
||||||
|
"account.notify.totp.disable": "2FA başarıyla kaldırıldı",
|
||||||
|
"account.notify.totp.enable": "2FA başarıyla etkinleştirildi",
|
||||||
|
"account.card.language.title": "Dil",
|
||||||
|
"account.card.language.description": "Proje topluluk tarafından çevrilmiştir. Bazı diller eksik olabilir.",
|
||||||
|
"account.card.color.title": "Renk Şeması",
|
||||||
|
// ThemeSwitcher.tsx
|
||||||
|
"account.theme.dark": "Koyu",
|
||||||
|
"account.theme.light": "Açık",
|
||||||
|
"account.theme.system": "Sistem",
|
||||||
|
"account.button.delete": "Hesabı sil",
|
||||||
|
"account.modal.delete.title": "Hesabı sil",
|
||||||
|
"account.modal.delete.description": "Tüm aktif paylaşımlarınız dahil hesabınızı gerçekten silmek istiyor musunuz?",
|
||||||
|
// END /account
|
||||||
|
// /account/shares
|
||||||
|
"account.shares.title": "Paylaşımlarım",
|
||||||
|
"account.shares.title.empty": "Burası bomboş 👀",
|
||||||
|
"account.shares.description.empty": "Hiç paylaşımınız yok.",
|
||||||
|
"account.shares.button.create": "Bir tane oluşturun",
|
||||||
|
"account.shares.info.title": "Bilgiler paylaşın",
|
||||||
|
"account.shares.table.id": "ID",
|
||||||
|
"account.shares.table.name": "İsim",
|
||||||
|
"account.shares.table.description": "Açıklama",
|
||||||
|
"account.shares.table.visitors": "Ziyaretçiler",
|
||||||
|
"account.shares.table.expiresAt": "Sona erme tarihi",
|
||||||
|
"account.shares.table.createdAt": "Oluşturulma tarihi",
|
||||||
|
"account.shares.table.size": "Boyut",
|
||||||
|
"account.shares.modal.share-informations": "Bilgiler paylaşın",
|
||||||
|
"account.shares.modal.share-link": "Bağlantıyı paylaş",
|
||||||
|
"account.shares.modal.delete.title": "{share} paylaşımını sil",
|
||||||
|
"account.shares.modal.delete.description": "Bu paylaşımı silmek istediğinize emin misiniz?",
|
||||||
|
// END /account/shares
|
||||||
|
// /account/reverseShares
|
||||||
|
"account.reverseShares.title": "Tersine Paylaşımlar",
|
||||||
|
"account.reverseShares.description": "Ters paylaşım, harici kullanıcıların bir paylaşım oluşturmasına olanak tanıyan benzersiz bir URL oluşturmanızı sağlar.",
|
||||||
|
"account.reverseShares.title.empty": "Burası bomboş 👀",
|
||||||
|
"account.reverseShares.description.empty": "Hiç tersine paylaşımınız yok.",
|
||||||
|
// showCreateReverseShareModal.tsx
|
||||||
|
"account.reverseShares.modal.title": "Tersine paylaşım oluşturun",
|
||||||
|
"account.reverseShares.modal.expiration.label": "Sona erme",
|
||||||
|
"account.reverseShares.modal.expiration.minute-singular": "Dakika",
|
||||||
|
"account.reverseShares.modal.expiration.minute-plural": "Dakika",
|
||||||
|
"account.reverseShares.modal.expiration.hour-singular": "Saat",
|
||||||
|
"account.reverseShares.modal.expiration.hour-plural": "Saat",
|
||||||
|
"account.reverseShares.modal.expiration.day-singular": "Gün",
|
||||||
|
"account.reverseShares.modal.expiration.day-plural": "Gün",
|
||||||
|
"account.reverseShares.modal.expiration.week-singular": "Hafta",
|
||||||
|
"account.reverseShares.modal.expiration.week-plural": "Hafta",
|
||||||
|
"account.reverseShares.modal.expiration.month-singular": "Ay",
|
||||||
|
"account.reverseShares.modal.expiration.month-plural": "Ay",
|
||||||
|
"account.reverseShares.modal.expiration.year-singular": "Yıl",
|
||||||
|
"account.reverseShares.modal.expiration.year-plural": "Yıl",
|
||||||
|
"account.reverseShares.modal.max-size.label": "Maks paylaşım boyutu",
|
||||||
|
"account.reverseShares.modal.send-email": "E-Posta bildirimi gönder",
|
||||||
|
"account.reverseShares.modal.send-email.description": "Bu tersine paylaşım bağlantısıyla bir paylaşım oluşturulduğunda e-posta bildirimi gönderin.",
|
||||||
|
"account.reverseShares.modal.max-use.label": "Maks Kullanım",
|
||||||
|
"account.reverseShares.modal.max-use.description": "Bu URL'nin bir paylaşım oluşturmak için kullanılabileceği maksimum sayı.",
|
||||||
|
"account.reverseShare.never-expires": "Bu tersine paylaşım asla sona ermeyecek.",
|
||||||
|
"account.reverseShare.expires-on": "Bu tersine paylaşım {expiration} tarihinde sona erecek.",
|
||||||
|
"account.reverseShares.table.no-shares": "Henüz paylaşım oluşturulmadı",
|
||||||
|
"account.reverseShares.table.count.singular": "paylaşım",
|
||||||
|
"account.reverseShares.table.count.plural": "paylaşım",
|
||||||
|
"account.reverseShares.table.shares": "Paylaşım",
|
||||||
|
"account.reverseShares.table.remaining": "Kalan kullanımların",
|
||||||
|
"account.reverseShares.table.max-size": "Maks paylaşım boyutu",
|
||||||
|
"account.reverseShares.table.expires": "Sona erme tarihi",
|
||||||
|
"account.reverseShares.modal.reverse-share-link": "Tersine paylaşım bağlantısı",
|
||||||
|
"account.reverseShares.modal.delete.title": "Tersine paylaşımı sil",
|
||||||
|
"account.reverseShares.modal.delete.description": "Bu tersine paylaşımı gerçekten silmek istiyor musunuz? Bunu yaparsanız, ilişkili paylaşımlar da silinecektir.",
|
||||||
|
// END /account/reverseShares
|
||||||
|
// /admin
|
||||||
|
"admin.title": "Yönetim",
|
||||||
|
"admin.button.users": "Kullanıcı yönetimi",
|
||||||
|
"admin.button.shares": "Paylaşım yönetimi",
|
||||||
|
"admin.button.config": "Konfigürasyon",
|
||||||
|
"admin.version": "Sürüm",
|
||||||
|
// END /admin
|
||||||
|
// /admin/users
|
||||||
|
"admin.users.title": "Kullanıcı yönetimi",
|
||||||
|
"admin.users.table.username": "Kullanıcı Adı",
|
||||||
|
"admin.users.table.email": "E-Posta",
|
||||||
|
"admin.users.table.admin": "Yönetici",
|
||||||
|
"admin.users.edit.update.title": "{username} kullanıcısını güncelle",
|
||||||
|
"admin.users.edit.update.admin-privileges": "Yönetici ayrıcalıkları",
|
||||||
|
"admin.users.edit.update.change-password.title": "Şifreyi değiştir",
|
||||||
|
"admin.users.edit.update.change-password.field": "Yeni şifre",
|
||||||
|
"admin.users.edit.update.change-password.button": "Yeni şifreyi kaydet",
|
||||||
|
"admin.users.edit.update.notify.password.success": "Şifre başarıyla değiştirildi",
|
||||||
|
"admin.users.edit.delete.title": "{username} kullanıcısını sil",
|
||||||
|
"admin.users.edit.delete.description": "Bu kullanıcıyı ve tüm paylaşımlarını gerçekten silmek istiyor musunuz?",
|
||||||
|
// showCreateUserModal.tsx
|
||||||
|
"admin.users.modal.create.title": "Kullanıcı oluştur",
|
||||||
|
"admin.users.modal.create.username": "Kullanıcı Adı",
|
||||||
|
"admin.users.modal.create.email": "E-Posta",
|
||||||
|
"admin.users.modal.create.password": "Şifre",
|
||||||
|
"admin.users.modal.create.manual-password": "Şifreyi manuel olarak ayarla",
|
||||||
|
"admin.users.modal.create.manual-password.description": "İşaretlenmezse, kullanıcı şifresini ayarlamak için bağlantı içeren bir e-posta alacaktır.",
|
||||||
|
"admin.users.modal.create.admin": "Yönetici ayrıcalıkları",
|
||||||
|
"admin.users.modal.create.admin.description": "İşaretlenirse, kullanıcı yönetici paneline erişebilir.",
|
||||||
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Paylaşım yönetimi",
|
||||||
|
"admin.shares.table.id": "Paylaşım ID",
|
||||||
|
"admin.shares.table.username": "Yapımcı",
|
||||||
|
"admin.shares.table.visitors": "Ziyaretçi",
|
||||||
|
"admin.shares.table.expires": "Sona erme tarihi",
|
||||||
|
"admin.shares.edit.delete.title": "{id} paylaşımını sil",
|
||||||
|
"admin.shares.edit.delete.description": "Bu paylaşımı gerçekten silmek istiyor musun?",
|
||||||
|
// END /admin/shares
|
||||||
|
// /upload
|
||||||
|
"upload.title": "Yükle",
|
||||||
|
"upload.notify.generic-error": "Paylaşımını bitirirken bir hata meydana geldi.",
|
||||||
|
"upload.notify.count-failed": "{count} dosya yüklenemedi. Yeniden deneniyor.",
|
||||||
|
// Dropzone.tsx
|
||||||
|
"upload.dropzone.title": "Dosya yükle",
|
||||||
|
"upload.dropzone.description": "Paylaşmak için dosyaları buraya sürükleyin. Sadece {maxSize} boyutundan küçük dosyalar kabul edilir.",
|
||||||
|
"upload.dropzone.notify.file-too-big": "Dosyalarınızın boyutu {maxSize} paylaşım sınırını geçti.",
|
||||||
|
// FileList.tsx
|
||||||
|
"upload.filelist.name": "İsim",
|
||||||
|
"upload.filelist.size": "Boyut",
|
||||||
|
// showCreateUploadModal.tsx
|
||||||
|
"upload.modal.title": "Paylaşım Oluştur",
|
||||||
|
"upload.modal.link.error.invalid": "Sadece harf, sayı, alt çizgi ve kısa çizgi içerebilir",
|
||||||
|
"upload.modal.link.error.taken": "Bu bağlantı halen kullanımda",
|
||||||
|
"upload.modal.not-signed-in": "Oturum açmadınız",
|
||||||
|
"upload.modal.not-signed-in-description": "Paylaşımınızı manuel olarak silemeyecek ve ziyaret sayısını göremeyeceksiniz.",
|
||||||
|
"upload.modal.expires.never": "asla",
|
||||||
|
"upload.modal.expires.never-long": "Sona Ermez",
|
||||||
|
"upload.modal.expires.error.too-long": "Son kullanma tarihi {max} maksimum son kullanma tarihini aşıyor.",
|
||||||
|
"upload.modal.link.label": "Bağlantı",
|
||||||
|
"upload.modal.expires.label": "Sona erme tarihi",
|
||||||
|
"upload.modal.expires.minute-singular": "Dakika",
|
||||||
|
"upload.modal.expires.minute-plural": "Dakika",
|
||||||
|
"upload.modal.expires.hour-singular": "Saat",
|
||||||
|
"upload.modal.expires.hour-plural": "Saat",
|
||||||
|
"upload.modal.expires.day-singular": "Gün",
|
||||||
|
"upload.modal.expires.day-plural": "Gün",
|
||||||
|
"upload.modal.expires.week-singular": "Hafta",
|
||||||
|
"upload.modal.expires.week-plural": "Hafta",
|
||||||
|
"upload.modal.expires.month-singular": "Ay",
|
||||||
|
"upload.modal.expires.month-plural": "Ay",
|
||||||
|
"upload.modal.expires.year-singular": "Yıl",
|
||||||
|
"upload.modal.expires.year-plural": "Yıl",
|
||||||
|
"upload.modal.accordion.name-and-description.title": "İsim ve açıklama",
|
||||||
|
"upload.modal.accordion.name-and-description.name.placeholder": "İsim",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Bu paylaşımın alıcıları için not",
|
||||||
|
"upload.modal.accordion.email.title": "E-Posta alıcıları",
|
||||||
|
"upload.modal.accordion.email.placeholder": "E-Posta alıcılarını yazın",
|
||||||
|
"upload.modal.accordion.email.invalid-email": "Geçersiz E-Posta adresi",
|
||||||
|
"upload.modal.accordion.security.title": "Güvenlik seçenekleri",
|
||||||
|
"upload.modal.accordion.security.password.label": "Şifre koruması",
|
||||||
|
"upload.modal.accordion.security.password.placeholder": "Şifresiz",
|
||||||
|
"upload.modal.accordion.security.max-views.label": "En fazla görüntüleme",
|
||||||
|
"upload.modal.accordion.security.max-views.placeholder": "Sınır yok",
|
||||||
|
// showCompletedUploadModal.tsx
|
||||||
|
"upload.modal.completed.never-expires": "Bu paylaşım asla sona ermeyecek.",
|
||||||
|
"upload.modal.completed.expires-on": "Bu paylaşım {expiration} tarihinde sona erecek.",
|
||||||
|
"upload.modal.completed.share-ready": "Paylaşım hazır",
|
||||||
|
// END /upload
|
||||||
|
// /share/[id]
|
||||||
|
"share.title": "Paylaş {shareId}",
|
||||||
|
"share.description": "Seninle ne paylaştığıma bak!",
|
||||||
|
"share.error.visitor-limit-exceeded.title": "Ziyaretçi sınırı aşıldı",
|
||||||
|
"share.error.visitor-limit-exceeded.description": "Bu paylaşımdaki ziyaretçi sınırı aşıldı.",
|
||||||
|
"share.error.removed.title": "Paylaşım kaldırıldı",
|
||||||
|
"share.error.not-found.title": "Paylaşım bulunamadı",
|
||||||
|
"share.error.not-found.description": "Aradığınız paylaşım bulunmuyor.",
|
||||||
|
"share.modal.password.title": "Şifre gerekli",
|
||||||
|
"share.modal.password.description": "Bu paylaşıma erişmek için lütfen paylaşımın şifresini girin.",
|
||||||
|
"share.modal.password": "Şifre",
|
||||||
|
"share.modal.error.invalid-password": "Geçersiz şifre",
|
||||||
|
"share.button.download-all": "Tümünü indir",
|
||||||
|
"share.notify.download-all-preparing": "Paylaşım hazırlanıyor. Birkaç dakika içinde tekrar deneyin.",
|
||||||
|
"share.modal.file-link": "Dosya bağlantısı",
|
||||||
|
"share.table.name": "İsim",
|
||||||
|
"share.table.size": "Boyut",
|
||||||
|
"share.modal.file-preview.error.not-supported.title": "Önizleme desteklenmiyor",
|
||||||
|
"share.modal.file-preview.error.not-supported.description": "Bu dosyanın önizlemesi desteklenmiyor. Lütfen indirin ve öyle inceleyin.",
|
||||||
|
// END /share/[id]
|
||||||
|
// /share/[id]/edit
|
||||||
|
"share.edit.title": "{shareId} düzenle",
|
||||||
|
"share.edit.append-upload": "Dosya ekle",
|
||||||
|
"share.edit.notify.generic-error": "Paylaşımını bitirirken bir hata meydana geldi.",
|
||||||
|
"share.edit.notify.save-success": "Paylaşım başarıyla güncellendi",
|
||||||
|
// END /share/[id]/edit
|
||||||
|
// /admin/config
|
||||||
|
"admin.config.title": "Konfigürasyon",
|
||||||
|
"admin.config.category.general": "Genel",
|
||||||
|
"admin.config.category.share": "Paylaş",
|
||||||
|
"admin.config.category.email": "E-Posta",
|
||||||
|
"admin.config.category.smtp": "SMTP",
|
||||||
|
"admin.config.category.oauth": "Sosyal Medya Girişi",
|
||||||
|
"admin.config.general.app-name": "Uygulama adı",
|
||||||
|
"admin.config.general.app-name.description": "Uygulamanın adı",
|
||||||
|
"admin.config.general.app-url": "Uygulama URL'si",
|
||||||
|
"admin.config.general.app-url.description": "Pingvin Share'in hangi bağlantıda kullanılacağı",
|
||||||
|
"admin.config.general.show-home-page": "Ana sayfayı göster",
|
||||||
|
"admin.config.general.show-home-page.description": "Ana sayfanın görünürlüğü",
|
||||||
|
"admin.config.general.session-duration": "Oturum Süresi",
|
||||||
|
"admin.config.general.session-duration.description": "Kullanıcının ne kadar sürede bir tekrar giriş yapacağı (normalde 3 ay).",
|
||||||
|
"admin.config.general.logo": "Logo",
|
||||||
|
"admin.config.general.logo.description": "Yeni resim yükleyerek logo'nuzu değiştirin. Resim PNG ve 1'e 1 ölçekte olmalı.",
|
||||||
|
"admin.config.general.logo.placeholder": "Resim seç",
|
||||||
|
"admin.config.email.enable-share-email-recipients": "E-Posta alıcılarını paylaşmayı etkinleştirin",
|
||||||
|
"admin.config.email.enable-share-email-recipients.description": "E-Postaların alıcıları paylaşmasına izin verilip verilmeyeceği. Bunu yalnızca SMTP'yi etkinleştirdiyseniz etkinleştirin.",
|
||||||
|
"admin.config.email.share-recipients-subject": "Paylaşım alıcılarının konusu",
|
||||||
|
"admin.config.email.share-recipients-subject.description": "Paylaşım alıcılarına gönderilecek e-postanın konusu.",
|
||||||
|
"admin.config.email.share-recipients-message": "Paylaşım alıcılarının mesajı",
|
||||||
|
"admin.config.email.share-recipients-message.description": "Paylaşım alıcılarına gönderilecek mesaj. Kullanılabilir değişkenler:\n {creator} - Paylaşımı oluşturan kişinin kullanıcı adı\n {shareUrl} - Paylaşımın URL'si\n {desc} - Paylaşımın açıklaması\n {expires} - Paylaşımın son kullanma tarihi\n Değişkenler gerçek değerle değiştirilecektir.",
|
||||||
|
"admin.config.email.reverse-share-subject": "Tersine paylaşım konusu",
|
||||||
|
"admin.config.email.reverse-share-subject.description": "Birisi sizin ters paylaşım bağlantınızla bir paylaşım oluşturduğunda gönderilen e-postanın konusu.",
|
||||||
|
"admin.config.email.reverse-share-message": "Tersine paylaşım mesajı",
|
||||||
|
"admin.config.email.reverse-share-message.description": "Birisi sizin tersine paylaşım bağlantınızla bir paylaşım oluşturduğunda gönderilen mesaj. {shareUrl}, oluşturucunun adı ve paylaşım URL'si ile değiştirilecektir.",
|
||||||
|
"admin.config.email.reset-password-subject": "Şifre sıfırlama konusu",
|
||||||
|
"admin.config.email.reset-password-subject.description": "Bir kullanıcı şifre sıfırlama talebinde bulunduğunda gönderilen e-postanın konusu.",
|
||||||
|
"admin.config.email.reset-password-message": "Şifre sıfırlama mesajı",
|
||||||
|
"admin.config.email.reset-password-message.description": "Bir kullanıcı şifre sıfırlama talebinde bulunduğunda gönderilecek mesaj. {url} şifre sıfırlama URL'si ile değiştirilecektir.",
|
||||||
|
"admin.config.email.invite-subject": "Davet konusu",
|
||||||
|
"admin.config.email.invite-subject.description": "Yönetici bir kullanıcıyı davet ettiğinde gönderilen e-postanın konusu.",
|
||||||
|
"admin.config.email.invite-message": "Davet mesajı",
|
||||||
|
"admin.config.email.invite-message.description": "Yönetici bir kullanıcıyı davet ettiğinde gönderilen mesaj. {url} davet URL'si ve {password} şifre ile değiştirilecektir.",
|
||||||
|
"admin.config.share.allow-registration": "Kayda izin ver",
|
||||||
|
"admin.config.share.allow-registration.description": "Kaydın izin verilip verilmeyeceği",
|
||||||
|
"admin.config.share.allow-unauthenticated-shares": "Giriş yapmamış kullanıcılara izin ver",
|
||||||
|
"admin.config.share.allow-unauthenticated-shares.description": "Giriş yapmamış kullanıcıların paylaşım oluşturup oluşturamayacağı",
|
||||||
|
"admin.config.share.max-expiration": "Maks sona erme",
|
||||||
|
"admin.config.share.max-expiration.description": "Saat üzerinden maksimum paylaşım sona ermesi. Sınırsız için 0 yapın.",
|
||||||
|
"admin.config.share.max-size": "Maks boyut",
|
||||||
|
"admin.config.share.max-size.description": "Byte üzerinden maks paylaşım boyutu",
|
||||||
|
"admin.config.share.zip-compression-level": "Zip sıkıştırma seviyesi",
|
||||||
|
"admin.config.share.zip-compression-level.description": "Dosya boyutu ve sıkıştırma hızı arasında denge kurmak için seviyeyi ayarlayın. Geçerli değerler 0 ile 9 arasında değişir; 0 sıkıştırma yok ve 9 maksimum sıkıştırma anlamına gelir. ",
|
||||||
|
"admin.config.share.chunk-size": "Yığın boyutu",
|
||||||
|
"admin.config.share.chunk-size.description": "İnternet bağlantınıza göre verimlilik ve güvenilirliği dengelemek için yüklemeleriniz için yığın boyutunu (bayt cinsinden) ayarlayın. Daha küçük parçalar kararsız bağlantılar için başarı oranlarını artırabilirken, daha büyük parçalar kararlı bağlantılar için yüklemeleri hızlandırır.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Paylaşım oluşturma modalini otomatik aç",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "Bir kullanıcı dosyaları seçtiğinde paylaşım oluşturma modu otomatik olarak görünür ve düğmeye manuel olarak tıklama ihtiyacını ortadan kaldırır.",
|
||||||
|
"admin.config.smtp.enabled": "Etkinleştirildi",
|
||||||
|
"admin.config.smtp.enabled.description": "SMTP'nin etkin olup olmadığı. Bunu yalnızca SMTP sunucunuzun ana bilgisayarını, bağlantı noktasını, e-postasını, kullanıcısını ve şifresini girdiyseniz true olarak ayarlayın.",
|
||||||
|
"admin.config.smtp.host": "Host",
|
||||||
|
"admin.config.smtp.host.description": "SMTP sunucusunun hostu",
|
||||||
|
"admin.config.smtp.port": "Port",
|
||||||
|
"admin.config.smtp.port.description": "SMTP sunucusunun portu",
|
||||||
|
"admin.config.smtp.email": "E-Posta",
|
||||||
|
"admin.config.smtp.email.description": "E-Postaların hangi adresten gönderileceği",
|
||||||
|
"admin.config.smtp.username": "Kullanıcı Adı",
|
||||||
|
"admin.config.smtp.username.description": "SMTP sunucusunun kullanıcı adı",
|
||||||
|
"admin.config.smtp.password": "Şifre",
|
||||||
|
"admin.config.smtp.password.description": "SMTP sunucusunun şifresi",
|
||||||
|
"admin.config.smtp.button.test": "Test e-postası gönder",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
|
"admin.config.oauth.allow-registration": "Kayıtlara izin ver",
|
||||||
|
"admin.config.oauth.allow-registration.description": "Sosyal Medya kayıtlarına izin verilip verilmeyeceği",
|
||||||
|
"admin.config.oauth.ignore-totp": "2FA görmezden gel",
|
||||||
|
"admin.config.oauth.ignore-totp.description": "Sosyal Medya ile giriş yapıldıktıktan sonra 2FA görmezden gelinip gelinmeyeceği",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
|
"admin.config.oauth.github-enabled.description": "GitHub girişine izin verilip verilmeyeceği",
|
||||||
|
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
||||||
|
"admin.config.oauth.github-client-id.description": "GitHub OAuth uygulamasının Client ID'si",
|
||||||
|
"admin.config.oauth.github-client-secret": "GitHub Client Secret",
|
||||||
|
"admin.config.oauth.github-client-secret.description": "GitHub OAuth uygulamasının Client Secret'i",
|
||||||
|
"admin.config.oauth.google-enabled": "Google",
|
||||||
|
"admin.config.oauth.google-enabled.description": "Google girişi izin verilip verilmeyeceği",
|
||||||
|
"admin.config.oauth.google-client-id": "Google Client ID",
|
||||||
|
"admin.config.oauth.google-client-id.description": "Google OAuth uygulamasının Client ID'si",
|
||||||
|
"admin.config.oauth.google-client-secret": "Google Client Secret",
|
||||||
|
"admin.config.oauth.google-client-secret.description": "Google OAuth uygulamasının Client Secret'i",
|
||||||
|
"admin.config.oauth.microsoft-enabled": "Microsoft",
|
||||||
|
"admin.config.oauth.microsoft-enabled.description": "Microsoft girişine izin verilip verilmeyeceği",
|
||||||
|
"admin.config.oauth.microsoft-tenant": "Microsoft Tenant",
|
||||||
|
"admin.config.oauth.microsoft-tenant.description": "Microsoft OAuth uygulamasının Tenant kimliği\nyaygın: Hem kişisel Microsoft hesabına hem de Microsoft Entra ID'den bir iş veya okul hesabına sahip kullanıcılar uygulamada oturum açabilir. kuruluşlar: Yalnızca Microsoft Entra ID'den iş veya okul hesabı olan kullanıcılar uygulamada oturum açabilir.\ntüketiciler: Yalnızca kişisel Microsoft hesabı olan kullanıcılar uygulamada oturum açabilir.\nMicrosoft Entra Tenant etki alanı adı veya GUID biçimindeki Tenant kimliği: Yalnızca belirli bir Microsoft Entra Tenant kullanıcısı (iş veya okul hesabına sahip dizin üyeleri veya kişisel Microsoft hesabına sahip dizin konukları) uygulamada oturum açabilir.",
|
||||||
|
"admin.config.oauth.microsoft-client-id": "Microsoft Client ID",
|
||||||
|
"admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth uygulamasının Client ID'si",
|
||||||
|
"admin.config.oauth.microsoft-client-secret": "Microsoft Client secret",
|
||||||
|
"admin.config.oauth.microsoft-client-secret.description": "Microsoft OAuth uygulamasının Client Secret'i",
|
||||||
|
"admin.config.oauth.discord-enabled": "Discord",
|
||||||
|
"admin.config.oauth.discord-enabled.description": "Discord girişine izin verilip verilmeyeceği",
|
||||||
|
"admin.config.oauth.discord-limited-guild": "Discord limitli sunucu ID'si",
|
||||||
|
"admin.config.oauth.discord-limited-guild.description": "Oturum açmayı belirli bir sunucudaki kullanıcılarla sınırlayın. Devre dışı bırakmak için boş bırakın.",
|
||||||
|
"admin.config.oauth.discord-client-id": "Discord Client ID",
|
||||||
|
"admin.config.oauth.discord-client-id.description": "Discord OAuth uygulamasının Client ID'si",
|
||||||
|
"admin.config.oauth.discord-client-secret": "Discord Client secret",
|
||||||
|
"admin.config.oauth.discord-client-secret.description": "Discord OAuth uygulamasının Client Secret'i",
|
||||||
|
"admin.config.oauth.oidc-enabled": "OpenID Bağlantısı",
|
||||||
|
"admin.config.oauth.oidc-enabled.description": "OpenID girişine izin verilip verilmeyeceği",
|
||||||
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Keşfetme URI'si",
|
||||||
|
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth uygulamasının Keşfetme URI'si",
|
||||||
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect kullanıcı adı sahiplenme",
|
||||||
|
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID belirtecinde kullanıcı adı sahiplenme. Bu yapılandırmanın ne olduğunu bilmiyorsanız boş bırakın.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
|
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth uygulamasının Client ID'si",
|
||||||
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client secret",
|
||||||
|
"admin.config.oauth.oidc-client-secret.description": "OpenID Connect OAuth uygulamasının Client Secret'i",
|
||||||
|
// 404
|
||||||
|
"404.description": "Haydaa, böyle bir sayfa yok.",
|
||||||
|
"404.button.home": "Beni eve götür",
|
||||||
|
// error
|
||||||
|
"error.title": "Hata",
|
||||||
|
"error.description": "Haydaa!",
|
||||||
|
"error.button.back": "Geri dön",
|
||||||
|
"error.msg.default": "Bir şeyler ters gitti.",
|
||||||
|
"error.msg.access_denied": "Doğrulama aşamasını iptal ettin, lütfen yeniden dene.",
|
||||||
|
"error.msg.expired_token": "Doğrulama aşaması çok uzun sürdü, lütfen yeniden dene.",
|
||||||
|
"error.msg.invalid_token": "Dahili Hata",
|
||||||
|
"error.msg.no_user": "Bu {0} hesabına bağlı kullanıcı mevcut değil.",
|
||||||
|
"error.msg.no_email": "Bu {0} hesaptan e-posta adresi alınamıyor.",
|
||||||
|
"error.msg.already_linked": "Bu {0} hesabı zaten başka bir hesaba bağlı.",
|
||||||
|
"error.msg.not_linked": "Bu {0} hesabı henüz bir hesaba bağlı değil.",
|
||||||
|
"error.msg.unverified_account": "Bu {0} hesabı doğrulanmamış, lütfen doğruladıktan sonra yeniden dene.",
|
||||||
|
"error.msg.user_not_allowed": "Giriş yapmana izin verilmiyor.",
|
||||||
|
"error.msg.cannot_get_user_info": "Bu {0} hesabından kullanıcı bilgilerinizi alamıyorum.",
|
||||||
|
"error.param.provider_github": "GitHub",
|
||||||
|
"error.param.provider_google": "Google",
|
||||||
|
"error.param.provider_microsoft": "Microsoft",
|
||||||
|
"error.param.provider_discord": "Discord",
|
||||||
|
"error.param.provider_oidc": "OpenID Bağlantısı",
|
||||||
|
// Common translations
|
||||||
|
"common.button.save": "Kaydet",
|
||||||
|
"common.button.create": "Oluştur",
|
||||||
|
"common.button.submit": "Gönder",
|
||||||
|
"common.button.delete": "Sil",
|
||||||
|
"common.button.cancel": "İptal",
|
||||||
|
"common.button.confirm": "Onayla",
|
||||||
|
"common.button.disable": "Etkisizleştir",
|
||||||
|
"common.button.share": "Paylaş",
|
||||||
|
"common.button.generate": "Oluştur",
|
||||||
|
"common.button.done": "Tamam",
|
||||||
|
"common.text.link": "Bağlantı",
|
||||||
|
"common.text.navigate-to-link": "Bağlantıya git",
|
||||||
|
"common.text.or": "ya da",
|
||||||
|
"common.button.go-back": "Geri dön",
|
||||||
|
"common.button.go-home": "Ana sayfaya dön",
|
||||||
|
"common.notify.copied": "Bağlantınız kopyalandı",
|
||||||
|
"common.success": "Başarılı",
|
||||||
|
"common.error": "Hata",
|
||||||
|
"common.error.unknown": "Bilinmeyen hata meydana geldi",
|
||||||
|
"common.error.invalid-email": "Geçersiz E-Posta adresi",
|
||||||
|
"common.error.too-short": "En azından {length} karakter olmalı",
|
||||||
|
"common.error.too-long": "En fazla {length} karakter olmalı",
|
||||||
|
"common.error.exact-length": "Tam tamına {length} karakter olmalı",
|
||||||
|
"common.error.invalid-number": "Bir sayı olmalı",
|
||||||
|
"common.error.field-required": "Bu alan gerekli"
|
||||||
|
};
|
||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"signIn.notify.totp-required.title": "Потрібна двофакторна аутентифікація",
|
"signIn.notify.totp-required.title": "Потрібна двофакторна аутентифікація",
|
||||||
"signIn.notify.totp-required.description": "Будь ласка, введіть код Вашої 2-х факторної аутентифікації",
|
"signIn.notify.totp-required.description": "Будь ласка, введіть код Вашої 2-х факторної аутентифікації",
|
||||||
"signIn.oauth.or": "АБО",
|
"signIn.oauth.or": "АБО",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "Крок 2: Перевірка коду",
|
"account.modal.totp.step2": "Крок 2: Перевірка коду",
|
||||||
"account.modal.totp.enterManually": "Ввести вручну",
|
"account.modal.totp.enterManually": "Ввести вручну",
|
||||||
"account.modal.totp.code": "Код",
|
"account.modal.totp.code": "Код",
|
||||||
"account.modal.totp.clickToCopy": "Натисніть, щоб скопіювати",
|
"common.button.clickToCopy": "Натисніть, щоб скопіювати",
|
||||||
"account.modal.totp.verify": "Підтвердити",
|
"account.modal.totp.verify": "Підтвердити",
|
||||||
"account.notify.totp.disable": "TOTP успішно відключено",
|
"account.notify.totp.disable": "TOTP успішно відключено",
|
||||||
"account.notify.totp.enable": "TOTP успішно увімкнено",
|
"account.notify.totp.enable": "TOTP успішно увімкнено",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "Адміністрування",
|
"admin.title": "Адміністрування",
|
||||||
"admin.button.users": "Управління користувачами",
|
"admin.button.users": "Управління користувачами",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "Конфігурація",
|
"admin.button.config": "Конфігурація",
|
||||||
"admin.version": "Версія",
|
"admin.version": "Версія",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "Права адміністратора",
|
"admin.users.modal.create.admin": "Права адміністратора",
|
||||||
"admin.users.modal.create.admin.description": "Якщо зазначено, користувач матиме доступ до панелі адміністратора.",
|
"admin.users.modal.create.admin.description": "Якщо зазначено, користувач матиме доступ до панелі адміністратора.",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "Завантажити",
|
"upload.title": "Завантажити",
|
||||||
"upload.notify.generic-error": "Сталася помилка під час завершення вашого завантаження.",
|
"upload.notify.generic-error": "Сталася помилка під час завершення вашого завантаження.",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "Місяця(-ів)",
|
"upload.modal.expires.month-plural": "Місяця(-ів)",
|
||||||
"upload.modal.expires.year-singular": "Рік",
|
"upload.modal.expires.year-singular": "Рік",
|
||||||
"upload.modal.expires.year-plural": "Роки (роки)",
|
"upload.modal.expires.year-plural": "Роки (роки)",
|
||||||
"upload.modal.accordion.description.title": "Опис",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "Примітка для одержувачів цього завантаження",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "Одержувачі листа",
|
"upload.modal.accordion.email.title": "Одержувачі листа",
|
||||||
"upload.modal.accordion.email.placeholder": "Одержувачі e-mail",
|
"upload.modal.accordion.email.placeholder": "Одержувачі e-mail",
|
||||||
"upload.modal.accordion.email.invalid-email": "Неприпустима адреса електронної пошти",
|
"upload.modal.accordion.email.invalid-email": "Неприпустима адреса електронної пошти",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"admin.config.general.app-url.description": "Адреса, на якій доступний Pingvin Share",
|
"admin.config.general.app-url.description": "Адреса, на якій доступний Pingvin Share",
|
||||||
"admin.config.general.show-home-page": "Показувати домашню сторінку",
|
"admin.config.general.show-home-page": "Показувати домашню сторінку",
|
||||||
"admin.config.general.show-home-page.description": "Показувати домашню сторінку чи ні",
|
"admin.config.general.show-home-page.description": "Показувати домашню сторінку чи ні",
|
||||||
|
"admin.config.general.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Логотип",
|
"admin.config.general.logo": "Логотип",
|
||||||
"admin.config.general.logo.description": "Змініть свій логотип, завантаживши нове зображення. Зображення має бути PNG і повинно мати формат 1:1.",
|
"admin.config.general.logo.description": "Змініть свій логотип, завантаживши нове зображення. Зображення має бути PNG і повинно мати формат 1:1.",
|
||||||
"admin.config.general.logo.placeholder": "Виберіть зображення",
|
"admin.config.general.logo.placeholder": "Виберіть зображення",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"admin.config.share.max-size.description": "Максимальний розмір файлу в байтах",
|
"admin.config.share.max-size.description": "Максимальний розмір файлу в байтах",
|
||||||
"admin.config.share.zip-compression-level": "Рівень стиснення Zip",
|
"admin.config.share.zip-compression-level": "Рівень стиснення Zip",
|
||||||
"admin.config.share.zip-compression-level.description": "Регулювання рівня балансу між розміром файлу і швидкістю стиснення. Допустимі значення від 0 до 9, з 0 без стиснення, а 9 - максимальне стиснення. ",
|
"admin.config.share.zip-compression-level.description": "Регулювання рівня балансу між розміром файлу і швидкістю стиснення. Допустимі значення від 0 до 9, з 0 без стиснення, а 9 - максимальне стиснення. ",
|
||||||
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "Увімкнено",
|
"admin.config.smtp.enabled": "Увімкнено",
|
||||||
"admin.config.smtp.enabled.description": "Чи увімкнено SMTP. Встановіть значення true тільки якщо ви ввели хост, порт, email, користувач і пароль вашого SMTP-сервера.",
|
"admin.config.smtp.enabled.description": "Чи увімкнено SMTP. Встановіть значення true тільки якщо ви ввели хост, порт, email, користувач і пароль вашого SMTP-сервера.",
|
||||||
"admin.config.smtp.host": "Хост",
|
"admin.config.smtp.host": "Хост",
|
||||||
@@ -327,10 +345,14 @@ 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.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "Дозволити реєстрацію",
|
"admin.config.oauth.allow-registration": "Дозволити реєстрацію",
|
||||||
"admin.config.oauth.allow-registration.description": "Дозволити користувачам реєструватися, використовуючи облікові записи соціальних мереж",
|
"admin.config.oauth.allow-registration.description": "Дозволити користувачам реєструватися, використовуючи облікові записи соціальних мереж",
|
||||||
"admin.config.oauth.ignore-totp": "Ігнорувати TOTP",
|
"admin.config.oauth.ignore-totp": "Ігнорувати TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "Ігнорувати TOTP при використанні соціальної авторизації",
|
"admin.config.oauth.ignore-totp.description": "Ігнорувати TOTP при використанні соціальної авторизації",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "Чи ввімкнено логін на GitHub",
|
"admin.config.oauth.github-enabled.description": "Чи ввімкнено логін на GitHub",
|
||||||
"admin.config.oauth.github-client-id": "ID клієнта GitHub",
|
"admin.config.oauth.github-client-id": "ID клієнта GitHub",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI Discovery URI додатка OpenID Connect OAuth",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI Discovery URI додатка OpenID Connect OAuth",
|
||||||
"admin.config.oauth.oidc-username-claim": "Заява на ім'я користувача OpenID Connect",
|
"admin.config.oauth.oidc-username-claim": "Заява на ім'я користувача OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Заява про ім'я користувача в токені OpenID Connect ID. Залиште порожнім, якщо не знаєте, що це за конфіг.",
|
"admin.config.oauth.oidc-username-claim.description": "Заява про ім'я користувача в токені OpenID Connect ID. Залиште порожнім, якщо не знаєте, що це за конфіг.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Клієнтський ідентифікатор додатка OpenID Connect OAuth",
|
"admin.config.oauth.oidc-client-id.description": "Клієнтський ідентифікатор додатка OpenID Connect OAuth",
|
||||||
"admin.config.oauth.oidc-client-secret": "Секрет клієнта OpenID Connect",
|
"admin.config.oauth.oidc-client-secret": "Секрет клієнта OpenID Connect",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "Цей обліковий запис {0} уже прив'язано до іншого акаунта.",
|
"error.msg.already_linked": "Цей обліковий запис {0} уже прив'язано до іншого акаунта.",
|
||||||
"error.msg.not_linked": "Цей обліковий запис {0} ще не прив'язаний до жодного акаунту.",
|
"error.msg.not_linked": "Цей обліковий запис {0} ще не прив'язаний до жодного акаунту.",
|
||||||
"error.msg.unverified_account": "Цей обліковий запис {0} не підтверджено, повторіть спробу після підтвердження.",
|
"error.msg.unverified_account": "Цей обліковий запис {0} не підтверджено, повторіть спробу після підтвердження.",
|
||||||
"error.msg.discord_guild_permission_denied": "У вас немає дозволу на вхід.",
|
"error.msg.user_not_allowed": "У вас немає дозволу на вхід.",
|
||||||
"error.msg.cannot_get_user_info": "Не вдається отримати інфу про користувача з цього {0} облікового запису.",
|
"error.msg.cannot_get_user_info": "Не вдається отримати інфу про користувача з цього {0} облікового запису.",
|
||||||
"error.param.provider_github": "GitHub",
|
"error.param.provider_github": "GitHub",
|
||||||
"error.param.provider_google": "Google",
|
"error.param.provider_google": "Google",
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export default {
|
|||||||
"home.bullet.b.name": "完全隐私",
|
"home.bullet.b.name": "完全隐私",
|
||||||
"home.bullet.b.description": "你的文件只属于你!不要将它放到第三方文件平台",
|
"home.bullet.b.description": "你的文件只属于你!不要将它放到第三方文件平台",
|
||||||
"home.bullet.c.name": "完全无限",
|
"home.bullet.c.name": "完全无限",
|
||||||
"home.bullet.c.description": "想上传多大都可以,更需要担心的是你的存储卷容量",
|
"home.bullet.c.description": "想上传多大都可以,硬盘容量的大小是唯一的限制",
|
||||||
"home.button.start": "开始使用",
|
"home.button.start": "开始使用",
|
||||||
"home.button.source": "源代码",
|
"home.button.source": "源代码",
|
||||||
// END /
|
// END /
|
||||||
@@ -33,7 +33,8 @@ export default {
|
|||||||
"signin.button.submit": "登录",
|
"signin.button.submit": "登录",
|
||||||
"signIn.notify.totp-required.title": "请继续两步验证",
|
"signIn.notify.totp-required.title": "请继续两步验证",
|
||||||
"signIn.notify.totp-required.description": "请输入一次性验证码",
|
"signIn.notify.totp-required.description": "请输入一次性验证码",
|
||||||
"signIn.oauth.or": "OR",
|
"signIn.oauth.or": "或",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "谷歌",
|
"signIn.oauth.google": "谷歌",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -56,8 +57,8 @@ export default {
|
|||||||
// END /auth/totp
|
// END /auth/totp
|
||||||
// /auth/reset-password
|
// /auth/reset-password
|
||||||
"resetPassword.title": "忘记密码?",
|
"resetPassword.title": "忘记密码?",
|
||||||
"resetPassword.description": "请输入电子邮件接受重置密码邮件",
|
"resetPassword.description": "请输入电子邮箱地址来接收重置密码邮件",
|
||||||
"resetPassword.notify.success": "A message with a link to reset your password has been sent if the email exists.",
|
"resetPassword.notify.success": "如果该电子邮箱存在,则已发送一条包含重置密码链接的邮件。",
|
||||||
"resetPassword.button.back": "返回登录页面",
|
"resetPassword.button.back": "返回登录页面",
|
||||||
"resetPassword.text.resetPassword": "重置密码",
|
"resetPassword.text.resetPassword": "重置密码",
|
||||||
"resetPassword.text.enterNewPassword": "请输入新密码",
|
"resetPassword.text.enterNewPassword": "请输入新密码",
|
||||||
@@ -80,10 +81,10 @@ export default {
|
|||||||
"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": "如果您不记得您的用户名和密码,解除和社交账号的关联可能会导致丢失账户。",
|
"account.modal.unlink.description": "如果您不记得您的用户名和密码,解除和社交账号的关联可能会导致丢失账户。",
|
||||||
"account.notify.oauth.unlinked.success": "解除关联成功",
|
"account.notify.oauth.unlinked.success": "解除关联成功",
|
||||||
"account.card.security.title": "安全",
|
"account.card.security.title": "安全",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "第二步:输入一次性验证码",
|
"account.modal.totp.step2": "第二步:输入一次性验证码",
|
||||||
"account.modal.totp.enterManually": "手动输入",
|
"account.modal.totp.enterManually": "手动输入",
|
||||||
"account.modal.totp.code": "验证码",
|
"account.modal.totp.code": "验证码",
|
||||||
"account.modal.totp.clickToCopy": "点击复制",
|
"common.button.clickToCopy": "点击复制",
|
||||||
"account.modal.totp.verify": "确定",
|
"account.modal.totp.verify": "确定",
|
||||||
"account.notify.totp.disable": "成功关闭两步验证!",
|
"account.notify.totp.disable": "成功关闭两步验证!",
|
||||||
"account.notify.totp.enable": "成功开启两步验证!",
|
"account.notify.totp.enable": "成功开启两步验证!",
|
||||||
@@ -151,6 +152,12 @@ export default {
|
|||||||
"account.reverseShares.modal.max-size.label": "共享文件上限",
|
"account.reverseShares.modal.max-size.label": "共享文件上限",
|
||||||
"account.reverseShares.modal.send-email": "发送邮件提醒",
|
"account.reverseShares.modal.send-email": "发送邮件提醒",
|
||||||
"account.reverseShares.modal.send-email.description": "当这个预留共享链接被用于共享时,发送邮件提醒",
|
"account.reverseShares.modal.send-email.description": "当这个预留共享链接被用于共享时,发送邮件提醒",
|
||||||
|
"account.reverseShares.modal.simplified": "简单模式",
|
||||||
|
"account.reverseShares.modal.simplified.description":
|
||||||
|
"让上传者更轻松地与你共享文件,他们仅能自定义共享的名称和描述。",
|
||||||
|
"account.reverseShares.modal.public-access": "公开访问",
|
||||||
|
"account.reverseShares.modal.public-access.description":
|
||||||
|
"让通过这个预留共享创建共享能被公开访问。如果禁用,将只有您和创建者能够访问。",
|
||||||
"account.reverseShares.modal.max-use.label": "最大使用次数",
|
"account.reverseShares.modal.max-use.label": "最大使用次数",
|
||||||
"account.reverseShares.modal.max-use.description": "这个预留共享链接可被用于创建共享的最大使用次数",
|
"account.reverseShares.modal.max-use.description": "这个预留共享链接可被用于创建共享的最大使用次数",
|
||||||
"account.reverseShare.never-expires": "这个预留共享永不过期",
|
"account.reverseShare.never-expires": "这个预留共享永不过期",
|
||||||
@@ -169,6 +176,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "管理",
|
"admin.title": "管理",
|
||||||
"admin.button.users": "用户管理",
|
"admin.button.users": "用户管理",
|
||||||
|
"admin.button.shares": "共享管理",
|
||||||
"admin.button.config": "配置管理",
|
"admin.button.config": "配置管理",
|
||||||
"admin.version": "版本",
|
"admin.version": "版本",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +203,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "管理员",
|
"admin.users.modal.create.admin": "管理员",
|
||||||
"admin.users.modal.create.admin.description": "如果勾选,用户将能访问管理员面板",
|
"admin.users.modal.create.admin.description": "如果勾选,用户将能访问管理员面板",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "共享管理",
|
||||||
|
"admin.shares.table.id": "共享 ID",
|
||||||
|
"admin.shares.table.username": "创建者",
|
||||||
|
"admin.shares.table.visitors": "访问者",
|
||||||
|
"admin.shares.table.expires": "过期时间",
|
||||||
|
"admin.shares.edit.delete.title": "删除共享 {id}",
|
||||||
|
"admin.shares.edit.delete.description": "你真的要删除这个共享吗?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "上传",
|
"upload.title": "上传",
|
||||||
"upload.notify.generic-error": "创建共享的过程中发生了错误",
|
"upload.notify.generic-error": "创建共享的过程中发生了错误",
|
||||||
@@ -229,8 +246,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "月",
|
"upload.modal.expires.month-plural": "月",
|
||||||
"upload.modal.expires.year-singular": "1 年",
|
"upload.modal.expires.year-singular": "1 年",
|
||||||
"upload.modal.expires.year-plural": "年",
|
"upload.modal.expires.year-plural": "年",
|
||||||
"upload.modal.accordion.description.title": "描述",
|
"upload.modal.accordion.name-and-description.title": "名称与描述",
|
||||||
"upload.modal.accordion.description.placeholder": "共享文件备注信息",
|
"upload.modal.accordion.name-and-description.name.placeholder": "名称",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "写给接收者的备注",
|
||||||
"upload.modal.accordion.email.title": "邮件提醒",
|
"upload.modal.accordion.email.title": "邮件提醒",
|
||||||
"upload.modal.accordion.email.placeholder": "收件人电子邮件地址",
|
"upload.modal.accordion.email.placeholder": "收件人电子邮件地址",
|
||||||
"upload.modal.accordion.email.invalid-email": "邮件地址不可用",
|
"upload.modal.accordion.email.invalid-email": "邮件地址不可用",
|
||||||
@@ -243,6 +261,7 @@ export default {
|
|||||||
"upload.modal.completed.never-expires": "这个共享永不过期",
|
"upload.modal.completed.never-expires": "这个共享永不过期",
|
||||||
"upload.modal.completed.expires-on": "这个共享将过期于 {expiration}.",
|
"upload.modal.completed.expires-on": "这个共享将过期于 {expiration}.",
|
||||||
"upload.modal.completed.share-ready": "共享创建完毕",
|
"upload.modal.completed.share-ready": "共享创建完毕",
|
||||||
|
"upload.modal.completed.notified-reverse-share-creator": "我们已经通知预留共享的创建者。您也可以通过其他方式将该链接手动分享给他们。",
|
||||||
// END /upload
|
// END /upload
|
||||||
// /share/[id]
|
// /share/[id]
|
||||||
"share.title": "共享 {shareId}",
|
"share.title": "共享 {shareId}",
|
||||||
@@ -252,6 +271,8 @@ export default {
|
|||||||
"share.error.removed.title": "共享已删除",
|
"share.error.removed.title": "共享已删除",
|
||||||
"share.error.not-found.title": "共享未找到",
|
"share.error.not-found.title": "共享未找到",
|
||||||
"share.error.not-found.description": "共享文件走丢了",
|
"share.error.not-found.description": "共享文件走丢了",
|
||||||
|
"share.error.access-denied.title": "私有共享",
|
||||||
|
"share.error.access-denied.description": "当前账户没有权限访问此共享",
|
||||||
"share.modal.password.title": "需要密码",
|
"share.modal.password.title": "需要密码",
|
||||||
"share.modal.password.description": "请输入密码来访问此共享",
|
"share.modal.password.description": "请输入密码来访问此共享",
|
||||||
"share.modal.password": "密码",
|
"share.modal.password": "密码",
|
||||||
@@ -262,7 +283,7 @@ export default {
|
|||||||
"share.table.name": "文件名",
|
"share.table.name": "文件名",
|
||||||
"share.table.size": "文件大小",
|
"share.table.size": "文件大小",
|
||||||
"share.modal.file-preview.error.not-supported.title": "该文件类型不支持预览",
|
"share.modal.file-preview.error.not-supported.title": "该文件类型不支持预览",
|
||||||
"share.modal.file-preview.error.not-supported.description": "A preview for this file type is unsupported. Please download the file to view it.",
|
"share.modal.file-preview.error.not-supported.description": "不支持此文件类型的预览,请下载文件查看。",
|
||||||
// END /share/[id]
|
// END /share/[id]
|
||||||
// /share/[id]/edit
|
// /share/[id]/edit
|
||||||
"share.edit.title": "编辑 {shareId}",
|
"share.edit.title": "编辑 {shareId}",
|
||||||
@@ -283,6 +304,8 @@ export default {
|
|||||||
"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.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "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": "选择图片",
|
||||||
@@ -314,6 +337,10 @@ export default {
|
|||||||
"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 文件压缩质量",
|
"admin.config.share.zip-compression-level": "Zip 文件压缩质量",
|
||||||
"admin.config.share.zip-compression-level.description": "调整压缩质量来平衡压缩文件的大小和压缩的速度。有效值介于 0 和 9 之间,0 为不压缩,9 为最高质量压缩。 ",
|
"admin.config.share.zip-compression-level.description": "调整压缩质量来平衡压缩文件的大小和压缩的速度。有效值介于 0 和 9 之间,0 为不压缩,9 为最高质量压缩。 ",
|
||||||
|
"admin.config.share.chunk-size": "块大小",
|
||||||
|
"admin.config.share.chunk-size.description": "根据你的互联网连接情况调整上传文件的块大小(以字节为单位),以平衡效率和可靠性。 较小的块有助于提高不稳定网络环境中的上传成功率,而较大的块则可以加快稳定网络环境中的上传速度。",
|
||||||
|
"admin.config.share.auto-open-share-modal": "自动打开创建共享对话框",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "每当用户选择完将要被上传的文件后,自动打开创建共享的对话框。",
|
||||||
"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": "主机名",
|
||||||
@@ -327,15 +354,19 @@ 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.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "允许注册",
|
"admin.config.oauth.allow-registration": "允许注册",
|
||||||
"admin.config.oauth.allow-registration.description": "允许用户通过登录社交账号来注册",
|
"admin.config.oauth.allow-registration.description": "允许用户通过登录社交账号来注册",
|
||||||
"admin.config.oauth.ignore-totp": "忽略两步验证",
|
"admin.config.oauth.ignore-totp": "忽略两步验证",
|
||||||
"admin.config.oauth.ignore-totp.description": "用户通过社交账号登录时是否忽略两步验证",
|
"admin.config.oauth.ignore-totp.description": "用户通过社交账号登录时是否忽略两步验证",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "是否启用 GitHub 账号登录",
|
"admin.config.oauth.github-enabled.description": "是否启用 GitHub 账号登录",
|
||||||
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
"admin.config.oauth.github-client-id": "GitHub Client ID",
|
||||||
"admin.config.oauth.github-client-id.description": "GitHub OAuth App 的 Client ID",
|
"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": "GitHub OAuth App 的 Client secret",
|
"admin.config.oauth.github-client-secret.description": "GitHub OAuth App 的 Client secret",
|
||||||
"admin.config.oauth.google-enabled": "谷歌",
|
"admin.config.oauth.google-enabled": "谷歌",
|
||||||
"admin.config.oauth.google-enabled.description": "是否启用谷歌账号登录",
|
"admin.config.oauth.google-enabled.description": "是否启用谷歌账号登录",
|
||||||
@@ -345,8 +376,8 @@ export default {
|
|||||||
"admin.config.oauth.google-client-secret.description": "Google OAuth App 的 Client secret",
|
"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": "是否启用微软账号登录",
|
"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": "Microsoft OAuth 应用的 租户(Tenant) ID,共有四种类型,参阅https://learn.microsoft.com/zh-cn/security/zero-trust/develop/identity-supported-account-types。\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 Client ID",
|
||||||
"admin.config.oauth.microsoft-client-id.description": "Microsoft OAuth App 的 Client ID",
|
"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",
|
||||||
@@ -365,6 +396,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth App 的 Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri.description": "OpenID Connect OAuth App 的 Discovery URI",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect 用户名请求",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect 用户名请求",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID token 中的用户名请求。如果您不知道这项配置是什么,请留空。",
|
"admin.config.oauth.oidc-username-claim.description": "OpenID Connect ID token 中的用户名请求。如果您不知道这项配置是什么,请留空。",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect 的 Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect 的 Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth App 的 Client ID",
|
"admin.config.oauth.oidc-client-id.description": "OpenID Connect OAuth App 的 Client ID",
|
||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect 的 Client secret",
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect 的 Client secret",
|
||||||
@@ -385,7 +422,7 @@ export default {
|
|||||||
"error.msg.already_linked": "{0} 这个账户已经关联到另一个账号。",
|
"error.msg.already_linked": "{0} 这个账户已经关联到另一个账号。",
|
||||||
"error.msg.not_linked": "{0} 这个账户尚未关联到任何账号。",
|
"error.msg.not_linked": "{0} 这个账户尚未关联到任何账号。",
|
||||||
"error.msg.unverified_account": "{0} 这个账户尚未验证,请在验证后重试。",
|
"error.msg.unverified_account": "{0} 这个账户尚未验证,请在验证后重试。",
|
||||||
"error.msg.discord_guild_permission_denied": "您无权登录。",
|
"error.msg.user_not_allowed": "您无权登录。",
|
||||||
"error.msg.cannot_get_user_info": "无法从 {0} 这个账户获取您的用户信息。",
|
"error.msg.cannot_get_user_info": "无法从 {0} 这个账户获取您的用户信息。",
|
||||||
"error.param.provider_github": "GitHub",
|
"error.param.provider_github": "GitHub",
|
||||||
"error.param.provider_google": "谷歌",
|
"error.param.provider_google": "谷歌",
|
||||||
@@ -407,7 +444,7 @@ export default {
|
|||||||
"common.text.navigate-to-link": "访问链接",
|
"common.text.navigate-to-link": "访问链接",
|
||||||
"common.text.or": "或",
|
"common.text.or": "或",
|
||||||
"common.button.go-back": "返回",
|
"common.button.go-back": "返回",
|
||||||
"common.button.go-home": "Go home",
|
"common.button.go-home": "返回主页",
|
||||||
"common.notify.copied": "已复制到剪贴板",
|
"common.notify.copied": "已复制到剪贴板",
|
||||||
"common.success": "成功",
|
"common.success": "成功",
|
||||||
"common.error": "错误",
|
"common.error": "错误",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default {
|
|||||||
"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": "OR",
|
||||||
|
"signIn.oauth.signInWith": "Sign in with",
|
||||||
"signIn.oauth.github": "GitHub",
|
"signIn.oauth.github": "GitHub",
|
||||||
"signIn.oauth.google": "Google",
|
"signIn.oauth.google": "Google",
|
||||||
"signIn.oauth.microsoft": "Microsoft",
|
"signIn.oauth.microsoft": "Microsoft",
|
||||||
@@ -95,7 +96,7 @@ export default {
|
|||||||
"account.modal.totp.step2": "第二步:輸入一次性驗證碼",
|
"account.modal.totp.step2": "第二步:輸入一次性驗證碼",
|
||||||
"account.modal.totp.enterManually": "手動輸入",
|
"account.modal.totp.enterManually": "手動輸入",
|
||||||
"account.modal.totp.code": "驗證碼",
|
"account.modal.totp.code": "驗證碼",
|
||||||
"account.modal.totp.clickToCopy": "複製",
|
"common.button.clickToCopy": "複製",
|
||||||
"account.modal.totp.verify": "確認",
|
"account.modal.totp.verify": "確認",
|
||||||
"account.notify.totp.disable": "成功關閉兩步驗證!",
|
"account.notify.totp.disable": "成功關閉兩步驗證!",
|
||||||
"account.notify.totp.enable": "成功開啟兩步驗證!",
|
"account.notify.totp.enable": "成功開啟兩步驗證!",
|
||||||
@@ -169,6 +170,7 @@ export default {
|
|||||||
// /admin
|
// /admin
|
||||||
"admin.title": "管理",
|
"admin.title": "管理",
|
||||||
"admin.button.users": "使用者管理",
|
"admin.button.users": "使用者管理",
|
||||||
|
"admin.button.shares": "Share management",
|
||||||
"admin.button.config": "配置管理",
|
"admin.button.config": "配置管理",
|
||||||
"admin.version": "版本",
|
"admin.version": "版本",
|
||||||
// END /admin
|
// END /admin
|
||||||
@@ -195,6 +197,15 @@ export default {
|
|||||||
"admin.users.modal.create.admin": "管理員",
|
"admin.users.modal.create.admin": "管理員",
|
||||||
"admin.users.modal.create.admin.description": "如果勾選,使用者將能查看管理員面板",
|
"admin.users.modal.create.admin.description": "如果勾選,使用者將能查看管理員面板",
|
||||||
// END /admin/users
|
// END /admin/users
|
||||||
|
// /admin/shares
|
||||||
|
"admin.shares.title": "Share management",
|
||||||
|
"admin.shares.table.id": "Share ID",
|
||||||
|
"admin.shares.table.username": "Creator",
|
||||||
|
"admin.shares.table.visitors": "Visitors",
|
||||||
|
"admin.shares.table.expires": "Expires At",
|
||||||
|
"admin.shares.edit.delete.title": "Delete share {id}",
|
||||||
|
"admin.shares.edit.delete.description": "Do you really want to delete this share?",
|
||||||
|
// END /admin/shares
|
||||||
// /upload
|
// /upload
|
||||||
"upload.title": "上傳",
|
"upload.title": "上傳",
|
||||||
"upload.notify.generic-error": "建立分享的過程中發生了錯誤",
|
"upload.notify.generic-error": "建立分享的過程中發生了錯誤",
|
||||||
@@ -229,8 +240,9 @@ export default {
|
|||||||
"upload.modal.expires.month-plural": "月",
|
"upload.modal.expires.month-plural": "月",
|
||||||
"upload.modal.expires.year-singular": "年",
|
"upload.modal.expires.year-singular": "年",
|
||||||
"upload.modal.expires.year-plural": "年",
|
"upload.modal.expires.year-plural": "年",
|
||||||
"upload.modal.accordion.description.title": "描述",
|
"upload.modal.accordion.name-and-description.title": "Name and description",
|
||||||
"upload.modal.accordion.description.placeholder": "分享檔案備註資訊",
|
"upload.modal.accordion.name-and-description.name.placeholder": "Name",
|
||||||
|
"upload.modal.accordion.name-and-description.description.placeholder": "Note for the recipients of this share",
|
||||||
"upload.modal.accordion.email.title": "Email提醒",
|
"upload.modal.accordion.email.title": "Email提醒",
|
||||||
"upload.modal.accordion.email.placeholder": "收件人Email地址",
|
"upload.modal.accordion.email.placeholder": "收件人Email地址",
|
||||||
"upload.modal.accordion.email.invalid-email": "Email地址不可用",
|
"upload.modal.accordion.email.invalid-email": "Email地址不可用",
|
||||||
@@ -283,6 +295,8 @@ export default {
|
|||||||
"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.session-duration": "Session Duration",
|
||||||
|
"admin.config.general.session-duration.description": "Time in hours after which a user must log in again (default: 3 months).",
|
||||||
"admin.config.general.logo": "Logo",
|
"admin.config.general.logo": "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": "選擇圖片",
|
||||||
@@ -314,6 +328,10 @@ export default {
|
|||||||
"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 壓縮等級",
|
"admin.config.share.zip-compression-level": "Zip 壓縮等級",
|
||||||
"admin.config.share.zip-compression-level.description": "調整壓縮等級以平衡檔案大小和壓縮速度。 有效值範圍從 0 到 9,其中 0 表示無壓縮,9 表示最大壓縮",
|
"admin.config.share.zip-compression-level.description": "調整壓縮等級以平衡檔案大小和壓縮速度。 有效值範圍從 0 到 9,其中 0 表示無壓縮,9 表示最大壓縮",
|
||||||
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
|
"admin.config.share.chunk-size.description": "Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
||||||
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
|
"admin.config.share.auto-open-share-modal.description": "The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
"admin.config.smtp.enabled": "啟用",
|
"admin.config.smtp.enabled": "啟用",
|
||||||
"admin.config.smtp.enabled.description": "是否開啟 SMTP,需輸入Host、Port、發送郵箱、使用者名稱和密碼後才有作用",
|
"admin.config.smtp.enabled.description": "是否開啟 SMTP,需輸入Host、Port、發送郵箱、使用者名稱和密碼後才有作用",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.smtp.host": "Host",
|
||||||
@@ -327,10 +345,14 @@ 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": "發送測試Email",
|
"admin.config.smtp.button.test": "發送測試Email",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates": "Trust unauthorized SMTP server certificates",
|
||||||
|
"admin.config.smtp.allow-unauthorized-certificates.description": "Only set this to true if you need to trust self signed certificates.",
|
||||||
"admin.config.oauth.allow-registration": "允許註冊",
|
"admin.config.oauth.allow-registration": "允許註冊",
|
||||||
"admin.config.oauth.allow-registration.description": "允許使用者以第三方登入註冊",
|
"admin.config.oauth.allow-registration.description": "允許使用者以第三方登入註冊",
|
||||||
"admin.config.oauth.ignore-totp": "略過 TOTP",
|
"admin.config.oauth.ignore-totp": "略過 TOTP",
|
||||||
"admin.config.oauth.ignore-totp.description": "當使用者使用第三方登入時,略過 TOTP 驗證",
|
"admin.config.oauth.ignore-totp.description": "當使用者使用第三方登入時,略過 TOTP 驗證",
|
||||||
|
"admin.config.oauth.disable-password": "Disable password login",
|
||||||
|
"admin.config.oauth.disable-password.description": "Whether to disable password login\nMake sure that an OAuth provider is properly configured before activating this configuration to avoid being locked out.",
|
||||||
"admin.config.oauth.github-enabled": "GitHub",
|
"admin.config.oauth.github-enabled": "GitHub",
|
||||||
"admin.config.oauth.github-enabled.description": "啟用 Github 登入",
|
"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",
|
||||||
@@ -365,6 +387,12 @@ export default {
|
|||||||
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
"admin.config.oauth.oidc-discovery-uri.description": "Discovery URI of the OpenID Connect OAuth app",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect username claim",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
"admin.config.oauth.oidc-username-claim.description": "Username claim in OpenID Connect ID token. Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
|
"admin.config.oauth.oidc-role-path.description": "Must be a valid JMES path referencing an array of roles. " + "Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
||||||
|
"admin.config.oauth.oidc-role-general-access.description": "Role required for general access. Must be present in a user’s roles for them to log in. " + "Leave it blank if you don't know what this config is.",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
||||||
|
"admin.config.oauth.oidc-role-admin-access.description": "Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " + "Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
"admin.config.oauth.oidc-client-id": "OpenID Connect Client ID",
|
||||||
"admin.config.oauth.oidc-client-id.description": "Client ID of the OpenID Connect 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": "OpenID Connect Client secret",
|
||||||
@@ -385,7 +413,7 @@ export default {
|
|||||||
"error.msg.already_linked": "此 {0} 帳號已與另一個帳號關聯。",
|
"error.msg.already_linked": "此 {0} 帳號已與另一個帳號關聯。",
|
||||||
"error.msg.not_linked": "此 {0} 帳號尚未關聯到任何帳號。",
|
"error.msg.not_linked": "此 {0} 帳號尚未關聯到任何帳號。",
|
||||||
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
"error.msg.unverified_account": "This {0} account is unverified, please try again after verification.",
|
||||||
"error.msg.discord_guild_permission_denied": "You are not allowed to sign in.",
|
"error.msg.user_not_allowed": "You are not allowed to sign in.",
|
||||||
"error.msg.cannot_get_user_info": "Can not get your user info from this {0} account.",
|
"error.msg.cannot_get_user_info": "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",
|
||||||
|
|||||||
@@ -1,14 +1,7 @@
|
|||||||
import {
|
import { Button, Container, createStyles, Group, Title } from "@mantine/core";
|
||||||
Button,
|
|
||||||
Container,
|
|
||||||
createStyles,
|
|
||||||
Group,
|
|
||||||
Text,
|
|
||||||
Title,
|
|
||||||
} from "@mantine/core";
|
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import Meta from "../components/Meta";
|
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage } from "react-intl";
|
||||||
|
import Meta from "../components/Meta";
|
||||||
|
|
||||||
const useStyles = createStyles((theme) => ({
|
const useStyles = createStyles((theme) => ({
|
||||||
root: {
|
root: {
|
||||||
@@ -21,19 +14,13 @@ const useStyles = createStyles((theme) => ({
|
|||||||
fontWeight: 900,
|
fontWeight: 900,
|
||||||
fontSize: 220,
|
fontSize: 220,
|
||||||
lineHeight: 1,
|
lineHeight: 1,
|
||||||
marginBottom: `calc(${theme.spacing.xl} * 100)`,
|
marginBottom: 20,
|
||||||
color: theme.colors.gray[2],
|
color: theme.colors.gray[2],
|
||||||
|
|
||||||
[theme.fn.smallerThan("sm")]: {
|
[theme.fn.smallerThan("sm")]: {
|
||||||
fontSize: 120,
|
fontSize: 120,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
description: {
|
|
||||||
maxWidth: 500,
|
|
||||||
margin: "auto",
|
|
||||||
marginBottom: `calc(${theme.spacing.xl} * 100)`,
|
|
||||||
},
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const ErrorNotFound = () => {
|
const ErrorNotFound = () => {
|
||||||
@@ -47,12 +34,7 @@ const ErrorNotFound = () => {
|
|||||||
<Title align="center" order={3}>
|
<Title align="center" order={3}>
|
||||||
<FormattedMessage id="404.description" />
|
<FormattedMessage id="404.description" />
|
||||||
</Title>
|
</Title>
|
||||||
<Text
|
<Group position="center" mt={50}>
|
||||||
color="dimmed"
|
|
||||||
align="center"
|
|
||||||
className={classes.description}
|
|
||||||
></Text>
|
|
||||||
<Group position="center">
|
|
||||||
<Button component={Link} href="/" variant="light">
|
<Button component={Link} href="/" variant="light">
|
||||||
<FormattedMessage id="404.button.home" />
|
<FormattedMessage id="404.button.home" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ import Config from "../types/config.type";
|
|||||||
import { CurrentUser } from "../types/user.type";
|
import { CurrentUser } from "../types/user.type";
|
||||||
import i18nUtil from "../utils/i18n.util";
|
import i18nUtil from "../utils/i18n.util";
|
||||||
import userPreferences from "../utils/userPreferences.util";
|
import userPreferences from "../utils/userPreferences.util";
|
||||||
|
import "moment/min/locales";
|
||||||
|
import moment from "moment";
|
||||||
|
|
||||||
const excludeDefaultLayoutRoutes = ["/admin/config/[category]"];
|
const excludeDefaultLayoutRoutes = ["/admin/config/[category]"];
|
||||||
|
|
||||||
@@ -84,6 +86,7 @@ function App({ Component, pageProps }: AppProps) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const language = useRef(pageProps.language);
|
const language = useRef(pageProps.language);
|
||||||
|
moment.locale(language.current);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -68,15 +68,12 @@ const MyShares = () => {
|
|||||||
<Table>
|
<Table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th>
|
||||||
|
<FormattedMessage id="account.shares.table.id" />
|
||||||
|
</th>
|
||||||
<th>
|
<th>
|
||||||
<FormattedMessage id="account.shares.table.name" />
|
<FormattedMessage id="account.shares.table.name" />
|
||||||
</th>
|
</th>
|
||||||
<MediaQuery smallerThan="md" styles={{ display: "none" }}>
|
|
||||||
<th>
|
|
||||||
<FormattedMessage id="account.shares.table.description" />
|
|
||||||
</th>
|
|
||||||
</MediaQuery>
|
|
||||||
|
|
||||||
<th>
|
<th>
|
||||||
<FormattedMessage id="account.shares.table.visitors" />
|
<FormattedMessage id="account.shares.table.visitors" />
|
||||||
</th>
|
</th>
|
||||||
@@ -90,18 +87,7 @@ const MyShares = () => {
|
|||||||
{shares.map((share) => (
|
{shares.map((share) => (
|
||||||
<tr key={share.id}>
|
<tr key={share.id}>
|
||||||
<td>{share.id}</td>
|
<td>{share.id}</td>
|
||||||
<MediaQuery smallerThan="sm" styles={{ display: "none" }}>
|
<td>{share.name}</td>
|
||||||
<td
|
|
||||||
style={{
|
|
||||||
overflow: "hidden",
|
|
||||||
textOverflow: "ellipsis",
|
|
||||||
whiteSpace: "nowrap",
|
|
||||||
maxWidth: "300px",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{share.description || ""}
|
|
||||||
</td>
|
|
||||||
</MediaQuery>
|
|
||||||
<td>{share.views}</td>
|
<td>{share.views}</td>
|
||||||
<td>
|
<td>
|
||||||
{moment(share.expiration).unix() === 0
|
{moment(share.expiration).unix() === 0
|
||||||
|
|||||||
@@ -72,6 +72,10 @@ export default function AppShellDemo() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const updateConfigVariable = (configVariable: UpdateConfig) => {
|
const updateConfigVariable = (configVariable: UpdateConfig) => {
|
||||||
|
if (configVariable.key === "general.appUrl") {
|
||||||
|
configVariable.value = sanitizeUrl(configVariable.value);
|
||||||
|
}
|
||||||
|
|
||||||
const index = updatedConfigVariables.findIndex(
|
const index = updatedConfigVariables.findIndex(
|
||||||
(item) => item.key === configVariable.key,
|
(item) => item.key === configVariable.key,
|
||||||
);
|
);
|
||||||
@@ -86,6 +90,10 @@ export default function AppShellDemo() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const sanitizeUrl = (url: string): string => {
|
||||||
|
return url.endsWith("/") ? url.slice(0, -1) : url;
|
||||||
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
configService.getByCategory(categoryId).then((configVariables) => {
|
configService.getByCategory(categoryId).then((configVariables) => {
|
||||||
setConfigVariables(configVariables);
|
setConfigVariables(configVariables);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { TbRefresh, TbSettings, TbUsers } from "react-icons/tb";
|
import { TbLink, TbRefresh, TbSettings, TbUsers } 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 useTranslate from "../../hooks/useTranslate.hook";
|
import useTranslate from "../../hooks/useTranslate.hook";
|
||||||
@@ -41,6 +41,11 @@ const Admin = () => {
|
|||||||
icon: TbUsers,
|
icon: TbUsers,
|
||||||
route: "/admin/users",
|
route: "/admin/users",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: t("admin.button.shares"),
|
||||||
|
icon: TbLink,
|
||||||
|
route: "/admin/shares",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: t("admin.button.config"),
|
title: t("admin.button.config"),
|
||||||
icon: TbSettings,
|
icon: TbSettings,
|
||||||
|
|||||||
74
frontend/src/pages/admin/shares.tsx
Normal file
74
frontend/src/pages/admin/shares.tsx
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import { Group, Space, Text, Title } from "@mantine/core";
|
||||||
|
import { useModals } from "@mantine/modals";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { FormattedMessage } from "react-intl";
|
||||||
|
import Meta from "../../components/Meta";
|
||||||
|
import ManageShareTable from "../../components/admin/shares/ManageShareTable";
|
||||||
|
import useTranslate from "../../hooks/useTranslate.hook";
|
||||||
|
import shareService from "../../services/share.service";
|
||||||
|
import { MyShare } from "../../types/share.type";
|
||||||
|
import toast from "../../utils/toast.util";
|
||||||
|
|
||||||
|
const Shares = () => {
|
||||||
|
const [shares, setShares] = useState<MyShare[]>([]);
|
||||||
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
|
||||||
|
const modals = useModals();
|
||||||
|
const t = useTranslate();
|
||||||
|
|
||||||
|
const getShares = () => {
|
||||||
|
setIsLoading(true);
|
||||||
|
shareService.list().then((shares) => {
|
||||||
|
setShares(shares);
|
||||||
|
setIsLoading(false);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const deleteShare = (share: MyShare) => {
|
||||||
|
modals.openConfirmModal({
|
||||||
|
title: t("admin.shares.edit.delete.title", {
|
||||||
|
id: share.id,
|
||||||
|
}),
|
||||||
|
children: (
|
||||||
|
<Text size="sm">
|
||||||
|
<FormattedMessage id="admin.shares.edit.delete.description" />
|
||||||
|
</Text>
|
||||||
|
),
|
||||||
|
labels: {
|
||||||
|
confirm: t("common.button.delete"),
|
||||||
|
cancel: t("common.button.cancel"),
|
||||||
|
},
|
||||||
|
confirmProps: { color: "red" },
|
||||||
|
onConfirm: async () => {
|
||||||
|
shareService
|
||||||
|
.remove(share.id)
|
||||||
|
.then(() => setShares(shares.filter((v) => v.id != share.id)))
|
||||||
|
.catch(toast.axiosError);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getShares();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Meta title={t("admin.shares.title")} />
|
||||||
|
<Group position="apart" align="baseline" mb={20}>
|
||||||
|
<Title mb={30} order={3}>
|
||||||
|
<FormattedMessage id="admin.shares.title" />
|
||||||
|
</Title>
|
||||||
|
</Group>
|
||||||
|
|
||||||
|
<ManageShareTable
|
||||||
|
shares={shares}
|
||||||
|
deleteShare={deleteShare}
|
||||||
|
isLoading={isLoading}
|
||||||
|
/>
|
||||||
|
<Space h="xl" />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Shares;
|
||||||
@@ -4,6 +4,7 @@ import Meta from "../components/Meta";
|
|||||||
import useTranslate from "../hooks/useTranslate.hook";
|
import useTranslate from "../hooks/useTranslate.hook";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage } from "react-intl";
|
||||||
|
import { safeRedirectPath } from "../utils/router.util";
|
||||||
|
|
||||||
const useStyle = createStyles({
|
const useStyle = createStyles({
|
||||||
title: {
|
title: {
|
||||||
@@ -39,7 +40,9 @@ export default function Error() {
|
|||||||
</Text>
|
</Text>
|
||||||
<Button
|
<Button
|
||||||
mt="xl"
|
mt="xl"
|
||||||
onClick={() => router.push((router.query.redirect as string) || "/")}
|
onClick={() =>
|
||||||
|
router.push(safeRedirectPath(router.query.redirect as string))
|
||||||
|
}
|
||||||
>
|
>
|
||||||
{t("error.button.back")}
|
{t("error.button.back")}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ export default function Home() {
|
|||||||
id="home.title"
|
id="home.title"
|
||||||
values={{
|
values={{
|
||||||
h: (chunks) => (
|
h: (chunks) => (
|
||||||
<span className={classes.highlight}>{chunks} </span>
|
<span className={classes.highlight}>{chunks}</span>
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -43,6 +43,12 @@ const Share = ({ shareId }: { shareId: string }) => {
|
|||||||
t("share.error.not-found.description"),
|
t("share.error.not-found.description"),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} else if (e.response.status == 403 && error == "share_removed") {
|
||||||
|
showErrorModal(
|
||||||
|
modals,
|
||||||
|
t("share.error.access-denied.title"),
|
||||||
|
t("share.error.access-denied.description"),
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
showErrorModal(modals, t("common.error"), t("common.error.unknown"));
|
showErrorModal(modals, t("common.error"), t("common.error.unknown"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,12 @@ const Share = ({ shareId }: { shareId: string }) => {
|
|||||||
"go-home",
|
"go-home",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} else if (e.response.status == 403 && error == "private_share") {
|
||||||
|
showErrorModal(
|
||||||
|
modals,
|
||||||
|
t("share.error.access-denied.title"),
|
||||||
|
t("share.error.access-denied.description"),
|
||||||
|
);
|
||||||
} else if (error == "share_password_required") {
|
} else if (error == "share_password_required") {
|
||||||
showEnterPasswordModal(modals, getShareToken);
|
showEnterPasswordModal(modals, getShareToken);
|
||||||
} else if (error == "share_token_required") {
|
} else if (error == "share_token_required") {
|
||||||
@@ -91,13 +97,13 @@ const Share = ({ shareId }: { shareId: string }) => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Meta
|
<Meta
|
||||||
title={t("share.title", { shareId })}
|
title={t("share.title", { shareId: share?.name || shareId })}
|
||||||
description={t("share.description")}
|
description={t("share.description")}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Group position="apart" mb="lg">
|
<Group position="apart" mb="lg">
|
||||||
<Box style={{ maxWidth: "70%" }}>
|
<Box style={{ maxWidth: "70%" }}>
|
||||||
<Title order={3}>{share?.id}</Title>
|
<Title order={3}>{share?.name || share?.id}</Title>
|
||||||
<Text size="sm">{share?.description}</Text>
|
<Text size="sm">{share?.description}</Text>
|
||||||
</Box>
|
</Box>
|
||||||
{share?.files.length > 1 && <DownloadAllButton shareId={shareId} />}
|
{share?.files.length > 1 && <DownloadAllButton shareId={shareId} />}
|
||||||
|
|||||||
@@ -17,12 +17,14 @@ const Share = ({ reverseShareToken }: { reverseShareToken: string }) => {
|
|||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
|
||||||
const [maxShareSize, setMaxShareSize] = useState(0);
|
const [maxShareSize, setMaxShareSize] = useState(0);
|
||||||
|
const [simplified, setSimplified] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
shareService
|
shareService
|
||||||
.setReverseShare(reverseShareToken)
|
.setReverseShare(reverseShareToken)
|
||||||
.then((reverseShareTokenData) => {
|
.then((reverseShareTokenData) => {
|
||||||
setMaxShareSize(parseInt(reverseShareTokenData.maxShareSize));
|
setMaxShareSize(parseInt(reverseShareTokenData.maxShareSize));
|
||||||
|
setSimplified(reverseShareTokenData.simplified);
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
@@ -38,7 +40,13 @@ const Share = ({ reverseShareToken }: { reverseShareToken: string }) => {
|
|||||||
|
|
||||||
if (isLoading) return <LoadingOverlay visible />;
|
if (isLoading) return <LoadingOverlay visible />;
|
||||||
|
|
||||||
return <Upload isReverseShare maxShareSize={maxShareSize} />;
|
return (
|
||||||
|
<Upload
|
||||||
|
isReverseShare
|
||||||
|
maxShareSize={maxShareSize}
|
||||||
|
simplified={simplified}
|
||||||
|
/>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Share;
|
export default Share;
|
||||||
|
|||||||
@@ -25,9 +25,11 @@ let createdShare: Share;
|
|||||||
const Upload = ({
|
const Upload = ({
|
||||||
maxShareSize,
|
maxShareSize,
|
||||||
isReverseShare = false,
|
isReverseShare = false,
|
||||||
|
simplified,
|
||||||
}: {
|
}: {
|
||||||
maxShareSize?: number;
|
maxShareSize?: number;
|
||||||
isReverseShare: boolean;
|
isReverseShare: boolean;
|
||||||
|
simplified: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
const modals = useModals();
|
const modals = useModals();
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
@@ -40,6 +42,7 @@ const Upload = ({
|
|||||||
const chunkSize = useRef(parseInt(config.get("share.chunkSize")));
|
const chunkSize = useRef(parseInt(config.get("share.chunkSize")));
|
||||||
|
|
||||||
maxShareSize ??= parseInt(config.get("share.maxSize"));
|
maxShareSize ??= parseInt(config.get("share.maxSize"));
|
||||||
|
const autoOpenCreateUploadModal = config.get("share.autoOpenShareModal");
|
||||||
|
|
||||||
const uploadFiles = async (share: CreateShare, files: FileUpload[]) => {
|
const uploadFiles = async (share: CreateShare, files: FileUpload[]) => {
|
||||||
setisUploading(true);
|
setisUploading(true);
|
||||||
@@ -121,7 +124,6 @@ const Upload = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const showCreateUploadModalCallback = (files: FileUpload[]) => {
|
const showCreateUploadModalCallback = (files: FileUpload[]) => {
|
||||||
setFiles(files);
|
|
||||||
showCreateUploadModal(
|
showCreateUploadModal(
|
||||||
modals,
|
modals,
|
||||||
{
|
{
|
||||||
@@ -133,12 +135,22 @@ const Upload = ({
|
|||||||
),
|
),
|
||||||
enableEmailRecepients: config.get("email.enableShareEmailRecipients"),
|
enableEmailRecepients: config.get("email.enableShareEmailRecipients"),
|
||||||
maxExpirationInHours: config.get("share.maxExpiration"),
|
maxExpirationInHours: config.get("share.maxExpiration"),
|
||||||
|
simplified,
|
||||||
},
|
},
|
||||||
files,
|
files,
|
||||||
uploadFiles,
|
uploadFiles,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleDropzoneFilesChanged = (files: FileUpload[]) => {
|
||||||
|
if (autoOpenCreateUploadModal) {
|
||||||
|
setFiles(files);
|
||||||
|
showCreateUploadModalCallback(files);
|
||||||
|
} else {
|
||||||
|
setFiles((oldArr) => [...oldArr, ...files]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Check if there are any files that failed to upload
|
// Check if there are any files that failed to upload
|
||||||
const fileErrorCount = files.filter(
|
const fileErrorCount = files.filter(
|
||||||
@@ -191,8 +203,13 @@ const Upload = ({
|
|||||||
</Button>
|
</Button>
|
||||||
</Group>
|
</Group>
|
||||||
<Dropzone
|
<Dropzone
|
||||||
|
title={
|
||||||
|
!autoOpenCreateUploadModal && files.length > 0
|
||||||
|
? t("share.edit.append-upload")
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
maxShareSize={maxShareSize}
|
maxShareSize={maxShareSize}
|
||||||
showCreateUploadModalCallback={showCreateUploadModalCallback}
|
onFilesChanged={handleDropzoneFilesChanged}
|
||||||
isUploading={isUploading}
|
isUploading={isUploading}
|
||||||
/>
|
/>
|
||||||
{files.length > 0 && (
|
{files.length > 0 && (
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { setCookie } from "cookies-next";
|
import { deleteCookie, setCookie } from "cookies-next";
|
||||||
import mime from "mime-types";
|
import mime from "mime-types";
|
||||||
import { FileUploadResponse } from "../types/File.type";
|
import { FileUploadResponse } from "../types/File.type";
|
||||||
|
|
||||||
@@ -11,12 +11,18 @@ import {
|
|||||||
} from "../types/share.type";
|
} from "../types/share.type";
|
||||||
import api from "./api.service";
|
import api from "./api.service";
|
||||||
|
|
||||||
|
const list = async (): Promise<MyShare[]> => {
|
||||||
|
return (await api.get(`shares/all`)).data;
|
||||||
|
};
|
||||||
|
|
||||||
const create = async (share: CreateShare) => {
|
const create = async (share: CreateShare) => {
|
||||||
return (await api.post("shares", share)).data;
|
return (await api.post("shares", share)).data;
|
||||||
};
|
};
|
||||||
|
|
||||||
const completeShare = async (id: string) => {
|
const completeShare = async (id: string) => {
|
||||||
return (await api.post(`shares/${id}/complete`)).data;
|
const response = (await api.post(`shares/${id}/complete`)).data;
|
||||||
|
deleteCookie("reverse_share_token");
|
||||||
|
return response;
|
||||||
};
|
};
|
||||||
|
|
||||||
const revertComplete = async (id: string) => {
|
const revertComplete = async (id: string) => {
|
||||||
@@ -103,6 +109,8 @@ const createReverseShare = async (
|
|||||||
maxShareSize: number,
|
maxShareSize: number,
|
||||||
maxUseCount: number,
|
maxUseCount: number,
|
||||||
sendEmailNotification: boolean,
|
sendEmailNotification: boolean,
|
||||||
|
simplified: boolean,
|
||||||
|
publicAccess: boolean,
|
||||||
) => {
|
) => {
|
||||||
return (
|
return (
|
||||||
await api.post("reverseShares", {
|
await api.post("reverseShares", {
|
||||||
@@ -110,6 +118,8 @@ const createReverseShare = async (
|
|||||||
maxShareSize: maxShareSize.toString(),
|
maxShareSize: maxShareSize.toString(),
|
||||||
maxUseCount,
|
maxUseCount,
|
||||||
sendEmailNotification,
|
sendEmailNotification,
|
||||||
|
simplified,
|
||||||
|
publicAccess,
|
||||||
})
|
})
|
||||||
).data;
|
).data;
|
||||||
};
|
};
|
||||||
@@ -129,6 +139,7 @@ const removeReverseShare = async (id: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
list,
|
||||||
create,
|
create,
|
||||||
completeShare,
|
completeShare,
|
||||||
revertComplete,
|
revertComplete,
|
||||||
|
|||||||
@@ -2,15 +2,27 @@ import User from "./user.type";
|
|||||||
|
|
||||||
export type Share = {
|
export type Share = {
|
||||||
id: string;
|
id: string;
|
||||||
|
name?: string;
|
||||||
files: any;
|
files: any;
|
||||||
creator: User;
|
creator?: User;
|
||||||
description?: string;
|
description?: string;
|
||||||
expiration: Date;
|
expiration: Date;
|
||||||
|
size: number;
|
||||||
hasPassword: boolean;
|
hasPassword: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type CompletedShare = Share & {
|
||||||
|
/**
|
||||||
|
* undefined means is not reverse share
|
||||||
|
* true means server was send email to reverse share creator
|
||||||
|
* false means server was not send email to reverse share creator
|
||||||
|
* */
|
||||||
|
notifyReverseShareCreator: boolean | undefined;
|
||||||
|
};
|
||||||
|
|
||||||
export type CreateShare = {
|
export type CreateShare = {
|
||||||
id: string;
|
id: string;
|
||||||
|
name?: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
recipients: string[];
|
recipients: string[];
|
||||||
expiration: string;
|
expiration: string;
|
||||||
|
|||||||
7
frontend/src/utils/router.util.ts
Normal file
7
frontend/src/utils/router.util.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export function safeRedirectPath(path: string | undefined) {
|
||||||
|
if (!path) return "/";
|
||||||
|
|
||||||
|
if (!path.startsWith("/")) return `/${path}`;
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
1615
package-lock.json
generated
Normal file
1615
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user