From b34b3f7b398778c8be8a86cc12bd77967bacd332 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sat, 17 Aug 2024 21:02:20 +0200 Subject: [PATCH 01/77] Fix and update apache config (fixes #312) --- docs/host-your-own.md | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/docs/host-your-own.md b/docs/host-your-own.md index 2c22a3d..f846db7 100644 --- a/docs/host-your-own.md +++ b/docs/host-your-own.md @@ -556,10 +556,6 @@ a2enmod proxy a2enmod proxy_http ``` -```bash -a2enmod proxy_wstunnel -``` -
Create a new configuration file under `/etc/apache2/sites-available` (on Debian) @@ -570,18 +566,10 @@ Create a new configuration file under `/etc/apache2/sites-available` (on Debian) ```apacheconf - ProxyPass / http://127.0.0.1:3000/ - RewriteEngine on - RewriteCond %{HTTP:Upgrade} websocket [NC] - RewriteCond %{HTTP:Connection} upgrade [NC] - RewriteRule ^/?(.*) "ws://127.0.0.1:3000/$1" [P,L] + ProxyPass / http://127.0.0.1:3000/ upgrade=websocket - ProxyPass / https://127.0.0.1:3000/ - RewriteEngine on - RewriteCond %{HTTP:Upgrade} websocket [NC] - RewriteCond %{HTTP:Connection} upgrade [NC] - RewriteRule ^/?(.*) "wws://127.0.0.1:3000/$1" [P,L] + ProxyPass / https://127.0.0.1:3000/ upgrade=websocket ``` @@ -589,14 +577,10 @@ Create a new configuration file under `/etc/apache2/sites-available` (on Debian) ```apacheconf - Redirect permanent / https://127.0.0.1:3000/ + Redirect permanent / https://127.0.0.1:3000/ - ProxyPass / https://127.0.0.1:3000/ - RewriteEngine on - RewriteCond %{HTTP:Upgrade} websocket [NC] - RewriteCond %{HTTP:Connection} upgrade [NC] - RewriteRule ^/?(.*) "wws://127.0.0.1:3000/$1" [P,L] + ProxyPass / http://127.0.0.1:3000/ upgrade=websocket ``` From ab67c5858daa90f9c5ddb190a9c7e2dac4cf379a Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 22 Aug 2024 14:29:10 +0200 Subject: [PATCH 02/77] FAQ: Update link whose certificate has expired --- docs/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq.md b/docs/faq.md index 90eed40..c685658 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -188,7 +188,7 @@ to learn more about STUN, TURN and WebRTC.
Yes. Your files are sent using WebRTC, encrypting them in transit. -Still you have to trust the PairDrop server. To ensure the connection is secure and there is no [MITM](https://wikiless.org/wiki/Man-in-the-middle_attack) there is a plan to make PairDrop +Still you have to trust the PairDrop server. To ensure the connection is secure and there is no [MITM](https://en.m.wikipedia.org/wiki/Man-in-the-middle_attack) there is a plan to make PairDrop zero trust by encrypting the signaling and implementing a verification process. See [issue #180](https://github.com/schlagmichdoch/PairDrop/issues/180) to keep updated.
From 40379acc6ceb1697c8c746927a7ff2c3ba08bbb8 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sat, 31 Aug 2024 00:55:18 +0200 Subject: [PATCH 03/77] Add rel="noreferrer" to created links in received messages --- public/scripts/ui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index c9bd365..873e612 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -2101,7 +2101,7 @@ class ReceiveTextDialog extends Dialog { let linkNodePlaceholder = `${p}${m}`; // add linkNodePlaceholder to text node and save a reference to linkNodes object - linkNodes[linkNodePlaceholder] = `${url}`; + linkNodes[linkNodePlaceholder] = `${url}`; return `${whitespaceOrSpecial}${linkNodePlaceholder}`; } // link is not valid -> do not replace From ce3d5698802b040eb9e55cf4a2abc06032e4672e Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Tue, 3 Sep 2024 23:13:43 +0200 Subject: [PATCH 04/77] Update README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d34786d..9fd70f1 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,18 @@

Local file sharing in your web browser. -
-
+
+ Inspired by Apple's AirDrop. +
+ Fork of Snapdrop. +
+
Report a bug
Request feature

+
## Features File sharing on your local network that works on all platforms. From 957ca39f9019cd83a53fd2db016ad9a503411eca Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 11 Nov 2024 18:39:04 +0100 Subject: [PATCH 05/77] Remove start_url and scope to prevent wrong URL when installing PWA (fixes #329) --- public/manifest.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/manifest.json b/public/manifest.json index 63a9bb9..5198d81 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -26,8 +26,6 @@ } ], "background_color": "#efefef", - "start_url": "/", - "scope": "/", "display": "minimal-ui", "theme_color": "#3367d6", "screenshots" : [ From 5cb15642c4d6a4bb28b0695f1b9edcab24e5890f Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 06/77] Translated using Weblate (Thai) Currently translated at 48.7% (81 of 166 strings) Translated using Weblate (Thai) Currently translated at 42.1% (70 of 166 strings) Added translation using Weblate (Thai) Co-authored-by: Ekaphong Tangtrakul Co-authored-by: Ekaphong Tangtrakul Co-authored-by: Hosted Weblate Co-authored-by: Nongpao Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/th/ Translation: PairDrop/pairdrop-spa --- public/lang/th.json | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 public/lang/th.json diff --git a/public/lang/th.json b/public/lang/th.json new file mode 100644 index 0000000..d80f9f9 --- /dev/null +++ b/public/lang/th.json @@ -0,0 +1,95 @@ +{ + "footer": { + "display-name_title": "แก้ไขชื่ออุปกรณ์ของคุณอย่างถาวร", + "on-this-network_title": "ทุกคนในเครือข่ายนี้สามารถค้นพบคุณได้", + "paired-devices_title": "คุณสามารถค้นพบอุปกรณ์ที่จับคู่ได้ตลอดเวลาโดยไม่ขึ้นอยู่กับเครือข่าย", + "known-as": "ชื่ออุปกรณ์ของคุณ :", + "discovery": "คุณสามารถถูกค้นพบได้:", + "public-room-devices": "Room ID: {{roomId}}", + "public-room-devices_title": "คุณสามารถค้นพบอุปกรณ์ในห้องสาธารณะแห่งนี้ได้โดยไม่ขึ้นอยู่กับเครือข่าย", + "paired-devices": "โดยอุปกรณ์ที่จับคู่แล้ว", + "on-this-network": "บน Network เดียวกัน", + "display-name_data-placeholder": "โปรดรอสักครู่…" + }, + "dialogs": { + "auto-accept-instructions-1": "เปิดใช้งาน", + "system-language": "ภาษาของระบบ", + "auto-accept-instructions-2": "เพื่อยอมรับไฟล์ทั้งหมดที่ส่งจากอุปกรณ์นั้นโดยอัตโนมัติ", + "copy": "คัดลอก", + "paired-device-removed": "อุปกรณ์ที่เคยจับคู่ถูกลบออกไปแล้ว", + "scan-qr-code": "หรือสแกน QR-code", + "cancel": "ยกเลิก", + "enter-room-id-from-another-device": "ป้อน Room ID เพื่อเข้าร่วม", + "pair": "จับคู่", + "hr-or": "หรือ", + "unpair": "ยกเลิกการจับคู่", + "auto-accept": "การยอมรับอัตโนมัติ", + "would-like-to-share": "อยากจะแบ่งปัน", + "accept": "ยอมรับ", + "decline": "ปฏิเสธ", + "message_placeholder": "ข้อความ", + "send-message-title": "ส่งข้อความ", + "send": "ส่ง", + "public-room-qr-code_title": "คลิกเพื่อคัดลอกลิงก์ไปยังห้องสาธารณะ", + "pair-devices-qr-code_title": "คลิกเพื่อคัดลอกลิงก์เพื่อจับคู่อุปกรณ์นี้", + "approve": "อนุมัติ", + "input-room-id-on-another-device": "ระบุ Room ID นี้บนอุปกรณ์อื่น", + "pair-devices-title": "การจับคู่อุปกรณ์", + "join": "เข้าร่วม", + "send-message-to": "ผู้รับ:", + "language-selector-title": "เลือกภาษา", + "close": "ปิด", + "leave": "ออกจากห้อง", + "temporary-public-room-title": "ห้องสาธารณะชั่วคราว", + "edit-paired-devices-title": "แก้ไขอุปกรณ์ที่จับคู่แล้ว", + "input-key-on-this-device": "ระบุ Key นี้บนอุปกรณ์อื่น", + "enter-key-from-another-device": "ระบุ Key ของอุปกรณ์อื่นที่นี่" + }, + "header": { + "theme-auto_title": "ปรับธีมให้เข้ากับระบบโดยอัตโนมัติ", + "about_title": "เกี่ยวกับ PairDrop", + "theme-light_title": "ใช้ธีมสว่างเสมอ", + "theme-dark_title": "ใช้ธีมมืดเสมอ", + "notification_title": "เปิดใช้งานการแจ้งเตือน", + "install_title": "ติดตั้ง PairDrop", + "edit-paired-devices_title": "แก้ไขอุปกรณ์ที่จับคู่", + "cancel-share-mode": "ยกเลิก", + "join-public-room_title": "เข้าร่วมห้องสาธารณะชั่วคราว", + "edit-share-mode": "แก้ไข", + "pair-device_title": "การจับคู่อุปกรณ์", + "language-selector_title": "เลือกภาษา" + }, + "notifications": { + "notifications-enabled": "เปิดใช้งานการแจ้งเตือนแล้ว", + "pairing-key-invalid": "Key ไม่ถูกต้อง", + "online": "คุณกลับมาออนไลน์แล้ว", + "display-name-changed-permanently": "ชื่อที่แสดงจะเปลี่ยนแปลงถาวร", + "display-name-changed-temporarily": "ชื่อที่แสดงมีการเปลี่ยนแปลงสำหรับเซสชันนี้เท่านั้น", + "display-name-random-again": "ชื่อที่แสดงจะถูกสร้างขึ้นแบบสุ่มอีกครั้ง", + "pairing-success": "จับคู่อุปกรณ์เรียบร้อยแล้ว", + "offline": "คุณออฟไลน์อยู่" + }, + "about": { + "bluesky_title": "ติดตามเราได้ที่ BlueSky", + "claim": "วิธีที่ง่ายที่สุดในการถ่ายโอนไฟล์ระหว่างอุปกรณ์", + "github_title": "PairDrop บน GitHub", + "buy-me-a-coffee_title": "ซื้อกาแฟให้ฉันหน่อย! (บริจาค)", + "tweet_title": "ทวีตเกี่ยวกับ PairDrop", + "mastodon_title": "เขียนเกี่ยวกับ PairDrop บน Mastodon", + "custom_title": "ติดตามเรา", + "privacypolicy_title": "เปิดนโยบายความเป็นส่วนตัวของเรา", + "faq_title": "คำถามที่พบบ่อย (FAQ)" + }, + "instructions": { + "no-peers-subtitle": "จับคู่อุปกรณ์ หรือ เข้าห้องสาธารณะ เพื่อ ค้นหาอุปกรณ์ ภายนอก เครือข่าย", + "x-instructions_mobile": "แตะเพื่อส่งข้อความ หรือ กดค้างไว้เพื่อส่งข้อความ", + "x-instructions_data-drop-peer": "ปล่อยเพื่อส่งให้อุปกรณ์", + "x-instructions-share-mode_desktop": "กดเพื่อส่ง{{descriptor}}", + "x-instructions-share-mode_mobile": "แตะเพื่อส่ง{{descriptor}}", + "activate-share-mode-and-other-file": "และอีก 1 ไฟล์", + "activate-share-mode-shared-files-plural": "{{count}}ไฟล์ที่แชร์", + "activate-share-mode-and-other-files-plural": "และ{{count}}ไฟล์ อื่นๆ", + "no-peers-title": "เปิด PairDrop บนอุปกรณ์อื่นเพื่อส่งไฟล์", + "x-instructions_desktop": "กดเพื่อส่งไฟล์ หรือ คลิ้กขวาเพื่อส่งไฟล์" + } +} From b9f436b940f417a60c3d30dd9a1c105eac4d72e8 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 07/77] Translated using Weblate (Tamil) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (166 of 166 strings) Added translation using Weblate (Tamil) Co-authored-by: Hosted Weblate Co-authored-by: தமிழ்நேரம் Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ta/ Translation: PairDrop/pairdrop-spa --- public/lang/ta.json | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 public/lang/ta.json diff --git a/public/lang/ta.json b/public/lang/ta.json new file mode 100644 index 0000000..5f5f7d8 --- /dev/null +++ b/public/lang/ta.json @@ -0,0 +1,184 @@ +{ + "header": { + "language-selector_title": "மொழியை அமைக்கவும்", + "about_aria-label": "இணை ட்ராப் பற்றி திறந்திருக்கும்", + "theme-auto_title": "தானாகவே கருப்பொருள் கணினிக்கு மாற்றியமைக்கவும்", + "theme-light_title": "எப்போதும் ஒளி கருப்பொருளைப் பயன்படுத்துங்கள்", + "theme-dark_title": "எப்போதும் இருண்ட கருப்பொருளைப் பயன்படுத்துங்கள்", + "notification_title": "அறிவிப்புகளை இயக்கவும்", + "install_title": "இணை டிராப்பை நிறுவவும்", + "pair-device_title": "உங்கள் சாதனங்களை நிரந்தரமாக இணைக்கவும்", + "edit-paired-devices_title": "இணை சாதனங்களைத் திருத்தவும்", + "join-public-room_title": "தற்காலிகமாக பொது அறையில் சேரவும்", + "cancel-share-mode": "ரத்துசெய்", + "about_title": "இணை டிராப் பற்றி", + "edit-share-mode": "தொகு", + "expand_title": "தலைப்பு பொத்தான் வரிசையை விரிவாக்குங்கள்" + }, + "instructions": { + "no-peers_data-drop-bg": "பெறுநரைத் தேர்ந்தெடுக்க வெளியீடு", + "no-peers-title": "கோப்புகளை அனுப்ப பிற சாதனங்களில் இணை டிராப்பைத் திறக்கவும்", + "no-peers-subtitle": "சாதனங்களை இணை செய்யுங்கள் அல்லது பிற நெட்வொர்க்குகளில் கண்டறிய ஒரு பொது அறையை உள்ளிடவும்", + "x-instructions_desktop": "கோப்புகளை அனுப்ப சொடுக்கு செய்யவும் அல்லது செய்தியை அனுப்ப வலது சொடுக்கு செய்யவும்", + "x-instructions_mobile": "கோப்புகளை அனுப்ப தட்டவும் அல்லது செய்தியை அனுப்ப நீண்ட தட்டவும்", + "x-instructions_data-drop-peer": "பியருக்கு அனுப்ப வெளியீடு", + "x-instructions_data-drop-bg": "பெறுநரைத் தேர்ந்தெடுக்க வெளியீடு", + "x-instructions-share-mode_desktop": "{{descriptor}} ஐ அனுப்ப சொடுக்கு செய்க", + "activate-share-mode-shared-files-plural": "{{count}} பகிரப்பட்ட கோப்புகள்", + "x-instructions-share-mode_mobile": "{{descriptor}} அனுப்ப தட்டவும்", + "activate-share-mode-shared-file": "பகிரப்பட்ட கோப்பு", + "activate-share-mode-base": "அனுப்ப மற்ற சாதனங்களில் இணைக்கவும்", + "activate-share-mode-and-other-file": "மற்றும் 1 பிற கோப்பு", + "activate-share-mode-and-other-files-plural": "மற்றும் {{count}} பிற கோப்புகள்", + "activate-share-mode-shared-text": "பகிரப்பட்ட உரை", + "webrtc-requirement": "இந்த இணை டிராப் நிகழ்வைப் பயன்படுத்த, WEBRTC இயக்கப்பட்டிருக்க வேண்டும்!" + }, + "footer": { + "display-name_data-placeholder": "ஏற்றுகிறது…", + "display-name_title": "உங்கள் சாதனத்தின் பெயரை நிரந்தரமாக திருத்தவும்", + "discovery": "நீங்கள் கண்டுபிடிக்கலாம்:", + "on-this-network": "இந்த நெட்வொர்க்கில்", + "on-this-network_title": "இந்த நெட்வொர்க்கில் உள்ள அனைவராலும் நீங்கள் கண்டுபிடிக்க முடியும்.", + "paired-devices": "இணை சாதனங்கள் மூலம்", + "paired-devices_title": "நெட்வொர்க்கிலிருந்து சுயாதீனமாக எல்லா நேரங்களிலும் இணை சாதனங்களால் நீங்கள் கண்டுபிடிக்கலாம்.", + "public-room-devices": "அறையில் {{roomId}}", + "public-room-devices_title": "நெட்வொர்க்கிலிருந்து சுயாதீனமான இந்த பொது அறையில் உள்ள சாதனங்களால் நீங்கள் கண்டுபிடிக்கலாம்.", + "traffic": "போக்குவரத்து", + "routed": "சேவையகம் வழியாக திசைதிருப்பப்பட்டது", + "webrtc": "WEBRTC கிடைக்கவில்லை என்றால்.", + "known-as": "நீங்கள் அறியப்படுகிறீர்கள்:" + }, + "dialogs": { + "pair-devices-title": "இணை சாதனங்கள் நிரந்தரமாக", + "input-key-on-this-device": "இந்த விசையை மற்றொரு சாதனத்தில் உள்ளிடவும்", + "scan-qr-code": "அல்லது QR-குறியீட்டை ச்கேன் செய்யுங்கள்.", + "enter-key-from-another-device": "மற்றொரு சாதனத்திலிருந்து விசையை இங்கே உள்ளிடவும்.", + "temporary-public-room-title": "தற்காலிக பொது அறை", + "input-room-id-on-another-device": "இந்த அறை ஐடியை மற்றொரு சாதனத்தில் உள்ளிடவும்", + "enter-room-id-from-another-device": "அறையில் சேர மற்றொரு சாதனத்திலிருந்து அறை ஐடியை உள்ளிடவும்.", + "hr-or": "அல்லது", + "pair": "பேரிக்காய்", + "cancel": "ரத்துசெய்", + "edit-paired-devices-title": "இணை சாதனங்களைத் திருத்தவும்", + "unpair": "அவிழ்த்து விடுங்கள்", + "paired-device-removed": "இணை சாதனம் அகற்றப்பட்டது.", + "paired-devices-wrapper_data-empty": "இணை சாதனங்கள் இல்லை.", + "auto-accept-instructions-1": "செயல்படுத்து", + "auto-accept": "தானாக ஏற்றுக்கொள்ளுங்கள்", + "auto-accept-instructions-2": "அந்த சாதனத்திலிருந்து அனுப்பப்பட்ட அனைத்து கோப்புகளையும் தானாக ஏற்றுக்கொள்ள.", + "close": "மூடு", + "join": "சேர", + "leave": "விடுப்பு", + "would-like-to-share": "பகிர்ந்து கொள்ள விரும்புகிறேன்", + "accept": "ஏற்றுக்கொள்", + "decline": "வீழ்ச்சி", + "has-sent": "அனுப்பியுள்ளது:", + "share": "பங்கு", + "download": "பதிவிறக்கம்", + "send-message-title": "செய்தி அனுப்பவும்", + "send-message-to": "இதற்கு:", + "message_title": "அனுப்ப செய்தியைச் செருகவும்", + "message_placeholder": "உரை", + "send": "அனுப்பு", + "receive-text-title": "செய்தி பெறப்பட்டது", + "copy": "நகலெடு", + "base64-title-files": "கோப்புகளைப் பகிரவும்", + "base64-title-text": "உரையைப் பகிரவும்", + "base64-processing": "செயலாக்கம்…", + "base64-tap-to-paste": "{{type}} பகிர இங்கே தட்டவும்", + "base64-paste-to-send": "{{type}} ஐப் பகிர இங்கே கிளிப்போர்டை ஒட்டவும்", + "base64-text": "உரை", + "base64-files": "கோப்புகள்", + "file-other-description-image": "மற்றும் 1 பிற படம்", + "file-other-description-file": "மற்றும் 1 பிற கோப்பு", + "file-other-description-image-plural": "மற்றும் {{count}} பிற படங்கள்", + "file-other-description-file-plural": "மற்றும் {{count}} பிற கோப்புகள்", + "title-image": "படம்", + "title-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": "உரையைப் பகிரும்போது எப்போதும் இந்த உரையாடலைக் காட்டுங்கள்", + "close-toast_title": "அறிவிப்பை மூடு" + }, + "about": { + "close-about_aria-label": "இணை ட்ராப் பற்றி மூடு", + "claim": "சாதனங்களில் கோப்புகளை மாற்ற எளிதான வழி", + "github_title": "கிட்அப்பில் இணை டிராப்", + "buy-me-a-coffee_title": "எனக்கு ஒரு காபி வாங்க!", + "tweet_title": "இணை ட்ராப் பற்றி ட்வீட் செய்யுங்கள்", + "mastodon_title": "மாச்டோடனில் இணை ட்ராப் பற்றி எழுதுங்கள்", + "bluesky_title": "ப்ளூச்கியில் எங்களைப் பின்தொடரவும்", + "custom_title": "எங்களைப் பின்தொடரவும்", + "privacypolicy_title": "எங்கள் தனியுரிமைக் கொள்கையைத் திறக்கவும்", + "faq_title": "அடிக்கடி கேட்கப்படும் கேள்விகள்" + }, + "notifications": { + "display-name-changed-permanently": "காட்சி பெயர் நிரந்தரமாக மாற்றப்பட்டுள்ளது", + "display-name-changed-temporarily": "இந்த அமர்வுக்கு மட்டுமே காட்சி பெயர் மாற்றப்பட்டுள்ளது", + "display-name-random-again": "காட்சி பெயர் தோராயமாக மீண்டும் உருவாக்கப்படுகிறது", + "download-successful": "{{descriptor}} பதிவிறக்கம் செய்யப்பட்டது", + "pairing-tabs-error": "இரண்டு வலை உலாவி தாவல்களை இணைப்பது சாத்தியமற்றது", + "pairing-success": "சாதனங்கள் இணை", + "pairing-cleared": "அனைத்து சாதனங்களும் இணைக்கப்படவில்லை", + "public-room-id-invalid": "தவறான அறை ஐடி", + "public-room-left": "இடது பொது அறை {{publicRoomId}}}", + "text-content-incorrect": "உரை உள்ளடக்கம் தவறானது", + "file-content-incorrect": "கோப்பு உள்ளடக்கம் தவறானது", + "clipboard-content-incorrect": "இடைநிலைப்பலகை உள்ளடக்கம் தவறானது", + "notifications-enabled": "அறிவிப்புகள் இயக்கப்பட்டன", + "notifications-permissions-error": "பயனர் இசைவு வரியை பல முறை நிராகரித்ததால் அறிவிப்புகள் இசைவு தடுக்கப்பட்டுள்ளது. முகவரி பட்டியின் அடுத்த பூட்டு ஐகானைக் சொடுக்கு செய்வதன் மூலம் அணுகக்கூடிய பக்கத் தகவலில் இதை மீட்டமைக்க முடியும்.", + "link-received": "இணைப்பு {{name}} - திறக்க சொடுக்கு செய்க", + "message-received": "{{name} by ஆல் பெறப்பட்ட செய்தி - நகலெடுக்க சொடுக்கு செய்க", + "request-title": "{{name}} {{count}} {{descriptor}} ஐ மாற்ற விரும்புகிறது", + "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": "ஐஇமு க்கு கோப்புகளை அனுப்புவது ஒரே நேரத்தில் 200 எம்பி வரை மட்டுமே சாத்தியமாகும்", + "unfinished-transfers-warning": "முடிக்கப்படாத இடமாற்றங்கள் உள்ளன. நீங்கள் நிச்சயமாக இணை டிராப்பை மூட விரும்புகிறீர்களா?", + "selected-peer-left": "தேர்ந்தெடுக்கப்பட்ட பியர் இடது", + "pairing-not-persistent": "இணை சாதனங்கள் தொடர்ந்து இல்லை", + "pairing-key-invalid": "தவறான விசை", + "pairing-key-invalidated": "விசை {{key}} செல்லாதது", + "copied-to-clipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது", + "pair-url-copied-to-clipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்ட இந்த சாதனத்தை இணைக்க இணைப்பு", + "room-url-copied-to-clipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்ட பொது அறைக்கான இணைப்பு", + "copied-to-clipboard-error": "நகலெடுப்பது சாத்தியமில்லை. கைமுறையாக நகலெடுக்கவும்.", + "click-to-download": "பதிவிறக்க சொடுக்கு செய்க", + "message-transfer-completed": "செய்தி பரிமாற்றம் முடிந்தது", + "rate-limit-join-key": "வீத வரம்பு எட்டப்பட்டது. 10 வினாடிகள் காத்திருந்து மீண்டும் முயற்சிக்கவும்." + }, + "document-titles": { + "file-received": "கோப்பு பெறப்பட்டது", + "file-received-plural": "{{count}} கோப்புகள் பெறப்பட்டன", + "image-transfer-requested": "பட பரிமாற்றம் கோரப்பட்டது", + "file-transfer-requested": "கோப்பு பரிமாற்றம் கோரப்பட்டது", + "message-received": "செய்தி பெறப்பட்டது", + "message-received-plural": "{{count}} செய்திகள் பெறப்பட்டன" + }, + "peer-ui": { + "click-to-send-share-mode": "{{descriptor}} ஐ அனுப்ப சொடுக்கு செய்க", + "click-to-send": "கோப்புகளை அனுப்ப சொடுக்கு செய்யவும் அல்லது செய்தியை அனுப்ப வலது சொடுக்கு செய்யவும்", + "connection-hash": "இறுதி முதல் இறுதி குறியாக்கத்தின் பாதுகாப்பை சரிபார்க்க, இந்த பாதுகாப்பு எண்ணை இரு சாதனங்களிலும் ஒப்பிடுக", + "waiting": "காத்திருக்கிறது…", + "processing": "செயலாக்கம்…", + "transferring": "இடமாற்றம்…", + "preparing": "தயாரித்தல்…" + } +} From b73d7637a1dc0079424e78577970d62455835042 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 08/77] Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Arcoon <251958034@qq.com> Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hant_HK/ Translation: PairDrop/pairdrop-spa --- public/lang/zh-HK.json | 185 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 184 insertions(+), 1 deletion(-) diff --git a/public/lang/zh-HK.json b/public/lang/zh-HK.json index 0967ef4..e5a0b67 100644 --- a/public/lang/zh-HK.json +++ b/public/lang/zh-HK.json @@ -1 +1,184 @@ -{} +{ + "header": { + "expand_title": "展開標題按鈕列", + "about_title": "關於 PairDrop", + "language-selector_title": "設定語言", + "about_aria-label": "開啟 關於 PairDrop", + "theme-auto_title": "主題跟隨系統設定", + "theme-light_title": "固定使用明亮主題", + "theme-dark_title": "固定使用深色主題", + "notification_title": "啟用通知", + "install_title": "安裝 PairDrop", + "pair-device_title": "永久配對您的裝置", + "edit-paired-devices_title": "管理已配對裝置", + "join-public-room_title": "暫時加入公共房間", + "cancel-share-mode": "完成", + "edit-share-mode": "編輯" + }, + "instructions": { + "no-peers_data-drop-bg": "放開以選擇接收者", + "no-peers-title": "喺其他裝置開啟 PairDrop 嚟傳送檔案", + "no-peers-subtitle": "配對新裝置 或 加入公共房間 以便喺其他網絡顯示", + "x-instructions_desktop": "按一下傳送檔案 或 右鍵傳送訊息", + "x-instructions_mobile": "點擊傳送檔案 或 長按傳送訊息", + "activate-share-mode-shared-file": "已分享檔案", + "activate-share-mode-shared-files-plural": "{{count}} 個已分享檔案", + "x-instructions_data-drop-peer": "放開即可傳送至呢部裝置", + "x-instructions_data-drop-bg": "放開以選擇接收者", + "x-instructions-share-mode_desktop": "單擊傳送 {{descriptor}}", + "x-instructions-share-mode_mobile": "點擊傳送 {{descriptor}}", + "activate-share-mode-base": "喺其他裝置開啟 PairDrop 嚟傳送", + "activate-share-mode-and-other-file": "及另外 1 個檔案", + "activate-share-mode-and-other-files-plural": "及另外 {{count}} 個檔案", + "activate-share-mode-shared-text": "分享文字", + "webrtc-requirement": "使用此 PairDrop 實例需要啟用 WebRTC!" + }, + "footer": { + "display-name_title": "修改預設裝置名稱", + "discovery": "你可被發現於:", + "on-this-network": "喺呢個網絡", + "on-this-network_title": "你可以被同一個網絡嘅所有人發現。", + "paired-devices": "已配對裝置", + "paired-devices_title": "你隨時可以被已配對嘅裝置發現,無需依賴網絡。", + "public-room-devices": "喺房間 {{roomId}} 內", + "public-room-devices_title": "你可以被呢個跨網絡公共房間內嘅裝置發現。", + "traffic": "流量將會", + "routed": "經伺服器中轉", + "webrtc": "若 WebRTC 無法使用。", + "known-as": "你嘅名稱係:", + "display-name_data-placeholder": "載入中…" + }, + "dialogs": { + "pair-devices-title": "配對新裝置(常駐)", + "input-key-on-this-device": "喺另一部裝置輸入呢組數字", + "scan-qr-code": "或者 掃描二維碼。", + "temporary-public-room-title": "臨時公共房間", + "input-room-id-on-another-device": "喺另一部裝置輸入呢個房間號碼", + "enter-room-id-from-another-device": "喺另一部裝置輸入房間號碼加入。", + "hr-or": "或", + "pair": "配對", + "cancel": "取消", + "edit-paired-devices-title": "管理已配對裝置", + "unpair": "解除配對", + "paired-device-removed": "已移除配對裝置。", + "paired-devices-wrapper_data-empty": "未有已配對裝置。", + "auto-accept-instructions-1": "啟用", + "auto-accept": "自動接收", + "auto-accept-instructions-2": "即可自動接收該裝置傳送嘅所有檔案,無需確認。", + "decline": "拒絕", + "receive-text-title": "收到訊息", + "base64-title-files": "分享檔案", + "base64-title-text": "分享文字", + "base64-processing": "處理中…", + "base64-tap-to-paste": "點擊此處分享 {{type}}", + "base64-paste-to-send": "將剪貼簿內容貼上嚟分享 {{type}}", + "base64-text": "訊息", + "base64-files": "檔案", + "file-other-description-image": "及另外 1 張圖片", + "file-other-description-file": "及另外 1 個檔案", + "file-other-description-image-plural": "及另外 {{count}} 張圖片", + "file-other-description-file-plural": "及另外 {{count}} 個檔案", + "title-image": "圖片", + "title-file": "檔案", + "title-image-plural": "圖片", + "title-file-plural": "檔案", + "receive-title": "收到 {{descriptor}}", + "download-again": "再次儲存", + "language-selector-title": "設定語言", + "pair-devices-qr-code_title": "按一下複製裝置配對連結", + "approve": "批准", + "share-text-title": "分享文字訊息", + "share-text-subtitle": "傳送前編輯訊息:", + "share-text-checkbox": "分享文字時永遠顯示此視窗", + "system-language": "跟隨系統語言", + "public-room-qr-code_title": "按一下複製公共房間連結", + "close-toast_title": "關閉通知", + "enter-key-from-another-device": "喺度輸入另一部裝置嘅配對碼。", + "close": "關閉", + "join": "加入", + "leave": "離開", + "would-like-to-share": "想分享", + "accept": "接收", + "has-sent": "傳送咗:", + "share": "分享", + "download": "儲存", + "send-message-title": "傳送訊息", + "send-message-to": "傳送至:", + "message_title": "輸入要傳送嘅訊息", + "message_placeholder": "文字", + "send": "傳送", + "copy": "複製" + }, + "about": { + "close-about_aria-label": "關閉 關於 PairDrop", + "claim": "最簡單嘅跨裝置傳輸方案", + "github_title": "PairDrop 開源於 GitHub", + "buy-me-a-coffee_title": "請我飲杯咖啡!", + "tweet_title": "關於 PairDrop 嘅推文", + "mastodon_title": "喺 Mastodon 推廣 PairDrop", + "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-tabs-error": "無法配對兩個瀏覽器分頁", + "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": "檔案內容不正確", + "clipboard-content-incorrect": "剪貼簿內容不正確", + "notifications-enabled": "通知已啟用", + "notifications-permissions-error": "因多次拒絕權限,通知功能已被封鎖。可點擊網址列嘅鎖頭圖示重置權限。", + "link-received": "收到來自 {{name}} 嘅連結 - 點擊開啟", + "click-to-download": "點擊儲存", + "message-received": "收到來自 {{name}} 嘅訊息 - 點擊複製", + "request-title": "{{name}} 想傳送 {{count}} 個 {{descriptor}}", + "click-to-show": "點擊顯示", + "copied-text": "已複製到剪貼簿", + "copied-text-error": "寫入剪貼簿失敗,請手動複製!", + "selected-peer-left": "已選擇嘅接收者離開", + "unfinished-transfers-warning": "仍有未完成傳輸,確定要關閉 PairDrop?", + "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": "訊息傳輸已完成", + "rate-limit-join-key": "已達連線上限,請 10 秒後再試。" + }, + "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": "點擊傳送檔案 或 右鍵傳送訊息", + "connection-hash": "要驗證端到端加密安全性,請比較兩部裝置嘅安全編號", + "preparing": "準備中…", + "waiting": "請稍候…", + "processing": "處理中…", + "transferring": "傳輸中…" + } +} From 4a83ad57ddbe93cebeee50de8f0effcea72ae078 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 09/77] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: Willian John Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/pt_BR/ Translation: PairDrop/pairdrop-spa --- public/lang/pt-BR.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/public/lang/pt-BR.json b/public/lang/pt-BR.json index fa1b50d..6bf17f1 100644 --- a/public/lang/pt-BR.json +++ b/public/lang/pt-BR.json @@ -12,7 +12,8 @@ "edit-paired-devices_title": "Editar dispositivos emparelhados", "join-public-room_title": "Entrar em uma sala pública temporariamente", "cancel-share-mode": "Cancelar", - "edit-share-mode": "Editar" + "edit-share-mode": "Editar", + "expand_title": "Expandir linha de botões de cabeçalho" }, "instructions": { "no-peers_data-drop-bg": "Solte para selecionar o destinatário", @@ -114,7 +115,11 @@ "github_title": "PairDrop no GitHub", "buy-me-a-coffee_title": "Me compre um café!", "tweet_title": "Tweet sobre o PairDrop", - "faq_title": "Perguntas frequentes" + "faq_title": "Perguntas frequentes", + "mastodon_title": "Escrever sobre PairDrop no Mastodon", + "bluesky_title": "Siga-nos no BlueSky", + "custom_title": "Siga-nos", + "privacypolicy_title": "Abra nossa política de privacidade" }, "notifications": { "display-name-changed-permanently": "O nome de exibição é alterado permanentemente", From 7931f64148048838fc657cfa4ed4510d1f93c744 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 10/77] Translated using Weblate (German) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: schlagmichdoch Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/ Translation: PairDrop/pairdrop-spa --- public/lang/de.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/public/lang/de.json b/public/lang/de.json index 30239b8..98d60a9 100644 --- a/public/lang/de.json +++ b/public/lang/de.json @@ -153,17 +153,17 @@ "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 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-share-mode_desktop": "Klicke zum Senden {{descriptor}}", + "x-instructions-share-mode_mobile": "Tippe zum Senden {{descriptor}}", "x-instructions_data-drop-peer": "Hier ablegen, um an Peer zu senden", "x-instructions_data-drop-bg": "Loslassen um Empfänger auszuwählen", "x-instructions_mobile": "Tippe, um Dateien zu senden oder tippe lange, um Nachrichten zu senden", - "activate-share-mode-base": "Öffne PairDrop auf anderen Geräten zum Senden von", + "activate-share-mode-base": "Öffne PairDrop auf anderen Geräten zum Senden", "activate-share-mode-and-other-files-plural": "und {{count}} anderen Dateien", - "activate-share-mode-shared-text": "freigegebenem Text", + "activate-share-mode-shared-text": "des geteilten Texts", "webrtc-requirement": "Um diese PairDrop Instanz zu verwenden muss WebRTC aktiviert sein!", - "activate-share-mode-shared-files-plural": "{{count}} geteilte Dateien", - "activate-share-mode-shared-file": "geteilte Datei", + "activate-share-mode-shared-files-plural": "der {{count}} geteilten Dateien", + "activate-share-mode-shared-file": "der geteilten Datei", "activate-share-mode-and-other-file": "und 1 andere Datei" }, "document-titles": { From f9a9287893157d9821ee7c335ad8156cf2905a98 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 11/77] Translated using Weblate (Basque) Currently translated at 100.0% (166 of 166 strings) Added translation using Weblate (Basque) Co-authored-by: Hosted Weblate Co-authored-by: xabirequejo Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/eu/ Translation: PairDrop/pairdrop-spa --- public/lang/eu.json | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 public/lang/eu.json diff --git a/public/lang/eu.json b/public/lang/eu.json new file mode 100644 index 0000000..2e528b3 --- /dev/null +++ b/public/lang/eu.json @@ -0,0 +1,184 @@ +{ + "header": { + "about_title": "PairDropi buruz", + "about_aria-label": "Ireki PairDropi buruz", + "cancel-share-mode": "Utzi", + "edit-share-mode": "Editatu", + "edit-paired-devices_title": "Editatu lotutako gailuak", + "theme-light_title": "Erabili beti gai argia", + "theme-dark_title": "Erabili beti gai iluna", + "notification_title": "Gaitu jakinarazpenak", + "install_title": "Instalatu PairDrop", + "pair-device_title": "Lotu zure gailuak betiko", + "expand_title": "Hedatu goiburuko botoien errenkada", + "language-selector_title": "Ezarri hizkuntza", + "theme-auto_title": "Aldatu gaia sistemak darabilenera", + "join-public-room_title": "Batu gela publikoa behin-behinean" + }, + "instructions": { + "activate-share-mode-and-other-files-plural": "eta beste {{count}} fitxategi", + "no-peers-subtitle": "Lotu gailuak edo sartu gela publiko batean beste sareetan aurki zaitzaten", + "no-peers_data-drop-bg": "Jaregin hartzaileak hautatzeko", + "x-instructions_mobile": "Egin tap fitxategiak bidaltzeko edo luze sakatu mezua bidaltzeko", + "x-instructions_desktop": "Klikatu fitxategiak bidaltzeko edo klikatu eskumako botoiarekin mezu bat bidaltzeko", + "activate-share-mode-base": "Ireki PairDrop beste gailuetan bidaltzeko", + "activate-share-mode-shared-text": "partekatutako testua", + "x-instructions-share-mode_desktop": "Klikatu {{descriptor}} bidaltzeko", + "x-instructions-share-mode_mobile": "Egin tap {{descriptor}} bidaltzeko", + "activate-share-mode-shared-file": "partekatutako fitxategia", + "activate-share-mode-shared-files-plural": "partekatutako {{count}} fitxategi", + "webrtc-requirement": "PairDrop instantzia hau erabiltzeko, WebRTC gaitu behar da!", + "no-peers-title": "Ireki PairDrop beste gailuetan fitxategiak bidaltzeko", + "activate-share-mode-and-other-file": "eta beste fitxategi 1", + "x-instructions_data-drop-peer": "Jaregin kideari bidaltzeko", + "x-instructions_data-drop-bg": "Jaregin hartzailea hautatzeko" + }, + "notifications": { + "online-requirement-pairing": "Linean egon behar zara gailuak lotzeko", + "copied-text-error": "Arbelean idazteak huts egin du. Egizu eskuz!", + "connecting": "Konektatzen…", + "display-name-changed-temporarily": "Pantaila-izena saio honetarako bakarrik aldatuko da", + "display-name-random-again": "Pantaila-izena ausaz sortuko da berriro", + "pairing-tabs-error": "Ezin dira nabigatzaileko bi fitxa lotu", + "pairing-success": "Gailuak lotu dira", + "pairing-not-persistent": "Gailuak ez dira behin-betiko lotu", + "pairing-key-invalid": "Gako okerra", + "public-room-id-invalid": "Gelaren IDa ez da baliozkoa", + "pair-url-copied-to-clipboard": "Gailu hau lotzeko esteka arbelera kopiatu da", + "room-url-copied-to-clipboard": "Gela publiko honetara sartzeko esteka arbelera kopiatu da", + "copied-to-clipboard-error": "Ezin da kopiatu. Egizu eskuz.", + "text-content-incorrect": "Testuaren edukia okerra da", + "file-content-incorrect": "Fitxategiaren edukia okerra da", + "clipboard-content-incorrect": "Arbeleko edukia okerra da", + "link-received": "{{name}}(e)k bidalitako esteka. Klikatu irekitzeko", + "notifications-permissions-error": "Jakinarazpenen baimena blokeatu egin da, erabiltzaileak behin baino gehiagotan ukatu baitu baimen-eskaera. Orriaren informazioan berrezar daiteke. Horretarako, URL barraren ondoko zerrapoaren ikonoan klik egin behar da.", + "message-received": "{{name}}(e)k bidalitako mezua. Klikatu kopiatzeko", + "click-to-download": "Klikatu deskargatzeko", + "request-title": "{{name}}(e)k {{count}} {{descriptor}} bidali nahi dizkizu", + "click-to-show": "Klikatu erakusteko", + "ios-memory-limit": "iOSek ez ditu 200 MB edo gehiagoko fitxategiak onartzen aldi berean", + "message-transfer-completed": "Mezuaren trukatzeak amaitu du", + "rate-limit-join-key": "Muga gainditu da. Itxaron 10 segundo eta saiatu berriro.", + "offline": "Lineaz kanpo zaude", + "files-incorrect": "Fitxategiak okerrak dira", + "display-name-changed-permanently": "Pantaila-izena betiko aldatuko da", + "connected": "Konektatuta", + "file-transfer-completed": "Fitxategien trukatzeak amaitu du", + "online-requirement-public-room": "Linean egon behar zara gela publiko bat sortzeko", + "notifications-enabled": "Jakinarazpenak gaitu dira", + "download-successful": "{{descriptor}} deskargatu da", + "pairing-cleared": "Gailu guztiak askatu dira", + "public-room-left": "{{publicRoomId}} gela publikotik irten zara", + "copied-to-clipboard": "Arbelera kopiatuta", + "copied-text": "Testua arbelera kopiatu da", + "online": "Berriro zaude linean", + "unfinished-transfers-warning": "Amaitu gabeko trukatzeak daude. Ziur PairDrop itxi nahi duzula?", + "selected-peer-left": "Falta diren hautatutako kideak", + "pairing-key-invalidated": "{{key}} gakoa baliogabetu da" + }, + "dialogs": { + "send": "Bidali", + "title-file": "Fitxategia", + "input-key-on-this-device": "Sartu gakoa beste gailu batean", + "enter-key-from-another-device": "Sartu beste gailu bateko gakoa hemen.", + "temporary-public-room-title": "Behin-behineko gela publikoa", + "input-room-id-on-another-device": "Sartu gela honen IDa beste gailu batean", + "enter-room-id-from-another-device": "Sartu beste gailu bateko gelaren IDa gelara sartzeko.", + "unpair": "Askatu", + "paired-device-removed": "Kendu egin da lotutako gailua.", + "paired-devices-wrapper_data-empty": "Ez dago lotutako gailurik.", + "auto-accept-instructions-1": "Aktibatu", + "auto-accept": "onartu automatikoki", + "close": "Itxi", + "join": "Sartu", + "would-like-to-share": "partekatu nahi du", + "decline": "Baztertu", + "has-sent": "bidali du:", + "receive-text-title": "Mezua jaso da", + "copy": "Kopiatu", + "base64-title-files": "Partekatu fitxategiak", + "base64-title-text": "Partekatu testua", + "base64-tap-to-paste": "Egin tap hemen {{type}} partekatzeko", + "base64-processing": "Prozesatzen…", + "base64-paste-to-send": "Itsatsi arbelekoa hemen {{type}} partekatzeko", + "base64-text": "testua", + "base64-files": "fitxategiak", + "file-other-description-image": "eta beste irudi 1", + "file-other-description-file": "eta beste fitxategi 1", + "file-other-description-image-plural": "eta beste {{count}} irudi", + "title-image": "Irudia", + "receive-title": "{{descriptor}} jaso da", + "download-again": "Deskargatu berriro", + "system-language": "Sistemak darabilena", + "public-room-qr-code_title": "Klikatu gela publikoaren esteka kopiatzeko", + "approve": "onartu", + "title-file-plural": "Fitxategiak", + "share-text-checkbox": "Erakutsi beti leiho hau testua partekatzerakoan", + "pair-devices-title": "Lotu gailuak betiko", + "scan-qr-code": "edo eskaneatu QR kodea.", + "hr-or": "EDO", + "pair": "Lotu", + "cancel": "Utzi", + "edit-paired-devices-title": "Editatu lotutako gailuak", + "accept": "Onartu", + "share": "Partekatu", + "download": "Deskargatu", + "send-message-title": "Bidali mezua", + "send-message-to": "Honi:", + "message_placeholder": "Testua", + "message_title": "Sartu bidaltzeko mezua", + "title-image-plural": "Irudiak", + "pair-devices-qr-code_title": "Klikatu gailu hau lotzeko esteka kopiatzeko", + "leave": "Irten", + "share-text-title": "Partekatu testuzko mezua", + "auto-accept-instructions-2": "automatikoki onartzeko gailu horretatik bidalitako fitxategi guztiak.", + "file-other-description-file-plural": "eta beste {{count}} fitxategi", + "language-selector-title": "Ezarri hizkuntza", + "share-text-subtitle": "Editatu mezua bidali baino lehen:", + "close-toast_title": "Itxi jakinarazpena" + }, + "about": { + "custom_title": "Jarraitu iezaguzu", + "claim": "Gailuen artean fitxategiak trukatzeko modurik errazena", + "github_title": "PairDrop GitHuben", + "buy-me-a-coffee_title": "Erosidazu kafe bat!", + "privacypolicy_title": "Ireki gure pribatutasun politika", + "tweet_title": "Egin txio PairDropi buruz", + "faq_title": "Maiz Egindako Galderak", + "mastodon_title": "Idatzi Mastodonen PairDropi buruz", + "bluesky_title": "Jarrai iezaguzu BlueSkyn", + "close-about_aria-label": "Itxi PairDropi buruz" + }, + "footer": { + "known-as": "Zure izena honakoa da:", + "display-name_data-placeholder": "Kargatzen…", + "display-name_title": "Editatu zure gailuaren izena betiko", + "on-this-network_title": "Sare honetako edonork aurki zaitzake.", + "paired-devices": "lotutako gailuek", + "public-room-devices_title": "Gela publiko honetan dauden gailuek aurki zaitzakete, zauden sarean zaudela.", + "traffic": "Trafikoa:", + "routed": "zerbitzaritik bideratuta", + "discovery": "Aurki zaitzakete:", + "webrtc": "WebRTC erabilgarri ez badago.", + "on-this-network": "sare honetan", + "public-room-devices": "{{roomId}} gelan", + "paired-devices_title": "Lotutako gailuek uneoro aurki zaitzakete, zauden sarearen zaudela." + }, + "document-titles": { + "file-received": "Fitxategia jaso da", + "file-received-plural": "{{count}} fitxategi jaso dira", + "image-transfer-requested": "Irudiaren trukaketa eskatu da", + "message-received": "Mezua jaso da", + "message-received-plural": "{{count}} mezu jaso dira", + "file-transfer-requested": "Fitxategiaren trukaketa eskatu da" + }, + "peer-ui": { + "click-to-send-share-mode": "Klikatu {{descriptor}} bidaltzeko", + "preparing": "Prestatzen…", + "waiting": "Zain…", + "processing": "Prozesatzen…", + "transferring": "Trukatzen…", + "connection-hash": "Zifratzearen segurtasuna muturretik muturrera egiaztatzeko, konparatu segurtasun-zenbaki hau bi gailuetan", + "click-to-send": "Klikatu fitxategiak bidaltzeko edo klikatu eskumako botoiarekin mezu bat bidaltzeko" + } +} From 1b967e40d279bdc76ac5072a5844fbad472ac305 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 12/77] Translated using Weblate (Estonian) Currently translated at 100.0% (166 of 166 strings) Added translation using Weblate (Estonian) Co-authored-by: Hosted Weblate Co-authored-by: Madis Otenurm Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/et/ Translation: PairDrop/pairdrop-spa --- public/lang/et.json | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 public/lang/et.json diff --git a/public/lang/et.json b/public/lang/et.json new file mode 100644 index 0000000..5f72834 --- /dev/null +++ b/public/lang/et.json @@ -0,0 +1,184 @@ +{ + "notifications": { + "rate-limit-join-key": "Jõudsid tegevuspiiranguni. Oota 10 sekundit ja proovi uuesti.", + "notifications-permissions-error": "Teavituste luba on keelatud, kuna oled mitu korda loataotluse sulgenud. Selle saad lähtestada lehe teabe menüüs, millele pääsed ligi aadressiribal oleva lukuikooni kaudu.", + "display-name-changed-permanently": "Kuvatav nimi on püsivalt muudetud", + "display-name-changed-temporarily": "Kuvatav nimi on muudetud vaid selle seansi jaoks", + "display-name-random-again": "Kuvatav nimi on taas juhuslikult genereeritud", + "pairing-not-persistent": "Paaritatud seadmed ei ole püsivad", + "public-room-id-invalid": "Sobimatu ruumi-ID", + "copied-to-clipboard": "Kopeeritud lõikelauale", + "copied-to-clipboard-error": "Kopeerimine pole võimalik. Kopeeri käsitsi.", + "room-url-copied-to-clipboard": "Avaliku ruumi link kopeeritud lõikelauale", + "clipboard-content-incorrect": "Lõikelaua sisu on sobimatu", + "link-received": "Link {{name}} poolt vastu võetud - klõpsa avamiseks", + "message-received": "Sõnum {{name}} poolt vastu võetud - klõpsa kopeerimiseks", + "connected": "Ühendatud", + "copied-text": "Tekst lõikelauale kopeeritud", + "copied-text-error": "Lõikelauale kirjutamine ebaõnnestus. Kopeeri käsitsi!", + "unfinished-transfers-warning": "Omad lõpetamata ülekandeid. Kas soovid kindlasti PairDropi sulgeda?", + "files-incorrect": "Failid on sobimatud", + "message-transfer-completed": "Sõnumiedastus lõpetatud", + "online-requirement-pairing": "Seadmete paaritamiseks pead võrgus olema", + "online-requirement-public-room": "Avaliku ruumi loomiseks pead võrgus olema", + "ios-memory-limit": "iOSil saab saata faile ainult 200 MB kaupa", + "selected-peer-left": "Valitud seade lahkus", + "pairing-cleared": "Kõik seadmepaaritused eemaldatud", + "offline": "Sa oled võrgust väljas", + "public-room-left": "Lahkusid avalikust ruumist {{publicRoomId}}", + "click-to-download": "Klõpsa allalaadimiseks", + "pairing-key-invalid": "Sobimatu võti", + "notifications-enabled": "Teavitused lubatud", + "text-content-incorrect": "Tekstisisu on sobimatu", + "file-content-incorrect": "Failisisu on sobimatu", + "click-to-show": "Klõpsa kuvamiseks", + "file-transfer-completed": "Failiedastus lõpetatud", + "request-title": "{{name}} soovib edastada {{count}} {{descriptor}}", + "online": "Sa oled tagasi võrgus", + "connecting": "Ühendamine…", + "download-successful": "{{descriptor}} allalaaditud", + "pairing-success": "Seadmed paaritatud", + "pairing-tabs-error": "Kahe brauserikaardi paaritamine on võimatu", + "pair-url-copied-to-clipboard": "Selle seadme paaritamise link kopeeritud lõikelauale", + "pairing-key-invalidated": "Võti {{key}} on muudetud kehtetuks" + }, + "instructions": { + "x-instructions-share-mode_mobile": "Koputa, et saata {{descriptor}}", + "no-peers_data-drop-bg": "Vabasta saaja valimiseks", + "no-peers-title": "Ava failide saatmiseks PairDrop teistes seadmetes", + "no-peers-subtitle": "Paarita seadmed või sisesta avalik ruum, et olla teistes võrkudes avastatav", + "x-instructions_desktop": "Klõpsa failide saatmiseks või paremklõpsa sõnumi saatmiseks", + "x-instructions_mobile": "Koputa failide saatmiseks või hoia all sõnumi saatmiseks", + "x-instructions_data-drop-peer": "Vabasta sisu saatmiseks", + "activate-share-mode-base": "Saatmiseks ava PairDrop teistes seadmetes", + "activate-share-mode-and-other-file": "ja üks teine fail", + "activate-share-mode-shared-text": "jagatud tekst", + "webrtc-requirement": "Selle PairDrop eksemplari kasutamiseks peab WebRTC olema lubatud!", + "activate-share-mode-and-other-files-plural": "ja {{count}} teist faili", + "activate-share-mode-shared-file": "jagatud fail", + "activate-share-mode-shared-files-plural": "{{count}} jagatud faili", + "x-instructions-share-mode_desktop": "Klõpsa, et saata {{descriptor}}", + "x-instructions_data-drop-bg": "Vabasta seadme valimiseks" + }, + "header": { + "theme-auto_title": "Kasuta automaatselt süsteemiteemat", + "theme-light_title": "Kasuta alati heledat teemat", + "cancel-share-mode": "Tühista", + "edit-share-mode": "Muuda", + "edit-paired-devices_title": "Muuda paaritatud seadmeid", + "join-public-room_title": "Liitu avaliku ruumiga ajutiselt", + "expand_title": "Laienda päise nupurida", + "about_title": "PairDropi teave", + "notification_title": "Luba teavitused", + "install_title": "Paigalda PairDrop", + "language-selector_title": "Määra keel", + "about_aria-label": "Ava PairDropi teave", + "pair-device_title": "Paarita oma seadmed püsivalt", + "theme-dark_title": "Kasuta alati tumedat teemat" + }, + "footer": { + "known-as": "Sind tuntakse kui:", + "discovery": "Sind saab avastada:", + "on-this-network": "selles võrgus", + "paired-devices_title": "Paaritatud seadmed saavad sinu seadet igal ajal avastada, sõltumata võrgust.", + "on-this-network_title": "Igaüks selles võrgus saab sind avastada.", + "public-room-devices_title": "Selles avalikus ruumis olevad seadmed saavad sind avastada sõltumata võrgust.", + "webrtc": "kui WebRTC pole saadaval.", + "display-name_data-placeholder": "Laadimine…", + "display-name_title": "Muuda oma seadme nime püsivalt", + "paired-devices": "paaritatud seadmetes", + "public-room-devices": "ruumis {{roomId}}", + "routed": "suunatud läbi serveri", + "traffic": "Liiklus on" + }, + "dialogs": { + "auto-accept-instructions-1": "Aktiveeri", + "pair-devices-title": "Paarita seadmed püsivalt", + "scan-qr-code": "või skanni QR-kood.", + "temporary-public-room-title": "Ajutine avalik ruum", + "input-room-id-on-another-device": "Sisesta see ruumi-ID teise seadmesse", + "paired-devices-wrapper_data-empty": "Paaritatud seadmed puuduvad.", + "auto-accept": "automaatne vastuvõtt", + "input-key-on-this-device": "Impordi see võti teises seadmes", + "enter-room-id-from-another-device": "Ruumiga liitumiseks sisesta teises seadmes see ruumi-ID.", + "paired-device-removed": "Paaritatud seade on eemaldatud.", + "would-like-to-share": "soovib jagada", + "accept": "Võta vastu", + "download": "Laadi alla", + "send-message-title": "Saada sõnum", + "send-message-to": "Seadmele:", + "auto-accept-instructions-2": "et automaatselt kõik sellest seadmest saadetud failid vastu võtta.", + "send": "Saada", + "language-selector-title": "Määra keel", + "receive-title": "{{descriptor}} vastuvõetud", + "approve": "võta vastu", + "close-toast_title": "Sulge teavitus", + "pair": "Paarita", + "close": "Sulge", + "hr-or": "VÕI", + "cancel": "Tühista", + "unpair": "Eemalda paardumine", + "join": "Liitu", + "leave": "Lahku", + "message_placeholder": "Tekst", + "base64-files": "failid", + "file-other-description-file": "ja üks teine fail", + "file-other-description-file-plural": "ja {{count}} teist faili", + "title-image": "Pilt", + "has-sent": "on saatnud:", + "share": "Jaga", + "message_title": "Sisesta saadetav sõnum", + "receive-text-title": "Sõnum vastuvõetud", + "copy": "Kopeeri", + "base64-title-text": "Jaga teksti", + "base64-title-files": "Jaga faile", + "pair-devices-qr-code_title": "Klõpsa, et kopeerida seadme paaritamise link", + "base64-tap-to-paste": "Koputa siia {{type}} jagamiseks", + "base64-paste-to-send": "Kleebi siia {{type}} jagamiseks", + "base64-text": "tekst", + "title-file-plural": "Failid", + "share-text-title": "Jaga tekstsõnumit", + "edit-paired-devices-title": "Muuda paaritatud seadmeid", + "enter-key-from-another-device": "Sisesta teise seadme võti siia.", + "system-language": "Süsteemikeel", + "share-text-subtitle": "Muuda sõnumit enne saatmist:", + "title-file": "Fail", + "title-image-plural": "Pildid", + "file-other-description-image": "ja üks teine pilt", + "download-again": "Laadi uuesti alla", + "file-other-description-image-plural": "ja {{count}} teist pilti", + "public-room-qr-code_title": "Klõpsa, et kopeerida avaliku ruumi link", + "share-text-checkbox": "Kuva teksti saatmisel alati see dialoog", + "base64-processing": "Töötlemine…", + "decline": "Keeldu" + }, + "about": { + "claim": "Lihtsaim viis jagada faile üle seadmete", + "tweet_title": "Säutsu PairDropist", + "bluesky_title": "Jälgi meid BlueSkys", + "privacypolicy_title": "Ava meie privaatsuspoliitika", + "faq_title": "Korduma kippuvad küsimused", + "buy-me-a-coffee_title": "Osta mulle kohvi!", + "mastodon_title": "Kirjuta PairDropist Mastodonis", + "custom_title": "Jälgi meid", + "close-about_aria-label": "Sulge PairDropi teave", + "github_title": "PairDrop GitHubis" + }, + "document-titles": { + "file-transfer-requested": "Failiedastust on taotletud", + "image-transfer-requested": "Pildiedastust on taotletud", + "file-received-plural": "{{count}} faili vastuvõetud", + "message-received-plural": "{{count}} sõnumit vastuvõetud", + "file-received": "Fail vastuvõetud", + "message-received": "Sõnum vastuvõetud" + }, + "peer-ui": { + "connection-hash": "Otspunktkrüpteeringu turvalisuse kinnitamiseks võrdle seda arvu mõlemas seadmes", + "click-to-send": "Klõpsa failide saatmiseks või paremklõpsa sõnumi saatmiseks", + "preparing": "Valmistumine…", + "click-to-send-share-mode": "Klõpsa {{descriptor}} saatmiseks", + "waiting": "Ootamine…", + "processing": "Töötlemine…", + "transferring": "Edastamine…" + } +} From 81b240bfc8a4807f3251863c77574487c1c298c9 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 13/77] Translated using Weblate (Russian) Currently translated at 100.0% (166 of 166 strings) Translated using Weblate (Russian) Currently translated at 98.7% (164 of 166 strings) Translated using Weblate (Russian) Currently translated at 97.5% (162 of 166 strings) Co-authored-by: AL Co-authored-by: Andrii Solianyk Co-authored-by: Hosted Weblate Co-authored-by: sebulba Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/ Translation: PairDrop/pairdrop-spa --- public/lang/ru.json | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/public/lang/ru.json b/public/lang/ru.json index 5e7b041..46261d7 100644 --- a/public/lang/ru.json +++ b/public/lang/ru.json @@ -1,18 +1,19 @@ { "header": { - "about_aria-label": "Открыть страницу \"О сервисе\"", + "about_aria-label": "О PairDrop", "pair-device_title": "Связать ваши устройства навсегда", "install_title": "Установить PairDrop", "cancel-share-mode": "Выполнено", "edit-paired-devices_title": "Редактировать связанные устройства", "notification_title": "Включить уведомления", - "about_title": "О сервисе", + "about_title": "О PairDrop", "theme-auto_title": "Адаптировать тему к системной автоматически", "theme-dark_title": "Всегда использовать темную тему", "theme-light_title": "Всегда использовать светлую тему", "join-public-room_title": "Войти на время в публичную комнату", - "language-selector_title": "Выбрать язык", - "edit-share-mode": "Редактировать" + "language-selector_title": "Установить язык", + "edit-share-mode": "Редактировать", + "expand_title": "Развернуть ряд кнопок заголовка" }, "instructions": { "x-instructions_desktop": "Нажмите, чтобы отправить файлы, или щелкните правой кнопкой мыши, чтобы отправить сообщение", @@ -26,7 +27,11 @@ "no-peers-subtitle": "Свяжите устройства или войдите в публичную комнату, чтобы вас могли обнаружить из других сетей", "activate-share-mode-and-other-files-plural": "и {{count}} других файлов", "activate-share-mode-base": "Откройте PairDrop на других устройствах, чтобы отправить", - "activate-share-mode-shared-text": "общий текст" + "activate-share-mode-shared-text": "общий текст", + "activate-share-mode-and-other-file": "и 1 другой файл", + "activate-share-mode-shared-file": "доступный файл", + "activate-share-mode-shared-files-plural": "{{count}} доступных файлов", + "webrtc-requirement": "Включите WebRTC, чтобы пользоваться этой копией PairDrop!" }, "footer": { "display-name_data-placeholder": "Загрузка…", @@ -55,13 +60,13 @@ "download": "Скачать", "receive-text-title": "Сообщение получено", "send": "Отправить", - "send-message-to": "Отправить сообщение", + "send-message-to": "Кому:", "send-message-title": "Отправить сообщение", "copy": "Копировать", "base64-files": "файлы", - "base64-paste-to-send": "Вставьте здесь, чтобы отправить {{type}}", + "base64-paste-to-send": "Вставьте, чтобы поделиться {{type}}", "base64-processing": "Обработка…", - "base64-tap-to-paste": "Прикоснитесь здесь, чтобы вставить {{type}}", + "base64-tap-to-paste": "Нажмите, чтобы поделиться {{type}}", "base64-text": "текст", "title-file": "Файл", "title-file-plural": "Файлы", @@ -95,7 +100,14 @@ "pair-devices-qr-code_title": "Нажмите, чтобы скопировать ссылку для привязки этого устройства", "public-room-qr-code_title": "Нажмите, чтобы скопировать ссылку на публичную комнату", "message_placeholder": "Текст", - "paired-device-removed": "Связанное устройство удалено." + "paired-device-removed": "Связанное устройство удалено.", + "close-toast_title": "Закрыть уведомление", + "share-text-checkbox": "Всегда показывать это окно перед отправкой", + "base64-title-text": "Поделиться текстом", + "base64-title-files": "Поделиться файлами", + "share-text-subtitle": "Отредактировать сообщение перед отправкой:", + "approve": "одобрить", + "share-text-title": "Поделиться сообщением" }, "about": { "close-about-aria-label": "Закрыть страницу \"О сервисе\"", @@ -104,7 +116,11 @@ "buy-me-a-coffee_title": "Купить мне кофе!", "github_title": "PairDrop на GitHub", "tweet_title": "Твит о PairDrop", - "faq_title": "Часто задаваемые вопросы" + "faq_title": "Часто задаваемые вопросы", + "mastodon_title": "Расскажите о PairDrop на Mastodon", + "custom_title": "Подпишитесь на нас", + "bluesky_title": "Подписаться на BlueSky", + "privacypolicy_title": "Открыть нашу политику приватности" }, "notifications": { "display-name-changed-permanently": "Отображаемое имя было изменено навсегда", From b97cd116a90d4db57de4bd29a3af240a2e5622bf Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 14/77] Translated using Weblate (Bulgarian) Currently translated at 100.0% (166 of 166 strings) Translated using Weblate (Bulgarian) Currently translated at 17.4% (29 of 166 strings) Added translation using Weblate (Bulgarian) Co-authored-by: Emil Petrakiev Co-authored-by: Hosted Weblate Co-authored-by: psydex Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/bg/ Translation: PairDrop/pairdrop-spa --- public/lang/bg.json | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 public/lang/bg.json diff --git a/public/lang/bg.json b/public/lang/bg.json new file mode 100644 index 0000000..08b77e2 --- /dev/null +++ b/public/lang/bg.json @@ -0,0 +1,184 @@ +{ + "header": { + "about_title": "Относно PairDrop", + "language-selector_title": "Задай език", + "about_aria-label": "Отвори Относно PairDrop", + "theme-auto_title": "Адаптирай темата спрямо системните настройки", + "theme-light_title": "Винаги използвай светла тема", + "notification_title": "Включи известията", + "pair-device_title": "Свържи устройствата си перманентно", + "join-public-room_title": "Присъедини се към временна публична стая", + "cancel-share-mode": "Отказ", + "expand_title": "Покажи меню", + "theme-dark_title": "Винаги използвай тъмна тема", + "install_title": "Инсталирай PairDrop", + "edit-paired-devices_title": "Промени свързаните устройства", + "edit-share-mode": "Промени" + }, + "instructions": { + "no-peers_data-drop-bg": "Пусни, за да избереш получател", + "no-peers-title": "Отвори PairDrop на друго устройство, за да започнеш споделяне", + "no-peers-subtitle": "Свържи устройство или влез в публична стая, за да станеш откриваем за други мрежи", + "x-instructions_desktop": "Ляв клик, за да изпратиш файл или десен клик, за да изпратиш съобщение", + "x-instructions_data-drop-peer": "Пусни, за да изпратиш", + "x-instructions-share-mode_desktop": "Натисни, за да изпратиш {{descriptor}}", + "activate-share-mode-base": "Отвори PairDrop на друго устройство, за да изпратиш", + "activate-share-mode-and-other-file": "и още 1 файл", + "activate-share-mode-and-other-files-plural": "и още {{count}} файла", + "activate-share-mode-shared-text": "споделен текст", + "activate-share-mode-shared-files-plural": "{{count}} споделени файлове", + "x-instructions_data-drop-bg": "Пусни, за да избереш получател", + "activate-share-mode-shared-file": "споделен файл", + "x-instructions_mobile": "Докосни, за да изпратиш файл или задръж, за да изпратиш съобщение", + "x-instructions-share-mode_mobile": "Докосни, за да изпратиш {{descriptor}}", + "webrtc-requirement": "За да използвате инстанция на PairDrop, WebRTC трябва да бъде включен!" + }, + "footer": { + "known-as": "Известни сте като:", + "display-name_data-placeholder": "Зареждане…", + "display-name_title": "Редактирайте името на вашето устройство за постоянно", + "discovery": "Може да бъдете открити:", + "on-this-network": "В тази мрежа", + "on-this-network_title": "Може да бъдете открити от всеки в тази мрежа.", + "paired-devices": "От свързани устройства", + "paired-devices_title": "Може да бъдете открити от свързани устройства по всяко време, независимо от мрежата.", + "public-room-devices": "в стая {{roomId}}", + "public-room-devices_title": "Може да бъдете открити от устройства в тази публична стая, независимо от мрежата.", + "traffic": "Трафикът е", + "routed": "пренасочен през сървъра", + "webrtc": "ако WebRTC не е наличен." + }, + "dialogs": { + "pair-devices-title": "Свържете устройства за постоянно", + "input-key-on-this-device": "Въведете този ключ на друго устройство", + "scan-qr-code": "или сканирайте QR кода.", + "enter-key-from-another-device": "Въведете тук ключ от друго устройство.", + "input-room-id-on-another-device": "Въведете този ID за стая на друго устройство", + "hr-or": "ИЛИ", + "unpair": "Раздели", + "paired-device-removed": "Свързаното устройство беше премахнато.", + "paired-devices-wrapper_data-empty": "Няма свързани устройства.", + "auto-accept-instructions-1": "Активно", + "auto-accept": "автоматично приемане", + "auto-accept-instructions-2": "за автоматично приемане на всички файлове, изпратени от това устройство.", + "close": "Затвори", + "join": "Присъедини се", + "leave": "Напусни", + "would-like-to-share": "иска да сподели", + "has-sent": "изпрати:", + "share": "Сподели", + "download": "Изтегли", + "send-message-title": "Изпрати съобщение", + "send-message-to": "До:", + "message_title": "Въведете съобщението за изпращане", + "message_placeholder": "Текст", + "send": "Изпрати", + "receive-text-title": "Получено съобщение", + "copy": "Копиране", + "base64-title-files": "Споделяне на файлове", + "base64-title-text": "Споделяне на текст", + "base64-processing": "Обработва се…", + "base64-tap-to-paste": "Натиснете тук за да споделите {{type}}", + "base64-paste-to-send": "Поставете своя Клипборд тук за да споделите {{type}}", + "file-other-description-image": "и още една снимка", + "file-other-description-file": "и още един файл", + "file-other-description-image-plural": "и още {{count}} снимки", + "file-other-description-file-plural": "и още {{count}} файла", + "title-image": "снимка", + "title-image-plural": "Снимки", + "title-file-plural": "Файлове", + "receive-title": "{{descriptor}} Получено", + "download-again": "Изтегли отново", + "language-selector-title": "Изберете език", + "pair-devices-qr-code_title": "Кликнете, за да копирате линка за свързване на това устройство", + "approve": "одобри", + "share-text-title": "Сподели текстово съобщение", + "share-text-subtitle": "Редактирайте съобщението преди изпращане:", + "share-text-checkbox": "Винаги показвай този прозорец при споделяне на текст", + "accept": "Приеми", + "temporary-public-room-title": "Временна публична стая", + "enter-room-id-from-another-device": "Въведете ID на стая от друго устройство, за да се присъедините.", + "pair": "Свържи", + "cancel": "Отказ", + "edit-paired-devices-title": "Редактиране на свързани устройства", + "close-toast_title": "Затвори известието", + "decline": "Откажи", + "base64-text": "текст", + "base64-files": "файлове", + "title-file": "Файл", + "system-language": "Език на системата", + "public-room-qr-code_title": "Кликнете, за да копирате линка към публичната стая" + }, + "about": { + "close-about_aria-label": "Затвори информацията за PairDrop", + "tweet_title": "Споделете PairDrop в X (Twitter)", + "mastodon_title": "Напишете за PairDrop в Mastodon", + "bluesky_title": "Последвайте ни в BlueSky", + "custom_title": "Последвайте ни", + "faq_title": "Често задавани въпроси", + "claim": "Най-лесният начин за прехвърляне на файлове между устройства", + "github_title": "PairDrop в GitHub", + "buy-me-a-coffee_title": "Купете ми кафе!", + "privacypolicy_title": "Отворете нашата политика за поверителност" + }, + "notifications": { + "display-name-changed-permanently": "Името се променя постоянно", + "display-name-changed-temporarily": "Името се променя само за тази сесия", + "display-name-random-again": "Името отново е генерирано на случаен принцип", + "pairing-not-persistent": "Свързаните устройства не са постоянни", + "public-room-left": "Напуснахте публичната стая {{publicRoomId}}", + "copied-to-clipboard": "Копирано в клипборда", + "pair-url-copied-to-clipboard": "Линкът за свързване на това устройство е копиран в клипборда", + "room-url-copied-to-clipboard": "Линкът към публичната стая е копиран в клипборда", + "copied-to-clipboard-error": "Копирането не е възможно. Копирайте ръчно.", + "file-content-incorrect": "Съдържанието на файла е неправилно", + "clipboard-content-incorrect": "Съдържанието на клипборда е неправилно", + "link-received": "Линк, получен от {{name}} - Кликнете, за да отворите", + "message-received": "Съобщение, получено от {{name}} - Кликнете, за да копирате", + "click-to-download": "Кликнете, за да изтеглите", + "request-title": "{{name}} иска да прехвърли {{count}} {{descriptor}}", + "click-to-show": "Кликнете, за да покажете", + "copied-text": "Текстът е копиран в клипборда", + "copied-text-error": "Писането в клипборда не успя. Копирайте ръчно!", + "offline": "Вие сте офлайн", + "online": "Вие сте отново онлайн", + "connected": "Свързан", + "online-requirement-public-room": "Трябва да сте онлайн, за да създадете публична стая", + "files-incorrect": "Файловете са неправилни", + "unfinished-transfers-warning": "Има незавършени прехвърляния. Сигурни ли сте, че искате да затворите PairDrop?", + "selected-peer-left": "Избраният партньор напусна", + "pairing-tabs-error": "Свързването на два раздела в браузъра е невъзможно", + "pairing-success": "Устройства свързани", + "download-successful": "{{descriptor}} изтеглено", + "public-room-id-invalid": "Невалиден ID на стая", + "pairing-key-invalid": "Невалиден ключ", + "pairing-cleared": "Всички устройства са разделени", + "text-content-incorrect": "Текстовото съдържание е неправилно", + "notifications-enabled": "Известията са активирани", + "pairing-key-invalidated": "Ключът {{key}} е невалиден", + "notifications-permissions-error": "Разрешението за известия е блокирано, тъй като потребителят няколко пъти е отхвърлил подкана за разрешение. Това може да се нулира в информацията за страницата, която се достъпва чрез иконата с катинар до лентата за URL адрес.", + "online-requirement-pairing": "Трябва да сте онлайн, за да свържете устройства", + "connecting": "Свързване…", + "file-transfer-completed": "Прехвърлянето на файлове е завършено", + "rate-limit-join-key": "Достигнат е лимитът за заявки. Изчакайте 10 секунди и опитайте отново.", + "message-transfer-completed": "Прехвърлянето на съобщението е завършено", + "ios-memory-limit": "Изпращането на файлове към iOS е възможно само до 200 MB наведнъж" + }, + "document-titles": { + "file-received": "Файлът е получен", + "file-received-plural": "{{count}} файла получени", + "file-transfer-requested": "Заявката за прехвърляне на файлове е изпратена", + "image-transfer-requested": "Заявката за прехвърляне на изображения е изпратена", + "message-received-plural": "{{count}} получени съобщения", + "message-received": "Получено съобщение" + }, + "peer-ui": { + "click-to-send-share-mode": "Натисни, за да изпратиш {{descriptor}}", + "preparing": "Подготовка…", + "click-to-send": "Кликнете, за да изпратите файлове или кликнете с десен бутон, за да изпратите съобщение", + "connection-hash": "За да потвърдите сигурността на криптирането на връзката, сравнете този номер за сигурност с двете устройства", + "waiting": "Чакане…", + "processing": "Обработка…", + "transferring": "Прехвърляне…" + } +} From 58585f70068ad3033e1b1095bd938c74e5464132 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 15/77] Translated using Weblate (Ukrainian) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Bezruchenko Simon Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/uk/ Translation: PairDrop/pairdrop-spa --- public/lang/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/lang/uk.json b/public/lang/uk.json index 7796814..c3df9f7 100644 --- a/public/lang/uk.json +++ b/public/lang/uk.json @@ -34,7 +34,7 @@ "activate-share-mode-shared-files-plural": "{{count}} спільних файлів" }, "footer": { - "known-as": "Вам відомо як:", + "known-as": "Ви відомі як:", "discovery": "Вас можна знайти:", "public-room-devices": "у кімнаті {{roomId}}", "public-room-devices_title": "Вас можуть знайти пристрої в цій публічній кімнаті, незалежно від мережі.", From 182d72fade2a001fb12405459c9e09297d72283e Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:38 +0100 Subject: [PATCH 16/77] Translated using Weblate (Japanese) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: mottcha <89951503+mottcha@users.noreply.github.com> Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/ Translation: PairDrop/pairdrop-spa --- public/lang/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/lang/ja.json b/public/lang/ja.json index c6a5dad..6184de8 100644 --- a/public/lang/ja.json +++ b/public/lang/ja.json @@ -34,7 +34,7 @@ "online": "オンラインに復帰しました", "public-room-left": "公開ルーム{{publicRoomId}}から退出しました", "copied-text": "テキストをクリップボードにコピーしました", - "display-name-random-again": "新しいランダムなデバイス名に変更されました", + "display-name-random-again": "新しいデバイス名に変更されました", "display-name-changed-permanently": "デバイス名が変更されました", "copied-to-clipboard-error": "コピーできませんでした。手動でコピーしてください。", "pairing-success": "ペアリングしました", From dab259ca2bc032be4b6e1188de6bff7d89c0a1c6 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 17/77] Translated using Weblate (Czech) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: Petr L Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/cs/ Translation: PairDrop/pairdrop-spa --- public/lang/cs.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/lang/cs.json b/public/lang/cs.json index ade4a7e..f276d98 100644 --- a/public/lang/cs.json +++ b/public/lang/cs.json @@ -40,7 +40,7 @@ "public-room-devices": "v místnosti {{roomId}}", "public-room-devices_title": "Zařízení v této veřejné místnosti vás mohou objevit nezávisle na síti.", "traffic": "Provoz je", - "routed": "směrovány přes server" + "routed": "směrován přes server" }, "dialogs": { "auto-accept": "auto-accept", @@ -58,8 +58,8 @@ "unpair": "Zrušit spárování", "paired-device-removed": "Spárované zařízení bylo odstraněno.", "paired-devices-wrapper_data-empty": "Žádná spárovaná zařízení.", - "auto-accept-instructions-1": "Aktivovat", - "auto-accept-instructions-2": "automaticky přijímat všechny soubory odeslané z tohoto zařízení.", + "auto-accept-instructions-1": "Aktivací", + "auto-accept-instructions-2": "budete automaticky přijímat všechny soubory odeslané z tohoto zařízení.", "close": "Zavřít", "join": "Připojit", "leave": "Odejít", @@ -132,7 +132,7 @@ "pairing-key-invalid": "Neplatný klíč", "pairing-key-invalidated": "Klíč {{key}} byl neplatný", "public-room-id-invalid": "Neplatné ID místnosti", - "public-room-left": "Opustit veřejnou místnost {{publicRoomId}}", + "public-room-left": "Opuštěna veřejná místnost {{publicRoomId}}", "copied-to-clipboard": "Zkopírováno do schránky", "pair-url-copied-to-clipboard": "Odkaz pro spárování tohoto zařízení byl zkopírován do schránky", "room-url-copied-to-clipboard": "Odkaz do veřejné místnosti zkopírován do schránky", From eecdee7381c2ba8697a6ff38753d9675fd41408a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 18/77] Translated using Weblate (Italian) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: Ilbebino Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/it/ Translation: PairDrop/pairdrop-spa --- public/lang/it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/lang/it.json b/public/lang/it.json index c89880f..af59a90 100644 --- a/public/lang/it.json +++ b/public/lang/it.json @@ -25,7 +25,7 @@ "edit-paired-devices_title": "Modifica i dispositivi abbinati", "language-selector_title": "Imposta Lingua", "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", "edit-share-mode": "Modifica", "expand_title": "Espandi la riga dei pulsanti nell'intestazione" From 12180c4343cb2fd03ad72fc3aaffafffc3a76ee7 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 19/77] Translated using Weblate (Arabic) Currently translated at 99.3% (165 of 166 strings) Co-authored-by: ElAccWeblate Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ar/ Translation: PairDrop/pairdrop-spa --- public/lang/ar.json | 46 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/public/lang/ar.json b/public/lang/ar.json index a3c333e..9834fbe 100644 --- a/public/lang/ar.json +++ b/public/lang/ar.json @@ -17,7 +17,7 @@ "notifications": { "request-title": "يرغب {{name}} في نقل {{count}} {{descriptor}}", "unfinished-transfers-warning": "هناك تحويلات غير مكتملة. هل أنت متأكد أنك تريد إغلاق PairDrop؟", - "message-received": "تم استلام الرابط بواسطة {{name}} - انقر للفتح", + "message-received": "تم استلام الرسالة بواسطة {{name}} - انقر للفتح", "rate-limit-join-key": "تم الوصول إلى الحد الأقصى. انتظر 10 ثوان وحاول مرة أخرى.", "connecting": "يتصل …", "pairing-key-invalidated": "المفتاح {{key}} خاطئ", @@ -52,7 +52,10 @@ "online-requirement-public-room": "يجب أن تكون متصلاً بالإنترنت لإنشاء غرفة عامة", "copied-text-error": "فشلت الكتابة من الحافظة. انسخ يدويًا!", "download-successful": "تم تحميل {{descriptor}}", - "click-to-show": "اضغط للعرض" + "click-to-show": "اضغط للعرض", + "pair-url-copied-to-clipboard": "تم نسخ رابط اقتران هذا الجهاز إلى الحافظة", + "room-url-copied-to-clipboard": "تم نسخ رابط هذه الغرفة العامة إلى الحافظة", + "notifications-permissions-error": "لم يتم منح إذن الإشعارات حيث أن المستخدم أغلق نافذة السماح عدة مرات. يمكن إعادة تعيين هذا في معلومات الصفحة التي يمكن فتحها بالضغط على رمز القفل بجانب شريط عنوان صفحة الإنترنت." }, "header": { "cancel-share-mode": "تمّ", @@ -62,12 +65,13 @@ "pair-device_title": "قم بإقران أجهزتك بشكل دائم", "join-public-room_title": "انضم إلى الغرفة العامة مؤقتًا", "notification_title": "تفعيل الإشعارات", - "edit-paired-devices_title": "تعديل الأجهزة المقترنة", + "edit-paired-devices_title": "عدل الأجهزة المقترنة", "language-selector_title": "إختر اللغة", "about_title": "حول PairDrop", "about_aria-label": "افتح حول PairDrop", "theme-light_title": "إستخدم دائماً المظهر الفاتح", - "edit-share-mode": "ت٧ارف" + "edit-share-mode": "عدل", + "expand_title": "Expand header button row" }, "instructions": { "x-instructions_mobile": "انقر لإرسال الملفات أو انقر لفترة طويلة لإرسال رسالة", @@ -81,7 +85,11 @@ "no-peers-title": "افتح PairDrop على الأجهزة الأخرى لإرسال الملفات", "x-instructions_data-drop-bg": "حرر لتحديد المستلم", "no-peers_data-drop-bg": "حرر لتحديد المستلم", - "x-instructions_data-drop-peer": "قم بالتحرير لإرسالها إلى القرين" + "x-instructions_data-drop-peer": "قم بالتحرير لإرسالها إلى القرين", + "activate-share-mode-and-other-file": "وملف واحد آخر", + "activate-share-mode-shared-files-plural": "{{count}} ملفات مشاركة", + "activate-share-mode-shared-file": "الملف المُشارك", + "webrtc-requirement": "لتستعمل بيردروب هنا، يجب أن يكون WebRTC مفعلًا!" }, "peer-ui": { "processing": "مُعالجة …", @@ -93,7 +101,7 @@ "transferring": "جارٍ النقل…" }, "dialogs": { - "base64-paste-to-send": "الصق هنا لإرسال {{type}}", + "base64-paste-to-send": "الصق هنا للمشاركة {{type}}", "auto-accept-instructions-2": "لقبول جميع الملفات المرسلة من هذا الجهاز تلقائيًا.", "receive-text-title": "تلقيت رسالة", "edit-paired-devices-title": "تحرير الأجهزة المقترنة", @@ -104,12 +112,12 @@ "title-file": "ملف", "base64-processing": "مُعالجة…", "decline": "رفض", - "receive-title": "تم الاستلام {{descriptor}}", + "receive-title": "تم استلام {{descriptor}}", "leave": "مُغادرة", "join": "انضمام", "title-image-plural": "صور", "send": "ارسال", - "base64-tap-to-paste": "انقر هنا للصق {{type}}", + "base64-tap-to-paste": "انقر هنا للمشاركة {{type}}", "base64-text": "نص", "copy": "نسخ", "file-other-description-image": "وصورة واحدة أخرى", @@ -123,7 +131,7 @@ "title-image": "صورة", "file-other-description-file-plural": "و{{count}} ملفات أخرى", "would-like-to-share": "ترغب في المشاركة", - "send-message-to": "أرسال رسالة إلى", + "send-message-to": "أرسال رسالة إلى:", "language-selector-title": "إختر اللُغة", "pair": "إقتران", "hr-or": "او", @@ -139,7 +147,19 @@ "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": "أدخل معرف الغرفة من جهاز آخر للانضمام إلى الغرفة.", + "share-text-title": "شارك رسالة نصية", + "paired-device-removed": "تمت إزالة الجهاز المقترن.", + "message_title": "أدخل رسالة لإرسالها", + "message_placeholder": "النص", + "base64-title-files": "شارك ملفات", + "base64-title-text": "شارك نصًا", + "public-room-qr-code_title": "اضغط لنسخ رابط الغرفة العامة", + "approve": "قبول", + "share-text-subtitle": "عدل الرسالة قبل الإرسال:", + "share-text-checkbox": "أظهر هذه الرسالة دائمًا عند مشاركة النصوص", + "close-toast_title": "أغلق الإشعار", + "pair-devices-qr-code_title": "اضغط لنسخ رابط اقتران هذا الجهاز" }, "about": { "claim": "أسهل طريقة لنقل الملفات عبر الأجهزة", @@ -147,7 +167,11 @@ "close-about_aria-label": "إغلاق حول PairDrop", "buy-me-a-coffee_title": "اشتري لي القهوة!", "github_title": "PairDrop على جيت هاب", - "faq_title": "أسئلة متكررة" + "faq_title": "أسئلة متكررة", + "mastodon_title": "اكتب عن بيردروب على ماستادون", + "bluesky_title": "تابعنا على بلوسكاي", + "custom_title": "تابعنا", + "privacypolicy_title": "افتح سياسة الخصوصية الخاصة بنا" }, "document-titles": { "file-transfer-requested": "طلب نقل الملف", From bf8b248a057c220245cb80426a02cffead553df8 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 20/77] Translated using Weblate (Indonesian) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Adrien N Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/ Translation: PairDrop/pairdrop-spa --- public/lang/id.json | 72 ++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/public/lang/id.json b/public/lang/id.json index 39e63e3..1943e01 100644 --- a/public/lang/id.json +++ b/public/lang/id.json @@ -6,7 +6,7 @@ "display-name_title": "Edit nama perangkat Anda scr. permanen", "traffic": "Lalu lintas", "paired-devices_title": "Anda dapat ditemukan oleh perangkat yang dipasangkan setiap saat tergantung pada jaringan.", - "public-room-devices": "dalam room {{roomId}}", + "public-room-devices": "di dalam ruang {{roomId}}", "paired-devices": "pada prngkt. yg. dipasangkan", "on-this-network": "pada jaringan ini", "routed": "diarahkan melalui server", @@ -20,15 +20,15 @@ "message-received": "Pesan diterima dari {{name}} - Klik untuk menyalin", "rate-limit-join-key": "Batasan tercapai. Tunggu 10 detik dan coba lagi.", "connecting": "Menghubungkan…", - "pairing-key-invalidated": "Kunci {{key}} tidak valid", - "pairing-key-invalid": "Kunci tidak valid", + "pairing-key-invalidated": "Kunci {{key}} takvalid", + "pairing-key-invalid": "Kunci takvalid", "connected": "Tersambung", "pairing-not-persistent": "Perangkat dipasangkan tidak akan bertahan lama", "text-content-incorrect": "Isi teks keliru", "message-transfer-completed": "Transfer pesan selesai", - "file-transfer-completed": "Transfer file selesai", - "file-content-incorrect": "Isi file keliru", - "files-incorrect": "File tidak benar", + "file-transfer-completed": "Transfer berkas selesai", + "file-content-incorrect": "Isi berkas keliru", + "files-incorrect": "Berkas tidak benar", "selected-peer-left": "Rekan terpilih keluar", "link-received": "Tautan diterima dari {{name}} - Klik untuk membuka", "online": "Anda kembali online", @@ -43,17 +43,17 @@ "copied-to-clipboard": "Disalin ke papan klip", "offline": "Anda sedang offline", "pairing-tabs-error": "Memasangkan dua tab browser web tidak mungkin dilakukan", - "public-room-id-invalid": "Room ID tidak valid", + "public-room-id-invalid": "ID Ruang takvalid", "click-to-download": "Klik untuk mengunduh", "pairing-cleared": "Semua Perangkat dilepaskan", "notifications-enabled": "Notifikasi diaktifkan", "online-requirement-pairing": "Anda harus online untuk memasangkan perangkat", - "ios-memory-limit": "Mengirim file ke iOS hanya dapat dilakukan hingga 200 MB sekaligus", - "online-requirement-public-room": "Anda harus online untuk membuat ruang publik", + "ios-memory-limit": "Mengirim betkas ke iOS hanya dapat dilakukan hingga 200 MB sekaligus", + "online-requirement-public-room": "Anda harus terhubung ke jaringan internet untuk membuat ruang publik", "copied-text-error": "Menyalin ke papan klip gagal. Salinlah secara manual!", "download-successful": "{{descriptor}} diunduh", "click-to-show": "Klik untuk menampilkan", - "notifications-permissions-error": "Izin pemberitahuan telah diblokir karena pengguna telah mengabaikan permintaan izin beberapa kali. Hal ini dapat diatur ulang di Info Halaman yang dapat diakses dengan mengeklik ikon kunci di sebelah bar URL.", + "notifications-permissions-error": "Izin pemberitahuan telah diblokir karena pengguna telah mengabaikan permintaan izin beberapa kali. Hal ini dapat diatur ulang di Info Halaman yang dapat diakses dengan mengeklik ikon kunci di sebelah bilah URL.", "pair-url-copied-to-clipboard": "Tautan untuk memasangkan perangkat ini disalin ke papan klip", "room-url-copied-to-clipboard": "Tautan ke ruang publik disalin ke papan klip" }, @@ -74,27 +74,27 @@ "expand_title": "Perluas baris tombol header" }, "instructions": { - "x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan", + "x-instructions_mobile": "Ketuk untuk mengirim berkas atau ketuk lama untuk mengirim pesan", "x-instructions-share-mode_desktop": "Klik untuk mengirim {{descriptor}}", - "activate-share-mode-and-other-files-plural": "dan {{count}} file lainnya", + "activate-share-mode-and-other-files-plural": "dan {{count}} berkas lainnya", "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", - "x-instructions_desktop": "Klik untuk mengirim file atau klik kanan untuk mengirim pesan", - "no-peers-title": "Buka PairDrop di perangkat lain untuk berkirim file", + "x-instructions_desktop": "Klik untuk mengirim berkas atau klik kanan untuk mengirim pesan", + "no-peers-title": "Buka PairDrop di perangkat lain untuk berkirim berkas", "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", - "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", + "activate-share-mode-and-other-file": "dan 1 berkas lainnya", + "activate-share-mode-shared-file": "berkas yang dibagikan", + "activate-share-mode-shared-files-plural": "sebanyak {{count}} berkas dibagikan", "webrtc-requirement": "Untuk menggunakan instance PairDrop ini, WebRTC harus diaktifkan!" }, "peer-ui": { "processing": "Memproses…", "click-to-send-share-mode": "Klik untuk mengirim {{descriptor}}", - "click-to-send": "Klik untuk mengirim file atau klik kanan untuk mengirim pesan", + "click-to-send": "Klik untuk mengirim berkas atau klik kanan untuk mengirim pesan", "waiting": "Menunggu…", "connection-hash": "Untuk memverifikasi keamanan enkripsi end-to-end, bandingkan nomor keamanan ini pada kedua perangkat", "preparing": "Menyiapkan…", @@ -102,14 +102,14 @@ }, "dialogs": { "base64-paste-to-send": "Tempel salinan di sini untuk mengirim {{type}}", - "auto-accept-instructions-2": "untuk secara otomatis menerima semua file yang dikirim dari perangkat tersebut.", + "auto-accept-instructions-2": "untuk menerima semua berkas yang dikirim dari perangkat tersebut secara otomatis.", "receive-text-title": "Pesan Diterima", "edit-paired-devices-title": "Edit Perangkat yg. Dipasangkan", "cancel": "Batal", "auto-accept-instructions-1": "Aktifkan", "pair-devices-title": "Pasangkan Perangkat Scr. Permanen", "download": "Unduh", - "title-file": "File", + "title-file": "Berkas", "base64-processing": "Memproses…", "decline": "Tolak", "receive-title": "{{descriptor}} Diterima", @@ -122,14 +122,14 @@ "copy": "Salin", "file-other-description-image": "dan 1 gambar lainnya", "temporary-public-room-title": "Ruang Publik Sementara", - "base64-files": "file", + "base64-files": "berkas", "has-sent": "telah mengirim:", - "file-other-description-file": "dan 1 file lainnya", + "file-other-description-file": "dan 1 berkas lainnya", "close": "Tutup", "system-language": "Bahasa Sistem", "unpair": "Lepas", "title-image": "Gambar", - "file-other-description-file-plural": "dan {{count}} file lainnya", + "file-other-description-file-plural": "dan {{count}} berkas lainnya", "would-like-to-share": "ingin berbagi", "send-message-to": "Ke:", "language-selector-title": "Pilih Bahasa", @@ -142,27 +142,27 @@ "paired-devices-wrapper_data-empty": "Tak ada perangkat yg. dipasangkan.", "enter-key-from-another-device": "Masukkan kunci dari perangkat lain di sini.", "share": "Bagikan", - "auto-accept": "terima-otomatis", - "title-file-plural": "File", + "auto-accept": "terima scr. otomatis", + "title-file-plural": "Berkas", "send-message-title": "Kirim Pesan", - "input-room-id-on-another-device": "Masukkan room ID ini pada perangkat lain", + "input-room-id-on-another-device": "Masukkan ID ruang ini pada perangkat lain", "file-other-description-image-plural": "dan {{count}} gambar lainnya", - "enter-room-id-from-another-device": "Masukkan room ID dari perangkat lain untuk bergabung dengan room.", + "enter-room-id-from-another-device": "Masukkan ID ruang dari perangkat lain untuk bergabung.", "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", - "base64-title-files": "Bagikan File", + "base64-title-files": "Bagikan Berkas", "base64-title-text": "Bagikan Teks", "message_placeholder": "Teks", "paired-device-removed": "Perangkat yang dipasangkan telah dihapus.", - "approve": "menyetujui", - "share-text-title": "Kirim Pesan Teks", - "share-text-subtitle": "Edit pesan sebelum mengirim:", - "share-text-checkbox": "Selalu tampilkan dialog ini ketika mengirimkan teks", + "approve": "setujui", + "share-text-title": "Bagikan Pesan Teks", + "share-text-subtitle": "Ubah sebelum pesan dikirimkan:", + "share-text-checkbox": "Selalu tampilkan dialog ketika membagikan teks", "close-toast_title": "Tutup notifikasi" }, "about": { - "claim": "Cara termudah untuk mentransfer file lintas perangkat", + "claim": "Cara termudah untuk mentransfer berkas lintas perangkat", "tweet_title": "Tweet tentang PairDrop", "close-about_aria-label": "Tutup Tentang PairDrop", "buy-me-a-coffee_title": "Traktir aku kopi!", @@ -174,11 +174,11 @@ "privacypolicy_title": "Buka kebijakan privasi kami" }, "document-titles": { - "file-transfer-requested": "Permintaan Transfer File", + "file-transfer-requested": "Permintaan Pentransferan Berkas", "message-received-plural": "{{count}} Pesan Diterima", "message-received": "Pesan Diterima", - "file-received": "File Diterima", - "file-received-plural": "{{count}} File Diterima", + "file-received": "Berkas Diterima", + "file-received-plural": "Sebanyak {{count}} Berkas Diterima", "image-transfer-requested": "Permintaan Transfer Gambar" } } From 74dd692826993d5d06732abea6a71cce863b5326 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 21/77] Translated using Weblate (Norwegian Nynorsk) Currently translated at 100.0% (166 of 166 strings) Added translation using Weblate (Norwegian Nynorsk) Co-authored-by: Hosted Weblate Co-authored-by: Snubletunge Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nn/ Translation: PairDrop/pairdrop-spa --- public/lang/nn.json | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 public/lang/nn.json diff --git a/public/lang/nn.json b/public/lang/nn.json new file mode 100644 index 0000000..c27303a --- /dev/null +++ b/public/lang/nn.json @@ -0,0 +1,184 @@ +{ + "header": { + "language-selector_title": "Språk", + "theme-light_title": "Bruk alltid lyst tema", + "join-public-room_title": "Bli med i offentlege rom midlertidig", + "cancel-share-mode": "Avbryt", + "expand_title": "Utvid hovudknappelinja", + "about_aria-label": "Opne Om PairDrop", + "about_title": "Om PairDrop", + "theme-dark_title": "Bruk alltid mørkt tema", + "notification_title": "Slå på varslingar", + "install_title": "Installer PairDrop", + "pair-device_title": "Par einingane dine permanent", + "edit-paired-devices_title": "Rediger para einingar", + "edit-share-mode": "Rediger", + "theme-auto_title": "Endre tema til systemet automatisk" + }, + "instructions": { + "no-peers_data-drop-bg": "Slepp for å velje mottakar", + "no-peers-title": "Opne PairDrop på andre einingar for å sende filer", + "no-peers-subtitle": "Par einingar eller gå inn i eit offentleg rom for å bli søkbar på andre nettverk", + "x-instructions-share-mode_desktop": "Klikk for å sende {{descriptor}}", + "activate-share-mode-shared-file": "delt fil", + "x-instructions_desktop": "Klikk for å sende filer, eller høgreklikk for å sende ei melding", + "x-instructions_mobile": "Trykk for å sende filer eller trykk-og-hald for å sende ei melding", + "x-instructions_data-drop-peer": "Slepp for å sende til part", + "x-instructions_data-drop-bg": "Slepp for å sende til mottakar", + "x-instructions-share-mode_mobile": "Trykk for å sende {{descriptor}}", + "activate-share-mode-base": "Opne PairDrop på andre einingar for å sende", + "activate-share-mode-shared-text": "delt tekst", + "activate-share-mode-and-other-file": "og 1 anna fil", + "activate-share-mode-and-other-files-plural": "og {{count}} andre filer", + "activate-share-mode-shared-files-plural": "{{count}} delte filer", + "webrtc-requirement": "For å bruke denne PairDrop-økta, må WebRTC vere aktivt!" + }, + "footer": { + "on-this-network": "på dette nettverket", + "paired-devices": "med para einingar", + "paired-devices_title": "Du kan bli funnen av para einingar til ei kvar tid uavhengig av nettverket.", + "known-as": "Du er kjend som:", + "display-name_title": "Rediger einingsnamnet ditt permanent", + "discovery": "Du kan bli funnen:", + "traffic": "Trafikken er", + "public-room-devices": "i rom {{roomId}}", + "display-name_data-placeholder": "Lastar…", + "on-this-network_title": "Du kan bli funnen av alle på dette nettverket.", + "webrtc": "Om WebRTC ikkje er tilgjengeleg.", + "public-room-devices_title": "Du kan bli funnen av einingar i dette offentlege rommet uavhengig av nettverket.", + "routed": "ruta gjennom denne tenaren" + }, + "dialogs": { + "pair-devices-title": "Par einingar permanent", + "scan-qr-code": "eller skann QR-koden.", + "auto-accept-instructions-1": "Aktiver", + "auto-accept": "auto-aksepter", + "leave": "Forlat", + "would-like-to-share": "har lyst til å dele", + "accept": "Aksepter", + "share": "Del", + "message_title": "Legg inn meldinga du vil sende", + "message_placeholder": "Tekst", + "send": "Send", + "base64-title-files": "Dele filer", + "base64-text": "tekst", + "file-other-description-image": "og 1 anna bilete", + "file-other-description-file": "og 1 anna fil", + "title-image-plural": "Bilete", + "share-text-title": "Del tekstmelding", + "share-text-subtitle": "Rediger melding før sending:", + "share-text-checkbox": "Alltid vis denne dialogen når du delar tekst", + "pair": "Par", + "input-key-on-this-device": "Legg inn denne nøkkelen på ei anna eining", + "temporary-public-room-title": "Midlertidig offentleg rom", + "cancel": "Avbryt", + "has-sent": "har sendt:", + "enter-key-from-another-device": "Legg inn nøkkel frå anna eining her.", + "send-message-title": "Send melding", + "input-room-id-on-another-device": "Legg inn denne rom-identen på ei anna eining", + "enter-room-id-from-another-device": "Legg inn rom-ident frå anna eining for å bli med inn i rommet.", + "close": "Lukk", + "join": "Bli med", + "base64-title-text": "Dele tekst", + "hr-or": "ELLER", + "unpair": "Slett paring", + "send-message-to": "Til:", + "edit-paired-devices-title": "Rediger para einingar", + "paired-devices-wrapper_data-empty": "Ingen para einingar.", + "auto-accept-instructions-2": "for å automatisk akseptere alle filer som er sendt til denne eininga.", + "decline": "Avslå", + "download": "Last ned", + "receive-text-title": "Melding mottatt", + "file-other-description-image-plural": "og {{count}} andre bilete", + "copy": "Kopier", + "base64-processing": "Handsamar…", + "base64-files": "filer", + "language-selector-title": "Sett språk", + "system-language": "Systemspråk", + "base64-tap-to-paste": "Trykk her for å dele {{type}}", + "file-other-description-file-plural": "og {{count}} andre filer", + "base64-paste-to-send": "Lim inn her for å dele {{type}}", + "receive-title": "{{descriptor}} motteke", + "pair-devices-qr-code_title": "Klikk for å kopiere lenkje til å pare denne eininga", + "title-image": "Bilete", + "title-file": "Fil", + "title-file-plural": "Filer", + "download-again": "Last ned igjen", + "public-room-qr-code_title": "Klikk for å kopiere lenkje til offentleg rom", + "close-toast_title": "Lukk varslinga", + "approve": "godta", + "paired-device-removed": "Para eining har blitt fjerna." + }, + "about": { + "claim": "Den enklaste måten å sende filer mellom einingar", + "privacypolicy_title": "Opne personvernerklæringa vår", + "faq_title": "Ofte spurde spørsmål", + "close-about_aria-label": "Lukk Om PairDrop", + "buy-me-a-coffee_title": "Kjøp meg ein kaffi!", + "github_title": "PairDrop på GitHub", + "tweet_title": "Tvitre om PairDrop", + "mastodon_title": "Skriv om PairDrop på Masrodon", + "bluesky_title": "Følg oss på BlueSky", + "custom_title": "Følg oss" + }, + "notifications": { + "display-name-changed-permanently": "Profilnamnet er endra permanent", + "pairing-not-persistent": "Para einingar er ikkje vedvarande", + "pairing-success": "Einingane er para", + "pairing-key-invalidated": "Nøkkel {{key}} er oppheva", + "pairing-cleared": "Alle einingar er upara", + "public-room-left": "Forlot offentleg rom {{publicRoomId}}", + "pair-url-copied-to-clipboard": "Lenkje for å pare denne eininga er kopiert til utklyppstavla", + "room-url-copied-to-clipboard": "Lenkje til offentleg rom er kopiert til utklyppstavla", + "clipboard-content-incorrect": "Utklyppstavle-innhald er ikkje rett", + "notifications-enabled": "Varslingar skrudd på", + "link-received": "Lenkje motteke av {{name}} - Klikk for å opne", + "click-to-download": "Klikk for å laste ned", + "click-to-show": "Klikk for å vise", + "online": "Du er tilkopla igjen", + "connected": "Tilkopla", + "copied-text": "Kopiert tekst til utklyppstavla", + "online-requirement-public-room": "Du må vere tilkopla for å lage eit offentleg rom", + "files-incorrect": "Filene er feil", + "file-transfer-completed": "Filoverføring er fullført", + "ios-memory-limit": "Sending av filer til iOS er berre mogleg opp til 200 MB på ein gong", + "rate-limit-join-key": "Grense nådd. Vent 10 sekund og prøv om att.", + "selected-peer-left": "Vald brukar har forlatt", + "copied-text-error": "Skriving til utklyppsverktøy feila, kopier manuelt!", + "connecting": "Koplar til…", + "offline": "Du er ikkje tilkopla", + "online-requirement-pairing": "Du må vere tilkopla for å pare einingar", + "message-transfer-completed": "Meldingsoverføring er ferdig", + "unfinished-transfers-warning": "Det er uferdige overføringar. Er du sikker på at du vil late att PairDrop?", + "display-name-changed-temporarily": "Profilnamnet er endra for denne sesjonen", + "display-name-random-again": "Profilnamnet er tilfeldig generert igjen", + "download-successful": "{{descriptor}} lasta ned", + "pairing-tabs-error": "Å pare to nettleser-faner er ikkje mogleg", + "pairing-key-invalid": "Ugyldig nøkkel", + "public-room-id-invalid": "Ugyldig rom-ident", + "copied-to-clipboard": "Kopiert til utklyppstavle", + "copied-to-clipboard-error": "Kopiering ikkje mogleg. Kopier manuelt.", + "text-content-incorrect": "Tekstinnhald er feil", + "file-content-incorrect": "Filinnhald er ikkje rett", + "notifications-permissions-error": "Varslingstillatelse er blokkert fordi brukaren har avvist tillatelsesførespurnaden fleire gonger. Dette kan stillast tilbake i Sideinformasjon, som kan opnast ved å klikke på låsikonet ved sida av URL-feltet.", + "message-received": "Melding motteke av {{name}} - Klikk for å kopiere", + "request-title": "{{name}} vil overføre {{count}} {{descriptor}}" + }, + "document-titles": { + "file-received": "Fil mottatt", + "image-transfer-requested": "Biletoverføring førespurd", + "file-received-plural": "{{count}} Filer Mottatt", + "message-received-plural": "{{count}} Meldingar motteke", + "file-transfer-requested": "Filoverføring førespurd", + "message-received": "Melding mottatt" + }, + "peer-ui": { + "connection-hash": "For å verifisere sikkerheita til ende-til-ende krypteringa, samanlikn dette sikkerheitsnummeret på begge einingane", + "preparing": "Førebur…", + "transferring": "Overfører…", + "click-to-send-share-mode": "Klikk for å sende {{descriptor}}", + "click-to-send": "Klikk for å sende filer eller høgreklikk for å sende ei melding", + "processing": "Prosesserar…", + "waiting": "Ventar…" + } +} From 25da925064b0fa184ee08d00407e24d925273bc0 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 22/77] Translated using Weblate (Persian) Currently translated at 100.0% (166 of 166 strings) Translated using Weblate (Persian) Currently translated at 21.0% (35 of 166 strings) Added translation using Weblate (Persian) Co-authored-by: Alireza Rashidi Co-authored-by: Hosted Weblate Co-authored-by: Mostafa Ahangarha Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fa/ Translation: PairDrop/pairdrop-spa --- public/lang/fa.json | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 public/lang/fa.json diff --git a/public/lang/fa.json b/public/lang/fa.json new file mode 100644 index 0000000..6b6ea14 --- /dev/null +++ b/public/lang/fa.json @@ -0,0 +1,184 @@ +{ + "header": { + "theme-light_title": "همیشه از پوسته روشن استفاده شود", + "theme-dark_title": "همیشه از پوسته تیره استفاده شود", + "install_title": "نصب پیردراپ", + "cancel-share-mode": "لغو", + "edit-share-mode": "ویرایش", + "expand_title": "گسترش ردیف دکمه سرایند", + "about_title": "درباره پیردراپ", + "language-selector_title": "تنظیم زبان", + "theme-auto_title": "همسان‌سازی خودکار پوسته با سامانه", + "notification_title": "فعال‌سازی آگاهی‌ها", + "pair-device_title": "جفت‌کردن دائمی دستگاه‌های‌تان", + "join-public-room_title": "پیوستن موقتی به اتاق عمومی", + "edit-paired-devices_title": "ویرایش دستگاه‌های جفت‌شده", + "about_aria-label": "باز کردن درباره پیردراپ" + }, + "instructions": { + "no-peers-title": "برای فرستادن پرونده‌ها، پیردراپ را روی دستگاه‌های دیگر باز کنید", + "no-peers-subtitle": "دستگاه‌ها را جفت کنید و یا با پیوستن به اتاق عمومی، روی دیگر شبکه‌ها قابل شناسایی شوید", + "x-instructions_mobile": "برای فرستادن پرونده‌ها کلیک کنید یا با لمس طولانی، پیامی بفرستید", + "x-instructions_data-drop-bg": "با رهاکردن، دریافت‌کننده را انتخاب کنید", + "x-instructions-share-mode_desktop": "برای فرستادن {{descriptor}} کلیک کنید", + "x-instructions-share-mode_mobile": "برای فرستادن {{descriptor}} ضربه بزنید", + "activate-share-mode-base": "برای فرستادن، پیردراپ را روی دستگاه‌های دیگر باز کنید", + "activate-share-mode-and-other-file": "و یک پرونده دیگر", + "activate-share-mode-and-other-files-plural": "و {{count}} پرونده دیگر", + "activate-share-mode-shared-file": "پرونده هم‌رسانی شده", + "activate-share-mode-shared-text": "متن هم‌رسانی شده", + "activate-share-mode-shared-files-plural": "{{count}} پرونده هم‌رسانی شده", + "webrtc-requirement": "برای استفاده از این نمونه پیردراپ بایستی WebRTC فعال باشد!", + "x-instructions_data-drop-peer": "با رهاکردن، پرونده را بفرستید", + "x-instructions_desktop": "برای فرستادن پرونده‌ها کلیک کرده و یا با کلیک راست، پیامی بفرستید", + "no-peers_data-drop-bg": "با رهاکردن، دریافت‌کننده را انتخاب کنید" + }, + "footer": { + "known-as": "شما به این عنوان شناخته می‌شوید:", + "display-name_data-placeholder": "در حال بار شدن…", + "display-name_title": "ویرایش دائمی نام دستگاه شما", + "discovery": "قابل شناسایی هستید:", + "on-this-network": "روی این شبکه", + "paired-devices": "توسط دستگاه‌های جفت‌شده", + "on-this-network_title": "شما توسط همه افراد این شبکه قابل شناسایی هستید.", + "paired-devices_title": "شما در هر زمان فارق از شبکه، توسط دستگاه‌های جفت‌شده قابل شناسایی هستید.", + "public-room-devices": "در اتاق {{roomId}}", + "public-room-devices_title": "شما در این اتاق عمومی فارق از شبکه، توسط دستگاه‌ها قابل شناسایی هستید.", + "traffic": "ترافیک", + "routed": "از طریق کارساز(سرور) مسیریابی می‌شود", + "webrtc": "اگر WebRTC در دسترس نیست." + }, + "dialogs": { + "accept": "پذیرفتن", + "message_placeholder": "متن", + "send": "ارسال", + "base64-files": "پرونده‌ها", + "file-other-description-image": "و 1 تصویر دیگر", + "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": "همیشه این پیام را هنگام هم‌رسانی متن نشان دهید", + "close-toast_title": "بستن اعلان", + "pair-devices-title": "جفت‌کردن دستگاه‌ها به‌طور دائمی", + "input-key-on-this-device": "این کلید را روی دستگاه دیگر وارد کنید", + "scan-qr-code": "یا رمزینه QR را بررسی کنید.", + "enter-key-from-another-device": "کلید را از دستگاه دیگر اینجا وارد کنید.", + "temporary-public-room-title": "اتاق عمومی موقتی", + "input-room-id-on-another-device": "این شناسه اتاق را روی دستگاه دیگر وارد کنید", + "enter-room-id-from-another-device": "شناسه اتاق را از دستگاه دیگر وارد کنید تا به اتاق بپیوندید.", + "hr-or": "یا", + "pair": "جفت‌کردن", + "cancel": "لغو", + "unpair": "جدا کردن", + "paired-device-removed": "دستگاه جفت‌شده حذف شد.", + "paired-devices-wrapper_data-empty": "هیچ دستگاه جفت‌شده‌ای وجود ندارد.", + "auto-accept-instructions-1": "فعال‌سازی", + "auto-accept": "پذیرش خودکار", + "auto-accept-instructions-2": "تا به‌طور خودکار تمام پرونده‌های ارسال شده از آن دستگاه را بپذیرید.", + "close": "بستن", + "join": "پیوستن", + "leave": "ترک", + "would-like-to-share": "می خواهم به اشتراک بگذارم", + "edit-paired-devices-title": "ویرایش دستگاه‌های جفت‌شده", + "decline": "رد کردن", + "has-sent": "ارسال کرده است:", + "share": "هم‌رسانی", + "download": "دریافت", + "send-message-title": "ارسال پیام", + "send-message-to": "به:", + "message_title": "متن پیام را وارد کنید", + "receive-text-title": "پیام دریافت شد", + "copy": "رونوشت", + "base64-title-files": "هم‌رسانی پرونده‌ها", + "base64-title-text": "هم‌رسانی متن", + "base64-processing": "در حال پردازش…", + "base64-tap-to-paste": "برای هم‌رسانی {{type}} اینجا ضربه بزنید", + "base64-paste-to-send": "برای هم‌رسانی {{type}} اینجا کلیک راست کنید", + "base64-text": "متن", + "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": "دوباره دریافت کنید" + }, + "about": { + "close-about_aria-label": "بستن درباره پیردراپ", + "claim": "ساده‌ترین راه برای انتقال پرونده‌ها بین دستگاه‌ها", + "github_title": "پیردراپ در گیت‌هاب", + "buy-me-a-coffee_title": "برای من قهوه بخرید!", + "tweet_title": "در مورد پیردراپ توییت کنید", + "mastodon_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-tabs-error": "جفت‌کردن دو تب مرورگر وب ممکن نیست", + "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": "محتوای پرونده نادرست است", + "online": "شما دوباره برخط هستید", + "connected": "متصل شد", + "online-requirement-pairing": "شما باید برخط باشید تا دستگاه‌ها را جفت کنید", + "online-requirement-public-room": "شما باید برخط باشید تا اتاق عمومی ایجاد کنید", + "unfinished-transfers-warning": "انتقال‌های ناتمام وجود دارد. آیا مطمئن هستید که می‌خواهید پیردراپ را ببندید؟", + "rate-limit-join-key": "محدودیت نرخ رسید. 10 ثانیه صبر کنید و دوباره تلاش کنید.", + "selected-peer-left": "همتای انتخاب شده ترک کرد", + "notifications-permissions-error": "مجوز آگاهی‌ها به دلیل اینکه کاربر چندین بار پنجره مجوز را رد کرده است، مسدود شده. این می‌تواند در اطلاعات صفحه که با کلیک بر روی نماد قفل در کنار نوار URL قابل دسترسی است، بازنشانی شود.", + "clipboard-content-incorrect": "محتوای بُریده‏دان نادرست است", + "link-received": "پیوند از {{name}} دریافت شد - برای باز کردن کلیک کنید", + "notifications-enabled": "آگاهی‌ها فعال شدند", + "click-to-show": "برای نمایش کلیک کنید", + "message-received": "پیام از {{name}} دریافت شد - برای رونوشت کردن کلیک کنید", + "click-to-download": "برای دریافت کلیک کنید", + "request-title": "{{name}} می‌خواهد {{count}} {{descriptor}} را منتقل کند", + "copied-text": "متن به بُریده‏دان رونوشت شد", + "copied-text-error": "نوشتن به بُریده‏دان ناموفق بود. به‌صورت دستی رونوشت کنید!", + "offline": "شما برون‌خط هستید", + "connecting": "در حال اتصال…", + "files-incorrect": "پرونده‌ها نادرست هستند", + "file-transfer-completed": "انتقال پرونده کامل شد", + "ios-memory-limit": "ارسال پرونده‌ها به iOS فقط تا 200 مگابایت در یک بار ممکن است", + "message-transfer-completed": "انتقال پیام کامل شد" + }, + "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": "برای ارسال پرونده‌ها کلیک کنید یا با کلیک راست، پیامی بفرستید", + "connection-hash": "برای اثبات امنیت رمزگذاری انتها به انتها، این شماره امنیتی را در هر دو دستگاه مقایسه کنید", + "preparing": "در حال آماده‌سازی…", + "waiting": "در حال انتظار…", + "processing": "در حال پردازش…", + "transferring": "در حال انتقال…" + } +} From 84b3c7d68b12ac8d5939ce964cc052d359ea099e Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 23/77] Translated using Weblate (Finnish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 9.6% (16 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: Jaakko Rantamäki Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/fi/ Translation: PairDrop/pairdrop-spa --- public/lang/fi.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/public/lang/fi.json b/public/lang/fi.json index 0967ef4..36de29d 100644 --- a/public/lang/fi.json +++ b/public/lang/fi.json @@ -1 +1,22 @@ -{} +{ + "header": { + "about_title": "Tietoja PairDropista", + "language-selector_title": "Valitse kieli", + "about_aria-label": "Avaa tietoja PairDropista", + "theme-auto_title": "Käytä samaa teemaa kuin järjestelmä", + "theme-light_title": "Käytä aina vaaleaa teemaa", + "theme-dark_title": "Käytä aina tummaa teemaa", + "notification_title": "Laita ilmoitukset päälle", + "install_title": "Asenna PairDrop", + "pair-device_title": "Yhdistä laitteesi pysyvästi", + "edit-paired-devices_title": "Muokkaa yhdistettyjä laitteita", + "join-public-room_title": "Liity julkiseen huoneeseen väliaikaisesti", + "cancel-share-mode": "Peruuta", + "edit-share-mode": "Muokkaa" + }, + "instructions": { + "no-peers-title": "Avaa PairDrop muilla laitteilla lähettääksesi tiedostoja", + "no-peers-subtitle": "Yhdistä laite tai liity julkiseen huoneeseen, jotta olet löydettävissä muissa verkoissa", + "x-instructions_desktop": "Paina lähettääksesi tiedoston tai klikkaa oikealla painikkeella lähettääksesi viestin" + } +} From 7067aceafee2b3b4e16469e32fabcfe7f189521a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 24/77] Translated using Weblate (Korean) Currently translated at 99.3% (165 of 166 strings) Translated using Weblate (Korean) Currently translated at 14.4% (24 of 166 strings) Co-authored-by: Alanimdeo Co-authored-by: Hosted Weblate Co-authored-by: Kim Tae Kyeong Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ko/ Translation: PairDrop/pairdrop-spa --- public/lang/ko.json | 159 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 157 insertions(+), 2 deletions(-) diff --git a/public/lang/ko.json b/public/lang/ko.json index d367ce7..c3477b6 100644 --- a/public/lang/ko.json +++ b/public/lang/ko.json @@ -13,7 +13,7 @@ "cancel-share-mode": "취소", "edit-share-mode": "편집", "pair-device_title": "영구적으로 기기 연결하기", - "expand_title": "머리글 버튼 행 펼치기" + "expand_title": "헤더 버튼 펼치기" }, "instructions": { "no-peers-subtitle": "장치를 연결하거나 공개 방에 들어가 다른 네트워크에서 검색 가능하게 하세요", @@ -24,6 +24,161 @@ "x-instructions_data-drop-bg": "해제하여 수신자 선택하기", "x-instructions-share-mode_desktop": "클릭하여 {{descriptor}} 보내기", "x-instructions-share-mode_mobile": "탭하여 {{descriptor}} 보내기", - "activate-share-mode-base": "다른 기기에서 PairDrop을 열어 보내기" + "activate-share-mode-base": "다른 기기에서 PairDrop을 열어 보내기", + "activate-share-mode-and-other-files-plural": "이외 {{count}}개의 다른 파일", + "activate-share-mode-and-other-file": "이외 1개의 다른 파일", + "x-instructions_data-drop-peer": "놓아서 피어에게 보내기", + "activate-share-mode-shared-text": "공유된 텍스트", + "activate-share-mode-shared-file": "공유된 파일", + "activate-share-mode-shared-files-plural": "공유된 파일 {{count}}개", + "webrtc-requirement": "PairDrop 인스턴스를 사용하려면 WebRTC가 활성화되어야 합니다!" + }, + "dialogs": { + "base64-processing": "처리 중…", + "file-other-description-file": "그리고 파일 1개", + "pair-devices-title": "영구적으로 기기 페어링하기", + "input-key-on-this-device": "이 키를 다른 장치에서 입력하거나", + "scan-qr-code": "QR 코드를 스캔하세요.", + "enter-key-from-another-device": "다른 장치의 키를 여기에 입력하세요.", + "temporary-public-room-title": "임시 공개 방", + "input-room-id-on-another-device": "이 방 ID를 다른 기기에서 입력하세요", + "enter-room-id-from-another-device": "방에 참가하려면 다른 장치에 표시된 방 ID를 입력하세요.", + "hr-or": "또는", + "pair": "페어링", + "cancel": "취소", + "edit-paired-devices-title": "페어링된 장치 관리", + "unpair": "페어링 해제", + "paired-device-removed": "페어링된 장치가 제거되었습니다.", + "paired-devices-wrapper_data-empty": "페어링된 장치가 없습니다.", + "auto-accept": "자동 수신", + "auto-accept-instructions-1": "", + "auto-accept-instructions-2": "을 활성화하여 이 장치에서 보내는 모든 파일을 자동으로 수신하세요.", + "close": "닫기", + "join": "참가", + "leave": "퇴장", + "would-like-to-share": "님이 아래 내용을 공유하고 싶어합니다", + "accept": "수락", + "decline": "거절", + "has-sent": "님이 보냄:", + "share": "공유", + "download": "다운로드", + "send-message-title": "메시지 전송", + "send-message-to": "받는 사람:", + "message_title": "보낼 메시지를 입력하세요", + "message_placeholder": "텍스트", + "send": "전송", + "receive-text-title": "메시지 받음", + "copy": "복사", + "base64-title-files": "파일 공유", + "base64-title-text": "텍스트 공유", + "base64-tap-to-paste": "여기를 눌러 {{type}}을(를) 공유하세요", + "base64-paste-to-send": "여기에 클립보드에서 붙여넣어 {{type}}을(를) 공유하세요", + "base64-text": "텍스트", + "base64-files": "파일", + "file-other-description-image": "그리고 이미지 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": "클릭하여 이 장치와 페어링할 수 있는 링크를 복사하세요", + "share-text-title": "텍스트 메시지 공유", + "approve": "확인", + "share-text-subtitle": "보내기 전에 메시지 수정:", + "share-text-checkbox": "텍스트를 공유하기 전에 항상 이 창 띄우기", + "close-toast_title": "알림 닫기" + }, + "notifications": { + "pairing-tabs-error": "브라우저 탭 2개를 페어링할 수 없습니다", + "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": "유효하지 않은 방 ID입니다", + "public-room-left": "공개 방 {{publicRoomId}}에서 퇴장했습니다", + "copied-to-clipboard": "클립보드에 복사했습니다", + "pair-url-copied-to-clipboard": "이 장치와 페어링할 수 있는 링크를 복사했습니다", + "copied-to-clipboard-error": "복사하지 못했습니다. 직접 복사하세요.", + "text-content-incorrect": "텍스트가 올바르지 않습니다", + "file-content-incorrect": "파일이 올바르지 않습니다", + "clipboard-content-incorrect": "클립보드 내용이 올바르지 않습니다", + "room-url-copied-to-clipboard": "공개 방 링크를 클립보드에 복사했습니다", + "notifications-permissions-error": "권한 요청을 거부하여 알림을 사용할 수 없습니다. 주소 바 옆 자물쇠 아이콘의 페이지 설정에서 초기화할 수 있습니다.", + "notifications-enabled": "알림을 켰습니다", + "link-received": "{{name}} 님이 보낸 링크 - 클릭하여 열어 보세요", + "message-received": "{{name}} 님이 보낸 메시지 - 클릭하여 복사하세요", + "click-to-download": "클릭하여 다운로드하세요", + "request-title": "{{name}} 님이 {{count}}개의 {{descriptor}}을(를) 보내고 싶어합니다", + "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": "선택한 장치가 퇴장하였습니다" + }, + "footer": { + "known-as": "당신의 이름:", + "display-name_data-placeholder": "불러오는 중…", + "display-name_title": "기기 이름 영구적으로 설정하기", + "discovery": "아래에서 발견 가능:", + "on-this-network": "이 네트워크", + "on-this-network_title": "이 네트워크에 있는 모든 사람에게 발견될 수 있습니다.", + "paired-devices": "페어링된 기기", + "paired-devices_title": "네트워크에 관계 없이 항상 페어링된 기기에서 발견될 수 있습니다.", + "public-room-devices": "방 {{roomId}}", + "public-room-devices_title": "네트워크에 관계 없이 이 공개 방에 있는 모든 기기에서 발견될 수 있습니다.", + "traffic": "WebRTC가 사용 불가능한 경우", + "routed": "트래픽이", + "webrtc": "서버를 경유합니다." + }, + "about": { + "close-about_aria-label": "PairDrop에 대하여 닫기", + "claim": "기기 간 파일을 주고받는 가장 쉬운 방법", + "github_title": "GitHub의 PairDrop", + "buy-me-a-coffee_title": "Buy me a coffee!", + "tweet_title": "PairDrop에 대해 트윗하기", + "mastodon_title": "PairDrop에 대해 Mastodon에 글 남기기", + "bluesky_title": "BlueSky에서 팔로우하기", + "custom_title": "팔로우하기", + "privacypolicy_title": "개인정보처리방침 열기", + "faq_title": "자주 묻는 질문" + }, + "document-titles": { + "file-received": "파일 받음", + "file-transfer-requested": "파일 전송 요청 받음", + "image-transfer-requested": "이미지 전송 요청 받음", + "message-received": "메시지 받음", + "message-received-plural": "메시지 {{count}}개 받음", + "file-received-plural": "파일 {{count}}개 받음" + }, + "peer-ui": { + "click-to-send-share-mode": "클릭하여 {{descriptor}} 전송하기", + "click-to-send": "클릭하여 파일을 보내거나 오른쪽 클릭하여 메시지 보내기", + "waiting": "대기 중…", + "processing": "처리 중…", + "connection-hash": "종단간 암호화의 보안을 검증하려면 양쪽의 장치에서 이 보안 번호를 비교하세요", + "preparing": "준비 중…", + "transferring": "전송 중…" } } From e3e37a6b77ea18eea086007bf344da4ca903e2ab Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 25/77] Translated using Weblate (Slovak) Currently translated at 100.0% (166 of 166 strings) Translated using Weblate (Slovak) Currently translated at 95.1% (158 of 166 strings) Translated using Weblate (Slovak) Currently translated at 81.3% (135 of 166 strings) Translated using Weblate (Slovak) Currently translated at 18.6% (31 of 166 strings) Added translation using Weblate (Slovak) Co-authored-by: Hosted Weblate Co-authored-by: Kuko Co-authored-by: Martin Sojka Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/sk/ Translation: PairDrop/pairdrop-spa --- public/lang/sk.json | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 public/lang/sk.json diff --git a/public/lang/sk.json b/public/lang/sk.json new file mode 100644 index 0000000..ae1b5e5 --- /dev/null +++ b/public/lang/sk.json @@ -0,0 +1,184 @@ +{ + "header": { + "install_title": "Nainštalovať PairDrop", + "about_title": "O službe PairDrop", + "language-selector_title": "Nastaviť jazyk", + "about_aria-label": "Otvoriť \"O službe PairDrop\"", + "theme-auto_title": "Automaticky prispôsobiť tému systému", + "edit-share-mode": "Upraviť", + "expand_title": "Rozbaliť riadok tlačítka záhlavia", + "theme-light_title": "Vždy použiť svetlú tému", + "theme-dark_title": "Vždy použiť tmavú tému", + "notification_title": "Povoliť upozornenia", + "pair-device_title": "Spárovať zariadenia natrvalo", + "edit-paired-devices_title": "Upraviť spárované zariadenia", + "join-public-room_title": "Dočasne sa pripojiť k verejnej miestnosti", + "cancel-share-mode": "Zrušiť" + }, + "instructions": { + "no-peers_data-drop-bg": "Pustite pre vybratie príjemcu", + "no-peers-title": "Otvorte PairDrop na iných zariadeniach pre posielanie súborov", + "x-instructions_desktop": "Kliknite pre poslanie súborov alebo kliknite pravým tlačidlom pre poslanie správy", + "x-instructions_data-drop-peer": "Pustite pre odoslanie", + "x-instructions_data-drop-bg": "Pustením vyberiete príjemcu", + "activate-share-mode-and-other-file": "a 1 ďalší súbor", + "activate-share-mode-and-other-files-plural": "a {{count}} ďalších súborov", + "activate-share-mode-shared-text": "zdieľaný text", + "activate-share-mode-shared-file": "zdieľaný súbor", + "activate-share-mode-shared-files-plural": "{{count}} zdieľaných súborov", + "no-peers-subtitle": "Spárujte zariadenia alebo vstúpte do verejnej miestnosti pre viditeľnosť v iných sieťach", + "x-instructions_mobile": "Ťuknite pre poslanie súboru alebo podržte pre poslanie správy", + "webrtc-requirement": "Pre použitie PairDrop-u je nevyhnutné povoliť WebRTC!", + "x-instructions-share-mode_desktop": "Kliknutím odošlete {{descriptor}}", + "x-instructions-share-mode_mobile": "Ťuknutím odošlete {{descriptor}}", + "activate-share-mode-base": "Pre odoslanie otvorte PairDrop na iných zariadeniach" + }, + "footer": { + "known-as": "Si pomenovaný ako:", + "display-name_data-placeholder": "Načítava sa…", + "display-name_title": "Trvalo upraviť názov zariadenia", + "discovery": "Môžeš byť objevený:", + "on-this-network": "v tejto sieti", + "on-this-network_title": "Ste viditeľný pre kohokoľvek v tejto sieti.", + "paired-devices_title": "Pre spárované zariadenia ste viditeľný vždy, nezávisle od siete.", + "public-room-devices": "v miestnosti {{roomId}}", + "paired-devices": "pomocou spárovaných zariadení", + "public-room-devices_title": "Môžeš byť objavený zariadeniami v tejto verejnej miestnosti. Nezávisle od siete, ku ktorej si pripojený.", + "traffic": "Premávka je", + "routed": "presmerovaný cez server", + "webrtc": "ak WebRTC nie je k dispozícii." + }, + "dialogs": { + "base64-title-text": "Zdielať text", + "base64-text": "text", + "send": "Odoslať", + "public-room-qr-code_title": "Kliknutím skopíruješ odkaz do verejnej miestnosti", + "pair-devices-title": "Spáruj zariadenia natrvalo", + "temporary-public-room-title": "Dočasná verejná miestnosť", + "input-key-on-this-device": "Zadaj tento kľúč na druhom zariadení", + "input-room-id-on-another-device": "Zadaj toto ID miestnosti na druhom zariadení", + "scan-qr-code": "alebo naskenuj QR kód.", + "enter-key-from-another-device": "Vlož kľúč z druhého zariadenia.", + "enter-room-id-from-another-device": "Na pripojenie k miestnosti, zadaj ID miestnosti druhého zariadenia.", + "hr-or": "ALEBO", + "pair": "Spárovať", + "cancel": "Zrušiť", + "edit-paired-devices-title": "Upraviť spárované zariadenia", + "unpair": "Zrušiť spárovanie", + "paired-device-removed": "Spárované zariadenie bolo odstránené.", + "paired-devices-wrapper_data-empty": "Žiadne spárované zariadenie.", + "auto-accept-instructions-1": "Aktivovať", + "auto-accept": "Automaticky prijať", + "auto-accept-instructions-2": "Automaticky príjmeš všetky súbory odoslané z tohto zariadenia.", + "close": "Zavrieť", + "send-message-title": "Poslať správu", + "send-message-to": "Komu:", + "join": "Pripojiť", + "leave": "Odpojiť", + "would-like-to-share": "by rád zdieľal", + "accept": "Prijať", + "decline": "Odmietnuť", + "has-sent": "odoslal:", + "share": "Zdielať", + "download": "Stiahnuť", + "message_placeholder": "Text", + "message_title": "Sem vlož správu", + "copy": "Kopírovať", + "base64-title-files": "Zdielať súbory", + "base64-processing": "Pracujem…", + "base64-tap-to-paste": "Ťuknutím sem zdieľaj {{type}}", + "base64-paste-to-send": "Tu vlož obsah schránky, ak ho chceš zdielať {{type}}", + "base64-files": "súbory", + "file-other-description-image": "a 1 ďalší obrázok", + "file-other-description-file": "a 1 ďalší súbor", + "file-other-description-image-plural": "a {{count}} ďalších obrázkov", + "file-other-description-file-plural": "a {{count}} ďalších súborov", + "title-image": "Obrázok", + "title-file": "Súbor", + "title-image-plural": "Obrázky", + "title-file-plural": "Súbory", + "receive-title": "{{descriptor}} Prijaté", + "download-again": "Stiahnuť znova", + "language-selector-title": "Nastaviť jazyk", + "system-language": "Jazyk systému", + "pair-devices-qr-code_title": "Kliknutím skopíruješ odkaz pre spárovanie tohto zariadenia", + "approve": "schváliť", + "share-text-title": "Zdielať textovú správu", + "share-text-subtitle": "Upraviť správu pred odoslaním:", + "share-text-checkbox": "Pri zdieľaní textu vždy zobraziť tento dialóg", + "close-toast_title": "Zavrieť oznámenie", + "receive-text-title": "Správa prijatá" + }, + "notifications": { + "text-content-incorrect": "Obsah textu je chybný", + "clipboard-content-incorrect": "Obsah schránky je chybný", + "display-name-random-again": "Zobrazované meno je opäť generované náhodne", + "pairing-key-invalid": "Neplatný kľúč", + "pair-url-copied-to-clipboard": "Odkaz pre spárovanie tohto zariadenia bol skopírovaný do schránky", + "display-name-changed-permanently": "Zobrazované meno je trvalo zmenené", + "display-name-changed-temporarily": "Zobrazované meno je zmenené len pre túto reláciu", + "download-successful": "{{descriptor}} stiahnuté", + "file-content-incorrect": "Obsah súboru je chybný", + "pairing-tabs-error": "Spárovanie dvoch kariet web prehliadača nie je možné", + "pairing-success": "Zariadenia spárované", + "pairing-not-persistent": "Spárované zariadenie nie sú trvalé", + "pairing-key-invalidated": "Kľúč {{key}} už je neplatný", + "pairing-cleared": "Všetky zariadenia sú nespárované", + "public-room-id-invalid": "Chybné ID miestnosti", + "public-room-left": "Verejná miestnosť {{publicRoomId}} opustená", + "copied-to-clipboard": "Skopírované do schránky", + "room-url-copied-to-clipboard": "Odkaz do verejnej miestnosti bol skopírovaný do schránky", + "copied-to-clipboard-error": "Kopírovanie nie je možné. Skopíruj ručne.", + "notifications-enabled": "Oznámenia zapnuté", + "click-to-download": "Kliknutím stiahneš", + "request-title": "{{name}} chce poslať {{count}} {{descriptor}}", + "click-to-show": "Kliknutím zobrazíš", + "copied-text": "Text bol skopírovaný do schránky", + "link-received": "Odkaz prijatý od {{name}} – kliknutím otvoríš", + "message-received": "Správa prijatá od {{name}} – kliknutím skopíruješ", + "copied-text-error": "Kopírovanie do schránky zlyhalo. Skopíruj ručne!", + "offline": "Si offline", + "online": "Opäť si online", + "connected": "Pripojené", + "online-requirement-pairing": "Pre párovanie zariadení musíš byť online", + "online-requirement-public-room": "Pre vytvorenie miestnosti musíš byť online", + "connecting": "Pripájam…", + "files-incorrect": "Súbory sú chybné", + "file-transfer-completed": "Prenos súboru dokončený", + "ios-memory-limit": "Odosielanie súborov do iOS je možné len do veľkosti 200 MB", + "message-transfer-completed": "Správa odoslaná", + "unfinished-transfers-warning": "Máš nedokončené prenosy. Naozaj chceš zavrieť PairDrop?", + "rate-limit-join-key": "Dosiahol si limit. Počkaj 10 sekúnd a skús znovu.", + "selected-peer-left": "Vybraný užívateľ sa odpojil", + "notifications-permissions-error": "Notifikačné oprávnenie bolo zablokované, keďže užívateľ niekoľkokrát odmietol notifikačnú výzvu. Toto sa dá resetovat v nastavení webu, po kliknutí na ikonu zámku pri URL paneli." + }, + "about": { + "github_title": "PairDrop na GitHube", + "claim": "Jednoduchý spôsob posielania súborov medzi zariadeniami", + "buy-me-a-coffee_title": "Kúp mi kávičku!", + "tweet_title": "Tweetuj o PairDrop", + "mastodon_title": "Napíš o PairDrop na Mastodon", + "bluesky_title": "Sleduj nás na BlueSky", + "custom_title": "Sleduj nás", + "privacypolicy_title": "Naše zásady o ochrane súkromia", + "faq_title": "Často kladené otázky", + "close-about_aria-label": "Zatvoriť \"O službe PairDrop\"" + }, + "document-titles": { + "file-received": "Súbor prijatý", + "file-received-plural": "Počet prijatých súborov: {{count}}", + "file-transfer-requested": "Prenos súboru vyžiadaný", + "image-transfer-requested": "Prenos obrázku vyžiadaný", + "message-received": "Správa prijatá", + "message-received-plural": "Počet prijatých správ: {{count}}" + }, + "peer-ui": { + "click-to-send-share-mode": "Kliknutím odošleš {{descriptor}}", + "click-to-send": "Kliknutím odošleš súbory alebo pravým kliknutím odošleš správu", + "connection-hash": "Na overenie bezpečnosti end-to-end šifrovania, porovnaj toto číslo na oboch zariadeniach", + "preparing": "Pripravujem…", + "waiting": "Čakám…", + "processing": "Pracujem…", + "transferring": "Prenášam…" + } +} From 5f4b77bb8f789a5c5a55d0c1502ac51aff38eae5 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Feb 2025 10:02:39 +0100 Subject: [PATCH 26/77] Translated using Weblate (Kabyle) Currently translated at 17.4% (29 of 166 strings) Added translation using Weblate (Kabyle) Co-authored-by: ButterflyOfFire Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/kab/ Translation: PairDrop/pairdrop-spa --- public/lang/kab.json | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 public/lang/kab.json diff --git a/public/lang/kab.json b/public/lang/kab.json new file mode 100644 index 0000000..7f4e969 --- /dev/null +++ b/public/lang/kab.json @@ -0,0 +1,39 @@ +{ + "dialogs": { + "message_placeholder": "Aḍris", + "send-message-title": "Azen izen", + "copy": "Nɣel", + "title-image-plural": "Tugniwin", + "send": "Azen", + "title-image": "Tugna", + "title-file-plural": "Ifuyla", + "base64-text": "aḍris", + "auto-accept-instructions-1": "Rmed", + "base64-files": "Ifuyla", + "hr-or": "NEƔ", + "send-message-to": "I:", + "title-file": "Afaylu", + "close": "Mdel", + "accept": "Qbel", + "share": "Beṭṭu", + "download": "Asider", + "language-selector-title": "Sbedd tutlayt", + "system-language": "Tutlayt n unagraw", + "cancel": "Sefsex" + }, + "about": { + "github_title": "PairDrop deg GitHub", + "close-about_aria-label": "Mdel Ɣef PairDrop" + }, + "notifications": { + "connecting": "Tuqqna…", + "connected": "Yeqqen" + }, + "header": { + "about_aria-label": "Ldi Ɣef PairDrop", + "about_title": "Ɣef PairDrop", + "language-selector_title": "Fren tutlayt", + "install_title": "Sbedd PairDrop", + "edit-share-mode": "Ẓreg" + } +} From a0f88ed4923ee56e9119183cf42c7bd0c871d45a Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Tue, 11 Feb 2025 11:10:01 +0100 Subject: [PATCH 27/77] Hotfix: Prevent converting HEIC images until PR #350 is fixed --- public/scripts/util.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/public/scripts/util.js b/public/scripts/util.js index fc418ff..7d6c54a 100644 --- a/public/scripts/util.js +++ b/public/scripts/util.js @@ -477,13 +477,16 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual return new Promise(async (resolve, reject) => { try { if (file.type === "image/heif" || file.type === "image/heic") { - // browsers can't show heic files --> convert to jpeg before creating thumbnail - let blob = await fileToBlob(file); - file = await heic2any({ - blob, - toType: "image/jpeg", - quality: quality - }); + // hotfix: Converting heic images taken on iOS 18 crashes page. Waiting for PR #350 + reject(new Error(`Hotfix: Converting of HEIC/HEIF images currently disabled.`)); + return; + // // browsers can't show heic files --> convert to jpeg before creating thumbnail + // let blob = await fileToBlob(file); + // file = await heic2any({ + // blob, + // toType: "image/jpeg", + // quality: quality + // }); } let imageUrl = URL.createObjectURL(file); From bd9c7a4554110f4a54b6f7ff43770764aa420cc9 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Tue, 11 Feb 2025 12:11:31 +0100 Subject: [PATCH 28/77] Add html `lang` and `dir` attributes to language buttons --- public/index.html | 58 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/public/index.html b/public/index.html index a2c4584..8a95679 100644 --- a/public/index.html +++ b/public/index.html @@ -188,125 +188,125 @@ + - From 43c071b37fca336bb1001e9ca5577ba4bfdda0d8 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Tue, 11 Feb 2025 12:14:58 +0100 Subject: [PATCH 29/77] Enable Bulgarian, Estonian, Basque, Persian, Norwegian Nynorsk, Slovak, Tamil, Hant Script, and Korean translations --- public/index.html | 45 ++++++++++++++++++++++++++++++++++ public/scripts/localization.js | 5 +++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 8a95679..c50dbe7 100644 --- a/public/index.html +++ b/public/index.html @@ -202,6 +202,11 @@   -   (Norwegian Bokmål) + + + + + + + + +
diff --git a/public/scripts/localization.js b/public/scripts/localization.js index ca07a93..454f84d 100644 --- a/public/scripts/localization.js +++ b/public/scripts/localization.js @@ -3,7 +3,10 @@ class Localization { Localization.$htmlRoot = document.querySelector('html'); Localization.defaultLocale = "en"; - Localization.supportedLocales = ["ar", "be", "ca", "cs", "da", "de", "en", "es", "fr", "he", "hu", "id", "it", "ja", "kn", "nb", "nl", "pl", "pt-BR", "ro", "ru", "tr", "uk", "zh-CN", "zh-TW"]; + Localization.supportedLocales = [ + "ar", "be", "bg", "ca", "cs", "da", "de", "en", "es", "et", "eu", "fa", "fr", "he", "hu", "id", "it", "ja", + "kn", "ko", "nb", "nn", "nl", "pl", "pt-BR", "ro", "ru", "sk", "ta", "tr", "uk", "zh-CN", "zh-HK", "zh-TW" + ]; Localization.supportedLocalesRtl = ["ar", "he"]; Localization.translations = {}; From 8f8708c5fbc6c9a5704e18dfd868f9c1fe34e4b6 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Tue, 11 Feb 2025 14:33:32 +0100 Subject: [PATCH 30/77] Fix loading of default/backup translations --- public/scripts/localization.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/public/scripts/localization.js b/public/scripts/localization.js index 454f84d..ec915a5 100644 --- a/public/scripts/localization.js +++ b/public/scripts/localization.js @@ -51,13 +51,14 @@ class Localization { } async setInitialTranslation() { + await Localization.fetchDefaultTranslations(); await Localization.setTranslation(Localization.initialLocale) } static async setTranslation(locale) { if (!locale) locale = Localization.systemLocale; - await Localization.setLocale(locale) + await Localization.fetchTranslations(locale) await Localization.translatePage(); if (Localization.localeIsRtl(locale)) { @@ -78,10 +79,12 @@ class Localization { Events.fire("translation-loaded"); } - static async setLocale(newLocale) { - if (newLocale === Localization.locale) return false; + static async fetchDefaultTranslations() { + Localization.translationsDefaultLocale = await Localization.fetchTranslationsFor(Localization.defaultLocale); + } - Localization.defaultTranslations = await Localization.fetchTranslationsFor(Localization.defaultLocale); + static async fetchTranslations(newLocale) { + if (newLocale === Localization.locale) return false; const newTranslations = await Localization.fetchTranslationsFor(newLocale); From 14bfc1948a7b1b236d4ccc5c99940e8cd65b065b Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Tue, 11 Feb 2025 14:42:41 +0100 Subject: [PATCH 31/77] Update node dependencies --- package-lock.json | 325 ++++++++++++++++++++++++++++------------------ 1 file changed, 196 insertions(+), 129 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42a0b80..9673a7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,9 +37,9 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -49,7 +49,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -67,16 +67,25 @@ "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -105,9 +114,9 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -125,22 +134,6 @@ "ms": "2.0.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -158,26 +151,36 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "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" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -190,6 +193,17 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -204,36 +218,36 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -242,6 +256,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-rate-limit": { @@ -259,12 +277,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -300,15 +318,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -317,32 +340,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { + "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dependencies": { - "get-intrinsic": "^1.1.3" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "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==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "engines": { "node": ">= 0.4" }, @@ -351,9 +364,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -411,6 +424,14 @@ "node": ">= 0.10" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -420,9 +441,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/methods": { "version": "1.1.2", @@ -476,9 +500,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "engines": { "node": ">= 0.4" }, @@ -506,9 +530,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -523,11 +547,11 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -583,9 +607,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -605,55 +629,98 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" From 659b53b5faf6c99e076992cc61a6890c56a60f54 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Tue, 11 Feb 2025 14:52:44 +0100 Subject: [PATCH 32/77] Increase version to v1.10.11 ## Enhancements - Prevent referrer in created links in message ## Fixes - Prevent wrong `start_url` when installing PairDrop PWA from sub path (#329) - Hotfix: Disable thumbnail creation for HEIC/HEIF files until PR #350 is merged (hotfix for #336) ## Languages - New Language Bulgarian - New Language Estonian - New Language Basque - New Language Persian - New Language Norwegian Nynorsk - New Language Slovak - New Language Tamil - New Language Hant Script - New Language Korean - Translations updates from Hosted Weblate (Indonesian, Arabic, Italian, Czech, Japanese, Ukrainian, Russian, German, Portuguese (Brazil)) --- .github/ISSUE_TEMPLATE/bug-report.md | 4 ++-- docs/how-to.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- public/index.html | 2 +- public/service-worker.js | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 8039a04..419d837 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -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.10 +Version: v1.10.11 **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.10 +Version: v1.10.11 **Additional context** Add any other context about the problem here. diff --git a/docs/how-to.md b/docs/how-to.md index 6513b13..7d899db 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -45,11 +45,11 @@ This pairdrop-cli version was released alongside v1.10.4 #### Linux / Mac 1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) ```shell - wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.10/pairdrop-cli.zip" + wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.11/pairdrop-cli.zip" ``` or ```shell - curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.10/pairdrop-cli.zip" + curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.11/pairdrop-cli.zip" ``` 2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/` ```shell diff --git a/package-lock.json b/package-lock.json index 9673a7d..8812cb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pairdrop", - "version": "1.10.10", + "version": "1.10.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pairdrop", - "version": "1.10.10", + "version": "1.10.11", "license": "ISC", "dependencies": { "express": "^4.18.2", diff --git a/package.json b/package.json index 5ed2324..f4fd629 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.10.10", + "version": "1.10.11-", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index c50dbe7..5dec40a 100644 --- a/public/index.html +++ b/public/index.html @@ -667,7 +667,7 @@

PairDrop

-
v1.10.10
+
v1.10.11
diff --git a/public/service-worker.js b/public/service-worker.js index c247828..c6420fe 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.10.10'; +const cacheVersion = 'v1.10.11'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [ From 44c0f3dbaadb9f4925fa4d410057bd772e7e06cb Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 11 Nov 2024 15:37:04 +0100 Subject: [PATCH 33/77] Check for BroadcastChannel availability before instantiating it --- public/scripts/browser-tabs-connector.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/scripts/browser-tabs-connector.js b/public/scripts/browser-tabs-connector.js index da9c43e..2ce99af 100644 --- a/public/scripts/browser-tabs-connector.js +++ b/public/scripts/browser-tabs-connector.js @@ -1,5 +1,7 @@ class BrowserTabsConnector { constructor() { + if (!('BroadcastChannel' in window)) return; + this.bc = new BroadcastChannel('pairdrop'); this.bc.addEventListener('message', e => this._onMessage(e)); Events.on('broadcast-send', e => this._broadcastSend(e.detail)); From c52eeda3ffbfcfa5c0e1a0c6601f7522944cfefe Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 12 Feb 2025 00:35:24 +0100 Subject: [PATCH 34/77] Add BrowserStack to README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9fd70f1..3400704 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ Connect to others in complex network situations, or over the Internet. * [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 +* [BrowserStack](https://www.browserstack.com/) This project is tested with BrowserStack [FAQ](docs/faq.md) From 940da7948cb9957f0614fe62e4ea39939ebf8314 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 13 Feb 2025 10:24:27 +0100 Subject: [PATCH 35/77] Stop usage of public class fields in order to support Safari 13.1 --- public/scripts/ui.js | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index 873e612..93d4ae2 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -18,11 +18,12 @@ class PeersUI { this.peers = {}; - this.shareMode = {}; - this.shareMode.active = false; - this.shareMode.descriptor = ""; - this.shareMode.files = []; - this.shareMode.text = ""; + this.shareMode = { + active: false, + descriptor: "", + files: [], + text: "" + } Events.on('peer-joined', e => this._onPeerJoined(e.detail)); Events.on('peer-added', _ => this._evaluateOverflowingPeers()); @@ -394,12 +395,6 @@ class PeersUI { class PeerUI { - static _badgeClassNames = ["badge-room-ip", "badge-room-secret", "badge-room-public-id"]; - static _shareMode = { - active: false, - descriptor: "" - }; - constructor(peer, connectionHash, shareMode) { this.$xInstructions = $$('x-instructions'); this.$xPeers = $$('x-peers'); @@ -409,7 +404,7 @@ class PeerUI { `${connectionHash.substring(0, 4)} ${connectionHash.substring(4, 8)} ${connectionHash.substring(8, 12)} ${connectionHash.substring(12, 16)}`; // This is needed if the ShareMode is started BEFORE the PeerUI is drawn. - PeerUI._shareMode = shareMode; + this._shareMode = shareMode; this._initDom(); @@ -421,8 +416,8 @@ class PeerUI { } html() { - let title= PeerUI._shareMode.active - ? Localization.getTranslation("peer-ui.click-to-send-share-mode", null, {descriptor: PeerUI._shareMode.descriptor}) + let title= this._shareMode.active + ? Localization.getTranslation("peer-ui.click-to-send-share-mode", null, {descriptor: this._shareMode.descriptor}) : Localization.getTranslation("peer-ui.click-to-send"); this.$el.innerHTML = ` @@ -485,8 +480,8 @@ class PeerUI { _onShareModeChanged(active = false, descriptor = "") { // This is needed if the ShareMode is started AFTER the PeerUI is drawn. - PeerUI._shareMode.active = active; - PeerUI._shareMode.descriptor = descriptor; + this._shareMode.active = active; + this._shareMode.descriptor = descriptor; this._evaluateShareMode(); this._bindListeners(); @@ -494,12 +489,12 @@ class PeerUI { _evaluateShareMode() { let title; - if (!PeerUI._shareMode.active) { + if (!this._shareMode.active) { title = Localization.getTranslation("peer-ui.click-to-send"); this.$input.removeAttribute('disabled'); } else { - title = Localization.getTranslation("peer-ui.click-to-send-share-mode", null, {descriptor: PeerUI._shareMode.descriptor}); + title = Localization.getTranslation("peer-ui.click-to-send-share-mode", null, {descriptor: this._shareMode.descriptor}); this.$input.setAttribute('disabled', true); } this.$label.setAttribute('title', title); @@ -520,7 +515,7 @@ class PeerUI { } _bindListeners() { - if(!PeerUI._shareMode.active) { + if(!this._shareMode.active) { // Remove Events Share mode this.$el.removeEventListener('pointerdown', this._callbackPointerDown); @@ -636,7 +631,7 @@ class PeerUI { } _onDrop(e) { - if (PeerUI._shareMode.active || Dialog.anyDialogShown()) return; + if (this._shareMode.active || Dialog.anyDialogShown()) return; e.preventDefault(); @@ -1974,7 +1969,7 @@ class SendTextDialog extends Dialog { _onRecipient(peerId, deviceName) { this.correspondingPeerId = peerId; this.$peerDisplayName.innerText = deviceName; - this.$peerDisplayName.classList.remove(...PeerUI._badgeClassNames); + this.$peerDisplayName.classList.remove("badge-room-ip", "badge-room-secret", "badge-room-public-id"); this.$peerDisplayName.classList.add($(peerId).ui._badgeClassName()); this.show(); @@ -2056,7 +2051,7 @@ class ReceiveTextDialog extends Dialog { _showReceiveTextDialog(text, peerId) { this.$displayName.innerText = $(peerId).ui._displayName(); - this.$displayName.classList.remove(...PeerUI._badgeClassNames); + this.$displayName.classList.remove("badge-room-ip", "badge-room-secret", "badge-room-public-id"); this.$displayName.classList.add($(peerId).ui._badgeClassName()); this.$text.innerText = text; From f7fe303fa768f59d04906c17d76fa0b6ffb8cfe4 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 13 Feb 2025 11:39:10 +0100 Subject: [PATCH 36/77] Fix background css for clients iOS < 13.1 --- public/styles/styles-main.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/styles/styles-main.css b/public/styles/styles-main.css index 9401d45..cff0d1d 100644 --- a/public/styles/styles-main.css +++ b/public/styles/styles-main.css @@ -696,7 +696,6 @@ button::-moz-focus-inner { /* Info Animation */ - #about { color: white; z-index: 32; @@ -752,9 +751,11 @@ button::-moz-focus-inner { height: var(--size); z-index: -1; background: var(--primary-color); - background-image: radial-gradient(circle at calc(50% - 36px), var(--accent-color) 0%, color-mix(in srgb, var(--accent-color) 40%, black) 80%); + background-image: radial-gradient(circle at calc(50% - 36px), var(--primary-color) 0%, black 80%); --crop-size: 0px; clip-path: circle(var(--crop-size)); + /* For clients < iOS 13.1 */ + -webkit-clip-path: circle(var(--crop-size)); } html:not([dir="rtl"]) #about x-background { From ec520248b82a74a17f25a832b45f1e32fccb8ec3 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 13 Feb 2025 12:53:04 +0100 Subject: [PATCH 37/77] Remove duplicate instruction --- public/scripts/ui.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index 93d4ae2..e1887cb 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -278,8 +278,6 @@ class PeersUI { descriptorInstructions = Localization.getTranslation("instructions.activate-share-mode-shared-file"); } - files = await mime.addMissingMimeTypesToFiles(files); - if (files[0].type.split('/')[0] === 'image') { try { let imageUrl = await getThumbnailAsDataUrl(files[0], 80, null, 0.9); From 351e7d42c9eece9ceaffcb64114546527725fa8a Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 13 Feb 2025 12:52:33 +0100 Subject: [PATCH 38/77] Fix share mode by converting FileList to Array --- public/scripts/network.js | 2 +- public/scripts/ui.js | 16 +++++++++++----- public/scripts/util.js | 10 +++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/public/scripts/network.js b/public/scripts/network.js index 9128442..c92befc 100644 --- a/public/scripts/network.js +++ b/public/scripts/network.js @@ -1082,7 +1082,7 @@ class PeersManager { } async _onFilesSelected(message) { - let files = await mime.addMissingMimeTypesToFiles(message.files); + let files = mime.addMissingMimeTypesToFiles(message.files); await this.peers[message.to].requestFileTransfer(files); } diff --git a/public/scripts/ui.js b/public/scripts/ui.js index e1887cb..c988db7 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -179,10 +179,13 @@ class PeersUI { this._onDragEnd(); - if ($$('x-peer') || !$$('x-peer').contains(e.target)) return; // dropped on peer + if ($$('x-peer') && $$('x-peer').contains(e.target)) return; // dropped on peer - const files = e.dataTransfer.files; - const text = e.dataTransfer.getData("text"); + let files = e.dataTransfer.files; + let text = e.dataTransfer.getData("text"); + + // convert FileList to Array + files = [...files]; if (files.length > 0) { Events.fire('activate-share-mode', { @@ -215,8 +218,11 @@ class PeersUI { if (this.shareMode.active || Dialog.anyDialogShown()) return; e.preventDefault() - const files = e.clipboardData.files; - const text = e.clipboardData.getData("Text"); + let files = e.clipboardData.files; + let text = e.clipboardData.getData("Text"); + + // convert FileList to Array + files = [...files]; if (files.length > 0) { Events.fire('activate-share-mode', {files: files}); diff --git a/public/scripts/util.js b/public/scripts/util.js index 7d6c54a..08a790f 100644 --- a/public/scripts/util.js +++ b/public/scripts/util.js @@ -396,20 +396,20 @@ const mime = (() => { } return { - async guessMimeByFilename(filename) { + guessMimeByFilename(filename) { const split = filename.split('.'); if (split.length === 1) { // Filename does not include suffix - return ""; + return false; } const suffix = split[split.length - 1].toLowerCase(); - return suffixToMimeMap[suffix] || ""; + return suffixToMimeMap[suffix]; }, - async addMissingMimeTypesToFiles(files) { + addMissingMimeTypesToFiles(files) { // if filetype is empty guess via suffix otherwise leave unchanged for (let i = 0; i < files.length; i++) { if (!files[i].type) { - files[i] = new File([files[i]], files[i].name, {type: await mime.guessMimeByFilename(files[i].name) || ""}); + files[i] = new File([files[i]], files[i].name, {type: mime.guessMimeByFilename(files[i].name) || ""}); } } return files; From efc360e1063ae7dde1424b5934464f9a4f91dd34 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 13 Feb 2025 12:53:47 +0100 Subject: [PATCH 39/77] Remove text selection prevention to enable pasting for Firefox users --- public/styles/styles-main.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/public/styles/styles-main.css b/public/styles/styles-main.css index cff0d1d..5cff395 100644 --- a/public/styles/styles-main.css +++ b/public/styles/styles-main.css @@ -11,10 +11,6 @@ body { overflow-x: hidden; overscroll-behavior: none; overflow-y: hidden; - /* Only allow selection on message and pair key */ - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; transition: color 300ms; } From 629328c2f614b4077bdc58d5839ccdc6979618a9 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 13 Feb 2025 20:07:25 +0100 Subject: [PATCH 40/77] Use css instead of JS to detect offset on high viewports --- public/scripts/ui-main.js | 1 - public/styles/styles-main.css | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index bbdece4..3289ee7 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -357,7 +357,6 @@ class BackgroundCanvas { this.w = document.documentElement.clientWidth; this.h = document.documentElement.clientHeight; this.offset = this.$footer.offsetHeight - 27; - if (this.h >= 800) this.offset += 10; if (oldW === this.w && oldH === this.h && oldOffset === this.offset) return; // nothing has changed diff --git a/public/styles/styles-main.css b/public/styles/styles-main.css index 5cff395..c36634a 100644 --- a/public/styles/styles-main.css +++ b/public/styles/styles-main.css @@ -899,7 +899,7 @@ x-peers:empty~x-instructions { @media screen and (min-height: 800px) { footer { - margin-bottom: 16px; + padding-bottom: 10px; } } From 8a833cd69dae86519d60b11ee5e094f232772c31 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 13 Feb 2025 20:07:38 +0100 Subject: [PATCH 41/77] Make PWA standalone --- public/manifest.json | 2 +- public/scripts/main.js | 2 +- public/styles/styles-main.css | 7 +++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/public/manifest.json b/public/manifest.json index 5198d81..edcf69a 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -26,7 +26,7 @@ } ], "background_color": "#efefef", - "display": "minimal-ui", + "display": "standalone", "theme_color": "#3367d6", "screenshots" : [ { diff --git a/public/scripts/main.js b/public/scripts/main.js index 8960ed2..9929627 100644 --- a/public/scripts/main.js +++ b/public/scripts/main.js @@ -81,7 +81,7 @@ class PairDrop { } onPwaInstallable(e) { - if (!window.matchMedia('(display-mode: minimal-ui)').matches) { + if (!window.matchMedia('(display-mode: standalone)').matches) { // only display install btn when not installed this.$headerInstallBtn.removeAttribute('hidden'); this.$headerInstallBtn.addEventListener('click', () => { diff --git a/public/styles/styles-main.css b/public/styles/styles-main.css index c36634a..bbf3ddf 100644 --- a/public/styles/styles-main.css +++ b/public/styles/styles-main.css @@ -909,6 +909,13 @@ x-peers:empty~x-instructions { } } +/* PWA Standalone styles */ +@media all and (display-mode: standalone) { + footer { + padding-bottom: 34px; + } +} + /* Constants */ :root { From 82b329fea84416ab4c6d0208e6a5b758698d9828 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Fri, 14 Feb 2025 15:36:35 +0100 Subject: [PATCH 42/77] Fix padding of auto-accept instruction --- public/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/index.html b/public/index.html index 5dec40a..bd391e7 100644 --- a/public/index.html +++ b/public/index.html @@ -416,12 +416,12 @@

-
-

+

+
-

+
From dabfe581248edbc49ff0abd0fdad9c28d8e658bd Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Fri, 14 Feb 2025 15:47:17 +0100 Subject: [PATCH 43/77] Fix word-break of base64zip button on mobile --- public/styles/styles-main.css | 1 - 1 file changed, 1 deletion(-) diff --git a/public/styles/styles-main.css b/public/styles/styles-main.css index 5cff395..8be401e 100644 --- a/public/styles/styles-main.css +++ b/public/styles/styles-main.css @@ -587,7 +587,6 @@ x-dialog:not([show]) x-background { font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; - white-space: nowrap; cursor: pointer; user-select: none; background: inherit; From 02c95dde9d411a585c5473991cbb1ce7fc1eeef6 Mon Sep 17 00:00:00 2001 From: Chris Lovett Date: Fri, 14 Feb 2025 10:17:10 -0500 Subject: [PATCH 44/77] Updated Twitter (X) icon and URL --- public/index.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/index.html b/public/index.html index 5dec40a..748e275 100644 --- a/public/index.html +++ b/public/index.html @@ -681,9 +681,9 @@ - + - + ${url}`; - return `${whitespaceOrSpecial}${linkNodePlaceholder}`; - } + if (!isUrlValid(link)) { // link is not valid -> do not replace return match; - }); + } + + // 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] = `${url}`; + return `${whitespace}${linkNodePlaceholder}`; + } + + text = text.replace(rgxUrlAll, replaceMatchWithPlaceholder); + $textShadow.innerText = text.replace(rgxMailAll, replaceMatchWithPlaceholder); this.$text.innerHTML = $textShadow.innerHTML.replace(pRgx, diff --git a/public/scripts/util.js b/public/scripts/util.js index 08a790f..1dcc388 100644 --- a/public/scripts/util.js +++ b/public/scripts/util.js @@ -590,7 +590,7 @@ async function decodeBase64Text(base64) { function isUrlValid(url) { try { - let urlObj = new URL(url); + new URL(url); return true; } catch (e) { From 8a3c60d3a677d5dcd9b28d0b91f4de61be29db11 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Fri, 14 Feb 2025 20:54:15 +0100 Subject: [PATCH 47/77] Bring back optimized background animation --- public/scripts/ui-main.js | 183 +++++++++++++++++++++++++++----------- public/scripts/ui.js | 10 +++ 2 files changed, 140 insertions(+), 53 deletions(-) diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index bbdece4..682dbe3 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -333,65 +333,142 @@ class FooterUI { class BackgroundCanvas { constructor() { - this.c = $$('canvas'); - this.cCtx = this.c.getContext('2d'); - this.$footer = $$('footer'); + this.canvas = $$('canvas'); + this.initAnimation(); + } + + initAnimation() { + let c = this.canvas; + let cCtx = c.getContext('2d'); + let $footer = $$('footer'); + + let x0, y0, w, h, dw, offset, baseColor, baseOpacity; + + let offscreenCanvases; + let shareMode = false; + + let animate = true; + let currentFrame = 0; + + let fpsInterval, now, then, elapsed; + + let speed = 1.5; + + function init() { + let oldW = w; + let oldH = h; + let oldOffset = offset + w = document.documentElement.clientWidth; + h = document.documentElement.clientHeight; + offset = $footer.offsetHeight - 33; + if (h > 800) offset += 16; + + if (oldW === w && oldH === h && oldOffset === offset) return; // nothing has changed + + c.width = w; + c.height = h; + x0 = w / 2; + y0 = h - offset; + dw = Math.round(Math.max(w, h, 1000) / 12); + + drawCircles(cCtx, 0); + + // enforce redrawing of frames + offscreenCanvases = {true: [], false: []}; + } + + function drawCircle(ctx, radius) { + ctx.lineWidth = 2; + + baseColor = shareMode ? '168 168 255' : '168 168 168'; + baseOpacity = shareMode ? 0.8 : 0.4; + + let opacity = baseOpacity * radius / (dw * 8); + if (radius > dw * 5) { + opacity *= (6 * dw - radius) / dw + } + ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; + ctx.beginPath(); + ctx.arc(x0, y0, radius, 0, 2 * Math.PI); + ctx.stroke(); + } + + function drawCircles(ctx, frame) { + for (let i = 6; i >= 0; i--) { + drawCircle(ctx, dw * i + speed * frame + 33); + } + } + + function createOffscreenCanvas(frame) { + let canvas = document.createElement("canvas"); + canvas.width = c.width; + canvas.height = c.height; + offscreenCanvases[shareMode][frame] = canvas; + let ctx = canvas.getContext('2d'); + drawCircles(ctx, frame); + } + + function drawFrame(frame) { + cCtx.clearRect(0, 0, w, h); + + if (!offscreenCanvases[shareMode][frame]) { + createOffscreenCanvas(frame); + } + cCtx.drawImage(offscreenCanvases[shareMode][frame], 0, 0); + } + + function startAnimating(fps) { + fpsInterval = 1000 / fps; + then = Date.now(); + animateBg(); + } + + function animateBg() { + requestAnimationFrame(animateBg); + + now = Date.now(); + elapsed = now - then; + // if not enough time has elapsed, do not draw the next frame -> abort + if (elapsed < fpsInterval) { + return; + } + + then = now - (elapsed % fpsInterval); + + if (animate) { + currentFrame = (currentFrame + 1) % (dw/speed); + drawFrame(currentFrame); + } + } + + function switchAnimation(state) { + animate = state; + console.debug(state) + } + + function redrawOnShareModeChange(active) { + shareMode = active + } + + init(); + startAnimating(30) // redraw canvas - Events.on('resize', _ => this.init()); - Events.on('redraw-canvas', _ => this.init()); - Events.on('translation-loaded', _ => this.init()); + Events.on('resize', _ => init()); + Events.on('redraw-canvas', _ => init()); + Events.on('translation-loaded', _ => init()); // ShareMode - Events.on('share-mode-changed', e => this.onShareModeChanged(e.detail.active)); + Events.on('share-mode-changed', e => redrawOnShareModeChange(e.detail.active)); + + // Start and stop animation + Events.on('background-animation', e => switchAnimation(e.detail.animate)) + + Events.on('offline', _ => switchAnimation(false)); + Events.on('online', _ => switchAnimation(true)); } async fadeIn() { - this.c.classList.remove('opacity-0'); - } - - init() { - let oldW = this.w; - let oldH = this.h; - let oldOffset = this.offset - this.w = document.documentElement.clientWidth; - this.h = document.documentElement.clientHeight; - this.offset = this.$footer.offsetHeight - 27; - if (this.h >= 800) this.offset += 10; - - if (oldW === this.w && oldH === this.h && oldOffset === this.offset) return; // nothing has changed - - this.c.width = this.w; - this.c.height = this.h; - this.x0 = this.w / 2; - this.y0 = this.h - this.offset; - this.dw = Math.round(Math.max(this.w, this.h, 1000) / 13); - this.baseColor = '165, 165, 165'; - this.baseOpacity = 0.3; - - this.drawCircles(this.cCtx); - } - - onShareModeChanged(active) { - this.baseColor = active ? '165, 165, 255' : '165, 165, 165'; - this.baseOpacity = active ? 0.5 : 0.3; - this.drawCircles(this.cCtx); - } - - - drawCircle(ctx, radius) { - ctx.beginPath(); - ctx.lineWidth = 2; - let opacity = Math.max(0, this.baseOpacity * (1 - 1.2 * radius / Math.max(this.w, this.h))); - ctx.strokeStyle = `rgba(${this.baseColor}, ${opacity})`; - ctx.arc(this.x0, this.y0, radius, 0, 2 * Math.PI); - ctx.stroke(); - } - - drawCircles(ctx) { - ctx.clearRect(0, 0, this.w, this.h); - for (let i = 0; i < 13; i++) { - this.drawCircle(ctx, this.dw * i + 33 + 66); - } + this.canvas.classList.remove('opacity-0'); } } \ No newline at end of file diff --git a/public/scripts/ui.js b/public/scripts/ui.js index c988db7..835eaae 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -150,10 +150,17 @@ class PeersUI { } _onPeerDisconnected(peerId) { + // Remove peer from UI const $peer = $(peerId); if (!$peer) return; $peer.remove(); this._evaluateOverflowingPeers(); + + // If no peer is shown -> start background animation again + if ($$('x-peers:empty')) { + Events.fire('background-animation', {animate: true}); + } + } _onRoomTypeRemoved(peerId, roomType) { @@ -417,6 +424,9 @@ class PeerUI { // ShareMode Events.on('share-mode-changed', e => this._onShareModeChanged(e.detail.active, e.detail.descriptor)); + + // Stop background animation + Events.fire('background-animation', {animate: false}); } html() { From f0e72506175c43939bee38887a0acf794e2fffc3 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sun, 16 Feb 2025 00:52:34 +0100 Subject: [PATCH 48/77] Use time based approach to smoothen reduced framerate --- public/scripts/ui-main.js | 91 ++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 34 deletions(-) diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index 682dbe3..a8c4a1f 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -344,15 +344,26 @@ class BackgroundCanvas { let x0, y0, w, h, dw, offset, baseColor, baseOpacity; - let offscreenCanvases; + let offscreenCanvases = {false: [], true: []}; let shareMode = false; + let startTime; let animate = true; - let currentFrame = 0; + let speed = 0.4; + let fps = 300; + let maxFrames = fps / speed; - let fpsInterval, now, then, elapsed; - - let speed = 1.5; + for (let frame = 0; frame < maxFrames; frame++) { + let canvas = document.createElement("canvas"); + offscreenCanvases[false][frame] = { + "redraw": true, + "canvas": canvas + }; + offscreenCanvases[true][frame] = { + "redraw": true, + "canvas": canvas + }; + } function init() { let oldW = w; @@ -360,8 +371,8 @@ class BackgroundCanvas { let oldOffset = offset w = document.documentElement.clientWidth; h = document.documentElement.clientHeight; - offset = $footer.offsetHeight - 33; - if (h > 800) offset += 16; + offset = $footer.offsetHeight - 28; + if (h > 800) offset += 11; if (oldW === w && oldH === h && oldOffset === offset) return; // nothing has changed @@ -369,12 +380,15 @@ class BackgroundCanvas { c.height = h; x0 = w / 2; y0 = h - offset; - dw = Math.round(Math.max(w, h, 1000) / 12); + dw = Math.round(Math.max(w, h, 1000) / 15); - drawCircles(cCtx, 0); + drawFrame(currentFrame); // enforce redrawing of frames - offscreenCanvases = {true: [], false: []}; + for (let frame = 0; frame < maxFrames; frame++) { + offscreenCanvases[true][frame]["redraw"] = true; + offscreenCanvases[false][frame]["redraw"] = true; + } } function drawCircle(ctx, radius) { @@ -383,8 +397,11 @@ class BackgroundCanvas { baseColor = shareMode ? '168 168 255' : '168 168 168'; baseOpacity = shareMode ? 0.8 : 0.4; - let opacity = baseOpacity * radius / (dw * 8); - if (radius > dw * 5) { + let opacity = Math.max(0, baseOpacity * (1 - 1.2 * radius / Math.max(w, h))); + if (radius < dw) { + opacity *= (radius - 33) / (dw - 33) + } + else if (radius > dw * 5) { opacity *= (6 * dw - radius) / dw } ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; @@ -394,16 +411,16 @@ class BackgroundCanvas { } function drawCircles(ctx, frame) { - for (let i = 6; i >= 0; i--) { - drawCircle(ctx, dw * i + speed * frame + 33); + ctx.clearRect(0, 0, w, h); + for (let i = 5; i >= 0; i--) { + drawCircle(ctx, dw * i + speed * dw * frame / fps + 33); } } - function createOffscreenCanvas(frame) { - let canvas = document.createElement("canvas"); + function drawOffscreenCanvas(frame) { + let canvas = offscreenCanvases[shareMode][frame]["canvas"]; canvas.width = c.width; canvas.height = c.height; - offscreenCanvases[shareMode][frame] = canvas; let ctx = canvas.getContext('2d'); drawCircles(ctx, frame); } @@ -411,39 +428,45 @@ class BackgroundCanvas { function drawFrame(frame) { cCtx.clearRect(0, 0, w, h); - if (!offscreenCanvases[shareMode][frame]) { - createOffscreenCanvas(frame); + if (offscreenCanvases[shareMode][frame]["redraw"]) { + drawOffscreenCanvas(frame); } - cCtx.drawImage(offscreenCanvases[shareMode][frame], 0, 0); + cCtx.drawImage(offscreenCanvases[shareMode][frame]["canvas"], 0, 0); } - function startAnimating(fps) { - fpsInterval = 1000 / fps; - then = Date.now(); + function startAnimating() { + startTime = Date.now(); animateBg(); } + let currentFrame = 0; function animateBg() { - requestAnimationFrame(animateBg); + let now = Date.now(); - now = Date.now(); - elapsed = now - then; - // if not enough time has elapsed, do not draw the next frame -> abort - if (elapsed < fpsInterval) { + if (!animate) { + // Animation stopped -> don't draw next frame return; } - then = now - (elapsed % fpsInterval); + let timeSinceLastFullCycle = (now - startTime) % (1000 / speed); + let nextFrame = Math.trunc(fps * timeSinceLastFullCycle / 1000); - if (animate) { - currentFrame = (currentFrame + 1) % (dw/speed); - drawFrame(currentFrame); + // Only draw frame if it differs from current frame + if (nextFrame !== currentFrame) { + drawFrame(nextFrame); + currentFrame = nextFrame; } + + requestAnimationFrame(animateBg); } function switchAnimation(state) { + if (!animate && state) { + // animation starts again. Set startTime to specific value to prevent frame jump + startTime = Date.now() - 1000 * currentFrame / fps; + } animate = state; - console.debug(state) + animateBg(); } function redrawOnShareModeChange(active) { @@ -451,7 +474,7 @@ class BackgroundCanvas { } init(); - startAnimating(30) + startAnimating(); // redraw canvas Events.on('resize', _ => init()); From 16523843bd7bd6241854666a51ae3bff9155809d Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sun, 16 Feb 2025 19:23:04 +0100 Subject: [PATCH 49/77] Use OffscreenCanvas on supported browsers to offload canvas drawing to a service worker thread --- public/scripts/canvas-worker.js | 135 ++++++++++++++++++ public/scripts/ui-main.js | 241 ++++++++++++++++++++------------ public/service-worker.js | 1 + 3 files changed, 288 insertions(+), 89 deletions(-) create mode 100644 public/scripts/canvas-worker.js diff --git a/public/scripts/canvas-worker.js b/public/scripts/canvas-worker.js new file mode 100644 index 0000000..e7e6bc7 --- /dev/null +++ b/public/scripts/canvas-worker.js @@ -0,0 +1,135 @@ +self.onmessage = (e) => { + switch (e.data.type) { + case "createCanvas": createCanvas(e.data); + break; + case "initCanvas": initCanvas(e.data.footerOffsetHeight, e.data.clientWidth, e.data.clientHeight); + break; + case "startAnimation": startAnimation(); + break; + case "onShareModeChange": onShareModeChange(e.data.active); + break; + case "switchAnimation": switchAnimation(e.data.animate); + break; + } +}; + +let baseColorNormal; +let baseColorShareMode; +let baseOpacityNormal; +let baseOpacityShareMode; +let speed; +let fps; + +let c; +let cCtx; + +let x0, y0, w, h, dw, offset; + +let startTime; +let animate = true; +let currentFrame = 0; +let lastFrame; +let baseColor; +let baseOpacity; + +function createCanvas(data) { + baseColorNormal = data.baseColorNormal; + baseColorShareMode = data.baseColorShareMode; + baseOpacityNormal = data.baseOpacityNormal; + baseOpacityShareMode = data.baseOpacityShareMode; + speed = data.speed; + fps = data.fps; + + c = data.canvas; + cCtx = c.getContext("2d"); + + lastFrame = fps / speed - 1; + baseColor = baseColorNormal; + baseOpacity = baseOpacityNormal; +} + +function initCanvas(footerOffsetHeight, clientWidth, clientHeight) { + let oldW = w; + let oldH = h; + let oldOffset = offset; + w = clientWidth; + h = clientHeight; + offset = footerOffsetHeight - 28; + if (h > 800) offset += 11; + + if (oldW === w && oldH === h && oldOffset === offset) return; // nothing has changed + + c.width = w; + c.height = h; + x0 = w / 2; + y0 = h - offset; + dw = Math.round(Math.min(Math.max(w, h), 800) / 10); + + drawFrame(currentFrame); +} + +function startAnimation() { + startTime = Date.now(); + animateBg(); +} + +function switchAnimation(state) { + if (!animate && state) { + // animation starts again. Set startTime to specific value to prevent frame jump + startTime = Date.now() - 1000 * currentFrame / fps; + } + animate = state; + requestAnimationFrame(animateBg); +} + +function onShareModeChange(active) { + baseColor = active ? baseColorShareMode : baseColorNormal; + baseOpacity = active ? baseOpacityShareMode : baseOpacityNormal; + drawFrame(currentFrame); +} + +function drawCircle(ctx, radius) { + ctx.lineWidth = 2; + + let opacity = Math.max(0, baseOpacity * (1 - 1.2 * radius / Math.max(w, h))); + if (radius > dw * 7) { + opacity *= (8 * dw - radius) / dw + } + + ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; + ctx.beginPath(); + ctx.arc(x0, y0, radius, 0, 2 * Math.PI); + ctx.stroke(); +} + +function drawCircles(ctx, frame) { + ctx.clearRect(0, 0, w, h); + for (let i = 7; i >= 0; i--) { + drawCircle(ctx, dw * i + speed * dw * frame / fps + 33); + } +} + +function drawFrame(frame) { + cCtx.clearRect(0, 0, w, h); + drawCircles(cCtx, frame); +} + +function animateBg() { + let now = Date.now(); + + if (!animate && currentFrame === lastFrame) { + // Animation stopped and cycle finished -> stop drawing frames + return; + } + + let timeSinceLastFullCycle = (now - startTime) % (1000 / speed); + let nextFrame = Math.trunc(fps * timeSinceLastFullCycle / 1000); + + // Only draw frame if it differs from current frame + if (nextFrame !== currentFrame) { + drawFrame(nextFrame); + currentFrame = nextFrame; + } + + requestAnimationFrame(animateBg); +} \ No newline at end of file diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index a8c4a1f..3dbd612 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -333,45 +333,93 @@ class FooterUI { class BackgroundCanvas { constructor() { - this.canvas = $$('canvas'); + this.$canvas = $$('canvas'); + this.$footer = $$('footer'); + this.initAnimation(); } + async fadeIn() { + this.$canvas.classList.remove('opacity-0'); + } + initAnimation() { - let c = this.canvas; - let cCtx = c.getContext('2d'); - let $footer = $$('footer'); + this.baseColorNormal = '168 168 168'; + this.baseColorShareMode = '168 168 255'; + this.baseOpacityNormal = 0.4; + this.baseOpacityShareMode = 0.8; + this.speed = 0.4; + this.fps = 40; - let x0, y0, w, h, dw, offset, baseColor, baseOpacity; + // if browser supports OffscreenCanvas + // -> put canvas drawing into serviceworker to unblock main thread + // otherwise + // -> use main thread + let {init, startAnimation, switchAnimation, onShareModeChange} = + this.$canvas.transferControlToOffscreen + ? this.initAnimationOffscreen() + : this.initAnimationOnscreen(); - let offscreenCanvases = {false: [], true: []}; - let shareMode = false; + init(); + startAnimation(); + + // redraw canvas + Events.on('resize', _ => init()); + Events.on('redraw-canvas', _ => init()); + Events.on('translation-loaded', _ => init()); + + // ShareMode + Events.on('share-mode-changed', e => onShareModeChange(e.detail.active)); + + // Start and stop animation + Events.on('background-animation', e => switchAnimation(e.detail.animate)) + Events.on('offline', _ => switchAnimation(false)); + Events.on('online', _ => switchAnimation(true)); + } + + initAnimationOnscreen() { + let $canvas = this.$canvas; + let $footer = this.$footer; + + let baseColorNormal = this.baseColorNormal; + let baseColorShareMode = this.baseColorShareMode; + let baseOpacityNormal = this.baseOpacityNormal; + let baseOpacityShareMode = this.baseOpacityShareMode; + let speed = this.speed; + let fps = this.fps; + + let c; + let cCtx; + + let x0, y0, w, h, dw, offset; let startTime; let animate = true; - let speed = 0.4; - let fps = 300; - let maxFrames = fps / speed; + let currentFrame = 0; + let lastFrame; + let baseColor; + let baseOpacity; - for (let frame = 0; frame < maxFrames; frame++) { - let canvas = document.createElement("canvas"); - offscreenCanvases[false][frame] = { - "redraw": true, - "canvas": canvas - }; - offscreenCanvases[true][frame] = { - "redraw": true, - "canvas": canvas - }; + function createCanvas() { + c = $canvas; + cCtx = c.getContext('2d'); + + lastFrame = fps / speed - 1; + baseColor = baseColorNormal; + baseOpacity = baseOpacityNormal; } function init() { + initCanvas($footer.offsetHeight, document.documentElement.clientWidth, document.documentElement.clientHeight); + } + + function initCanvas(footerOffsetHeight, clientWidth, clientHeight) { let oldW = w; let oldH = h; - let oldOffset = offset - w = document.documentElement.clientWidth; - h = document.documentElement.clientHeight; - offset = $footer.offsetHeight - 28; + let oldOffset = offset; + w = clientWidth; + h = clientHeight; + offset = footerOffsetHeight - 28; if (h > 800) offset += 11; if (oldW === w && oldH === h && oldOffset === offset) return; // nothing has changed @@ -380,30 +428,39 @@ class BackgroundCanvas { c.height = h; x0 = w / 2; y0 = h - offset; - dw = Math.round(Math.max(w, h, 1000) / 15); + dw = Math.round(Math.min(Math.max(w, h), 800) / 10); drawFrame(currentFrame); + } - // enforce redrawing of frames - for (let frame = 0; frame < maxFrames; frame++) { - offscreenCanvases[true][frame]["redraw"] = true; - offscreenCanvases[false][frame]["redraw"] = true; + function startAnimation() { + startTime = Date.now(); + animateBg(); + } + + function switchAnimation(state) { + if (!animate && state) { + // animation starts again. Set startTime to specific value to prevent frame jump + startTime = Date.now() - 1000 * currentFrame / fps; } + animate = state; + requestAnimationFrame(animateBg); + } + + function onShareModeChange(active) { + baseColor = active ? baseColorShareMode : baseColorNormal; + baseOpacity = active ? baseOpacityShareMode : baseOpacityNormal; + drawFrame(currentFrame); } function drawCircle(ctx, radius) { ctx.lineWidth = 2; - baseColor = shareMode ? '168 168 255' : '168 168 168'; - baseOpacity = shareMode ? 0.8 : 0.4; - let opacity = Math.max(0, baseOpacity * (1 - 1.2 * radius / Math.max(w, h))); - if (radius < dw) { - opacity *= (radius - 33) / (dw - 33) - } - else if (radius > dw * 5) { - opacity *= (6 * dw - radius) / dw + if (radius > dw * 7) { + opacity *= (8 * dw - radius) / dw } + ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; ctx.beginPath(); ctx.arc(x0, y0, radius, 0, 2 * Math.PI); @@ -412,39 +469,21 @@ class BackgroundCanvas { function drawCircles(ctx, frame) { ctx.clearRect(0, 0, w, h); - for (let i = 5; i >= 0; i--) { + for (let i = 7; i >= 0; i--) { drawCircle(ctx, dw * i + speed * dw * frame / fps + 33); } } - function drawOffscreenCanvas(frame) { - let canvas = offscreenCanvases[shareMode][frame]["canvas"]; - canvas.width = c.width; - canvas.height = c.height; - let ctx = canvas.getContext('2d'); - drawCircles(ctx, frame); - } - function drawFrame(frame) { cCtx.clearRect(0, 0, w, h); - - if (offscreenCanvases[shareMode][frame]["redraw"]) { - drawOffscreenCanvas(frame); - } - cCtx.drawImage(offscreenCanvases[shareMode][frame]["canvas"], 0, 0); + drawCircles(cCtx, frame); } - function startAnimating() { - startTime = Date.now(); - animateBg(); - } - - let currentFrame = 0; function animateBg() { let now = Date.now(); - if (!animate) { - // Animation stopped -> don't draw next frame + if (!animate && currentFrame === lastFrame) { + // Animation stopped and cycle finished -> stop drawing frames return; } @@ -460,38 +499,62 @@ class BackgroundCanvas { requestAnimationFrame(animateBg); } - function switchAnimation(state) { - if (!animate && state) { - // animation starts again. Set startTime to specific value to prevent frame jump - startTime = Date.now() - 1000 * currentFrame / fps; - } - animate = state; - animateBg(); - } + createCanvas(); - function redrawOnShareModeChange(active) { - shareMode = active - } - - init(); - startAnimating(); - - // redraw canvas - Events.on('resize', _ => init()); - Events.on('redraw-canvas', _ => init()); - Events.on('translation-loaded', _ => init()); - - // ShareMode - Events.on('share-mode-changed', e => redrawOnShareModeChange(e.detail.active)); - - // Start and stop animation - Events.on('background-animation', e => switchAnimation(e.detail.animate)) - - Events.on('offline', _ => switchAnimation(false)); - Events.on('online', _ => switchAnimation(true)); + return {init, startAnimation, switchAnimation, onShareModeChange}; } - async fadeIn() { - this.canvas.classList.remove('opacity-0'); + initAnimationOffscreen() { + console.log("Use OffscreenCanvas to draw background animation.") + + let baseColorNormal = this.baseColorNormal; + let baseColorShareMode = this.baseColorShareMode; + let baseOpacityNormal = this.baseOpacityNormal; + let baseOpacityShareMode = this.baseOpacityShareMode; + let speed = this.speed; + let fps = this.fps; + let $canvas = this.$canvas; + let $footer = this.$footer; + + const offscreen = $canvas.transferControlToOffscreen(); + const worker = new Worker("scripts/canvas-worker.js"); + + function createCanvas() { + worker.postMessage({ + type: "createCanvas", + canvas: offscreen, + baseColorNormal: baseColorNormal, + baseColorShareMode: baseColorShareMode, + baseOpacityNormal: baseOpacityNormal, + baseOpacityShareMode: baseOpacityShareMode, + speed: speed, + fps: fps + }, [offscreen]); + } + + function init() { + worker.postMessage({ + type: "initCanvas", + footerOffsetHeight: $footer.offsetHeight, + clientWidth: document.documentElement.clientWidth, + clientHeight: document.documentElement.clientHeight + }); + } + + function startAnimation() { + worker.postMessage({ type: "startAnimation" }); + } + + function onShareModeChange(active) { + worker.postMessage({ type: "onShareModeChange", active: active }); + } + + function switchAnimation(animate) { + worker.postMessage({ type: "switchAnimation", animate: animate }); + } + + createCanvas(); + + return {init, startAnimation, switchAnimation, onShareModeChange}; } } \ No newline at end of file diff --git a/public/service-worker.js b/public/service-worker.js index c6420fe..f022b11 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -17,6 +17,7 @@ const relativePathsToCache = [ 'scripts/ui-main.js', 'scripts/util.js', 'scripts/zip.min.js', + 'scripts/canvas-worker.js', 'sounds/blop.mp3', 'sounds/blop.ogg', 'images/favicon-96x96.png', From ae68ede3f37445caa56b2b08ef307ff32490b38e Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sun, 16 Feb 2025 19:29:14 +0100 Subject: [PATCH 50/77] Put worker and libraries in subfolders --- public/scripts/{ => libs}/heic2any.min.js | 0 public/scripts/{ => libs}/no-sleep.min.js | 0 public/scripts/{ => libs}/qr-code.min.js | 0 public/scripts/{ => libs}/zip.min.js | 0 public/scripts/main.js | 8 ++++---- public/scripts/ui-main.js | 2 +- public/scripts/{ => worker}/canvas-worker.js | 0 public/service-worker.js | 9 +++++---- 8 files changed, 10 insertions(+), 9 deletions(-) rename public/scripts/{ => libs}/heic2any.min.js (100%) rename public/scripts/{ => libs}/no-sleep.min.js (100%) rename public/scripts/{ => libs}/qr-code.min.js (100%) rename public/scripts/{ => libs}/zip.min.js (100%) rename public/scripts/{ => worker}/canvas-worker.js (100%) diff --git a/public/scripts/heic2any.min.js b/public/scripts/libs/heic2any.min.js similarity index 100% rename from public/scripts/heic2any.min.js rename to public/scripts/libs/heic2any.min.js diff --git a/public/scripts/no-sleep.min.js b/public/scripts/libs/no-sleep.min.js similarity index 100% rename from public/scripts/no-sleep.min.js rename to public/scripts/libs/no-sleep.min.js diff --git a/public/scripts/qr-code.min.js b/public/scripts/libs/qr-code.min.js similarity index 100% rename from public/scripts/qr-code.min.js rename to public/scripts/libs/qr-code.min.js diff --git a/public/scripts/zip.min.js b/public/scripts/libs/zip.min.js similarity index 100% rename from public/scripts/zip.min.js rename to public/scripts/libs/zip.min.js diff --git a/public/scripts/main.js b/public/scripts/main.js index 8960ed2..6ab999a 100644 --- a/public/scripts/main.js +++ b/public/scripts/main.js @@ -14,10 +14,10 @@ class PairDrop { "scripts/util.js", "scripts/network.js", "scripts/ui.js", - "scripts/qr-code.min.js", - "scripts/zip.min.js", - "scripts/no-sleep.min.js", - "scripts/heic2any.min.js" + "scripts/libs/heic2any.min.js", + "scripts/libs/no-sleep.min.js", + "scripts/libs/qr-code.min.js", + "scripts/libs/zip.min.js" ]; this.registerServiceWorker(); diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index 3dbd612..f9ecbad 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -517,7 +517,7 @@ class BackgroundCanvas { let $footer = this.$footer; const offscreen = $canvas.transferControlToOffscreen(); - const worker = new Worker("scripts/canvas-worker.js"); + const worker = new Worker("scripts/worker/canvas-worker.js"); function createCanvas() { worker.postMessage({ diff --git a/public/scripts/canvas-worker.js b/public/scripts/worker/canvas-worker.js similarity index 100% rename from public/scripts/canvas-worker.js rename to public/scripts/worker/canvas-worker.js diff --git a/public/service-worker.js b/public/service-worker.js index f022b11..07e2c50 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -10,14 +10,15 @@ const relativePathsToCache = [ 'scripts/localization.js', 'scripts/main.js', 'scripts/network.js', - 'scripts/no-sleep.min.js', 'scripts/persistent-storage.js', - 'scripts/qr-code.min.js', 'scripts/ui.js', 'scripts/ui-main.js', 'scripts/util.js', - 'scripts/zip.min.js', - 'scripts/canvas-worker.js', + 'scripts/worker/canvas-worker.js', + 'scripts/libs/heic2any.min.js', + 'scripts/libs/no-sleep.min.js', + 'scripts/libs/qr-code.min.js', + 'scripts/libs/zip.min.js', 'sounds/blop.mp3', 'sounds/blop.ogg', 'images/favicon-96x96.png', From 8eea54f8dd022fb67a4454ee0f93c7f8413cac86 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sun, 16 Feb 2025 23:20:43 +0100 Subject: [PATCH 51/77] Make sure older webkit/blink based browsers are able to render opacity of circles --- public/scripts/ui-main.js | 9 ++++++++- public/scripts/worker/canvas-worker.js | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index f9ecbad..6a7dd44 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -461,7 +461,14 @@ class BackgroundCanvas { opacity *= (8 * dw - radius) / dw } - ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; + if (ctx.setStrokeColor) { + // older blink/webkit browsers do not understand opacity in strokeStyle. Use deprecated setStrokeColor + let baseColorRgb = baseColor.split(" "); + ctx.setStrokeColor(baseColorRgb[0], baseColorRgb[1], baseColorRgb[2], opacity); + } + else { + ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; + } ctx.beginPath(); ctx.arc(x0, y0, radius, 0, 2 * Math.PI); ctx.stroke(); diff --git a/public/scripts/worker/canvas-worker.js b/public/scripts/worker/canvas-worker.js index e7e6bc7..1428bc1 100644 --- a/public/scripts/worker/canvas-worker.js +++ b/public/scripts/worker/canvas-worker.js @@ -96,7 +96,15 @@ function drawCircle(ctx, radius) { opacity *= (8 * dw - radius) / dw } - ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; + if (ctx.setStrokeColor) { + // older blink/webkit based browsers do not understand opacity in strokeStyle. Use deprecated setStrokeColor instead + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle#webkitblink-specific_note + let baseColorRgb = baseColor.split(" "); + ctx.setStrokeColor(baseColorRgb[0], baseColorRgb[1], baseColorRgb[2], opacity); + } + else { + ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; + } ctx.beginPath(); ctx.arc(x0, y0, radius, 0, 2 * Math.PI); ctx.stroke(); From ec0012ecd1d27133051452b822eb96843a9290f8 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sun, 16 Feb 2025 23:23:27 +0100 Subject: [PATCH 52/77] Speed up animation slightly --- public/scripts/ui-main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index 6a7dd44..812a4ae 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -348,7 +348,7 @@ class BackgroundCanvas { this.baseColorShareMode = '168 168 255'; this.baseOpacityNormal = 0.4; this.baseOpacityShareMode = 0.8; - this.speed = 0.4; + this.speed = 0.5; this.fps = 40; // if browser supports OffscreenCanvas From 09e4e5d289eb11793fea8b6fba6e54f9bfbe79e3 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sun, 16 Feb 2025 23:47:35 +0100 Subject: [PATCH 53/77] Prevent background animation from being cut on devices with a notch --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 5dec40a..d1873b2 100644 --- a/public/index.html +++ b/public/index.html @@ -6,7 +6,7 @@ PairDrop | Transfer Files Cross-Platform. No Setup, No Signup. - + From 61caa43ce9cef1b126c3d491a54a10f04127af18 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 17 Feb 2025 05:37:36 +0100 Subject: [PATCH 54/77] Translated using Weblate (Basque) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: xabirequejo Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/eu/ Translation: PairDrop/pairdrop-spa --- public/lang/eu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/lang/eu.json b/public/lang/eu.json index 2e528b3..bcae982 100644 --- a/public/lang/eu.json +++ b/public/lang/eu.json @@ -73,7 +73,7 @@ "copied-text": "Testua arbelera kopiatu da", "online": "Berriro zaude linean", "unfinished-transfers-warning": "Amaitu gabeko trukatzeak daude. Ziur PairDrop itxi nahi duzula?", - "selected-peer-left": "Falta diren hautatutako kideak", + "selected-peer-left": "Hautatutako kideak alde egin du", "pairing-key-invalidated": "{{key}} gakoa baliogabetu da" }, "dialogs": { From 43ce64d68abc078bfc42a1ed07a58ae27f941347 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 17 Feb 2025 05:37:37 +0100 Subject: [PATCH 55/77] Translated using Weblate (Bengali) Currently translated at 1.2% (2 of 166 strings) Added translation using Weblate (Bengali) Co-authored-by: Hosted Weblate Co-authored-by: Saif Mahmud Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/bn/ Translation: PairDrop/pairdrop-spa --- public/lang/bn.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 public/lang/bn.json diff --git a/public/lang/bn.json b/public/lang/bn.json new file mode 100644 index 0000000..4f3f52a --- /dev/null +++ b/public/lang/bn.json @@ -0,0 +1,6 @@ +{ + "header": { + "about_title": "পেয়ার ড্রপ সম্পর্কে", + "install_title": "পেয়ার ড্রপ ইন্সটল করুন" + } +} From 9f4309c866ce689c8de90545907e3835accd1f36 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 17 Feb 2025 05:37:37 +0100 Subject: [PATCH 56/77] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: Tobbz Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/nb_NO/ Translation: PairDrop/pairdrop-spa --- public/lang/nb.json | 98 +++++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 26 deletions(-) diff --git a/public/lang/nb.json b/public/lang/nb.json index d9a4022..468ea19 100644 --- a/public/lang/nb.json +++ b/public/lang/nb.json @@ -3,50 +3,62 @@ "edit-paired-devices_title": "Rediger sammenkoblede enheter", "about_title": "Om PairDrop", "about_aria-label": "Åpne «Om PairDrop»", - "theme-auto_title": "Juster drakt til system", + "theme-auto_title": "Juster drakt til system automatisk", "theme-light_title": "Alltid bruk lys drakt", "theme-dark_title": "Alltid bruk mørk drakt", "notification_title": "Skru på varslinger", "cancel-share-mode": "Ferdig", "install_title": "Installer PairDrop", - "pair-device_title": "Sammenkoble enhet", - "language-selector_title": "Velg språk" + "pair-device_title": "Sammenkoble dine enheter permanent", + "language-selector_title": "Velg språk", + "edit-share-mode": "Rediger", + "expand_title": "Utvid overskriftknapprad", + "join-public-room_title": "Bli med i et offentlig rom midlertidig" }, "footer": { "webrtc": "hvis WebRTC ikke er tilgjengelig.", "display-name_data-placeholder": "Laster inn…", - "display-name_title": "Rediger det vedvarende enhetsnavnet ditt", + "display-name_title": "Rediger ditt enhetsnavn permanent", "traffic": "Trafikken", "on-this-network": "på dette nettverket", "known-as": "Du er kjent som:", - "paired-devices": "sammenkoblede enheter", - "routed": "Sendes gjennom tjeneren" + "paired-devices": "av sammenkoblede enheter", + "routed": "Sendes gjennom tjeneren", + "discovery": "Du kan bli oppdaget:", + "on-this-network_title": "Du kan bli oppdaget av alle på dette nettverket.", + "paired-devices_title": "Du kan alltid bli oppdaget av sammenkoblede enheter uavhengig av nettverk.", + "public-room-devices_title": "Du kan bli oppdaget av enheter i dette offentlige rommet uavhengig av nettverk.", + "public-room-devices": "i rom {{roomId}}" }, "instructions": { "x-instructions_desktop": "Klikk for å sende filer, eller høyreklikk for å sende en melding", "x-instructions_mobile": "Trykk for å sende filer, eller lang-trykk for å sende en melding", "x-instructions_data-drop-bg": "Slipp for å velge mottager", - "x-instructions-share-mode_desktop": "Klikk for å sende", + "x-instructions-share-mode_desktop": "Klikk for å sende {{descriptor}}", "no-peers_data-drop-bg": "Slipp for å velge mottager", "no-peers-title": "Åpne PairDrop på andre enheter for å sende filer", - "no-peers-subtitle": "Sammenkoble enheter for å kunne oppdages på andre nettverk", + "no-peers-subtitle": "Sammenkoble enheter eller bli med i et offentlig rom for å kunne oppdages på andre nettverk", "x-instructions_data-drop-peer": "Slipp for å sende til likemann", - "x-instructions-share-mode_mobile": "Trykk for å sende", + "x-instructions-share-mode_mobile": "Trykk for å sende {{descriptor}}", "activate-share-mode-base": "Åpne PairDrop på andre enheter for å sende", "activate-share-mode-and-other-files-plural": "og {{count}} andre filer", - "activate-share-mode-shared-text": "delt tekst" + "activate-share-mode-shared-text": "delt tekst", + "activate-share-mode-and-other-file": "og 1 annen fil", + "activate-share-mode-shared-file": "delt fil", + "activate-share-mode-shared-files-plural": "{{count}} delte filer", + "webrtc-requirement": "For å bruke denne PairDrop-økten, må WebRTC være aktivert!" }, "dialogs": { "input-key-on-this-device": "Skriv inn denne nøkkelen på en annen enhet", - "pair-devices-title": "Sammenkoble enheter", + "pair-devices-title": "Sammenkoble Enheter Permanent", "would-like-to-share": "ønsker å dele", "auto-accept-instructions-2": "for å godkjenne alle filer sendt fra den enheten automatisk.", "paired-devices-wrapper_data-empty": "Ingen sammenkoblede enheter.", - "enter-key-from-another-device": "Skriv inn nøkkel fra en annen enhet for å fortsette.", - "edit-paired-devices-title": "Rediger sammenkoblede enheter", + "enter-key-from-another-device": "Skriv inn nøkkel fra en annen enhet her.", + "edit-paired-devices-title": "Rediger Sammenkoblede Enheter", "accept": "Godta", "has-sent": "har sendt:", - "base64-paste-to-send": "Trykk her for å sende {{type}}", + "base64-paste-to-send": "Lim inn her for å dele {{type}}", "base64-text": "tekst", "base64-files": "filer", "file-other-description-image-plural": "og {{count}} andre bilder", @@ -64,9 +76,9 @@ "receive-text-title": "Melding mottatt", "auto-accept": "auto-godkjenn", "share": "Del", - "send-message-to": "Send en melding til", + "send-message-to": "Til:", "send": "Send", - "base64-tap-to-paste": "Trykk her for å lime inn {{type}}", + "base64-tap-to-paste": "Trykk her for å dele {{type}}", "file-other-description-image": "og ett annet bilde", "file-other-description-file-plural": "og {{count}} andre filer", "title-file-plural": "Filer", @@ -74,7 +86,28 @@ "file-other-description-file": "og én annen fil", "title-image": "Bilde", "title-file": "Fil", - "title-image-plural": "Bilder" + "title-image-plural": "Bilder", + "join": "Bli med", + "share-text-checkbox": "Alltid vis denne dialogen ved deling av tekst", + "language-selector-title": "Velg Språk", + "unpair": "Fjern sammenkobling", + "temporary-public-room-title": "Midlertidig Offentlig Rom", + "input-room-id-on-another-device": "Legg inn denne rom-IDen på en annen enhet", + "hr-or": "ELLER", + "leave": "Forlat", + "paired-device-removed": "Sammenkoblet enhet har blitt fjernet.", + "message_title": "Sett inn meldingen du vil sende", + "message_placeholder": "Tekst", + "base64-title-files": "Delte filer", + "system-language": "Systemspråk", + "public-room-qr-code_title": "Trykk for å kopiere lenke til offentlig rom", + "pair-devices-qr-code_title": "Trykk for å kopiere lenken til å sammenkoble denne enheten", + "approve": "godkjenn", + "share-text-title": "Del Tekstmelding", + "share-text-subtitle": "Rediger melding før sending:", + "close-toast_title": "Lukk varsel", + "enter-room-id-from-another-device": "Legg inn rom-ID fra en annen enhet for å bli med i rommet.", + "base64-title-text": "Delt Tekst" }, "about": { "close-about_aria-label": "Lukk «Om PairDrop»", @@ -82,7 +115,11 @@ "claim": "Den enkleste måten å overføre filer mellom enheter", "buy-me-a-coffee_title": "Spander drikke!", "tweet_title": "Tvitre om PairDrop", - "github_title": "PairDrop på GitHub" + "github_title": "PairDrop på GitHub", + "mastodon_title": "Skriv om PairDrop på Mastadon", + "bluesky_title": "Følg oss på BlueSky", + "custom_title": "Følg oss", + "privacypolicy_title": "Åpne vår personvernerklæring" }, "notifications": { "copied-to-clipboard": "Kopiert til utklippstavlen", @@ -95,7 +132,7 @@ "file-transfer-completed": "Filoverføring utført", "selected-peer-left": "Valgt likemann dro", "pairing-key-invalid": "Ugyldig nøkkel", - "connecting": "Kobler til …", + "connecting": "Kobler til…", "pairing-not-persistent": "Sammenkoblede enheter er ikke vedvarende", "offline": "Du er frakoblet", "online-requirement": "Du må være på nett for å koble sammen enheter.", @@ -110,28 +147,37 @@ "pairing-success": "Enheter sammenkoblet", "pairing-cleared": "Sammenkobling av alle enheter opphevet", "pairing-key-invalidated": "Nøkkel {{key}} ugyldiggjort", - "copied-text-error": "Kunne ikke legge innhold i utklkippstavlen. Kopier manuelt!", + "copied-text-error": "Kunne ikke legge innhold i utklippstavlen. Kopier manuelt!", "clipboard-content-incorrect": "Utklippstavleinnholdet er uriktig", "link-received": "Lenke mottatt av {{name}} - Klikk for å åpne", "request-title": "{{name}} ønsker å overføre {{count}} {{descriptor}}", "message-received": "Melding mottatt av {{name}} - Klikk for å åpne", "files-incorrect": "Filene er uriktige", "ios-memory-limit": "Forsendelse av filer til iOS er kun mulig opptil 200 MB av gangen", - "unfinished-transfers-warning": "Lukk med ufullførte overføringer?", - "rate-limit-join-key": "Forsøksgrense overskredet. Vent 10 sek. og prøv igjen." + "unfinished-transfers-warning": "Det er ufullførte overføringer. Er du sikker på at du vil lukke PairDrop?", + "rate-limit-join-key": "Grense nådd. Vent 10 sekunder og prøv igjen.", + "copied-to-clipboard-error": "Kopiering ikke mulig, Kopier manuelt.", + "public-room-id-invalid": "Ugyldig rom-ID", + "public-room-left": "Forlot offentlig rom {{publicRoomId}}", + "room-url-copied-to-clipboard": "Lenke for offentlig rom kopiert til utklippstavle", + "online-requirement-pairing": "Du må være på nett for å sammenkoble enheter", + "online-requirement-public-room": "Du må være på nett for å opprette et offentlig rom", + "pair-url-copied-to-clipboard": "Lenke for sammenkobling til denne enheten kopiert til utklipstavle", + "notifications-permissions-error": "Varlseltillatelse har blitt blokkert fordi brukeren har avvist forespørselen flere ganger. Dette kan tilbakestilles i Sideinnformasjon som kan bli funnet ved å trykke på låseikonet ved siden av URL-feltet." }, "document-titles": { "file-received": "Fil mottatt", "file-received-plural": "{{count}} filer mottatt", "message-received": "Melding mottatt", "file-transfer-requested": "Filoverføring forespurt", - "message-received-plural": "{{count}} meldinger mottatt" + "message-received-plural": "{{count}} meldinger mottatt", + "image-transfer-requested": "Blideoverføring forespurt" }, "peer-ui": { - "preparing": "Forbereder …", + "preparing": "Forbereder…", "waiting": "Venter…", - "processing": "Behandler …", - "transferring": "Overfører …", + "processing": "Behandler…", + "transferring": "Overfører…", "click-to-send": "Klikk for å sende filer, eller høyreklikk for å sende en melding", "click-to-send-share-mode": "Klikk for å sende {{descriptor}}", "connection-hash": "Sammenlign dette sikkerhetsnummeret på begge enhetene for å bekrefte ende-til-ende -krypteringen" From b8a973f037aa40de5300afd820368aa2ed347515 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 17 Feb 2025 11:52:07 +0100 Subject: [PATCH 57/77] Fix background animation size on 4k screens and decrease base opacity --- public/scripts/ui-main.js | 6 +++--- public/scripts/worker/canvas-worker.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index 01ad2ab..95cb3ba 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -346,10 +346,10 @@ class BackgroundCanvas { initAnimation() { this.baseColorNormal = '168 168 168'; this.baseColorShareMode = '168 168 255'; - this.baseOpacityNormal = 0.4; + this.baseOpacityNormal = 0.3; this.baseOpacityShareMode = 0.8; this.speed = 0.5; - this.fps = 40; + this.fps = 60; // if browser supports OffscreenCanvas // -> put canvas drawing into serviceworker to unblock main thread @@ -427,7 +427,7 @@ class BackgroundCanvas { c.height = h; x0 = w / 2; y0 = h - offset; - dw = Math.round(Math.min(Math.max(w, h), 800) / 10); + dw = Math.round(Math.min(Math.max(0.6 * w, h)) / 10); drawFrame(currentFrame); } diff --git a/public/scripts/worker/canvas-worker.js b/public/scripts/worker/canvas-worker.js index 26ec1f0..055c328 100644 --- a/public/scripts/worker/canvas-worker.js +++ b/public/scripts/worker/canvas-worker.js @@ -62,7 +62,7 @@ function initCanvas(footerOffsetHeight, clientWidth, clientHeight) { c.height = h; x0 = w / 2; y0 = h - offset; - dw = Math.round(Math.min(Math.max(w, h), 800) / 10); + dw = Math.round(Math.min(Math.max(0.6 * w, h)) / 10); drawFrame(currentFrame); } From 800d492da55382944dcd0655131e1908d220f322 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 17 Feb 2025 12:36:49 +0100 Subject: [PATCH 58/77] Fix animation color on older webkit/blink based browsers --- public/scripts/ui-main.js | 4 ++-- public/scripts/worker/canvas-worker.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/scripts/ui-main.js b/public/scripts/ui-main.js index 95cb3ba..1af7c37 100644 --- a/public/scripts/ui-main.js +++ b/public/scripts/ui-main.js @@ -462,8 +462,8 @@ class BackgroundCanvas { if (ctx.setStrokeColor) { // older blink/webkit browsers do not understand opacity in strokeStyle. Use deprecated setStrokeColor - let baseColorRgb = baseColor.split(" "); - ctx.setStrokeColor(baseColorRgb[0], baseColorRgb[1], baseColorRgb[2], opacity); + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle#webkitblink-specific_note + ctx.setStrokeColor("grey", opacity); } else { ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; diff --git a/public/scripts/worker/canvas-worker.js b/public/scripts/worker/canvas-worker.js index 055c328..ff2650f 100644 --- a/public/scripts/worker/canvas-worker.js +++ b/public/scripts/worker/canvas-worker.js @@ -98,8 +98,7 @@ function drawCircle(ctx, radius) { if (ctx.setStrokeColor) { // older blink/webkit based browsers do not understand opacity in strokeStyle. Use deprecated setStrokeColor instead // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle#webkitblink-specific_note - let baseColorRgb = baseColor.split(" "); - ctx.setStrokeColor(baseColorRgb[0], baseColorRgb[1], baseColorRgb[2], opacity); + ctx.setStrokeColor("grey", opacity); } else { ctx.strokeStyle = `rgb(${baseColor} / ${opacity})`; From fa992498fbbad363c878acd1c42ee41df6ba5db7 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 17 Feb 2025 13:15:51 +0100 Subject: [PATCH 59/77] Revert "Prevent background animation from being cut on devices with a notch" This reverts commit 09e4e5d289eb11793fea8b6fba6e54f9bfbe79e3. --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 8e3a1ec..e47983f 100644 --- a/public/index.html +++ b/public/index.html @@ -6,7 +6,7 @@ PairDrop | Transfer Files Cross-Platform. No Setup, No Signup. - + From ef61cc4dfe8376eb138ff3b6919c62ccacf909d4 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 17 Feb 2025 13:33:07 +0100 Subject: [PATCH 60/77] Update node dependencies --- package-lock.json | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8812cb9..3fc7477 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "pairdrop", - "version": "1.10.11", + "version": "1.11.0", "license": "ISC", "dependencies": { "express": "^4.18.2", @@ -68,9 +68,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -263,9 +263,9 @@ } }, "node_modules/express-rate-limit": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.3.1.tgz", - "integrity": "sha512-BbaryvkY4wEgDqLgD18/NSy2lDO2jTuT9Y8c1Mpx0X63Yz0sYd5zN6KPe7UvpuSVvV33T6RaE1o1IVZQjHMYgw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", "engines": { "node": ">= 16" }, @@ -273,7 +273,7 @@ "url": "https://github.com/sponsors/express-rate-limit" }, "peerDependencies": { - "express": "4 || 5 || ^5.0.0-beta.1" + "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "node_modules/finalhandler": { @@ -758,9 +758,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", - "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", + "version": "1.0.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", + "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==", "funding": [ { "type": "opencollective", @@ -775,6 +775,9 @@ "url": "https://github.com/sponsors/faisalman" } ], + "bin": { + "ua-parser-js": "script/cli.js" + }, "engines": { "node": "*" } @@ -812,9 +815,9 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, From b3c61f4bafb1884de789eda3cbe56c16b44d16ce Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 17 Feb 2025 13:50:15 +0100 Subject: [PATCH 61/77] Increase version to v1.11.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Enhancements - Make PWA standalone (#264) - Bring back background animation after performance optimization (#285) - Add support for Safari 11-15 (#358) - Update Twitter icon and URL to (X) (Thanks @realchrislovett) - Update node dependencies ## Fixes - Fix pasting of files on background to invoke share-mode and make it available on Firefox (#370) - Fix padding issue on EditPairedDevicesDialog and Base64Dialog - Fix hydration of URLs into links in received messages that have exclamation marks in path ## Languages - Translations updates from Hosted Weblate (Basque, Norwegian Bokmål) --- .github/ISSUE_TEMPLATE/bug-report.md | 4 ++-- docs/how-to.md | 4 ++-- package-lock.json | 2 +- package.json | 2 +- public/index.html | 2 +- public/service-worker.js | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 419d837..5263696 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -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.11 +Version: v1.11.0 **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.11 +Version: v1.11.0 **Additional context** Add any other context about the problem here. diff --git a/docs/how-to.md b/docs/how-to.md index 7d899db..fcad02f 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -45,11 +45,11 @@ This pairdrop-cli version was released alongside v1.10.4 #### Linux / Mac 1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) ```shell - wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.11/pairdrop-cli.zip" + wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.0/pairdrop-cli.zip" ``` or ```shell - curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.11/pairdrop-cli.zip" + curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.0/pairdrop-cli.zip" ``` 2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/` ```shell diff --git a/package-lock.json b/package-lock.json index 3fc7477..bdc9acd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.10.11", + "version": "1.11.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index f4fd629..b36e5d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.10.11-", + "version": "1.11.0", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index e47983f..45df0e4 100644 --- a/public/index.html +++ b/public/index.html @@ -668,7 +668,7 @@

PairDrop

-
v1.10.11
+
v1.11.0
diff --git a/public/service-worker.js b/public/service-worker.js index 07e2c50..551f25e 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.10.11'; +const cacheVersion = 'v1.11.0'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [ From a39d8cdc845e6356d9eae2a907aa4bf5576f818a Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 17 Feb 2025 19:20:17 +0100 Subject: [PATCH 62/77] Fix chromium filename by defaulting mime to "application/octet-stream" --- public/scripts/network.js | 5 ++--- public/scripts/util.js | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/scripts/network.js b/public/scripts/network.js index c92befc..4382597 100644 --- a/public/scripts/network.js +++ b/public/scripts/network.js @@ -1082,7 +1082,7 @@ class PeersManager { } async _onFilesSelected(message) { - let files = mime.addMissingMimeTypesToFiles(message.files); + let files = mime.addMissingMimeTypesToFiles([...message.files]); await this.peers[message.to].requestFileTransfer(files); } @@ -1306,9 +1306,8 @@ class FileDigester { const blob = new Blob(this._buffer) this._buffer = null; this._callback(new File([blob], this._name, { - type: this._mime, + type: this._mime || "application/octet-stream", lastModified: new Date().getTime() })); } - } diff --git a/public/scripts/util.js b/public/scripts/util.js index 1dcc388..24e2626 100644 --- a/public/scripts/util.js +++ b/public/scripts/util.js @@ -392,7 +392,8 @@ const mime = (() => { "vob": "video/x-ms-vob", "wmv": "video/x-ms-wmv", "avi": "video/x-msvideo", - "*": "video/x-sgi-movie" + "*": "video/x-sgi-movie", + "kdbx": "application/x-keepass2" } return { @@ -409,7 +410,7 @@ const mime = (() => { // if filetype is empty guess via suffix otherwise leave unchanged for (let i = 0; i < files.length; i++) { if (!files[i].type) { - files[i] = new File([files[i]], files[i].name, {type: mime.guessMimeByFilename(files[i].name) || ""}); + files[i] = new File([files[i]], files[i].name, {type: mime.guessMimeByFilename(files[i].name) || "application/octet-stream"}); } } return files; From 547038c9bca43a8281f422b902ed7885a439733d Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 17 Feb 2025 19:32:54 +0100 Subject: [PATCH 63/77] Fix file name display if no file extension is present --- public/scripts/ui.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index cf4d014..25171ae 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -873,7 +873,9 @@ class ReceiveDialog extends Dialog { const fileName = files[0].name; const fileNameSplit = fileName.split('.'); - const fileExtension = '.' + fileNameSplit[fileNameSplit.length - 1]; + const fileExtension = fileNameSplit.length > 1 + ? '.' + fileNameSplit[fileNameSplit.length - 1] + : ''; this.$fileStem.innerText = fileName.substring(0, fileName.length - fileExtension.length); this.$fileExtension.innerText = fileExtension; this.$fileSize.innerText = this._formatFileSize(totalSize); From aa09da3076ac1ee610b5bd60c0b178a157f21d73 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 18 Feb 2025 13:34:01 +0100 Subject: [PATCH 64/77] Translated using Weblate (Japanese) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: maboroshin Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/ Translation: PairDrop/pairdrop-spa --- public/lang/ja.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/public/lang/ja.json b/public/lang/ja.json index 6184de8..d4e8fdb 100644 --- a/public/lang/ja.json +++ b/public/lang/ja.json @@ -12,7 +12,7 @@ "routed": "サーバーを経由します", "discovery": "このデバイスを検出可能なネットワーク:", "on-this-network_title": "このネットワーク上のすべてのデバイスからアクセスできます。", - "known-as": "他のデバイスに表示される名前:" + "known-as": "このデバイスの名前:" }, "notifications": { "request-title": "{{name}}は{{count}}個の{{descriptor}}を共有しようとしています", @@ -25,7 +25,7 @@ "connected": "接続しました", "pairing-not-persistent": "このデバイスとのペアリングは解除される可能性があります", "text-content-incorrect": "無効なテキスト内容です", - "message-transfer-completed": "メッセージの送信が完了しました", + "message-transfer-completed": "メッセージを送信しました", "file-transfer-completed": "ファイル転送が完了しました", "file-content-incorrect": "無効なファイル内容です", "files-incorrect": "ファイルが間違っています", @@ -59,7 +59,7 @@ }, "header": { "cancel-share-mode": "キャンセル", - "theme-auto_title": "システムテーマに合わせる", + "theme-auto_title": "システムのテーマに合わせる", "install_title": "PairDropをインストール", "theme-dark_title": "常にダークテーマを使用する", "pair-device_title": "他のデバイスとペアリングする", @@ -74,7 +74,7 @@ "expand_title": "ヘッダーボタン列を拡大する" }, "instructions": { - "x-instructions_mobile": "タップでファイルを送信、長押しでメッセージを送信します", + "x-instructions_mobile": "タップでファイル送信、長押しでメッセージ送信", "x-instructions-share-mode_desktop": "クリックして{{descriptor}}を送信", "activate-share-mode-and-other-files-plural": "とその他{{count}}個のファイル", "x-instructions-share-mode_mobile": "タップして{{descriptor}}を送信", @@ -82,7 +82,7 @@ "no-peers-subtitle": "ペアリングや公開ルームを使用すると、他のネットワーク上のデバイスと共有できます", "activate-share-mode-shared-text": "共有されたテキスト", "x-instructions_desktop": "左クリックでファイルを送信、右クリックでメッセージを送信します", - "no-peers-title": "ファイルを共有するには他のデバイスでPairDropを開いてください", + "no-peers-title": "ファイル共有するには他のデバイスでPairDropを開きます", "x-instructions_data-drop-peer": "ドロップするとこのデバイスに送信します", "x-instructions_data-drop-bg": "送信したいデバイスの上でドロップしてください", "no-peers_data-drop-bg": "送信したいデバイスの上でドロップしてください", @@ -103,7 +103,7 @@ "dialogs": { "base64-paste-to-send": "ここをタップして{{type}}を送信", "auto-accept-instructions-2": "」を有効にすると、そのデバイスから送信されたすべてのファイルを自動的に受け入れます。", - "receive-text-title": "メッセージを受信しました", + "receive-text-title": "メッセージを受信", "edit-paired-devices-title": "ペアリング設定", "cancel": "キャンセル", "auto-accept-instructions-1": "「", @@ -123,14 +123,14 @@ "file-other-description-image": "とその他1個の画像", "temporary-public-room-title": "公開ルーム", "base64-files": "ファイル", - "has-sent": "が送信しました:", + "has-sent": "が送信:", "file-other-description-file": "とその他1個のファイル", "close": "閉じる", "system-language": "システム言語", "unpair": "ペアリング解除", "title-image": "画像", "file-other-description-file-plural": "とその他{{count}}個のファイル", - "would-like-to-share": "が以下のファイルを共有しようとしています", + "would-like-to-share": "がこれを共有しています", "send-message-to": "このデバイスにメッセージを送信:", "language-selector-title": "言語設定", "pair": "ペアリング", @@ -174,8 +174,8 @@ "privacypolicy_title": "プライバシーポリシーを開く" }, "document-titles": { - "file-transfer-requested": "ファイルの転送がリクエストされました", - "image-transfer-requested": "画像の転送がリクエストされました", + "file-transfer-requested": "ファイル転送の要求があります", + "image-transfer-requested": "画像の転送の要求があります", "message-received-plural": "{{count}}個のメッセージを受信しました", "message-received": "メッセージを受信しました", "file-received": "ファイルを受信しました", From 341fa7fdf06b1caeeb538afe1f353c8f6ad30a2c Mon Sep 17 00:00:00 2001 From: Chris Lovett <57230137+realchrislovett@users.noreply.github.com> Date: Wed, 19 Feb 2025 05:46:00 -0500 Subject: [PATCH 65/77] Restore desktop Chrome PWA button (#383) * Restore desktop Chrome PWA button with start_url ./ --- public/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/public/manifest.json b/public/manifest.json index edcf69a..3cced84 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -26,6 +26,7 @@ } ], "background_color": "#efefef", + "start_url": "./", "display": "standalone", "theme_color": "#3367d6", "screenshots" : [ From c7b7badb3d65279a7902fc4f8c733d0c1516ca17 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 19 Feb 2025 12:24:41 +0100 Subject: [PATCH 66/77] Increase version to v1.11.1 ## Fixes - Fix PWA install button on chromium based browsers (#383) (Thanks @realchrislovett) - Fix wrong file extension on chromium based browsers if mime type is not set (#355) ## Languages - Translations updates from Hosted Weblate (Japanese) --- .github/ISSUE_TEMPLATE/bug-report.md | 4 ++-- docs/how-to.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- public/index.html | 2 +- public/service-worker.js | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 5263696..6883691 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -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.11.0 +Version: v1.11.1 **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.11.0 +Version: v1.11.1 **Additional context** Add any other context about the problem here. diff --git a/docs/how-to.md b/docs/how-to.md index fcad02f..e1cb4da 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -45,11 +45,11 @@ This pairdrop-cli version was released alongside v1.10.4 #### Linux / Mac 1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) ```shell - wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.0/pairdrop-cli.zip" + wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.1/pairdrop-cli.zip" ``` or ```shell - curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.0/pairdrop-cli.zip" + curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.1/pairdrop-cli.zip" ``` 2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/` ```shell diff --git a/package-lock.json b/package-lock.json index bdc9acd..0a2d466 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pairdrop", - "version": "1.11.0", + "version": "1.11.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pairdrop", - "version": "1.11.0", + "version": "1.11.1", "license": "ISC", "dependencies": { "express": "^4.18.2", diff --git a/package.json b/package.json index b36e5d7..7542a9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.11.0", + "version": "1.11.1", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index 45df0e4..9ede262 100644 --- a/public/index.html +++ b/public/index.html @@ -668,7 +668,7 @@

PairDrop

-
v1.11.0
+
v1.11.1
diff --git a/public/service-worker.js b/public/service-worker.js index 551f25e..eb3601f 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.11.0'; +const cacheVersion = 'v1.11.1'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [ From b0b091c4f761f9e952d8cc065eff9efbd9b40de7 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sun, 23 Feb 2025 19:13:44 +0100 Subject: [PATCH 67/77] FIX: switch off twitter button via env var not possible (#388) --- public/scripts/ui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index 25171ae..42da3bc 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -2404,7 +2404,7 @@ class Base64Dialog extends Dialog { class AboutUI { constructor() { this.$donationBtn = $('donation-btn'); - this.$twitterBtn = $('twitter-btn'); + this.$twitterBtn = $('x-twitter-btn'); this.$mastodonBtn = $('mastodon-btn'); this.$blueskyBtn = $('bluesky-btn'); this.$customBtn = $('custom-btn'); From 80615c533c7ed483c3913bdf19c0b10226e8fe78 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sun, 23 Feb 2025 19:20:50 +0100 Subject: [PATCH 68/77] Update Bluesky icon from square to butterfly --- public/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/index.html b/public/index.html index 9ede262..6bdc88e 100644 --- a/public/index.html +++ b/public/index.html @@ -811,9 +811,9 @@ - - - + + + From 148eb79ef0c53877857a863d7de7bdccf7adaef8 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 24 Feb 2025 20:09:00 +0100 Subject: [PATCH 69/77] Fix alphabetical sort in supportedLocales --- public/scripts/localization.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/localization.js b/public/scripts/localization.js index ec915a5..5121d0c 100644 --- a/public/scripts/localization.js +++ b/public/scripts/localization.js @@ -5,7 +5,7 @@ class Localization { Localization.defaultLocale = "en"; Localization.supportedLocales = [ "ar", "be", "bg", "ca", "cs", "da", "de", "en", "es", "et", "eu", "fa", "fr", "he", "hu", "id", "it", "ja", - "kn", "ko", "nb", "nn", "nl", "pl", "pt-BR", "ro", "ru", "sk", "ta", "tr", "uk", "zh-CN", "zh-HK", "zh-TW" + "kn", "ko", "nb", "nl", "nn", "pl", "pt-BR", "ro", "ru", "sk", "ta", "tr", "uk", "zh-CN", "zh-HK", "zh-TW" ]; Localization.supportedLocalesRtl = ["ar", "he"]; From d7b68e214ed60ac078544dad96cc32d07c0a4a21 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 24 Feb 2025 20:17:54 +0100 Subject: [PATCH 70/77] Prevent fetch response and cache update if response is redirected --- public/service-worker.js | 86 +++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/public/service-worker.js b/public/service-worker.js index eb3601f..30c2007 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,6 +1,5 @@ const cacheVersion = 'v1.11.1'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; -const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [ './', 'index.html', @@ -76,20 +75,25 @@ self.addEventListener('install', function(event) { const fromNetwork = (request, timeout) => new Promise((resolve, reject) => { const timeoutId = setTimeout(reject, timeout); - fetch(request) + fetch(request, {cache: "no-store"}) .then(response => { + if (response.redirected) { + throw new Error("Fetch is redirect. Abort usage and cache!"); + } + clearTimeout(timeoutId); resolve(response); + // Prevent requests that are in relativePathsNotToCache from being cached if (doNotCacheRequest(request)) return; - update(request) + updateCache(request) .then(() => console.log("Cache successfully updated for", request.url)) - .catch(reason => console.log("Cache could not be updated for", request.url, "Reason:", reason)); + .catch(err => console.log("Cache could not be updated for", request.url, err)); }) .catch(error => { // Handle any errors that occurred during the fetch - console.error(`Could not fetch ${request.url}. Are you online?`); + console.error(`Could not fetch ${request.url}.`); reject(error); }); }); @@ -111,16 +115,16 @@ const doNotCacheRequest = request => { }; // cache the current page to make it available for offline -const update = request => new Promise((resolve, reject) => { - if (doNotCacheRequest(request)) { - reject("Url is specifically prevented from being cached in the serviceworker."); - return; - } +const updateCache = request => new Promise((resolve, reject) => { caches .open(cacheTitle) .then(cache => fetch(request, {cache: "no-store"}) .then(response => { + if (response.redirected) { + throw new Error("Fetch is redirect. Abort usage and cache!"); + } + cache .put(request, response) .then(() => resolve()); @@ -129,9 +133,10 @@ const update = request => new Promise((resolve, reject) => { ); }); -// general strategy when making a request (eg if online try to fetch it -// from cache, if something fails fetch from network. Update cache everytime files are fetched. -// This way files should only be fetched if cacheVersion is changed +// general strategy when making a request: +// 1. Try to retrieve file from cache +// 2. If cache is not available: Fetch from network and update cache. +// This way, cached files are only updated if the cacheVersion is changed self.addEventListener('fetch', function(event) { if (event.request.method === "POST") { // Requests related to Web Share Target. @@ -141,39 +146,46 @@ self.addEventListener('fetch', function(event) { })()); } else { - // Regular requests not related to Web Share Target. - if (forceFetch) { - event.respondWith(fromNetwork(event.request, 10000)); - } - else { - event.respondWith( - fromCache(event.request) + // Regular requests not related to Web Share Target: + // If request is excluded from cache -> respondWith fromNetwork + // else -> try fromCache first + event.respondWith( + doNotCacheRequest(event.request) + ? fromNetwork(event.request, 10000) + : fromCache(event.request) .then(rsp => { // if fromCache resolves to undefined fetch from network instead - return rsp || fromNetwork(event.request, 10000); + if (!rsp) { + throw new Error("No match found."); + } + return rsp; }) - ); - } + .catch(error => { + console.error("Could not retrieve request from cache:", event.request.url, error); + return fromNetwork(event.request, 10000); + }) + ); } }); // on activation, we clean up the previously registered service workers self.addEventListener('activate', evt => { - return evt.waitUntil( - caches.keys() - .then(cacheNames => { - return Promise.all( - cacheNames.map(cacheName => { - if (cacheName !== cacheTitle) { - return caches.delete(cacheName); - } - }) - ); - }) - ) - } -); + return evt.waitUntil( + caches + .keys() + .then(cacheNames => { + return Promise.all( + cacheNames.map(cacheName => { + if (cacheName !== cacheTitle) { + console.log("Delete cache:", cacheName); + return caches.delete(cacheName); + } + }) + ); + }) + ) +}); const evaluateRequestData = function (request) { return new Promise(async (resolve) => { From d18e290ad42f6a4d83d0c251a8fda07f4b901382 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 24 Feb 2025 20:18:53 +0100 Subject: [PATCH 71/77] Add missing files to paths that get cached upon sw installation --- public/service-worker.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/public/service-worker.js b/public/service-worker.js index 30c2007..12ca3c1 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -6,6 +6,7 @@ const relativePathsToCache = [ 'manifest.json', 'styles/styles-main.css', 'styles/styles-deferred.css', + 'scripts/browser-tabs-connector.js', 'scripts/localization.js', 'scripts/main.js', 'scripts/network.js', @@ -27,14 +28,19 @@ const relativePathsToCache = [ 'images/android-chrome-512x512.png', 'images/android-chrome-512x512-maskable.png', 'images/apple-touch-icon.png', + 'fonts/OpenSans/static/OpenSans-Medium.ttf', 'lang/ar.json', 'lang/be.json', + 'lang/bg.json', 'lang/ca.json', 'lang/cs.json', 'lang/da.json', 'lang/de.json', 'lang/en.json', 'lang/es.json', + 'lang/et.json', + 'lang/eu.json', + 'lang/fa.json', 'lang/fr.json', 'lang/he.json', 'lang/hu.json', @@ -42,15 +48,20 @@ const relativePathsToCache = [ 'lang/it.json', 'lang/ja.json', 'lang/kn.json', + 'lang/ko.json', 'lang/nb.json', 'lang/nl.json', + 'lang/nn.json', 'lang/pl.json', 'lang/pt-BR.json', 'lang/ro.json', 'lang/ru.json', + 'lang/sk.json', + 'lang/ta.json', 'lang/tr.json', 'lang/uk.json', 'lang/zh-CN.json', + 'lang/zh-HK.json', 'lang/zh-TW.json' ]; const relativePathsNotToCache = [ From dbd6321fecee8639992b2b6724176721ed436103 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 24 Feb 2025 20:21:16 +0100 Subject: [PATCH 72/77] Speed up update process by skipping waiting and claiming currently open pages -> no need to close all tabs in order to get an update anymore --- public/service-worker.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/service-worker.js b/public/service-worker.js index 12ca3c1..ad5e7ea 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -69,14 +69,16 @@ const relativePathsNotToCache = [ ] self.addEventListener('install', function(event) { - // Perform install steps + // Perform install steps + console.log("Cache files for sw:", cacheVersion); event.waitUntil( caches.open(cacheTitle) .then(function(cache) { return cache .addAll(relativePathsToCache) .then(_ => { - console.log('All files cached.'); + console.log('All files cached for sw:', cacheVersion); + self.skipWaiting(); }); }) ); @@ -182,6 +184,8 @@ self.addEventListener('fetch', function(event) { // on activation, we clean up the previously registered service workers self.addEventListener('activate', evt => { + console.log("Activate sw:", cacheVersion); + evt.waitUntil(clients.claim()); return evt.waitUntil( caches .keys() From abd3a0c47c5c4346e17d80267e205024cc5a01e9 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 24 Feb 2025 03:01:56 +0100 Subject: [PATCH 73/77] Translated using Weblate (Bengali) Currently translated at 17.4% (29 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: Saif Mahmud Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/bn/ Translation: PairDrop/pairdrop-spa --- public/lang/bn.json | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/public/lang/bn.json b/public/lang/bn.json index 4f3f52a..1795d97 100644 --- a/public/lang/bn.json +++ b/public/lang/bn.json @@ -1,6 +1,35 @@ { "header": { "about_title": "পেয়ার ড্রপ সম্পর্কে", - "install_title": "পেয়ার ড্রপ ইন্সটল করুন" + "install_title": "পেয়ার ড্রপ ইন্সটল করুন", + "pair-device_title": "ডিভাইস স্থায়ী ভাবে যুক্ত করুন", + "cancel-share-mode": "বাতিল", + "theme-light_title": "সবসময় সাদা থিম ব্যাবহার", + "language-selector_title": "ভাষা সেট করুন", + "about_aria-label": "পেয়ারড্রপ সম্পর্কে", + "theme-auto_title": "থিমের ধরন ডিভাইস অনুযায়ী", + "theme-dark_title": "সবসময় কালো থিব ব্যাবহার", + "notification_title": "নোটিফিকেশন চালু করুন", + "edit-paired-devices_title": "যুক্ত ডিভাইস সম্পাদনা করুন", + "join-public-room_title": "সাময়িক ভাবে পাবলিক রুমে জয়েন করুন", + "edit-share-mode": "সম্পাদনা", + "expand_title": "হেডার বোতামের সারিটি বড় করুন" + }, + "instructions": { + "activate-share-mode-and-other-file": "আর একটি ফাইল যোগ করুন", + "activate-share-mode-shared-file": "পাঠানো ফাইল", + "no-peers-subtitle": "ডিভাইস প্রদর্শিত হতে নতুন ডিভাইস যুক্ত করুন অথবা পাবলিক রুমে জয়েন দিন", + "no-peers-title": "ফাইল পাঠানোর জন্য অন্যান্য ডিভাইসে পেয়ারড্রপ খুলুন", + "x-instructions_data-drop-bg": "প্রাপক নির্বাচন করতে ছেড়ে দিন", + "no-peers_data-drop-bg": "প্রাপক নির্বাচন ছেড়ে দিন", + "x-instructions_desktop": "ফাইল পাঠাতে ক্লিক করুন অথবা মেসেজ পাঠাতে ডানে চাপুন", + "x-instructions_mobile": "ফাইল পাঠাতে ক্লিক করুন অথবা বেশি চেপে মেসেজ পাঠান", + "x-instructions_data-drop-peer": "পিয়ারকে পাঠানোর জন্য রিলিজ করুন", + "x-instructions-share-mode_desktop": "পাঠাতে ক্লিক করুন", + "x-instructions-share-mode_mobile": "পাঠাতে ক্লিক করুন", + "activate-share-mode-base": "অন্য ডিভাইসে পাঠাতে পেয়ারড্রপ খুলুন", + "activate-share-mode-and-other-files-plural": "অন্য ফাইল যোগ করুন", + "activate-share-mode-shared-text": "পাঠানো টেক্সট", + "activate-share-mode-shared-files-plural": "পাঠানো ফাইল গুলো" } } From f6f3db2df96276a10528ffa141513b11ebba592e Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 24 Feb 2025 03:01:56 +0100 Subject: [PATCH 74/77] Translated using Weblate (Japanese) Currently translated at 100.0% (166 of 166 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (166 of 166 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (166 of 166 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (166 of 166 strings) Co-authored-by: Hosted Weblate Co-authored-by: maboroshin Co-authored-by: mottcha <89951503+mottcha@users.noreply.github.com> Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ja/ Translation: PairDrop/pairdrop-spa --- public/lang/ja.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/public/lang/ja.json b/public/lang/ja.json index d4e8fdb..949621a 100644 --- a/public/lang/ja.json +++ b/public/lang/ja.json @@ -1,17 +1,17 @@ { "footer": { "webrtc": "(WebRTCが無効なため)", - "public-room-devices_title": "公開ルーム内のデバイスは、接続中のネットワークと関係なくアクセスできます。", + "public-room-devices_title": "公開ルーム内のデバイスは、別のネットワークからもアクセスできます。", "display-name_data-placeholder": "読み込み中…", "display-name_title": "デバイス名を変更する", "traffic": "この通信は", - "paired-devices_title": "ペアリング済みデバイスであれば、接続中のネットワークに関わらずアクセスできます。", + "paired-devices_title": "ペアリング済みデバイスは、別のネットワークからもアクセスできます。", "public-room-devices": "ルーム{{roomId}}", "paired-devices": "ペアリング済みデバイス", - "on-this-network": "このネットワーク上", + "on-this-network": "このネットワーク内", "routed": "サーバーを経由します", "discovery": "このデバイスを検出可能なネットワーク:", - "on-this-network_title": "このネットワーク上のすべてのデバイスからアクセスできます。", + "on-this-network_title": "このネットワーク内のすべてのデバイスからアクセスできます。", "known-as": "このデバイスの名前:" }, "notifications": { @@ -20,9 +20,9 @@ "message-received": "{{name}}から受信したメッセージ(クリックしてコピー)", "rate-limit-join-key": "レート制限に到達しました。10秒待ってから再度お試しください。", "connecting": "接続中…", - "pairing-key-invalidated": "コード{{key}}が失効しました", + "pairing-key-invalidated": "コード{{key}}は無効になりました", "pairing-key-invalid": "無効なコード", - "connected": "接続しました", + "connected": "接続済み", "pairing-not-persistent": "このデバイスとのペアリングは解除される可能性があります", "text-content-incorrect": "無効なテキスト内容です", "message-transfer-completed": "メッセージを送信しました", @@ -39,7 +39,7 @@ "copied-to-clipboard-error": "コピーできませんでした。手動でコピーしてください。", "pairing-success": "ペアリングしました", "clipboard-content-incorrect": "無効なクリップボード内容です", - "display-name-changed-temporarily": "この接続のみデバイス名が変更されました", + "display-name-changed-temporarily": "この接続でのみデバイス名が変更されました", "copied-to-clipboard": "クリップボードにコピーしました", "offline": "オフラインです", "pairing-tabs-error": "同じWebブラウザーで開いたタブ同士でペアリングすることはできません", @@ -79,9 +79,9 @@ "activate-share-mode-and-other-files-plural": "とその他{{count}}個のファイル", "x-instructions-share-mode_mobile": "タップして{{descriptor}}を送信", "activate-share-mode-base": "他のデバイスでPairDropを開いて送信します", - "no-peers-subtitle": "ペアリングや公開ルームを使用すると、他のネットワーク上のデバイスと共有できます", + "no-peers-subtitle": "ペアリングや公開ルームを使うと、別のネットワークにあるデバイスと共有できます", "activate-share-mode-shared-text": "共有されたテキスト", - "x-instructions_desktop": "左クリックでファイルを送信、右クリックでメッセージを送信します", + "x-instructions_desktop": "左クリックでファイル送信、右クリックでメッセージ送信", "no-peers-title": "ファイル共有するには他のデバイスでPairDropを開きます", "x-instructions_data-drop-peer": "ドロップするとこのデバイスに送信します", "x-instructions_data-drop-bg": "送信したいデバイスの上でドロップしてください", @@ -94,7 +94,7 @@ "peer-ui": { "processing": "処理中…", "click-to-send-share-mode": "クリックして{{descriptor}}を送信", - "click-to-send": "左クリックでファイルを送信、右クリックでメッセージを送信します", + "click-to-send": "左クリックでファイル送信、右クリックでメッセージ送信", "waiting": "待機中…", "connection-hash": "エンドツーエンド暗号化のセキュリティを確認するには、両方のデバイスのセキュリティナンバーを確認してください", "preparing": "準備中…", @@ -102,7 +102,7 @@ }, "dialogs": { "base64-paste-to-send": "ここをタップして{{type}}を送信", - "auto-accept-instructions-2": "」を有効にすると、そのデバイスから送信されたすべてのファイルを自動的に受け入れます。", + "auto-accept-instructions-2": "」が有効なら、そのデバイスが送信したすべてのファイルを自動で受け入れます。", "receive-text-title": "メッセージを受信", "edit-paired-devices-title": "ペアリング設定", "cancel": "キャンセル", @@ -126,7 +126,7 @@ "has-sent": "が送信:", "file-other-description-file": "とその他1個のファイル", "close": "閉じる", - "system-language": "システム言語", + "system-language": "システムの言語", "unpair": "ペアリング解除", "title-image": "画像", "file-other-description-file-plural": "とその他{{count}}個のファイル", @@ -135,7 +135,7 @@ "language-selector-title": "言語設定", "pair": "ペアリング", "hr-or": "または", - "scan-qr-code": "もしくはQRコードをスキャンしてください。", + "scan-qr-code": "QRコードをスキャンしてください。", "input-key-on-this-device": "このコードを他のデバイスに入力するか", "download-again": "もう一度ダウンロードする", "accept": "承諾", @@ -162,13 +162,13 @@ "share-text-title": "テキストメッセージを共有します" }, "about": { - "claim": "デバイス間のファイル共有を手軽に実現します", - "tweet_title": "PairDropのことをポストする", + "claim": "デバイス間でかんたんファイル共有", + "tweet_title": "PairDropについてポスト", "close-about_aria-label": "PairDropについてを閉じる", "buy-me-a-coffee_title": "コーヒーを一杯おごってください!", - "github_title": "PairDrop on GitHub", + "github_title": "GitHub上のPairDropプロジェクト", "faq_title": "FAQ", - "mastodon_title": "MastodonにPairDropのことをトゥートする", + "mastodon_title": "MastodonでPairDropについてトゥート", "bluesky_title": "BlueSkyでフォロー", "custom_title": "フォロー", "privacypolicy_title": "プライバシーポリシーを開く" From 7639aca84c0fb2400a970844d658571aedf4050f Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 24 Feb 2025 20:45:12 +0100 Subject: [PATCH 75/77] Update node dependencies --- package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0a2d466..7d76ba5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -318,16 +318,16 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -815,9 +815,9 @@ } }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "engines": { "node": ">=10.0.0" }, From 4862ba3067be1a0f2e0d1e94861dc9200b5bfeea Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Mon, 24 Feb 2025 20:46:32 +0100 Subject: [PATCH 76/77] Increase version to v1.11.2 ## Enhancements - Speed up update process by skipping waiting and claiming currently open pages -> no need to close all tabs in order to get an update anymore - Update Bluesky icon from square to butterfly - Update node dependencies ## Fixes - Prevent service-worker from responding with redirect (fixes #384) - Fix: switch off twitter button via env var not possible (#388) - Add missing files to paths that get cached upon sw installation ## Languages - Translations updates from Hosted Weblate (Japanese) --- .github/ISSUE_TEMPLATE/bug-report.md | 4 ++-- docs/how-to.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- public/index.html | 2 +- public/service-worker.js | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 6883691..5abfbb4 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -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.11.1 +Version: v1.11.2 **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.11.1 +Version: v1.11.2 **Additional context** Add any other context about the problem here. diff --git a/docs/how-to.md b/docs/how-to.md index e1cb4da..df6d3a1 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -45,11 +45,11 @@ This pairdrop-cli version was released alongside v1.10.4 #### Linux / Mac 1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) ```shell - wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.1/pairdrop-cli.zip" + wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.2/pairdrop-cli.zip" ``` or ```shell - curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.1/pairdrop-cli.zip" + curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.11.2/pairdrop-cli.zip" ``` 2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/` ```shell diff --git a/package-lock.json b/package-lock.json index 7d76ba5..be60a08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pairdrop", - "version": "1.11.1", + "version": "1.11.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pairdrop", - "version": "1.11.1", + "version": "1.11.2", "license": "ISC", "dependencies": { "express": "^4.18.2", diff --git a/package.json b/package.json index 7542a9b..e4032f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.11.1", + "version": "1.11.2", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index 6bdc88e..70eda5b 100644 --- a/public/index.html +++ b/public/index.html @@ -668,7 +668,7 @@

PairDrop

-
v1.11.1
+
v1.11.2
diff --git a/public/service-worker.js b/public/service-worker.js index ad5e7ea..47822ae 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.11.1'; +const cacheVersion = 'v1.11.2'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const relativePathsToCache = [ './', From 31ec776fb304fd7ddf0eeffba41b1631f712887b Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Tue, 25 Feb 2025 18:19:38 +0100 Subject: [PATCH 77/77] Only handle requests with the same origin via the service worker --- public/service-worker.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/public/service-worker.js b/public/service-worker.js index 47822ae..e1f4f45 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -151,7 +151,14 @@ const updateCache = request => new Promise((resolve, reject) => { // 2. If cache is not available: Fetch from network and update cache. // This way, cached files are only updated if the cacheVersion is changed self.addEventListener('fetch', function(event) { - if (event.request.method === "POST") { + const swOrigin = new URL(self.location.href).origin; + const requestOrigin = new URL(event.request.url).origin; + + if (swOrigin !== requestOrigin) { + // Do not handle requests from other origin + event.respondWith(fetch(event.request)); + } + else if (event.request.method === "POST") { // Requests related to Web Share Target. event.respondWith((async () => { const share_url = await evaluateRequestData(event.request);