mirror of
https://github.com/schlagmichdoch/PairDrop.git
synced 2026-04-06 09:53:49 +00:00
Compare commits
92 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80a5c0efdb | ||
|
|
a9d1273b3c | ||
|
|
c8484ab104 | ||
|
|
05827b12ca | ||
|
|
1256dcdcbd | ||
|
|
5e79ef0d9f | ||
|
|
add361c284 | ||
|
|
fd0c32faad | ||
|
|
f0cfb4833d | ||
|
|
46b6b38ad5 | ||
|
|
3cc2ab99b5 | ||
|
|
61861df99e | ||
|
|
6330f09486 | ||
|
|
e07255398f | ||
|
|
cce97a6496 | ||
|
|
9c98bc3e9b | ||
|
|
63717aae82 | ||
|
|
08aa1e62a4 | ||
|
|
828caa4226 | ||
|
|
35f47d9063 | ||
|
|
6ca37bd390 | ||
|
|
be46e7d4af | ||
|
|
3c1bc9f82f | ||
|
|
892e84c834 | ||
|
|
d6287c4cf0 | ||
|
|
c83e55b448 | ||
|
|
49160f9b02 | ||
|
|
7be2830a08 | ||
|
|
1f3dd080a0 | ||
|
|
5d709966af | ||
|
|
99b0c6ff01 | ||
|
|
76e08927de | ||
|
|
9118b0ae06 | ||
|
|
b36105b1cf | ||
|
|
ad4f727d19 | ||
|
|
3fa0873bc4 | ||
|
|
a03482bc7f | ||
|
|
40aa46fdd9 | ||
|
|
9003094e49 | ||
|
|
0459a361c3 | ||
|
|
10a669d7c6 | ||
|
|
3fbca72d74 | ||
|
|
f048c4f1bd | ||
|
|
6c1672ba25 | ||
|
|
caf19bdb45 | ||
|
|
5dcda58ce5 | ||
|
|
59360fb047 | ||
|
|
2e15a018da | ||
|
|
041261be2a | ||
|
|
f152645452 | ||
|
|
a7f5d336c3 | ||
|
|
c9e4510f65 | ||
|
|
70f74923e6 | ||
|
|
6217042f12 | ||
|
|
4659ef2041 | ||
|
|
a21881b7ca | ||
|
|
f589e9471e | ||
|
|
067117159a | ||
|
|
d901ca031a | ||
|
|
21fa6f07d8 | ||
|
|
f49b800f9e | ||
|
|
1a9fa8e60a | ||
|
|
79cc8e5590 | ||
|
|
89addd6649 | ||
|
|
ff883fb994 | ||
|
|
ccb2170287 | ||
|
|
3454eebf37 | ||
|
|
b6203288bf | ||
|
|
bea0fa5b9c | ||
|
|
48090ec41c | ||
|
|
229084fab3 | ||
|
|
d58f380565 | ||
|
|
676c68b6e7 | ||
|
|
dd0dc21db5 | ||
|
|
4e72339479 | ||
|
|
c3e92d7d4c | ||
|
|
b90924af68 | ||
|
|
4f80ab4401 | ||
|
|
f299c90f47 | ||
|
|
6737dcacf7 | ||
|
|
5d39bf4a76 | ||
|
|
5c70c873ab | ||
|
|
b336c75b72 | ||
|
|
b3f5619f2d | ||
|
|
939ca3d35d | ||
|
|
c2ee459231 | ||
|
|
c08b324d6a | ||
|
|
d3a623d352 | ||
|
|
d8f9532039 | ||
|
|
9847feeb52 | ||
|
|
4a5a2ceb67 | ||
|
|
214d557feb |
4
.github/ISSUE_TEMPLATE/bug-report.md
vendored
4
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -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.1
|
||||
Version: v1.10.8
|
||||
|
||||
**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.1
|
||||
Version: v1.10.8
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
5
.github/workflows/zip-release.yml
vendored
5
.github/workflows/zip-release.yml
vendored
@@ -26,12 +26,11 @@ jobs:
|
||||
- name: Archive Release
|
||||
uses: thedoctor0/zip-release@b57d897cb5d60cb78b51a507f63fa184cfe35554 # v0.7.6
|
||||
with:
|
||||
type: 'zip'
|
||||
filename: 'pairdrop-cli.zip'
|
||||
path: 'pairdrop-cli'
|
||||
directory: 'pairdrop-cli'
|
||||
exclusions: '*.git* /*node_modules/* .editorconfig'
|
||||
- name: Upload Release
|
||||
uses: ncipollo/release-action@6c75be85e571768fa31b40abf38de58ba0397db5 # v1.13.0
|
||||
with:
|
||||
artifacts: "pairdrop-cli.zip"
|
||||
artifacts: "pairdrop-cli/pairdrop-cli.zip"
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
179
README.md
179
README.md
@@ -3,133 +3,126 @@
|
||||
<img src="public/images/android-chrome-512x512.png" alt="Logo" width="150" height="150">
|
||||
</a>
|
||||
|
||||
<h1>PairDrop</h1>
|
||||
# _Send it_, with [PairDrop](https://pairdrop.net)
|
||||
|
||||
<p>
|
||||
Local file sharing in your browser. Inspired by Apple's AirDrop.
|
||||
<br />
|
||||
<a href="https://pairdrop.net"><strong>Explore »</strong></a>
|
||||
Local file sharing <a href="https://pairdrop.net"><strong>in your web browser</strong></a>.
|
||||
<br />
|
||||
<br />
|
||||
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Report Bug</a>
|
||||
·
|
||||
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Request Feature</a>
|
||||
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Report a bug</a>
|
||||
<br />
|
||||
<a href="https://github.com/schlagmichdoch/PairDrop/issues">Request feature</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
## Features
|
||||
[PairDrop](https://pairdrop.net) is a sublime alternative to AirDrop that works on all platforms.
|
||||
File sharing on your local network that works on all platforms.
|
||||
|
||||
- File Sharing on your local network
|
||||
- Send images, documents or text via peer to peer connection to devices on the same local network.
|
||||
- Internet Transfers
|
||||
- Join temporary public rooms to transfer files easily over the internet!
|
||||
- Web-Application
|
||||
- As it is web based, it runs on all devices.
|
||||
- A multi-platform AirDrop-like solution that works.
|
||||
- Send images, documents or text via peer-to-peer connection to devices on the same local network.
|
||||
- Internet transfers
|
||||
- Join temporary public rooms to transfer files easily over the Internet.
|
||||
- Web-app
|
||||
- Works on all devices with a modern web-browser.
|
||||
|
||||
Send a file from your phone to your laptop?
|
||||
<br>Share photos in original quality with friends using Android and iOS?
|
||||
<br>Share private files peer-to-peer between Linux systems?
|
||||
|
||||
You want to quickly send a file from your phone to your laptop?
|
||||
<br>You want to share photos in original quality with friends that use a mixture of Android and iOS?
|
||||
<br>You want to share private files peer to peer between Linux systems?
|
||||
<br>AirDrop is unreliable again?
|
||||
<br>_Send it with PairDrop!_
|
||||
<img src="docs/pairdrop_screenshot_mobile.gif" alt="Screenshot GIF showing PairDrop in use" style="width: 300px">
|
||||
|
||||
Developed based on [Snapdrop](https://github.com/RobinLinus/snapdrop)
|
||||
## Differences to the [Snapdrop](https://github.com/RobinLinus/snapdrop) it is based on
|
||||
<details><summary>List view</summary>
|
||||
|
||||
## Differences to Snapdrop
|
||||
<details><summary>Click to expand</summary>
|
||||
|
||||
### Paired Devices and Public Rooms - Internet Transfer
|
||||
* Transfer files over the internet between paired devices or by entering temporary public rooms.
|
||||
* Connect to devices in complex network environments (public Wi-Fi, company network, Apple Private Relay, VPN etc.).
|
||||
### Paired Devices and Public Rooms — Internet Transfer
|
||||
* Transfer files over the Internet between paired devices or by entering temporary public rooms.
|
||||
* Connect to devices in complex network environments (public Wi-Fi, company network, iCloud Private Relay, VPN, etc.).
|
||||
* Connect to devices on your mobile hotspot.
|
||||
* Devices outside your local network that are behind a NAT are connected automatically via the PairDrop TURN server.
|
||||
* Connect to devices on your mobile hotspot.
|
||||
* You will always discover devices on your local network. Paired devices and devices in the same public room are shown additionally.
|
||||
* Devices outside of your local network that are behind a NAT are auto-connected via the PairDrop TURN server.
|
||||
* Devices from the local network, in the same public room, or previously paired are shown.
|
||||
|
||||
#### Persistent Device Pairing
|
||||
* Pair your devices via a 6-digit code or a QR-Code.
|
||||
* Paired devices will always find each other via shared secrets independently of their local network.
|
||||
* Paired devices are persistent. You find your devices even after reopening PairDrop.
|
||||
* You can edit and unpair devices easily
|
||||
* Ideal to always connect easily to your own devices
|
||||
|
||||
Always connect to known devices
|
||||
|
||||
* Pair devices via a 6-digit code or a QR-Code.
|
||||
* Paired devices always find each other via shared secrets independently of their local network.
|
||||
* Pairing is persistent. You find your devices even after reopening PairDrop.
|
||||
* You can edit and unpair devices easily.
|
||||
|
||||
#### Temporary Public Rooms
|
||||
* Enter a public room via a 5-letter code or a QR-Code.
|
||||
* Enter a public room to temporarily connect to devices outside your local network.
|
||||
* All devices in the same public room see each other mutually.
|
||||
* Public rooms are temporary. Public rooms are left as soon as PairDrop is closed.
|
||||
* Ideal to connect easily to others in complex network situations or over the internet.
|
||||
|
||||
### [Improved UI for sending/receiving files](https://github.com/RobinLinus/snapdrop/issues/560)
|
||||
* Files are transferred only after a request is accepted first. On transfer completion files are downloaded automatically if possible.
|
||||
Connect to others in complex network situations, or over the Internet.
|
||||
|
||||
* Enter a public room via a 5-letter code or a QR-code.
|
||||
* Enter a public room to temporarily connect to devices outside your local network.
|
||||
* All devices in the same public room see each other.
|
||||
* Public rooms are temporary. Closing PairDrop leaves all rooms.
|
||||
|
||||
### [Improved UI for Sending/Receiving Files](https://github.com/RobinLinus/snapdrop/issues/560)
|
||||
* Files are transferred after a request is accepted. Files are auto-downloaded upon completing a transfer, if possible.
|
||||
* Multiple files are downloaded as a ZIP file
|
||||
* On iOS and Android, in addition to downloading, files can be shared or saved to the gallery via the Share menu.
|
||||
* Multiple files are transferred at once with an overall progress indicator
|
||||
* Download, share or save to gallery via the "Share" menu on Android and iOS.
|
||||
* Multiple files are transferred at once with an overall progress indicator.
|
||||
|
||||
### Send Files or Text Directly From Share Menu, Context Menu or CLI
|
||||
* [Send files directly from context menu on Windows](docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-windows)
|
||||
* [Send files directly from context menu on Ubuntu (using Nautilus)](/docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-ubuntu-using-nautilus)
|
||||
* [Send files directly from share menu on iOS](docs/how-to.md#send-directly-from-share-menu-on-ios)
|
||||
* [Send files directly from share menu on Android](docs/how-to.md#send-directly-from-share-menu-on-android)
|
||||
* [Send files directly via command-line interface](docs/how-to.md#send-directly-via-command-line-interface)
|
||||
* [Send files directly from context menu on Ubuntu (using Nautilus)](docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-ubuntu-using-nautilus)
|
||||
* [Send files directly from the context menu on Windows](docs/how-to.md#send-files-directly-from-context-menu-on-windows)
|
||||
* [Send directly from the "Share" menu on iOS](docs/how-to.md#send-directly-from-share-menu-on-ios)
|
||||
* [Send directly from the "Share" menu on Android](docs/how-to.md#send-directly-from-share-menu-on-android)
|
||||
* [Send directly via the command-line interface](docs/how-to.md#send-directly-via-command-line-interface)
|
||||
|
||||
### Other changes
|
||||
* Change your display name permanently to easily differentiate your devices
|
||||
* [Paste files/text and choose the recipient afterwords ](https://github.com/RobinLinus/snapdrop/pull/534)
|
||||
### Other Changes
|
||||
* Change your display name to easily differentiate your devices.
|
||||
* [Paste files/text and choose the recipient afterwards ](https://github.com/RobinLinus/snapdrop/pull/534)
|
||||
* [Prevent devices from sleeping on file transfer](https://github.com/RobinLinus/snapdrop/pull/413)
|
||||
* Warn user before PairDrop is closed on file transfer
|
||||
* Open PairDrop on multiple tabs simultaneously (Thanks [@willstott101](https://github.com/willstott101))
|
||||
* [Video and Audio preview](https://github.com/RobinLinus/snapdrop/pull/455) (Thanks [@victorwads](https://github.com/victorwads))
|
||||
* Switch theme back to auto/system after darkmode or lightmode is enabled
|
||||
* [Video and audio preview](https://github.com/RobinLinus/snapdrop/pull/455) (Thanks [@victorwads](https://github.com/victorwads))
|
||||
* Switch theme back to auto/system after dark or light mode is on
|
||||
* Node-only implementation (Thanks [@Bellisario](https://github.com/Bellisario))
|
||||
* Automatic restart on error (Thanks [@KaKi87](https://github.com/KaKi87))
|
||||
* Auto-restart on error (Thanks [@KaKi87](https://github.com/KaKi87))
|
||||
* Lots of stability fixes (Thanks [@MWY001](https://github.com/MWY001) [@skiby7](https://github.com/skiby7) and [@willstott101](https://github.com/willstott101))
|
||||
* To host PairDrop on your local network (e.g. on Raspberry Pi): [All peers connected with private IPs are discoverable by each other](https://github.com/RobinLinus/snapdrop/pull/558)
|
||||
* When hosting PairDrop yourself you can [set your own STUN/TURN servers](docs/host-your-own.md#specify-stunturn-servers)
|
||||
* Built-in translations via [Weblate](https://hosted.weblate.org/engage/pairdrop/)
|
||||
* Airy design (Thanks [@Avieshek](https://linktr.ee/avieshek/))
|
||||
* When hosting PairDrop yourself, you can [set your own STUN/TURN servers](docs/host-your-own.md#specify-stunturn-servers)
|
||||
* Translations.
|
||||
|
||||
</details>
|
||||
|
||||
## Screenshots
|
||||
<img src="docs/pairdrop_screenshot_mobile.gif" alt="Gif of Screenshots that show PairDrop in use" style="width: 300px">
|
||||
|
||||
## PairDrop is built with the following awesome technologies:
|
||||
* Vanilla HTML5 / ES6 / CSS3 frontend
|
||||
* [WebRTC](http://webrtc.org/) / [WebSockets](http://www.websocket.org/)
|
||||
* [NodeJS](https://nodejs.org/en/) backend
|
||||
* [Progressive Web App](https://wikipedia.org/wiki/Progressive_Web_App)
|
||||
* [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API)
|
||||
* [Weblate](https://weblate.org/) Web based localization tool
|
||||
* [zip.js](https://github.com/gildas-lormeau/zip.js) JavaScript library to zip and unzip files ([BSD 3-Clause License](licenses/BSD_3-Clause-zip-js))
|
||||
* [NoSleep](https://github.com/richtr/NoSleep.js) JavaScript library to prevent display sleep and enable wake lock in any Android or iOS web browser ([MIT License](licenses/MIT-NoSleep))
|
||||
* [heic2any](https://github.com/alexcorvi/heic2any) JavaScript library to convert HEIC/HEIF images to PNG/GIF/JPEG ([MIT License](licenses/MIT-heic2any))
|
||||
* [cyrb53](https://github.com/bryc) Super fast hash function
|
||||
|
||||
Have any questions? Read our [FAQ](docs/faq.md).
|
||||
|
||||
You can [host your own instance with Docker](docs/host-your-own.md).
|
||||
|
||||
|
||||
## Support PairDrop
|
||||
<a href="https://www.buymeacoffee.com/pairdrop" target="_blank">
|
||||
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" >
|
||||
</a>
|
||||
|
||||
PairDrop is free and always will be.
|
||||
Still, we have to pay for the domain and the server.
|
||||
|
||||
To contribute and support, please use BuyMeACoffee via the button above.
|
||||
|
||||
Thanks a lot for supporting free and open software!
|
||||
|
||||
## Translate PairDrop
|
||||
## Translate PairDrop on [Hosted Weblate](https://hosted.weblate.org/engage/pairdrop/)
|
||||
<a href="https://hosted.weblate.org/engage/pairdrop/">
|
||||
<img src="https://hosted.weblate.org/widget/pairdrop/pairdrop-spa/open-graph.png" alt="Translation status" style="width: 300px" />
|
||||
<img src="https://hosted.weblate.org/widget/pairdrop/horizontal-blue.svg" alt="Translation status" style="width: 300px" />
|
||||
</a>
|
||||
|
||||
## How to contribute
|
||||
## Built with the following awesome technologies:
|
||||
* Vanilla HTML5 / JS ES6 / CSS 3 frontend
|
||||
* [WebRTC](http://webrtc.org/) / WebSockets
|
||||
* [Node.js](https://nodejs.org/en/) backend
|
||||
* [Progressive web app (PWA)](https://en.wikipedia.org/wiki/Progressive_web_app) unified functionality
|
||||
* [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) storage handling
|
||||
* [zip.js](https://gildas-lormeau.github.io/zip.js/) library
|
||||
* [cyrb53](https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js) super-fast hash function
|
||||
* [NoSleep](https://github.com/richtr/NoSleep.js) display sleep, add wake lock ([MIT](licenses/MIT-NoSleep))
|
||||
* [heic2any](https://github.com/alexcorvi/heic2any) HEIC/HEIF to PNG/GIF/JPEG ([MIT](licenses/MIT-heic2any))
|
||||
* [Weblate](https://weblate.org/) web-based localization tool
|
||||
|
||||
[FAQ](docs/faq.md)
|
||||
|
||||
[Host your own instance with Docker or Node.js](docs/host-your-own.md).
|
||||
|
||||
## Support
|
||||
<a href="https://www.buymeacoffee.com/pairdrop" target="_blank">
|
||||
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-blue.png" alt="Buy me a coffee" style="height: 60px !important;width: 217px !important;" >
|
||||
</a>
|
||||
<br />
|
||||
<br />
|
||||
|
||||
PairDrop is libre, and always will be. \
|
||||
If you find it useful and want to support free and open-source software, please consider donating using the button above. \
|
||||
I footed the bill for the domain and the server, and you can help create and maintain great software by supporting me. \
|
||||
Thank you very much for your contribution!
|
||||
|
||||
## Contributing
|
||||
Feel free to [open an issue](https://github.com/schlagmichdoch/pairdrop/issues/new/choose) or a
|
||||
[pull request](https://github.com/schlagmichdoch/pairdrop/pulls) but follow
|
||||
[pull request](https://github.com/schlagmichdoch/pairdrop/pulls), following the
|
||||
[Contributing Guidelines](CONTRIBUTING.md).
|
||||
|
||||
83
docs/faq.md
83
docs/faq.md
@@ -5,18 +5,39 @@
|
||||
Help! I can't install the PWA!
|
||||
</summary>
|
||||
|
||||
if you are using a Chromium-based browser (Chrome, Edge, Vivaldi, Brave, etc.), you can easily install PairDrop PWA on your desktop
|
||||
by clicking the install-button in the top-right corner while on [pairdrop.net](https://pairdrop.net).
|
||||
<br>
|
||||
|
||||
Here is a good guide on how to install PWAs on different platforms: \
|
||||
https://www.cdc.gov/niosh/mining/content/hearingloss/installPWA.html
|
||||
|
||||
|
||||
**Chromium-based browser on Desktop (Chrome, Edge, Vivaldi, Brave, etc.)** \
|
||||
Easily install PairDrop PWA on your desktop by clicking the install-button in the top-right corner while on [pairdrop.net](https://pairdrop.net).
|
||||
|
||||
<img width="400" src="pwa-install.png" alt="Example on how to install a pwa with Edge">
|
||||
|
||||
**Desktop Firefox** \
|
||||
On Firefox, PWAs are installable via [this browser extensions](https://addons.mozilla.org/de/firefox/addon/pwas-for-firefox/)
|
||||
|
||||
**Android** \
|
||||
PWAs are installable only by using Google Chrome or Samsung Browser:
|
||||
1. Visit [pairdrop.net](https://pairdrop.net)
|
||||
2. Click _Install_ on the installation pop-up or use the three-dot-menu and click on _Add to Home screen_
|
||||
3. Click _Add_ on the pop-up
|
||||
|
||||
**iOS** \
|
||||
PWAs are installable only by using Safari:
|
||||
1. Visit [pairdrop.net](https://pairdrop.net)
|
||||
2. Click on the share icon
|
||||
3. Click _Add to Home Screen_
|
||||
4. Click _Add_ in the top right corner
|
||||
|
||||
<br>
|
||||
|
||||
<b>Self-Hosted Instance?</b>
|
||||
|
||||
**Self-Hosted Instance?** \
|
||||
To be able to install the PWA from a self-hosted instance, the connection needs to be [established through HTTPS](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Installable_PWAs).
|
||||
See [this host your own section](https://github.com/schlagmichdoch/PairDrop/blob/master/docs/host-your-own.md#testing-pwa-related-features) for more info.
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -26,7 +47,9 @@ See [this host your own section](https://github.com/schlagmichdoch/PairDrop/blob
|
||||
Shortcuts?
|
||||
</summary>
|
||||
|
||||
Shortcuts
|
||||
<br>
|
||||
|
||||
Available shortcuts:
|
||||
- Send a message with `CTRL + ENTER`
|
||||
- Close all "Send" and "Pair" dialogs by pressing `Esc`.
|
||||
- Copy a received message to the clipboard with `CTRL/⌘ + C`.
|
||||
@@ -40,12 +63,20 @@ Shortcuts
|
||||
How to save images directly to the gallery on iOS?
|
||||
</summary>
|
||||
|
||||
Apparently, iOS does not allow images shared from a website to be saved to the gallery directly.
|
||||
It simply does not offer that option for images shared from a website.
|
||||
<br>
|
||||
|
||||
iOS Shortcuts saves the day:
|
||||
~~Apparently, iOS does not allow images shared from a website to be saved to the gallery directly.~~
|
||||
~~It simply does not offer that option for images shared from a website.~~
|
||||
|
||||
~~iOS Shortcuts saves the day:~~ \
|
||||
I created a simple iOS shortcut that takes your photos and saves them to your gallery:
|
||||
https://routinehub.co/shortcut/13988/
|
||||
|
||||
Update: \
|
||||
Apparently, this was only a bug that is fixed in recent iOS version (https://github.com/WebKit/WebKit/pull/13111). \
|
||||
If you use an older affected iOS version this might still be of use. \
|
||||
Luckily, you can now simply use `Save Image`/`Save X Images` 🎉
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -55,10 +86,13 @@ https://routinehub.co/shortcut/13988/
|
||||
Is it possible to send files or text directly from the "Context" or "Share" menu?
|
||||
</summary>
|
||||
|
||||
<br>
|
||||
|
||||
Yes, it finally is.
|
||||
* [Send files directly from the "Context" menu on Windows](/docs/how-to.md#send-files-directly-from-context-menu-on-windows)
|
||||
* [Send directly from the "Share" menu on iOS](/docs/how-to.md#send-directly-from-share-menu-on-ios)
|
||||
* [Send directly from the "Share" menu on Android](/docs/how-to.md#send-directly-from-share-menu-on-android)
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -68,9 +102,12 @@ Yes, it finally is.
|
||||
Is it possible to send files or text directly via CLI?
|
||||
</summary>
|
||||
|
||||
<br>
|
||||
|
||||
Yes.
|
||||
|
||||
* [Send directly from a command-line interface](/docs/how-to.md#send-directly-via-command-line-interface)
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -80,11 +117,14 @@ Yes.
|
||||
Are there any third-party Apps?
|
||||
</summary>
|
||||
|
||||
<br>
|
||||
|
||||
These third-party apps are compatible with PairDrop:
|
||||
|
||||
1. [Snapdrop Android App](https://github.com/fm-sys/snapdrop-android)
|
||||
2. [Snapdrop for Firefox (Addon)](https://github.com/ueen/SnapdropFirefoxAddon)
|
||||
3. Feel free to make one :)
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -94,6 +134,8 @@ These third-party apps are compatible with PairDrop:
|
||||
What about the connection? Is it a P2P connection directly from device to device or is there any third-party-server?
|
||||
</summary>
|
||||
|
||||
<br>
|
||||
|
||||
It uses a WebRTC peer-to-peer connection.
|
||||
WebRTC needs a signaling server that is only used to establish a connection.
|
||||
The server is not involved in the file transfer.
|
||||
@@ -109,6 +151,7 @@ to learn more about STUN, TURN and WebRTC.
|
||||
If you host your own instance
|
||||
and want to support devices that do not support WebRTC,
|
||||
you can [start the PairDrop instance with an activated WebSocket fallback](https://github.com/schlagmichdoch/PairDrop/blob/master/docs/host-your-own.md#websocket-fallback-for-vpn).
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -118,6 +161,8 @@ 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).
|
||||
@@ -130,6 +175,7 @@ If your devices are paired and behind a NAT,
|
||||
the PairDrop TURN Server is used to route your files and messages.
|
||||
See the [Technical Documentation](technical-documentation.md#encryption-webrtc-stun-and-turn)
|
||||
to learn more about STUN, TURN and WebRTC.
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -139,10 +185,13 @@ 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>
|
||||
@@ -152,6 +201,8 @@ The security number is different for every connection.
|
||||
Transferring many files with paired devices takes too long
|
||||
</summary>
|
||||
|
||||
<br>
|
||||
|
||||
Naturally, if traffic needs to be routed through the TURN server
|
||||
because your devices are behind different NATs, transfer speed decreases.
|
||||
|
||||
@@ -164,6 +215,7 @@ which omits the need of the TURN server.
|
||||
|
||||
You can also use mobile hotspots on phones to do that.
|
||||
Then, all data should be sent directly between devices and not use your data plan.
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -173,6 +225,8 @@ Then, all data should be sent directly between devices and not use your data pla
|
||||
Why don't you implement feature xyz?
|
||||
</summary>
|
||||
|
||||
<br>
|
||||
|
||||
Snapdrop and PairDrop are a study in radical simplicity.
|
||||
The user interface is insanely simple.
|
||||
Features are chosen very carefully because complexity grows quadratically
|
||||
@@ -184,22 +238,24 @@ Don't be sad. We may decline your feature request for the sake of simplicity.
|
||||
Read *Insanely Simple: The Obsession that Drives Apple's Success*,
|
||||
and/or *Thinking, Fast and Slow* to learn more.
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary style="font-size:1.25em;margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25;">
|
||||
Snapdrop and PairDrop are awesome. How can I support them?
|
||||
PairDrop is awesome. How can I support it?
|
||||
</summary>
|
||||
|
||||
<br>
|
||||
|
||||
* [Buy me a coffee](https://www.buymeacoffee.com/pairdrop) to pay for the domain and the server, and support libre software.
|
||||
* [File bugs, give feedback, submit suggestions](https://github.com/schlagmichdoch/pairdrop/issues)
|
||||
* Share PairDrop on social media.
|
||||
* Fix bugs and make a pull request.
|
||||
* Fix bugs and create a pull request.
|
||||
* Do some security analysis and make suggestions.
|
||||
* To support the original Snapdrop and its creator go to [his GitHub page](https://github.com/RobinLinus/snapdrop)
|
||||
* Participate in [active discussions](https://github.com/schlagmichdoch/PairDrop/discussions)
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
@@ -209,7 +265,10 @@ and/or *Thinking, Fast and Slow* to learn more.
|
||||
How does it work?
|
||||
</summary>
|
||||
|
||||
<br>
|
||||
|
||||
[See here for info about the technical implementation](/docs/technical-documentation.md)
|
||||
|
||||
<br>
|
||||
|
||||
</details>
|
||||
|
||||
@@ -399,7 +399,8 @@ RTC_CONFIG="rtc_config.json"
|
||||
|
||||
You can host an instance that uses another signaling server
|
||||
This can be useful if you don't want to trust the client files that are hosted on another instance but still want to connect to devices that use https://pairdrop.net.
|
||||
### Host Websocket Server (for VPN)
|
||||
|
||||
### Specify Signaling Server
|
||||
|
||||
```bash
|
||||
SIGNALING_SERVER="pairdrop.net"
|
||||
@@ -415,9 +416,9 @@ SIGNALING_SERVER="pairdrop.net"
|
||||
> E.g. host your own client files under *pairdrop.your-domain.com* but use the official signaling server under *pairdrop.net*
|
||||
> This way devices connecting to *pairdrop.your-domain.com* and *pairdrop.net* can discover each other.
|
||||
>
|
||||
> Beware that the version of your PairDrop server is compatible with the version of the signaling server.
|
||||
> Beware that the version of your PairDrop server must be compatible with the version of the signaling server.
|
||||
>
|
||||
> `WS_SERVER` must be a valid url without the protocol prefix.
|
||||
> `SIGNALING_SERVER` must be a valid url without the protocol prefix.
|
||||
> Examples of valid values: `pairdrop.net`, `pairdrop.your-domain.com:3000`, `your-domain.com/pairdrop`
|
||||
|
||||
<br>
|
||||
|
||||
@@ -24,7 +24,7 @@ This opens PairDrop in the default browser where you can choose the receiver.
|
||||
```bash
|
||||
pairdrop -h
|
||||
```
|
||||
```bash
|
||||
```
|
||||
Send files or text with PairDrop via command-line interface.
|
||||
Current domain: https://pairdrop-dev.onrender.com/
|
||||
|
||||
@@ -35,44 +35,61 @@ Send text: pairdrop -t "text"
|
||||
Specify domain: pairdrop -d "https://pairdrop.net/"
|
||||
Show this help text: pairdrop (-h|--help)
|
||||
|
||||
This pairdrop-cli version was released alongside v1.10.0
|
||||
This pairdrop-cli version was released alongside v1.10.4
|
||||
```
|
||||
|
||||
<br>
|
||||
|
||||
### Setup
|
||||
Download the bash file: [pairdrop-cli/pairdrop](/pairdrop-cli/pairdrop).
|
||||
|
||||
#### Linux
|
||||
#### Linux / Mac
|
||||
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
|
||||
2. Unzip the archive to a folder of your choice e.g. `/usr/local/bin/pairdrop-cli/`
|
||||
3. Make sure the bash file `/usr/local/bin/pairdrop-cli/pairdrop` is executable. Otherwise, use `chmod +x pairdrop`
|
||||
4. Add absolute path of the folder to PATH variable to make `pairdrop` available globally by executing
|
||||
`export PATH=$PATH:/usr/local/bin/pairdrop-cli/`
|
||||
|
||||
<br>
|
||||
|
||||
#### Mac
|
||||
1. add bash file to `/usr/local/bin`
|
||||
```shell
|
||||
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.8/pairdrop-cli.zip"
|
||||
```
|
||||
or
|
||||
```shell
|
||||
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.8/pairdrop-cli.zip"
|
||||
```
|
||||
2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/`
|
||||
```shell
|
||||
sudo unzip pairdrop-cli.zip -d /usr/share/pairdrop-cli/
|
||||
```
|
||||
3. Copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
|
||||
```shell
|
||||
sudo cp /usr/share/pairdrop-cli/.pairdrop-cli-config.example /usr/share/pairdrop-cli/.pairdrop-cli-config
|
||||
```
|
||||
4. Make the bash file _pairdrop_ executable
|
||||
```shell
|
||||
sudo chmod +x /usr/share/pairdrop-cli/pairdrop
|
||||
```
|
||||
5. Add a symlink to /usr/local/bin/ to include _pairdrop_ to _PATH_
|
||||
```shell
|
||||
sudo ln -s /usr/share/pairdrop-cli/pairdrop /usr/local/bin/pairdrop
|
||||
```
|
||||
|
||||
<br>
|
||||
|
||||
#### Windows
|
||||
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
|
||||
2. Put file in a preferred folder e.g. `C:\Program Files\pairdrop-cli`
|
||||
3. Search for and open `Edit environment variables for your account`
|
||||
4. Click `Environment Variables…`
|
||||
5. Under *System Variables* select `Path` and click *Edit...*
|
||||
6. Click *New*, insert the preferred folder (`C:\Program Files\pairdrop-cli`), click *OK* until all windows are closed
|
||||
7. Reopen Command prompt window
|
||||
3. Inside this folder, copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
|
||||
4. Search for and open `Edit environment variables for your account`
|
||||
5. Click `Environment Variables…`
|
||||
6. Under _System Variables_ select `Path` and click _Edit..._
|
||||
7. Click _New_, insert the preferred folder (`C:\Program Files\pairdrop-cli`), click *OK* until all windows are closed
|
||||
8. Reopen Command prompt window
|
||||
|
||||
<br>
|
||||
**Requirements**
|
||||
|
||||
### Requirements
|
||||
As Windows cannot execute bash scripts natively, you need to install [Git Bash](https://gitforwindows.org/).
|
||||
Then, you can also use pairdrop-cli from the default Windows Command Prompt \
|
||||
by using the shell file instead of the bash file: `pairdrop.sh -h` which then itself executes \
|
||||
pairdrop-cli (the bash file) via the Git Bash.
|
||||
|
||||
Then, you can also use pairdrop-cli from the default Windows Command Prompt
|
||||
by using the shell file instead of the bash file which then itself executes
|
||||
_pairdrop-cli_ (the bash file) via the Git Bash.
|
||||
```shell
|
||||
pairdrop.sh -h
|
||||
```
|
||||
|
||||
<br>
|
||||
|
||||
@@ -82,14 +99,15 @@ pairdrop-cli (the bash file) via the Git Bash.
|
||||
It is possible to send multiple files with PairDrop via the context menu by adding pairdrop-cli to Windows `Send to` menu:
|
||||
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
|
||||
2. Unzip the archive to a folder of your choice e.g. `C:\Program Files\pairdrop-cli\`
|
||||
3. Copy the shortcut _send with PairDrop.lnk_
|
||||
4. Hit Windows Key+R, type: `shell:sendto` and hit Enter.
|
||||
5. Paste the copied shortcut into the directory
|
||||
6. Open the properties window of the shortcut and edit the link field to point to _send-with-pairdrop.ps1_ located in the folder you used in step 2: \
|
||||
3. Inside this folder, copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_
|
||||
4. Copy the shortcut _send with PairDrop.lnk_
|
||||
5. Hit Windows Key+R, type: `shell:sendto` and hit Enter.
|
||||
6. Paste the copied shortcut into the directory
|
||||
7. Open the properties window of the shortcut and edit the link field to point to _send-with-pairdrop.ps1_ located in the folder you used in step 2: \
|
||||
`"C:\Program Files\PowerShell\7\pwsh.exe" -File "C:\Program Files\pairdrop-cli\send-with-pairdrop.ps1"`
|
||||
7. You are done! You can now send multiple files and directories directly via PairDrop:
|
||||
8. You are done! You can now send multiple files and directories directly via PairDrop:
|
||||
|
||||
> _context menu > Send to > PairDrop_
|
||||
_context menu_ > _Send to_ > _PairDrop_
|
||||
|
||||
##### Requirements
|
||||
As Windows cannot execute bash scripts natively, you need to install [Git Bash](https://gitforwindows.org/).
|
||||
@@ -100,14 +118,18 @@ As Windows cannot execute bash scripts natively, you need to install [Git Bash](
|
||||
|
||||
### Registering to open files with PairDrop
|
||||
It is possible to send multiple files with PairDrop via the context menu by adding pairdrop-cli to Nautilus `Scripts` menu:
|
||||
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
|
||||
2. Unzip the archive to a folder of your choice e.g. `/usr/local/bin/pairdrop-cli/`
|
||||
3. Copy the shell file _send-with-pairdrop.sh_ to `/home/<user>/.local/share/nautilus/scripts/`
|
||||
4. Edit the shell file and edit the variable `pathToPairDropCli` to point to the pairdrop-cli executable from step 2 (e.g. `/usr/local/bin/pairdrop-cli/pairdrop`)
|
||||
5. Make sure the shell file `/home/<user>/.local/share/nautilus/scripts/send-with-pairdrop.sh` is executable. Otherwise, use `chmod +x send-with-pairdrop.sh`
|
||||
6. You are done! You can now send multiple files and directories directly via PairDrop:
|
||||
1. Register _pairdrop_ as executable via [guide above](#linux).
|
||||
2. Copy the shell file _send-with-pairdrop_ to `~/.local/share/nautilus/scripts/` to include it in the context menu
|
||||
```shell
|
||||
cp /usr/share/pairdrop-cli/send-with-pairdrop ~/.local/share/nautilus/scripts/
|
||||
```
|
||||
3. Make the shell file _send-with-pairdrop_ executable
|
||||
```shell
|
||||
chmod +x ~/.local/share/nautilus/scripts/send-with-pairdrop
|
||||
```
|
||||
4. You are done! You can now send multiple files and directories directly via PairDrop:
|
||||
|
||||
> _context menu > Scripts > send-with-pairdrop.sh_
|
||||
_context menu_ > _Scripts_ > _send-with-pairdrop_
|
||||
|
||||
<br>
|
||||
|
||||
@@ -115,6 +137,6 @@ It is possible to send multiple files with PairDrop via the context menu by addi
|
||||
The [File Handling API](https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/handle-files)
|
||||
was implemented, but it was removed as default file associations were overwritten ([#17](https://github.com/schlagmichdoch/PairDrop/issues/17),
|
||||
[#116](https://github.com/schlagmichdoch/PairDrop/issues/116) [#190](https://github.com/schlagmichdoch/PairDrop/issues/190))
|
||||
and it only worked with explicitly specified file types and not with directories at all.
|
||||
and it only worked with explicitly specified file types and couldn't handle directories at all.
|
||||
|
||||
[< Back](/README.md)
|
||||
|
||||
373
package-lock.json
generated
373
package-lock.json
generated
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"name": "pairdrop",
|
||||
"version": "1.10.1",
|
||||
"version": "1.10.8",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "pairdrop",
|
||||
"version": "1.10.1",
|
||||
"version": "1.10.8",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express": "^4.18.2",
|
||||
"express-rate-limit": "^7.1.5",
|
||||
"ua-parser-js": "^1.0.37",
|
||||
"unique-names-generator": "^4.3.0",
|
||||
"ws": "^8.15.0"
|
||||
"ws": "^8.16.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=15"
|
||||
@@ -37,12 +37,12 @@
|
||||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
|
||||
},
|
||||
"node_modules/body-parser": {
|
||||
"version": "1.20.1",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
|
||||
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
|
||||
"version": "1.20.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
|
||||
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
"content-type": "~1.0.4",
|
||||
"content-type": "~1.0.5",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
@@ -50,7 +50,7 @@
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "2.4.1",
|
||||
"qs": "6.11.0",
|
||||
"raw-body": "2.5.1",
|
||||
"raw-body": "2.5.2",
|
||||
"type-is": "~1.6.18",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
@@ -68,12 +68,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
||||
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.1",
|
||||
"get-intrinsic": "^1.0.2"
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"set-function-length": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -91,17 +97,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/content-type": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
|
||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
|
||||
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
|
||||
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
|
||||
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
@@ -119,6 +125,22 @@
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/define-data-property": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
||||
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/depd": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
||||
@@ -149,6 +171,25 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-errors": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
||||
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
@@ -163,16 +204,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/express": {
|
||||
"version": "4.18.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
|
||||
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
|
||||
"version": "4.19.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
|
||||
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
|
||||
"dependencies": {
|
||||
"accepts": "~1.3.8",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.20.1",
|
||||
"body-parser": "1.20.2",
|
||||
"content-disposition": "0.5.4",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.5.0",
|
||||
"cookie": "0.6.0",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
@@ -251,32 +292,62 @@
|
||||
}
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
|
||||
"integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.1",
|
||||
"has": "^1.0.3",
|
||||
"has-symbols": "^1.0.3"
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
||||
"node_modules/gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.1"
|
||||
"get-intrinsic": "^1.1.3"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-property-descriptors": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
||||
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-proto": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
||||
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-symbols": {
|
||||
@@ -290,6 +361,17 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/hasown": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/http-errors": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
|
||||
@@ -394,9 +476,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/object-inspect": {
|
||||
"version": "1.12.2",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
|
||||
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
@@ -460,9 +542,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/raw-body": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
|
||||
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
|
||||
"version": "2.5.2",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
|
||||
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
"http-errors": "2.0.0",
|
||||
@@ -539,19 +621,39 @@
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/set-function-length": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
||||
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
|
||||
"dependencies": {
|
||||
"define-data-property": "^1.1.4",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/setprototypeof": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
|
||||
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
|
||||
},
|
||||
"node_modules/side-channel": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
||||
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
|
||||
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.0",
|
||||
"get-intrinsic": "^1.0.2",
|
||||
"object-inspect": "^1.9.0"
|
||||
"call-bind": "^1.0.7",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"object-inspect": "^1.13.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -640,9 +742,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ws": {
|
||||
"version": "8.15.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz",
|
||||
"integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==",
|
||||
"version": "8.16.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
|
||||
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
@@ -676,12 +778,12 @@
|
||||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.20.1",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
|
||||
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
|
||||
"version": "1.20.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
|
||||
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
|
||||
"requires": {
|
||||
"bytes": "3.1.2",
|
||||
"content-type": "~1.0.4",
|
||||
"content-type": "~1.0.5",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
@@ -689,7 +791,7 @@
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "2.4.1",
|
||||
"qs": "6.11.0",
|
||||
"raw-body": "2.5.1",
|
||||
"raw-body": "2.5.2",
|
||||
"type-is": "~1.6.18",
|
||||
"unpipe": "1.0.0"
|
||||
}
|
||||
@@ -700,12 +802,15 @@
|
||||
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
|
||||
},
|
||||
"call-bind": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
||||
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
||||
"requires": {
|
||||
"function-bind": "^1.1.1",
|
||||
"get-intrinsic": "^1.0.2"
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"set-function-length": "^1.2.1"
|
||||
}
|
||||
},
|
||||
"content-disposition": {
|
||||
@@ -717,14 +822,14 @@
|
||||
}
|
||||
},
|
||||
"content-type": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
|
||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
|
||||
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
|
||||
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
|
||||
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
|
||||
},
|
||||
"cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
@@ -739,6 +844,16 @@
|
||||
"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",
|
||||
@@ -759,6 +874,19 @@
|
||||
"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",
|
||||
@@ -770,16 +898,16 @@
|
||||
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
|
||||
},
|
||||
"express": {
|
||||
"version": "4.18.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
|
||||
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
|
||||
"version": "4.19.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
|
||||
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
|
||||
"requires": {
|
||||
"accepts": "~1.3.8",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.20.1",
|
||||
"body-parser": "1.20.2",
|
||||
"content-disposition": "0.5.4",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.5.0",
|
||||
"cookie": "0.6.0",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
@@ -838,33 +966,56 @@
|
||||
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
|
||||
},
|
||||
"function-bind": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
|
||||
},
|
||||
"get-intrinsic": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
|
||||
"integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"requires": {
|
||||
"function-bind": "^1.1.1",
|
||||
"has": "^1.0.3",
|
||||
"has-symbols": "^1.0.3"
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"has": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
||||
"gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||
"requires": {
|
||||
"function-bind": "^1.1.1"
|
||||
"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": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
||||
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
|
||||
},
|
||||
"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",
|
||||
@@ -939,9 +1090,9 @@
|
||||
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
|
||||
},
|
||||
"object-inspect": {
|
||||
"version": "1.12.2",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
|
||||
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
|
||||
},
|
||||
"on-finished": {
|
||||
"version": "2.4.1",
|
||||
@@ -984,9 +1135,9 @@
|
||||
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
|
||||
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
|
||||
"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==",
|
||||
"requires": {
|
||||
"bytes": "3.1.2",
|
||||
"http-errors": "2.0.0",
|
||||
@@ -1042,19 +1193,33 @@
|
||||
"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.4",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
||||
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
|
||||
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
|
||||
"requires": {
|
||||
"call-bind": "^1.0.0",
|
||||
"get-intrinsic": "^1.0.2",
|
||||
"object-inspect": "^1.9.0"
|
||||
"call-bind": "^1.0.7",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"object-inspect": "^1.13.1"
|
||||
}
|
||||
},
|
||||
"statuses": {
|
||||
@@ -1102,9 +1267,9 @@
|
||||
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
|
||||
},
|
||||
"ws": {
|
||||
"version": "8.15.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz",
|
||||
"integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==",
|
||||
"version": "8.16.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
|
||||
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
|
||||
"requires": {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "pairdrop",
|
||||
"version": "1.10.1",
|
||||
"version": "1.10.8",
|
||||
"type": "module",
|
||||
"description": "",
|
||||
"main": "server/index.js",
|
||||
@@ -15,7 +15,7 @@
|
||||
"express-rate-limit": "^7.1.5",
|
||||
"ua-parser-js": "^1.0.37",
|
||||
"unique-names-generator": "^4.3.0",
|
||||
"ws": "^8.15.0"
|
||||
"ws": "^8.16.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=15"
|
||||
|
||||
1
pairdrop-cli/.pairdrop-cli-config.example
Normal file
1
pairdrop-cli/.pairdrop-cli-config.example
Normal file
@@ -0,0 +1 @@
|
||||
DOMAIN=https://pairdrop.net/
|
||||
@@ -1,6 +1,9 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# PairDrop version when this file was last changed
|
||||
version="v1.10.4"
|
||||
|
||||
############################################################
|
||||
# Help #
|
||||
############################################################
|
||||
@@ -17,7 +20,7 @@ help()
|
||||
echo -e "Specify domain:\t\t$(basename "$0") -d \"https://pairdrop.net/\""
|
||||
echo -e "Show this help text:\t$(basename "$0") (-h|--help)"
|
||||
echo
|
||||
echo "This pairdrop-cli version was released alongside v1.10.0"
|
||||
echo "This pairdrop-cli version was released alongside ${version}"
|
||||
}
|
||||
|
||||
openPairDrop()
|
||||
@@ -337,12 +340,15 @@ popd > '/dev/null';
|
||||
|
||||
config_path="${script_path}/.pairdrop-cli-config"
|
||||
|
||||
# If config file does not exist, try to create it. If it fails log error message and exit
|
||||
[ ! -f "$config_path" ] &&
|
||||
specifyDomain "https://pairdrop.net/" &&
|
||||
[ ! -f "$config_path" ] &&
|
||||
echo "Could not create config file. Add 'DOMAIN=https://pairdrop.net/' to a file called .pairdrop-cli-config in the same file as this 'pairdrop' bash file"
|
||||
echo "Could not create config file. Add 'DOMAIN=https://pairdrop.net/' to a file called .pairdrop-cli-config in the same file as this 'pairdrop' bash file (${script_path})" &&
|
||||
exit
|
||||
|
||||
[ ! -f "$config_path" ] || export "$(grep -v '^#' "$config_path" | xargs)"
|
||||
# Read config variables
|
||||
export "$(grep -v '^#' "$config_path" | xargs)"
|
||||
|
||||
setOs
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# edit this to point to the pairdrop-cli executable
|
||||
pathToPairDropCli="/usr/local/bin/pairdrop-cli/pairdrop"
|
||||
|
||||
# Initialize an array
|
||||
lines=()
|
||||
|
||||
@@ -17,4 +14,4 @@ length=${#lines[@]}
|
||||
# Remove the last entry
|
||||
unset 'lines[length-1]'
|
||||
|
||||
$pathToPairDropCli "${lines[@]}"
|
||||
pairdrop "${lines[@]}"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 12 KiB |
@@ -139,7 +139,7 @@
|
||||
<div class="edit-btn btn btn-small btn-rounded btn-dark text-white" data-i18n-key="header.edit-share-mode" data-i18n-attrs="text" hidden></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="websocket-fallback" hidden>
|
||||
<div id="websocket-fallback" class="text-center" hidden>
|
||||
<span data-i18n-key="footer.traffic" data-i18n-attrs="text"></span>
|
||||
<span data-i18n-key="footer.routed" data-i18n-attrs="text"></span>
|
||||
<span data-i18n-key="footer.webrtc" data-i18n-attrs="text"></span>
|
||||
@@ -225,6 +225,16 @@
|
||||
<span> - </span>
|
||||
<span>(Italian)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="kn">
|
||||
<span>ಕನ್ನಡ</span>
|
||||
<span> - </span>
|
||||
<span>(Kannada)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="hu">
|
||||
<span>Magyar</span>
|
||||
<span> - </span>
|
||||
<span>(Hungarian)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="nl">
|
||||
<span>Nederlands</span>
|
||||
<span> - </span>
|
||||
@@ -235,6 +245,11 @@
|
||||
<span> - </span>
|
||||
<span>(Norwegian)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="pl">
|
||||
<span>Polski</span>
|
||||
<span> - </span>
|
||||
<span>(Polish)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="pt-BR">
|
||||
<span>Português do Brasil</span>
|
||||
<span> - </span>
|
||||
@@ -258,7 +273,12 @@
|
||||
<button class="btn fw wrap" value="zh-CN">
|
||||
<span>中文</span>
|
||||
<span> - </span>
|
||||
<span>(Chinese)</span>
|
||||
<span>(Simplified Chinese)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="zh-TW">
|
||||
<span>漢語</span>
|
||||
<span> - </span>
|
||||
<span>(Traditional Chinese)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="ja">
|
||||
<span>日本語</span>
|
||||
@@ -577,7 +597,7 @@
|
||||
</svg>
|
||||
<div class="title-wrapper" dir="ltr">
|
||||
<h1>PairDrop</h1>
|
||||
<div class="font-subheading">v1.10.1</div>
|
||||
<div class="font-subheading">v1.10.8</div>
|
||||
</div>
|
||||
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text"></div>
|
||||
<div class="row">
|
||||
@@ -734,10 +754,10 @@
|
||||
</symbol>
|
||||
</svg>
|
||||
<!-- Scripts -->
|
||||
<script src="scripts/localization.js"></script>
|
||||
<script src="scripts/persistent-storage.js"></script>
|
||||
<script src="scripts/ui-main.js"></script>
|
||||
<script src="scripts/main.js"></script>
|
||||
<script src="scripts/localization.js" defer></script>
|
||||
<script src="scripts/persistent-storage.js" defer></script>
|
||||
<script src="scripts/ui-main.js" defer></script>
|
||||
<script src="scripts/main.js" defer></script>
|
||||
<!-- Sounds -->
|
||||
<audio id="blop" autobuffer="true">
|
||||
<source src="sounds/blop.mp3" type="audio/mpeg">
|
||||
|
||||
@@ -66,13 +66,14 @@
|
||||
"language-selector_title": "إختر اللغة",
|
||||
"about_title": "حول PairDrop",
|
||||
"about_aria-label": "افتح حول PairDrop",
|
||||
"theme-light_title": "إستخدم دائماً المظهر الفاتح"
|
||||
"theme-light_title": "إستخدم دائماً المظهر الفاتح",
|
||||
"edit-share-mode": "ت٧ارف"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "انقر لإرسال الملفات أو انقر لفترة طويلة لإرسال رسالة",
|
||||
"x-instructions-share-mode_desktop": "انقر للإرسال",
|
||||
"x-instructions-share-mode_desktop": "انقر للإرسال {{descriptor}}",
|
||||
"activate-share-mode-and-other-files-plural": "و{{count}} ملفات أخرى",
|
||||
"x-instructions-share-mode_mobile": "انقر للإرسال",
|
||||
"x-instructions-share-mode_mobile": "انقر للإرسال {{descriptor}}",
|
||||
"activate-share-mode-base": "افتح PairDrop على الأجهزة الأخرى للإرسال",
|
||||
"no-peers-subtitle": "قم بإقران الأجهزة أو ادخل إلى غرفة عامة لتتمكن من أن تكتشف على الشبكات الأخرى",
|
||||
"activate-share-mode-shared-text": "النص المشترك",
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
"cancel-share-mode": "Fertig",
|
||||
"language-selector_title": "Sprache Wählen",
|
||||
"join-public-room_title": "Öffentlichen Raum temporär betreten",
|
||||
"edit-share-mode": "Bearbeiten"
|
||||
"edit-share-mode": "Bearbeiten",
|
||||
"expand_title": "Schaltflächenzeile ausklappen"
|
||||
},
|
||||
"dialogs": {
|
||||
"share": "Teilen",
|
||||
@@ -81,7 +82,11 @@
|
||||
"close-about_aria-label": "Schließe Über PairDrop",
|
||||
"github_title": "PairDrop auf GitHub",
|
||||
"buy-me-a-coffee_title": "Kauf mir einen Kaffee!",
|
||||
"claim": "Der einfachste Weg, Dateien zwischen Geräten zu übertragen"
|
||||
"claim": "Der einfachste Weg, Dateien zwischen Geräten zu übertragen",
|
||||
"bluesky_title": "Folge uns auf BlueSky",
|
||||
"privacypolicy_title": "Öffne unsere Datenschutzerklärung",
|
||||
"mastodon_title": "Schreibe über PairDrop auf Mastodon",
|
||||
"custom_title": "Folge uns"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Du wirst angezeigt als:",
|
||||
@@ -147,7 +152,7 @@
|
||||
"x-instructions_desktop": "Klicke, um Dateien zu senden oder benutze einen Rechtsklick, um eine Nachricht zu senden",
|
||||
"no-peers-title": "Öffne PairDrop auf anderen Geräten, um Dateien zu senden",
|
||||
"no-peers_data-drop-bg": "Hier ablegen, um Empfänger auszuwählen",
|
||||
"no-peers-subtitle": "Kopple Geräte oder betrete einen öffentlichen Raum, um in anderen Netzwerken sichtbar zu sein",
|
||||
"no-peers-subtitle": "Kopple Geräte oder betritt einen öffentlichen Raum, um in anderen Netzwerken sichtbar zu sein",
|
||||
"x-instructions-share-mode_desktop": "Klicke zum Senden von {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "Tippe zum Senden von {{descriptor}}",
|
||||
"x-instructions_data-drop-peer": "Hier ablegen, um an Peer zu senden",
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
"join-public-room_title": "Unirse a una sala pública temporalmente",
|
||||
"notification_title": "Activar notificaciones",
|
||||
"edit-paired-devices_title": "Editar dispositivos emparejados",
|
||||
"theme-light_title": "Siempre usar tema claro"
|
||||
"theme-light_title": "Siempre usar tema claro",
|
||||
"expand_title": "Ampliar la fila de botones de la cabecera",
|
||||
"edit-share-mode": "Editar"
|
||||
},
|
||||
"footer": {
|
||||
"webrtc": "si WebRTC no está disponible.",
|
||||
@@ -73,9 +75,9 @@
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Toque para enviar archivos o toque prologádamente para enviar un mensaje",
|
||||
"x-instructions-share-mode_desktop": "Haga clic para enviar",
|
||||
"x-instructions-share-mode_desktop": "Haga clic para enviar {{descriptor}}",
|
||||
"activate-share-mode-and-other-files-plural": "y {{count}} archivos diferentes",
|
||||
"x-instructions-share-mode_mobile": "Toca para enviar",
|
||||
"x-instructions-share-mode_mobile": "Toque para enviar {{descriptor}}",
|
||||
"activate-share-mode-base": "Abra PairDrop en otros dispositivos para enviar",
|
||||
"no-peers-subtitle": "Empareje dispositivos o ingrese a una sala pública para que lo puedan encontrar en otras redes",
|
||||
"activate-share-mode-shared-text": "texto compartido",
|
||||
@@ -84,7 +86,10 @@
|
||||
"x-instructions_data-drop-peer": "Liberar para enviar a un par",
|
||||
"x-instructions_data-drop-bg": "Liberar para seleccionar destinatario",
|
||||
"no-peers_data-drop-bg": "Liberar para seleccionar destinatario",
|
||||
"webrtc-requirement": "Para utilizar esta instancia de PairDrop, ¡WebRTC debe estar activado!"
|
||||
"webrtc-requirement": "Para utilizar esta instancia de PairDrop, ¡WebRTC debe estar activado!",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} archivos compartidos",
|
||||
"activate-share-mode-shared-file": "archivo compartido",
|
||||
"activate-share-mode-and-other-file": "y 1 archivo más"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Procesando…",
|
||||
@@ -96,7 +101,7 @@
|
||||
"transferring": "Transferiendo…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "Pegar aquí para enviar {{type}}",
|
||||
"base64-paste-to-send": "Pegar el portapapeles aquí para compartir {{type}}",
|
||||
"auto-accept-instructions-2": "para aceptar automáticamente todos los archivos enviados desde ese dispositivo.",
|
||||
"receive-text-title": "Mensaje Recibido",
|
||||
"edit-paired-devices-title": "Editar Dispositivos Emparejados",
|
||||
@@ -112,7 +117,7 @@
|
||||
"join": "Unirse",
|
||||
"title-image-plural": "Imágenes",
|
||||
"send": "Enviar",
|
||||
"base64-tap-to-paste": "Toca aquí para pegar {{type}}",
|
||||
"base64-tap-to-paste": "Pulse aquí para compartir {{type}}",
|
||||
"base64-text": "texto",
|
||||
"copy": "Copiar",
|
||||
"file-other-description-image": "y una imagen mas",
|
||||
@@ -146,7 +151,15 @@
|
||||
"message_title": "Insertar el mensaje a enviar",
|
||||
"pair-devices-qr-code_title": "Haz clic para copiar el enlace para emparejar este dispositivo",
|
||||
"public-room-qr-code_title": "Haz clic para copiar el enlace a la sala pública",
|
||||
"message_placeholder": "Texto"
|
||||
"message_placeholder": "Texto",
|
||||
"close-toast_title": "Cerrar la notificación",
|
||||
"share-text-checkbox": "Mostrar siempre este cuadro de diálogo al compartir texto",
|
||||
"base64-title-files": "Compartir archivos",
|
||||
"approve": "aprobar",
|
||||
"paired-device-removed": "Se ha eliminado el dispositivo emparejado.",
|
||||
"share-text-title": "Compartir un mensaje de texto",
|
||||
"share-text-subtitle": "Edita el mensaje antes de enviarlo:",
|
||||
"base64-title-text": "Compartir el texto"
|
||||
},
|
||||
"about": {
|
||||
"claim": "La forma más sencilla de transferir archivos entre dispositivos",
|
||||
@@ -154,7 +167,11 @@
|
||||
"close-about_aria-label": "Cerrar Sobre PairDrop",
|
||||
"buy-me-a-coffee_title": "¡Cómprame un café!",
|
||||
"github_title": "PairDrop en GitHub",
|
||||
"faq_title": "Preguntas frecuentes"
|
||||
"faq_title": "Preguntas frecuentes",
|
||||
"bluesky_title": "Síganos en BlueSky",
|
||||
"privacypolicy_title": "Abrir nuestra política de privacidad",
|
||||
"mastodon_title": "Escriba sobre PairDrop en Mastodon",
|
||||
"custom_title": "Síguenos en"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Transferencia de archivos solicitada",
|
||||
|
||||
1
public/lang/fi.json
Normal file
1
public/lang/fi.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -11,7 +11,9 @@
|
||||
"pair-device_title": "Associez vos appareils de manière permanente",
|
||||
"edit-paired-devices_title": "Gérer les appareils couplés",
|
||||
"join-public-room_title": "Rejoindre temporairement la salle publique",
|
||||
"cancel-share-mode": "Terminé"
|
||||
"cancel-share-mode": "Terminé",
|
||||
"edit-share-mode": "Modifier",
|
||||
"expand_title": "Agrandir entête bouton ligne"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers_data-drop-bg": "Déposer pour choisir le destinataire",
|
||||
@@ -21,11 +23,15 @@
|
||||
"x-instructions_mobile": "Appuyez pour envoyer des fichiers ou appuyez longuement pour envoyer un message",
|
||||
"x-instructions_data-drop-peer": "Déposer pour envoyer au destinataire",
|
||||
"x-instructions_data-drop-bg": "Lâcher pour choisir le destinataire",
|
||||
"x-instructions-share-mode_desktop": "Cliquez pour envoyer",
|
||||
"x-instructions-share-mode_mobile": "Appuyez pour envoyer",
|
||||
"x-instructions-share-mode_desktop": "Cliquez pour envoyer {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "Appuyez pour envoyer {{descriptor}}",
|
||||
"activate-share-mode-base": "Ouvrez PairDrop sur d'autres appareils pour envoyer",
|
||||
"activate-share-mode-and-other-files-plural": "et {{count}} autres fichiers",
|
||||
"activate-share-mode-shared-text": "texte partagé"
|
||||
"activate-share-mode-shared-text": "texte partagé",
|
||||
"activate-share-mode-shared-file": "fichier partagé",
|
||||
"webrtc-requirement": "Pour utiliser cette instance de PairDrop, WebRTC doit être activé !",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} fichiers partagés",
|
||||
"activate-share-mode-and-other-file": "et un autre fichier"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Vous êtes connu comme :",
|
||||
@@ -70,13 +76,13 @@
|
||||
"share": "Partage",
|
||||
"download": "Télécharger",
|
||||
"send-message-title": "Envoyer un message",
|
||||
"send-message-to": "Envoyer un message à",
|
||||
"send-message-to": "À :",
|
||||
"send": "Envoyer",
|
||||
"receive-text-title": "Message reçu",
|
||||
"copy": "Copier",
|
||||
"base64-processing": "Traitement…",
|
||||
"base64-tap-to-paste": "Appuyez ici pour coller {{type}}",
|
||||
"base64-paste-to-send": "Coller ici pour envoyer {{type}}",
|
||||
"base64-tap-to-paste": "Appuyez ici pour partager {{type}}",
|
||||
"base64-paste-to-send": "Coller ici pour partager {{type}}",
|
||||
"base64-text": "texte",
|
||||
"base64-files": "fichiers",
|
||||
"file-other-description-image": "et 1 autre image",
|
||||
@@ -93,7 +99,16 @@
|
||||
"system-language": "Langue du système",
|
||||
"message_title": "Insérer un message à envoyer",
|
||||
"pair-devices-qr-code_title": "Cliquer pour copier pour appairer l'appareil",
|
||||
"public-room-qr-code_title": "Cliquez pour copier le lien vers le salon public"
|
||||
"public-room-qr-code_title": "Cliquez pour copier le lien vers le salon public",
|
||||
"base64-title-text": "Texte partagé",
|
||||
"paired-device-removed": "L'appareil connecté a été enlevé.",
|
||||
"message_placeholder": "Texte",
|
||||
"base64-title-files": "Fichiers partagés",
|
||||
"approve": "approuve",
|
||||
"share-text-title": "Partage le message",
|
||||
"share-text-subtitle": "Modifier le message avant l'envoi :",
|
||||
"share-text-checkbox": "Toujours montrer ce dialogue quand du texte est partagé",
|
||||
"close-toast_title": "Fermer la notification"
|
||||
},
|
||||
"about": {
|
||||
"close-about_aria-label": "Fermer à propos de PairDrop",
|
||||
@@ -101,7 +116,10 @@
|
||||
"github_title": "PairDrop sur GitHub",
|
||||
"buy-me-a-coffee_title": "Achetez-moi un café !",
|
||||
"tweet_title": "Tweet à propos de PairDrop",
|
||||
"faq_title": "Questions fréquemment posées"
|
||||
"faq_title": "Questions fréquemment posées",
|
||||
"bluesky_title": "Suis-nous sur BlueSky",
|
||||
"custom_title": "Suis-nous",
|
||||
"privacypolicy_title": "Ouvert sur notre politique de confidentialité"
|
||||
},
|
||||
"notifications": {
|
||||
"display-name-changed-permanently": "Le nom d'affichage est modifié de manière permanente",
|
||||
|
||||
1
public/lang/he.json
Normal file
1
public/lang/he.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
184
public/lang/hu.json
Normal file
184
public/lang/hu.json
Normal file
@@ -0,0 +1,184 @@
|
||||
{
|
||||
"header": {
|
||||
"language-selector_title": "Nyelv beállítása",
|
||||
"theme-auto_title": "Téma automatikusan rendszerhez igazítása",
|
||||
"about_aria-label": "\"A PairDrop-ról\" megnyitása",
|
||||
"theme-light_title": "Mindig világos téma használata",
|
||||
"theme-dark_title": "Mindig sötét téma használata",
|
||||
"notification_title": "Értesítések engedélyezése",
|
||||
"install_title": "PairDrop telepítése",
|
||||
"edit-paired-devices_title": "Párosított eszközök szerkeztése",
|
||||
"cancel-share-mode": "Mégse",
|
||||
"edit-share-mode": "Szerkesztés",
|
||||
"expand_title": "Fejléc gombsorának kibővítése",
|
||||
"about_title": "A PairDrop-ról",
|
||||
"pair-device_title": "Eszközei végleges párosítása",
|
||||
"join-public-room_title": "Ideiglenes csatlakozás a nyilvános szobához"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers-title": "Nyissa meg a PairDrop-ot más eszközökön a fájlok küldéséhez",
|
||||
"no-peers_data-drop-bg": "Engedje el a címzett kiválasztásához",
|
||||
"x-instructions_desktop": "Kattintson a fájlküldéshez, vagy kattintson jobb gombbal üzenet küldéséhez",
|
||||
"x-instructions_data-drop-peer": "Engedje el a partnernek való küldéshez",
|
||||
"x-instructions_data-drop-bg": "Engedje el a címzett kiválasztásához",
|
||||
"activate-share-mode-base": "Nyissa meg a PairDrop-ot más eszközökön a küldéséhez",
|
||||
"activate-share-mode-and-other-file": "és egy másik fájl",
|
||||
"activate-share-mode-and-other-files-plural": "és {{count}} másik fájl",
|
||||
"activate-share-mode-shared-file": "megosztott fájl",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} megosztott fájl",
|
||||
"x-instructions_mobile": "Koppintson a fájlküldéshez, vagy nyomja hosszan üzenet küldéséhez",
|
||||
"x-instructions-share-mode_desktop": "Kattintson a {{descriptor}} küldéséhez",
|
||||
"x-instructions-share-mode_mobile": "Koppintson a {{descriptor}} küldéséhez",
|
||||
"activate-share-mode-shared-text": "megosztott szöveg",
|
||||
"webrtc-requirement": "Ezen PairDrop példány használatához engedélyezni kell a WebRTC-t!",
|
||||
"no-peers-subtitle": "Párosítsa eszközeit vagy lépjen be egy nyilvános szobába, hogy más hálózatokon is felfedezhető legyen"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Ön így látható:",
|
||||
"display-name_data-placeholder": "Betöltés…",
|
||||
"display-name_title": "Az eszköze nevének végleges megváltoztatása",
|
||||
"discovery": "Ön felfedezhető:",
|
||||
"on-this-network_title": "Mindenki által felfedezhető a hálózaton.",
|
||||
"paired-devices": "a csatlakoztatott eszközök által",
|
||||
"public-room-devices": "a {{roomId}} szobában",
|
||||
"traffic": "A forgalom",
|
||||
"routed": "a szerveren van átirányítva",
|
||||
"webrtc": "ha nem elérhető a WebRTC.",
|
||||
"on-this-network": "ezen a hálózaton",
|
||||
"paired-devices_title": "A párosított eszközeid által minden esetben felfedezhető a hálózaton, a hálózattól függetlenül.",
|
||||
"public-room-devices_title": "Mindenki által felfedezhető ebben a nyilvános szobában, a hálózattól függetlenül."
|
||||
},
|
||||
"dialogs": {
|
||||
"input-key-on-this-device": "Írja be ezt a kódot egy másik eszközön",
|
||||
"pair-devices-title": "Eszközök végleges párosítása",
|
||||
"temporary-public-room-title": "Ideiglenes nyilvános szoba",
|
||||
"input-room-id-on-another-device": "Írja be ezt a szobakódot egy másik eszközön",
|
||||
"enter-room-id-from-another-device": "Írja be a szobakódot egy másik eszközről a szobához való csatlakozáshoz.",
|
||||
"cancel": "Mégse",
|
||||
"pair": "Párosítás",
|
||||
"edit-paired-devices-title": "Párosított eszközök szerkesztése",
|
||||
"unpair": "Párosítás megszüntetése",
|
||||
"paired-device-removed": "Párosított eszköz eltávolítva.",
|
||||
"paired-devices-wrapper_data-empty": "Nincs párosított eszköz.",
|
||||
"auto-accept": "automatikus elfogadás",
|
||||
"close": "Bezárás",
|
||||
"join": "Csatlakozás",
|
||||
"would-like-to-share": "szeretne megosztani",
|
||||
"accept": "Elfogadás",
|
||||
"has-sent": "küldött:",
|
||||
"share": "Megosztás",
|
||||
"send-message-title": "Üzenet küldése",
|
||||
"send-message-to": "Neki:",
|
||||
"receive-text-title": "Üzenet érkezett",
|
||||
"base64-processing": "Feldolgozás…",
|
||||
"scan-qr-code": "vagy olvassa be a QR-kódot.",
|
||||
"auto-accept-instructions-1": "Aktiválás",
|
||||
"auto-accept-instructions-2": "hogy automatikusan elfogadja az adott eszközről küldött összes fájlt.",
|
||||
"leave": "Kilépés",
|
||||
"decline": "Elutasítás",
|
||||
"download": "Letöltés",
|
||||
"send": "Küldés",
|
||||
"message_title": "Írja be a küldeni kívánt üzenetet",
|
||||
"message_placeholder": "Szöveg",
|
||||
"copy": "Másolás",
|
||||
"base64-title-files": "Fájlok megosztása",
|
||||
"base64-title-text": "Szöveg megosztása",
|
||||
"enter-key-from-another-device": "Ide írja be a kódot egy másik eszközről.",
|
||||
"hr-or": "VAGY",
|
||||
"base64-text": "szöveg",
|
||||
"base64-tap-to-paste": "Koppintson ide a {{type}} megosztásához",
|
||||
"base64-paste-to-send": "Illessze be a ide a vágólapja tartalmát a {{type}} megosztásához",
|
||||
"base64-files": "fájlok",
|
||||
"file-other-description-image": "és egy másik kép",
|
||||
"file-other-description-file": "és egy másik fájl",
|
||||
"file-other-description-image-plural": "és {{count}} másik kép",
|
||||
"file-other-description-file-plural": "és {{count}} másik fájl",
|
||||
"title-image": "Kép",
|
||||
"title-file": "Fájl",
|
||||
"title-image-plural": "Képek",
|
||||
"title-file-plural": "Fájlok",
|
||||
"receive-title": "{{descriptor}} érkezett",
|
||||
"download-again": "Letöltés újra",
|
||||
"language-selector-title": "Nyelv beállítása",
|
||||
"system-language": "Rendszer nyelve",
|
||||
"approve": "jóváhagyás",
|
||||
"share-text-title": "Szöveges üzenet megosztása",
|
||||
"share-text-subtitle": "Üzenet szerkesztése küldés előtt:",
|
||||
"share-text-checkbox": "Mindig mutassa ezt a párbeszédablakot üzenet megosztásakor",
|
||||
"close-toast_title": "Értesítés bezárása",
|
||||
"public-room-qr-code_title": "Kattintson a szoba linkjének másolásához",
|
||||
"pair-devices-qr-code_title": "Kattintson az eszköz párosításához való link másolásához"
|
||||
},
|
||||
"notifications": {
|
||||
"online-requirement-pairing": "Online kell lennie készülékek párosításához",
|
||||
"link-received": "Link érkezett tőle: {{name}} - Kattintson a megnyitáshoz",
|
||||
"selected-peer-left": "A kiválasztott partner kilépett",
|
||||
"display-name-changed-permanently": "A megjelenített neved véglegesen meg lett változtatva",
|
||||
"download-successful": "{{descriptor}} letöltve",
|
||||
"pairing-tabs-error": "Két böngészőlap párosítása lehetetlen",
|
||||
"display-name-random-again": "A megjelenített neved véletlenszerűen újra lett generálva",
|
||||
"pairing-key-invalid": "Érvénytelen kulcs",
|
||||
"pairing-cleared": "Minden eszköz párosítása megszüntetve",
|
||||
"public-room-id-invalid": "Érvénytelen szobakód",
|
||||
"copied-to-clipboard": "Vágólapra másolva",
|
||||
"copied-to-clipboard-error": "Másolás nem lehetséges. Manuális másolás szükséges.",
|
||||
"text-content-incorrect": "A szöveg tartalma helytelen",
|
||||
"file-content-incorrect": "A fájl tartalma helytelen",
|
||||
"pair-url-copied-to-clipboard": "Az eszköz párosítására való link másolva a vágólapra",
|
||||
"notifications-enabled": "Értesítések engedélyezve",
|
||||
"request-title": "{{name}} szeretne küldeni: {{count}} {{descriptor}}",
|
||||
"copied-text-error": "A vágólapra való írás nem sikerült. Manuális másolás szükséges.",
|
||||
"click-to-download": "Kattintson a letöltéshez",
|
||||
"click-to-show": "Kattintson a megjelenítéshez",
|
||||
"connected": "Csatlakoztatva",
|
||||
"online": "Újra online lett",
|
||||
"connecting": "Csatlakozás…",
|
||||
"files-incorrect": "A fájlok helytelenek",
|
||||
"file-transfer-completed": "A fájlok küldése sikeres",
|
||||
"message-transfer-completed": "Üzenet küldése sikeres",
|
||||
"unfinished-transfers-warning": "Befejezetlen átvitelek folyamatban. Biztosan be akarja zárni a PairDrop-ot?",
|
||||
"pairing-success": "Eszközök párosítva",
|
||||
"pairing-not-persistent": "A párosított eszközök nem maradandóak",
|
||||
"pairing-key-invalidated": "{{key}} kulcs érvénytelenítve",
|
||||
"public-room-left": "{{publicRoomId}} szoba elhagyva",
|
||||
"online-requirement-public-room": "Online kell lennie szoba készítéséhez",
|
||||
"ios-memory-limit": "Egyszerre csak 200 MB-os fájlátvitel lehetséges iOS-re való küldéskor",
|
||||
"room-url-copied-to-clipboard": "A nyilvános szoba linkje másolva a vágólapra",
|
||||
"clipboard-content-incorrect": "A vágólap tartalma helytelen",
|
||||
"copied-text": "Szöveg másolva a vágólapra",
|
||||
"message-received": "Üzenet érkezett tőle: {{name}} - Kattintson a másoláshoz",
|
||||
"notifications-permissions-error": "Az értesítések engedélye letiltásra került, mivel a felhasználó többször is elutasította az engedélykérést. Ez visszaállítható az oldalinformációkban, amely az URL-sáv melletti lakat ikonra kattintva érhet el.",
|
||||
"offline": "Ön offline",
|
||||
"rate-limit-join-key": "Az átviteli sebességhatár elérte a határt. Várjon 10 másodpercet, és próbálja meg újra.",
|
||||
"display-name-changed-temporarily": "A megjelenített neved meg lett változtatva csak erre a munkamenetre"
|
||||
},
|
||||
"about": {
|
||||
"close-about_aria-label": "A PairDrop-ról bezárása",
|
||||
"github_title": "PairDrop a GitHub-on",
|
||||
"buy-me-a-coffee_title": "Vegyél nekem egy kávét!",
|
||||
"mastodon_title": "Írj a PairDrop-ról Mastodon-on",
|
||||
"bluesky_title": "Kövess minket a BlueSky-on",
|
||||
"faq_title": "Gyakran ismételt kérdések",
|
||||
"claim": "Az eszközök közötti fájlátvitel legegyszerűbb módja",
|
||||
"tweet_title": "Tweetelj a PairDrop-ról",
|
||||
"custom_title": "Kövess minket",
|
||||
"privacypolicy_title": "Nyisd meg az adatvédelmi szabályzatunkat"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "Fájl érkezett",
|
||||
"file-received-plural": "{{count}} fájl érkezett",
|
||||
"image-transfer-requested": "Képátvitel kérelmezve",
|
||||
"message-received": "Üzenet érkezett",
|
||||
"message-received-plural": "{{count}} üzenet érkezett",
|
||||
"file-transfer-requested": "Fájlátvitel kérelmezve"
|
||||
},
|
||||
"peer-ui": {
|
||||
"preparing": "Előkészítés…",
|
||||
"click-to-send-share-mode": "Kattintson a {{descriptor}} küldéséhez",
|
||||
"waiting": "Várakozás…",
|
||||
"processing": "Feldolgozás…",
|
||||
"transferring": "Átvitel…",
|
||||
"click-to-send": "Kattintson fájlok küldéséhez vagy kattintson jobb gombbal üzenet küldéséhez",
|
||||
"connection-hash": "A végpontok közötti titkosítás biztonságának ellenőrzéséhez hasonlítsa össze ezt a biztonsági számot mindkét eszközön"
|
||||
}
|
||||
}
|
||||
@@ -58,7 +58,7 @@
|
||||
"room-url-copied-to-clipboard": "Tautan ke ruang publik disalin ke papan klip"
|
||||
},
|
||||
"header": {
|
||||
"cancel-share-mode": "Selesai",
|
||||
"cancel-share-mode": "Batalkan",
|
||||
"theme-auto_title": "Sesuaikan tema dengan sistem",
|
||||
"install_title": "Instal PairDrop",
|
||||
"theme-dark_title": "Selalu gunakan tema gelap",
|
||||
@@ -69,13 +69,15 @@
|
||||
"language-selector_title": "Atur Bahasa",
|
||||
"about_title": "Tentang PairDrop",
|
||||
"about_aria-label": "Buka Tentang PairDrop",
|
||||
"theme-light_title": "Selalu gunakan tema terang"
|
||||
"theme-light_title": "Selalu gunakan tema terang",
|
||||
"edit-share-mode": "Sunting",
|
||||
"expand_title": "Perluas baris tombol header"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan",
|
||||
"x-instructions-share-mode_desktop": "Klik untuk mengirim",
|
||||
"x-instructions-share-mode_desktop": "Klik untuk mengirim {{descriptor}}",
|
||||
"activate-share-mode-and-other-files-plural": "dan {{count}} file lainnya",
|
||||
"x-instructions-share-mode_mobile": "Ketuk untuk mengirim",
|
||||
"x-instructions-share-mode_mobile": "Ketuk untuk mengirim {{descriptor}}",
|
||||
"activate-share-mode-base": "Buka PairDrop di perangkat lain untuk berkirim",
|
||||
"no-peers-subtitle": "Pasangkan perangkat atau masuk ke ruang publik agar dapat terdeteksi di jaringan lain",
|
||||
"activate-share-mode-shared-text": "teks bersama",
|
||||
@@ -83,7 +85,11 @@
|
||||
"no-peers-title": "Buka PairDrop di perangkat lain untuk berkirim file",
|
||||
"x-instructions_data-drop-peer": "Lepaskan untuk mengirim ke rekan",
|
||||
"x-instructions_data-drop-bg": "Lepaskan untuk memilih penerima",
|
||||
"no-peers_data-drop-bg": "Lepaskan untuk memilih penerima"
|
||||
"no-peers_data-drop-bg": "Lepaskan untuk memilih penerima",
|
||||
"activate-share-mode-and-other-file": "dan 1 file lainnya",
|
||||
"activate-share-mode-shared-file": "file yang dibagikan",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} file yang dibagikan",
|
||||
"webrtc-requirement": "Untuk menggunakan instance PairDrop ini, WebRTC harus diaktifkan!"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Memproses…",
|
||||
@@ -111,7 +117,7 @@
|
||||
"join": "Gabung",
|
||||
"title-image-plural": "Gambar",
|
||||
"send": "Kirim",
|
||||
"base64-tap-to-paste": "Ketuk di sini untuk menempelkan {{type}}",
|
||||
"base64-tap-to-paste": "Ketuk di sini untuk membagikan{{type}}",
|
||||
"base64-text": "teks",
|
||||
"copy": "Salin",
|
||||
"file-other-description-image": "dan 1 gambar lainnya",
|
||||
@@ -125,7 +131,7 @@
|
||||
"title-image": "Gambar",
|
||||
"file-other-description-file-plural": "dan {{count}} file lainnya",
|
||||
"would-like-to-share": "ingin berbagi",
|
||||
"send-message-to": "Kirim pesan ke",
|
||||
"send-message-to": "Ke:",
|
||||
"language-selector-title": "Pilih Bahasa",
|
||||
"pair": "Pasangkan",
|
||||
"hr-or": "ATAU",
|
||||
@@ -144,7 +150,11 @@
|
||||
"enter-room-id-from-another-device": "Masukkan room ID dari perangkat lain untuk bergabung dengan room.",
|
||||
"message_title": "Masukkan pesan untuk dikirim",
|
||||
"pair-devices-qr-code_title": "Klik untuk menyalin tautan untuk memasangkan perangkat ini",
|
||||
"public-room-qr-code_title": "Klik untuk menyalin tautan ke ruang publik"
|
||||
"public-room-qr-code_title": "Klik untuk menyalin tautan ke ruang publik",
|
||||
"base64-title-files": "Bagikan File",
|
||||
"base64-title-text": "Bagikan Teks",
|
||||
"message_placeholder": "Teks",
|
||||
"paired-device-removed": "Perangkat yang dipasangkan telah dihapus."
|
||||
},
|
||||
"about": {
|
||||
"claim": "Cara termudah untuk mentransfer file lintas perangkat",
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
"display-name_data-placeholder": "Caricamento…",
|
||||
"display-name_title": "Modifica il nome del tuo dispositivo permanentemente",
|
||||
"traffic": "Il traffico è",
|
||||
"paired-devices_title": "Puoi essere rilevato dai dispositivi abbinati in ogni momento, indipendentemente dalla rete.",
|
||||
"paired-devices_title": "Puoi essere rilevato dai dispositivi associati in ogni momento, indipendentemente dalla rete.",
|
||||
"public-room-devices": "nella stanza {{roomId}}",
|
||||
"paired-devices": "da dispositivi abbinati",
|
||||
"paired-devices": "da dispositivi associati",
|
||||
"on-this-network": "su questa rete",
|
||||
"routed": "instradato attraverso il server",
|
||||
"discovery": "Puoi essere rilevato:",
|
||||
@@ -15,7 +15,7 @@
|
||||
"known-as": "Sei visibile come:"
|
||||
},
|
||||
"header": {
|
||||
"cancel-share-mode": "Fatto",
|
||||
"cancel-share-mode": "Annulla",
|
||||
"theme-auto_title": "Adatta il tema al sistema automaticamente",
|
||||
"install_title": "Installa PairDrop",
|
||||
"theme-dark_title": "Usa sempre il tema scuro",
|
||||
@@ -26,13 +26,15 @@
|
||||
"language-selector_title": "Imposta Lingua",
|
||||
"about_title": "Informazioni su PairDrop",
|
||||
"about_aria-label": "Apri Informazioni su PairDrop",
|
||||
"theme-light_title": "Usa sempre il tema chiaro"
|
||||
"theme-light_title": "Usa sempre il tema chiaro",
|
||||
"edit-share-mode": "Modifica",
|
||||
"expand_title": "Espandi la riga dei pulsanti nell'intestazione"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Tocca per inviare file o tocco prolungato per inviare un messaggio",
|
||||
"x-instructions-share-mode_desktop": "Clicca per inviare",
|
||||
"x-instructions-share-mode_desktop": "Clicca per inviare {{descriptor}}",
|
||||
"activate-share-mode-and-other-files-plural": "e altri {{count}} files",
|
||||
"x-instructions-share-mode_mobile": "Tocca per inviare",
|
||||
"x-instructions-share-mode_mobile": "Tocca per inviare {{descriptor}}",
|
||||
"activate-share-mode-base": "Apri PairDrop su altri dispositivi per inviare",
|
||||
"no-peers-subtitle": "Abbina dispositivi o entra in una stanza pubblica per essere rilevabile su altre reti",
|
||||
"activate-share-mode-shared-text": "testo condiviso",
|
||||
@@ -40,23 +42,27 @@
|
||||
"no-peers-title": "Apri PairDrop su altri dispositivi per inviare files",
|
||||
"x-instructions_data-drop-peer": "Rilascia per inviare al peer",
|
||||
"x-instructions_data-drop-bg": "Rilascia per selezionare il destinatario",
|
||||
"no-peers_data-drop-bg": "Rilascia per selezionare il destinatario"
|
||||
"no-peers_data-drop-bg": "Rilascia per selezionare il destinatario",
|
||||
"webrtc-requirement": "Per usare questa istanza di PairDrop, devi attivare WebRTC!",
|
||||
"activate-share-mode-shared-file": "file condiviso",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} files condivisi",
|
||||
"activate-share-mode-and-other-file": "ed 1 altro file"
|
||||
},
|
||||
"dialogs": {
|
||||
"auto-accept-instructions-2": "per accettare automaticamente tutti i files inviati da quel dispositivo.",
|
||||
"edit-paired-devices-title": "Modifica Dispositivi Abbinati",
|
||||
"edit-paired-devices-title": "Modifica Dispositivi Associati",
|
||||
"cancel": "Annulla",
|
||||
"auto-accept-instructions-1": "Attiva",
|
||||
"pair-devices-title": "Abbina Dispositivi Permanentemente",
|
||||
"pair-devices-title": "Associa Dispositivi Permanentemente",
|
||||
"temporary-public-room-title": "Stanza Pubblica Temporanea",
|
||||
"close": "Chiudi",
|
||||
"unpair": "Dissocia",
|
||||
"pair": "Abbina",
|
||||
"pair": "Associa",
|
||||
"scan-qr-code": "o scannerizza il codice QR.",
|
||||
"input-key-on-this-device": "Inserisci questo codice su un altro dispositivo",
|
||||
"paired-devices-wrapper_data-empty": "Nessun dispositivo abbinato.",
|
||||
"paired-devices-wrapper_data-empty": "Nessun dispositivo associato.",
|
||||
"enter-key-from-another-device": "Inserisci il codice dell'altro dispositivo qui.",
|
||||
"auto-accept": "accetta-automaticamente",
|
||||
"auto-accept": "accetta automaticamente",
|
||||
"input-room-id-on-another-device": "Inserisci l'ID di questa stanza su un altro dispositivo",
|
||||
"enter-room-id-from-another-device": "Inserisci l'ID stanza da un altro dispositivo per accedere alla stanza.",
|
||||
"base64-paste-to-send": "Incolla qui per inviare {{type}}",
|
||||
@@ -70,7 +76,7 @@
|
||||
"join": "Unisciti",
|
||||
"title-image-plural": "Immagini",
|
||||
"send": "Invia",
|
||||
"base64-tap-to-paste": "Tocca qui per incollare {{type}}",
|
||||
"base64-tap-to-paste": "Tocca qui per condividere {{type}}",
|
||||
"base64-text": "testo",
|
||||
"copy": "Copia",
|
||||
"file-other-description-image": "e 1 altra immagine",
|
||||
@@ -81,7 +87,7 @@
|
||||
"title-image": "Immagine",
|
||||
"file-other-description-file-plural": "e altri {{count}} files",
|
||||
"would-like-to-share": "vorrebbe condividere",
|
||||
"send-message-to": "Invia un messaggio a",
|
||||
"send-message-to": "A:",
|
||||
"language-selector-title": "Imposta Lingua",
|
||||
"hr-or": "OPPURE",
|
||||
"download-again": "Scarica ancora",
|
||||
@@ -91,11 +97,20 @@
|
||||
"send-message-title": "Invia Messaggio",
|
||||
"file-other-description-image-plural": "e {{count}} altre immagini",
|
||||
"message_title": "Inserire messaggio da inviare",
|
||||
"pair-devices-qr-code_title": "Clicca per copiare il link di abbinamento di questo dispositivo",
|
||||
"public-room-qr-code_title": "Clicca per copirare il link della stanza pubblica"
|
||||
"pair-devices-qr-code_title": "Clicca per copiare il link di associazione a questo dispositivo",
|
||||
"public-room-qr-code_title": "Clicca per copirare il link della stanza pubblica",
|
||||
"message_placeholder": "Testo",
|
||||
"paired-device-removed": "Il dispositivo associato è stato rimosso.",
|
||||
"base64-title-files": "Condividi Files",
|
||||
"base64-title-text": "Condividi Testo",
|
||||
"share-text-subtitle": "Modifica messaggio prima dell'invio:",
|
||||
"share-text-checkbox": "Mostra sempre questa casella di dialogo quando si condivide del testo",
|
||||
"approve": "accetta",
|
||||
"share-text-title": "Condividi Messaggio di Testo",
|
||||
"close-toast_title": "Chiudi notifica"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}} vorrebbe trasferire {{count}} {{descriptor}}",
|
||||
"request-title": "{{name}} vorrebbe inviare {{count}} {{descriptor}}",
|
||||
"unfinished-transfers-warning": "Ci sono dei trasferimenti in corso. Sei sicuro di voler chiudere PairDrop?",
|
||||
"message-received": "Messaggio ricevuto da {{name}} - Clicca per copiare",
|
||||
"rate-limit-join-key": "Limite raggiunto. Aspetta 10 secondi e riprova.",
|
||||
@@ -103,22 +118,22 @@
|
||||
"pairing-key-invalidated": "Il codice {{key}} è stato invalidato",
|
||||
"pairing-key-invalid": "Codice non valido",
|
||||
"connected": "Connesso",
|
||||
"pairing-not-persistent": "I dispositivi abbinati non sono persistenti",
|
||||
"text-content-incorrect": "Il contenuto testuale non è corretto",
|
||||
"pairing-not-persistent": "I dispositivi associati non sono permanenti",
|
||||
"text-content-incorrect": "Il contenuto di testo è errato",
|
||||
"message-transfer-completed": "Trasferimento del messaggio completato",
|
||||
"file-transfer-completed": "Trasferimento file completato",
|
||||
"file-content-incorrect": "Il contenuto del file non è corretto",
|
||||
"files-incorrect": "I file non sono corretti",
|
||||
"selected-peer-left": "Peer selezionato ha abbandonato",
|
||||
"file-content-incorrect": "Il contenuto del file è errato",
|
||||
"files-incorrect": "I file sono errati",
|
||||
"selected-peer-left": "Il peer selezionato ha abbandonato",
|
||||
"link-received": "Link ricevuto da {{name}} - Clicca per aprire",
|
||||
"online": "Sei di nuovo online",
|
||||
"public-room-left": "Ha lasciato la stanza pubblica {{publicRoomId}}",
|
||||
"public-room-left": "Hai abbandonato la stanza pubblica {{publicRoomId}}",
|
||||
"copied-text": "Testo copiato negli appunti",
|
||||
"display-name-random-again": "Il nome visualizzato è generato casualmente un'altra volta",
|
||||
"display-name-changed-permanently": "Il nome visualizzato è cambiato permanentemente",
|
||||
"copied-to-clipboard-error": "La copia non è possibile. Copia manualmente.",
|
||||
"pairing-success": "Dispositivi abbinati",
|
||||
"clipboard-content-incorrect": "Il contenuto copiato non è corretto",
|
||||
"display-name-random-again": "Il nome visualizzato viene di nuovo generato casualmente",
|
||||
"display-name-changed-permanently": "Il nome visualizzato è cambiato definitivamente",
|
||||
"copied-to-clipboard-error": "La funzione di copia non è possibile. Copia manualmente.",
|
||||
"pairing-success": "Dispositivi associati",
|
||||
"clipboard-content-incorrect": "Il contenuto copiato è errato",
|
||||
"display-name-changed-temporarily": "Il nome visualizzato è cambiato solo per questa sessione",
|
||||
"copied-to-clipboard": "Copiato negli appunti",
|
||||
"offline": "Sei offline",
|
||||
@@ -127,14 +142,14 @@
|
||||
"click-to-download": "Clicca per scaricare",
|
||||
"pairing-cleared": "Tutti i dispositivi sono stati dissociati",
|
||||
"notifications-enabled": "Notifiche attivate",
|
||||
"online-requirement-pairing": "Devi essere online per abbinare dispositivi",
|
||||
"online-requirement-pairing": "Devi essere online per associare dispositivi",
|
||||
"ios-memory-limit": "L'invio di file a dispositivi iOS è possibile solo 200 MB alla volta",
|
||||
"online-requirement-public-room": "Devi essere online per creare una stanza pubblica",
|
||||
"copied-text-error": "Scrittura negli appunti fallita. Copia manualmente!",
|
||||
"download-successful": "{{descriptor}} scaricato",
|
||||
"click-to-show": "Clicca per mostrare",
|
||||
"notifications-permissions-error": "Il permesso all'invio delle notifiche è stato negato poiché l'utente ha ignorato varie volte le richieste di permesso. Ciò può essere ripristinato nelle \"informazioni sito\" cliccando sull'icona a forma di lucchetto vicino alla barra degli indirizzi.",
|
||||
"pair-url-copied-to-clipboard": "Link di abbinamento copiato negli appunti",
|
||||
"pair-url-copied-to-clipboard": "Link di associazione copiato negli appunti",
|
||||
"room-url-copied-to-clipboard": "Link della stanza copiato negli appunti"
|
||||
},
|
||||
"peer-ui": {
|
||||
@@ -150,14 +165,18 @@
|
||||
"claim": "Il modo più semplice per trasferire files tra dispositivi",
|
||||
"tweet_title": "Twitta riguardo PairDrop",
|
||||
"close-about_aria-label": "Chiudi Informazioni su PairDrop",
|
||||
"buy-me-a-coffee_title": "Comprami un caffè!",
|
||||
"buy-me-a-coffee_title": "Offrimi un caffè!",
|
||||
"github_title": "PairDrop su GitHub",
|
||||
"faq_title": "Domande Frequenti"
|
||||
"faq_title": "Domande Frequenti",
|
||||
"mastodon_title": "Scrivi su Mastodon di PairDrop",
|
||||
"bluesky_title": "Seguici su BlueSky",
|
||||
"custom_title": "Seguici",
|
||||
"privacypolicy_title": "Apri la nostra policy sulla privacy"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Trasferimento File Richiesto",
|
||||
"image-transfer-requested": "Trasferimento Immagine Richiesto",
|
||||
"message-received-plural": "{{count}} Messaggi ricevuti",
|
||||
"message-received-plural": "{{count}} Messaggi Ricevuti",
|
||||
"message-received": "Messaggio ricevuto",
|
||||
"file-received": "File Ricevuto",
|
||||
"file-received-plural": "{{count}} Files Ricevuti"
|
||||
|
||||
@@ -69,13 +69,15 @@
|
||||
"language-selector_title": "言語を設定",
|
||||
"about_title": "PairDropについて",
|
||||
"about_aria-label": "PairDropについてを開く",
|
||||
"theme-light_title": "常にライトテーマを使用する"
|
||||
"theme-light_title": "常にライトテーマを使用する",
|
||||
"edit-share-mode": "編集",
|
||||
"expand_title": "ヘッダーボタン列を拡大する"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "タップしてファイルを送信または長押ししてメッセージを送信します",
|
||||
"x-instructions-share-mode_desktop": "クリックして送信",
|
||||
"x-instructions-share-mode_desktop": "クリックして{{descriptor}}送信",
|
||||
"activate-share-mode-and-other-files-plural": "とその他{{count}}個のファイル",
|
||||
"x-instructions-share-mode_mobile": "タップして送信",
|
||||
"x-instructions-share-mode_mobile": "タップして{{descriptor}}送信",
|
||||
"activate-share-mode-base": "他のデバイスでPairDropを開いて送信します",
|
||||
"no-peers-subtitle": "デバイスをペア設定するかパブリックルームに参加すると、他のネットワーク上からも見つけられるようになります",
|
||||
"activate-share-mode-shared-text": "共有されたテキスト",
|
||||
@@ -83,7 +85,11 @@
|
||||
"no-peers-title": "他のデバイスでPairDropを開いてファイルを送信します",
|
||||
"x-instructions_data-drop-peer": "離すとこの相手に送信します",
|
||||
"x-instructions_data-drop-bg": "送信したい相手の上で離してください",
|
||||
"no-peers_data-drop-bg": "送信したい相手の上で離してください"
|
||||
"no-peers_data-drop-bg": "送信したい相手の上で離してください",
|
||||
"activate-share-mode-and-other-file": "もう1つの別のファイル",
|
||||
"activate-share-mode-shared-file": "共有されたファイル",
|
||||
"activate-share-mode-shared-files-plural": "{{count}}個の共有されたファイル",
|
||||
"webrtc-requirement": "このPairDropインスタンスを使用するには、WebRTCを有効にする必要があります!"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "処理中…",
|
||||
@@ -144,7 +150,16 @@
|
||||
"enter-room-id-from-another-device": "他のデバイスに表示された参加したいルームのIDを入力します。",
|
||||
"message_title": "送信するメッセージを挿入",
|
||||
"pair-devices-qr-code_title": "クリックしてこのデバイスをペア設定するリンクをコピー",
|
||||
"public-room-qr-code_title": "クリックしてパブリックルームへのリンクをコピー"
|
||||
"public-room-qr-code_title": "クリックしてパブリックルームへのリンクをコピー",
|
||||
"paired-device-removed": "ペア設定されたデバイスが削除されました。",
|
||||
"message_placeholder": "テキスト",
|
||||
"base64-title-files": "共有されたファイル",
|
||||
"base64-title-text": "テキストを共有",
|
||||
"approve": "承諾",
|
||||
"share-text-subtitle": "送信する前にメッセージを編集する:",
|
||||
"share-text-checkbox": "テキストを共有するときに常にこのダイアログを表示する",
|
||||
"close-toast_title": "通知を閉じる",
|
||||
"share-text-title": "テキストメッセージを共有します"
|
||||
},
|
||||
"about": {
|
||||
"claim": "デバイス間でファイルを転送する最も簡単な方法",
|
||||
@@ -152,7 +167,11 @@
|
||||
"close-about_aria-label": "PairDropについてを閉じる",
|
||||
"buy-me-a-coffee_title": "コーヒーをおごってください!",
|
||||
"github_title": "GitHubでPairDropを見る",
|
||||
"faq_title": "FAQ"
|
||||
"faq_title": "FAQ",
|
||||
"mastodon_title": "MastodonにPairDropについて書く",
|
||||
"bluesky_title": "BlueSkyでフォロー",
|
||||
"custom_title": "フォロー",
|
||||
"privacypolicy_title": "プライバシーポリシーを開く"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "ファイルの転送がリクエストされました",
|
||||
|
||||
@@ -11,11 +11,14 @@
|
||||
"edit-paired-devices_title": "ಜೋಡಿಯಾಗಿರುವ ಸಾಧನಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ",
|
||||
"language-selector_title": "ಭಾಷೆಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ",
|
||||
"about_aria-label": "PairDrop ಕುರಿತು ಪುಟವನ್ನು ತೆರೆಯಿರಿ",
|
||||
"theme-light_title": "ಯಾವಾಗಲೂ ಲೈಟ್ ಥೀಮ್ ಅನ್ನು ಬಳಸಿ"
|
||||
"theme-light_title": "ಯಾವಾಗಲೂ ಲೈಟ್ ಥೀಮ್ ಅನ್ನು ಬಳಸಿ",
|
||||
"edit-share-mode": "ಎಡಿಟ್ ಮಾಡಿ",
|
||||
"cancel-share-mode": "ರದ್ದುಗೊಳಿಸಿ",
|
||||
"expand_title": "ಹೆಡರ್ ಬಟನ್ ಸಾಲನ್ನು ವಿಸ್ತರಿಸಿ"
|
||||
},
|
||||
"dialogs": {
|
||||
"message_placeholder": "ಪಠ್ಯ",
|
||||
"base64-paste-to-send": "{{type}} ಕಳುಹಿಸಲು ಇಲ್ಲಿ ಅಂಟಿಸಿ",
|
||||
"base64-paste-to-send": "{{type}} ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಕ್ಲಿಪ್ಬೋರ್ಡ್ ಅನ್ನು ಇಲ್ಲಿ ಅಂಟಿಸಿ",
|
||||
"auto-accept-instructions-2": "ಆ ಸಾಧನದಿಂದ ಕಳುಹಿಸಲಾದ ಎಲ್ಲಾ ಫೈಲ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸ್ವೀಕರಿಸಲು.",
|
||||
"receive-text-title": "ಸಂದೇಶವನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ",
|
||||
"edit-paired-devices-title": "ಜೋಡಿಯಾಗಿರುವ ಸಾಧನಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ",
|
||||
@@ -32,7 +35,7 @@
|
||||
"join": "ಸೇರಿಕೊಳ್ಳಿ",
|
||||
"title-image-plural": "ಚಿತ್ರಗಳು",
|
||||
"send": "ಕಳುಹಿಸಿ",
|
||||
"base64-tap-to-paste": "{{type}} ಅಂಟಿಸಲು ಇಲ್ಲಿ ಟ್ಯಾಪ್ ಮಾಡಿ",
|
||||
"base64-tap-to-paste": "{{type}} ಹಂಚಿಕೊಳ್ಳಲು ಇಲ್ಲಿ ಟ್ಯಾಪ್ ಮಾಡಿ",
|
||||
"base64-text": "ಪಠ್ಯ",
|
||||
"copy": "ನಕಲು ಮಾಡಿ",
|
||||
"file-other-description-image": "ಮತ್ತು ಇನ್ನೊಂದು ಚಿತ್ರ",
|
||||
@@ -64,7 +67,15 @@
|
||||
"send-message-title": "ಸಂದೇಶ ಕಳುಹಿಸಿ",
|
||||
"input-room-id-on-another-device": "ಇನ್ನೊಂದು ಸಾಧನದಲ್ಲಿ ಈ ರೂಮ್ ಐಡಿಯನ್ನು ನಮೂದಿಸಿ",
|
||||
"file-other-description-image-plural": "ಮತ್ತು {{count}} ಇತರ ಚಿತ್ರಗಳು",
|
||||
"enter-room-id-from-another-device": "ಕೊಠಡಿ ಸೇರಲು ಇನ್ನೊಂದು ಸಾಧನದಿಂದ ರೂಮ್ ಐಡಿ ನಮೂದಿಸಿ."
|
||||
"enter-room-id-from-another-device": "ಕೊಠಡಿ ಸೇರಲು ಇನ್ನೊಂದು ಸಾಧನದಿಂದ ರೂಮ್ ಐಡಿ ನಮೂದಿಸಿ.",
|
||||
"close-toast_title": "ಅಧಿಸೂಚನೆಯನ್ನು ಮುಚ್ಚಿರಿ",
|
||||
"share-text-checkbox": "ಪಠ್ಯವನ್ನು ಹಂಚಿಕೊಳ್ಳುವಾಗ ಯಾವಾಗಲೂ ಈ ಡೈಲಾಗ್ ಅನ್ನು ತೋರಿಸಿ",
|
||||
"base64-title-files": "ಫೈಲ್ಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ",
|
||||
"approve": "ಅನುಮೋದಿಸಿ",
|
||||
"paired-device-removed": "ಜೋಡಿಸಲಾದ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ.",
|
||||
"share-text-title": "ಪಠ್ಯ ಸಂದೇಶವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ",
|
||||
"share-text-subtitle": "ಸಂದೇಶವನ್ನು ಕಳುಹಿಸುವ ಮೊದಲು ಎಡಿಟ್ ಮಾಡಿ:",
|
||||
"base64-title-text": "ಪಠ್ಯವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"
|
||||
},
|
||||
"footer": {
|
||||
"webrtc": "WebRTC ಲಭ್ಯವಿಲ್ಲದಿದ್ದರೆ.",
|
||||
@@ -137,7 +148,15 @@
|
||||
"x-instructions_data-drop-peer": "ಪೀರ್ಗೆ ಕಳುಹಿಸಲು ಬಿಡುಗಡೆ ಮಾಡಿ",
|
||||
"x-instructions_data-drop-bg": "ಸ್ವೀಕರಿಸುವವರನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಬಿಡುಗಡೆ ಮಾಡಿ",
|
||||
"no-peers_data-drop-bg": "ಸ್ವೀಕರಿಸುವವರನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಬಿಡುಗಡೆ ಮಾಡಿ",
|
||||
"webrtc-requirement": "ಈ PairDrop ನಿದರ್ಶನವನ್ನು ಬಳಸಲು, WebRTC ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು!"
|
||||
"webrtc-requirement": "ಈ PairDrop ನಿದರ್ಶನವನ್ನು ಬಳಸಲು, WebRTC ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು!",
|
||||
"activate-share-mode-base": "ಕಳುಹಿಸಲು ಇತರ ಸಾಧನಗಳಲ್ಲಿ PairDrop ತೆರೆಯಿರಿ",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} ಹಂಚಿದ ಫೈಲ್ಗಳು",
|
||||
"x-instructions-share-mode_desktop": "{{descriptor}} ಕಳುಹಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ",
|
||||
"activate-share-mode-shared-file": "ಹಂಚಿದ ಫೈಲ್",
|
||||
"activate-share-mode-and-other-file": "ಮತ್ತು ಇತರ 1 ಫೈಲ್",
|
||||
"x-instructions-share-mode_mobile": "{{descriptor}} ಕಳುಹಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ",
|
||||
"activate-share-mode-and-other-files-plural": "ಮತ್ತು ಇತರ {{count}} ಫೈಲ್ಗಳು",
|
||||
"activate-share-mode-shared-text": "ಹಂಚಿದ ಪಠ್ಯ"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತಿದೆ…",
|
||||
@@ -146,7 +165,8 @@
|
||||
"waiting": "ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ…",
|
||||
"connection-hash": "ಎಂಡ್-ಟು-ಎಂಡ್ ಎನ್ಕ್ರಿಪ್ಶನ್ನ ಭದ್ರತೆಯನ್ನು ಪರಿಶೀಲಿಸಲು, ಎರಡೂ ಸಾಧನಗಳಲ್ಲಿ ಈ ಭದ್ರತಾ ಸಂಖ್ಯೆಯನ್ನು ಹೋಲಿಸಿ",
|
||||
"preparing": "ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ…",
|
||||
"transferring": "ವರ್ಗಾಯಿಸಲಾಗುತ್ತಿದೆ…"
|
||||
"transferring": "ವರ್ಗಾಯಿಸಲಾಗುತ್ತಿದೆ…",
|
||||
"click-to-send-share-mode": "{{descriptor}} ಕಳುಹಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ"
|
||||
},
|
||||
"about": {
|
||||
"claim": "ಸಾಧನಗಳಾದ್ಯಂತ ಫೈಲ್ಗಳನ್ನು ವರ್ಗಾಯಿಸಲು ಸುಲಭವಾದ ಮಾರ್ಗ",
|
||||
@@ -154,7 +174,11 @@
|
||||
"close-about_aria-label": "PairDrop ಕುರಿತು ಪುಟವನ್ನು ಮುಚ್ಚಿ",
|
||||
"buy-me-a-coffee_title": "ನನಗೆ ಕಾಫಿ ಖರೀದಿಸಿ!",
|
||||
"github_title": "GitHub ನಲ್ಲಿ PairDrop",
|
||||
"faq_title": "ಪದೇ ಪದೇ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು"
|
||||
"faq_title": "ಪದೇ ಪದೇ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು",
|
||||
"bluesky_title": "BlueSky ನಲ್ಲಿ ನಮ್ಮನ್ನು ಅನುಸರಿಸಿ",
|
||||
"privacypolicy_title": "ನಮ್ಮ ಗೌಪ್ಯತೆ ನೀತಿ ತೆರೆಯಿರಿ",
|
||||
"mastodon_title": "Mastodon ನಲ್ಲಿ PairDrop ಕುರಿತು ಬರೆಯಿರಿ",
|
||||
"custom_title": "ನಮ್ಮನ್ನು ಅನುಸರಿಸಿ"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "ಫೈಲ್ ವರ್ಗಾವಣೆಗೆ ವಿನಂತಿಸಲಾಗಿದೆ",
|
||||
|
||||
@@ -52,7 +52,10 @@
|
||||
"online-requirement-public-room": "U moet online zijn om een openbare kamer te maken",
|
||||
"copied-text-error": "Schrijven naar klembord mislukt. Kopieer handmatig!",
|
||||
"download-successful": "{{descriptor}} downloaden",
|
||||
"click-to-show": "Klik om te tonen"
|
||||
"click-to-show": "Klik om te tonen",
|
||||
"pair-url-copied-to-clipboard": "Koppeling om dit apparaat te koppelen is gekopieerd naar het klembord",
|
||||
"room-url-copied-to-clipboard": "Koppeling naar openbare kamer gekopieerd naar klembord",
|
||||
"notifications-permissions-error": "Meldingsmachtiging is geblokkeerd, omdat de gebruiker het machtigingsverzoek meerdere keren heeft afgewezen. Dit kan worden gereset in instellingen van de website, welke toegangelijk is door te klikken op het sloticoon naast de URL-balk."
|
||||
},
|
||||
"header": {
|
||||
"cancel-share-mode": "Klaar",
|
||||
@@ -66,13 +69,15 @@
|
||||
"language-selector_title": "Taal Selecteren",
|
||||
"about_title": "Over PairDrop",
|
||||
"about_aria-label": "Open Over PairDrop",
|
||||
"theme-light_title": "Altijd lichte modus gebruiken"
|
||||
"theme-light_title": "Altijd lichte modus gebruiken",
|
||||
"expand_title": "Knoppenrij uitvouwen",
|
||||
"edit-share-mode": "Bewerken"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Tik om bestanden te versturen of houdt vast om een bericht te sturen",
|
||||
"x-instructions-share-mode_desktop": "Klik om te verzenden",
|
||||
"x-instructions-share-mode_desktop": "Klik om te verzenden {{descriptor}}",
|
||||
"activate-share-mode-and-other-files-plural": "en {{count}} andere bestanden",
|
||||
"x-instructions-share-mode_mobile": "Tik om te verzenden",
|
||||
"x-instructions-share-mode_mobile": "Tik om te verzenden {{descriptor}}",
|
||||
"activate-share-mode-base": "Open PairDrop op andere apparaten om te verzenden",
|
||||
"no-peers-subtitle": "Koppel apparaten of betreed een openbare ruimte om op andere netwerken zichtbaar te worden",
|
||||
"activate-share-mode-shared-text": "gedeelde tekst",
|
||||
@@ -80,7 +85,11 @@
|
||||
"no-peers-title": "Open PairDrop op andere apparaten om bestanden te versturen",
|
||||
"x-instructions_data-drop-peer": "Laat los om naar peer te versturen",
|
||||
"x-instructions_data-drop-bg": "Loslaten om ontvanger te selecteren",
|
||||
"no-peers_data-drop-bg": "Loslaten om ontvanger te kiezen"
|
||||
"no-peers_data-drop-bg": "Loslaten om ontvanger te kiezen",
|
||||
"activate-share-mode-and-other-file": "en 1 ander bestand",
|
||||
"activate-share-mode-shared-file": "gedeeld bestand",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} gedeelde bestanden",
|
||||
"webrtc-requirement": "Om deze PairDrop instantie te kunnen gebruiken, moet WebRTC geactiveerd zijn!"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Verwerken…",
|
||||
@@ -92,7 +101,7 @@
|
||||
"transferring": "Overdragen…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "Plak hier om {{type}} te versturen",
|
||||
"base64-paste-to-send": "Plak klembord hier om {{type}} te versturen",
|
||||
"auto-accept-instructions-2": "om automatisch alle bestanden van dat apparaat te accepteren.",
|
||||
"receive-text-title": "Bericht Ontvangen",
|
||||
"edit-paired-devices-title": "Gekoppelde Apparaten Bewerken",
|
||||
@@ -108,7 +117,7 @@
|
||||
"join": "Betreden",
|
||||
"title-image-plural": "Afbeeldingen",
|
||||
"send": "Verzenden",
|
||||
"base64-tap-to-paste": "Hier tikken om {{type}} te plakken",
|
||||
"base64-tap-to-paste": "Hier tikken om {{type}} te delen",
|
||||
"base64-text": "tekst",
|
||||
"copy": "Kopiëren",
|
||||
"file-other-description-image": "en één andere afbeelding",
|
||||
@@ -122,7 +131,7 @@
|
||||
"title-image": "Afbeelding",
|
||||
"file-other-description-file-plural": "en {{count}} andere bestanden",
|
||||
"would-like-to-share": "zou graag het volgende willen delen",
|
||||
"send-message-to": "Verstuur een bericht naar",
|
||||
"send-message-to": "Aan:",
|
||||
"language-selector-title": "Taal Instellen",
|
||||
"pair": "Koppel",
|
||||
"hr-or": "OF",
|
||||
@@ -138,7 +147,19 @@
|
||||
"send-message-title": "Bericht Sturen",
|
||||
"input-room-id-on-another-device": "Voer de kamer ID in op een ander apparaat",
|
||||
"file-other-description-image-plural": "en {{count}} andere afbeeldingen",
|
||||
"enter-room-id-from-another-device": "Voer de kamer ID van een ander apparaat hier in."
|
||||
"enter-room-id-from-another-device": "Voer de kamer ID van een ander apparaat hier in.",
|
||||
"paired-device-removed": "Gekoppelde apparaten zijn verwijderd.",
|
||||
"message_title": "Voer bericht in om te versturen",
|
||||
"message_placeholder": "Tekst",
|
||||
"base64-title-files": "Deel Bestanden",
|
||||
"base64-title-text": "Deel Tekst",
|
||||
"public-room-qr-code_title": "Klik, om de link naar deze openbare ruimte te kopiëren",
|
||||
"approve": "goedkeuren",
|
||||
"share-text-title": "Gedeeld Tekst Bericht",
|
||||
"share-text-checkbox": "Deze dialoog altijd tonen bij het delen van tekst",
|
||||
"close-toast_title": "Bericht sluiten",
|
||||
"pair-devices-qr-code_title": "Klik om de koppeling te kopiëren om dit apparaat te koppelen",
|
||||
"share-text-subtitle": "Bewerk bericht voor verzending:"
|
||||
},
|
||||
"about": {
|
||||
"claim": "De makkelijkste manier om bestanden tussen apparaten te versturen",
|
||||
@@ -146,7 +167,11 @@
|
||||
"close-about_aria-label": "Sluit Over PairDrop",
|
||||
"buy-me-a-coffee_title": "Koop een kopje koffie voor mij!",
|
||||
"github_title": "PairDrop op GitHub",
|
||||
"faq_title": "Veel gestelde vragen"
|
||||
"faq_title": "Veel gestelde vragen",
|
||||
"mastodon_title": "Schrijf over PairDrop op Mastodon",
|
||||
"bluesky_title": "Volg ons op BlueSky",
|
||||
"custom_title": "Volg ons",
|
||||
"privacypolicy_title": "Open ons privacybeleid"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Bestandsoverdracht verzocht",
|
||||
|
||||
184
public/lang/pl.json
Normal file
184
public/lang/pl.json
Normal file
@@ -0,0 +1,184 @@
|
||||
{
|
||||
"header": {
|
||||
"language-selector_title": "Ustaw język",
|
||||
"about_aria-label": "Otwórz \"O PairDrop\"",
|
||||
"theme-light_title": "Zawsze używaj jasnego motywu",
|
||||
"theme-dark_title": "Zawsze używaj ciemnego motywu",
|
||||
"pair-device_title": "Sparuj swoje urządzenia na stałe",
|
||||
"edit-paired-devices_title": "Edytuj sparowane urządzenia",
|
||||
"join-public-room_title": "Dołącz tymczasowo do pokoju publicznego",
|
||||
"cancel-share-mode": "Anuluj",
|
||||
"edit-share-mode": "Edytuj",
|
||||
"expand_title": "Rozwiń rząd przycisków",
|
||||
"about_title": "O PairDrop",
|
||||
"theme-auto_title": "Dostosuj motyw do motywu systemowego",
|
||||
"notification_title": "Włącz powiadomienia",
|
||||
"install_title": "Zainstaluj PairDrop"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers_data-drop-bg": "Zwolnij, aby wybrać odbiorcę",
|
||||
"no-peers-title": "Otwórz PairDrop na innych urządzeniach, aby wysłać pliki",
|
||||
"x-instructions_desktop": "Kliknij, aby wysłać pliki lub kliknij prawym przyciskiem myszy, aby wysłać wiadomość",
|
||||
"x-instructions_mobile": "Naciśnij, aby wysłać pliki lub naciśnij i przytrzymaj, aby wysłać wiadomość",
|
||||
"x-instructions_data-drop-bg": "Zwolnij, aby wybrać odbiorcę",
|
||||
"x-instructions-share-mode_desktop": "Kliknij, aby wysłać {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "Naciśnij, aby wysłać {{descriptor}}",
|
||||
"activate-share-mode-base": "Otwórz PairDrop na innych urządzeniach, aby wysłać",
|
||||
"activate-share-mode-and-other-file": "i 1 inny plik",
|
||||
"activate-share-mode-shared-text": "udostępniony tekst",
|
||||
"activate-share-mode-shared-file": "udostępniony plik",
|
||||
"no-peers-subtitle": "Sparuj urządzenia lub wejdź do pokoju publicznego, aby być widocznym w innych sieciach",
|
||||
"x-instructions_data-drop-peer": "Zwolnij, aby wysłać do odbiorcy",
|
||||
"activate-share-mode-and-other-files-plural": "i {{count}} innych plików",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} udostępnionych plików",
|
||||
"webrtc-requirement": "Aby móc korzystać z tej instancji PairDrop, należy włączyć WebRTC!"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Jesteś widoczny jako:",
|
||||
"display-name_data-placeholder": "Ładowanie…",
|
||||
"display-name_title": "Edytuj nazwę swojego urządzenia na stałe",
|
||||
"on-this-network": "w tej sieci",
|
||||
"on-this-network_title": "Możesz być znaleziony przez każdego w tej sieci.",
|
||||
"paired-devices": "przez sparowane urządzenia",
|
||||
"discovery": "Możesz być wykryty:",
|
||||
"paired-devices_title": "Możesz zostać wykryty przez sparowane urządzenia przez cały czas, niezależnie od sieci.",
|
||||
"public-room-devices": "w pokoju {{roomId}}",
|
||||
"public-room-devices_title": "Możesz zostać wykryty przez urządzenia w tym pokoju publicznym, niezależnie od sieci.",
|
||||
"routed": "przesyłane przez serwer",
|
||||
"webrtc": "jeśli WebRTC jest niedostępny.",
|
||||
"traffic": "Transmisja jest"
|
||||
},
|
||||
"dialogs": {
|
||||
"pair-devices-title": "Sparuj Urządzenia Na Stałe",
|
||||
"enter-key-from-another-device": "Wpisz tu klucz z innego urządzenia.",
|
||||
"temporary-public-room-title": "Tymczasowy Pokój Publiczny",
|
||||
"enter-room-id-from-another-device": "Wprowadź ID pokoju z innego urządzenia, aby wejść do pokoju.",
|
||||
"hr-or": "LUB",
|
||||
"pair": "Sparuj",
|
||||
"cancel": "Anuluj",
|
||||
"edit-paired-devices-title": "Edycja Sparowanych Urządzeń",
|
||||
"unpair": "Rozłącz sparowanie",
|
||||
"paired-devices-wrapper_data-empty": "Brak sparowanych urządzeń.",
|
||||
"auto-accept-instructions-1": "Aktywuj",
|
||||
"auto-accept-instructions-2": ", aby automatycznie przyjąć wszystkie pliki wysłane z tego urządzenia.",
|
||||
"auto-accept": "samoczynne potwierdzanie",
|
||||
"close": "Zamknij",
|
||||
"join": "Dołącz",
|
||||
"leave": "Opuść",
|
||||
"accept": "Akceptuj",
|
||||
"decline": "Odrzuć",
|
||||
"has-sent": "wysłał:",
|
||||
"share": "Udostępnij",
|
||||
"send-message-title": "Wyślij Wiadomość",
|
||||
"send-message-to": "Do:",
|
||||
"message_title": "Wprowadź wiadomość do wysłania",
|
||||
"message_placeholder": "Tekst",
|
||||
"receive-text-title": "Wiadomość Odebrana",
|
||||
"copy": "Kopiuj",
|
||||
"base64-title-files": "Udostępnij Pliki",
|
||||
"base64-title-text": "Udostępnij Tekst",
|
||||
"base64-processing": "Przetwarzanie…",
|
||||
"base64-tap-to-paste": "Naciśnij tutaj, aby udostępnić {{type}}",
|
||||
"base64-text": "tekst",
|
||||
"base64-files": "pliki",
|
||||
"file-other-description-image": "i 1 inny obraz",
|
||||
"file-other-description-image-plural": "i {{count}} innych obrazów",
|
||||
"file-other-description-file-plural": "i {{count}} innych plików",
|
||||
"title-image": "Obraz",
|
||||
"title-image-plural": "Obrazy",
|
||||
"title-file-plural": "Pliki",
|
||||
"receive-title": "{{descriptor}} Otrzymano",
|
||||
"download-again": "Pobierz ponownie",
|
||||
"download": "Pobierz",
|
||||
"language-selector-title": "Ustaw Język",
|
||||
"system-language": "Język Systemu",
|
||||
"file-other-description-file": "i 1 inny plik",
|
||||
"pair-devices-qr-code_title": "Kliknij, aby skopiować odnośnik do sparowania urządzenia",
|
||||
"approve": "zatwierdź",
|
||||
"share-text-subtitle": "Edytuj wiadomość przed wysłaniem:",
|
||||
"share-text-checkbox": "Zawsze pokazuj to okno, gdy udostępniasz tekst",
|
||||
"paired-device-removed": "Sparowane urządzenie zostało usunięte.",
|
||||
"would-like-to-share": "chciałby udostępnić",
|
||||
"input-key-on-this-device": "Wprowadź ten klucz na innym urządzeniu",
|
||||
"send": "Wyślij",
|
||||
"scan-qr-code": "lub zeskanuj kod QR.",
|
||||
"base64-paste-to-send": "Wklej tutaj, aby udostępnić {{type}}",
|
||||
"title-file": "Plik",
|
||||
"input-room-id-on-another-device": "Wprowadź ID tego pokoju na innym urządzeniu",
|
||||
"public-room-qr-code_title": "Kliknij, aby skopiować odnośnik do pokoju publicznego",
|
||||
"share-text-title": "Udostępnij Wiadomość Tekstową",
|
||||
"close-toast_title": "Zamknij powiadomienie"
|
||||
},
|
||||
"about": {
|
||||
"close-about_aria-label": "Zamknij \"O PairDrop\"",
|
||||
"claim": "Najłatwiejszy sposób na przesyłanie plików między urządzeniami",
|
||||
"buy-me-a-coffee_title": "Kup me kawę!",
|
||||
"mastodon_title": "Napisz o PairDrop na Mastodonie",
|
||||
"bluesky_title": "Śledź nas na BlueSky",
|
||||
"custom_title": "Śledź nas",
|
||||
"privacypolicy_title": "Otwórz naszą Politykę Prywatności",
|
||||
"faq_title": "Często zadawane pytania (FAQ)",
|
||||
"github_title": "PairDrop na GitHub",
|
||||
"tweet_title": "Tweetnij o PairDrop"
|
||||
},
|
||||
"notifications": {
|
||||
"display-name-changed-permanently": "Wyświetlana nazwa została zmieniona na stałe",
|
||||
"display-name-random-again": "Wyświetlana nazwa została ponownie wygenerowana",
|
||||
"download-successful": "{{descriptor}} pobrano",
|
||||
"pairing-tabs-error": "Sparowanie dwóch kart w przeglądarce jest niemożliwe",
|
||||
"pairing-success": "Sparowane urządzenia",
|
||||
"pairing-key-invalid": "Nieprawidłowy klucz",
|
||||
"pairing-key-invalidated": "Klucz {{key}} unieważniony",
|
||||
"public-room-id-invalid": "Nieprawidłowe ID pokoju",
|
||||
"pairing-cleared": "Wszystkie urządzenia rozłączone",
|
||||
"public-room-left": "Opuściłeś pokój publiczny {{publicRoomId}}",
|
||||
"copied-to-clipboard-error": "Kopiowanie niemożliwe. Skopiuj ręcznie.",
|
||||
"text-content-incorrect": "Treść tekstu jest nieprawidłowa",
|
||||
"file-content-incorrect": "Zawartość pliku jest nieprawidłowa",
|
||||
"clipboard-content-incorrect": "Zawartość schowka jest nieprawidłowa",
|
||||
"pair-url-copied-to-clipboard": "Link do sparowania tego urządzenia skopiowano do schowka",
|
||||
"link-received": "Otrzymano link od {{name}} - Kliknij, aby otworzyć",
|
||||
"message-received": "Otrzymano wiadomość od {{name}} - Kliknij, aby skopiować",
|
||||
"click-to-download": "Kliknij, aby pobrać",
|
||||
"request-title": "{{name}} chciałby przesłać {{count}} {{descriptor}}",
|
||||
"click-to-show": "Kliknij, żeby pokazać",
|
||||
"copied-text": "Tekst skopiowany do schowka",
|
||||
"copied-text-error": "Zapis do schowka nie powiódł się. Skopiuj ręcznie!",
|
||||
"offline": "Jesteś offline",
|
||||
"online": "Jesteś znów online",
|
||||
"connected": "Połączony",
|
||||
"online-requirement-pairing": "Aby sparować urządzenia, musisz być online",
|
||||
"online-requirement-public-room": "Aby utworzyć pokój publiczny, musisz być online",
|
||||
"connecting": "Łączenie…",
|
||||
"files-incorrect": "Pliki są nieprawidłowe",
|
||||
"file-transfer-completed": "Przesyłanie plików zakończone",
|
||||
"ios-memory-limit": "Jednorazowe przesyłanie plików do iOS jest możliwe tylko do 200 MB",
|
||||
"message-transfer-completed": "Przesyłanie wiadomości zakończone",
|
||||
"unfinished-transfers-warning": "Istnieją niedokończone transfery. Czy na pewno chcesz zamknąć PairDrop?",
|
||||
"rate-limit-join-key": "Osiągnięto limit. Poczekaj 10 sekund i spróbuj ponownie.",
|
||||
"selected-peer-left": "Wybrany uczestnik opuścił",
|
||||
"display-name-changed-temporarily": "Wyświetlana nazwa została zmieniona na czas tej sesji",
|
||||
"pairing-not-persistent": "Połączenie sparowanych urządzeń nie jest trwałe",
|
||||
"copied-to-clipboard": "Skopiowano do schowka",
|
||||
"room-url-copied-to-clipboard": "Link do publicznego pokoju skopiowano do schowka",
|
||||
"notifications-enabled": "Powiadomienia włączone",
|
||||
"notifications-permissions-error": "Uprawnienia do powiadomień zostały zablokowane, ponieważ użytkownik kilkakrotnie odrzucił monit o pozwolenie na nie. Można je zresetować w \"Informacjach o [stronie]\", do których można uzyskać dostęp, klikając ikonę kłódki obok paska adresu URL."
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "Plik Odebrany",
|
||||
"file-received-plural": "{{count}} Plików Odebranych",
|
||||
"file-transfer-requested": "Zażądano Przesłania Pliku",
|
||||
"image-transfer-requested": "Zażądano Przesłania Obrazu",
|
||||
"message-received": "Otrzymano Wiadomość",
|
||||
"message-received-plural": "{{count}} Wiadomości Odebranych"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send-share-mode": "Kliknij, aby wysłać {{descriptor}}",
|
||||
"click-to-send": "Kliknij, aby wysłać pliki lub kliknij prawym przyciskiem myszy, aby wysłać wiadomość",
|
||||
"connection-hash": "Aby sprawdzić bezpieczeństwo szyfrowania end-to-end, porównaj ten numer bezpieczeństwa na obu urządzeniach",
|
||||
"preparing": "Przygotowanie…",
|
||||
"waiting": "Oczekiwanie…",
|
||||
"processing": "Przetwarzanie…",
|
||||
"transferring": "Przesyłanie…"
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
"pair-device_title": "Emparelhar seus dispositivos permanentemente",
|
||||
"edit-paired-devices_title": "Editar dispositivos emparelhados",
|
||||
"join-public-room_title": "Entrar em uma sala pública temporariamente",
|
||||
"cancel-share-mode": "Concluído",
|
||||
"cancel-share-mode": "Cancelar",
|
||||
"edit-share-mode": "Editar"
|
||||
},
|
||||
"instructions": {
|
||||
@@ -22,8 +22,8 @@
|
||||
"x-instructions_mobile": "Toque para enviar arquivos ou toque e segure para enviar uma mensagem",
|
||||
"x-instructions_data-drop-peer": "Solte para enviar para o par",
|
||||
"x-instructions_data-drop-bg": "Solte para selecionar o destinatário",
|
||||
"x-instructions-share-mode_desktop": "Clique para enviar",
|
||||
"x-instructions-share-mode_mobile": "Toque para enviar",
|
||||
"x-instructions-share-mode_desktop": "Clique para enviar {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "Toque para enviar {{descriptor}}",
|
||||
"activate-share-mode-base": "Abra o PairDrop em outros dispositivos para enviar",
|
||||
"activate-share-mode-and-other-files-plural": "e {{count}} outros arquivos",
|
||||
"activate-share-mode-shared-text": "texto compartilhado",
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
"room-url-copied-to-clipboard": "Link către sala publică copiat în clipboard"
|
||||
},
|
||||
"header": {
|
||||
"cancel-share-mode": "Gata",
|
||||
"cancel-share-mode": "Anulare",
|
||||
"theme-auto_title": "Adaptează tema la sistem",
|
||||
"install_title": "Instalează PairDrop",
|
||||
"theme-dark_title": "Utilizați mereu tema întunecoasă",
|
||||
@@ -69,13 +69,15 @@
|
||||
"language-selector_title": "Setează Limba",
|
||||
"about_title": "Despre PairDrop",
|
||||
"about_aria-label": "Deschide Despre PairDrop",
|
||||
"theme-light_title": "Utilizați mereu tema luminoasă"
|
||||
"theme-light_title": "Utilizați mereu tema luminoasă",
|
||||
"expand_title": "Extindeți rândul de butoane antet",
|
||||
"edit-share-mode": "Editați"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Atingeți pentru a trimite fișiere sau atingeți lung pentru a trimite un mesaj",
|
||||
"x-instructions-share-mode_desktop": "Clic pentru a trimite",
|
||||
"x-instructions-share-mode_desktop": "Faceți clic pentru a trimite {{descriptor}}",
|
||||
"activate-share-mode-and-other-files-plural": "și {{count}} alte fișiere",
|
||||
"x-instructions-share-mode_mobile": "Atinge pentru a trimite",
|
||||
"x-instructions-share-mode_mobile": "Atingeți pentru a trimite {{descriptor}}",
|
||||
"activate-share-mode-base": "Deschideți PairDrop pe alte dispozitive pentru a trimite",
|
||||
"no-peers-subtitle": "Împerecheați dispozitive sau intrați într-o cameră publică pentru a fi descoperit în alte rețele",
|
||||
"activate-share-mode-shared-text": "text partajat",
|
||||
@@ -83,7 +85,11 @@
|
||||
"no-peers-title": "Deschideți PairDrop pe alte dispozitive pentru a trimite fișiere",
|
||||
"x-instructions_data-drop-peer": "Eliberare pentru a trimite la peer",
|
||||
"x-instructions_data-drop-bg": "Eliberați pentru a selecta recipientul",
|
||||
"no-peers_data-drop-bg": "Eliberare pentru a selecta recipientul"
|
||||
"no-peers_data-drop-bg": "Eliberați pentru a selecta destinatarul",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} fișiere partajate",
|
||||
"activate-share-mode-shared-file": "fișier partajat",
|
||||
"activate-share-mode-and-other-file": "și încă 1 fișier",
|
||||
"webrtc-requirement": "Pentru a utiliza această instanță PairDrop, WebRTC trebuie să fie activat!"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Procesarea…",
|
||||
@@ -95,7 +101,7 @@
|
||||
"transferring": "Transferul…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "Lipiți aici pentru a trimite {{type}}",
|
||||
"base64-paste-to-send": "Inserați clipboard aici pentru a distribui {{type}}",
|
||||
"auto-accept-instructions-2": "pentru a accepta automat toate fișierele trimise de la dispozitivul respectiv.",
|
||||
"receive-text-title": "Mesaj primit",
|
||||
"edit-paired-devices-title": "Editați dispozitivele asociate",
|
||||
@@ -111,7 +117,7 @@
|
||||
"join": "Alătură-te",
|
||||
"title-image-plural": "Imagini",
|
||||
"send": "Trimite",
|
||||
"base64-tap-to-paste": "Atinge aici pentru a lipi {{type}}",
|
||||
"base64-tap-to-paste": "Atingeți aici pentru a distribui {{type}}",
|
||||
"base64-text": "text",
|
||||
"copy": "Copiază",
|
||||
"file-other-description-image": "și 1 altă imagine",
|
||||
@@ -125,7 +131,7 @@
|
||||
"title-image": "Imagine",
|
||||
"file-other-description-file-plural": "și {{count}} alte fișiere",
|
||||
"would-like-to-share": "ar dori să împărtășească",
|
||||
"send-message-to": "Trimite un mesaj la",
|
||||
"send-message-to": "La:",
|
||||
"language-selector-title": "Setați Limba",
|
||||
"pair": "Cuplu",
|
||||
"hr-or": "SAU",
|
||||
@@ -144,7 +150,16 @@
|
||||
"enter-room-id-from-another-device": "Introdu ID-ul camerei de pe un alt dispozitiv pentru a intra în cameră.",
|
||||
"message_title": "Inserați mesajul de trimis",
|
||||
"pair-devices-qr-code_title": "Dați clic pentru a copia link-ul pentru a asocia acest dispozitiv",
|
||||
"public-room-qr-code_title": "Dați clic pentru a copia link-ul în sala publică"
|
||||
"public-room-qr-code_title": "Dați clic pentru a copia link-ul în sala publică",
|
||||
"message_placeholder": "Text",
|
||||
"close-toast_title": "Închideți notificarea",
|
||||
"share-text-checkbox": "Afișați întotdeauna acest dialog atunci când partajați text",
|
||||
"base64-title-files": "Distribuie fisiere",
|
||||
"approve": "aprobă",
|
||||
"paired-device-removed": "Dispozitivul asociat a fost eliminat.",
|
||||
"share-text-title": "Partajați un mesaj text",
|
||||
"share-text-subtitle": "Editați mesajul înainte de a-l trimite:",
|
||||
"base64-title-text": "Partajați textul"
|
||||
},
|
||||
"about": {
|
||||
"claim": "Cel mai simplu mod de a transfera fișiere între dispozitive",
|
||||
@@ -152,7 +167,11 @@
|
||||
"close-about_aria-label": "Închide Despre PairDrop",
|
||||
"buy-me-a-coffee_title": "Cumpără-mi o cafea!",
|
||||
"github_title": "PairDrop pe GitHub",
|
||||
"faq_title": "Întrebări frecvente"
|
||||
"faq_title": "Întrebări frecvente",
|
||||
"bluesky_title": "Urmărește-ne pe BlueSky",
|
||||
"privacypolicy_title": "Deschideți politica noastră de confidențialitate",
|
||||
"mastodon_title": "Scrieți despre PairDrop pe Mastodon",
|
||||
"custom_title": "Urmăriți-ne"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Transfer de fișiere cerut",
|
||||
|
||||
@@ -11,14 +11,15 @@
|
||||
"theme-dark_title": "Всегда использовать темную тему",
|
||||
"theme-light_title": "Всегда использовать светлую тему",
|
||||
"join-public-room_title": "Войти на время в публичную комнату",
|
||||
"language-selector_title": "Выбрать язык"
|
||||
"language-selector_title": "Выбрать язык",
|
||||
"edit-share-mode": "Редактировать"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_desktop": "Нажмите, чтобы отправить файлы, или щелкните правой кнопкой мыши, чтобы отправить сообщение",
|
||||
"no-peers_data-drop-bg": "Отпустите, чтобы выбрать получателя",
|
||||
"x-instructions-share-mode_desktop": "Нажмите, чтобы отправить",
|
||||
"x-instructions-share-mode_desktop": "Нажмите, чтобы отправить {{descriptor}}",
|
||||
"x-instructions_data-drop-bg": "Отпустите, чтобы выбрать получателя",
|
||||
"x-instructions-share-mode_mobile": "Прикоснитесь, чтобы отправить",
|
||||
"x-instructions-share-mode_mobile": "Прикоснитесь, чтобы отправить {{descriptor}}",
|
||||
"x-instructions_data-drop-peer": "Отпустите, чтобы послать узлу",
|
||||
"x-instructions_mobile": "Прикоснитесь коротко, чтобы отправить файлы, или долго, чтобы отправить сообщение",
|
||||
"no-peers-title": "Откройте PairDrop на других устройствах, чтобы отправить файлы",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"header": {
|
||||
"about_title": "PairDrop Hakkında",
|
||||
"about_aria-label": "PairDrop Hakkında Aç",
|
||||
"about_aria-label": "PairDrop Hakkındayı Aç",
|
||||
"theme-auto_title": "Temayı sisteme uyarla",
|
||||
"theme-light_title": "Daima açık tema kullan",
|
||||
"theme-dark_title": "Daima koyu tema kullan",
|
||||
@@ -12,18 +12,19 @@
|
||||
"cancel-share-mode": "Bitti",
|
||||
"join-public-room_title": "Geçici olarak genel odaya katılın",
|
||||
"language-selector_title": "Dili Seç",
|
||||
"edit-share-mode": "Düzenle"
|
||||
"edit-share-mode": "Düzenle",
|
||||
"expand_title": "Başlık düğmesi satırını genişlet"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers_data-drop-bg": "Alıcıyı seçmek için bırakın",
|
||||
"x-instructions_mobile": "Dosya göndermek için dokun veya mesaj göndermek için uzun dokun",
|
||||
"x-instructions-share-mode_desktop": "Göndermek için tıkla {{descriptor}}",
|
||||
"x-instructions-share-mode_desktop": "{{descriptor}} kişisine göndermek için tıkla",
|
||||
"activate-share-mode-and-other-files-plural": "ve {{count}} diğer dosya",
|
||||
"x-instructions-share-mode_mobile": "Göndermek için dokun {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "{{descriptor}} kişisine göndermek için dokun",
|
||||
"activate-share-mode-base": "Göndermek için diğer cihazlarda PairDrop'u açın",
|
||||
"no-peers-subtitle": "Diğer ağlarda keşfedilebilir olmak için cihazları eşleştirin veya ortak bir odaya girin",
|
||||
"activate-share-mode-shared-text": "paylaşılan metin",
|
||||
"x-instructions_desktop": "Dosya göndermek için tıkla ya da mesaj göndermek için sağ tıkla",
|
||||
"x-instructions_desktop": "Dosya göndermek için tıkla veya mesaj göndermek için sağ tıkla",
|
||||
"no-peers-title": "Dosya göndermek için diğer cihazlarda PairDrop'u açın",
|
||||
"x-instructions_data-drop-peer": "Göndermek için serbest bırak",
|
||||
"x-instructions_data-drop-bg": "Alıcıyı seçmek için bırakın",
|
||||
@@ -131,11 +132,11 @@
|
||||
"public-room-left": "{{publicRoomId}} genel odasından ayrıldın",
|
||||
"copied-text": "Metin panoya kopyalandı",
|
||||
"display-name-random-again": "Mevcut adın tekrardan rastgele oluşturuldu",
|
||||
"display-name-changed-permanently": "Mevcut adın kalıcı olarak değiştirilir",
|
||||
"display-name-changed-permanently": "Mevcut adın kalıcı olarak değiştirildi",
|
||||
"copied-to-clipboard-error": "Kopyalama mümkün değil. Manuel olarak kopyalayın.",
|
||||
"pairing-success": "Cihazlar eşleştirildi",
|
||||
"clipboard-content-incorrect": "Pano içeriği yanlış",
|
||||
"display-name-changed-temporarily": "Mevcut adın yalnızca bu oturum için değiştirilir",
|
||||
"display-name-changed-temporarily": "Mevcut adın yalnızca bu oturum için değiştirildi",
|
||||
"copied-to-clipboard": "Panoya kopyalandı",
|
||||
"offline": "Çevrimdışısın",
|
||||
"pairing-tabs-error": "İki web tarayıcı sekmesini eşleştirmek mümkün değildir",
|
||||
@@ -149,7 +150,7 @@
|
||||
"room-url-copied-to-clipboard": "Genel oda bağlantı linki panoya kopyalandı",
|
||||
"copied-text-error": "Panoya kopyalanamadı. Lütfen manuel olarak kopyalayın!",
|
||||
"download-successful": "{{descriptor}} indirildi",
|
||||
"click-to-show": "Göstermek için tıkla"
|
||||
"click-to-show": "Görmek için tıkla"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "İşleniyor…",
|
||||
@@ -166,7 +167,11 @@
|
||||
"close-about_aria-label": "PairDrop Hakkında'yı Kapat",
|
||||
"buy-me-a-coffee_title": "Bana bir kahve al!",
|
||||
"github_title": "GitHub'da PairDrop",
|
||||
"faq_title": "Sıkça sorulan sorular"
|
||||
"faq_title": "Sıkça sorulan sorular",
|
||||
"custom_title": "Bizi takip edin",
|
||||
"privacypolicy_title": "Gizlilik politikamızı açın",
|
||||
"mastodon_title": "Mastodon'da PairDrop hakkında yazın",
|
||||
"bluesky_title": "Bizi BlueSky'da takip edin"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Dosya Transferi Talep Edildi",
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
"cancel-share-mode": "完成",
|
||||
"join-public-room_title": "暂时加入公共房间",
|
||||
"language-selector_title": "设置语言",
|
||||
"edit-share-mode": "编辑"
|
||||
"edit-share-mode": "编辑",
|
||||
"expand_title": "展开标题按钮行"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_data-drop-peer": "释放以发送到此设备",
|
||||
@@ -114,7 +115,11 @@
|
||||
"github_title": "PairDrop 在 GitHub 上开源",
|
||||
"claim": "最简单的跨设备传输方案",
|
||||
"buy-me-a-coffee_title": "帮我买杯咖啡!",
|
||||
"tweet_title": "关于 PairDrop 的推特"
|
||||
"tweet_title": "关于 PairDrop 的推特",
|
||||
"bluesky_title": "在 BlueSky 上关注",
|
||||
"privacypolicy_title": "打开隐私政策",
|
||||
"mastodon_title": "在 Maston 上推广 PairDrop",
|
||||
"custom_title": "关注我们"
|
||||
},
|
||||
"notifications": {
|
||||
"display-name-changed-permanently": "展示的名字已经永久变更",
|
||||
|
||||
1
public/lang/zh-HK.json
Normal file
1
public/lang/zh-HK.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
184
public/lang/zh-TW.json
Normal file
184
public/lang/zh-TW.json
Normal file
@@ -0,0 +1,184 @@
|
||||
{
|
||||
"header": {
|
||||
"language-selector_title": "設定語言",
|
||||
"theme-auto_title": "自動使用系統主題",
|
||||
"cancel-share-mode": "取消",
|
||||
"edit-share-mode": "編輯",
|
||||
"expand_title": "展開標題按鈕列",
|
||||
"about_title": "關於 PairDrop",
|
||||
"about_aria-label": "開啟關於 PairDrop",
|
||||
"theme-dark_title": "總是使用深色主題",
|
||||
"notification_title": "啟用通知",
|
||||
"install_title": "安裝 PairDrop",
|
||||
"pair-device_title": "永久配對你的裝置",
|
||||
"edit-paired-devices_title": "編輯已配對的裝置",
|
||||
"join-public-room_title": "暫時加入公共房間",
|
||||
"theme-light_title": "總是使用淺色主題"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers_data-drop-bg": "釋放以選擇接收者",
|
||||
"no-peers-subtitle": "配對裝置或加入一個公共房間以便在其他網路上可見",
|
||||
"x-instructions_mobile": "輕觸以發送檔案或輕觸並按住以發送一則訊息",
|
||||
"x-instructions_data-drop-bg": "釋放以選擇接收者",
|
||||
"x-instructions-share-mode_desktop": "點擊以發送 {{descriptor}}",
|
||||
"activate-share-mode-and-other-file": "和另外 1 個檔案",
|
||||
"activate-share-mode-and-other-files-plural": "和另外 {{count}} 個檔案",
|
||||
"activate-share-mode-shared-text": "已分享的文字",
|
||||
"activate-share-mode-shared-file": "已分享的檔案",
|
||||
"webrtc-requirement": "要使用此 PairDrop 實例,必須啟用 WebRTC!",
|
||||
"no-peers-title": "在其他裝置上開啟 PairDrop 以傳送檔案",
|
||||
"x-instructions_desktop": "點擊以發送檔案或右鍵點擊以發送一則訊息",
|
||||
"x-instructions_data-drop-peer": "釋放以發送到此裝置",
|
||||
"x-instructions-share-mode_mobile": "輕觸以發送 {{descriptor}}",
|
||||
"activate-share-mode-base": "在其他裝置上開啟 PairDrop 以傳送",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} 個已分享的檔案"
|
||||
},
|
||||
"footer": {
|
||||
"display-name_data-placeholder": "正在載入中…",
|
||||
"known-as": "此裝置名稱為:",
|
||||
"display-name_title": "編輯此裝置名稱並儲存",
|
||||
"discovery": "可見於:",
|
||||
"on-this-network": "在這個網路上",
|
||||
"paired-devices_title": "無論在任何網路,已配對的裝置都是隨時可見。",
|
||||
"public-room-devices": "在房間 {{roomId}} 中",
|
||||
"traffic": "流量將會",
|
||||
"on-this-network_title": "在這個網路上的每個人都可以見到你。",
|
||||
"paired-devices": "已配對的裝置",
|
||||
"public-room-devices_title": "無論在任何網路,此公共房間中的裝置都是隨時可見。",
|
||||
"routed": "途經伺服器",
|
||||
"webrtc": "如果無法使用 WebRTC。"
|
||||
},
|
||||
"dialogs": {
|
||||
"pair-devices-title": "永久配對裝置",
|
||||
"scan-qr-code": "或掃描 QR 圖碼。",
|
||||
"input-key-on-this-device": "在另一台裝置上輸入此密鑰",
|
||||
"temporary-public-room-title": "臨時公共房間",
|
||||
"input-room-id-on-another-device": "在另一台裝置上輸入此房間編號",
|
||||
"enter-room-id-from-another-device": "在此輸入房間編號以加入房間。",
|
||||
"hr-or": "或者",
|
||||
"pair": "配對",
|
||||
"cancel": "取消",
|
||||
"paired-devices-wrapper_data-empty": "沒有已配對的裝置。",
|
||||
"auto-accept-instructions-1": "啟用",
|
||||
"auto-accept": "自動接收",
|
||||
"auto-accept-instructions-2": "以自動接受從該裝置發送的所有檔案。",
|
||||
"close": "關閉",
|
||||
"join": "加入",
|
||||
"send": "發送",
|
||||
"receive-text-title": "收到訊息",
|
||||
"base64-tap-to-paste": "輕觸此處以分享 {{type}}",
|
||||
"base64-text": "文字",
|
||||
"base64-files": "檔案",
|
||||
"file-other-description-file": "和另外 1 個檔案",
|
||||
"file-other-description-image-plural": "和另外 {{count}} 張圖片",
|
||||
"file-other-description-file-plural": "和另外 {{count}} 個檔案",
|
||||
"title-image": "圖片",
|
||||
"title-file": "檔案",
|
||||
"title-image-plural": "圖片",
|
||||
"title-file-plural": "檔案",
|
||||
"receive-title": "收到 {{descriptor}}",
|
||||
"download-again": "再次下載",
|
||||
"language-selector-title": "設定語言",
|
||||
"system-language": "使用系統語言",
|
||||
"public-room-qr-code_title": "點擊以複製連結到公共房間",
|
||||
"pair-devices-qr-code_title": "點擊以複製連結以配對此裝置",
|
||||
"approve": "批准",
|
||||
"share-text-title": "分享文字訊息",
|
||||
"share-text-subtitle": "發送前編輯訊息:",
|
||||
"share-text-checkbox": "分享文字時總是顯示此對話框",
|
||||
"enter-key-from-another-device": "在此輸入另一台裝置的密鑰。",
|
||||
"edit-paired-devices-title": "編輯已配對的裝置",
|
||||
"unpair": "取消配對",
|
||||
"paired-device-removed": "已刪除已配對的裝置。",
|
||||
"leave": "離開",
|
||||
"accept": "接受",
|
||||
"would-like-to-share": "想要分享",
|
||||
"decline": "拒絕",
|
||||
"has-sent": "已發送:",
|
||||
"share": "分享",
|
||||
"message_title": "輸入要傳送的訊息",
|
||||
"download": "下載",
|
||||
"send-message-to": "發送至:",
|
||||
"message_placeholder": "文字",
|
||||
"copy": "複製",
|
||||
"send-message-title": "發送訊息",
|
||||
"base64-title-files": "分享檔案",
|
||||
"base64-title-text": "分享文字",
|
||||
"base64-processing": "正在處理中…",
|
||||
"base64-paste-to-send": "將剪貼簿貼到此處以分享 {{type}}",
|
||||
"file-other-description-image": "和另外 1 張圖片",
|
||||
"close-toast_title": "關閉通知"
|
||||
},
|
||||
"about": {
|
||||
"claim": "跨裝置傳輸檔案的最簡單方法",
|
||||
"github_title": "GitHub 上的 PairDrop",
|
||||
"tweet_title": "發佈關於 PairDrop 的推文",
|
||||
"mastodon_title": "在 Mastodon 上撰寫有關 PairDrop 的文章",
|
||||
"close-about_aria-label": "關閉關於 PairDrop",
|
||||
"buy-me-a-coffee_title": "給我買一杯咖啡吧!",
|
||||
"bluesky_title": "在 Bluesky 上關注我們",
|
||||
"custom_title": "關注我們",
|
||||
"privacypolicy_title": "開啟我們的隱私權政策",
|
||||
"faq_title": "常見問題"
|
||||
},
|
||||
"notifications": {
|
||||
"display-name-changed-permanently": "裝置名稱已更改並儲存",
|
||||
"display-name-changed-temporarily": "裝置名稱已更改並只限於此會話",
|
||||
"display-name-random-again": "裝置名稱已再次隨機生成",
|
||||
"download-successful": "{{descriptor}} 已下載",
|
||||
"pairing-success": "裝置已配對",
|
||||
"pairing-not-persistent": "已配對的裝置不是永久的",
|
||||
"pairing-key-invalid": "無效的密鑰",
|
||||
"pairing-key-invalidated": "密鑰 {{key}} 已失效",
|
||||
"pairing-cleared": "所有裝置均已解除配對",
|
||||
"public-room-id-invalid": "無效的房間編號",
|
||||
"public-room-left": "已離開公共房間 {{publicRoomId}}",
|
||||
"copied-to-clipboard": "已複製到剪貼簿",
|
||||
"pair-url-copied-to-clipboard": "已將與此裝置配對的連結複製到剪貼簿",
|
||||
"room-url-copied-to-clipboard": "已將公共房間的連結複製到剪貼簿",
|
||||
"copied-to-clipboard-error": "無法複製。請手動複製。",
|
||||
"text-content-incorrect": "文字內容不正確",
|
||||
"file-content-incorrect": "檔案內容不正確",
|
||||
"notifications-enabled": "已啟用通知",
|
||||
"notifications-permissions-error": "由於使用者多次取消權限請求提示,通知權限已被封鎖。這可以在頁面資訊中重置,點擊網址欄旁邊的鎖定圖示以存取頁面資訊。",
|
||||
"link-received": "收到 {{name}} 的連結—點擊以開啟",
|
||||
"message-received": "收到 {{name}} 的訊息—點擊以複製",
|
||||
"click-to-show": "點擊以顯示",
|
||||
"copied-text": "已將文字複製到剪貼簿",
|
||||
"copied-text-error": "無法複製到剪貼簿。請手動複製!",
|
||||
"offline": "已離線",
|
||||
"online": "已重新在線",
|
||||
"connected": "已連接",
|
||||
"online-requirement-pairing": "你需要在線才能配對裝置",
|
||||
"online-requirement-public-room": "你需要在線才能創建公共房間",
|
||||
"connecting": "正在連接中…",
|
||||
"files-incorrect": "檔案不正確",
|
||||
"file-transfer-completed": "檔案傳輸已完成",
|
||||
"ios-memory-limit": "向 iOS 發送檔案每次只能最大 200 MB",
|
||||
"message-transfer-completed": "訊息傳輸已完成",
|
||||
"unfinished-transfers-warning": "還有未完成的傳輸。你確定要關閉 PairDrop 嗎?",
|
||||
"rate-limit-join-key": "已達到速率限制。請等待 10 秒鐘,然後再試一次。",
|
||||
"selected-peer-left": "選定的對象已離開",
|
||||
"pairing-tabs-error": "將兩個網頁瀏覽器分頁進行配對是不可能的",
|
||||
"clipboard-content-incorrect": "剪貼簿內容不正確",
|
||||
"click-to-download": "點擊以下載",
|
||||
"request-title": "{{name}} 想要發送 {{count}} 個 {{descriptor}}"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "檔案已收到",
|
||||
"file-received-plural": "已收到 {{count}} 個檔案",
|
||||
"file-transfer-requested": "已請求檔案傳輸",
|
||||
"image-transfer-requested": "已請求圖片傳輸",
|
||||
"message-received": "已收到訊息",
|
||||
"message-received-plural": "已收到 {{count}} 條訊息"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send-share-mode": "點擊以發送 {{descriptor}}",
|
||||
"click-to-send": "點擊以發送檔案或右鍵點擊以發送一則訊息",
|
||||
"preparing": "正在準備中…",
|
||||
"waiting": "正在等待中…",
|
||||
"processing": "正在處理中…",
|
||||
"transferring": "正在傳輸中…",
|
||||
"connection-hash": "若要驗證端對端加密的安全性,請在兩台裝置上比較此安全編號"
|
||||
}
|
||||
}
|
||||
@@ -1,40 +1,49 @@
|
||||
class Localization {
|
||||
constructor() {
|
||||
Localization.$htmlRoot = document.querySelector('html');
|
||||
|
||||
Localization.defaultLocale = "en";
|
||||
Localization.supportedLocales = ["ar", "ca", "de", "en", "es", "fr", "id", "it", "ja", "nb", "nl", "pt-BR", "ro", "ru", "tr", "zh-CN"];
|
||||
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.supportedLocalesRtl = ["ar"];
|
||||
|
||||
Localization.translations = {};
|
||||
Localization.defaultTranslations = {};
|
||||
Localization.translationsDefaultLocale = {};
|
||||
|
||||
Localization.systemLocale = Localization.getSupportedOrDefault(navigator.languages);
|
||||
Localization.systemLocale = Localization.getSupportedOrDefaultLocales(navigator.languages);
|
||||
|
||||
let storedLanguageCode = localStorage.getItem('language_code');
|
||||
|
||||
Localization.initialLocale = storedLanguageCode && Localization.isSupported(storedLanguageCode)
|
||||
Localization.initialLocale = storedLanguageCode && Localization.localeIsSupported(storedLanguageCode)
|
||||
? storedLanguageCode
|
||||
: Localization.systemLocale;
|
||||
}
|
||||
|
||||
static isSupported(locale) {
|
||||
static localeIsSupported(locale) {
|
||||
return Localization.supportedLocales.indexOf(locale) > -1;
|
||||
}
|
||||
|
||||
static isRtlLanguage(locale) {
|
||||
static localeIsRtl(locale) {
|
||||
return Localization.supportedLocalesRtl.indexOf(locale) > -1;
|
||||
}
|
||||
|
||||
static isCurrentLocaleRtl() {
|
||||
return Localization.isRtlLanguage(Localization.locale);
|
||||
static currentLocaleIsRtl() {
|
||||
return Localization.localeIsRtl(Localization.locale);
|
||||
}
|
||||
|
||||
static getSupportedOrDefault(locales) {
|
||||
static currentLocaleIsDefault() {
|
||||
return Localization.locale === Localization.defaultLocale
|
||||
}
|
||||
|
||||
static getSupportedOrDefaultLocales(locales) {
|
||||
// get generic locales not included in locales
|
||||
// ["en-us", "de-CH", "fr"] --> ["en", "de"]
|
||||
let localesGeneric = locales
|
||||
.map(locale => locale.split("-")[0])
|
||||
.filter(locale => locales.indexOf(locale) === -1);
|
||||
|
||||
return locales.find(Localization.isSupported)
|
||||
|| localesGeneric.find(Localization.isSupported)
|
||||
// If there is no perfect match for browser locales, try generic locales first before resorting to the default locale
|
||||
return locales.find(Localization.localeIsSupported)
|
||||
|| localesGeneric.find(Localization.localeIsSupported)
|
||||
|| Localization.defaultLocale;
|
||||
}
|
||||
|
||||
@@ -48,16 +57,14 @@ class Localization {
|
||||
await Localization.setLocale(locale)
|
||||
await Localization.translatePage();
|
||||
|
||||
const htmlRootNode = document.querySelector('html');
|
||||
|
||||
if (Localization.isRtlLanguage(locale)) {
|
||||
htmlRootNode.setAttribute('dir', 'rtl');
|
||||
if (Localization.localeIsRtl(locale)) {
|
||||
Localization.$htmlRoot.setAttribute('dir', 'rtl');
|
||||
}
|
||||
else {
|
||||
htmlRootNode.removeAttribute('dir');
|
||||
Localization.$htmlRoot.removeAttribute('dir');
|
||||
}
|
||||
|
||||
htmlRootNode.setAttribute('lang', locale);
|
||||
Localization.$htmlRoot.setAttribute('lang', locale);
|
||||
|
||||
|
||||
console.log("Page successfully translated",
|
||||
@@ -111,75 +118,108 @@ class Localization {
|
||||
const key = element.getAttribute("data-i18n-key");
|
||||
const attrs = element.getAttribute("data-i18n-attrs").split(" ");
|
||||
|
||||
for (let i in attrs) {
|
||||
let attr = attrs[i];
|
||||
attrs.forEach(attr => {
|
||||
if (attr === "text") {
|
||||
element.innerText = Localization.getTranslation(key);
|
||||
}
|
||||
else {
|
||||
element.setAttribute(attr, Localization.getTranslation(key, attr));
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
static getTranslation(key, attr = null, data = {}, useDefault = false) {
|
||||
const keys = key.split(".");
|
||||
|
||||
let translationCandidates = useDefault
|
||||
? Localization.defaultTranslations
|
||||
: Localization.translations;
|
||||
|
||||
static getTranslationFromTranslationsObj(translationObj, key, attr) {
|
||||
let translation;
|
||||
|
||||
try {
|
||||
const keys = key.split(".");
|
||||
|
||||
for (let i = 0; i < keys.length - 1; i++) {
|
||||
translationCandidates = translationCandidates[keys[i]]
|
||||
// iterate into translation object until last layer
|
||||
translationObj = translationObj[keys[i]]
|
||||
}
|
||||
|
||||
let lastKey = keys[keys.length - 1];
|
||||
|
||||
if (attr) lastKey += "_" + attr;
|
||||
|
||||
translation = translationCandidates[lastKey];
|
||||
translation = translationObj[lastKey];
|
||||
|
||||
for (let j in data) {
|
||||
if (translation.includes(`{{${j}}}`)) {
|
||||
translation = translation.replace(`{{${j}}}`, data[j]);
|
||||
} else {
|
||||
console.warn(`Translation for your language ${Localization.locale.toUpperCase()} misses at least one data placeholder:`, key, attr, data);
|
||||
Localization.logHelpCallKey(key);
|
||||
Localization.logHelpCall();
|
||||
translation = "";
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
translation = "";
|
||||
}
|
||||
|
||||
if (!translation) {
|
||||
if (!useDefault) {
|
||||
console.warn(`Missing translation entry for your language ${Localization.locale.toUpperCase()}. Using ${Localization.defaultLocale.toUpperCase()} instead.`, key, attr);
|
||||
Localization.logHelpCallKey(key);
|
||||
Localization.logHelpCall();
|
||||
translation = this.getTranslation(key, attr, data, true);
|
||||
throw new Error(`Translation misses entry. Key: ${key} Attribute: ${attr}`);
|
||||
}
|
||||
|
||||
return translation;
|
||||
}
|
||||
|
||||
static addDataToTranslation(translation, data) {
|
||||
for (let j in data) {
|
||||
if (!translation.includes(`{{${j}}}`)) {
|
||||
throw new Error(`Translation misses data placeholder: ${j}`);
|
||||
}
|
||||
// Add data to translation
|
||||
translation = translation.replace(`{{${j}}}`, data[j]);
|
||||
}
|
||||
return translation;
|
||||
}
|
||||
|
||||
static getTranslation(key, attr = null, data = {}, useDefault = false) {
|
||||
let translationObj = useDefault
|
||||
? Localization.translationsDefaultLocale
|
||||
: Localization.translations;
|
||||
|
||||
let translation;
|
||||
|
||||
try {
|
||||
translation = Localization.getTranslationFromTranslationsObj(translationObj, key, attr);
|
||||
translation = Localization.addDataToTranslation(translation, data);
|
||||
}
|
||||
catch (e) {
|
||||
// Log warnings and help calls
|
||||
console.warn(e);
|
||||
Localization.logTranslationMissingOrBroken(key, attr, data, useDefault);
|
||||
Localization.logHelpCallKey(key, attr);
|
||||
Localization.logHelpCall();
|
||||
|
||||
if (useDefault || Localization.currentLocaleIsDefault()) {
|
||||
// Is default locale already
|
||||
// Use empty string as translation
|
||||
translation = ""
|
||||
}
|
||||
else {
|
||||
console.warn("Missing translation in default language:", key, attr);
|
||||
Localization.logHelpCall();
|
||||
// Is not default locale yet
|
||||
// Get translation for default language with same arguments
|
||||
console.log(`Using default language ${Localization.defaultLocale.toUpperCase()} instead.`);
|
||||
translation = this.getTranslation(key, attr, data, true);
|
||||
}
|
||||
}
|
||||
|
||||
return Localization.escapeHTML(translation);
|
||||
}
|
||||
|
||||
static logTranslationMissingOrBroken(key, attr, data, useDefault) {
|
||||
let usedLocale = useDefault
|
||||
? Localization.defaultLocale.toUpperCase()
|
||||
: Localization.locale.toUpperCase();
|
||||
|
||||
console.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/");
|
||||
}
|
||||
|
||||
static logHelpCallKey(key) {
|
||||
console.warn(`Translate this string here: https://hosted.weblate.org/browse/pairdrop/pairdrop-spa/${Localization.locale.toLowerCase()}/?q=${key}`);
|
||||
static logHelpCallKey(key, attr) {
|
||||
let locale = Localization.locale.toLowerCase();
|
||||
|
||||
let keyComplete = !attr || attr === "text"
|
||||
? key
|
||||
: `${key}_${attr}`;
|
||||
|
||||
console.warn(`Translate this string here: https://hosted.weblate.org/browse/pairdrop/pairdrop-spa/${locale}/?q=${keyComplete}`);
|
||||
}
|
||||
|
||||
static escapeHTML(unsafeText) {
|
||||
|
||||
@@ -56,13 +56,16 @@ class PairDrop {
|
||||
await this.backgroundCanvas.fadeIn();
|
||||
|
||||
// Load deferred assets
|
||||
console.log("Load deferred assets...");
|
||||
await this.loadDeferredAssets();
|
||||
console.log("Loading of deferred assets completed.");
|
||||
|
||||
console.log("Hydrate UI...");
|
||||
await this.hydrate();
|
||||
console.log("UI hydrated.");
|
||||
|
||||
// Evaluate url params as soon as ws is connected
|
||||
console.log("Evaluate URL params as soon as websocket connection is established.");
|
||||
Events.on('ws-connected', _ => this.evaluateUrlParams(), {once: true});
|
||||
}
|
||||
|
||||
@@ -102,36 +105,40 @@ class PairDrop {
|
||||
}
|
||||
}
|
||||
|
||||
async loadDeferredAssets() {
|
||||
console.log("Load deferred assets");
|
||||
for (const url of this.deferredStyles) {
|
||||
await this.loadAndApplyStylesheet(url);
|
||||
}
|
||||
for (const url of this.deferredScripts) {
|
||||
await this.loadAndApplyScript(url);
|
||||
}
|
||||
loadDeferredAssets() {
|
||||
const stylePromises = this.deferredStyles.map(url => this.loadAndApplyStylesheet(url));
|
||||
const scriptPromises = this.deferredScripts.map(url => this.loadAndApplyScript(url));
|
||||
|
||||
return Promise.all([...stylePromises, ...scriptPromises]);
|
||||
}
|
||||
|
||||
loadStyleSheet(url) {
|
||||
return new Promise((resolve, reject) => {
|
||||
let stylesheet = document.createElement('link');
|
||||
stylesheet.rel = 'stylesheet';
|
||||
stylesheet.rel = 'preload';
|
||||
stylesheet.as = 'style';
|
||||
stylesheet.href = url;
|
||||
stylesheet.type = 'text/css';
|
||||
stylesheet.onload = resolve;
|
||||
stylesheet.onload = _ => {
|
||||
stylesheet.onload = null;
|
||||
stylesheet.rel = 'stylesheet';
|
||||
resolve();
|
||||
};
|
||||
stylesheet.onerror = reject;
|
||||
|
||||
document.head.appendChild(stylesheet);
|
||||
});
|
||||
}
|
||||
|
||||
async loadAndApplyStylesheet(url) {
|
||||
try {
|
||||
await this.loadStyleSheet(url);
|
||||
console.log(`Stylesheet loaded successfully: ${url}`);
|
||||
} catch (error) {
|
||||
console.error('Error loading stylesheet:', error);
|
||||
}
|
||||
loadAndApplyStylesheet(url) {
|
||||
return new Promise( async (resolve) => {
|
||||
try {
|
||||
await this.loadStyleSheet(url);
|
||||
console.log(`Stylesheet loaded successfully: ${url}`);
|
||||
resolve();
|
||||
} catch (error) {
|
||||
console.error('Error loading stylesheet:', error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
loadScript(url) {
|
||||
@@ -145,13 +152,16 @@ class PairDrop {
|
||||
});
|
||||
}
|
||||
|
||||
async loadAndApplyScript(url) {
|
||||
try {
|
||||
await this.loadScript(url);
|
||||
console.log(`Script loaded successfully: ${url}`);
|
||||
} catch (error) {
|
||||
console.error('Error loading script:', error);
|
||||
}
|
||||
loadAndApplyScript(url) {
|
||||
return new Promise( async (resolve) => {
|
||||
try {
|
||||
await this.loadScript(url);
|
||||
console.log(`Script loaded successfully: ${url}`);
|
||||
resolve();
|
||||
} catch (error) {
|
||||
console.error('Error loading script:', error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async hydrate() {
|
||||
@@ -223,6 +233,8 @@ class PairDrop {
|
||||
// remove url params from url
|
||||
const urlWithoutParams = getUrlWithoutArguments();
|
||||
window.history.replaceState({}, "Rewrite URL", urlWithoutParams);
|
||||
|
||||
console.log("URL params evaluated.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ class HeaderUI {
|
||||
this.$header.classList.remove('overflow-expanded');
|
||||
|
||||
|
||||
const rtlLocale = Localization.isCurrentLocaleRtl();
|
||||
const rtlLocale = Localization.currentLocaleIsRtl();
|
||||
let icon;
|
||||
const $headerIconsShown = document.querySelectorAll('body > header:first-of-type > *:not([hidden])');
|
||||
|
||||
|
||||
@@ -172,31 +172,34 @@ class PeersUI {
|
||||
}
|
||||
|
||||
_onDrop(e) {
|
||||
e.preventDefault();
|
||||
|
||||
if (this.shareMode.active || Dialog.anyDialogShown()) return;
|
||||
|
||||
if (!$$('x-peer') || !$$('x-peer').contains(e.target)) {
|
||||
if (e.dataTransfer.files.length > 0) {
|
||||
Events.fire('activate-share-mode', {files: e.dataTransfer.files});
|
||||
} else {
|
||||
for (let i=0; i<e.dataTransfer.items.length; i++) {
|
||||
if (e.dataTransfer.items[i].type === "text/plain") {
|
||||
e.dataTransfer.items[i].getAsString(text => {
|
||||
Events.fire('activate-share-mode', {text: text});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
e.preventDefault();
|
||||
|
||||
this._onDragEnd();
|
||||
|
||||
if ($$('x-peer') || !$$('x-peer').contains(e.target)) return; // dropped on peer
|
||||
|
||||
const files = e.dataTransfer.files;
|
||||
const text = e.dataTransfer.getData("text");
|
||||
|
||||
if (files.length > 0) {
|
||||
Events.fire('activate-share-mode', {
|
||||
files: files
|
||||
});
|
||||
}
|
||||
else if(text.length > 0) {
|
||||
Events.fire('activate-share-mode', {
|
||||
text: text
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_onDragOver(e) {
|
||||
e.preventDefault();
|
||||
|
||||
if (this.shareMode.active || Dialog.anyDialogShown()) return;
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
this.$xInstructions.setAttribute('drop-bg', true);
|
||||
this.$xNoPeers.setAttribute('drop-bg', true);
|
||||
}
|
||||
@@ -590,6 +593,9 @@ class PeerUI {
|
||||
_onFilesSelected(e) {
|
||||
const $input = e.target;
|
||||
const files = $input.files;
|
||||
|
||||
if (files.length === 0) return;
|
||||
|
||||
Events.fire('files-selected', {
|
||||
files: files,
|
||||
to: this._peer.id
|
||||
@@ -630,29 +636,28 @@ class PeerUI {
|
||||
}
|
||||
|
||||
_onDrop(e) {
|
||||
e.preventDefault();
|
||||
|
||||
if (PeerUI._shareMode.active || Dialog.anyDialogShown()) return;
|
||||
|
||||
if (e.dataTransfer.files.length > 0) {
|
||||
Events.fire('files-selected', {
|
||||
files: e.dataTransfer.files,
|
||||
to: this._peer.id
|
||||
});
|
||||
} else {
|
||||
for (let i=0; i<e.dataTransfer.items.length; i++) {
|
||||
if (e.dataTransfer.items[i].type === "text/plain") {
|
||||
e.dataTransfer.items[i].getAsString(text => {
|
||||
Events.fire('send-text', {
|
||||
text: text,
|
||||
to: this._peer.id
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
e.preventDefault();
|
||||
|
||||
this._onDragEnd();
|
||||
|
||||
const peerId = this._peer.id;
|
||||
const files = e.dataTransfer.files;
|
||||
const text = e.dataTransfer.getData("text");
|
||||
|
||||
if (files.length > 0) {
|
||||
Events.fire('files-selected', {
|
||||
files: files,
|
||||
to: peerId
|
||||
});
|
||||
}
|
||||
else if (text.length > 0) {
|
||||
Events.fire('send-text', {
|
||||
text: text,
|
||||
to: peerId
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_onDragOver() {
|
||||
@@ -1896,6 +1901,8 @@ class SendTextDialog extends Dialog {
|
||||
this.$submit = this.$el.querySelector('button[type="submit"]');
|
||||
this.$form.addEventListener('submit', e => this._onSubmit(e));
|
||||
this.$text.addEventListener('input', _ => this._onInput());
|
||||
this.$text.addEventListener('paste', e => this._onPaste(e));
|
||||
this.$text.addEventListener('drop', e => this._onDrop(e));
|
||||
|
||||
Events.on('text-recipient', e => this._onRecipient(e.detail.peerId, e.detail.deviceName));
|
||||
Events.on('keydown', e => this._onKeyDown(e));
|
||||
@@ -1914,6 +1921,40 @@ class SendTextDialog extends Dialog {
|
||||
}
|
||||
}
|
||||
|
||||
async _onDrop(e) {
|
||||
e.preventDefault()
|
||||
|
||||
const text = e.dataTransfer.getData("text");
|
||||
const selection = window.getSelection();
|
||||
|
||||
if (selection.rangeCount) {
|
||||
selection.deleteFromDocument();
|
||||
selection.getRangeAt(0).insertNode(document.createTextNode(text));
|
||||
}
|
||||
|
||||
this._onInput();
|
||||
}
|
||||
|
||||
async _onPaste(e) {
|
||||
e.preventDefault()
|
||||
|
||||
const text = (e.clipboardData || window.clipboardData).getData('text');
|
||||
const selection = window.getSelection();
|
||||
|
||||
if (selection.rangeCount) {
|
||||
selection.deleteFromDocument();
|
||||
const textNode = document.createTextNode(text);
|
||||
const range = document.createRange();
|
||||
range.setStart(textNode, textNode.length);
|
||||
range.collapse(true);
|
||||
selection.getRangeAt(0).insertNode(textNode);
|
||||
selection.removeAllRanges();
|
||||
selection.addRange(range);
|
||||
}
|
||||
|
||||
this._onInput();
|
||||
}
|
||||
|
||||
_textEmpty() {
|
||||
return !this.$text.innerText || this.$text.innerText === "\n";
|
||||
}
|
||||
@@ -1976,14 +2017,18 @@ class ReceiveTextDialog extends Dialog {
|
||||
|
||||
this.$displayName = this.$el.querySelector('.display-name');
|
||||
this._receiveTextQueue = [];
|
||||
this._hideTimeout = null;
|
||||
}
|
||||
|
||||
selectionEmpty() {
|
||||
return !window.getSelection().toString()
|
||||
}
|
||||
|
||||
async _onKeyDown(e) {
|
||||
if (!this.isShown()) return
|
||||
|
||||
if (e.code === "KeyC" && (e.ctrlKey || e.metaKey)) {
|
||||
if (e.code === "KeyC" && (e.ctrlKey || e.metaKey) && this.selectionEmpty()) {
|
||||
await this._onCopy()
|
||||
this.hide();
|
||||
}
|
||||
else if (e.code === "Escape") {
|
||||
this.hide();
|
||||
@@ -1994,12 +2039,17 @@ class ReceiveTextDialog extends Dialog {
|
||||
window.blop.play();
|
||||
this._receiveTextQueue.push({text: text, peerId: peerId});
|
||||
this._setDocumentTitleMessages();
|
||||
if (this.isShown()) return;
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
|
||||
if (this.isShown() || this._hideTimeout) return;
|
||||
|
||||
this._dequeueRequests();
|
||||
}
|
||||
|
||||
_dequeueRequests() {
|
||||
if (!this._receiveTextQueue.length) return;
|
||||
this._setDocumentTitleMessages();
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
|
||||
let {text, peerId} = this._receiveTextQueue.shift();
|
||||
this._showReceiveTextDialog(text, peerId);
|
||||
}
|
||||
@@ -2010,26 +2060,68 @@ class ReceiveTextDialog extends Dialog {
|
||||
this.$displayName.classList.add($(peerId).ui._badgeClassName());
|
||||
|
||||
this.$text.innerText = text;
|
||||
this.$text.classList.remove('text-center');
|
||||
|
||||
// Beautify text if text is short
|
||||
if (text.length < 2000) {
|
||||
// replace urls with actual links
|
||||
this.$text.innerHTML = this.$text.innerHTML.replace(/((https?:\/\/|www)[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\-._~:\/?#\[\]@!$&'()*+,;=]+)/g, url => {
|
||||
return `<a href="${url}" target="_blank">${url}</a>`;
|
||||
});
|
||||
// Beautify text if text is not too long
|
||||
if (this.$text.innerText.length <= 300000) {
|
||||
// Hacky workaround to replace URLs with link nodes in all cases
|
||||
// 1. Use text variable, find all valid URLs via regex and replace URLs with placeholder
|
||||
// 2. Use html variable, find placeholders with regex and replace them with link nodes
|
||||
|
||||
let $textShadow = document.createElement('div');
|
||||
$textShadow.innerText = text;
|
||||
|
||||
let linkNodes = {};
|
||||
let searchHTML = $textShadow.innerHTML;
|
||||
const p = "@";
|
||||
const pRgx = new RegExp(`${p}\\d+`, 'g');
|
||||
let occP = searchHTML.match(pRgx) || [];
|
||||
|
||||
let m = 0;
|
||||
|
||||
const allowedDomainChars = "a-zA-Z0-9áàäčçđéèêŋńñóòôöšŧüžæøåëìíîïðùúýþćěłřśţźǎǐǒǔǥǧǩǯəʒâûœÿãõāēīōūăąĉċďĕėęĝğġģĥħĩĭįıĵķĸĺļľņňŏőŕŗŝşťũŭůűųŵŷżאבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ";
|
||||
const urlRgx = new RegExp(`(^|\\n|\\s|["><\\-_~:\\/?#\\[\\]@!$&'()*+,;=%.])(((https?:\\/\\/)?(?:[${allowedDomainChars}](?:[${allowedDomainChars}-]{0,61}[${allowedDomainChars}])?\\.)+[${allowedDomainChars}][${allowedDomainChars}-]{0,61}[${allowedDomainChars}])(:?\\d*)\\/?([${allowedDomainChars}_\\/\\-#.]*)(\\?([${allowedDomainChars}\\-_~:\\/?#\\[\\]@!$&'()*+,;=%.]*))?)`, 'g');
|
||||
|
||||
$textShadow.innerText = text.replace(urlRgx,
|
||||
(match, whitespaceOrSpecial, url, g3, scheme) => {
|
||||
let link = url;
|
||||
|
||||
// prefix www.example.com with http protocol to prevent it from being a relative link
|
||||
if (!scheme && link.startsWith('www')) {
|
||||
link = "http://" + link
|
||||
}
|
||||
|
||||
if (isUrlValid(link)) {
|
||||
// link is valid -> replace with link node placeholder
|
||||
|
||||
// find linkNodePlaceholder that is not yet present in text node
|
||||
m++;
|
||||
while (occP.includes(`${p}${m}`)) {
|
||||
m++;
|
||||
}
|
||||
let linkNodePlaceholder = `${p}${m}`;
|
||||
|
||||
// add linkNodePlaceholder to text node and save a reference to linkNodes object
|
||||
linkNodes[linkNodePlaceholder] = `<a href="${link}" target="_blank">${url}</a>`;
|
||||
return `${whitespaceOrSpecial}${linkNodePlaceholder}`;
|
||||
}
|
||||
// link is not valid -> do not replace
|
||||
return match;
|
||||
});
|
||||
|
||||
|
||||
this.$text.innerHTML = $textShadow.innerHTML.replace(pRgx,
|
||||
(m) => {
|
||||
let urlNode = linkNodes[m];
|
||||
return urlNode ? urlNode : m;
|
||||
});
|
||||
}
|
||||
|
||||
this._evaluateOverflowing(this.$text);
|
||||
|
||||
this._setDocumentTitleMessages();
|
||||
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
this.show();
|
||||
}
|
||||
|
||||
_setDocumentTitleMessages() {
|
||||
document.title = !this._receiveTextQueue.length
|
||||
document.title = this._receiveTextQueue.length <= 1
|
||||
? `${ Localization.getTranslation("document-titles.message-received") } - PairDrop`
|
||||
: `${ Localization.getTranslation("document-titles.message-received-plural", null, {count: this._receiveTextQueue.length + 1}) } - PairDrop`;
|
||||
}
|
||||
@@ -2049,7 +2141,17 @@ class ReceiveTextDialog extends Dialog {
|
||||
|
||||
hide() {
|
||||
super.hide();
|
||||
setTimeout(() => this._dequeueRequests(), 500);
|
||||
|
||||
// If queue is empty -> clear text field | else -> open next message
|
||||
this._hideTimeout = setTimeout(() => {
|
||||
if (!this._receiveTextQueue.length) {
|
||||
this.$text.innerHTML = "";
|
||||
}
|
||||
else {
|
||||
this._dequeueRequests();
|
||||
}
|
||||
this._hideTimeout = null;
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2420,14 +2522,9 @@ class Notifications {
|
||||
|
||||
_downloadNotification(files) {
|
||||
if (document.visibilityState !== 'visible') {
|
||||
let imagesOnly = true;
|
||||
for(let i=0; i<files.length; i++) {
|
||||
if (files[i].type.split('/')[0] !== 'image') {
|
||||
imagesOnly = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
let imagesOnly = files.every(file => file.type.split('/')[0] === 'image');
|
||||
let title;
|
||||
|
||||
if (files.length === 1) {
|
||||
title = `${files[0].name}`;
|
||||
}
|
||||
@@ -2452,15 +2549,8 @@ class Notifications {
|
||||
|
||||
_requestNotification(request, peerId) {
|
||||
if (document.visibilityState !== 'visible') {
|
||||
let imagesOnly = true;
|
||||
for(let i=0; i<request.header.length; i++) {
|
||||
if (request.header[i].mime.split('/')[0] !== 'image') {
|
||||
imagesOnly = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let displayName = $(peerId).querySelector('.name').textContent
|
||||
let imagesOnly = request.header.every(header => header.mime.split('/')[0] === 'image');
|
||||
let displayName = $(peerId).querySelector('.name').textContent;
|
||||
|
||||
let descriptor;
|
||||
if (request.header.length === 1) {
|
||||
|
||||
@@ -583,4 +583,14 @@ async function decodeBase64Text(base64) {
|
||||
if (!base64) throw new Error('Base64 is empty');
|
||||
|
||||
return decodeURIComponent(escape(window.atob(base64)))
|
||||
}
|
||||
|
||||
function isUrlValid(url) {
|
||||
try {
|
||||
let urlObj = new URL(url);
|
||||
return true;
|
||||
}
|
||||
catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
const cacheVersion = 'v1.10.1';
|
||||
const cacheVersion = 'v1.10.8';
|
||||
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,16 +32,20 @@ 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-CN.json',
|
||||
'lang/zh-TW.json'
|
||||
];
|
||||
const relativePathsNotToCache = [
|
||||
'config'
|
||||
@@ -192,7 +196,7 @@ const evaluateRequestData = function (request) {
|
||||
|
||||
const objectStoreRequest = objectStore.add(fileObjects[i]);
|
||||
objectStoreRequest.onsuccess = _ => {
|
||||
if (i === fileObjects.length - 1) resolve(pairDropUrl + '?share-target=files');
|
||||
if (i === fileObjects.length - 1) resolve(pairDropUrl + '?share_target=files');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -201,7 +205,7 @@ const evaluateRequestData = function (request) {
|
||||
}
|
||||
}
|
||||
else {
|
||||
let urlArgument = '?share-target=text';
|
||||
let urlArgument = '?share_target=text';
|
||||
|
||||
if (title) urlArgument += `&title=${title}`;
|
||||
if (text) urlArgument += `&text=${text}`;
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
display: block;
|
||||
overflow: auto;
|
||||
resize: none;
|
||||
line-height: 16px;
|
||||
max-height: 350px;
|
||||
word-break: break-word;
|
||||
word-wrap: anywhere;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.textarea:before {
|
||||
@@ -335,6 +335,7 @@ x-dialog x-paper {
|
||||
display: flex;
|
||||
margin: auto;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
max-width: 450px;
|
||||
z-index: 3;
|
||||
border-radius: 30px;
|
||||
@@ -382,10 +383,6 @@ x-dialog:not([show]) x-paper {
|
||||
transform: scale(0.1);
|
||||
}
|
||||
|
||||
x-dialog a {
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
/* Pair Devices Dialog & Public Room Dialog */
|
||||
|
||||
.input-key-container {
|
||||
@@ -784,7 +781,7 @@ x-dialog x-paper {
|
||||
background-color: var(--bg-color-secondary) !important;
|
||||
}
|
||||
|
||||
.textarea * {
|
||||
.textarea *:not(a) {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
color: unset !important;
|
||||
@@ -797,6 +794,10 @@ x-dialog x-paper {
|
||||
font-weight: unset !important;
|
||||
}
|
||||
|
||||
x-dialog a {
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
/* Image/Video/Audio Preview */
|
||||
.file-preview {
|
||||
margin-bottom: 15px;
|
||||
|
||||
@@ -626,12 +626,15 @@ x-dialog:not([show]) x-background {
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: -1;
|
||||
opacity: 0;
|
||||
background-color: var(--accent-color);
|
||||
transition: opacity 300ms;
|
||||
}
|
||||
|
||||
.icon-button:before {
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.btn:not([disabled]):hover:before,
|
||||
.icon-button:hover:before {
|
||||
opacity: 0.3;
|
||||
|
||||
@@ -32,10 +32,14 @@ process.on('unhandledRejection', (reason, promise) => {
|
||||
|
||||
// Evaluate arguments for deployment with Docker and Node.js
|
||||
let conf = {};
|
||||
|
||||
conf.debugMode = process.env.DEBUG_MODE === "true";
|
||||
|
||||
conf.port = process.env.PORT || 3000;
|
||||
|
||||
conf.wsFallback = process.argv.includes('--include-ws-fallback') || process.env.WS_FALLBACK === "true";
|
||||
conf.rtcConfig = process.env.RTC_CONFIG
|
||||
|
||||
conf.rtcConfig = process.env.RTC_CONFIG && process.env.RTC_CONFIG !== "false"
|
||||
? JSON.parse(fs.readFileSync(process.env.RTC_CONFIG, 'utf8'))
|
||||
: {
|
||||
"sdpSemantics": "unified-plan",
|
||||
@@ -47,7 +51,10 @@ conf.rtcConfig = process.env.RTC_CONFIG
|
||||
};
|
||||
|
||||
|
||||
conf.signalingServer = process.env.SIGNALING_SERVER || false;
|
||||
conf.signalingServer = process.env.SIGNALING_SERVER && process.env.SIGNALING_SERVER !== "false"
|
||||
? process.env.SIGNALING_SERVER
|
||||
: false;
|
||||
|
||||
conf.ipv6Localize = parseInt(process.env.IPV6_LOCALIZE) || false;
|
||||
|
||||
let rateLimit = false;
|
||||
@@ -61,6 +68,7 @@ else {
|
||||
}
|
||||
}
|
||||
conf.rateLimit = rateLimit;
|
||||
|
||||
conf.buttons = {
|
||||
"donation_button": {
|
||||
"active": process.env.DONATION_BUTTON_ACTIVE,
|
||||
@@ -96,8 +104,10 @@ conf.buttons = {
|
||||
|
||||
// Evaluate arguments for deployment with Node.js only
|
||||
conf.autoStart = process.argv.includes('--auto-restart');
|
||||
|
||||
conf.localhostOnly = process.argv.includes('--localhost-only');
|
||||
|
||||
|
||||
// Validate configuration
|
||||
if (conf.ipv6Localize) {
|
||||
if (!(0 < conf.ipv6Localize && conf.ipv6Localize < 8)) {
|
||||
|
||||
Reference in New Issue
Block a user