Compare commits

...

120 Commits

Author SHA1 Message Date
schlagmichdoch
fb6fe7ae61 Implement libheif v1.19.3 instead of heic2any to prevent browser crashes with some iOS 18 heic image files 2024-11-11 20:39:46 +01:00
schlagmichdoch
00d2757fdc Fix thumbnail creation on very large images or images with extreme dimensions (#332) 2024-11-11 18:22:21 +01:00
schlagmichdoch
ab67c5858d FAQ: Update link whose certificate has expired 2024-08-22 14:29:10 +02:00
schlagmichdoch
b34b3f7b39 Fix and update apache config (fixes #312) 2024-08-17 21:02:20 +02:00
schlagmichdoch
3e502a76d0 Increase version to v1.10.10
## Enhancements
- Make displayName field more intuitive by hiding the placeholder when it is focussed (#319)

## Fixes
- Fixes substring error on server (#308)

## Languages
- New Language Czech
- New Language Ukrainian
- Translations update from Hosted Weblate (Indonesian)
2024-08-17 16:04:08 +02:00
schlagmichdoch
08af4670ee Enable Czech and Ukrainian translations 2024-08-17 15:58:46 +02:00
schlagmichdoch
a458c00213 Merge pull request #309 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-08-16 16:06:46 +02:00
Hosted Weblate
2e088b8434 Translated using Weblate (Indonesian)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ian Perdiansah <ianperdiansah05@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2024-08-16 14:06:28 +00:00
Hosted Weblate
31e3b4304c Translated using Weblate (Czech)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ladislav Vlach <vlach.ladislav@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translation: PairDrop/pairdrop-spa
2024-08-16 14:06:28 +00:00
Hosted Weblate
d73e5666b9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Ukrainian)

Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/uk/
Translation: PairDrop/pairdrop-spa
2024-08-16 14:06:27 +00:00
schlagmichdoch
96a055b7d0 Merge branch 'fix-displayname-firefox' 2024-08-16 16:03:35 +02:00
schlagmichdoch
703894e309 update dev nginx conf parameter http2 to new syntax 2024-08-16 16:03:25 +02:00
schlagmichdoch
13f7d36da0 Increase contrast between default badge and text 2024-08-07 20:52:10 +02:00
schlagmichdoch
1549ff48c9 Remove selection from text if displayname is blurred 2024-08-07 20:15:38 +02:00
schlagmichdoch
9f4d99c8db Prevent edited displayname from flickering on page load by changing loading order 2024-08-07 15:27:40 +02:00
schlagmichdoch
563c8dd8a8 Remove redundant placeholder which is added back when page is localized. 2024-08-07 15:27:40 +02:00
schlagmichdoch
43c346894d Make displayName field more intuitive by collapsing it when focussed and empty. (fixes #319) 2024-08-07 15:27:39 +02:00
schlagmichdoch
a68cd75b71 Merge pull request #316 from avadhesh18/patch-1 2024-07-28 16:17:19 +02:00
Avadhesh
e85a2e6293 Update README.md
Improved the summary because "List view" was confusing.
2024-07-28 11:55:47 +05:30
schlagmichdoch
794e6304fe Merge pull request #314 from schlagmichdoch/reduce-docker-size
Switch Docker base image to reduce size
2024-07-17 15:41:25 +02:00
schlagmichdoch
f9b8b0fadf Fix dev environment variable FQDN missing and update docs 2024-07-17 15:37:39 +02:00
schlagmichdoch
10f648b7cd Reduce image size by switching to alpine and excluding folders from being copied into the image 2024-07-17 14:44:08 +02:00
schlagmichdoch
331c61fec8 Change docs to reflect that dev files are now included in master branch 2024-07-14 13:10:16 +02:00
schlagmichdoch
fa24e77d3b rename directory docker to dev 2024-07-14 13:10:09 +02:00
schlagmichdoch
6ca039910a fix dev docker and docs 2024-07-13 21:50:45 +02:00
schlagmichdoch
9f02f7b3ca add docker-compose-dev.yml and needed conf files 2024-07-13 21:50:45 +02:00
schlagmichdoch
04d65da779 Fix substring error if remoteAddress is undefined and replace deprecated request.connection with request.socket (fixes #308) 2024-07-13 21:50:44 +02:00
schlagmichdoch
e6f2c776dc Remove duplicate Firewall section 2024-07-13 16:49:06 +02:00
schlagmichdoch
b0711de5b9 Increase version to v1.10.9
## Fixes
- Updated Node.js dependencies

## Languages
- New Language Belarusian
- New Language Danish
- New Language Hebrew
- Translations update from Hosted Weblate (French, Japanese, Turkish, Russian)
2024-07-01 18:56:51 +02:00
schlagmichdoch
d9a6ed4a47 Node.js dependencies updated 2024-07-01 18:52:36 +02:00
schlagmichdoch
5dd36da962 Enable Belarusian, Danish, and Hebrew translations 2024-07-01 18:47:26 +02:00
schlagmichdoch
8bc65ed622 Merge pull request #289 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-07-01 18:35:14 +02:00
Hosted Weblate
5625cb0ca6 Translated using Weblate (Korean)
Currently translated at 13.2% (22 of 166 strings)

Added translation using Weblate (Korean)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 뉴윈연구소 <oswincount@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ko/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
74e5e2286f Translated using Weblate (French)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Czech)

Currently translated at 3.0% (5 of 166 strings)

Added translation using Weblate (Czech)

Translated using Weblate (Catalan)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Guillaume Dorce <polynux.dev@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Netleak <netleak@zendovo.eu>
Co-authored-by: gmassipg <gerardmassipgil@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ca/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
1a254765fe Translated using Weblate (Hebrew)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Liraz Shalom <liraz747.sh@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/he/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
27a698c762 Translated using Weblate (French)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Czech)

Currently translated at 3.0% (5 of 166 strings)

Added translation using Weblate (Czech)

Translated using Weblate (Catalan)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Guillaume Dorce <polynux.dev@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Netleak <netleak@zendovo.eu>
Co-authored-by: gmassipg <gerardmassipgil@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ca/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
971917bc77 Translated using Weblate (French)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Czech)

Currently translated at 3.0% (5 of 166 strings)

Added translation using Weblate (Czech)

Translated using Weblate (Catalan)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Guillaume Dorce <polynux.dev@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Netleak <netleak@zendovo.eu>
Co-authored-by: gmassipg <gerardmassipgil@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ca/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
1eefd4720f Translated using Weblate (Japanese)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: mottcha <89951503+mottcha@users.noreply.github.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:01 +02:00
Hosted Weblate
ff92e606ff Translated using Weblate (Belarusian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Belarusian)

Currently translated at 56.6% (94 of 166 strings)

Added translation using Weblate (Belarusian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Troja <d.iwowi.b@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/be/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:00 +02:00
Hosted Weblate
e53e4adcdf Translated using Weblate (Russian)
Currently translated at 88.5% (147 of 166 strings)

Co-authored-by: Ed Asriyan <webslate.org@asriyan.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:00 +02:00
Hosted Weblate
fda19dc819 Translated using Weblate (Danish)
Currently translated at 99.3% (165 of 166 strings)

Added translation using Weblate (Danish)

Co-authored-by: Halfdan <gamerhalfdan@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/da/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:00 +02:00
Hosted Weblate
78d9ba45d3 Translated using Weblate (Turkish)
Currently translated at 0.0% (0 of 166 strings)

Translated using Weblate (Turkish)

Currently translated at 82.5% (137 of 166 strings)

Co-authored-by: Enhar Ukalo <uenhar@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
Translation: PairDrop/pairdrop-spa
2024-07-01 18:33:00 +02:00
schlagmichdoch
488762bbce Update faq.md
Co-authored-by: babstar99 <babstar99@users.noreply.github.com>
2024-04-18 22:26:27 +02:00
schlagmichdoch
80a5c0efdb Increase version to v1.10.8
## Fixes
- Received message empty when loaded from queue (#288)

## Languages
- New Language Hungarian
- New Language Polish
- New Language Traditional Chinese
- Translations update from Hosted Weblate (Portuguese (Brazil), Russian, Japanese, Arabic, Indonesian, Dutch, French)
2024-04-18 16:30:33 +02:00
schlagmichdoch
a9d1273b3c Install npm dependency patches via 'npm audit fix' 2024-04-18 16:22:36 +02:00
schlagmichdoch
c8484ab104 Enable Hungarian, Polish, and Traditional Chinese Translations 2024-04-18 16:16:36 +02:00
schlagmichdoch
05827b12ca Rename new Chinese translation files to match their browser language strings 2024-04-17 21:34:19 +02:00
schlagmichdoch
1256dcdcbd Merge pull request #270 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-04-17 21:30:57 +02:00
Hosted Weblate
5e79ef0d9f Added translation using Weblate (Yue (Traditional))
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
2024-04-17 20:56:08 +02:00
Hosted Weblate
add361c284 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Chinese (Traditional))

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hant/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
fd0c32faad Added translation using Weblate (Finnish)
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Unknowwed <unknowwed202@gmail.com>
2024-04-17 20:56:08 +02:00
Hosted Weblate
f0cfb4833d Translated using Weblate (French)
Currently translated at 98.7% (164 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Thumuss <42680097+Thumuss@users.noreply.github.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fr/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
46b6b38ad5 Translated using Weblate (Dutch)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Arne Cuperus <cuperusarne@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nl/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
3cc2ab99b5 Translated using Weblate (Indonesian)
Currently translated at 93.9% (156 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
61861df99e Translated using Weblate (Arabic)
Currently translated at 83.7% (139 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
6330f09486 Translated using Weblate (Polish)
Currently translated at 100.0% (166 of 166 strings)

Added translation using Weblate (Polish)

Co-authored-by: Ash Mad <ash729@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/pl/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
e07255398f Added translation using Weblate (Hebrew)
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
2024-04-17 20:56:08 +02:00
Hosted Weblate
cce97a6496 Translated using Weblate (Hungarian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Hungarian)

Currently translated at 47.5% (79 of 166 strings)

Added translation using Weblate (Hungarian)

Co-authored-by: Balázs Szeles <zutvas@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/hu/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
9c98bc3e9b Translated using Weblate (Japanese)
Currently translated at 98.1% (163 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
63717aae82 Translated using Weblate (Russian)
Currently translated at 87.3% (145 of 166 strings)

Translated using Weblate (Russian)

Currently translated at 87.3% (145 of 166 strings)

Co-authored-by: Drako 1 <caesarrulezzz@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
Hosted Weblate
08aa1e62a4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.9% (161 of 166 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.9% (161 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Richard Willian <eliteplayer000@gmail.com>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/pt_BR/
Translation: PairDrop/pairdrop-spa
2024-04-17 20:56:08 +02:00
schlagmichdoch
828caa4226 Merge pull request #286 from codyandersan/patch-1
Removed duplicate feature in README.md
2024-04-17 20:43:02 +02:00
schlagmichdoch
35f47d9063 Fix inner text being cleared when viewing next received text from queue + prevent skipping of queue entry when timing is bad by checking for existing timeout
Co-authored-by: klmkyo <mail@mklimek.dev>
2024-04-17 20:38:33 +02:00
Cody Andersan
6ca37bd390 Update README.md
Removed duplicate feature.
2024-03-31 08:42:03 +05:30
schlagmichdoch
be46e7d4af Add some more info to the FAQ 2024-02-22 16:13:38 +01:00
schlagmichdoch
3c1bc9f82f Update answer for saving images to the iOS gallery and add linebreaks for better readability 2024-02-18 01:15:52 +01:00
schlagmichdoch
892e84c834 Update Support paragraph (fixes #274) 2024-02-18 00:05:00 +01:00
schlagmichdoch
d6287c4cf0 Increase version to v1.10.7
## Enhancements
- Implemented drag and drop into text fields
- Tidy up code
- Translations update from Hosted Weblate (Italian)

## Fixes
- Received URLs with single letter subdomains not hydrated into links #258
- Button does not change color on hover (#262 + #263)
- On Windows Edge, PeerUI shows „preparing“ when file selector is cancelled (#257)
2024-02-09 03:53:53 +01:00
schlagmichdoch
c83e55b448 Merge pull request #253 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-02-09 03:46:54 +01:00
Hosted Weblate
49160f9b02 Translated using Weblate (Italian)
Currently translated at 100.0% (166 of 166 strings)

Translated using Weblate (Italian)

Currently translated at 87.9% (146 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Luca FiltroMan <FiltroMan@users.noreply.hosted.weblate.org>
Co-authored-by: Radosław Rudner <radek.rud112@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
Translation: PairDrop/pairdrop-spa
2024-02-09 03:46:01 +01:00
schlagmichdoch
7be2830a08 Merge pull request #259 from schlagmichdoch/fix_url_hydration
Prepare next patch version
2024-02-09 03:44:41 +01:00
schlagmichdoch
1f3dd080a0 Fix canceling file selector on Windows Edge sometimes blocks UI (#257) 2024-02-09 03:41:41 +01:00
schlagmichdoch
5d709966af Fix button color change on hover (fixes #262) 2024-02-09 03:40:21 +01:00
schlagmichdoch
99b0c6ff01 Fix URL not replaced with link node (fixes #258), beautify text via regex without rendering it, and fix execution order 2024-02-01 14:25:38 +01:00
schlagmichdoch
76e08927de Enable drag and drop and pasting in text fields; Tidy up existing drag and drop code. 2024-02-01 14:25:38 +01:00
schlagmichdoch
9118b0ae06 Use default line-height for textareas 2024-02-01 14:25:38 +01:00
schlagmichdoch
b36105b1cf Remove trailing back quote` from command in how-to.md
Fixes #256
2024-01-30 19:09:09 +01:00
schlagmichdoch
ad4f727d19 Merge pull request #212 from comradekingu/patch-2
README reworked
2024-01-30 19:05:00 +01:00
schlagmichdoch
3fa0873bc4 Increase version to v1.10.6
## Changes
- Fix loading error on older iOS and Mac versions
- Fix websocket-fallback info text position
- Translations update from Hosted Weblate (Turkish, Japanese, Indonesian)
2024-01-21 20:09:11 +01:00
schlagmichdoch
a03482bc7f Merge branch 'master' into translate 2024-01-21 20:01:09 +01:00
schlagmichdoch
40aa46fdd9 Merge pull request #245 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-01-21 19:56:08 +01:00
Hosted Weblate
9003094e49 Translated using Weblate (Indonesian)
Currently translated at 93.9% (156 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2024-01-21 19:55:10 +01:00
Hosted Weblate
0459a361c3 Translated using Weblate (Japanese)
Currently translated at 98.1% (163 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: RintanBroadleaf <rintanbroadleaf@outlook.jp>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/
Translation: PairDrop/pairdrop-spa
2024-01-21 19:55:10 +01:00
Hosted Weblate
10a669d7c6 Translated using Weblate (Turkish)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/tr/
Translation: PairDrop/pairdrop-spa
2024-01-21 19:55:10 +01:00
schlagmichdoch
3fbca72d74 Merge pull request #243 from schlagmichdoch/fix-regex-error
Fix Error Invalid Group Specifier Name on MacOS Safari and iOS Firefox on older MacOS/iOS
2024-01-21 19:53:57 +01:00
Allan Nordhøy
f048c4f1bd GIF 2024-01-13 13:46:19 +00:00
Allan Nordhøy
6c1672ba25 Fixing conflicts, better 2024-01-13 13:44:44 +00:00
Allan Nordhøy
caf19bdb45 Merge branch 'master' into patch-2 2024-01-13 13:25:31 +00:00
Allan Nordhøy
5dcda58ce5 Structure and requested fixes 2024-01-13 13:18:06 +00:00
schlagmichdoch
59360fb047 Fix websocket-fallback info text not centered when line is broken 2024-01-12 01:43:08 +01:00
schlagmichdoch
2e15a018da Fix Error Invalid Group Specifier Name on Safari by removing REGEX lookbehind group construct (fixes #239) 2024-01-12 01:23:14 +01:00
schlagmichdoch
041261be2a Fix url argument case ?share_target 2024-01-06 16:15:30 +01:00
schlagmichdoch
f152645452 Increase version to v1.10.5
## Changes
- Fix Zip Release workflow
2024-01-06 15:41:39 +01:00
schlagmichdoch
a7f5d336c3 Fix Zip Release workflow: wrong upload path 2024-01-06 15:37:05 +01:00
schlagmichdoch
c9e4510f65 Increase version to v1.10.4
## Changes
- Use blue icons as favicons for better contrast (#235)
- Fix pairdrop-cli exit on error
- Enhancement: On release: Prevent nesting of pairdrop-cli folder inside pairdrop-cli.zip
- Enhance documentation for pairdrop-cli and sending from context menu (#236)
- Translations update from Hosted Weblate
2024-01-06 15:30:20 +01:00
schlagmichdoch
70f74923e6 Merge branch 'master' into translate 2024-01-06 15:23:21 +01:00
schlagmichdoch
6217042f12 Merge pull request #229 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2024-01-06 15:22:42 +01:00
Hosted Weblate
4659ef2041 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Eric <zxmegaxqug@hldrive.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:30 +01:00
Hosted Weblate
a21881b7ca Translated using Weblate (Kannada)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Chethan <76928501+ch3thanhs@users.noreply.github.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/kn/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
f589e9471e Translated using Weblate (Indonesian)
Currently translated at 86.7% (144 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
067117159a Translated using Weblate (Arabic)
Currently translated at 83.7% (139 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
d901ca031a Translated using Weblate (Italian)
Currently translated at 87.3% (145 of 166 strings)

Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
21fa6f07d8 Translated using Weblate (Romanian)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Alexandru-Ionut Chiuta <chiuta@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
Hosted Weblate
f49b800f9e Translated using Weblate (German)
Currently translated at 100.0% (166 of 166 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: schlagmichdoch <sonnig-02.hieven@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
Translation: PairDrop/pairdrop-spa
2024-01-06 15:20:29 +01:00
schlagmichdoch
1a9fa8e60a Enhance the documentation for pairdrop-cli and add shell commands 2024-01-06 15:13:48 +01:00
schlagmichdoch
79cc8e5590 Release file pairdrop-cli.zip should only include contents of folder pairdrop-cli instead of the folder itself 2024-01-06 15:11:18 +01:00
schlagmichdoch
89addd6649 pairdrop-cli: Exit application if config file cannot be created on first run 2024-01-06 15:09:08 +01:00
schlagmichdoch
ff883fb994 Use blue icons as favicons too to prevent white logo on white background (fixes #235) 2024-01-04 17:41:20 +01:00
schlagmichdoch
ccb2170287 Increase version to v1.10.3 2024-01-03 17:18:04 +01:00
schlagmichdoch
3454eebf37 Merge branch 'fix-small-issues' 2024-01-03 17:15:20 +01:00
schlagmichdoch
b6203288bf Merge pull request #234 from schlagmichdoch/dependabot/npm_and_yarn/ws-8.16.0
Bump ws from 8.15.0 to 8.16.0
2024-01-03 17:14:47 +01:00
schlagmichdoch
bea0fa5b9c Fix color of URLs on receive text dialog 2024-01-03 17:11:38 +01:00
schlagmichdoch
48090ec41c Fix x-paper width (fixed #233) 2024-01-03 16:54:43 +01:00
schlagmichdoch
229084fab3 Properly style indented text via css 2024-01-03 16:54:01 +01:00
schlagmichdoch
d58f380565 Prevent executing _onCopy() when text is selected on receive text dialog 2024-01-03 16:53:09 +01:00
schlagmichdoch
676c68b6e7 Clear text field when closing receive text dialog 2024-01-03 16:52:26 +01:00
schlagmichdoch
dd0dc21db5 Fix replacement of sent URLs with actual links (fixes #231) 2024-01-03 16:51:44 +01:00
dependabot[bot]
4e72339479 Bump ws from 8.15.0 to 8.16.0
Bumps [ws](https://github.com/websockets/ws) from 8.15.0 to 8.16.0.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.15.0...8.16.0)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 04:45:23 +00:00
schlagmichdoch
4a5a2ceb67 Merge branch 'master' into patch-2 2023-12-04 21:16:41 +01:00
Allan Nordhøy
214d557feb README reworked 2023-11-30 01:20:28 +00:00
63 changed files with 2949 additions and 1121 deletions

View File

@@ -1,5 +1,13 @@
node_modules
.github
.git*
*.md
.idea
dev
docs
licenses
node_modules
pairdrop-cli
*.md
*.yml
Dockerfile
rtc_config_example.json
turnserver_example.conf

View File

@@ -36,7 +36,7 @@ If applicable, add screenshots to help explain your problem.
**Bug occurs on official PairDrop instance https://pairdrop.net/**
No | Yes
Version: v1.10.2
Version: v1.10.10
**Bug occurs on self-hosted PairDrop instance**
No | Yes
@@ -44,7 +44,7 @@ No | Yes
**Self-Hosted Setup**
Proxy: Nginx | Apache2
Deployment: docker run | docker compose | npm run start:prod
Version: v1.10.2
Version: v1.10.10
**Additional context**
Add any other context about the problem here.

View File

@@ -26,12 +26,11 @@ jobs:
- name: Archive Release
uses: thedoctor0/zip-release@b57d897cb5d60cb78b51a507f63fa184cfe35554 # v0.7.6
with:
type: 'zip'
filename: 'pairdrop-cli.zip'
path: 'pairdrop-cli'
directory: 'pairdrop-cli'
exclusions: '*.git* /*node_modules/* .editorconfig'
- name: Upload Release
uses: ncipollo/release-action@6c75be85e571768fa31b40abf38de58ba0397db5 # v1.13.0
with:
artifacts: "pairdrop-cli.zip"
artifacts: "pairdrop-cli/pairdrop-cli.zip"
token: ${{ secrets.GITHUB_TOKEN }}

3
.gitignore vendored
View File

@@ -1,7 +1,6 @@
node_modules
.DS_Store
fqdn.env
/docker/certs
/dev/certs
qrcode-svg/
turnserver.conf
rtc_config.json

View File

@@ -1,11 +1,13 @@
FROM node:lts-alpine
FROM alpine:latest
WORKDIR /home/node/app
COPY package*.json ./
RUN npm ci
RUN apk add --no-cache nodejs npm
RUN NODE_ENV="production" npm ci --omit=dev
# Directories and files excluded via .dockerignore
COPY . .
# environment settings

179
README.md
View File

@@ -3,133 +3,126 @@
<img src="public/images/android-chrome-512x512.png" alt="Logo" width="150" height="150">
</a>
<h1>PairDrop</h1>
# _Send it_, with [PairDrop](https://pairdrop.net)
<p>
Local file sharing in your browser. Inspired by Apple's AirDrop.
<br />
<a href="https://pairdrop.net"><strong>Explore »</strong></a>
Local file sharing <a href="https://pairdrop.net"><strong>in your web browser</strong></a>.
<br />
<br />
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Report Bug</a>
·
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Request Feature</a>
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Report a bug</a>
<br />
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Request feature</a>
</p>
</div>
## Features
[PairDrop](https://pairdrop.net) is a sublime alternative to AirDrop that works on all platforms.
File sharing on your local network that works on all platforms.
- File Sharing on your local network
- Send images, documents or text via peer to peer connection to devices on the same local network.
- Internet Transfers
- Join temporary public rooms to transfer files easily over the internet!
- Web-Application
- As it is web based, it runs on all devices.
- A multi-platform AirDrop-like solution that works.
- Send images, documents or text via peer-to-peer connection to devices on the same local network.
- Internet transfers
- Join temporary public rooms to transfer files easily over the Internet.
- Web-app
- Works on all devices with a modern web-browser.
Send a file from your phone to your laptop?
<br>Share photos in original quality with friends using Android and iOS?
<br>Share private files peer-to-peer between Linux systems?
You want to quickly send a file from your phone to your laptop?
<br>You want to share photos in original quality with friends that use a mixture of Android and iOS?
<br>You want to share private files peer to peer between Linux systems?
<br>AirDrop is unreliable again?
<br>_Send it with PairDrop!_
<img src="docs/pairdrop_screenshot_mobile.gif" alt="Screenshot GIF showing PairDrop in use" style="width: 300px">
Developed based on [Snapdrop](https://github.com/RobinLinus/snapdrop)
## Differences to the [Snapdrop](https://github.com/RobinLinus/snapdrop) it is based on
<details><summary>View all differences</summary>
## Differences to Snapdrop
<details><summary>Click to expand</summary>
### Paired Devices and Public Rooms - Internet Transfer
* Transfer files over the internet between paired devices or by entering temporary public rooms.
* Connect to devices in complex network environments (public Wi-Fi, company network, Apple Private Relay, VPN etc.).
### Paired Devices and Public Rooms — Internet Transfer
* Transfer files over the Internet between paired devices or by entering temporary public rooms.
* Connect to devices in complex network environments (public Wi-Fi, company network, iCloud Private Relay, VPN, etc.).
* Connect to devices on your mobile hotspot.
* Devices outside your local network that are behind a NAT are connected automatically via the PairDrop TURN server.
* Connect to devices on your mobile hotspot.
* You will always discover devices on your local network. Paired devices and devices in the same public room are shown additionally.
* Devices outside of your local network that are behind a NAT are auto-connected via the PairDrop TURN server.
* Devices from the local network, in the same public room, or previously paired are shown.
#### Persistent Device Pairing
* Pair your devices via a 6-digit code or a QR-Code.
* Paired devices will always find each other via shared secrets independently of their local network.
* Paired devices are persistent. You find your devices even after reopening PairDrop.
* You can edit and unpair devices easily
* Ideal to always connect easily to your own devices
Always connect to known devices
* Pair devices via a 6-digit code or a QR-Code.
* Paired devices always find each other via shared secrets independently of their local network.
* Pairing is persistent. You find your devices even after reopening PairDrop.
* You can edit and unpair devices easily.
#### Temporary Public Rooms
* Enter a public room via a 5-letter code or a QR-Code.
* Enter a public room to temporarily connect to devices outside your local network.
* All devices in the same public room see each other mutually.
* Public rooms are temporary. Public rooms are left as soon as PairDrop is closed.
* Ideal to connect easily to others in complex network situations or over the internet.
### [Improved UI for sending/receiving files](https://github.com/RobinLinus/snapdrop/issues/560)
* Files are transferred only after a request is accepted first. On transfer completion files are downloaded automatically if possible.
Connect to others in complex network situations, or over the Internet.
* Enter a public room via a 5-letter code or a QR-code.
* Enter a public room to temporarily connect to devices outside your local network.
* All devices in the same public room see each other.
* Public rooms are temporary. Closing PairDrop leaves all rooms.
### [Improved UI for Sending/Receiving Files](https://github.com/RobinLinus/snapdrop/issues/560)
* Files are transferred after a request is accepted. Files are auto-downloaded upon completing a transfer, if possible.
* Multiple files are downloaded as a ZIP file
* On iOS and Android, in addition to downloading, files can be shared or saved to the gallery via the Share menu.
* Multiple files are transferred at once with an overall progress indicator
* Download, share or save to gallery via the "Share" menu on Android and iOS.
* Multiple files are transferred at once with an overall progress indicator.
### Send Files or Text Directly From Share Menu, Context Menu or CLI
* [Send files directly from context menu on Windows](docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-windows)
* [Send files directly from context menu on Ubuntu (using Nautilus)](/docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-ubuntu-using-nautilus)
* [Send files directly from share menu on iOS](docs/how-to.md#send-directly-from-share-menu-on-ios)
* [Send files directly from share menu on Android](docs/how-to.md#send-directly-from-share-menu-on-android)
* [Send files directly via command-line interface](docs/how-to.md#send-directly-via-command-line-interface)
* [Send files directly from context menu on Ubuntu (using Nautilus)](docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-ubuntu-using-nautilus)
* [Send files directly from the context menu on Windows](docs/how-to.md#send-files-directly-from-context-menu-on-windows)
* [Send directly from the "Share" menu on iOS](docs/how-to.md#send-directly-from-share-menu-on-ios)
* [Send directly from the "Share" menu on Android](docs/how-to.md#send-directly-from-share-menu-on-android)
* [Send directly via the command-line interface](docs/how-to.md#send-directly-via-command-line-interface)
### Other changes
* Change your display name permanently to easily differentiate your devices
* [Paste files/text and choose the recipient afterwords ](https://github.com/RobinLinus/snapdrop/pull/534)
### Other Changes
* Change your display name to easily differentiate your devices.
* [Paste files/text and choose the recipient afterwards ](https://github.com/RobinLinus/snapdrop/pull/534)
* [Prevent devices from sleeping on file transfer](https://github.com/RobinLinus/snapdrop/pull/413)
* Warn user before PairDrop is closed on file transfer
* Open PairDrop on multiple tabs simultaneously (Thanks [@willstott101](https://github.com/willstott101))
* [Video and Audio preview](https://github.com/RobinLinus/snapdrop/pull/455) (Thanks [@victorwads](https://github.com/victorwads))
* Switch theme back to auto/system after darkmode or lightmode is enabled
* [Video and audio preview](https://github.com/RobinLinus/snapdrop/pull/455) (Thanks [@victorwads](https://github.com/victorwads))
* Switch theme back to auto/system after dark or light mode is on
* Node-only implementation (Thanks [@Bellisario](https://github.com/Bellisario))
* Automatic restart on error (Thanks [@KaKi87](https://github.com/KaKi87))
* Auto-restart on error (Thanks [@KaKi87](https://github.com/KaKi87))
* Lots of stability fixes (Thanks [@MWY001](https://github.com/MWY001) [@skiby7](https://github.com/skiby7) and [@willstott101](https://github.com/willstott101))
* To host PairDrop on your local network (e.g. on Raspberry Pi): [All peers connected with private IPs are discoverable by each other](https://github.com/RobinLinus/snapdrop/pull/558)
* When hosting PairDrop yourself you can [set your own STUN/TURN servers](docs/host-your-own.md#specify-stunturn-servers)
* Built-in translations via [Weblate](https://hosted.weblate.org/engage/pairdrop/)
* Airy design (Thanks [@Avieshek](https://linktr.ee/avieshek/))
* When hosting PairDrop yourself, you can [set your own STUN/TURN servers](docs/host-your-own.md#specify-stunturn-servers)
* Translations.
</details>
## Screenshots
<img src="docs/pairdrop_screenshot_mobile.gif" alt="Gif of Screenshots that show PairDrop in use" style="width: 300px">
## PairDrop is built with the following awesome technologies:
* Vanilla HTML5 / ES6 / CSS3 frontend
* [WebRTC](http://webrtc.org/) / [WebSockets](http://www.websocket.org/)
* [NodeJS](https://nodejs.org/en/) backend
* [Progressive Web App](https://wikipedia.org/wiki/Progressive_Web_App)
* [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API)
* [Weblate](https://weblate.org/) Web based localization tool
* [zip.js](https://github.com/gildas-lormeau/zip.js) JavaScript library to zip and unzip files ([BSD 3-Clause License](licenses/BSD_3-Clause-zip-js))
* [NoSleep](https://github.com/richtr/NoSleep.js) JavaScript library to prevent display sleep and enable wake lock in any Android or iOS web browser ([MIT License](licenses/MIT-NoSleep))
* [heic2any](https://github.com/alexcorvi/heic2any) JavaScript library to convert HEIC/HEIF images to PNG/GIF/JPEG ([MIT License](licenses/MIT-heic2any))
* [cyrb53](https://github.com/bryc) Super fast hash function
Have any questions? Read our [FAQ](docs/faq.md).
You can [host your own instance with Docker](docs/host-your-own.md).
## Support PairDrop
<a href="https://www.buymeacoffee.com/pairdrop" target="_blank">
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" >
</a>
PairDrop is free and always will be.
Still, we have to pay for the domain and the server.
To contribute and support, please use BuyMeACoffee via the button above.
Thanks a lot for supporting free and open software!
## Translate PairDrop
## Translate PairDrop on [Hosted Weblate](https://hosted.weblate.org/engage/pairdrop/)
<a href="https://hosted.weblate.org/engage/pairdrop/">
<img src="https://hosted.weblate.org/widget/pairdrop/pairdrop-spa/open-graph.png" alt="Translation status" style="width: 300px" />
<img src="https://hosted.weblate.org/widget/pairdrop/horizontal-blue.svg" alt="Translation status" style="width: 300px" />
</a>
## How to contribute
## Built with the following awesome technologies:
* Vanilla HTML5 / JS ES6 / CSS 3 frontend
* [WebRTC](http://webrtc.org/) / WebSockets
* [Node.js](https://nodejs.org/en/) backend
* [Progressive web app (PWA)](https://en.wikipedia.org/wiki/Progressive_web_app) unified functionality
* [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) storage handling
* [zip.js](https://gildas-lormeau.github.io/zip.js/) library
* [cyrb53](https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js) super-fast hash function
* [NoSleep](https://github.com/richtr/NoSleep.js) display sleep, add wake lock ([MIT](licenses/MIT-NoSleep))
* [libheif](https://github.com/strukturag/libheif) library to handle HEIC/HEIF files (GPLv3)
* [Weblate](https://weblate.org/) web-based localization tool
[FAQ](docs/faq.md)
[Host your own instance with Docker or Node.js](docs/host-your-own.md).
## Support
<a href="https://www.buymeacoffee.com/pairdrop" target="_blank">
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-blue.png" alt="Buy me a coffee" style="height: 60px !important;width: 217px !important;" >
</a>
<br />
<br />
PairDrop is libre, and always will be. \
If you find it useful and want to support free and open-source software, please consider donating using the button above. \
I footed the bill for the domain and the server, and you can help create and maintain great software by supporting me. \
Thank you very much for your contribution!
## Contributing
Feel free to [open an issue](https://github.com/schlagmichdoch/pairdrop/issues/new/choose) or a
[pull request](https://github.com/schlagmichdoch/pairdrop/pulls) but follow
[pull request](https://github.com/schlagmichdoch/pairdrop/pulls), following the
[Contributing Guidelines](CONTRIBUTING.md).

View File

@@ -0,0 +1,3 @@
FROM nginx:alpine
RUN apk add --no-cache openssl

42
dev/nginx/default.conf Normal file
View File

@@ -0,0 +1,42 @@
server {
listen 80;
expires epoch;
location / {
proxy_connect_timeout 300;
proxy_pass http://pairdrop:3000;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
}
location /ca.crt {
alias /etc/ssl/certs/pairdropCA.crt;
}
# To allow POST on static pages
error_page 405 =200 $uri;
}
server {
listen 443 ssl;
http2 on;
ssl_certificate /etc/ssl/certs/pairdrop-dev.crt;
ssl_certificate_key /etc/ssl/certs/pairdrop-dev.key;
expires epoch;
location / {
proxy_connect_timeout 300;
proxy_pass http://pairdrop:3000;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
}
location /ca.crt {
alias /etc/ssl/certs/pairdropCA.crt;
}
# To allow POST on static pages
error_page 405 =200 $uri;
}

9
dev/openssl/create.sh Normal file
View File

@@ -0,0 +1,9 @@
#!/bin/sh
cnf_dir='/mnt/openssl/'
certs_dir='/etc/ssl/certs/'
openssl req -config ${cnf_dir}pairdropCA.cnf -new -x509 -days 1 -keyout ${certs_dir}pairdropCA.key -out ${certs_dir}pairdropCA.crt
openssl req -config ${cnf_dir}pairdropCert.cnf -new -out /tmp/pairdrop-dev.csr -keyout ${certs_dir}pairdrop-dev.key
openssl x509 -req -in /tmp/pairdrop-dev.csr -CA ${certs_dir}pairdropCA.crt -CAkey ${certs_dir}pairdropCA.key -CAcreateserial -extensions req_ext -extfile ${cnf_dir}pairdropCert.cnf -sha512 -days 1 -out ${certs_dir}pairdrop-dev.crt
exec "$@"

View File

@@ -0,0 +1,26 @@
[ req ]
default_bits = 2048
default_md = sha256
default_days = 1
encrypt_key = no
distinguished_name = subject
x509_extensions = x509_ext
string_mask = utf8only
prompt = no
[ subject ]
organizationName = PairDrop
OU = CA
commonName = pairdrop-CA
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
basicConstraints = critical, CA:TRUE, pathlen:0
keyUsage = critical, digitalSignature, keyEncipherment, cRLSign, keyCertSign

View File

@@ -0,0 +1,29 @@
[ req ]
default_bits = 2048
default_md = sha256
default_days = 1
encrypt_key = no
distinguished_name = subject
req_extensions = req_ext
string_mask = utf8only
prompt = no
[ subject ]
organizationName = PairDrop
OU = Development
# Use a friendly name here because it's presented to the user. The server's DNS
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
# must include the DNS name in the SAN too (otherwise, Chrome and others that
# strictly follow the CA/Browser Baseline Requirements will fail).
commonName = ${ENV::FQDN}
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = DNS:${ENV::FQDN}
nsComment = "OpenSSL Generated Certificate"
extendedKeyUsage = serverAuth

34
docker-compose-dev.yml Normal file
View File

@@ -0,0 +1,34 @@
version: "3"
services:
pairdrop:
build: .
container_name: pairdrop
restart: unless-stopped
environment:
- PUID=1000 # UID to run the application as
- PGID=1000 # GID to run the application as
- WS_FALLBACK=false # Set to true to enable websocket fallback if the peer to peer WebRTC connection is not available to the client.
- RATE_LIMIT=false # Set to true to limit clients to 1000 requests per 5 min.
- RTC_CONFIG=false # Set to the path of a file that specifies the STUN/TURN servers.
- DEBUG_MODE=false # Set to true to debug container and peer connections.
- TZ=Etc/UTC # Time Zone
ports:
- "127.0.0.1:3000:3000" # Web UI. Change the port number before the last colon e.g. `127.0.0.1:9000:3000`
nginx:
build:
context: dev/
dockerfile: nginx-with-openssl.Dockerfile
image: "nginx-with-openssl"
volumes:
- ./public:/usr/share/nginx/html
- ./dev/certs:/etc/ssl/certs
- ./dev/openssl:/mnt/openssl
- ./dev/nginx/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:80"
- "8443:443"
environment:
- FQDN=localhost
entrypoint: /mnt/openssl/create.sh
command: ["nginx", "-g", "daemon off;"]
restart: unless-stopped

View File

@@ -5,18 +5,39 @@
Help! I can't install the PWA!
</summary>
if you are using a Chromium-based browser (Chrome, Edge, Vivaldi, Brave, etc.), you can easily install PairDrop PWA on your desktop
by clicking the install-button in the top-right corner while on [pairdrop.net](https://pairdrop.net).
<br>
Here is a good guide on how to install PWAs on different platforms: \
https://www.cdc.gov/niosh/mining/content/hearingloss/installPWA.html
**Chromium-based browser on Desktop (Chrome, Edge, Vivaldi, Brave, etc.)** \
Easily install PairDrop PWA on your desktop by clicking the install-button in the top-right corner while on [pairdrop.net](https://pairdrop.net).
<img width="400" src="pwa-install.png" alt="Example on how to install a pwa with Edge">
**Desktop Firefox** \
On Firefox, PWAs are installable via [this browser extensions](https://addons.mozilla.org/de/firefox/addon/pwas-for-firefox/)
**Android** \
PWAs are installable only by using Google Chrome or Samsung Browser:
1. Visit [pairdrop.net](https://pairdrop.net)
2. Click _Install_ on the installation pop-up or use the three-dot-menu and click on _Add to Home screen_
3. Click _Add_ on the pop-up
**iOS** \
PWAs are installable only by using Safari:
1. Visit [pairdrop.net](https://pairdrop.net)
2. Click on the share icon
3. Click _Add to Home Screen_
4. Click _Add_ in the top right corner
<br>
<b>Self-Hosted Instance?</b>
**Self-Hosted Instance?** \
To be able to install the PWA from a self-hosted instance, the connection needs to be [established through HTTPS](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Installable_PWAs).
See [this host your own section](https://github.com/schlagmichdoch/PairDrop/blob/master/docs/host-your-own.md#testing-pwa-related-features) for more info.
<br>
</details>
@@ -26,7 +47,9 @@ See [this host your own section](https://github.com/schlagmichdoch/PairDrop/blob
Shortcuts?
</summary>
Shortcuts
<br>
Available shortcuts:
- Send a message with `CTRL + ENTER`
- Close all "Send" and "Pair" dialogs by pressing `Esc`.
- Copy a received message to the clipboard with `CTRL/⌘ + C`.
@@ -40,12 +63,20 @@ Shortcuts
How to save images directly to the gallery on iOS?
</summary>
Apparently, iOS does not allow images shared from a website to be saved to the gallery directly.
It simply does not offer that option for images shared from a website.
<br>
iOS Shortcuts saves the day:
~~Apparently, iOS does not allow images shared from a website to be saved to the gallery directly.~~
~~It simply does not offer that option for images shared from a website.~~
~~iOS Shortcuts saves the day:~~ \
I created a simple iOS shortcut that takes your photos and saves them to your gallery:
https://routinehub.co/shortcut/13988/
Update: \
Apparently, this was only a bug that is fixed in recent iOS version (https://github.com/WebKit/WebKit/pull/13111). \
If you use an older affected iOS version this might still be of use. \
Luckily, you can now simply use `Save Image`/`Save X Images` 🎉
<br>
</details>
@@ -55,10 +86,13 @@ https://routinehub.co/shortcut/13988/
Is it possible to send files or text directly from the "Context" or "Share" menu?
</summary>
<br>
Yes, it finally is.
* [Send files directly from the "Context" menu on Windows](/docs/how-to.md#send-files-directly-from-context-menu-on-windows)
* [Send directly from the "Share" menu on iOS](/docs/how-to.md#send-directly-from-share-menu-on-ios)
* [Send directly from the "Share" menu on Android](/docs/how-to.md#send-directly-from-share-menu-on-android)
<br>
</details>
@@ -68,9 +102,12 @@ Yes, it finally is.
Is it possible to send files or text directly via CLI?
</summary>
<br>
Yes.
* [Send directly from a command-line interface](/docs/how-to.md#send-directly-via-command-line-interface)
<br>
</details>
@@ -80,11 +117,14 @@ Yes.
Are there any third-party Apps?
</summary>
<br>
These third-party apps are compatible with PairDrop:
1. [Snapdrop Android App](https://github.com/fm-sys/snapdrop-android)
2. [Snapdrop for Firefox (Addon)](https://github.com/ueen/SnapdropFirefoxAddon)
3. Feel free to make one :)
<br>
</details>
@@ -94,6 +134,8 @@ These third-party apps are compatible with PairDrop:
What about the connection? Is it a P2P connection directly from device to device or is there any third-party-server?
</summary>
<br>
It uses a WebRTC peer-to-peer connection.
WebRTC needs a signaling server that is only used to establish a connection.
The server is not involved in the file transfer.
@@ -109,6 +151,7 @@ to learn more about STUN, TURN and WebRTC.
If you host your own instance
and want to support devices that do not support WebRTC,
you can [start the PairDrop instance with an activated WebSocket fallback](https://github.com/schlagmichdoch/PairDrop/blob/master/docs/host-your-own.md#websocket-fallback-for-vpn).
<br>
</details>
@@ -118,9 +161,11 @@ you can [start the PairDrop instance with an activated WebSocket fallback](https
What about privacy? Will files be saved on third-party servers?
</summary>
<br>
Files are sent directly between peers.
PairDrop doesn't even use a database.
If curious, study [the server](https://github.com/schlagmichdoch/pairdrop/blob/master/index.js).
If curious, study [the signaling server](https://github.com/schlagmichdoch/PairDrop/blob/master/server/ws-server.js).
WebRTC encrypts the files in transit.
If the devices are on the same network,
@@ -130,6 +175,7 @@ If your devices are paired and behind a NAT,
the PairDrop TURN Server is used to route your files and messages.
See the [Technical Documentation](technical-documentation.md#encryption-webrtc-stun-and-turn)
to learn more about STUN, TURN and WebRTC.
<br>
</details>
@@ -139,10 +185,12 @@ to learn more about STUN, TURN and WebRTC.
What about security? Are my files encrypted while sent between the computers?
</summary>
<br>
Yes. Your files are sent using WebRTC, encrypting them in transit.
To ensure the connection is secure and there is no [MITM](https://wikiless.org/wiki/Man-in-the-middle_attack),
compare the security number shown under the device name on both devices.
The security number is different for every connection.
Still you have to trust the PairDrop server. To ensure the connection is secure and there is no [MITM](https://en.m.wikipedia.org/wiki/Man-in-the-middle_attack) there is a plan to make PairDrop
zero trust by encrypting the signaling and implementing a verification process. See [issue #180](https://github.com/schlagmichdoch/PairDrop/issues/180) to keep updated.
<br>
</details>
@@ -152,6 +200,8 @@ The security number is different for every connection.
Transferring many files with paired devices takes too long
</summary>
<br>
Naturally, if traffic needs to be routed through the TURN server
because your devices are behind different NATs, transfer speed decreases.
@@ -164,6 +214,7 @@ which omits the need of the TURN server.
You can also use mobile hotspots on phones to do that.
Then, all data should be sent directly between devices and not use your data plan.
<br>
</details>
@@ -173,6 +224,8 @@ Then, all data should be sent directly between devices and not use your data pla
Why don't you implement feature xyz?
</summary>
<br>
Snapdrop and PairDrop are a study in radical simplicity.
The user interface is insanely simple.
Features are chosen very carefully because complexity grows quadratically
@@ -184,22 +237,24 @@ Don't be sad. We may decline your feature request for the sake of simplicity.
Read *Insanely Simple: The Obsession that Drives Apple's Success*,
and/or *Thinking, Fast and Slow* to learn more.
<br>
</details>
<details>
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
Snapdrop and PairDrop are awesome. How can I support them?
PairDrop is awesome. How can I support it?
</summary>
<br>
* [Buy me a coffee](https://www.buymeacoffee.com/pairdrop) to pay for the domain and the server, and support libre software.
* [File bugs, give feedback, submit suggestions](https://github.com/schlagmichdoch/pairdrop/issues)
* Share PairDrop on social media.
* Fix bugs and make a pull request.
* Fix bugs and create a pull request.
* Do some security analysis and make suggestions.
* To support the original Snapdrop and its creator go to [his GitHub page](https://github.com/RobinLinus/snapdrop)
* Participate in [active discussions](https://github.com/schlagmichdoch/PairDrop/discussions)
<br>
</details>
@@ -209,7 +264,10 @@ and/or *Thinking, Fast and Slow* to learn more.
How does it work?
</summary>
<br>
[See here for info about the technical implementation](/docs/technical-documentation.md)
<br>
</details>

View File

@@ -556,10 +556,6 @@ a2enmod proxy
a2enmod proxy_http
```
```bash
a2enmod proxy_wstunnel
```
<br>
Create a new configuration file under `/etc/apache2/sites-available` (on Debian)
@@ -570,18 +566,10 @@ Create a new configuration file under `/etc/apache2/sites-available` (on Debian)
```apacheconf
<VirtualHost *:80>
ProxyPass / http://127.0.0.1:3000/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:3000/$1" [P,L]
ProxyPass / http://127.0.0.1:3000/ upgrade=websocket
</VirtualHost>
<VirtualHost *:443>
ProxyPass / https://127.0.0.1:3000/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "wws://127.0.0.1:3000/$1" [P,L]
ProxyPass / https://127.0.0.1:3000/ upgrade=websocket
</VirtualHost>
```
@@ -589,14 +577,10 @@ Create a new configuration file under `/etc/apache2/sites-available` (on Debian)
```apacheconf
<VirtualHost *:80>
Redirect permanent / https://127.0.0.1:3000/
Redirect permanent / https://127.0.0.1:3000/
</VirtualHost>
<VirtualHost *:443>
ProxyPass / https://127.0.0.1:3000/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "wws://127.0.0.1:3000/$1" [P,L]
ProxyPass / http://127.0.0.1:3000/ upgrade=websocket
</VirtualHost>
```
@@ -652,68 +636,74 @@ To run PairDrop including its own coturn-server you need to punch holes in the f
<br>
### Firewall
To run PairDrop including its own coturn-server you need to punch holes in the firewall. These ports must be opened additionally:
- 3478 tcp/udp
- 5349 tcp/udp
- 10000:20000 tcp/udp
<br>
## Local Development
### Install
All files needed for developing are available on the branch `dev`.
All files needed for developing are available in the folder `./dev`.
First, [Install docker with docker-compose.](https://docs.docker.com/compose/install/)
For convenience, there is also a docker compose file for developing:
Then, clone the repository and run docker-compose:
#### Developing with docker compose
First, [Install docker with docker compose.](https://docs.docker.com/compose/install/)
Then, clone the repository and run docker compose:
```bash
git clone https://github.com/schlagmichdoch/PairDrop.git && cd PairDrop
```
```bash
git checkout dev
```
```bash
docker compose -f docker-compose-dev.yml up -d
docker compose -f docker-compose-dev.yml up --no-deps --build
```
Now point your web browser to `http://localhost:8080`.
- To restart the containers, run `docker compose restart`.
- To stop the containers, run `docker compose stop`.
- To debug the Node.js server, run `docker logs pairdrop`.
- After changes to the code you have to rerun the `docker compose` command
<br>
### Testing PWA related features
#### Testing PWA related features
PWAs requires the app to be served under a correctly set up and trusted TLS endpoint.
The NGINX container creates a CA certificate and a website certificate for you.
To correctly set the common name of the certificate,
you need to change the FQDN environment variable in `docker/fqdn.env`
to the fully qualified domain name of your workstation.
you need to change the FQDN environment variable in `docker-compose-dev.yml`
to the fully qualified domain name of your workstation. (Default: localhost)
If you want to test PWA features, you need to trust the CA of the certificate for your local deployment. \
For your convenience, you can download the crt file from `http://<Your FQDN>:8080/ca.crt`. \
Install that certificate to the trust store of your operating system. \
- On Windows, make sure to install it to the `Trusted Root Certification Authorities` store.
- On macOS, double-click the installed CA certificate in `Keychain Access`,
##### Windows
- Make sure to install it to the `Trusted Root Certification Authorities` store.
##### macOS
- Double-click the installed CA certificate in `Keychain Access`,
- expand `Trust`, and select `Always Trust` for SSL.
- Firefox uses its own trust store. To install the CA,
- point Firefox at `http://<Your FQDN>:8080/ca.crt`.
##### Firefox
Firefox uses its own trust store. To install the CA:
- point Firefox at `http://<Your FQDN>:8080/ca.crt` (Default: `http://localhost:8080/ca.crt`)
- When prompted, select `Trust this CA to identify websites` and click _OK_.
Alternatively:
1. Download `ca.crt` from `http://<Your FQDN>:8080/ca.crt` (Default: `http://localhost:8080/ca.crt`)
2. Go to `about:preferences#privacy` scroll down to `Security` and `Certificates` and click `View Certificates`
3. Import the downloaded certificate file (step 1)
##### Chrome
- When using Chrome, you need to restart Chrome so it reloads the trust store (`chrome://restart`).
- Additionally, after installing a new cert, you need to clear the Storage (DevTools → Application → Clear storage → Clear site data).
##### Google Chrome
- To skip the installation of the certificate, you can also open `chrome://flags/#unsafely-treat-insecure-origin-as-secure`
- The feature `Insecure origins treated as secure` must be enabled and the list must include your PairDrop test instance. E.g.: `http://127.0.0.1:3000,https://127.0.0.1:8443`
Please note that the certificates (CA and webserver cert) expire after a day.
Also, whenever you restart the NGINX Docker container new certificates are created.
The site is served on `https://<Your FQDN>:8443`.
The site is served on `https://<Your FQDN>:8443` (Default: `https://localhost:8443`).
[< Back](/README.md)

View File

@@ -24,7 +24,7 @@ This opens PairDrop in the default browser where you can choose the receiver.
```bash
pairdrop -h
```
```bash
```
Send files or text with PairDrop via command-line interface.
Current domain: https://pairdrop-dev.onrender.com/
@@ -35,44 +35,61 @@ Send text: pairdrop -t "text"
Specify domain: pairdrop -d "https://pairdrop.net/"
Show this help text: pairdrop (-h|--help)
This pairdrop-cli version was released alongside v1.10.0
This pairdrop-cli version was released alongside v1.10.4
```
<br>
### Setup
Download the bash file: [pairdrop-cli/pairdrop](/pairdrop-cli/pairdrop).
#### Linux
#### Linux / Mac
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
2. Unzip the archive to a folder of your choice e.g. `/usr/local/bin/pairdrop-cli/`
3. Make sure the bash file `/usr/local/bin/pairdrop-cli/pairdrop` is executable. Otherwise, use `chmod +x pairdrop`
4. Add absolute path of the folder to PATH variable to make `pairdrop` available globally by executing
`export PATH=$PATH:/usr/local/bin/pairdrop-cli/`
<br>
#### Mac
1. add bash file to `/usr/local/bin`
```shell
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.10/pairdrop-cli.zip"
```
or
```shell
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.10/pairdrop-cli.zip"
```
2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/`
```shell
sudo unzip pairdrop-cli.zip -d /usr/share/pairdrop-cli/
```
3. Copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
```shell
sudo cp /usr/share/pairdrop-cli/.pairdrop-cli-config.example /usr/share/pairdrop-cli/.pairdrop-cli-config
```
4. Make the bash file _pairdrop_ executable
```shell
sudo chmod +x /usr/share/pairdrop-cli/pairdrop
```
5. Add a symlink to /usr/local/bin/ to include _pairdrop_ to _PATH_
```shell
sudo ln -s /usr/share/pairdrop-cli/pairdrop /usr/local/bin/pairdrop
```
<br>
#### Windows
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
2. Put file in a preferred folder e.g. `C:\Program Files\pairdrop-cli`
3. Search for and open `Edit environment variables for your account`
4. Click `Environment Variables…`
5. Under *System Variables* select `Path` and click *Edit...*
6. Click *New*, insert the preferred folder (`C:\Program Files\pairdrop-cli`), click *OK* until all windows are closed
7. Reopen Command prompt window
3. Inside this folder, copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
4. Search for and open `Edit environment variables for your account`
5. Click `Environment Variables…`
6. Under _System Variables_ select `Path` and click _Edit..._
7. Click _New_, insert the preferred folder (`C:\Program Files\pairdrop-cli`), click *OK* until all windows are closed
8. Reopen Command prompt window
<br>
**Requirements**
### Requirements
As Windows cannot execute bash scripts natively, you need to install [Git Bash](https://gitforwindows.org/).
Then, you can also use pairdrop-cli from the default Windows Command Prompt \
by using the shell file instead of the bash file: `pairdrop.sh -h` which then itself executes \
pairdrop-cli (the bash file) via the Git Bash.
Then, you can also use pairdrop-cli from the default Windows Command Prompt
by using the shell file instead of the bash file which then itself executes
_pairdrop-cli_ (the bash file) via the Git Bash.
```shell
pairdrop.sh -h
```
<br>
@@ -82,14 +99,15 @@ pairdrop-cli (the bash file) via the Git Bash.
It is possible to send multiple files with PairDrop via the context menu by adding pairdrop-cli to Windows `Send to` menu:
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
2. Unzip the archive to a folder of your choice e.g. `C:\Program Files\pairdrop-cli\`
3. Copy the shortcut _send with PairDrop.lnk_
4. Hit Windows Key+R, type: `shell:sendto` and hit Enter.
5. Paste the copied shortcut into the directory
6. Open the properties window of the shortcut and edit the link field to point to _send-with-pairdrop.ps1_ located in the folder you used in step 2: \
3. Inside this folder, copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
4. Copy the shortcut _send with PairDrop.lnk_
5. Hit Windows Key+R, type: `shell:sendto` and hit Enter.
6. Paste the copied shortcut into the directory
7. Open the properties window of the shortcut and edit the link field to point to _send-with-pairdrop.ps1_ located in the folder you used in step 2: \
`"C:\Program Files\PowerShell\7\pwsh.exe" -File "C:\Program Files\pairdrop-cli\send-with-pairdrop.ps1"`
7. You are done! You can now send multiple files and directories directly via PairDrop:
8. You are done! You can now send multiple files and directories directly via PairDrop:
> _context menu > Send to > PairDrop_
_context menu_ > _Send to_ > _PairDrop_
##### Requirements
As Windows cannot execute bash scripts natively, you need to install [Git Bash](https://gitforwindows.org/).
@@ -100,14 +118,18 @@ As Windows cannot execute bash scripts natively, you need to install [Git Bash](
### Registering to open files with PairDrop
It is possible to send multiple files with PairDrop via the context menu by adding pairdrop-cli to Nautilus `Scripts` menu:
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
2. Unzip the archive to a folder of your choice e.g. `/usr/local/bin/pairdrop-cli/`
3. Copy the shell file _send-with-pairdrop.sh_ to `/home/<user>/.local/share/nautilus/scripts/`
4. Edit the shell file and edit the variable `pathToPairDropCli` to point to the pairdrop-cli executable from step 2 (e.g. `/usr/local/bin/pairdrop-cli/pairdrop`)
5. Make sure the shell file `/home/<user>/.local/share/nautilus/scripts/send-with-pairdrop.sh` is executable. Otherwise, use `chmod +x send-with-pairdrop.sh`
6. You are done! You can now send multiple files and directories directly via PairDrop:
1. Register _pairdrop_ as executable via [guide above](#linux).
2. Copy the shell file _send-with-pairdrop_ to `~/.local/share/nautilus/scripts/` to include it in the context menu
```shell
cp /usr/share/pairdrop-cli/send-with-pairdrop ~/.local/share/nautilus/scripts/
```
3. Make the shell file _send-with-pairdrop_ executable
```shell
chmod +x ~/.local/share/nautilus/scripts/send-with-pairdrop
```
4. You are done! You can now send multiple files and directories directly via PairDrop:
> _context menu > Scripts > send-with-pairdrop.sh_
_context menu_ > _Scripts_ > _send-with-pairdrop_
<br>
@@ -115,6 +137,6 @@ It is possible to send multiple files with PairDrop via the context menu by addi
The [File Handling API](https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/handle-files)
was implemented, but it was removed as default file associations were overwritten ([#17](https://github.com/schlagmichdoch/PairDrop/issues/17),
[#116](https://github.com/schlagmichdoch/PairDrop/issues/116) [#190](https://github.com/schlagmichdoch/PairDrop/issues/190))
and it only worked with explicitly specified file types and not with directories at all.
and it only worked with explicitly specified file types and couldn't handle directories at all.
[< Back](/README.md)

View File

@@ -1,22 +0,0 @@
MIT License
Copyright (c) 2020 Alex Corvi
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

675
package-lock.json generated
View File

@@ -1,19 +1,19 @@
{
"name": "pairdrop",
"version": "1.10.2",
"lockfileVersion": 2,
"version": "1.10.10",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pairdrop",
"version": "1.10.2",
"version": "1.10.10",
"license": "ISC",
"dependencies": {
"express": "^4.18.2",
"express-rate-limit": "^7.1.5",
"ua-parser-js": "^1.0.37",
"unique-names-generator": "^4.3.0",
"ws": "^8.15.0"
"ws": "^8.16.0"
},
"engines": {
"node": ">=15"
@@ -37,12 +37,12 @@
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
@@ -50,7 +50,7 @@
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.1",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
@@ -68,12 +68,18 @@
}
},
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
"set-function-length": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -91,17 +97,17 @@
}
},
"node_modules/content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"engines": {
"node": ">= 0.6"
}
@@ -119,6 +125,22 @@
"ms": "2.0.0"
}
},
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -149,6 +171,25 @@
"node": ">= 0.8"
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -163,16 +204,16 @@
}
},
"node_modules/express": {
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.1",
"body-parser": "1.20.2",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
"cookie": "0.6.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
@@ -204,9 +245,9 @@
}
},
"node_modules/express-rate-limit": {
"version": "7.1.5",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.5.tgz",
"integrity": "sha512-/iVogxu7ueadrepw1bS0X0kaRC/U0afwiYRSLg68Ts+p4Dc85Q5QKsOnPS/QUjPMHvOJQtBDrZgvkOzf8ejUYw==",
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.3.1.tgz",
"integrity": "sha512-BbaryvkY4wEgDqLgD18/NSy2lDO2jTuT9Y8c1Mpx0X63Yz0sYd5zN6KPe7UvpuSVvV33T6RaE1o1IVZQjHMYgw==",
"engines": {
"node": ">= 16"
},
@@ -251,32 +292,62 @@
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
"integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dependencies": {
"function-bind": "^1.1.1"
"get-intrinsic": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dependencies": {
"es-define-property": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"engines": {
"node": ">= 0.4.0"
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
@@ -290,6 +361,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -394,9 +476,12 @@
}
},
"node_modules/object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -460,9 +545,9 @@
}
},
"node_modules/raw-body": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
@@ -539,19 +624,39 @@
"node": ">= 0.8.0"
}
},
"node_modules/set-function-length": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4",
"object-inspect": "^1.13.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -586,9 +691,9 @@
}
},
"node_modules/ua-parser-js": {
"version": "1.0.37",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz",
"integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==",
"version": "1.0.38",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz",
"integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==",
"funding": [
{
"type": "opencollective",
@@ -640,9 +745,9 @@
}
},
"node_modules/ws": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz",
"integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==",
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"engines": {
"node": ">=10.0.0"
},
@@ -659,453 +764,5 @@
}
}
}
},
"dependencies": {
"accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"requires": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
}
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"requires": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
}
},
"bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
},
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"requires": {
"safe-buffer": "5.2.1"
}
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
},
"destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
},
"express": {
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"requires": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
}
},
"express-rate-limit": {
"version": "7.1.5",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.5.tgz",
"integrity": "sha512-/iVogxu7ueadrepw1bS0X0kaRC/U0afwiYRSLg68Ts+p4Dc85Q5QKsOnPS/QUjPMHvOJQtBDrZgvkOzf8ejUYw==",
"requires": {}
},
"finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"statuses": "2.0.1",
"unpipe": "~1.0.0"
}
},
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"get-intrinsic": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
"integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
"function-bind": "^1.1.1"
}
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
"http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"requires": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.52.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
},
"object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
},
"on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"requires": {
"ee-first": "1.1.1"
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"requires": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
}
},
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"requires": {
"side-channel": "^1.0.4"
}
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"requires": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
},
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"requires": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"mime": "1.6.0",
"ms": "2.1.3",
"on-finished": "2.4.1",
"range-parser": "~1.2.1",
"statuses": "2.0.1"
},
"dependencies": {
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}
}
},
"serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
}
},
"setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"requires": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
},
"toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"ua-parser-js": {
"version": "1.0.37",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz",
"integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ=="
},
"unique-names-generator": {
"version": "4.7.1",
"resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz",
"integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow=="
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
},
"ws": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz",
"integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==",
"requires": {}
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "pairdrop",
"version": "1.10.2",
"version": "1.10.10",
"type": "module",
"description": "",
"main": "server/index.js",
@@ -15,7 +15,7 @@
"express-rate-limit": "^7.1.5",
"ua-parser-js": "^1.0.37",
"unique-names-generator": "^4.3.0",
"ws": "^8.15.0"
"ws": "^8.16.0"
},
"engines": {
"node": ">=15"

View File

@@ -0,0 +1 @@
DOMAIN=https://pairdrop.net/

View File

@@ -1,6 +1,9 @@
#!/bin/bash
set -e
# PairDrop version when this file was last changed
version="v1.10.4"
############################################################
# Help #
############################################################
@@ -17,7 +20,7 @@ help()
echo -e "Specify domain:\t\t$(basename "$0") -d \"https://pairdrop.net/\""
echo -e "Show this help text:\t$(basename "$0") (-h|--help)"
echo
echo "This pairdrop-cli version was released alongside v1.10.0"
echo "This pairdrop-cli version was released alongside ${version}"
}
openPairDrop()
@@ -337,12 +340,15 @@ popd > '/dev/null';
config_path="${script_path}/.pairdrop-cli-config"
# If config file does not exist, try to create it. If it fails log error message and exit
[ ! -f "$config_path" ] &&
specifyDomain "https://pairdrop.net/" &&
[ ! -f "$config_path" ] &&
echo "Could not create config file. Add 'DOMAIN=https://pairdrop.net/' to a file called .pairdrop-cli-config in the same file as this 'pairdrop' bash file"
echo "Could not create config file. Add 'DOMAIN=https://pairdrop.net/' to a file called .pairdrop-cli-config in the same file as this 'pairdrop' bash file (${script_path})" &&
exit
[ ! -f "$config_path" ] || export "$(grep -v '^#' "$config_path" | xargs)"
# Read config variables
export "$(grep -v '^#' "$config_path" | xargs)"
setOs

View File

@@ -1,8 +1,5 @@
#!/bin/bash
# edit this to point to the pairdrop-cli executable
pathToPairDropCli="/usr/local/bin/pairdrop-cli/pairdrop"
# Initialize an array
lines=()
@@ -17,4 +14,4 @@ length=${#lines[@]}
# Remove the last entry
unset 'lines[length-1]'
$pathToPairDropCli "${lines[@]}"
pairdrop "${lines[@]}"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -139,7 +139,7 @@
<div class="edit-btn btn btn-small btn-rounded btn-dark text-white" data-i18n-key="header.edit-share-mode" data-i18n-attrs="text" hidden></div>
</div>
</div>
<div id="websocket-fallback" hidden>
<div id="websocket-fallback" class="text-center" hidden>
<span data-i18n-key="footer.traffic" data-i18n-attrs="text"></span>
<span data-i18n-key="footer.routed" data-i18n-attrs="text"></span>
<span data-i18n-key="footer.webrtc" data-i18n-attrs="text"></span>
@@ -159,7 +159,7 @@
<div class="column">
<div class="known-as-wrapper">
<span data-i18n-key="footer.known-as" data-i18n-attrs="text"></span>
<div id="display-name" class="badge" data-i18n-key="footer.display-name" data-i18n-attrs="data-placeholder title" placeholder="Loading..." autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable></div>
<div id="display-name" class="badge" data-i18n-key="footer.display-name" data-i18n-attrs="data-placeholder title" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable></div>
<svg class="icon edit-pen">
<use xlink:href="#edit-pen-icon"></use>
</svg>
@@ -192,11 +192,26 @@
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Arabic)</span>
</button>
<button class="btn fw wrap" value="be">
<span>беларуская</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Belarusian)</span>
</button>
<button class="btn fw wrap" value="ca">
<span>Català</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Catalan)</span>
</button>
<button class="btn fw wrap" value="cs">
<span>Čeština</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Czech)</span>
</button>
<button class="btn fw wrap" value="da">
<span>Dansk</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Danish)</span>
</button>
<button class="btn fw wrap" value="de">
<span>Deutsch</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
@@ -225,11 +240,21 @@
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Italian)</span>
</button>
<button class="btn fw wrap" value="he">
<span>עִבְרִית</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Hebrew)</span>
</button>
<button class="btn fw wrap" value="kn">
<span>ಕನ್ನಡ</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Kannada)</span>
</button>
<button class="btn fw wrap" value="hu">
<span>Magyar</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Hungarian)</span>
</button>
<button class="btn fw wrap" value="nl">
<span>Nederlands</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
@@ -240,6 +265,11 @@
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Norwegian)</span>
</button>
<button class="btn fw wrap" value="pl">
<span>Polski</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Polish)</span>
</button>
<button class="btn fw wrap" value="pt-BR">
<span>Português do Brasil</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
@@ -260,10 +290,20 @@
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Turkish)</span>
</button>
<button class="btn fw wrap" value="uk">
<span>Українська</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Ukrainian)</span>
</button>
<button class="btn fw wrap" value="zh-CN">
<span>中文</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Chinese)</span>
<span>(Simplified Chinese)</span>
</button>
<button class="btn fw wrap" value="zh-TW">
<span>漢語</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</span>
<span>(Traditional Chinese)</span>
</button>
<button class="btn fw wrap" value="ja">
<span>日本語</span>
@@ -582,7 +622,7 @@
</svg>
<div class="title-wrapper" dir="ltr">
<h1>PairDrop</h1>
<div class="font-subheading">v1.10.2</div>
<div class="font-subheading">v1.10.10</div>
</div>
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text"></div>
<div class="row">

View File

@@ -66,13 +66,14 @@
"language-selector_title": "إختر اللغة",
"about_title": "حول PairDrop",
"about_aria-label": "افتح حول PairDrop",
"theme-light_title": "إستخدم دائماً المظهر الفاتح"
"theme-light_title": "إستخدم دائماً المظهر الفاتح",
"edit-share-mode": "ت٧ارف"
},
"instructions": {
"x-instructions_mobile": "انقر لإرسال الملفات أو انقر لفترة طويلة لإرسال رسالة",
"x-instructions-share-mode_desktop": "انقر للإرسال",
"x-instructions-share-mode_desktop": "انقر للإرسال {{descriptor}}",
"activate-share-mode-and-other-files-plural": "و{{count}} ملفات أخرى",
"x-instructions-share-mode_mobile": "انقر للإرسال",
"x-instructions-share-mode_mobile": "انقر للإرسال {{descriptor}}",
"activate-share-mode-base": "افتح PairDrop على الأجهزة الأخرى للإرسال",
"no-peers-subtitle": "قم بإقران الأجهزة أو ادخل إلى غرفة عامة لتتمكن من أن تكتشف على الشبكات الأخرى",
"activate-share-mode-shared-text": "النص المشترك",

184
public/lang/be.json Normal file
View File

@@ -0,0 +1,184 @@
{
"header": {
"about_aria-label": "Адкрыйце Аб PairDrop",
"about_title": "Аб PairDrop",
"theme-auto_title": "Аўтаматычная адаптацыя тэмы да сістэмы",
"theme-light_title": "Заўсёды выкарыстоўваць светлую тэму",
"theme-dark_title": "Заўсёды выкарыстоўваць цёмную тэму",
"notification_title": "Уключыць апавяшчэнні",
"edit-paired-devices_title": "Рэдагаваць злучаныя прылады",
"join-public-room_title": "Часова далучыцца да публічнага пакоя",
"cancel-share-mode": "Адмяніць",
"language-selector_title": "Задаць мову",
"install_title": "Усталяваць PairDrop",
"pair-device_title": "Злучыце свае прылады назаўжды",
"edit-share-mode": "Рэдагаваць",
"expand_title": "Разгарнуць радок кнопак"
},
"instructions": {
"no-peers_data-drop-bg": "Адпусціце, каб выбраць атрымальніка",
"no-peers-title": "Адкрыйце PairDrop на іншых прыладах, каб адправіць файлы",
"x-instructions_data-drop-peer": "Адпусціце, каб адправіць вузлу",
"x-instructions_data-drop-bg": "Адпусціце, каб выбраць атрымальніка",
"x-instructions-share-mode_mobile": "Дакраніцеся, каб адправіць {{descriptor}}",
"activate-share-mode-and-other-file": "і 1 іньшы файл",
"activate-share-mode-and-other-files-plural": "і {{count}} іньшых файла(ў)",
"activate-share-mode-shared-text": "агульны тэкст",
"activate-share-mode-shared-files-plural": "{{count}} агульных файлаў",
"webrtc-requirement": "Каб выкарыстоўваць гэты асобнік Pair Drop, WebRTC павінен быць уключаны!",
"no-peers-subtitle": "Злучыце прылады або ўвайдзіце ў публічны пакой, каб вас маглі выявіць з іншых сетак",
"x-instructions_mobile": "Дакраніцеся, каб адправіць файлы, або доўга трымайце, каб адправіць паведамленне",
"x-instructions-share-mode_desktop": "Націсніце, каб адправіць {{descriptor}}",
"x-instructions_desktop": "Націсніце, каб адправіць файлы, або націсніце правай кнопкай мышы, каб адправіць паведамленне",
"activate-share-mode-base": "Адкрыйце PairDrop на іншых прыладах, каб адправіць",
"activate-share-mode-shared-file": "агульны файл"
},
"footer": {
"known-as": "Вы вядомыя як:",
"display-name_data-placeholder": "Загрузка…",
"discovery": "Вас могуць выявіць:",
"on-this-network_title": "Вас можа знайсці кожны ў гэтай сетцы.",
"paired-devices": "з дапамогай злучаных прылад",
"public-room-devices_title": "Вас могуць выявіць прылады ў гэтай публічнай пакоі незалежна ад сеткі.",
"traffic": "Рух",
"display-name_title": "Зменіце назву сваёй прылады назаўжды",
"on-this-network": "у гэтай сетцы",
"paired-devices_title": "Злучаныя прылады заўсёды могуць вас выявіць незалежна ад сеткі.",
"public-room-devices": "у пакоі {{roomId}}",
"webrtc": ", калі WebRTC недаступны.",
"routed": "накіроўваецца праз сервер"
},
"dialogs": {
"hr-or": "АБО",
"cancel": "Адмяніць",
"pair": "Злучыць",
"unpair": "Разлучыць",
"paired-devices-wrapper_data-empty": "Няма злучаных прылад.",
"auto-accept": "аўтаматычнае прыняцце",
"close": "Закрыць",
"join": "Далучыцца",
"leave": "Пакінуць",
"decline": "Адмовіць",
"share": "Падзяліцца",
"copy": "Капіяваць",
"title-image": "Малюнак",
"system-language": "Мова сістэмы",
"public-room-qr-code_title": "Націсніце, каб скапіяваць спасылку на публічны пакой",
"title-file": "Файл",
"title-file-plural": "Файлы",
"message_placeholder": "Тэкст",
"language-selector-title": "Задаць мову",
"send-message-title": "Адправіць паведамленне",
"scan-qr-code": "або сканаваць QR-код.",
"enter-room-id-from-another-device": "Увядзіце ID пакоя з іншай прылады, каб далучыцца да пакоя.",
"edit-paired-devices-title": "Рэдагаваць злучаныя прылады",
"auto-accept-instructions-1": "Актываваць",
"auto-accept-instructions-2": ", каб аўтаматычна прымаць усе файлы, адпраўленыя з гэтай прылады.",
"accept": "Прыняць",
"download": "Спампаваць",
"download-again": "Спампаваць яшчэ раз",
"pair-devices-qr-code_title": "Націсніце, каб скапіраваць спасылку для спалучэння гэтай прылады",
"approve": "сцвердзіць",
"pair-devices-title": "Пастаяннае злучэнне прылад",
"enter-key-from-another-device": "Увядзіце тут ключ з іншай прылады.",
"temporary-public-room-title": "Часовы публічны пакой",
"input-room-id-on-another-device": "Увядзіце гэты ID пакоя на іншай прыладзе",
"paired-device-removed": "Злучаная прылада была выдалена.",
"would-like-to-share": "хацеў бы падзяліцца",
"send-message-to": "Каму:",
"message_title": "Устаўце паведамленне для адпраўкі",
"has-sent": "адправіў:",
"base64-processing": "Апрацоўка…",
"send": "Адправіць",
"base64-title-text": "Падзяліцца тэкстам",
"base64-title-files": "Падзяліцца файламі",
"base64-tap-to-paste": "Дакраніцеся тут, каб падзяліцца {{type}}",
"file-other-description-image": "і 1 іньшы малюнак",
"file-other-description-image-plural": "і {{count}} іншых малюнкаў",
"file-other-description-file-plural": "і {{count}} іншых файлаў",
"title-image-plural": "Малюнкі",
"share-text-subtitle": "Рэдагаваць паведамленне перад адпраўкай:",
"share-text-title": "Падзяліцца тэкставым паведамленнем",
"close-toast_title": "Закрыць апавяшчэнне",
"receive-text-title": "Паведамленне атрымана",
"input-key-on-this-device": "Увядзіце гэты ключ на іншай прыладзе",
"base64-files": "файлы",
"base64-text": "тэкст",
"base64-paste-to-send": "Устаўце сюды буфер абмену, каб падзяліцца {{type}}",
"file-other-description-file": "і 1 іньшы файл",
"receive-title": "{{descriptor}} атрымана",
"share-text-checkbox": "Заўсёды паказваць гэта дыялогавае акно пры абагульванні тэксту"
},
"about": {
"buy-me-a-coffee_title": "Купіць мне кавы!",
"mastodon_title": "Напішыце пра PairDrop на Mastodon",
"tweet_title": "Твіт пра PairDrop",
"github_title": "PairDrop на GitHub",
"custom_title": "Сачыце за намі",
"bluesky_title": "Сачыце за намі на BlueSky",
"faq_title": "Часта задаюць пытанні",
"close-about_aria-label": "Закрыць Аб PairDrop",
"claim": "Самы просты спосаб перадачы файлаў паміж прыладамі",
"privacypolicy_title": "Адкрыйце нашу палітыку прыватнасці"
},
"notifications": {
"link-received": "Спасылка атрымана {{name}} - Націсніце, каб адкрыць",
"message-received": "Паведамленне атрымана {{name}} - Націсніце, каб скапіяваць",
"click-to-download": "Націсніце, каб спампаваць",
"click-to-show": "Націсніце, каб паказаць",
"copied-text-error": "Памылка запісу ў буфер абмену. Скапіруйце ўручную!",
"online": "Вы зноў у сетцы",
"online-requirement-public-room": "Вы павінны быць падлучаныя да сеткі, каб стварыць агульны пакой",
"connecting": "Падключэнне…",
"public-room-id-invalid": "Несапраўдны ID пакоя",
"notifications-permissions-error": "Дазвол на апавяшчэнні быў заблакіраваны, бо карыстальнік некалькі разоў адхіляў запыт на дазвол. Гэта можна скінуць у меню \"Аб старонцы\", доступ да якой можна атрымаць, націснуўшы на значок замка побач з радком URL.",
"request-title": "{{name}} хоча перадаць {{count}} {{descriptor}}",
"copied-text": "Тэкст скапіраваны ў буфер абмену",
"offline": "Вы па-за сеткай",
"connected": "Падключана",
"online-requirement-pairing": "Вы павінны быць падлучаныя да сеткі для спалучэння прылад",
"pairing-key-invalidated": "Ключ {{key}} несапраўдны",
"display-name-random-again": "Адлюстраванае імя зноў згенеравалася выпадковым чынам",
"download-successful": "{{descriptor}} спампавана",
"pairing-tabs-error": "Злучэнне дзвюх укладак вэб-браўзера немагчыма",
"display-name-changed-permanently": "Адлюстроўванае імя было зменена назаўжды",
"pairing-cleared": "Усе прылады раз'яднаны",
"room-url-copied-to-clipboard": "Спасылка на публічны пакой скапіравана ў буфер абмену",
"public-room-left": "Пакінуць публічны пакой {{publicRoomId}}",
"text-content-incorrect": "Змест тэксту няправільны",
"clipboard-content-incorrect": "Змест буфера абмену няправільны",
"notifications-enabled": "Апавяшчэнні ўключаны",
"files-incorrect": "Няправільныя файлы",
"file-transfer-completed": "Перадача файла завершана",
"selected-peer-left": "Выбраны вузел выйшаў",
"copied-to-clipboard": "Скапіравана ў буфер абмену",
"pair-url-copied-to-clipboard": "Спасылка для злучэння гэтай прылады скапіравана ў буфер абмену",
"pairing-success": "Злучаныя прылады",
"copied-to-clipboard-error": "Капіраванне немагчымае. Скапіруйце ўручную.",
"file-content-incorrect": "Змест файла няправільны",
"pairing-not-persistent": "Злучаныя прылады не з'яўляюцца пастаяннымі",
"pairing-key-invalid": "Несапраўдны ключ",
"display-name-changed-temporarily": "Адлюстраванае імя зменена толькі для гэтага сеансу",
"ios-memory-limit": "Адначасовая адпраўка файлаў на iOS магчымая толькі да 200 МБ",
"message-transfer-completed": "Перадача паведамлення завершана",
"unfinished-transfers-warning": "Ёсць незавершаныя перадачы. Вы ўпэўнены, што хочаце закрыць PairDrop?",
"rate-limit-join-key": "Ліміт хуткасці дасягнуты. Пачакайце 10 секунд і паўтарыце спробу."
},
"peer-ui": {
"preparing": "Падрыхтоўка…",
"waiting": "Чаканне…",
"transferring": "Перадача…",
"processing": "Апрацоўка…",
"click-to-send-share-mode": "Націсніце, каб адправіць {{descriptor}}",
"connection-hash": "Каб праверыць бяспеку скразнога шыфравання, параўнайце гэты нумар бяспекі на абедзвюх прыладах",
"click-to-send": "Націсніце, каб адправіць файлы, або націсніце правай кнопкай мышы, каб адправіць паведамленне"
},
"document-titles": {
"file-received": "Файл атрыманы",
"image-transfer-requested": "Запытана перадача малюнкаў",
"message-received": "Паведамленне атрымана",
"message-received-plural": "Атрымана {{count}} паведамленняў",
"file-received-plural": "Атрымана {{count}} файлаў",
"file-transfer-requested": "Запытана перадача файла"
}
}

View File

@@ -30,7 +30,8 @@
"cancel-share-mode": "Cancel·lar",
"about_title": "Sobre PairDrop",
"about_aria-label": "Obre Sobre PairDrop",
"theme-light_title": "Utilitza sempre el mode clar"
"theme-light_title": "Utilitza sempre el mode clar",
"expand_title": "Expandeix la fila de botons de la capçalera"
},
"dialogs": {
"message_placeholder": "Text",
@@ -166,7 +167,11 @@
"close-about_aria-label": "Tanca Sobre PairDrop",
"buy-me-a-coffee_title": "Convida'm a un cafè!",
"github_title": "PairDrop a GitHub",
"faq_title": "Preguntes freqüents"
"faq_title": "Preguntes freqüents",
"mastodon_title": "Escriu sobre PairDrop a Mastodon",
"bluesky_title": "Segueix-nos a BlueSky",
"custom_title": "Segueix-nos",
"privacypolicy_title": "Obre la nostra política de privacitat"
},
"document-titles": {
"file-transfer-requested": "Transferència de Fitxers Sol·licitada",

184
public/lang/cs.json Normal file
View File

@@ -0,0 +1,184 @@
{
"header": {
"about_aria-label": "Otevřít o PairDrop",
"about_title": "O službě PairDrop",
"language-selector_title": "Nastavit jazyk",
"theme-auto_title": "Automatické přizpůsobení tématu systému",
"pair-device_title": "Spárovat zařízení permanentně",
"theme-light_title": "Vždy používat světlé téma",
"theme-dark_title": "Vždy používat tmavé téma",
"notification_title": "Povolit upozornění",
"install_title": "Nainstalovat PairDrop",
"edit-paired-devices_title": "Upravit spárovaná zařízení",
"join-public-room_title": "Připojte se dočasně k veřejné místnosti",
"cancel-share-mode": "Zrušit",
"edit-share-mode": "Upravit",
"expand_title": "Rozbalit řádek tlačítka záhlaví"
},
"about": {
"buy-me-a-coffee_title": "Kupte mi kávu!",
"close-about_aria-label": "Zavřít O PairDrop",
"claim": "Nejjednodušší způsob přenosu souborů mezi zařízeními",
"github_title": "PairDrop na GitHubu",
"tweet_title": "Tweet o PairDrop",
"mastodon_title": "Napište o PairDrop na Mastodon",
"custom_title": "Sledujte nás",
"privacypolicy_title": "Otevřete naše zásady ochrany osobních údajů",
"bluesky_title": "Sledujte nás na BlueSky",
"faq_title": "Často kladené otázky"
},
"footer": {
"webrtc": "pokud WebRTC není k dispozici.",
"known-as": "Jste známí jako:",
"display-name_data-placeholder": "Načítání…",
"display-name_title": "Trvale upravit název zařízení",
"discovery": "Můžete být objeveni:",
"on-this-network": "na této síti",
"on-this-network_title": "V této síti vás může objevit každý.",
"paired-devices": "pomocí spárovaných zařízení",
"paired-devices_title": "Spárovaná zařízení vás mohou kdykoli objevit nezávisle na síti.",
"public-room-devices": "v místnosti {{roomId}}",
"public-room-devices_title": "Zařízení v této veřejné místnosti vás mohou objevit nezávisle na síti.",
"traffic": "Provoz je",
"routed": "směrovány přes server"
},
"dialogs": {
"auto-accept": "auto-accept",
"pair-devices-title": "Spárujte zařízení trvale",
"input-key-on-this-device": "Zadejte tento klíč na jiném zařízení",
"scan-qr-code": "nebo naskenujte QR kód.",
"enter-key-from-another-device": "Zde zadejte klíč z jiného zařízení.",
"temporary-public-room-title": "Dočasná veřejná místnost",
"input-room-id-on-another-device": "Zadejte toto ID místnosti na jiném zařízení",
"enter-room-id-from-another-device": "Chcete-li se připojit k místnosti, zadejte ID místnosti z jiného zařízení.",
"hr-or": "NEBO",
"pair": "Párovat",
"cancel": "Zrušit",
"edit-paired-devices-title": "Upravit spárovaná zařízení",
"unpair": "Zrušit spárování",
"paired-device-removed": "Spárované zařízení bylo odstraněno.",
"paired-devices-wrapper_data-empty": "Žádná spárovaná zařízení.",
"auto-accept-instructions-1": "Aktivovat",
"auto-accept-instructions-2": "automaticky přijímat všechny soubory odeslané z tohoto zařízení.",
"close": "Zavřít",
"join": "Připojit",
"leave": "Odejít",
"accept": "Přijmout",
"decline": "Odmítnout",
"would-like-to-share": "by se rád podělil",
"has-sent": "odeslal:",
"share": "Sdílet",
"download": "Stáhnout",
"send-message-title": "Poslat zprávu",
"send-message-to": "Komu:",
"message_title": "Vložte zprávu k odeslání",
"message_placeholder": "Text",
"send": "Odeslat",
"receive-text-title": "Zpráva přijata",
"copy": "Kopírovat",
"base64-title-files": "Sdílet soubory",
"base64-title-text": "Sdílet text",
"base64-processing": "Zpracovává se…",
"base64-tap-to-paste": "Klepnutím sem sdílejte {{type}}",
"base64-files": "soubory",
"file-other-description-image": "a 1 další obrázek",
"base64-paste-to-send": "Sem vložte schránku pro sdílení {{type}}",
"base64-text": "text",
"file-other-description-file": "a 1 další soubor",
"file-other-description-image-plural": "a další obrázky ({{count}})",
"file-other-description-file-plural": "a {{count}} dalších souborů",
"title-image": "Obrázek",
"title-file": "Soubor",
"title-image-plural": "Obrázky",
"title-file-plural": "Soubory",
"receive-title": "{{descriptor}} Přijato",
"download-again": "Stáhnout znovu",
"language-selector-title": "Nastavit jazyk",
"system-language": "Jazyk systému",
"public-room-qr-code_title": "Kliknutím zkopírujete odkaz do veřejné místnosti",
"pair-devices-qr-code_title": "Kliknutím zkopírujete odkaz pro spárování tohoto zařízení",
"approve": "schválit",
"share-text-title": "Sdílet textovou zprávu",
"share-text-subtitle": "Upravit zprávu před odesláním:",
"share-text-checkbox": "Při sdílení textu vždy zobrazit tento dialog",
"close-toast_title": "Zavřít oznámení"
},
"instructions": {
"no-peers_data-drop-bg": "Uvolněním vyberte příjemce",
"no-peers-title": "Otevřete PairDrop na jiných zařízeních a posílejte soubory",
"no-peers-subtitle": "Spárujte zařízení nebo vstupte do veřejné místnosti, abyste byli zjistitelní v jiných sítích",
"x-instructions_desktop": "Kliknutím odešlete soubory nebo kliknutím pravým tlačítkem odešlete zprávu",
"x-instructions_mobile": "Klepnutím odešlete soubory nebo dlouhým klepnutím odešlete zprávu",
"x-instructions_data-drop-peer": "Uvolněním odešlete",
"x-instructions_data-drop-bg": "Uvolněním vyberte příjemce",
"x-instructions-share-mode_desktop": "Kliknutím odešlete {{descriptor}}",
"x-instructions-share-mode_mobile": "Klepnutím odešlete {{descriptor}}",
"activate-share-mode-base": "Pro odeslání otevřete PairDrop na jiných zařízeních",
"activate-share-mode-and-other-file": "a 1 další soubor",
"activate-share-mode-and-other-files-plural": "a {{count}} dalších souborů",
"activate-share-mode-shared-text": "sdílený text",
"activate-share-mode-shared-file": "sdílený soubor",
"activate-share-mode-shared-files-plural": "{{count}} sdílených souborů",
"webrtc-requirement": "Chcete-li použít PairDrop, musí být povoleno WebRTC!"
},
"notifications": {
"display-name-changed-permanently": "Zobrazované jméno je trvale změněno",
"display-name-changed-temporarily": "Zobrazované jméno je změněno pouze pro tuto relaci",
"display-name-random-again": "Zobrazované jméno je opět náhodně generováno",
"download-successful": "{{descriptor}} staženo",
"pairing-tabs-error": "Spárování dvou záložek webového prohlížeče není možné",
"pairing-success": "Zařízení spárována",
"pairing-not-persistent": "Spárovaná zařízení nejsou trvalá",
"pairing-key-invalid": "Neplatný klíč",
"pairing-key-invalidated": "Klíč {{key}} byl neplatný",
"public-room-id-invalid": "Neplatné ID místnosti",
"public-room-left": "Opustit veřejnou místnost {{publicRoomId}}",
"copied-to-clipboard": "Zkopírováno do schránky",
"pair-url-copied-to-clipboard": "Odkaz pro spárování tohoto zařízení byl zkopírován do schránky",
"room-url-copied-to-clipboard": "Odkaz do veřejné místnosti zkopírován do schránky",
"pairing-cleared": "Všechna nespárovaná zařízení",
"copied-to-clipboard-error": "Kopírování není možné. Kopírovat ručně.",
"text-content-incorrect": "Textový obsah je nesprávný",
"file-content-incorrect": "Obsah souboru je nesprávný",
"clipboard-content-incorrect": "Obsah schránky je nesprávný",
"notifications-enabled": "Oznámení povolena",
"notifications-permissions-error": "Oprávnění k oznámení bylo zablokováno, protože uživatel několikrát odmítl výzvu k povolení. Toto lze resetovat v části Informace o stránce, ke které se dostanete kliknutím na ikonu zámku vedle řádku adresy URL.",
"link-received": "Odkaz obdržel {{name}} kliknutím otevřete",
"message-received": "Zpráva přijatá uživatelem {{name}} kliknutím zkopírujte",
"click-to-download": "Kliknutím stáhnete",
"request-title": "{{name}} chce přenést {{count}} {{descriptor}}",
"copied-text": "Text byl zkopírován do schránky",
"click-to-show": "Kliknutím zobrazíte",
"copied-text-error": "Zápis do schránky se nezdařil. Zkopírujte ručně!",
"offline": "Jste offline",
"online": "Jste zpět online",
"connected": "Připojeno",
"online-requirement-public-room": "Chcete-li vytvořit veřejnou místnost, musíte být online",
"online-requirement-pairing": "Chcete-li spárovat zařízení, musíte být online",
"connecting": "Připojování…",
"files-incorrect": "Soubory jsou nesprávné",
"file-transfer-completed": "Přenos souborů byl dokončen",
"message-transfer-completed": "Přenos zprávy byl dokončen",
"ios-memory-limit": "Odesílání souborů do iOS je možné pouze do velikosti 200 MB najednou",
"unfinished-transfers-warning": "Existují nedokončené přenosy Opravdu chcete zavřít PairDrop?",
"rate-limit-join-key": "Bylo dosaženo limitu. Počkejte 10 sekund a zkuste to znovu.",
"selected-peer-left": "Vybraný partner odešel"
},
"document-titles": {
"file-received": "Soubor byl přijat",
"file-received-plural": "Počet přijatých souborů: {{count}}",
"file-transfer-requested": "Požadován přenos souboru",
"message-received": "Zpráva přijata",
"image-transfer-requested": "Požadován přenos obrázku",
"message-received-plural": "Počet přijatých zpráv: {{count}}"
},
"peer-ui": {
"click-to-send-share-mode": "Kliknutím odešlete {{descriptor}}",
"click-to-send": "Kliknutím odešlete soubory nebo kliknutím pravým tlačítkem odešlete zprávu",
"transferring": "Přenáší se…",
"connection-hash": "Chcete-li ověřit bezpečnost šifrování typu end-to-end, porovnejte toto číslo zabezpečení na obou zařízeních",
"preparing": "Připravuje se…",
"waiting": "Čekání…",
"processing": "Zpracovává se…"
}
}

184
public/lang/da.json Normal file
View File

@@ -0,0 +1,184 @@
{
"notifications": {
"public-room-left": "Forlod det offentlige rum {{publicRoomId}}",
"room-url-copied-to-clipboard": "Link til offentligt rum kopieret til udklipsholder",
"notifications-enabled": "Notifikationer aktiveret",
"notifications-permissions-error": "Notifikationstilladelsen er blevet blokeret, da brugeren har afvist tilladelsesprompten flere gange. Dette kan nulstilles i sideoplysninger, som du kan få adgang til ved at klikke på låseikonet ved siden af URL-linjen.",
"copied-text-error": "Skrivning til udklipsholder mislykkedes. Kopier manuelt!",
"ios-memory-limit": "Det er kun muligt at sende filer til iOS op til 200 MB på én gang",
"display-name-random-again": "Vist navn genereres tilfældigt igen",
"display-name-changed-permanently": "Det viste navn blec ændret permanent",
"display-name-changed-temporarily": "Vist navn blev kun ændret for denne session",
"download-successful": "{{descriptor}} hentet",
"pairing-tabs-error": "Det er umuligt at parre to webbrowserfaner",
"pairing-success": "Enheder parret",
"pairing-not-persistent": "Parrede enheder er ikke vedvarende",
"pairing-key-invalid": "Ugyldig nøgle",
"pairing-key-invalidated": "Nøglen {{key}} er ugyldig",
"pairing-cleared": "Alle enheder er frakoblet",
"public-room-id-invalid": "Ugyldigt rum-id",
"copied-to-clipboard": "Kopieret til udklipsholder",
"pair-url-copied-to-clipboard": "Link til at parre denne enhed kopieret til udklipsholder",
"copied-to-clipboard-error": "Kopiering ikke mulig. Kopier manuelt.",
"text-content-incorrect": "Tekstindholdet er forkert",
"file-content-incorrect": "Filens indhold er forkert",
"clipboard-content-incorrect": "Udklipsholderens indhold er forkert",
"link-received": "Link modtaget af {{name}} - Klik for at åbne",
"message-received": "Besked modtaget af {{name}} - Klik for at kopiere",
"click-to-download": "Klik for at hente",
"request-title": "{{name}} vil gerne overføre {{count}} {{descriptor}}",
"click-to-show": "Klik for at vise",
"copied-text": "Kopieret tekst til udklipsholder",
"offline": "Du er offline",
"online": "Du er online igen",
"connected": "Forbundet",
"online-requirement-pairing": "Du skal være online for at parre enheder",
"online-requirement-public-room": "Du skal være online for at oprette et offentligt rum",
"connecting": "Forbinder…",
"files-incorrect": "Filerne er forkerte",
"file-transfer-completed": "Filoverførsel gennemført",
"message-transfer-completed": "Beskedoverførsel gennemført",
"unfinished-transfers-warning": "Der er uafsluttede overførsler. Er du sikker på, at du vil lukke PairDrop?",
"rate-limit-join-key": "Satsgrænsen er nået. Vent 10 sekunder, og prøv igen.",
"selected-peer-left": "Valgt peer forlod"
},
"dialogs": {
"message_placeholder": "Tekst",
"base64-files": "filer",
"file-other-description-image": "og 1 andet billede",
"file-other-description-file": "og 1 anden fil",
"download-again": "Hent igen",
"system-language": "Systemsprog",
"pair-devices-qr-code_title": "Klik for at kopiere linket for at parre denne enhed",
"enter-key-from-another-device": "Indtast nøgle fra en anden enhed her.",
"temporary-public-room-title": "Midlertidigt offentligt rum",
"edit-paired-devices-title": "Rediger parrede enheder",
"auto-accept-instructions-2": "for automatisk at acceptere alle filer sendt fra den pågældende enhed.",
"pair-devices-title": "Par enheder permanent",
"input-key-on-this-device": "Indtast denne nøgle på en anden enhed",
"scan-qr-code": "eller scan QR-koden.",
"input-room-id-on-another-device": "Indtast dette rum-id på en anden enhed",
"enter-room-id-from-another-device": "Indtast rum-id fra en anden enhed for at deltage i rummet.",
"hr-or": "ELLER",
"pair": "Par",
"cancel": "Annuller",
"unpair": "Fjern parring",
"paired-device-removed": "Parret enhed er blevet fjernet.",
"paired-devices-wrapper_data-empty": "Ingen parrede enheder.",
"auto-accept-instructions-1": "Aktiver",
"auto-accept": "auto-accepter",
"close": "Luk",
"join": "Forbinde",
"leave": "Forlad",
"would-like-to-share": "gerne vil dele",
"accept": "Accepter",
"decline": "Nægt",
"has-sent": "har sendt:",
"share": "Del",
"download": "Hent",
"send-message-title": "Send besked",
"send-message-to": "Til:",
"message_title": "Indsæt besked for at sende",
"send": "Send",
"receive-text-title": "Besked modtaget",
"copy": "Kopier",
"base64-title-files": "Del filer",
"base64-title-text": "Del tekst",
"base64-processing": "Behandler…",
"base64-tap-to-paste": "Tryk her for at dele {{type}}",
"base64-paste-to-send": "Indsæt udklipsholder her for at dele {{type}}",
"base64-text": "tekst",
"file-other-description-image-plural": "og {{count}} andre billeder",
"file-other-description-file-plural": "og {{count}} andre filer",
"title-image": "Billede",
"title-file": "Fil",
"title-image-plural": "Billeder",
"title-file-plural": "Filer",
"receive-title": "{{descriptor}} Modtaget",
"language-selector-title": "Indstil sprog",
"public-room-qr-code_title": "Klik for at kopiere linket til det offentlige rum",
"approve": "godkend",
"share-text-title": "Del tekstbesked",
"share-text-subtitle": "Rediger besked, før du sender:",
"share-text-checkbox": "Vis altid denne dialogboks, når du deler tekst",
"close-toast_title": "Luk besked"
},
"about": {
"claim": "Den nemmeste måde at overføre filer på tværs af enheder",
"faq_title": "Ofte stillede spørgsmål",
"close-about_aria-label": "Luk Om PairDrop",
"github_title": "PairDrop på GitHub",
"buy-me-a-coffee_title": "Køb mig en kop kaffe!",
"tweet_title": "Tweet om PairDrop",
"mastodon_title": "Skriv om PairDrop på Mastodon",
"bluesky_title": "Følg os på BlueSky",
"custom_title": "Følg os",
"privacypolicy_title": "Åbn vores privatlivspolitik"
},
"header": {
"language-selector_title": "Indstil sprog",
"about_aria-label": "Åbn Om PairDrop",
"theme-auto_title": "Tilpas temaet til systemet automatisk",
"theme-light_title": "Brug altid lyst tema",
"theme-dark_title": "Brug altid mørkt tema",
"notification_title": "Aktiver notifikationer",
"install_title": "Installer PairDrop",
"pair-device_title": "Par dine enheder permanent",
"edit-paired-devices_title": "Rediger parrede enheder",
"join-public-room_title": "Deltag midlertidigt i det offentlige rum",
"cancel-share-mode": "Annuller",
"edit-share-mode": "Redigere",
"expand_title": "Udvid overskriftsknaprækken",
"about_title": "Om PairDrop"
},
"instructions": {
"no-peers-subtitle": "Par enheder, eller gå ind i et offentligt rum for at være synlig på andre netværk",
"x-instructions_desktop": "Klik for at sende filer eller højreklik for at sende en besked",
"activate-share-mode-base": "Åbn PairDrop på andre enheder for at sende",
"no-peers_data-drop-bg": "Slip for at vælge modtager",
"no-peers-title": "Åbn PairDrop på andre enheder for at sende filer",
"x-instructions_mobile": "Tryk for at sende filer, eller tryk længe for at sende en besked",
"x-instructions_data-drop-peer": "Slip for at sende til peer",
"x-instructions_data-drop-bg": "Slip for at vælge modtager",
"x-instructions-share-mode_desktop": "Klik for at sende {{descriptor}}",
"x-instructions-share-mode_mobile": "Tryk for at sende {{descriptor}}",
"activate-share-mode-and-other-file": "og 1 anden fil",
"activate-share-mode-and-other-files-plural": "og {{count}} andre filer",
"activate-share-mode-shared-text": "delt tekst",
"activate-share-mode-shared-file": "delt fil",
"activate-share-mode-shared-files-plural": "{{count}} delte filer",
"webrtc-requirement": "For at bruge denne PairDrop-instans skal WebRTC være aktiveret!"
},
"footer": {
"on-this-network_title": "Du kan blive opdaget af alle på dette netværk.",
"public-room-devices_title": "Du kan blive opdaget af enheder i dette offentlige rum uafhængigt af netværket.",
"known-as": "Du er kendt som:",
"display-name_data-placeholder": "Indlæser…",
"display-name_title": "Rediger dit enhedsnavn permanent",
"discovery": "Du kan blive opdaget:",
"on-this-network": "på dette netværk",
"paired-devices": "af parrede enheder",
"paired-devices_title": "Du kan til enhver tid blive opdaget af parrede enheder uafhængigt af netværket.",
"public-room-devices": "i rum {{roomId}}",
"traffic": "Trafikken er",
"routed": "dirigeret gennem serveren",
"webrtc": "hvis WebRTC ikke er tilgængelig."
},
"document-titles": {
"file-received": "Fil modtaget",
"file-received-plural": "{{count}} Filer modtaget",
"file-transfer-requested": "Filoverførsel anmodet",
"image-transfer-requested": "Billedoverførsel anmodet",
"message-received": "Besked modtaget",
"message-received-plural": "{{count}} meddelelser modtaget"
},
"peer-ui": {
"click-to-send-share-mode": "Klik for at sende {{descriptor}}",
"click-to-send": "Klik for at sende filer eller højreklik for at sende en besked",
"connection-hash": "For at kontrollere sikkerheden for end-to-end-kryptering skal du sammenligne dette sikkerhedsnummer på begge enheder",
"preparing": "Forbereder…",
"waiting": "Venter…",
"processing": "Behandler…",
"transferring": "Overfører…"
}
}

View File

@@ -152,7 +152,7 @@
"x-instructions_desktop": "Klicke, um Dateien zu senden oder benutze einen Rechtsklick, um eine Nachricht zu senden",
"no-peers-title": "Öffne PairDrop auf anderen Geräten, um Dateien zu senden",
"no-peers_data-drop-bg": "Hier ablegen, um Empfänger auszuwählen",
"no-peers-subtitle": "Kopple Geräte oder betrete einen öffentlichen Raum, um in anderen Netzwerken sichtbar zu sein",
"no-peers-subtitle": "Kopple Geräte oder betritt einen öffentlichen Raum, um in anderen Netzwerken sichtbar zu sein",
"x-instructions-share-mode_desktop": "Klicke zum Senden von {{descriptor}}",
"x-instructions-share-mode_mobile": "Tippe zum Senden von {{descriptor}}",
"x-instructions_data-drop-peer": "Hier ablegen, um an Peer zu senden",

1
public/lang/fi.json Normal file
View File

@@ -0,0 +1 @@
{}

View File

@@ -11,7 +11,9 @@
"pair-device_title": "Associez vos appareils de manière permanente",
"edit-paired-devices_title": "Gérer les appareils couplés",
"join-public-room_title": "Rejoindre temporairement la salle publique",
"cancel-share-mode": "Terminé"
"cancel-share-mode": "Terminé",
"edit-share-mode": "Modifier",
"expand_title": "Agrandir entête bouton ligne"
},
"instructions": {
"no-peers_data-drop-bg": "Déposer pour choisir le destinataire",
@@ -21,11 +23,15 @@
"x-instructions_mobile": "Appuyez pour envoyer des fichiers ou appuyez longuement pour envoyer un message",
"x-instructions_data-drop-peer": "Déposer pour envoyer au destinataire",
"x-instructions_data-drop-bg": "Lâcher pour choisir le destinataire",
"x-instructions-share-mode_desktop": "Cliquez pour envoyer",
"x-instructions-share-mode_mobile": "Appuyez pour envoyer",
"x-instructions-share-mode_desktop": "Cliquez pour envoyer {{descriptor}}",
"x-instructions-share-mode_mobile": "Appuyez pour envoyer {{descriptor}}",
"activate-share-mode-base": "Ouvrez PairDrop sur d'autres appareils pour envoyer",
"activate-share-mode-and-other-files-plural": "et {{count}} autres fichiers",
"activate-share-mode-shared-text": "texte partagé"
"activate-share-mode-shared-text": "texte partagé",
"activate-share-mode-shared-file": "fichier partagé",
"webrtc-requirement": "Pour utiliser cette instance de PairDrop, WebRTC doit être activé!",
"activate-share-mode-shared-files-plural": "{{count}} fichiers partagés",
"activate-share-mode-and-other-file": "et un autre fichier"
},
"footer": {
"known-as": "Vous êtes connu comme :",
@@ -70,13 +76,13 @@
"share": "Partage",
"download": "Télécharger",
"send-message-title": "Envoyer un message",
"send-message-to": "Envoyer un message à",
"send-message-to": "À :",
"send": "Envoyer",
"receive-text-title": "Message reçu",
"copy": "Copier",
"base64-processing": "Traitement…",
"base64-tap-to-paste": "Appuyez ici pour coller {{type}}",
"base64-paste-to-send": "Coller ici pour envoyer {{type}}",
"base64-tap-to-paste": "Appuyez ici pour partager {{type}}",
"base64-paste-to-send": "Coller le presse-papiers ici pour partager {{type}}",
"base64-text": "texte",
"base64-files": "fichiers",
"file-other-description-image": "et 1 autre image",
@@ -93,7 +99,16 @@
"system-language": "Langue du système",
"message_title": "Insérer un message à envoyer",
"pair-devices-qr-code_title": "Cliquer pour copier pour appairer l'appareil",
"public-room-qr-code_title": "Cliquez pour copier le lien vers le salon public"
"public-room-qr-code_title": "Cliquez pour copier le lien vers le salon public",
"base64-title-text": "Texte partagé",
"paired-device-removed": "L'appareil connecté a été enlevé.",
"message_placeholder": "Texte",
"base64-title-files": "Fichiers partagés",
"approve": "approuve",
"share-text-title": "Partage le message",
"share-text-subtitle": "Modifier le message avant l'envoi:",
"share-text-checkbox": "Toujours montrer ce dialogue quand du texte est partagé",
"close-toast_title": "Fermer la notification"
},
"about": {
"close-about_aria-label": "Fermer à propos de PairDrop",
@@ -101,7 +116,11 @@
"github_title": "PairDrop sur GitHub",
"buy-me-a-coffee_title": "Achetez-moi un café!",
"tweet_title": "Tweet à propos de PairDrop",
"faq_title": "Questions fréquemment posées"
"faq_title": "Questions fréquemment posées",
"bluesky_title": "Suis-nous sur BlueSky",
"custom_title": "Suis-nous",
"privacypolicy_title": "Ouvert sur notre politique de confidentialité",
"mastodon_title": "Écrire à propos de PairDrop sur Mastodon"
},
"notifications": {
"display-name-changed-permanently": "Le nom d'affichage est modifié de manière permanente",

184
public/lang/he.json Normal file
View File

@@ -0,0 +1,184 @@
{
"header": {
"about_title": "אודות PairDrop",
"theme-light_title": "השתמש תמיד במצב בהיר",
"install_title": "התקן את PairDrop",
"edit-share-mode": "עריכה",
"expand_title": "הרחב את שורת כפתור הכותרת",
"language-selector_title": "שינוי השפה",
"about_aria-label": "פתח אודות PairDrop",
"theme-auto_title": "התאם את הרקע למערכת באופן אוטומטי",
"theme-dark_title": "השתמש תמיד במצב כהה",
"notification_title": "הפעל התראות",
"pair-device_title": "התאם את המכשירים שלך לתמיד",
"edit-paired-devices_title": "עריכת מכשירים מתואמים",
"join-public-room_title": "הצטרף לחדר ציבורי באופן זמני",
"cancel-share-mode": "ביטול"
},
"instructions": {
"no-peers-subtitle": "תאם מכשירים או היכנס לחדר ציבורי כדי להיות ניתן לגילוי ברשתות אחרות",
"x-instructions_data-drop-bg": "שחרר כדי לבחור נמען",
"activate-share-mode-and-other-file": "וקובץ 1 אחר",
"activate-share-mode-base": "פתח את PairDrop על מכשירים אחרים כדי לשלוח",
"activate-share-mode-shared-file": "קובץ משותף",
"activate-share-mode-shared-files-plural": "{{count}} קבצים משותפים",
"webrtc-requirement": "כדי להשתמש בPairdrop, WebRTC מוכרח להיות מופעל!",
"no-peers_data-drop-bg": "שחרר כדי לבחור את הנמען",
"no-peers-title": "פתח את PairDrop במכשירים אחרים כדי לשלוח קבצים",
"x-instructions_desktop": "לחץ כדי לשלוח קבצים או בצע לחיצה ימנית כדי לשלוח הודעה",
"x-instructions_mobile": "גע כדי לשלוח קבצים או בצע נגיעה ארוכה כדי לשלוח הודעה",
"x-instructions_data-drop-peer": "שחרר כדי לשלוח למכשיר",
"x-instructions-share-mode_desktop": "לחץ כדי לשלוח {{descriptor}}",
"x-instructions-share-mode_mobile": "גע כדי לשלוח {{descriptor}}",
"activate-share-mode-and-other-files-plural": "ו{{count}} קבצים אחרים",
"activate-share-mode-shared-text": "טקסט משותף"
},
"footer": {
"paired-devices_title": "הנך ניתן לגילוי על ידי מכשירים מתואמים בכל עת ללא תלות ברשת.",
"on-this-network": "ברשת הזו",
"on-this-network_title": "אתה ניתן לגילוי על ידי כולם ברשת הזו.",
"display-name_data-placeholder": "טוען…",
"display-name_title": "שנה את שם המכשיר שלך לתמיד",
"known-as": "הנך ידוע כ:",
"discovery": "הנך ניתן לגילוי:",
"paired-devices": "על ידי מכשירים מתואמים",
"public-room-devices": "בחדר {{roomId}}",
"public-room-devices_title": "הנך ניתן לגילוי על ידי מכשירים בחדר הציבורי הזה ללא תלות ברשת.",
"traffic": "הנתונים",
"routed": "מנותבים דרך השרת",
"webrtc": "אם WebRTC אינו זמין."
},
"dialogs": {
"input-room-id-on-another-device": "הזן את מזהה החדר הזה במכשיר אחר",
"edit-paired-devices-title": "ערוך מכשירים מתואמים",
"paired-device-removed": "המכשיר המתואם הוסר.",
"download-again": "הורד שוב",
"public-room-qr-code_title": "לחץ כדי להעתיק את הקישור לחדר הציבורי",
"auto-accept-instructions-2": "כדי לקבל באופן אוטומטי את כל הקבצים שנשלחים ממכשיר זה.",
"title-file-plural": "קבצים",
"receive-title": "{{descriptor}} התקבל",
"download": "הורד",
"send-message-title": "שלח הודעה",
"message_placeholder": "טקסט",
"receive-text-title": "ההודעה התקבלה",
"base64-text": "טקסט",
"share-text-checkbox": "תמיד הצג את חלונית זו כאשר טקסט משותף",
"system-language": "שפת המערכת",
"title-file": "קובץ",
"pair-devices-title": "תאם מכשירים לתמיד",
"input-key-on-this-device": "הזן את הקוד הזה במכשיר אחר",
"scan-qr-code": "או סרוק את הברקוד.",
"enter-key-from-another-device": "הזן את הקוד ממכשיר אחר כאן.",
"temporary-public-room-title": "חדר ציבורי זמני",
"enter-room-id-from-another-device": "הזן מזהה חדר ממכשיר אחר כדי להצטרף לחדר.",
"hr-or": "או",
"pair": "תאם",
"cancel": "ביטול",
"unpair": "בטל התאמה",
"paired-devices-wrapper_data-empty": "אין מכשירים מתואמים.",
"auto-accept-instructions-1": "הפעל",
"auto-accept": "קבלה אוטומטית",
"close": "סגירה",
"join": "הצטרף",
"leave": "עזוב",
"would-like-to-share": "רוצה לשתף",
"accept": "קבל",
"decline": "סרב",
"has-sent": "שלח:",
"share": "שתף",
"send-message-to": "אל:",
"message_title": "הזן את ההודעה לשליחה",
"send": "שלח",
"copy": "העתק",
"base64-title-files": "שתף קבצים",
"base64-title-text": "שתף טקסט",
"base64-processing": "מעבד…",
"base64-tap-to-paste": "גע כאן כדי לשתף {{type}}",
"base64-paste-to-send": "הדבק כאן כדי לשתף {{type}}",
"base64-files": "קבצים",
"file-other-description-image": "ותמונה 1 אחרת",
"file-other-description-file": "וקובץ 1 אחר",
"file-other-description-image-plural": "ו{{count}} תמונות אחרות",
"file-other-description-file-plural": "ו{{count}} קבצים אחרים",
"title-image": "תמונה",
"title-image-plural": "תמונות",
"language-selector-title": "הגדר שפה",
"pair-devices-qr-code_title": "לחץ כדי להעתיק את הקישור כדי לבצע תיאום עם מכשיר זה",
"approve": "אשר",
"share-text-title": "שתף הודעת טקסט",
"share-text-subtitle": "ערוך את ההודעה לפני השליחה:",
"close-toast_title": "סגירת ההתראה"
},
"about": {
"mastodon_title": "כתוב על PairDrop בMastodon",
"buy-me-a-coffee_title": "קנה לי קפה!",
"claim": "הדרך הקלה ביותר להעברת קבצים בין מכשירים",
"github_title": "PairDrop בGitHub",
"tweet_title": "צייץ על PairDrop",
"custom_title": "עקוב אחרינו",
"bluesky_title": "עקוב אחרינו בBlueSky",
"privacypolicy_title": "פתח את מדיניות הפרטיות שלנו",
"faq_title": "שאלות נפוצות",
"close-about_aria-label": "סגירת אודות PairDrop"
},
"notifications": {
"display-name-changed-permanently": "שם התצוגה משתנה לתמיד",
"download-successful": "{{descriptor}} הורד",
"notifications-permissions-error": "ההרשאה להתראות נחסמה עקב סגירת חלונית בקשת ההרשאה מספר פעמים. אתה יכול לאפס זאת במידע על דף זה שניתן לגישה באמצעות לחיצה על אייקון המנעול ליד שורת הכתובת.",
"click-to-show": "לחץ כדי להציג",
"connecting": "מתחבר…",
"online": "הנך מחובר שוב לאינטרנט",
"pairing-cleared": "כל ההתאמות למכשירים הוסרו",
"pair-url-copied-to-clipboard": "הקישור להתאמת המכשיר הזה הועתק",
"connected": "מחובר",
"online-requirement-pairing": "אתה צריך להיות מחובר לאינטרנט כדי לתאם מכשירים",
"online-requirement-public-room": "אתה צריך להיות מחובר כדי ליצור חדר ציבורי",
"files-incorrect": "הקבצים שגויים",
"unfinished-transfers-warning": "יש עוד העברות שלא הסתיימו. אתה בטוח שאתה רוצה לסגור את PairDrop?",
"rate-limit-join-key": "הגעת למגבלה. חכה 10 שניות ונסה שנית.",
"selected-peer-left": "המכשיר הנבחר עזב",
"display-name-changed-temporarily": "שם התצוגה משתנה להפעלה זו בלבד",
"display-name-random-again": "שם התצוגה נוצר שוב באופן אקראי",
"pairing-tabs-error": "תיאום בין שני כרטיסיות בדפדפן אינו אפשרי",
"pairing-success": "המכשירים תואמו",
"pairing-not-persistent": "המכשירים המתואמים אינם קבועים",
"pairing-key-invalid": "קוד שגוי",
"pairing-key-invalidated": "הקוד {{key}} לא תקף עוד",
"public-room-id-invalid": "מזהה חדר שגוי",
"public-room-left": "עזבת את החדר הציבורי {{publicRoomId}}",
"copied-to-clipboard": "הועתק",
"room-url-copied-to-clipboard": "הקישור לחדר הציבורי הועתק",
"copied-to-clipboard-error": "העתקה אינה אפשרית. העתק ידנית.",
"text-content-incorrect": "תוכן הטקסט שגוי",
"file-content-incorrect": "תוכן הקובץ שגוי",
"clipboard-content-incorrect": "התוכן שהודבק שגוי",
"notifications-enabled": "ההתראות אופשרו",
"link-received": "קישור התקבל מ{{name}} - לחץ כדי לפתוח",
"message-received": "הודעה התקבלה מ{{name}} - לחץ כדי להעתיק",
"click-to-download": "לחץ כדי להוריד",
"request-title": "{{name}} רוצה לשלוח {{count}} {{descriptor}}",
"copied-text": "הטקסט הועתק",
"copied-text-error": "ההעתקה נכשלה. העתק ידנית!",
"offline": "הנך לא מחובר לאינטרנט",
"file-transfer-completed": "העברת הקובץ הושלמה בהצלחה",
"ios-memory-limit": "שליחת קבצים למכשירי iOS אפשרית רק עד 200 MB בבת אחת",
"message-transfer-completed": "העברת ההודעה הושלמה בהצלחה"
},
"peer-ui": {
"click-to-send": "לחץ כדי לשלוח קבצים או בצע לחיצה ימנית כדי לשלוח הודעה",
"click-to-send-share-mode": "לחץ כדי לשלוח {{descriptor}}",
"connection-hash": "כדי לאמת את האבטחה של ההצפנה מצד לצד, השווה את מספר אבטחה זה בין שני המכשירים",
"preparing": "מתכונן…",
"waiting": "מחכה…",
"processing": "מעבד…",
"transferring": "מעביר…"
},
"document-titles": {
"file-received": "הקובץ התקבל",
"file-received-plural": "{{count}} קבצים התקבלו",
"file-transfer-requested": "העברת קבצים מתבקשת",
"image-transfer-requested": "העברת תמונות מתבקשת",
"message-received": "התקבלה הודעה",
"message-received-plural": "{{count}} הודעות התקבלו"
}
}

184
public/lang/hu.json Normal file
View File

@@ -0,0 +1,184 @@
{
"header": {
"language-selector_title": "Nyelv beállítása",
"theme-auto_title": "Téma automatikusan rendszerhez igazítása",
"about_aria-label": "\"A PairDrop-ról\" megnyitása",
"theme-light_title": "Mindig világos téma használata",
"theme-dark_title": "Mindig sötét téma használata",
"notification_title": "Értesítések engedélyezése",
"install_title": "PairDrop telepítése",
"edit-paired-devices_title": "Párosított eszközök szerkeztése",
"cancel-share-mode": "Mégse",
"edit-share-mode": "Szerkesztés",
"expand_title": "Fejléc gombsorának kibővítése",
"about_title": "A PairDrop-ról",
"pair-device_title": "Eszközei végleges párosítása",
"join-public-room_title": "Ideiglenes csatlakozás a nyilvános szobához"
},
"instructions": {
"no-peers-title": "Nyissa meg a PairDrop-ot más eszközökön a fájlok küldéséhez",
"no-peers_data-drop-bg": "Engedje el a címzett kiválasztásához",
"x-instructions_desktop": "Kattintson a fájlküldéshez, vagy kattintson jobb gombbal üzenet küldéséhez",
"x-instructions_data-drop-peer": "Engedje el a partnernek való küldéshez",
"x-instructions_data-drop-bg": "Engedje el a címzett kiválasztásához",
"activate-share-mode-base": "Nyissa meg a PairDrop-ot más eszközökön a küldéséhez",
"activate-share-mode-and-other-file": "és egy másik fájl",
"activate-share-mode-and-other-files-plural": "és {{count}} másik fájl",
"activate-share-mode-shared-file": "megosztott fájl",
"activate-share-mode-shared-files-plural": "{{count}} megosztott fájl",
"x-instructions_mobile": "Koppintson a fájlküldéshez, vagy nyomja hosszan üzenet küldéséhez",
"x-instructions-share-mode_desktop": "Kattintson a {{descriptor}} küldéséhez",
"x-instructions-share-mode_mobile": "Koppintson a {{descriptor}} küldéséhez",
"activate-share-mode-shared-text": "megosztott szöveg",
"webrtc-requirement": "Ezen PairDrop példány használatához engedélyezni kell a WebRTC-t!",
"no-peers-subtitle": "Párosítsa eszközeit vagy lépjen be egy nyilvános szobába, hogy más hálózatokon is felfedezhető legyen"
},
"footer": {
"known-as": "Ön így látható:",
"display-name_data-placeholder": "Betöltés…",
"display-name_title": "Az eszköze nevének végleges megváltoztatása",
"discovery": "Ön felfedezhető:",
"on-this-network_title": "Mindenki által felfedezhető a hálózaton.",
"paired-devices": "a csatlakoztatott eszközök által",
"public-room-devices": "a {{roomId}} szobában",
"traffic": "A forgalom",
"routed": "a szerveren van átirányítva",
"webrtc": "ha nem elérhető a WebRTC.",
"on-this-network": "ezen a hálózaton",
"paired-devices_title": "A párosított eszközeid által minden esetben felfedezhető a hálózaton, a hálózattól függetlenül.",
"public-room-devices_title": "Mindenki által felfedezhető ebben a nyilvános szobában, a hálózattól függetlenül."
},
"dialogs": {
"input-key-on-this-device": "Írja be ezt a kódot egy másik eszközön",
"pair-devices-title": "Eszközök végleges párosítása",
"temporary-public-room-title": "Ideiglenes nyilvános szoba",
"input-room-id-on-another-device": "Írja be ezt a szobakódot egy másik eszközön",
"enter-room-id-from-another-device": "Írja be a szobakódot egy másik eszközről a szobához való csatlakozáshoz.",
"cancel": "Mégse",
"pair": "Párosítás",
"edit-paired-devices-title": "Párosított eszközök szerkesztése",
"unpair": "Párosítás megszüntetése",
"paired-device-removed": "Párosított eszköz eltávolítva.",
"paired-devices-wrapper_data-empty": "Nincs párosított eszköz.",
"auto-accept": "automatikus elfogadás",
"close": "Bezárás",
"join": "Csatlakozás",
"would-like-to-share": "szeretne megosztani",
"accept": "Elfogadás",
"has-sent": "küldött:",
"share": "Megosztás",
"send-message-title": "Üzenet küldése",
"send-message-to": "Neki:",
"receive-text-title": "Üzenet érkezett",
"base64-processing": "Feldolgozás…",
"scan-qr-code": "vagy olvassa be a QR-kódot.",
"auto-accept-instructions-1": "Aktiválás",
"auto-accept-instructions-2": "hogy automatikusan elfogadja az adott eszközről küldött összes fájlt.",
"leave": "Kilépés",
"decline": "Elutasítás",
"download": "Letöltés",
"send": "Küldés",
"message_title": "Írja be a küldeni kívánt üzenetet",
"message_placeholder": "Szöveg",
"copy": "Másolás",
"base64-title-files": "Fájlok megosztása",
"base64-title-text": "Szöveg megosztása",
"enter-key-from-another-device": "Ide írja be a kódot egy másik eszközről.",
"hr-or": "VAGY",
"base64-text": "szöveg",
"base64-tap-to-paste": "Koppintson ide a {{type}} megosztásához",
"base64-paste-to-send": "Illessze be a ide a vágólapja tartalmát a {{type}} megosztásához",
"base64-files": "fájlok",
"file-other-description-image": "és egy másik kép",
"file-other-description-file": "és egy másik fájl",
"file-other-description-image-plural": "és {{count}} másik kép",
"file-other-description-file-plural": "és {{count}} másik fájl",
"title-image": "Kép",
"title-file": "Fájl",
"title-image-plural": "Képek",
"title-file-plural": "Fájlok",
"receive-title": "{{descriptor}} érkezett",
"download-again": "Letöltés újra",
"language-selector-title": "Nyelv beállítása",
"system-language": "Rendszer nyelve",
"approve": "jóváhagyás",
"share-text-title": "Szöveges üzenet megosztása",
"share-text-subtitle": "Üzenet szerkesztése küldés előtt:",
"share-text-checkbox": "Mindig mutassa ezt a párbeszédablakot üzenet megosztásakor",
"close-toast_title": "Értesítés bezárása",
"public-room-qr-code_title": "Kattintson a szoba linkjének másolásához",
"pair-devices-qr-code_title": "Kattintson az eszköz párosításához való link másolásához"
},
"notifications": {
"online-requirement-pairing": "Online kell lennie készülékek párosításához",
"link-received": "Link érkezett tőle: {{name}} - Kattintson a megnyitáshoz",
"selected-peer-left": "A kiválasztott partner kilépett",
"display-name-changed-permanently": "A megjelenített neved véglegesen meg lett változtatva",
"download-successful": "{{descriptor}} letöltve",
"pairing-tabs-error": "Két böngészőlap párosítása lehetetlen",
"display-name-random-again": "A megjelenített neved véletlenszerűen újra lett generálva",
"pairing-key-invalid": "Érvénytelen kulcs",
"pairing-cleared": "Minden eszköz párosítása megszüntetve",
"public-room-id-invalid": "Érvénytelen szobakód",
"copied-to-clipboard": "Vágólapra másolva",
"copied-to-clipboard-error": "Másolás nem lehetséges. Manuális másolás szükséges.",
"text-content-incorrect": "A szöveg tartalma helytelen",
"file-content-incorrect": "A fájl tartalma helytelen",
"pair-url-copied-to-clipboard": "Az eszköz párosítására való link másolva a vágólapra",
"notifications-enabled": "Értesítések engedélyezve",
"request-title": "{{name}} szeretne küldeni: {{count}} {{descriptor}}",
"copied-text-error": "A vágólapra való írás nem sikerült. Manuális másolás szükséges.",
"click-to-download": "Kattintson a letöltéshez",
"click-to-show": "Kattintson a megjelenítéshez",
"connected": "Csatlakoztatva",
"online": "Újra online lett",
"connecting": "Csatlakozás…",
"files-incorrect": "A fájlok helytelenek",
"file-transfer-completed": "A fájlok küldése sikeres",
"message-transfer-completed": "Üzenet küldése sikeres",
"unfinished-transfers-warning": "Befejezetlen átvitelek folyamatban. Biztosan be akarja zárni a PairDrop-ot?",
"pairing-success": "Eszközök párosítva",
"pairing-not-persistent": "A párosított eszközök nem maradandóak",
"pairing-key-invalidated": "{{key}} kulcs érvénytelenítve",
"public-room-left": "{{publicRoomId}} szoba elhagyva",
"online-requirement-public-room": "Online kell lennie szoba készítéséhez",
"ios-memory-limit": "Egyszerre csak 200 MB-os fájlátvitel lehetséges iOS-re való küldéskor",
"room-url-copied-to-clipboard": "A nyilvános szoba linkje másolva a vágólapra",
"clipboard-content-incorrect": "A vágólap tartalma helytelen",
"copied-text": "Szöveg másolva a vágólapra",
"message-received": "Üzenet érkezett tőle: {{name}} - Kattintson a másoláshoz",
"notifications-permissions-error": "Az értesítések engedélye letiltásra került, mivel a felhasználó többször is elutasította az engedélykérést. Ez visszaállítható az oldalinformációkban, amely az URL-sáv melletti lakat ikonra kattintva érhet el.",
"offline": "Ön offline",
"rate-limit-join-key": "Az átviteli sebességhatár elérte a határt. Várjon 10 másodpercet, és próbálja meg újra.",
"display-name-changed-temporarily": "A megjelenített neved meg lett változtatva csak erre a munkamenetre"
},
"about": {
"close-about_aria-label": "A PairDrop-ról bezárása",
"github_title": "PairDrop a GitHub-on",
"buy-me-a-coffee_title": "Vegyél nekem egy kávét!",
"mastodon_title": "Írj a PairDrop-ról Mastodon-on",
"bluesky_title": "Kövess minket a BlueSky-on",
"faq_title": "Gyakran ismételt kérdések",
"claim": "Az eszközök közötti fájlátvitel legegyszerűbb módja",
"tweet_title": "Tweetelj a PairDrop-ról",
"custom_title": "Kövess minket",
"privacypolicy_title": "Nyisd meg az adatvédelmi szabályzatunkat"
},
"document-titles": {
"file-received": "Fájl érkezett",
"file-received-plural": "{{count}} fájl érkezett",
"image-transfer-requested": "Képátvitel kérelmezve",
"message-received": "Üzenet érkezett",
"message-received-plural": "{{count}} üzenet érkezett",
"file-transfer-requested": "Fájlátvitel kérelmezve"
},
"peer-ui": {
"preparing": "Előkészítés…",
"click-to-send-share-mode": "Kattintson a {{descriptor}} küldéséhez",
"waiting": "Várakozás…",
"processing": "Feldolgozás…",
"transferring": "Átvitel…",
"click-to-send": "Kattintson fájlok küldéséhez vagy kattintson jobb gombbal üzenet küldéséhez",
"connection-hash": "A végpontok közötti titkosítás biztonságának ellenőrzéséhez hasonlítsa össze ezt a biztonsági számot mindkét eszközön"
}
}

View File

@@ -58,7 +58,7 @@
"room-url-copied-to-clipboard": "Tautan ke ruang publik disalin ke papan klip"
},
"header": {
"cancel-share-mode": "Selesai",
"cancel-share-mode": "Batalkan",
"theme-auto_title": "Sesuaikan tema dengan sistem",
"install_title": "Instal PairDrop",
"theme-dark_title": "Selalu gunakan tema gelap",
@@ -69,13 +69,15 @@
"language-selector_title": "Atur Bahasa",
"about_title": "Tentang PairDrop",
"about_aria-label": "Buka Tentang PairDrop",
"theme-light_title": "Selalu gunakan tema terang"
"theme-light_title": "Selalu gunakan tema terang",
"edit-share-mode": "Sunting",
"expand_title": "Perluas baris tombol header"
},
"instructions": {
"x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan",
"x-instructions-share-mode_desktop": "Klik untuk mengirim",
"x-instructions-share-mode_desktop": "Klik untuk mengirim {{descriptor}}",
"activate-share-mode-and-other-files-plural": "dan {{count}} file lainnya",
"x-instructions-share-mode_mobile": "Ketuk untuk mengirim",
"x-instructions-share-mode_mobile": "Ketuk untuk mengirim {{descriptor}}",
"activate-share-mode-base": "Buka PairDrop di perangkat lain untuk berkirim",
"no-peers-subtitle": "Pasangkan perangkat atau masuk ke ruang publik agar dapat terdeteksi di jaringan lain",
"activate-share-mode-shared-text": "teks bersama",
@@ -83,7 +85,11 @@
"no-peers-title": "Buka PairDrop di perangkat lain untuk berkirim file",
"x-instructions_data-drop-peer": "Lepaskan untuk mengirim ke rekan",
"x-instructions_data-drop-bg": "Lepaskan untuk memilih penerima",
"no-peers_data-drop-bg": "Lepaskan untuk memilih penerima"
"no-peers_data-drop-bg": "Lepaskan untuk memilih penerima",
"activate-share-mode-and-other-file": "dan 1 file lainnya",
"activate-share-mode-shared-file": "file yang dibagikan",
"activate-share-mode-shared-files-plural": "{{count}} file yang dibagikan",
"webrtc-requirement": "Untuk menggunakan instance PairDrop ini, WebRTC harus diaktifkan!"
},
"peer-ui": {
"processing": "Memproses…",
@@ -95,7 +101,7 @@
"transferring": "Mentransfer…"
},
"dialogs": {
"base64-paste-to-send": "Tempel di sini untuk mengirim {{type}}",
"base64-paste-to-send": "Tempel salinan di sini untuk mengirim {{type}}",
"auto-accept-instructions-2": "untuk secara otomatis menerima semua file yang dikirim dari perangkat tersebut.",
"receive-text-title": "Pesan Diterima",
"edit-paired-devices-title": "Edit Perangkat yg. Dipasangkan",
@@ -111,7 +117,7 @@
"join": "Gabung",
"title-image-plural": "Gambar",
"send": "Kirim",
"base64-tap-to-paste": "Ketuk di sini untuk menempelkan {{type}}",
"base64-tap-to-paste": "Ketuk di sini untuk membagikan{{type}}",
"base64-text": "teks",
"copy": "Salin",
"file-other-description-image": "dan 1 gambar lainnya",
@@ -125,7 +131,7 @@
"title-image": "Gambar",
"file-other-description-file-plural": "dan {{count}} file lainnya",
"would-like-to-share": "ingin berbagi",
"send-message-to": "Kirim pesan ke",
"send-message-to": "Ke:",
"language-selector-title": "Pilih Bahasa",
"pair": "Pasangkan",
"hr-or": "ATAU",
@@ -144,7 +150,16 @@
"enter-room-id-from-another-device": "Masukkan room ID dari perangkat lain untuk bergabung dengan room.",
"message_title": "Masukkan pesan untuk dikirim",
"pair-devices-qr-code_title": "Klik untuk menyalin tautan untuk memasangkan perangkat ini",
"public-room-qr-code_title": "Klik untuk menyalin tautan ke ruang publik"
"public-room-qr-code_title": "Klik untuk menyalin tautan ke ruang publik",
"base64-title-files": "Bagikan File",
"base64-title-text": "Bagikan Teks",
"message_placeholder": "Teks",
"paired-device-removed": "Perangkat yang dipasangkan telah dihapus.",
"approve": "menyetujui",
"share-text-title": "Kirim Pesan Teks",
"share-text-subtitle": "Edit pesan sebelum mengirim:",
"share-text-checkbox": "Selalu tampilkan dialog ini ketika mengirimkan teks",
"close-toast_title": "Tutup notifikasi"
},
"about": {
"claim": "Cara termudah untuk mentransfer file lintas perangkat",
@@ -152,7 +167,11 @@
"close-about_aria-label": "Tutup Tentang PairDrop",
"buy-me-a-coffee_title": "Traktir aku kopi!",
"github_title": "PairDrop di GitHub",
"faq_title": "Pertanyaan yang sering diajukan"
"faq_title": "Pertanyaan yang sering diajukan",
"mastodon_title": "Tulis tentang PairDrop di Mastodon",
"bluesky_title": "Ikuti kami di BlueSky",
"custom_title": "Ikuti kami",
"privacypolicy_title": "Buka kebijakan privasi kami"
},
"document-titles": {
"file-transfer-requested": "Permintaan Transfer File",

View File

@@ -5,9 +5,9 @@
"display-name_data-placeholder": "Caricamento…",
"display-name_title": "Modifica il nome del tuo dispositivo permanentemente",
"traffic": "Il traffico è",
"paired-devices_title": "Puoi essere rilevato dai dispositivi abbinati in ogni momento, indipendentemente dalla rete.",
"paired-devices_title": "Puoi essere rilevato dai dispositivi associati in ogni momento, indipendentemente dalla rete.",
"public-room-devices": "nella stanza {{roomId}}",
"paired-devices": "da dispositivi abbinati",
"paired-devices": "da dispositivi associati",
"on-this-network": "su questa rete",
"routed": "instradato attraverso il server",
"discovery": "Puoi essere rilevato:",
@@ -15,7 +15,7 @@
"known-as": "Sei visibile come:"
},
"header": {
"cancel-share-mode": "Fatto",
"cancel-share-mode": "Annulla",
"theme-auto_title": "Adatta il tema al sistema automaticamente",
"install_title": "Installa PairDrop",
"theme-dark_title": "Usa sempre il tema scuro",
@@ -26,13 +26,15 @@
"language-selector_title": "Imposta Lingua",
"about_title": "Informazioni su PairDrop",
"about_aria-label": "Apri Informazioni su PairDrop",
"theme-light_title": "Usa sempre il tema chiaro"
"theme-light_title": "Usa sempre il tema chiaro",
"edit-share-mode": "Modifica",
"expand_title": "Espandi la riga dei pulsanti nell'intestazione"
},
"instructions": {
"x-instructions_mobile": "Tocca per inviare file o tocco prolungato per inviare un messaggio",
"x-instructions-share-mode_desktop": "Clicca per inviare",
"x-instructions-share-mode_desktop": "Clicca per inviare {{descriptor}}",
"activate-share-mode-and-other-files-plural": "e altri {{count}} files",
"x-instructions-share-mode_mobile": "Tocca per inviare",
"x-instructions-share-mode_mobile": "Tocca per inviare {{descriptor}}",
"activate-share-mode-base": "Apri PairDrop su altri dispositivi per inviare",
"no-peers-subtitle": "Abbina dispositivi o entra in una stanza pubblica per essere rilevabile su altre reti",
"activate-share-mode-shared-text": "testo condiviso",
@@ -40,23 +42,27 @@
"no-peers-title": "Apri PairDrop su altri dispositivi per inviare files",
"x-instructions_data-drop-peer": "Rilascia per inviare al peer",
"x-instructions_data-drop-bg": "Rilascia per selezionare il destinatario",
"no-peers_data-drop-bg": "Rilascia per selezionare il destinatario"
"no-peers_data-drop-bg": "Rilascia per selezionare il destinatario",
"webrtc-requirement": "Per usare questa istanza di PairDrop, devi attivare WebRTC!",
"activate-share-mode-shared-file": "file condiviso",
"activate-share-mode-shared-files-plural": "{{count}} files condivisi",
"activate-share-mode-and-other-file": "ed 1 altro file"
},
"dialogs": {
"auto-accept-instructions-2": "per accettare automaticamente tutti i files inviati da quel dispositivo.",
"edit-paired-devices-title": "Modifica Dispositivi Abbinati",
"edit-paired-devices-title": "Modifica Dispositivi Associati",
"cancel": "Annulla",
"auto-accept-instructions-1": "Attiva",
"pair-devices-title": "Abbina Dispositivi Permanentemente",
"pair-devices-title": "Associa Dispositivi Permanentemente",
"temporary-public-room-title": "Stanza Pubblica Temporanea",
"close": "Chiudi",
"unpair": "Dissocia",
"pair": "Abbina",
"pair": "Associa",
"scan-qr-code": "o scannerizza il codice QR.",
"input-key-on-this-device": "Inserisci questo codice su un altro dispositivo",
"paired-devices-wrapper_data-empty": "Nessun dispositivo abbinato.",
"paired-devices-wrapper_data-empty": "Nessun dispositivo associato.",
"enter-key-from-another-device": "Inserisci il codice dell'altro dispositivo qui.",
"auto-accept": "accetta-automaticamente",
"auto-accept": "accetta automaticamente",
"input-room-id-on-another-device": "Inserisci l'ID di questa stanza su un altro dispositivo",
"enter-room-id-from-another-device": "Inserisci l'ID stanza da un altro dispositivo per accedere alla stanza.",
"base64-paste-to-send": "Incolla qui per inviare {{type}}",
@@ -70,7 +76,7 @@
"join": "Unisciti",
"title-image-plural": "Immagini",
"send": "Invia",
"base64-tap-to-paste": "Tocca qui per incollare {{type}}",
"base64-tap-to-paste": "Tocca qui per condividere {{type}}",
"base64-text": "testo",
"copy": "Copia",
"file-other-description-image": "e 1 altra immagine",
@@ -81,7 +87,7 @@
"title-image": "Immagine",
"file-other-description-file-plural": "e altri {{count}} files",
"would-like-to-share": "vorrebbe condividere",
"send-message-to": "Invia un messaggio a",
"send-message-to": "A:",
"language-selector-title": "Imposta Lingua",
"hr-or": "OPPURE",
"download-again": "Scarica ancora",
@@ -91,11 +97,20 @@
"send-message-title": "Invia Messaggio",
"file-other-description-image-plural": "e {{count}} altre immagini",
"message_title": "Inserire messaggio da inviare",
"pair-devices-qr-code_title": "Clicca per copiare il link di abbinamento di questo dispositivo",
"public-room-qr-code_title": "Clicca per copirare il link della stanza pubblica"
"pair-devices-qr-code_title": "Clicca per copiare il link di associazione a questo dispositivo",
"public-room-qr-code_title": "Clicca per copirare il link della stanza pubblica",
"message_placeholder": "Testo",
"paired-device-removed": "Il dispositivo associato è stato rimosso.",
"base64-title-files": "Condividi Files",
"base64-title-text": "Condividi Testo",
"share-text-subtitle": "Modifica messaggio prima dell'invio:",
"share-text-checkbox": "Mostra sempre questa casella di dialogo quando si condivide del testo",
"approve": "accetta",
"share-text-title": "Condividi Messaggio di Testo",
"close-toast_title": "Chiudi notifica"
},
"notifications": {
"request-title": "{{name}} vorrebbe trasferire {{count}} {{descriptor}}",
"request-title": "{{name}} vorrebbe inviare {{count}} {{descriptor}}",
"unfinished-transfers-warning": "Ci sono dei trasferimenti in corso. Sei sicuro di voler chiudere PairDrop?",
"message-received": "Messaggio ricevuto da {{name}} - Clicca per copiare",
"rate-limit-join-key": "Limite raggiunto. Aspetta 10 secondi e riprova.",
@@ -103,22 +118,22 @@
"pairing-key-invalidated": "Il codice {{key}} è stato invalidato",
"pairing-key-invalid": "Codice non valido",
"connected": "Connesso",
"pairing-not-persistent": "I dispositivi abbinati non sono persistenti",
"text-content-incorrect": "Il contenuto testuale non è corretto",
"pairing-not-persistent": "I dispositivi associati non sono permanenti",
"text-content-incorrect": "Il contenuto di testo è errato",
"message-transfer-completed": "Trasferimento del messaggio completato",
"file-transfer-completed": "Trasferimento file completato",
"file-content-incorrect": "Il contenuto del file non è corretto",
"files-incorrect": "I file non sono corretti",
"selected-peer-left": "Peer selezionato ha abbandonato",
"file-content-incorrect": "Il contenuto del file è errato",
"files-incorrect": "I file sono errati",
"selected-peer-left": "Il peer selezionato ha abbandonato",
"link-received": "Link ricevuto da {{name}} - Clicca per aprire",
"online": "Sei di nuovo online",
"public-room-left": "Ha lasciato la stanza pubblica {{publicRoomId}}",
"public-room-left": "Hai abbandonato la stanza pubblica {{publicRoomId}}",
"copied-text": "Testo copiato negli appunti",
"display-name-random-again": "Il nome visualizzato è generato casualmente un'altra volta",
"display-name-changed-permanently": "Il nome visualizzato è cambiato permanentemente",
"copied-to-clipboard-error": "La copia non è possibile. Copia manualmente.",
"pairing-success": "Dispositivi abbinati",
"clipboard-content-incorrect": "Il contenuto copiato non è corretto",
"display-name-random-again": "Il nome visualizzato viene di nuovo generato casualmente",
"display-name-changed-permanently": "Il nome visualizzato è cambiato definitivamente",
"copied-to-clipboard-error": "La funzione di copia non è possibile. Copia manualmente.",
"pairing-success": "Dispositivi associati",
"clipboard-content-incorrect": "Il contenuto copiato è errato",
"display-name-changed-temporarily": "Il nome visualizzato è cambiato solo per questa sessione",
"copied-to-clipboard": "Copiato negli appunti",
"offline": "Sei offline",
@@ -127,14 +142,14 @@
"click-to-download": "Clicca per scaricare",
"pairing-cleared": "Tutti i dispositivi sono stati dissociati",
"notifications-enabled": "Notifiche attivate",
"online-requirement-pairing": "Devi essere online per abbinare dispositivi",
"online-requirement-pairing": "Devi essere online per associare dispositivi",
"ios-memory-limit": "L'invio di file a dispositivi iOS è possibile solo 200 MB alla volta",
"online-requirement-public-room": "Devi essere online per creare una stanza pubblica",
"copied-text-error": "Scrittura negli appunti fallita. Copia manualmente!",
"download-successful": "{{descriptor}} scaricato",
"click-to-show": "Clicca per mostrare",
"notifications-permissions-error": "Il permesso all'invio delle notifiche è stato negato poiché l'utente ha ignorato varie volte le richieste di permesso. Ciò può essere ripristinato nelle \"informazioni sito\" cliccando sull'icona a forma di lucchetto vicino alla barra degli indirizzi.",
"pair-url-copied-to-clipboard": "Link di abbinamento copiato negli appunti",
"pair-url-copied-to-clipboard": "Link di associazione copiato negli appunti",
"room-url-copied-to-clipboard": "Link della stanza copiato negli appunti"
},
"peer-ui": {
@@ -150,14 +165,18 @@
"claim": "Il modo più semplice per trasferire files tra dispositivi",
"tweet_title": "Twitta riguardo PairDrop",
"close-about_aria-label": "Chiudi Informazioni su PairDrop",
"buy-me-a-coffee_title": "Comprami un caffè!",
"buy-me-a-coffee_title": "Offrimi un caffè!",
"github_title": "PairDrop su GitHub",
"faq_title": "Domande Frequenti"
"faq_title": "Domande Frequenti",
"mastodon_title": "Scrivi su Mastodon di PairDrop",
"bluesky_title": "Seguici su BlueSky",
"custom_title": "Seguici",
"privacypolicy_title": "Apri la nostra policy sulla privacy"
},
"document-titles": {
"file-transfer-requested": "Trasferimento File Richiesto",
"image-transfer-requested": "Trasferimento Immagine Richiesto",
"message-received-plural": "{{count}} Messaggi ricevuti",
"message-received-plural": "{{count}} Messaggi Ricevuti",
"message-received": "Messaggio ricevuto",
"file-received": "File Ricevuto",
"file-received-plural": "{{count}} Files Ricevuti"

View File

@@ -1,17 +1,17 @@
{
"footer": {
"webrtc": "WebRTCが利用できない場合。",
"public-room-devices_title": "のデバイスはネットワークと関係なく、このパブリックルームのデバイスにより発見される可能性があります。",
"webrtc": "(WebRTCが無効なため)",
"public-room-devices_title": "公開ルーム内のデバイスは、接続中のネットワークと関係なくアクセスできます。",
"display-name_data-placeholder": "読み込み中…",
"display-name_title": "永続的なデバイス名を編集する",
"traffic": "トラフィックは",
"paired-devices_title": "このデバイスはネットワークと関係なく、常にペア設定したデバイスにより発見される可能性があります。",
"public-room-devices": "ルーム{{roomId}}",
"paired-devices": "ペア設定したデバイス",
"display-name_title": "デバイス名を変更する",
"traffic": "この通信は",
"paired-devices_title": "ペアリング済みデバイスであれば、接続中のネットワークに関わらずアクセスできます。",
"public-room-devices": "ルーム{{roomId}}",
"paired-devices": "ペアリング済みデバイス",
"on-this-network": "このネットワーク上",
"routed": "サーバーを経由します",
"discovery": "このデバイスは以下で発見される可能性があります:",
"on-this-network_title": "このデバイスはこのネットワーク上の誰にでも発見される可能性があります。",
"discovery": "このデバイスを検出可能なネットワーク:",
"on-this-network_title": "このネットワーク上のすべてのデバイスからアクセスできます。",
"known-as": "他のデバイスに表示される名前:"
},
"notifications": {
@@ -23,85 +23,91 @@
"pairing-key-invalidated": "コード{{key}}が失効しました",
"pairing-key-invalid": "無効なコード",
"connected": "接続しました",
"pairing-not-persistent": "ペア設定されたデバイスは永続化されていません",
"text-content-incorrect": "テキスト内容が不正です",
"pairing-not-persistent": "このデバイスとのペアリングは解除される可能性があります",
"text-content-incorrect": "無効なテキスト内容です",
"message-transfer-completed": "メッセージの送信が完了しました",
"file-transfer-completed": "ファイル転送が完了しました",
"file-content-incorrect": "ファイル内容が不正です",
"file-transfer-completed": "ファイル転送が完了しました",
"file-content-incorrect": "無効なファイル内容です",
"files-incorrect": "ファイルが間違っています",
"selected-peer-left": "選択した相手が退出しました",
"selected-peer-left": "選択したデバイスが退出しました",
"link-received": "{{name}}から受信したリンク(クリックして開く)",
"online": "オンラインに復帰しました",
"public-room-left": "パブリックルーム{{publicRoomId}}から退出しました",
"public-room-left": "公開ルーム{{publicRoomId}}から退出しました",
"copied-text": "テキストをクリップボードにコピーしました",
"display-name-random-again": "表示名がもう一度ランダムに生成されました",
"display-name-changed-permanently": "永続的な表示名が変更されました",
"display-name-random-again": "新しいランダムなデバイス名に変更されました",
"display-name-changed-permanently": "デバイス名が変更されました",
"copied-to-clipboard-error": "コピーできませんでした。手動でコピーしてください。",
"pairing-success": "デバイスがペア設定されました",
"clipboard-content-incorrect": "クリップボード内容が不正です",
"display-name-changed-temporarily": "このセッションでの表示名が変更されました",
"pairing-success": "ペアリングしました",
"clipboard-content-incorrect": "無効なクリップボード内容です",
"display-name-changed-temporarily": "この接続のみデバイス名が変更されました",
"copied-to-clipboard": "クリップボードにコピーしました",
"offline": "オフラインです",
"pairing-tabs-error": "同じWebブラウザーの2つのタブをペア設定することはできません",
"pairing-tabs-error": "同じWebブラウザーで開いたタブ同士でペアリングすることはできません",
"public-room-id-invalid": "無効なルームID",
"click-to-download": "クリックしてダウンロード",
"pairing-cleared": "全てのデバイスのペア設定を解除しました",
"notifications-enabled": "通知が有効です",
"online-requirement-pairing": "デバイスをペア設定するにはオンラインである必要があります",
"pairing-cleared": "全てのデバイスのペアリングを解除しました",
"notifications-enabled": "通知が有効になりました",
"online-requirement-pairing": "ペアリングするにはオンラインである必要があります",
"ios-memory-limit": "iOSへのファイル送信は一度に200MBまでしかできません",
"online-requirement-public-room": "パブリックルームを作成するにはオンラインである必要があります",
"online-requirement-public-room": "公開ルームを作成するにはオンラインである必要があります",
"copied-text-error": "クリップボードにコピーできませんでした。手動でコピーしてください。",
"download-successful": "{{descriptor}}をダウンロードしました",
"click-to-show": "クリックして表示",
"notifications-permissions-error": "ユーザーが権限のプロンプトを何度か閉じたため、通知の権限がブロックされました。これは、URL バーのにある鍵アイコンをクリックしてアクセスできるページ情報からリセットできます。",
"pair-url-copied-to-clipboard": "このデバイスペア設定するリンクをクリップボードにコピーしました",
"room-url-copied-to-clipboard": "パブリックルームへのリンクをクリップボードにコピーしました"
"notifications-permissions-error": "通知がブロックされました。これはユーザーが通知許可を何度も拒否したためです。これをリセットするには、URLバーのにある鍵アイコンをクリックして、ページ情報にアクセスしてください。",
"pair-url-copied-to-clipboard": "このデバイスペアリングするリンクをクリップボードにコピーしました",
"room-url-copied-to-clipboard": "公開ルームへのリンクをクリップボードにコピーしました"
},
"header": {
"cancel-share-mode": "完了",
"theme-auto_title": "テーマをシステムの設定に自動的に合わせる",
"cancel-share-mode": "キャンセル",
"theme-auto_title": "システムテーマに合わせる",
"install_title": "PairDropをインストール",
"theme-dark_title": "常にダークテーマを使用する",
"pair-device_title": "あなたのデバイスを永続的にペア設定する",
"join-public-room_title": "パブリックルームに一時的に参加する",
"pair-device_title": "のデバイスとペアリングする",
"join-public-room_title": "公開ルームに参加する",
"notification_title": "通知を有効にする",
"edit-paired-devices_title": "ペア設定したデバイスを編集する",
"language-selector_title": "言語設定",
"edit-paired-devices_title": "ペアリング設定",
"language-selector_title": "言語設定",
"about_title": "PairDropについて",
"about_aria-label": "PairDropについてを開く",
"theme-light_title": "常にライトテーマを使用する"
"theme-light_title": "常にライトテーマを使用する",
"edit-share-mode": "編集",
"expand_title": "ヘッダーボタン列を拡大する"
},
"instructions": {
"x-instructions_mobile": "タップしてファイルを送信または長押ししてメッセージを送信します",
"x-instructions-share-mode_desktop": "クリックして送信",
"x-instructions_mobile": "タップファイルを送信長押しメッセージを送信します",
"x-instructions-share-mode_desktop": "クリックして{{descriptor}}を送信",
"activate-share-mode-and-other-files-plural": "とその他{{count}}個のファイル",
"x-instructions-share-mode_mobile": "タップして送信",
"x-instructions-share-mode_mobile": "タップして{{descriptor}}を送信",
"activate-share-mode-base": "他のデバイスでPairDropを開いて送信します",
"no-peers-subtitle": "デバイスをペア設定するかパブリックルームに参加すると、他のネットワーク上からも見つけられるようになります",
"no-peers-subtitle": "ペアリングや公開ルームを使用すると、他のネットワーク上のデバイスと共有できます",
"activate-share-mode-shared-text": "共有されたテキスト",
"x-instructions_desktop": "左クリックしてファイルを送信または右クリックしてメッセージを送信します",
"no-peers-title": "他のデバイスでPairDropを開いてファイルを送信します",
"x-instructions_data-drop-peer": "離すとこの相手に送信します",
"x-instructions_data-drop-bg": "送信したい相手の上で離してください",
"no-peers_data-drop-bg": "送信したい相手の上で離してください"
"x-instructions_desktop": "左クリックファイルを送信右クリックメッセージを送信します",
"no-peers-title": "ファイルを共有するには他のデバイスでPairDropを開いてください",
"x-instructions_data-drop-peer": "ドロップするとこのデバイスに送信します",
"x-instructions_data-drop-bg": "送信したいデバイスの上でドロップしてください",
"no-peers_data-drop-bg": "送信したいデバイスの上でドロップしてください",
"activate-share-mode-and-other-file": "とその他1個のファイル",
"activate-share-mode-shared-file": "共有されたファイル",
"activate-share-mode-shared-files-plural": "{{count}}個の共有されたファイル",
"webrtc-requirement": "このPairDropインスタンスを使用するには、WebRTCを有効にする必要があります"
},
"peer-ui": {
"processing": "処理中…",
"click-to-send-share-mode": "クリックして{{descriptor}}を送信",
"click-to-send": "クリックしてファイルを送信または右クリックしてメッセージを送信します",
"click-to-send": "クリックファイルを送信右クリックメッセージを送信します",
"waiting": "待機中…",
"connection-hash": "エンドツーエンド暗号化のセキュリティを確認するには、両方のデバイスのセキュリティナンバーを確認します",
"connection-hash": "エンドツーエンド暗号化のセキュリティを確認するには、両方のデバイスのセキュリティナンバーを確認してください",
"preparing": "準備中…",
"transferring": "転送中…"
},
"dialogs": {
"base64-paste-to-send": "ここをタップして{{type}}を送信",
"auto-accept-instructions-2": "そのデバイスから送信される全てのファイルを自動的に承諾します。",
"auto-accept-instructions-2": "」を有効にすると、そのデバイスから送信されたすべてのファイルを自動的に受け入れます。",
"receive-text-title": "メッセージを受信しました",
"edit-paired-devices-title": "ペア設定したデバイスを編集",
"edit-paired-devices-title": "ペアリング設定",
"cancel": "キャンセル",
"auto-accept-instructions-1": "有効化",
"pair-devices-title": "デバイスを永続的にペア設定",
"auto-accept-instructions-1": "",
"pair-devices-title": "新規ペアリング",
"download": "ダウンロード",
"title-file": "ファイル",
"base64-processing": "処理中…",
@@ -111,48 +117,61 @@
"join": "参加",
"title-image-plural": "複数の画像",
"send": "送信",
"base64-tap-to-paste": "ここをタップして{{type}}を貼り付け",
"base64-tap-to-paste": "ここをタップして{{type}}を共有",
"base64-text": "テキスト",
"copy": "コピー",
"file-other-description-image": "と1個の他の画像",
"temporary-public-room-title": "一時的なパブリックルーム",
"file-other-description-image": "とその他1個の画像",
"temporary-public-room-title": "公開ルーム",
"base64-files": "ファイル",
"has-sent": "が送信しました:",
"file-other-description-file": "と1個の他のファイル",
"file-other-description-file": "とその他1個のファイル",
"close": "閉じる",
"system-language": "システム言語",
"unpair": "ペア解除",
"system-language": "システム言語",
"unpair": "ペアリング解除",
"title-image": "画像",
"file-other-description-file-plural": "と{{count}}個の他のファイル",
"file-other-description-file-plural": "とその他{{count}}個のファイル",
"would-like-to-share": "が以下のファイルを共有しようとしています",
"send-message-to": "このデバイスにメッセージを送信:",
"language-selector-title": "言語設定",
"pair": "ペア設定",
"language-selector-title": "言語設定",
"pair": "ペアリング",
"hr-or": "または",
"scan-qr-code": "もしくはQRコードをスキャンします。",
"input-key-on-this-device": "このキーを他のデバイスに入力する",
"scan-qr-code": "もしくはQRコードをスキャンしてください。",
"input-key-on-this-device": "このコードを他のデバイスに入力する",
"download-again": "もう一度ダウンロードする",
"accept": "承諾",
"paired-devices-wrapper_data-empty": "ペア設定したデバイスはありません。",
"enter-key-from-another-device": "他のデバイスに表示されたキーをここに入力します。",
"paired-devices-wrapper_data-empty": "ペアリングしたデバイスはありません。",
"enter-key-from-another-device": "他のデバイスに表示されたコードを入力してください。",
"share": "共有",
"auto-accept": "自動承諾",
"title-file-plural": "複数のファイル",
"send-message-title": "メッセージを送信",
"input-room-id-on-another-device": "このルームIDを他のデバイスに入力",
"file-other-description-image-plural": "と{{count}}個の他の画像",
"enter-room-id-from-another-device": "他のデバイスに表示された参加したいルームIDを入力します。",
"input-room-id-on-another-device": "このルームIDを他のデバイスに入力するか",
"file-other-description-image-plural": "とその他{{count}}個の画像",
"enter-room-id-from-another-device": "他のデバイスに表示されたルームIDを入力してください。",
"message_title": "送信するメッセージを挿入",
"pair-devices-qr-code_title": "クリックしてこのデバイスペア設定するリンクをコピー",
"public-room-qr-code_title": "クリックしてパブリックルームへのリンクをコピー"
"pair-devices-qr-code_title": "クリックしてこのデバイスペアリングするリンクをコピー",
"public-room-qr-code_title": "クリックして公開ルームへのリンクをコピー",
"paired-device-removed": "ペアリングを解除しました。",
"message_placeholder": "テキスト",
"base64-title-files": "共有されたファイル",
"base64-title-text": "テキストを共有",
"approve": "OK",
"share-text-subtitle": "送信する前にメッセージを編集する:",
"share-text-checkbox": "テキスト共有する際、毎回この画面を表示する",
"close-toast_title": "通知を閉じる",
"share-text-title": "テキストメッセージを共有します"
},
"about": {
"claim": "デバイス間ファイルを転送する最も簡単な方法",
"tweet_title": "PairDropについてツイートする",
"claim": "デバイス間ファイル共有を手軽に実現します",
"tweet_title": "PairDropのことをポストする",
"close-about_aria-label": "PairDropについてを閉じる",
"buy-me-a-coffee_title": "コーヒーをおごってください!",
"github_title": "GitHubでPairDropを見る",
"faq_title": "FAQ"
"buy-me-a-coffee_title": "コーヒーを一杯おごってください!",
"github_title": "PairDrop on GitHub",
"faq_title": "FAQ",
"mastodon_title": "MastodonにPairDropのことをトゥートする",
"bluesky_title": "BlueSkyでフォロー",
"custom_title": "フォロー",
"privacypolicy_title": "プライバシーポリシーを開く"
},
"document-titles": {
"file-transfer-requested": "ファイルの転送がリクエストされました",

View File

@@ -13,7 +13,8 @@
"about_aria-label": "PairDrop ಕುರಿತು ಪುಟವನ್ನು ತೆರೆಯಿರಿ",
"theme-light_title": "ಯಾವಾಗಲೂ ಲೈಟ್ ಥೀಮ್ ಅನ್ನು ಬಳಸಿ",
"edit-share-mode": "ಎಡಿಟ್ ಮಾಡಿ",
"cancel-share-mode": "ರದ್ದುಗೊಳಿಸಿ"
"cancel-share-mode": "ರದ್ದುಗೊಳಿಸಿ",
"expand_title": "ಹೆಡರ್ ಬಟನ್ ಸಾಲನ್ನು ವಿಸ್ತರಿಸಿ"
},
"dialogs": {
"message_placeholder": "ಪಠ್ಯ",
@@ -173,7 +174,11 @@
"close-about_aria-label": "PairDrop ಕುರಿತು ಪುಟವನ್ನು ಮುಚ್ಚಿ",
"buy-me-a-coffee_title": "ನನಗೆ ಕಾಫಿ ಖರೀದಿಸಿ!",
"github_title": "GitHub ನಲ್ಲಿ PairDrop",
"faq_title": "ಪದೇ ಪದೇ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು"
"faq_title": "ಪದೇ ಪದೇ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು",
"bluesky_title": "BlueSky ನಲ್ಲಿ ನಮ್ಮನ್ನು ಅನುಸರಿಸಿ",
"privacypolicy_title": "ನಮ್ಮ ಗೌಪ್ಯತೆ ನೀತಿ ತೆರೆಯಿರಿ",
"mastodon_title": "Mastodon ನಲ್ಲಿ PairDrop ಕುರಿತು ಬರೆಯಿರಿ",
"custom_title": "ನಮ್ಮನ್ನು ಅನುಸರಿಸಿ"
},
"document-titles": {
"file-transfer-requested": "ಫೈಲ್ ವರ್ಗಾವಣೆಗೆ ವಿನಂತಿಸಲಾಗಿದೆ",

29
public/lang/ko.json Normal file
View File

@@ -0,0 +1,29 @@
{
"header": {
"notification_title": "알림 켜기",
"edit-paired-devices_title": "연결된 기기 편집하기",
"install_title": "PairDrop 설치",
"theme-dark_title": "항상 다크 테마 사용",
"about_title": "PairDrop에 대하여",
"language-selector_title": "언어 설정",
"about_aria-label": "PairDrop에 대하여 보기",
"theme-light_title": "항상 라이트 테마 사용",
"theme-auto_title": "시스템에 맞춰 테마 자동 적용",
"join-public-room_title": "일시적으로 공개 방에 참여하기",
"cancel-share-mode": "취소",
"edit-share-mode": "편집",
"pair-device_title": "영구적으로 기기 연결하기",
"expand_title": "머리글 버튼 행 펼치기"
},
"instructions": {
"no-peers-subtitle": "장치를 연결하거나 공개 방에 들어가 다른 네트워크에서 검색 가능하게 하세요",
"no-peers_data-drop-bg": "해제하여 수신자 선택하기",
"x-instructions_mobile": "탭하여 파일을 보내거나 길게 탭하여 메시지를 보내세요",
"x-instructions_desktop": "클릭해 파일을 보내거나 오른쪽 클릭으로 메시지를 보내세요",
"no-peers-title": "다른 장치에서 PairDrop을 열어 파일 보내기",
"x-instructions_data-drop-bg": "해제하여 수신자 선택하기",
"x-instructions-share-mode_desktop": "클릭하여 {{descriptor}} 보내기",
"x-instructions-share-mode_mobile": "탭하여 {{descriptor}} 보내기",
"activate-share-mode-base": "다른 기기에서 PairDrop을 열어 보내기"
}
}

View File

@@ -52,7 +52,10 @@
"online-requirement-public-room": "U moet online zijn om een openbare kamer te maken",
"copied-text-error": "Schrijven naar klembord mislukt. Kopieer handmatig!",
"download-successful": "{{descriptor}} downloaden",
"click-to-show": "Klik om te tonen"
"click-to-show": "Klik om te tonen",
"pair-url-copied-to-clipboard": "Koppeling om dit apparaat te koppelen is gekopieerd naar het klembord",
"room-url-copied-to-clipboard": "Koppeling naar openbare kamer gekopieerd naar klembord",
"notifications-permissions-error": "Meldingsmachtiging is geblokkeerd, omdat de gebruiker het machtigingsverzoek meerdere keren heeft afgewezen. Dit kan worden gereset in instellingen van de website, welke toegangelijk is door te klikken op het sloticoon naast de URL-balk."
},
"header": {
"cancel-share-mode": "Klaar",
@@ -66,13 +69,15 @@
"language-selector_title": "Taal Selecteren",
"about_title": "Over PairDrop",
"about_aria-label": "Open Over PairDrop",
"theme-light_title": "Altijd lichte modus gebruiken"
"theme-light_title": "Altijd lichte modus gebruiken",
"expand_title": "Knoppenrij uitvouwen",
"edit-share-mode": "Bewerken"
},
"instructions": {
"x-instructions_mobile": "Tik om bestanden te versturen of houdt vast om een bericht te sturen",
"x-instructions-share-mode_desktop": "Klik om te verzenden",
"x-instructions-share-mode_desktop": "Klik om te verzenden {{descriptor}}",
"activate-share-mode-and-other-files-plural": "en {{count}} andere bestanden",
"x-instructions-share-mode_mobile": "Tik om te verzenden",
"x-instructions-share-mode_mobile": "Tik om te verzenden {{descriptor}}",
"activate-share-mode-base": "Open PairDrop op andere apparaten om te verzenden",
"no-peers-subtitle": "Koppel apparaten of betreed een openbare ruimte om op andere netwerken zichtbaar te worden",
"activate-share-mode-shared-text": "gedeelde tekst",
@@ -80,7 +85,11 @@
"no-peers-title": "Open PairDrop op andere apparaten om bestanden te versturen",
"x-instructions_data-drop-peer": "Laat los om naar peer te versturen",
"x-instructions_data-drop-bg": "Loslaten om ontvanger te selecteren",
"no-peers_data-drop-bg": "Loslaten om ontvanger te kiezen"
"no-peers_data-drop-bg": "Loslaten om ontvanger te kiezen",
"activate-share-mode-and-other-file": "en 1 ander bestand",
"activate-share-mode-shared-file": "gedeeld bestand",
"activate-share-mode-shared-files-plural": "{{count}} gedeelde bestanden",
"webrtc-requirement": "Om deze PairDrop instantie te kunnen gebruiken, moet WebRTC geactiveerd zijn!"
},
"peer-ui": {
"processing": "Verwerken…",
@@ -92,7 +101,7 @@
"transferring": "Overdragen…"
},
"dialogs": {
"base64-paste-to-send": "Plak hier om {{type}} te versturen",
"base64-paste-to-send": "Plak klembord hier om {{type}} te versturen",
"auto-accept-instructions-2": "om automatisch alle bestanden van dat apparaat te accepteren.",
"receive-text-title": "Bericht Ontvangen",
"edit-paired-devices-title": "Gekoppelde Apparaten Bewerken",
@@ -108,7 +117,7 @@
"join": "Betreden",
"title-image-plural": "Afbeeldingen",
"send": "Verzenden",
"base64-tap-to-paste": "Hier tikken om {{type}} te plakken",
"base64-tap-to-paste": "Hier tikken om {{type}} te delen",
"base64-text": "tekst",
"copy": "Kopiëren",
"file-other-description-image": "en één andere afbeelding",
@@ -122,7 +131,7 @@
"title-image": "Afbeelding",
"file-other-description-file-plural": "en {{count}} andere bestanden",
"would-like-to-share": "zou graag het volgende willen delen",
"send-message-to": "Verstuur een bericht naar",
"send-message-to": "Aan:",
"language-selector-title": "Taal Instellen",
"pair": "Koppel",
"hr-or": "OF",
@@ -138,7 +147,19 @@
"send-message-title": "Bericht Sturen",
"input-room-id-on-another-device": "Voer de kamer ID in op een ander apparaat",
"file-other-description-image-plural": "en {{count}} andere afbeeldingen",
"enter-room-id-from-another-device": "Voer de kamer ID van een ander apparaat hier in."
"enter-room-id-from-another-device": "Voer de kamer ID van een ander apparaat hier in.",
"paired-device-removed": "Gekoppelde apparaten zijn verwijderd.",
"message_title": "Voer bericht in om te versturen",
"message_placeholder": "Tekst",
"base64-title-files": "Deel Bestanden",
"base64-title-text": "Deel Tekst",
"public-room-qr-code_title": "Klik, om de link naar deze openbare ruimte te kopiëren",
"approve": "goedkeuren",
"share-text-title": "Gedeeld Tekst Bericht",
"share-text-checkbox": "Deze dialoog altijd tonen bij het delen van tekst",
"close-toast_title": "Bericht sluiten",
"pair-devices-qr-code_title": "Klik om de koppeling te kopiëren om dit apparaat te koppelen",
"share-text-subtitle": "Bewerk bericht voor verzending:"
},
"about": {
"claim": "De makkelijkste manier om bestanden tussen apparaten te versturen",
@@ -146,7 +167,11 @@
"close-about_aria-label": "Sluit Over PairDrop",
"buy-me-a-coffee_title": "Koop een kopje koffie voor mij!",
"github_title": "PairDrop op GitHub",
"faq_title": "Veel gestelde vragen"
"faq_title": "Veel gestelde vragen",
"mastodon_title": "Schrijf over PairDrop op Mastodon",
"bluesky_title": "Volg ons op BlueSky",
"custom_title": "Volg ons",
"privacypolicy_title": "Open ons privacybeleid"
},
"document-titles": {
"file-transfer-requested": "Bestandsoverdracht verzocht",

184
public/lang/pl.json Normal file
View File

@@ -0,0 +1,184 @@
{
"header": {
"language-selector_title": "Ustaw język",
"about_aria-label": "Otwórz \"O PairDrop\"",
"theme-light_title": "Zawsze używaj jasnego motywu",
"theme-dark_title": "Zawsze używaj ciemnego motywu",
"pair-device_title": "Sparuj swoje urządzenia na stałe",
"edit-paired-devices_title": "Edytuj sparowane urządzenia",
"join-public-room_title": "Dołącz tymczasowo do pokoju publicznego",
"cancel-share-mode": "Anuluj",
"edit-share-mode": "Edytuj",
"expand_title": "Rozwiń rząd przycisków",
"about_title": "O PairDrop",
"theme-auto_title": "Dostosuj motyw do motywu systemowego",
"notification_title": "Włącz powiadomienia",
"install_title": "Zainstaluj PairDrop"
},
"instructions": {
"no-peers_data-drop-bg": "Zwolnij, aby wybrać odbiorcę",
"no-peers-title": "Otwórz PairDrop na innych urządzeniach, aby wysłać pliki",
"x-instructions_desktop": "Kliknij, aby wysłać pliki lub kliknij prawym przyciskiem myszy, aby wysłać wiadomość",
"x-instructions_mobile": "Naciśnij, aby wysłać pliki lub naciśnij i przytrzymaj, aby wysłać wiadomość",
"x-instructions_data-drop-bg": "Zwolnij, aby wybrać odbiorcę",
"x-instructions-share-mode_desktop": "Kliknij, aby wysłać {{descriptor}}",
"x-instructions-share-mode_mobile": "Naciśnij, aby wysłać {{descriptor}}",
"activate-share-mode-base": "Otwórz PairDrop na innych urządzeniach, aby wysłać",
"activate-share-mode-and-other-file": "i 1 inny plik",
"activate-share-mode-shared-text": "udostępniony tekst",
"activate-share-mode-shared-file": "udostępniony plik",
"no-peers-subtitle": "Sparuj urządzenia lub wejdź do pokoju publicznego, aby być widocznym w innych sieciach",
"x-instructions_data-drop-peer": "Zwolnij, aby wysłać do odbiorcy",
"activate-share-mode-and-other-files-plural": "i {{count}} innych plików",
"activate-share-mode-shared-files-plural": "{{count}} udostępnionych plików",
"webrtc-requirement": "Aby móc korzystać z tej instancji PairDrop, należy włączyć WebRTC!"
},
"footer": {
"known-as": "Jesteś widoczny jako:",
"display-name_data-placeholder": "Ładowanie…",
"display-name_title": "Edytuj nazwę swojego urządzenia na stałe",
"on-this-network": "w tej sieci",
"on-this-network_title": "Możesz być znaleziony przez każdego w tej sieci.",
"paired-devices": "przez sparowane urządzenia",
"discovery": "Możesz być wykryty:",
"paired-devices_title": "Możesz zostać wykryty przez sparowane urządzenia przez cały czas, niezależnie od sieci.",
"public-room-devices": "w pokoju {{roomId}}",
"public-room-devices_title": "Możesz zostać wykryty przez urządzenia w tym pokoju publicznym, niezależnie od sieci.",
"routed": "przesyłane przez serwer",
"webrtc": "jeśli WebRTC jest niedostępny.",
"traffic": "Transmisja jest"
},
"dialogs": {
"pair-devices-title": "Sparuj Urządzenia Na Stałe",
"enter-key-from-another-device": "Wpisz tu klucz z innego urządzenia.",
"temporary-public-room-title": "Tymczasowy Pokój Publiczny",
"enter-room-id-from-another-device": "Wprowadź ID pokoju z innego urządzenia, aby wejść do pokoju.",
"hr-or": "LUB",
"pair": "Sparuj",
"cancel": "Anuluj",
"edit-paired-devices-title": "Edycja Sparowanych Urządzeń",
"unpair": "Rozłącz sparowanie",
"paired-devices-wrapper_data-empty": "Brak sparowanych urządzeń.",
"auto-accept-instructions-1": "Aktywuj",
"auto-accept-instructions-2": ", aby automatycznie przyjąć wszystkie pliki wysłane z tego urządzenia.",
"auto-accept": "samoczynne potwierdzanie",
"close": "Zamknij",
"join": "Dołącz",
"leave": "Opuść",
"accept": "Akceptuj",
"decline": "Odrzuć",
"has-sent": "wysłał:",
"share": "Udostępnij",
"send-message-title": "Wyślij Wiadomość",
"send-message-to": "Do:",
"message_title": "Wprowadź wiadomość do wysłania",
"message_placeholder": "Tekst",
"receive-text-title": "Wiadomość Odebrana",
"copy": "Kopiuj",
"base64-title-files": "Udostępnij Pliki",
"base64-title-text": "Udostępnij Tekst",
"base64-processing": "Przetwarzanie…",
"base64-tap-to-paste": "Naciśnij tutaj, aby udostępnić {{type}}",
"base64-text": "tekst",
"base64-files": "pliki",
"file-other-description-image": "i 1 inny obraz",
"file-other-description-image-plural": "i {{count}} innych obrazów",
"file-other-description-file-plural": "i {{count}} innych plików",
"title-image": "Obraz",
"title-image-plural": "Obrazy",
"title-file-plural": "Pliki",
"receive-title": "{{descriptor}} Otrzymano",
"download-again": "Pobierz ponownie",
"download": "Pobierz",
"language-selector-title": "Ustaw Język",
"system-language": "Język Systemu",
"file-other-description-file": "i 1 inny plik",
"pair-devices-qr-code_title": "Kliknij, aby skopiować odnośnik do sparowania urządzenia",
"approve": "zatwierdź",
"share-text-subtitle": "Edytuj wiadomość przed wysłaniem:",
"share-text-checkbox": "Zawsze pokazuj to okno, gdy udostępniasz tekst",
"paired-device-removed": "Sparowane urządzenie zostało usunięte.",
"would-like-to-share": "chciałby udostępnić",
"input-key-on-this-device": "Wprowadź ten klucz na innym urządzeniu",
"send": "Wyślij",
"scan-qr-code": "lub zeskanuj kod QR.",
"base64-paste-to-send": "Wklej tutaj, aby udostępnić {{type}}",
"title-file": "Plik",
"input-room-id-on-another-device": "Wprowadź ID tego pokoju na innym urządzeniu",
"public-room-qr-code_title": "Kliknij, aby skopiować odnośnik do pokoju publicznego",
"share-text-title": "Udostępnij Wiadomość Tekstową",
"close-toast_title": "Zamknij powiadomienie"
},
"about": {
"close-about_aria-label": "Zamknij \"O PairDrop\"",
"claim": "Najłatwiejszy sposób na przesyłanie plików między urządzeniami",
"buy-me-a-coffee_title": "Kup me kawę!",
"mastodon_title": "Napisz o PairDrop na Mastodonie",
"bluesky_title": "Śledź nas na BlueSky",
"custom_title": "Śledź nas",
"privacypolicy_title": "Otwórz naszą Politykę Prywatności",
"faq_title": "Często zadawane pytania (FAQ)",
"github_title": "PairDrop na GitHub",
"tweet_title": "Tweetnij o PairDrop"
},
"notifications": {
"display-name-changed-permanently": "Wyświetlana nazwa została zmieniona na stałe",
"display-name-random-again": "Wyświetlana nazwa została ponownie wygenerowana",
"download-successful": "{{descriptor}} pobrano",
"pairing-tabs-error": "Sparowanie dwóch kart w przeglądarce jest niemożliwe",
"pairing-success": "Sparowane urządzenia",
"pairing-key-invalid": "Nieprawidłowy klucz",
"pairing-key-invalidated": "Klucz {{key}} unieważniony",
"public-room-id-invalid": "Nieprawidłowe ID pokoju",
"pairing-cleared": "Wszystkie urządzenia rozłączone",
"public-room-left": "Opuściłeś pokój publiczny {{publicRoomId}}",
"copied-to-clipboard-error": "Kopiowanie niemożliwe. Skopiuj ręcznie.",
"text-content-incorrect": "Treść tekstu jest nieprawidłowa",
"file-content-incorrect": "Zawartość pliku jest nieprawidłowa",
"clipboard-content-incorrect": "Zawartość schowka jest nieprawidłowa",
"pair-url-copied-to-clipboard": "Link do sparowania tego urządzenia skopiowano do schowka",
"link-received": "Otrzymano link od {{name}} - Kliknij, aby otworzyć",
"message-received": "Otrzymano wiadomość od {{name}} - Kliknij, aby skopiować",
"click-to-download": "Kliknij, aby pobrać",
"request-title": "{{name}} chciałby przesłać {{count}} {{descriptor}}",
"click-to-show": "Kliknij, żeby pokazać",
"copied-text": "Tekst skopiowany do schowka",
"copied-text-error": "Zapis do schowka nie powiódł się. Skopiuj ręcznie!",
"offline": "Jesteś offline",
"online": "Jesteś znów online",
"connected": "Połączony",
"online-requirement-pairing": "Aby sparować urządzenia, musisz być online",
"online-requirement-public-room": "Aby utworzyć pokój publiczny, musisz być online",
"connecting": "Łączenie…",
"files-incorrect": "Pliki są nieprawidłowe",
"file-transfer-completed": "Przesyłanie plików zakończone",
"ios-memory-limit": "Jednorazowe przesyłanie plików do iOS jest możliwe tylko do 200 MB",
"message-transfer-completed": "Przesyłanie wiadomości zakończone",
"unfinished-transfers-warning": "Istnieją niedokończone transfery. Czy na pewno chcesz zamknąć PairDrop?",
"rate-limit-join-key": "Osiągnięto limit. Poczekaj 10 sekund i spróbuj ponownie.",
"selected-peer-left": "Wybrany uczestnik opuścił",
"display-name-changed-temporarily": "Wyświetlana nazwa została zmieniona na czas tej sesji",
"pairing-not-persistent": "Połączenie sparowanych urządzeń nie jest trwałe",
"copied-to-clipboard": "Skopiowano do schowka",
"room-url-copied-to-clipboard": "Link do publicznego pokoju skopiowano do schowka",
"notifications-enabled": "Powiadomienia włączone",
"notifications-permissions-error": "Uprawnienia do powiadomień zostały zablokowane, ponieważ użytkownik kilkakrotnie odrzucił monit o pozwolenie na nie. Można je zresetować w \"Informacjach o [stronie]\", do których można uzyskać dostęp, klikając ikonę kłódki obok paska adresu URL."
},
"document-titles": {
"file-received": "Plik Odebrany",
"file-received-plural": "{{count}} Plików Odebranych",
"file-transfer-requested": "Zażądano Przesłania Pliku",
"image-transfer-requested": "Zażądano Przesłania Obrazu",
"message-received": "Otrzymano Wiadomość",
"message-received-plural": "{{count}} Wiadomości Odebranych"
},
"peer-ui": {
"click-to-send-share-mode": "Kliknij, aby wysłać {{descriptor}}",
"click-to-send": "Kliknij, aby wysłać pliki lub kliknij prawym przyciskiem myszy, aby wysłać wiadomość",
"connection-hash": "Aby sprawdzić bezpieczeństwo szyfrowania end-to-end, porównaj ten numer bezpieczeństwa na obu urządzeniach",
"preparing": "Przygotowanie…",
"waiting": "Oczekiwanie…",
"processing": "Przetwarzanie…",
"transferring": "Przesyłanie…"
}
}

View File

@@ -11,7 +11,7 @@
"pair-device_title": "Emparelhar seus dispositivos permanentemente",
"edit-paired-devices_title": "Editar dispositivos emparelhados",
"join-public-room_title": "Entrar em uma sala pública temporariamente",
"cancel-share-mode": "Concluído",
"cancel-share-mode": "Cancelar",
"edit-share-mode": "Editar"
},
"instructions": {
@@ -22,8 +22,8 @@
"x-instructions_mobile": "Toque para enviar arquivos ou toque e segure para enviar uma mensagem",
"x-instructions_data-drop-peer": "Solte para enviar para o par",
"x-instructions_data-drop-bg": "Solte para selecionar o destinatário",
"x-instructions-share-mode_desktop": "Clique para enviar",
"x-instructions-share-mode_mobile": "Toque para enviar",
"x-instructions-share-mode_desktop": "Clique para enviar {{descriptor}}",
"x-instructions-share-mode_mobile": "Toque para enviar {{descriptor}}",
"activate-share-mode-base": "Abra o PairDrop em outros dispositivos para enviar",
"activate-share-mode-and-other-files-plural": "e {{count}} outros arquivos",
"activate-share-mode-shared-text": "texto compartilhado",

View File

@@ -58,7 +58,7 @@
"room-url-copied-to-clipboard": "Link către sala publică copiat în clipboard"
},
"header": {
"cancel-share-mode": "Gata",
"cancel-share-mode": "Anulare",
"theme-auto_title": "Adaptează tema la sistem",
"install_title": "Instalează PairDrop",
"theme-dark_title": "Utilizați mereu tema întunecoasă",
@@ -69,13 +69,15 @@
"language-selector_title": "Setează Limba",
"about_title": "Despre PairDrop",
"about_aria-label": "Deschide Despre PairDrop",
"theme-light_title": "Utilizați mereu tema luminoasă"
"theme-light_title": "Utilizați mereu tema luminoasă",
"expand_title": "Extindeți rândul de butoane antet",
"edit-share-mode": "Editați"
},
"instructions": {
"x-instructions_mobile": "Atingeți pentru a trimite fișiere sau atingeți lung pentru a trimite un mesaj",
"x-instructions-share-mode_desktop": "Clic pentru a trimite",
"x-instructions-share-mode_desktop": "Faceți clic pentru a trimite {{descriptor}}",
"activate-share-mode-and-other-files-plural": "și {{count}} alte fișiere",
"x-instructions-share-mode_mobile": "Atinge pentru a trimite",
"x-instructions-share-mode_mobile": "Atingeți pentru a trimite {{descriptor}}",
"activate-share-mode-base": "Deschideți PairDrop pe alte dispozitive pentru a trimite",
"no-peers-subtitle": "Împerecheați dispozitive sau intrați într-o cameră publică pentru a fi descoperit în alte rețele",
"activate-share-mode-shared-text": "text partajat",
@@ -83,7 +85,11 @@
"no-peers-title": "Deschideți PairDrop pe alte dispozitive pentru a trimite fișiere",
"x-instructions_data-drop-peer": "Eliberare pentru a trimite la peer",
"x-instructions_data-drop-bg": "Eliberați pentru a selecta recipientul",
"no-peers_data-drop-bg": "Eliberare pentru a selecta recipientul"
"no-peers_data-drop-bg": "Eliberați pentru a selecta destinatarul",
"activate-share-mode-shared-files-plural": "{{count}} fișiere partajate",
"activate-share-mode-shared-file": "fișier partajat",
"activate-share-mode-and-other-file": "și încă 1 fișier",
"webrtc-requirement": "Pentru a utiliza această instanță PairDrop, WebRTC trebuie să fie activat!"
},
"peer-ui": {
"processing": "Procesarea…",
@@ -95,7 +101,7 @@
"transferring": "Transferul…"
},
"dialogs": {
"base64-paste-to-send": "Lipiți aici pentru a trimite {{type}}",
"base64-paste-to-send": "Inserați clipboard aici pentru a distribui {{type}}",
"auto-accept-instructions-2": "pentru a accepta automat toate fișierele trimise de la dispozitivul respectiv.",
"receive-text-title": "Mesaj primit",
"edit-paired-devices-title": "Editați dispozitivele asociate",
@@ -111,7 +117,7 @@
"join": "Alătură-te",
"title-image-plural": "Imagini",
"send": "Trimite",
"base64-tap-to-paste": "Atinge aici pentru a lipi {{type}}",
"base64-tap-to-paste": "Atingeți aici pentru a distribui {{type}}",
"base64-text": "text",
"copy": "Copiază",
"file-other-description-image": "și 1 altă imagine",
@@ -125,7 +131,7 @@
"title-image": "Imagine",
"file-other-description-file-plural": "și {{count}} alte fișiere",
"would-like-to-share": "ar dori să împărtășească",
"send-message-to": "Trimite un mesaj la",
"send-message-to": "La:",
"language-selector-title": "Setați Limba",
"pair": "Cuplu",
"hr-or": "SAU",
@@ -144,7 +150,16 @@
"enter-room-id-from-another-device": "Introdu ID-ul camerei de pe un alt dispozitiv pentru a intra în cameră.",
"message_title": "Inserați mesajul de trimis",
"pair-devices-qr-code_title": "Dați clic pentru a copia link-ul pentru a asocia acest dispozitiv",
"public-room-qr-code_title": "Dați clic pentru a copia link-ul în sala publică"
"public-room-qr-code_title": "Dați clic pentru a copia link-ul în sala publică",
"message_placeholder": "Text",
"close-toast_title": "Închideți notificarea",
"share-text-checkbox": "Afișați întotdeauna acest dialog atunci când partajați text",
"base64-title-files": "Distribuie fisiere",
"approve": "aprobă",
"paired-device-removed": "Dispozitivul asociat a fost eliminat.",
"share-text-title": "Partajați un mesaj text",
"share-text-subtitle": "Editați mesajul înainte de a-l trimite:",
"base64-title-text": "Partajați textul"
},
"about": {
"claim": "Cel mai simplu mod de a transfera fișiere între dispozitive",
@@ -152,7 +167,11 @@
"close-about_aria-label": "Închide Despre PairDrop",
"buy-me-a-coffee_title": "Cumpără-mi o cafea!",
"github_title": "PairDrop pe GitHub",
"faq_title": "Întrebări frecvente"
"faq_title": "Întrebări frecvente",
"bluesky_title": "Urmărește-ne pe BlueSky",
"privacypolicy_title": "Deschideți politica noastră de confidențialitate",
"mastodon_title": "Scrieți despre PairDrop pe Mastodon",
"custom_title": "Urmăriți-ne"
},
"document-titles": {
"file-transfer-requested": "Transfer de fișiere cerut",

View File

@@ -11,14 +11,15 @@
"theme-dark_title": "Всегда использовать темную тему",
"theme-light_title": "Всегда использовать светлую тему",
"join-public-room_title": "Войти на время в публичную комнату",
"language-selector_title": "Выбрать язык"
"language-selector_title": "Выбрать язык",
"edit-share-mode": "Редактировать"
},
"instructions": {
"x-instructions_desktop": "Нажмите, чтобы отправить файлы, или щелкните правой кнопкой мыши, чтобы отправить сообщение",
"no-peers_data-drop-bg": "Отпустите, чтобы выбрать получателя",
"x-instructions-share-mode_desktop": "Нажмите, чтобы отправить",
"x-instructions-share-mode_desktop": "Нажмите, чтобы отправить {{descriptor}}",
"x-instructions_data-drop-bg": "Отпустите, чтобы выбрать получателя",
"x-instructions-share-mode_mobile": "Прикоснитесь, чтобы отправить",
"x-instructions-share-mode_mobile": "Прикоснитесь, чтобы отправить {{descriptor}}",
"x-instructions_data-drop-peer": "Отпустите, чтобы послать узлу",
"x-instructions_mobile": "Прикоснитесь коротко, чтобы отправить файлы, или долго, чтобы отправить сообщение",
"no-peers-title": "Откройте PairDrop на других устройствах, чтобы отправить файлы",
@@ -92,7 +93,9 @@
"temporary-public-room-title": "Временная публичная комната",
"message_title": "Вставьте сообщение для отправки",
"pair-devices-qr-code_title": "Нажмите, чтобы скопировать ссылку для привязки этого устройства",
"public-room-qr-code_title": "Нажмите, чтобы скопировать ссылку на публичную комнату"
"public-room-qr-code_title": "Нажмите, чтобы скопировать ссылку на публичную комнату",
"message_placeholder": "Текст",
"paired-device-removed": "Связанное устройство удалено."
},
"about": {
"close-about-aria-label": "Закрыть страницу \"О сервисе\"",

View File

@@ -1,162 +1,163 @@
{
"header": {
"about_title": "PairDrop Hakkında",
"about_aria-label": "PairDrop Hakkındayı Aç",
"theme-auto_title": "Temayı sisteme uyarla",
"theme-light_title": "Daima açık tema kullan",
"theme-dark_title": "Daima koyu tema kullan",
"about_aria-label": "PairDrop Hakkında'yı Aç",
"theme-auto_title": "Temayı sisteme otomatik olarak adapte et",
"theme-light_title": "Her zamanık temayı kullan",
"theme-dark_title": "Her zaman koyu temayı kullan",
"notification_title": "Bildirimleri etkinleştir",
"install_title": "PairDrop'u Yükle",
"pair-device_title": "Cihazı kalıcı olarak eşle",
"edit-paired-devices_title": "Eşleştirilmiş cihazları düzenle",
"cancel-share-mode": "Bitti",
"join-public-room_title": "Geçici olarak genel odaya katılın",
"language-selector_title": "Dili Seç",
"edit-share-mode": "Düzenle"
"pair-device_title": "Cihazlarınızı kalıcı olarak eşleştirin",
"edit-paired-devices_title": "Eşleşmiş cihazları düzenle",
"cancel-share-mode": "İptal Et",
"join-public-room_title": "Geçici olarak ortak odaya katıl",
"language-selector_title": "Dili Ayarla",
"edit-share-mode": "Düzenle",
"expand_title": "Başlık buton satırını genişlet"
},
"instructions": {
"no-peers_data-drop-bg": "Alıcıyı seçmek için bırakın",
"x-instructions_mobile": "Dosya göndermek için dokun veya mesaj göndermek için uzun dokun",
"x-instructions-share-mode_desktop": "{{descriptor}} kişisine göndermek için tıkla",
"x-instructions_mobile": "Dosya göndermek için dokunun veya mesaj göndermek için uzun dokunun",
"x-instructions-share-mode_desktop": "{{descriptor}} göndermek için tıklayın",
"activate-share-mode-and-other-files-plural": "ve {{count}} diğer dosya",
"x-instructions-share-mode_mobile": "{{descriptor}} kişisine göndermek için dokun",
"x-instructions-share-mode_mobile": "{{descriptor}} göndermek için dokunun",
"activate-share-mode-base": "Göndermek için diğer cihazlarda PairDrop'u açın",
"no-peers-subtitle": "Diğer ağlarda keşfedilebilir olmak için cihazları eşleştirin veya ortak bir odaya girin",
"no-peers-subtitle": "Cihazları eşleştirin veya keşfedilebilir olmak için ortak bir odaya girin",
"activate-share-mode-shared-text": "paylaşılan metin",
"x-instructions_desktop": "Dosya göndermek için tıkla veya mesaj göndermek için sağ tıkla",
"x-instructions_desktop": "Dosya göndermek için tıklayın veya mesaj göndermek için sağ tıklayın",
"no-peers-title": "Dosya göndermek için diğer cihazlarda PairDrop'u açın",
"x-instructions_data-drop-peer": "Göndermek için serbest bırak",
"x-instructions_data-drop-peer": "Eşleştiriciye göndermek için bırakın",
"x-instructions_data-drop-bg": "Alıcıyı seçmek için bırakın",
"webrtc-requirement": "Bu PairDrop örneğini kullanmak için WebRTC etkinleştirilmelidir!",
"activate-share-mode-shared-files-plural": "{{count}} adet paylaşılan dosya",
"webrtc-requirement": "Bu PairDrop örneğini kullanmak için WebRTC etkin olmalı!",
"activate-share-mode-shared-files-plural": "{{count}} paylaşılan dosya",
"activate-share-mode-shared-file": "paylaşılan dosya",
"activate-share-mode-and-other-file": "ve 1 dosya"
"activate-share-mode-and-other-file": "ve 1 diğer dosya"
},
"footer": {
"display-name_data-placeholder": "Yükleniyor…",
"display-name_title": "Cihazının adını kalıcı olarak düzenle",
"display-name_title": "Cihaz adınızı kalıcı olarak düzenleyin",
"webrtc": "WebRTC mevcut değilse.",
"public-room-devices_title": "Genel odada ağdan bağımsız olarak cihazlar tarafından keşfedilebilirsiniz.",
"public-room-devices_title": "Ağdan bağımsız olarak bu ortak odadaki cihazlar tarafından keşfedilebilir olabilirsiniz.",
"traffic": "Trafik",
"paired-devices_title": "Eşleştirilmiş cihazlarda ağdan bağımsız olarak her zaman keşfedilebilirsiniz.",
"public-room-devices": "{{roomId}} odası",
"paired-devices_title": "Ağdan bağımsız olarak her zaman eşleştirilmiş cihazlar tarafından keşfedilebilir olabilirsiniz.",
"public-room-devices": "{{roomId}} odasında",
"paired-devices": "eşleştirilmiş cihazlar tarafından",
"on-this-network": "bu ağ üzerinde",
"routed": "sunucu üzerinden yönlendirilir",
"discovery": "Keşfedilebilirsin:",
"on-this-network_title": "Bu ağdaki herkes tarafından keşfedilebilirsiniz.",
"known-as": "Bilinen adın:"
"on-this-network": "bu ağda",
"routed": "sunucu üzerinden yönlendirilmiş",
"discovery": "Keşfedilebilir durumdasınız:",
"on-this-network_title": "Bu ağdaki herkes tarafından keşfedilebilir olabilirsiniz.",
"known-as": "Şu adla biliniyorsunuz:"
},
"dialogs": {
"cancel": "İptal",
"edit-paired-devices-title": "Eşleştirilmiş Cihazları Düzenle",
"base64-paste-to-send": "{{type}} paylaşmak için buraya yapıştır",
"auto-accept-instructions-2": "böylelikle cihazdan gönderilen tüm dosyaları otomatik olarak kabul eder.",
"edit-paired-devices-title": "Eşleşmiş Cihazları Düzenle",
"base64-paste-to-send": "{{type}} paylaşmak için buraya yapıştırın",
"auto-accept-instructions-2": "bu cihazdan gönderilen tüm dosyaları otomatik olarak kabul etmek için.",
"receive-text-title": "Mesaj Alındı",
"auto-accept-instructions-1": "Etkinleştir",
"pair-devices-title": "Cihazları Kalıcı Eşleştir",
"auto-accept-instructions-1": "Aktive et",
"pair-devices-title": "Cihazları Kalıcı Olarak Eşleştir",
"download": "İndir",
"title-file": "Dosya",
"base64-processing": "İşleniyor…",
"decline": "Reddet",
"receive-title": "{{descriptor}} Alındı",
"leave": "Ayrıl",
"message_title": "Göndermek için mesaj girin",
"message_title": "Göndermek için mesaj ekle",
"join": "Katıl",
"title-image-plural": "Resimler",
"send": "Gönder",
"base64-tap-to-paste": "{{type}} paylaşmak için buraya dokun",
"base64-tap-to-paste": "{{type}} paylaşmak için buraya dokunun",
"base64-text": "metin",
"copy": "Kopyala",
"file-other-description-image": "ve 1 diğer resim",
"pair-devices-qr-code_title": "Bu cihazı eşleştirmek üzere bağlantıyı kopyalamak için tıklayın",
"temporary-public-room-title": "Geçici Genel Oda",
"pair-devices-qr-code_title": "Bu cihazı eşleştirmek için bağlantıyı kopyalamak için tıklayın",
"temporary-public-room-title": "Geçici Ortak Oda",
"base64-files": "dosyalar",
"has-sent": "gönderdi:",
"file-other-description-file": "ve 1 diğer dosya",
"public-room-qr-code_title": "Genel odanın bağlantı linkini kopyalamak için tıkla",
"public-room-qr-code_title": "Ortak oda bağlantısını kopyalamak için tıklayın",
"close": "Kapat",
"system-language": "Sistem Dili",
"unpair": "Eşlemeyi Kaldır",
"unpair": "Eşleşmeyi Kaldır",
"title-image": "Resim",
"file-other-description-file-plural": "ve {{count}} diğer dosya",
"would-like-to-share": "paylaşmak istiyor",
"send-message-to": "Kime:",
"language-selector-title": "Dili Seç",
"pair": "Eşle",
"send-message-to": "Alıcı:",
"language-selector-title": "Dili Ayarla",
"pair": "Eşleştir",
"hr-or": "VEYA",
"scan-qr-code": "veya QR kodunu tarayın.",
"input-key-on-this-device": "Bu anahtarı başka bir cihazda girin",
"input-key-on-this-device": "Bu anahtarı başka bir cihaza girin",
"download-again": "Tekrar indir",
"accept": "Kabul Et",
"paired-devices-wrapper_data-empty": "Eşlenmiş cihaz yok.",
"enter-key-from-another-device": "Buraya başka bir cihazdan anahtar girin.",
"paired-devices-wrapper_data-empty": "Eşleşmiş cihaz yok.",
"enter-key-from-another-device": "Başka bir cihazdan alınan anahtarı buraya girin.",
"share": "Paylaş",
"auto-accept": "otomatik-kabul",
"auto-accept": "otomatik kabul",
"title-file-plural": "Dosyalar",
"send-message-title": "Mesaj Gönder",
"input-room-id-on-another-device": "Bu ID'yi diğer cihaza girin",
"input-room-id-on-another-device": "Bu oda kimliğini başka bir cihaza girin",
"file-other-description-image-plural": "ve {{count}} diğer resim",
"enter-room-id-from-another-device": "Odaya katılmak için diğer cihazın ID'sini girin.",
"enter-room-id-from-another-device": "Odaya katılmak için başka bir cihazdan oda kimliğini girin.",
"message_placeholder": "Metin",
"close-toast_title": "Bildirimleri kapat",
"share-text-checkbox": "Metin paylaşırken her zaman bu pencereyi göster",
"close-toast_title": "Bildirim kapat",
"share-text-checkbox": "Metin paylaşırken her zaman bu iletişim kutusunu göster",
"base64-title-files": "Dosyaları Paylaş",
"approve": "onayla",
"paired-device-removed": "Eşleştirilmiş cihaz kaldırıldı.",
"share-text-title": "Kısa Mesaj Paylaş",
"share-text-subtitle": "Göndermeden önce mesajı düzenle:",
"base64-title-text": "Metin Paylaş"
"paired-device-removed": "Eşleşmiş cihaz kaldırıldı.",
"share-text-title": "Metin Mesajı Paylaş",
"share-text-subtitle": "Göndermeden önce mesajı düzenleyin:",
"base64-title-text": "Metni Paylaş"
},
"notifications": {
"request-title": "{{name}} {{count}} {{descriptor}} transfer etmek istiyor",
"unfinished-transfers-warning": "Bitmemiş transferler var. PairDrop'u kapatmak istediğinize emin misiniz?",
"message-received": "Mesaj {{name}} tarafından alındı - Kopyalamak için tıkla",
"notifications-permissions-error": "Kullanıcı izin isteğini birkaç kez reddettiği için bildirimler engellenmiştir. URL çubuğunun yanındaki kilit simgesine tıklayarak sıfırlanabilir.",
"rate-limit-join-key": "İstek sınırına ulaşıldı. 10 saniye bekleyin ve tekrar deneyin.",
"pair-url-copied-to-clipboard": "Bu cihazı eşleştirmek için bağlantı linki panoya kopyalandı",
"connecting": "Bağlanılıyor…",
"pairing-key-invalidated": "{{key}} anahtarı geçersiz",
"unfinished-transfers-warning": "Tamamlanmamış transferler var. PairDrop'u kapatmak istediğinizden emin misiniz?",
"message-received": "{{name}} tarafından mesaj alındı - Kopyalamak için tıklayın",
"notifications-permissions-error": "Bildirim izinleri birkaç kez reddedildiği için engellendi. Bu, URL çubuğunun yanındaki kilit simgesine tıklayarak erişilebilen Sayfa Bilgilerinde sıfırlanabilir.",
"rate-limit-join-key": "Hız sınırına ulaşıldı. 10 saniye bekleyin ve tekrar deneyin.",
"pair-url-copied-to-clipboard": "Bu cihazı eşleştirmek için bağlantı panoya kopyalandı",
"connecting": "Bağlanıyor…",
"pairing-key-invalidated": "Anahtar {{key}} geçersiz kılındı",
"pairing-key-invalid": "Geçersiz anahtar",
"connected": "Bağlandı",
"pairing-not-persistent": "Eşleştirilmiş cihazlar kalıcı değildir",
"text-content-incorrect": "Metin içeriği yanlış",
"connected": "Bağlı",
"pairing-not-persistent": "Eşleşmiş cihazlar kalıcı değil",
"text-content-incorrect": "Metin içeriği hatalı",
"message-transfer-completed": "Mesaj transferi tamamlandı",
"file-transfer-completed": "Dosya transferi bitti",
"file-content-incorrect": "Dosya içeriği yanlış",
"files-incorrect": "Dosyalar yanlış",
"selected-peer-left": "Seçili aygıt ayrıldı",
"link-received": "Link {{name}} tarafından alındı - Açmak için tıkla",
"online": "Tekrar çevrimiçisin",
"public-room-left": "{{publicRoomId}} genel odasından ayrıldın",
"file-transfer-completed": "Dosya transferi tamamlandı",
"file-content-incorrect": "Dosya içeriği hatalı",
"files-incorrect": "Dosyalar hatalı",
"selected-peer-left": "Seçilen eş ayrıldı",
"link-received": "{{name}} tarafından bağlantı alındı - Açmak için tıklayın",
"online": "Tekrar çevrimiçisiniz",
"public-room-left": "Ortak odadan ayrıldı {{publicRoomId}}",
"copied-text": "Metin panoya kopyalandı",
"display-name-random-again": "Mevcut adın tekrardan rastgele oluşturuldu",
"display-name-changed-permanently": "Mevcut adın kalıcı olarak değiştirildi",
"copied-to-clipboard-error": "Kopyalama mümkün değil. Manuel olarak kopyalayın.",
"display-name-random-again": "Görünen ad tekrar rastgele oluşturuldu",
"display-name-changed-permanently": "Görünen ad kalıcı olarak değiştirildi",
"copied-to-clipboard-error": "Kopyalama mümkün değil. Elle kopyalayın.",
"pairing-success": "Cihazlar eşleştirildi",
"clipboard-content-incorrect": "Pano içeriği yanlış",
"display-name-changed-temporarily": "Mevcut adın yalnızca bu oturum için değiştirildi",
"clipboard-content-incorrect": "Panodaki içerik hatalı",
"display-name-changed-temporarily": "Görünen ad sadece bu oturum için değiştirildi",
"copied-to-clipboard": "Panoya kopyalandı",
"offline": "Çevrimdışısın",
"pairing-tabs-error": "İki web tarayıcı sekmesini eşleştirmek mümkün değildir",
"public-room-id-invalid": "Geçersiz oda ID'si",
"click-to-download": "İndirmek için tıkla",
"pairing-cleared": "Tüm cihazlar eşleştirmeden çıkarıldı",
"offline": "Çevrimdışısınız",
"pairing-tabs-error": "İki web tarayıcı sekmesini eşleştirmek imkansız",
"public-room-id-invalid": "Geçersiz oda kimliği",
"click-to-download": "İndirmek için tıklayın",
"pairing-cleared": "Tüm cihazların eşleşmesi kaldırıldı",
"notifications-enabled": "Bildirimler etkinleştirildi",
"online-requirement-pairing": "Cihazları eşleştirmek için çevrimiçi olmanız lazım",
"ios-memory-limit": "iOS'a tek seferde sadece 200MB'a kadar dosya gönderebilirsin",
"online-requirement-public-room": "Genel oda oluşturmak için çevrimiçi olmanız lazım",
"room-url-copied-to-clipboard": "Genel oda bağlantı linki panoya kopyalandı",
"copied-text-error": "Panoya kopyalanamadı. Lütfen manuel olarak kopyalayın!",
"online-requirement-pairing": "Cihazları eşleştirmek için çevrimiçi olmalısınız",
"ios-memory-limit": "iOS'a dosya göndermek sadece bir seferde 200 MB'a kadar mümkündür",
"online-requirement-public-room": "Ortak oda oluşturmak için çevrimiçi olmalısınız",
"room-url-copied-to-clipboard": "Ortak oda bağlantısı panoya kopyalandı",
"copied-text-error": "Panoya yazma başarısız oldu. Elle kopyalayın!",
"download-successful": "{{descriptor}} indirildi",
"click-to-show": "Görmek için tıkla"
"click-to-show": "Göstermek için tıklayın"
},
"peer-ui": {
"processing": "İşleniyor…",
"click-to-send-share-mode": "{{descriptor}} göndermek için tıkla",
"click-to-send": "Dosya göndermek için tıkla veya mesaj göndermek için sağ tıkla",
"click-to-send-share-mode": "{{descriptor}} göndermek için tıklayın",
"click-to-send": "Dosya göndermek için tıklayın veya mesaj göndermek için sağ tıklayın",
"waiting": "Bekleniyor…",
"connection-hash": "Uçtan uca şifrelemenin güvenliğini doğrulamak için her iki cihazda da bu güvenlik numarasını karşılaştırın",
"connection-hash": "Uçtan uca şifrelemenin güvenliğini doğrulamak için, bu güvenlik numarasını her iki cihazda da karşılaştırın",
"preparing": "Hazırlanıyor…",
"transferring": "Transfer ediliyor…"
},
@@ -164,13 +165,17 @@
"claim": "Cihazlar arasında dosya aktarmanın en kolay yolu",
"tweet_title": "PairDrop hakkında tweet at",
"close-about_aria-label": "PairDrop Hakkında'yı Kapat",
"buy-me-a-coffee_title": "Bana bir kahve al!",
"buy-me-a-coffee_title": "Bana bir kahve ısmarla!",
"github_title": "GitHub'da PairDrop",
"faq_title": "Sıkça sorulan sorular"
"faq_title": "Sıkça sorulan sorular",
"custom_title": "Bizi takip edin",
"privacypolicy_title": "Gizlilik politikamızı aç",
"mastodon_title": "Mastodon'da PairDrop hakkında yaz",
"bluesky_title": "BlueSky'da bizi takip edin"
},
"document-titles": {
"file-transfer-requested": "Dosya Transferi Talep Edildi",
"image-transfer-requested": "Görüntü Aktarımı Talep Edildi",
"image-transfer-requested": "Görüntü Transferi Talep Edildi",
"message-received-plural": "{{count}} Mesaj Alındı",
"message-received": "Mesaj Alındı",
"file-received": "Dosya Alındı",

184
public/lang/uk.json Normal file
View File

@@ -0,0 +1,184 @@
{
"header": {
"about_aria-label": "Відкрити \"Про PairDrop\"",
"theme-auto_title": "Автоматично адаптувати тему до системної",
"theme-light_title": "Завжди використовувати світлу тему",
"install_title": "Встановити PairDrop",
"join-public-room_title": "Приєднатися до публічної кімнати тимчасово",
"cancel-share-mode": "Скасувати",
"edit-share-mode": "Редагувати",
"about_title": "Про PairDrop",
"language-selector_title": "Встановити мову",
"theme-dark_title": "Завжди використовувати темну тему",
"pair-device_title": "Зв'язати ваші пристрої назавжди",
"notification_title": "Увімкнути сповіщення",
"edit-paired-devices_title": "Редагувати зв'язані пристрої",
"expand_title": "Розгорнути рядок кнопок заголовка"
},
"instructions": {
"no-peers_data-drop-bg": "Відпустіть, щоб вибрати одержувача",
"x-instructions_desktop": "Натисніть, щоб надіслати файли, або клацніть правою кнопкою миші, щоб надіслати повідомлення",
"x-instructions_data-drop-peer": "Відпустіть, щоб надіслати партнеру",
"x-instructions-share-mode_desktop": "Натисніть, щоб надіслати {{descriptor}}",
"x-instructions-share-mode_mobile": "Торкніться, щоб надіслати {{descriptor}}",
"activate-share-mode-and-other-file": "та 1 інший файл",
"activate-share-mode-shared-file": "спільний файл",
"webrtc-requirement": "Щоб використовувати цей екземпляр PairDrop, WebRTC має бути увімкнено!",
"no-peers-title": "Відкрийте PairDrop на інших пристроях, щоб надіслати файли",
"no-peers-subtitle": "Зв’яжіть пристрої або введіть публічну кімнату, щоб бути помітним в інших мережах",
"x-instructions_mobile": "Торкніться, щоб надіслати файли, або довго натисніть, щоб надіслати повідомлення",
"x-instructions_data-drop-bg": "Відпустіть, щоб вибрати одержувача",
"activate-share-mode-base": "Відкрийте PairDrop на інших пристроях, щоб надіслати",
"activate-share-mode-and-other-files-plural": "та {{count}} інших файлів",
"activate-share-mode-shared-text": "спільний текст",
"activate-share-mode-shared-files-plural": "{{count}} спільних файлів"
},
"footer": {
"known-as": "Вам відомо як:",
"discovery": "Вас можна знайти:",
"public-room-devices": "у кімнаті {{roomId}}",
"public-room-devices_title": "Вас можуть знайти пристрої в цій публічній кімнаті, незалежно від мережі.",
"traffic": "Трафік",
"webrtc": "якщо WebRTC недоступний.",
"display-name_data-placeholder": "Завантаження…",
"display-name_title": "Редагувати назву вашого пристрою назавжди",
"on-this-network_title": "Вас можуть знайти всі на цій мережі.",
"routed": "маршрутизований через сервер",
"on-this-network": "в цій мережі",
"paired-devices": "через зв'язані пристрої",
"paired-devices_title": "Вас можуть знайти зв'язані пристрої в будь-який час, незалежно від мережі."
},
"dialogs": {
"input-key-on-this-device": "Введіть цей ключ на іншому пристрої",
"scan-qr-code": "або відскануйте QR-код.",
"enter-key-from-another-device": "Введіть ключ з іншого пристрою тут.",
"temporary-public-room-title": "Тимчасова публічна кімната",
"input-room-id-on-another-device": "Введіть цей ID кімнати на іншому пристрої",
"enter-room-id-from-another-device": "Введіть ID кімнати з іншого пристрою, щоб приєднатися до кімнати.",
"hr-or": "АБО",
"cancel": "Скасувати",
"edit-paired-devices-title": "Редагувати Зв'язані пристрої",
"unpair": "Від'єднати",
"paired-device-removed": "Зв'язаний пристрій був видалений.",
"paired-devices-wrapper_data-empty": "Немає зв'язаних пристроїв.",
"auto-accept-instructions-1": "Активувати",
"auto-accept": "автоматичне прийняття",
"auto-accept-instructions-2": "щоб автоматично приймати всі файли, надіслані з цього пристрою.",
"join": "Приєднатися",
"leave": "Покинути",
"accept": "Прийняти",
"decline": "Відхилити",
"has-sent": "відправив:",
"share": "Поділитися",
"download": "Завантажити",
"send-message-title": "Надіслати повідомлення",
"send-message-to": "Кому:",
"message_title": "Введіть повідомлення для надсилання",
"base64-title-text": "Поділитися текстом",
"base64-processing": "Обробка…",
"base64-text": "текст",
"file-other-description-image": "та ще 1 зображення",
"file-other-description-file": "та ще 1 файл",
"file-other-description-image-plural": "та ще {{count}} зображень",
"title-file": "Файл",
"title-image-plural": "Зображення",
"title-file-plural": "Файли",
"receive-title": "{{descriptor}} отримано",
"system-language": "Системна мова",
"public-room-qr-code_title": "Натисніть, щоб скопіювати посилання на публічну кімнату",
"share-text-title": "Поділитися текстовим повідомленням",
"share-text-subtitle": "Редагувати повідомлення перед відправкою:",
"share-text-checkbox": "Завжди показувати цей діалог при поділі тексту",
"close-toast_title": "Закрити сповіщення",
"pair-devices-title": "Зв’язати пристрої назавжди",
"pair": "Приєднати",
"close": "Закрити",
"would-like-to-share": "хоче поділитися",
"copy": "Копіювати",
"message_placeholder": "Текст",
"send": "Надіслати",
"base64-title-files": "Поділитися файлами",
"receive-text-title": "Повідомлення отримано",
"base64-tap-to-paste": "Натисніть тут, щоб поділитися {{type}}",
"base64-paste-to-send": "Вставте буфер обміну тут, щоб поділитися {{type}}",
"file-other-description-file-plural": "та ще {{count}} файлів",
"base64-files": "файли",
"title-image": "Зображення",
"language-selector-title": "Встановити мову",
"approve": "схвалити",
"download-again": "Завантажити знову",
"pair-devices-qr-code_title": "Натисніть, щоб скопіювати посилання для зв'язування цього пристрою"
},
"about": {
"close-about_aria-label": "Закрити \"Про PairDrop\"",
"github_title": "PairDrop на GitHub",
"buy-me-a-coffee_title": "Купи мені каву!",
"tweet_title": "Твіт про PairDrop",
"bluesky_title": "Підписуйтесь на нас у BlueSky",
"privacypolicy_title": "Відкрити нашу політику конфіденційності",
"faq_title": "Часто задавані питання",
"mastodon_title": "Напишіть про PairDrop на Mastodon",
"custom_title": "Підписуйтесь на нас",
"claim": "Найпростіший спосіб передачі файлів між пристроями"
},
"notifications": {
"display-name-changed-temporarily": "Відображуване ім'я було змінено тільки для цієї сесії",
"display-name-random-again": "Відображуване ім'я згенерувалося випадковим чином знову",
"download-successful": "{{descriptor}} завантажено",
"pairing-tabs-error": "Зв'язування двох вкладок браузера неможливе",
"pairing-success": "Пристрої зв'язані",
"pairing-not-persistent": "Зв'язані пристрої не є постійними",
"pairing-key-invalid": "Недійсний ключ",
"pairing-key-invalidated": "Ключ {{key}} недійсний",
"pairing-cleared": "Всі пристрої роз'єднані",
"public-room-id-invalid": "Недійсний ID кімнати",
"public-room-left": "Покинув публічну кімнату {{publicRoomId}}",
"copied-to-clipboard-error": "Копіювання неможливе. Скопіюйте вручну.",
"clipboard-content-incorrect": "Вміст буфера обміну неправильний",
"link-received": "Посилання отримано від {{name}} - Натисніть, щоб відкрити",
"message-received": "Повідомлення отримано від {{name}} - Натисніть, щоб скопіювати",
"click-to-download": "Натисніть, щоб завантажити",
"request-title": "{{name}} хоче передати {{count}} {{descriptor}}",
"click-to-show": "Натисніть, щоб показати",
"copied-text": "Текст скопійовано в буфер обміну",
"copied-text-error": "Запис у буфер обміну не вдався. Скопіюйте вручну!",
"offline": "Ви офлайн",
"online-requirement-pairing": "Вам потрібно бути онлайн, щоб зв'язати пристрої",
"online-requirement-public-room": "Вам потрібно бути онлайн, щоб створити публічну кімнату",
"connecting": "Підключення…",
"ios-memory-limit": "Відправка файлів на iOS можлива лише до 200 МБ за один раз",
"message-transfer-completed": "Передача повідомлення завершена",
"rate-limit-join-key": "Досягнуто ліміт швидкості. Зачекайте 10 секунд і спробуйте знову.",
"selected-peer-left": "Обраний пір залишив",
"files-incorrect": "Файли неправильні",
"display-name-changed-permanently": "Відображуване ім'я було змінено назавжди",
"notifications-permissions-error": "Дозвіл на сповіщення було заблоковано, оскільки користувач кілька разів відхилив запит на дозвіл. Це можна скинути в інформації про сторінку, до якої можна отримати доступ, натиснувши значок замка поруч з рядком URL.",
"copied-to-clipboard": "Скопійовано в буфер обміну",
"pair-url-copied-to-clipboard": "Посилання для зв'язування цього пристрою скопійовано в буфер обміну",
"room-url-copied-to-clipboard": "Посилання на публічну кімнату скопійовано в буфер обміну",
"text-content-incorrect": "Текстовий вміст неправильний",
"file-content-incorrect": "Вміст файлу неправильний",
"notifications-enabled": "Сповіщення увімкнені",
"connected": "Підключено",
"online": "Ви знову онлайн",
"file-transfer-completed": "Передача файлу завершена",
"unfinished-transfers-warning": "Є незавершені передачі. Ви впевнені, що хочете закрити PairDrop?"
},
"document-titles": {
"file-received": "Файл отримано",
"file-received-plural": "Отримано {{count}} файлів",
"image-transfer-requested": "Запит на передачу зображення",
"message-received": "Повідомлення отримано",
"message-received-plural": "Отримано {{count}} повідомлень",
"file-transfer-requested": "Запит на передачу файлу"
},
"peer-ui": {
"click-to-send-share-mode": "Натисніть, щоб відправити {{descriptor}}",
"connection-hash": "Щоб перевірити безпеку кінцевого шифрування, порівняйте цей номер безпеки на обох пристроях",
"processing": "Обробка…",
"click-to-send": "Натисніть, щоб відправити файли, або клацніть правою кнопкою миші, щоб відправити повідомлення",
"preparing": "Підготовка…",
"waiting": "Чекаю…",
"transferring": "Переводимо…"
}
}

View File

@@ -12,7 +12,8 @@
"cancel-share-mode": "完成",
"join-public-room_title": "暂时加入公共房间",
"language-selector_title": "设置语言",
"edit-share-mode": "编辑"
"edit-share-mode": "编辑",
"expand_title": "展开标题按钮行"
},
"instructions": {
"x-instructions_data-drop-peer": "释放以发送到此设备",
@@ -114,7 +115,11 @@
"github_title": "PairDrop 在 GitHub 上开源",
"claim": "最简单的跨设备传输方案",
"buy-me-a-coffee_title": "帮我买杯咖啡!",
"tweet_title": "关于 PairDrop 的推特"
"tweet_title": "关于 PairDrop 的推特",
"bluesky_title": "在 BlueSky 上关注",
"privacypolicy_title": "打开隐私政策",
"mastodon_title": "在 Maston 上推广 PairDrop",
"custom_title": "关注我们"
},
"notifications": {
"display-name-changed-permanently": "展示的名字已经永久变更",

1
public/lang/zh-HK.json Normal file
View File

@@ -0,0 +1 @@
{}

184
public/lang/zh-TW.json Normal file
View File

@@ -0,0 +1,184 @@
{
"header": {
"language-selector_title": "設定語言",
"theme-auto_title": "自動使用系統主題",
"cancel-share-mode": "取消",
"edit-share-mode": "編輯",
"expand_title": "展開標題按鈕列",
"about_title": "關於 PairDrop",
"about_aria-label": "開啟關於 PairDrop",
"theme-dark_title": "總是使用深色主題",
"notification_title": "啟用通知",
"install_title": "安裝 PairDrop",
"pair-device_title": "永久配對你的裝置",
"edit-paired-devices_title": "編輯已配對的裝置",
"join-public-room_title": "暫時加入公共房間",
"theme-light_title": "總是使用淺色主題"
},
"instructions": {
"no-peers_data-drop-bg": "釋放以選擇接收者",
"no-peers-subtitle": "配對裝置或加入一個公共房間以便在其他網路上可見",
"x-instructions_mobile": "輕觸以發送檔案或輕觸並按住以發送一則訊息",
"x-instructions_data-drop-bg": "釋放以選擇接收者",
"x-instructions-share-mode_desktop": "點擊以發送 {{descriptor}}",
"activate-share-mode-and-other-file": "和另外 1 個檔案",
"activate-share-mode-and-other-files-plural": "和另外 {{count}} 個檔案",
"activate-share-mode-shared-text": "已分享的文字",
"activate-share-mode-shared-file": "已分享的檔案",
"webrtc-requirement": "要使用此 PairDrop 實例,必須啟用 WebRTC",
"no-peers-title": "在其他裝置上開啟 PairDrop 以傳送檔案",
"x-instructions_desktop": "點擊以發送檔案或右鍵點擊以發送一則訊息",
"x-instructions_data-drop-peer": "釋放以發送到此裝置",
"x-instructions-share-mode_mobile": "輕觸以發送 {{descriptor}}",
"activate-share-mode-base": "在其他裝置上開啟 PairDrop 以傳送",
"activate-share-mode-shared-files-plural": "{{count}} 個已分享的檔案"
},
"footer": {
"display-name_data-placeholder": "正在載入中…",
"known-as": "此裝置名稱為:",
"display-name_title": "編輯此裝置名稱並儲存",
"discovery": "可見於:",
"on-this-network": "在這個網路上",
"paired-devices_title": "無論在任何網路,已配對的裝置都是隨時可見。",
"public-room-devices": "在房間 {{roomId}} 中",
"traffic": "流量將會",
"on-this-network_title": "在這個網路上的每個人都可以見到你。",
"paired-devices": "已配對的裝置",
"public-room-devices_title": "無論在任何網路,此公共房間中的裝置都是隨時可見。",
"routed": "途經伺服器",
"webrtc": "如果無法使用 WebRTC。"
},
"dialogs": {
"pair-devices-title": "永久配對裝置",
"scan-qr-code": "或掃描 QR 圖碼。",
"input-key-on-this-device": "在另一台裝置上輸入此密鑰",
"temporary-public-room-title": "臨時公共房間",
"input-room-id-on-another-device": "在另一台裝置上輸入此房間編號",
"enter-room-id-from-another-device": "在此輸入房間編號以加入房間。",
"hr-or": "或者",
"pair": "配對",
"cancel": "取消",
"paired-devices-wrapper_data-empty": "沒有已配對的裝置。",
"auto-accept-instructions-1": "啟用",
"auto-accept": "自動接收",
"auto-accept-instructions-2": "以自動接受從該裝置發送的所有檔案。",
"close": "關閉",
"join": "加入",
"send": "發送",
"receive-text-title": "收到訊息",
"base64-tap-to-paste": "輕觸此處以分享 {{type}}",
"base64-text": "文字",
"base64-files": "檔案",
"file-other-description-file": "和另外 1 個檔案",
"file-other-description-image-plural": "和另外 {{count}} 張圖片",
"file-other-description-file-plural": "和另外 {{count}} 個檔案",
"title-image": "圖片",
"title-file": "檔案",
"title-image-plural": "圖片",
"title-file-plural": "檔案",
"receive-title": "收到 {{descriptor}}",
"download-again": "再次下載",
"language-selector-title": "設定語言",
"system-language": "使用系統語言",
"public-room-qr-code_title": "點擊以複製連結到公共房間",
"pair-devices-qr-code_title": "點擊以複製連結以配對此裝置",
"approve": "批准",
"share-text-title": "分享文字訊息",
"share-text-subtitle": "發送前編輯訊息:",
"share-text-checkbox": "分享文字時總是顯示此對話框",
"enter-key-from-another-device": "在此輸入另一台裝置的密鑰。",
"edit-paired-devices-title": "編輯已配對的裝置",
"unpair": "取消配對",
"paired-device-removed": "已刪除已配對的裝置。",
"leave": "離開",
"accept": "接受",
"would-like-to-share": "想要分享",
"decline": "拒絕",
"has-sent": "已發送:",
"share": "分享",
"message_title": "輸入要傳送的訊息",
"download": "下載",
"send-message-to": "發送至:",
"message_placeholder": "文字",
"copy": "複製",
"send-message-title": "發送訊息",
"base64-title-files": "分享檔案",
"base64-title-text": "分享文字",
"base64-processing": "正在處理中…",
"base64-paste-to-send": "將剪貼簿貼到此處以分享 {{type}}",
"file-other-description-image": "和另外 1 張圖片",
"close-toast_title": "關閉通知"
},
"about": {
"claim": "跨裝置傳輸檔案的最簡單方法",
"github_title": "GitHub 上的 PairDrop",
"tweet_title": "發佈關於 PairDrop 的推文",
"mastodon_title": "在 Mastodon 上撰寫有關 PairDrop 的文章",
"close-about_aria-label": "關閉關於 PairDrop",
"buy-me-a-coffee_title": "給我買一杯咖啡吧!",
"bluesky_title": "在 Bluesky 上關注我們",
"custom_title": "關注我們",
"privacypolicy_title": "開啟我們的隱私權政策",
"faq_title": "常見問題"
},
"notifications": {
"display-name-changed-permanently": "裝置名稱已更改並儲存",
"display-name-changed-temporarily": "裝置名稱已更改並只限於此會話",
"display-name-random-again": "裝置名稱已再次隨機生成",
"download-successful": "{{descriptor}} 已下載",
"pairing-success": "裝置已配對",
"pairing-not-persistent": "已配對的裝置不是永久的",
"pairing-key-invalid": "無效的密鑰",
"pairing-key-invalidated": "密鑰 {{key}} 已失效",
"pairing-cleared": "所有裝置均已解除配對",
"public-room-id-invalid": "無效的房間編號",
"public-room-left": "已離開公共房間 {{publicRoomId}}",
"copied-to-clipboard": "已複製到剪貼簿",
"pair-url-copied-to-clipboard": "已將與此裝置配對的連結複製到剪貼簿",
"room-url-copied-to-clipboard": "已將公共房間的連結複製到剪貼簿",
"copied-to-clipboard-error": "無法複製。請手動複製。",
"text-content-incorrect": "文字內容不正確",
"file-content-incorrect": "檔案內容不正確",
"notifications-enabled": "已啟用通知",
"notifications-permissions-error": "由於使用者多次取消權限請求提示,通知權限已被封鎖。這可以在頁面資訊中重置,點擊網址欄旁邊的鎖定圖示以存取頁面資訊。",
"link-received": "收到 {{name}} 的連結—點擊以開啟",
"message-received": "收到 {{name}} 的訊息—點擊以複製",
"click-to-show": "點擊以顯示",
"copied-text": "已將文字複製到剪貼簿",
"copied-text-error": "無法複製到剪貼簿。請手動複製!",
"offline": "已離線",
"online": "已重新在線",
"connected": "已連接",
"online-requirement-pairing": "你需要在線才能配對裝置",
"online-requirement-public-room": "你需要在線才能創建公共房間",
"connecting": "正在連接中…",
"files-incorrect": "檔案不正確",
"file-transfer-completed": "檔案傳輸已完成",
"ios-memory-limit": "向 iOS 發送檔案每次只能最大 200 MB",
"message-transfer-completed": "訊息傳輸已完成",
"unfinished-transfers-warning": "還有未完成的傳輸。你確定要關閉 PairDrop 嗎?",
"rate-limit-join-key": "已達到速率限制。請等待 10 秒鐘,然後再試一次。",
"selected-peer-left": "選定的對象已離開",
"pairing-tabs-error": "將兩個網頁瀏覽器分頁進行配對是不可能的",
"clipboard-content-incorrect": "剪貼簿內容不正確",
"click-to-download": "點擊以下載",
"request-title": "{{name}} 想要發送 {{count}} 個 {{descriptor}}"
},
"document-titles": {
"file-received": "檔案已收到",
"file-received-plural": "已收到 {{count}} 個檔案",
"file-transfer-requested": "已請求檔案傳輸",
"image-transfer-requested": "已請求圖片傳輸",
"message-received": "已收到訊息",
"message-received-plural": "已收到 {{count}} 條訊息"
},
"peer-ui": {
"click-to-send-share-mode": "點擊以發送 {{descriptor}}",
"click-to-send": "點擊以發送檔案或右鍵點擊以發送一則訊息",
"preparing": "正在準備中…",
"waiting": "正在等待中…",
"processing": "正在處理中…",
"transferring": "正在傳輸中…",
"connection-hash": "若要驗證端對端加密的安全性,請在兩台裝置上比較此安全編號"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,36 @@
function HeifConvert(libheif) {
this.libheif = libheif;
this.decoder = new libheif.HeifDecoder();
}
HeifConvert.prototype.convert = async function (buffer) {
const decodeResult = this.decoder.decode(buffer);
const image = decodeResult[0];
let w = image.get_width();
let h = image.get_height();
const canvas = document.createElement("canvas");
canvas.width = w;
canvas.height = h;
const ctx = canvas.getContext("2d");
const imageData = ctx.createImageData(w, h);
await copyData(imageData, image);
ctx.putImageData(imageData, 0, 0);
image.free();
return canvas;
};
function copyData(dataContainer, image) {
return new Promise((resolve, reject) => {
image.display(
dataContainer,
function () {
resolve()
}
);
})
}

41
public/scripts/libheif.js Normal file

File diff suppressed because one or more lines are too long

BIN
public/scripts/libheif.wasm Normal file

Binary file not shown.

View File

@@ -3,8 +3,8 @@ class Localization {
Localization.$htmlRoot = document.querySelector('html');
Localization.defaultLocale = "en";
Localization.supportedLocales = ["ar", "ca", "de", "en", "es", "fr", "id", "it", "ja", "kn", "nb", "nl", "pt-BR", "ro", "ru", "tr", "zh-CN"];
Localization.supportedLocalesRtl = ["ar"];
Localization.supportedLocales = ["ar", "be", "ca", "cs", "da", "de", "en", "es", "fr", "he", "hu", "id", "it", "ja", "kn", "nb", "nl", "pl", "pt-BR", "ro", "ru", "tr", "uk", "zh-CN", "zh-TW"];
Localization.supportedLocalesRtl = ["ar", "he"];
Localization.translations = {};
Localization.translationsDefaultLocale = {};

View File

@@ -17,7 +17,8 @@ class PairDrop {
"scripts/qr-code.min.js",
"scripts/zip.min.js",
"scripts/no-sleep.min.js",
"scripts/heic2any.min.js"
"scripts/heif-convert.js",
"scripts/libheif.js"
];
this.registerServiceWorker();

View File

@@ -332,6 +332,8 @@ class Peer {
this._filesQueue = [];
this._busy = false;
this.maxMessageSize = 65536; // 64 KB
// evaluate auto accept
this._evaluateAutoAccept();
}
@@ -450,14 +452,7 @@ class Peer {
Events.fire('set-progress', {peerId: this._peerId, progress: 0.8, status: 'prepare'})
let dataUrl = '';
if (files[0].type.split('/')[0] === 'image') {
try {
dataUrl = await getThumbnailAsDataUrl(files[0], 400, null, 0.9);
} catch (e) {
console.error(e);
}
}
let dataUrl = await this.getFileTransferThumbnail(files[0]);
Events.fire('set-progress', {peerId: this._peerId, progress: 1, status: 'prepare'})
@@ -472,6 +467,30 @@ class Peer {
Events.fire('set-progress', {peerId: this._peerId, progress: 0, status: 'wait'})
}
async getFileTransferThumbnail(image) {
if (image.type.split('/')[0] !== 'image') {
// file is not of type image -> abort!
return '';
}
let dataUrl = '';
try {
// Iteratively lower thumbnail quality until its size is less than maxMessageSize - 2 kB
let quality = 1;
do {
quality -= 0.1;
if (quality <= 0) {
console.error("Could not create thumbnail that fits into one message.");
return '';
}
dataUrl = await getThumbnailAsDataUrl(image, 450, 450, quality);
} while (new Blob([dataUrl]).size + 2_000 > this.maxMessageSize);
} catch (e) {
console.error(e);
}
return dataUrl;
}
async sendFiles() {
for (let i=0; i<this._filesRequested.length; i++) {
this._filesQueue.push(this._filesRequested[i]);
@@ -725,7 +744,8 @@ class RTCPeer extends Peer {
super(serverConnection, isCaller, peerId, roomType, roomId);
this.rtcSupported = true;
this.rtcConfig = rtcConfig
this.rtcConfig = rtcConfig;
this.maxMessageSize = 262144; // 256 KB
if (!this._isCaller) return; // we will listen for a caller
this._connect();
@@ -811,6 +831,13 @@ class RTCPeer extends Peer {
Events.on('beforeunload', e => this._onBeforeUnload(e));
Events.on('pagehide', _ => this._onPageHide());
Events.fire('peer-connected', {peerId: this._peerId, connectionHash: this.getConnectionHash()});
this._setMaxMessageSize();
}
_setMaxMessageSize() {
this.maxMessageSize = this._conn && this._conn.sctp
? Math.min(this._conn.sctp.maxMessageSize, 1048576) // 1 MB max
: 262144; // 256 KB
}
_onMessage(message) {

View File

@@ -201,15 +201,11 @@ class FooterUI {
this.$discoveryWrapper = $$('footer .discovery-wrapper');
this.$displayName.addEventListener('keydown', e => this._onKeyDownDisplayName(e));
this.$displayName.addEventListener('keyup', e => this._onKeyUpDisplayName(e));
this.$displayName.addEventListener('blur', e => this._saveDisplayName(e.target.innerText));
this.$displayName.addEventListener('focus', e => this._onFocusDisplayName(e));
this.$displayName.addEventListener('blur', e => this._onBlurDisplayName(e));
Events.on('display-name', e => this._onDisplayName(e.detail.displayName));
Events.on('self-display-name-changed', e => this._insertDisplayName(e.detail));
// Load saved display name on page load
Events.on('ws-connected', _ => this._loadSavedDisplayName());
Events.on('evaluate-footer-badges', _ => this._evaluateFooterBadges());
}
@@ -234,17 +230,20 @@ class FooterUI {
}
async _loadSavedDisplayName() {
const displayName = await this._getSavedDisplayName()
const displayNameSaved = await this._getSavedDisplayName()
if (!displayName) return;
if (!displayNameSaved) return;
console.log("Retrieved edited display name:", displayName)
Events.fire('self-display-name-changed', displayName);
console.log("Retrieved edited display name:", displayNameSaved)
Events.fire('self-display-name-changed', displayNameSaved);
}
_onDisplayName(displayName){
// set display name
this.$displayName.setAttribute('placeholder', displayName);
async _onDisplayName(displayNameServer){
// load saved displayname first to prevent flickering
await this._loadSavedDisplayName();
// set original display name as placeholder
this.$displayName.setAttribute('placeholder', displayNameServer);
}
@@ -259,9 +258,27 @@ class FooterUI {
}
}
_onKeyUpDisplayName(e) {
_onFocusDisplayName(e) {
if (!e.target.innerText) {
// Fix z-position of cursor when div is completely empty (Firefox only)
e.target.innerText = "\n";
// On Chromium based browsers the cursor position is lost when adding sth. to the focused node. This adds it back.
let sel = window.getSelection();
sel.collapse(e.target.lastChild);
}
}
async _onBlurDisplayName(e) {
// fix for Firefox inserting a linebreak into div on edit which prevents the placeholder from showing automatically when it is empty
if (/^(\n|\r|\r\n)$/.test(e.target.innerText)) e.target.innerText = '';
if (/^(\n|\r|\r\n)$/.test(e.target.innerText)) {
e.target.innerText = '';
}
// Remove selection from text
window.getSelection().removeAllRanges();
await this._saveDisplayName(e.target.innerText)
}
async _saveDisplayName(newDisplayName) {

View File

@@ -172,31 +172,34 @@ class PeersUI {
}
_onDrop(e) {
e.preventDefault();
if (this.shareMode.active || Dialog.anyDialogShown()) return;
if (!$$('x-peer') || !$$('x-peer').contains(e.target)) {
if (e.dataTransfer.files.length > 0) {
Events.fire('activate-share-mode', {files: e.dataTransfer.files});
} else {
for (let i=0; i<e.dataTransfer.items.length; i++) {
if (e.dataTransfer.items[i].type === "text/plain") {
e.dataTransfer.items[i].getAsString(text => {
Events.fire('activate-share-mode', {text: text});
});
}
}
}
}
e.preventDefault();
this._onDragEnd();
if ($$('x-peer') || !$$('x-peer').contains(e.target)) return; // dropped on peer
const files = e.dataTransfer.files;
const text = e.dataTransfer.getData("text");
if (files.length > 0) {
Events.fire('activate-share-mode', {
files: files
});
}
else if(text.length > 0) {
Events.fire('activate-share-mode', {
text: text
});
}
}
_onDragOver(e) {
e.preventDefault();
if (this.shareMode.active || Dialog.anyDialogShown()) return;
e.preventDefault();
this.$xInstructions.setAttribute('drop-bg', true);
this.$xNoPeers.setAttribute('drop-bg', true);
}
@@ -278,10 +281,8 @@ class PeersUI {
if (files[0].type.split('/')[0] === 'image') {
try {
let imageUrl = await getThumbnailAsDataUrl(files[0], 80, null, 0.9);
let imageUrl = await getThumbnailAsDataUrl(files[0], 80, 80, 0.9);
this.$shareModeImageThumb.style.backgroundImage = `url(${imageUrl})`;
this.$shareModeImageThumb.removeAttribute('hidden');
} catch (e) {
console.error(e);
@@ -590,6 +591,9 @@ class PeerUI {
_onFilesSelected(e) {
const $input = e.target;
const files = $input.files;
if (files.length === 0) return;
Events.fire('files-selected', {
files: files,
to: this._peer.id
@@ -630,29 +634,28 @@ class PeerUI {
}
_onDrop(e) {
e.preventDefault();
if (PeerUI._shareMode.active || Dialog.anyDialogShown()) return;
if (e.dataTransfer.files.length > 0) {
Events.fire('files-selected', {
files: e.dataTransfer.files,
to: this._peer.id
});
} else {
for (let i=0; i<e.dataTransfer.items.length; i++) {
if (e.dataTransfer.items[i].type === "text/plain") {
e.dataTransfer.items[i].getAsString(text => {
Events.fire('send-text', {
text: text,
to: this._peer.id
});
});
}
}
}
e.preventDefault();
this._onDragEnd();
const peerId = this._peer.id;
const files = e.dataTransfer.files;
const text = e.dataTransfer.getData("text");
if (files.length > 0) {
Events.fire('files-selected', {
files: files,
to: peerId
});
}
else if (text.length > 0) {
Events.fire('send-text', {
text: text,
to: peerId
});
}
}
_onDragOver() {
@@ -1896,6 +1899,8 @@ class SendTextDialog extends Dialog {
this.$submit = this.$el.querySelector('button[type="submit"]');
this.$form.addEventListener('submit', e => this._onSubmit(e));
this.$text.addEventListener('input', _ => this._onInput());
this.$text.addEventListener('paste', e => this._onPaste(e));
this.$text.addEventListener('drop', e => this._onDrop(e));
Events.on('text-recipient', e => this._onRecipient(e.detail.peerId, e.detail.deviceName));
Events.on('keydown', e => this._onKeyDown(e));
@@ -1914,6 +1919,40 @@ class SendTextDialog extends Dialog {
}
}
async _onDrop(e) {
e.preventDefault()
const text = e.dataTransfer.getData("text");
const selection = window.getSelection();
if (selection.rangeCount) {
selection.deleteFromDocument();
selection.getRangeAt(0).insertNode(document.createTextNode(text));
}
this._onInput();
}
async _onPaste(e) {
e.preventDefault()
const text = (e.clipboardData || window.clipboardData).getData('text');
const selection = window.getSelection();
if (selection.rangeCount) {
selection.deleteFromDocument();
const textNode = document.createTextNode(text);
const range = document.createRange();
range.setStart(textNode, textNode.length);
range.collapse(true);
selection.getRangeAt(0).insertNode(textNode);
selection.removeAllRanges();
selection.addRange(range);
}
this._onInput();
}
_textEmpty() {
return !this.$text.innerText || this.$text.innerText === "\n";
}
@@ -1976,14 +2015,18 @@ class ReceiveTextDialog extends Dialog {
this.$displayName = this.$el.querySelector('.display-name');
this._receiveTextQueue = [];
this._hideTimeout = null;
}
selectionEmpty() {
return !window.getSelection().toString()
}
async _onKeyDown(e) {
if (!this.isShown()) return
if (e.code === "KeyC" && (e.ctrlKey || e.metaKey)) {
if (e.code === "KeyC" && (e.ctrlKey || e.metaKey) && this.selectionEmpty()) {
await this._onCopy()
this.hide();
}
else if (e.code === "Escape") {
this.hide();
@@ -1994,12 +2037,17 @@ class ReceiveTextDialog extends Dialog {
window.blop.play();
this._receiveTextQueue.push({text: text, peerId: peerId});
this._setDocumentTitleMessages();
if (this.isShown()) return;
changeFavicon("images/favicon-96x96-notification.png");
if (this.isShown() || this._hideTimeout) return;
this._dequeueRequests();
}
_dequeueRequests() {
if (!this._receiveTextQueue.length) return;
this._setDocumentTitleMessages();
changeFavicon("images/favicon-96x96-notification.png");
let {text, peerId} = this._receiveTextQueue.shift();
this._showReceiveTextDialog(text, peerId);
}
@@ -2010,26 +2058,68 @@ class ReceiveTextDialog extends Dialog {
this.$displayName.classList.add($(peerId).ui._badgeClassName());
this.$text.innerText = text;
this.$text.classList.remove('text-center');
// Beautify text if text is short
if (text.length < 2000) {
// replace urls with actual links
this.$text.innerHTML = this.$text.innerHTML.replace(/((https?:\/\/|www)[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\-._~:\/?#\[\]@!$&'()*+,;=]+)/g, url => {
return `<a href="${url}" target="_blank">${url}</a>`;
});
// Beautify text if text is not too long
if (this.$text.innerText.length <= 300000) {
// Hacky workaround to replace URLs with link nodes in all cases
// 1. Use text variable, find all valid URLs via regex and replace URLs with placeholder
// 2. Use html variable, find placeholders with regex and replace them with link nodes
let $textShadow = document.createElement('div');
$textShadow.innerText = text;
let linkNodes = {};
let searchHTML = $textShadow.innerHTML;
const p = "@";
const pRgx = new RegExp(`${p}\\d+`, 'g');
let occP = searchHTML.match(pRgx) || [];
let m = 0;
const allowedDomainChars = "a-zA-Z0-9áàäčçđéèêŋńñóòôöšŧüžæøåëìíîïðùúýþćěłřśţźǎǐǒǔǥǧǩǯəʒâûœÿãõāēīōūăąĉċďĕėęĝğġģĥħĩĭįıĵķĸĺļľņňŏőŕŗŝşťũŭůűųŵŷżאבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ";
const urlRgx = new RegExp(`(^|\\n|\\s|["><\\-_~:\\/?#\\[\\]@!$&'()*+,;=%.])(((https?:\\/\\/)?(?:[${allowedDomainChars}](?:[${allowedDomainChars}-]{0,61}[${allowedDomainChars}])?\\.)+[${allowedDomainChars}][${allowedDomainChars}-]{0,61}[${allowedDomainChars}])(:?\\d*)\\/?([${allowedDomainChars}_\\/\\-#.]*)(\\?([${allowedDomainChars}\\-_~:\\/?#\\[\\]@!$&'()*+,;=%.]*))?)`, 'g');
$textShadow.innerText = text.replace(urlRgx,
(match, whitespaceOrSpecial, url, g3, scheme) => {
let link = url;
// prefix www.example.com with http protocol to prevent it from being a relative link
if (!scheme && link.startsWith('www')) {
link = "http://" + link
}
if (isUrlValid(link)) {
// link is valid -> replace with link node placeholder
// find linkNodePlaceholder that is not yet present in text node
m++;
while (occP.includes(`${p}${m}`)) {
m++;
}
let linkNodePlaceholder = `${p}${m}`;
// add linkNodePlaceholder to text node and save a reference to linkNodes object
linkNodes[linkNodePlaceholder] = `<a href="${link}" target="_blank">${url}</a>`;
return `${whitespaceOrSpecial}${linkNodePlaceholder}`;
}
// link is not valid -> do not replace
return match;
});
this.$text.innerHTML = $textShadow.innerHTML.replace(pRgx,
(m) => {
let urlNode = linkNodes[m];
return urlNode ? urlNode : m;
});
}
this._evaluateOverflowing(this.$text);
this._setDocumentTitleMessages();
changeFavicon("images/favicon-96x96-notification.png");
this.show();
}
_setDocumentTitleMessages() {
document.title = !this._receiveTextQueue.length
document.title = this._receiveTextQueue.length <= 1
? `${ Localization.getTranslation("document-titles.message-received") } - PairDrop`
: `${ Localization.getTranslation("document-titles.message-received-plural", null, {count: this._receiveTextQueue.length + 1}) } - PairDrop`;
}
@@ -2049,7 +2139,17 @@ class ReceiveTextDialog extends Dialog {
hide() {
super.hide();
setTimeout(() => this._dequeueRequests(), 500);
// If queue is empty -> clear text field | else -> open next message
this._hideTimeout = setTimeout(() => {
if (!this._receiveTextQueue.length) {
this.$text.innerHTML = "";
}
else {
this._dequeueRequests();
}
this._hideTimeout = null;
}, 500);
}
}

View File

@@ -478,12 +478,7 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual
try {
if (file.type === "image/heif" || file.type === "image/heic") {
// browsers can't show heic files --> convert to jpeg before creating thumbnail
let blob = await fileToBlob(file);
file = await heic2any({
blob,
toType: "image/jpeg",
quality: quality
});
file = await heicToJpeg(file, 0.5);
}
let imageUrl = URL.createObjectURL(file);
@@ -493,26 +488,40 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual
await waitUntilImageIsLoaded(imageUrl);
let imageWidth = image.width;
let imageHeight = image.height;
let canvas = document.createElement('canvas');
let heightForSpecifiedWidth;
let widthForSpecifiedHeight;
// resize the canvas and draw the image data into it
if (width) {
heightForSpecifiedWidth = Math.floor(image.height * width / image.width);
}
if (height) {
widthForSpecifiedHeight = Math.floor(image.width * height / image.height);
}
// resize the canvas and draw the image on it
if (width && height) {
canvas.width = width;
canvas.height = height;
// mode "contain": preserve aspect ratio and use arguments as boundaries
if (height > heightForSpecifiedWidth) {
canvas.width = width;
canvas.height = heightForSpecifiedWidth;
}
else {
canvas.width = widthForSpecifiedHeight;
canvas.height = height;
}
}
else if (width) {
canvas.width = width;
canvas.height = Math.floor(imageHeight * width / imageWidth)
canvas.height = heightForSpecifiedWidth;
}
else if (height) {
canvas.width = Math.floor(imageWidth * height / imageHeight);
canvas.width = widthForSpecifiedHeight;
canvas.height = height;
}
else {
canvas.width = imageWidth;
canvas.height = imageHeight
canvas.width = image.width;
canvas.height = image.height
}
let ctx = canvas.getContext("2d");
@@ -527,6 +536,32 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual
})
}
function initHeicConverter() {
return new Promise((resolve, reject) => {
fetch("libheif.wasm")
.then((res) => res.arrayBuffer())
.then(async (wasmBinary) => {
resolve(new HeifConvert(libheif({ wasmBinary: wasmBinary })));
})
.catch(reject);
});
}
async function heicToJpeg(file, quality) {
const heicConverter = await initHeicConverter();
console.log("Using libheif", heicConverter.libheif.heif_get_version());
const buffer = await file.arrayBuffer();
const canvas = await heicConverter.convert(buffer);
return new Promise(resolve => {
canvas.toBlob(blob => resolve(blob),
'image/jpeg',
quality
);
});
}
// Resolves returned promise when image is loaded and throws error if image cannot be shown
function waitUntilImageIsLoaded(imageUrl, timeout = 10000) {
return new Promise((resolve, reject) => {
@@ -583,4 +618,14 @@ async function decodeBase64Text(base64) {
if (!base64) throw new Error('Base64 is empty');
return decodeURIComponent(escape(window.atob(base64)))
}
function isUrlValid(url) {
try {
let urlObj = new URL(url);
return true;
}
catch (e) {
return false;
}
}

View File

@@ -1,4 +1,4 @@
const cacheVersion = 'v1.10.2';
const cacheVersion = 'v1.10.10';
const cacheTitle = `pairdrop-cache-${cacheVersion}`;
const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions
const relativePathsToCache = [
@@ -7,6 +7,9 @@ const relativePathsToCache = [
'manifest.json',
'styles/styles-main.css',
'styles/styles-deferred.css',
'scripts/heif-convert.js',
'scripts/libheif.js',
'scripts/libheif.wasm',
'scripts/localization.js',
'scripts/main.js',
'scripts/network.js',
@@ -27,22 +30,30 @@ const relativePathsToCache = [
'images/android-chrome-512x512-maskable.png',
'images/apple-touch-icon.png',
'lang/ar.json',
'lang/be.json',
'lang/ca.json',
'lang/cs.json',
'lang/da.json',
'lang/de.json',
'lang/en.json',
'lang/es.json',
'lang/fr.json',
'lang/he.json',
'lang/hu.json',
'lang/id.json',
'lang/it.json',
'lang/ja.json',
'lang/kn.json',
'lang/nb.json',
'lang/nl.json',
'lang/pl.json',
'lang/pt-BR.json',
'lang/ro.json',
'lang/ru.json',
'lang/tr.json',
'lang/zh-CN.json'
'lang/uk.json',
'lang/zh-CN.json',
'lang/zh-TW.json'
];
const relativePathsNotToCache = [
'config'
@@ -193,7 +204,7 @@ const evaluateRequestData = function (request) {
const objectStoreRequest = objectStore.add(fileObjects[i]);
objectStoreRequest.onsuccess = _ => {
if (i === fileObjects.length - 1) resolve(pairDropUrl + '?share-target=files');
if (i === fileObjects.length - 1) resolve(pairDropUrl + '?share_target=files');
}
}
}
@@ -202,7 +213,7 @@ const evaluateRequestData = function (request) {
}
}
else {
let urlArgument = '?share-target=text';
let urlArgument = '?share_target=text';
if (title) urlArgument += `&title=${title}`;
if (text) urlArgument += `&text=${text}`;

View File

@@ -12,10 +12,10 @@
display: block;
overflow: auto;
resize: none;
line-height: 16px;
max-height: 350px;
word-break: break-word;
word-wrap: anywhere;
white-space: pre-wrap;
}
.textarea:before {
@@ -335,6 +335,7 @@ x-dialog x-paper {
display: flex;
margin: auto;
flex-direction: column;
width: 100%;
max-width: 450px;
z-index: 3;
border-radius: 30px;
@@ -382,10 +383,6 @@ x-dialog:not([show]) x-paper {
transform: scale(0.1);
}
x-dialog a {
color: var(--primary-color);
}
/* Pair Devices Dialog & Public Room Dialog */
.input-key-container {
@@ -784,7 +781,7 @@ x-dialog x-paper {
background-color: var(--bg-color-secondary) !important;
}
.textarea * {
.textarea *:not(a) {
margin: 0 !important;
padding: 0 !important;
color: unset !important;
@@ -797,6 +794,10 @@ x-dialog x-paper {
font-weight: unset !important;
}
x-dialog a {
color: var(--primary-color);
}
/* Image/Video/Audio Preview */
.file-preview {
margin-bottom: 15px;

View File

@@ -557,6 +557,10 @@ footer .logo {
position: relative;
}
#display-name:focus::before {
display: none;
}
html:not([dir="rtl"]) #display-name,
html:not([dir="rtl"]) .edit-pen {
margin-left: -1rem;
@@ -626,12 +630,15 @@ x-dialog:not([show]) x-background {
left: 0;
right: 0;
bottom: 0;
z-index: -1;
opacity: 0;
background-color: var(--accent-color);
transition: opacity 300ms;
}
.icon-button:before {
z-index: -1;
}
.btn:not([disabled]):hover:before,
.icon-button:hover:before {
opacity: 0.3;
@@ -936,8 +943,8 @@ body {
--lt-dialog-bg-color: #fff;
--lt-bg-color: 255,255,255;
--lt-bg-color-secondary: #f2f2f2;
--lt-border-color: #a9a9a9;
--lt-badge-color: #a5a5a5;
--lt-border-color: #757575;
--lt-badge-color: #757575;
--lt-lang-hr-color: #DDD;
--lt-shadow-color-secondary-rgb: 0,0,0;
@@ -950,8 +957,8 @@ body {
--dt-dialog-bg-color: #141414;
--dt-bg-color: 0,0,0;
--dt-bg-color-secondary: #262628;
--dt-border-color: #919191;
--dt-badge-color: #717171;
--dt-border-color: #757575;
--dt-badge-color: #757575;
--dt-lang-hr-color: #404040;
--dt-shadow-color-secondary-rgb: 255,255,255;

View File

@@ -44,15 +44,18 @@ export default class Peer {
_setIP(request) {
if (request.headers['cf-connecting-ip']) {
this.ip = request.headers['cf-connecting-ip'].split(/\s*,\s*/)[0];
} else if (request.headers['x-forwarded-for']) {
}
else if (request.headers['x-forwarded-for']) {
this.ip = request.headers['x-forwarded-for'].split(/\s*,\s*/)[0];
} else {
this.ip = request.connection.remoteAddress;
}
else {
this.ip = request.socket.remoteAddress ?? '';
}
// remove the prefix used for IPv4-translated addresses
if (this.ip.substring(0,7) === "::ffff:")
if (this.ip.substring(0,7) === "::ffff:") {
this.ip = this.ip.substring(7);
}
let ipv6_was_localized = false;
if (this.conf.ipv6Localize && this.ip.includes(':')) {