mirror of
https://github.com/schlagmichdoch/PairDrop.git
synced 2026-04-06 18:03:48 +00:00
Compare commits
56 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8eb6e5bfab | ||
|
|
bb1468fa42 | ||
|
|
a32b310bf0 | ||
|
|
ed2f1b0c61 | ||
|
|
2578803a78 | ||
|
|
e367ca9f78 | ||
|
|
684fe7142d | ||
|
|
4e00e5b358 | ||
|
|
ca8a5de47e | ||
|
|
ceec9c5f49 | ||
|
|
81d85d0cc6 | ||
|
|
cd669b13d9 | ||
|
|
38a80d2d34 | ||
|
|
d46f57d8ec | ||
|
|
f75e6e85b2 | ||
|
|
7a299a5c98 | ||
|
|
4854c816a4 | ||
|
|
117a4d3eb9 | ||
|
|
8d0e560b1d | ||
|
|
671081b86d | ||
|
|
c677ac7ebe | ||
|
|
4722432209 | ||
|
|
3366fde1fe | ||
|
|
72071c3780 | ||
|
|
b0265efa03 | ||
|
|
97100ac051 | ||
|
|
1cce04664e | ||
|
|
aadda018a1 | ||
|
|
32aa74c1c8 | ||
|
|
414048e8a1 | ||
|
|
9d173d7a2c | ||
|
|
9c2a076f2b | ||
|
|
67f6580d70 | ||
|
|
52e6ae9134 | ||
|
|
e9664bed76 | ||
|
|
5b408bc6a0 | ||
|
|
b9476975dc | ||
|
|
efd0b6f34f | ||
|
|
866a1c4100 | ||
|
|
a4b905ba14 | ||
|
|
55258d0f93 | ||
|
|
784c1e88db | ||
|
|
69d28ef158 | ||
|
|
22cf10da0a | ||
|
|
31f1abe8a0 | ||
|
|
5e91bd84dc | ||
|
|
aec3d358d5 | ||
|
|
dc07b04b45 | ||
|
|
08e3055917 | ||
|
|
88d6efc5da | ||
|
|
bfa4662079 | ||
|
|
b1252bd184 | ||
|
|
bd5a2cd862 | ||
|
|
86b08cd93f | ||
|
|
1fc303dad2 | ||
|
|
a2f2774ca0 |
4
.github/ISSUE_TEMPLATE/bug-report.md
vendored
4
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -36,7 +36,7 @@ If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Bug occurs on official PairDrop instance https://pairdrop.net/**
|
||||
No | Yes
|
||||
Version: v1.8.3
|
||||
Version: v1.9.0
|
||||
|
||||
**Bug occurs on self-hosted PairDrop instance**
|
||||
No | Yes
|
||||
@@ -44,7 +44,7 @@ No | Yes
|
||||
**Self-Hosted Setup**
|
||||
Proxy: Nginx | Apache2
|
||||
Deployment: docker run | docker-compose | npm run start:prod
|
||||
Version: v1.8.3
|
||||
Version: v1.9.0
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
18
package-lock.json
generated
18
package-lock.json
generated
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"name": "pairdrop",
|
||||
"version": "1.8.3",
|
||||
"version": "1.9.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "pairdrop",
|
||||
"version": "1.8.3",
|
||||
"version": "1.9.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express": "^4.18.2",
|
||||
"express-rate-limit": "^7.1.0",
|
||||
"express-rate-limit": "^7.1.1",
|
||||
"ua-parser-js": "^1.0.36",
|
||||
"unique-names-generator": "^4.3.0",
|
||||
"ws": "^8.14.2"
|
||||
@@ -204,9 +204,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/express-rate-limit": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.0.tgz",
|
||||
"integrity": "sha512-pwKOMedrpJJeINON/9jhAa18udV2qwxPZSoklPZK8pmXxUyE5uXaptiwjGw8bZILbxqfUZ/p8pQA99ODjSgA5Q==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.1.tgz",
|
||||
"integrity": "sha512-o5ye/a4EHCPQPju25Y4HChHybrCM9v37QtQDqXUDZGuD+HB7Cbu8ZhJP6/9RORcSNtkCpnEssa6oUgJgzc7ckQ==",
|
||||
"engines": {
|
||||
"node": ">= 16"
|
||||
},
|
||||
@@ -805,9 +805,9 @@
|
||||
}
|
||||
},
|
||||
"express-rate-limit": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.0.tgz",
|
||||
"integrity": "sha512-pwKOMedrpJJeINON/9jhAa18udV2qwxPZSoklPZK8pmXxUyE5uXaptiwjGw8bZILbxqfUZ/p8pQA99ODjSgA5Q==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.1.tgz",
|
||||
"integrity": "sha512-o5ye/a4EHCPQPju25Y4HChHybrCM9v37QtQDqXUDZGuD+HB7Cbu8ZhJP6/9RORcSNtkCpnEssa6oUgJgzc7ckQ==",
|
||||
"requires": {}
|
||||
},
|
||||
"finalhandler": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "pairdrop",
|
||||
"version": "1.8.3",
|
||||
"version": "1.9.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
@@ -11,7 +11,7 @@
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express": "^4.18.2",
|
||||
"express-rate-limit": "^7.1.0",
|
||||
"express-rate-limit": "^7.1.1",
|
||||
"ua-parser-js": "^1.0.36",
|
||||
"unique-names-generator": "^4.3.0",
|
||||
"ws": "^8.14.2"
|
||||
|
||||
@@ -33,107 +33,102 @@
|
||||
<meta name="twitter:image" content="images/logo_transparent_512x512.png">
|
||||
<meta property="og:image" content="images/logo_transparent_512x512.png">
|
||||
<!-- Resources -->
|
||||
<link rel="preload" href="lang/en.json" as="fetch">
|
||||
<link rel="stylesheet" type="text/css" href="styles.css">
|
||||
<link rel="manifest" href="manifest.json">
|
||||
</head>
|
||||
|
||||
<body translate="no">
|
||||
<header class="row-reverse">
|
||||
<a href="#about" class="icon-button" data-i18n-key="header.about" data-i18n-attrs="title aria-label" title="About PairDrop" aria-label="Open About PairDrop">
|
||||
<header class="row-reverse opacity-0">
|
||||
<a href="#about" class="icon-button" data-i18n-key="header.about" data-i18n-attrs="title aria-label">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#info-outline" />
|
||||
<use xlink:href="#info-outline"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<div id="language-selector" class="icon-button" data-i18n-key="header.language-selector" data-i18n-attrs="title" title="Select Language">
|
||||
<div id="language-selector" class="icon-button" data-i18n-key="header.language-selector" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#icon-language-selector" />
|
||||
<use xlink:href="#icon-language-selector"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="theme-wrapper">
|
||||
<div id="theme-auto" class="icon-button selected" data-i18n-key="header.theme-auto" data-i18n-attrs="title" title="Adapt Theme to System" >
|
||||
<div id="theme-auto" class="icon-button selected" data-i18n-key="header.theme-auto" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#icon-theme-auto" />
|
||||
<use xlink:href="#icon-theme-auto"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<div id="theme-light" class="icon-button" data-i18n-key="header.theme-light" data-i18n-attrs="title" title="Always Use Light-Theme" >
|
||||
<div id="theme-light" class="icon-button" data-i18n-key="header.theme-light" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#icon-theme-light" />
|
||||
<use xlink:href="#icon-theme-light"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="theme-dark" class="icon-button" data-i18n-key="header.theme-dark" data-i18n-attrs="title" title="Always Use Dark-Theme" >
|
||||
<div id="theme-dark" class="icon-button" data-i18n-key="header.theme-dark" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#icon-theme-dark" />
|
||||
<use xlink:href="#icon-theme-dark"></use>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="notification" class="icon-button" data-i18n-key="header.notification" data-i18n-attrs="title" title="Enable Notifications" hidden>
|
||||
<div id="notification" class="icon-button" data-i18n-key="header.notification" data-i18n-attrs="title" hidden>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#notifications" />
|
||||
<use xlink:href="#notifications"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="install" class="icon-button" data-i18n-key="header.install" data-i18n-attrs="title" title="Install PairDrop" hidden>
|
||||
<div id="install" class="icon-button" data-i18n-key="header.install" data-i18n-attrs="title" hidden>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#homescreen" />
|
||||
<use xlink:href="#homescreen"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="pair-device" class="icon-button" data-i18n-key="header.pair-device" data-i18n-attrs="title" title="Pair Your Devices Permanently">
|
||||
<div id="pair-device" class="icon-button" data-i18n-key="header.pair-device" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#pair-device-icon" />
|
||||
<use xlink:href="#pair-device-icon"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="edit-paired-devices" class="icon-button" data-i18n-key="header.edit-paired-devices" data-i18n-attrs="title" title="Edit Paired Devices" hidden>
|
||||
<div id="edit-paired-devices" class="icon-button" data-i18n-key="header.edit-paired-devices" data-i18n-attrs="title" hidden>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#edit-pair-devices-icon" />
|
||||
<use xlink:href="#edit-pair-devices-icon"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="join-public-room" class="icon-button" data-i18n-key="header.join-public-room" data-i18n-attrs="title" title="Join Public Room Temporarily">
|
||||
<div id="join-public-room" class="icon-button" data-i18n-key="header.join-public-room" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#public-room-icon" />
|
||||
<use xlink:href="#public-room-icon"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="cancel-paste-mode" class="button" data-i18n-key="header.cancel-paste-mode" data-i18n-attrs="text" hidden>Done</div>
|
||||
<div id="cancel-paste-mode" class="button" data-i18n-key="header.cancel-paste-mode" data-i18n-attrs="text" hidden></div>
|
||||
</header>
|
||||
<!-- Center -->
|
||||
<div id="center">
|
||||
<div id="center" class="opacity-0">
|
||||
<!-- Peers -->
|
||||
<div class="x-peers-filler"></div>
|
||||
<x-peers class="center"></x-peers>
|
||||
<x-no-peers data-i18n-key="instructions.no-peers" data-i18n-attrs="data-drop-bg" data-drop-bg="Release to select recipient">
|
||||
<h2 data-i18n-key="instructions.no-peers-title" data-i18n-attrs="text">Open PairDrop on other devices to send files</h2>
|
||||
<div data-i18n-key="instructions.no-peers-subtitle" data-i18n-attrs="text">Pair devices or enter a public room to be discoverable on other networks</div>
|
||||
<x-no-peers class="no-animation-on-load" data-i18n-key="instructions.no-peers" data-i18n-attrs="data-drop-bg">
|
||||
<h2 data-i18n-key="instructions.no-peers-title" data-i18n-attrs="text"></h2>
|
||||
<div data-i18n-key="instructions.no-peers-subtitle" data-i18n-attrs="text"></div>
|
||||
</x-no-peers>
|
||||
<x-instructions data-i18n-key="instructions.x-instructions" data-i18n-attrs="desktop mobile data-drop-peer data-drop-bg"
|
||||
desktop="Click to send files or right click to send a message"
|
||||
mobile="Tap to send files or long tap to send a message"
|
||||
data-drop-peer="Release to send to peer"
|
||||
data-drop-bg="Release to select recipient">
|
||||
<x-instructions data-i18n-key="instructions.x-instructions" data-i18n-attrs="desktop mobile data-drop-peer data-drop-bg">
|
||||
<p id="paste-filename"></p>
|
||||
</x-instructions>
|
||||
</div>
|
||||
<!-- Footer -->
|
||||
<footer class="column">
|
||||
<footer class="column opacity-0">
|
||||
<svg class="icon logo">
|
||||
<use xlink:href="#wifi-tethering" />
|
||||
<use xlink:href="#wifi-tethering"></use>
|
||||
</svg>
|
||||
<div class="column">
|
||||
<div class="known-as-wrapper">
|
||||
<span data-i18n-key="footer.known-as" data-i18n-attrs="text">You are known as:</span>
|
||||
<div id="display-name" class="badge" data-i18n-key="footer.display-name" data-i18n-attrs="data-placeholder title"
|
||||
placeholder="Loading..." data-placeholder="Loading..." title="Edit your device name permanently"
|
||||
autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable></div>
|
||||
<span data-i18n-key="footer.known-as" data-i18n-attrs="text"></span>
|
||||
<div id="display-name" class="badge" data-i18n-key="footer.display-name" data-i18n-attrs="data-placeholder title" placeholder="Loading..." autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable></div>
|
||||
<svg id="edit-pen" class="icon">
|
||||
<use xlink:href="#edit-pen-icon" />
|
||||
<use xlink:href="#edit-pen-icon"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="discovery-wrapper row">
|
||||
<div class="row center">
|
||||
<span data-i18n-key="footer.discovery" data-i18n-attrs="text">You can be discovered:</span>
|
||||
<span data-i18n-key="footer.discovery" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<span class="badge badge-room-ip" data-i18n-key="footer.on-this-network" data-i18n-attrs="text title">on this network</span>
|
||||
<span class="badge badge-room-secret pointer" data-i18n-key="footer.paired-devices" data-i18n-attrs="text title" hidden>paired devices</span>
|
||||
<span class="badge badge-room-ip" data-i18n-key="footer.on-this-network" data-i18n-attrs="text title"></span>
|
||||
<span class="badge badge-room-secret pointer" data-i18n-key="footer.paired-devices" data-i18n-attrs="text title" hidden></span>
|
||||
<span class="badge badge-room-public-id pointer" data-i18n-key="footer.public-room-devices" data-i18n-attrs="title" hidden>in room IAIAI</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -144,21 +139,76 @@
|
||||
<x-background class="full center">
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<h2 class="center" data-i18n-key="dialogs.language-selector-title" data-i18n-attrs="text">Select Language</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.language-selector-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
<div class="language-buttons">
|
||||
<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="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="ro">Română (Romanian)</button>
|
||||
<button class="button fw" value="ru">Русский язык (Russian)</button>
|
||||
<button class="button fw" value="zh-CN">中文 (Chinese)</button>
|
||||
<button class="button fw" data-i18n-key="dialogs.system-language" data-i18n-attrs="text"></button>
|
||||
<button class="button fw" value="ar">
|
||||
<span>العربية</span>
|
||||
<span>-</span>
|
||||
<span>(Arabic)</span>
|
||||
</button>
|
||||
<button class="button fw" value="de">
|
||||
<span>Deutsch</span>
|
||||
<span>-</span>
|
||||
<span>(German)</span>
|
||||
</button>
|
||||
<button class="button fw" value="en">
|
||||
<span>English</span>
|
||||
</button>
|
||||
<button class="button fw" value="fr">
|
||||
<span>Français</span>
|
||||
<span>-</span>
|
||||
<span>(French)</span>
|
||||
</button>
|
||||
<button class="button fw" value="id">
|
||||
<span>Bahasa Indonesia</span>
|
||||
<span>-</span>
|
||||
<span>(Indonesian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="it">
|
||||
<span>Italiano</span>
|
||||
<span>-</span>
|
||||
<span>(Italian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="nl">
|
||||
<span>Nederlands</span>
|
||||
<span>-</span>
|
||||
<span>(Dutch)</span>
|
||||
</button>
|
||||
<button class="button fw" value="nb">
|
||||
<span>Norsk</span>
|
||||
<span>-</span>
|
||||
<span>(Norwegian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="ro">
|
||||
<span>Română</span>
|
||||
<span>-</span>
|
||||
<span>(Romanian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="ru">
|
||||
<span>Русский язык</span>
|
||||
<span>-</span>
|
||||
<span>(Russian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="es">
|
||||
<span>Español</span>
|
||||
<span>-</span>
|
||||
<span>(Spanish)</span>
|
||||
</button>
|
||||
<button class="button fw" value="zh-CN">
|
||||
<span>中文</span>
|
||||
<span>-</span>
|
||||
<span>(Chinese)</span>
|
||||
</button>
|
||||
<button class="button fw" value="ja">
|
||||
<span>日本語</span>
|
||||
<span>-</span>
|
||||
<span>(Japanese)</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="center row-reverse button-row">
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -169,40 +219,40 @@
|
||||
<x-background class="full center text-center">
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<h2 class="center" data-i18n-key="dialogs.pair-devices-title" data-i18n-attrs="text">Pair Devices</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.pair-devices-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<div class="center key-qr-code"></div>
|
||||
<h1 class="center key">000 000</h1>
|
||||
<div class="center key-qr-code" data-i18n-key="dialogs.pair-devices-qr-code" data-i18n-attrs="title"></div>
|
||||
<h1 class="center key" dir="ltr">000 000</h1>
|
||||
<p class="center text-center key-instructions">
|
||||
<span class="font-subheading" data-i18n-key="dialogs.input-key-on-this-device" data-i18n-attrs="text">Input this key 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.input-key-on-this-device" data-i18n-attrs="text"></span>
|
||||
<span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text"></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-note">
|
||||
<hr>
|
||||
<div>
|
||||
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text">OR</span>
|
||||
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<div class="input-key-container six-chars">
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-3" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-6" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<div class="input-key-container six-chars" dir="ltr">
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-3" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-6" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
</div>
|
||||
<p class="font-subheading center text-center" data-i18n-key="dialogs.enter-key-from-another-device" data-i18n-attrs="text">Enter key from another device here.</p>
|
||||
<p class="font-subheading center text-center" data-i18n-key="dialogs.enter-key-from-another-device" data-i18n-attrs="text"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-row row-reverse">
|
||||
<button class="button" type="submit" data-i18n-key="dialogs.pair" data-i18n-attrs="text" disabled>Pair</button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close>Cancel</button>
|
||||
<button class="button" type="submit" data-i18n-key="dialogs.pair" data-i18n-attrs="text" disabled></button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -214,22 +264,18 @@
|
||||
<x-background class="full center text-center">
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<h2 class="center" data-i18n-key="dialogs.edit-paired-devices-title" data-i18n-attrs="text">Edit Paired Devices</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.edit-paired-devices-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
<div class="paired-devices-wrapper" data-i18n-key="dialogs.paired-devices-wrapper" data-i18n-attrs="data-empty" data-empty="No paired devices."></div>
|
||||
<div class="paired-devices-wrapper" data-i18n-key="dialogs.paired-devices-wrapper" data-i18n-attrs="data-empty"></div>
|
||||
<div class="font-subheading center">
|
||||
<p>
|
||||
<span data-i18n-key="dialogs.auto-accept-instructions-1" data-i18n-attrs="text">
|
||||
Activate
|
||||
</span>
|
||||
<u data-i18n-key="dialogs.auto-accept" data-i18n-attrs="text">auto-accept</u>
|
||||
<span data-i18n-key="dialogs.auto-accept-instructions-2" data-i18n-attrs="text">
|
||||
to automatically accept all files sent from that device.
|
||||
</span>
|
||||
<span data-i18n-key="dialogs.auto-accept-instructions-1" data-i18n-attrs="text"></span>
|
||||
<u data-i18n-key="dialogs.auto-accept" data-i18n-attrs="text"></u>
|
||||
<span data-i18n-key="dialogs.auto-accept-instructions-2" data-i18n-attrs="text"></span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="center row-reverse button-row">
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -242,41 +288,41 @@
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<h2 class="center" data-i18n-key="dialogs.temporary-public-room-title" data-i18n-attrs="text">Temporary Public Room</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.temporary-public-room-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<div class="center key-qr-code"></div>
|
||||
<h1 class="center key"></h1>
|
||||
<div class="center key-qr-code" data-i18n-key="dialogs.public-room-qr-code" data-i18n-attrs="title"></div>
|
||||
<h1 class="center key" dir="ltr"></h1>
|
||||
<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.scan-qr-code" data-i18n-attrs="text">or scan the QR-Code.</span>
|
||||
<span class="font-subheading" data-i18n-key="dialogs.input-room-id-on-another-device" data-i18n-attrs="text"></span>
|
||||
<span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text"></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-note">
|
||||
<hr>
|
||||
<div>
|
||||
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text">OR</span>
|
||||
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<div class="input-key-container">
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-3" 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>
|
||||
<div class="input-key-container" dir="ltr">
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder disabled>
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-3" 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>
|
||||
</div>
|
||||
<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>
|
||||
<p class="font-subheading center text-center" data-i18n-key="dialogs.enter-room-id-from-another-device" data-i18n-attrs="text"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center row-reverse button-row">
|
||||
<button class="button" type="submit" data-i18n-key="dialogs.join" data-i18n-attrs="text" disabled>Join</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" data-i18n-key="dialogs.leave" data-i18n-attrs="text">Leave</button>
|
||||
<button class="button" type="submit" data-i18n-key="dialogs.join" data-i18n-attrs="text" disabled></button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
<button class="button leave-room" type="button" data-i18n-key="dialogs.leave" data-i18n-attrs="text"></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -295,9 +341,9 @@
|
||||
<div class="column center file-description">
|
||||
<div>
|
||||
<span class="display-name badge"></span>
|
||||
<span data-i18n-key="dialogs.would-like-to-share" data-i18n-attrs="text">would like to share</span>
|
||||
<span data-i18n-key="dialogs.would-like-to-share" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
<div class="row file-name" >
|
||||
<div class="row file-name">
|
||||
<span class="file-stem"></span>
|
||||
<span class="file-extension"></span>
|
||||
</div>
|
||||
@@ -308,8 +354,8 @@
|
||||
</div>
|
||||
<div class="center file-preview"></div>
|
||||
<div class="row-reverse center button-row">
|
||||
<button id="accept-request" class="button" title="ENTER" data-i18n-key="dialogs.accept" data-i18n-attrs="text" autofocus>Accept</button>
|
||||
<button id="decline-request" class="button" title="ESCAPE" data-i18n-key="dialogs.decline" data-i18n-attrs="text">Decline</button>
|
||||
<button id="accept-request" class="button" title="ENTER" data-i18n-key="dialogs.accept" data-i18n-attrs="text" autofocus></button>
|
||||
<button id="decline-request" class="button" title="ESCAPE" data-i18n-key="dialogs.decline" data-i18n-attrs="text"></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -327,9 +373,9 @@
|
||||
<div class="column center file-description">
|
||||
<div>
|
||||
<span class="display-name badge"></span>
|
||||
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text">has sent</span>
|
||||
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
<div class="row file-name" >
|
||||
<div class="row file-name">
|
||||
<span class="file-stem"></span>
|
||||
<span class="file-extension"></span>
|
||||
</div>
|
||||
@@ -340,9 +386,9 @@
|
||||
</div>
|
||||
<div class="center file-preview"></div>
|
||||
<div class="row-reverse center button-row">
|
||||
<button id="share-btn" class="button" data-i18n-key="dialogs.share" data-i18n-attrs="text" hidden>Share</button>
|
||||
<button id="download-btn" class="button" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus>Download</button>
|
||||
<button class="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
|
||||
<button id="share-btn" class="button" data-i18n-key="dialogs.share" data-i18n-attrs="text" hidden></button>
|
||||
<button id="download-btn" class="button" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus></button>
|
||||
<button class="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -354,25 +400,25 @@
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<h2 class="center" data-i18n-key="dialogs.send-message-title" data-i18n-attrs="text">Send Message</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.send-message-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center display-name-wrapper">
|
||||
<div class="column">
|
||||
<div class="text-center">
|
||||
<span data-i18n-key="dialogs.send-message-to" data-i18n-attrs="text">Send a Message to</span>
|
||||
<span data-i18n-key="dialogs.send-message-to" data-i18n-attrs="text"></span>
|
||||
<span class="display-name badge"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="column fw">
|
||||
<textarea title="Message" class="textarea" wrap="off" autofocus></textarea>
|
||||
<div id="text-input" class="textarea" role="textbox" data-i18n-key="dialogs.message" data-i18n-attrs="title" autocapitalize="none" spellcheck="false" autofocus contenteditable></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-row row-reverse">
|
||||
<button class="button" type="submit" title="CTRL/⌘ + ENTER" data-i18n-key="dialogs.send" data-i18n-attrs="text" disabled>Send</button>
|
||||
<button class="button" type="button" title="ESCAPE" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close>Cancel</button>
|
||||
<button class="button" type="submit" title="CTRL/⌘ + ENTER" data-i18n-key="dialogs.send" data-i18n-attrs="text" disabled></button>
|
||||
<button class="button" type="button" title="ESCAPE" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -383,12 +429,12 @@
|
||||
<x-background class="full center">
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<h2 class="text-center" data-i18n-key="dialogs.receive-text-title" data-i18n-attrs="text">Message Received</h2>
|
||||
<h2 class="text-center" data-i18n-key="dialogs.receive-text-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="text-center">
|
||||
<span class="display-name badge"></span>
|
||||
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text">has sent:</span>
|
||||
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center">
|
||||
@@ -397,8 +443,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row-reverse center button-row">
|
||||
<button id="copy" class="button" title="CTRL/⌘ + C" data-i18n-key="dialogs.copy" data-i18n-attrs="text">Copy</button>
|
||||
<button id="close" class="button" title="ESCAPE" data-i18n-key="dialogs.close" data-i18n-attrs="text">Close</button>
|
||||
<button id="copy" class="button" title="CTRL/⌘ + C" data-i18n-key="dialogs.copy" data-i18n-attrs="text"></button>
|
||||
<button id="close" class="button" title="ESCAPE" data-i18n-key="dialogs.close" data-i18n-attrs="text"></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -410,7 +456,7 @@
|
||||
<button class="button center" id="base64-paste-btn" title="Paste"></button>
|
||||
<div class="textarea" placeholder="Paste here to send files" title="CMD/⌘ + V" contenteditable hidden></div>
|
||||
<div class="row-reverse center button-row">
|
||||
<button class="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
|
||||
<button class="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -421,119 +467,119 @@
|
||||
</div>
|
||||
<!-- About Page -->
|
||||
<x-about id="about" class="full center column">
|
||||
<header class="row-reverse fade-in">
|
||||
<a href="#" class="close icon-button" data-i18n-key="about.close-about" data-i18n-attrs="aria-label" aria-label="Close About PairDrop">
|
||||
<header class="row-reverse">
|
||||
<a href="#" class="close icon-button" data-i18n-key="about.close-about" data-i18n-attrs="aria-label">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#close-icon" />
|
||||
<use xlink:href="#close-icon"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</header>
|
||||
<section class="center column fade-in">
|
||||
<section class="center column">
|
||||
<svg class="icon logo">
|
||||
<use xlink:href="#wifi-tethering" />
|
||||
<use xlink:href="#wifi-tethering"></use>
|
||||
</svg>
|
||||
<div class="title-wrapper">
|
||||
<div class="title-wrapper" dir="ltr">
|
||||
<h1>PairDrop</h1>
|
||||
<div class="font-subheading">v1.8.3</div>
|
||||
<div class="font-subheading">v1.9.0</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"></div>
|
||||
<div class="row">
|
||||
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop" title="PairDrop on Github" rel="noreferrer" data-i18n-key="about.github" data-i18n-attrs="title">
|
||||
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop" rel="noreferrer" data-i18n-key="about.github" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#github" />
|
||||
<use xlink:href="#github"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="icon-button" target="_blank" href="https://www.buymeacoffee.com/pairdrop" title="Buy me a coffee!" rel="noreferrer" data-i18n-key="about.buy-me-a-coffee" data-i18n-attrs="title">
|
||||
<a class="icon-button" target="_blank" href="https://www.buymeacoffee.com/pairdrop" rel="noreferrer" data-i18n-key="about.buy-me-a-coffee" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#monetarization" />
|
||||
<use xlink:href="#monetarization"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="icon-button" target="_blank" href="https://twitter.com/intent/tweet?text=https%3A%2F%2Fpairdrop.net%20by%20https%3A%2F%2Fgithub.com%2Fschlagmichdoch%2F&" title="Tweet about PairDrop" rel="noreferrer" data-i18n-key="about.tweet" data-i18n-attrs="title">
|
||||
<a class="icon-button" target="_blank" href="https://twitter.com/intent/tweet?text=https%3A%2F%2Fpairdrop.net%20by%20https%3A%2F%2Fgithub.com%2Fschlagmichdoch%2F&" rel="noreferrer" data-i18n-key="about.tweet" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#twitter" />
|
||||
<use xlink:href="#twitter"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop/blob/master/docs/faq.md" title="Frequently asked questions" rel="noreferrer" data-i18n-key="about.faq" data-i18n-attrs="title">
|
||||
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop/blob/master/docs/faq.md" rel="noreferrer" data-i18n-key="about.faq" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#help-outline" />
|
||||
<use xlink:href="#help-outline"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
<x-background></x-background>
|
||||
</x-about>
|
||||
<canvas class="circles"></canvas>
|
||||
<canvas class="circles opacity-0"></canvas>
|
||||
<!-- SVG Icon Library -->
|
||||
<svg style="display: none;">
|
||||
<symbol id=wifi-tethering viewBox="0 0 24 24">
|
||||
<symbol id="wifi-tethering" viewBox="0 0 24 24">
|
||||
<path d="M12 11c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 2c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-2.21 1.79-4 4-4s4 1.79 4 4c0 1.48-.81 2.75-2 3.45l1 1.74c1.79-1.04 3-2.97 3-5.19zM12 3C6.48 3 2 7.48 2 13c0 3.7 2.01 6.92 4.99 8.65l1-1.73C5.61 18.53 4 15.96 4 13c0-4.42 3.58-8 8-8s8 3.58 8 8c0 2.96-1.61 5.53-4 6.92l1 1.73c2.99-1.73 5-4.95 5-8.65 0-5.52-4.48-10-10-10z"></path>
|
||||
</symbol>
|
||||
<symbol id=desktop-mac viewBox="0 0 24 24">
|
||||
<symbol id="desktop-mac" viewBox="0 0 24 24">
|
||||
<path d="M21 2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7l-2 3v1h8v-1l-2-3h7c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 12H3V4h18v10z"></path>
|
||||
</symbol>
|
||||
<symbol id=phone-iphone viewBox="0 0 24 24">
|
||||
<symbol id="phone-iphone" viewBox="0 0 24 24">
|
||||
<path d="M15.5 1h-8C6.12 1 5 2.12 5 3.5v17C5 21.88 6.12 23 7.5 23h8c1.38 0 2.5-1.12 2.5-2.5v-17C18 2.12 16.88 1 15.5 1zm-4 21c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5-4H7V4h9v14z"></path>
|
||||
</symbol>
|
||||
<symbol id=tablet-mac viewBox="0 0 24 24">
|
||||
<symbol id="tablet-mac" viewBox="0 0 24 24">
|
||||
<path d="M18.5 0h-14C3.12 0 2 1.12 2 2.5v19C2 22.88 3.12 24 4.5 24h14c1.38 0 2.5-1.12 2.5-2.5v-19C21 1.12 19.88 0 18.5 0zm-7 23c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7.5-4H4V3h15v16z"></path>
|
||||
</symbol>
|
||||
<symbol id=info-outline viewBox="0 0 24 24">
|
||||
<symbol id="info-outline" viewBox="0 0 24 24">
|
||||
<path d="M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 9h2V7h-2v2z"></path>
|
||||
</symbol>
|
||||
<symbol id=close-icon viewBox="0 0 24 24">
|
||||
<symbol id="close-icon" viewBox="0 0 24 24">
|
||||
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path>
|
||||
</symbol>
|
||||
<symbol id=help-outline viewBox="0 0 24 24">
|
||||
<symbol id="help-outline" viewBox="0 0 24 24">
|
||||
<path d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"></path>
|
||||
</symbol>
|
||||
<symbol id="twitter">
|
||||
<path d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z" />
|
||||
<path d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z"></path>
|
||||
</symbol>
|
||||
<symbol id="github">
|
||||
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
|
||||
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
|
||||
</symbol>
|
||||
<g id="notifications">
|
||||
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z" />
|
||||
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"></path>
|
||||
</g>
|
||||
<symbol id="homescreen">
|
||||
<path fill="none" d="M0 0h24v24H0V0z" />
|
||||
<path d="M18 1.01L8 1c-1.1 0-2 .9-2 2v3h2V5h10v14H8v-1H6v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM10 15h2V8H5v2h3.59L3 15.59 4.41 17 10 11.41z" />
|
||||
<path fill="none" d="M0 0h24v24H0V0z" />
|
||||
<path fill="none" d="M0 0h24v24H0V0z"></path>
|
||||
<path d="M18 1.01L8 1c-1.1 0-2 .9-2 2v3h2V5h10v14H8v-1H6v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM10 15h2V8H5v2h3.59L3 15.59 4.41 17 10 11.41z"></path>
|
||||
<path fill="none" d="M0 0h24v24H0V0z"></path>
|
||||
</symbol>
|
||||
<symbol id="monetarization">
|
||||
<path d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z" />
|
||||
<path d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z"></path>
|
||||
</symbol>
|
||||
<symbol id="icon-theme-auto" viewBox="0 0 24 24">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-54 -54 620 620"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M448 256c0-106-86-192-192-192V448c106 0 192-86 192-192zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-54 -54 620 620"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M448 256c0-106-86-192-192-192V448c106 0 192-86 192-192zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256z"></path></svg>
|
||||
</symbol>
|
||||
<symbol id="icon-theme-light" viewBox="0 0 24 24">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-54 -54 620 620"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-54 -54 620 620"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"></path></svg>
|
||||
</symbol>
|
||||
<symbol id="icon-theme-dark" viewBox="0 0 24 24">
|
||||
<rect fill="none" height="24" width="24"/><path d="M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36c-0.98,1.37-2.58,2.26-4.4,2.26 c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/>
|
||||
<rect fill="none" height="24" width="24"></rect><path d="M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36c-0.98,1.37-2.58,2.26-4.4,2.26 c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path>
|
||||
</symbol>
|
||||
<symbol id="pair-device-icon" viewBox="0 0 640 512">
|
||||
<!--! Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
|
||||
<path d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"/>
|
||||
<path d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"></path>
|
||||
</symbol>
|
||||
<symbol id="edit-pair-devices-icon" viewBox="-159 25 640 512">
|
||||
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
|
||||
<!--! edited by @schlagmichdoch -->
|
||||
<path d="M218,155.4c-56.5-56.5-148-56.5-204.5,0L-98.8,267.7c-56.5,56.5-56.5,148,0,204.5c50,50,128.8,56.5,186.3,15.4l1.6-1.1 c14.4-10.3,17.7-30.3,7.4-44.6s-30.3-17.7-44.6-7.4l-1.6,1.1c-32.1,22.9-76,19.3-103.8-8.6c-31.5-31.6-31.5-82.6,0-114.1L58.7,200.6 c31.5-31.5,82.5-31.5,114,0c15.8,15.8,23.8,36.7,23.6,57.6c7.9-8.3,18.9-13,30.6-13c4.5,0,8.9,0.7,13.2,2l17.4,5.5 c0.9-0.5,1.8-1,2.7-1.5C258.7,216.2,244.4,181.8,218,155.4z M420.8,86.6c-50-50-128.8-56.5-186.3-15.4l-1.6,1.1 c-14.4,10.3-17.7,30.3-7.4,44.6s30.3,17.7,44.6,7.4l1.6-1.1c32.1-22.9,76-19.3,103.8,8.6c25.8,25.8,30.5,64.7,14,95.2 c0.7,2,1.3,4,1.8,6.1l3.9,17.9c1.1,0.6,2.1,1.2,3.2,1.8l17.4-5.5c4.3-1.4,8.7-2,13.1-2c7.3,0,14.3,1.8,20.5,5.2 C474.7,196.8,465.1,130.9,420.8,86.6z M140.7,254.4l1.1-1.6c10.3-14.4,6.9-34.4-7.4-44.6s-34.4-6.9-44.6,7.4l-1.1,1.6 C47.5,274.6,54,353.4,104,403.4c18.7,18.7,41.2,31.2,65,37.5c-1.4-3.1-2.6-6.2-3.8-9.3c-6-16.4-1.5-34.6,11.6-46.4l7.2-6.6 c-12.7-3.6-24.7-10.5-34.8-20.5C121.4,330.3,117.8,286.4,140.7,254.4z"/>
|
||||
<path d="M458.9,407.4l-24.3-22.1c0.6-4.7,1-9.4,1-14.2s-0.3-9.6-1-14.2l24.3-22.1c3.9-3.5,5.4-8.9,3.6-13.8v-0.1 c-2.5-6.7-5.4-13.1-8.9-19.2l-2.6-4.5c-3.7-6.2-7.8-12-12.4-17.5c-3.3-4-8.8-5.4-13.7-3.8l-31.2,9.9c-7.5-5.8-15.8-10.6-24.7-14.2 l-7-32c-1.1-5.1-5-9.1-10.2-10c-7.7-1.3-15.7-2-23.8-2s-16.1,0.7-23.8,2c-5.2,0.9-9.1,4.9-10.2,10l-7,32 c-8.9,3.7-17.2,8.5-24.7,14.2l-31.2-9.9c-4.9-1.6-10.4-0.2-13.7,3.8c-4.5,5.5-8.7,11.3-12.4,17.5l-2.6,4.5 c-3.4,6.2-6.4,12.6-8.9,19.2c-1.8,4.9-0.3,10.3,3.6,13.8l24.3,22.1c-0.6,4.7-1,9.4-1,14.2s0.3,9.6,1,14.3L197,407.5 c-3.9,3.5-5.4,8.9-3.6,13.8c2.5,6.7,5.4,13.1,8.9,19.2l2.6,4.5c3.7,6.2,7.8,12,12.4,17.5c3.3,4,8.8,5.4,13.7,3.8l31.2-10 c7.5,5.8,15.8,10.6,24.7,14.2l7,32c1.1,5.1,5,9.1,10.2,10c7.7,1.3,15.7,2,23.8,2c8.1,0,16.1-0.7,23.8-2c5.2-0.8,9.1-4.9,10.2-10 l7-32c8.9-3.6,17.2-8.5,24.7-14.2l31.2,9.9c4.9,1.6,10.4,0.2,13.7-3.8c4.5-5.5,8.7-11.3,12.4-17.5l2.6-4.5 c3.4-6.2,6.4-12.6,8.9-19.2C464.2,416.3,462.7,410.9,458.9,407.4z M328,415.9c-24.8,0-44.9-20.1-44.9-44.8 c0-24.8,20.1-44.8,44.9-44.8s44.8,20.1,44.8,44.8C372.8,395.9,352.7,415.9,328,415.9z"/>
|
||||
<path d="M218,155.4c-56.5-56.5-148-56.5-204.5,0L-98.8,267.7c-56.5,56.5-56.5,148,0,204.5c50,50,128.8,56.5,186.3,15.4l1.6-1.1 c14.4-10.3,17.7-30.3,7.4-44.6s-30.3-17.7-44.6-7.4l-1.6,1.1c-32.1,22.9-76,19.3-103.8-8.6c-31.5-31.6-31.5-82.6,0-114.1L58.7,200.6 c31.5-31.5,82.5-31.5,114,0c15.8,15.8,23.8,36.7,23.6,57.6c7.9-8.3,18.9-13,30.6-13c4.5,0,8.9,0.7,13.2,2l17.4,5.5 c0.9-0.5,1.8-1,2.7-1.5C258.7,216.2,244.4,181.8,218,155.4z M420.8,86.6c-50-50-128.8-56.5-186.3-15.4l-1.6,1.1 c-14.4,10.3-17.7,30.3-7.4,44.6s30.3,17.7,44.6,7.4l1.6-1.1c32.1-22.9,76-19.3,103.8,8.6c25.8,25.8,30.5,64.7,14,95.2 c0.7,2,1.3,4,1.8,6.1l3.9,17.9c1.1,0.6,2.1,1.2,3.2,1.8l17.4-5.5c4.3-1.4,8.7-2,13.1-2c7.3,0,14.3,1.8,20.5,5.2 C474.7,196.8,465.1,130.9,420.8,86.6z M140.7,254.4l1.1-1.6c10.3-14.4,6.9-34.4-7.4-44.6s-34.4-6.9-44.6,7.4l-1.1,1.6 C47.5,274.6,54,353.4,104,403.4c18.7,18.7,41.2,31.2,65,37.5c-1.4-3.1-2.6-6.2-3.8-9.3c-6-16.4-1.5-34.6,11.6-46.4l7.2-6.6 c-12.7-3.6-24.7-10.5-34.8-20.5C121.4,330.3,117.8,286.4,140.7,254.4z"></path>
|
||||
<path d="M458.9,407.4l-24.3-22.1c0.6-4.7,1-9.4,1-14.2s-0.3-9.6-1-14.2l24.3-22.1c3.9-3.5,5.4-8.9,3.6-13.8v-0.1 c-2.5-6.7-5.4-13.1-8.9-19.2l-2.6-4.5c-3.7-6.2-7.8-12-12.4-17.5c-3.3-4-8.8-5.4-13.7-3.8l-31.2,9.9c-7.5-5.8-15.8-10.6-24.7-14.2 l-7-32c-1.1-5.1-5-9.1-10.2-10c-7.7-1.3-15.7-2-23.8-2s-16.1,0.7-23.8,2c-5.2,0.9-9.1,4.9-10.2,10l-7,32 c-8.9,3.7-17.2,8.5-24.7,14.2l-31.2-9.9c-4.9-1.6-10.4-0.2-13.7,3.8c-4.5,5.5-8.7,11.3-12.4,17.5l-2.6,4.5 c-3.4,6.2-6.4,12.6-8.9,19.2c-1.8,4.9-0.3,10.3,3.6,13.8l24.3,22.1c-0.6,4.7-1,9.4-1,14.2s0.3,9.6,1,14.3L197,407.5 c-3.9,3.5-5.4,8.9-3.6,13.8c2.5,6.7,5.4,13.1,8.9,19.2l2.6,4.5c3.7,6.2,7.8,12,12.4,17.5c3.3,4,8.8,5.4,13.7,3.8l31.2-10 c7.5,5.8,15.8,10.6,24.7,14.2l7,32c1.1,5.1,5,9.1,10.2,10c7.7,1.3,15.7,2,23.8,2c8.1,0,16.1-0.7,23.8-2c5.2-0.8,9.1-4.9,10.2-10 l7-32c8.9-3.6,17.2-8.5,24.7-14.2l31.2,9.9c4.9,1.6,10.4,0.2,13.7-3.8c4.5-5.5,8.7-11.3,12.4-17.5l2.6-4.5 c3.4-6.2,6.4-12.6,8.9-19.2C464.2,416.3,462.7,410.9,458.9,407.4z M328,415.9c-24.8,0-44.9-20.1-44.9-44.8 c0-24.8,20.1-44.8,44.9-44.8s44.8,20.1,44.8,44.8C372.8,395.9,352.7,415.9,328,415.9z"></path>
|
||||
</symbol>
|
||||
<symbol id="edit-pen-icon" viewBox="0 0 512 512">
|
||||
<!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
|
||||
<path d="M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z"/>
|
||||
<path d="M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z"></path>
|
||||
</symbol>
|
||||
<symbol id="public-room-icon" viewBox="0 0 640 512">
|
||||
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
|
||||
<path d="M0 24C0 10.7 10.7 0 24 0H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24C10.7 48 0 37.3 0 24zM0 488c0-13.3 10.7-24 24-24H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24c-13.3 0-24-10.7-24-24zM83.2 160a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM32 320c0-35.3 28.7-64 64-64h96c12.2 0 23.7 3.4 33.4 9.4c-37.2 15.1-65.6 47.2-75.8 86.6H64c-17.7 0-32-14.3-32-32zm461.6 32c-10.3-40.1-39.6-72.6-77.7-87.4c9.4-5.5 20.4-8.6 32.1-8.6h96c35.3 0 64 28.7 64 64c0 17.7-14.3 32-32 32H493.6zM391.2 290.4c32.1 7.4 58.1 30.9 68.9 61.6c3.5 10 5.5 20.8 5.5 32c0 17.7-14.3 32-32 32h-224c-17.7 0-32-14.3-32-32c0-11.2 1.9-22 5.5-32c10.5-29.7 35.3-52.8 66.1-60.9c7.8-2.1 16-3.1 24.5-3.1h96c7.4 0 14.7 .8 21.6 2.4zm44-130.4a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM321.6 96a80 80 0 1 1 0 160 80 80 0 1 1 0-160z"/>
|
||||
<path d="M0 24C0 10.7 10.7 0 24 0H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24C10.7 48 0 37.3 0 24zM0 488c0-13.3 10.7-24 24-24H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24c-13.3 0-24-10.7-24-24zM83.2 160a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM32 320c0-35.3 28.7-64 64-64h96c12.2 0 23.7 3.4 33.4 9.4c-37.2 15.1-65.6 47.2-75.8 86.6H64c-17.7 0-32-14.3-32-32zm461.6 32c-10.3-40.1-39.6-72.6-77.7-87.4c9.4-5.5 20.4-8.6 32.1-8.6h96c35.3 0 64 28.7 64 64c0 17.7-14.3 32-32 32H493.6zM391.2 290.4c32.1 7.4 58.1 30.9 68.9 61.6c3.5 10 5.5 20.8 5.5 32c0 17.7-14.3 32-32 32h-224c-17.7 0-32-14.3-32-32c0-11.2 1.9-22 5.5-32c10.5-29.7 35.3-52.8 66.1-60.9c7.8-2.1 16-3.1 24.5-3.1h96c7.4 0 14.7 .8 21.6 2.4zm44-130.4a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM321.6 96a80 80 0 1 1 0 160 80 80 0 1 1 0-160z"></path>
|
||||
</symbol>
|
||||
<symbol id="icon-language-selector" viewBox="0 0 640 512">
|
||||
<!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
|
||||
<path d="M0 128C0 92.7 28.7 64 64 64H256h48 16H576c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H320 304 256 64c-35.3 0-64-28.7-64-64V128zm320 0V384H576V128H320zM178.3 175.9c-3.2-7.2-10.4-11.9-18.3-11.9s-15.1 4.7-18.3 11.9l-64 144c-4.5 10.1 .1 21.9 10.2 26.4s21.9-.1 26.4-10.2l8.9-20.1h73.6l8.9 20.1c4.5 10.1 16.3 14.6 26.4 10.2s14.6-16.3 10.2-26.4l-64-144zM160 233.2L179 276H141l19-42.8zM448 164c11 0 20 9 20 20v4h44 16c11 0 20 9 20 20s-9 20-20 20h-2l-1.6 4.5c-8.9 24.4-22.4 46.6-39.6 65.4c.9 .6 1.8 1.1 2.7 1.6l18.9 11.3c9.5 5.7 12.5 18 6.9 27.4s-18 12.5-27.4 6.9l-18.9-11.3c-4.5-2.7-8.8-5.5-13.1-8.5c-10.6 7.5-21.9 14-34 19.4l-3.6 1.6c-10.1 4.5-21.9-.1-26.4-10.2s.1-21.9 10.2-26.4l3.6-1.6c6.4-2.9 12.6-6.1 18.5-9.8l-12.2-12.2c-7.8-7.8-7.8-20.5 0-28.3s20.5-7.8 28.3 0l14.6 14.6 .5 .5c12.4-13.1 22.5-28.3 29.8-45H448 376c-11 0-20-9-20-20s9-20 20-20h52v-4c0-11 9-20 20-20z"/>
|
||||
<path d="M0 128C0 92.7 28.7 64 64 64H256h48 16H576c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H320 304 256 64c-35.3 0-64-28.7-64-64V128zm320 0V384H576V128H320zM178.3 175.9c-3.2-7.2-10.4-11.9-18.3-11.9s-15.1 4.7-18.3 11.9l-64 144c-4.5 10.1 .1 21.9 10.2 26.4s21.9-.1 26.4-10.2l8.9-20.1h73.6l8.9 20.1c4.5 10.1 16.3 14.6 26.4 10.2s14.6-16.3 10.2-26.4l-64-144zM160 233.2L179 276H141l19-42.8zM448 164c11 0 20 9 20 20v4h44 16c11 0 20 9 20 20s-9 20-20 20h-2l-1.6 4.5c-8.9 24.4-22.4 46.6-39.6 65.4c.9 .6 1.8 1.1 2.7 1.6l18.9 11.3c9.5 5.7 12.5 18 6.9 27.4s-18 12.5-27.4 6.9l-18.9-11.3c-4.5-2.7-8.8-5.5-13.1-8.5c-10.6 7.5-21.9 14-34 19.4l-3.6 1.6c-10.1 4.5-21.9-.1-26.4-10.2s.1-21.9 10.2-26.4l3.6-1.6c6.4-2.9 12.6-6.1 18.5-9.8l-12.2-12.2c-7.8-7.8-7.8-20.5 0-28.3s20.5-7.8 28.3 0l14.6 14.6 .5 .5c12.4-13.1 22.5-28.3 29.8-45H448 376c-11 0-20-9-20-20s9-20 20-20h52v-4c0-11 9-20 20-20z"></path>
|
||||
</symbol>
|
||||
|
||||
</svg>
|
||||
@@ -542,7 +588,7 @@
|
||||
<script src="scripts/theme.js"></script>
|
||||
<script src="scripts/network.js"></script>
|
||||
<script src="scripts/ui.js"></script>
|
||||
<script src="scripts/util.js" async></script>
|
||||
<script src="scripts/util.js"></script>
|
||||
<script src="scripts/QRCode.min.js" async></script>
|
||||
<script src="scripts/zip.min.js" async></script>
|
||||
<script src="scripts/NoSleep.min.js" async></script>
|
||||
@@ -559,3 +605,4 @@
|
||||
</x-noscript>
|
||||
</noscript>
|
||||
</body>
|
||||
</html>
|
||||
159
public/lang/ar.json
Normal file
159
public/lang/ar.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "إذا لم يكن WebRTC متاحًا.",
|
||||
"public-room-devices_title": "يمكن اكتشافك بواسطة الأجهزة الموجودة في هذه الغرفة العامة المستقلة عن الشبكة.",
|
||||
"display-name_data-placeholder": "تحميل …",
|
||||
"display-name_title": "قم بتحرير اسم جهازك بشكل دائم",
|
||||
"traffic": "حركة المرور هي",
|
||||
"paired-devices_title": "يمكن اكتشافك بواسطة الأجهزة المقترنة في جميع الأوقات بشكل مستقل عن الشبكة.",
|
||||
"public-room-devices": "في الغرفة {{roomId}}",
|
||||
"paired-devices": "بواسطة الأجهزة المقترنة",
|
||||
"on-this-network": "على هذه الشبكة",
|
||||
"routed": "توجيهّا من خلال الخادم",
|
||||
"discovery": "يمكنك اكتشاف:",
|
||||
"on-this-network_title": "يمكن للجميع اكتشافك على هذه الشبكة.",
|
||||
"known-as": "أنت معروف بأنك:"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "يرغب {{name}} في نقل {{count}} {{descriptor}}",
|
||||
"unfinished-transfers-warning": "هناك تحويلات غير مكتملة. هل أنت متأكد أنك تريد إغلاق PairDrop؟",
|
||||
"message-received": "تم استلام الرابط بواسطة {{name}} - انقر للفتح",
|
||||
"rate-limit-join-key": "تم الوصول إلى الحد الأقصى. انتظر 10 ثوان وحاول مرة أخرى.",
|
||||
"connecting": "يتصل …",
|
||||
"pairing-key-invalidated": "المفتاح {{key}} خاطئ.",
|
||||
"pairing-key-invalid": "مُفتاح خاطئ",
|
||||
"connected": "متصل.",
|
||||
"pairing-not-persistent": "الأجهزة المقترنة ليست ثابتة.",
|
||||
"text-content-incorrect": "محتوى النص غير صحيح.",
|
||||
"message-transfer-completed": "اكتمل نقل الرسالة.",
|
||||
"file-transfer-completed": "اكتمل نقل الملف.",
|
||||
"file-content-incorrect": "محتوى الملف غير صحيح.",
|
||||
"files-incorrect": "الملفات غير صحيحة.",
|
||||
"selected-peer-left": "مُحَدد الاجهزة المقترنة.",
|
||||
"link-received": "تم استلام الرابط بواسطة {{name}} - انقر للفتح",
|
||||
"online": "لقد عدت متصلاً بالإنترنت",
|
||||
"public-room-left": "الخروج من الغرفة العامة {{publicRoomId}}",
|
||||
"copied-text": "نُسِخَ النص إلى الحافظة",
|
||||
"display-name-random-again": "يتم إنشاء اسم العرض بشكل عشوائي مرة أخرى.",
|
||||
"display-name-changed-permanently": "يتم تغيير اسم العرض بشكل دائم.",
|
||||
"copied-to-clipboard-error": "النسخ غير ممكن. انسخ يدويًا.",
|
||||
"pairing-success": "الأجهزة المقترنة.",
|
||||
"clipboard-content-incorrect": "محتوى الحافظة غير صحيح.",
|
||||
"display-name-changed-temporarily": "تم تغيير اسم العرض لهذه الجلسة فقط.",
|
||||
"copied-to-clipboard": "تم النسخ إلى الحافظة",
|
||||
"offline": "انت غير متصل",
|
||||
"pairing-tabs-error": "من المستحيل إقران علامتي تبويب متصفح الويب.",
|
||||
"public-room-id-invalid": "معرف الغرفة غير صالح",
|
||||
"click-to-download": "إضغط للتحميل",
|
||||
"pairing-cleared": "جميع الأجهزة غير مقترنة.",
|
||||
"notifications-enabled": "تم تمكين الإشعارات.",
|
||||
"online-requirement-pairing": "يجب أن تكون متصلاً بالإنترنت لإقران الأجهزة.",
|
||||
"ios-memory-limit": "لا يمكن إرسال ملفات إلى iOS إلا بحجم يصل إلى 200 ميجابايت مرة واحدة",
|
||||
"online-requirement-public-room": "يجب أن تكون متصلاً بالإنترنت لإنشاء غرفة عامة.",
|
||||
"copied-text-error": "فشلت الكتابة من الحافظة. انسخ يدويًا!",
|
||||
"download-successful": "تم تحميل {{descriptor}}",
|
||||
"click-to-show": "اضغط للعرض"
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "تمّ",
|
||||
"theme-auto_title": "تكيٌف المظهر مع النظام",
|
||||
"install_title": "تثبيت PairDrop",
|
||||
"theme-dark_title": "إستخدام دائما المظهر المظلم",
|
||||
"pair-device_title": "قم بإقران أجهزتك بشكل دائم",
|
||||
"join-public-room_title": "انضم إلى الغرفة العامة مؤقتًا",
|
||||
"notification_title": "تشغيل الإشعارات",
|
||||
"edit-paired-devices_title": "تعديل الأجهزة المقترنة",
|
||||
"language-selector_title": "إختر اللغةعربي",
|
||||
"about_title": "حول PairDrop",
|
||||
"about_aria-label": "افتح حول PairDrop",
|
||||
"theme-light_title": "إستخدم دائماً المظهر الفاتح"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "انقر لإرسال الملفات أو انقر لفترة طويلة لإرسال رسالة",
|
||||
"click-to-send": "انقر للإرسال",
|
||||
"activate-paste-mode-and-other-files": "و{{count}} ملفات أخرى",
|
||||
"tap-to-send": "انقر للإرسال",
|
||||
"activate-paste-mode-base": "افتح PairDrop على الأجهزة الأخرى للإرسال",
|
||||
"no-peers-subtitle": "قم بإقران الأجهزة أو ادخل إلى غرفة عامة لتتمكن من إكتشافها على الشبكات الأخرى",
|
||||
"activate-paste-mode-shared-text": "النص المشترك",
|
||||
"x-instructions_desktop": "انقر لإرسال الملفات أو انقر بزر الماوس الأيمن لإرسال رسالة",
|
||||
"no-peers-title": "افتح PairDrop على الأجهزة الأخرى لإرسال الملفات",
|
||||
"x-instructions_data-drop-bg": "حرر لتحديد المستلم",
|
||||
"no-peers_data-drop-bg": "حرر لتحديد المستلم",
|
||||
"x-instructions_data-drop-peer": "قم بالتحرير لإرسالها إلى النظير"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "مُعالجة …",
|
||||
"click-to-send-paste-mode": "انقر للإرسال {{descriptor}}",
|
||||
"click-to-send": "انقر لإرسال الملفات أو انقر بزر الماوس الأيمن لإرسال رسالة",
|
||||
"waiting": "يُرجى الإنتظار…",
|
||||
"connection-hash": "للتحقق من أمان التشفير الشامل، قم بمقارنة رقم الأمان هذا على كلا الجهازين",
|
||||
"preparing": "يقترن…",
|
||||
"transferring": "جارٍ النقل…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "الصق هنا لإرسال {{type}}",
|
||||
"auto-accept-instructions-2": "لقبول جميع الملفات المرسلة من هذا الجهاز تلقائيًا.",
|
||||
"receive-text-title": "تلقيت رسالة",
|
||||
"edit-paired-devices-title": "تحرير الأجهزة المقترنة",
|
||||
"cancel": "إلغاء",
|
||||
"auto-accept-instructions-1": "تفعيل",
|
||||
"pair-devices-title": "إقران الأجهزة بشكل دائم",
|
||||
"download": "تحميل",
|
||||
"title-file": "ملف",
|
||||
"base64-processing": "مُعالجة…",
|
||||
"decline": "رفض",
|
||||
"receive-title": "تم الاستلام {{descriptor}}",
|
||||
"leave": "مُغادرة",
|
||||
"join": "انضمام",
|
||||
"title-image-plural": "صور",
|
||||
"send": "ارسال",
|
||||
"base64-tap-to-paste": "انقر هنا للصق {{type}}",
|
||||
"base64-text": "نص",
|
||||
"copy": "نسخ",
|
||||
"file-other-description-image": "وصورة واحدة أخرى",
|
||||
"temporary-public-room-title": "غرفة عامة مؤقتة",
|
||||
"base64-files": "ملفات",
|
||||
"has-sent": "ارسلت:",
|
||||
"file-other-description-file": "وملف واحد آخر",
|
||||
"close": "إغلاق",
|
||||
"system-language": "لغة النظام",
|
||||
"unpair": "إلغاء الإقتران",
|
||||
"title-image": "صورة",
|
||||
"file-other-description-file-plural": "و{{count}} ملفات أخرى",
|
||||
"would-like-to-share": "ترغب في المشاركة",
|
||||
"send-message-to": "أرسال رسالة إلى",
|
||||
"language-selector-title": "إختر اللُغة",
|
||||
"pair": "إقتران",
|
||||
"hr-or": "او",
|
||||
"scan-qr-code": "أو مسح رمز الاستجابة السريعة.",
|
||||
"input-key-on-this-device": "أدخل هذا المفتاح على جهاز آخر",
|
||||
"download-again": "تحميل مرة أخرى",
|
||||
"accept": "قبول",
|
||||
"paired-devices-wrapper_data-empty": "لا توجد أجهزة مقترنة.",
|
||||
"enter-key-from-another-device": "أدخل المفتاح من جهاز آخر هنا.",
|
||||
"share": "مُشاركة",
|
||||
"auto-accept": "قبول تلقائي",
|
||||
"title-file-plural": "ملفات",
|
||||
"send-message-title": "إرسال رسالة",
|
||||
"input-room-id-on-another-device": "أدخل معرف الغرفة هذا على جهاز آخر ما ",
|
||||
"file-other-description-image-plural": "و{{count}} صور أخرى",
|
||||
"enter-room-id-from-another-device": "أدخل معرف الغرفة من جهاز آخر للانضمام إلى الغرفة."
|
||||
},
|
||||
"about": {
|
||||
"claim": "أسهل طريقة لنقل الملفات عبر الأجهزة",
|
||||
"tweet_title": "غرّد حول PairDrop",
|
||||
"close-about_aria-label": "إغلاق حول PairDrop",
|
||||
"buy-me-a-coffee_title": "اشتري لي القهوة!",
|
||||
"github_title": "PairDrop على جيت هاب",
|
||||
"faq_title": "أسئلة متكررة"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "طلب نقل الملف",
|
||||
"message-received-plural": "{{count}} الرسائل المستلمة",
|
||||
"message-received": "تم إرسال الرسالة",
|
||||
"file-received": "تم استلام الملف",
|
||||
"file-received-plural": "{{count}} الملفات المستلمة",
|
||||
"image-transfer-requested": "طُلب نقل الصور المطلوبة"
|
||||
}
|
||||
}
|
||||
@@ -7,21 +7,21 @@
|
||||
"pair-device_title": "Deine Geräte dauerhaft koppeln",
|
||||
"edit-paired-devices_title": "Gekoppelte Geräte bearbeiten",
|
||||
"theme-auto_title": "Systemstil verwenden",
|
||||
"theme-dark_title": "Dunklen Stil verwenden",
|
||||
"theme-light_title": "Hellen Stil verwenden",
|
||||
"theme-dark_title": "Immer dunklen Stil verwenden",
|
||||
"theme-light_title": "Immer hellen Stil verwenden",
|
||||
"cancel-paste-mode": "Fertig",
|
||||
"language-selector_title": "Sprache auswählen",
|
||||
"language-selector_title": "Sprache Wählen",
|
||||
"join-public-room_title": "Öffentlichen Raum temporär betreten"
|
||||
},
|
||||
"dialogs": {
|
||||
"share": "Teilen",
|
||||
"download": "Herunterladen",
|
||||
"pair-devices-title": "Geräte dauerhaft koppeln",
|
||||
"pair-devices-title": "Geräte Dauerhaft Koppeln",
|
||||
"input-key-on-this-device": "Gib diesen Schlüssel auf einem anderen Gerät ein",
|
||||
"enter-key-from-another-device": "Gib den Schlüssel von einem anderen Gerät hier ein.",
|
||||
"pair": "Koppeln",
|
||||
"cancel": "Abbrechen",
|
||||
"edit-paired-devices-title": "Gekoppelte Geräte bearbeiten",
|
||||
"edit-paired-devices-title": "Gekoppelte Geräte Bearbeiten",
|
||||
"paired-devices-wrapper_data-empty": "Keine gekoppelten Geräte.",
|
||||
"close": "Schließen",
|
||||
"accept": "Akzeptieren",
|
||||
@@ -34,14 +34,14 @@
|
||||
"would-like-to-share": "möchte Folgendes teilen",
|
||||
"send": "Senden",
|
||||
"copy": "Kopieren",
|
||||
"receive-text-title": "Textnachricht erhalten",
|
||||
"receive-text-title": "Textnachricht Erhalten",
|
||||
"file-other-description-image-plural": "und {{count}} andere Bilder",
|
||||
"file-other-description-file-plural": "und {{count}} andere Dateien",
|
||||
"auto-accept-instructions-1": "Aktiviere",
|
||||
"auto-accept": "auto-accept",
|
||||
"auto-accept-instructions-2": "um automatisch alle Dateien von diesem Gerät zu akzeptieren.",
|
||||
"has-sent": "hat Folgendes gesendet:",
|
||||
"send-message-title": "Textnachricht senden",
|
||||
"send-message-title": "Textnachricht Senden",
|
||||
"send-message-to": "Sende eine Textnachricht an",
|
||||
"base64-tap-to-paste": "Hier tippen, um {{type}} einzufügen",
|
||||
"base64-paste-to-send": "Hier einfügen, um {{type}} zu versenden",
|
||||
@@ -50,10 +50,10 @@
|
||||
"base64-processing": "Bearbeitung läuft…",
|
||||
"file-other-description-image": "und ein anderes Bild",
|
||||
"file-other-description-file": "und eine andere Datei",
|
||||
"receive-title": "{{descriptor}} erhalten",
|
||||
"receive-title": "{{descriptor}} Erhalten",
|
||||
"download-again": "Erneut herunterladen",
|
||||
"system-language": "Systemsprache",
|
||||
"language-selector-title": "Sprache auswählen",
|
||||
"language-selector-title": "Sprache Einstellen",
|
||||
"hr-or": "ODER",
|
||||
"input-room-id-on-another-device": "Gib diese Raum-ID auf einem anderen Gerät ein",
|
||||
"unpair": "Entkoppeln",
|
||||
@@ -68,7 +68,7 @@
|
||||
"close-about_aria-label": "Schließe Über PairDrop",
|
||||
"github_title": "PairDrop auf GitHub",
|
||||
"buy-me-a-coffee_title": "Kauf mir einen Kaffee!",
|
||||
"claim": "Der einfachste Weg Dateien zwischen Geräten zu teilen"
|
||||
"claim": "Der einfachste Weg, Dateien zwischen Geräten zu übertragen"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Du wirst angezeigt als:",
|
||||
@@ -80,7 +80,7 @@
|
||||
"routed": "durch den Server geleitet",
|
||||
"webrtc": "wenn WebRTC nicht verfügbar ist.",
|
||||
"display-name_data-placeholder": "Lade…",
|
||||
"public-room-devices_title": "Du kannst von Geräten in diesem öffentlichen Raum unabhängig von deinem Netzwerk gefunden werden.",
|
||||
"public-room-devices_title": "Du kannst von Geräten in diesem öffentlichen Raum gefunden werden, unabhängig von deinem Netzwerk.",
|
||||
"paired-devices_title": "Du kannst immer von gekoppelten Geräten gefunden werden, egal in welchem Netzwerk.",
|
||||
"public-room-devices": "in Raum {{roomId}}",
|
||||
"discovery": "Du bist sichtbar:",
|
||||
@@ -114,9 +114,9 @@
|
||||
"online-requirement": "Du musst online sein um Geräte zu koppeln.",
|
||||
"display-name-changed-temporarily": "Anzeigename wurde nur für diese Session geändert.",
|
||||
"request-title": "{{name}} möchte {{count}}{{descriptor}} übertragen",
|
||||
"connecting": "Verbindung wird aufgebaut…",
|
||||
"connecting": "Verbindung wird hergestellt…",
|
||||
"files-incorrect": "Dateien sind fehlerhaft.",
|
||||
"file-transfer-completed": "Dateiübertragung fertiggestellt.",
|
||||
"file-transfer-completed": "Dateiübertragung abgeschlossen.",
|
||||
"message-transfer-completed": "Nachrichtenübertragung fertiggestellt.",
|
||||
"rate-limit-join-key": "Rate Limit erreicht. Warte 10 Sekunden und versuche es erneut.",
|
||||
"selected-peer-left": "Ausgewählter Peer ist gegangen.",
|
||||
@@ -128,7 +128,7 @@
|
||||
"online-requirement-public-room": "Du musst online sein, um öffentliche Räume erstellen zu können."
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_desktop": "Klicke, um Dateien zu Senden oder klicke mit der rechten Maustaste, um Textnachrichten zu senden",
|
||||
"x-instructions_desktop": "Klicke, um Dateien zu senden oder benutze einen Rechtsklick, um eine Textnachricht zu senden",
|
||||
"no-peers-title": "Öffne PairDrop auf anderen Geräten, um Dateien zu senden",
|
||||
"no-peers_data-drop-bg": "Hier ablegen, um Empfänger auszuwählen",
|
||||
"no-peers-subtitle": "Kopple Geräte oder besuche einen öffentlichen Raum, damit du in anderen Netzwerken sichtbar bist",
|
||||
@@ -136,20 +136,21 @@
|
||||
"tap-to-send": "Tippe zum Senden von",
|
||||
"x-instructions_data-drop-peer": "Hier ablegen, um an Peer zu senden",
|
||||
"x-instructions_data-drop-bg": "Loslassen um Empfänger auszuwählen",
|
||||
"x-instructions_mobile": "Tippe zum Senden von Dateien oder tippe lange zum Senden von Nachrichten",
|
||||
"x-instructions_mobile": "Tippe, um Dateien zu senden oder tippe lange, um Nachrichten zu senden",
|
||||
"activate-paste-mode-base": "Öffne PairDrop auf anderen Geräten zum Senden von",
|
||||
"activate-paste-mode-and-other-files": "und {{count}} anderen Dateien",
|
||||
"activate-paste-mode-shared-text": "freigegebenem Text"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Datenübertagung angefordert",
|
||||
"file-transfer-requested": "Dateiübertragung angefordert",
|
||||
"file-received": "Datei erhalten",
|
||||
"file-received-plural": "{{count}} Dateien erhalten",
|
||||
"message-received": "Nachricht erhalten",
|
||||
"message-received-plural": "{{count}} Nachrichten erhalten"
|
||||
"message-received-plural": "{{count}} Nachrichten erhalten",
|
||||
"image-transfer-requested": "Bilder Transfer beantragt"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send": "Klicke um Dateien zu senden oder nutze einen Rechtsklick um eine Textnachricht zu senden",
|
||||
"click-to-send": "Klicke, um Dateien zu senden oder benutze einen Rechtsklick, um eine Textnachricht zu senden",
|
||||
"connection-hash": "Um die Ende-zu-Ende Verschlüsselung zu verifizieren, vergleiche die Sicherheitsnummer auf beiden Geräten",
|
||||
"waiting": "Warte…",
|
||||
"click-to-send-paste-mode": "Klicken um {{descriptor}} zu senden",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"header": {
|
||||
"about_title": "About PairDrop",
|
||||
"language-selector_title": "Select Language",
|
||||
"language-selector_title": "Set Language",
|
||||
"about_aria-label": "Open About PairDrop",
|
||||
"theme-auto_title": "Adapt Theme to System",
|
||||
"theme-light_title": "Always Use Light-Theme",
|
||||
"theme-dark_title": "Always Use Dark-Theme",
|
||||
"notification_title": "Enable Notifications",
|
||||
"theme-auto_title": "Adapt theme to system automatically",
|
||||
"theme-light_title": "Always use light theme",
|
||||
"theme-dark_title": "Always use dark theme",
|
||||
"notification_title": "Enable notifications",
|
||||
"install_title": "Install PairDrop",
|
||||
"pair-device_title": "Pair Your Devices Permanently",
|
||||
"edit-paired-devices_title": "Edit Paired Devices",
|
||||
"join-public-room_title": "Join Public Room Temporarily",
|
||||
"pair-device_title": "Pair your devices permanently",
|
||||
"edit-paired-devices_title": "Edit paired devices",
|
||||
"join-public-room_title": "Join public room temporarily",
|
||||
"cancel-paste-mode": "Done"
|
||||
},
|
||||
"instructions": {
|
||||
@@ -70,6 +70,7 @@
|
||||
"download": "Download",
|
||||
"send-message-title": "Send Message",
|
||||
"send-message-to": "Send a Message to",
|
||||
"message_title": "Insert message to send",
|
||||
"send": "Send",
|
||||
"receive-text-title": "Message Received",
|
||||
"copy": "Copy",
|
||||
@@ -88,8 +89,10 @@
|
||||
"title-file-plural": "Files",
|
||||
"receive-title": "{{descriptor}} Received",
|
||||
"download-again": "Download again",
|
||||
"language-selector-title": "Select Language",
|
||||
"system-language": "System Language"
|
||||
"language-selector-title": "Set Language",
|
||||
"system-language": "System Language",
|
||||
"public-room-qr-code_title": "Click to copy link to public room",
|
||||
"pair-devices-qr-code_title": "Click to copy link to pair this device"
|
||||
},
|
||||
"about": {
|
||||
"close-about_aria-label": "Close About PairDrop",
|
||||
@@ -113,11 +116,14 @@
|
||||
"public-room-id-invalid": "Invalid room ID",
|
||||
"public-room-left": "Left public room {{publicRoomId}}",
|
||||
"copied-to-clipboard": "Copied to clipboard",
|
||||
"pair-url-copied-to-clipboard": "Link to pair this device copied to clipboard",
|
||||
"room-url-copied-to-clipboard": "Link to public room copied to clipboard",
|
||||
"copied-to-clipboard-error": "Copying not possible. Copy manually.",
|
||||
"text-content-incorrect": "Text content is incorrect.",
|
||||
"file-content-incorrect": "File content is incorrect.",
|
||||
"clipboard-content-incorrect": "Clipboard content is incorrect.",
|
||||
"notifications-enabled": "Notifications enabled.",
|
||||
"notifications-permissions-error": "Notifications permission has been blocked as the user has dismissed the permission prompt several times. This can be reset in Page Info which can be accessed by clicking the lock icon next to the URL.",
|
||||
"link-received": "Link received by {{name}} - Click to open",
|
||||
"message-received": "Message received by {{name}} - Click to copy",
|
||||
"click-to-download": "Click to download",
|
||||
|
||||
159
public/lang/es.json
Normal file
159
public/lang/es.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"header": {
|
||||
"theme-auto_title": "Adaptar tema al sistema",
|
||||
"language-selector_title": "Configurar Idioma",
|
||||
"about_title": "Sobre PairDrop",
|
||||
"about_aria-label": "Abrir Sobre PairDrop",
|
||||
"cancel-paste-mode": "Listo",
|
||||
"install_title": "Instalar PairDrop",
|
||||
"theme-dark_title": "Siempre usar tema oscuro",
|
||||
"pair-device_title": "Empareja tus dispositivos permanentemente",
|
||||
"join-public-room_title": "Unirse a una sala pública temporalmente",
|
||||
"notification_title": "Activar notificaciones",
|
||||
"edit-paired-devices_title": "Editar dispositivos emparejados",
|
||||
"theme-light_title": "Siempre usar tema claro"
|
||||
},
|
||||
"footer": {
|
||||
"webrtc": "si WebRTC no está disponible.",
|
||||
"public-room-devices_title": "Puedes ser descubierto por dispositivos en esta sala pública independientemente de la red.",
|
||||
"display-name_data-placeholder": "Cargando…",
|
||||
"display-name_title": "Edita el nombre de tu dispositivo de forma permanente",
|
||||
"traffic": "El tráfico es",
|
||||
"paired-devices_title": "Puedes ser descubierto por los dispositivos emparejados todo el tiempo independientemente de la red.",
|
||||
"public-room-devices": "en la sala {{roomId}}",
|
||||
"paired-devices": "por dispositivos emparejados",
|
||||
"on-this-network": "en esta red",
|
||||
"routed": "enrutado a través del servidor",
|
||||
"discovery": "Puedes ser descubierto:",
|
||||
"on-this-network_title": "Puedes ser descubierto por todos en esta red.",
|
||||
"known-as": "Eres conocido como:"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}} quiere transferir {{count}} {{descriptor}}",
|
||||
"unfinished-transfers-warning": "Hay transferencias no terminadas. ¿Estás seguro de que quieres cerrar PairDrop?",
|
||||
"message-received": "Mensaje recibido por {{name}} - Haga clic para copiar",
|
||||
"rate-limit-join-key": "Límite de intentos alcanzado. Espere 10 segundos y vuelva a intentarlo.",
|
||||
"connecting": "Conectando…",
|
||||
"pairing-key-invalidated": "Clave {{key}} invalidada.",
|
||||
"pairing-key-invalid": "Clave inválida",
|
||||
"connected": "Connectado.",
|
||||
"pairing-not-persistent": "Los dispositivos emparejados no son persistentes.",
|
||||
"text-content-incorrect": "El contenido del texto es incorrecto.",
|
||||
"message-transfer-completed": "Transferencia de mensaje completada.",
|
||||
"file-transfer-completed": "Transferencia de archivos completada.",
|
||||
"file-content-incorrect": "El contenido del archivo es incorrecto.",
|
||||
"files-incorrect": "Los archivos son incorrectos.",
|
||||
"selected-peer-left": "El dispositivo seleccionado se fue.",
|
||||
"link-received": "Link recibido por {{name}} - Haga clic para abrir",
|
||||
"online": "Estás de nuevo en línea",
|
||||
"public-room-left": "Salió de la sala pública {{publicRoomId}}",
|
||||
"copied-text": "Texto copiado al portapapeles",
|
||||
"display-name-random-again": "El nombre mostrado se genera aleatoriamente nuevamente.",
|
||||
"display-name-changed-permanently": "El nombre para mostrar se ha cambiado permanentemente.",
|
||||
"copied-to-clipboard-error": "No es posible copiarlo. Cópielo manualmente.",
|
||||
"pairing-success": "Dispositivos emparejados.",
|
||||
"clipboard-content-incorrect": "El contenido del portapapeles es incorrecto.",
|
||||
"display-name-changed-temporarily": "El nombre mostrado se cambia solo para esta sesión.",
|
||||
"copied-to-clipboard": "Copiado al portapapeles",
|
||||
"offline": "Estás desconectado",
|
||||
"pairing-tabs-error": "Emparejar dos pestañas del navegador es imposible.",
|
||||
"public-room-id-invalid": "ID de sala no válido",
|
||||
"click-to-download": "Haga clic para descargar",
|
||||
"pairing-cleared": "Todos los dispositivos han sido desemparejados.",
|
||||
"notifications-enabled": "Notificaciones habilitadas.",
|
||||
"online-requirement-pairing": "Debes estar en línea para emparejar dispositivos.",
|
||||
"ios-memory-limit": "Enviar archivos a iOS sólo admite hasta 200 MB a la vez",
|
||||
"online-requirement-public-room": "Debes estar en línea para crear una sala pública.",
|
||||
"copied-text-error": "Error al escribir en el portapapeles. ¡Cópielo manualmente!",
|
||||
"download-successful": "{{descriptor}} descargado",
|
||||
"click-to-show": "Click para mostrar"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Toque para enviar archivos o toque prologádamente para enviar un mensaje",
|
||||
"click-to-send": "Haga clic para enviar",
|
||||
"activate-paste-mode-and-other-files": "y {{count}} archivos diferentes",
|
||||
"tap-to-send": "Toca para enviar",
|
||||
"activate-paste-mode-base": "Abra PairDrop en otros dispositivos para enviar",
|
||||
"no-peers-subtitle": "Empareje dispositivos o ingrese a una sala pública para que lo puedan encontrar en otras redes",
|
||||
"activate-paste-mode-shared-text": "texto compartido",
|
||||
"x-instructions_desktop": "Haga clic para enviar archivos o haga clic derecho para enviar un mensaje",
|
||||
"no-peers-title": "Abra PairDrop en otros dispositivos para enviar archivos",
|
||||
"x-instructions_data-drop-peer": "Liberar para enviar a un par",
|
||||
"x-instructions_data-drop-bg": "Liberar para seleccionar destinatario",
|
||||
"no-peers_data-drop-bg": "Liberar para seleccionar destinatario"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Procesando…",
|
||||
"click-to-send-paste-mode": "Haga clic para enviar {{descriptor}}",
|
||||
"click-to-send": "Haga clic para enviar archivos o haga clic derecho para enviar un mensaje",
|
||||
"waiting": "Esperando…",
|
||||
"connection-hash": "Para verificar la seguridad del cifrado de extremo a extremo, compare este número de seguridad en ambos dispositivos",
|
||||
"preparing": "Preparando…",
|
||||
"transferring": "Transferiendo…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "Pegar aquí para enviar {{type}}",
|
||||
"auto-accept-instructions-2": "para aceptar automáticamente todos los archivos enviados desde ese dispositivo.",
|
||||
"receive-text-title": "Mensaje Recibido",
|
||||
"edit-paired-devices-title": "Editar Dispositivos Emparejados",
|
||||
"cancel": "Cancelar",
|
||||
"auto-accept-instructions-1": "Activar",
|
||||
"pair-devices-title": "Emparejar dispositivos permanentemente",
|
||||
"download": "Descargar",
|
||||
"title-file": "Archivo",
|
||||
"base64-processing": "Procesando…",
|
||||
"decline": "Rechazar",
|
||||
"receive-title": "{{descriptor}} Recibido",
|
||||
"leave": "Salir",
|
||||
"join": "Unirse",
|
||||
"title-image-plural": "Imágenes",
|
||||
"send": "Enviar",
|
||||
"base64-tap-to-paste": "Toca aquí para pegar {{type}}",
|
||||
"base64-text": "texto",
|
||||
"copy": "Copiar",
|
||||
"file-other-description-image": "y una imagen mas",
|
||||
"temporary-public-room-title": "Sala pública temporal",
|
||||
"base64-files": "archivos",
|
||||
"has-sent": "ha enviado:",
|
||||
"file-other-description-file": "y otro archivo",
|
||||
"close": "Cerrar",
|
||||
"system-language": "Idioma del Sistema",
|
||||
"unpair": "Desemparejar",
|
||||
"title-image": "Imagen",
|
||||
"file-other-description-file-plural": "y {{count}} archivos más",
|
||||
"would-like-to-share": "quisiera compartir",
|
||||
"send-message-to": "Enviar un Mensaje a",
|
||||
"language-selector-title": "Configurar Idioma",
|
||||
"pair": "Emparejar",
|
||||
"hr-or": "O",
|
||||
"scan-qr-code": "o escanea el código QR.",
|
||||
"input-key-on-this-device": "Ingrese esta clave en otro dispositivo",
|
||||
"download-again": "Descargar de nuevo",
|
||||
"accept": "Aceptar",
|
||||
"paired-devices-wrapper_data-empty": "Sin dispositivos emparejados.",
|
||||
"enter-key-from-another-device": "Ingresa la clave de otro dispositivo aquí.",
|
||||
"share": "Compartir",
|
||||
"auto-accept": "aceptar automáticamente",
|
||||
"title-file-plural": "Archivos",
|
||||
"send-message-title": "Enviar Mensaje",
|
||||
"input-room-id-on-another-device": "Ingrese el ID de esta sala en otro dispositivo",
|
||||
"file-other-description-image-plural": "y {{count}} imágenes más",
|
||||
"enter-room-id-from-another-device": "Ingresa el ID de la sala desde otro dispositivo para unirte a la sala."
|
||||
},
|
||||
"about": {
|
||||
"claim": "La forma más sencilla de transferir archivos entre dispositivos",
|
||||
"tweet_title": "Tweetea sobre PairDrop",
|
||||
"close-about_aria-label": "Cerrar Sobre PairDrop",
|
||||
"buy-me-a-coffee_title": "¡Cómprame un café!",
|
||||
"github_title": "PairDrop en GitHub",
|
||||
"faq_title": "Preguntas frecuentes"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Transferencia de archivos solicitada",
|
||||
"image-transfer-requested": "Transferencia de imagen solicitada",
|
||||
"message-received-plural": "{{count}} Mensajes recibidos",
|
||||
"message-received": "Mensaje recibido",
|
||||
"file-received": "Archivo Recibido",
|
||||
"file-received-plural": "{{count}} Archivos Recibidos"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"header": {
|
||||
"about_title": "A propos de",
|
||||
"about_title": "À propos de PairDrop",
|
||||
"language-selector_title": "Choix de la langue",
|
||||
"about_aria-label": "Ouvrir à propos de",
|
||||
"about_aria-label": "Ouvrir à propos de PairDrop",
|
||||
"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",
|
||||
@@ -28,10 +28,10 @@
|
||||
"activate-paste-mode-shared-text": "texte partagé"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Vous êtes connu sous le nom de:",
|
||||
"known-as": "Vous êtes connu comme :",
|
||||
"display-name_data-placeholder": "Chargement…",
|
||||
"display-name_title": "Modifiez le nom de votre appareil de manière permanente",
|
||||
"discovery": "Vous pouvez être découvert:",
|
||||
"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",
|
||||
@@ -66,7 +66,7 @@
|
||||
"would-like-to-share": "aimerait partager",
|
||||
"accept": "Accepter",
|
||||
"decline": "Refuser",
|
||||
"has-sent": "a envoyé:",
|
||||
"has-sent": "a envoyé :",
|
||||
"share": "Partage",
|
||||
"download": "Télécharger",
|
||||
"send-message-title": "Envoyer un message",
|
||||
@@ -89,14 +89,14 @@
|
||||
"title-file-plural": "Fichiers",
|
||||
"receive-title": "{{descriptor}} Reçu",
|
||||
"download-again": "Télécharger à nouveau",
|
||||
"language-selector-title": "Sélectionnez la langue",
|
||||
"language-selector-title": "Définir 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é!",
|
||||
"buy-me-a-coffee_title": "Acheté-moi un café !",
|
||||
"tweet_title": "Tweet à propos de PairDrop",
|
||||
"faq_title": "Questions fréquemment posées"
|
||||
},
|
||||
@@ -125,7 +125,7 @@
|
||||
"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!",
|
||||
"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é.",
|
||||
@@ -136,9 +136,9 @@
|
||||
"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?",
|
||||
"unfinished-transfers-warning": "Il y a des transferts inachevés. Êtes-vous sûr de vouloir fermer PairDrop ?",
|
||||
"rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",
|
||||
"selected-peer-left": "Appareils selectionnés restants."
|
||||
"selected-peer-left": "Appareils sélectionnés restants."
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "Fichier reçu",
|
||||
|
||||
@@ -56,17 +56,17 @@
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "Selesai",
|
||||
"theme-auto_title": "Sesuaikan Tema dengan Sistem",
|
||||
"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",
|
||||
"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": "Atur Bahasa",
|
||||
"about_title": "Tentang PairDrop",
|
||||
"about_aria-label": "Buka Tentang PairDrop",
|
||||
"theme-light_title": "Selalu Gunakan Tema Terang"
|
||||
"theme-light_title": "Selalu gunakan tema terang"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan",
|
||||
@@ -153,6 +153,7 @@
|
||||
"message-received-plural": "{{count}} Pesan Diterima",
|
||||
"message-received": "Pesan Diterima",
|
||||
"file-received": "File Diterima",
|
||||
"file-received-plural": "{{count}} File Diterima"
|
||||
"file-received-plural": "{{count}} File Diterima",
|
||||
"image-transfer-requested": "Permintaan Transfer Gambar"
|
||||
}
|
||||
}
|
||||
|
||||
159
public/lang/it.json
Normal file
159
public/lang/it.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "se WebRTC non è disponibile.",
|
||||
"public-room-devices_title": "Puoi essere rilevato dai dispositivi presenti in questa stanza pubblica indipendentemente dalla rete.",
|
||||
"display-name_data-placeholder": "Caricamento…",
|
||||
"display-name_title": "Modifica il nome del tuo dispositivo permanentemente",
|
||||
"traffic": "Il traffico è",
|
||||
"paired-devices_title": "Puoi essere rilevato dai dispositivi abbinati in ogni momento, indipendentemente dalla rete.",
|
||||
"public-room-devices": "nella stanza {{roomId}}",
|
||||
"paired-devices": "da dispositivi abbinati",
|
||||
"on-this-network": "su questa rete",
|
||||
"routed": "instradato attraverso il server",
|
||||
"discovery": "Puoi essere rilevato:",
|
||||
"on-this-network_title": "puoi essere rilevato da chiunque su questa rete.",
|
||||
"known-as": "Sei visibile come:"
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "Fatto",
|
||||
"theme-auto_title": "Adatta il tema al sistema automaticamente",
|
||||
"install_title": "Installa PairDrop",
|
||||
"theme-dark_title": "Usa sempre il tema scuro",
|
||||
"pair-device_title": "Abbina i tuoi dispositivi permanentemente",
|
||||
"join-public-room_title": "Unisciti ad una stanza pubblica temporaneamente",
|
||||
"notification_title": "Attiva notifiche",
|
||||
"edit-paired-devices_title": "Modifica i dispositivi abbinati",
|
||||
"language-selector_title": "Imposta Lingua",
|
||||
"about_title": "Informazioni su PairDrop",
|
||||
"about_aria-label": "Apri Informazioni su PairDrop",
|
||||
"theme-light_title": "Usa sempre il tema chiaro"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Tocca per inviare file o tocco prolungato per inviare un messaggio",
|
||||
"click-to-send": "Clicca per inviare",
|
||||
"activate-paste-mode-and-other-files": "e altri {{count}} files",
|
||||
"tap-to-send": "Tocca per inviare",
|
||||
"activate-paste-mode-base": "Apri PairDrop su altri dispositivi per inviare",
|
||||
"no-peers-subtitle": "Abbina dispositivi o entra in una stanza pubblica per essere rilevabile su altre reti",
|
||||
"activate-paste-mode-shared-text": "testo condiviso",
|
||||
"x-instructions_desktop": "Clicca per inviare files o usa il tasto destro per inviare un messaggio",
|
||||
"no-peers-title": "Apri PairDrop su altri dispositivi per inviare files",
|
||||
"x-instructions_data-drop-peer": "Rilascia per inviare al peer",
|
||||
"x-instructions_data-drop-bg": "Rilascia per selezionare il destinatario",
|
||||
"no-peers_data-drop-bg": "Rilascia per selezionare il destinatario"
|
||||
},
|
||||
"dialogs": {
|
||||
"auto-accept-instructions-2": "per accettare automaticamente tutti i files inviati da quel dispositivo.",
|
||||
"edit-paired-devices-title": "Modifica Dispositivi Abbinati",
|
||||
"cancel": "Annulla",
|
||||
"auto-accept-instructions-1": "Attiva",
|
||||
"pair-devices-title": "Abbina Dispositivi Permanentemente",
|
||||
"temporary-public-room-title": "Stanza Pubblica Temporanea",
|
||||
"close": "Chiudi",
|
||||
"unpair": "Dissocia",
|
||||
"pair": "Abbina",
|
||||
"scan-qr-code": "o scannerizza il codice QR.",
|
||||
"input-key-on-this-device": "Inserisci questo codice su un altro dispositivo",
|
||||
"paired-devices-wrapper_data-empty": "Nessun dispositivo abbinato.",
|
||||
"enter-key-from-another-device": "Inserisci il codice dell'altro dispositivo qui.",
|
||||
"auto-accept": "accetta-automaticamente",
|
||||
"input-room-id-on-another-device": "Inserisci l'ID di questa stanza su un altro dispositivo",
|
||||
"enter-room-id-from-another-device": "Inserisci l'ID stanza da un altro dispositivo per accedere alla stanza.",
|
||||
"base64-paste-to-send": "Incolla qui per inviare {{type}}",
|
||||
"receive-text-title": "Messaggio Ricevuto",
|
||||
"download": "Scarica",
|
||||
"title-file": "File",
|
||||
"base64-processing": "Elaborazione…",
|
||||
"decline": "Rifiuta",
|
||||
"receive-title": "{{descriptor}} Ricevuto",
|
||||
"leave": "Abbandona",
|
||||
"join": "Unisciti",
|
||||
"title-image-plural": "Immagini",
|
||||
"send": "Invia",
|
||||
"base64-tap-to-paste": "Tocca qui per incollare {{type}}",
|
||||
"base64-text": "testo",
|
||||
"copy": "Copia",
|
||||
"file-other-description-image": "e 1 altra immagine",
|
||||
"base64-files": "files",
|
||||
"has-sent": "ha inviato:",
|
||||
"file-other-description-file": "ed 1 altro file",
|
||||
"system-language": "Lingua di Sistema",
|
||||
"title-image": "Immagine",
|
||||
"file-other-description-file-plural": "e altri {{count}} files",
|
||||
"would-like-to-share": "vorrebbe condividere",
|
||||
"send-message-to": "Invia un messaggio a",
|
||||
"language-selector-title": "Imposta Lingua",
|
||||
"hr-or": "OPPURE",
|
||||
"download-again": "Scarica ancora",
|
||||
"accept": "Accetta",
|
||||
"share": "Condividi",
|
||||
"title-file-plural": "Files",
|
||||
"send-message-title": "Invia Messaggio",
|
||||
"file-other-description-image-plural": "e {{count}} altre immagini"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}} vorrebbe trasferire {{count}} {{descriptor}}",
|
||||
"unfinished-transfers-warning": "Ci sono dei trasferimenti in corso. Sei sicuro di voler chiudere PairDrop?",
|
||||
"message-received": "Messaggio ricevuto da {{name}} - Clicca per copiare",
|
||||
"rate-limit-join-key": "Limite raggiunto. Aspetta 10 secondi e riprova.",
|
||||
"connecting": "Connessione…",
|
||||
"pairing-key-invalidated": "Il codice {{key}} è stato invalidato.",
|
||||
"pairing-key-invalid": "Codice non valido",
|
||||
"connected": "Connesso.",
|
||||
"pairing-not-persistent": "I dispositivi abbinati non sono persistenti.",
|
||||
"text-content-incorrect": "Il contenuto testuale non è corretto.",
|
||||
"message-transfer-completed": "Trasferimento del messaggio completato.",
|
||||
"file-transfer-completed": "Trasferimento file completato.",
|
||||
"file-content-incorrect": "Il contenuto del file non è corretto.",
|
||||
"files-incorrect": "I file non sono corretti.",
|
||||
"selected-peer-left": "Peer selezionato ha abbandonato.",
|
||||
"link-received": "Link ricevuto da {{name}} - Clicca per aprire",
|
||||
"online": "Sei di nuovo online",
|
||||
"public-room-left": "Ha lasciato la stanza pubblica {{publicRoomId}}",
|
||||
"copied-text": "Testo copiato negli appunti",
|
||||
"display-name-random-again": "Il nome visualizzato è generato casualmente un'altra volta.",
|
||||
"display-name-changed-permanently": "Il nome visualizzato è cambiato permanentemente.",
|
||||
"copied-to-clipboard-error": "La copia non è possibile. Copia manualmente.",
|
||||
"pairing-success": "Dispositivi abbinati.",
|
||||
"clipboard-content-incorrect": "Il contenuto copiato non è corretto.",
|
||||
"display-name-changed-temporarily": "Il nome visualizzato è cambiato solo per questa sessione.",
|
||||
"copied-to-clipboard": "Copiato negli appunti",
|
||||
"offline": "Sei offline",
|
||||
"pairing-tabs-error": "Abbinare due schede del browser è impossibile.",
|
||||
"public-room-id-invalid": "ID stanza non valido",
|
||||
"click-to-download": "Clicca per scaricare",
|
||||
"pairing-cleared": "Tutti i dispositivi sono stati dissociati.",
|
||||
"notifications-enabled": "Notifiche attivate.",
|
||||
"online-requirement-pairing": "Devi essere online per abbinare dispositivi.",
|
||||
"ios-memory-limit": "L'invio di file a dispositivi iOS è possibile solo 200 MB alla volta",
|
||||
"online-requirement-public-room": "Devi essere online per creare una stanza pubblica.",
|
||||
"copied-text-error": "Scrittura negli appunti fallita. Copia manualmente!",
|
||||
"download-successful": "{{descriptor}} scaricato",
|
||||
"click-to-show": "Clicca per mostrare"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Elaborazione…",
|
||||
"click-to-send-paste-mode": "Clicca per inviare {{descriptor}}",
|
||||
"click-to-send": "Clicca per inviare files o tasto destro per inviare un messaggio",
|
||||
"waiting": "In attesa…",
|
||||
"connection-hash": "Per verificare la sicurezza della crittografia end-to-end, confronta questo numero di sicurezza su entrambi i dispositivi",
|
||||
"preparing": "Preparazione…",
|
||||
"transferring": "Trasferimento…"
|
||||
},
|
||||
"about": {
|
||||
"claim": "Il modo più semplice per trasferire files tra dispositivi",
|
||||
"tweet_title": "Twitta riguardo PairDrop",
|
||||
"close-about_aria-label": "Chiudi Informazioni su PairDrop",
|
||||
"buy-me-a-coffee_title": "Comprami un caffè!",
|
||||
"github_title": "PairDrop su GitHub",
|
||||
"faq_title": "Domande Frequenti"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Trasferimento File Richiesto",
|
||||
"image-transfer-requested": "Trasferimento Immagine Richiesto",
|
||||
"message-received-plural": "{{count}} Messaggi ricevuti",
|
||||
"message-received": "Messaggio ricevuto",
|
||||
"file-received": "File Ricevuto",
|
||||
"file-received-plural": "{{count}} Files Ricevuti"
|
||||
}
|
||||
}
|
||||
159
public/lang/ja.json
Normal file
159
public/lang/ja.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "WebRTCが利用できない場合。",
|
||||
"public-room-devices_title": "このデバイスはネットワークと関係なく、このパブリックルームのデバイスにより発見される可能性があります。",
|
||||
"display-name_data-placeholder": "読み込み中…",
|
||||
"display-name_title": "恒久的なデバイス名を編集する",
|
||||
"traffic": "トラフィックは",
|
||||
"paired-devices_title": "このデバイスはネットワークと関係なく、常にペア設定したデバイスにより発見される可能性があります。",
|
||||
"public-room-devices": "ルーム{{roomId}}上",
|
||||
"paired-devices": "ペア設定したデバイス",
|
||||
"on-this-network": "このネットワーク上",
|
||||
"routed": "サーバーを経由します",
|
||||
"discovery": "このデバイスは以下で発見される可能性があります:",
|
||||
"on-this-network_title": "このデバイスはこのネットワーク上の誰にでも発見される可能性があります。",
|
||||
"known-as": "他のデバイスに表示される名前:"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}}は{{count}}個の{{descriptor}}を共有しようとしています",
|
||||
"unfinished-transfers-warning": "未完了の転送があります。本当にPairDropを終了しますか?",
|
||||
"message-received": "{{name}}から受信したメッセージ(クリックしてコピー)",
|
||||
"rate-limit-join-key": "レート制限に到達しました。10秒待ってから再度お試しください。",
|
||||
"connecting": "接続中…",
|
||||
"pairing-key-invalidated": "コード{{key}}が失効しました。",
|
||||
"pairing-key-invalid": "無効なコード",
|
||||
"connected": "接続しました。",
|
||||
"pairing-not-persistent": "ペア設定されたデバイスは恒久化されていません。",
|
||||
"text-content-incorrect": "テキストの内容が不正です。",
|
||||
"message-transfer-completed": "メッセージの送信が完了しました。",
|
||||
"file-transfer-completed": "ファイルの転送が完了しました。",
|
||||
"file-content-incorrect": "ファイルの内容が不正です。",
|
||||
"files-incorrect": "ファイルが間違っています。",
|
||||
"selected-peer-left": "選択した相手が退出しました。",
|
||||
"link-received": "{{name}}から受信したリンク(クリックして開く)",
|
||||
"online": "オンラインに復帰しました",
|
||||
"public-room-left": "パブリックルーム{{publicRoomId}}から退出しました",
|
||||
"copied-text": "テキストをクリップボードにコピーしました",
|
||||
"display-name-random-again": "表示名がもう一度ランダムに生成されました。",
|
||||
"display-name-changed-permanently": "恒久的な表示名が変更されました。",
|
||||
"copied-to-clipboard-error": "コピーできませんでした。手動でコピーしてください。",
|
||||
"pairing-success": "デバイスがペア設定されました。",
|
||||
"clipboard-content-incorrect": "クリップボードの内容が不正です。",
|
||||
"display-name-changed-temporarily": "このセッションでの表示名が変更されました。",
|
||||
"copied-to-clipboard": "クリップボードにコピーしました",
|
||||
"offline": "オフラインです",
|
||||
"pairing-tabs-error": "同じWebブラウザーの2つのタブをペア設定することはできません。",
|
||||
"public-room-id-invalid": "無効なルームID",
|
||||
"click-to-download": "クリックしてダウンロード",
|
||||
"pairing-cleared": "全てのデバイスのペア設定を解除しました。",
|
||||
"notifications-enabled": "通知が有効です。",
|
||||
"online-requirement-pairing": "デバイスをペア設定するにはオンラインである必要があります。",
|
||||
"ios-memory-limit": "iOSへのファイル送信は一度に200MBまでしかできません",
|
||||
"online-requirement-public-room": "パブリックルームを作成するにはオンラインである必要があります。",
|
||||
"copied-text-error": "クリップボードにコピーできませんでした。手動でコピーしてください。",
|
||||
"download-successful": "{{descriptor}}をダウンロードしました",
|
||||
"click-to-show": "クリックして表示"
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "完了",
|
||||
"theme-auto_title": "テーマをシステムの設定に自動的に合わせる",
|
||||
"install_title": "PairDropをインストール",
|
||||
"theme-dark_title": "常にダークテーマを使用する",
|
||||
"pair-device_title": "あなたのデバイスを恒久的にペア設定する",
|
||||
"join-public-room_title": "パブリックルームに一時的に参加する",
|
||||
"notification_title": "通知を有効にする",
|
||||
"edit-paired-devices_title": "ペア設定したデバイスを編集する",
|
||||
"language-selector_title": "言語を設定",
|
||||
"about_title": "PairDropについて",
|
||||
"about_aria-label": "PairDropについてを開く",
|
||||
"theme-light_title": "常にライトテーマを使用する"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "タップしてファイルを送信または長押ししてメッセージを送信します",
|
||||
"click-to-send": "クリックして送信",
|
||||
"activate-paste-mode-and-other-files": "とその他{{count}}個のファイル",
|
||||
"tap-to-send": "タップして送信",
|
||||
"activate-paste-mode-base": "他のデバイスでPairDropを開いて送信します",
|
||||
"no-peers-subtitle": "デバイスをペア設定するかパブリックルームに参加すると、他のネットワーク上からも見つけられるようになります",
|
||||
"activate-paste-mode-shared-text": "共有されたテキスト",
|
||||
"x-instructions_desktop": "左クリックしてファイルを送信または右クリックしてメッセージを送信します",
|
||||
"no-peers-title": "他のデバイスでPairDropを開いてファイルを送信します",
|
||||
"x-instructions_data-drop-peer": "離すとこの相手に送信します",
|
||||
"x-instructions_data-drop-bg": "送信したい相手の上で離してください",
|
||||
"no-peers_data-drop-bg": "送信したい相手の上で離してください"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "処理中…",
|
||||
"click-to-send-paste-mode": "クリックして{{descriptor}}を送信",
|
||||
"click-to-send": "クリックしてファイルを送信または右クリックしてメッセージを送信します",
|
||||
"waiting": "待機中…",
|
||||
"connection-hash": "エンドツーエンド暗号化のセキュリティを確認するには、両方のデバイスのセキュリティナンバーを確認します",
|
||||
"preparing": "準備中…",
|
||||
"transferring": "転送中…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "ここをタップして{{type}}を送信",
|
||||
"auto-accept-instructions-2": "このデバイスから送信される全てのファイルを自動的に承諾します。",
|
||||
"receive-text-title": "メッセージを受信しました",
|
||||
"edit-paired-devices-title": "ペア設定したデバイスを編集",
|
||||
"cancel": "キャンセル",
|
||||
"auto-accept-instructions-1": "有効化",
|
||||
"pair-devices-title": "デバイスを恒久的にペア設定する",
|
||||
"download": "ダウンロード",
|
||||
"title-file": "ファイル",
|
||||
"base64-processing": "処理中…",
|
||||
"decline": "拒否",
|
||||
"receive-title": "{{descriptor}}を受信しました",
|
||||
"leave": "退出",
|
||||
"join": "参加",
|
||||
"title-image-plural": "複数の画像",
|
||||
"send": "送信",
|
||||
"base64-tap-to-paste": "ここをタップして{{type}}を貼り付け",
|
||||
"base64-text": "テキスト",
|
||||
"copy": "コピー",
|
||||
"file-other-description-image": "と1個の他の画像",
|
||||
"temporary-public-room-title": "一時的なパブリックルーム",
|
||||
"base64-files": "ファイル",
|
||||
"has-sent": "が送信しました:",
|
||||
"file-other-description-file": "と1個の他のファイル",
|
||||
"close": "閉じる",
|
||||
"system-language": "システムの言語",
|
||||
"unpair": "ペア解除",
|
||||
"title-image": "画像",
|
||||
"file-other-description-file-plural": "と{{count}}個の他のファイル",
|
||||
"would-like-to-share": "が以下のファイルを共有しようとしています",
|
||||
"send-message-to": "このデバイスにメッセージを送信:",
|
||||
"language-selector-title": "言語を設定",
|
||||
"pair": "ペア設定",
|
||||
"hr-or": "または",
|
||||
"scan-qr-code": "もしくはQRコードをスキャンします。",
|
||||
"input-key-on-this-device": "このキーを他のデバイスに入力する",
|
||||
"download-again": "もう一度ダウンロードする",
|
||||
"accept": "承諾",
|
||||
"paired-devices-wrapper_data-empty": "ペア設定したデバイスはありません。",
|
||||
"enter-key-from-another-device": "他のデバイスに表示されたキーをここに入力します。",
|
||||
"share": "共有",
|
||||
"auto-accept": "自動承諾",
|
||||
"title-file-plural": "複数のファイル",
|
||||
"send-message-title": "メッセージを送信",
|
||||
"input-room-id-on-another-device": "このルームIDを他のデバイスに入力します",
|
||||
"file-other-description-image-plural": "と{{count}}個の他の画像",
|
||||
"enter-room-id-from-another-device": "他のデバイスに表示された参加したいルームのIDを入力します。"
|
||||
},
|
||||
"about": {
|
||||
"claim": "デバイス間でファイルを転送する最も簡単な方法",
|
||||
"tweet_title": "PairDropについてツイートする",
|
||||
"close-about_aria-label": "PairDropについてを閉じる",
|
||||
"buy-me-a-coffee_title": "コーヒーをおごってください!",
|
||||
"github_title": "GitHubでPairDropを見る",
|
||||
"faq_title": "FAQ"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "ファイルの転送がリクエストされました",
|
||||
"image-transfer-requested": "画像の転送がリクエストされました",
|
||||
"message-received-plural": "{{count}}個のメッセージを受信しました",
|
||||
"message-received": "メッセージを受信しました",
|
||||
"file-received": "ファイルを受信しました",
|
||||
"file-received-plural": "{{count}}個のファイルを受信しました"
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@
|
||||
"pair-devices-title": "Sammenkoble enheter",
|
||||
"would-like-to-share": "ønsker å dele",
|
||||
"auto-accept-instructions-2": "for å godkjenne alle filer sendt fra den enheten automatisk.",
|
||||
"paired-devices-wrapper_data-empty": "Ingen sammenkoblede enheter",
|
||||
"paired-devices-wrapper_data-empty": "Ingen sammenkoblede enheter.",
|
||||
"enter-key-from-another-device": "Skriv inn nøkkel fra en annen enhet for å fortsette.",
|
||||
"edit-paired-devices-title": "Rediger sammenkoblede enheter",
|
||||
"accept": "Godta",
|
||||
@@ -113,7 +113,7 @@
|
||||
"clipboard-content-incorrect": "Utklippstavleinnholdet er uriktig.",
|
||||
"link-received": "Lenke mottatt av {{name}} - Klikk for å åpne.",
|
||||
"request-title": "{{name}} ønsker å overføre {{count}} {{descriptor}}",
|
||||
"message-received": "Melding mottatt av {{name}} - Klikk for å åpne.",
|
||||
"message-received": "Melding mottatt av {{name}} - Klikk for å åpne",
|
||||
"files-incorrect": "Filene er uriktige.",
|
||||
"ios-memory-limit": "Forsendelse av filer til iOS er kun mulig opptil 200 MB av gangen.",
|
||||
"unfinished-transfers-warning": "Lukk med ufullførte overføringer?",
|
||||
|
||||
159
public/lang/nl.json
Normal file
159
public/lang/nl.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "als WebRTC niet beschikbaar is.",
|
||||
"public-room-devices_title": "U kan door apparaten gevonden worden in deze openbare ruimte, ongeacht van het netwerk.",
|
||||
"display-name_data-placeholder": "Laden…",
|
||||
"display-name_title": "Bewerk uw apparaatnaam permanent",
|
||||
"traffic": "Dataverkeer is",
|
||||
"paired-devices_title": "U kan gevonden worden door gekoppelde apparaten, ongeacht van het netwerk.",
|
||||
"public-room-devices": "in kamer {{roomId}}",
|
||||
"paired-devices": "door gekoppelde apparaten",
|
||||
"on-this-network": "op dit netwerk",
|
||||
"routed": "door de server geleid",
|
||||
"discovery": "U bent zichtbaar:",
|
||||
"on-this-network_title": "U kan door iedereen gevonden worden op dit netwerk.",
|
||||
"known-as": "U staat bekend als:"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}} zou graag {{count}}{{descriptor}} overdragen",
|
||||
"unfinished-transfers-warning": "Nog niet alle overdrachten zijn compleet. Weet u zeker dat u PairDrop sluiten?",
|
||||
"message-received": "Bericht ontvangen van {{name}} - Klik om te kopiëren",
|
||||
"rate-limit-join-key": "Tempolimiet bereikt. Wacht 10 seconde en probeer opnieuw.",
|
||||
"connecting": "Verbinden…",
|
||||
"pairing-key-invalidated": "Sleutel {{key}} ongeldig.",
|
||||
"pairing-key-invalid": "Ongeldige sleutel",
|
||||
"connected": "Verbonden.",
|
||||
"pairing-not-persistent": "Gekoppelde apparaten zijn niet persistent.",
|
||||
"text-content-incorrect": "Tekst inhoud is incorrect.",
|
||||
"message-transfer-completed": "Berichtsoverdracht compleet.",
|
||||
"file-transfer-completed": "Bestandsoverdracht compleet.",
|
||||
"file-content-incorrect": "Bestandsinhoud is incorrect.",
|
||||
"files-incorrect": "Bestanden zijn incorrect.",
|
||||
"selected-peer-left": "Gekozen peer is vertrokken.",
|
||||
"link-received": "Link van {{name}} ontvangen - Klik om te openen",
|
||||
"online": "U bent terug online",
|
||||
"public-room-left": "Openbare ruimte {{publicRoomId}} verlaten",
|
||||
"copied-text": "Tekst naar klembord gekopieërd",
|
||||
"display-name-random-again": "De weergavenaam is opnieuw willekeurig gegenereerd.",
|
||||
"display-name-changed-permanently": "De weergavenaam is permanent gewijzigd.",
|
||||
"copied-to-clipboard-error": "Kopiëren is niet mogelijk. Kopieer handmatig.",
|
||||
"pairing-success": "Apparaten gekoppeld.",
|
||||
"clipboard-content-incorrect": "De inhoud van het klembord is incorrect.",
|
||||
"display-name-changed-temporarily": "De weergavenaam is alleen voor deze sessie gewijzigd.",
|
||||
"copied-to-clipboard": "Gekopieerd naar klembord",
|
||||
"offline": "U bent offline",
|
||||
"pairing-tabs-error": "Twee webbrowser tabbladen koppelen in is onmogelijk.",
|
||||
"public-room-id-invalid": "Ongeldig kamer ID",
|
||||
"click-to-download": "Klik om te downloaden",
|
||||
"pairing-cleared": "Alle apparaten ontkoppeld.",
|
||||
"notifications-enabled": "Meldingen geactiveerd.",
|
||||
"online-requirement-pairing": "U moet online zijn om apparaten te koppelen.",
|
||||
"ios-memory-limit": "Bestandsoverdrachten naar iOS kunnen slechts met 200 MB per keer",
|
||||
"online-requirement-public-room": "U moet online zijn om een openbare kamer te maken.",
|
||||
"copied-text-error": "Schrijven naar klembord mislukt. Kopieer handmatig!",
|
||||
"download-successful": "{{descriptor}} downloaden",
|
||||
"click-to-show": "Klik om te tonen"
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "Klaar",
|
||||
"theme-auto_title": "Gebruik systeemstijl",
|
||||
"install_title": "PairDrop installeren",
|
||||
"theme-dark_title": "Altijd donkere modus gebruiken",
|
||||
"pair-device_title": "Koppel uw apparaten permanent",
|
||||
"join-public-room_title": "Openbare ruimte tijdelijk betreden",
|
||||
"notification_title": "Meldingen inschakelen",
|
||||
"edit-paired-devices_title": "Gekoppelde apparaten bewerken",
|
||||
"language-selector_title": "Taal Selecteren",
|
||||
"about_title": "Over PairDrop",
|
||||
"about_aria-label": "Open Over PairDrop",
|
||||
"theme-light_title": "Altijd lichte modus gebruiken"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Tik om bestanden te versturen of houdt vast om een bericht te sturen",
|
||||
"click-to-send": "Klik om te verzenden",
|
||||
"activate-paste-mode-and-other-files": "en {{count}} andere bestanden",
|
||||
"tap-to-send": "Tik om te verzenden",
|
||||
"activate-paste-mode-base": "Open PairDrop op andere apparaten om te verzenden",
|
||||
"no-peers-subtitle": "Koppel apparaten of betreed een openbare ruimte om op andere netwerken zichtbaar te worden",
|
||||
"activate-paste-mode-shared-text": "gedeelde tekst",
|
||||
"x-instructions_desktop": "Klik om bestanden te versturen of rechtsklik om een bericht te sturen",
|
||||
"no-peers-title": "Open PairDrop op andere apparaten om bestanden te versturen",
|
||||
"x-instructions_data-drop-peer": "Laat los om naar peer te versturen",
|
||||
"x-instructions_data-drop-bg": "Loslaten om ontvanger te selecteren",
|
||||
"no-peers_data-drop-bg": "Loslaten om ontvanger te kiezen"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Verwerken…",
|
||||
"click-to-send-paste-mode": "Klik om {{descriptor}} te versturen",
|
||||
"click-to-send": "Klik om bestanden te versturen of rechtsklik om een bericht te versturen",
|
||||
"waiting": "Wachten…",
|
||||
"connection-hash": "Vergelijk dit veiligheidsnummer op beide apparaten, om de beveiliging van de eind-tot-eind versleuteling te verifiëren",
|
||||
"preparing": "Voorbereiden…",
|
||||
"transferring": "Overdragen…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "Plak hier om {{type}} te versturen",
|
||||
"auto-accept-instructions-2": "om automatisch alle bestanden van dat apparaat te accepteren.",
|
||||
"receive-text-title": "Bericht Ontvangen",
|
||||
"edit-paired-devices-title": "Gekoppelde Apparaten Bewerken",
|
||||
"cancel": "Annuleer",
|
||||
"auto-accept-instructions-1": "Activeer",
|
||||
"pair-devices-title": "Koppel Apparaten Permanent",
|
||||
"download": "Download",
|
||||
"title-file": "Bestand",
|
||||
"base64-processing": "Verwerken…",
|
||||
"decline": "Afwijzen",
|
||||
"receive-title": "{{descriptor}} Ontvangen",
|
||||
"leave": "Verlaten",
|
||||
"join": "Betreden",
|
||||
"title-image-plural": "Afbeeldingen",
|
||||
"send": "Verzenden",
|
||||
"base64-tap-to-paste": "Hier tikken om {{type}} te plakken",
|
||||
"base64-text": "tekst",
|
||||
"copy": "Kopiëren",
|
||||
"file-other-description-image": "en één andere afbeelding",
|
||||
"temporary-public-room-title": "Tijdelijke Openbare Ruimte",
|
||||
"base64-files": "bestanden",
|
||||
"has-sent": "stuurde het volgende:",
|
||||
"file-other-description-file": "en één ander bestand",
|
||||
"close": "Sluiten",
|
||||
"system-language": "Systeemtaal",
|
||||
"unpair": "Ontkoppel",
|
||||
"title-image": "Afbeelding",
|
||||
"file-other-description-file-plural": "en {{count}} andere bestanden",
|
||||
"would-like-to-share": "zou graag het volgende willen delen",
|
||||
"send-message-to": "Verstuur een bericht naar",
|
||||
"language-selector-title": "Taal Instellen",
|
||||
"pair": "Koppel",
|
||||
"hr-or": "OF",
|
||||
"scan-qr-code": "of scan de QR-code.",
|
||||
"input-key-on-this-device": "Voer deze sleutel in op een ander apparaat",
|
||||
"download-again": "Download opnieuw",
|
||||
"accept": "Accepteren",
|
||||
"paired-devices-wrapper_data-empty": "Geen gekoppelde apparaten.",
|
||||
"enter-key-from-another-device": "Voer hier de sleutel van een ander apparaat in.",
|
||||
"share": "Delen",
|
||||
"auto-accept": "automatisch-accepteren",
|
||||
"title-file-plural": "Bestanden",
|
||||
"send-message-title": "Bericht Sturen",
|
||||
"input-room-id-on-another-device": "Voer de kamer ID in op een ander apparaat",
|
||||
"file-other-description-image-plural": "en {{count}} andere afbeeldingen",
|
||||
"enter-room-id-from-another-device": "Voer de kamer ID van een ander apparaat hier in."
|
||||
},
|
||||
"about": {
|
||||
"claim": "De makkelijkste manier om bestanden tussen apparaten te versturen",
|
||||
"tweet_title": "Tweet over PairDrop",
|
||||
"close-about_aria-label": "Sluit Over PairDrop",
|
||||
"buy-me-a-coffee_title": "Koop een kopje koffie voor mij!",
|
||||
"github_title": "PairDrop op GitHub",
|
||||
"faq_title": "Veel gestelde vragen"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Bestandsoverdracht verzocht",
|
||||
"image-transfer-requested": "Afbeeldingsoverdracht verzocht",
|
||||
"message-received-plural": "{{count}} berichten ontvangen",
|
||||
"message-received": "Bericht ontvangen",
|
||||
"file-received": "Bestand ontvangen",
|
||||
"file-received-plural": "{{count}} bestanden ontvangen"
|
||||
}
|
||||
}
|
||||
@@ -56,12 +56,12 @@
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "Gata",
|
||||
"theme-auto_title": "Adaptează Tema la Sistem",
|
||||
"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",
|
||||
"notification_title": "Activați notificări",
|
||||
"edit-paired-devices_title": "Editați dispozitivele împerecheate",
|
||||
"language-selector_title": "Selectează Limba",
|
||||
"about_title": "Despre PairDrop",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"edit-paired-devices_title": "Редактировать связанные устройства",
|
||||
"notification_title": "Включить уведомления",
|
||||
"about_title": "О сервисе",
|
||||
"theme-auto_title": "Адаптировать тему к системной",
|
||||
"theme-auto_title": "Адаптировать тему к системной автоматически",
|
||||
"theme-dark_title": "Всегда использовать темную тему",
|
||||
"theme-light_title": "Всегда использовать светлую тему",
|
||||
"join-public-room_title": "Войти на время в публичную комнату",
|
||||
@@ -43,7 +43,7 @@
|
||||
"on-this-network_title": "Вы можете быть обнаружены кем угодно в этой сети."
|
||||
},
|
||||
"dialogs": {
|
||||
"edit-paired-devices-title": "Редактировать связанные устройства",
|
||||
"edit-paired-devices-title": "Редактировать Связанные Устройства",
|
||||
"auto-accept": "автоприем",
|
||||
"close": "Закрыть",
|
||||
"decline": "Отклонить",
|
||||
@@ -83,7 +83,7 @@
|
||||
"receive-title": "{{descriptor}} получен",
|
||||
"system-language": "Язык системы",
|
||||
"unpair": "Отвязать",
|
||||
"language-selector-title": "Выбрать язык",
|
||||
"language-selector-title": "Установить язык",
|
||||
"hr-or": "ИЛИ",
|
||||
"input-room-id-on-another-device": "На другом устройстве введите этот ID комнаты",
|
||||
"leave": "Покинуть",
|
||||
@@ -155,6 +155,7 @@
|
||||
"message-received-plural": "{{count}} сообщений получено",
|
||||
"file-received": "Файл получен",
|
||||
"file-transfer-requested": "Запрошена передача файлов",
|
||||
"message-received": "Сообщение получено"
|
||||
"message-received": "Сообщение получено",
|
||||
"image-transfer-requested": "Запрошена передача изображений"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"edit-paired-devices_title": "管理已配对设备",
|
||||
"cancel-paste-mode": "完成",
|
||||
"join-public-room_title": "暂时加入公共房间",
|
||||
"language-selector_title": "选择语言"
|
||||
"language-selector_title": "设置语言"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_data-drop-peer": "释放以发送到此设备",
|
||||
@@ -83,7 +83,7 @@
|
||||
"download-again": "再次保存",
|
||||
"system-language": "跟随系统语言",
|
||||
"unpair": "取消配对",
|
||||
"language-selector-title": "选择语言",
|
||||
"language-selector-title": "设置语言",
|
||||
"hr-or": "或者",
|
||||
"input-room-id-on-another-device": "在另一个设备上输入这串房间号",
|
||||
"leave": "离开",
|
||||
@@ -145,7 +145,8 @@
|
||||
"message-received-plural": "收到 {{count}} 条信息",
|
||||
"file-transfer-requested": "文件传输请求",
|
||||
"file-received-plural": "收到 {{count}} 个文件",
|
||||
"file-received": "收到文件"
|
||||
"file-received": "收到文件",
|
||||
"image-transfer-requested": "图片传输请求"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send-paste-mode": "点击发送 {{descriptor}}",
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
class Localization {
|
||||
constructor() {
|
||||
Localization.defaultLocale = "en";
|
||||
Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de", "ro", "id", "fr"];
|
||||
Localization.supportedLocales = ["ar", "de", "en", "es", "fr", "id", "it", "ja", "nb", "nl", "ro", "ru", "zh-CN"];
|
||||
Localization.supportedLocalesRTL = ["ar"];
|
||||
|
||||
Localization.translations = {};
|
||||
Localization.defaultTranslations = {};
|
||||
|
||||
Localization.systemLocale = Localization.supportedOrDefault(navigator.languages);
|
||||
Localization.systemLocale = Localization.getSupportedOrDefault(navigator.languages);
|
||||
|
||||
let storedLanguageCode = localStorage.getItem("language-code");
|
||||
|
||||
@@ -24,7 +26,11 @@ class Localization {
|
||||
return Localization.supportedLocales.indexOf(locale) > -1;
|
||||
}
|
||||
|
||||
static supportedOrDefault(locales) {
|
||||
static isRTLLanguage(locale) {
|
||||
return Localization.supportedLocalesRTL.indexOf(locale) > -1;
|
||||
}
|
||||
|
||||
static getSupportedOrDefault(locales) {
|
||||
return locales.find(Localization.isSupported) || Localization.defaultLocale;
|
||||
}
|
||||
|
||||
@@ -34,6 +40,17 @@ class Localization {
|
||||
await Localization.setLocale(locale)
|
||||
await Localization.translatePage();
|
||||
|
||||
const htmlRootNode = document.querySelector('html');
|
||||
|
||||
if (Localization.isRTLLanguage(locale)) {
|
||||
htmlRootNode.setAttribute('dir', 'rtl');
|
||||
} else {
|
||||
htmlRootNode.removeAttribute('dir');
|
||||
}
|
||||
|
||||
htmlRootNode.setAttribute('lang', locale);
|
||||
|
||||
|
||||
console.log("Page successfully translated",
|
||||
`System language: ${Localization.systemLocale}`,
|
||||
`Selected language: ${locale}`
|
||||
|
||||
@@ -38,6 +38,12 @@ class ServerConnection {
|
||||
_connect() {
|
||||
clearTimeout(this._reconnectTimer);
|
||||
if (this._isConnected() || this._isConnecting()) return;
|
||||
if (this._isReconnect) {
|
||||
Events.fire('notify-user', {
|
||||
message: Localization.getTranslation("notifications.connecting"),
|
||||
persistent: true
|
||||
});
|
||||
}
|
||||
const ws = new WebSocket(this._endpoint());
|
||||
ws.binaryType = 'arraybuffer';
|
||||
ws.onopen = _ => this._onOpen();
|
||||
@@ -221,12 +227,10 @@ class ServerConnection {
|
||||
_onDisconnect() {
|
||||
console.log('WS: server disconnected');
|
||||
setTimeout(() => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.connecting"));
|
||||
this._isReconnect = true;
|
||||
Events.fire('ws-disconnected');
|
||||
this._reconnectTimer = setTimeout(_ => this._connect(), 1000);
|
||||
}, 100); //delay for 100ms to prevent flickering on page reload
|
||||
clearTimeout(this._reconnectTimer);
|
||||
this._reconnectTimer = setTimeout(_ => this._connect(), 1000);
|
||||
Events.fire('ws-disconnected');
|
||||
this._isReconnect = true;
|
||||
}
|
||||
|
||||
_onVisibilityChange() {
|
||||
|
||||
@@ -36,27 +36,15 @@ class PeersUI {
|
||||
Events.on('drop', e => this._onDrop(e));
|
||||
Events.on('keydown', e => this._onKeyDown(e));
|
||||
|
||||
this.$header = document.querySelector('body > header')
|
||||
this.$xPeers = $$('x-peers');
|
||||
this.$xNoPeers = $$('x-no-peers');
|
||||
this.$xInstructions = $$('x-instructions');
|
||||
this.$center = $$('#center');
|
||||
this.$logo = $$('footer .icon.logo');
|
||||
this.$footer = $$('footer');
|
||||
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('bg-resize', _ => this.evaluateOverflowing());
|
||||
Events.on('peer-added', _ => this._evaluateOverflowing());
|
||||
Events.on('bg-resize', _ => this._evaluateOverflowing());
|
||||
|
||||
this.$displayName = $('display-name');
|
||||
|
||||
@@ -75,11 +63,45 @@ class PeersUI {
|
||||
if (displayName) Events.fire('self-display-name-changed', displayName);
|
||||
});
|
||||
|
||||
Events.on('evaluate-footer-badges', _ => this._evaluateFooterBadges())
|
||||
|
||||
/* prevent animation on load */
|
||||
this.fadedIn = false;
|
||||
|
||||
this.$header = document.querySelector('header.opacity-0');
|
||||
Events.on('header-evaluated', () => this._fadeInHeader());
|
||||
}
|
||||
|
||||
_fadeInHeader() {
|
||||
//prevent flickering
|
||||
setTimeout(() => this.$header.classList.remove('opacity-0'), 50);
|
||||
}
|
||||
|
||||
_fadeInUI() {
|
||||
if (this.fadedIn) return;
|
||||
|
||||
this.fadedIn = true;
|
||||
|
||||
this.$center.classList.remove('opacity-0');
|
||||
this.$footer.classList.remove('opacity-0');
|
||||
|
||||
// Prevent flickering on load
|
||||
setTimeout(_ => {
|
||||
this.$xNoPeers.style.animationIterationCount = "1";
|
||||
}, 300);
|
||||
this.$xNoPeers.classList.remove('no-animation-on-load');
|
||||
}, 600);
|
||||
|
||||
Events.fire('ui-faded-in');
|
||||
}
|
||||
|
||||
_evaluateFooterBadges() {
|
||||
if (this.$discoveryWrapper.querySelectorAll('div:last-of-type > span[hidden]').length < 2) {
|
||||
this.$discoveryWrapper.classList.remove('row');
|
||||
this.$discoveryWrapper.classList.add('column');
|
||||
} else {
|
||||
this.$discoveryWrapper.classList.remove('column');
|
||||
this.$discoveryWrapper.classList.add('row');
|
||||
}
|
||||
Events.fire('redraw-canvas');
|
||||
this._fadeInUI();
|
||||
}
|
||||
|
||||
_insertDisplayName(displayName) {
|
||||
@@ -162,6 +184,11 @@ class PeersUI {
|
||||
if (document.querySelectorAll('x-dialog[show]').length === 0 && window.pasteMode.activated && e.code === "Escape") {
|
||||
Events.fire('deactivate-paste-mode');
|
||||
}
|
||||
|
||||
// close About PairDrop page on Escape
|
||||
if (e.key === "Escape") {
|
||||
window.location.hash = '#';
|
||||
}
|
||||
}
|
||||
|
||||
_onPeerJoined(msg) {
|
||||
@@ -207,7 +234,7 @@ class PeersUI {
|
||||
Object.keys(peer._roomIds).forEach(roomType => peerNode.classList.add(`type-${roomType}`));
|
||||
}
|
||||
|
||||
evaluateOverflowing() {
|
||||
_evaluateOverflowing() {
|
||||
if (this.$xPeers.clientHeight < this.$xPeers.scrollHeight) {
|
||||
this.$xPeers.classList.add('overflowing');
|
||||
} else {
|
||||
@@ -223,7 +250,7 @@ class PeersUI {
|
||||
const $peer = $(peerId);
|
||||
if (!$peer) return;
|
||||
$peer.remove();
|
||||
this.evaluateOverflowing();
|
||||
this._evaluateOverflowing();
|
||||
}
|
||||
|
||||
_onRoomTypeRemoved(peerId, roomType) {
|
||||
@@ -398,7 +425,7 @@ class PeerUI {
|
||||
<div class="name font-subheading"></div>
|
||||
<div class="device-name font-body2"></div>
|
||||
<div class="status font-body2"></div>
|
||||
<span class="connection-hash font-body2" title="${ Localization.getTranslation("peer-ui.connection-hash") }"></span>
|
||||
<span class="connection-hash font-body2" dir="ltr" title="${ Localization.getTranslation("peer-ui.connection-hash") }"></span>
|
||||
</div>
|
||||
</label>`;
|
||||
|
||||
@@ -608,9 +635,8 @@ class Dialog {
|
||||
this.$el = $(id);
|
||||
this.$el.querySelectorAll('[close]').forEach(el => el.addEventListener('click', _ => this.hide()));
|
||||
this.$autoFocus = this.$el.querySelector('[autofocus]');
|
||||
Events.on('peer-disconnected', e => this._onPeerDisconnected(e.detail));
|
||||
|
||||
this.$discoveryWrapper = $$('footer .discovery-wrapper');
|
||||
Events.on('peer-disconnected', e => this._onPeerDisconnected(e.detail));
|
||||
}
|
||||
|
||||
show() {
|
||||
@@ -629,7 +655,7 @@ class Dialog {
|
||||
window.blur();
|
||||
}
|
||||
document.title = 'PairDrop';
|
||||
document.changeFavicon("images/favicon-96x96.png");
|
||||
changeFavicon("images/favicon-96x96.png");
|
||||
this.correspondingPeerId = undefined;
|
||||
}
|
||||
|
||||
@@ -639,17 +665,6 @@ class Dialog {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.selected-peer-left"));
|
||||
}
|
||||
}
|
||||
|
||||
evaluateFooterBadges() {
|
||||
if (this.$discoveryWrapper.querySelectorAll('div:last-of-type > span[hidden]').length < 2) {
|
||||
this.$discoveryWrapper.classList.remove('row');
|
||||
this.$discoveryWrapper.classList.add('column');
|
||||
} else {
|
||||
this.$discoveryWrapper.classList.remove('column');
|
||||
this.$discoveryWrapper.classList.add('row');
|
||||
}
|
||||
Events.fire('bg-resize');
|
||||
}
|
||||
}
|
||||
|
||||
class LanguageSelectDialog extends Dialog {
|
||||
@@ -929,7 +944,7 @@ class ReceiveFileDialog extends ReceiveDialog {
|
||||
document.title = files.length === 1
|
||||
? `${ Localization.getTranslation("document-titles.file-received") } - PairDrop`
|
||||
: `${ Localization.getTranslation("document-titles.file-received-plural", null, {count: files.length}) } - PairDrop`;
|
||||
document.changeFavicon("images/favicon-96x96-notification.png");
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
|
||||
Events.fire('set-progress', {peerId: peerId, progress: 1, status: 'process'})
|
||||
this.show();
|
||||
@@ -1026,7 +1041,7 @@ class ReceiveRequestDialog extends ReceiveDialog {
|
||||
this.$receiveTitle.innerText = transferRequestTitle;
|
||||
|
||||
document.title = `${transferRequestTitle} - PairDrop`;
|
||||
document.changeFavicon("images/favicon-96x96-notification.png");
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
this.show();
|
||||
}
|
||||
|
||||
@@ -1190,7 +1205,6 @@ class PairDeviceDialog extends Dialog {
|
||||
this.$closeBtn.addEventListener('click', _ => this._close());
|
||||
|
||||
Events.on('keydown', e => this._onKeyDown(e));
|
||||
Events.on('ws-connected', _ => this._onWsConnected());
|
||||
Events.on('ws-disconnected', _ => this.hide());
|
||||
Events.on('pair-device-initiated', e => this._onPairDeviceInitiated(e.detail));
|
||||
Events.on('pair-device-joined', e => this._onPairDeviceJoined(e.detail.peerId, e.detail.roomSecret));
|
||||
@@ -1201,10 +1215,13 @@ class PairDeviceDialog extends Dialog {
|
||||
Events.on('evaluate-number-room-secrets', _ => this._evaluateNumberRoomSecrets())
|
||||
Events.on('secret-room-deleted', e => this._onSecretRoomDeleted(e.detail));
|
||||
this.$el.addEventListener('paste', e => this._onPaste(e));
|
||||
this.$qrCode.addEventListener('click', _ => this._copyPairUrl());
|
||||
|
||||
this.evaluateUrlAttributes();
|
||||
|
||||
this.pairPeer = {};
|
||||
|
||||
this._evaluateNumberRoomSecrets();
|
||||
}
|
||||
|
||||
_onKeyDown(e) {
|
||||
@@ -1229,10 +1246,6 @@ class PairDeviceDialog extends Dialog {
|
||||
}
|
||||
}
|
||||
|
||||
_onWsConnected() {
|
||||
this._evaluateNumberRoomSecrets();
|
||||
}
|
||||
|
||||
_pairDeviceInitiate() {
|
||||
Events.fire('pair-device-initiate');
|
||||
}
|
||||
@@ -1243,7 +1256,7 @@ class PairDeviceDialog extends Dialog {
|
||||
this.$key.innerText = `${this.pairKey.substring(0,3)} ${this.pairKey.substring(3,6)}`
|
||||
// Display the QR code for the url
|
||||
const qr = new QRCode({
|
||||
content: this._getPairURL(),
|
||||
content: this._getPairUrl(),
|
||||
width: 150,
|
||||
height: 150,
|
||||
padding: 0,
|
||||
@@ -1257,12 +1270,22 @@ class PairDeviceDialog extends Dialog {
|
||||
this.show();
|
||||
}
|
||||
|
||||
_getPairURL() {
|
||||
_getPairUrl() {
|
||||
let url = new URL(location.href);
|
||||
url.searchParams.append('pair_key', this.pairKey)
|
||||
return url.href;
|
||||
}
|
||||
|
||||
_copyPairUrl() {
|
||||
navigator.clipboard.writeText(this._getPairUrl())
|
||||
.then(_ => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.pair-url-copied-to-clipboard"));
|
||||
})
|
||||
.catch(_ => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.copied-to-clipboard-error"));
|
||||
})
|
||||
}
|
||||
|
||||
_onSubmit(e) {
|
||||
e.preventDefault();
|
||||
this._submit();
|
||||
@@ -1380,16 +1403,17 @@ class PairDeviceDialog extends Dialog {
|
||||
}
|
||||
|
||||
_evaluateNumberRoomSecrets() {
|
||||
PersistentStorage.getAllRoomSecrets().then(roomSecrets => {
|
||||
if (roomSecrets.length > 0) {
|
||||
this.$editPairedDevicesHeaderBtn.removeAttribute('hidden');
|
||||
this.$footerInstructionsPairedDevices.removeAttribute('hidden');
|
||||
} else {
|
||||
this.$editPairedDevicesHeaderBtn.setAttribute('hidden', '');
|
||||
this.$footerInstructionsPairedDevices.setAttribute('hidden', '');
|
||||
}
|
||||
super.evaluateFooterBadges();
|
||||
});
|
||||
PersistentStorage.getAllRoomSecrets()
|
||||
.then(roomSecrets => {
|
||||
if (roomSecrets.length > 0) {
|
||||
this.$editPairedDevicesHeaderBtn.removeAttribute('hidden');
|
||||
this.$footerInstructionsPairedDevices.removeAttribute('hidden');
|
||||
} else {
|
||||
this.$editPairedDevicesHeaderBtn.setAttribute('hidden', '');
|
||||
this.$footerInstructionsPairedDevices.setAttribute('hidden', '');
|
||||
}
|
||||
Events.fire('evaluate-footer-badges');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1397,10 +1421,10 @@ class EditPairedDevicesDialog extends Dialog {
|
||||
constructor() {
|
||||
super('edit-paired-devices-dialog');
|
||||
this.$pairedDevicesWrapper = this.$el.querySelector('.paired-devices-wrapper');
|
||||
this.$footerInstructionsPairedDevices = $$('.discovery-wrapper .badge-room-secret');
|
||||
this.$footerBadgePairedDevices = $$('.discovery-wrapper .badge-room-secret');
|
||||
|
||||
$('edit-paired-devices').addEventListener('click', _ => this._onEditPairedDevices());
|
||||
this.$footerInstructionsPairedDevices.addEventListener('click', _ => this._onEditPairedDevices());
|
||||
this.$footerBadgePairedDevices.addEventListener('click', _ => this._onEditPairedDevices());
|
||||
|
||||
Events.on('peer-display-name-changed', e => this._onPeerDisplayNameChanged(e));
|
||||
Events.on('keydown', e => this._onKeyDown(e));
|
||||
@@ -1508,7 +1532,7 @@ class PublicRoomDialog extends Dialog {
|
||||
this.$leaveBtn = this.$el.querySelector('.leave-room');
|
||||
this.$joinSubmitBtn = this.$el.querySelector('button[type="submit"]');
|
||||
this.$headerBtnJoinPublicRoom = $('join-public-room');
|
||||
this.$footerInstructionsPublicRoomDevices = $$('.discovery-wrapper .badge-room-public-id');
|
||||
this.$footerBadgePublicRoomDevices = $$('.discovery-wrapper .badge-room-public-id');
|
||||
|
||||
|
||||
this.$form.addEventListener('submit', e => this._onSubmit(e));
|
||||
@@ -1516,7 +1540,7 @@ class PublicRoomDialog extends Dialog {
|
||||
this.$leaveBtn.addEventListener('click', _ => this._leavePublicRoom())
|
||||
|
||||
this.$headerBtnJoinPublicRoom.addEventListener('click', _ => this._onHeaderBtnClick());
|
||||
this.$footerInstructionsPublicRoomDevices.addEventListener('click', _ => this._onHeaderBtnClick());
|
||||
this.$footerBadgePublicRoomDevices.addEventListener('click', _ => this._onHeaderBtnClick());
|
||||
|
||||
this.inputKeyContainer = new InputKeyContainer(
|
||||
this.$el.querySelector('.input-key-container'),
|
||||
@@ -1533,6 +1557,7 @@ class PublicRoomDialog extends Dialog {
|
||||
Events.on('public-room-id-invalid', e => this._onPublicRoomIdInvalid(e.detail));
|
||||
Events.on('public-room-left', _ => this._onPublicRoomLeft());
|
||||
this.$el.addEventListener('paste', e => this._onPaste(e));
|
||||
this.$qrCode.addEventListener('click', _ => this._copyShareRoomUrl());
|
||||
|
||||
this.evaluateUrlAttributes();
|
||||
|
||||
@@ -1581,7 +1606,7 @@ class PublicRoomDialog extends Dialog {
|
||||
|
||||
// Display the QR code for the url
|
||||
const qr = new QRCode({
|
||||
content: this._getShareRoomURL(),
|
||||
content: this._getShareRoomUrl(),
|
||||
width: 150,
|
||||
height: 150,
|
||||
padding: 0,
|
||||
@@ -1598,24 +1623,34 @@ class PublicRoomDialog extends Dialog {
|
||||
setFooterBadge() {
|
||||
if (!this.roomId) return;
|
||||
|
||||
this.$footerInstructionsPublicRoomDevices.innerText = Localization.getTranslation("footer.public-room-devices", null, {
|
||||
this.$footerBadgePublicRoomDevices.innerText = Localization.getTranslation("footer.public-room-devices", null, {
|
||||
roomId: this.roomId.toUpperCase()
|
||||
});
|
||||
this.$footerInstructionsPublicRoomDevices.removeAttribute('hidden');
|
||||
this.$footerBadgePublicRoomDevices.removeAttribute('hidden');
|
||||
|
||||
super.evaluateFooterBadges();
|
||||
Events.fire('evaluate-footer-badges');
|
||||
}
|
||||
|
||||
_getShareRoomURL() {
|
||||
_getShareRoomUrl() {
|
||||
let url = new URL(location.href);
|
||||
url.searchParams.append('room_key', this.roomId)
|
||||
url.searchParams.append('room_id', this.roomId)
|
||||
return url.href;
|
||||
}
|
||||
|
||||
_copyShareRoomUrl() {
|
||||
navigator.clipboard.writeText(this._getShareRoomUrl())
|
||||
.then(_ => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.room-url-copied-to-clipboard"));
|
||||
})
|
||||
.catch(_ => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.copied-to-clipboard-error"));
|
||||
})
|
||||
}
|
||||
|
||||
evaluateUrlAttributes() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
if (urlParams.has('room_key')) {
|
||||
this._joinPublicRoom(urlParams.get('room_key'));
|
||||
if (urlParams.has('room_id')) {
|
||||
this._joinPublicRoom(urlParams.get('room_id'));
|
||||
const url = getUrlWithoutArguments();
|
||||
window.history.replaceState({}, "Rewrite URL", url); //remove pair_key from url
|
||||
}
|
||||
@@ -1715,8 +1750,8 @@ class PublicRoomDialog extends Dialog {
|
||||
this.roomId = null;
|
||||
this.inputKeyContainer._cleanUp();
|
||||
sessionStorage.removeItem('public_room_id');
|
||||
this.$footerInstructionsPublicRoomDevices.setAttribute('hidden', '');
|
||||
super.evaluateFooterBadges();
|
||||
this.$footerBadgePublicRoomDevices.setAttribute('hidden', '');
|
||||
Events.fire('evaluate-footer-badges');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1724,7 +1759,7 @@ class SendTextDialog extends Dialog {
|
||||
constructor() {
|
||||
super('send-text-dialog');
|
||||
Events.on('text-recipient', e => this._onRecipient(e.detail.peerId, e.detail.deviceName));
|
||||
this.$text = this.$el.querySelector('.textarea');
|
||||
this.$text = this.$el.querySelector('#text-input');
|
||||
this.$peerDisplayName = this.$el.querySelector('.display-name');
|
||||
this.$form = this.$el.querySelector('form');
|
||||
this.$submit = this.$el.querySelector('button[type="submit"]');
|
||||
@@ -1745,7 +1780,7 @@ class SendTextDialog extends Dialog {
|
||||
}
|
||||
|
||||
_textInputEmpty() {
|
||||
return !this.$text.value || this.$text.value === "\n";
|
||||
return !this.$text.innerText || this.$text.innerText === "\n";
|
||||
}
|
||||
|
||||
_onChange(e) {
|
||||
@@ -1780,9 +1815,9 @@ class SendTextDialog extends Dialog {
|
||||
_send() {
|
||||
Events.fire('send-text', {
|
||||
to: this.correspondingPeerId,
|
||||
text: this.$text.value
|
||||
text: this.$text.innerText
|
||||
});
|
||||
this.$text.value = "";
|
||||
this.$text.innerText = "";
|
||||
this.hide();
|
||||
}
|
||||
}
|
||||
@@ -1847,7 +1882,7 @@ class ReceiveTextDialog extends Dialog {
|
||||
|
||||
this._setDocumentTitleMessages();
|
||||
|
||||
document.changeFavicon("images/favicon-96x96-notification.png");
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
this.show();
|
||||
}
|
||||
|
||||
@@ -2044,9 +2079,12 @@ class Toast extends Dialog {
|
||||
|
||||
_onNotify(message) {
|
||||
if (this.hideTimeout) clearTimeout(this.hideTimeout);
|
||||
this.$el.innerText = message;
|
||||
this.$el.innerText = typeof message === "object" ? message.message : message;
|
||||
this.show();
|
||||
this.hideTimeout = setTimeout(_ => this.hide(), 5000);
|
||||
|
||||
if (typeof message === "object" && message.persistent) return;
|
||||
|
||||
this.hideTimeout = setTimeout(() => this.hide(), 5000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2054,15 +2092,20 @@ class Notifications {
|
||||
|
||||
constructor() {
|
||||
// Check if the browser supports notifications
|
||||
if (!('Notification' in window)) return;
|
||||
if (!('Notification' in window)) {
|
||||
Events.fire('header-evaluated');
|
||||
return;
|
||||
}
|
||||
|
||||
// Check whether notification permissions have already been granted
|
||||
if (Notification.permission !== 'granted') {
|
||||
this.$button = $('notification');
|
||||
this.$button.removeAttribute('hidden');
|
||||
this.$button.addEventListener('click', _ => this._requestPermission());
|
||||
this.$headerNotificationButton = $('notification');
|
||||
this.$headerNotificationButton.removeAttribute('hidden');
|
||||
this.$headerNotificationButton.addEventListener('click', _ => this._requestPermission());
|
||||
}
|
||||
|
||||
Events.fire('header-evaluated');
|
||||
|
||||
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-transfer-request', e => this._requestNotification(e.detail.request, e.detail.peerId));
|
||||
@@ -2071,11 +2114,11 @@ class Notifications {
|
||||
_requestPermission() {
|
||||
Notification.requestPermission(permission => {
|
||||
if (permission !== 'granted') {
|
||||
Events.fire('notify-user', Notifications.PERMISSION_ERROR || 'Error');
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.notifications-permissions-error"));
|
||||
return;
|
||||
}
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.notifications-enabled"));
|
||||
this.$button.setAttribute('hidden', 1);
|
||||
this.$headerNotificationButton.setAttribute('hidden', "");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2457,7 +2500,7 @@ class PersistentStorage {
|
||||
return(secrets);
|
||||
} catch (e) {
|
||||
this.logBrowserNotCapable();
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2675,12 +2718,71 @@ class BrowserTabsConnector {
|
||||
}
|
||||
}
|
||||
|
||||
class BackgroundCanvas {
|
||||
constructor() {
|
||||
this.c = $$('canvas');
|
||||
this.cCtx = this.c.getContext('2d');
|
||||
this.$footer = $$('footer');
|
||||
|
||||
Events.on('bg-resize', _ => this.init());
|
||||
Events.on('redraw-canvas', _ => this.init());
|
||||
Events.on('translation-loaded', _ => this.init());
|
||||
|
||||
//fade-in on load
|
||||
Events.on('ui-faded-in', _ => this._fadeIn());
|
||||
|
||||
window.onresize = _ => Events.fire('bg-resize');
|
||||
}
|
||||
|
||||
_fadeIn() {
|
||||
this.c.classList.remove('opacity-0');
|
||||
}
|
||||
|
||||
init() {
|
||||
let oldW = this.w;
|
||||
let oldH = this.h;
|
||||
let oldOffset = this.offset
|
||||
this.w = document.documentElement.clientWidth;
|
||||
this.h = document.documentElement.clientHeight;
|
||||
this.offset = this.$footer.offsetHeight - 27;
|
||||
if (this.h >= 800) this.offset += 10;
|
||||
|
||||
if (oldW === this.w && oldH === this.h && oldOffset === this.offset) return; // nothing has changed
|
||||
|
||||
this.c.width = this.w;
|
||||
this.c.height = this.h;
|
||||
this.x0 = this.w / 2;
|
||||
this.y0 = this.h - this.offset;
|
||||
this.dw = Math.round(Math.max(this.w, this.h, 1000) / 13);
|
||||
|
||||
this.drawCircles(this.cCtx);
|
||||
}
|
||||
|
||||
|
||||
drawCircle(ctx, radius) {
|
||||
ctx.beginPath();
|
||||
ctx.lineWidth = 2;
|
||||
let opacity = Math.max(0, 0.3 * (1 - 1 * radius / Math.max(this.w, this.h)));
|
||||
ctx.strokeStyle = `rgba(128, 128, 128, ${opacity})`;
|
||||
ctx.arc(this.x0, this.y0, radius, 0, 2 * Math.PI);
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
drawCircles(ctx) {
|
||||
ctx.clearRect(0, 0, this.w, this.h);
|
||||
for (let i = 0; i < 13; i++) {
|
||||
this.drawCircle(ctx, this.dw * i + 33 + 66);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PairDrop {
|
||||
constructor() {
|
||||
Events.on('initial-translation-loaded', _ => {
|
||||
const server = new ServerConnection();
|
||||
const peers = new PeersManager(server);
|
||||
const peersUI = new PeersUI();
|
||||
const backgroundCanvas = new BackgroundCanvas();
|
||||
const languageSelectDialog = new LanguageSelectDialog();
|
||||
const receiveFileDialog = new ReceiveFileDialog();
|
||||
const receiveRequestDialog = new ReceiveRequestDialog();
|
||||
@@ -2705,7 +2807,6 @@ const persistentStorage = new PersistentStorage();
|
||||
const pairDrop = new PairDrop();
|
||||
const localization = new Localization();
|
||||
|
||||
|
||||
if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.register('/service-worker.js')
|
||||
.then(serviceWorker => {
|
||||
@@ -2723,70 +2824,3 @@ window.addEventListener('beforeinstallprompt', e => {
|
||||
}
|
||||
return e.preventDefault();
|
||||
});
|
||||
|
||||
// Background Circles
|
||||
Events.on('load', () => {
|
||||
let c = $$('canvas');
|
||||
let cCtx = c.getContext('2d');
|
||||
let x0, y0, w, h, dw, offset;
|
||||
|
||||
function init() {
|
||||
let oldW = w;
|
||||
let oldH = h;
|
||||
let oldOffset = offset
|
||||
w = document.documentElement.clientWidth;
|
||||
h = document.documentElement.clientHeight;
|
||||
offset = $$('footer').offsetHeight - 27;
|
||||
if (h > 800) offset += 10;
|
||||
|
||||
if (oldW === w && oldH === h && oldOffset === offset) return; // nothing has changed
|
||||
|
||||
c.width = w;
|
||||
c.height = h;
|
||||
x0 = w / 2;
|
||||
y0 = h - offset;
|
||||
dw = Math.round(Math.max(w, h, 1000) / 13);
|
||||
|
||||
drawCircles(cCtx, dw);
|
||||
c.style.opacity = "1";
|
||||
}
|
||||
|
||||
Events.on('bg-resize', _ => init());
|
||||
window.onresize = _ => Events.fire('bg-resize');
|
||||
|
||||
function drawCircle(ctx, radius) {
|
||||
ctx.beginPath();
|
||||
ctx.lineWidth = 2;
|
||||
let opacity = 0.3 * (1 - 1.2 * radius / Math.max(w, h));
|
||||
ctx.strokeStyle = `rgba(128, 128, 128, ${opacity})`;
|
||||
ctx.arc(x0, y0, radius, 0, 2 * Math.PI);
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
function drawCircles(ctx, frame) {
|
||||
ctx.clearRect(0, 0, w, h);
|
||||
for (let i = 0; i < 13; i++) {
|
||||
drawCircle(ctx, dw * i + frame + 33);
|
||||
}
|
||||
}
|
||||
|
||||
setTimeout(_ => init(), 300);
|
||||
});
|
||||
|
||||
document.changeFavicon = function (src) {
|
||||
document.querySelector('[rel="icon"]').href = src;
|
||||
document.querySelector('[rel="shortcut icon"]').href = src;
|
||||
}
|
||||
|
||||
// close About PairDrop page on Escape
|
||||
window.addEventListener("keydown", (e) => {
|
||||
if (e.key === "Escape") {
|
||||
window.location.hash = '#';
|
||||
}
|
||||
});
|
||||
|
||||
Notifications.PERMISSION_ERROR = `
|
||||
Notifications permission has been blocked
|
||||
as the user has dismissed the permission prompt several times.
|
||||
This can be reset in Page Info
|
||||
which can be accessed by clicking the lock icon next to the URL.`;
|
||||
|
||||
@@ -406,3 +406,8 @@ function onlyUnique (value, index, array) {
|
||||
function getUrlWithoutArguments() {
|
||||
return `${window.location.protocol}//${window.location.host}${window.location.pathname}`;
|
||||
}
|
||||
|
||||
function changeFavicon(src) {
|
||||
document.querySelector('[rel="icon"]').href = src;
|
||||
document.querySelector('[rel="shortcut icon"]').href = src;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const cacheVersion = 'v1.8.3';
|
||||
const cacheVersion = 'v1.9.0';
|
||||
const cacheTitle = `pairdrop-cache-${cacheVersion}`;
|
||||
const urlsToCache = [
|
||||
'index.html',
|
||||
@@ -19,6 +19,19 @@ const urlsToCache = [
|
||||
'images/android-chrome-512x512.png',
|
||||
'images/android-chrome-512x512-maskable.png',
|
||||
'images/apple-touch-icon.png',
|
||||
'lang/ar.json',
|
||||
'lang/de.json',
|
||||
'lang/en.json',
|
||||
'lang/es.json',
|
||||
'lang/fr.json',
|
||||
'lang/id.json',
|
||||
'lang/it.json',
|
||||
'lang/ja.json',
|
||||
'lang/nb.json',
|
||||
'lang/nl.json',
|
||||
'lang/ro.json',
|
||||
'lang/ru.json',
|
||||
'lang/zh-CN.json'
|
||||
];
|
||||
|
||||
self.addEventListener('install', function(event) {
|
||||
|
||||
@@ -91,7 +91,7 @@ html {
|
||||
header {
|
||||
position: absolute;
|
||||
align-items: baseline;
|
||||
padding: 8px 16px;
|
||||
padding: 8px 12px;
|
||||
box-sizing: border-box;
|
||||
width: 100vw;
|
||||
z-index: 2;
|
||||
@@ -99,9 +99,9 @@ header {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
header > a,
|
||||
header > div {
|
||||
margin-left: 8px;
|
||||
header > * {
|
||||
margin-left: 4px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
header > div {
|
||||
@@ -273,6 +273,9 @@ x-noscript {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
#center {
|
||||
@@ -417,10 +420,6 @@ x-no-peers {
|
||||
padding: 8px;
|
||||
height: 137px;
|
||||
text-align: center;
|
||||
animation: fade-in 600ms;
|
||||
animation-fill-mode: backwards;
|
||||
/* prevent flickering on load */
|
||||
animation-iteration-count: 0;
|
||||
}
|
||||
|
||||
x-no-peers h2,
|
||||
@@ -613,7 +612,6 @@ footer .logo {
|
||||
margin-bottom: 8px;
|
||||
color: var(--primary-color);
|
||||
margin-top: -10px;
|
||||
animation: ease-in;
|
||||
}
|
||||
|
||||
.discovery-wrapper {
|
||||
@@ -673,7 +671,6 @@ footer .logo {
|
||||
max-width: 15em;
|
||||
text-overflow: ellipsis;
|
||||
cursor: text;
|
||||
margin-left: -1rem;
|
||||
margin-bottom: -6px;
|
||||
padding-bottom: 0.1rem;
|
||||
border-radius: 1.3rem/30%;
|
||||
@@ -687,11 +684,24 @@ footer .logo {
|
||||
#edit-pen {
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
margin-left: -1rem;
|
||||
margin-bottom: -2px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
html:not([dir="rtl"]) #display-name,
|
||||
html:not([dir="rtl"]) #edit-pen {
|
||||
margin-left: -1rem;
|
||||
}
|
||||
|
||||
html[dir="rtl"] #display-name,
|
||||
html[dir="rtl"] #edit-pen {
|
||||
margin-right: -1rem;
|
||||
}
|
||||
|
||||
html[dir="rtl"] #edit-pen {
|
||||
transform: rotateY(180deg);
|
||||
}
|
||||
|
||||
/* Dialog */
|
||||
|
||||
x-dialog x-background {
|
||||
@@ -704,10 +714,12 @@ x-dialog x-background {
|
||||
}
|
||||
|
||||
x-dialog x-paper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: calc(100vw - 10px);
|
||||
z-index: 3;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
width: 100%;
|
||||
max-width: 400px;
|
||||
overflow: hidden;
|
||||
box-sizing: border-box;
|
||||
@@ -715,6 +727,15 @@ x-dialog x-paper {
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
#pair-device-dialog x-paper,
|
||||
#edit-paired-devices-dialog x-paper,
|
||||
#public-room-dialog x-paper,
|
||||
#language-select-dialog x-paper {
|
||||
position: absolute;
|
||||
top: max(50%, 350px);
|
||||
margin-top: -328.5px;
|
||||
}
|
||||
|
||||
x-paper > .row:first-of-type {
|
||||
background-color: var(--accent-color);
|
||||
border-bottom: solid 4px var(--border-color);
|
||||
@@ -734,16 +755,6 @@ x-paper > .row:first-of-type h2 {
|
||||
--accent-color: var(--public-room-color);
|
||||
}
|
||||
|
||||
#pair-device-dialog x-paper,
|
||||
#public-room-dialog x-paper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: absolute;
|
||||
top: max(50%, 350px);
|
||||
margin-top: -328.5px;
|
||||
width: calc(100vw - 20px);
|
||||
}
|
||||
|
||||
#pair-device-dialog ::-moz-selection,
|
||||
#pair-device-dialog ::selection {
|
||||
color: black;
|
||||
@@ -799,8 +810,8 @@ x-dialog a {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.input-key-container > input + * {
|
||||
margin-left: 6px;
|
||||
.input-key-container > input {
|
||||
margin: 0 3px;
|
||||
}
|
||||
|
||||
.input-key-container.six-chars > input:nth-of-type(4) {
|
||||
@@ -811,15 +822,17 @@ x-dialog a {
|
||||
-webkit-user-select: text;
|
||||
-moz-user-select: text;
|
||||
user-select: text;
|
||||
font-size: 50px;
|
||||
letter-spacing: min(calc((100vw - 80px - 99px) / 100 * 7), 23px);
|
||||
display: inline-block;
|
||||
text-indent: calc(0.5 * (11px + min(calc((100vw - 80px - 99px) / 100 * 6), 23px)));
|
||||
margin: 15px -15px;
|
||||
font-size: 50px;
|
||||
letter-spacing: min(calc((100vw - 80px - 99px) / 100 * 7), 20px);
|
||||
text-indent: calc(0.5 * (11px + min(calc((100vw - 80px - 99px) / 100 * 6), 28px)));
|
||||
margin: 25px 0;
|
||||
}
|
||||
|
||||
.key-qr-code {
|
||||
margin: 16px;
|
||||
width: fit-content;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.key-instructions {
|
||||
@@ -971,14 +984,26 @@ x-paper > .button-row > .button {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
x-paper > .button-row > .button:not(:first-child) {
|
||||
html:not([dir="rtl"]) x-paper > .button-row > .button:not(:first-child) {
|
||||
border-right: solid 1.5px var(--border-color);
|
||||
}
|
||||
|
||||
x-paper > .button-row > .button:not(:last-child) {
|
||||
html:not([dir="rtl"]) x-paper > .button-row > .button:not(:last-child) {
|
||||
border-left: solid 1.5px var(--border-color);
|
||||
}
|
||||
|
||||
html[dir="rtl"] x-paper > .button-row > .button:not(:first-child) {
|
||||
border-left: solid 1.5px var(--border-color);
|
||||
}
|
||||
|
||||
html[dir="rtl"] x-paper > .button-row > .button:not(:last-child) {
|
||||
border-right: solid 1.5px var(--border-color);
|
||||
}
|
||||
|
||||
.language-buttons > button > span {
|
||||
margin: 0 0.3em;
|
||||
}
|
||||
|
||||
.file-description {
|
||||
max-width: 100%;
|
||||
}
|
||||
@@ -1011,7 +1036,7 @@ x-dialog .dialog-subheader {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
#send-text-dialog .textarea {
|
||||
#text-input {
|
||||
min-height: 200px;
|
||||
width: 100%;
|
||||
}
|
||||
@@ -1203,22 +1228,23 @@ button::-moz-focus-inner {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#about:not(:target) header.fade-in {
|
||||
#about:not(:target) header {
|
||||
transition-delay: 400ms;
|
||||
}
|
||||
|
||||
#about:target header.fade-in {
|
||||
#about:target header {
|
||||
transition-delay: 100ms;
|
||||
}
|
||||
|
||||
#about .fade-in {
|
||||
#about > * {
|
||||
transition: opacity 300ms ease 300ms;
|
||||
will-change: opacity;
|
||||
pointer-events: all;
|
||||
}
|
||||
|
||||
#about:not(:target) .fade-in {
|
||||
opacity: 0 !important;
|
||||
#about:not(:target) > header,
|
||||
#about:not(:target) > section {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition-delay: 0s;
|
||||
}
|
||||
@@ -1241,7 +1267,6 @@ button::-moz-focus-inner {
|
||||
--size: max(max(230vw, 230vh), calc(150vh + 150vw));
|
||||
--size-half: calc(var(--size)/2);
|
||||
top: calc(28px - var(--size-half));
|
||||
right: calc(36px - var(--size-half));
|
||||
width: var(--size);
|
||||
height: var(--size);
|
||||
border-radius: 50%;
|
||||
@@ -1250,6 +1275,15 @@ button::-moz-focus-inner {
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
html:not([dir="rtl"]) #about x-background {
|
||||
right: calc(36px - var(--size-half));
|
||||
}
|
||||
|
||||
html[dir="rtl"] #about x-background {
|
||||
left: calc(36px - var(--size-half));
|
||||
}
|
||||
|
||||
|
||||
/* Hack such that initial scale(0) isn't animated */
|
||||
#about x-background {
|
||||
will-change: transform;
|
||||
@@ -1389,17 +1423,17 @@ 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 */
|
||||
.fade-in {
|
||||
animation: fade-in 600ms;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
|
||||
.no-animation-on-load {
|
||||
animation-iteration-count: 0;
|
||||
}
|
||||
|
||||
.opacity-0 {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
/* Responsive Styles */
|
||||
@@ -1546,3 +1580,10 @@ x-dialog x-paper {
|
||||
color: black;
|
||||
background: var(--primary-color);
|
||||
}
|
||||
|
||||
/* make elements with attribute contenteditable editable on older iOS devices.
|
||||
See note here: https://developer.mozilla.org/en-US/docs/Web/CSS/user-select */
|
||||
[contenteditable] {
|
||||
-webkit-user-select: text;
|
||||
user-select: text;
|
||||
}
|
||||
|
||||
@@ -33,112 +33,107 @@
|
||||
<meta name="twitter:image" content="images/logo_transparent_512x512.png">
|
||||
<meta property="og:image" content="images/logo_transparent_512x512.png">
|
||||
<!-- Resources -->
|
||||
<link rel="preload" href="lang/en.json" as="fetch">
|
||||
<link rel="stylesheet" type="text/css" href="styles.css">
|
||||
<link rel="manifest" href="manifest.json">
|
||||
</head>
|
||||
|
||||
<body translate="no">
|
||||
<header class="row-reverse">
|
||||
<a href="#about" class="icon-button" data-i18n-key="header.about" data-i18n-attrs="title aria-label" title="About PairDrop" aria-label="Open About PairDrop">
|
||||
<header class="row-reverse opacity-0">
|
||||
<a href="#about" class="icon-button" data-i18n-key="header.about" data-i18n-attrs="title aria-label">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#info-outline" />
|
||||
<use xlink:href="#info-outline"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<div id="language-selector" class="icon-button" data-i18n-key="header.language-selector" data-i18n-attrs="title" title="Select Language">
|
||||
<div id="language-selector" class="icon-button" data-i18n-key="header.language-selector" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#icon-language-selector" />
|
||||
<use xlink:href="#icon-language-selector"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="theme-wrapper">
|
||||
<div id="theme-auto" class="icon-button selected" data-i18n-key="header.theme-auto" data-i18n-attrs="title" title="Adapt Theme to System" >
|
||||
<div id="theme-auto" class="icon-button selected" data-i18n-key="header.theme-auto" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#icon-theme-auto" />
|
||||
<use xlink:href="#icon-theme-auto"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<div id="theme-light" class="icon-button" data-i18n-key="header.theme-light" data-i18n-attrs="title" title="Always Use Light-Theme" >
|
||||
<div id="theme-light" class="icon-button" data-i18n-key="header.theme-light" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#icon-theme-light" />
|
||||
<use xlink:href="#icon-theme-light"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="theme-dark" class="icon-button" data-i18n-key="header.theme-dark" data-i18n-attrs="title" title="Always Use Dark-Theme" >
|
||||
<div id="theme-dark" class="icon-button" data-i18n-key="header.theme-dark" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#icon-theme-dark" />
|
||||
<use xlink:href="#icon-theme-dark"></use>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="notification" class="icon-button" data-i18n-key="header.notification" data-i18n-attrs="title" title="Enable Notifications" hidden>
|
||||
<div id="notification" class="icon-button" data-i18n-key="header.notification" data-i18n-attrs="title" hidden>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#notifications" />
|
||||
<use xlink:href="#notifications"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="install" class="icon-button" data-i18n-key="header.install" data-i18n-attrs="title" title="Install PairDrop" hidden>
|
||||
<div id="install" class="icon-button" data-i18n-key="header.install" data-i18n-attrs="title" hidden>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#homescreen" />
|
||||
<use xlink:href="#homescreen"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="pair-device" class="icon-button" data-i18n-key="header.pair-device" data-i18n-attrs="title" title="Pair Your Devices Permanently">
|
||||
<div id="pair-device" class="icon-button" data-i18n-key="header.pair-device" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#pair-device-icon" />
|
||||
<use xlink:href="#pair-device-icon"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="edit-paired-devices" class="icon-button" data-i18n-key="header.edit-paired-devices" data-i18n-attrs="title" title="Edit Paired Devices" hidden>
|
||||
<div id="edit-paired-devices" class="icon-button" data-i18n-key="header.edit-paired-devices" data-i18n-attrs="title" hidden>
|
||||
<svg class="icon">
|
||||
<use xlink:href="#edit-pair-devices-icon" />
|
||||
<use xlink:href="#edit-pair-devices-icon"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="join-public-room" class="icon-button" data-i18n-key="header.join-public-room" data-i18n-attrs="title" title="Join Public Room Temporarily">
|
||||
<div id="join-public-room" class="icon-button" data-i18n-key="header.join-public-room" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#public-room-icon" />
|
||||
<use xlink:href="#public-room-icon"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="cancel-paste-mode" class="button" data-i18n-key="header.cancel-paste-mode" data-i18n-attrs="text" hidden>Done</div>
|
||||
<div id="cancel-paste-mode" class="button" data-i18n-key="header.cancel-paste-mode" data-i18n-attrs="text" hidden></div>
|
||||
</header>
|
||||
<!-- Center -->
|
||||
<div id="center">
|
||||
<div id="center" class="opacity-0">
|
||||
<!-- Peers -->
|
||||
<div class="x-peers-filler"></div>
|
||||
<x-peers class="center"></x-peers>
|
||||
<x-no-peers data-i18n-key="instructions.no-peers" data-i18n-attrs="data-drop-bg" data-drop-bg="Release to select recipient">
|
||||
<h2 data-i18n-key="instructions.no-peers-title" data-i18n-attrs="text">Open PairDrop on other devices to send files</h2>
|
||||
<div data-i18n-key="instructions.no-peers-subtitle" data-i18n-attrs="text">Pair devices or enter a public room to be discoverable on other networks</div>
|
||||
<x-no-peers class="no-animation-on-load" data-i18n-key="instructions.no-peers" data-i18n-attrs="data-drop-bg">
|
||||
<h2 data-i18n-key="instructions.no-peers-title" data-i18n-attrs="text"></h2>
|
||||
<div data-i18n-key="instructions.no-peers-subtitle" data-i18n-attrs="text"></div>
|
||||
</x-no-peers>
|
||||
<x-instructions data-i18n-key="instructions.x-instructions" data-i18n-attrs="desktop mobile data-drop-peer data-drop-bg"
|
||||
desktop="Click to send files or right click to send a message"
|
||||
mobile="Tap to send files or long tap to send a message"
|
||||
data-drop-peer="Release to send to peer"
|
||||
data-drop-bg="Release to select recipient">
|
||||
<x-instructions data-i18n-key="instructions.x-instructions" data-i18n-attrs="desktop mobile data-drop-peer data-drop-bg">
|
||||
<p id="paste-filename"></p>
|
||||
</x-instructions>
|
||||
<div id="websocket-fallback">
|
||||
<span data-i18n-key="footer.traffic" data-i18n-attrs="text">Traffic is</span>
|
||||
<span data-i18n-key="footer.routed" data-i18n-attrs="text">routed through the server</span>
|
||||
<span data-i18n-key="footer.webrtc" data-i18n-attrs="text">if WebRTC is not available.</span>
|
||||
<span data-i18n-key="footer.traffic" data-i18n-attrs="text"></span>
|
||||
<span data-i18n-key="footer.routed" data-i18n-attrs="text"></span>
|
||||
<span data-i18n-key="footer.webrtc" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Footer -->
|
||||
<footer class="column">
|
||||
<footer class="column opacity-0">
|
||||
<svg class="icon logo">
|
||||
<use xlink:href="#wifi-tethering" />
|
||||
<use xlink:href="#wifi-tethering"></use>
|
||||
</svg>
|
||||
<div class="column">
|
||||
<div class="known-as-wrapper">
|
||||
<span data-i18n-key="footer.known-as" data-i18n-attrs="text">You are known as:</span>
|
||||
<div id="display-name" class="badge" data-i18n-key="footer.display-name" data-i18n-attrs="data-placeholder title"
|
||||
placeholder="Loading..." data-placeholder="Loading..." title="Edit your device name permanently"
|
||||
autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable></div>
|
||||
<span data-i18n-key="footer.known-as" data-i18n-attrs="text"></span>
|
||||
<div id="display-name" class="badge" data-i18n-key="footer.display-name" data-i18n-attrs="data-placeholder title" placeholder="Loading..." autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable></div>
|
||||
<svg id="edit-pen" class="icon">
|
||||
<use xlink:href="#edit-pen-icon" />
|
||||
<use xlink:href="#edit-pen-icon"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="discovery-wrapper row">
|
||||
<div class="row center">
|
||||
<span data-i18n-key="footer.discovery" data-i18n-attrs="text">You can be discovered:</span>
|
||||
<span data-i18n-key="footer.discovery" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<span class="badge badge-room-ip" data-i18n-key="footer.on-this-network" data-i18n-attrs="text title">on this network</span>
|
||||
<span class="badge badge-room-secret pointer" data-i18n-key="footer.paired-devices" data-i18n-attrs="text title" hidden>paired devices</span>
|
||||
<span class="badge badge-room-ip" data-i18n-key="footer.on-this-network" data-i18n-attrs="text title"></span>
|
||||
<span class="badge badge-room-secret pointer" data-i18n-key="footer.paired-devices" data-i18n-attrs="text title" hidden></span>
|
||||
<span class="badge badge-room-public-id pointer" data-i18n-key="footer.public-room-devices" data-i18n-attrs="title" hidden>in room IAIAI</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -149,21 +144,76 @@
|
||||
<x-background class="full center">
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<h2 class="center" data-i18n-key="dialogs.language-selector-title" data-i18n-attrs="text">Select Language</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.language-selector-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
<div class="language-buttons">
|
||||
<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="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="ro">Română (Romanian)</button>
|
||||
<button class="button fw" value="ru">Русский язык (Russian)</button>
|
||||
<button class="button fw" value="zh-CN">中文 (Chinese)</button>
|
||||
<button class="button fw" data-i18n-key="dialogs.system-language" data-i18n-attrs="text"></button>
|
||||
<button class="button fw" value="ar">
|
||||
<span>العربية</span>
|
||||
<span>-</span>
|
||||
<span>(Arabic)</span>
|
||||
</button>
|
||||
<button class="button fw" value="de">
|
||||
<span>Deutsch</span>
|
||||
<span>-</span>
|
||||
<span>(German)</span>
|
||||
</button>
|
||||
<button class="button fw" value="en">
|
||||
<span>English</span>
|
||||
</button>
|
||||
<button class="button fw" value="fr">
|
||||
<span>Français</span>
|
||||
<span>-</span>
|
||||
<span>(French)</span>
|
||||
</button>
|
||||
<button class="button fw" value="id">
|
||||
<span>Bahasa Indonesia</span>
|
||||
<span>-</span>
|
||||
<span>(Indonesian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="it">
|
||||
<span>Italiano</span>
|
||||
<span>-</span>
|
||||
<span>(Italian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="nl">
|
||||
<span>Nederlands</span>
|
||||
<span>-</span>
|
||||
<span>(Dutch)</span>
|
||||
</button>
|
||||
<button class="button fw" value="nb">
|
||||
<span>Norsk</span>
|
||||
<span>-</span>
|
||||
<span>(Norwegian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="ro">
|
||||
<span>Română</span>
|
||||
<span>-</span>
|
||||
<span>(Romanian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="ru">
|
||||
<span>Русский язык</span>
|
||||
<span>-</span>
|
||||
<span>(Russian)</span>
|
||||
</button>
|
||||
<button class="button fw" value="es">
|
||||
<span>Español</span>
|
||||
<span>-</span>
|
||||
<span>(Spanish)</span>
|
||||
</button>
|
||||
<button class="button fw" value="zh-CN">
|
||||
<span>中文</span>
|
||||
<span>-</span>
|
||||
<span>(Chinese)</span>
|
||||
</button>
|
||||
<button class="button fw" value="ja">
|
||||
<span>日本語</span>
|
||||
<span>-</span>
|
||||
<span>(Japanese)</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="center row-reverse button-row">
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -174,40 +224,40 @@
|
||||
<x-background class="full center text-center">
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<h2 class="center" data-i18n-key="dialogs.pair-devices-title" data-i18n-attrs="text">Pair Devices</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.pair-devices-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<div class="center key-qr-code"></div>
|
||||
<h1 class="center key">000 000</h1>
|
||||
<div class="center key-qr-code" data-i18n-key="dialogs.pair-devices-qr-code" data-i18n-attrs="title"></div>
|
||||
<h1 class="center key" dir="ltr">000 000</h1>
|
||||
<p class="center text-center key-instructions">
|
||||
<span class="font-subheading" data-i18n-key="dialogs.input-key-on-this-device" data-i18n-attrs="text">Input this key 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.input-key-on-this-device" data-i18n-attrs="text"></span>
|
||||
<span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text"></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-note">
|
||||
<hr>
|
||||
<div>
|
||||
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text">OR</span>
|
||||
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<div class="input-key-container six-chars">
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-3" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-6" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<div class="input-key-container six-chars" dir="ltr">
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-3" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-4" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-5" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="tel" class="textarea center" aria-label="pair-key-char-6" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
</div>
|
||||
<p class="font-subheading center text-center" data-i18n-key="dialogs.enter-key-from-another-device" data-i18n-attrs="text">Enter key from another device here.</p>
|
||||
<p class="font-subheading center text-center" data-i18n-key="dialogs.enter-key-from-another-device" data-i18n-attrs="text"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-row row-reverse">
|
||||
<button class="button" type="submit" data-i18n-key="dialogs.pair" data-i18n-attrs="text" disabled>Pair</button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close>Cancel</button>
|
||||
<button class="button" type="submit" data-i18n-key="dialogs.pair" data-i18n-attrs="text" disabled></button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -219,22 +269,18 @@
|
||||
<x-background class="full center text-center">
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<h2 class="center" data-i18n-key="dialogs.edit-paired-devices-title" data-i18n-attrs="text">Edit Paired Devices</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.edit-paired-devices-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
<div class="paired-devices-wrapper" data-i18n-key="dialogs.paired-devices-wrapper" data-i18n-attrs="data-empty" data-empty="No paired devices."></div>
|
||||
<div class="paired-devices-wrapper" data-i18n-key="dialogs.paired-devices-wrapper" data-i18n-attrs="data-empty"></div>
|
||||
<div class="font-subheading center">
|
||||
<p>
|
||||
<span data-i18n-key="dialogs.auto-accept-instructions-1" data-i18n-attrs="text">
|
||||
Activate
|
||||
</span>
|
||||
<u data-i18n-key="dialogs.auto-accept" data-i18n-attrs="text">auto-accept</u>
|
||||
<span data-i18n-key="dialogs.auto-accept-instructions-2" data-i18n-attrs="text">
|
||||
to automatically accept all files sent from that device.
|
||||
</span>
|
||||
<span data-i18n-key="dialogs.auto-accept-instructions-1" data-i18n-attrs="text"></span>
|
||||
<u data-i18n-key="dialogs.auto-accept" data-i18n-attrs="text"></u>
|
||||
<span data-i18n-key="dialogs.auto-accept-instructions-2" data-i18n-attrs="text"></span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="center row-reverse button-row">
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -247,41 +293,41 @@
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<h2 class="center" data-i18n-key="dialogs.temporary-public-room-title" data-i18n-attrs="text">Temporary Public Room</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.temporary-public-room-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<div class="center key-qr-code"></div>
|
||||
<h1 class="center key"></h1>
|
||||
<div class="center key-qr-code" data-i18n-key="dialogs.public-room-qr-code" data-i18n-attrs="title"></div>
|
||||
<h1 class="center key" dir="ltr"></h1>
|
||||
<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.scan-qr-code" data-i18n-attrs="text">or scan the QR-Code.</span>
|
||||
<span class="font-subheading" data-i18n-key="dialogs.input-room-id-on-another-device" data-i18n-attrs="text"></span>
|
||||
<span class="font-subheading" data-i18n-key="dialogs.scan-qr-code" data-i18n-attrs="text"></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-note">
|
||||
<hr>
|
||||
<div>
|
||||
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text">OR</span>
|
||||
<span data-i18n-key="dialogs.hr-or" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<div class="input-key-container">
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder="" disabled>
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder="" disabled>
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-3" 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>
|
||||
<div class="input-key-container" dir="ltr">
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-1" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" autofocus contenteditable placeholder disabled>
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-2" maxlength="1" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable placeholder disabled>
|
||||
<input type="text" class="textarea center" aria-label="room-id-char-3" 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>
|
||||
</div>
|
||||
<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>
|
||||
<p class="font-subheading center text-center" data-i18n-key="dialogs.enter-room-id-from-another-device" data-i18n-attrs="text"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center row-reverse button-row">
|
||||
<button class="button" type="submit" data-i18n-key="dialogs.join" data-i18n-attrs="text" disabled>Join</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" data-i18n-key="dialogs.leave" data-i18n-attrs="text">Leave</button>
|
||||
<button class="button" type="submit" data-i18n-key="dialogs.join" data-i18n-attrs="text" disabled></button>
|
||||
<button class="button" type="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
<button class="button leave-room" type="button" data-i18n-key="dialogs.leave" data-i18n-attrs="text"></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -300,9 +346,9 @@
|
||||
<div class="column center file-description">
|
||||
<div>
|
||||
<span class="display-name badge"></span>
|
||||
<span data-i18n-key="dialogs.would-like-to-share" data-i18n-attrs="text">would like to share</span>
|
||||
<span data-i18n-key="dialogs.would-like-to-share" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
<div class="row file-name" >
|
||||
<div class="row file-name">
|
||||
<span class="file-stem"></span>
|
||||
<span class="file-extension"></span>
|
||||
</div>
|
||||
@@ -313,8 +359,8 @@
|
||||
</div>
|
||||
<div class="center file-preview"></div>
|
||||
<div class="row-reverse center button-row">
|
||||
<button id="accept-request" class="button" title="ENTER" data-i18n-key="dialogs.accept" data-i18n-attrs="text" autofocus>Accept</button>
|
||||
<button id="decline-request" class="button" title="ESCAPE" data-i18n-key="dialogs.decline" data-i18n-attrs="text">Decline</button>
|
||||
<button id="accept-request" class="button" title="ENTER" data-i18n-key="dialogs.accept" data-i18n-attrs="text" autofocus></button>
|
||||
<button id="decline-request" class="button" title="ESCAPE" data-i18n-key="dialogs.decline" data-i18n-attrs="text"></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -332,9 +378,9 @@
|
||||
<div class="column center file-description">
|
||||
<div>
|
||||
<span class="display-name badge"></span>
|
||||
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text">has sent</span>
|
||||
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
<div class="row file-name" >
|
||||
<div class="row file-name">
|
||||
<span class="file-stem"></span>
|
||||
<span class="file-extension"></span>
|
||||
</div>
|
||||
@@ -345,9 +391,9 @@
|
||||
</div>
|
||||
<div class="center file-preview"></div>
|
||||
<div class="row-reverse center button-row">
|
||||
<button id="share-btn" class="button" data-i18n-key="dialogs.share" data-i18n-attrs="text" hidden>Share</button>
|
||||
<button id="download-btn" class="button" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus>Download</button>
|
||||
<button class="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
|
||||
<button id="share-btn" class="button" data-i18n-key="dialogs.share" data-i18n-attrs="text" hidden></button>
|
||||
<button id="download-btn" class="button" data-i18n-key="dialogs.download" data-i18n-attrs="text" autofocus></button>
|
||||
<button class="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -359,25 +405,25 @@
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<div class="column">
|
||||
<h2 class="center" data-i18n-key="dialogs.send-message-title" data-i18n-attrs="text">Send Message</h2>
|
||||
<h2 class="center" data-i18n-key="dialogs.send-message-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center display-name-wrapper">
|
||||
<div class="column">
|
||||
<div class="text-center">
|
||||
<span data-i18n-key="dialogs.send-message-to" data-i18n-attrs="text">Send a Message to</span>
|
||||
<span data-i18n-key="dialogs.send-message-to" data-i18n-attrs="text"></span>
|
||||
<span class="display-name badge"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="column fw">
|
||||
<textarea title="Message" class="textarea" wrap="off" autofocus></textarea>
|
||||
<div id="text-input" class="textarea" role="textbox" data-i18n-key="dialogs.message" data-i18n-attrs="title" autocapitalize="none" spellcheck="false" autofocus contenteditable></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-row row-reverse">
|
||||
<button class="button" type="submit" title="CTRL/⌘ + ENTER" data-i18n-key="dialogs.send" data-i18n-attrs="text" disabled>Send</button>
|
||||
<button class="button" type="button" title="ESCAPE" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close>Cancel</button>
|
||||
<button class="button" type="submit" title="CTRL/⌘ + ENTER" data-i18n-key="dialogs.send" data-i18n-attrs="text" disabled></button>
|
||||
<button class="button" type="button" title="ESCAPE" data-i18n-key="dialogs.cancel" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -388,12 +434,12 @@
|
||||
<x-background class="full center">
|
||||
<x-paper shadow="2">
|
||||
<div class="row center">
|
||||
<h2 class="text-center" data-i18n-key="dialogs.receive-text-title" data-i18n-attrs="text">Message Received</h2>
|
||||
<h2 class="text-center" data-i18n-key="dialogs.receive-text-title" data-i18n-attrs="text"></h2>
|
||||
</div>
|
||||
<div class="row center">
|
||||
<div class="text-center">
|
||||
<span class="display-name badge"></span>
|
||||
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text">has sent:</span>
|
||||
<span data-i18n-key="dialogs.has-sent" data-i18n-attrs="text"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row center">
|
||||
@@ -402,8 +448,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row-reverse center button-row">
|
||||
<button id="copy" class="button" title="CTRL/⌘ + C" data-i18n-key="dialogs.copy" data-i18n-attrs="text">Copy</button>
|
||||
<button id="close" class="button" title="ESCAPE" data-i18n-key="dialogs.close" data-i18n-attrs="text">Close</button>
|
||||
<button id="copy" class="button" title="CTRL/⌘ + C" data-i18n-key="dialogs.copy" data-i18n-attrs="text"></button>
|
||||
<button id="close" class="button" title="ESCAPE" data-i18n-key="dialogs.close" data-i18n-attrs="text"></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -415,7 +461,7 @@
|
||||
<button class="button center" id="base64-paste-btn" title="Paste"></button>
|
||||
<div class="textarea" placeholder="Paste here to send files" title="CMD/⌘ + V" contenteditable hidden></div>
|
||||
<div class="row-reverse center button-row">
|
||||
<button class="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close>Close</button>
|
||||
<button class="button" data-i18n-key="dialogs.close" data-i18n-attrs="text" close></button>
|
||||
</div>
|
||||
</x-paper>
|
||||
</x-background>
|
||||
@@ -426,119 +472,119 @@
|
||||
</div>
|
||||
<!-- About Page -->
|
||||
<x-about id="about" class="full center column">
|
||||
<header class="row-reverse fade-in">
|
||||
<a href="#" class="close icon-button" data-i18n-key="about.close-about" data-i18n-attrs="aria-label" aria-label="Close About PairDrop">
|
||||
<header class="row-reverse">
|
||||
<a href="#" class="close icon-button" data-i18n-key="about.close-about" data-i18n-attrs="aria-label">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#close-icon" />
|
||||
<use xlink:href="#close-icon"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</header>
|
||||
<section class="center column fade-in">
|
||||
<section class="center column">
|
||||
<svg class="icon logo">
|
||||
<use xlink:href="#wifi-tethering" />
|
||||
<use xlink:href="#wifi-tethering"></use>
|
||||
</svg>
|
||||
<div class="title-wrapper">
|
||||
<div class="title-wrapper" dir="ltr">
|
||||
<h1>PairDrop</h1>
|
||||
<div class="font-subheading">v1.8.3</div>
|
||||
<div class="font-subheading">v1.9.0</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"></div>
|
||||
<div class="row">
|
||||
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop" title="PairDrop on Github" rel="noreferrer" data-i18n-key="about.github" data-i18n-attrs="title">
|
||||
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop" rel="noreferrer" data-i18n-key="about.github" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#github" />
|
||||
<use xlink:href="#github"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="icon-button" target="_blank" href="https://www.buymeacoffee.com/pairdrop" title="Buy me a coffee!" rel="noreferrer" data-i18n-key="about.buy-me-a-coffee" data-i18n-attrs="title">
|
||||
<a class="icon-button" target="_blank" href="https://www.buymeacoffee.com/pairdrop" rel="noreferrer" data-i18n-key="about.buy-me-a-coffee" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#monetarization" />
|
||||
<use xlink:href="#monetarization"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="icon-button" target="_blank" href="https://twitter.com/intent/tweet?text=https%3A%2F%2Fpairdrop.net%20by%20https%3A%2F%2Fgithub.com%2Fschlagmichdoch%2F&" title="Tweet about PairDrop" rel="noreferrer" data-i18n-key="about.tweet" data-i18n-attrs="title">
|
||||
<a class="icon-button" target="_blank" href="https://twitter.com/intent/tweet?text=https%3A%2F%2Fpairdrop.net%20by%20https%3A%2F%2Fgithub.com%2Fschlagmichdoch%2F&" rel="noreferrer" data-i18n-key="about.tweet" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#twitter" />
|
||||
<use xlink:href="#twitter"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop/blob/master/docs/faq.md" title="Frequently asked questions" rel="noreferrer" data-i18n-key="about.faq" data-i18n-attrs="title">
|
||||
<a class="icon-button" target="_blank" href="https://github.com/schlagmichdoch/pairdrop/blob/master/docs/faq.md" rel="noreferrer" data-i18n-key="about.faq" data-i18n-attrs="title">
|
||||
<svg class="icon">
|
||||
<use xlink:href="#help-outline" />
|
||||
<use xlink:href="#help-outline"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
<x-background></x-background>
|
||||
</x-about>
|
||||
<canvas class="circles"></canvas>
|
||||
<canvas class="circles opacity-0"></canvas>
|
||||
<!-- SVG Icon Library -->
|
||||
<svg style="display: none;">
|
||||
<symbol id=wifi-tethering viewBox="0 0 24 24">
|
||||
<symbol id="wifi-tethering" viewBox="0 0 24 24">
|
||||
<path d="M12 11c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 2c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-2.21 1.79-4 4-4s4 1.79 4 4c0 1.48-.81 2.75-2 3.45l1 1.74c1.79-1.04 3-2.97 3-5.19zM12 3C6.48 3 2 7.48 2 13c0 3.7 2.01 6.92 4.99 8.65l1-1.73C5.61 18.53 4 15.96 4 13c0-4.42 3.58-8 8-8s8 3.58 8 8c0 2.96-1.61 5.53-4 6.92l1 1.73c2.99-1.73 5-4.95 5-8.65 0-5.52-4.48-10-10-10z"></path>
|
||||
</symbol>
|
||||
<symbol id=desktop-mac viewBox="0 0 24 24">
|
||||
<symbol id="desktop-mac" viewBox="0 0 24 24">
|
||||
<path d="M21 2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7l-2 3v1h8v-1l-2-3h7c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 12H3V4h18v10z"></path>
|
||||
</symbol>
|
||||
<symbol id=phone-iphone viewBox="0 0 24 24">
|
||||
<symbol id="phone-iphone" viewBox="0 0 24 24">
|
||||
<path d="M15.5 1h-8C6.12 1 5 2.12 5 3.5v17C5 21.88 6.12 23 7.5 23h8c1.38 0 2.5-1.12 2.5-2.5v-17C18 2.12 16.88 1 15.5 1zm-4 21c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5-4H7V4h9v14z"></path>
|
||||
</symbol>
|
||||
<symbol id=tablet-mac viewBox="0 0 24 24">
|
||||
<symbol id="tablet-mac" viewBox="0 0 24 24">
|
||||
<path d="M18.5 0h-14C3.12 0 2 1.12 2 2.5v19C2 22.88 3.12 24 4.5 24h14c1.38 0 2.5-1.12 2.5-2.5v-19C21 1.12 19.88 0 18.5 0zm-7 23c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7.5-4H4V3h15v16z"></path>
|
||||
</symbol>
|
||||
<symbol id=info-outline viewBox="0 0 24 24">
|
||||
<symbol id="info-outline" viewBox="0 0 24 24">
|
||||
<path d="M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 9h2V7h-2v2z"></path>
|
||||
</symbol>
|
||||
<symbol id=close-icon viewBox="0 0 24 24">
|
||||
<symbol id="close-icon" viewBox="0 0 24 24">
|
||||
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path>
|
||||
</symbol>
|
||||
<symbol id=help-outline viewBox="0 0 24 24">
|
||||
<symbol id="help-outline" viewBox="0 0 24 24">
|
||||
<path d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"></path>
|
||||
</symbol>
|
||||
<symbol id="twitter">
|
||||
<path d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z" />
|
||||
<path d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z"></path>
|
||||
</symbol>
|
||||
<symbol id="github">
|
||||
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
|
||||
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
|
||||
</symbol>
|
||||
<g id="notifications">
|
||||
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z" />
|
||||
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"></path>
|
||||
</g>
|
||||
<symbol id="homescreen">
|
||||
<path fill="none" d="M0 0h24v24H0V0z" />
|
||||
<path d="M18 1.01L8 1c-1.1 0-2 .9-2 2v3h2V5h10v14H8v-1H6v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM10 15h2V8H5v2h3.59L3 15.59 4.41 17 10 11.41z" />
|
||||
<path fill="none" d="M0 0h24v24H0V0z" />
|
||||
<path fill="none" d="M0 0h24v24H0V0z"></path>
|
||||
<path d="M18 1.01L8 1c-1.1 0-2 .9-2 2v3h2V5h10v14H8v-1H6v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM10 15h2V8H5v2h3.59L3 15.59 4.41 17 10 11.41z"></path>
|
||||
<path fill="none" d="M0 0h24v24H0V0z"></path>
|
||||
</symbol>
|
||||
<symbol id="monetarization">
|
||||
<path d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z" />
|
||||
<path d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z"></path>
|
||||
</symbol>
|
||||
<symbol id="icon-theme-auto" viewBox="0 0 24 24">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-54 -54 620 620"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M448 256c0-106-86-192-192-192V448c106 0 192-86 192-192zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-54 -54 620 620"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M448 256c0-106-86-192-192-192V448c106 0 192-86 192-192zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256z"></path></svg>
|
||||
</symbol>
|
||||
<symbol id="icon-theme-light" viewBox="0 0 24 24">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-54 -54 620 620"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-54 -54 620 620"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"></path></svg>
|
||||
</symbol>
|
||||
<symbol id="icon-theme-dark" viewBox="0 0 24 24">
|
||||
<rect fill="none" height="24" width="24"/><path d="M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36c-0.98,1.37-2.58,2.26-4.4,2.26 c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/>
|
||||
<rect fill="none" height="24" width="24"></rect><path d="M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36c-0.98,1.37-2.58,2.26-4.4,2.26 c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path>
|
||||
</symbol>
|
||||
<symbol id="pair-device-icon" viewBox="0 0 640 512">
|
||||
<!--! Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
|
||||
<path d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"/>
|
||||
<path d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"></path>
|
||||
</symbol>
|
||||
<symbol id="edit-pair-devices-icon" viewBox="-159 25 640 512">
|
||||
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
|
||||
<!--! edited by @schlagmichdoch -->
|
||||
<path d="M218,155.4c-56.5-56.5-148-56.5-204.5,0L-98.8,267.7c-56.5,56.5-56.5,148,0,204.5c50,50,128.8,56.5,186.3,15.4l1.6-1.1 c14.4-10.3,17.7-30.3,7.4-44.6s-30.3-17.7-44.6-7.4l-1.6,1.1c-32.1,22.9-76,19.3-103.8-8.6c-31.5-31.6-31.5-82.6,0-114.1L58.7,200.6 c31.5-31.5,82.5-31.5,114,0c15.8,15.8,23.8,36.7,23.6,57.6c7.9-8.3,18.9-13,30.6-13c4.5,0,8.9,0.7,13.2,2l17.4,5.5 c0.9-0.5,1.8-1,2.7-1.5C258.7,216.2,244.4,181.8,218,155.4z M420.8,86.6c-50-50-128.8-56.5-186.3-15.4l-1.6,1.1 c-14.4,10.3-17.7,30.3-7.4,44.6s30.3,17.7,44.6,7.4l1.6-1.1c32.1-22.9,76-19.3,103.8,8.6c25.8,25.8,30.5,64.7,14,95.2 c0.7,2,1.3,4,1.8,6.1l3.9,17.9c1.1,0.6,2.1,1.2,3.2,1.8l17.4-5.5c4.3-1.4,8.7-2,13.1-2c7.3,0,14.3,1.8,20.5,5.2 C474.7,196.8,465.1,130.9,420.8,86.6z M140.7,254.4l1.1-1.6c10.3-14.4,6.9-34.4-7.4-44.6s-34.4-6.9-44.6,7.4l-1.1,1.6 C47.5,274.6,54,353.4,104,403.4c18.7,18.7,41.2,31.2,65,37.5c-1.4-3.1-2.6-6.2-3.8-9.3c-6-16.4-1.5-34.6,11.6-46.4l7.2-6.6 c-12.7-3.6-24.7-10.5-34.8-20.5C121.4,330.3,117.8,286.4,140.7,254.4z"/>
|
||||
<path d="M458.9,407.4l-24.3-22.1c0.6-4.7,1-9.4,1-14.2s-0.3-9.6-1-14.2l24.3-22.1c3.9-3.5,5.4-8.9,3.6-13.8v-0.1 c-2.5-6.7-5.4-13.1-8.9-19.2l-2.6-4.5c-3.7-6.2-7.8-12-12.4-17.5c-3.3-4-8.8-5.4-13.7-3.8l-31.2,9.9c-7.5-5.8-15.8-10.6-24.7-14.2 l-7-32c-1.1-5.1-5-9.1-10.2-10c-7.7-1.3-15.7-2-23.8-2s-16.1,0.7-23.8,2c-5.2,0.9-9.1,4.9-10.2,10l-7,32 c-8.9,3.7-17.2,8.5-24.7,14.2l-31.2-9.9c-4.9-1.6-10.4-0.2-13.7,3.8c-4.5,5.5-8.7,11.3-12.4,17.5l-2.6,4.5 c-3.4,6.2-6.4,12.6-8.9,19.2c-1.8,4.9-0.3,10.3,3.6,13.8l24.3,22.1c-0.6,4.7-1,9.4-1,14.2s0.3,9.6,1,14.3L197,407.5 c-3.9,3.5-5.4,8.9-3.6,13.8c2.5,6.7,5.4,13.1,8.9,19.2l2.6,4.5c3.7,6.2,7.8,12,12.4,17.5c3.3,4,8.8,5.4,13.7,3.8l31.2-10 c7.5,5.8,15.8,10.6,24.7,14.2l7,32c1.1,5.1,5,9.1,10.2,10c7.7,1.3,15.7,2,23.8,2c8.1,0,16.1-0.7,23.8-2c5.2-0.8,9.1-4.9,10.2-10 l7-32c8.9-3.6,17.2-8.5,24.7-14.2l31.2,9.9c4.9,1.6,10.4,0.2,13.7-3.8c4.5-5.5,8.7-11.3,12.4-17.5l2.6-4.5 c3.4-6.2,6.4-12.6,8.9-19.2C464.2,416.3,462.7,410.9,458.9,407.4z M328,415.9c-24.8,0-44.9-20.1-44.9-44.8 c0-24.8,20.1-44.8,44.9-44.8s44.8,20.1,44.8,44.8C372.8,395.9,352.7,415.9,328,415.9z"/>
|
||||
<path d="M218,155.4c-56.5-56.5-148-56.5-204.5,0L-98.8,267.7c-56.5,56.5-56.5,148,0,204.5c50,50,128.8,56.5,186.3,15.4l1.6-1.1 c14.4-10.3,17.7-30.3,7.4-44.6s-30.3-17.7-44.6-7.4l-1.6,1.1c-32.1,22.9-76,19.3-103.8-8.6c-31.5-31.6-31.5-82.6,0-114.1L58.7,200.6 c31.5-31.5,82.5-31.5,114,0c15.8,15.8,23.8,36.7,23.6,57.6c7.9-8.3,18.9-13,30.6-13c4.5,0,8.9,0.7,13.2,2l17.4,5.5 c0.9-0.5,1.8-1,2.7-1.5C258.7,216.2,244.4,181.8,218,155.4z M420.8,86.6c-50-50-128.8-56.5-186.3-15.4l-1.6,1.1 c-14.4,10.3-17.7,30.3-7.4,44.6s30.3,17.7,44.6,7.4l1.6-1.1c32.1-22.9,76-19.3,103.8,8.6c25.8,25.8,30.5,64.7,14,95.2 c0.7,2,1.3,4,1.8,6.1l3.9,17.9c1.1,0.6,2.1,1.2,3.2,1.8l17.4-5.5c4.3-1.4,8.7-2,13.1-2c7.3,0,14.3,1.8,20.5,5.2 C474.7,196.8,465.1,130.9,420.8,86.6z M140.7,254.4l1.1-1.6c10.3-14.4,6.9-34.4-7.4-44.6s-34.4-6.9-44.6,7.4l-1.1,1.6 C47.5,274.6,54,353.4,104,403.4c18.7,18.7,41.2,31.2,65,37.5c-1.4-3.1-2.6-6.2-3.8-9.3c-6-16.4-1.5-34.6,11.6-46.4l7.2-6.6 c-12.7-3.6-24.7-10.5-34.8-20.5C121.4,330.3,117.8,286.4,140.7,254.4z"></path>
|
||||
<path d="M458.9,407.4l-24.3-22.1c0.6-4.7,1-9.4,1-14.2s-0.3-9.6-1-14.2l24.3-22.1c3.9-3.5,5.4-8.9,3.6-13.8v-0.1 c-2.5-6.7-5.4-13.1-8.9-19.2l-2.6-4.5c-3.7-6.2-7.8-12-12.4-17.5c-3.3-4-8.8-5.4-13.7-3.8l-31.2,9.9c-7.5-5.8-15.8-10.6-24.7-14.2 l-7-32c-1.1-5.1-5-9.1-10.2-10c-7.7-1.3-15.7-2-23.8-2s-16.1,0.7-23.8,2c-5.2,0.9-9.1,4.9-10.2,10l-7,32 c-8.9,3.7-17.2,8.5-24.7,14.2l-31.2-9.9c-4.9-1.6-10.4-0.2-13.7,3.8c-4.5,5.5-8.7,11.3-12.4,17.5l-2.6,4.5 c-3.4,6.2-6.4,12.6-8.9,19.2c-1.8,4.9-0.3,10.3,3.6,13.8l24.3,22.1c-0.6,4.7-1,9.4-1,14.2s0.3,9.6,1,14.3L197,407.5 c-3.9,3.5-5.4,8.9-3.6,13.8c2.5,6.7,5.4,13.1,8.9,19.2l2.6,4.5c3.7,6.2,7.8,12,12.4,17.5c3.3,4,8.8,5.4,13.7,3.8l31.2-10 c7.5,5.8,15.8,10.6,24.7,14.2l7,32c1.1,5.1,5,9.1,10.2,10c7.7,1.3,15.7,2,23.8,2c8.1,0,16.1-0.7,23.8-2c5.2-0.8,9.1-4.9,10.2-10 l7-32c8.9-3.6,17.2-8.5,24.7-14.2l31.2,9.9c4.9,1.6,10.4,0.2,13.7-3.8c4.5-5.5,8.7-11.3,12.4-17.5l2.6-4.5 c3.4-6.2,6.4-12.6,8.9-19.2C464.2,416.3,462.7,410.9,458.9,407.4z M328,415.9c-24.8,0-44.9-20.1-44.9-44.8 c0-24.8,20.1-44.8,44.9-44.8s44.8,20.1,44.8,44.8C372.8,395.9,352.7,415.9,328,415.9z"></path>
|
||||
</symbol>
|
||||
<symbol id="edit-pen-icon" viewBox="0 0 512 512">
|
||||
<!--! Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
|
||||
<path d="M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z"/>
|
||||
<path d="M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z"></path>
|
||||
</symbol>
|
||||
<symbol id="public-room-icon" viewBox="0 0 640 512">
|
||||
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
|
||||
<path d="M0 24C0 10.7 10.7 0 24 0H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24C10.7 48 0 37.3 0 24zM0 488c0-13.3 10.7-24 24-24H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24c-13.3 0-24-10.7-24-24zM83.2 160a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM32 320c0-35.3 28.7-64 64-64h96c12.2 0 23.7 3.4 33.4 9.4c-37.2 15.1-65.6 47.2-75.8 86.6H64c-17.7 0-32-14.3-32-32zm461.6 32c-10.3-40.1-39.6-72.6-77.7-87.4c9.4-5.5 20.4-8.6 32.1-8.6h96c35.3 0 64 28.7 64 64c0 17.7-14.3 32-32 32H493.6zM391.2 290.4c32.1 7.4 58.1 30.9 68.9 61.6c3.5 10 5.5 20.8 5.5 32c0 17.7-14.3 32-32 32h-224c-17.7 0-32-14.3-32-32c0-11.2 1.9-22 5.5-32c10.5-29.7 35.3-52.8 66.1-60.9c7.8-2.1 16-3.1 24.5-3.1h96c7.4 0 14.7 .8 21.6 2.4zm44-130.4a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM321.6 96a80 80 0 1 1 0 160 80 80 0 1 1 0-160z"/>
|
||||
<path d="M0 24C0 10.7 10.7 0 24 0H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24C10.7 48 0 37.3 0 24zM0 488c0-13.3 10.7-24 24-24H616c13.3 0 24 10.7 24 24s-10.7 24-24 24H24c-13.3 0-24-10.7-24-24zM83.2 160a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM32 320c0-35.3 28.7-64 64-64h96c12.2 0 23.7 3.4 33.4 9.4c-37.2 15.1-65.6 47.2-75.8 86.6H64c-17.7 0-32-14.3-32-32zm461.6 32c-10.3-40.1-39.6-72.6-77.7-87.4c9.4-5.5 20.4-8.6 32.1-8.6h96c35.3 0 64 28.7 64 64c0 17.7-14.3 32-32 32H493.6zM391.2 290.4c32.1 7.4 58.1 30.9 68.9 61.6c3.5 10 5.5 20.8 5.5 32c0 17.7-14.3 32-32 32h-224c-17.7 0-32-14.3-32-32c0-11.2 1.9-22 5.5-32c10.5-29.7 35.3-52.8 66.1-60.9c7.8-2.1 16-3.1 24.5-3.1h96c7.4 0 14.7 .8 21.6 2.4zm44-130.4a64 64 0 1 1 128 0 64 64 0 1 1 -128 0zM321.6 96a80 80 0 1 1 0 160 80 80 0 1 1 0-160z"></path>
|
||||
</symbol>
|
||||
<symbol id="icon-language-selector" viewBox="0 0 640 512">
|
||||
<!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
|
||||
<path d="M0 128C0 92.7 28.7 64 64 64H256h48 16H576c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H320 304 256 64c-35.3 0-64-28.7-64-64V128zm320 0V384H576V128H320zM178.3 175.9c-3.2-7.2-10.4-11.9-18.3-11.9s-15.1 4.7-18.3 11.9l-64 144c-4.5 10.1 .1 21.9 10.2 26.4s21.9-.1 26.4-10.2l8.9-20.1h73.6l8.9 20.1c4.5 10.1 16.3 14.6 26.4 10.2s14.6-16.3 10.2-26.4l-64-144zM160 233.2L179 276H141l19-42.8zM448 164c11 0 20 9 20 20v4h44 16c11 0 20 9 20 20s-9 20-20 20h-2l-1.6 4.5c-8.9 24.4-22.4 46.6-39.6 65.4c.9 .6 1.8 1.1 2.7 1.6l18.9 11.3c9.5 5.7 12.5 18 6.9 27.4s-18 12.5-27.4 6.9l-18.9-11.3c-4.5-2.7-8.8-5.5-13.1-8.5c-10.6 7.5-21.9 14-34 19.4l-3.6 1.6c-10.1 4.5-21.9-.1-26.4-10.2s.1-21.9 10.2-26.4l3.6-1.6c6.4-2.9 12.6-6.1 18.5-9.8l-12.2-12.2c-7.8-7.8-7.8-20.5 0-28.3s20.5-7.8 28.3 0l14.6 14.6 .5 .5c12.4-13.1 22.5-28.3 29.8-45H448 376c-11 0-20-9-20-20s9-20 20-20h52v-4c0-11 9-20 20-20z"/>
|
||||
<path d="M0 128C0 92.7 28.7 64 64 64H256h48 16H576c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H320 304 256 64c-35.3 0-64-28.7-64-64V128zm320 0V384H576V128H320zM178.3 175.9c-3.2-7.2-10.4-11.9-18.3-11.9s-15.1 4.7-18.3 11.9l-64 144c-4.5 10.1 .1 21.9 10.2 26.4s21.9-.1 26.4-10.2l8.9-20.1h73.6l8.9 20.1c4.5 10.1 16.3 14.6 26.4 10.2s14.6-16.3 10.2-26.4l-64-144zM160 233.2L179 276H141l19-42.8zM448 164c11 0 20 9 20 20v4h44 16c11 0 20 9 20 20s-9 20-20 20h-2l-1.6 4.5c-8.9 24.4-22.4 46.6-39.6 65.4c.9 .6 1.8 1.1 2.7 1.6l18.9 11.3c9.5 5.7 12.5 18 6.9 27.4s-18 12.5-27.4 6.9l-18.9-11.3c-4.5-2.7-8.8-5.5-13.1-8.5c-10.6 7.5-21.9 14-34 19.4l-3.6 1.6c-10.1 4.5-21.9-.1-26.4-10.2s.1-21.9 10.2-26.4l3.6-1.6c6.4-2.9 12.6-6.1 18.5-9.8l-12.2-12.2c-7.8-7.8-7.8-20.5 0-28.3s20.5-7.8 28.3 0l14.6 14.6 .5 .5c12.4-13.1 22.5-28.3 29.8-45H448 376c-11 0-20-9-20-20s9-20 20-20h52v-4c0-11 9-20 20-20z"></path>
|
||||
</symbol>
|
||||
|
||||
</svg>
|
||||
@@ -547,7 +593,7 @@
|
||||
<script src="scripts/theme.js"></script>
|
||||
<script src="scripts/network.js"></script>
|
||||
<script src="scripts/ui.js"></script>
|
||||
<script src="scripts/util.js" async></script>
|
||||
<script src="scripts/util.js"></script>
|
||||
<script src="scripts/QRCode.min.js" async></script>
|
||||
<script src="scripts/zip.min.js" async></script>
|
||||
<script src="scripts/NoSleep.min.js" async></script>
|
||||
@@ -564,3 +610,4 @@
|
||||
</x-noscript>
|
||||
</noscript>
|
||||
</body>
|
||||
</html>
|
||||
159
public_included_ws_fallback/lang/ar.json
Normal file
159
public_included_ws_fallback/lang/ar.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "إذا لم يكن WebRTC متاحًا.",
|
||||
"public-room-devices_title": "يمكن اكتشافك بواسطة الأجهزة الموجودة في هذه الغرفة العامة المستقلة عن الشبكة.",
|
||||
"display-name_data-placeholder": "تحميل …",
|
||||
"display-name_title": "قم بتحرير اسم جهازك بشكل دائم",
|
||||
"traffic": "حركة المرور هي",
|
||||
"paired-devices_title": "يمكن اكتشافك بواسطة الأجهزة المقترنة في جميع الأوقات بشكل مستقل عن الشبكة.",
|
||||
"public-room-devices": "في الغرفة {{roomId}}",
|
||||
"paired-devices": "بواسطة الأجهزة المقترنة",
|
||||
"on-this-network": "على هذه الشبكة",
|
||||
"routed": "توجيهّا من خلال الخادم",
|
||||
"discovery": "يمكنك اكتشاف:",
|
||||
"on-this-network_title": "يمكن للجميع اكتشافك على هذه الشبكة.",
|
||||
"known-as": "أنت معروف بأنك:"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "يرغب {{name}} في نقل {{count}} {{descriptor}}",
|
||||
"unfinished-transfers-warning": "هناك تحويلات غير مكتملة. هل أنت متأكد أنك تريد إغلاق PairDrop؟",
|
||||
"message-received": "تم استلام الرابط بواسطة {{name}} - انقر للفتح",
|
||||
"rate-limit-join-key": "تم الوصول إلى الحد الأقصى. انتظر 10 ثوان وحاول مرة أخرى.",
|
||||
"connecting": "يتصل …",
|
||||
"pairing-key-invalidated": "المفتاح {{key}} خاطئ.",
|
||||
"pairing-key-invalid": "مُفتاح خاطئ",
|
||||
"connected": "متصل.",
|
||||
"pairing-not-persistent": "الأجهزة المقترنة ليست ثابتة.",
|
||||
"text-content-incorrect": "محتوى النص غير صحيح.",
|
||||
"message-transfer-completed": "اكتمل نقل الرسالة.",
|
||||
"file-transfer-completed": "اكتمل نقل الملف.",
|
||||
"file-content-incorrect": "محتوى الملف غير صحيح.",
|
||||
"files-incorrect": "الملفات غير صحيحة.",
|
||||
"selected-peer-left": "مُحَدد الاجهزة المقترنة.",
|
||||
"link-received": "تم استلام الرابط بواسطة {{name}} - انقر للفتح",
|
||||
"online": "لقد عدت متصلاً بالإنترنت",
|
||||
"public-room-left": "الخروج من الغرفة العامة {{publicRoomId}}",
|
||||
"copied-text": "نُسِخَ النص إلى الحافظة",
|
||||
"display-name-random-again": "يتم إنشاء اسم العرض بشكل عشوائي مرة أخرى.",
|
||||
"display-name-changed-permanently": "يتم تغيير اسم العرض بشكل دائم.",
|
||||
"copied-to-clipboard-error": "النسخ غير ممكن. انسخ يدويًا.",
|
||||
"pairing-success": "الأجهزة المقترنة.",
|
||||
"clipboard-content-incorrect": "محتوى الحافظة غير صحيح.",
|
||||
"display-name-changed-temporarily": "تم تغيير اسم العرض لهذه الجلسة فقط.",
|
||||
"copied-to-clipboard": "تم النسخ إلى الحافظة",
|
||||
"offline": "انت غير متصل",
|
||||
"pairing-tabs-error": "من المستحيل إقران علامتي تبويب متصفح الويب.",
|
||||
"public-room-id-invalid": "معرف الغرفة غير صالح",
|
||||
"click-to-download": "إضغط للتحميل",
|
||||
"pairing-cleared": "جميع الأجهزة غير مقترنة.",
|
||||
"notifications-enabled": "تم تمكين الإشعارات.",
|
||||
"online-requirement-pairing": "يجب أن تكون متصلاً بالإنترنت لإقران الأجهزة.",
|
||||
"ios-memory-limit": "لا يمكن إرسال ملفات إلى iOS إلا بحجم يصل إلى 200 ميجابايت مرة واحدة",
|
||||
"online-requirement-public-room": "يجب أن تكون متصلاً بالإنترنت لإنشاء غرفة عامة.",
|
||||
"copied-text-error": "فشلت الكتابة من الحافظة. انسخ يدويًا!",
|
||||
"download-successful": "تم تحميل {{descriptor}}",
|
||||
"click-to-show": "اضغط للعرض"
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "تمّ",
|
||||
"theme-auto_title": "تكيٌف المظهر مع النظام",
|
||||
"install_title": "تثبيت PairDrop",
|
||||
"theme-dark_title": "إستخدام دائما المظهر المظلم",
|
||||
"pair-device_title": "قم بإقران أجهزتك بشكل دائم",
|
||||
"join-public-room_title": "انضم إلى الغرفة العامة مؤقتًا",
|
||||
"notification_title": "تشغيل الإشعارات",
|
||||
"edit-paired-devices_title": "تعديل الأجهزة المقترنة",
|
||||
"language-selector_title": "إختر اللغةعربي",
|
||||
"about_title": "حول PairDrop",
|
||||
"about_aria-label": "افتح حول PairDrop",
|
||||
"theme-light_title": "إستخدم دائماً المظهر الفاتح"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "انقر لإرسال الملفات أو انقر لفترة طويلة لإرسال رسالة",
|
||||
"click-to-send": "انقر للإرسال",
|
||||
"activate-paste-mode-and-other-files": "و{{count}} ملفات أخرى",
|
||||
"tap-to-send": "انقر للإرسال",
|
||||
"activate-paste-mode-base": "افتح PairDrop على الأجهزة الأخرى للإرسال",
|
||||
"no-peers-subtitle": "قم بإقران الأجهزة أو ادخل إلى غرفة عامة لتتمكن من إكتشافها على الشبكات الأخرى",
|
||||
"activate-paste-mode-shared-text": "النص المشترك",
|
||||
"x-instructions_desktop": "انقر لإرسال الملفات أو انقر بزر الماوس الأيمن لإرسال رسالة",
|
||||
"no-peers-title": "افتح PairDrop على الأجهزة الأخرى لإرسال الملفات",
|
||||
"x-instructions_data-drop-bg": "حرر لتحديد المستلم",
|
||||
"no-peers_data-drop-bg": "حرر لتحديد المستلم",
|
||||
"x-instructions_data-drop-peer": "قم بالتحرير لإرسالها إلى النظير"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "مُعالجة …",
|
||||
"click-to-send-paste-mode": "انقر للإرسال {{descriptor}}",
|
||||
"click-to-send": "انقر لإرسال الملفات أو انقر بزر الماوس الأيمن لإرسال رسالة",
|
||||
"waiting": "يُرجى الإنتظار…",
|
||||
"connection-hash": "للتحقق من أمان التشفير الشامل، قم بمقارنة رقم الأمان هذا على كلا الجهازين",
|
||||
"preparing": "يقترن…",
|
||||
"transferring": "جارٍ النقل…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "الصق هنا لإرسال {{type}}",
|
||||
"auto-accept-instructions-2": "لقبول جميع الملفات المرسلة من هذا الجهاز تلقائيًا.",
|
||||
"receive-text-title": "تلقيت رسالة",
|
||||
"edit-paired-devices-title": "تحرير الأجهزة المقترنة",
|
||||
"cancel": "إلغاء",
|
||||
"auto-accept-instructions-1": "تفعيل",
|
||||
"pair-devices-title": "إقران الأجهزة بشكل دائم",
|
||||
"download": "تحميل",
|
||||
"title-file": "ملف",
|
||||
"base64-processing": "مُعالجة…",
|
||||
"decline": "رفض",
|
||||
"receive-title": "تم الاستلام {{descriptor}}",
|
||||
"leave": "مُغادرة",
|
||||
"join": "انضمام",
|
||||
"title-image-plural": "صور",
|
||||
"send": "ارسال",
|
||||
"base64-tap-to-paste": "انقر هنا للصق {{type}}",
|
||||
"base64-text": "نص",
|
||||
"copy": "نسخ",
|
||||
"file-other-description-image": "وصورة واحدة أخرى",
|
||||
"temporary-public-room-title": "غرفة عامة مؤقتة",
|
||||
"base64-files": "ملفات",
|
||||
"has-sent": "ارسلت:",
|
||||
"file-other-description-file": "وملف واحد آخر",
|
||||
"close": "إغلاق",
|
||||
"system-language": "لغة النظام",
|
||||
"unpair": "إلغاء الإقتران",
|
||||
"title-image": "صورة",
|
||||
"file-other-description-file-plural": "و{{count}} ملفات أخرى",
|
||||
"would-like-to-share": "ترغب في المشاركة",
|
||||
"send-message-to": "أرسال رسالة إلى",
|
||||
"language-selector-title": "إختر اللُغة",
|
||||
"pair": "إقتران",
|
||||
"hr-or": "او",
|
||||
"scan-qr-code": "أو مسح رمز الاستجابة السريعة.",
|
||||
"input-key-on-this-device": "أدخل هذا المفتاح على جهاز آخر",
|
||||
"download-again": "تحميل مرة أخرى",
|
||||
"accept": "قبول",
|
||||
"paired-devices-wrapper_data-empty": "لا توجد أجهزة مقترنة.",
|
||||
"enter-key-from-another-device": "أدخل المفتاح من جهاز آخر هنا.",
|
||||
"share": "مُشاركة",
|
||||
"auto-accept": "قبول تلقائي",
|
||||
"title-file-plural": "ملفات",
|
||||
"send-message-title": "إرسال رسالة",
|
||||
"input-room-id-on-another-device": "أدخل معرف الغرفة هذا على جهاز آخر ما ",
|
||||
"file-other-description-image-plural": "و{{count}} صور أخرى",
|
||||
"enter-room-id-from-another-device": "أدخل معرف الغرفة من جهاز آخر للانضمام إلى الغرفة."
|
||||
},
|
||||
"about": {
|
||||
"claim": "أسهل طريقة لنقل الملفات عبر الأجهزة",
|
||||
"tweet_title": "غرّد حول PairDrop",
|
||||
"close-about_aria-label": "إغلاق حول PairDrop",
|
||||
"buy-me-a-coffee_title": "اشتري لي القهوة!",
|
||||
"github_title": "PairDrop على جيت هاب",
|
||||
"faq_title": "أسئلة متكررة"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "طلب نقل الملف",
|
||||
"message-received-plural": "{{count}} الرسائل المستلمة",
|
||||
"message-received": "تم إرسال الرسالة",
|
||||
"file-received": "تم استلام الملف",
|
||||
"file-received-plural": "{{count}} الملفات المستلمة",
|
||||
"image-transfer-requested": "طُلب نقل الصور المطلوبة"
|
||||
}
|
||||
}
|
||||
@@ -7,21 +7,21 @@
|
||||
"pair-device_title": "Deine Geräte dauerhaft koppeln",
|
||||
"edit-paired-devices_title": "Gekoppelte Geräte bearbeiten",
|
||||
"theme-auto_title": "Systemstil verwenden",
|
||||
"theme-dark_title": "Dunklen Stil verwenden",
|
||||
"theme-light_title": "Hellen Stil verwenden",
|
||||
"theme-dark_title": "Immer dunklen Stil verwenden",
|
||||
"theme-light_title": "Immer hellen Stil verwenden",
|
||||
"cancel-paste-mode": "Fertig",
|
||||
"language-selector_title": "Sprache auswählen",
|
||||
"language-selector_title": "Sprache Wählen",
|
||||
"join-public-room_title": "Öffentlichen Raum temporär betreten"
|
||||
},
|
||||
"dialogs": {
|
||||
"share": "Teilen",
|
||||
"download": "Herunterladen",
|
||||
"pair-devices-title": "Geräte dauerhaft koppeln",
|
||||
"pair-devices-title": "Geräte Dauerhaft Koppeln",
|
||||
"input-key-on-this-device": "Gib diesen Schlüssel auf einem anderen Gerät ein",
|
||||
"enter-key-from-another-device": "Gib den Schlüssel von einem anderen Gerät hier ein.",
|
||||
"pair": "Koppeln",
|
||||
"cancel": "Abbrechen",
|
||||
"edit-paired-devices-title": "Gekoppelte Geräte bearbeiten",
|
||||
"edit-paired-devices-title": "Gekoppelte Geräte Bearbeiten",
|
||||
"paired-devices-wrapper_data-empty": "Keine gekoppelten Geräte.",
|
||||
"close": "Schließen",
|
||||
"accept": "Akzeptieren",
|
||||
@@ -34,14 +34,14 @@
|
||||
"would-like-to-share": "möchte Folgendes teilen",
|
||||
"send": "Senden",
|
||||
"copy": "Kopieren",
|
||||
"receive-text-title": "Textnachricht erhalten",
|
||||
"receive-text-title": "Textnachricht Erhalten",
|
||||
"file-other-description-image-plural": "und {{count}} andere Bilder",
|
||||
"file-other-description-file-plural": "und {{count}} andere Dateien",
|
||||
"auto-accept-instructions-1": "Aktiviere",
|
||||
"auto-accept": "auto-accept",
|
||||
"auto-accept-instructions-2": "um automatisch alle Dateien von diesem Gerät zu akzeptieren.",
|
||||
"has-sent": "hat Folgendes gesendet:",
|
||||
"send-message-title": "Textnachricht senden",
|
||||
"send-message-title": "Textnachricht Senden",
|
||||
"send-message-to": "Sende eine Textnachricht an",
|
||||
"base64-tap-to-paste": "Hier tippen, um {{type}} einzufügen",
|
||||
"base64-paste-to-send": "Hier einfügen, um {{type}} zu versenden",
|
||||
@@ -50,10 +50,10 @@
|
||||
"base64-processing": "Bearbeitung läuft…",
|
||||
"file-other-description-image": "und ein anderes Bild",
|
||||
"file-other-description-file": "und eine andere Datei",
|
||||
"receive-title": "{{descriptor}} erhalten",
|
||||
"receive-title": "{{descriptor}} Erhalten",
|
||||
"download-again": "Erneut herunterladen",
|
||||
"system-language": "Systemsprache",
|
||||
"language-selector-title": "Sprache auswählen",
|
||||
"language-selector-title": "Sprache Einstellen",
|
||||
"hr-or": "ODER",
|
||||
"input-room-id-on-another-device": "Gib diese Raum-ID auf einem anderen Gerät ein",
|
||||
"unpair": "Entkoppeln",
|
||||
@@ -68,7 +68,7 @@
|
||||
"close-about_aria-label": "Schließe Über PairDrop",
|
||||
"github_title": "PairDrop auf GitHub",
|
||||
"buy-me-a-coffee_title": "Kauf mir einen Kaffee!",
|
||||
"claim": "Der einfachste Weg Dateien zwischen Geräten zu teilen"
|
||||
"claim": "Der einfachste Weg, Dateien zwischen Geräten zu übertragen"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Du wirst angezeigt als:",
|
||||
@@ -80,7 +80,7 @@
|
||||
"routed": "durch den Server geleitet",
|
||||
"webrtc": "wenn WebRTC nicht verfügbar ist.",
|
||||
"display-name_data-placeholder": "Lade…",
|
||||
"public-room-devices_title": "Du kannst von Geräten in diesem öffentlichen Raum unabhängig von deinem Netzwerk gefunden werden.",
|
||||
"public-room-devices_title": "Du kannst von Geräten in diesem öffentlichen Raum gefunden werden, unabhängig von deinem Netzwerk.",
|
||||
"paired-devices_title": "Du kannst immer von gekoppelten Geräten gefunden werden, egal in welchem Netzwerk.",
|
||||
"public-room-devices": "in Raum {{roomId}}",
|
||||
"discovery": "Du bist sichtbar:",
|
||||
@@ -114,9 +114,9 @@
|
||||
"online-requirement": "Du musst online sein um Geräte zu koppeln.",
|
||||
"display-name-changed-temporarily": "Anzeigename wurde nur für diese Session geändert.",
|
||||
"request-title": "{{name}} möchte {{count}}{{descriptor}} übertragen",
|
||||
"connecting": "Verbindung wird aufgebaut…",
|
||||
"connecting": "Verbindung wird hergestellt…",
|
||||
"files-incorrect": "Dateien sind fehlerhaft.",
|
||||
"file-transfer-completed": "Dateiübertragung fertiggestellt.",
|
||||
"file-transfer-completed": "Dateiübertragung abgeschlossen.",
|
||||
"message-transfer-completed": "Nachrichtenübertragung fertiggestellt.",
|
||||
"rate-limit-join-key": "Rate Limit erreicht. Warte 10 Sekunden und versuche es erneut.",
|
||||
"selected-peer-left": "Ausgewählter Peer ist gegangen.",
|
||||
@@ -128,7 +128,7 @@
|
||||
"online-requirement-public-room": "Du musst online sein, um öffentliche Räume erstellen zu können."
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_desktop": "Klicke, um Dateien zu Senden oder klicke mit der rechten Maustaste, um Textnachrichten zu senden",
|
||||
"x-instructions_desktop": "Klicke, um Dateien zu senden oder benutze einen Rechtsklick, um eine Textnachricht zu senden",
|
||||
"no-peers-title": "Öffne PairDrop auf anderen Geräten, um Dateien zu senden",
|
||||
"no-peers_data-drop-bg": "Hier ablegen, um Empfänger auszuwählen",
|
||||
"no-peers-subtitle": "Kopple Geräte oder besuche einen öffentlichen Raum, damit du in anderen Netzwerken sichtbar bist",
|
||||
@@ -136,20 +136,21 @@
|
||||
"tap-to-send": "Tippe zum Senden von",
|
||||
"x-instructions_data-drop-peer": "Hier ablegen, um an Peer zu senden",
|
||||
"x-instructions_data-drop-bg": "Loslassen um Empfänger auszuwählen",
|
||||
"x-instructions_mobile": "Tippe zum Senden von Dateien oder tippe lange zum Senden von Nachrichten",
|
||||
"x-instructions_mobile": "Tippe, um Dateien zu senden oder tippe lange, um Nachrichten zu senden",
|
||||
"activate-paste-mode-base": "Öffne PairDrop auf anderen Geräten zum Senden von",
|
||||
"activate-paste-mode-and-other-files": "und {{count}} anderen Dateien",
|
||||
"activate-paste-mode-shared-text": "freigegebenem Text"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Datenübertagung angefordert",
|
||||
"file-transfer-requested": "Dateiübertragung angefordert",
|
||||
"file-received": "Datei erhalten",
|
||||
"file-received-plural": "{{count}} Dateien erhalten",
|
||||
"message-received": "Nachricht erhalten",
|
||||
"message-received-plural": "{{count}} Nachrichten erhalten"
|
||||
"message-received-plural": "{{count}} Nachrichten erhalten",
|
||||
"image-transfer-requested": "Bilder Transfer beantragt"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send": "Klicke um Dateien zu senden oder nutze einen Rechtsklick um eine Textnachricht zu senden",
|
||||
"click-to-send": "Klicke, um Dateien zu senden oder benutze einen Rechtsklick, um eine Textnachricht zu senden",
|
||||
"connection-hash": "Um die Ende-zu-Ende Verschlüsselung zu verifizieren, vergleiche die Sicherheitsnummer auf beiden Geräten",
|
||||
"waiting": "Warte…",
|
||||
"click-to-send-paste-mode": "Klicken um {{descriptor}} zu senden",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"header": {
|
||||
"about_title": "About PairDrop",
|
||||
"language-selector_title": "Select Language",
|
||||
"language-selector_title": "Set Language",
|
||||
"about_aria-label": "Open About PairDrop",
|
||||
"theme-auto_title": "Adapt Theme to System",
|
||||
"theme-light_title": "Always Use Light-Theme",
|
||||
"theme-dark_title": "Always Use Dark-Theme",
|
||||
"notification_title": "Enable Notifications",
|
||||
"theme-auto_title": "Adapt theme to system automatically",
|
||||
"theme-light_title": "Always use light theme",
|
||||
"theme-dark_title": "Always use dark theme",
|
||||
"notification_title": "Enable notifications",
|
||||
"install_title": "Install PairDrop",
|
||||
"pair-device_title": "Pair Your Devices Permanently",
|
||||
"edit-paired-devices_title": "Edit Paired Devices",
|
||||
"join-public-room_title": "Join Public Room Temporarily",
|
||||
"pair-device_title": "Pair your devices permanently",
|
||||
"edit-paired-devices_title": "Edit paired devices",
|
||||
"join-public-room_title": "Join public room temporarily",
|
||||
"cancel-paste-mode": "Done"
|
||||
},
|
||||
"instructions": {
|
||||
@@ -70,6 +70,7 @@
|
||||
"download": "Download",
|
||||
"send-message-title": "Send Message",
|
||||
"send-message-to": "Send a Message to",
|
||||
"message_title": "Insert message to send",
|
||||
"send": "Send",
|
||||
"receive-text-title": "Message Received",
|
||||
"copy": "Copy",
|
||||
@@ -88,8 +89,10 @@
|
||||
"title-file-plural": "Files",
|
||||
"receive-title": "{{descriptor}} Received",
|
||||
"download-again": "Download again",
|
||||
"language-selector-title": "Select Language",
|
||||
"system-language": "System Language"
|
||||
"language-selector-title": "Set Language",
|
||||
"system-language": "System Language",
|
||||
"public-room-qr-code_title": "Click to copy link to public room",
|
||||
"pair-devices-qr-code_title": "Click to copy link to pair this device"
|
||||
},
|
||||
"about": {
|
||||
"close-about_aria-label": "Close About PairDrop",
|
||||
@@ -113,11 +116,14 @@
|
||||
"public-room-id-invalid": "Invalid room ID",
|
||||
"public-room-left": "Left public room {{publicRoomId}}",
|
||||
"copied-to-clipboard": "Copied to clipboard",
|
||||
"pair-url-copied-to-clipboard": "Link to pair this device copied to clipboard",
|
||||
"room-url-copied-to-clipboard": "Link to public room copied to clipboard",
|
||||
"copied-to-clipboard-error": "Copying not possible. Copy manually.",
|
||||
"text-content-incorrect": "Text content is incorrect.",
|
||||
"file-content-incorrect": "File content is incorrect.",
|
||||
"clipboard-content-incorrect": "Clipboard content is incorrect.",
|
||||
"notifications-enabled": "Notifications enabled.",
|
||||
"notifications-permissions-error": "Notifications permission has been blocked as the user has dismissed the permission prompt several times. This can be reset in Page Info which can be accessed by clicking the lock icon next to the URL.",
|
||||
"link-received": "Link received by {{name}} - Click to open",
|
||||
"message-received": "Message received by {{name}} - Click to copy",
|
||||
"click-to-download": "Click to download",
|
||||
|
||||
159
public_included_ws_fallback/lang/es.json
Normal file
159
public_included_ws_fallback/lang/es.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"header": {
|
||||
"theme-auto_title": "Adaptar tema al sistema",
|
||||
"language-selector_title": "Configurar Idioma",
|
||||
"about_title": "Sobre PairDrop",
|
||||
"about_aria-label": "Abrir Sobre PairDrop",
|
||||
"cancel-paste-mode": "Listo",
|
||||
"install_title": "Instalar PairDrop",
|
||||
"theme-dark_title": "Siempre usar tema oscuro",
|
||||
"pair-device_title": "Empareja tus dispositivos permanentemente",
|
||||
"join-public-room_title": "Unirse a una sala pública temporalmente",
|
||||
"notification_title": "Activar notificaciones",
|
||||
"edit-paired-devices_title": "Editar dispositivos emparejados",
|
||||
"theme-light_title": "Siempre usar tema claro"
|
||||
},
|
||||
"footer": {
|
||||
"webrtc": "si WebRTC no está disponible.",
|
||||
"public-room-devices_title": "Puedes ser descubierto por dispositivos en esta sala pública independientemente de la red.",
|
||||
"display-name_data-placeholder": "Cargando…",
|
||||
"display-name_title": "Edita el nombre de tu dispositivo de forma permanente",
|
||||
"traffic": "El tráfico es",
|
||||
"paired-devices_title": "Puedes ser descubierto por los dispositivos emparejados todo el tiempo independientemente de la red.",
|
||||
"public-room-devices": "en la sala {{roomId}}",
|
||||
"paired-devices": "por dispositivos emparejados",
|
||||
"on-this-network": "en esta red",
|
||||
"routed": "enrutado a través del servidor",
|
||||
"discovery": "Puedes ser descubierto:",
|
||||
"on-this-network_title": "Puedes ser descubierto por todos en esta red.",
|
||||
"known-as": "Eres conocido como:"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}} quiere transferir {{count}} {{descriptor}}",
|
||||
"unfinished-transfers-warning": "Hay transferencias no terminadas. ¿Estás seguro de que quieres cerrar PairDrop?",
|
||||
"message-received": "Mensaje recibido por {{name}} - Haga clic para copiar",
|
||||
"rate-limit-join-key": "Límite de intentos alcanzado. Espere 10 segundos y vuelva a intentarlo.",
|
||||
"connecting": "Conectando…",
|
||||
"pairing-key-invalidated": "Clave {{key}} invalidada.",
|
||||
"pairing-key-invalid": "Clave inválida",
|
||||
"connected": "Connectado.",
|
||||
"pairing-not-persistent": "Los dispositivos emparejados no son persistentes.",
|
||||
"text-content-incorrect": "El contenido del texto es incorrecto.",
|
||||
"message-transfer-completed": "Transferencia de mensaje completada.",
|
||||
"file-transfer-completed": "Transferencia de archivos completada.",
|
||||
"file-content-incorrect": "El contenido del archivo es incorrecto.",
|
||||
"files-incorrect": "Los archivos son incorrectos.",
|
||||
"selected-peer-left": "El dispositivo seleccionado se fue.",
|
||||
"link-received": "Link recibido por {{name}} - Haga clic para abrir",
|
||||
"online": "Estás de nuevo en línea",
|
||||
"public-room-left": "Salió de la sala pública {{publicRoomId}}",
|
||||
"copied-text": "Texto copiado al portapapeles",
|
||||
"display-name-random-again": "El nombre mostrado se genera aleatoriamente nuevamente.",
|
||||
"display-name-changed-permanently": "El nombre para mostrar se ha cambiado permanentemente.",
|
||||
"copied-to-clipboard-error": "No es posible copiarlo. Cópielo manualmente.",
|
||||
"pairing-success": "Dispositivos emparejados.",
|
||||
"clipboard-content-incorrect": "El contenido del portapapeles es incorrecto.",
|
||||
"display-name-changed-temporarily": "El nombre mostrado se cambia solo para esta sesión.",
|
||||
"copied-to-clipboard": "Copiado al portapapeles",
|
||||
"offline": "Estás desconectado",
|
||||
"pairing-tabs-error": "Emparejar dos pestañas del navegador es imposible.",
|
||||
"public-room-id-invalid": "ID de sala no válido",
|
||||
"click-to-download": "Haga clic para descargar",
|
||||
"pairing-cleared": "Todos los dispositivos han sido desemparejados.",
|
||||
"notifications-enabled": "Notificaciones habilitadas.",
|
||||
"online-requirement-pairing": "Debes estar en línea para emparejar dispositivos.",
|
||||
"ios-memory-limit": "Enviar archivos a iOS sólo admite hasta 200 MB a la vez",
|
||||
"online-requirement-public-room": "Debes estar en línea para crear una sala pública.",
|
||||
"copied-text-error": "Error al escribir en el portapapeles. ¡Cópielo manualmente!",
|
||||
"download-successful": "{{descriptor}} descargado",
|
||||
"click-to-show": "Click para mostrar"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Toque para enviar archivos o toque prologádamente para enviar un mensaje",
|
||||
"click-to-send": "Haga clic para enviar",
|
||||
"activate-paste-mode-and-other-files": "y {{count}} archivos diferentes",
|
||||
"tap-to-send": "Toca para enviar",
|
||||
"activate-paste-mode-base": "Abra PairDrop en otros dispositivos para enviar",
|
||||
"no-peers-subtitle": "Empareje dispositivos o ingrese a una sala pública para que lo puedan encontrar en otras redes",
|
||||
"activate-paste-mode-shared-text": "texto compartido",
|
||||
"x-instructions_desktop": "Haga clic para enviar archivos o haga clic derecho para enviar un mensaje",
|
||||
"no-peers-title": "Abra PairDrop en otros dispositivos para enviar archivos",
|
||||
"x-instructions_data-drop-peer": "Liberar para enviar a un par",
|
||||
"x-instructions_data-drop-bg": "Liberar para seleccionar destinatario",
|
||||
"no-peers_data-drop-bg": "Liberar para seleccionar destinatario"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Procesando…",
|
||||
"click-to-send-paste-mode": "Haga clic para enviar {{descriptor}}",
|
||||
"click-to-send": "Haga clic para enviar archivos o haga clic derecho para enviar un mensaje",
|
||||
"waiting": "Esperando…",
|
||||
"connection-hash": "Para verificar la seguridad del cifrado de extremo a extremo, compare este número de seguridad en ambos dispositivos",
|
||||
"preparing": "Preparando…",
|
||||
"transferring": "Transferiendo…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "Pegar aquí para enviar {{type}}",
|
||||
"auto-accept-instructions-2": "para aceptar automáticamente todos los archivos enviados desde ese dispositivo.",
|
||||
"receive-text-title": "Mensaje Recibido",
|
||||
"edit-paired-devices-title": "Editar Dispositivos Emparejados",
|
||||
"cancel": "Cancelar",
|
||||
"auto-accept-instructions-1": "Activar",
|
||||
"pair-devices-title": "Emparejar dispositivos permanentemente",
|
||||
"download": "Descargar",
|
||||
"title-file": "Archivo",
|
||||
"base64-processing": "Procesando…",
|
||||
"decline": "Rechazar",
|
||||
"receive-title": "{{descriptor}} Recibido",
|
||||
"leave": "Salir",
|
||||
"join": "Unirse",
|
||||
"title-image-plural": "Imágenes",
|
||||
"send": "Enviar",
|
||||
"base64-tap-to-paste": "Toca aquí para pegar {{type}}",
|
||||
"base64-text": "texto",
|
||||
"copy": "Copiar",
|
||||
"file-other-description-image": "y una imagen mas",
|
||||
"temporary-public-room-title": "Sala pública temporal",
|
||||
"base64-files": "archivos",
|
||||
"has-sent": "ha enviado:",
|
||||
"file-other-description-file": "y otro archivo",
|
||||
"close": "Cerrar",
|
||||
"system-language": "Idioma del Sistema",
|
||||
"unpair": "Desemparejar",
|
||||
"title-image": "Imagen",
|
||||
"file-other-description-file-plural": "y {{count}} archivos más",
|
||||
"would-like-to-share": "quisiera compartir",
|
||||
"send-message-to": "Enviar un Mensaje a",
|
||||
"language-selector-title": "Configurar Idioma",
|
||||
"pair": "Emparejar",
|
||||
"hr-or": "O",
|
||||
"scan-qr-code": "o escanea el código QR.",
|
||||
"input-key-on-this-device": "Ingrese esta clave en otro dispositivo",
|
||||
"download-again": "Descargar de nuevo",
|
||||
"accept": "Aceptar",
|
||||
"paired-devices-wrapper_data-empty": "Sin dispositivos emparejados.",
|
||||
"enter-key-from-another-device": "Ingresa la clave de otro dispositivo aquí.",
|
||||
"share": "Compartir",
|
||||
"auto-accept": "aceptar automáticamente",
|
||||
"title-file-plural": "Archivos",
|
||||
"send-message-title": "Enviar Mensaje",
|
||||
"input-room-id-on-another-device": "Ingrese el ID de esta sala en otro dispositivo",
|
||||
"file-other-description-image-plural": "y {{count}} imágenes más",
|
||||
"enter-room-id-from-another-device": "Ingresa el ID de la sala desde otro dispositivo para unirte a la sala."
|
||||
},
|
||||
"about": {
|
||||
"claim": "La forma más sencilla de transferir archivos entre dispositivos",
|
||||
"tweet_title": "Tweetea sobre PairDrop",
|
||||
"close-about_aria-label": "Cerrar Sobre PairDrop",
|
||||
"buy-me-a-coffee_title": "¡Cómprame un café!",
|
||||
"github_title": "PairDrop en GitHub",
|
||||
"faq_title": "Preguntas frecuentes"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Transferencia de archivos solicitada",
|
||||
"image-transfer-requested": "Transferencia de imagen solicitada",
|
||||
"message-received-plural": "{{count}} Mensajes recibidos",
|
||||
"message-received": "Mensaje recibido",
|
||||
"file-received": "Archivo Recibido",
|
||||
"file-received-plural": "{{count}} Archivos Recibidos"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"header": {
|
||||
"about_title": "A propos de",
|
||||
"about_title": "À propos de PairDrop",
|
||||
"language-selector_title": "Choix de la langue",
|
||||
"about_aria-label": "Ouvrir à propos de",
|
||||
"about_aria-label": "Ouvrir à propos de PairDrop",
|
||||
"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",
|
||||
@@ -28,10 +28,10 @@
|
||||
"activate-paste-mode-shared-text": "texte partagé"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Vous êtes connu sous le nom de:",
|
||||
"known-as": "Vous êtes connu comme :",
|
||||
"display-name_data-placeholder": "Chargement…",
|
||||
"display-name_title": "Modifiez le nom de votre appareil de manière permanente",
|
||||
"discovery": "Vous pouvez être découvert:",
|
||||
"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",
|
||||
@@ -66,7 +66,7 @@
|
||||
"would-like-to-share": "aimerait partager",
|
||||
"accept": "Accepter",
|
||||
"decline": "Refuser",
|
||||
"has-sent": "a envoyé:",
|
||||
"has-sent": "a envoyé :",
|
||||
"share": "Partage",
|
||||
"download": "Télécharger",
|
||||
"send-message-title": "Envoyer un message",
|
||||
@@ -89,14 +89,14 @@
|
||||
"title-file-plural": "Fichiers",
|
||||
"receive-title": "{{descriptor}} Reçu",
|
||||
"download-again": "Télécharger à nouveau",
|
||||
"language-selector-title": "Sélectionnez la langue",
|
||||
"language-selector-title": "Définir 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é!",
|
||||
"buy-me-a-coffee_title": "Acheté-moi un café !",
|
||||
"tweet_title": "Tweet à propos de PairDrop",
|
||||
"faq_title": "Questions fréquemment posées"
|
||||
},
|
||||
@@ -125,7 +125,7 @@
|
||||
"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!",
|
||||
"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é.",
|
||||
@@ -136,9 +136,9 @@
|
||||
"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?",
|
||||
"unfinished-transfers-warning": "Il y a des transferts inachevés. Êtes-vous sûr de vouloir fermer PairDrop ?",
|
||||
"rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",
|
||||
"selected-peer-left": "Appareils selectionnés restants."
|
||||
"selected-peer-left": "Appareils sélectionnés restants."
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "Fichier reçu",
|
||||
|
||||
@@ -56,17 +56,17 @@
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "Selesai",
|
||||
"theme-auto_title": "Sesuaikan Tema dengan Sistem",
|
||||
"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",
|
||||
"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": "Atur Bahasa",
|
||||
"about_title": "Tentang PairDrop",
|
||||
"about_aria-label": "Buka Tentang PairDrop",
|
||||
"theme-light_title": "Selalu Gunakan Tema Terang"
|
||||
"theme-light_title": "Selalu gunakan tema terang"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan",
|
||||
@@ -153,6 +153,7 @@
|
||||
"message-received-plural": "{{count}} Pesan Diterima",
|
||||
"message-received": "Pesan Diterima",
|
||||
"file-received": "File Diterima",
|
||||
"file-received-plural": "{{count}} File Diterima"
|
||||
"file-received-plural": "{{count}} File Diterima",
|
||||
"image-transfer-requested": "Permintaan Transfer Gambar"
|
||||
}
|
||||
}
|
||||
|
||||
159
public_included_ws_fallback/lang/it.json
Normal file
159
public_included_ws_fallback/lang/it.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "se WebRTC non è disponibile.",
|
||||
"public-room-devices_title": "Puoi essere rilevato dai dispositivi presenti in questa stanza pubblica indipendentemente dalla rete.",
|
||||
"display-name_data-placeholder": "Caricamento…",
|
||||
"display-name_title": "Modifica il nome del tuo dispositivo permanentemente",
|
||||
"traffic": "Il traffico è",
|
||||
"paired-devices_title": "Puoi essere rilevato dai dispositivi abbinati in ogni momento, indipendentemente dalla rete.",
|
||||
"public-room-devices": "nella stanza {{roomId}}",
|
||||
"paired-devices": "da dispositivi abbinati",
|
||||
"on-this-network": "su questa rete",
|
||||
"routed": "instradato attraverso il server",
|
||||
"discovery": "Puoi essere rilevato:",
|
||||
"on-this-network_title": "puoi essere rilevato da chiunque su questa rete.",
|
||||
"known-as": "Sei visibile come:"
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "Fatto",
|
||||
"theme-auto_title": "Adatta il tema al sistema automaticamente",
|
||||
"install_title": "Installa PairDrop",
|
||||
"theme-dark_title": "Usa sempre il tema scuro",
|
||||
"pair-device_title": "Abbina i tuoi dispositivi permanentemente",
|
||||
"join-public-room_title": "Unisciti ad una stanza pubblica temporaneamente",
|
||||
"notification_title": "Attiva notifiche",
|
||||
"edit-paired-devices_title": "Modifica i dispositivi abbinati",
|
||||
"language-selector_title": "Imposta Lingua",
|
||||
"about_title": "Informazioni su PairDrop",
|
||||
"about_aria-label": "Apri Informazioni su PairDrop",
|
||||
"theme-light_title": "Usa sempre il tema chiaro"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Tocca per inviare file o tocco prolungato per inviare un messaggio",
|
||||
"click-to-send": "Clicca per inviare",
|
||||
"activate-paste-mode-and-other-files": "e altri {{count}} files",
|
||||
"tap-to-send": "Tocca per inviare",
|
||||
"activate-paste-mode-base": "Apri PairDrop su altri dispositivi per inviare",
|
||||
"no-peers-subtitle": "Abbina dispositivi o entra in una stanza pubblica per essere rilevabile su altre reti",
|
||||
"activate-paste-mode-shared-text": "testo condiviso",
|
||||
"x-instructions_desktop": "Clicca per inviare files o usa il tasto destro per inviare un messaggio",
|
||||
"no-peers-title": "Apri PairDrop su altri dispositivi per inviare files",
|
||||
"x-instructions_data-drop-peer": "Rilascia per inviare al peer",
|
||||
"x-instructions_data-drop-bg": "Rilascia per selezionare il destinatario",
|
||||
"no-peers_data-drop-bg": "Rilascia per selezionare il destinatario"
|
||||
},
|
||||
"dialogs": {
|
||||
"auto-accept-instructions-2": "per accettare automaticamente tutti i files inviati da quel dispositivo.",
|
||||
"edit-paired-devices-title": "Modifica Dispositivi Abbinati",
|
||||
"cancel": "Annulla",
|
||||
"auto-accept-instructions-1": "Attiva",
|
||||
"pair-devices-title": "Abbina Dispositivi Permanentemente",
|
||||
"temporary-public-room-title": "Stanza Pubblica Temporanea",
|
||||
"close": "Chiudi",
|
||||
"unpair": "Dissocia",
|
||||
"pair": "Abbina",
|
||||
"scan-qr-code": "o scannerizza il codice QR.",
|
||||
"input-key-on-this-device": "Inserisci questo codice su un altro dispositivo",
|
||||
"paired-devices-wrapper_data-empty": "Nessun dispositivo abbinato.",
|
||||
"enter-key-from-another-device": "Inserisci il codice dell'altro dispositivo qui.",
|
||||
"auto-accept": "accetta-automaticamente",
|
||||
"input-room-id-on-another-device": "Inserisci l'ID di questa stanza su un altro dispositivo",
|
||||
"enter-room-id-from-another-device": "Inserisci l'ID stanza da un altro dispositivo per accedere alla stanza.",
|
||||
"base64-paste-to-send": "Incolla qui per inviare {{type}}",
|
||||
"receive-text-title": "Messaggio Ricevuto",
|
||||
"download": "Scarica",
|
||||
"title-file": "File",
|
||||
"base64-processing": "Elaborazione…",
|
||||
"decline": "Rifiuta",
|
||||
"receive-title": "{{descriptor}} Ricevuto",
|
||||
"leave": "Abbandona",
|
||||
"join": "Unisciti",
|
||||
"title-image-plural": "Immagini",
|
||||
"send": "Invia",
|
||||
"base64-tap-to-paste": "Tocca qui per incollare {{type}}",
|
||||
"base64-text": "testo",
|
||||
"copy": "Copia",
|
||||
"file-other-description-image": "e 1 altra immagine",
|
||||
"base64-files": "files",
|
||||
"has-sent": "ha inviato:",
|
||||
"file-other-description-file": "ed 1 altro file",
|
||||
"system-language": "Lingua di Sistema",
|
||||
"title-image": "Immagine",
|
||||
"file-other-description-file-plural": "e altri {{count}} files",
|
||||
"would-like-to-share": "vorrebbe condividere",
|
||||
"send-message-to": "Invia un messaggio a",
|
||||
"language-selector-title": "Imposta Lingua",
|
||||
"hr-or": "OPPURE",
|
||||
"download-again": "Scarica ancora",
|
||||
"accept": "Accetta",
|
||||
"share": "Condividi",
|
||||
"title-file-plural": "Files",
|
||||
"send-message-title": "Invia Messaggio",
|
||||
"file-other-description-image-plural": "e {{count}} altre immagini"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}} vorrebbe trasferire {{count}} {{descriptor}}",
|
||||
"unfinished-transfers-warning": "Ci sono dei trasferimenti in corso. Sei sicuro di voler chiudere PairDrop?",
|
||||
"message-received": "Messaggio ricevuto da {{name}} - Clicca per copiare",
|
||||
"rate-limit-join-key": "Limite raggiunto. Aspetta 10 secondi e riprova.",
|
||||
"connecting": "Connessione…",
|
||||
"pairing-key-invalidated": "Il codice {{key}} è stato invalidato.",
|
||||
"pairing-key-invalid": "Codice non valido",
|
||||
"connected": "Connesso.",
|
||||
"pairing-not-persistent": "I dispositivi abbinati non sono persistenti.",
|
||||
"text-content-incorrect": "Il contenuto testuale non è corretto.",
|
||||
"message-transfer-completed": "Trasferimento del messaggio completato.",
|
||||
"file-transfer-completed": "Trasferimento file completato.",
|
||||
"file-content-incorrect": "Il contenuto del file non è corretto.",
|
||||
"files-incorrect": "I file non sono corretti.",
|
||||
"selected-peer-left": "Peer selezionato ha abbandonato.",
|
||||
"link-received": "Link ricevuto da {{name}} - Clicca per aprire",
|
||||
"online": "Sei di nuovo online",
|
||||
"public-room-left": "Ha lasciato la stanza pubblica {{publicRoomId}}",
|
||||
"copied-text": "Testo copiato negli appunti",
|
||||
"display-name-random-again": "Il nome visualizzato è generato casualmente un'altra volta.",
|
||||
"display-name-changed-permanently": "Il nome visualizzato è cambiato permanentemente.",
|
||||
"copied-to-clipboard-error": "La copia non è possibile. Copia manualmente.",
|
||||
"pairing-success": "Dispositivi abbinati.",
|
||||
"clipboard-content-incorrect": "Il contenuto copiato non è corretto.",
|
||||
"display-name-changed-temporarily": "Il nome visualizzato è cambiato solo per questa sessione.",
|
||||
"copied-to-clipboard": "Copiato negli appunti",
|
||||
"offline": "Sei offline",
|
||||
"pairing-tabs-error": "Abbinare due schede del browser è impossibile.",
|
||||
"public-room-id-invalid": "ID stanza non valido",
|
||||
"click-to-download": "Clicca per scaricare",
|
||||
"pairing-cleared": "Tutti i dispositivi sono stati dissociati.",
|
||||
"notifications-enabled": "Notifiche attivate.",
|
||||
"online-requirement-pairing": "Devi essere online per abbinare dispositivi.",
|
||||
"ios-memory-limit": "L'invio di file a dispositivi iOS è possibile solo 200 MB alla volta",
|
||||
"online-requirement-public-room": "Devi essere online per creare una stanza pubblica.",
|
||||
"copied-text-error": "Scrittura negli appunti fallita. Copia manualmente!",
|
||||
"download-successful": "{{descriptor}} scaricato",
|
||||
"click-to-show": "Clicca per mostrare"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Elaborazione…",
|
||||
"click-to-send-paste-mode": "Clicca per inviare {{descriptor}}",
|
||||
"click-to-send": "Clicca per inviare files o tasto destro per inviare un messaggio",
|
||||
"waiting": "In attesa…",
|
||||
"connection-hash": "Per verificare la sicurezza della crittografia end-to-end, confronta questo numero di sicurezza su entrambi i dispositivi",
|
||||
"preparing": "Preparazione…",
|
||||
"transferring": "Trasferimento…"
|
||||
},
|
||||
"about": {
|
||||
"claim": "Il modo più semplice per trasferire files tra dispositivi",
|
||||
"tweet_title": "Twitta riguardo PairDrop",
|
||||
"close-about_aria-label": "Chiudi Informazioni su PairDrop",
|
||||
"buy-me-a-coffee_title": "Comprami un caffè!",
|
||||
"github_title": "PairDrop su GitHub",
|
||||
"faq_title": "Domande Frequenti"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Trasferimento File Richiesto",
|
||||
"image-transfer-requested": "Trasferimento Immagine Richiesto",
|
||||
"message-received-plural": "{{count}} Messaggi ricevuti",
|
||||
"message-received": "Messaggio ricevuto",
|
||||
"file-received": "File Ricevuto",
|
||||
"file-received-plural": "{{count}} Files Ricevuti"
|
||||
}
|
||||
}
|
||||
159
public_included_ws_fallback/lang/ja.json
Normal file
159
public_included_ws_fallback/lang/ja.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "WebRTCが利用できない場合。",
|
||||
"public-room-devices_title": "このデバイスはネットワークと関係なく、このパブリックルームのデバイスにより発見される可能性があります。",
|
||||
"display-name_data-placeholder": "読み込み中…",
|
||||
"display-name_title": "恒久的なデバイス名を編集する",
|
||||
"traffic": "トラフィックは",
|
||||
"paired-devices_title": "このデバイスはネットワークと関係なく、常にペア設定したデバイスにより発見される可能性があります。",
|
||||
"public-room-devices": "ルーム{{roomId}}上",
|
||||
"paired-devices": "ペア設定したデバイス",
|
||||
"on-this-network": "このネットワーク上",
|
||||
"routed": "サーバーを経由します",
|
||||
"discovery": "このデバイスは以下で発見される可能性があります:",
|
||||
"on-this-network_title": "このデバイスはこのネットワーク上の誰にでも発見される可能性があります。",
|
||||
"known-as": "他のデバイスに表示される名前:"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}}は{{count}}個の{{descriptor}}を共有しようとしています",
|
||||
"unfinished-transfers-warning": "未完了の転送があります。本当にPairDropを終了しますか?",
|
||||
"message-received": "{{name}}から受信したメッセージ(クリックしてコピー)",
|
||||
"rate-limit-join-key": "レート制限に到達しました。10秒待ってから再度お試しください。",
|
||||
"connecting": "接続中…",
|
||||
"pairing-key-invalidated": "コード{{key}}が失効しました。",
|
||||
"pairing-key-invalid": "無効なコード",
|
||||
"connected": "接続しました。",
|
||||
"pairing-not-persistent": "ペア設定されたデバイスは恒久化されていません。",
|
||||
"text-content-incorrect": "テキストの内容が不正です。",
|
||||
"message-transfer-completed": "メッセージの送信が完了しました。",
|
||||
"file-transfer-completed": "ファイルの転送が完了しました。",
|
||||
"file-content-incorrect": "ファイルの内容が不正です。",
|
||||
"files-incorrect": "ファイルが間違っています。",
|
||||
"selected-peer-left": "選択した相手が退出しました。",
|
||||
"link-received": "{{name}}から受信したリンク(クリックして開く)",
|
||||
"online": "オンラインに復帰しました",
|
||||
"public-room-left": "パブリックルーム{{publicRoomId}}から退出しました",
|
||||
"copied-text": "テキストをクリップボードにコピーしました",
|
||||
"display-name-random-again": "表示名がもう一度ランダムに生成されました。",
|
||||
"display-name-changed-permanently": "恒久的な表示名が変更されました。",
|
||||
"copied-to-clipboard-error": "コピーできませんでした。手動でコピーしてください。",
|
||||
"pairing-success": "デバイスがペア設定されました。",
|
||||
"clipboard-content-incorrect": "クリップボードの内容が不正です。",
|
||||
"display-name-changed-temporarily": "このセッションでの表示名が変更されました。",
|
||||
"copied-to-clipboard": "クリップボードにコピーしました",
|
||||
"offline": "オフラインです",
|
||||
"pairing-tabs-error": "同じWebブラウザーの2つのタブをペア設定することはできません。",
|
||||
"public-room-id-invalid": "無効なルームID",
|
||||
"click-to-download": "クリックしてダウンロード",
|
||||
"pairing-cleared": "全てのデバイスのペア設定を解除しました。",
|
||||
"notifications-enabled": "通知が有効です。",
|
||||
"online-requirement-pairing": "デバイスをペア設定するにはオンラインである必要があります。",
|
||||
"ios-memory-limit": "iOSへのファイル送信は一度に200MBまでしかできません",
|
||||
"online-requirement-public-room": "パブリックルームを作成するにはオンラインである必要があります。",
|
||||
"copied-text-error": "クリップボードにコピーできませんでした。手動でコピーしてください。",
|
||||
"download-successful": "{{descriptor}}をダウンロードしました",
|
||||
"click-to-show": "クリックして表示"
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "完了",
|
||||
"theme-auto_title": "テーマをシステムの設定に自動的に合わせる",
|
||||
"install_title": "PairDropをインストール",
|
||||
"theme-dark_title": "常にダークテーマを使用する",
|
||||
"pair-device_title": "あなたのデバイスを恒久的にペア設定する",
|
||||
"join-public-room_title": "パブリックルームに一時的に参加する",
|
||||
"notification_title": "通知を有効にする",
|
||||
"edit-paired-devices_title": "ペア設定したデバイスを編集する",
|
||||
"language-selector_title": "言語を設定",
|
||||
"about_title": "PairDropについて",
|
||||
"about_aria-label": "PairDropについてを開く",
|
||||
"theme-light_title": "常にライトテーマを使用する"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "タップしてファイルを送信または長押ししてメッセージを送信します",
|
||||
"click-to-send": "クリックして送信",
|
||||
"activate-paste-mode-and-other-files": "とその他{{count}}個のファイル",
|
||||
"tap-to-send": "タップして送信",
|
||||
"activate-paste-mode-base": "他のデバイスでPairDropを開いて送信します",
|
||||
"no-peers-subtitle": "デバイスをペア設定するかパブリックルームに参加すると、他のネットワーク上からも見つけられるようになります",
|
||||
"activate-paste-mode-shared-text": "共有されたテキスト",
|
||||
"x-instructions_desktop": "左クリックしてファイルを送信または右クリックしてメッセージを送信します",
|
||||
"no-peers-title": "他のデバイスでPairDropを開いてファイルを送信します",
|
||||
"x-instructions_data-drop-peer": "離すとこの相手に送信します",
|
||||
"x-instructions_data-drop-bg": "送信したい相手の上で離してください",
|
||||
"no-peers_data-drop-bg": "送信したい相手の上で離してください"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "処理中…",
|
||||
"click-to-send-paste-mode": "クリックして{{descriptor}}を送信",
|
||||
"click-to-send": "クリックしてファイルを送信または右クリックしてメッセージを送信します",
|
||||
"waiting": "待機中…",
|
||||
"connection-hash": "エンドツーエンド暗号化のセキュリティを確認するには、両方のデバイスのセキュリティナンバーを確認します",
|
||||
"preparing": "準備中…",
|
||||
"transferring": "転送中…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "ここをタップして{{type}}を送信",
|
||||
"auto-accept-instructions-2": "このデバイスから送信される全てのファイルを自動的に承諾します。",
|
||||
"receive-text-title": "メッセージを受信しました",
|
||||
"edit-paired-devices-title": "ペア設定したデバイスを編集",
|
||||
"cancel": "キャンセル",
|
||||
"auto-accept-instructions-1": "有効化",
|
||||
"pair-devices-title": "デバイスを恒久的にペア設定する",
|
||||
"download": "ダウンロード",
|
||||
"title-file": "ファイル",
|
||||
"base64-processing": "処理中…",
|
||||
"decline": "拒否",
|
||||
"receive-title": "{{descriptor}}を受信しました",
|
||||
"leave": "退出",
|
||||
"join": "参加",
|
||||
"title-image-plural": "複数の画像",
|
||||
"send": "送信",
|
||||
"base64-tap-to-paste": "ここをタップして{{type}}を貼り付け",
|
||||
"base64-text": "テキスト",
|
||||
"copy": "コピー",
|
||||
"file-other-description-image": "と1個の他の画像",
|
||||
"temporary-public-room-title": "一時的なパブリックルーム",
|
||||
"base64-files": "ファイル",
|
||||
"has-sent": "が送信しました:",
|
||||
"file-other-description-file": "と1個の他のファイル",
|
||||
"close": "閉じる",
|
||||
"system-language": "システムの言語",
|
||||
"unpair": "ペア解除",
|
||||
"title-image": "画像",
|
||||
"file-other-description-file-plural": "と{{count}}個の他のファイル",
|
||||
"would-like-to-share": "が以下のファイルを共有しようとしています",
|
||||
"send-message-to": "このデバイスにメッセージを送信:",
|
||||
"language-selector-title": "言語を設定",
|
||||
"pair": "ペア設定",
|
||||
"hr-or": "または",
|
||||
"scan-qr-code": "もしくはQRコードをスキャンします。",
|
||||
"input-key-on-this-device": "このキーを他のデバイスに入力する",
|
||||
"download-again": "もう一度ダウンロードする",
|
||||
"accept": "承諾",
|
||||
"paired-devices-wrapper_data-empty": "ペア設定したデバイスはありません。",
|
||||
"enter-key-from-another-device": "他のデバイスに表示されたキーをここに入力します。",
|
||||
"share": "共有",
|
||||
"auto-accept": "自動承諾",
|
||||
"title-file-plural": "複数のファイル",
|
||||
"send-message-title": "メッセージを送信",
|
||||
"input-room-id-on-another-device": "このルームIDを他のデバイスに入力します",
|
||||
"file-other-description-image-plural": "と{{count}}個の他の画像",
|
||||
"enter-room-id-from-another-device": "他のデバイスに表示された参加したいルームのIDを入力します。"
|
||||
},
|
||||
"about": {
|
||||
"claim": "デバイス間でファイルを転送する最も簡単な方法",
|
||||
"tweet_title": "PairDropについてツイートする",
|
||||
"close-about_aria-label": "PairDropについてを閉じる",
|
||||
"buy-me-a-coffee_title": "コーヒーをおごってください!",
|
||||
"github_title": "GitHubでPairDropを見る",
|
||||
"faq_title": "FAQ"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "ファイルの転送がリクエストされました",
|
||||
"image-transfer-requested": "画像の転送がリクエストされました",
|
||||
"message-received-plural": "{{count}}個のメッセージを受信しました",
|
||||
"message-received": "メッセージを受信しました",
|
||||
"file-received": "ファイルを受信しました",
|
||||
"file-received-plural": "{{count}}個のファイルを受信しました"
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@
|
||||
"pair-devices-title": "Sammenkoble enheter",
|
||||
"would-like-to-share": "ønsker å dele",
|
||||
"auto-accept-instructions-2": "for å godkjenne alle filer sendt fra den enheten automatisk.",
|
||||
"paired-devices-wrapper_data-empty": "Ingen sammenkoblede enheter",
|
||||
"paired-devices-wrapper_data-empty": "Ingen sammenkoblede enheter.",
|
||||
"enter-key-from-another-device": "Skriv inn nøkkel fra en annen enhet for å fortsette.",
|
||||
"edit-paired-devices-title": "Rediger sammenkoblede enheter",
|
||||
"accept": "Godta",
|
||||
@@ -113,7 +113,7 @@
|
||||
"clipboard-content-incorrect": "Utklippstavleinnholdet er uriktig.",
|
||||
"link-received": "Lenke mottatt av {{name}} - Klikk for å åpne.",
|
||||
"request-title": "{{name}} ønsker å overføre {{count}} {{descriptor}}",
|
||||
"message-received": "Melding mottatt av {{name}} - Klikk for å åpne.",
|
||||
"message-received": "Melding mottatt av {{name}} - Klikk for å åpne",
|
||||
"files-incorrect": "Filene er uriktige.",
|
||||
"ios-memory-limit": "Forsendelse av filer til iOS er kun mulig opptil 200 MB av gangen.",
|
||||
"unfinished-transfers-warning": "Lukk med ufullførte overføringer?",
|
||||
|
||||
159
public_included_ws_fallback/lang/nl.json
Normal file
159
public_included_ws_fallback/lang/nl.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "als WebRTC niet beschikbaar is.",
|
||||
"public-room-devices_title": "U kan door apparaten gevonden worden in deze openbare ruimte, ongeacht van het netwerk.",
|
||||
"display-name_data-placeholder": "Laden…",
|
||||
"display-name_title": "Bewerk uw apparaatnaam permanent",
|
||||
"traffic": "Dataverkeer is",
|
||||
"paired-devices_title": "U kan gevonden worden door gekoppelde apparaten, ongeacht van het netwerk.",
|
||||
"public-room-devices": "in kamer {{roomId}}",
|
||||
"paired-devices": "door gekoppelde apparaten",
|
||||
"on-this-network": "op dit netwerk",
|
||||
"routed": "door de server geleid",
|
||||
"discovery": "U bent zichtbaar:",
|
||||
"on-this-network_title": "U kan door iedereen gevonden worden op dit netwerk.",
|
||||
"known-as": "U staat bekend als:"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}} zou graag {{count}}{{descriptor}} overdragen",
|
||||
"unfinished-transfers-warning": "Nog niet alle overdrachten zijn compleet. Weet u zeker dat u PairDrop sluiten?",
|
||||
"message-received": "Bericht ontvangen van {{name}} - Klik om te kopiëren",
|
||||
"rate-limit-join-key": "Tempolimiet bereikt. Wacht 10 seconde en probeer opnieuw.",
|
||||
"connecting": "Verbinden…",
|
||||
"pairing-key-invalidated": "Sleutel {{key}} ongeldig.",
|
||||
"pairing-key-invalid": "Ongeldige sleutel",
|
||||
"connected": "Verbonden.",
|
||||
"pairing-not-persistent": "Gekoppelde apparaten zijn niet persistent.",
|
||||
"text-content-incorrect": "Tekst inhoud is incorrect.",
|
||||
"message-transfer-completed": "Berichtsoverdracht compleet.",
|
||||
"file-transfer-completed": "Bestandsoverdracht compleet.",
|
||||
"file-content-incorrect": "Bestandsinhoud is incorrect.",
|
||||
"files-incorrect": "Bestanden zijn incorrect.",
|
||||
"selected-peer-left": "Gekozen peer is vertrokken.",
|
||||
"link-received": "Link van {{name}} ontvangen - Klik om te openen",
|
||||
"online": "U bent terug online",
|
||||
"public-room-left": "Openbare ruimte {{publicRoomId}} verlaten",
|
||||
"copied-text": "Tekst naar klembord gekopieërd",
|
||||
"display-name-random-again": "De weergavenaam is opnieuw willekeurig gegenereerd.",
|
||||
"display-name-changed-permanently": "De weergavenaam is permanent gewijzigd.",
|
||||
"copied-to-clipboard-error": "Kopiëren is niet mogelijk. Kopieer handmatig.",
|
||||
"pairing-success": "Apparaten gekoppeld.",
|
||||
"clipboard-content-incorrect": "De inhoud van het klembord is incorrect.",
|
||||
"display-name-changed-temporarily": "De weergavenaam is alleen voor deze sessie gewijzigd.",
|
||||
"copied-to-clipboard": "Gekopieerd naar klembord",
|
||||
"offline": "U bent offline",
|
||||
"pairing-tabs-error": "Twee webbrowser tabbladen koppelen in is onmogelijk.",
|
||||
"public-room-id-invalid": "Ongeldig kamer ID",
|
||||
"click-to-download": "Klik om te downloaden",
|
||||
"pairing-cleared": "Alle apparaten ontkoppeld.",
|
||||
"notifications-enabled": "Meldingen geactiveerd.",
|
||||
"online-requirement-pairing": "U moet online zijn om apparaten te koppelen.",
|
||||
"ios-memory-limit": "Bestandsoverdrachten naar iOS kunnen slechts met 200 MB per keer",
|
||||
"online-requirement-public-room": "U moet online zijn om een openbare kamer te maken.",
|
||||
"copied-text-error": "Schrijven naar klembord mislukt. Kopieer handmatig!",
|
||||
"download-successful": "{{descriptor}} downloaden",
|
||||
"click-to-show": "Klik om te tonen"
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "Klaar",
|
||||
"theme-auto_title": "Gebruik systeemstijl",
|
||||
"install_title": "PairDrop installeren",
|
||||
"theme-dark_title": "Altijd donkere modus gebruiken",
|
||||
"pair-device_title": "Koppel uw apparaten permanent",
|
||||
"join-public-room_title": "Openbare ruimte tijdelijk betreden",
|
||||
"notification_title": "Meldingen inschakelen",
|
||||
"edit-paired-devices_title": "Gekoppelde apparaten bewerken",
|
||||
"language-selector_title": "Taal Selecteren",
|
||||
"about_title": "Over PairDrop",
|
||||
"about_aria-label": "Open Over PairDrop",
|
||||
"theme-light_title": "Altijd lichte modus gebruiken"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "Tik om bestanden te versturen of houdt vast om een bericht te sturen",
|
||||
"click-to-send": "Klik om te verzenden",
|
||||
"activate-paste-mode-and-other-files": "en {{count}} andere bestanden",
|
||||
"tap-to-send": "Tik om te verzenden",
|
||||
"activate-paste-mode-base": "Open PairDrop op andere apparaten om te verzenden",
|
||||
"no-peers-subtitle": "Koppel apparaten of betreed een openbare ruimte om op andere netwerken zichtbaar te worden",
|
||||
"activate-paste-mode-shared-text": "gedeelde tekst",
|
||||
"x-instructions_desktop": "Klik om bestanden te versturen of rechtsklik om een bericht te sturen",
|
||||
"no-peers-title": "Open PairDrop op andere apparaten om bestanden te versturen",
|
||||
"x-instructions_data-drop-peer": "Laat los om naar peer te versturen",
|
||||
"x-instructions_data-drop-bg": "Loslaten om ontvanger te selecteren",
|
||||
"no-peers_data-drop-bg": "Loslaten om ontvanger te kiezen"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "Verwerken…",
|
||||
"click-to-send-paste-mode": "Klik om {{descriptor}} te versturen",
|
||||
"click-to-send": "Klik om bestanden te versturen of rechtsklik om een bericht te versturen",
|
||||
"waiting": "Wachten…",
|
||||
"connection-hash": "Vergelijk dit veiligheidsnummer op beide apparaten, om de beveiliging van de eind-tot-eind versleuteling te verifiëren",
|
||||
"preparing": "Voorbereiden…",
|
||||
"transferring": "Overdragen…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "Plak hier om {{type}} te versturen",
|
||||
"auto-accept-instructions-2": "om automatisch alle bestanden van dat apparaat te accepteren.",
|
||||
"receive-text-title": "Bericht Ontvangen",
|
||||
"edit-paired-devices-title": "Gekoppelde Apparaten Bewerken",
|
||||
"cancel": "Annuleer",
|
||||
"auto-accept-instructions-1": "Activeer",
|
||||
"pair-devices-title": "Koppel Apparaten Permanent",
|
||||
"download": "Download",
|
||||
"title-file": "Bestand",
|
||||
"base64-processing": "Verwerken…",
|
||||
"decline": "Afwijzen",
|
||||
"receive-title": "{{descriptor}} Ontvangen",
|
||||
"leave": "Verlaten",
|
||||
"join": "Betreden",
|
||||
"title-image-plural": "Afbeeldingen",
|
||||
"send": "Verzenden",
|
||||
"base64-tap-to-paste": "Hier tikken om {{type}} te plakken",
|
||||
"base64-text": "tekst",
|
||||
"copy": "Kopiëren",
|
||||
"file-other-description-image": "en één andere afbeelding",
|
||||
"temporary-public-room-title": "Tijdelijke Openbare Ruimte",
|
||||
"base64-files": "bestanden",
|
||||
"has-sent": "stuurde het volgende:",
|
||||
"file-other-description-file": "en één ander bestand",
|
||||
"close": "Sluiten",
|
||||
"system-language": "Systeemtaal",
|
||||
"unpair": "Ontkoppel",
|
||||
"title-image": "Afbeelding",
|
||||
"file-other-description-file-plural": "en {{count}} andere bestanden",
|
||||
"would-like-to-share": "zou graag het volgende willen delen",
|
||||
"send-message-to": "Verstuur een bericht naar",
|
||||
"language-selector-title": "Taal Instellen",
|
||||
"pair": "Koppel",
|
||||
"hr-or": "OF",
|
||||
"scan-qr-code": "of scan de QR-code.",
|
||||
"input-key-on-this-device": "Voer deze sleutel in op een ander apparaat",
|
||||
"download-again": "Download opnieuw",
|
||||
"accept": "Accepteren",
|
||||
"paired-devices-wrapper_data-empty": "Geen gekoppelde apparaten.",
|
||||
"enter-key-from-another-device": "Voer hier de sleutel van een ander apparaat in.",
|
||||
"share": "Delen",
|
||||
"auto-accept": "automatisch-accepteren",
|
||||
"title-file-plural": "Bestanden",
|
||||
"send-message-title": "Bericht Sturen",
|
||||
"input-room-id-on-another-device": "Voer de kamer ID in op een ander apparaat",
|
||||
"file-other-description-image-plural": "en {{count}} andere afbeeldingen",
|
||||
"enter-room-id-from-another-device": "Voer de kamer ID van een ander apparaat hier in."
|
||||
},
|
||||
"about": {
|
||||
"claim": "De makkelijkste manier om bestanden tussen apparaten te versturen",
|
||||
"tweet_title": "Tweet over PairDrop",
|
||||
"close-about_aria-label": "Sluit Over PairDrop",
|
||||
"buy-me-a-coffee_title": "Koop een kopje koffie voor mij!",
|
||||
"github_title": "PairDrop op GitHub",
|
||||
"faq_title": "Veel gestelde vragen"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Bestandsoverdracht verzocht",
|
||||
"image-transfer-requested": "Afbeeldingsoverdracht verzocht",
|
||||
"message-received-plural": "{{count}} berichten ontvangen",
|
||||
"message-received": "Bericht ontvangen",
|
||||
"file-received": "Bestand ontvangen",
|
||||
"file-received-plural": "{{count}} bestanden ontvangen"
|
||||
}
|
||||
}
|
||||
@@ -56,12 +56,12 @@
|
||||
},
|
||||
"header": {
|
||||
"cancel-paste-mode": "Gata",
|
||||
"theme-auto_title": "Adaptează Tema la Sistem",
|
||||
"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",
|
||||
"notification_title": "Activați notificări",
|
||||
"edit-paired-devices_title": "Editați dispozitivele împerecheate",
|
||||
"language-selector_title": "Selectează Limba",
|
||||
"about_title": "Despre PairDrop",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"edit-paired-devices_title": "Редактировать связанные устройства",
|
||||
"notification_title": "Включить уведомления",
|
||||
"about_title": "О сервисе",
|
||||
"theme-auto_title": "Адаптировать тему к системной",
|
||||
"theme-auto_title": "Адаптировать тему к системной автоматически",
|
||||
"theme-dark_title": "Всегда использовать темную тему",
|
||||
"theme-light_title": "Всегда использовать светлую тему",
|
||||
"join-public-room_title": "Войти на время в публичную комнату",
|
||||
@@ -43,7 +43,7 @@
|
||||
"on-this-network_title": "Вы можете быть обнаружены кем угодно в этой сети."
|
||||
},
|
||||
"dialogs": {
|
||||
"edit-paired-devices-title": "Редактировать связанные устройства",
|
||||
"edit-paired-devices-title": "Редактировать Связанные Устройства",
|
||||
"auto-accept": "автоприем",
|
||||
"close": "Закрыть",
|
||||
"decline": "Отклонить",
|
||||
@@ -83,7 +83,7 @@
|
||||
"receive-title": "{{descriptor}} получен",
|
||||
"system-language": "Язык системы",
|
||||
"unpair": "Отвязать",
|
||||
"language-selector-title": "Выбрать язык",
|
||||
"language-selector-title": "Установить язык",
|
||||
"hr-or": "ИЛИ",
|
||||
"input-room-id-on-another-device": "На другом устройстве введите этот ID комнаты",
|
||||
"leave": "Покинуть",
|
||||
@@ -155,6 +155,7 @@
|
||||
"message-received-plural": "{{count}} сообщений получено",
|
||||
"file-received": "Файл получен",
|
||||
"file-transfer-requested": "Запрошена передача файлов",
|
||||
"message-received": "Сообщение получено"
|
||||
"message-received": "Сообщение получено",
|
||||
"image-transfer-requested": "Запрошена передача изображений"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"edit-paired-devices_title": "管理已配对设备",
|
||||
"cancel-paste-mode": "完成",
|
||||
"join-public-room_title": "暂时加入公共房间",
|
||||
"language-selector_title": "选择语言"
|
||||
"language-selector_title": "设置语言"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_data-drop-peer": "释放以发送到此设备",
|
||||
@@ -83,7 +83,7 @@
|
||||
"download-again": "再次保存",
|
||||
"system-language": "跟随系统语言",
|
||||
"unpair": "取消配对",
|
||||
"language-selector-title": "选择语言",
|
||||
"language-selector-title": "设置语言",
|
||||
"hr-or": "或者",
|
||||
"input-room-id-on-another-device": "在另一个设备上输入这串房间号",
|
||||
"leave": "离开",
|
||||
@@ -145,7 +145,8 @@
|
||||
"message-received-plural": "收到 {{count}} 条信息",
|
||||
"file-transfer-requested": "文件传输请求",
|
||||
"file-received-plural": "收到 {{count}} 个文件",
|
||||
"file-received": "收到文件"
|
||||
"file-received": "收到文件",
|
||||
"image-transfer-requested": "图片传输请求"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send-paste-mode": "点击发送 {{descriptor}}",
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
class Localization {
|
||||
constructor() {
|
||||
Localization.defaultLocale = "en";
|
||||
Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de", "ro", "id", "fr"];
|
||||
Localization.supportedLocales = ["ar", "de", "en", "es", "fr", "id", "it", "ja", "nb", "nl", "ro", "ru", "zh-CN"];
|
||||
Localization.supportedLocalesRTL = ["ar"];
|
||||
|
||||
Localization.translations = {};
|
||||
Localization.defaultTranslations = {};
|
||||
|
||||
Localization.systemLocale = Localization.supportedOrDefault(navigator.languages);
|
||||
Localization.systemLocale = Localization.getSupportedOrDefault(navigator.languages);
|
||||
|
||||
let storedLanguageCode = localStorage.getItem("language-code");
|
||||
|
||||
@@ -24,7 +26,11 @@ class Localization {
|
||||
return Localization.supportedLocales.indexOf(locale) > -1;
|
||||
}
|
||||
|
||||
static supportedOrDefault(locales) {
|
||||
static isRTLLanguage(locale) {
|
||||
return Localization.supportedLocalesRTL.indexOf(locale) > -1;
|
||||
}
|
||||
|
||||
static getSupportedOrDefault(locales) {
|
||||
return locales.find(Localization.isSupported) || Localization.defaultLocale;
|
||||
}
|
||||
|
||||
@@ -34,6 +40,17 @@ class Localization {
|
||||
await Localization.setLocale(locale)
|
||||
await Localization.translatePage();
|
||||
|
||||
const htmlRootNode = document.querySelector('html');
|
||||
|
||||
if (Localization.isRTLLanguage(locale)) {
|
||||
htmlRootNode.setAttribute('dir', 'rtl');
|
||||
} else {
|
||||
htmlRootNode.removeAttribute('dir');
|
||||
}
|
||||
|
||||
htmlRootNode.setAttribute('lang', locale);
|
||||
|
||||
|
||||
console.log("Page successfully translated",
|
||||
`System language: ${Localization.systemLocale}`,
|
||||
`Selected language: ${locale}`
|
||||
|
||||
@@ -36,6 +36,12 @@ class ServerConnection {
|
||||
_connect() {
|
||||
clearTimeout(this._reconnectTimer);
|
||||
if (this._isConnected() || this._isConnecting()) return;
|
||||
if (this._isReconnect) {
|
||||
Events.fire('notify-user', {
|
||||
message: Localization.getTranslation("notifications.connecting"),
|
||||
persistent: true
|
||||
});
|
||||
}
|
||||
const ws = new WebSocket(this._endpoint());
|
||||
ws.binaryType = 'arraybuffer';
|
||||
ws.onopen = _ => this._onOpen();
|
||||
@@ -232,12 +238,10 @@ class ServerConnection {
|
||||
_onDisconnect() {
|
||||
console.log('WS: server disconnected');
|
||||
setTimeout(() => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.connecting"));
|
||||
this._isReconnect = true;
|
||||
Events.fire('ws-disconnected');
|
||||
this._reconnectTimer = setTimeout(_ => this._connect(), 1000);
|
||||
}, 100); //delay for 100ms to prevent flickering on page reload
|
||||
clearTimeout(this._reconnectTimer);
|
||||
this._reconnectTimer = setTimeout(_ => this._connect(), 1000);
|
||||
Events.fire('ws-disconnected');
|
||||
this._isReconnect = true;
|
||||
}
|
||||
|
||||
_onVisibilityChange() {
|
||||
|
||||
@@ -36,27 +36,15 @@ class PeersUI {
|
||||
Events.on('drop', e => this._onDrop(e));
|
||||
Events.on('keydown', e => this._onKeyDown(e));
|
||||
|
||||
this.$header = document.querySelector('body > header')
|
||||
this.$xPeers = $$('x-peers');
|
||||
this.$xNoPeers = $$('x-no-peers');
|
||||
this.$xInstructions = $$('x-instructions');
|
||||
this.$center = $$('#center');
|
||||
this.$logo = $$('footer .icon.logo');
|
||||
this.$footer = $$('footer');
|
||||
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('bg-resize', _ => this.evaluateOverflowing());
|
||||
Events.on('peer-added', _ => this._evaluateOverflowing());
|
||||
Events.on('bg-resize', _ => this._evaluateOverflowing());
|
||||
|
||||
this.$displayName = $('display-name');
|
||||
|
||||
@@ -75,11 +63,45 @@ class PeersUI {
|
||||
if (displayName) Events.fire('self-display-name-changed', displayName);
|
||||
});
|
||||
|
||||
Events.on('evaluate-footer-badges', _ => this._evaluateFooterBadges())
|
||||
|
||||
/* prevent animation on load */
|
||||
this.fadedIn = false;
|
||||
|
||||
this.$header = document.querySelector('header.opacity-0');
|
||||
Events.on('header-evaluated', () => this._fadeInHeader());
|
||||
}
|
||||
|
||||
_fadeInHeader() {
|
||||
//prevent flickering
|
||||
setTimeout(() => this.$header.classList.remove('opacity-0'), 50);
|
||||
}
|
||||
|
||||
_fadeInUI() {
|
||||
if (this.fadedIn) return;
|
||||
|
||||
this.fadedIn = true;
|
||||
|
||||
this.$center.classList.remove('opacity-0');
|
||||
this.$footer.classList.remove('opacity-0');
|
||||
|
||||
// Prevent flickering on load
|
||||
setTimeout(_ => {
|
||||
this.$xNoPeers.style.animationIterationCount = "1";
|
||||
}, 300);
|
||||
this.$xNoPeers.classList.remove('no-animation-on-load');
|
||||
}, 600);
|
||||
|
||||
Events.fire('ui-faded-in');
|
||||
}
|
||||
|
||||
_evaluateFooterBadges() {
|
||||
if (this.$discoveryWrapper.querySelectorAll('div:last-of-type > span[hidden]').length < 2) {
|
||||
this.$discoveryWrapper.classList.remove('row');
|
||||
this.$discoveryWrapper.classList.add('column');
|
||||
} else {
|
||||
this.$discoveryWrapper.classList.remove('column');
|
||||
this.$discoveryWrapper.classList.add('row');
|
||||
}
|
||||
Events.fire('redraw-canvas');
|
||||
this._fadeInUI();
|
||||
}
|
||||
|
||||
_insertDisplayName(displayName) {
|
||||
@@ -162,6 +184,11 @@ class PeersUI {
|
||||
if (document.querySelectorAll('x-dialog[show]').length === 0 && window.pasteMode.activated && e.code === "Escape") {
|
||||
Events.fire('deactivate-paste-mode');
|
||||
}
|
||||
|
||||
// close About PairDrop page on Escape
|
||||
if (e.key === "Escape") {
|
||||
window.location.hash = '#';
|
||||
}
|
||||
}
|
||||
|
||||
_onPeerJoined(msg) {
|
||||
@@ -207,7 +234,7 @@ class PeersUI {
|
||||
Object.keys(peer._roomIds).forEach(roomType => peerNode.classList.add(`type-${roomType}`));
|
||||
}
|
||||
|
||||
evaluateOverflowing() {
|
||||
_evaluateOverflowing() {
|
||||
if (this.$xPeers.clientHeight < this.$xPeers.scrollHeight) {
|
||||
this.$xPeers.classList.add('overflowing');
|
||||
} else {
|
||||
@@ -223,7 +250,7 @@ class PeersUI {
|
||||
const $peer = $(peerId);
|
||||
if (!$peer) return;
|
||||
$peer.remove();
|
||||
this.evaluateOverflowing();
|
||||
this._evaluateOverflowing();
|
||||
}
|
||||
|
||||
_onRoomTypeRemoved(peerId, roomType) {
|
||||
@@ -398,7 +425,7 @@ class PeerUI {
|
||||
<div class="name font-subheading"></div>
|
||||
<div class="device-name font-body2"></div>
|
||||
<div class="status font-body2"></div>
|
||||
<span class="connection-hash font-body2" title="${ Localization.getTranslation("peer-ui.connection-hash") }"></span>
|
||||
<span class="connection-hash font-body2" dir="ltr" title="${ Localization.getTranslation("peer-ui.connection-hash") }"></span>
|
||||
</div>
|
||||
</label>`;
|
||||
|
||||
@@ -610,9 +637,8 @@ class Dialog {
|
||||
this.$el = $(id);
|
||||
this.$el.querySelectorAll('[close]').forEach(el => el.addEventListener('click', _ => this.hide()));
|
||||
this.$autoFocus = this.$el.querySelector('[autofocus]');
|
||||
Events.on('peer-disconnected', e => this._onPeerDisconnected(e.detail));
|
||||
|
||||
this.$discoveryWrapper = $$('footer .discovery-wrapper');
|
||||
Events.on('peer-disconnected', e => this._onPeerDisconnected(e.detail));
|
||||
}
|
||||
|
||||
show() {
|
||||
@@ -631,7 +657,7 @@ class Dialog {
|
||||
window.blur();
|
||||
}
|
||||
document.title = 'PairDrop';
|
||||
document.changeFavicon("images/favicon-96x96.png");
|
||||
changeFavicon("images/favicon-96x96.png");
|
||||
this.correspondingPeerId = undefined;
|
||||
}
|
||||
|
||||
@@ -641,17 +667,6 @@ class Dialog {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.selected-peer-left"));
|
||||
}
|
||||
}
|
||||
|
||||
evaluateFooterBadges() {
|
||||
if (this.$discoveryWrapper.querySelectorAll('div:last-of-type > span[hidden]').length < 2) {
|
||||
this.$discoveryWrapper.classList.remove('row');
|
||||
this.$discoveryWrapper.classList.add('column');
|
||||
} else {
|
||||
this.$discoveryWrapper.classList.remove('column');
|
||||
this.$discoveryWrapper.classList.add('row');
|
||||
}
|
||||
Events.fire('bg-resize');
|
||||
}
|
||||
}
|
||||
|
||||
class LanguageSelectDialog extends Dialog {
|
||||
@@ -931,7 +946,7 @@ class ReceiveFileDialog extends ReceiveDialog {
|
||||
document.title = files.length === 1
|
||||
? `${ Localization.getTranslation("document-titles.file-received") } - PairDrop`
|
||||
: `${ Localization.getTranslation("document-titles.file-received-plural", null, {count: files.length}) } - PairDrop`;
|
||||
document.changeFavicon("images/favicon-96x96-notification.png");
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
|
||||
Events.fire('set-progress', {peerId: peerId, progress: 1, status: 'process'})
|
||||
this.show();
|
||||
@@ -1028,7 +1043,7 @@ class ReceiveRequestDialog extends ReceiveDialog {
|
||||
this.$receiveTitle.innerText = transferRequestTitle;
|
||||
|
||||
document.title = `${transferRequestTitle} - PairDrop`;
|
||||
document.changeFavicon("images/favicon-96x96-notification.png");
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
this.show();
|
||||
}
|
||||
|
||||
@@ -1192,7 +1207,6 @@ class PairDeviceDialog extends Dialog {
|
||||
this.$closeBtn.addEventListener('click', _ => this._close());
|
||||
|
||||
Events.on('keydown', e => this._onKeyDown(e));
|
||||
Events.on('ws-connected', _ => this._onWsConnected());
|
||||
Events.on('ws-disconnected', _ => this.hide());
|
||||
Events.on('pair-device-initiated', e => this._onPairDeviceInitiated(e.detail));
|
||||
Events.on('pair-device-joined', e => this._onPairDeviceJoined(e.detail.peerId, e.detail.roomSecret));
|
||||
@@ -1203,10 +1217,13 @@ class PairDeviceDialog extends Dialog {
|
||||
Events.on('evaluate-number-room-secrets', _ => this._evaluateNumberRoomSecrets())
|
||||
Events.on('secret-room-deleted', e => this._onSecretRoomDeleted(e.detail));
|
||||
this.$el.addEventListener('paste', e => this._onPaste(e));
|
||||
this.$qrCode.addEventListener('click', _ => this._copyPairUrl());
|
||||
|
||||
this.evaluateUrlAttributes();
|
||||
|
||||
this.pairPeer = {};
|
||||
|
||||
this._evaluateNumberRoomSecrets();
|
||||
}
|
||||
|
||||
_onKeyDown(e) {
|
||||
@@ -1231,10 +1248,6 @@ class PairDeviceDialog extends Dialog {
|
||||
}
|
||||
}
|
||||
|
||||
_onWsConnected() {
|
||||
this._evaluateNumberRoomSecrets();
|
||||
}
|
||||
|
||||
_pairDeviceInitiate() {
|
||||
Events.fire('pair-device-initiate');
|
||||
}
|
||||
@@ -1245,7 +1258,7 @@ class PairDeviceDialog extends Dialog {
|
||||
this.$key.innerText = `${this.pairKey.substring(0,3)} ${this.pairKey.substring(3,6)}`
|
||||
// Display the QR code for the url
|
||||
const qr = new QRCode({
|
||||
content: this._getPairURL(),
|
||||
content: this._getPairUrl(),
|
||||
width: 150,
|
||||
height: 150,
|
||||
padding: 0,
|
||||
@@ -1259,12 +1272,22 @@ class PairDeviceDialog extends Dialog {
|
||||
this.show();
|
||||
}
|
||||
|
||||
_getPairURL() {
|
||||
_getPairUrl() {
|
||||
let url = new URL(location.href);
|
||||
url.searchParams.append('pair_key', this.pairKey)
|
||||
return url.href;
|
||||
}
|
||||
|
||||
_copyPairUrl() {
|
||||
navigator.clipboard.writeText(this._getPairUrl())
|
||||
.then(_ => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.pair-url-copied-to-clipboard"));
|
||||
})
|
||||
.catch(_ => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.copied-to-clipboard-error"));
|
||||
})
|
||||
}
|
||||
|
||||
_onSubmit(e) {
|
||||
e.preventDefault();
|
||||
this._submit();
|
||||
@@ -1382,16 +1405,17 @@ class PairDeviceDialog extends Dialog {
|
||||
}
|
||||
|
||||
_evaluateNumberRoomSecrets() {
|
||||
PersistentStorage.getAllRoomSecrets().then(roomSecrets => {
|
||||
if (roomSecrets.length > 0) {
|
||||
this.$editPairedDevicesHeaderBtn.removeAttribute('hidden');
|
||||
this.$footerInstructionsPairedDevices.removeAttribute('hidden');
|
||||
} else {
|
||||
this.$editPairedDevicesHeaderBtn.setAttribute('hidden', '');
|
||||
this.$footerInstructionsPairedDevices.setAttribute('hidden', '');
|
||||
}
|
||||
super.evaluateFooterBadges();
|
||||
});
|
||||
PersistentStorage.getAllRoomSecrets()
|
||||
.then(roomSecrets => {
|
||||
if (roomSecrets.length > 0) {
|
||||
this.$editPairedDevicesHeaderBtn.removeAttribute('hidden');
|
||||
this.$footerInstructionsPairedDevices.removeAttribute('hidden');
|
||||
} else {
|
||||
this.$editPairedDevicesHeaderBtn.setAttribute('hidden', '');
|
||||
this.$footerInstructionsPairedDevices.setAttribute('hidden', '');
|
||||
}
|
||||
Events.fire('evaluate-footer-badges');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1399,10 +1423,10 @@ class EditPairedDevicesDialog extends Dialog {
|
||||
constructor() {
|
||||
super('edit-paired-devices-dialog');
|
||||
this.$pairedDevicesWrapper = this.$el.querySelector('.paired-devices-wrapper');
|
||||
this.$footerInstructionsPairedDevices = $$('.discovery-wrapper .badge-room-secret');
|
||||
this.$footerBadgePairedDevices = $$('.discovery-wrapper .badge-room-secret');
|
||||
|
||||
$('edit-paired-devices').addEventListener('click', _ => this._onEditPairedDevices());
|
||||
this.$footerInstructionsPairedDevices.addEventListener('click', _ => this._onEditPairedDevices());
|
||||
this.$footerBadgePairedDevices.addEventListener('click', _ => this._onEditPairedDevices());
|
||||
|
||||
Events.on('peer-display-name-changed', e => this._onPeerDisplayNameChanged(e));
|
||||
Events.on('keydown', e => this._onKeyDown(e));
|
||||
@@ -1510,7 +1534,7 @@ class PublicRoomDialog extends Dialog {
|
||||
this.$leaveBtn = this.$el.querySelector('.leave-room');
|
||||
this.$joinSubmitBtn = this.$el.querySelector('button[type="submit"]');
|
||||
this.$headerBtnJoinPublicRoom = $('join-public-room');
|
||||
this.$footerInstructionsPublicRoomDevices = $$('.discovery-wrapper .badge-room-public-id');
|
||||
this.$footerBadgePublicRoomDevices = $$('.discovery-wrapper .badge-room-public-id');
|
||||
|
||||
|
||||
this.$form.addEventListener('submit', e => this._onSubmit(e));
|
||||
@@ -1518,7 +1542,7 @@ class PublicRoomDialog extends Dialog {
|
||||
this.$leaveBtn.addEventListener('click', _ => this._leavePublicRoom())
|
||||
|
||||
this.$headerBtnJoinPublicRoom.addEventListener('click', _ => this._onHeaderBtnClick());
|
||||
this.$footerInstructionsPublicRoomDevices.addEventListener('click', _ => this._onHeaderBtnClick());
|
||||
this.$footerBadgePublicRoomDevices.addEventListener('click', _ => this._onHeaderBtnClick());
|
||||
|
||||
this.inputKeyContainer = new InputKeyContainer(
|
||||
this.$el.querySelector('.input-key-container'),
|
||||
@@ -1535,6 +1559,7 @@ class PublicRoomDialog extends Dialog {
|
||||
Events.on('public-room-id-invalid', e => this._onPublicRoomIdInvalid(e.detail));
|
||||
Events.on('public-room-left', _ => this._onPublicRoomLeft());
|
||||
this.$el.addEventListener('paste', e => this._onPaste(e));
|
||||
this.$qrCode.addEventListener('click', _ => this._copyShareRoomUrl());
|
||||
|
||||
this.evaluateUrlAttributes();
|
||||
|
||||
@@ -1583,7 +1608,7 @@ class PublicRoomDialog extends Dialog {
|
||||
|
||||
// Display the QR code for the url
|
||||
const qr = new QRCode({
|
||||
content: this._getShareRoomURL(),
|
||||
content: this._getShareRoomUrl(),
|
||||
width: 150,
|
||||
height: 150,
|
||||
padding: 0,
|
||||
@@ -1600,24 +1625,34 @@ class PublicRoomDialog extends Dialog {
|
||||
setFooterBadge() {
|
||||
if (!this.roomId) return;
|
||||
|
||||
this.$footerInstructionsPublicRoomDevices.innerText = Localization.getTranslation("footer.public-room-devices", null, {
|
||||
this.$footerBadgePublicRoomDevices.innerText = Localization.getTranslation("footer.public-room-devices", null, {
|
||||
roomId: this.roomId.toUpperCase()
|
||||
});
|
||||
this.$footerInstructionsPublicRoomDevices.removeAttribute('hidden');
|
||||
this.$footerBadgePublicRoomDevices.removeAttribute('hidden');
|
||||
|
||||
super.evaluateFooterBadges();
|
||||
Events.fire('evaluate-footer-badges');
|
||||
}
|
||||
|
||||
_getShareRoomURL() {
|
||||
_getShareRoomUrl() {
|
||||
let url = new URL(location.href);
|
||||
url.searchParams.append('room_key', this.roomId)
|
||||
url.searchParams.append('room_id', this.roomId)
|
||||
return url.href;
|
||||
}
|
||||
|
||||
_copyShareRoomUrl() {
|
||||
navigator.clipboard.writeText(this._getShareRoomUrl())
|
||||
.then(_ => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.room-url-copied-to-clipboard"));
|
||||
})
|
||||
.catch(_ => {
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.copied-to-clipboard-error"));
|
||||
})
|
||||
}
|
||||
|
||||
evaluateUrlAttributes() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
if (urlParams.has('room_key')) {
|
||||
this._joinPublicRoom(urlParams.get('room_key'));
|
||||
if (urlParams.has('room_id')) {
|
||||
this._joinPublicRoom(urlParams.get('room_id'));
|
||||
const url = getUrlWithoutArguments();
|
||||
window.history.replaceState({}, "Rewrite URL", url); //remove pair_key from url
|
||||
}
|
||||
@@ -1717,8 +1752,8 @@ class PublicRoomDialog extends Dialog {
|
||||
this.roomId = null;
|
||||
this.inputKeyContainer._cleanUp();
|
||||
sessionStorage.removeItem('public_room_id');
|
||||
this.$footerInstructionsPublicRoomDevices.setAttribute('hidden', '');
|
||||
super.evaluateFooterBadges();
|
||||
this.$footerBadgePublicRoomDevices.setAttribute('hidden', '');
|
||||
Events.fire('evaluate-footer-badges');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1726,7 +1761,7 @@ class SendTextDialog extends Dialog {
|
||||
constructor() {
|
||||
super('send-text-dialog');
|
||||
Events.on('text-recipient', e => this._onRecipient(e.detail.peerId, e.detail.deviceName));
|
||||
this.$text = this.$el.querySelector('.textarea');
|
||||
this.$text = this.$el.querySelector('#text-input');
|
||||
this.$peerDisplayName = this.$el.querySelector('.display-name');
|
||||
this.$form = this.$el.querySelector('form');
|
||||
this.$submit = this.$el.querySelector('button[type="submit"]');
|
||||
@@ -1747,7 +1782,7 @@ class SendTextDialog extends Dialog {
|
||||
}
|
||||
|
||||
_textInputEmpty() {
|
||||
return !this.$text.value || this.$text.value === "\n";
|
||||
return !this.$text.innerText || this.$text.innerText === "\n";
|
||||
}
|
||||
|
||||
_onChange(e) {
|
||||
@@ -1782,9 +1817,9 @@ class SendTextDialog extends Dialog {
|
||||
_send() {
|
||||
Events.fire('send-text', {
|
||||
to: this.correspondingPeerId,
|
||||
text: this.$text.value
|
||||
text: this.$text.innerText
|
||||
});
|
||||
this.$text.value = "";
|
||||
this.$text.innerText = "";
|
||||
this.hide();
|
||||
}
|
||||
}
|
||||
@@ -1849,7 +1884,7 @@ class ReceiveTextDialog extends Dialog {
|
||||
|
||||
this._setDocumentTitleMessages();
|
||||
|
||||
document.changeFavicon("images/favicon-96x96-notification.png");
|
||||
changeFavicon("images/favicon-96x96-notification.png");
|
||||
this.show();
|
||||
}
|
||||
|
||||
@@ -2046,9 +2081,12 @@ class Toast extends Dialog {
|
||||
|
||||
_onNotify(message) {
|
||||
if (this.hideTimeout) clearTimeout(this.hideTimeout);
|
||||
this.$el.innerText = message;
|
||||
this.$el.innerText = typeof message === "object" ? message.message : message;
|
||||
this.show();
|
||||
this.hideTimeout = setTimeout(_ => this.hide(), 5000);
|
||||
|
||||
if (typeof message === "object" && message.persistent) return;
|
||||
|
||||
this.hideTimeout = setTimeout(() => this.hide(), 5000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2056,15 +2094,20 @@ class Notifications {
|
||||
|
||||
constructor() {
|
||||
// Check if the browser supports notifications
|
||||
if (!('Notification' in window)) return;
|
||||
if (!('Notification' in window)) {
|
||||
Events.fire('header-evaluated');
|
||||
return;
|
||||
}
|
||||
|
||||
// Check whether notification permissions have already been granted
|
||||
if (Notification.permission !== 'granted') {
|
||||
this.$button = $('notification');
|
||||
this.$button.removeAttribute('hidden');
|
||||
this.$button.addEventListener('click', _ => this._requestPermission());
|
||||
this.$headerNotificationButton = $('notification');
|
||||
this.$headerNotificationButton.removeAttribute('hidden');
|
||||
this.$headerNotificationButton.addEventListener('click', _ => this._requestPermission());
|
||||
}
|
||||
|
||||
Events.fire('header-evaluated');
|
||||
|
||||
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-transfer-request', e => this._requestNotification(e.detail.request, e.detail.peerId));
|
||||
@@ -2073,11 +2116,11 @@ class Notifications {
|
||||
_requestPermission() {
|
||||
Notification.requestPermission(permission => {
|
||||
if (permission !== 'granted') {
|
||||
Events.fire('notify-user', Notifications.PERMISSION_ERROR || 'Error');
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.notifications-permissions-error"));
|
||||
return;
|
||||
}
|
||||
Events.fire('notify-user', Localization.getTranslation("notifications.notifications-enabled"));
|
||||
this.$button.setAttribute('hidden', 1);
|
||||
this.$headerNotificationButton.setAttribute('hidden', "");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2459,7 +2502,7 @@ class PersistentStorage {
|
||||
return(secrets);
|
||||
} catch (e) {
|
||||
this.logBrowserNotCapable();
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2677,12 +2720,71 @@ class BrowserTabsConnector {
|
||||
}
|
||||
}
|
||||
|
||||
class BackgroundCanvas {
|
||||
constructor() {
|
||||
this.c = $$('canvas');
|
||||
this.cCtx = this.c.getContext('2d');
|
||||
this.$footer = $$('footer');
|
||||
|
||||
Events.on('bg-resize', _ => this.init());
|
||||
Events.on('redraw-canvas', _ => this.init());
|
||||
Events.on('translation-loaded', _ => this.init());
|
||||
|
||||
//fade-in on load
|
||||
Events.on('ui-faded-in', _ => this._fadeIn());
|
||||
|
||||
window.onresize = _ => Events.fire('bg-resize');
|
||||
}
|
||||
|
||||
_fadeIn() {
|
||||
this.c.classList.remove('opacity-0');
|
||||
}
|
||||
|
||||
init() {
|
||||
let oldW = this.w;
|
||||
let oldH = this.h;
|
||||
let oldOffset = this.offset
|
||||
this.w = document.documentElement.clientWidth;
|
||||
this.h = document.documentElement.clientHeight;
|
||||
this.offset = this.$footer.offsetHeight - 27;
|
||||
if (this.h >= 800) this.offset += 10;
|
||||
|
||||
if (oldW === this.w && oldH === this.h && oldOffset === this.offset) return; // nothing has changed
|
||||
|
||||
this.c.width = this.w;
|
||||
this.c.height = this.h;
|
||||
this.x0 = this.w / 2;
|
||||
this.y0 = this.h - this.offset;
|
||||
this.dw = Math.round(Math.max(this.w, this.h, 1000) / 13);
|
||||
|
||||
this.drawCircles(this.cCtx);
|
||||
}
|
||||
|
||||
|
||||
drawCircle(ctx, radius) {
|
||||
ctx.beginPath();
|
||||
ctx.lineWidth = 2;
|
||||
let opacity = Math.max(0, 0.3 * (1 - 1 * radius / Math.max(this.w, this.h)));
|
||||
ctx.strokeStyle = `rgba(128, 128, 128, ${opacity})`;
|
||||
ctx.arc(this.x0, this.y0, radius, 0, 2 * Math.PI);
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
drawCircles(ctx) {
|
||||
ctx.clearRect(0, 0, this.w, this.h);
|
||||
for (let i = 0; i < 13; i++) {
|
||||
this.drawCircle(ctx, this.dw * i + 33 + 66);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PairDrop {
|
||||
constructor() {
|
||||
Events.on('initial-translation-loaded', _ => {
|
||||
const server = new ServerConnection();
|
||||
const peers = new PeersManager(server);
|
||||
const peersUI = new PeersUI();
|
||||
const backgroundCanvas = new BackgroundCanvas();
|
||||
const languageSelectDialog = new LanguageSelectDialog();
|
||||
const receiveFileDialog = new ReceiveFileDialog();
|
||||
const receiveRequestDialog = new ReceiveRequestDialog();
|
||||
@@ -2707,7 +2809,6 @@ const persistentStorage = new PersistentStorage();
|
||||
const pairDrop = new PairDrop();
|
||||
const localization = new Localization();
|
||||
|
||||
|
||||
if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.register('/service-worker.js')
|
||||
.then(serviceWorker => {
|
||||
@@ -2725,69 +2826,3 @@ window.addEventListener('beforeinstallprompt', e => {
|
||||
}
|
||||
return e.preventDefault();
|
||||
});
|
||||
|
||||
// Background Circles
|
||||
Events.on('load', () => {
|
||||
let c = $$('canvas');
|
||||
let cCtx = c.getContext('2d');
|
||||
let x0, y0, w, h, dw, offset;
|
||||
|
||||
function init() {
|
||||
let oldW = w;
|
||||
let oldH = h;
|
||||
let oldOffset = offset
|
||||
w = document.documentElement.clientWidth;
|
||||
h = document.documentElement.clientHeight;
|
||||
offset = $$('footer').offsetHeight - 27;
|
||||
|
||||
if (oldW === w && oldH === h && oldOffset === offset) return; // nothing has changed
|
||||
|
||||
c.width = w;
|
||||
c.height = h;
|
||||
x0 = w / 2;
|
||||
y0 = h - offset;
|
||||
dw = Math.round(Math.max(w, h, 1000) / 13);
|
||||
|
||||
drawCircles(cCtx, dw);
|
||||
c.style.opacity = "1";
|
||||
}
|
||||
|
||||
Events.on('bg-resize', _ => init());
|
||||
window.onresize = _ => Events.fire('bg-resize');
|
||||
|
||||
function drawCircle(ctx, radius) {
|
||||
ctx.beginPath();
|
||||
ctx.lineWidth = 2;
|
||||
let opacity = 0.3 * (1 - 1.2 * radius / Math.max(w, h));
|
||||
ctx.strokeStyle = `rgba(128, 128, 128, ${opacity})`;
|
||||
ctx.arc(x0, y0, radius, 0, 2 * Math.PI);
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
function drawCircles(ctx, frame) {
|
||||
ctx.clearRect(0, 0, w, h);
|
||||
for (let i = 0; i < 13; i++) {
|
||||
drawCircle(ctx, dw * i + frame + 33);
|
||||
}
|
||||
}
|
||||
|
||||
setTimeout(_ => init(), 300);
|
||||
});
|
||||
|
||||
document.changeFavicon = function (src) {
|
||||
document.querySelector('[rel="icon"]').href = src;
|
||||
document.querySelector('[rel="shortcut icon"]').href = src;
|
||||
}
|
||||
|
||||
// close About PairDrop page on Escape
|
||||
window.addEventListener("keydown", (e) => {
|
||||
if (e.key === "Escape") {
|
||||
window.location.hash = '#';
|
||||
}
|
||||
});
|
||||
|
||||
Notifications.PERMISSION_ERROR = `
|
||||
Notifications permission has been blocked
|
||||
as the user has dismissed the permission prompt several times.
|
||||
This can be reset in Page Info
|
||||
which can be accessed by clicking the lock icon next to the URL.`;
|
||||
|
||||
@@ -407,6 +407,11 @@ function getUrlWithoutArguments() {
|
||||
return `${window.location.protocol}//${window.location.host}${window.location.pathname}`;
|
||||
}
|
||||
|
||||
function changeFavicon(src) {
|
||||
document.querySelector('[rel="icon"]').href = src;
|
||||
document.querySelector('[rel="shortcut icon"]').href = src;
|
||||
}
|
||||
|
||||
function arrayBufferToBase64(buffer) {
|
||||
var binary = '';
|
||||
var bytes = new Uint8Array(buffer);
|
||||
@@ -425,4 +430,4 @@ function base64ToArrayBuffer(base64) {
|
||||
bytes[i] = binary_string.charCodeAt(i);
|
||||
}
|
||||
return bytes.buffer;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
const cacheVersion = 'v1.8.3';
|
||||
const cacheVersion = 'v1.9.0';
|
||||
const cacheTitle = `pairdrop-included-ws-fallback-cache-${cacheVersion}`;
|
||||
const urlsToCache = [
|
||||
'index.html',
|
||||
@@ -19,6 +19,19 @@ const urlsToCache = [
|
||||
'images/android-chrome-512x512.png',
|
||||
'images/android-chrome-512x512-maskable.png',
|
||||
'images/apple-touch-icon.png',
|
||||
'lang/ar.json',
|
||||
'lang/de.json',
|
||||
'lang/en.json',
|
||||
'lang/es.json',
|
||||
'lang/fr.json',
|
||||
'lang/id.json',
|
||||
'lang/it.json',
|
||||
'lang/ja.json',
|
||||
'lang/nb.json',
|
||||
'lang/nl.json',
|
||||
'lang/ro.json',
|
||||
'lang/ru.json',
|
||||
'lang/zh-CN.json'
|
||||
];
|
||||
|
||||
self.addEventListener('install', function(event) {
|
||||
|
||||
@@ -92,7 +92,7 @@ html {
|
||||
header {
|
||||
position: absolute;
|
||||
align-items: baseline;
|
||||
padding: 8px 16px;
|
||||
padding: 8px 12px;
|
||||
box-sizing: border-box;
|
||||
width: 100vw;
|
||||
z-index: 2;
|
||||
@@ -100,9 +100,9 @@ header {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
header > a,
|
||||
header > div {
|
||||
margin-left: 8px;
|
||||
header > * {
|
||||
margin-left: 4px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
header > div {
|
||||
@@ -274,6 +274,9 @@ x-noscript {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
#center {
|
||||
@@ -422,10 +425,6 @@ x-no-peers {
|
||||
padding: 8px;
|
||||
height: 137px;
|
||||
text-align: center;
|
||||
animation: fade-in 600ms;
|
||||
animation-fill-mode: backwards;
|
||||
/* prevent flickering on load */
|
||||
animation-iteration-count: 0;
|
||||
}
|
||||
|
||||
x-no-peers h2,
|
||||
@@ -643,7 +642,6 @@ footer .logo {
|
||||
margin-bottom: 8px;
|
||||
color: var(--primary-color);
|
||||
margin-top: -10px;
|
||||
animation: ease-in;
|
||||
}
|
||||
|
||||
.discovery-wrapper {
|
||||
@@ -703,7 +701,6 @@ footer .logo {
|
||||
max-width: 15em;
|
||||
text-overflow: ellipsis;
|
||||
cursor: text;
|
||||
margin-left: -1rem;
|
||||
margin-bottom: -6px;
|
||||
padding-bottom: 0.1rem;
|
||||
border-radius: 1.3rem/30%;
|
||||
@@ -717,11 +714,24 @@ footer .logo {
|
||||
#edit-pen {
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
margin-left: -1rem;
|
||||
margin-bottom: -2px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
html:not([dir="rtl"]) #display-name,
|
||||
html:not([dir="rtl"]) #edit-pen {
|
||||
margin-left: -1rem;
|
||||
}
|
||||
|
||||
html[dir="rtl"] #display-name,
|
||||
html[dir="rtl"] #edit-pen {
|
||||
margin-right: -1rem;
|
||||
}
|
||||
|
||||
html[dir="rtl"] #edit-pen {
|
||||
transform: rotateY(180deg);
|
||||
}
|
||||
|
||||
/* Dialog */
|
||||
|
||||
x-dialog x-background {
|
||||
@@ -734,10 +744,12 @@ x-dialog x-background {
|
||||
}
|
||||
|
||||
x-dialog x-paper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: calc(100vw - 10px);
|
||||
z-index: 3;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
width: 100%;
|
||||
max-width: 400px;
|
||||
overflow: hidden;
|
||||
box-sizing: border-box;
|
||||
@@ -745,6 +757,15 @@ x-dialog x-paper {
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
#pair-device-dialog x-paper,
|
||||
#edit-paired-devices-dialog x-paper,
|
||||
#public-room-dialog x-paper,
|
||||
#language-select-dialog x-paper {
|
||||
position: absolute;
|
||||
top: max(50%, 350px);
|
||||
margin-top: -328.5px;
|
||||
}
|
||||
|
||||
x-paper > .row:first-of-type {
|
||||
background-color: var(--accent-color);
|
||||
border-bottom: solid 4px var(--border-color);
|
||||
@@ -764,16 +785,6 @@ x-paper > .row:first-of-type h2 {
|
||||
--accent-color: var(--public-room-color);
|
||||
}
|
||||
|
||||
#pair-device-dialog x-paper,
|
||||
#public-room-dialog x-paper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: absolute;
|
||||
top: max(50%, 350px);
|
||||
margin-top: -328.5px;
|
||||
width: calc(100vw - 20px);
|
||||
}
|
||||
|
||||
#pair-device-dialog ::-moz-selection,
|
||||
#pair-device-dialog ::selection {
|
||||
color: black;
|
||||
@@ -829,8 +840,8 @@ x-dialog a {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.input-key-container > input + * {
|
||||
margin-left: 6px;
|
||||
.input-key-container > input {
|
||||
margin: 0 3px;
|
||||
}
|
||||
|
||||
.input-key-container.six-chars > input:nth-of-type(4) {
|
||||
@@ -841,15 +852,17 @@ x-dialog a {
|
||||
-webkit-user-select: text;
|
||||
-moz-user-select: text;
|
||||
user-select: text;
|
||||
font-size: 50px;
|
||||
letter-spacing: min(calc((100vw - 80px - 99px) / 100 * 7), 23px);
|
||||
display: inline-block;
|
||||
text-indent: calc(0.5 * (11px + min(calc((100vw - 80px - 99px) / 100 * 6), 23px)));
|
||||
margin: 15px -15px;
|
||||
font-size: 50px;
|
||||
letter-spacing: min(calc((100vw - 80px - 99px) / 100 * 7), 20px);
|
||||
text-indent: calc(0.5 * (11px + min(calc((100vw - 80px - 99px) / 100 * 6), 28px)));
|
||||
margin: 25px 0;
|
||||
}
|
||||
|
||||
.key-qr-code {
|
||||
margin: 16px;
|
||||
width: fit-content;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.key-instructions {
|
||||
@@ -1001,14 +1014,26 @@ x-paper > .button-row > .button {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
x-paper > .button-row > .button:not(:first-child) {
|
||||
html:not([dir="rtl"]) x-paper > .button-row > .button:not(:first-child) {
|
||||
border-right: solid 1.5px var(--border-color);
|
||||
}
|
||||
|
||||
x-paper > .button-row > .button:not(:last-child) {
|
||||
html:not([dir="rtl"]) x-paper > .button-row > .button:not(:last-child) {
|
||||
border-left: solid 1.5px var(--border-color);
|
||||
}
|
||||
|
||||
html[dir="rtl"] x-paper > .button-row > .button:not(:first-child) {
|
||||
border-left: solid 1.5px var(--border-color);
|
||||
}
|
||||
|
||||
html[dir="rtl"] x-paper > .button-row > .button:not(:last-child) {
|
||||
border-right: solid 1.5px var(--border-color);
|
||||
}
|
||||
|
||||
.language-buttons > button > span {
|
||||
margin: 0 0.3em;
|
||||
}
|
||||
|
||||
.file-description {
|
||||
max-width: 100%;
|
||||
}
|
||||
@@ -1041,7 +1066,7 @@ x-dialog .dialog-subheader {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
#send-text-dialog .textarea {
|
||||
#text-input {
|
||||
min-height: 200px;
|
||||
width: 100%;
|
||||
}
|
||||
@@ -1233,22 +1258,23 @@ button::-moz-focus-inner {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#about:not(:target) header.fade-in {
|
||||
#about:not(:target) header {
|
||||
transition-delay: 400ms;
|
||||
}
|
||||
|
||||
#about:target header.fade-in {
|
||||
#about:target header {
|
||||
transition-delay: 100ms;
|
||||
}
|
||||
|
||||
#about .fade-in {
|
||||
#about > * {
|
||||
transition: opacity 300ms ease 300ms;
|
||||
will-change: opacity;
|
||||
pointer-events: all;
|
||||
}
|
||||
|
||||
#about:not(:target) .fade-in {
|
||||
opacity: 0 !important;
|
||||
#about:not(:target) > header,
|
||||
#about:not(:target) > section {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition-delay: 0s;
|
||||
}
|
||||
@@ -1271,7 +1297,6 @@ button::-moz-focus-inner {
|
||||
--size: max(max(230vw, 230vh), calc(150vh + 150vw));
|
||||
--size-half: calc(var(--size)/2);
|
||||
top: calc(28px - var(--size-half));
|
||||
right: calc(36px - var(--size-half));
|
||||
width: var(--size);
|
||||
height: var(--size);
|
||||
border-radius: 50%;
|
||||
@@ -1280,6 +1305,15 @@ button::-moz-focus-inner {
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
html:not([dir="rtl"]) #about x-background {
|
||||
right: calc(36px - var(--size-half));
|
||||
}
|
||||
|
||||
html[dir="rtl"] #about x-background {
|
||||
left: calc(36px - var(--size-half));
|
||||
}
|
||||
|
||||
|
||||
/* Hack such that initial scale(0) isn't animated */
|
||||
#about x-background {
|
||||
will-change: transform;
|
||||
@@ -1419,17 +1453,17 @@ 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 */
|
||||
.fade-in {
|
||||
animation: fade-in 600ms;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
|
||||
.no-animation-on-load {
|
||||
animation-iteration-count: 0;
|
||||
}
|
||||
|
||||
.opacity-0 {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
/* Responsive Styles */
|
||||
@@ -1576,3 +1610,10 @@ x-dialog x-paper {
|
||||
color: black;
|
||||
background: var(--primary-color);
|
||||
}
|
||||
|
||||
/* make elements with attribute contenteditable editable on older iOS devices.
|
||||
See note here: https://developer.mozilla.org/en-US/docs/Web/CSS/user-select */
|
||||
[contenteditable] {
|
||||
-webkit-user-select: text;
|
||||
user-select: text;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user