Compare commits

..

32 Commits

Author SHA1 Message Date
schlagmichdoch cffc2a834f increase version to v1.8.3 2023-10-09 20:53:12 +02:00
dependabot[bot] 9f8acd6b6a Bump express-rate-limit from 7.0.1 to 7.1.0
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 7.0.1 to 7.1.0.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Changelog](https://github.com/express-rate-limit/express-rate-limit/blob/main/changelog.md)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v7.0.1...v7.1.0)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 20:51:21 +02:00
dependabot[bot] 60c699f3b2 Bump ws from 8.14.1 to 8.14.2
Bumps [ws](https://github.com/websockets/ws) from 8.14.1 to 8.14.2.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.14.1...8.14.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 20:50:58 +02:00
schlagmichdoch 1669fe7d75 fix textarea for sending messages is not editable on some iOS devices (#163) 2023-10-09 19:16:21 +02:00
schlagmichdoch 3c1ef57740 prevent Cumulative Layout Shift by fading in elements after initial translation is loaded 2023-10-06 02:57:46 +02:00
schlagmichdoch faa2030f0b Merge pull request #166 from jimmyGALLAND/fix_dialog_transfert_request_title
fix dialog transfert request title
2023-10-03 23:12:08 +02:00
schlagmichdoch 34c5392a66 Merge pull request #165 from jimmyGALLAND/translate_fr
add french translate
2023-10-03 18:51:40 +02:00
Jimmy GALLAND d082a885c4 add french translate
Co-authored-by: schlagmichdoch <schlagmichdoch@users.noreply.github.com>
2023-10-01 17:14:39 +02:00
Jimmy GALLAND fd89aca219 fix transfer request dialog title
Co-authored-by: schlagmichdoch <schlagmichdoch@users.noreply.github.com>
2023-10-01 16:56:13 +02:00
schlagmichdoch 82a46ebb84 increase version to v1.8.2 2023-09-24 22:30:32 +02:00
schlagmichdoch d7e25dc2d4 Activate Romanian and Indonesian translations 2023-09-22 02:07:45 +02:00
schlagmichdoch eeccf78fa6 Add new translations to websocket fallback version 2023-09-22 01:54:55 +02:00
schlagmichdoch d8043bd4e5 Merge pull request #159 from weblate/weblate-pairdrop-pairdrop-spa
Translations update from Hosted Weblate
2023-09-22 01:52:20 +02:00
Ian Perdiansah e6b10bc9cb Translated using Weblate (Indonesian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/id/
2023-09-21 20:22:24 +02:00
mere ab4ac5c217 Translated using Weblate (Romanian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
2023-09-21 20:22:23 +02:00
schlagmichdoch c3c3e2685f Added translation using Weblate (Indonesian) 2023-09-21 14:26:24 +02:00
mere a120d7c1fc Translated using Weblate (Romanian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ro/
2023-09-20 21:22:52 +02:00
Jiacheng Hou ce9748fd0e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/zh_Hans/
2023-09-20 21:22:51 +02:00
kek d4ff69d215 Translated using Weblate (Russian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-09-20 21:22:51 +02:00
schlagmichdoch fdf9457a0d Translated using Weblate (German)
Currently translated at 100.0% (140 of 140 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-20 21:22:51 +02:00
schlagmichdoch b537541788 Added translation using Weblate (Romanian) 2023-09-20 16:22:25 +02:00
kek 49254bcca9 Translated using Weblate (Russian)
Currently translated at 100.0% (139 of 139 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/ru/
2023-09-20 02:14:10 +02:00
schlagmichdoch 9a7ee95d2f Add missing strings form public room dialog to translation files - second try 2023-09-20 02:13:22 +02:00
schlagmichdoch e0548102d3 increase version to v1.8.1 2023-09-19 18:05:54 +02:00
schlagmichdoch d7626822fa Merge missing translations from branch 'translate' 2023-09-19 18:03:13 +02:00
schlagmichdoch 426b75f336 Add new translations to websocket fallback version 2023-09-19 18:02:13 +02:00
schlagmichdoch f63aebbcb4 Translated using Weblate (German)
Currently translated at 100.0% (139 of 139 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/de/
2023-09-19 17:58:32 +02:00
schlagmichdoch 5e74f515a7 Translated using Weblate (English)
Currently translated at 100.0% (139 of 139 strings)

Translation: PairDrop/pairdrop-spa
Translate-URL: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/en/
2023-09-19 17:58:32 +02:00
schlagmichdoch e807c3959a fix #157: catch EADDRINUSE to prevent endless restarts if the port is already in use 2023-09-19 17:53:21 +02:00
schlagmichdoch d77ccdf233 fix TypeError 2023-09-19 17:50:16 +02:00
schlagmichdoch d45c6b5bea increase margin for hr-note ("OR") on dialogs 2023-09-19 00:24:32 +02:00
schlagmichdoch 5625bf6f93 Add missing strings form public room dialog to translation files 2023-09-19 00:23:19 +02:00
30 changed files with 1236 additions and 142 deletions
+2 -2
View File
@@ -36,7 +36,7 @@ If applicable, add screenshots to help explain your problem.
**Bug occurs on official PairDrop instance https://pairdrop.net/** **Bug occurs on official PairDrop instance https://pairdrop.net/**
No | Yes No | Yes
Version: v1.8.0 Version: v1.8.3
**Bug occurs on self-hosted PairDrop instance** **Bug occurs on self-hosted PairDrop instance**
No | Yes No | Yes
@@ -44,7 +44,7 @@ No | Yes
**Self-Hosted Setup** **Self-Hosted Setup**
Proxy: Nginx | Apache2 Proxy: Nginx | Apache2
Deployment: docker run | docker-compose | npm run start:prod Deployment: docker run | docker-compose | npm run start:prod
Version: v1.8.0 Version: v1.8.3
**Additional context** **Additional context**
Add any other context about the problem here. Add any other context about the problem here.
+15 -1
View File
@@ -124,6 +124,14 @@ if (process.argv.includes('--localhost-only')) {
server.listen(port); server.listen(port);
} }
server.on('error', (err) => {
if (err.code === 'EADDRINUSE') {
console.error(err);
console.info("Error EADDRINUSE received, exiting process without restarting process...");
process.exit(0)
}
});
class PairDropServer { class PairDropServer {
constructor() { constructor() {
@@ -174,7 +182,7 @@ class PairDropServer {
this._onDisconnect(sender); this._onDisconnect(sender);
break; break;
case 'pong': case 'pong':
this._keepAliveTimers[sender.id].lastBeat = Date.now(); this._setKeepAliveTimerToNow(sender);
break; break;
case 'join-ip-room': case 'join-ip-room':
this._joinIpRoom(sender); this._joinIpRoom(sender);
@@ -576,6 +584,12 @@ class PairDropServer {
clearTimeout(this._keepAliveTimers[peer.id].timer); clearTimeout(this._keepAliveTimers[peer.id].timer);
} }
} }
_setKeepAliveTimerToNow(peer) {
if (this._keepAliveTimers[peer.id]?.lastBeat) {
this._keepAliveTimers[peer.id].lastBeat = Date.now();
}
}
} }
+16 -16
View File
@@ -1,19 +1,19 @@
{ {
"name": "pairdrop", "name": "pairdrop",
"version": "1.8.0", "version": "1.8.3",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pairdrop", "name": "pairdrop",
"version": "1.8.0", "version": "1.8.3",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"express": "^4.18.2", "express": "^4.18.2",
"express-rate-limit": "^7.0.1", "express-rate-limit": "^7.1.0",
"ua-parser-js": "^1.0.36", "ua-parser-js": "^1.0.36",
"unique-names-generator": "^4.3.0", "unique-names-generator": "^4.3.0",
"ws": "^8.14.1" "ws": "^8.14.2"
}, },
"engines": { "engines": {
"node": ">=15" "node": ">=15"
@@ -204,9 +204,9 @@
} }
}, },
"node_modules/express-rate-limit": { "node_modules/express-rate-limit": {
"version": "7.0.1", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.0.1.tgz", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.0.tgz",
"integrity": "sha512-oTIPm094gh8c7nbShl4TNLqnayzOcbDGY7dCRnFqUAvptyb0pp5231LaH34JtvVEbZlOJMiixikU5AVK8VN3FA==", "integrity": "sha512-pwKOMedrpJJeINON/9jhAa18udV2qwxPZSoklPZK8pmXxUyE5uXaptiwjGw8bZILbxqfUZ/p8pQA99ODjSgA5Q==",
"engines": { "engines": {
"node": ">= 16" "node": ">= 16"
}, },
@@ -637,9 +637,9 @@
} }
}, },
"node_modules/ws": { "node_modules/ws": {
"version": "8.14.1", "version": "8.14.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
"integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
}, },
@@ -805,9 +805,9 @@
} }
}, },
"express-rate-limit": { "express-rate-limit": {
"version": "7.0.1", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.0.1.tgz", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.0.tgz",
"integrity": "sha512-oTIPm094gh8c7nbShl4TNLqnayzOcbDGY7dCRnFqUAvptyb0pp5231LaH34JtvVEbZlOJMiixikU5AVK8VN3FA==", "integrity": "sha512-pwKOMedrpJJeINON/9jhAa18udV2qwxPZSoklPZK8pmXxUyE5uXaptiwjGw8bZILbxqfUZ/p8pQA99ODjSgA5Q==",
"requires": {} "requires": {}
}, },
"finalhandler": { "finalhandler": {
@@ -1099,9 +1099,9 @@
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
}, },
"ws": { "ws": {
"version": "8.14.1", "version": "8.14.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
"integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
"requires": {} "requires": {}
} }
} }
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "pairdrop", "name": "pairdrop",
"version": "1.8.0", "version": "1.8.3",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@@ -11,10 +11,10 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"express": "^4.18.2", "express": "^4.18.2",
"express-rate-limit": "^7.0.1", "express-rate-limit": "^7.1.0",
"ua-parser-js": "^1.0.36", "ua-parser-js": "^1.0.36",
"unique-names-generator": "^4.3.0", "unique-names-generator": "^4.3.0",
"ws": "^8.14.1" "ws": "^8.14.2"
}, },
"engines": { "engines": {
"node": ">=15" "node": ">=15"
+11 -8
View File
@@ -150,7 +150,10 @@
<button class="button fw" data-i18n-key="dialogs.system-language" data-i18n-attrs="text">System Language</button> <button class="button fw" data-i18n-key="dialogs.system-language" data-i18n-attrs="text">System Language</button>
<button class="button fw" value="en">English</button> <button class="button fw" value="en">English</button>
<button class="button fw" value="de">Deutsch (German)</button> <button class="button fw" value="de">Deutsch (German)</button>
<button class="button fw" value="fr">Français (French)</button>
<button class="button fw" value="id">Bahasa Indonesia (Indonesian)</button>
<button class="button fw" value="nb">Norsk (Norwegian)</button> <button class="button fw" value="nb">Norsk (Norwegian)</button>
<button class="button fw" value="ro">Română (Romanian)</button>
<button class="button fw" value="ru">Русский язык (Russian)</button> <button class="button fw" value="ru">Русский язык (Russian)</button>
<button class="button fw" value="zh-CN">中文 (Chinese)</button> <button class="button fw" value="zh-CN">中文 (Chinese)</button>
</div> </div>
@@ -239,13 +242,13 @@
<x-paper shadow="2"> <x-paper shadow="2">
<div class="row center"> <div class="row center">
<div class="column"> <div class="column">
<h2 class="center">Temporary Public Room</h2> <h2 class="center" data-i18n-key="dialogs.temporary-public-room-title" data-i18n-attrs="text">Temporary Public Room</h2>
</div> </div>
</div> </div>
<div class="row center"> <div class="row center">
<div class="column"> <div class="column">
<div class="center key-qr-code"></div> <div class="center key-qr-code"></div>
<h1 class="center key">IOX9P</h1> <h1 class="center key"></h1>
<p class="center text-center key-instructions"> <p class="center text-center key-instructions">
<span class="font-subheading" data-i18n-key="dialogs.input-room-id-on-another-device" data-i18n-attrs="text">Input this room id on another device</span> <span class="font-subheading" data-i18n-key="dialogs.input-room-id-on-another-device" data-i18n-attrs="text">Input this room id on another device</span>
<span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text">or scan the QR-Code.</span> <span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text">or scan the QR-Code.</span>
@@ -267,13 +270,13 @@
<input type="text" class="textarea center" aria-label="room-id-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled> <input type="text" class="textarea center" aria-label="room-id-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="text" class="textarea center" aria-label="room-id-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled> <input type="text" class="textarea center" aria-label="room-id-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
</div> </div>
<p class="font-subheading center text-center">Enter room id from another device to join.</p> <p class="font-subheading center text-center" data-i18n-key="dialogs.enter-room-id-from-another-device" data-i18n-attrs="text">Enter room id from another device to join room.</p>
</div> </div>
</div> </div>
<div class="center row-reverse button-row"> <div class="center row-reverse button-row">
<button class="button" type="submit" disabled>Join</button> <button class="button" type="submit" data-i18n-key="dialogs.join" data-i18n-attrs="text" disabled>Join</button>
<button class="button" type="button" close>Close</button> <button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
<button class="button leave-room" type="button">Leave</button> <button class="button leave-room" type="button" data-i18n-key="dialogs.leave" data-i18n-attrs="text">Leave</button>
</div> </div>
</x-paper> </x-paper>
</x-background> </x-background>
@@ -364,7 +367,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="column fw"> <div class="column fw">
<div id="text-input" title="Message" class="textarea" role="textbox" autocapitalize="none" spellcheck="false" autofocus contenteditable></div> <textarea title="Message" class="textarea" wrap="off" autofocus></textarea>
</div> </div>
</div> </div>
<div class="button-row row-reverse"> <div class="button-row row-reverse">
@@ -431,7 +434,7 @@
</svg> </svg>
<div class="title-wrapper"> <div class="title-wrapper">
<h1>PairDrop</h1> <h1>PairDrop</h1>
<div class="font-subheading">v1.8.0</div> <div class="font-subheading">v1.8.3</div>
</div> </div>
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text">The easiest way to transfer files across devices</div> <div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text">The easiest way to transfer files across devices</div>
<div class="row"> <div class="row">
+8 -4
View File
@@ -55,8 +55,12 @@
"system-language": "Systemsprache", "system-language": "Systemsprache",
"language-selector-title": "Sprache auswählen", "language-selector-title": "Sprache auswählen",
"hr-or": "ODER", "hr-or": "ODER",
"input-room-id-on-another-device": "Gib diese Raum ID auf einem anderen Gerät ein", "input-room-id-on-another-device": "Gib diese Raum-ID auf einem anderen Gerät ein",
"unpair": "Entkoppeln" "unpair": "Entkoppeln",
"leave": "Verlassen",
"join": "Betreten",
"enter-room-id-from-another-device": "Gib die Raum-ID von einem anderen Gerät hier ein.",
"temporary-public-room-title": "Temporärer Öffentlicher Raum"
}, },
"about": { "about": {
"tweet_title": "Über PairDrop twittern", "tweet_title": "Über PairDrop twittern",
@@ -108,7 +112,7 @@
"pairing-cleared": "Alle Geräte entkoppelt.", "pairing-cleared": "Alle Geräte entkoppelt.",
"click-to-show": "Klicken zum Anzeigen", "click-to-show": "Klicken zum Anzeigen",
"online-requirement": "Du musst online sein um Geräte zu koppeln.", "online-requirement": "Du musst online sein um Geräte zu koppeln.",
"display-name-changed-temporarily": "Anzeigename wurde nur für diese Sitzung geändert.", "display-name-changed-temporarily": "Anzeigename wurde nur für diese Session geändert.",
"request-title": "{{name}} möchte {{count}}{{descriptor}} übertragen", "request-title": "{{name}} möchte {{count}}{{descriptor}} übertragen",
"connecting": "Verbindung wird aufgebaut…", "connecting": "Verbindung wird aufgebaut…",
"files-incorrect": "Dateien sind fehlerhaft.", "files-incorrect": "Dateien sind fehlerhaft.",
@@ -119,7 +123,7 @@
"ios-memory-limit": "Für Übertragungen an iOS Geräte beträgt die maximale Dateigröße 200 MB", "ios-memory-limit": "Für Übertragungen an iOS Geräte beträgt die maximale Dateigröße 200 MB",
"public-room-left": "Öffentlichen Raum {{publicRoomId}} verlassen", "public-room-left": "Öffentlichen Raum {{publicRoomId}} verlassen",
"copied-to-clipboard-error": "Konnte nicht kopieren. Kopiere manuell.", "copied-to-clipboard-error": "Konnte nicht kopieren. Kopiere manuell.",
"public-room-id-invalid": "Ungültige Raum ID", "public-room-id-invalid": "Ungültige Raum-ID",
"online-requirement-pairing": "Du musst online sein, um Geräte zu koppeln.", "online-requirement-pairing": "Du musst online sein, um Geräte zu koppeln.",
"online-requirement-public-room": "Du musst online sein, um öffentliche Räume erstellen zu können." "online-requirement-public-room": "Du musst online sein, um öffentliche Räume erstellen zu können."
}, },
+7 -2
View File
@@ -47,7 +47,9 @@
"input-key-on-this-device": "Input this key on another device", "input-key-on-this-device": "Input this key on another device",
"scan-qr-code": "or scan the QR-code.", "scan-qr-code": "or scan the QR-code.",
"enter-key-from-another-device": "Enter key from another device here.", "enter-key-from-another-device": "Enter key from another device here.",
"input-room-id-on-another-device": "Input this room id on another device", "temporary-public-room-title": "Temporary Public Room",
"input-room-id-on-another-device": "Input this room ID on another device",
"enter-room-id-from-another-device": "Enter room ID from another device to join room.",
"hr-or": "OR", "hr-or": "OR",
"pair": "Pair", "pair": "Pair",
"cancel": "Cancel", "cancel": "Cancel",
@@ -58,6 +60,8 @@
"auto-accept": "auto-accept", "auto-accept": "auto-accept",
"auto-accept-instructions-2": "to automatically accept all files sent from that device.", "auto-accept-instructions-2": "to automatically accept all files sent from that device.",
"close": "Close", "close": "Close",
"join": "Join",
"leave": "Leave",
"would-like-to-share": "would like to share", "would-like-to-share": "would like to share",
"accept": "Accept", "accept": "Accept",
"decline": "Decline", "decline": "Decline",
@@ -106,7 +110,7 @@
"pairing-key-invalid": "Invalid key", "pairing-key-invalid": "Invalid key",
"pairing-key-invalidated": "Key {{key}} invalidated.", "pairing-key-invalidated": "Key {{key}} invalidated.",
"pairing-cleared": "All Devices unpaired.", "pairing-cleared": "All Devices unpaired.",
"public-room-id-invalid": "Invalid room id", "public-room-id-invalid": "Invalid room ID",
"public-room-left": "Left public room {{publicRoomId}}", "public-room-left": "Left public room {{publicRoomId}}",
"copied-to-clipboard": "Copied to clipboard", "copied-to-clipboard": "Copied to clipboard",
"copied-to-clipboard-error": "Copying not possible. Copy manually.", "copied-to-clipboard-error": "Copying not possible. Copy manually.",
@@ -139,6 +143,7 @@
"file-received": "File Received", "file-received": "File Received",
"file-received-plural": "{{count}} Files Received", "file-received-plural": "{{count}} Files Received",
"file-transfer-requested": "File Transfer Requested", "file-transfer-requested": "File Transfer Requested",
"image-transfer-requested": "Image Transfer Requested",
"message-received": "Message Received", "message-received": "Message Received",
"message-received-plural": "{{count}} Messages Received" "message-received-plural": "{{count}} Messages Received"
}, },
+160
View File
@@ -0,0 +1,160 @@
{
"header": {
"about_title": "A propos de",
"language-selector_title": "Choix de la langue",
"about_aria-label": "Ouvrir à propos de",
"theme-auto_title": "Adapter le thème au système",
"theme-light_title": "Toujours utiliser le thème clair",
"theme-dark_title": "Toujours utiliser le thème sombre",
"notification_title": "Activer les notifications",
"install_title": "Installer PairDrop",
"pair-device_title": "Associez vos appareils de manière permanente",
"edit-paired-devices_title": "Gérer les appareils couplés",
"join-public-room_title": "Rejoindre temporairement la salle publique",
"cancel-paste-mode": "Terminé"
},
"instructions": {
"no-peers_data-drop-bg": "Déposer pour choisir le destinataire",
"no-peers-title": "Ouvrez PairDrop sur d'autres appareils pour envoyer des fichiers",
"no-peers-subtitle": "Associez des appareils ou entrez dans une salle publique pour être visible sur d'autres réseaux",
"x-instructions_desktop": "Cliquez pour envoyer des fichiers ou faites un clic droit pour envoyer un message",
"x-instructions_mobile": "Appuyez pour envoyer des fichiers ou appuyez longuement pour envoyer un message",
"x-instructions_data-drop-peer": "Déposer pour envoyer au destinataire",
"x-instructions_data-drop-bg": "Lâcher pour choisir le destinataire",
"click-to-send": "Cliquez pour envoyer",
"tap-to-send": "Appuyez pour envoyer",
"activate-paste-mode-base": "Ouvrez PairDrop sur d'autres appareils pour envoyer",
"activate-paste-mode-and-other-files": "et {{count}} autres fichiers",
"activate-paste-mode-shared-text": "texte partagé"
},
"footer": {
"known-as": "Vous êtes connu sous le nom de:",
"display-name_data-placeholder": "Chargement…",
"display-name_title": "Modifiez le nom de votre appareil de manière permanente",
"discovery": "Vous pouvez être découvert:",
"on-this-network": "sur ce réseau",
"on-this-network_title": "Vous pouvez être découvert par tout le monde sur ce réseau.",
"paired-devices": "par les appareils couplés",
"paired-devices_title": "Vous pouvez être découvert par les appareils couplés à tout moment, indépendamment du réseau.",
"public-room-devices": "dans la salle {{roomId}}",
"public-room-devices_title": "Vous pouvez être découvert par les appareils de cette salle publique indépendamment du réseau.",
"traffic": "Le trafic est",
"routed": "routé via le serveur",
"webrtc": "si WebRTC n'est pas disponible.",
"display-name_placeholder": "Chargement…"
},
"dialogs": {
"pair-devices-title": "Associer les appareils de manière permanente",
"input-key-on-this-device": "Saisissez cette clé sur un autre appareil",
"scan-qr-code": "ou scannez le QR-code.",
"enter-key-from-another-device": "Entrez ici la clé d'un autre appareil.",
"temporary-public-room-title": "Salle publique temporaire",
"input-room-id-on-another-device": "Saisissez cet ID de salle sur un autre appareil",
"enter-room-id-from-another-device": "Entrez l'ID de la salle depuis un autre appareil pour rejoindre la salle.",
"hr-or": "OU",
"pair": "associer",
"cancel": "Annuler",
"edit-paired-devices-title": "Modifier les appareils couplés",
"unpair": "Dissocier",
"paired-devices-wrapper_data-empty": "Aucun appareil couplé.",
"auto-accept-instructions-1": "Activer",
"auto-accept": "auto-accepter",
"auto-accept-instructions-2": "pour accepter automatiquement tous les fichiers envoyés depuis cet appareil.",
"close": "Fermer",
"join": "Rejoindre",
"leave": "Partir",
"would-like-to-share": "aimerait partager",
"accept": "Accepter",
"decline": "Refuser",
"has-sent": "a envoyé:",
"share": "Partage",
"download": "Télécharger",
"send-message-title": "Envoyer un message",
"send-message-to": "Envoyer un message à",
"send": "Envoyer",
"receive-text-title": "Message reçu",
"copy": "Copier",
"base64-processing": "Traitement…",
"base64-tap-to-paste": "Appuyez ici pour coller {{type}}",
"base64-paste-to-send": "Coller ici pour envoyer {{type}}",
"base64-text": "texte",
"base64-files": "fichiers",
"file-other-description-image": "et 1 autre image",
"file-other-description-file": "et 1 autre fichier",
"file-other-description-image-plural": "et {{count}} autres images",
"file-other-description-file-plural": "et {{count}} autres fichiers",
"title-image": "Image",
"title-file": "Fichier",
"title-image-plural": "Images",
"title-file-plural": "Fichiers",
"receive-title": "{{descriptor}} Reçu",
"download-again": "Télécharger à nouveau",
"language-selector-title": "Sélectionnez la langue",
"system-language": "Langue du système"
},
"about": {
"close-about_aria-label": "Fermer à propos de PairDrop",
"claim": "Le moyen le plus simple de transférer des fichiers entre appareils",
"github_title": "PairDrop sur GitHub",
"buy-me-a-coffee_title": "Achete-moi un café!",
"tweet_title": "Tweet à propos de PairDrop",
"faq_title": "Questions fréquemment posées"
},
"notifications": {
"display-name-changed-permanently": "Le nom d'affichage est modifié de manière permanente.",
"display-name-changed-temporarily": "Le nom d'affichage est modifié uniquement pour cette session.",
"display-name-random-again": "Le nom d'affichage est à nouveau généré aléatoirement.",
"download-successful": "{{descriptor}} téléchargé",
"pairing-tabs-error": "Le couplage de deux onglets de navigateur Web est impossible.",
"pairing-success": "Appareils couplés.",
"pairing-not-persistent": "Les appareils couplés ne sont pas persistants.",
"pairing-key-invalid": "Clé invalide",
"pairing-key-invalidated": "Clé {{key}} invalidée.",
"pairing-cleared": "Tous les appareils ne sont plus appairés.",
"public-room-id-invalid": "ID de salle non valide",
"public-room-left": "Salle publique {{publicRoomId}} quittée",
"copied-to-clipboard": "Copié dans le presse-papier",
"copied-to-clipboard-error": "Copie impossible. Copier manuellement.",
"text-content-incorrect": "Le contenu du texte est incorrect.",
"file-content-incorrect": "Le contenu du fichier est incorrect.",
"clipboard-content-incorrect": "Le contenu du presse-papiers est incorrect.",
"notifications-enabled": "Notifications activées.",
"link-received": "Lien reçu par {{name}} - Cliquez pour ouvrir",
"message-received": "Message reçu par {{name}} - Cliquez pour copier",
"click-to-download": "Cliquez pour télécharger",
"request-title": "{{name}} souhaite transférer {{count}} {{descriptor}}",
"click-to-show": "Cliquez pour afficher",
"copied-text": "Texte copié dans le presse-papiers",
"copied-text-error": "L'écriture dans le presse-papiers a échoué. Copiez manuellement!",
"offline": "Vous êtes hors ligne",
"online": "Vous êtes de nouveau en ligne",
"connected": "Connecté.",
"online-requirement-pairing": "Vous devez être en ligne pour coupler des appareils.",
"online-requirement-public-room": "Vous devez être en ligne pour créer une salle publique.",
"connecting": "Connexion…",
"files-incorrect": "Les fichiers sont incorrects.",
"file-transfer-completed": "Transfert de fichier terminé.",
"ios-memory-limit": "L'envoi de fichiers vers iOS n'est possible que jusqu'à 200 Mo à la fois",
"message-transfer-completed": "Transfert de message terminé.",
"unfinished-transfers-warning": "Il y a des transferts inachevés. Etes-vous sûr de vouloir fermer PairDrop?",
"rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",
"selected-peer-left": "Appareils selectionnés restants."
},
"document-titles": {
"file-received": "Fichier reçu",
"file-received-plural": "{{count}} fichiers reçus",
"file-transfer-requested": "Transfert de fichier demandé",
"image-transfer-requested": "Transfert d'image demandé",
"message-received": "Message reçu",
"message-received-plural": "{{count}} Messages reçus"
},
"peer-ui": {
"click-to-send-paste-mode": "Cliquez pour envoyer {{descriptor}}",
"click-to-send": "Cliquez pour envoyer des fichiers ou faites un clic droit pour envoyer un message",
"connection-hash": "Pour vérifier la sécurité du chiffrement de bout en bout, comparez ce numéro de sécurité sur les deux appareils",
"preparing": "Préparation…",
"waiting": "En attente…",
"processing": "En cours…",
"transferring": "Transfert en cours…"
}
}
+158
View File
@@ -0,0 +1,158 @@
{
"footer": {
"webrtc": "jika WebRTC tidak tersedia.",
"public-room-devices_title": "Anda dapat ditemukan oleh perangkat di ruang publik ini terlepas dari jaringan.",
"display-name_data-placeholder": "Memuat…",
"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}}",
"paired-devices": "pada prngkt. yg. dipasangkan",
"on-this-network": "pada jaringan ini",
"routed": "diarahkan melalui server",
"discovery": "Anda dapat ditemukan:",
"on-this-network_title": "Anda dapat ditemukan oleh semua orang di jaringan ini.",
"known-as": "Anda dikenal sebagai:"
},
"notifications": {
"request-title": "{{name}} ingin mentransfer {{count}} {{descriptor}}",
"unfinished-transfers-warning": "Ada transfer yang belum selesai. Apakah Anda yakin ingin menutup PairDrop?",
"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",
"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.",
"selected-peer-left": "Rekan terpilih keluar.",
"link-received": "Tautan diterima dari {{name}} - Klik untuk membuka",
"online": "Anda kembali online",
"public-room-left": "Keluar dari ruang publik {{publicRoomId}}",
"copied-text": "Teks disalin ke papan klip",
"display-name-random-again": "Nama tampilan dibuat secara acak lagi.",
"display-name-changed-permanently": "Nama tampilan diubah secara permanen.",
"copied-to-clipboard-error": "Penyalinan tak dapat dilakukan. Salinlah secara manual.",
"pairing-success": "Perangkat dipasangkan.",
"clipboard-content-incorrect": "Isi papan klip keliru.",
"display-name-changed-temporarily": "Nama tampilan hanya diubah untuk sesi ini.",
"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",
"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.",
"copied-text-error": "Menyalin ke papan klip gagal. Salinlah secara manual!",
"download-successful": "{{descriptor}} diunduh",
"click-to-show": "Klik untuk menampilkan"
},
"header": {
"cancel-paste-mode": "Selesai",
"theme-auto_title": "Sesuaikan Tema dengan Sistem",
"install_title": "Instal PairDrop",
"theme-dark_title": "Selalu Gunakan Tema Gelap",
"pair-device_title": "Pasangkan Perangkat Anda Secara Permanen",
"join-public-room_title": "Bergabung dgn. Ruang Publik Sementara",
"notification_title": "Aktifkan Notifikasi",
"edit-paired-devices_title": "Edit Perangkat yg. Dipasangkan",
"language-selector_title": "Pilih Bahasa",
"about_title": "Tentang PairDrop",
"about_aria-label": "Buka Tentang PairDrop",
"theme-light_title": "Selalu Gunakan Tema Terang"
},
"instructions": {
"x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan",
"click-to-send": "Klik untuk mengirim",
"activate-paste-mode-and-other-files": "dan {{count}} file lainnya",
"tap-to-send": "Ketuk untuk mengirim",
"activate-paste-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-paste-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_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"
},
"peer-ui": {
"processing": "Memproses…",
"click-to-send-paste-mode": "Klik untuk mengirim {{descriptor}}",
"click-to-send": "Klik untuk mengirim file 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…",
"transferring": "Mentransfer…"
},
"dialogs": {
"base64-paste-to-send": "Tempel di sini untuk mengirim {{type}}",
"auto-accept-instructions-2": "untuk secara otomatis menerima semua file yang dikirim dari perangkat tersebut.",
"receive-text-title": "Pesan Diterima",
"edit-paired-devices-title": "Edit Perangkat yg. Dipasangkan",
"cancel": "Batal",
"auto-accept-instructions-1": "Aktifkan",
"pair-devices-title": "Pasangkan Perangkat Scr. Permanen",
"download": "Unduh",
"title-file": "File",
"base64-processing": "Memproses…",
"decline": "Tolak",
"receive-title": "{{descriptor}} Diterima",
"leave": "Tinggalkan",
"join": "Gabung",
"title-image-plural": "Gambar",
"send": "Kirim",
"base64-tap-to-paste": "Ketuk di sini untuk menempelkan {{type}}",
"base64-text": "teks",
"copy": "Salin",
"file-other-description-image": "dan 1 gambar lainnya",
"temporary-public-room-title": "Ruang Publik Sementara",
"base64-files": "file",
"has-sent": "telah mengirim:",
"file-other-description-file": "dan 1 file lainnya",
"close": "Tutup",
"system-language": "Bahasa Sistem",
"unpair": "Lepas",
"title-image": "Gambar",
"file-other-description-file-plural": "dan {{count}} file lainnya",
"would-like-to-share": "ingin berbagi",
"send-message-to": "Kirim pesan ke",
"language-selector-title": "Pilih Bahasa",
"pair": "Pasangkan",
"hr-or": "ATAU",
"scan-qr-code": "atau pindai kode QR.",
"input-key-on-this-device": "Masukkan kunci ini pada perangkat lain",
"download-again": "Unduh lagi",
"accept": "Terima",
"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",
"send-message-title": "Kirim Pesan",
"input-room-id-on-another-device": "Masukkan room ID 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."
},
"about": {
"claim": "Cara termudah untuk mentransfer file lintas perangkat",
"tweet_title": "Tweet tentang PairDrop",
"close-about_aria-label": "Tutup Tentang PairDrop",
"buy-me-a-coffee_title": "Traktir aku kopi!",
"github_title": "PairDrop di GitHub",
"faq_title": "Pertanyaan yang sering diajukan"
},
"document-titles": {
"file-transfer-requested": "Permintaan Transfer File",
"message-received-plural": "{{count}} Pesan Diterima",
"message-received": "Pesan Diterima",
"file-received": "File Diterima",
"file-received-plural": "{{count}} File Diterima"
}
}
+158
View File
@@ -0,0 +1,158 @@
{
"footer": {
"webrtc": "dacă WebRTC nu este disponibil.",
"public-room-devices_title": "Poți fi descoperit de dispozitivele din această cameră publică, independent de rețea.",
"display-name_data-placeholder": "Se încarcă…",
"display-name_title": "Editați permanent numele dispozitivului tău",
"traffic": "Traficul este",
"paired-devices_title": "Poți fi descoperit în orice moment de dispozitivele cuplate, indiferent de rețea.",
"public-room-devices": "în camera {{roomId}}",
"paired-devices": "prin dispozitive împerecheate",
"on-this-network": "în această rețea",
"routed": "rutate prin server",
"discovery": "Poți fi descoperit:",
"on-this-network_title": "Poți fi descoperit de toată lumea din această rețea.",
"known-as": "Ești cunoscut ca:"
},
"notifications": {
"request-title": "{{name}} ar dori să transfere {{count}} {{descriptor}}",
"unfinished-transfers-warning": "Există transferuri neterminate. Sigur vrei să închizi PairDrop?",
"message-received": "Mesaj primit de {{name}} - Apasă pentru a copia",
"rate-limit-join-key": "A fost atinsă limita ratei. Așteptați 10 secunde și încercați din nou.",
"connecting": "Conectarea…",
"pairing-key-invalidated": "Cheia {{key}} invalidată.",
"pairing-key-invalid": "Cheie invalidă",
"connected": "Conectat.",
"pairing-not-persistent": "Dispozitivele cuplate nu sunt persistente.",
"text-content-incorrect": "Conținutul textului este incorect.",
"message-transfer-completed": "Transferul mesajului este finalizat.",
"file-transfer-completed": "Transfer de fișiere finalizat.",
"file-content-incorrect": "Conținutul fișierului este incorect.",
"files-incorrect": "Fișierele sunt incorecte.",
"selected-peer-left": "Selectat peer a plecat.",
"link-received": "Link primit de {{name}} - Apasă pentru a deschide",
"online": "Ați revenit online",
"public-room-left": "Plecat din camera publică {{publicRoomId}}",
"copied-text": "Text copiat în clipboard",
"display-name-random-again": "Numele afișat este din nou generat aleatoriu.",
"display-name-changed-permanently": "Numele afișat este schimbat permanent.",
"copied-to-clipboard-error": "Copierea nu este posibilă. Copiați manual.",
"pairing-success": "Dispozitive asociate.",
"clipboard-content-incorrect": "Conținutul clipboard-ului este incorect.",
"display-name-changed-temporarily": "Numele afișat se modifică numai pentru această sesiune.",
"copied-to-clipboard": "Copiat în clipboard",
"offline": "Ești offline",
"pairing-tabs-error": "Cuplarea între două file de browser web este imposibilă.",
"public-room-id-invalid": "ID-ul camerei invalid",
"click-to-download": "Apasă pentru a descărca",
"pairing-cleared": "Toate dispozitivele sunt decuplate.",
"notifications-enabled": "Notificări activate.",
"online-requirement-pairing": "Trebuie să fiți online pentru a asocia dispozitivele.",
"ios-memory-limit": "Trimiterea de fișiere pe iOS este posibilă doar până la 200 MB simultan",
"online-requirement-public-room": "Trebuie să fiți online pentru a crea o cameră publică.",
"copied-text-error": "Scrierea în clipboard a eșuat. Copiați manual!",
"download-successful": "{{descriptor}} descărcat",
"click-to-show": "Apasă pentru a arăta"
},
"header": {
"cancel-paste-mode": "Gata",
"theme-auto_title": "Adaptează Tema la Sistem",
"install_title": "Instalează PairDrop",
"theme-dark_title": "Utilizați mereu tema întunecoasă",
"pair-device_title": "Împerechează-ți permanent dispozitivele",
"join-public-room_title": "Alătură-te temporar camerei publice",
"notification_title": "Activați Notificări",
"edit-paired-devices_title": "Editați dispozitivele împerecheate",
"language-selector_title": "Selectează Limba",
"about_title": "Despre PairDrop",
"about_aria-label": "Deschide Despre PairDrop",
"theme-light_title": "Utilizați mereu tema luminoasă"
},
"instructions": {
"x-instructions_mobile": "Atingeți pentru a trimite fișiere sau atingeți lung pentru a trimite un mesaj",
"click-to-send": "Clic pentru a trimite",
"activate-paste-mode-and-other-files": "și {{count}} alte fișiere",
"tap-to-send": "Atinge pentru a trimite",
"activate-paste-mode-base": "Deschideți PairDrop pe alte dispozitive pentru a trimite",
"no-peers-subtitle": "Împerecheați dispozitive sau intrați într-o cameră publică pentru a fi descoperit în alte rețele",
"activate-paste-mode-shared-text": "text partajat",
"x-instructions_desktop": "Dați clic pentru a trimite fișiere sau dați clic dreapta pentru a trimite un mesaj",
"no-peers-title": "Deschideți PairDrop pe alte dispozitive pentru a trimite fișiere",
"x-instructions_data-drop-peer": "Eliberare pentru a trimite la peer",
"x-instructions_data-drop-bg": "Eliberați pentru a selecta recipientul",
"no-peers_data-drop-bg": "Eliberare pentru a selecta recipientul"
},
"peer-ui": {
"processing": "Procesarea…",
"click-to-send-paste-mode": "Apasă pentru a trimite {{descriptor}}",
"click-to-send": "Apasă pentru a trimite fișiere sau apasă cu butonul din dreapta pentru a trimite un mesaj",
"waiting": "Așteptând…",
"connection-hash": "Pentru a verifica securitatea criptării end-to-end, comparați acest număr de securitate pe ambele dispozitive",
"preparing": "Pregătirea…",
"transferring": "Transferul…"
},
"dialogs": {
"base64-paste-to-send": "Lipiți aici pentru a trimite {{type}}",
"auto-accept-instructions-2": "pentru a accepta automat toate fișierele trimise de la dispozitivul respectiv.",
"receive-text-title": "Mesaj primit",
"edit-paired-devices-title": "Editați dispozitivele asociate",
"cancel": "Anulează",
"auto-accept-instructions-1": "Activează",
"pair-devices-title": "Împerecherea permanentă a dispozitivelor",
"download": "Descarcă",
"title-file": "Fişier",
"base64-processing": "Procesarea…",
"decline": "Declin",
"receive-title": "{{descriptor}} Primit",
"leave": "Pleacă",
"join": "Alătură-te",
"title-image-plural": "Imagini",
"send": "Trimite",
"base64-tap-to-paste": "Atinge aici pentru a lipi {{type}}",
"base64-text": "text",
"copy": "Copiază",
"file-other-description-image": "și 1 altă imagine",
"temporary-public-room-title": "Cameră publică temporară",
"base64-files": "fişiere",
"has-sent": "a trimis:",
"file-other-description-file": "și 1 alt fișier",
"close": "Închide",
"system-language": "Limba Sistemului",
"unpair": "Decuplează",
"title-image": "Imagine",
"file-other-description-file-plural": "și {{count}} alte fișiere",
"would-like-to-share": "ar dori să împărtășească",
"send-message-to": "Trimite un mesaj la",
"language-selector-title": "Selectaţi Limba",
"pair": "Cuplu",
"hr-or": "SAU",
"scan-qr-code": "sau scanați codul QR.",
"input-key-on-this-device": "Introduceți această cheie pe un alt dispozitiv",
"download-again": "Descarcă din nou",
"accept": "Acceptă",
"paired-devices-wrapper_data-empty": "Nu sunt dispozitive asociate.",
"enter-key-from-another-device": "Introduceți aici cheia de la un alt dispozitiv.",
"share": "Partajați",
"auto-accept": "auto-acceptare",
"title-file-plural": "Fişiere",
"send-message-title": "Trimite un mesaj",
"input-room-id-on-another-device": "Introduceți acest ID de cameră pe un alt dispozitiv",
"file-other-description-image-plural": "și {{count}} alte imagini",
"enter-room-id-from-another-device": "Introdu ID-ul camerei de pe un alt dispozitiv pentru a intra în cameră."
},
"about": {
"claim": "Cel mai simplu mod de a transfera fișiere între dispozitive",
"tweet_title": "Tweet despre PairDrop",
"close-about_aria-label": "Închide Despre PairDrop",
"buy-me-a-coffee_title": "Cumpără-mi o cafea!",
"github_title": "PairDrop pe GitHub",
"faq_title": "Întrebări frecvente"
},
"document-titles": {
"file-transfer-requested": "Transfer de fișiere cerut",
"message-received-plural": "{{count}}} Mesaje primite",
"message-received": "Mesaj primit",
"file-received": "Fișier Primit",
"file-received-plural": "{{count}} Fișiere Primite"
}
}
+20 -16
View File
@@ -4,7 +4,7 @@
"pair-device_title": "Связать ваши устройства навсегда", "pair-device_title": "Связать ваши устройства навсегда",
"install_title": "Установить PairDrop", "install_title": "Установить PairDrop",
"cancel-paste-mode": "Выполнено", "cancel-paste-mode": "Выполнено",
"edit-paired-devices_title": "Редактировать сопряженные устройства", "edit-paired-devices_title": "Редактировать связанные устройства",
"notification_title": "Включить уведомления", "notification_title": "Включить уведомления",
"about_title": "О сервисе", "about_title": "О сервисе",
"theme-auto_title": "Адаптировать тему к системной", "theme-auto_title": "Адаптировать тему к системной",
@@ -22,7 +22,7 @@
"x-instructions_data-drop-peer": "Отпустите, чтобы послать узлу", "x-instructions_data-drop-peer": "Отпустите, чтобы послать узлу",
"x-instructions_mobile": "Прикоснитесь коротко, чтобы отправить файлы, или долго, чтобы отправить сообщение", "x-instructions_mobile": "Прикоснитесь коротко, чтобы отправить файлы, или долго, чтобы отправить сообщение",
"no-peers-title": "Откройте PairDrop на других устройствах, чтобы отправить файлы", "no-peers-title": "Откройте PairDrop на других устройствах, чтобы отправить файлы",
"no-peers-subtitle": "Сопрягите устройства или войдите в публичную комнату, чтобы вас могли обнаружить из других сетей", "no-peers-subtitle": "Свяжите устройства или войдите в публичную комнату, чтобы вас могли обнаружить из других сетей",
"activate-paste-mode-and-other-files": "и {{count}} других файлов", "activate-paste-mode-and-other-files": "и {{count}} других файлов",
"activate-paste-mode-base": "Откройте PairDrop на других устройствах, чтобы отправить", "activate-paste-mode-base": "Откройте PairDrop на других устройствах, чтобы отправить",
"activate-paste-mode-shared-text": "общий текст" "activate-paste-mode-shared-text": "общий текст"
@@ -32,25 +32,25 @@
"routed": "направляется через сервер", "routed": "направляется через сервер",
"webrtc": ", если WebRTC недоступен.", "webrtc": ", если WebRTC недоступен.",
"traffic": "Трафик", "traffic": "Трафик",
"paired-devices": "сопряженными устройствами", "paired-devices": "связанными устройствами",
"known-as": "Вы известны под именем:", "known-as": "Вы известны под именем:",
"on-this-network": "в этой сети", "on-this-network": "в этой сети",
"display-name_title": "Изменить имя вашего устройства навсегда", "display-name_title": "Изменить имя вашего устройства навсегда",
"public-room-devices_title": "Вы можете быть обнаружены устройствами в этой публичной комнате вне зависимости от сети.", "public-room-devices_title": "Вы можете быть обнаружены устройствами в этой публичной комнате вне зависимости от сети.",
"paired-devices_title": "Вы можете быть обнаружены сопряженными устройствами в любое время вне зависимости от сети.", "paired-devices_title": "Вы можете быть обнаружены связанными устройствами в любое время вне зависимости от сети.",
"public-room-devices": "в комнате {{roomId}}", "public-room-devices": "в комнате {{roomId}}",
"discovery": "Вы можете быть обнаружены:", "discovery": "Вы можете быть обнаружены:",
"on-this-network_title": "Вы можете быть обнаружены кем угодно в этой сети." "on-this-network_title": "Вы можете быть обнаружены кем угодно в этой сети."
}, },
"dialogs": { "dialogs": {
"edit-paired-devices-title": "Редактировать сопряженные устройства", "edit-paired-devices-title": "Редактировать связанные устройства",
"auto-accept": "автоприем", "auto-accept": "автоприем",
"close": "Закрыть", "close": "Закрыть",
"decline": "Отклонить", "decline": "Отклонить",
"share": "Поделиться", "share": "Поделиться",
"would-like-to-share": "хотел бы поделиться", "would-like-to-share": "хотел бы поделиться",
"has-sent": "отправил:", "has-sent": "отправил:",
"paired-devices-wrapper_data-empty": "Нет сопряженных устройств.", "paired-devices-wrapper_data-empty": "Нет связанных устройств.",
"download": "Скачать", "download": "Скачать",
"receive-text-title": "Сообщение получено", "receive-text-title": "Сообщение получено",
"send": "Отправить", "send": "Отправить",
@@ -69,8 +69,8 @@
"download-again": "Скачать еще раз", "download-again": "Скачать еще раз",
"auto-accept-instructions-2": ", чтобы автоматически принимать все файлы, отправленные с того устройства.", "auto-accept-instructions-2": ", чтобы автоматически принимать все файлы, отправленные с того устройства.",
"enter-key-from-another-device": "Введите сюда ключ с другого устройства.", "enter-key-from-another-device": "Введите сюда ключ с другого устройства.",
"pair-devices-title": "Сопрягите устройства навсегда", "pair-devices-title": "Соединить устройства навсегда",
"input-key-on-this-device": "Введите этот ключ на другом устройстве", "input-key-on-this-device": "На другом устройстве введите этот ключ",
"scan-qr-code": "или отсканируйте QR-код.", "scan-qr-code": "или отсканируйте QR-код.",
"cancel": "Отменить", "cancel": "Отменить",
"pair": "Подключить", "pair": "Подключить",
@@ -82,10 +82,14 @@
"file-other-description-file-plural": "и {{count}} других файлов", "file-other-description-file-plural": "и {{count}} других файлов",
"receive-title": "{{descriptor}} получен", "receive-title": "{{descriptor}} получен",
"system-language": "Язык системы", "system-language": "Язык системы",
"unpair": "Разорвать сопряжение", "unpair": "Отвязать",
"language-selector-title": "Выберите язык", "language-selector-title": "Выбрать язык",
"hr-or": "ИЛИ", "hr-or": "ИЛИ",
"input-room-id-on-another-device": "Введите этот ID комнаты на другом устройстве" "input-room-id-on-another-device": "На другом устройстве введите этот ID комнаты",
"leave": "Покинуть",
"join": "Войти",
"enter-room-id-from-another-device": "Введите ID комнаты с другого устройства, чтобы войти в нее.",
"temporary-public-room-title": "Временная публичная комната"
}, },
"about": { "about": {
"close-about-aria-label": "Закрыть страницу \"О сервисе\"", "close-about-aria-label": "Закрыть страницу \"О сервисе\"",
@@ -99,10 +103,10 @@
"notifications": { "notifications": {
"display-name-changed-permanently": "Отображаемое имя было изменено навсегда.", "display-name-changed-permanently": "Отображаемое имя было изменено навсегда.",
"display-name-random-again": "Отображаемое имя сгенерировалось случайным образом снова.", "display-name-random-again": "Отображаемое имя сгенерировалось случайным образом снова.",
"pairing-success": "Устройства сопряжены.", "pairing-success": "Устройства связаны.",
"pairing-tabs-error": "Сопряжение двух вкладок браузера невозможно.", "pairing-tabs-error": "Связка двух вкладок браузера невозможна.",
"copied-to-clipboard": "Скопировано в буфер обмена", "copied-to-clipboard": "Скопировано в буфер обмена",
"pairing-not-persistent": "Сопряженные устройства непостоянны.", "pairing-not-persistent": "Связанные устройства непостоянны.",
"link-received": "Получена ссылка от {{name}} - нажмите, чтобы открыть", "link-received": "Получена ссылка от {{name}} - нажмите, чтобы открыть",
"notifications-enabled": "Уведомления включены.", "notifications-enabled": "Уведомления включены.",
"text-content-incorrect": "Содержание текста неверно.", "text-content-incorrect": "Содержание текста неверно.",
@@ -120,7 +124,7 @@
"rate-limit-join-key": "Достигнут предел скорости. Подождите 10 секунд и повторите попытку.", "rate-limit-join-key": "Достигнут предел скорости. Подождите 10 секунд и повторите попытку.",
"unfinished-transfers-warning": "Есть незавершенные передачи. Вы уверены, что хотите закрыть PairDrop?", "unfinished-transfers-warning": "Есть незавершенные передачи. Вы уверены, что хотите закрыть PairDrop?",
"copied-text-error": "Запись в буфер обмена не удалась. Скопируйте вручную!", "copied-text-error": "Запись в буфер обмена не удалась. Скопируйте вручную!",
"pairing-cleared": "Все устройства не сопряжены.", "pairing-cleared": "Все устройства отвязаны.",
"pairing-key-invalid": "Неверный ключ", "pairing-key-invalid": "Неверный ключ",
"pairing-key-invalidated": "Ключ {{key}} признан недействительным.", "pairing-key-invalidated": "Ключ {{key}} признан недействительным.",
"click-to-download": "Нажмите, чтобы скачать", "click-to-download": "Нажмите, чтобы скачать",
@@ -134,7 +138,7 @@
"public-room-left": "Покинуть публичную комнату {{publicRoomId}}", "public-room-left": "Покинуть публичную комнату {{publicRoomId}}",
"copied-to-clipboard-error": "Копирование невозможно. Скопируйте вручную.", "copied-to-clipboard-error": "Копирование невозможно. Скопируйте вручную.",
"public-room-id-invalid": "Неверный ID комнаты", "public-room-id-invalid": "Неверный ID комнаты",
"online-requirement-pairing": "Для сопряжения устройств необходимо находиться быть онлайн.", "online-requirement-pairing": "Для связки устройств необходимо находиться быть онлайн.",
"online-requirement-public-room": "Для создания публичной комнаты необходимо быть онлайн." "online-requirement-public-room": "Для создания публичной комнаты необходимо быть онлайн."
}, },
"peer-ui": { "peer-ui": {
+10 -6
View File
@@ -4,7 +4,7 @@
"about_aria-label": "打开 关于 PairDrop", "about_aria-label": "打开 关于 PairDrop",
"theme-light_title": "总是使用明亮主题", "theme-light_title": "总是使用明亮主题",
"install_title": "安装 PairDrop", "install_title": "安装 PairDrop",
"pair-device_title": "久配对您的设备", "pair-device_title": "久配对您的设备",
"theme-auto_title": "主题适应系统", "theme-auto_title": "主题适应系统",
"theme-dark_title": "总是使用暗黑主题", "theme-dark_title": "总是使用暗黑主题",
"notification_title": "开启通知", "notification_title": "开启通知",
@@ -16,7 +16,7 @@
"instructions": { "instructions": {
"x-instructions_data-drop-peer": "释放以发送到此设备", "x-instructions_data-drop-peer": "释放以发送到此设备",
"no-peers_data-drop-bg": "释放来选择接收者", "no-peers_data-drop-bg": "释放来选择接收者",
"no-peers-subtitle": "配对新设备 或 加入一个公共房间 使在其他网络上可见", "no-peers-subtitle": "配对新设备 或 加入一个公共房间 以便在其他网络上可见",
"no-peers-title": "在其他设备上打开 PairDrop 来发送文件", "no-peers-title": "在其他设备上打开 PairDrop 来发送文件",
"x-instructions_desktop": "点击以发送文件 或 右键来发送信息", "x-instructions_desktop": "点击以发送文件 或 右键来发送信息",
"x-instructions_mobile": "轻触以发送文件 或 长按来发送信息", "x-instructions_mobile": "轻触以发送文件 或 长按来发送信息",
@@ -85,7 +85,11 @@
"unpair": "取消配对", "unpair": "取消配对",
"language-selector-title": "选择语言", "language-selector-title": "选择语言",
"hr-or": "或者", "hr-or": "或者",
"input-room-id-on-another-device": "在另一个设备上输入这串房间号" "input-room-id-on-another-device": "在另一个设备上输入这串房间号",
"leave": "离开",
"join": "加入",
"temporary-public-room-title": "临时公共房间",
"enter-room-id-from-another-device": "在另一个设备上输入这串房间号来加入房间。"
}, },
"about": { "about": {
"faq_title": "常见问题", "faq_title": "常见问题",
@@ -96,9 +100,9 @@
"tweet_title": "关于 PairDrop 的推特" "tweet_title": "关于 PairDrop 的推特"
}, },
"notifications": { "notifications": {
"display-name-changed-permanently": "展示的名字已经久变更。", "display-name-changed-permanently": "展示的名字已经久变更。",
"display-name-changed-temporarily": "展示的名字已经变更 仅在此会话中。", "display-name-changed-temporarily": "展示的名字仅在此会话中变更。",
"display-name-random-again": "展示的名字再次随机生成。", "display-name-random-again": "展示的名字再次随机生成。",
"download-successful": "{{descriptor}} 已下载", "download-successful": "{{descriptor}} 已下载",
"pairing-tabs-error": "无法配对两个浏览器标签页。", "pairing-tabs-error": "无法配对两个浏览器标签页。",
"pairing-success": "新设备已配对。", "pairing-success": "新设备已配对。",
+3 -2
View File
@@ -1,7 +1,7 @@
class Localization { class Localization {
constructor() { constructor() {
Localization.defaultLocale = "en"; Localization.defaultLocale = "en";
Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de"]; Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de", "ro", "id", "fr"];
Localization.translations = {}; Localization.translations = {};
Localization.defaultTranslations = {}; Localization.defaultTranslations = {};
@@ -127,7 +127,8 @@ class Localization {
if (!useDefault) { if (!useDefault) {
translation = this.getTranslation(key, attr, data, true); translation = this.getTranslation(key, attr, data, true);
console.warn(`Missing translation entry for your language ${Localization.locale.toUpperCase()}. Using ${Localization.defaultLocale.toUpperCase()} instead.`, key, attr); console.warn(`Missing translation entry for your language ${Localization.locale.toUpperCase()}. Using ${Localization.defaultLocale.toUpperCase()} instead.`, key, attr);
console.warn("Help translating PairDrop: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/"); console.warn(`Translate this string here: https://hosted.weblate.org/browse/pairdrop/pairdrop-spa/${Localization.locale.toLowerCase()}/?q=${key}`)
console.log("Help translating PairDrop: https://hosted.weblate.org/engage/pairdrop/");
} else { } else {
console.warn("Missing translation in default language:", key, attr); console.warn("Missing translation in default language:", key, attr);
} }
+3 -1
View File
@@ -220,7 +220,9 @@ class ServerConnection {
_onDisconnect() { _onDisconnect() {
console.log('WS: server disconnected'); console.log('WS: server disconnected');
Events.fire('notify-user', Localization.getTranslation("notifications.connecting")); setTimeout(() => {
Events.fire('notify-user', Localization.getTranslation("notifications.connecting"));
}, 100); //delay for 100ms to prevent flickering on page reload
clearTimeout(this._reconnectTimer); clearTimeout(this._reconnectTimer);
this._reconnectTimer = setTimeout(_ => this._connect(), 1000); this._reconnectTimer = setTimeout(_ => this._connect(), 1000);
Events.fire('ws-disconnected'); Events.fire('ws-disconnected');
+27 -7
View File
@@ -36,9 +36,24 @@ class PeersUI {
Events.on('drop', e => this._onDrop(e)); Events.on('drop', e => this._onDrop(e));
Events.on('keydown', e => this._onKeyDown(e)); Events.on('keydown', e => this._onKeyDown(e));
this.$header = document.querySelector('body > header')
this.$xPeers = $$('x-peers'); this.$xPeers = $$('x-peers');
this.$xNoPeers = $$('x-no-peers'); this.$xNoPeers = $$('x-no-peers');
this.$xInstructions = $$('x-instructions'); this.$xInstructions = $$('x-instructions');
this.$center = $$('#center');
this.$logo = $$('footer .icon.logo');
this.$discoveryWrapper = $$('footer .discovery-wrapper');
this.$knownAsWrapper = $$('footer .known-as-wrapper');
this.$header.style.opacity = "1";
this.$xPeers.style.opacity = "1";
this.$xNoPeers.style.opacity = "1";
this.$xInstructions.style.opacity = "0.5";
this.$center.style.opacity = "1";
this.$logo.style.opacity = "1";
this.$discoveryWrapper.style.opacity = "1";
this.$knownAsWrapper.style.opacity = "1";
Events.on('peer-added', _ => this.evaluateOverflowing()); Events.on('peer-added', _ => this.evaluateOverflowing());
Events.on('bg-resize', _ => this.evaluateOverflowing()); Events.on('bg-resize', _ => this.evaluateOverflowing());
@@ -1004,9 +1019,13 @@ class ReceiveRequestDialog extends ReceiveDialog {
this.$previewBox.appendChild(element) this.$previewBox.appendChild(element)
} }
this.$receiveTitle.innerText = `${request.imagesOnly ? 'Image' : 'File'} Transfer Request` const transferRequestTitle= request.imagesOnly
? Localization.getTranslation('document-titles.image-transfer-requested')
: Localization.getTranslation('document-titles.file-transfer-requested');
document.title = `${ Localization.getTranslation("document-titles.file-transfer-requested") } - PairDrop`; this.$receiveTitle.innerText = transferRequestTitle;
document.title = `${transferRequestTitle} - PairDrop`;
document.changeFavicon("images/favicon-96x96-notification.png"); document.changeFavicon("images/favicon-96x96-notification.png");
this.show(); this.show();
} }
@@ -1705,7 +1724,7 @@ class SendTextDialog extends Dialog {
constructor() { constructor() {
super('send-text-dialog'); super('send-text-dialog');
Events.on('text-recipient', e => this._onRecipient(e.detail.peerId, e.detail.deviceName)); Events.on('text-recipient', e => this._onRecipient(e.detail.peerId, e.detail.deviceName));
this.$text = this.$el.querySelector('#text-input'); this.$text = this.$el.querySelector('.textarea');
this.$peerDisplayName = this.$el.querySelector('.display-name'); this.$peerDisplayName = this.$el.querySelector('.display-name');
this.$form = this.$el.querySelector('form'); this.$form = this.$el.querySelector('form');
this.$submit = this.$el.querySelector('button[type="submit"]'); this.$submit = this.$el.querySelector('button[type="submit"]');
@@ -1726,7 +1745,7 @@ class SendTextDialog extends Dialog {
} }
_textInputEmpty() { _textInputEmpty() {
return !this.$text.innerText || this.$text.innerText === "\n"; return !this.$text.value || this.$text.value === "\n";
} }
_onChange(e) { _onChange(e) {
@@ -1748,7 +1767,6 @@ class SendTextDialog extends Dialog {
const range = document.createRange(); const range = document.createRange();
const sel = window.getSelection(); const sel = window.getSelection();
this.$text.focus();
range.selectNodeContents(this.$text); range.selectNodeContents(this.$text);
sel.removeAllRanges(); sel.removeAllRanges();
sel.addRange(range); sel.addRange(range);
@@ -1762,7 +1780,7 @@ class SendTextDialog extends Dialog {
_send() { _send() {
Events.fire('send-text', { Events.fire('send-text', {
to: this.correspondingPeerId, to: this.correspondingPeerId,
text: this.$text.innerText text: this.$text.value
}); });
this.$text.value = ""; this.$text.value = "";
this.hide(); this.hide();
@@ -2044,6 +2062,7 @@ class Notifications {
this.$button.removeAttribute('hidden'); this.$button.removeAttribute('hidden');
this.$button.addEventListener('click', _ => this._requestPermission()); this.$button.addEventListener('click', _ => this._requestPermission());
} }
Events.on('text-received', e => this._messageNotification(e.detail.text, e.detail.peerId)); Events.on('text-received', e => this._messageNotification(e.detail.text, e.detail.peerId));
Events.on('files-received', e => this._downloadNotification(e.detail.files)); Events.on('files-received', e => this._downloadNotification(e.detail.files));
Events.on('files-transfer-request', e => this._requestNotification(e.detail.request, e.detail.peerId)); Events.on('files-transfer-request', e => this._requestNotification(e.detail.request, e.detail.peerId));
@@ -2729,6 +2748,7 @@ Events.on('load', () => {
dw = Math.round(Math.max(w, h, 1000) / 13); dw = Math.round(Math.max(w, h, 1000) / 13);
drawCircles(cCtx, dw); drawCircles(cCtx, dw);
c.style.opacity = "1";
} }
Events.on('bg-resize', _ => init()); Events.on('bg-resize', _ => init());
@@ -2750,7 +2770,7 @@ Events.on('load', () => {
} }
} }
init(); setTimeout(_ => init(), 300);
}); });
document.changeFavicon = function (src) { document.changeFavicon = function (src) {
+1 -1
View File
@@ -1,4 +1,4 @@
const cacheVersion = 'v1.8.0'; const cacheVersion = 'v1.8.3';
const cacheTitle = `pairdrop-cache-${cacheVersion}`; const cacheTitle = `pairdrop-cache-${cacheVersion}`;
const urlsToCache = [ const urlsToCache = [
'index.html', 'index.html',
+34 -13
View File
@@ -415,8 +415,9 @@ x-no-peers {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 8px; padding: 8px;
height: 137px;
text-align: center; text-align: center;
animation: fade-in 300ms; animation: fade-in 600ms;
animation-fill-mode: backwards; animation-fill-mode: backwards;
/* prevent flickering on load */ /* prevent flickering on load */
animation-iteration-count: 0; animation-iteration-count: 0;
@@ -612,6 +613,7 @@ footer .logo {
margin-bottom: 8px; margin-bottom: 8px;
color: var(--primary-color); color: var(--primary-color);
margin-top: -10px; margin-top: -10px;
animation: ease-in;
} }
.discovery-wrapper { .discovery-wrapper {
@@ -622,6 +624,7 @@ footer .logo {
padding: 2px; padding: 2px;
background-color: rgb(var(--bg-color)); background-color: rgb(var(--bg-color));
transition: background-color 0.5s ease; transition: background-color 0.5s ease;
min-height: 24px;
} }
/*You can be discovered wrapper*/ /*You can be discovered wrapper*/
@@ -770,12 +773,13 @@ x-dialog a {
color: var(--primary-color); color: var(--primary-color);
} }
/* Pair Devices Dialog */ /* Pair Devices Dialog & Public Room Dialog */
.input-key-container { .input-key-container {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: center; justify-content: center;
margin-top: 10px;
} }
.input-key-container > input { .input-key-container > input {
@@ -836,7 +840,7 @@ x-dialog hr {
.hr-note { .hr-note {
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 20px;
} }
.hr-note hr { .hr-note hr {
@@ -1007,7 +1011,7 @@ x-dialog .dialog-subheader {
padding-bottom: 0; padding-bottom: 0;
} }
#text-input { #send-text-dialog .textarea {
min-height: 200px; min-height: 200px;
width: 100%; width: 100%;
} }
@@ -1199,15 +1203,22 @@ button::-moz-focus-inner {
z-index: 1; z-index: 1;
} }
#about:not(:target) header.fade-in {
transition-delay: 400ms;
}
#about:target header.fade-in {
transition-delay: 100ms;
}
#about .fade-in { #about .fade-in {
transition: opacity 300ms; transition: opacity 300ms ease 300ms;
will-change: opacity; will-change: opacity;
transition-delay: 300ms;
pointer-events: all; pointer-events: all;
} }
#about:not(:target) .fade-in { #about:not(:target) .fade-in {
opacity: 0; opacity: 0 !important;
pointer-events: none; pointer-events: none;
transition-delay: 0s; transition-delay: 0s;
} }
@@ -1257,10 +1268,6 @@ button::-moz-focus-inner {
flex-grow: 1; flex-grow: 1;
} }
#about header {
align-self: end;
}
canvas.circles { canvas.circles {
width: 100vw; width: 100vw;
position: absolute; position: absolute;
@@ -1344,7 +1351,6 @@ x-toast:not([show]):not(:hover) {
x-instructions { x-instructions {
position: relative; position: relative;
opacity: 0.5; opacity: 0.5;
transition: opacity 300ms;
text-align: center; text-align: center;
margin-left: 10px; margin-left: 10px;
margin-right: 10px; margin-right: 10px;
@@ -1371,7 +1377,7 @@ x-instructions p {
} }
x-peers:empty~x-instructions { x-peers:empty~x-instructions {
opacity: 0; opacity: 0 !important;
} }
@media (hover: none) and (pointer: coarse) { @media (hover: none) and (pointer: coarse) {
@@ -1381,6 +1387,21 @@ x-peers:empty~x-instructions {
} }
} }
/* Prevent Cumulative Layout Shift */
body > header,
canvas,
#center,
x-no-peers,
x-peers,
x-instructions,
footer > .icon.logo,
.discovery-wrapper,
.known-as-wrapper {
transition: opacity 0.5s ease 0.1s;
opacity: 0; /* will be set to 1 after initial translation is loaded */
}
/* Responsive Styles */ /* Responsive Styles */
@media screen and (min-height: 800px) { @media screen and (min-height: 800px) {
+11 -8
View File
@@ -155,7 +155,10 @@
<button class="button fw" data-i18n-key="dialogs.system-language" data-i18n-attrs="text">System Language</button> <button class="button fw" data-i18n-key="dialogs.system-language" data-i18n-attrs="text">System Language</button>
<button class="button fw" value="en">English</button> <button class="button fw" value="en">English</button>
<button class="button fw" value="de">Deutsch (German)</button> <button class="button fw" value="de">Deutsch (German)</button>
<button class="button fw" value="fr">Français (French)</button>
<button class="button fw" value="id">Bahasa Indonesia (Indonesian)</button>
<button class="button fw" value="nb">Norsk (Norwegian)</button> <button class="button fw" value="nb">Norsk (Norwegian)</button>
<button class="button fw" value="ro">Română (Romanian)</button>
<button class="button fw" value="ru">Русский язык (Russian)</button> <button class="button fw" value="ru">Русский язык (Russian)</button>
<button class="button fw" value="zh-CN">中文 (Chinese)</button> <button class="button fw" value="zh-CN">中文 (Chinese)</button>
</div> </div>
@@ -244,13 +247,13 @@
<x-paper shadow="2"> <x-paper shadow="2">
<div class="row center"> <div class="row center">
<div class="column"> <div class="column">
<h2 class="center">Temporary Public Room</h2> <h2 class="center" data-i18n-key="dialogs.temporary-public-room-title" data-i18n-attrs="text">Temporary Public Room</h2>
</div> </div>
</div> </div>
<div class="row center"> <div class="row center">
<div class="column"> <div class="column">
<div class="center key-qr-code"></div> <div class="center key-qr-code"></div>
<h1 class="center key">IOX9P</h1> <h1 class="center key"></h1>
<p class="center text-center key-instructions"> <p class="center text-center key-instructions">
<span class="font-subheading" data-i18n-key="dialogs.input-room-id-on-another-device" data-i18n-attrs="text">Input this room id on another device</span> <span class="font-subheading" data-i18n-key="dialogs.input-room-id-on-another-device" data-i18n-attrs="text">Input this room id on another device</span>
<span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text">or scan the QR-Code.</span> <span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text">or scan the QR-Code.</span>
@@ -272,13 +275,13 @@
<input type="text" class="textarea center" aria-label="room-id-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled> <input type="text" class="textarea center" aria-label="room-id-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
<input type="text" class="textarea center" aria-label="room-id-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled> <input type="text" class="textarea center" aria-label="room-id-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
</div> </div>
<p class="font-subheading center text-center">Enter room id from another device to join.</p> <p class="font-subheading center text-center" data-i18n-key="dialogs.enter-room-id-from-another-device" data-i18n-attrs="text">Enter room id from another device to join room.</p>
</div> </div>
</div> </div>
<div class="center row-reverse button-row"> <div class="center row-reverse button-row">
<button class="button" type="submit" disabled>Join</button> <button class="button" type="submit" data-i18n-key="dialogs.join" data-i18n-attrs="text" disabled>Join</button>
<button class="button" type="button" close>Close</button> <button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
<button class="button leave-room" type="button">Leave</button> <button class="button leave-room" type="button" data-i18n-key="dialogs.leave" data-i18n-attrs="text">Leave</button>
</div> </div>
</x-paper> </x-paper>
</x-background> </x-background>
@@ -369,7 +372,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="column fw"> <div class="column fw">
<div id="text-input" title="Message" class="textarea" role="textbox" autocapitalize="none" spellcheck="false" autofocus contenteditable></div> <textarea title="Message" class="textarea" wrap="off" autofocus></textarea>
</div> </div>
</div> </div>
<div class="button-row row-reverse"> <div class="button-row row-reverse">
@@ -436,7 +439,7 @@
</svg> </svg>
<div class="title-wrapper"> <div class="title-wrapper">
<h1>PairDrop</h1> <h1>PairDrop</h1>
<div class="font-subheading">v1.8.0</div> <div class="font-subheading">v1.8.3</div>
</div> </div>
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text">The easiest way to transfer files across devices</div> <div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text">The easiest way to transfer files across devices</div>
<div class="row"> <div class="row">
+8 -4
View File
@@ -55,8 +55,12 @@
"system-language": "Systemsprache", "system-language": "Systemsprache",
"language-selector-title": "Sprache auswählen", "language-selector-title": "Sprache auswählen",
"hr-or": "ODER", "hr-or": "ODER",
"input-room-id-on-another-device": "Gib diese Raum ID auf einem anderen Gerät ein", "input-room-id-on-another-device": "Gib diese Raum-ID auf einem anderen Gerät ein",
"unpair": "Entkoppeln" "unpair": "Entkoppeln",
"leave": "Verlassen",
"join": "Betreten",
"enter-room-id-from-another-device": "Gib die Raum-ID von einem anderen Gerät hier ein.",
"temporary-public-room-title": "Temporärer Öffentlicher Raum"
}, },
"about": { "about": {
"tweet_title": "Über PairDrop twittern", "tweet_title": "Über PairDrop twittern",
@@ -108,7 +112,7 @@
"pairing-cleared": "Alle Geräte entkoppelt.", "pairing-cleared": "Alle Geräte entkoppelt.",
"click-to-show": "Klicken zum Anzeigen", "click-to-show": "Klicken zum Anzeigen",
"online-requirement": "Du musst online sein um Geräte zu koppeln.", "online-requirement": "Du musst online sein um Geräte zu koppeln.",
"display-name-changed-temporarily": "Anzeigename wurde nur für diese Sitzung geändert.", "display-name-changed-temporarily": "Anzeigename wurde nur für diese Session geändert.",
"request-title": "{{name}} möchte {{count}}{{descriptor}} übertragen", "request-title": "{{name}} möchte {{count}}{{descriptor}} übertragen",
"connecting": "Verbindung wird aufgebaut…", "connecting": "Verbindung wird aufgebaut…",
"files-incorrect": "Dateien sind fehlerhaft.", "files-incorrect": "Dateien sind fehlerhaft.",
@@ -119,7 +123,7 @@
"ios-memory-limit": "Für Übertragungen an iOS Geräte beträgt die maximale Dateigröße 200 MB", "ios-memory-limit": "Für Übertragungen an iOS Geräte beträgt die maximale Dateigröße 200 MB",
"public-room-left": "Öffentlichen Raum {{publicRoomId}} verlassen", "public-room-left": "Öffentlichen Raum {{publicRoomId}} verlassen",
"copied-to-clipboard-error": "Konnte nicht kopieren. Kopiere manuell.", "copied-to-clipboard-error": "Konnte nicht kopieren. Kopiere manuell.",
"public-room-id-invalid": "Ungültige Raum ID", "public-room-id-invalid": "Ungültige Raum-ID",
"online-requirement-pairing": "Du musst online sein, um Geräte zu koppeln.", "online-requirement-pairing": "Du musst online sein, um Geräte zu koppeln.",
"online-requirement-public-room": "Du musst online sein, um öffentliche Räume erstellen zu können." "online-requirement-public-room": "Du musst online sein, um öffentliche Räume erstellen zu können."
}, },
+7 -2
View File
@@ -47,7 +47,9 @@
"input-key-on-this-device": "Input this key on another device", "input-key-on-this-device": "Input this key on another device",
"scan-qr-code": "or scan the QR-code.", "scan-qr-code": "or scan the QR-code.",
"enter-key-from-another-device": "Enter key from another device here.", "enter-key-from-another-device": "Enter key from another device here.",
"input-room-id-on-another-device": "Input this room id on another device", "temporary-public-room-title": "Temporary Public Room",
"input-room-id-on-another-device": "Input this room ID on another device",
"enter-room-id-from-another-device": "Enter room ID from another device to join room.",
"hr-or": "OR", "hr-or": "OR",
"pair": "Pair", "pair": "Pair",
"cancel": "Cancel", "cancel": "Cancel",
@@ -58,6 +60,8 @@
"auto-accept": "auto-accept", "auto-accept": "auto-accept",
"auto-accept-instructions-2": "to automatically accept all files sent from that device.", "auto-accept-instructions-2": "to automatically accept all files sent from that device.",
"close": "Close", "close": "Close",
"join": "Join",
"leave": "Leave",
"would-like-to-share": "would like to share", "would-like-to-share": "would like to share",
"accept": "Accept", "accept": "Accept",
"decline": "Decline", "decline": "Decline",
@@ -106,7 +110,7 @@
"pairing-key-invalid": "Invalid key", "pairing-key-invalid": "Invalid key",
"pairing-key-invalidated": "Key {{key}} invalidated.", "pairing-key-invalidated": "Key {{key}} invalidated.",
"pairing-cleared": "All Devices unpaired.", "pairing-cleared": "All Devices unpaired.",
"public-room-id-invalid": "Invalid room id", "public-room-id-invalid": "Invalid room ID",
"public-room-left": "Left public room {{publicRoomId}}", "public-room-left": "Left public room {{publicRoomId}}",
"copied-to-clipboard": "Copied to clipboard", "copied-to-clipboard": "Copied to clipboard",
"copied-to-clipboard-error": "Copying not possible. Copy manually.", "copied-to-clipboard-error": "Copying not possible. Copy manually.",
@@ -139,6 +143,7 @@
"file-received": "File Received", "file-received": "File Received",
"file-received-plural": "{{count}} Files Received", "file-received-plural": "{{count}} Files Received",
"file-transfer-requested": "File Transfer Requested", "file-transfer-requested": "File Transfer Requested",
"image-transfer-requested": "Image Transfer Requested",
"message-received": "Message Received", "message-received": "Message Received",
"message-received-plural": "{{count}} Messages Received" "message-received-plural": "{{count}} Messages Received"
}, },
+160
View File
@@ -0,0 +1,160 @@
{
"header": {
"about_title": "A propos de",
"language-selector_title": "Choix de la langue",
"about_aria-label": "Ouvrir à propos de",
"theme-auto_title": "Adapter le thème au système",
"theme-light_title": "Toujours utiliser le thème clair",
"theme-dark_title": "Toujours utiliser le thème sombre",
"notification_title": "Activer les notifications",
"install_title": "Installer PairDrop",
"pair-device_title": "Associez vos appareils de manière permanente",
"edit-paired-devices_title": "Gérer les appareils couplés",
"join-public-room_title": "Rejoindre temporairement la salle publique",
"cancel-paste-mode": "Terminé"
},
"instructions": {
"no-peers_data-drop-bg": "Déposer pour choisir le destinataire",
"no-peers-title": "Ouvrez PairDrop sur d'autres appareils pour envoyer des fichiers",
"no-peers-subtitle": "Associez des appareils ou entrez dans une salle publique pour être visible sur d'autres réseaux",
"x-instructions_desktop": "Cliquez pour envoyer des fichiers ou faites un clic droit pour envoyer un message",
"x-instructions_mobile": "Appuyez pour envoyer des fichiers ou appuyez longuement pour envoyer un message",
"x-instructions_data-drop-peer": "Déposer pour envoyer au destinataire",
"x-instructions_data-drop-bg": "Lâcher pour choisir le destinataire",
"click-to-send": "Cliquez pour envoyer",
"tap-to-send": "Appuyez pour envoyer",
"activate-paste-mode-base": "Ouvrez PairDrop sur d'autres appareils pour envoyer",
"activate-paste-mode-and-other-files": "et {{count}} autres fichiers",
"activate-paste-mode-shared-text": "texte partagé"
},
"footer": {
"known-as": "Vous êtes connu sous le nom de:",
"display-name_data-placeholder": "Chargement…",
"display-name_title": "Modifiez le nom de votre appareil de manière permanente",
"discovery": "Vous pouvez être découvert:",
"on-this-network": "sur ce réseau",
"on-this-network_title": "Vous pouvez être découvert par tout le monde sur ce réseau.",
"paired-devices": "par les appareils couplés",
"paired-devices_title": "Vous pouvez être découvert par les appareils couplés à tout moment, indépendamment du réseau.",
"public-room-devices": "dans la salle {{roomId}}",
"public-room-devices_title": "Vous pouvez être découvert par les appareils de cette salle publique indépendamment du réseau.",
"traffic": "Le trafic est",
"routed": "routé via le serveur",
"webrtc": "si WebRTC n'est pas disponible.",
"display-name_placeholder": "Chargement…"
},
"dialogs": {
"pair-devices-title": "Associer les appareils de manière permanente",
"input-key-on-this-device": "Saisissez cette clé sur un autre appareil",
"scan-qr-code": "ou scannez le QR-code.",
"enter-key-from-another-device": "Entrez ici la clé d'un autre appareil.",
"temporary-public-room-title": "Salle publique temporaire",
"input-room-id-on-another-device": "Saisissez cet ID de salle sur un autre appareil",
"enter-room-id-from-another-device": "Entrez l'ID de la salle depuis un autre appareil pour rejoindre la salle.",
"hr-or": "OU",
"pair": "associer",
"cancel": "Annuler",
"edit-paired-devices-title": "Modifier les appareils couplés",
"unpair": "Dissocier",
"paired-devices-wrapper_data-empty": "Aucun appareil couplé.",
"auto-accept-instructions-1": "Activer",
"auto-accept": "auto-accepter",
"auto-accept-instructions-2": "pour accepter automatiquement tous les fichiers envoyés depuis cet appareil.",
"close": "Fermer",
"join": "Rejoindre",
"leave": "Partir",
"would-like-to-share": "aimerait partager",
"accept": "Accepter",
"decline": "Refuser",
"has-sent": "a envoyé:",
"share": "Partage",
"download": "Télécharger",
"send-message-title": "Envoyer un message",
"send-message-to": "Envoyer un message à",
"send": "Envoyer",
"receive-text-title": "Message reçu",
"copy": "Copier",
"base64-processing": "Traitement…",
"base64-tap-to-paste": "Appuyez ici pour coller {{type}}",
"base64-paste-to-send": "Coller ici pour envoyer {{type}}",
"base64-text": "texte",
"base64-files": "fichiers",
"file-other-description-image": "et 1 autre image",
"file-other-description-file": "et 1 autre fichier",
"file-other-description-image-plural": "et {{count}} autres images",
"file-other-description-file-plural": "et {{count}} autres fichiers",
"title-image": "Image",
"title-file": "Fichier",
"title-image-plural": "Images",
"title-file-plural": "Fichiers",
"receive-title": "{{descriptor}} Reçu",
"download-again": "Télécharger à nouveau",
"language-selector-title": "Sélectionnez la langue",
"system-language": "Langue du système"
},
"about": {
"close-about_aria-label": "Fermer à propos de PairDrop",
"claim": "Le moyen le plus simple de transférer des fichiers entre appareils",
"github_title": "PairDrop sur GitHub",
"buy-me-a-coffee_title": "Achete-moi un café!",
"tweet_title": "Tweet à propos de PairDrop",
"faq_title": "Questions fréquemment posées"
},
"notifications": {
"display-name-changed-permanently": "Le nom d'affichage est modifié de manière permanente.",
"display-name-changed-temporarily": "Le nom d'affichage est modifié uniquement pour cette session.",
"display-name-random-again": "Le nom d'affichage est à nouveau généré aléatoirement.",
"download-successful": "{{descriptor}} téléchargé",
"pairing-tabs-error": "Le couplage de deux onglets de navigateur Web est impossible.",
"pairing-success": "Appareils couplés.",
"pairing-not-persistent": "Les appareils couplés ne sont pas persistants.",
"pairing-key-invalid": "Clé invalide",
"pairing-key-invalidated": "Clé {{key}} invalidée.",
"pairing-cleared": "Tous les appareils ne sont plus appairés.",
"public-room-id-invalid": "ID de salle non valide",
"public-room-left": "Salle publique {{publicRoomId}} quittée",
"copied-to-clipboard": "Copié dans le presse-papier",
"copied-to-clipboard-error": "Copie impossible. Copier manuellement.",
"text-content-incorrect": "Le contenu du texte est incorrect.",
"file-content-incorrect": "Le contenu du fichier est incorrect.",
"clipboard-content-incorrect": "Le contenu du presse-papiers est incorrect.",
"notifications-enabled": "Notifications activées.",
"link-received": "Lien reçu par {{name}} - Cliquez pour ouvrir",
"message-received": "Message reçu par {{name}} - Cliquez pour copier",
"click-to-download": "Cliquez pour télécharger",
"request-title": "{{name}} souhaite transférer {{count}} {{descriptor}}",
"click-to-show": "Cliquez pour afficher",
"copied-text": "Texte copié dans le presse-papiers",
"copied-text-error": "L'écriture dans le presse-papiers a échoué. Copiez manuellement!",
"offline": "Vous êtes hors ligne",
"online": "Vous êtes de nouveau en ligne",
"connected": "Connecté.",
"online-requirement-pairing": "Vous devez être en ligne pour coupler des appareils.",
"online-requirement-public-room": "Vous devez être en ligne pour créer une salle publique.",
"connecting": "Connexion…",
"files-incorrect": "Les fichiers sont incorrects.",
"file-transfer-completed": "Transfert de fichier terminé.",
"ios-memory-limit": "L'envoi de fichiers vers iOS n'est possible que jusqu'à 200 Mo à la fois",
"message-transfer-completed": "Transfert de message terminé.",
"unfinished-transfers-warning": "Il y a des transferts inachevés. Etes-vous sûr de vouloir fermer PairDrop?",
"rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",
"selected-peer-left": "Appareils selectionnés restants."
},
"document-titles": {
"file-received": "Fichier reçu",
"file-received-plural": "{{count}} fichiers reçus",
"file-transfer-requested": "Transfert de fichier demandé",
"image-transfer-requested": "Transfert d'image demandé",
"message-received": "Message reçu",
"message-received-plural": "{{count}} Messages reçus"
},
"peer-ui": {
"click-to-send-paste-mode": "Cliquez pour envoyer {{descriptor}}",
"click-to-send": "Cliquez pour envoyer des fichiers ou faites un clic droit pour envoyer un message",
"connection-hash": "Pour vérifier la sécurité du chiffrement de bout en bout, comparez ce numéro de sécurité sur les deux appareils",
"preparing": "Préparation…",
"waiting": "En attente…",
"processing": "En cours…",
"transferring": "Transfert en cours…"
}
}
+158
View File
@@ -0,0 +1,158 @@
{
"footer": {
"webrtc": "jika WebRTC tidak tersedia.",
"public-room-devices_title": "Anda dapat ditemukan oleh perangkat di ruang publik ini terlepas dari jaringan.",
"display-name_data-placeholder": "Memuat…",
"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}}",
"paired-devices": "pada prngkt. yg. dipasangkan",
"on-this-network": "pada jaringan ini",
"routed": "diarahkan melalui server",
"discovery": "Anda dapat ditemukan:",
"on-this-network_title": "Anda dapat ditemukan oleh semua orang di jaringan ini.",
"known-as": "Anda dikenal sebagai:"
},
"notifications": {
"request-title": "{{name}} ingin mentransfer {{count}} {{descriptor}}",
"unfinished-transfers-warning": "Ada transfer yang belum selesai. Apakah Anda yakin ingin menutup PairDrop?",
"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",
"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.",
"selected-peer-left": "Rekan terpilih keluar.",
"link-received": "Tautan diterima dari {{name}} - Klik untuk membuka",
"online": "Anda kembali online",
"public-room-left": "Keluar dari ruang publik {{publicRoomId}}",
"copied-text": "Teks disalin ke papan klip",
"display-name-random-again": "Nama tampilan dibuat secara acak lagi.",
"display-name-changed-permanently": "Nama tampilan diubah secara permanen.",
"copied-to-clipboard-error": "Penyalinan tak dapat dilakukan. Salinlah secara manual.",
"pairing-success": "Perangkat dipasangkan.",
"clipboard-content-incorrect": "Isi papan klip keliru.",
"display-name-changed-temporarily": "Nama tampilan hanya diubah untuk sesi ini.",
"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",
"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.",
"copied-text-error": "Menyalin ke papan klip gagal. Salinlah secara manual!",
"download-successful": "{{descriptor}} diunduh",
"click-to-show": "Klik untuk menampilkan"
},
"header": {
"cancel-paste-mode": "Selesai",
"theme-auto_title": "Sesuaikan Tema dengan Sistem",
"install_title": "Instal PairDrop",
"theme-dark_title": "Selalu Gunakan Tema Gelap",
"pair-device_title": "Pasangkan Perangkat Anda Secara Permanen",
"join-public-room_title": "Bergabung dgn. Ruang Publik Sementara",
"notification_title": "Aktifkan Notifikasi",
"edit-paired-devices_title": "Edit Perangkat yg. Dipasangkan",
"language-selector_title": "Pilih Bahasa",
"about_title": "Tentang PairDrop",
"about_aria-label": "Buka Tentang PairDrop",
"theme-light_title": "Selalu Gunakan Tema Terang"
},
"instructions": {
"x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan",
"click-to-send": "Klik untuk mengirim",
"activate-paste-mode-and-other-files": "dan {{count}} file lainnya",
"tap-to-send": "Ketuk untuk mengirim",
"activate-paste-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-paste-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_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"
},
"peer-ui": {
"processing": "Memproses…",
"click-to-send-paste-mode": "Klik untuk mengirim {{descriptor}}",
"click-to-send": "Klik untuk mengirim file 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…",
"transferring": "Mentransfer…"
},
"dialogs": {
"base64-paste-to-send": "Tempel di sini untuk mengirim {{type}}",
"auto-accept-instructions-2": "untuk secara otomatis menerima semua file yang dikirim dari perangkat tersebut.",
"receive-text-title": "Pesan Diterima",
"edit-paired-devices-title": "Edit Perangkat yg. Dipasangkan",
"cancel": "Batal",
"auto-accept-instructions-1": "Aktifkan",
"pair-devices-title": "Pasangkan Perangkat Scr. Permanen",
"download": "Unduh",
"title-file": "File",
"base64-processing": "Memproses…",
"decline": "Tolak",
"receive-title": "{{descriptor}} Diterima",
"leave": "Tinggalkan",
"join": "Gabung",
"title-image-plural": "Gambar",
"send": "Kirim",
"base64-tap-to-paste": "Ketuk di sini untuk menempelkan {{type}}",
"base64-text": "teks",
"copy": "Salin",
"file-other-description-image": "dan 1 gambar lainnya",
"temporary-public-room-title": "Ruang Publik Sementara",
"base64-files": "file",
"has-sent": "telah mengirim:",
"file-other-description-file": "dan 1 file lainnya",
"close": "Tutup",
"system-language": "Bahasa Sistem",
"unpair": "Lepas",
"title-image": "Gambar",
"file-other-description-file-plural": "dan {{count}} file lainnya",
"would-like-to-share": "ingin berbagi",
"send-message-to": "Kirim pesan ke",
"language-selector-title": "Pilih Bahasa",
"pair": "Pasangkan",
"hr-or": "ATAU",
"scan-qr-code": "atau pindai kode QR.",
"input-key-on-this-device": "Masukkan kunci ini pada perangkat lain",
"download-again": "Unduh lagi",
"accept": "Terima",
"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",
"send-message-title": "Kirim Pesan",
"input-room-id-on-another-device": "Masukkan room ID 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."
},
"about": {
"claim": "Cara termudah untuk mentransfer file lintas perangkat",
"tweet_title": "Tweet tentang PairDrop",
"close-about_aria-label": "Tutup Tentang PairDrop",
"buy-me-a-coffee_title": "Traktir aku kopi!",
"github_title": "PairDrop di GitHub",
"faq_title": "Pertanyaan yang sering diajukan"
},
"document-titles": {
"file-transfer-requested": "Permintaan Transfer File",
"message-received-plural": "{{count}} Pesan Diterima",
"message-received": "Pesan Diterima",
"file-received": "File Diterima",
"file-received-plural": "{{count}} File Diterima"
}
}
+158
View File
@@ -0,0 +1,158 @@
{
"footer": {
"webrtc": "dacă WebRTC nu este disponibil.",
"public-room-devices_title": "Poți fi descoperit de dispozitivele din această cameră publică, independent de rețea.",
"display-name_data-placeholder": "Se încarcă…",
"display-name_title": "Editați permanent numele dispozitivului tău",
"traffic": "Traficul este",
"paired-devices_title": "Poți fi descoperit în orice moment de dispozitivele cuplate, indiferent de rețea.",
"public-room-devices": "în camera {{roomId}}",
"paired-devices": "prin dispozitive împerecheate",
"on-this-network": "în această rețea",
"routed": "rutate prin server",
"discovery": "Poți fi descoperit:",
"on-this-network_title": "Poți fi descoperit de toată lumea din această rețea.",
"known-as": "Ești cunoscut ca:"
},
"notifications": {
"request-title": "{{name}} ar dori să transfere {{count}} {{descriptor}}",
"unfinished-transfers-warning": "Există transferuri neterminate. Sigur vrei să închizi PairDrop?",
"message-received": "Mesaj primit de {{name}} - Apasă pentru a copia",
"rate-limit-join-key": "A fost atinsă limita ratei. Așteptați 10 secunde și încercați din nou.",
"connecting": "Conectarea…",
"pairing-key-invalidated": "Cheia {{key}} invalidată.",
"pairing-key-invalid": "Cheie invalidă",
"connected": "Conectat.",
"pairing-not-persistent": "Dispozitivele cuplate nu sunt persistente.",
"text-content-incorrect": "Conținutul textului este incorect.",
"message-transfer-completed": "Transferul mesajului este finalizat.",
"file-transfer-completed": "Transfer de fișiere finalizat.",
"file-content-incorrect": "Conținutul fișierului este incorect.",
"files-incorrect": "Fișierele sunt incorecte.",
"selected-peer-left": "Selectat peer a plecat.",
"link-received": "Link primit de {{name}} - Apasă pentru a deschide",
"online": "Ați revenit online",
"public-room-left": "Plecat din camera publică {{publicRoomId}}",
"copied-text": "Text copiat în clipboard",
"display-name-random-again": "Numele afișat este din nou generat aleatoriu.",
"display-name-changed-permanently": "Numele afișat este schimbat permanent.",
"copied-to-clipboard-error": "Copierea nu este posibilă. Copiați manual.",
"pairing-success": "Dispozitive asociate.",
"clipboard-content-incorrect": "Conținutul clipboard-ului este incorect.",
"display-name-changed-temporarily": "Numele afișat se modifică numai pentru această sesiune.",
"copied-to-clipboard": "Copiat în clipboard",
"offline": "Ești offline",
"pairing-tabs-error": "Cuplarea între două file de browser web este imposibilă.",
"public-room-id-invalid": "ID-ul camerei invalid",
"click-to-download": "Apasă pentru a descărca",
"pairing-cleared": "Toate dispozitivele sunt decuplate.",
"notifications-enabled": "Notificări activate.",
"online-requirement-pairing": "Trebuie să fiți online pentru a asocia dispozitivele.",
"ios-memory-limit": "Trimiterea de fișiere pe iOS este posibilă doar până la 200 MB simultan",
"online-requirement-public-room": "Trebuie să fiți online pentru a crea o cameră publică.",
"copied-text-error": "Scrierea în clipboard a eșuat. Copiați manual!",
"download-successful": "{{descriptor}} descărcat",
"click-to-show": "Apasă pentru a arăta"
},
"header": {
"cancel-paste-mode": "Gata",
"theme-auto_title": "Adaptează Tema la Sistem",
"install_title": "Instalează PairDrop",
"theme-dark_title": "Utilizați mereu tema întunecoasă",
"pair-device_title": "Împerechează-ți permanent dispozitivele",
"join-public-room_title": "Alătură-te temporar camerei publice",
"notification_title": "Activați Notificări",
"edit-paired-devices_title": "Editați dispozitivele împerecheate",
"language-selector_title": "Selectează Limba",
"about_title": "Despre PairDrop",
"about_aria-label": "Deschide Despre PairDrop",
"theme-light_title": "Utilizați mereu tema luminoasă"
},
"instructions": {
"x-instructions_mobile": "Atingeți pentru a trimite fișiere sau atingeți lung pentru a trimite un mesaj",
"click-to-send": "Clic pentru a trimite",
"activate-paste-mode-and-other-files": "și {{count}} alte fișiere",
"tap-to-send": "Atinge pentru a trimite",
"activate-paste-mode-base": "Deschideți PairDrop pe alte dispozitive pentru a trimite",
"no-peers-subtitle": "Împerecheați dispozitive sau intrați într-o cameră publică pentru a fi descoperit în alte rețele",
"activate-paste-mode-shared-text": "text partajat",
"x-instructions_desktop": "Dați clic pentru a trimite fișiere sau dați clic dreapta pentru a trimite un mesaj",
"no-peers-title": "Deschideți PairDrop pe alte dispozitive pentru a trimite fișiere",
"x-instructions_data-drop-peer": "Eliberare pentru a trimite la peer",
"x-instructions_data-drop-bg": "Eliberați pentru a selecta recipientul",
"no-peers_data-drop-bg": "Eliberare pentru a selecta recipientul"
},
"peer-ui": {
"processing": "Procesarea…",
"click-to-send-paste-mode": "Apasă pentru a trimite {{descriptor}}",
"click-to-send": "Apasă pentru a trimite fișiere sau apasă cu butonul din dreapta pentru a trimite un mesaj",
"waiting": "Așteptând…",
"connection-hash": "Pentru a verifica securitatea criptării end-to-end, comparați acest număr de securitate pe ambele dispozitive",
"preparing": "Pregătirea…",
"transferring": "Transferul…"
},
"dialogs": {
"base64-paste-to-send": "Lipiți aici pentru a trimite {{type}}",
"auto-accept-instructions-2": "pentru a accepta automat toate fișierele trimise de la dispozitivul respectiv.",
"receive-text-title": "Mesaj primit",
"edit-paired-devices-title": "Editați dispozitivele asociate",
"cancel": "Anulează",
"auto-accept-instructions-1": "Activează",
"pair-devices-title": "Împerecherea permanentă a dispozitivelor",
"download": "Descarcă",
"title-file": "Fişier",
"base64-processing": "Procesarea…",
"decline": "Declin",
"receive-title": "{{descriptor}} Primit",
"leave": "Pleacă",
"join": "Alătură-te",
"title-image-plural": "Imagini",
"send": "Trimite",
"base64-tap-to-paste": "Atinge aici pentru a lipi {{type}}",
"base64-text": "text",
"copy": "Copiază",
"file-other-description-image": "și 1 altă imagine",
"temporary-public-room-title": "Cameră publică temporară",
"base64-files": "fişiere",
"has-sent": "a trimis:",
"file-other-description-file": "și 1 alt fișier",
"close": "Închide",
"system-language": "Limba Sistemului",
"unpair": "Decuplează",
"title-image": "Imagine",
"file-other-description-file-plural": "și {{count}} alte fișiere",
"would-like-to-share": "ar dori să împărtășească",
"send-message-to": "Trimite un mesaj la",
"language-selector-title": "Selectaţi Limba",
"pair": "Cuplu",
"hr-or": "SAU",
"scan-qr-code": "sau scanați codul QR.",
"input-key-on-this-device": "Introduceți această cheie pe un alt dispozitiv",
"download-again": "Descarcă din nou",
"accept": "Acceptă",
"paired-devices-wrapper_data-empty": "Nu sunt dispozitive asociate.",
"enter-key-from-another-device": "Introduceți aici cheia de la un alt dispozitiv.",
"share": "Partajați",
"auto-accept": "auto-acceptare",
"title-file-plural": "Fişiere",
"send-message-title": "Trimite un mesaj",
"input-room-id-on-another-device": "Introduceți acest ID de cameră pe un alt dispozitiv",
"file-other-description-image-plural": "și {{count}} alte imagini",
"enter-room-id-from-another-device": "Introdu ID-ul camerei de pe un alt dispozitiv pentru a intra în cameră."
},
"about": {
"claim": "Cel mai simplu mod de a transfera fișiere între dispozitive",
"tweet_title": "Tweet despre PairDrop",
"close-about_aria-label": "Închide Despre PairDrop",
"buy-me-a-coffee_title": "Cumpără-mi o cafea!",
"github_title": "PairDrop pe GitHub",
"faq_title": "Întrebări frecvente"
},
"document-titles": {
"file-transfer-requested": "Transfer de fișiere cerut",
"message-received-plural": "{{count}}} Mesaje primite",
"message-received": "Mesaj primit",
"file-received": "Fișier Primit",
"file-received-plural": "{{count}} Fișiere Primite"
}
}
+20 -16
View File
@@ -4,7 +4,7 @@
"pair-device_title": "Связать ваши устройства навсегда", "pair-device_title": "Связать ваши устройства навсегда",
"install_title": "Установить PairDrop", "install_title": "Установить PairDrop",
"cancel-paste-mode": "Выполнено", "cancel-paste-mode": "Выполнено",
"edit-paired-devices_title": "Редактировать сопряженные устройства", "edit-paired-devices_title": "Редактировать связанные устройства",
"notification_title": "Включить уведомления", "notification_title": "Включить уведомления",
"about_title": "О сервисе", "about_title": "О сервисе",
"theme-auto_title": "Адаптировать тему к системной", "theme-auto_title": "Адаптировать тему к системной",
@@ -22,7 +22,7 @@
"x-instructions_data-drop-peer": "Отпустите, чтобы послать узлу", "x-instructions_data-drop-peer": "Отпустите, чтобы послать узлу",
"x-instructions_mobile": "Прикоснитесь коротко, чтобы отправить файлы, или долго, чтобы отправить сообщение", "x-instructions_mobile": "Прикоснитесь коротко, чтобы отправить файлы, или долго, чтобы отправить сообщение",
"no-peers-title": "Откройте PairDrop на других устройствах, чтобы отправить файлы", "no-peers-title": "Откройте PairDrop на других устройствах, чтобы отправить файлы",
"no-peers-subtitle": "Сопрягите устройства или войдите в публичную комнату, чтобы вас могли обнаружить из других сетей", "no-peers-subtitle": "Свяжите устройства или войдите в публичную комнату, чтобы вас могли обнаружить из других сетей",
"activate-paste-mode-and-other-files": "и {{count}} других файлов", "activate-paste-mode-and-other-files": "и {{count}} других файлов",
"activate-paste-mode-base": "Откройте PairDrop на других устройствах, чтобы отправить", "activate-paste-mode-base": "Откройте PairDrop на других устройствах, чтобы отправить",
"activate-paste-mode-shared-text": "общий текст" "activate-paste-mode-shared-text": "общий текст"
@@ -32,25 +32,25 @@
"routed": "направляется через сервер", "routed": "направляется через сервер",
"webrtc": ", если WebRTC недоступен.", "webrtc": ", если WebRTC недоступен.",
"traffic": "Трафик", "traffic": "Трафик",
"paired-devices": "сопряженными устройствами", "paired-devices": "связанными устройствами",
"known-as": "Вы известны под именем:", "known-as": "Вы известны под именем:",
"on-this-network": "в этой сети", "on-this-network": "в этой сети",
"display-name_title": "Изменить имя вашего устройства навсегда", "display-name_title": "Изменить имя вашего устройства навсегда",
"public-room-devices_title": "Вы можете быть обнаружены устройствами в этой публичной комнате вне зависимости от сети.", "public-room-devices_title": "Вы можете быть обнаружены устройствами в этой публичной комнате вне зависимости от сети.",
"paired-devices_title": "Вы можете быть обнаружены сопряженными устройствами в любое время вне зависимости от сети.", "paired-devices_title": "Вы можете быть обнаружены связанными устройствами в любое время вне зависимости от сети.",
"public-room-devices": "в комнате {{roomId}}", "public-room-devices": "в комнате {{roomId}}",
"discovery": "Вы можете быть обнаружены:", "discovery": "Вы можете быть обнаружены:",
"on-this-network_title": "Вы можете быть обнаружены кем угодно в этой сети." "on-this-network_title": "Вы можете быть обнаружены кем угодно в этой сети."
}, },
"dialogs": { "dialogs": {
"edit-paired-devices-title": "Редактировать сопряженные устройства", "edit-paired-devices-title": "Редактировать связанные устройства",
"auto-accept": "автоприем", "auto-accept": "автоприем",
"close": "Закрыть", "close": "Закрыть",
"decline": "Отклонить", "decline": "Отклонить",
"share": "Поделиться", "share": "Поделиться",
"would-like-to-share": "хотел бы поделиться", "would-like-to-share": "хотел бы поделиться",
"has-sent": "отправил:", "has-sent": "отправил:",
"paired-devices-wrapper_data-empty": "Нет сопряженных устройств.", "paired-devices-wrapper_data-empty": "Нет связанных устройств.",
"download": "Скачать", "download": "Скачать",
"receive-text-title": "Сообщение получено", "receive-text-title": "Сообщение получено",
"send": "Отправить", "send": "Отправить",
@@ -69,8 +69,8 @@
"download-again": "Скачать еще раз", "download-again": "Скачать еще раз",
"auto-accept-instructions-2": ", чтобы автоматически принимать все файлы, отправленные с того устройства.", "auto-accept-instructions-2": ", чтобы автоматически принимать все файлы, отправленные с того устройства.",
"enter-key-from-another-device": "Введите сюда ключ с другого устройства.", "enter-key-from-another-device": "Введите сюда ключ с другого устройства.",
"pair-devices-title": "Сопрягите устройства навсегда", "pair-devices-title": "Соединить устройства навсегда",
"input-key-on-this-device": "Введите этот ключ на другом устройстве", "input-key-on-this-device": "На другом устройстве введите этот ключ",
"scan-qr-code": "или отсканируйте QR-код.", "scan-qr-code": "или отсканируйте QR-код.",
"cancel": "Отменить", "cancel": "Отменить",
"pair": "Подключить", "pair": "Подключить",
@@ -82,10 +82,14 @@
"file-other-description-file-plural": "и {{count}} других файлов", "file-other-description-file-plural": "и {{count}} других файлов",
"receive-title": "{{descriptor}} получен", "receive-title": "{{descriptor}} получен",
"system-language": "Язык системы", "system-language": "Язык системы",
"unpair": "Разорвать сопряжение", "unpair": "Отвязать",
"language-selector-title": "Выберите язык", "language-selector-title": "Выбрать язык",
"hr-or": "ИЛИ", "hr-or": "ИЛИ",
"input-room-id-on-another-device": "Введите этот ID комнаты на другом устройстве" "input-room-id-on-another-device": "На другом устройстве введите этот ID комнаты",
"leave": "Покинуть",
"join": "Войти",
"enter-room-id-from-another-device": "Введите ID комнаты с другого устройства, чтобы войти в нее.",
"temporary-public-room-title": "Временная публичная комната"
}, },
"about": { "about": {
"close-about-aria-label": "Закрыть страницу \"О сервисе\"", "close-about-aria-label": "Закрыть страницу \"О сервисе\"",
@@ -99,10 +103,10 @@
"notifications": { "notifications": {
"display-name-changed-permanently": "Отображаемое имя было изменено навсегда.", "display-name-changed-permanently": "Отображаемое имя было изменено навсегда.",
"display-name-random-again": "Отображаемое имя сгенерировалось случайным образом снова.", "display-name-random-again": "Отображаемое имя сгенерировалось случайным образом снова.",
"pairing-success": "Устройства сопряжены.", "pairing-success": "Устройства связаны.",
"pairing-tabs-error": "Сопряжение двух вкладок браузера невозможно.", "pairing-tabs-error": "Связка двух вкладок браузера невозможна.",
"copied-to-clipboard": "Скопировано в буфер обмена", "copied-to-clipboard": "Скопировано в буфер обмена",
"pairing-not-persistent": "Сопряженные устройства непостоянны.", "pairing-not-persistent": "Связанные устройства непостоянны.",
"link-received": "Получена ссылка от {{name}} - нажмите, чтобы открыть", "link-received": "Получена ссылка от {{name}} - нажмите, чтобы открыть",
"notifications-enabled": "Уведомления включены.", "notifications-enabled": "Уведомления включены.",
"text-content-incorrect": "Содержание текста неверно.", "text-content-incorrect": "Содержание текста неверно.",
@@ -120,7 +124,7 @@
"rate-limit-join-key": "Достигнут предел скорости. Подождите 10 секунд и повторите попытку.", "rate-limit-join-key": "Достигнут предел скорости. Подождите 10 секунд и повторите попытку.",
"unfinished-transfers-warning": "Есть незавершенные передачи. Вы уверены, что хотите закрыть PairDrop?", "unfinished-transfers-warning": "Есть незавершенные передачи. Вы уверены, что хотите закрыть PairDrop?",
"copied-text-error": "Запись в буфер обмена не удалась. Скопируйте вручную!", "copied-text-error": "Запись в буфер обмена не удалась. Скопируйте вручную!",
"pairing-cleared": "Все устройства не сопряжены.", "pairing-cleared": "Все устройства отвязаны.",
"pairing-key-invalid": "Неверный ключ", "pairing-key-invalid": "Неверный ключ",
"pairing-key-invalidated": "Ключ {{key}} признан недействительным.", "pairing-key-invalidated": "Ключ {{key}} признан недействительным.",
"click-to-download": "Нажмите, чтобы скачать", "click-to-download": "Нажмите, чтобы скачать",
@@ -134,7 +138,7 @@
"public-room-left": "Покинуть публичную комнату {{publicRoomId}}", "public-room-left": "Покинуть публичную комнату {{publicRoomId}}",
"copied-to-clipboard-error": "Копирование невозможно. Скопируйте вручную.", "copied-to-clipboard-error": "Копирование невозможно. Скопируйте вручную.",
"public-room-id-invalid": "Неверный ID комнаты", "public-room-id-invalid": "Неверный ID комнаты",
"online-requirement-pairing": "Для сопряжения устройств необходимо находиться быть онлайн.", "online-requirement-pairing": "Для связки устройств необходимо находиться быть онлайн.",
"online-requirement-public-room": "Для создания публичной комнаты необходимо быть онлайн." "online-requirement-public-room": "Для создания публичной комнаты необходимо быть онлайн."
}, },
"peer-ui": { "peer-ui": {
+10 -6
View File
@@ -4,7 +4,7 @@
"about_aria-label": "打开 关于 PairDrop", "about_aria-label": "打开 关于 PairDrop",
"theme-light_title": "总是使用明亮主题", "theme-light_title": "总是使用明亮主题",
"install_title": "安装 PairDrop", "install_title": "安装 PairDrop",
"pair-device_title": "久配对您的设备", "pair-device_title": "久配对您的设备",
"theme-auto_title": "主题适应系统", "theme-auto_title": "主题适应系统",
"theme-dark_title": "总是使用暗黑主题", "theme-dark_title": "总是使用暗黑主题",
"notification_title": "开启通知", "notification_title": "开启通知",
@@ -16,7 +16,7 @@
"instructions": { "instructions": {
"x-instructions_data-drop-peer": "释放以发送到此设备", "x-instructions_data-drop-peer": "释放以发送到此设备",
"no-peers_data-drop-bg": "释放来选择接收者", "no-peers_data-drop-bg": "释放来选择接收者",
"no-peers-subtitle": "配对新设备 或 加入一个公共房间 使在其他网络上可见", "no-peers-subtitle": "配对新设备 或 加入一个公共房间 以便在其他网络上可见",
"no-peers-title": "在其他设备上打开 PairDrop 来发送文件", "no-peers-title": "在其他设备上打开 PairDrop 来发送文件",
"x-instructions_desktop": "点击以发送文件 或 右键来发送信息", "x-instructions_desktop": "点击以发送文件 或 右键来发送信息",
"x-instructions_mobile": "轻触以发送文件 或 长按来发送信息", "x-instructions_mobile": "轻触以发送文件 或 长按来发送信息",
@@ -85,7 +85,11 @@
"unpair": "取消配对", "unpair": "取消配对",
"language-selector-title": "选择语言", "language-selector-title": "选择语言",
"hr-or": "或者", "hr-or": "或者",
"input-room-id-on-another-device": "在另一个设备上输入这串房间号" "input-room-id-on-another-device": "在另一个设备上输入这串房间号",
"leave": "离开",
"join": "加入",
"temporary-public-room-title": "临时公共房间",
"enter-room-id-from-another-device": "在另一个设备上输入这串房间号来加入房间。"
}, },
"about": { "about": {
"faq_title": "常见问题", "faq_title": "常见问题",
@@ -96,9 +100,9 @@
"tweet_title": "关于 PairDrop 的推特" "tweet_title": "关于 PairDrop 的推特"
}, },
"notifications": { "notifications": {
"display-name-changed-permanently": "展示的名字已经久变更。", "display-name-changed-permanently": "展示的名字已经久变更。",
"display-name-changed-temporarily": "展示的名字已经变更 仅在此会话中。", "display-name-changed-temporarily": "展示的名字仅在此会话中变更。",
"display-name-random-again": "展示的名字再次随机生成。", "display-name-random-again": "展示的名字再次随机生成。",
"download-successful": "{{descriptor}} 已下载", "download-successful": "{{descriptor}} 已下载",
"pairing-tabs-error": "无法配对两个浏览器标签页。", "pairing-tabs-error": "无法配对两个浏览器标签页。",
"pairing-success": "新设备已配对。", "pairing-success": "新设备已配对。",
@@ -1,7 +1,7 @@
class Localization { class Localization {
constructor() { constructor() {
Localization.defaultLocale = "en"; Localization.defaultLocale = "en";
Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de"]; Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de", "ro", "id", "fr"];
Localization.translations = {}; Localization.translations = {};
Localization.defaultTranslations = {}; Localization.defaultTranslations = {};
@@ -127,7 +127,8 @@ class Localization {
if (!useDefault) { if (!useDefault) {
translation = this.getTranslation(key, attr, data, true); translation = this.getTranslation(key, attr, data, true);
console.warn(`Missing translation entry for your language ${Localization.locale.toUpperCase()}. Using ${Localization.defaultLocale.toUpperCase()} instead.`, key, attr); console.warn(`Missing translation entry for your language ${Localization.locale.toUpperCase()}. Using ${Localization.defaultLocale.toUpperCase()} instead.`, key, attr);
console.warn("Help translating PairDrop: https://hosted.weblate.org/projects/pairdrop/pairdrop-spa/"); console.warn(`Translate this string here: https://hosted.weblate.org/browse/pairdrop/pairdrop-spa/${Localization.locale.toLowerCase()}/?q=${key}`)
console.log("Help translating PairDrop: https://hosted.weblate.org/engage/pairdrop/");
} else { } else {
console.warn("Missing translation in default language:", key, attr); console.warn("Missing translation in default language:", key, attr);
} }
@@ -231,7 +231,9 @@ class ServerConnection {
_onDisconnect() { _onDisconnect() {
console.log('WS: server disconnected'); console.log('WS: server disconnected');
Events.fire('notify-user', Localization.getTranslation("notifications.connecting")); setTimeout(() => {
Events.fire('notify-user', Localization.getTranslation("notifications.connecting"));
}, 100); //delay for 100ms to prevent flickering on page reload
clearTimeout(this._reconnectTimer); clearTimeout(this._reconnectTimer);
this._reconnectTimer = setTimeout(_ => this._connect(), 1000); this._reconnectTimer = setTimeout(_ => this._connect(), 1000);
Events.fire('ws-disconnected'); Events.fire('ws-disconnected');
+27 -7
View File
@@ -36,9 +36,24 @@ class PeersUI {
Events.on('drop', e => this._onDrop(e)); Events.on('drop', e => this._onDrop(e));
Events.on('keydown', e => this._onKeyDown(e)); Events.on('keydown', e => this._onKeyDown(e));
this.$header = document.querySelector('body > header')
this.$xPeers = $$('x-peers'); this.$xPeers = $$('x-peers');
this.$xNoPeers = $$('x-no-peers'); this.$xNoPeers = $$('x-no-peers');
this.$xInstructions = $$('x-instructions'); this.$xInstructions = $$('x-instructions');
this.$center = $$('#center');
this.$logo = $$('footer .icon.logo');
this.$discoveryWrapper = $$('footer .discovery-wrapper');
this.$knownAsWrapper = $$('footer .known-as-wrapper');
this.$header.style.opacity = "1";
this.$xPeers.style.opacity = "1";
this.$xNoPeers.style.opacity = "1";
this.$xInstructions.style.opacity = "0.5";
this.$center.style.opacity = "1";
this.$logo.style.opacity = "1";
this.$discoveryWrapper.style.opacity = "1";
this.$knownAsWrapper.style.opacity = "1";
Events.on('peer-added', _ => this.evaluateOverflowing()); Events.on('peer-added', _ => this.evaluateOverflowing());
Events.on('bg-resize', _ => this.evaluateOverflowing()); Events.on('bg-resize', _ => this.evaluateOverflowing());
@@ -1006,9 +1021,13 @@ class ReceiveRequestDialog extends ReceiveDialog {
this.$previewBox.appendChild(element) this.$previewBox.appendChild(element)
} }
this.$receiveTitle.innerText = `${request.imagesOnly ? 'Image' : 'File'} Transfer Request` const transferRequestTitle= request.imagesOnly
? Localization.getTranslation('document-titles.image-transfer-requested')
: Localization.getTranslation('document-titles.file-transfer-requested');
document.title = `${ Localization.getTranslation("document-titles.file-transfer-requested") } - PairDrop`; this.$receiveTitle.innerText = transferRequestTitle;
document.title = `${transferRequestTitle} - PairDrop`;
document.changeFavicon("images/favicon-96x96-notification.png"); document.changeFavicon("images/favicon-96x96-notification.png");
this.show(); this.show();
} }
@@ -1707,7 +1726,7 @@ class SendTextDialog extends Dialog {
constructor() { constructor() {
super('send-text-dialog'); super('send-text-dialog');
Events.on('text-recipient', e => this._onRecipient(e.detail.peerId, e.detail.deviceName)); Events.on('text-recipient', e => this._onRecipient(e.detail.peerId, e.detail.deviceName));
this.$text = this.$el.querySelector('#text-input'); this.$text = this.$el.querySelector('.textarea');
this.$peerDisplayName = this.$el.querySelector('.display-name'); this.$peerDisplayName = this.$el.querySelector('.display-name');
this.$form = this.$el.querySelector('form'); this.$form = this.$el.querySelector('form');
this.$submit = this.$el.querySelector('button[type="submit"]'); this.$submit = this.$el.querySelector('button[type="submit"]');
@@ -1728,7 +1747,7 @@ class SendTextDialog extends Dialog {
} }
_textInputEmpty() { _textInputEmpty() {
return !this.$text.innerText || this.$text.innerText === "\n"; return !this.$text.value || this.$text.value === "\n";
} }
_onChange(e) { _onChange(e) {
@@ -1750,7 +1769,6 @@ class SendTextDialog extends Dialog {
const range = document.createRange(); const range = document.createRange();
const sel = window.getSelection(); const sel = window.getSelection();
this.$text.focus();
range.selectNodeContents(this.$text); range.selectNodeContents(this.$text);
sel.removeAllRanges(); sel.removeAllRanges();
sel.addRange(range); sel.addRange(range);
@@ -1764,7 +1782,7 @@ class SendTextDialog extends Dialog {
_send() { _send() {
Events.fire('send-text', { Events.fire('send-text', {
to: this.correspondingPeerId, to: this.correspondingPeerId,
text: this.$text.innerText text: this.$text.value
}); });
this.$text.value = ""; this.$text.value = "";
this.hide(); this.hide();
@@ -2046,6 +2064,7 @@ class Notifications {
this.$button.removeAttribute('hidden'); this.$button.removeAttribute('hidden');
this.$button.addEventListener('click', _ => this._requestPermission()); this.$button.addEventListener('click', _ => this._requestPermission());
} }
Events.on('text-received', e => this._messageNotification(e.detail.text, e.detail.peerId)); Events.on('text-received', e => this._messageNotification(e.detail.text, e.detail.peerId));
Events.on('files-received', e => this._downloadNotification(e.detail.files)); Events.on('files-received', e => this._downloadNotification(e.detail.files));
Events.on('files-transfer-request', e => this._requestNotification(e.detail.request, e.detail.peerId)); Events.on('files-transfer-request', e => this._requestNotification(e.detail.request, e.detail.peerId));
@@ -2730,6 +2749,7 @@ Events.on('load', () => {
dw = Math.round(Math.max(w, h, 1000) / 13); dw = Math.round(Math.max(w, h, 1000) / 13);
drawCircles(cCtx, dw); drawCircles(cCtx, dw);
c.style.opacity = "1";
} }
Events.on('bg-resize', _ => init()); Events.on('bg-resize', _ => init());
@@ -2751,7 +2771,7 @@ Events.on('load', () => {
} }
} }
init(); setTimeout(_ => init(), 300);
}); });
document.changeFavicon = function (src) { document.changeFavicon = function (src) {
@@ -1,4 +1,4 @@
const cacheVersion = 'v1.8.0'; const cacheVersion = 'v1.8.3';
const cacheTitle = `pairdrop-included-ws-fallback-cache-${cacheVersion}`; const cacheTitle = `pairdrop-included-ws-fallback-cache-${cacheVersion}`;
const urlsToCache = [ const urlsToCache = [
'index.html', 'index.html',
+34 -13
View File
@@ -420,8 +420,9 @@ x-no-peers {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 8px; padding: 8px;
height: 137px;
text-align: center; text-align: center;
animation: fade-in 300ms; animation: fade-in 600ms;
animation-fill-mode: backwards; animation-fill-mode: backwards;
/* prevent flickering on load */ /* prevent flickering on load */
animation-iteration-count: 0; animation-iteration-count: 0;
@@ -642,6 +643,7 @@ footer .logo {
margin-bottom: 8px; margin-bottom: 8px;
color: var(--primary-color); color: var(--primary-color);
margin-top: -10px; margin-top: -10px;
animation: ease-in;
} }
.discovery-wrapper { .discovery-wrapper {
@@ -652,6 +654,7 @@ footer .logo {
padding: 2px; padding: 2px;
background-color: rgb(var(--bg-color)); background-color: rgb(var(--bg-color));
transition: background-color 0.5s ease; transition: background-color 0.5s ease;
min-height: 24px;
} }
/*You can be discovered wrapper*/ /*You can be discovered wrapper*/
@@ -800,12 +803,13 @@ x-dialog a {
color: var(--primary-color); color: var(--primary-color);
} }
/* Pair Devices Dialog */ /* Pair Devices Dialog & Public Room Dialog */
.input-key-container { .input-key-container {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: center; justify-content: center;
margin-top: 10px;
} }
.input-key-container > input { .input-key-container > input {
@@ -866,7 +870,7 @@ x-dialog hr {
.hr-note { .hr-note {
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 20px;
} }
.hr-note hr { .hr-note hr {
@@ -1037,7 +1041,7 @@ x-dialog .dialog-subheader {
padding-bottom: 0; padding-bottom: 0;
} }
#text-input { #send-text-dialog .textarea {
min-height: 200px; min-height: 200px;
width: 100%; width: 100%;
} }
@@ -1229,15 +1233,22 @@ button::-moz-focus-inner {
z-index: 1; z-index: 1;
} }
#about:not(:target) header.fade-in {
transition-delay: 400ms;
}
#about:target header.fade-in {
transition-delay: 100ms;
}
#about .fade-in { #about .fade-in {
transition: opacity 300ms; transition: opacity 300ms ease 300ms;
will-change: opacity; will-change: opacity;
transition-delay: 300ms;
pointer-events: all; pointer-events: all;
} }
#about:not(:target) .fade-in { #about:not(:target) .fade-in {
opacity: 0; opacity: 0 !important;
pointer-events: none; pointer-events: none;
transition-delay: 0s; transition-delay: 0s;
} }
@@ -1287,10 +1298,6 @@ button::-moz-focus-inner {
flex-grow: 1; flex-grow: 1;
} }
#about header {
align-self: end;
}
canvas.circles { canvas.circles {
width: 100vw; width: 100vw;
position: absolute; position: absolute;
@@ -1374,7 +1381,6 @@ x-toast:not([show]):not(:hover) {
x-instructions { x-instructions {
position: relative; position: relative;
opacity: 0.5; opacity: 0.5;
transition: opacity 300ms;
text-align: center; text-align: center;
margin-left: 10px; margin-left: 10px;
margin-right: 10px; margin-right: 10px;
@@ -1401,7 +1407,7 @@ x-instructions p {
} }
x-peers:empty~x-instructions { x-peers:empty~x-instructions {
opacity: 0; opacity: 0 !important;
} }
@media (hover: none) and (pointer: coarse) { @media (hover: none) and (pointer: coarse) {
@@ -1411,6 +1417,21 @@ x-peers:empty~x-instructions {
} }
} }
/* Prevent Cumulative Layout Shift */
body > header,
canvas,
#center,
x-no-peers,
x-peers,
x-instructions,
footer > .icon.logo,
.discovery-wrapper,
.known-as-wrapper {
transition: opacity 0.5s ease 0.1s;
opacity: 0; /* will be set to 1 after initial translation is loaded */
}
/* Responsive Styles */ /* Responsive Styles */
@media screen and (min-height: 800px) { @media screen and (min-height: 800px) {