mirror of
https://github.com/schlagmichdoch/PairDrop.git
synced 2026-04-22 07:04:53 +08:00
Compare commits
43 Commits
v1.10.7
...
implement-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2d15271cf2 | ||
|
|
52198c7efb | ||
|
|
07e46e472e | ||
|
|
00f1a20177 | ||
|
|
3c8848d406 | ||
|
|
0d17ada58b | ||
|
|
74bd7dd406 | ||
|
|
f4a947527d | ||
|
|
90f10910aa | ||
|
|
aacf24c31f | ||
|
|
c0e5b66d41 | ||
|
|
42bd71a3dc | ||
|
|
a98499ea5a | ||
|
|
7c471910ef | ||
|
|
da558ddceb | ||
|
|
1df8fe258e | ||
|
|
65936a4d7d | ||
|
|
7c6062e1e0 | ||
|
|
902b5c6b8f | ||
|
|
19d33e11d8 | ||
|
|
d8908e01ea | ||
|
|
2d2cfec5f0 | ||
|
|
40a12b5501 | ||
|
|
5ee8bb871e | ||
|
|
ef3c338dad | ||
|
|
6d95f3f4e2 | ||
|
|
c33d49702e | ||
|
|
1d62a9ff49 | ||
|
|
3dd40e238a | ||
|
|
417d5421a6 | ||
|
|
7af51bbd5f | ||
|
|
88739107e4 | ||
|
|
6de97e7ff1 | ||
|
|
b61de4eb87 | ||
|
|
cfe5b4afda | ||
|
|
91fc2b7bf5 | ||
|
|
c670b39732 | ||
|
|
e5a09b6be1 | ||
|
|
1d81b744ea | ||
|
|
c37412cfd3 | ||
|
|
a5dc8b6da2 | ||
|
|
d81c03a560 | ||
|
|
f22abca783 |
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/**
|
**Bug occurs on official PairDrop instance https://pairdrop.net/**
|
||||||
No | Yes
|
No | Yes
|
||||||
Version: v1.10.7
|
Version: v1.10.6
|
||||||
|
|
||||||
**Bug occurs on self-hosted PairDrop instance**
|
**Bug occurs on self-hosted PairDrop instance**
|
||||||
No | Yes
|
No | Yes
|
||||||
@@ -44,7 +44,7 @@ No | Yes
|
|||||||
**Self-Hosted Setup**
|
**Self-Hosted Setup**
|
||||||
Proxy: Nginx | Apache2
|
Proxy: Nginx | Apache2
|
||||||
Deployment: docker run | docker compose | npm run start:prod
|
Deployment: docker run | docker compose | npm run start:prod
|
||||||
Version: v1.10.7
|
Version: v1.10.6
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
|
|||||||
@@ -45,11 +45,11 @@ This pairdrop-cli version was released alongside v1.10.4
|
|||||||
#### Linux / Mac
|
#### Linux / Mac
|
||||||
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
|
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
|
||||||
```shell
|
```shell
|
||||||
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.7/pairdrop-cli.zip"
|
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.6/pairdrop-cli.zip"
|
||||||
```
|
```
|
||||||
or
|
or
|
||||||
```shell
|
```shell
|
||||||
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.7/pairdrop-cli.zip"
|
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.6/pairdrop-cli.zip"
|
||||||
```
|
```
|
||||||
2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/`
|
2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/`
|
||||||
```shell
|
```shell
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "pairdrop",
|
"name": "pairdrop",
|
||||||
"version": "1.10.7",
|
"version": "1.10.6",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pairdrop",
|
"name": "pairdrop",
|
||||||
"version": "1.10.7",
|
"version": "1.10.6",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pairdrop",
|
"name": "pairdrop",
|
||||||
"version": "1.10.7",
|
"version": "1.10.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "server/index.js",
|
"main": "server/index.js",
|
||||||
|
|||||||
@@ -447,7 +447,7 @@
|
|||||||
<div class="center file-preview"></div>
|
<div class="center file-preview"></div>
|
||||||
<div class="row-reverse center btn-row wrap">
|
<div class="row-reverse center btn-row wrap">
|
||||||
<button id="share-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.share" data-i18n-attrs="text" hidden></button>
|
<button id="share-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.share" data-i18n-attrs="text" hidden></button>
|
||||||
<button id="download-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus disabled></button>
|
<button id="download-btn" class="btn btn-rounded btn-grey" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus disabled hidden></button>
|
||||||
<button class="btn btn-rounded btn-grey" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
<button class="btn btn-rounded btn-grey" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||||
</div>
|
</div>
|
||||||
</x-paper>
|
</x-paper>
|
||||||
@@ -582,7 +582,7 @@
|
|||||||
</svg>
|
</svg>
|
||||||
<div class="title-wrapper" dir="ltr">
|
<div class="title-wrapper" dir="ltr">
|
||||||
<h1>PairDrop</h1>
|
<h1>PairDrop</h1>
|
||||||
<div class="font-subheading">v1.10.7</div>
|
<div class="font-subheading">v1.10.6</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text"></div>
|
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text"></div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -744,7 +744,7 @@
|
|||||||
<script src="scripts/ui-main.js" defer></script>
|
<script src="scripts/ui-main.js" defer></script>
|
||||||
<script src="scripts/main.js" defer></script>
|
<script src="scripts/main.js" defer></script>
|
||||||
<!-- Sounds -->
|
<!-- Sounds -->
|
||||||
<audio id="blop" autobuffer="true">
|
<audio id="blop" preload="metadata" disableremoteplayback="true" x-webkit-airplay="deny" muted>
|
||||||
<source src="sounds/blop.mp3" type="audio/mpeg">
|
<source src="sounds/blop.mp3" type="audio/mpeg">
|
||||||
<source src="sounds/blop.ogg" type="audio/ogg">
|
<source src="sounds/blop.ogg" type="audio/ogg">
|
||||||
</audio>
|
</audio>
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
"pairing-cleared": "جميع الأجهزة غير مقترنة",
|
"pairing-cleared": "جميع الأجهزة غير مقترنة",
|
||||||
"notifications-enabled": "تم تمكين الإشعارات",
|
"notifications-enabled": "تم تمكين الإشعارات",
|
||||||
"online-requirement-pairing": "يجب أن تكون متصلاً بالإنترنت لإقران الأجهزة",
|
"online-requirement-pairing": "يجب أن تكون متصلاً بالإنترنت لإقران الأجهزة",
|
||||||
"ios-memory-limit": "لا يمكن إرسال ملفات إلى iOS إلا بحجم يصل إلى 200 ميجابايت مرة واحدة",
|
|
||||||
"online-requirement-public-room": "يجب أن تكون متصلاً بالإنترنت لإنشاء غرفة عامة",
|
"online-requirement-public-room": "يجب أن تكون متصلاً بالإنترنت لإنشاء غرفة عامة",
|
||||||
"copied-text-error": "فشلت الكتابة من الحافظة. انسخ يدويًا!",
|
"copied-text-error": "فشلت الكتابة من الحافظة. انسخ يدويًا!",
|
||||||
"download-successful": "تم تحميل {{descriptor}}",
|
"download-successful": "تم تحميل {{descriptor}}",
|
||||||
|
|||||||
@@ -144,7 +144,6 @@
|
|||||||
"pairing-cleared": "Tots els dispositius desvinculats",
|
"pairing-cleared": "Tots els dispositius desvinculats",
|
||||||
"notifications-enabled": "Notificacions habilitades",
|
"notifications-enabled": "Notificacions habilitades",
|
||||||
"online-requirement-pairing": "Has d'estar en línia per vincular dispositius",
|
"online-requirement-pairing": "Has d'estar en línia per vincular dispositius",
|
||||||
"ios-memory-limit": "Tan sols és possible enviar fitxers de fins a 200 MB a iOS",
|
|
||||||
"online-requirement-public-room": "Cal que estiguis en línia per poder crear una sala pública",
|
"online-requirement-public-room": "Cal que estiguis en línia per poder crear una sala pública",
|
||||||
"room-url-copied-to-clipboard": "Enllaç a la sala pública copiat al porta-retalls",
|
"room-url-copied-to-clipboard": "Enllaç a la sala pública copiat al porta-retalls",
|
||||||
"copied-text-error": "L'escriptura al porta-retalls ha fallat. Copiar manualment!",
|
"copied-text-error": "L'escriptura al porta-retalls ha fallat. Copiar manualment!",
|
||||||
|
|||||||
@@ -138,7 +138,6 @@
|
|||||||
"message-transfer-completed": "Nachricht übertragen",
|
"message-transfer-completed": "Nachricht übertragen",
|
||||||
"rate-limit-join-key": "Rate Limit erreicht. Warte 10 Sekunden und versuche es erneut.",
|
"rate-limit-join-key": "Rate Limit erreicht. Warte 10 Sekunden und versuche es erneut.",
|
||||||
"selected-peer-left": "Ausgewählter Peer ist gegangen",
|
"selected-peer-left": "Ausgewählter Peer ist gegangen",
|
||||||
"ios-memory-limit": "Für Übertragungen an iOS Geräte beträgt die maximale Dateigröße 200 MB",
|
|
||||||
"public-room-left": "Öffentlichen Raum {{publicRoomId}} verlassen",
|
"public-room-left": "Öffentlichen Raum {{publicRoomId}} verlassen",
|
||||||
"copied-to-clipboard-error": "Konnte nicht kopieren. Kopiere manuell.",
|
"copied-to-clipboard-error": "Konnte nicht kopieren. Kopiere manuell.",
|
||||||
"public-room-id-invalid": "Ungültige Raum-ID",
|
"public-room-id-invalid": "Ungültige Raum-ID",
|
||||||
|
|||||||
@@ -158,11 +158,13 @@
|
|||||||
"connecting": "Connecting…",
|
"connecting": "Connecting…",
|
||||||
"files-incorrect": "Files are incorrect",
|
"files-incorrect": "Files are incorrect",
|
||||||
"file-transfer-completed": "File transfer completed",
|
"file-transfer-completed": "File transfer completed",
|
||||||
"ios-memory-limit": "Sending files to iOS is only possible up to 200 MB at once",
|
|
||||||
"message-transfer-completed": "Message transfer completed",
|
"message-transfer-completed": "Message transfer completed",
|
||||||
"unfinished-transfers-warning": "There are unfinished transfers. Are you sure you want to close PairDrop?",
|
"unfinished-transfers-warning": "There are unfinished transfers. Are you sure you want to close PairDrop?",
|
||||||
"rate-limit-join-key": "Rate limit reached. Wait 10 seconds and try again.",
|
"rate-limit-join-key": "Rate limit reached. Wait 10 seconds and try again.",
|
||||||
"selected-peer-left": "Selected peer left"
|
"selected-peer-left": "Selected peer left",
|
||||||
|
"error-sharing-size": "Files too big to be shared. They can be downloaded instead.",
|
||||||
|
"error-sharing-default": "Error while sharing. It can be downloaded instead.",
|
||||||
|
"ram-exceed-ios": "One of the files is bigger than 250 MB and will crash the page on iOS. Use https and do not use private tabs on the iOS device to prevent this."
|
||||||
},
|
},
|
||||||
"document-titles": {
|
"document-titles": {
|
||||||
"file-received": "File Received",
|
"file-received": "File Received",
|
||||||
@@ -176,9 +178,14 @@
|
|||||||
"click-to-send-share-mode": "Click to send {{descriptor}}",
|
"click-to-send-share-mode": "Click to send {{descriptor}}",
|
||||||
"click-to-send": "Click to send files or right click to send a message",
|
"click-to-send": "Click to send files or right click to send a message",
|
||||||
"connection-hash": "To verify the security of the end-to-end encryption, compare this security number on both devices",
|
"connection-hash": "To verify the security of the end-to-end encryption, compare this security number on both devices",
|
||||||
|
"connecting": "Connecting…",
|
||||||
"preparing": "Preparing…",
|
"preparing": "Preparing…",
|
||||||
"waiting": "Waiting…",
|
"waiting": "Waiting…",
|
||||||
"processing": "Processing…",
|
"processing": "Processing…",
|
||||||
"transferring": "Transferring…"
|
"transferring": "Sending…",
|
||||||
|
"receiving": "Receiving…",
|
||||||
|
"transfer-complete": "Sent",
|
||||||
|
"receive-complete": "Received",
|
||||||
|
"error": "Error"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,6 @@
|
|||||||
"pairing-cleared": "Todos los dispositivos han sido desemparejados",
|
"pairing-cleared": "Todos los dispositivos han sido desemparejados",
|
||||||
"notifications-enabled": "Notificaciones habilitadas",
|
"notifications-enabled": "Notificaciones habilitadas",
|
||||||
"online-requirement-pairing": "Debes estar en línea para emparejar dispositivos",
|
"online-requirement-pairing": "Debes estar en línea para emparejar dispositivos",
|
||||||
"ios-memory-limit": "Enviar archivos a iOS sólo admite hasta 200 MB a la vez",
|
|
||||||
"online-requirement-public-room": "Debes estar en línea para crear una sala pública",
|
"online-requirement-public-room": "Debes estar en línea para crear una sala pública",
|
||||||
"copied-text-error": "Error al escribir en el portapapeles. ¡Cópielo manualmente!",
|
"copied-text-error": "Error al escribir en el portapapeles. ¡Cópielo manualmente!",
|
||||||
"download-successful": "{{descriptor}} descargado",
|
"download-successful": "{{descriptor}} descargado",
|
||||||
|
|||||||
@@ -137,7 +137,6 @@
|
|||||||
"connecting": "Connexion…",
|
"connecting": "Connexion…",
|
||||||
"files-incorrect": "Les fichiers sont incorrects",
|
"files-incorrect": "Les fichiers sont incorrects",
|
||||||
"file-transfer-completed": "Transfert de fichier terminé",
|
"file-transfer-completed": "Transfert de fichier terminé",
|
||||||
"ios-memory-limit": "L'envoi de fichiers vers iOS n'est possible que jusqu'à 200 Mo à la fois",
|
|
||||||
"message-transfer-completed": "Transfert de message terminé",
|
"message-transfer-completed": "Transfert de message terminé",
|
||||||
"unfinished-transfers-warning": "Il y a des transferts inachevés. Êtes-vous sûr de vouloir fermer PairDrop ?",
|
"unfinished-transfers-warning": "Il y a des transferts inachevés. Êtes-vous sûr de vouloir fermer PairDrop ?",
|
||||||
"rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",
|
"rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
"pairing-cleared": "Semua Perangkat dilepaskan",
|
"pairing-cleared": "Semua Perangkat dilepaskan",
|
||||||
"notifications-enabled": "Notifikasi diaktifkan",
|
"notifications-enabled": "Notifikasi diaktifkan",
|
||||||
"online-requirement-pairing": "Anda harus online untuk memasangkan perangkat",
|
"online-requirement-pairing": "Anda harus online untuk memasangkan perangkat",
|
||||||
"ios-memory-limit": "Mengirim file ke iOS hanya dapat dilakukan hingga 200 MB sekaligus",
|
|
||||||
"online-requirement-public-room": "Anda harus online untuk membuat ruang publik",
|
"online-requirement-public-room": "Anda harus online untuk membuat ruang publik",
|
||||||
"copied-text-error": "Menyalin ke papan klip gagal. Salinlah secara manual!",
|
"copied-text-error": "Menyalin ke papan klip gagal. Salinlah secara manual!",
|
||||||
"download-successful": "{{descriptor}} diunduh",
|
"download-successful": "{{descriptor}} diunduh",
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
"display-name_data-placeholder": "Caricamento…",
|
"display-name_data-placeholder": "Caricamento…",
|
||||||
"display-name_title": "Modifica il nome del tuo dispositivo permanentemente",
|
"display-name_title": "Modifica il nome del tuo dispositivo permanentemente",
|
||||||
"traffic": "Il traffico è",
|
"traffic": "Il traffico è",
|
||||||
"paired-devices_title": "Puoi essere rilevato dai dispositivi associati in ogni momento, indipendentemente dalla rete.",
|
"paired-devices_title": "Puoi essere rilevato dai dispositivi abbinati in ogni momento, indipendentemente dalla rete.",
|
||||||
"public-room-devices": "nella stanza {{roomId}}",
|
"public-room-devices": "nella stanza {{roomId}}",
|
||||||
"paired-devices": "da dispositivi associati",
|
"paired-devices": "da dispositivi abbinati",
|
||||||
"on-this-network": "su questa rete",
|
"on-this-network": "su questa rete",
|
||||||
"routed": "instradato attraverso il server",
|
"routed": "instradato attraverso il server",
|
||||||
"discovery": "Puoi essere rilevato:",
|
"discovery": "Puoi essere rilevato:",
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
"known-as": "Sei visibile come:"
|
"known-as": "Sei visibile come:"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"cancel-share-mode": "Annulla",
|
"cancel-share-mode": "Fatto",
|
||||||
"theme-auto_title": "Adatta il tema al sistema automaticamente",
|
"theme-auto_title": "Adatta il tema al sistema automaticamente",
|
||||||
"install_title": "Installa PairDrop",
|
"install_title": "Installa PairDrop",
|
||||||
"theme-dark_title": "Usa sempre il tema scuro",
|
"theme-dark_title": "Usa sempre il tema scuro",
|
||||||
@@ -26,15 +26,13 @@
|
|||||||
"language-selector_title": "Imposta Lingua",
|
"language-selector_title": "Imposta Lingua",
|
||||||
"about_title": "Informazioni su PairDrop",
|
"about_title": "Informazioni su PairDrop",
|
||||||
"about_aria-label": "Apri 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": {
|
"instructions": {
|
||||||
"x-instructions_mobile": "Tocca per inviare file o tocco prolungato per inviare un messaggio",
|
"x-instructions_mobile": "Tocca per inviare file o tocco prolungato per inviare un messaggio",
|
||||||
"x-instructions-share-mode_desktop": "Clicca per inviare {{descriptor}}",
|
"x-instructions-share-mode_desktop": "Clicca per inviare",
|
||||||
"activate-share-mode-and-other-files-plural": "e altri {{count}} files",
|
"activate-share-mode-and-other-files-plural": "e altri {{count}} files",
|
||||||
"x-instructions-share-mode_mobile": "Tocca per inviare {{descriptor}}",
|
"x-instructions-share-mode_mobile": "Tocca per inviare",
|
||||||
"activate-share-mode-base": "Apri PairDrop su altri dispositivi per inviare",
|
"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",
|
"no-peers-subtitle": "Abbina dispositivi o entra in una stanza pubblica per essere rilevabile su altre reti",
|
||||||
"activate-share-mode-shared-text": "testo condiviso",
|
"activate-share-mode-shared-text": "testo condiviso",
|
||||||
@@ -43,26 +41,23 @@
|
|||||||
"x-instructions_data-drop-peer": "Rilascia per inviare al peer",
|
"x-instructions_data-drop-peer": "Rilascia per inviare al peer",
|
||||||
"x-instructions_data-drop-bg": "Rilascia per selezionare il destinatario",
|
"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!",
|
"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": {
|
"dialogs": {
|
||||||
"auto-accept-instructions-2": "per accettare automaticamente tutti i files inviati da quel dispositivo.",
|
"auto-accept-instructions-2": "per accettare automaticamente tutti i files inviati da quel dispositivo.",
|
||||||
"edit-paired-devices-title": "Modifica Dispositivi Associati",
|
"edit-paired-devices-title": "Modifica Dispositivi Abbinati",
|
||||||
"cancel": "Annulla",
|
"cancel": "Annulla",
|
||||||
"auto-accept-instructions-1": "Attiva",
|
"auto-accept-instructions-1": "Attiva",
|
||||||
"pair-devices-title": "Associa Dispositivi Permanentemente",
|
"pair-devices-title": "Abbina Dispositivi Permanentemente",
|
||||||
"temporary-public-room-title": "Stanza Pubblica Temporanea",
|
"temporary-public-room-title": "Stanza Pubblica Temporanea",
|
||||||
"close": "Chiudi",
|
"close": "Chiudi",
|
||||||
"unpair": "Dissocia",
|
"unpair": "Dissocia",
|
||||||
"pair": "Associa",
|
"pair": "Abbina",
|
||||||
"scan-qr-code": "o scannerizza il codice QR.",
|
"scan-qr-code": "o scannerizza il codice QR.",
|
||||||
"input-key-on-this-device": "Inserisci questo codice su un altro dispositivo",
|
"input-key-on-this-device": "Inserisci questo codice su un altro dispositivo",
|
||||||
"paired-devices-wrapper_data-empty": "Nessun dispositivo associato.",
|
"paired-devices-wrapper_data-empty": "Nessun dispositivo abbinato.",
|
||||||
"enter-key-from-another-device": "Inserisci il codice dell'altro dispositivo qui.",
|
"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",
|
"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.",
|
"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}}",
|
"base64-paste-to-send": "Incolla qui per inviare {{type}}",
|
||||||
@@ -76,7 +71,7 @@
|
|||||||
"join": "Unisciti",
|
"join": "Unisciti",
|
||||||
"title-image-plural": "Immagini",
|
"title-image-plural": "Immagini",
|
||||||
"send": "Invia",
|
"send": "Invia",
|
||||||
"base64-tap-to-paste": "Tocca qui per condividere {{type}}",
|
"base64-tap-to-paste": "Tocca qui per incollare {{type}}",
|
||||||
"base64-text": "testo",
|
"base64-text": "testo",
|
||||||
"copy": "Copia",
|
"copy": "Copia",
|
||||||
"file-other-description-image": "e 1 altra immagine",
|
"file-other-description-image": "e 1 altra immagine",
|
||||||
@@ -87,7 +82,7 @@
|
|||||||
"title-image": "Immagine",
|
"title-image": "Immagine",
|
||||||
"file-other-description-file-plural": "e altri {{count}} files",
|
"file-other-description-file-plural": "e altri {{count}} files",
|
||||||
"would-like-to-share": "vorrebbe condividere",
|
"would-like-to-share": "vorrebbe condividere",
|
||||||
"send-message-to": "A:",
|
"send-message-to": "Invia un messaggio a",
|
||||||
"language-selector-title": "Imposta Lingua",
|
"language-selector-title": "Imposta Lingua",
|
||||||
"hr-or": "OPPURE",
|
"hr-or": "OPPURE",
|
||||||
"download-again": "Scarica ancora",
|
"download-again": "Scarica ancora",
|
||||||
@@ -97,20 +92,11 @@
|
|||||||
"send-message-title": "Invia Messaggio",
|
"send-message-title": "Invia Messaggio",
|
||||||
"file-other-description-image-plural": "e {{count}} altre immagini",
|
"file-other-description-image-plural": "e {{count}} altre immagini",
|
||||||
"message_title": "Inserire messaggio da inviare",
|
"message_title": "Inserire messaggio da inviare",
|
||||||
"pair-devices-qr-code_title": "Clicca per copiare il link di associazione a questo dispositivo",
|
"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",
|
"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": {
|
"notifications": {
|
||||||
"request-title": "{{name}} vorrebbe inviare {{count}} {{descriptor}}",
|
"request-title": "{{name}} vorrebbe trasferire {{count}} {{descriptor}}",
|
||||||
"unfinished-transfers-warning": "Ci sono dei trasferimenti in corso. Sei sicuro di voler chiudere PairDrop?",
|
"unfinished-transfers-warning": "Ci sono dei trasferimenti in corso. Sei sicuro di voler chiudere PairDrop?",
|
||||||
"message-received": "Messaggio ricevuto da {{name}} - Clicca per copiare",
|
"message-received": "Messaggio ricevuto da {{name}} - Clicca per copiare",
|
||||||
"rate-limit-join-key": "Limite raggiunto. Aspetta 10 secondi e riprova.",
|
"rate-limit-join-key": "Limite raggiunto. Aspetta 10 secondi e riprova.",
|
||||||
@@ -118,22 +104,22 @@
|
|||||||
"pairing-key-invalidated": "Il codice {{key}} è stato invalidato",
|
"pairing-key-invalidated": "Il codice {{key}} è stato invalidato",
|
||||||
"pairing-key-invalid": "Codice non valido",
|
"pairing-key-invalid": "Codice non valido",
|
||||||
"connected": "Connesso",
|
"connected": "Connesso",
|
||||||
"pairing-not-persistent": "I dispositivi associati non sono permanenti",
|
"pairing-not-persistent": "I dispositivi abbinati non sono persistenti",
|
||||||
"text-content-incorrect": "Il contenuto di testo è errato",
|
"text-content-incorrect": "Il contenuto testuale non è corretto",
|
||||||
"message-transfer-completed": "Trasferimento del messaggio completato",
|
"message-transfer-completed": "Trasferimento del messaggio completato",
|
||||||
"file-transfer-completed": "Trasferimento file completato",
|
"file-transfer-completed": "Trasferimento file completato",
|
||||||
"file-content-incorrect": "Il contenuto del file è errato",
|
"file-content-incorrect": "Il contenuto del file non è corretto",
|
||||||
"files-incorrect": "I file sono errati",
|
"files-incorrect": "I file non sono corretti",
|
||||||
"selected-peer-left": "Il peer selezionato ha abbandonato",
|
"selected-peer-left": "Peer selezionato ha abbandonato",
|
||||||
"link-received": "Link ricevuto da {{name}} - Clicca per aprire",
|
"link-received": "Link ricevuto da {{name}} - Clicca per aprire",
|
||||||
"online": "Sei di nuovo online",
|
"online": "Sei di nuovo online",
|
||||||
"public-room-left": "Hai abbandonato la stanza pubblica {{publicRoomId}}",
|
"public-room-left": "Ha lasciato la stanza pubblica {{publicRoomId}}",
|
||||||
"copied-text": "Testo copiato negli appunti",
|
"copied-text": "Testo copiato negli appunti",
|
||||||
"display-name-random-again": "Il nome visualizzato viene di nuovo generato casualmente",
|
"display-name-random-again": "Il nome visualizzato è generato casualmente un'altra volta",
|
||||||
"display-name-changed-permanently": "Il nome visualizzato è cambiato definitivamente",
|
"display-name-changed-permanently": "Il nome visualizzato è cambiato permanentemente",
|
||||||
"copied-to-clipboard-error": "La funzione di copia non è possibile. Copia manualmente.",
|
"copied-to-clipboard-error": "La copia non è possibile. Copia manualmente.",
|
||||||
"pairing-success": "Dispositivi associati",
|
"pairing-success": "Dispositivi abbinati",
|
||||||
"clipboard-content-incorrect": "Il contenuto copiato è errato",
|
"clipboard-content-incorrect": "Il contenuto copiato non è corretto",
|
||||||
"display-name-changed-temporarily": "Il nome visualizzato è cambiato solo per questa sessione",
|
"display-name-changed-temporarily": "Il nome visualizzato è cambiato solo per questa sessione",
|
||||||
"copied-to-clipboard": "Copiato negli appunti",
|
"copied-to-clipboard": "Copiato negli appunti",
|
||||||
"offline": "Sei offline",
|
"offline": "Sei offline",
|
||||||
@@ -142,14 +128,13 @@
|
|||||||
"click-to-download": "Clicca per scaricare",
|
"click-to-download": "Clicca per scaricare",
|
||||||
"pairing-cleared": "Tutti i dispositivi sono stati dissociati",
|
"pairing-cleared": "Tutti i dispositivi sono stati dissociati",
|
||||||
"notifications-enabled": "Notifiche attivate",
|
"notifications-enabled": "Notifiche attivate",
|
||||||
"online-requirement-pairing": "Devi essere online per associare dispositivi",
|
"online-requirement-pairing": "Devi essere online per abbinare 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",
|
"online-requirement-public-room": "Devi essere online per creare una stanza pubblica",
|
||||||
"copied-text-error": "Scrittura negli appunti fallita. Copia manualmente!",
|
"copied-text-error": "Scrittura negli appunti fallita. Copia manualmente!",
|
||||||
"download-successful": "{{descriptor}} scaricato",
|
"download-successful": "{{descriptor}} scaricato",
|
||||||
"click-to-show": "Clicca per mostrare",
|
"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.",
|
"notifications-permissions-error": "Il permesso all'invio delle notifiche è stato negato poiché l'utente ha ignorato varie volte le richieste di permesso. Ciò può essere ripristinato nelle \"informazioni sito\" cliccando sull'icona a forma di lucchetto vicino alla barra degli indirizzi.",
|
||||||
"pair-url-copied-to-clipboard": "Link di associazione copiato negli appunti",
|
"pair-url-copied-to-clipboard": "Link di abbinamento copiato negli appunti",
|
||||||
"room-url-copied-to-clipboard": "Link della stanza copiato negli appunti"
|
"room-url-copied-to-clipboard": "Link della stanza copiato negli appunti"
|
||||||
},
|
},
|
||||||
"peer-ui": {
|
"peer-ui": {
|
||||||
@@ -165,18 +150,14 @@
|
|||||||
"claim": "Il modo più semplice per trasferire files tra dispositivi",
|
"claim": "Il modo più semplice per trasferire files tra dispositivi",
|
||||||
"tweet_title": "Twitta riguardo PairDrop",
|
"tweet_title": "Twitta riguardo PairDrop",
|
||||||
"close-about_aria-label": "Chiudi Informazioni su PairDrop",
|
"close-about_aria-label": "Chiudi Informazioni su PairDrop",
|
||||||
"buy-me-a-coffee_title": "Offrimi un caffè!",
|
"buy-me-a-coffee_title": "Comprami un caffè!",
|
||||||
"github_title": "PairDrop su GitHub",
|
"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": {
|
"document-titles": {
|
||||||
"file-transfer-requested": "Trasferimento File Richiesto",
|
"file-transfer-requested": "Trasferimento File Richiesto",
|
||||||
"image-transfer-requested": "Trasferimento Immagine Richiesto",
|
"image-transfer-requested": "Trasferimento Immagine Richiesto",
|
||||||
"message-received-plural": "{{count}} Messaggi Ricevuti",
|
"message-received-plural": "{{count}} Messaggi ricevuti",
|
||||||
"message-received": "Messaggio ricevuto",
|
"message-received": "Messaggio ricevuto",
|
||||||
"file-received": "File Ricevuto",
|
"file-received": "File Ricevuto",
|
||||||
"file-received-plural": "{{count}} Files Ricevuti"
|
"file-received-plural": "{{count}} Files Ricevuti"
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
"pairing-cleared": "全てのデバイスのペア設定を解除しました",
|
"pairing-cleared": "全てのデバイスのペア設定を解除しました",
|
||||||
"notifications-enabled": "通知が有効です",
|
"notifications-enabled": "通知が有効です",
|
||||||
"online-requirement-pairing": "デバイスをペア設定するにはオンラインである必要があります",
|
"online-requirement-pairing": "デバイスをペア設定するにはオンラインである必要があります",
|
||||||
"ios-memory-limit": "iOSへのファイル送信は一度に200MBまでしかできません",
|
|
||||||
"online-requirement-public-room": "パブリックルームを作成するにはオンラインである必要があります",
|
"online-requirement-public-room": "パブリックルームを作成するにはオンラインである必要があります",
|
||||||
"copied-text-error": "クリップボードにコピーできませんでした。手動でコピーしてください。",
|
"copied-text-error": "クリップボードにコピーできませんでした。手動でコピーしてください。",
|
||||||
"download-successful": "{{descriptor}}をダウンロードしました",
|
"download-successful": "{{descriptor}}をダウンロードしました",
|
||||||
|
|||||||
@@ -128,7 +128,6 @@
|
|||||||
"pairing-cleared": "ಎಲ್ಲಾ ಸಾಧನಗಳನ್ನು ಜೋಡಿಯಾಗಿ ತೆಗೆಯಲಾಗಿದೆ",
|
"pairing-cleared": "ಎಲ್ಲಾ ಸಾಧನಗಳನ್ನು ಜೋಡಿಯಾಗಿ ತೆಗೆಯಲಾಗಿದೆ",
|
||||||
"notifications-enabled": "ಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ",
|
"notifications-enabled": "ಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ",
|
||||||
"online-requirement-pairing": "ಸಾಧನಗಳನ್ನು ಜೋಡಿಸಲು ನೀವು ಆನ್ಲೈನ್ ಇರಬೇಕು",
|
"online-requirement-pairing": "ಸಾಧನಗಳನ್ನು ಜೋಡಿಸಲು ನೀವು ಆನ್ಲೈನ್ ಇರಬೇಕು",
|
||||||
"ios-memory-limit": "iOSಗೆ ಫೈಲ್ಗಳನ್ನು ಕಳುಹಿಸುವುದು ಒಂದೇ ಬಾರಿಗೆ 200 MB ವರೆಗೆ ಮಾತ್ರ ಸಾಧ್ಯವಾಗಿದೆ",
|
|
||||||
"online-requirement-public-room": "ಸಾರ್ವಜನಿಕ ಕೊಠಡಿಯನ್ನು ರಚಿಸಲು ನೀವು ಆನ್ಲೈನ್ ಇರಬೇಕು",
|
"online-requirement-public-room": "ಸಾರ್ವಜನಿಕ ಕೊಠಡಿಯನ್ನು ರಚಿಸಲು ನೀವು ಆನ್ಲೈನ್ ಇರಬೇಕು",
|
||||||
"room-url-copied-to-clipboard": "ಸಾರ್ವಜನಿಕ ಕೊಠಡಿಯ ಲಿಂಕ್ ಅನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲಿಸಲಾಗಿದೆ",
|
"room-url-copied-to-clipboard": "ಸಾರ್ವಜನಿಕ ಕೊಠಡಿಯ ಲಿಂಕ್ ಅನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲಿಸಲಾಗಿದೆ",
|
||||||
"copied-text-error": "ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ಬರೆಯುವುದು ವಿಫಲವಾಗಿದೆ. ಕೈಯಾರೆ ನಕಲಿಸಿ!",
|
"copied-text-error": "ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ಬರೆಯುವುದು ವಿಫಲವಾಗಿದೆ. ಕೈಯಾರೆ ನಕಲಿಸಿ!",
|
||||||
|
|||||||
@@ -116,7 +116,6 @@
|
|||||||
"request-title": "{{name}} ønsker å overføre {{count}} {{descriptor}}",
|
"request-title": "{{name}} ønsker å overføre {{count}} {{descriptor}}",
|
||||||
"message-received": "Melding mottatt av {{name}} - Klikk for å åpne",
|
"message-received": "Melding mottatt av {{name}} - Klikk for å åpne",
|
||||||
"files-incorrect": "Filene er uriktige",
|
"files-incorrect": "Filene er uriktige",
|
||||||
"ios-memory-limit": "Forsendelse av filer til iOS er kun mulig opptil 200 MB av gangen",
|
|
||||||
"unfinished-transfers-warning": "Lukk med ufullførte overføringer?",
|
"unfinished-transfers-warning": "Lukk med ufullførte overføringer?",
|
||||||
"rate-limit-join-key": "Forsøksgrense overskredet. Vent 10 sek. og prøv igjen."
|
"rate-limit-join-key": "Forsøksgrense overskredet. Vent 10 sek. og prøv igjen."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
"pairing-cleared": "Alle apparaten ontkoppeld",
|
"pairing-cleared": "Alle apparaten ontkoppeld",
|
||||||
"notifications-enabled": "Meldingen geactiveerd",
|
"notifications-enabled": "Meldingen geactiveerd",
|
||||||
"online-requirement-pairing": "U moet online zijn om apparaten te koppelen",
|
"online-requirement-pairing": "U moet online zijn om apparaten te koppelen",
|
||||||
"ios-memory-limit": "Bestandsoverdrachten naar iOS kunnen slechts met 200 MB per keer",
|
|
||||||
"online-requirement-public-room": "U moet online zijn om een openbare kamer te maken",
|
"online-requirement-public-room": "U moet online zijn om een openbare kamer te maken",
|
||||||
"copied-text-error": "Schrijven naar klembord mislukt. Kopieer handmatig!",
|
"copied-text-error": "Schrijven naar klembord mislukt. Kopieer handmatig!",
|
||||||
"download-successful": "{{descriptor}} downloaden",
|
"download-successful": "{{descriptor}} downloaden",
|
||||||
|
|||||||
@@ -153,7 +153,6 @@
|
|||||||
"connecting": "Conectando…",
|
"connecting": "Conectando…",
|
||||||
"files-incorrect": "Os arquivos estão incorretos",
|
"files-incorrect": "Os arquivos estão incorretos",
|
||||||
"file-transfer-completed": "Transferência de arquivo concluída",
|
"file-transfer-completed": "Transferência de arquivo concluída",
|
||||||
"ios-memory-limit": "Enviar arquivos para iOS só é possível até 200 MB de uma vez",
|
|
||||||
"message-transfer-completed": "Transferência de mensagem concluída",
|
"message-transfer-completed": "Transferência de mensagem concluída",
|
||||||
"unfinished-transfers-warning": "Há transferências inacabadas. Tem certeza de que deseja fechar o PairDrop?",
|
"unfinished-transfers-warning": "Há transferências inacabadas. Tem certeza de que deseja fechar o PairDrop?",
|
||||||
"rate-limit-join-key": "Limite de taxa atingido. Aguarde 10 segundos e tente novamente.",
|
"rate-limit-join-key": "Limite de taxa atingido. Aguarde 10 segundos e tente novamente.",
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
"pairing-cleared": "Toate dispozitivele sunt decuplate",
|
"pairing-cleared": "Toate dispozitivele sunt decuplate",
|
||||||
"notifications-enabled": "Notificări activate",
|
"notifications-enabled": "Notificări activate",
|
||||||
"online-requirement-pairing": "Trebuie să fiți online pentru a asocia dispozitivele",
|
"online-requirement-pairing": "Trebuie să fiți online pentru a asocia dispozitivele",
|
||||||
"ios-memory-limit": "Trimiterea de fișiere pe iOS este posibilă doar până la 200 MB simultan",
|
|
||||||
"online-requirement-public-room": "Trebuie să fiți online pentru a crea o cameră publică",
|
"online-requirement-public-room": "Trebuie să fiți online pentru a crea o cameră publică",
|
||||||
"copied-text-error": "Scrierea în clipboard a eșuat. Copiați manual!",
|
"copied-text-error": "Scrierea în clipboard a eșuat. Copiați manual!",
|
||||||
"download-successful": "{{descriptor}} descărcat",
|
"download-successful": "{{descriptor}} descărcat",
|
||||||
|
|||||||
@@ -121,7 +121,6 @@
|
|||||||
"online-requirement": "Для сопряжения устройств вам нужно быть в сети.",
|
"online-requirement": "Для сопряжения устройств вам нужно быть в сети.",
|
||||||
"files-incorrect": "Файлы неверны",
|
"files-incorrect": "Файлы неверны",
|
||||||
"message-transfer-completed": "Передача сообщения завершена",
|
"message-transfer-completed": "Передача сообщения завершена",
|
||||||
"ios-memory-limit": "Отправка файлов на iOS устройства возможна только до 200 МБ за один раз",
|
|
||||||
"selected-peer-left": "Выбранный узел вышел",
|
"selected-peer-left": "Выбранный узел вышел",
|
||||||
"request-title": "{{name}} хотел бы передать {{count}} {{descriptor}}",
|
"request-title": "{{name}} хотел бы передать {{count}} {{descriptor}}",
|
||||||
"rate-limit-join-key": "Достигнут предел скорости. Подождите 10 секунд и повторите попытку.",
|
"rate-limit-join-key": "Достигнут предел скорости. Подождите 10 секунд и повторите попытку.",
|
||||||
|
|||||||
@@ -145,7 +145,6 @@
|
|||||||
"pairing-cleared": "Tüm cihazlar eşleştirmeden çıkarıldı",
|
"pairing-cleared": "Tüm cihazlar eşleştirmeden çıkarıldı",
|
||||||
"notifications-enabled": "Bildirimler etkinleştirildi",
|
"notifications-enabled": "Bildirimler etkinleştirildi",
|
||||||
"online-requirement-pairing": "Cihazları eşleştirmek için çevrimiçi olmanız lazım",
|
"online-requirement-pairing": "Cihazları eşleştirmek için çevrimiçi olmanız lazım",
|
||||||
"ios-memory-limit": "iOS'a tek seferde sadece 200MB'a kadar dosya gönderebilirsin",
|
|
||||||
"online-requirement-public-room": "Genel oda oluşturmak için çevrimiçi olmanız lazım",
|
"online-requirement-public-room": "Genel oda oluşturmak için çevrimiçi olmanız lazım",
|
||||||
"room-url-copied-to-clipboard": "Genel oda bağlantı linki panoya kopyalandı",
|
"room-url-copied-to-clipboard": "Genel oda bağlantı linki panoya kopyalandı",
|
||||||
"copied-text-error": "Panoya kopyalanamadı. Lütfen manuel olarak kopyalayın!",
|
"copied-text-error": "Panoya kopyalanamadı. Lütfen manuel olarak kopyalayın!",
|
||||||
|
|||||||
@@ -154,7 +154,6 @@
|
|||||||
"files-incorrect": "文件不正确",
|
"files-incorrect": "文件不正确",
|
||||||
"file-transfer-completed": "文件传输已完成",
|
"file-transfer-completed": "文件传输已完成",
|
||||||
"connecting": "连接中…",
|
"connecting": "连接中…",
|
||||||
"ios-memory-limit": "向 iOS 发送文件 一次最多只能发送 200 MB",
|
|
||||||
"rate-limit-join-key": "已达连接限制。请等待 10秒 后再试。",
|
"rate-limit-join-key": "已达连接限制。请等待 10秒 后再试。",
|
||||||
"public-room-left": "已退出公共房间 {{publicRoomId}}",
|
"public-room-left": "已退出公共房间 {{publicRoomId}}",
|
||||||
"copied-to-clipboard-error": "无法复制。请手动复制。",
|
"copied-to-clipboard-error": "无法复制。请手动复制。",
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class BrowserTabsConnector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onMessage(e) {
|
_onMessage(e) {
|
||||||
console.log('Broadcast:', e.data)
|
Logger.debug('Broadcast:', e.data)
|
||||||
switch (e.data.type) {
|
switch (e.data.type) {
|
||||||
case 'self-display-name-changed':
|
case 'self-display-name-changed':
|
||||||
Events.fire('self-display-name-changed', e.data.detail);
|
Events.fire('self-display-name-changed', e.data.detail);
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class Localization {
|
|||||||
Localization.$htmlRoot.setAttribute('lang', locale);
|
Localization.$htmlRoot.setAttribute('lang', locale);
|
||||||
|
|
||||||
|
|
||||||
console.log("Page successfully translated",
|
Logger.debug("Page successfully translated",
|
||||||
`System language: ${Localization.systemLocale}`,
|
`System language: ${Localization.systemLocale}`,
|
||||||
`Selected language: ${locale}`
|
`Selected language: ${locale}`
|
||||||
);
|
);
|
||||||
@@ -145,7 +145,7 @@ class Localization {
|
|||||||
translation = translationObj[lastKey];
|
translation = translationObj[lastKey];
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!translation) {
|
if (!translation) {
|
||||||
@@ -179,7 +179,7 @@ class Localization {
|
|||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
// Log warnings and help calls
|
// Log warnings and help calls
|
||||||
console.warn(e);
|
Logger.warn(e);
|
||||||
Localization.logTranslationMissingOrBroken(key, attr, data, useDefault);
|
Localization.logTranslationMissingOrBroken(key, attr, data, useDefault);
|
||||||
Localization.logHelpCallKey(key, attr);
|
Localization.logHelpCallKey(key, attr);
|
||||||
Localization.logHelpCall();
|
Localization.logHelpCall();
|
||||||
@@ -192,7 +192,7 @@ class Localization {
|
|||||||
else {
|
else {
|
||||||
// Is not default locale yet
|
// Is not default locale yet
|
||||||
// Get translation for default language with same arguments
|
// Get translation for default language with same arguments
|
||||||
console.log(`Using default language ${Localization.defaultLocale.toUpperCase()} instead.`);
|
Logger.debug(`Using default language ${Localization.defaultLocale.toUpperCase()} instead.`);
|
||||||
translation = this.getTranslation(key, attr, data, true);
|
translation = this.getTranslation(key, attr, data, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,11 +205,11 @@ class Localization {
|
|||||||
? Localization.defaultLocale.toUpperCase()
|
? Localization.defaultLocale.toUpperCase()
|
||||||
: Localization.locale.toUpperCase();
|
: Localization.locale.toUpperCase();
|
||||||
|
|
||||||
console.warn(`Missing or broken translation for language ${usedLocale}.\n`, 'key:', key, 'attr:', attr, 'data:', data);
|
Logger.warn(`Missing or broken translation for language ${usedLocale}.\n`, 'key:', key, 'attr:', attr, 'data:', data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static logHelpCall() {
|
static logHelpCall() {
|
||||||
console.log("Help translating PairDrop: https://hosted.weblate.org/engage/pairdrop/");
|
Logger.warn("Help translating PairDrop: https://hosted.weblate.org/engage/pairdrop/");
|
||||||
}
|
}
|
||||||
|
|
||||||
static logHelpCallKey(key, attr) {
|
static logHelpCallKey(key, attr) {
|
||||||
@@ -219,7 +219,7 @@ class Localization {
|
|||||||
? key
|
? key
|
||||||
: `${key}_${attr}`;
|
: `${key}_${attr}`;
|
||||||
|
|
||||||
console.warn(`Translate this string here: https://hosted.weblate.org/browse/pairdrop/pairdrop-spa/${locale}/?q=${keyComplete}`);
|
Logger.warn(`Translate this string here: https://hosted.weblate.org/browse/pairdrop/pairdrop-spa/${locale}/?q=${keyComplete}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
static escapeHTML(unsafeText) {
|
static escapeHTML(unsafeText) {
|
||||||
|
|||||||
@@ -1,3 +1,23 @@
|
|||||||
|
class Logger {
|
||||||
|
|
||||||
|
static debug(message, ...optionalParams) {
|
||||||
|
if (window.debugMode) {
|
||||||
|
console.debug("DEBUG:", message, ...optionalParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static log(message, ...optionalParams) {
|
||||||
|
console.log("LOG:", message, ...optionalParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
static warn(message, ...optionalParams) {
|
||||||
|
console.warn("WARN:", message, ...optionalParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
static error(message, ...optionalParams) {
|
||||||
|
console.error("ERROR:", message, ...optionalParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PairDrop {
|
class PairDrop {
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -34,14 +54,14 @@ class PairDrop {
|
|||||||
|
|
||||||
this.initialize()
|
this.initialize()
|
||||||
.then(_ => {
|
.then(_ => {
|
||||||
console.log("Initialization completed.");
|
Logger.log("Initialization completed.");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async initialize() {
|
async initialize() {
|
||||||
// Translate page before fading in
|
// Translate page before fading in
|
||||||
await this.localization.setInitialTranslation()
|
await this.localization.setInitialTranslation()
|
||||||
console.log("Initial translation successful.");
|
Logger.log("Initial translation successful.");
|
||||||
|
|
||||||
// Show "Loading..." until connected to WsServer
|
// Show "Loading..." until connected to WsServer
|
||||||
await this.footerUI.showLoading();
|
await this.footerUI.showLoading();
|
||||||
@@ -56,16 +76,16 @@ class PairDrop {
|
|||||||
await this.backgroundCanvas.fadeIn();
|
await this.backgroundCanvas.fadeIn();
|
||||||
|
|
||||||
// Load deferred assets
|
// Load deferred assets
|
||||||
console.log("Load deferred assets...");
|
Logger.log("Load deferred assets...");
|
||||||
await this.loadDeferredAssets();
|
await this.loadDeferredAssets();
|
||||||
console.log("Loading of deferred assets completed.");
|
Logger.log("Loading of deferred assets completed.");
|
||||||
|
|
||||||
console.log("Hydrate UI...");
|
Logger.log("Hydrate UI...");
|
||||||
await this.hydrate();
|
await this.hydrate();
|
||||||
console.log("UI hydrated.");
|
Logger.log("UI hydrated.");
|
||||||
|
|
||||||
// Evaluate url params as soon as ws is connected
|
// Evaluate url params as soon as ws is connected
|
||||||
console.log("Evaluate URL params as soon as websocket connection is established.");
|
Logger.log("Evaluate URL params as soon as websocket connection is established.");
|
||||||
Events.on('ws-connected', _ => this.evaluateUrlParams(), {once: true});
|
Events.on('ws-connected', _ => this.evaluateUrlParams(), {once: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +94,7 @@ class PairDrop {
|
|||||||
navigator.serviceWorker
|
navigator.serviceWorker
|
||||||
.register('service-worker.js')
|
.register('service-worker.js')
|
||||||
.then(serviceWorker => {
|
.then(serviceWorker => {
|
||||||
console.log('Service Worker registered');
|
Logger.log('Service Worker registered');
|
||||||
window.serviceWorker = serviceWorker
|
window.serviceWorker = serviceWorker
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -117,6 +137,7 @@ class PairDrop {
|
|||||||
let stylesheet = document.createElement('link');
|
let stylesheet = document.createElement('link');
|
||||||
stylesheet.rel = 'preload';
|
stylesheet.rel = 'preload';
|
||||||
stylesheet.as = 'style';
|
stylesheet.as = 'style';
|
||||||
|
stylesheet.defer = true;
|
||||||
stylesheet.href = url;
|
stylesheet.href = url;
|
||||||
stylesheet.onload = _ => {
|
stylesheet.onload = _ => {
|
||||||
stylesheet.onload = null;
|
stylesheet.onload = null;
|
||||||
@@ -133,10 +154,10 @@ class PairDrop {
|
|||||||
return new Promise( async (resolve) => {
|
return new Promise( async (resolve) => {
|
||||||
try {
|
try {
|
||||||
await this.loadStyleSheet(url);
|
await this.loadStyleSheet(url);
|
||||||
console.log(`Stylesheet loaded successfully: ${url}`);
|
Logger.log(`Stylesheet loaded successfully: ${url}`);
|
||||||
resolve();
|
resolve();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error loading stylesheet:', error);
|
Logger.error('Error loading stylesheet:', error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -156,10 +177,10 @@ class PairDrop {
|
|||||||
return new Promise( async (resolve) => {
|
return new Promise( async (resolve) => {
|
||||||
try {
|
try {
|
||||||
await this.loadScript(url);
|
await this.loadScript(url);
|
||||||
console.log(`Script loaded successfully: ${url}`);
|
Logger.log(`Script loaded successfully: ${url}`);
|
||||||
resolve();
|
resolve();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error loading script:', error);
|
Logger.error('Error loading script:', error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -229,12 +250,17 @@ class PairDrop {
|
|||||||
this.publicRoomDialog._createPublicRoom();
|
this.publicRoomDialog._createPublicRoom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (urlParams.has("debug") && urlParams.get("debug") === "true") {
|
||||||
|
window.debugMode = true;
|
||||||
|
}
|
||||||
|
|
||||||
// remove url params from url
|
if (!window.debugMode) {
|
||||||
const urlWithoutParams = getUrlWithoutArguments();
|
// remove url params from url
|
||||||
window.history.replaceState({}, "Rewrite URL", urlWithoutParams);
|
const urlWithoutParams = getUrlWithoutArguments();
|
||||||
|
window.history.replaceState({}, "Rewrite URL", urlWithoutParams);
|
||||||
|
}
|
||||||
|
|
||||||
console.log("URL params evaluated.");
|
Logger.log("URL params evaluated.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,19 +7,18 @@ class PersistentStorage {
|
|||||||
const DBOpenRequest = window.indexedDB.open('pairdrop_store', 5);
|
const DBOpenRequest = window.indexedDB.open('pairdrop_store', 5);
|
||||||
DBOpenRequest.onerror = e => {
|
DBOpenRequest.onerror = e => {
|
||||||
PersistentStorage.logBrowserNotCapable();
|
PersistentStorage.logBrowserNotCapable();
|
||||||
console.log('Error initializing database: ');
|
Logger.error('Error initializing database:', e);
|
||||||
console.log(e)
|
|
||||||
};
|
};
|
||||||
DBOpenRequest.onsuccess = _ => {
|
DBOpenRequest.onsuccess = _ => {
|
||||||
console.log('Database initialised.');
|
Logger.debug('Database initialised.');
|
||||||
};
|
};
|
||||||
DBOpenRequest.onupgradeneeded = async e => {
|
DBOpenRequest.onupgradeneeded = async e => {
|
||||||
const db = e.target.result;
|
const db = e.target.result;
|
||||||
const txn = e.target.transaction;
|
const txn = e.target.transaction;
|
||||||
|
|
||||||
db.onerror = e => console.log('Error loading database: ' + e);
|
db.onerror = e => Logger.error('Error loading database:', e);
|
||||||
|
|
||||||
console.log(`Upgrading IndexedDB database from version ${e.oldVersion} to version ${e.newVersion}`);
|
Logger.debug(`Upgrading IndexedDB database from version ${e.oldVersion} to version ${e.newVersion}`);
|
||||||
|
|
||||||
if (e.oldVersion === 0) {
|
if (e.oldVersion === 0) {
|
||||||
// initiate v1
|
// initiate v1
|
||||||
@@ -54,7 +53,7 @@ class PersistentStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static logBrowserNotCapable() {
|
static logBrowserNotCapable() {
|
||||||
console.log("This browser does not support IndexedDB. Paired devices will be gone after the browser is closed.");
|
Logger.log("This browser does not support IndexedDB. Paired devices will be gone after the browser is closed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
static set(key, value) {
|
static set(key, value) {
|
||||||
@@ -66,7 +65,7 @@ class PersistentStorage {
|
|||||||
const objectStore = transaction.objectStore('keyval');
|
const objectStore = transaction.objectStore('keyval');
|
||||||
const objectStoreRequest = objectStore.put(value, key);
|
const objectStoreRequest = objectStore.put(value, key);
|
||||||
objectStoreRequest.onsuccess = _ => {
|
objectStoreRequest.onsuccess = _ => {
|
||||||
console.log(`Request successful. Added key-pair: ${key} - ${value}`);
|
Logger.debug(`Request successful. Added key-pair: ${key} - ${value}`);
|
||||||
resolve(value);
|
resolve(value);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -85,7 +84,7 @@ class PersistentStorage {
|
|||||||
const objectStore = transaction.objectStore('keyval');
|
const objectStore = transaction.objectStore('keyval');
|
||||||
const objectStoreRequest = objectStore.get(key);
|
const objectStoreRequest = objectStore.get(key);
|
||||||
objectStoreRequest.onsuccess = _ => {
|
objectStoreRequest.onsuccess = _ => {
|
||||||
console.log(`Request successful. Retrieved key-pair: ${key} - ${objectStoreRequest.result}`);
|
Logger.debug(`Request successful. Retrieved key-pair: ${key} - ${objectStoreRequest.result}`);
|
||||||
resolve(objectStoreRequest.result);
|
resolve(objectStoreRequest.result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,7 +103,7 @@ class PersistentStorage {
|
|||||||
const objectStore = transaction.objectStore('keyval');
|
const objectStore = transaction.objectStore('keyval');
|
||||||
const objectStoreRequest = objectStore.delete(key);
|
const objectStoreRequest = objectStore.delete(key);
|
||||||
objectStoreRequest.onsuccess = _ => {
|
objectStoreRequest.onsuccess = _ => {
|
||||||
console.log(`Request successful. Deleted key: ${key}`);
|
Logger.debug(`Request successful. Deleted key: ${key}`);
|
||||||
resolve();
|
resolve();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -128,7 +127,7 @@ class PersistentStorage {
|
|||||||
'auto_accept': false
|
'auto_accept': false
|
||||||
});
|
});
|
||||||
objectStoreRequest.onsuccess = e => {
|
objectStoreRequest.onsuccess = e => {
|
||||||
console.log(`Request successful. RoomSecret added: ${e.target.result}`);
|
Logger.debug(`Request successful. RoomSecret added: ${e.target.result}`);
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -145,7 +144,7 @@ class PersistentStorage {
|
|||||||
for (let i = 0; i < roomSecrets.length; i++) {
|
for (let i = 0; i < roomSecrets.length; i++) {
|
||||||
secrets.push(roomSecrets[i].secret);
|
secrets.push(roomSecrets[i].secret);
|
||||||
}
|
}
|
||||||
console.log(`Request successful. Retrieved ${secrets.length} room_secrets`);
|
Logger.debug(`Request successful. Retrieved ${secrets.length} room_secrets`);
|
||||||
return(secrets);
|
return(secrets);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.logBrowserNotCapable();
|
this.logBrowserNotCapable();
|
||||||
@@ -182,13 +181,13 @@ class PersistentStorage {
|
|||||||
objectStoreRequestKey.onsuccess = e => {
|
objectStoreRequestKey.onsuccess = e => {
|
||||||
const key = e.target.result;
|
const key = e.target.result;
|
||||||
if (!key) {
|
if (!key) {
|
||||||
console.log(`Nothing to retrieve. Entry for room_secret not existing: ${roomSecret}`);
|
Logger.debug(`Nothing to retrieve. Entry for room_secret not existing: ${roomSecret}`);
|
||||||
resolve();
|
resolve();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const objectStoreRequestRetrieval = objectStore.get(key);
|
const objectStoreRequestRetrieval = objectStore.get(key);
|
||||||
objectStoreRequestRetrieval.onsuccess = e => {
|
objectStoreRequestRetrieval.onsuccess = e => {
|
||||||
console.log(`Request successful. Retrieved entry for room_secret: ${key}`);
|
Logger.debug(`Request successful. Retrieved entry for room_secret: ${key}`);
|
||||||
resolve({
|
resolve({
|
||||||
"entry": e.target.result,
|
"entry": e.target.result,
|
||||||
"key": key
|
"key": key
|
||||||
@@ -215,14 +214,14 @@ class PersistentStorage {
|
|||||||
const objectStoreRequestKey = objectStore.index("secret").getKey(roomSecret);
|
const objectStoreRequestKey = objectStore.index("secret").getKey(roomSecret);
|
||||||
objectStoreRequestKey.onsuccess = e => {
|
objectStoreRequestKey.onsuccess = e => {
|
||||||
if (!e.target.result) {
|
if (!e.target.result) {
|
||||||
console.log(`Nothing to delete. room_secret not existing: ${roomSecret}`);
|
Logger.debug(`Nothing to delete. room_secret not existing: ${roomSecret}`);
|
||||||
resolve();
|
resolve();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const key = e.target.result;
|
const key = e.target.result;
|
||||||
const objectStoreRequestDeletion = objectStore.delete(key);
|
const objectStoreRequestDeletion = objectStore.delete(key);
|
||||||
objectStoreRequestDeletion.onsuccess = _ => {
|
objectStoreRequestDeletion.onsuccess = _ => {
|
||||||
console.log(`Request successful. Deleted room_secret: ${key}`);
|
Logger.debug(`Request successful. Deleted room_secret: ${key}`);
|
||||||
resolve(roomSecret);
|
resolve(roomSecret);
|
||||||
}
|
}
|
||||||
objectStoreRequestDeletion.onerror = e => {
|
objectStoreRequestDeletion.onerror = e => {
|
||||||
@@ -245,7 +244,7 @@ class PersistentStorage {
|
|||||||
const objectStore = transaction.objectStore('room_secrets');
|
const objectStore = transaction.objectStore('room_secrets');
|
||||||
const objectStoreRequest = objectStore.clear();
|
const objectStoreRequest = objectStore.clear();
|
||||||
objectStoreRequest.onsuccess = _ => {
|
objectStoreRequest.onsuccess = _ => {
|
||||||
console.log('Request successful. All room_secrets cleared');
|
Logger.debug('Request successful. All room_secrets cleared');
|
||||||
resolve();
|
resolve();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -255,15 +254,15 @@ class PersistentStorage {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
static updateRoomSecretNames(roomSecret, displayName, deviceName) {
|
static updateRoomSecretDisplayName(roomSecret, displayName) {
|
||||||
return this.updateRoomSecret(roomSecret, undefined, displayName, deviceName);
|
return this.updateRoomSecret(roomSecret, null, displayName, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
static updateRoomSecretAutoAccept(roomSecret, autoAccept) {
|
static updateRoomSecretAutoAccept(roomSecret, autoAccept) {
|
||||||
return this.updateRoomSecret(roomSecret, undefined, undefined, undefined, autoAccept);
|
return this.updateRoomSecret(roomSecret, null, null, null, autoAccept);
|
||||||
}
|
}
|
||||||
|
|
||||||
static updateRoomSecret(roomSecret, updatedRoomSecret = undefined, updatedDisplayName = undefined, updatedDeviceName = undefined, updatedAutoAccept = undefined) {
|
static updateRoomSecret(roomSecret, updatedRoomSecret = null, updatedDisplayName = null, updatedDeviceName = null, updatedAutoAccept = null) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const DBOpenRequest = window.indexedDB.open('pairdrop_store');
|
const DBOpenRequest = window.indexedDB.open('pairdrop_store');
|
||||||
DBOpenRequest.onsuccess = e => {
|
DBOpenRequest.onsuccess = e => {
|
||||||
@@ -278,16 +277,16 @@ class PersistentStorage {
|
|||||||
const objectStore = transaction.objectStore('room_secrets');
|
const objectStore = transaction.objectStore('room_secrets');
|
||||||
// Do not use `updatedRoomSecret ?? roomSecretEntry.entry.secret` to ensure compatibility with older browsers
|
// Do not use `updatedRoomSecret ?? roomSecretEntry.entry.secret` to ensure compatibility with older browsers
|
||||||
const updatedRoomSecretEntry = {
|
const updatedRoomSecretEntry = {
|
||||||
'secret': updatedRoomSecret !== undefined ? updatedRoomSecret : roomSecretEntry.entry.secret,
|
'secret': updatedRoomSecret !== null ? updatedRoomSecret : roomSecretEntry.entry.secret,
|
||||||
'display_name': updatedDisplayName !== undefined ? updatedDisplayName : roomSecretEntry.entry.display_name,
|
'display_name': updatedDisplayName !== null ? updatedDisplayName : roomSecretEntry.entry.display_name,
|
||||||
'device_name': updatedDeviceName !== undefined ? updatedDeviceName : roomSecretEntry.entry.device_name,
|
'device_name': updatedDeviceName !== null ? updatedDeviceName : roomSecretEntry.entry.device_name,
|
||||||
'auto_accept': updatedAutoAccept !== undefined ? updatedAutoAccept : roomSecretEntry.entry.auto_accept
|
'auto_accept': updatedAutoAccept !== null ? updatedAutoAccept : roomSecretEntry.entry.auto_accept
|
||||||
};
|
};
|
||||||
|
|
||||||
const objectStoreRequestUpdate = objectStore.put(updatedRoomSecretEntry, roomSecretEntry.key);
|
const objectStoreRequestUpdate = objectStore.put(updatedRoomSecretEntry, roomSecretEntry.key);
|
||||||
|
|
||||||
objectStoreRequestUpdate.onsuccess = e => {
|
objectStoreRequestUpdate.onsuccess = e => {
|
||||||
console.log(`Request successful. Updated room_secret: ${roomSecretEntry.key}`);
|
Logger.debug(`Request successful. Updated room_secret: ${roomSecretEntry.key}`);
|
||||||
resolve({
|
resolve({
|
||||||
"entry": updatedRoomSecretEntry,
|
"entry": updatedRoomSecretEntry,
|
||||||
"key": roomSecretEntry.key
|
"key": roomSecretEntry.key
|
||||||
|
|||||||
79
public/scripts/sw-file-digester.js
Normal file
79
public/scripts/sw-file-digester.js
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
self.addEventListener('message', async e => {
|
||||||
|
try {
|
||||||
|
switch (e.data.type) {
|
||||||
|
case "check-support":
|
||||||
|
await checkSupport();
|
||||||
|
break;
|
||||||
|
case "part":
|
||||||
|
await onPart(e.data.name, e.data.buffer, e.data.offset);
|
||||||
|
break;
|
||||||
|
case "get-file":
|
||||||
|
await onGetFile(e.data.name);
|
||||||
|
break;
|
||||||
|
case "delete-file":
|
||||||
|
await onDeleteFile(e.data.name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
self.postMessage({type: "error", error: e});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
async function checkSupport() {
|
||||||
|
try {
|
||||||
|
await getAccessHandle("test.txt");
|
||||||
|
self.postMessage({type: "support", supported: true});
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
self.postMessage({type: "support", supported: false});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getFileHandle(fileName) {
|
||||||
|
const root = await navigator.storage.getDirectory();
|
||||||
|
return await root.getFileHandle(fileName, {create: true});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getAccessHandle(fileName) {
|
||||||
|
const fileHandle = await getFileHandle(fileName);
|
||||||
|
|
||||||
|
// Create FileSystemSyncAccessHandle on the file.
|
||||||
|
return await fileHandle.createSyncAccessHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onPart(fileName, buffer, offset) {
|
||||||
|
const accessHandle = await getAccessHandle(fileName);
|
||||||
|
|
||||||
|
// Write the message to the end of the file.
|
||||||
|
let encodedMessage = new DataView(buffer);
|
||||||
|
accessHandle.write(encodedMessage, { at: offset });
|
||||||
|
|
||||||
|
// Always close FileSystemSyncAccessHandle if done.
|
||||||
|
accessHandle.close(); accessHandle.close();
|
||||||
|
|
||||||
|
self.postMessage({type: "part", part: encodedMessage});
|
||||||
|
encodedMessage = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onGetFile(fileName) {
|
||||||
|
const fileHandle = await getFileHandle(fileName);
|
||||||
|
let file = await fileHandle.getFile();
|
||||||
|
|
||||||
|
self.postMessage({type: "file", file: file});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onDeleteFile(fileName) {
|
||||||
|
const accessHandle = await getAccessHandle(fileName);
|
||||||
|
|
||||||
|
// Truncate the file to 0 bytes
|
||||||
|
accessHandle.truncate(0);
|
||||||
|
|
||||||
|
// Persist changes to disk.
|
||||||
|
accessHandle.flush();
|
||||||
|
|
||||||
|
// Always close FileSystemSyncAccessHandle if done.
|
||||||
|
accessHandle.close();
|
||||||
|
|
||||||
|
self.postMessage({type: "file-deleted"});
|
||||||
|
}
|
||||||
@@ -238,7 +238,7 @@ class FooterUI {
|
|||||||
|
|
||||||
if (!displayName) return;
|
if (!displayName) return;
|
||||||
|
|
||||||
console.log("Retrieved edited display name:", displayName)
|
Logger.debug("Retrieved edited display name:", displayName)
|
||||||
Events.fire('self-display-name-changed', displayName);
|
Events.fire('self-display-name-changed', displayName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,7 +275,7 @@ class FooterUI {
|
|||||||
Events.fire('notify-user', Localization.getTranslation("notifications.display-name-changed-permanently"));
|
Events.fire('notify-user', Localization.getTranslation("notifications.display-name-changed-permanently"));
|
||||||
})
|
})
|
||||||
.catch(_ => {
|
.catch(_ => {
|
||||||
console.log("This browser does not support IndexedDB. Use localStorage instead.");
|
Logger.debug("This browser does not support IndexedDB. Use localStorage instead.");
|
||||||
localStorage.setItem('edited_display_name', newDisplayName);
|
localStorage.setItem('edited_display_name', newDisplayName);
|
||||||
Events.fire('notify-user', Localization.getTranslation("notifications.display-name-changed-temporarily"));
|
Events.fire('notify-user', Localization.getTranslation("notifications.display-name-changed-temporarily"));
|
||||||
})
|
})
|
||||||
@@ -287,7 +287,7 @@ class FooterUI {
|
|||||||
else {
|
else {
|
||||||
PersistentStorage.delete('edited_display_name')
|
PersistentStorage.delete('edited_display_name')
|
||||||
.catch(_ => {
|
.catch(_ => {
|
||||||
console.log("This browser does not support IndexedDB. Use localStorage instead.")
|
Logger.debug("This browser does not support IndexedDB. Use localStorage instead.")
|
||||||
localStorage.removeItem('edited_display_name');
|
localStorage.removeItem('edited_display_name');
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
|
|||||||
1343
public/scripts/ui.js
1343
public/scripts/ui.js
File diff suppressed because it is too large
Load Diff
@@ -62,41 +62,67 @@ window.isMobile = window.iOS || window.android;
|
|||||||
|
|
||||||
|
|
||||||
// Helper functions
|
// Helper functions
|
||||||
|
|
||||||
|
const audioPlayer = (() => {
|
||||||
|
const blop = document.getElementById('blop');
|
||||||
|
blop.addEventListener('ended', _ => {
|
||||||
|
blop.muted = true
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
return {
|
||||||
|
playBlop() {
|
||||||
|
if (window.isMobile) return;
|
||||||
|
|
||||||
|
blop.muted = false;
|
||||||
|
blop.play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
const zipper = (() => {
|
const zipper = (() => {
|
||||||
|
|
||||||
let zipWriter;
|
|
||||||
return {
|
return {
|
||||||
createNewZipWriter() {
|
async getObjectUrlOfZipFile(files, onZipProgressCallback){
|
||||||
zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"), { bufferedWrite: true, level: 0 });
|
try {
|
||||||
},
|
const zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"));
|
||||||
addFile(file, options) {
|
|
||||||
return zipWriter.add(file.name, new zip.BlobReader(file), options);
|
let bytesProcessed = 0;
|
||||||
},
|
for (let i = 0; i < files.length; i++) {
|
||||||
async getBlobURL() {
|
await zipWriter.add(
|
||||||
if (zipWriter) {
|
files[i].name,
|
||||||
const blobURL = URL.createObjectURL(await zipWriter.close());
|
new zip.BlobReader(files[i]),
|
||||||
zipWriter = null;
|
{
|
||||||
return blobURL;
|
onprogress: (progress) => onZipProgressCallback(bytesProcessed + progress)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
bytesProcessed += files[i].size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return URL.createObjectURL(await zipWriter.close());
|
||||||
}
|
}
|
||||||
else {
|
catch (e) {
|
||||||
throw new Error("Zip file closed");
|
Logger.error(e);
|
||||||
}
|
return false;
|
||||||
},
|
|
||||||
async getZipFile(filename = "archive.zip") {
|
|
||||||
if (zipWriter) {
|
|
||||||
const file = new File([await zipWriter.close()], filename, {type: "application/zip"});
|
|
||||||
zipWriter = null;
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error("Zip file closed");
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async getEntries(file, options) {
|
async getEntries(file, options) {
|
||||||
return await (new zip.ZipReader(new zip.BlobReader(file))).getEntries(options);
|
try {
|
||||||
|
return await (new zip.ZipReader(new zip.BlobReader(file))).getEntries(options);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
Logger.error(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
async getData(entry, options) {
|
async getData(entry, options) {
|
||||||
return await entry.getData(new zip.BlobWriter(), options);
|
try {
|
||||||
|
return await entry.getData(new zip.BlobWriter(), options);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
Logger.error(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -521,7 +547,7 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual
|
|||||||
let dataUrl = canvas.toDataURL("image/jpeg", quality);
|
let dataUrl = canvas.toDataURL("image/jpeg", quality);
|
||||||
resolve(dataUrl);
|
resolve(dataUrl);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
Logger.error(e);
|
||||||
reject(new Error(`Could not create an image thumbnail from type ${file.type}`));
|
reject(new Error(`Could not create an image thumbnail from type ${file.type}`));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const cacheVersion = 'v1.10.7';
|
const cacheVersion = 'v1.10.6';
|
||||||
const cacheTitle = `pairdrop-cache-${cacheVersion}`;
|
const cacheTitle = `pairdrop-cache-${cacheVersion}`;
|
||||||
const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions
|
const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions
|
||||||
const relativePathsToCache = [
|
const relativePathsToCache = [
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
display: block;
|
display: block;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
resize: none;
|
resize: none;
|
||||||
|
line-height: 16px;
|
||||||
max-height: 350px;
|
max-height: 350px;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
word-wrap: anywhere;
|
word-wrap: anywhere;
|
||||||
@@ -104,6 +105,8 @@ x-peer {
|
|||||||
padding: 8px;
|
padding: 8px;
|
||||||
align-content: start;
|
align-content: start;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
transition: transform 150ms;
|
||||||
|
will-change: transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
x-peer input[type="file"] {
|
x-peer input[type="file"] {
|
||||||
@@ -121,8 +124,6 @@ x-peer label {
|
|||||||
x-peer x-icon {
|
x-peer x-icon {
|
||||||
--icon-size: 40px;
|
--icon-size: 40px;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
transition: transform 150ms;
|
|
||||||
will-change: transform;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
@@ -148,7 +149,7 @@ x-peer:not(.type-ip):not(.type-secret).type-public-id .icon-wrapper {
|
|||||||
.highlight-wrapper {
|
.highlight-wrapper {
|
||||||
align-self: center;
|
align-self: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin: 7px auto 0;
|
margin: 10px auto 0;
|
||||||
height: 6px;
|
height: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,14 +188,16 @@ x-peer:not(.type-public-id) .highlight-room-public-id {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
x-peer:not([status]):hover x-icon,
|
x-peer:is(:not([status]), [status$=-complete], [status=error]):hover,
|
||||||
x-peer:not([status]):focus x-icon {
|
x-peer:is(:not([status]), [status$=-complete], [status=error]):focus {
|
||||||
transform: scale(1.05);
|
transform: scale(1.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
x-peer[status] x-icon {
|
x-peer[status]:not([status$=-complete]) x-icon {
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
opacity: 0.8;
|
}
|
||||||
|
|
||||||
|
x-peer[status] {
|
||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,7 +240,7 @@ x-peer.ws-peer .highlight-wrapper {
|
|||||||
|
|
||||||
.status,
|
.status,
|
||||||
.device-name {
|
.device-name {
|
||||||
opacity: 0.7;
|
color: color-mix(in srgb, rgb(var(--text-color)) 30%, grey);
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,14 +249,22 @@ x-peer[status] .device-name {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
x-peer[status] {
|
x-peer[status]:not([status$=-complete]):not([status=error]) {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
x-peer x-icon {
|
x-peer {
|
||||||
animation: pop 600ms ease-out 1;
|
animation: pop 600ms ease-out 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
x-peer[status$=-complete] .status {
|
||||||
|
color: var(--primary-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
x-peer[status=error] .status {
|
||||||
|
color: var(--error-color);
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes pop {
|
@keyframes pop {
|
||||||
0% {
|
0% {
|
||||||
transform: scale(0.7);
|
transform: scale(0.7);
|
||||||
@@ -744,7 +755,6 @@ x-dialog .dialog-subheader {
|
|||||||
top: -8px;
|
top: -8px;
|
||||||
clip: rect(0px, 80px, 80px, 40px);
|
clip: rect(0px, 80px, 80px, 40px);
|
||||||
--progress: rotate(0deg);
|
--progress: rotate(0deg);
|
||||||
transition: transform 200ms;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.circle {
|
.circle {
|
||||||
@@ -758,6 +768,10 @@ x-dialog .dialog-subheader {
|
|||||||
transform: var(--progress);
|
transform: var(--progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.animate .circle {
|
||||||
|
transition: transform 200ms;
|
||||||
|
}
|
||||||
|
|
||||||
.over50 {
|
.over50 {
|
||||||
clip: rect(auto, auto, auto, auto);
|
clip: rect(auto, auto, auto, auto);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -626,15 +626,12 @@ x-dialog:not([show]) x-background {
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
z-index: -1;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
background-color: var(--accent-color);
|
background-color: var(--accent-color);
|
||||||
transition: opacity 300ms;
|
transition: opacity 300ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-button:before {
|
|
||||||
z-index: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn:not([disabled]):hover:before,
|
.btn:not([disabled]):hover:before,
|
||||||
.icon-button:hover:before {
|
.icon-button:hover:before {
|
||||||
opacity: 0.3;
|
opacity: 0.3;
|
||||||
@@ -924,6 +921,7 @@ x-peers:empty~x-instructions {
|
|||||||
body {
|
body {
|
||||||
/* Constant colors */
|
/* Constant colors */
|
||||||
--primary-color: #4285f4;
|
--primary-color: #4285f4;
|
||||||
|
--error-color: #ff6b6b;
|
||||||
--paired-device-color: #00a69c;
|
--paired-device-color: #00a69c;
|
||||||
--public-room-color: #ed9d01;
|
--public-room-color: #ed9d01;
|
||||||
--accent-color: var(--primary-color);
|
--accent-color: var(--primary-color);
|
||||||
|
|||||||
@@ -89,22 +89,12 @@ export default class PairDropWsServer {
|
|||||||
this._onLeavePublicRoom(sender);
|
this._onLeavePublicRoom(sender);
|
||||||
break;
|
break;
|
||||||
case 'signal':
|
case 'signal':
|
||||||
this._signalAndRelay(sender, message);
|
this._signalAndWsRelay(sender, message);
|
||||||
break;
|
break;
|
||||||
case 'request':
|
case 'ws-relay':
|
||||||
case 'header':
|
|
||||||
case 'partition':
|
|
||||||
case 'partition-received':
|
|
||||||
case 'progress':
|
|
||||||
case 'files-transfer-response':
|
|
||||||
case 'file-transfer-complete':
|
|
||||||
case 'message-transfer-complete':
|
|
||||||
case 'text':
|
|
||||||
case 'display-name-changed':
|
|
||||||
case 'ws-chunk':
|
|
||||||
// relay ws-fallback
|
// relay ws-fallback
|
||||||
if (this._conf.wsFallback) {
|
if (this._conf.wsFallback) {
|
||||||
this._signalAndRelay(sender, message);
|
this._signalAndWsRelay(sender, message);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
console.log("Websocket fallback is not activated on this instance.")
|
console.log("Websocket fallback is not activated on this instance.")
|
||||||
@@ -112,7 +102,7 @@ export default class PairDropWsServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_signalAndRelay(sender, message) {
|
_signalAndWsRelay(sender, message) {
|
||||||
const room = message.roomType === 'ip'
|
const room = message.roomType === 'ip'
|
||||||
? sender.ip
|
? sender.ip
|
||||||
: message.roomId;
|
: message.roomId;
|
||||||
|
|||||||
Reference in New Issue
Block a user