Compare commits

..

42 Commits

Author SHA1 Message Date
schlagmichdoch
d3e7de89cd Disable send text button after dialog has been hidden 2024-02-21 18:21:05 +01:00
schlagmichdoch
755d5e29f0 Implement fallback for text messages larger than the max message size to sent them in chunks via the send files API 2024-02-21 18:19:59 +01:00
schlagmichdoch
00f1a20177 Round progress to 4th digit to prevent weird progress bar behavior on reconnect 2024-02-17 12:27:29 +01:00
schlagmichdoch
3c8848d406 Add STATE_TRANSFER_REQUEST_RECEIVED and close transfer request dialog if requesting peer reloads 2024-02-17 12:27:29 +01:00
schlagmichdoch
0d17ada58b NoSleep: Move evaluation if any peer is still busy to the PeerManager 2024-02-17 12:27:28 +01:00
schlagmichdoch
74bd7dd406 Check if RAM would be exceeded before using navigator.share() 2024-02-17 12:27:28 +01:00
schlagmichdoch
f4a947527d Move service worker digestion into separate class and add static function to check if it is supported by the browser. Change ram-exceed-ios waring accordingly. 2024-02-17 12:26:21 +01:00
schlagmichdoch
90f10910aa Fix _fileReceived getting called twice 2024-02-15 18:02:23 +01:00
schlagmichdoch
aacf24c31f Fix reconnecting by always accepting new ice candidates 2024-02-15 18:02:23 +01:00
schlagmichdoch
c0e5b66d41 Fix share menu error detection on iOS 2024-02-15 18:02:23 +01:00
schlagmichdoch
42bd71a3dc Add error status and check if too many bytes are received 2024-02-15 18:02:23 +01:00
schlagmichdoch
a98499ea5a Move header comparison to _onTransferHeader function as there is no benefit in doing it after file is received 2024-02-15 18:02:23 +01:00
schlagmichdoch
7c471910ef Tidy up Peer classes 2024-02-15 18:02:15 +01:00
schlagmichdoch
da558ddceb Move beforeunload event to Peer class to include it to the WSPeer; Add reset method to Peer class to prevent returning the "unfinished-transfers" warning when closing the page after a peer has left during transfer 2024-02-15 15:18:25 +01:00
schlagmichdoch
1df8fe258e Tidy up zipper functions 2024-02-15 15:18:25 +01:00
schlagmichdoch
65936a4d7d Truncate file used by the sw-file-digester.js after processing 2024-02-15 15:18:25 +01:00
schlagmichdoch
7c6062e1e0 Solve "transfer-complete" and "receive-complete" status detection via css instead of adding a new class 2024-02-13 18:24:08 +01:00
schlagmichdoch
902b5c6b8f Refactor file transfer 2024-02-09 04:11:36 +01:00
schlagmichdoch
19d33e11d8 Implement fallback to download if navigator.share() fails. Refactor ReceiveFileDialog 2024-02-09 04:11:36 +01:00
schlagmichdoch
d8908e01ea Add alert for iOS when receiving big files using a private tab 2024-02-09 04:11:36 +01:00
schlagmichdoch
2d2cfec5f0 Add missing checks for transfer states 2024-02-09 04:11:36 +01:00
schlagmichdoch
40a12b5501 Fix progress animation 2024-02-09 04:11:36 +01:00
schlagmichdoch
5ee8bb871e Move file creation to serviceworker to prevent loading everything into RAM 2024-02-09 04:11:36 +01:00
schlagmichdoch
ef3c338dad Activate NoSleep on file transfers instead of on click and deactivate when transfer is finished 2024-02-09 04:11:32 +01:00
schlagmichdoch
6d95f3f4e2 Fix canceling file selector on Windows Edge sometimes blocks UI (#257) 2024-02-09 01:59:30 +01:00
schlagmichdoch
c33d49702e Animate progress circle and show complete status in blue for 10s 2024-02-09 01:56:23 +01:00
schlagmichdoch
1d62a9ff49 Add state management to network peers 2024-02-09 01:55:37 +01:00
schlagmichdoch
3dd40e238a Refactor _downloadNotification function 2024-02-09 01:55:37 +01:00
schlagmichdoch
417d5421a6 Refactor _displayFiles function; Only show ReceiveFileDialog if share menu is used OR if automatic download has not worked 2024-02-09 01:55:37 +01:00
schlagmichdoch
7af51bbd5f Tidy up chunker code 2024-02-09 01:55:37 +01:00
schlagmichdoch
88739107e4 Remove limit for sending to iOS devices (fixes #211) 2024-02-09 01:55:37 +01:00
schlagmichdoch
6de97e7ff1 Put all log prompts into new Logger class; Only log debugging logs to console if PairDrop is in debug mode; Implement activation of debug mode via URL argument (?debug=true) 2024-02-09 01:55:37 +01:00
schlagmichdoch
b61de4eb87 send transfer abortion in some cases; Clarify variable names 2024-02-09 01:55:37 +01:00
schlagmichdoch
cfe5b4afda Prevent full datachannel buffer on file end 2024-02-09 01:55:37 +01:00
schlagmichdoch
91fc2b7bf5 Add speed log to browser console 2024-02-09 01:55:37 +01:00
schlagmichdoch
c670b39732 Fix byte size conversion 2024-02-09 01:55:37 +01:00
schlagmichdoch
e5a09b6be1 Include label in x-peer size transformation; Prevent use of transparency for status & displayName; 2024-02-09 01:55:27 +01:00
schlagmichdoch
1d81b744ea Put blop sound into separate function and only play if on desktop 2024-02-05 21:08:10 +01:00
schlagmichdoch
c37412cfd3 Fix variable should be static 2024-02-05 21:08:10 +01:00
schlagmichdoch
a5dc8b6da2 Split transfer into message and data transfer and rewrite FileChunkerLogic completely. Condense all Relaying of the Websocket Fallback into one message type 'ws-relay' 2024-02-05 21:08:06 +01:00
schlagmichdoch
d81c03a560 Prefill room secrets entry with displayName given by server to prevent displayName undefined in EditPairedDevices Dialog (fixes #221) 2024-02-05 02:16:25 +01:00
schlagmichdoch
f22abca783 Implement new status 'connecting', automatic reconnect on disconnect and auto resume of transfer + sending of queued messages. (fixes #260 and #247) 2024-02-05 02:16:17 +01:00
43 changed files with 2605 additions and 2230 deletions

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.8
Version: v1.10.6
**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.8
Version: v1.10.6
**Additional context**
Add any other context about the problem here.

View File

@@ -39,6 +39,7 @@ Send a file from your phone to your laptop?
* 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 of your local network that are behind a NAT are auto-connected via the PairDrop TURN server.
* Connect to devices on your mobile hotspot.
* Devices from the local network, in the same public room, or previously paired are shown.
#### Persistent Device Pairing
@@ -118,9 +119,9 @@ Connect to others in complex network situations, or over the Internet.
<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!
I footed the bill for the domain and the server, and you can help create great softeare by supporting me. \
Please use BuyMeACoffee via the button above. \
Thanks a lot for supporting copylefted libre software!
## Contributing
Feel free to [open an issue](https://github.com/schlagmichdoch/pairdrop/issues/new/choose) or a

View File

@@ -5,39 +5,18 @@
Help! I can't install the PWA!
</summary>
<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).
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).
<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>
**Self-Hosted Instance?** \
<b>Self-Hosted Instance?</b>
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>
@@ -47,9 +26,7 @@ See [this host your own section](https://github.com/schlagmichdoch/PairDrop/blob
Shortcuts?
</summary>
<br>
Available shortcuts:
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`.
@@ -63,20 +40,12 @@ Available shortcuts:
How to save images directly to the gallery on iOS?
</summary>
<br>
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.
~~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:~~ \
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>
@@ -86,13 +55,10 @@ Luckily, you can now simply use `Save Image`/`Save X Images` 🎉
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>
@@ -102,12 +68,9 @@ 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>
@@ -117,14 +80,11 @@ 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>
@@ -134,8 +94,6 @@ 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.
@@ -151,7 +109,6 @@ 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>
@@ -161,8 +118,6 @@ 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).
@@ -175,7 +130,6 @@ 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>
@@ -185,13 +139,10 @@ 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.
<br>
</details>
@@ -201,8 +152,6 @@ 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.
@@ -215,7 +164,6 @@ 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>
@@ -225,8 +173,6 @@ 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
@@ -238,24 +184,22 @@ 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;">
PairDrop is awesome. How can I support it?
Snapdrop and PairDrop are awesome. How can I support them?
</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 create a pull request.
* Fix bugs and make a pull request.
* Do some security analysis and make suggestions.
* Participate in [active discussions](https://github.com/schlagmichdoch/PairDrop/discussions)
* To support the original Snapdrop and its creator go to [his GitHub page](https://github.com/RobinLinus/snapdrop)
<br>
</details>
@@ -265,10 +209,7 @@ 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

@@ -45,11 +45,11 @@ This pairdrop-cli version was released alongside v1.10.4
#### Linux / Mac
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
```shell
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.8/pairdrop-cli.zip"
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.6/pairdrop-cli.zip"
```
or
```shell
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.8/pairdrop-cli.zip"
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.6/pairdrop-cli.zip"
```
2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/`
```shell

363
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "pairdrop",
"version": "1.10.8",
"version": "1.10.6",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "pairdrop",
"version": "1.10.8",
"version": "1.10.6",
"license": "ISC",
"dependencies": {
"express": "^4.18.2",
@@ -37,12 +37,12 @@
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.5",
"content-type": "~1.0.4",
"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.2",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
@@ -68,18 +68,12 @@
}
},
"node_modules/call-bind": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dependencies": {
"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"
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -97,17 +91,17 @@
}
},
"node_modules/content-type": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"engines": {
"node": ">= 0.6"
}
@@ -125,22 +119,6 @@
"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",
@@ -171,25 +149,6 @@
"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",
@@ -204,16 +163,16 @@
}
},
"node_modules/express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.2",
"body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
@@ -292,62 +251,32 @@
}
},
"node_modules/function-bind": {
"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"
}
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
"integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"dependencies": {
"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"
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dependencies": {
"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": {
"node_modules/has": {
"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"
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dependencies": {
"function-bind": "^1.1.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-symbols": {
@@ -361,17 +290,6 @@
"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",
@@ -476,9 +394,9 @@
}
},
"node_modules/object-inspect": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -542,9 +460,9 @@
}
},
"node_modules/raw-body": {
"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==",
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
@@ -621,39 +539,19 @@
"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.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dependencies": {
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4",
"object-inspect": "^1.13.1"
},
"engines": {
"node": ">= 0.4"
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -778,12 +676,12 @@
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"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.5",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
@@ -791,7 +689,7 @@
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.2",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
}
@@ -802,15 +700,12 @@
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
},
"call-bind": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires": {
"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"
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"content-disposition": {
@@ -822,14 +717,14 @@
}
},
"content-type": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
"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.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
"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",
@@ -844,16 +739,6 @@
"ms": "2.0.0"
}
},
"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==",
"requires": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"gopd": "^1.0.1"
}
},
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -874,19 +759,6 @@
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
},
"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==",
"requires": {
"get-intrinsic": "^1.2.4"
}
},
"es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -898,16 +770,16 @@
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
},
"express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"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.2",
"body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
@@ -966,56 +838,33 @@
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
},
"function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
"integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"requires": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
}
},
"gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"requires": {
"get-intrinsic": "^1.1.3"
}
},
"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==",
"requires": {
"es-define-property": "^1.0.0"
}
},
"has-proto": {
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
"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=="
},
"hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"requires": {
"function-bind": "^1.1.2"
}
},
"http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -1090,9 +939,9 @@
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
},
"object-inspect": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
"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",
@@ -1135,9 +984,9 @@
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
"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==",
"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",
@@ -1193,33 +1042,19 @@
"send": "0.18.0"
}
},
"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==",
"requires": {
"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"
}
},
"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.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"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.7",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4",
"object-inspect": "^1.13.1"
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"statuses": {

View File

@@ -1,6 +1,6 @@
{
"name": "pairdrop",
"version": "1.10.8",
"version": "1.10.6",
"type": "module",
"description": "",
"main": "server/index.js",

View File

@@ -230,11 +230,6 @@
<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>
@@ -245,11 +240,6 @@
<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>
@@ -273,12 +263,7 @@
<button class="btn fw wrap" value="zh-CN">
<span>中文</span>
<span>&nbsp;&nbsp;-&nbsp;&nbsp;</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>
<span>(Chinese)</span>
</button>
<button class="btn fw wrap" value="ja">
<span>日本語</span>
@@ -462,7 +447,7 @@
<div class="center file-preview"></div>
<div class="row-reverse center btn-row wrap">
<button id="share-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.share" data-i18n-attrs="text" hidden></button>
<button id="download-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus disabled></button>
<button id="download-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus disabled hidden></button>
<button class="btn btn-rounded btn-grey" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
</div>
</x-paper>
@@ -597,7 +582,7 @@
</svg>
<div class="title-wrapper" dir="ltr">
<h1>PairDrop</h1>
<div class="font-subheading">v1.10.8</div>
<div class="font-subheading">v1.10.6</div>
</div>
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text"></div>
<div class="row">
@@ -759,7 +744,7 @@
<script src="scripts/ui-main.js" defer></script>
<script src="scripts/main.js" defer></script>
<!-- Sounds -->
<audio id="blop" autobuffer="true">
<audio id="blop" preload="metadata" disableremoteplayback="true" x-webkit-airplay="deny" muted>
<source src="sounds/blop.mp3" type="audio/mpeg">
<source src="sounds/blop.ogg" type="audio/ogg">
</audio>

View File

@@ -48,7 +48,6 @@
"pairing-cleared": "جميع الأجهزة غير مقترنة",
"notifications-enabled": "تم تمكين الإشعارات",
"online-requirement-pairing": "يجب أن تكون متصلاً بالإنترنت لإقران الأجهزة",
"ios-memory-limit": "لا يمكن إرسال ملفات إلى iOS إلا بحجم يصل إلى 200 ميجابايت مرة واحدة",
"online-requirement-public-room": "يجب أن تكون متصلاً بالإنترنت لإنشاء غرفة عامة",
"copied-text-error": "فشلت الكتابة من الحافظة. انسخ يدويًا!",
"download-successful": "تم تحميل {{descriptor}}",
@@ -71,9 +70,9 @@
},
"instructions": {
"x-instructions_mobile": "انقر لإرسال الملفات أو انقر لفترة طويلة لإرسال رسالة",
"x-instructions-share-mode_desktop": "انقر للإرسال {{descriptor}}",
"x-instructions-share-mode_desktop": "انقر للإرسال",
"activate-share-mode-and-other-files-plural": "و{{count}} ملفات أخرى",
"x-instructions-share-mode_mobile": "انقر للإرسال {{descriptor}}",
"x-instructions-share-mode_mobile": "انقر للإرسال",
"activate-share-mode-base": "افتح PairDrop على الأجهزة الأخرى للإرسال",
"no-peers-subtitle": "قم بإقران الأجهزة أو ادخل إلى غرفة عامة لتتمكن من أن تكتشف على الشبكات الأخرى",
"activate-share-mode-shared-text": "النص المشترك",

View File

@@ -144,7 +144,6 @@
"pairing-cleared": "Tots els dispositius desvinculats",
"notifications-enabled": "Notificacions habilitades",
"online-requirement-pairing": "Has d'estar en línia per vincular dispositius",
"ios-memory-limit": "Tan sols és possible enviar fitxers de fins a 200 MB a iOS",
"online-requirement-public-room": "Cal que estiguis en línia per poder crear una sala pública",
"room-url-copied-to-clipboard": "Enllaç a la sala pública copiat al porta-retalls",
"copied-text-error": "L'escriptura al porta-retalls ha fallat. Copiar manualment!",

View File

@@ -138,7 +138,6 @@
"message-transfer-completed": "Nachricht übertragen",
"rate-limit-join-key": "Rate Limit erreicht. Warte 10 Sekunden und versuche es erneut.",
"selected-peer-left": "Ausgewählter Peer ist gegangen",
"ios-memory-limit": "Für Übertragungen an iOS Geräte beträgt die maximale Dateigröße 200 MB",
"public-room-left": "Öffentlichen Raum {{publicRoomId}} verlassen",
"copied-to-clipboard-error": "Konnte nicht kopieren. Kopiere manuell.",
"public-room-id-invalid": "Ungültige Raum-ID",

View File

@@ -93,6 +93,7 @@
"file-other-description-file": "and 1 other file",
"file-other-description-image-plural": "and {{count}} other images",
"file-other-description-file-plural": "and {{count}} other files",
"text-message-description": "A large text message",
"title-image": "Image",
"title-file": "File",
"title-image-plural": "Images",
@@ -158,17 +159,20 @@
"connecting": "Connecting…",
"files-incorrect": "Files are incorrect",
"file-transfer-completed": "File transfer completed",
"ios-memory-limit": "Sending files to iOS is only possible up to 200 MB at once",
"message-transfer-completed": "Message transfer completed",
"unfinished-transfers-warning": "There are unfinished transfers. Are you sure you want to close PairDrop?",
"rate-limit-join-key": "Rate limit reached. Wait 10 seconds and try again.",
"selected-peer-left": "Selected peer left"
"selected-peer-left": "Selected peer left",
"error-sharing-size": "Files too big to be shared. They can be downloaded instead.",
"error-sharing-default": "Error while sharing. It can be downloaded instead.",
"ram-exceed-ios": "One of the files is bigger than 250 MB and will crash the page on iOS. Use https and do not use private tabs on the iOS device to prevent this."
},
"document-titles": {
"file-received": "File Received",
"file-received-plural": "{{count}} Files Received",
"file-transfer-requested": "File Transfer Requested",
"image-transfer-requested": "Image Transfer Requested",
"message-transfer-requested": "Message Transfer Requested",
"message-received": "Message Received",
"message-received-plural": "{{count}} Messages Received"
},
@@ -176,9 +180,14 @@
"click-to-send-share-mode": "Click to send {{descriptor}}",
"click-to-send": "Click to send files or right click to send a message",
"connection-hash": "To verify the security of the end-to-end encryption, compare this security number on both devices",
"connecting": "Connecting…",
"preparing": "Preparing…",
"waiting": "Waiting…",
"processing": "Processing…",
"transferring": "Transferring…"
"transferring": "Sending…",
"receiving": "Receiving…",
"transfer-complete": "Sent",
"receive-complete": "Received",
"error": "Error"
}
}

View File

@@ -64,7 +64,6 @@
"pairing-cleared": "Todos los dispositivos han sido desemparejados",
"notifications-enabled": "Notificaciones habilitadas",
"online-requirement-pairing": "Debes estar en línea para emparejar dispositivos",
"ios-memory-limit": "Enviar archivos a iOS sólo admite hasta 200 MB a la vez",
"online-requirement-public-room": "Debes estar en línea para crear una sala pública",
"copied-text-error": "Error al escribir en el portapapeles. ¡Cópielo manualmente!",
"download-successful": "{{descriptor}} descargado",

View File

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

View File

@@ -11,9 +11,7 @@
"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é",
"edit-share-mode": "Modifier",
"expand_title": "Agrandir entête bouton ligne"
"cancel-share-mode": "Terminé"
},
"instructions": {
"no-peers_data-drop-bg": "Déposer pour choisir le destinataire",
@@ -23,15 +21,11 @@
"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 {{descriptor}}",
"x-instructions-share-mode_mobile": "Appuyez pour envoyer {{descriptor}}",
"x-instructions-share-mode_desktop": "Cliquez pour envoyer",
"x-instructions-share-mode_mobile": "Appuyez pour envoyer",
"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-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"
"activate-share-mode-shared-text": "texte partagé"
},
"footer": {
"known-as": "Vous êtes connu comme :",
@@ -76,13 +70,13 @@
"share": "Partage",
"download": "Télécharger",
"send-message-title": "Envoyer un message",
"send-message-to": "À :",
"send-message-to": "Envoyer un message à",
"send": "Envoyer",
"receive-text-title": "Message reçu",
"copy": "Copier",
"base64-processing": "Traitement…",
"base64-tap-to-paste": "Appuyez ici pour partager {{type}}",
"base64-paste-to-send": "Coller ici pour partager {{type}}",
"base64-tap-to-paste": "Appuyez ici pour coller {{type}}",
"base64-paste-to-send": "Coller ici pour envoyer {{type}}",
"base64-text": "texte",
"base64-files": "fichiers",
"file-other-description-image": "et 1 autre image",
@@ -99,16 +93,7 @@
"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",
"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"
"public-room-qr-code_title": "Cliquez pour copier le lien vers le salon public"
},
"about": {
"close-about_aria-label": "Fermer à propos de PairDrop",
@@ -116,10 +101,7 @@
"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",
"bluesky_title": "Suis-nous sur BlueSky",
"custom_title": "Suis-nous",
"privacypolicy_title": "Ouvert sur notre politique de confidentialité"
"faq_title": "Questions fréquemment posées"
},
"notifications": {
"display-name-changed-permanently": "Le nom d'affichage est modifié de manière permanente",
@@ -155,7 +137,6 @@
"connecting": "Connexion…",
"files-incorrect": "Les fichiers sont incorrects",
"file-transfer-completed": "Transfert de fichier terminé",
"ios-memory-limit": "L'envoi de fichiers vers iOS n'est possible que jusqu'à 200 Mo à la fois",
"message-transfer-completed": "Transfert de message terminé",
"unfinished-transfers-warning": "Il y a des transferts inachevés. Êtes-vous sûr de vouloir fermer PairDrop ?",
"rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",

View File

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

View File

@@ -1,184 +0,0 @@
{
"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

@@ -48,7 +48,6 @@
"pairing-cleared": "Semua Perangkat dilepaskan",
"notifications-enabled": "Notifikasi diaktifkan",
"online-requirement-pairing": "Anda harus online untuk memasangkan perangkat",
"ios-memory-limit": "Mengirim file ke iOS hanya dapat dilakukan hingga 200 MB sekaligus",
"online-requirement-public-room": "Anda harus online untuk membuat ruang publik",
"copied-text-error": "Menyalin ke papan klip gagal. Salinlah secara manual!",
"download-successful": "{{descriptor}} diunduh",
@@ -75,9 +74,9 @@
},
"instructions": {
"x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan",
"x-instructions-share-mode_desktop": "Klik untuk mengirim {{descriptor}}",
"x-instructions-share-mode_desktop": "Klik untuk mengirim",
"activate-share-mode-and-other-files-plural": "dan {{count}} file lainnya",
"x-instructions-share-mode_mobile": "Ketuk untuk mengirim {{descriptor}}",
"x-instructions-share-mode_mobile": "Ketuk untuk mengirim",
"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",

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 associati in ogni momento, indipendentemente dalla rete.",
"paired-devices_title": "Puoi essere rilevato dai dispositivi abbinati in ogni momento, indipendentemente dalla rete.",
"public-room-devices": "nella stanza {{roomId}}",
"paired-devices": "da dispositivi associati",
"paired-devices": "da dispositivi abbinati",
"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": "Annulla",
"cancel-share-mode": "Fatto",
"theme-auto_title": "Adatta il tema al sistema automaticamente",
"install_title": "Installa PairDrop",
"theme-dark_title": "Usa sempre il tema scuro",
@@ -26,15 +26,13 @@
"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",
"edit-share-mode": "Modifica",
"expand_title": "Espandi la riga dei pulsanti nell'intestazione"
"theme-light_title": "Usa sempre il tema chiaro"
},
"instructions": {
"x-instructions_mobile": "Tocca per inviare file o tocco prolungato per inviare un messaggio",
"x-instructions-share-mode_desktop": "Clicca per inviare {{descriptor}}",
"x-instructions-share-mode_desktop": "Clicca per inviare",
"activate-share-mode-and-other-files-plural": "e altri {{count}} files",
"x-instructions-share-mode_mobile": "Tocca per inviare {{descriptor}}",
"x-instructions-share-mode_mobile": "Tocca per inviare",
"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",
@@ -43,26 +41,23 @@
"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",
"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"
"webrtc-requirement": "Per usare questa istanza di PairDrop, devi attivare WebRTC!"
},
"dialogs": {
"auto-accept-instructions-2": "per accettare automaticamente tutti i files inviati da quel dispositivo.",
"edit-paired-devices-title": "Modifica Dispositivi Associati",
"edit-paired-devices-title": "Modifica Dispositivi Abbinati",
"cancel": "Annulla",
"auto-accept-instructions-1": "Attiva",
"pair-devices-title": "Associa Dispositivi Permanentemente",
"pair-devices-title": "Abbina Dispositivi Permanentemente",
"temporary-public-room-title": "Stanza Pubblica Temporanea",
"close": "Chiudi",
"unpair": "Dissocia",
"pair": "Associa",
"pair": "Abbina",
"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 associato.",
"paired-devices-wrapper_data-empty": "Nessun dispositivo abbinato.",
"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}}",
@@ -76,7 +71,7 @@
"join": "Unisciti",
"title-image-plural": "Immagini",
"send": "Invia",
"base64-tap-to-paste": "Tocca qui per condividere {{type}}",
"base64-tap-to-paste": "Tocca qui per incollare {{type}}",
"base64-text": "testo",
"copy": "Copia",
"file-other-description-image": "e 1 altra immagine",
@@ -87,7 +82,7 @@
"title-image": "Immagine",
"file-other-description-file-plural": "e altri {{count}} files",
"would-like-to-share": "vorrebbe condividere",
"send-message-to": "A:",
"send-message-to": "Invia un messaggio a",
"language-selector-title": "Imposta Lingua",
"hr-or": "OPPURE",
"download-again": "Scarica ancora",
@@ -97,20 +92,11 @@
"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 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"
"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"
},
"notifications": {
"request-title": "{{name}} vorrebbe inviare {{count}} {{descriptor}}",
"request-title": "{{name}} vorrebbe trasferire {{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.",
@@ -118,22 +104,22 @@
"pairing-key-invalidated": "Il codice {{key}} è stato invalidato",
"pairing-key-invalid": "Codice non valido",
"connected": "Connesso",
"pairing-not-persistent": "I dispositivi associati non sono permanenti",
"text-content-incorrect": "Il contenuto di testo è errato",
"pairing-not-persistent": "I dispositivi abbinati non sono persistenti",
"text-content-incorrect": "Il contenuto testuale non è corretto",
"message-transfer-completed": "Trasferimento del messaggio completato",
"file-transfer-completed": "Trasferimento file completato",
"file-content-incorrect": "Il contenuto del file è errato",
"files-incorrect": "I file sono errati",
"selected-peer-left": "Il peer selezionato ha abbandonato",
"file-content-incorrect": "Il contenuto del file non è corretto",
"files-incorrect": "I file non sono corretti",
"selected-peer-left": "Peer selezionato ha abbandonato",
"link-received": "Link ricevuto da {{name}} - Clicca per aprire",
"online": "Sei di nuovo online",
"public-room-left": "Hai abbandonato la stanza pubblica {{publicRoomId}}",
"public-room-left": "Ha lasciato la stanza pubblica {{publicRoomId}}",
"copied-text": "Testo copiato negli appunti",
"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-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-changed-temporarily": "Il nome visualizzato è cambiato solo per questa sessione",
"copied-to-clipboard": "Copiato negli appunti",
"offline": "Sei offline",
@@ -142,14 +128,13 @@
"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 associare dispositivi",
"ios-memory-limit": "L'invio di file a dispositivi iOS è possibile solo 200 MB alla volta",
"online-requirement-pairing": "Devi essere online per abbinare dispositivi",
"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 associazione copiato negli appunti",
"pair-url-copied-to-clipboard": "Link di abbinamento copiato negli appunti",
"room-url-copied-to-clipboard": "Link della stanza copiato negli appunti"
},
"peer-ui": {
@@ -165,18 +150,14 @@
"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": "Offrimi un caffè!",
"buy-me-a-coffee_title": "Comprami un caffè!",
"github_title": "PairDrop su GitHub",
"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"
"faq_title": "Domande Frequenti"
},
"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

@@ -48,7 +48,6 @@
"pairing-cleared": "全てのデバイスのペア設定を解除しました",
"notifications-enabled": "通知が有効です",
"online-requirement-pairing": "デバイスをペア設定するにはオンラインである必要があります",
"ios-memory-limit": "iOSへのファイル送信は一度に200MBまでしかできません",
"online-requirement-public-room": "パブリックルームを作成するにはオンラインである必要があります",
"copied-text-error": "クリップボードにコピーできませんでした。手動でコピーしてください。",
"download-successful": "{{descriptor}}をダウンロードしました",
@@ -75,9 +74,9 @@
},
"instructions": {
"x-instructions_mobile": "タップしてファイルを送信または長押ししてメッセージを送信します",
"x-instructions-share-mode_desktop": "クリックして{{descriptor}}送信",
"x-instructions-share-mode_desktop": "クリックして送信",
"activate-share-mode-and-other-files-plural": "とその他{{count}}個のファイル",
"x-instructions-share-mode_mobile": "タップして{{descriptor}}送信",
"x-instructions-share-mode_mobile": "タップして送信",
"activate-share-mode-base": "他のデバイスでPairDropを開いて送信します",
"no-peers-subtitle": "デバイスをペア設定するかパブリックルームに参加すると、他のネットワーク上からも見つけられるようになります",
"activate-share-mode-shared-text": "共有されたテキスト",

View File

@@ -128,7 +128,6 @@
"pairing-cleared": "ಎಲ್ಲಾ ಸಾಧನಗಳನ್ನು ಜೋಡಿಯಾಗಿ ತೆಗೆಯಲಾಗಿದೆ",
"notifications-enabled": "ಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ",
"online-requirement-pairing": "ಸಾಧನಗಳನ್ನು ಜೋಡಿಸಲು ನೀವು ಆನ್‌ಲೈನ್‌ ಇರಬೇಕು",
"ios-memory-limit": "iOSಗೆ ಫೈಲ್‌ಗಳನ್ನು ಕಳುಹಿಸುವುದು ಒಂದೇ ಬಾರಿಗೆ 200 MB ವರೆಗೆ ಮಾತ್ರ ಸಾಧ್ಯವಾಗಿದೆ",
"online-requirement-public-room": "ಸಾರ್ವಜನಿಕ ಕೊಠಡಿಯನ್ನು ರಚಿಸಲು ನೀವು ಆನ್‌ಲೈನ್‌ ಇರಬೇಕು",
"room-url-copied-to-clipboard": "ಸಾರ್ವಜನಿಕ ಕೊಠಡಿಯ ಲಿಂಕ್ ಅನ್ನು ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಲಾಗಿದೆ",
"copied-text-error": "ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ಬರೆಯುವುದು ವಿಫಲವಾಗಿದೆ. ಕೈಯಾರೆ ನಕಲಿಸಿ!",

View File

@@ -116,7 +116,6 @@
"request-title": "{{name}} ønsker å overføre {{count}} {{descriptor}}",
"message-received": "Melding mottatt av {{name}} - Klikk for å åpne",
"files-incorrect": "Filene er uriktige",
"ios-memory-limit": "Forsendelse av filer til iOS er kun mulig opptil 200 MB av gangen",
"unfinished-transfers-warning": "Lukk med ufullførte overføringer?",
"rate-limit-join-key": "Forsøksgrense overskredet. Vent 10 sek. og prøv igjen."
},

View File

@@ -48,14 +48,10 @@
"pairing-cleared": "Alle apparaten ontkoppeld",
"notifications-enabled": "Meldingen geactiveerd",
"online-requirement-pairing": "U moet online zijn om apparaten te koppelen",
"ios-memory-limit": "Bestandsoverdrachten naar iOS kunnen slechts met 200 MB per keer",
"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",
"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."
"click-to-show": "Klik om te tonen"
},
"header": {
"cancel-share-mode": "Klaar",
@@ -69,15 +65,13 @@
"language-selector_title": "Taal Selecteren",
"about_title": "Over PairDrop",
"about_aria-label": "Open Over PairDrop",
"theme-light_title": "Altijd lichte modus gebruiken",
"expand_title": "Knoppenrij uitvouwen",
"edit-share-mode": "Bewerken"
"theme-light_title": "Altijd lichte modus gebruiken"
},
"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 {{descriptor}}",
"x-instructions-share-mode_desktop": "Klik om te verzenden",
"activate-share-mode-and-other-files-plural": "en {{count}} andere bestanden",
"x-instructions-share-mode_mobile": "Tik om te verzenden {{descriptor}}",
"x-instructions-share-mode_mobile": "Tik om te verzenden",
"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",
@@ -85,11 +79,7 @@
"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",
"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!"
"no-peers_data-drop-bg": "Loslaten om ontvanger te kiezen"
},
"peer-ui": {
"processing": "Verwerken…",
@@ -101,7 +91,7 @@
"transferring": "Overdragen…"
},
"dialogs": {
"base64-paste-to-send": "Plak klembord hier om {{type}} te versturen",
"base64-paste-to-send": "Plak 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",
@@ -117,7 +107,7 @@
"join": "Betreden",
"title-image-plural": "Afbeeldingen",
"send": "Verzenden",
"base64-tap-to-paste": "Hier tikken om {{type}} te delen",
"base64-tap-to-paste": "Hier tikken om {{type}} te plakken",
"base64-text": "tekst",
"copy": "Kopiëren",
"file-other-description-image": "en één andere afbeelding",
@@ -131,7 +121,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": "Aan:",
"send-message-to": "Verstuur een bericht naar",
"language-selector-title": "Taal Instellen",
"pair": "Koppel",
"hr-or": "OF",
@@ -147,19 +137,7 @@
"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.",
"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:"
"enter-room-id-from-another-device": "Voer de kamer ID van een ander apparaat hier in."
},
"about": {
"claim": "De makkelijkste manier om bestanden tussen apparaten te versturen",
@@ -167,11 +145,7 @@
"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",
"mastodon_title": "Schrijf over PairDrop op Mastodon",
"bluesky_title": "Volg ons op BlueSky",
"custom_title": "Volg ons",
"privacypolicy_title": "Open ons privacybeleid"
"faq_title": "Veel gestelde vragen"
},
"document-titles": {
"file-transfer-requested": "Bestandsoverdracht verzocht",

View File

@@ -1,184 +0,0 @@
{
"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": "Cancelar",
"cancel-share-mode": "Concluído",
"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 {{descriptor}}",
"x-instructions-share-mode_mobile": "Toque para enviar {{descriptor}}",
"x-instructions-share-mode_desktop": "Clique para enviar",
"x-instructions-share-mode_mobile": "Toque para enviar",
"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",
@@ -153,7 +153,6 @@
"connecting": "Conectando…",
"files-incorrect": "Os arquivos estão incorretos",
"file-transfer-completed": "Transferência de arquivo concluída",
"ios-memory-limit": "Enviar arquivos para iOS só é possível até 200 MB de uma vez",
"message-transfer-completed": "Transferência de mensagem concluída",
"unfinished-transfers-warning": "Há transferências inacabadas. Tem certeza de que deseja fechar o PairDrop?",
"rate-limit-join-key": "Limite de taxa atingido. Aguarde 10 segundos e tente novamente.",

View File

@@ -48,7 +48,6 @@
"pairing-cleared": "Toate dispozitivele sunt decuplate",
"notifications-enabled": "Notificări activate",
"online-requirement-pairing": "Trebuie să fiți online pentru a asocia dispozitivele",
"ios-memory-limit": "Trimiterea de fișiere pe iOS este posibilă doar până la 200 MB simultan",
"online-requirement-public-room": "Trebuie să fiți online pentru a crea o cameră publică",
"copied-text-error": "Scrierea în clipboard a eșuat. Copiați manual!",
"download-successful": "{{descriptor}} descărcat",

View File

@@ -11,15 +11,14 @@
"theme-dark_title": "Всегда использовать темную тему",
"theme-light_title": "Всегда использовать светлую тему",
"join-public-room_title": "Войти на время в публичную комнату",
"language-selector_title": "Выбрать язык",
"edit-share-mode": "Редактировать"
"language-selector_title": "Выбрать язык"
},
"instructions": {
"x-instructions_desktop": "Нажмите, чтобы отправить файлы, или щелкните правой кнопкой мыши, чтобы отправить сообщение",
"no-peers_data-drop-bg": "Отпустите, чтобы выбрать получателя",
"x-instructions-share-mode_desktop": "Нажмите, чтобы отправить {{descriptor}}",
"x-instructions-share-mode_desktop": "Нажмите, чтобы отправить",
"x-instructions_data-drop-bg": "Отпустите, чтобы выбрать получателя",
"x-instructions-share-mode_mobile": "Прикоснитесь, чтобы отправить {{descriptor}}",
"x-instructions-share-mode_mobile": "Прикоснитесь, чтобы отправить",
"x-instructions_data-drop-peer": "Отпустите, чтобы послать узлу",
"x-instructions_mobile": "Прикоснитесь коротко, чтобы отправить файлы, или долго, чтобы отправить сообщение",
"no-peers-title": "Откройте PairDrop на других устройствах, чтобы отправить файлы",
@@ -122,7 +121,6 @@
"online-requirement": "Для сопряжения устройств вам нужно быть в сети.",
"files-incorrect": "Файлы неверны",
"message-transfer-completed": "Передача сообщения завершена",
"ios-memory-limit": "Отправка файлов на iOS устройства возможна только до 200 МБ за один раз",
"selected-peer-left": "Выбранный узел вышел",
"request-title": "{{name}} хотел бы передать {{count}} {{descriptor}}",
"rate-limit-join-key": "Достигнут предел скорости. Подождите 10 секунд и повторите попытку.",

View File

@@ -145,7 +145,6 @@
"pairing-cleared": "Tüm cihazlar eşleştirmeden çıkarı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!",

View File

@@ -154,7 +154,6 @@
"files-incorrect": "文件不正确",
"file-transfer-completed": "文件传输已完成",
"connecting": "连接中…",
"ios-memory-limit": "向 iOS 发送文件 一次最多只能发送 200 MB",
"rate-limit-join-key": "已达连接限制。请等待 10秒 后再试。",
"public-room-left": "已退出公共房间 {{publicRoomId}}",
"copied-to-clipboard-error": "无法复制。请手动复制。",

View File

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

View File

@@ -1,184 +0,0 @@
{
"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": "若要驗證端對端加密的安全性,請在兩台裝置上比較此安全編號"
}
}

View File

@@ -10,7 +10,7 @@ class BrowserTabsConnector {
}
_onMessage(e) {
console.log('Broadcast:', e.data)
Logger.debug('Broadcast:', e.data)
switch (e.data.type) {
case 'self-display-name-changed':
Events.fire('self-display-name-changed', e.data.detail);

View File

@@ -3,7 +3,7 @@ class Localization {
Localization.$htmlRoot = document.querySelector('html');
Localization.defaultLocale = "en";
Localization.supportedLocales = ["ar", "ca", "de", "en", "es", "fr", "hu", "id", "it", "ja", "kn", "nb", "nl", "pl", "pt-BR", "ro", "ru", "tr", "zh-CN", "zh-TW"];
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.translations = {};
@@ -67,7 +67,7 @@ class Localization {
Localization.$htmlRoot.setAttribute('lang', locale);
console.log("Page successfully translated",
Logger.debug("Page successfully translated",
`System language: ${Localization.systemLocale}`,
`Selected language: ${locale}`
);
@@ -145,7 +145,7 @@ class Localization {
translation = translationObj[lastKey];
} catch (e) {
console.error(e);
Logger.error(e);
}
if (!translation) {
@@ -179,7 +179,7 @@ class Localization {
}
catch (e) {
// Log warnings and help calls
console.warn(e);
Logger.warn(e);
Localization.logTranslationMissingOrBroken(key, attr, data, useDefault);
Localization.logHelpCallKey(key, attr);
Localization.logHelpCall();
@@ -192,7 +192,7 @@ class Localization {
else {
// Is not default locale yet
// Get translation for default language with same arguments
console.log(`Using default language ${Localization.defaultLocale.toUpperCase()} instead.`);
Logger.debug(`Using default language ${Localization.defaultLocale.toUpperCase()} instead.`);
translation = this.getTranslation(key, attr, data, true);
}
}
@@ -205,11 +205,11 @@ class Localization {
? Localization.defaultLocale.toUpperCase()
: Localization.locale.toUpperCase();
console.warn(`Missing or broken translation for language ${usedLocale}.\n`, 'key:', key, 'attr:', attr, 'data:', data);
Logger.warn(`Missing or broken translation for language ${usedLocale}.\n`, 'key:', key, 'attr:', attr, 'data:', data);
}
static logHelpCall() {
console.log("Help translating PairDrop: https://hosted.weblate.org/engage/pairdrop/");
Logger.warn("Help translating PairDrop: https://hosted.weblate.org/engage/pairdrop/");
}
static logHelpCallKey(key, attr) {
@@ -219,7 +219,7 @@ class Localization {
? key
: `${key}_${attr}`;
console.warn(`Translate this string here: https://hosted.weblate.org/browse/pairdrop/pairdrop-spa/${locale}/?q=${keyComplete}`);
Logger.warn(`Translate this string here: https://hosted.weblate.org/browse/pairdrop/pairdrop-spa/${locale}/?q=${keyComplete}`);
}
static escapeHTML(unsafeText) {

View File

@@ -1,3 +1,23 @@
class Logger {
static debug(message, ...optionalParams) {
if (window.debugMode) {
console.debug("DEBUG:", message, ...optionalParams);
}
}
static log(message, ...optionalParams) {
console.log("LOG:", message, ...optionalParams);
}
static warn(message, ...optionalParams) {
console.warn("WARN:", message, ...optionalParams);
}
static error(message, ...optionalParams) {
console.error("ERROR:", message, ...optionalParams);
}
}
class PairDrop {
constructor() {
@@ -34,14 +54,14 @@ class PairDrop {
this.initialize()
.then(_ => {
console.log("Initialization completed.");
Logger.log("Initialization completed.");
});
}
async initialize() {
// Translate page before fading in
await this.localization.setInitialTranslation()
console.log("Initial translation successful.");
Logger.log("Initial translation successful.");
// Show "Loading..." until connected to WsServer
await this.footerUI.showLoading();
@@ -56,16 +76,16 @@ class PairDrop {
await this.backgroundCanvas.fadeIn();
// Load deferred assets
console.log("Load deferred assets...");
Logger.log("Load deferred assets...");
await this.loadDeferredAssets();
console.log("Loading of deferred assets completed.");
Logger.log("Loading of deferred assets completed.");
console.log("Hydrate UI...");
Logger.log("Hydrate UI...");
await this.hydrate();
console.log("UI hydrated.");
Logger.log("UI hydrated.");
// Evaluate url params as soon as ws is connected
console.log("Evaluate URL params as soon as websocket connection is established.");
Logger.log("Evaluate URL params as soon as websocket connection is established.");
Events.on('ws-connected', _ => this.evaluateUrlParams(), {once: true});
}
@@ -74,7 +94,7 @@ class PairDrop {
navigator.serviceWorker
.register('service-worker.js')
.then(serviceWorker => {
console.log('Service Worker registered');
Logger.log('Service Worker registered');
window.serviceWorker = serviceWorker
});
}
@@ -133,10 +153,10 @@ class PairDrop {
return new Promise( async (resolve) => {
try {
await this.loadStyleSheet(url);
console.log(`Stylesheet loaded successfully: ${url}`);
Logger.log(`Stylesheet loaded successfully: ${url}`);
resolve();
} catch (error) {
console.error('Error loading stylesheet:', error);
Logger.error('Error loading stylesheet:', error);
}
});
}
@@ -156,10 +176,10 @@ class PairDrop {
return new Promise( async (resolve) => {
try {
await this.loadScript(url);
console.log(`Script loaded successfully: ${url}`);
Logger.log(`Script loaded successfully: ${url}`);
resolve();
} catch (error) {
console.error('Error loading script:', error);
Logger.error('Error loading script:', error);
}
});
}
@@ -229,12 +249,17 @@ class PairDrop {
this.publicRoomDialog._createPublicRoom();
}
}
else if (urlParams.has("debug") && urlParams.get("debug") === "true") {
window.debugMode = true;
}
// remove url params from url
const urlWithoutParams = getUrlWithoutArguments();
window.history.replaceState({}, "Rewrite URL", urlWithoutParams);
if (!window.debugMode) {
// remove url params from url
const urlWithoutParams = getUrlWithoutArguments();
window.history.replaceState({}, "Rewrite URL", urlWithoutParams);
}
console.log("URL params evaluated.");
Logger.log("URL params evaluated.");
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -7,19 +7,18 @@ class PersistentStorage {
const DBOpenRequest = window.indexedDB.open('pairdrop_store', 5);
DBOpenRequest.onerror = e => {
PersistentStorage.logBrowserNotCapable();
console.log('Error initializing database: ');
console.log(e)
Logger.error('Error initializing database:', e);
};
DBOpenRequest.onsuccess = _ => {
console.log('Database initialised.');
Logger.debug('Database initialised.');
};
DBOpenRequest.onupgradeneeded = async e => {
const db = e.target.result;
const txn = e.target.transaction;
db.onerror = e => console.log('Error loading database: ' + e);
db.onerror = e => Logger.error('Error loading database:', e);
console.log(`Upgrading IndexedDB database from version ${e.oldVersion} to version ${e.newVersion}`);
Logger.debug(`Upgrading IndexedDB database from version ${e.oldVersion} to version ${e.newVersion}`);
if (e.oldVersion === 0) {
// initiate v1
@@ -54,7 +53,7 @@ class PersistentStorage {
}
static logBrowserNotCapable() {
console.log("This browser does not support IndexedDB. Paired devices will be gone after the browser is closed.");
Logger.log("This browser does not support IndexedDB. Paired devices will be gone after the browser is closed.");
}
static set(key, value) {
@@ -66,7 +65,7 @@ class PersistentStorage {
const objectStore = transaction.objectStore('keyval');
const objectStoreRequest = objectStore.put(value, key);
objectStoreRequest.onsuccess = _ => {
console.log(`Request successful. Added key-pair: ${key} - ${value}`);
Logger.debug(`Request successful. Added key-pair: ${key} - ${value}`);
resolve(value);
};
}
@@ -85,7 +84,7 @@ class PersistentStorage {
const objectStore = transaction.objectStore('keyval');
const objectStoreRequest = objectStore.get(key);
objectStoreRequest.onsuccess = _ => {
console.log(`Request successful. Retrieved key-pair: ${key} - ${objectStoreRequest.result}`);
Logger.debug(`Request successful. Retrieved key-pair: ${key} - ${objectStoreRequest.result}`);
resolve(objectStoreRequest.result);
}
}
@@ -104,7 +103,7 @@ class PersistentStorage {
const objectStore = transaction.objectStore('keyval');
const objectStoreRequest = objectStore.delete(key);
objectStoreRequest.onsuccess = _ => {
console.log(`Request successful. Deleted key: ${key}`);
Logger.debug(`Request successful. Deleted key: ${key}`);
resolve();
};
}
@@ -128,7 +127,7 @@ class PersistentStorage {
'auto_accept': false
});
objectStoreRequest.onsuccess = e => {
console.log(`Request successful. RoomSecret added: ${e.target.result}`);
Logger.debug(`Request successful. RoomSecret added: ${e.target.result}`);
resolve();
}
}
@@ -145,7 +144,7 @@ class PersistentStorage {
for (let i = 0; i < roomSecrets.length; i++) {
secrets.push(roomSecrets[i].secret);
}
console.log(`Request successful. Retrieved ${secrets.length} room_secrets`);
Logger.debug(`Request successful. Retrieved ${secrets.length} room_secrets`);
return(secrets);
} catch (e) {
this.logBrowserNotCapable();
@@ -182,13 +181,13 @@ class PersistentStorage {
objectStoreRequestKey.onsuccess = e => {
const key = e.target.result;
if (!key) {
console.log(`Nothing to retrieve. Entry for room_secret not existing: ${roomSecret}`);
Logger.debug(`Nothing to retrieve. Entry for room_secret not existing: ${roomSecret}`);
resolve();
return;
}
const objectStoreRequestRetrieval = objectStore.get(key);
objectStoreRequestRetrieval.onsuccess = e => {
console.log(`Request successful. Retrieved entry for room_secret: ${key}`);
Logger.debug(`Request successful. Retrieved entry for room_secret: ${key}`);
resolve({
"entry": e.target.result,
"key": key
@@ -215,14 +214,14 @@ class PersistentStorage {
const objectStoreRequestKey = objectStore.index("secret").getKey(roomSecret);
objectStoreRequestKey.onsuccess = e => {
if (!e.target.result) {
console.log(`Nothing to delete. room_secret not existing: ${roomSecret}`);
Logger.debug(`Nothing to delete. room_secret not existing: ${roomSecret}`);
resolve();
return;
}
const key = e.target.result;
const objectStoreRequestDeletion = objectStore.delete(key);
objectStoreRequestDeletion.onsuccess = _ => {
console.log(`Request successful. Deleted room_secret: ${key}`);
Logger.debug(`Request successful. Deleted room_secret: ${key}`);
resolve(roomSecret);
}
objectStoreRequestDeletion.onerror = e => {
@@ -245,7 +244,7 @@ class PersistentStorage {
const objectStore = transaction.objectStore('room_secrets');
const objectStoreRequest = objectStore.clear();
objectStoreRequest.onsuccess = _ => {
console.log('Request successful. All room_secrets cleared');
Logger.debug('Request successful. All room_secrets cleared');
resolve();
};
}
@@ -255,15 +254,15 @@ class PersistentStorage {
})
}
static updateRoomSecretNames(roomSecret, displayName, deviceName) {
return this.updateRoomSecret(roomSecret, undefined, displayName, deviceName);
static updateRoomSecretDisplayName(roomSecret, displayName) {
return this.updateRoomSecret(roomSecret, null, displayName, null);
}
static updateRoomSecretAutoAccept(roomSecret, autoAccept) {
return this.updateRoomSecret(roomSecret, undefined, undefined, undefined, autoAccept);
return this.updateRoomSecret(roomSecret, null, null, null, autoAccept);
}
static updateRoomSecret(roomSecret, updatedRoomSecret = undefined, updatedDisplayName = undefined, updatedDeviceName = undefined, updatedAutoAccept = undefined) {
static updateRoomSecret(roomSecret, updatedRoomSecret = null, updatedDisplayName = null, updatedDeviceName = null, updatedAutoAccept = null) {
return new Promise((resolve, reject) => {
const DBOpenRequest = window.indexedDB.open('pairdrop_store');
DBOpenRequest.onsuccess = e => {
@@ -278,16 +277,16 @@ class PersistentStorage {
const objectStore = transaction.objectStore('room_secrets');
// Do not use `updatedRoomSecret ?? roomSecretEntry.entry.secret` to ensure compatibility with older browsers
const updatedRoomSecretEntry = {
'secret': updatedRoomSecret !== undefined ? updatedRoomSecret : roomSecretEntry.entry.secret,
'display_name': updatedDisplayName !== undefined ? updatedDisplayName : roomSecretEntry.entry.display_name,
'device_name': updatedDeviceName !== undefined ? updatedDeviceName : roomSecretEntry.entry.device_name,
'auto_accept': updatedAutoAccept !== undefined ? updatedAutoAccept : roomSecretEntry.entry.auto_accept
'secret': updatedRoomSecret !== null ? updatedRoomSecret : roomSecretEntry.entry.secret,
'display_name': updatedDisplayName !== null ? updatedDisplayName : roomSecretEntry.entry.display_name,
'device_name': updatedDeviceName !== null ? updatedDeviceName : roomSecretEntry.entry.device_name,
'auto_accept': updatedAutoAccept !== null ? updatedAutoAccept : roomSecretEntry.entry.auto_accept
};
const objectStoreRequestUpdate = objectStore.put(updatedRoomSecretEntry, roomSecretEntry.key);
objectStoreRequestUpdate.onsuccess = e => {
console.log(`Request successful. Updated room_secret: ${roomSecretEntry.key}`);
Logger.debug(`Request successful. Updated room_secret: ${roomSecretEntry.key}`);
resolve({
"entry": updatedRoomSecretEntry,
"key": roomSecretEntry.key

View File

@@ -0,0 +1,79 @@
self.addEventListener('message', async e => {
try {
switch (e.data.type) {
case "check-support":
await checkSupport();
break;
case "part":
await onPart(e.data.name, e.data.buffer, e.data.offset);
break;
case "get-file":
await onGetFile(e.data.name);
break;
case "delete-file":
await onDeleteFile(e.data.name);
break;
}
}
catch (e) {
self.postMessage({type: "error", error: e});
}
})
async function checkSupport() {
try {
await getAccessHandle("test.txt");
self.postMessage({type: "support", supported: true});
}
catch (e) {
self.postMessage({type: "support", supported: false});
}
}
async function getFileHandle(fileName) {
const root = await navigator.storage.getDirectory();
return await root.getFileHandle(fileName, {create: true});
}
async function getAccessHandle(fileName) {
const fileHandle = await getFileHandle(fileName);
// Create FileSystemSyncAccessHandle on the file.
return await fileHandle.createSyncAccessHandle();
}
async function onPart(fileName, buffer, offset) {
const accessHandle = await getAccessHandle(fileName);
// Write the message to the end of the file.
let encodedMessage = new DataView(buffer);
accessHandle.write(encodedMessage, { at: offset });
// Always close FileSystemSyncAccessHandle if done.
accessHandle.close(); accessHandle.close();
self.postMessage({type: "part", part: encodedMessage});
encodedMessage = null;
}
async function onGetFile(fileName) {
const fileHandle = await getFileHandle(fileName);
let file = await fileHandle.getFile();
self.postMessage({type: "file", file: file});
}
async function onDeleteFile(fileName) {
const accessHandle = await getAccessHandle(fileName);
// Truncate the file to 0 bytes
accessHandle.truncate(0);
// Persist changes to disk.
accessHandle.flush();
// Always close FileSystemSyncAccessHandle if done.
accessHandle.close();
self.postMessage({type: "file-deleted"});
}

View File

@@ -238,7 +238,7 @@ class FooterUI {
if (!displayName) return;
console.log("Retrieved edited display name:", displayName)
Logger.debug("Retrieved edited display name:", displayName)
Events.fire('self-display-name-changed', displayName);
}
@@ -275,7 +275,7 @@ class FooterUI {
Events.fire('notify-user', Localization.getTranslation("notifications.display-name-changed-permanently"));
})
.catch(_ => {
console.log("This browser does not support IndexedDB. Use localStorage instead.");
Logger.debug("This browser does not support IndexedDB. Use localStorage instead.");
localStorage.setItem('edited_display_name', newDisplayName);
Events.fire('notify-user', Localization.getTranslation("notifications.display-name-changed-temporarily"));
})
@@ -287,7 +287,7 @@ class FooterUI {
else {
PersistentStorage.delete('edited_display_name')
.catch(_ => {
console.log("This browser does not support IndexedDB. Use localStorage instead.")
Logger.debug("This browser does not support IndexedDB. Use localStorage instead.")
localStorage.removeItem('edited_display_name');
})
.finally(() => {

File diff suppressed because it is too large Load Diff

View File

@@ -62,41 +62,67 @@ window.isMobile = window.iOS || window.android;
// Helper functions
const audioPlayer = (() => {
const blop = document.getElementById('blop');
blop.addEventListener('ended', _ => {
blop.muted = true
});
return {
playBlop() {
if (window.isMobile) return;
blop.muted = false;
blop.play();
}
}
})();
const zipper = (() => {
let zipWriter;
return {
createNewZipWriter() {
zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"), { bufferedWrite: true, level: 0 });
},
addFile(file, options) {
return zipWriter.add(file.name, new zip.BlobReader(file), options);
},
async getBlobURL() {
if (zipWriter) {
const blobURL = URL.createObjectURL(await zipWriter.close());
zipWriter = null;
return blobURL;
async getObjectUrlOfZipFile(files, onZipProgressCallback){
try {
const zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"));
let bytesProcessed = 0;
for (let i = 0; i < files.length; i++) {
await zipWriter.add(
files[i].name,
new zip.BlobReader(files[i]),
{
onprogress: (progress) => onZipProgressCallback(bytesProcessed + progress)
}
);
bytesProcessed += files[i].size;
}
return URL.createObjectURL(await zipWriter.close());
}
else {
throw new Error("Zip file closed");
}
},
async getZipFile(filename = "archive.zip") {
if (zipWriter) {
const file = new File([await zipWriter.close()], filename, {type: "application/zip"});
zipWriter = null;
return file;
}
else {
throw new Error("Zip file closed");
catch (e) {
Logger.error(e);
return false;
}
},
async getEntries(file, options) {
return await (new zip.ZipReader(new zip.BlobReader(file))).getEntries(options);
try {
return await (new zip.ZipReader(new zip.BlobReader(file))).getEntries(options);
}
catch (e) {
Logger.error(e);
return false;
}
},
async getData(entry, options) {
return await entry.getData(new zip.BlobWriter(), options);
try {
return await entry.getData(new zip.BlobWriter(), options);
}
catch (e) {
Logger.error(e);
return false;
}
},
};
@@ -521,7 +547,7 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual
let dataUrl = canvas.toDataURL("image/jpeg", quality);
resolve(dataUrl);
} catch (e) {
console.error(e);
Logger.error(e);
reject(new Error(`Could not create an image thumbnail from type ${file.type}`));
}
})

View File

@@ -1,4 +1,4 @@
const cacheVersion = 'v1.10.8';
const cacheVersion = 'v1.10.6';
const cacheTitle = `pairdrop-cache-${cacheVersion}`;
const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions
const relativePathsToCache = [
@@ -32,20 +32,17 @@ const relativePathsToCache = [
'lang/en.json',
'lang/es.json',
'lang/fr.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/zh-TW.json'
'lang/zh-CN.json'
];
const relativePathsNotToCache = [
'config'

View File

@@ -12,6 +12,7 @@
display: block;
overflow: auto;
resize: none;
line-height: 16px;
max-height: 350px;
word-break: break-word;
word-wrap: anywhere;
@@ -104,6 +105,8 @@ x-peer {
padding: 8px;
align-content: start;
flex-wrap: wrap;
transition: transform 150ms;
will-change: transform;
}
x-peer input[type="file"] {
@@ -121,8 +124,6 @@ x-peer label {
x-peer x-icon {
--icon-size: 40px;
margin-bottom: 4px;
transition: transform 150ms;
will-change: transform;
display: flex;
flex-direction: column;
}
@@ -148,7 +149,7 @@ x-peer:not(.type-ip):not(.type-secret).type-public-id .icon-wrapper {
.highlight-wrapper {
align-self: center;
align-items: center;
margin: 7px auto 0;
margin: 10px auto 0;
height: 6px;
}
@@ -187,14 +188,16 @@ x-peer:not(.type-public-id) .highlight-room-public-id {
display: none;
}
x-peer:not([status]):hover x-icon,
x-peer:not([status]):focus x-icon {
x-peer:is(:not([status]), [status$=-complete], [status=error]):hover,
x-peer:is(:not([status]), [status$=-complete], [status=error]):focus {
transform: scale(1.05);
}
x-peer[status] x-icon {
x-peer[status]:not([status$=-complete]) x-icon {
box-shadow: none;
opacity: 0.8;
}
x-peer[status] {
transform: scale(1);
}
@@ -237,7 +240,7 @@ x-peer.ws-peer .highlight-wrapper {
.status,
.device-name {
opacity: 0.7;
color: color-mix(in srgb, rgb(var(--text-color)) 30%, grey);
white-space: nowrap;
}
@@ -246,14 +249,22 @@ x-peer[status] .device-name {
display: none;
}
x-peer[status] {
x-peer[status]:not([status$=-complete]):not([status=error]) {
pointer-events: none;
}
x-peer x-icon {
x-peer {
animation: pop 600ms ease-out 1;
}
x-peer[status$=-complete] .status {
color: var(--primary-color);
}
x-peer[status=error] .status {
color: var(--error-color);
}
@keyframes pop {
0% {
transform: scale(0.7);
@@ -744,7 +755,6 @@ x-dialog .dialog-subheader {
top: -8px;
clip: rect(0px, 80px, 80px, 40px);
--progress: rotate(0deg);
transition: transform 200ms;
}
.circle {
@@ -758,6 +768,10 @@ x-dialog .dialog-subheader {
transform: var(--progress);
}
.animate .circle {
transition: transform 200ms;
}
.over50 {
clip: rect(auto, auto, auto, auto);
}

View File

@@ -626,15 +626,12 @@ 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;
@@ -924,6 +921,7 @@ x-peers:empty~x-instructions {
body {
/* Constant colors */
--primary-color: #4285f4;
--error-color: #ff6b6b;
--paired-device-color: #00a69c;
--public-room-color: #ed9d01;
--accent-color: var(--primary-color);

View File

@@ -89,22 +89,12 @@ export default class PairDropWsServer {
this._onLeavePublicRoom(sender);
break;
case 'signal':
this._signalAndRelay(sender, message);
this._signalAndWsRelay(sender, message);
break;
case 'request':
case 'header':
case 'partition':
case 'partition-received':
case 'progress':
case 'files-transfer-response':
case 'file-transfer-complete':
case 'message-transfer-complete':
case 'text':
case 'display-name-changed':
case 'ws-chunk':
case 'ws-relay':
// relay ws-fallback
if (this._conf.wsFallback) {
this._signalAndRelay(sender, message);
this._signalAndWsRelay(sender, message);
}
else {
console.log("Websocket fallback is not activated on this instance.")
@@ -112,7 +102,7 @@ export default class PairDropWsServer {
}
}
_signalAndRelay(sender, message) {
_signalAndWsRelay(sender, message) {
const room = message.roomType === 'ip'
? sender.ip
: message.roomId;