mirror of
https://github.com/schlagmichdoch/PairDrop.git
synced 2026-04-07 02:12:16 +00:00
Compare commits
43 Commits
v1.10.8
...
fix-thumbn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb6fe7ae61 | ||
|
|
00d2757fdc | ||
|
|
ab67c5858d | ||
|
|
b34b3f7b39 | ||
|
|
3e502a76d0 | ||
|
|
08af4670ee | ||
|
|
a458c00213 | ||
|
|
2e088b8434 | ||
|
|
31e3b4304c | ||
|
|
d73e5666b9 | ||
|
|
96a055b7d0 | ||
|
|
703894e309 | ||
|
|
13f7d36da0 | ||
|
|
1549ff48c9 | ||
|
|
9f4d99c8db | ||
|
|
563c8dd8a8 | ||
|
|
43c346894d | ||
|
|
a68cd75b71 | ||
|
|
e85a2e6293 | ||
|
|
794e6304fe | ||
|
|
f9b8b0fadf | ||
|
|
10f648b7cd | ||
|
|
331c61fec8 | ||
|
|
fa24e77d3b | ||
|
|
6ca039910a | ||
|
|
9f02f7b3ca | ||
|
|
04d65da779 | ||
|
|
e6f2c776dc | ||
|
|
b0711de5b9 | ||
|
|
d9a6ed4a47 | ||
|
|
5dd36da962 | ||
|
|
8bc65ed622 | ||
|
|
5625cb0ca6 | ||
|
|
74e5e2286f | ||
|
|
1a254765fe | ||
|
|
27a698c762 | ||
|
|
971917bc77 | ||
|
|
1eefd4720f | ||
|
|
ff92e606ff | ||
|
|
e53e4adcdf | ||
|
|
fda19dc819 | ||
|
|
78d9ba45d3 | ||
|
|
488762bbce |
@@ -1,5 +1,13 @@
|
||||
node_modules
|
||||
.github
|
||||
.git*
|
||||
|
||||
*.md
|
||||
.idea
|
||||
dev
|
||||
docs
|
||||
licenses
|
||||
node_modules
|
||||
pairdrop-cli
|
||||
*.md
|
||||
*.yml
|
||||
Dockerfile
|
||||
rtc_config_example.json
|
||||
turnserver_example.conf
|
||||
4
.github/ISSUE_TEMPLATE/bug-report.md
vendored
4
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -36,7 +36,7 @@ If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Bug occurs on official PairDrop instance https://pairdrop.net/**
|
||||
No | Yes
|
||||
Version: v1.10.8
|
||||
Version: v1.10.10
|
||||
|
||||
**Bug occurs on self-hosted PairDrop instance**
|
||||
No | Yes
|
||||
@@ -44,7 +44,7 @@ No | Yes
|
||||
**Self-Hosted Setup**
|
||||
Proxy: Nginx | Apache2
|
||||
Deployment: docker run | docker compose | npm run start:prod
|
||||
Version: v1.10.8
|
||||
Version: v1.10.10
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,7 +1,6 @@
|
||||
node_modules
|
||||
.DS_Store
|
||||
fqdn.env
|
||||
/docker/certs
|
||||
/dev/certs
|
||||
qrcode-svg/
|
||||
turnserver.conf
|
||||
rtc_config.json
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
FROM node:lts-alpine
|
||||
FROM alpine:latest
|
||||
|
||||
WORKDIR /home/node/app
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN npm ci
|
||||
RUN apk add --no-cache nodejs npm
|
||||
RUN NODE_ENV="production" npm ci --omit=dev
|
||||
|
||||
# Directories and files excluded via .dockerignore
|
||||
COPY . .
|
||||
|
||||
# environment settings
|
||||
|
||||
@@ -32,7 +32,7 @@ Send a file from your phone to your laptop?
|
||||
<img src="docs/pairdrop_screenshot_mobile.gif" alt="Screenshot GIF showing PairDrop in use" style="width: 300px">
|
||||
|
||||
## Differences to the [Snapdrop](https://github.com/RobinLinus/snapdrop) it is based on
|
||||
<details><summary>List view</summary>
|
||||
<details><summary>View all differences</summary>
|
||||
|
||||
### Paired Devices and Public Rooms — Internet Transfer
|
||||
* Transfer files over the Internet between paired devices or by entering temporary public rooms.
|
||||
@@ -103,7 +103,7 @@ Connect to others in complex network situations, or over the Internet.
|
||||
* [zip.js](https://gildas-lormeau.github.io/zip.js/) library
|
||||
* [cyrb53](https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js) super-fast hash function
|
||||
* [NoSleep](https://github.com/richtr/NoSleep.js) display sleep, add wake lock ([MIT](licenses/MIT-NoSleep))
|
||||
* [heic2any](https://github.com/alexcorvi/heic2any) HEIC/HEIF to PNG/GIF/JPEG ([MIT](licenses/MIT-heic2any))
|
||||
* [libheif](https://github.com/strukturag/libheif) library to handle HEIC/HEIF files (GPLv3)
|
||||
* [Weblate](https://weblate.org/) web-based localization tool
|
||||
|
||||
[FAQ](docs/faq.md)
|
||||
|
||||
3
dev/nginx-with-openssl.Dockerfile
Normal file
3
dev/nginx-with-openssl.Dockerfile
Normal file
@@ -0,0 +1,3 @@
|
||||
FROM nginx:alpine
|
||||
|
||||
RUN apk add --no-cache openssl
|
||||
42
dev/nginx/default.conf
Normal file
42
dev/nginx/default.conf
Normal file
@@ -0,0 +1,42 @@
|
||||
server {
|
||||
listen 80;
|
||||
|
||||
expires epoch;
|
||||
|
||||
location / {
|
||||
proxy_connect_timeout 300;
|
||||
proxy_pass http://pairdrop:3000;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
}
|
||||
|
||||
location /ca.crt {
|
||||
alias /etc/ssl/certs/pairdropCA.crt;
|
||||
}
|
||||
|
||||
# To allow POST on static pages
|
||||
error_page 405 =200 $uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
http2 on;
|
||||
ssl_certificate /etc/ssl/certs/pairdrop-dev.crt;
|
||||
ssl_certificate_key /etc/ssl/certs/pairdrop-dev.key;
|
||||
|
||||
expires epoch;
|
||||
|
||||
location / {
|
||||
proxy_connect_timeout 300;
|
||||
proxy_pass http://pairdrop:3000;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
}
|
||||
|
||||
location /ca.crt {
|
||||
alias /etc/ssl/certs/pairdropCA.crt;
|
||||
}
|
||||
# To allow POST on static pages
|
||||
error_page 405 =200 $uri;
|
||||
}
|
||||
|
||||
9
dev/openssl/create.sh
Normal file
9
dev/openssl/create.sh
Normal file
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
cnf_dir='/mnt/openssl/'
|
||||
certs_dir='/etc/ssl/certs/'
|
||||
openssl req -config ${cnf_dir}pairdropCA.cnf -new -x509 -days 1 -keyout ${certs_dir}pairdropCA.key -out ${certs_dir}pairdropCA.crt
|
||||
openssl req -config ${cnf_dir}pairdropCert.cnf -new -out /tmp/pairdrop-dev.csr -keyout ${certs_dir}pairdrop-dev.key
|
||||
openssl x509 -req -in /tmp/pairdrop-dev.csr -CA ${certs_dir}pairdropCA.crt -CAkey ${certs_dir}pairdropCA.key -CAcreateserial -extensions req_ext -extfile ${cnf_dir}pairdropCert.cnf -sha512 -days 1 -out ${certs_dir}pairdrop-dev.crt
|
||||
|
||||
exec "$@"
|
||||
26
dev/openssl/pairdropCA.cnf
Normal file
26
dev/openssl/pairdropCA.cnf
Normal file
@@ -0,0 +1,26 @@
|
||||
[ req ]
|
||||
default_bits = 2048
|
||||
default_md = sha256
|
||||
default_days = 1
|
||||
encrypt_key = no
|
||||
distinguished_name = subject
|
||||
x509_extensions = x509_ext
|
||||
string_mask = utf8only
|
||||
prompt = no
|
||||
|
||||
[ subject ]
|
||||
organizationName = PairDrop
|
||||
OU = CA
|
||||
commonName = pairdrop-CA
|
||||
|
||||
[ x509_ext ]
|
||||
subjectKeyIdentifier = hash
|
||||
authorityKeyIdentifier = keyid:always,issuer
|
||||
|
||||
# You only need digitalSignature below. *If* you don't allow
|
||||
# RSA Key transport (i.e., you use ephemeral cipher suites), then
|
||||
# omit keyEncipherment because that's key transport.
|
||||
|
||||
basicConstraints = critical, CA:TRUE, pathlen:0
|
||||
keyUsage = critical, digitalSignature, keyEncipherment, cRLSign, keyCertSign
|
||||
|
||||
29
dev/openssl/pairdropCert.cnf
Normal file
29
dev/openssl/pairdropCert.cnf
Normal file
@@ -0,0 +1,29 @@
|
||||
[ req ]
|
||||
default_bits = 2048
|
||||
default_md = sha256
|
||||
default_days = 1
|
||||
encrypt_key = no
|
||||
distinguished_name = subject
|
||||
req_extensions = req_ext
|
||||
string_mask = utf8only
|
||||
prompt = no
|
||||
|
||||
[ subject ]
|
||||
organizationName = PairDrop
|
||||
OU = Development
|
||||
|
||||
# Use a friendly name here because it's presented to the user. The server's DNS
|
||||
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
|
||||
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
|
||||
# must include the DNS name in the SAN too (otherwise, Chrome and others that
|
||||
# strictly follow the CA/Browser Baseline Requirements will fail).
|
||||
|
||||
commonName = ${ENV::FQDN}
|
||||
|
||||
[ req_ext ]
|
||||
subjectKeyIdentifier = hash
|
||||
basicConstraints = CA:FALSE
|
||||
keyUsage = digitalSignature, keyEncipherment
|
||||
subjectAltName = DNS:${ENV::FQDN}
|
||||
nsComment = "OpenSSL Generated Certificate"
|
||||
extendedKeyUsage = serverAuth
|
||||
34
docker-compose-dev.yml
Normal file
34
docker-compose-dev.yml
Normal file
@@ -0,0 +1,34 @@
|
||||
version: "3"
|
||||
services:
|
||||
pairdrop:
|
||||
build: .
|
||||
container_name: pairdrop
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- PUID=1000 # UID to run the application as
|
||||
- PGID=1000 # GID to run the application as
|
||||
- WS_FALLBACK=false # Set to true to enable websocket fallback if the peer to peer WebRTC connection is not available to the client.
|
||||
- RATE_LIMIT=false # Set to true to limit clients to 1000 requests per 5 min.
|
||||
- RTC_CONFIG=false # Set to the path of a file that specifies the STUN/TURN servers.
|
||||
- DEBUG_MODE=false # Set to true to debug container and peer connections.
|
||||
- TZ=Etc/UTC # Time Zone
|
||||
ports:
|
||||
- "127.0.0.1:3000:3000" # Web UI. Change the port number before the last colon e.g. `127.0.0.1:9000:3000`
|
||||
nginx:
|
||||
build:
|
||||
context: dev/
|
||||
dockerfile: nginx-with-openssl.Dockerfile
|
||||
image: "nginx-with-openssl"
|
||||
volumes:
|
||||
- ./public:/usr/share/nginx/html
|
||||
- ./dev/certs:/etc/ssl/certs
|
||||
- ./dev/openssl:/mnt/openssl
|
||||
- ./dev/nginx/default.conf:/etc/nginx/conf.d/default.conf
|
||||
ports:
|
||||
- "8080:80"
|
||||
- "8443:443"
|
||||
environment:
|
||||
- FQDN=localhost
|
||||
entrypoint: /mnt/openssl/create.sh
|
||||
command: ["nginx", "-g", "daemon off;"]
|
||||
restart: unless-stopped
|
||||
@@ -165,7 +165,7 @@ you can [start the PairDrop instance with an activated WebSocket fallback](https
|
||||
|
||||
Files are sent directly between peers.
|
||||
PairDrop doesn't even use a database.
|
||||
If curious, study [the server](https://github.com/schlagmichdoch/pairdrop/blob/master/index.js).
|
||||
If curious, study [the signaling server](https://github.com/schlagmichdoch/PairDrop/blob/master/server/ws-server.js).
|
||||
WebRTC encrypts the files in transit.
|
||||
|
||||
If the devices are on the same network,
|
||||
@@ -188,9 +188,8 @@ to learn more about STUN, TURN and WebRTC.
|
||||
<br>
|
||||
|
||||
Yes. Your files are sent using WebRTC, encrypting them in transit.
|
||||
To ensure the connection is secure and there is no [MITM](https://wikiless.org/wiki/Man-in-the-middle_attack),
|
||||
compare the security number shown under the device name on both devices.
|
||||
The security number is different for every connection.
|
||||
Still you have to trust the PairDrop server. To ensure the connection is secure and there is no [MITM](https://en.m.wikipedia.org/wiki/Man-in-the-middle_attack) there is a plan to make PairDrop
|
||||
zero trust by encrypting the signaling and implementing a verification process. See [issue #180](https://github.com/schlagmichdoch/PairDrop/issues/180) to keep updated.
|
||||
|
||||
<br>
|
||||
|
||||
|
||||
@@ -556,10 +556,6 @@ a2enmod proxy
|
||||
a2enmod proxy_http
|
||||
```
|
||||
|
||||
```bash
|
||||
a2enmod proxy_wstunnel
|
||||
```
|
||||
|
||||
<br>
|
||||
|
||||
Create a new configuration file under `/etc/apache2/sites-available` (on Debian)
|
||||
@@ -570,18 +566,10 @@ Create a new configuration file under `/etc/apache2/sites-available` (on Debian)
|
||||
|
||||
```apacheconf
|
||||
<VirtualHost *:80>
|
||||
ProxyPass / http://127.0.0.1:3000/
|
||||
RewriteEngine on
|
||||
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||
RewriteRule ^/?(.*) "ws://127.0.0.1:3000/$1" [P,L]
|
||||
ProxyPass / http://127.0.0.1:3000/ upgrade=websocket
|
||||
</VirtualHost>
|
||||
<VirtualHost *:443>
|
||||
ProxyPass / https://127.0.0.1:3000/
|
||||
RewriteEngine on
|
||||
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||
RewriteRule ^/?(.*) "wws://127.0.0.1:3000/$1" [P,L]
|
||||
ProxyPass / https://127.0.0.1:3000/ upgrade=websocket
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
@@ -589,14 +577,10 @@ Create a new configuration file under `/etc/apache2/sites-available` (on Debian)
|
||||
|
||||
```apacheconf
|
||||
<VirtualHost *:80>
|
||||
Redirect permanent / https://127.0.0.1:3000/
|
||||
Redirect permanent / https://127.0.0.1:3000/
|
||||
</VirtualHost>
|
||||
<VirtualHost *:443>
|
||||
ProxyPass / https://127.0.0.1:3000/
|
||||
RewriteEngine on
|
||||
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||
RewriteRule ^/?(.*) "wws://127.0.0.1:3000/$1" [P,L]
|
||||
ProxyPass / http://127.0.0.1:3000/ upgrade=websocket
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
@@ -652,68 +636,74 @@ To run PairDrop including its own coturn-server you need to punch holes in the f
|
||||
|
||||
<br>
|
||||
|
||||
### Firewall
|
||||
To run PairDrop including its own coturn-server you need to punch holes in the firewall. These ports must be opened additionally:
|
||||
- 3478 tcp/udp
|
||||
- 5349 tcp/udp
|
||||
- 10000:20000 tcp/udp
|
||||
|
||||
<br>
|
||||
|
||||
## Local Development
|
||||
|
||||
### Install
|
||||
|
||||
All files needed for developing are available on the branch `dev`.
|
||||
All files needed for developing are available in the folder `./dev`.
|
||||
|
||||
First, [Install docker with docker-compose.](https://docs.docker.com/compose/install/)
|
||||
For convenience, there is also a docker compose file for developing:
|
||||
|
||||
Then, clone the repository and run docker-compose:
|
||||
#### Developing with docker compose
|
||||
First, [Install docker with docker compose.](https://docs.docker.com/compose/install/)
|
||||
|
||||
Then, clone the repository and run docker compose:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/schlagmichdoch/PairDrop.git && cd PairDrop
|
||||
```
|
||||
```bash
|
||||
git checkout dev
|
||||
```
|
||||
```bash
|
||||
docker compose -f docker-compose-dev.yml up -d
|
||||
docker compose -f docker-compose-dev.yml up --no-deps --build
|
||||
```
|
||||
|
||||
Now point your web browser to `http://localhost:8080`.
|
||||
|
||||
- To restart the containers, run `docker compose restart`.
|
||||
- To stop the containers, run `docker compose stop`.
|
||||
- To debug the Node.js server, run `docker logs pairdrop`.
|
||||
|
||||
- After changes to the code you have to rerun the `docker compose` command
|
||||
|
||||
<br>
|
||||
|
||||
### Testing PWA related features
|
||||
#### Testing PWA related features
|
||||
|
||||
PWAs requires the app to be served under a correctly set up and trusted TLS endpoint.
|
||||
|
||||
The NGINX container creates a CA certificate and a website certificate for you.
|
||||
To correctly set the common name of the certificate,
|
||||
you need to change the FQDN environment variable in `docker/fqdn.env`
|
||||
to the fully qualified domain name of your workstation.
|
||||
you need to change the FQDN environment variable in `docker-compose-dev.yml`
|
||||
to the fully qualified domain name of your workstation. (Default: localhost)
|
||||
|
||||
If you want to test PWA features, you need to trust the CA of the certificate for your local deployment. \
|
||||
For your convenience, you can download the crt file from `http://<Your FQDN>:8080/ca.crt`. \
|
||||
Install that certificate to the trust store of your operating system. \
|
||||
|
||||
- On Windows, make sure to install it to the `Trusted Root Certification Authorities` store.
|
||||
- On macOS, double-click the installed CA certificate in `Keychain Access`,
|
||||
##### Windows
|
||||
- Make sure to install it to the `Trusted Root Certification Authorities` store.
|
||||
|
||||
##### macOS
|
||||
- Double-click the installed CA certificate in `Keychain Access`,
|
||||
- expand `Trust`, and select `Always Trust` for SSL.
|
||||
- Firefox uses its own trust store. To install the CA,
|
||||
- point Firefox at `http://<Your FQDN>:8080/ca.crt`.
|
||||
|
||||
##### Firefox
|
||||
Firefox uses its own trust store. To install the CA:
|
||||
- point Firefox at `http://<Your FQDN>:8080/ca.crt` (Default: `http://localhost:8080/ca.crt`)
|
||||
- When prompted, select `Trust this CA to identify websites` and click _OK_.
|
||||
|
||||
Alternatively:
|
||||
1. Download `ca.crt` from `http://<Your FQDN>:8080/ca.crt` (Default: `http://localhost:8080/ca.crt`)
|
||||
2. Go to `about:preferences#privacy` scroll down to `Security` and `Certificates` and click `View Certificates`
|
||||
3. Import the downloaded certificate file (step 1)
|
||||
|
||||
##### Chrome
|
||||
- When using Chrome, you need to restart Chrome so it reloads the trust store (`chrome://restart`).
|
||||
- Additionally, after installing a new cert, you need to clear the Storage (DevTools → Application → Clear storage → Clear site data).
|
||||
|
||||
##### Google Chrome
|
||||
- To skip the installation of the certificate, you can also open `chrome://flags/#unsafely-treat-insecure-origin-as-secure`
|
||||
- The feature `Insecure origins treated as secure` must be enabled and the list must include your PairDrop test instance. E.g.: `http://127.0.0.1:3000,https://127.0.0.1:8443`
|
||||
|
||||
Please note that the certificates (CA and webserver cert) expire after a day.
|
||||
Also, whenever you restart the NGINX Docker container new certificates are created.
|
||||
|
||||
The site is served on `https://<Your FQDN>:8443`.
|
||||
The site is served on `https://<Your FQDN>:8443` (Default: `https://localhost:8443`).
|
||||
|
||||
[< Back](/README.md)
|
||||
|
||||
@@ -45,11 +45,11 @@ This pairdrop-cli version was released alongside v1.10.4
|
||||
#### Linux / Mac
|
||||
1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases)
|
||||
```shell
|
||||
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.8/pairdrop-cli.zip"
|
||||
wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.10/pairdrop-cli.zip"
|
||||
```
|
||||
or
|
||||
```shell
|
||||
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.8/pairdrop-cli.zip"
|
||||
curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.10/pairdrop-cli.zip"
|
||||
```
|
||||
2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/`
|
||||
```shell
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Alex Corvi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
544
package-lock.json
generated
544
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "pairdrop",
|
||||
"version": "1.10.8",
|
||||
"lockfileVersion": 2,
|
||||
"version": "1.10.10",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "pairdrop",
|
||||
"version": "1.10.8",
|
||||
"version": "1.10.10",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express": "^4.18.2",
|
||||
@@ -245,9 +245,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/express-rate-limit": {
|
||||
"version": "7.1.5",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.5.tgz",
|
||||
"integrity": "sha512-/iVogxu7ueadrepw1bS0X0kaRC/U0afwiYRSLg68Ts+p4Dc85Q5QKsOnPS/QUjPMHvOJQtBDrZgvkOzf8ejUYw==",
|
||||
"version": "7.3.1",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.3.1.tgz",
|
||||
"integrity": "sha512-BbaryvkY4wEgDqLgD18/NSy2lDO2jTuT9Y8c1Mpx0X63Yz0sYd5zN6KPe7UvpuSVvV33T6RaE1o1IVZQjHMYgw==",
|
||||
"engines": {
|
||||
"node": ">= 16"
|
||||
},
|
||||
@@ -476,9 +476,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/object-inspect": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
|
||||
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
@@ -688,9 +691,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ua-parser-js": {
|
||||
"version": "1.0.37",
|
||||
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz",
|
||||
"integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==",
|
||||
"version": "1.0.38",
|
||||
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz",
|
||||
"integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -742,9 +745,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ws": {
|
||||
"version": "8.16.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
|
||||
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
|
||||
"version": "8.17.1",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
|
||||
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
@@ -761,516 +764,5 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"accepts": {
|
||||
"version": "1.3.8",
|
||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
|
||||
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
|
||||
"requires": {
|
||||
"mime-types": "~2.1.34",
|
||||
"negotiator": "0.6.3"
|
||||
}
|
||||
},
|
||||
"array-flatten": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.20.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
|
||||
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
|
||||
"requires": {
|
||||
"bytes": "3.1.2",
|
||||
"content-type": "~1.0.5",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "2.4.1",
|
||||
"qs": "6.11.0",
|
||||
"raw-body": "2.5.2",
|
||||
"type-is": "~1.6.18",
|
||||
"unpipe": "1.0.0"
|
||||
}
|
||||
},
|
||||
"bytes": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
||||
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
|
||||
},
|
||||
"call-bind": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
||||
"requires": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"set-function-length": "^1.2.1"
|
||||
}
|
||||
},
|
||||
"content-disposition": {
|
||||
"version": "0.5.4",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
|
||||
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
|
||||
"requires": {
|
||||
"safe-buffer": "5.2.1"
|
||||
}
|
||||
},
|
||||
"content-type": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
|
||||
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
|
||||
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
|
||||
},
|
||||
"cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"define-data-property": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
||||
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
||||
"requires": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"depd": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
||||
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
|
||||
},
|
||||
"destroy": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
|
||||
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
|
||||
},
|
||||
"ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
|
||||
},
|
||||
"encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
|
||||
},
|
||||
"es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||
"requires": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
}
|
||||
},
|
||||
"es-errors": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
||||
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
|
||||
},
|
||||
"escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
|
||||
},
|
||||
"etag": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
|
||||
},
|
||||
"express": {
|
||||
"version": "4.19.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
|
||||
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
|
||||
"requires": {
|
||||
"accepts": "~1.3.8",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.20.2",
|
||||
"content-disposition": "0.5.4",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.6.0",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"finalhandler": "1.2.0",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "2.0.0",
|
||||
"merge-descriptors": "1.0.1",
|
||||
"methods": "~1.1.2",
|
||||
"on-finished": "2.4.1",
|
||||
"parseurl": "~1.3.3",
|
||||
"path-to-regexp": "0.1.7",
|
||||
"proxy-addr": "~2.0.7",
|
||||
"qs": "6.11.0",
|
||||
"range-parser": "~1.2.1",
|
||||
"safe-buffer": "5.2.1",
|
||||
"send": "0.18.0",
|
||||
"serve-static": "1.15.0",
|
||||
"setprototypeof": "1.2.0",
|
||||
"statuses": "2.0.1",
|
||||
"type-is": "~1.6.18",
|
||||
"utils-merge": "1.0.1",
|
||||
"vary": "~1.1.2"
|
||||
}
|
||||
},
|
||||
"express-rate-limit": {
|
||||
"version": "7.1.5",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.1.5.tgz",
|
||||
"integrity": "sha512-/iVogxu7ueadrepw1bS0X0kaRC/U0afwiYRSLg68Ts+p4Dc85Q5QKsOnPS/QUjPMHvOJQtBDrZgvkOzf8ejUYw==",
|
||||
"requires": {}
|
||||
},
|
||||
"finalhandler": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
|
||||
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"on-finished": "2.4.1",
|
||||
"parseurl": "~1.3.3",
|
||||
"statuses": "2.0.1",
|
||||
"unpipe": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"forwarded": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
||||
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
|
||||
},
|
||||
"fresh": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
||||
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
|
||||
},
|
||||
"function-bind": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
|
||||
},
|
||||
"get-intrinsic": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"requires": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||
"requires": {
|
||||
"get-intrinsic": "^1.1.3"
|
||||
}
|
||||
},
|
||||
"has-property-descriptors": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
||||
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
||||
"requires": {
|
||||
"es-define-property": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"has-proto": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
||||
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
|
||||
},
|
||||
"has-symbols": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
|
||||
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
|
||||
},
|
||||
"hasown": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
||||
"requires": {
|
||||
"function-bind": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
|
||||
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
|
||||
"requires": {
|
||||
"depd": "2.0.0",
|
||||
"inherits": "2.0.4",
|
||||
"setprototypeof": "1.2.0",
|
||||
"statuses": "2.0.1",
|
||||
"toidentifier": "1.0.1"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"ipaddr.js": {
|
||||
"version": "1.9.1",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
||||
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
|
||||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
|
||||
},
|
||||
"merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
|
||||
},
|
||||
"methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
|
||||
},
|
||||
"mime": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
||||
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"requires": {
|
||||
"mime-db": "1.52.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
||||
},
|
||||
"negotiator": {
|
||||
"version": "0.6.3",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
|
||||
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
|
||||
},
|
||||
"object-inspect": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
|
||||
},
|
||||
"on-finished": {
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
|
||||
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
|
||||
"requires": {
|
||||
"ee-first": "1.1.1"
|
||||
}
|
||||
},
|
||||
"parseurl": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
|
||||
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
|
||||
"requires": {
|
||||
"forwarded": "0.2.0",
|
||||
"ipaddr.js": "1.9.1"
|
||||
}
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.11.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
|
||||
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
|
||||
"requires": {
|
||||
"side-channel": "^1.0.4"
|
||||
}
|
||||
},
|
||||
"range-parser": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
||||
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.5.2",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
|
||||
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
|
||||
"requires": {
|
||||
"bytes": "3.1.2",
|
||||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"unpipe": "1.0.0"
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"send": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
|
||||
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "2.0.0",
|
||||
"mime": "1.6.0",
|
||||
"ms": "2.1.3",
|
||||
"on-finished": "2.4.1",
|
||||
"range-parser": "~1.2.1",
|
||||
"statuses": "2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"ms": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"serve-static": {
|
||||
"version": "1.15.0",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
||||
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
|
||||
"requires": {
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"parseurl": "~1.3.3",
|
||||
"send": "0.18.0"
|
||||
}
|
||||
},
|
||||
"set-function-length": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
||||
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
|
||||
"requires": {
|
||||
"define-data-property": "^1.1.4",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"setprototypeof": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
|
||||
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
|
||||
},
|
||||
"side-channel": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
|
||||
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
|
||||
"requires": {
|
||||
"call-bind": "^1.0.7",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"object-inspect": "^1.13.1"
|
||||
}
|
||||
},
|
||||
"statuses": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
||||
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
|
||||
},
|
||||
"toidentifier": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
||||
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
|
||||
},
|
||||
"type-is": {
|
||||
"version": "1.6.18",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
||||
"requires": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "~2.1.24"
|
||||
}
|
||||
},
|
||||
"ua-parser-js": {
|
||||
"version": "1.0.37",
|
||||
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz",
|
||||
"integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ=="
|
||||
},
|
||||
"unique-names-generator": {
|
||||
"version": "4.7.1",
|
||||
"resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz",
|
||||
"integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow=="
|
||||
},
|
||||
"unpipe": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
|
||||
},
|
||||
"utils-merge": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
|
||||
},
|
||||
"vary": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
|
||||
},
|
||||
"ws": {
|
||||
"version": "8.16.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
|
||||
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
|
||||
"requires": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "pairdrop",
|
||||
"version": "1.10.8",
|
||||
"version": "1.10.10",
|
||||
"type": "module",
|
||||
"description": "",
|
||||
"main": "server/index.js",
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
<div class="column">
|
||||
<div class="known-as-wrapper">
|
||||
<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>
|
||||
<div id="display-name" class="badge" data-i18n-key="footer.display-name" data-i18n-attrs="data-placeholder title" autocorrect="off" autocomplete="off" autocapitalize="none" spellcheck="false" contenteditable></div>
|
||||
<svg class="icon edit-pen">
|
||||
<use xlink:href="#edit-pen-icon"></use>
|
||||
</svg>
|
||||
@@ -192,11 +192,26 @@
|
||||
<span> - </span>
|
||||
<span>(Arabic)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="be">
|
||||
<span>беларуская</span>
|
||||
<span> - </span>
|
||||
<span>(Belarusian)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="ca">
|
||||
<span>Català</span>
|
||||
<span> - </span>
|
||||
<span>(Catalan)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="cs">
|
||||
<span>Čeština</span>
|
||||
<span> - </span>
|
||||
<span>(Czech)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="da">
|
||||
<span>Dansk</span>
|
||||
<span> - </span>
|
||||
<span>(Danish)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="de">
|
||||
<span>Deutsch</span>
|
||||
<span> - </span>
|
||||
@@ -225,6 +240,11 @@
|
||||
<span> - </span>
|
||||
<span>(Italian)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="he">
|
||||
<span>עִבְרִית</span>
|
||||
<span> - </span>
|
||||
<span>(Hebrew)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="kn">
|
||||
<span>ಕನ್ನಡ</span>
|
||||
<span> - </span>
|
||||
@@ -270,6 +290,11 @@
|
||||
<span> - </span>
|
||||
<span>(Turkish)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="uk">
|
||||
<span>Українська</span>
|
||||
<span> - </span>
|
||||
<span>(Ukrainian)</span>
|
||||
</button>
|
||||
<button class="btn fw wrap" value="zh-CN">
|
||||
<span>中文</span>
|
||||
<span> - </span>
|
||||
@@ -597,7 +622,7 @@
|
||||
</svg>
|
||||
<div class="title-wrapper" dir="ltr">
|
||||
<h1>PairDrop</h1>
|
||||
<div class="font-subheading">v1.10.8</div>
|
||||
<div class="font-subheading">v1.10.10</div>
|
||||
</div>
|
||||
<div class="font-subheading" data-i18n-key="about.claim" data-i18n-attrs="text"></div>
|
||||
<div class="row">
|
||||
|
||||
184
public/lang/be.json
Normal file
184
public/lang/be.json
Normal file
@@ -0,0 +1,184 @@
|
||||
{
|
||||
"header": {
|
||||
"about_aria-label": "Адкрыйце Аб PairDrop",
|
||||
"about_title": "Аб PairDrop",
|
||||
"theme-auto_title": "Аўтаматычная адаптацыя тэмы да сістэмы",
|
||||
"theme-light_title": "Заўсёды выкарыстоўваць светлую тэму",
|
||||
"theme-dark_title": "Заўсёды выкарыстоўваць цёмную тэму",
|
||||
"notification_title": "Уключыць апавяшчэнні",
|
||||
"edit-paired-devices_title": "Рэдагаваць злучаныя прылады",
|
||||
"join-public-room_title": "Часова далучыцца да публічнага пакоя",
|
||||
"cancel-share-mode": "Адмяніць",
|
||||
"language-selector_title": "Задаць мову",
|
||||
"install_title": "Усталяваць PairDrop",
|
||||
"pair-device_title": "Злучыце свае прылады назаўжды",
|
||||
"edit-share-mode": "Рэдагаваць",
|
||||
"expand_title": "Разгарнуць радок кнопак"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers_data-drop-bg": "Адпусціце, каб выбраць атрымальніка",
|
||||
"no-peers-title": "Адкрыйце PairDrop на іншых прыладах, каб адправіць файлы",
|
||||
"x-instructions_data-drop-peer": "Адпусціце, каб адправіць вузлу",
|
||||
"x-instructions_data-drop-bg": "Адпусціце, каб выбраць атрымальніка",
|
||||
"x-instructions-share-mode_mobile": "Дакраніцеся, каб адправіць {{descriptor}}",
|
||||
"activate-share-mode-and-other-file": "і 1 іньшы файл",
|
||||
"activate-share-mode-and-other-files-plural": "і {{count}} іньшых файла(ў)",
|
||||
"activate-share-mode-shared-text": "агульны тэкст",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} агульных файлаў",
|
||||
"webrtc-requirement": "Каб выкарыстоўваць гэты асобнік Pair Drop, WebRTC павінен быць уключаны!",
|
||||
"no-peers-subtitle": "Злучыце прылады або ўвайдзіце ў публічны пакой, каб вас маглі выявіць з іншых сетак",
|
||||
"x-instructions_mobile": "Дакраніцеся, каб адправіць файлы, або доўга трымайце, каб адправіць паведамленне",
|
||||
"x-instructions-share-mode_desktop": "Націсніце, каб адправіць {{descriptor}}",
|
||||
"x-instructions_desktop": "Націсніце, каб адправіць файлы, або націсніце правай кнопкай мышы, каб адправіць паведамленне",
|
||||
"activate-share-mode-base": "Адкрыйце PairDrop на іншых прыладах, каб адправіць",
|
||||
"activate-share-mode-shared-file": "агульны файл"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Вы вядомыя як:",
|
||||
"display-name_data-placeholder": "Загрузка…",
|
||||
"discovery": "Вас могуць выявіць:",
|
||||
"on-this-network_title": "Вас можа знайсці кожны ў гэтай сетцы.",
|
||||
"paired-devices": "з дапамогай злучаных прылад",
|
||||
"public-room-devices_title": "Вас могуць выявіць прылады ў гэтай публічнай пакоі незалежна ад сеткі.",
|
||||
"traffic": "Рух",
|
||||
"display-name_title": "Зменіце назву сваёй прылады назаўжды",
|
||||
"on-this-network": "у гэтай сетцы",
|
||||
"paired-devices_title": "Злучаныя прылады заўсёды могуць вас выявіць незалежна ад сеткі.",
|
||||
"public-room-devices": "у пакоі {{roomId}}",
|
||||
"webrtc": ", калі WebRTC недаступны.",
|
||||
"routed": "накіроўваецца праз сервер"
|
||||
},
|
||||
"dialogs": {
|
||||
"hr-or": "АБО",
|
||||
"cancel": "Адмяніць",
|
||||
"pair": "Злучыць",
|
||||
"unpair": "Разлучыць",
|
||||
"paired-devices-wrapper_data-empty": "Няма злучаных прылад.",
|
||||
"auto-accept": "аўтаматычнае прыняцце",
|
||||
"close": "Закрыць",
|
||||
"join": "Далучыцца",
|
||||
"leave": "Пакінуць",
|
||||
"decline": "Адмовіць",
|
||||
"share": "Падзяліцца",
|
||||
"copy": "Капіяваць",
|
||||
"title-image": "Малюнак",
|
||||
"system-language": "Мова сістэмы",
|
||||
"public-room-qr-code_title": "Націсніце, каб скапіяваць спасылку на публічны пакой",
|
||||
"title-file": "Файл",
|
||||
"title-file-plural": "Файлы",
|
||||
"message_placeholder": "Тэкст",
|
||||
"language-selector-title": "Задаць мову",
|
||||
"send-message-title": "Адправіць паведамленне",
|
||||
"scan-qr-code": "або сканаваць QR-код.",
|
||||
"enter-room-id-from-another-device": "Увядзіце ID пакоя з іншай прылады, каб далучыцца да пакоя.",
|
||||
"edit-paired-devices-title": "Рэдагаваць злучаныя прылады",
|
||||
"auto-accept-instructions-1": "Актываваць",
|
||||
"auto-accept-instructions-2": ", каб аўтаматычна прымаць усе файлы, адпраўленыя з гэтай прылады.",
|
||||
"accept": "Прыняць",
|
||||
"download": "Спампаваць",
|
||||
"download-again": "Спампаваць яшчэ раз",
|
||||
"pair-devices-qr-code_title": "Націсніце, каб скапіраваць спасылку для спалучэння гэтай прылады",
|
||||
"approve": "сцвердзіць",
|
||||
"pair-devices-title": "Пастаяннае злучэнне прылад",
|
||||
"enter-key-from-another-device": "Увядзіце тут ключ з іншай прылады.",
|
||||
"temporary-public-room-title": "Часовы публічны пакой",
|
||||
"input-room-id-on-another-device": "Увядзіце гэты ID пакоя на іншай прыладзе",
|
||||
"paired-device-removed": "Злучаная прылада была выдалена.",
|
||||
"would-like-to-share": "хацеў бы падзяліцца",
|
||||
"send-message-to": "Каму:",
|
||||
"message_title": "Устаўце паведамленне для адпраўкі",
|
||||
"has-sent": "адправіў:",
|
||||
"base64-processing": "Апрацоўка…",
|
||||
"send": "Адправіць",
|
||||
"base64-title-text": "Падзяліцца тэкстам",
|
||||
"base64-title-files": "Падзяліцца файламі",
|
||||
"base64-tap-to-paste": "Дакраніцеся тут, каб падзяліцца {{type}}",
|
||||
"file-other-description-image": "і 1 іньшы малюнак",
|
||||
"file-other-description-image-plural": "і {{count}} іншых малюнкаў",
|
||||
"file-other-description-file-plural": "і {{count}} іншых файлаў",
|
||||
"title-image-plural": "Малюнкі",
|
||||
"share-text-subtitle": "Рэдагаваць паведамленне перад адпраўкай:",
|
||||
"share-text-title": "Падзяліцца тэкставым паведамленнем",
|
||||
"close-toast_title": "Закрыць апавяшчэнне",
|
||||
"receive-text-title": "Паведамленне атрымана",
|
||||
"input-key-on-this-device": "Увядзіце гэты ключ на іншай прыладзе",
|
||||
"base64-files": "файлы",
|
||||
"base64-text": "тэкст",
|
||||
"base64-paste-to-send": "Устаўце сюды буфер абмену, каб падзяліцца {{type}}",
|
||||
"file-other-description-file": "і 1 іньшы файл",
|
||||
"receive-title": "{{descriptor}} атрымана",
|
||||
"share-text-checkbox": "Заўсёды паказваць гэта дыялогавае акно пры абагульванні тэксту"
|
||||
},
|
||||
"about": {
|
||||
"buy-me-a-coffee_title": "Купіць мне кавы!",
|
||||
"mastodon_title": "Напішыце пра PairDrop на Mastodon",
|
||||
"tweet_title": "Твіт пра PairDrop",
|
||||
"github_title": "PairDrop на GitHub",
|
||||
"custom_title": "Сачыце за намі",
|
||||
"bluesky_title": "Сачыце за намі на BlueSky",
|
||||
"faq_title": "Часта задаюць пытанні",
|
||||
"close-about_aria-label": "Закрыць Аб PairDrop",
|
||||
"claim": "Самы просты спосаб перадачы файлаў паміж прыладамі",
|
||||
"privacypolicy_title": "Адкрыйце нашу палітыку прыватнасці"
|
||||
},
|
||||
"notifications": {
|
||||
"link-received": "Спасылка атрымана {{name}} - Націсніце, каб адкрыць",
|
||||
"message-received": "Паведамленне атрымана {{name}} - Націсніце, каб скапіяваць",
|
||||
"click-to-download": "Націсніце, каб спампаваць",
|
||||
"click-to-show": "Націсніце, каб паказаць",
|
||||
"copied-text-error": "Памылка запісу ў буфер абмену. Скапіруйце ўручную!",
|
||||
"online": "Вы зноў у сетцы",
|
||||
"online-requirement-public-room": "Вы павінны быць падлучаныя да сеткі, каб стварыць агульны пакой",
|
||||
"connecting": "Падключэнне…",
|
||||
"public-room-id-invalid": "Несапраўдны ID пакоя",
|
||||
"notifications-permissions-error": "Дазвол на апавяшчэнні быў заблакіраваны, бо карыстальнік некалькі разоў адхіляў запыт на дазвол. Гэта можна скінуць у меню \"Аб старонцы\", доступ да якой можна атрымаць, націснуўшы на значок замка побач з радком URL.",
|
||||
"request-title": "{{name}} хоча перадаць {{count}} {{descriptor}}",
|
||||
"copied-text": "Тэкст скапіраваны ў буфер абмену",
|
||||
"offline": "Вы па-за сеткай",
|
||||
"connected": "Падключана",
|
||||
"online-requirement-pairing": "Вы павінны быць падлучаныя да сеткі для спалучэння прылад",
|
||||
"pairing-key-invalidated": "Ключ {{key}} несапраўдны",
|
||||
"display-name-random-again": "Адлюстраванае імя зноў згенеравалася выпадковым чынам",
|
||||
"download-successful": "{{descriptor}} спампавана",
|
||||
"pairing-tabs-error": "Злучэнне дзвюх укладак вэб-браўзера немагчыма",
|
||||
"display-name-changed-permanently": "Адлюстроўванае імя было зменена назаўжды",
|
||||
"pairing-cleared": "Усе прылады раз'яднаны",
|
||||
"room-url-copied-to-clipboard": "Спасылка на публічны пакой скапіравана ў буфер абмену",
|
||||
"public-room-left": "Пакінуць публічны пакой {{publicRoomId}}",
|
||||
"text-content-incorrect": "Змест тэксту няправільны",
|
||||
"clipboard-content-incorrect": "Змест буфера абмену няправільны",
|
||||
"notifications-enabled": "Апавяшчэнні ўключаны",
|
||||
"files-incorrect": "Няправільныя файлы",
|
||||
"file-transfer-completed": "Перадача файла завершана",
|
||||
"selected-peer-left": "Выбраны вузел выйшаў",
|
||||
"copied-to-clipboard": "Скапіравана ў буфер абмену",
|
||||
"pair-url-copied-to-clipboard": "Спасылка для злучэння гэтай прылады скапіравана ў буфер абмену",
|
||||
"pairing-success": "Злучаныя прылады",
|
||||
"copied-to-clipboard-error": "Капіраванне немагчымае. Скапіруйце ўручную.",
|
||||
"file-content-incorrect": "Змест файла няправільны",
|
||||
"pairing-not-persistent": "Злучаныя прылады не з'яўляюцца пастаяннымі",
|
||||
"pairing-key-invalid": "Несапраўдны ключ",
|
||||
"display-name-changed-temporarily": "Адлюстраванае імя зменена толькі для гэтага сеансу",
|
||||
"ios-memory-limit": "Адначасовая адпраўка файлаў на iOS магчымая толькі да 200 МБ",
|
||||
"message-transfer-completed": "Перадача паведамлення завершана",
|
||||
"unfinished-transfers-warning": "Ёсць незавершаныя перадачы. Вы ўпэўнены, што хочаце закрыць PairDrop?",
|
||||
"rate-limit-join-key": "Ліміт хуткасці дасягнуты. Пачакайце 10 секунд і паўтарыце спробу."
|
||||
},
|
||||
"peer-ui": {
|
||||
"preparing": "Падрыхтоўка…",
|
||||
"waiting": "Чаканне…",
|
||||
"transferring": "Перадача…",
|
||||
"processing": "Апрацоўка…",
|
||||
"click-to-send-share-mode": "Націсніце, каб адправіць {{descriptor}}",
|
||||
"connection-hash": "Каб праверыць бяспеку скразнога шыфравання, параўнайце гэты нумар бяспекі на абедзвюх прыладах",
|
||||
"click-to-send": "Націсніце, каб адправіць файлы, або націсніце правай кнопкай мышы, каб адправіць паведамленне"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "Файл атрыманы",
|
||||
"image-transfer-requested": "Запытана перадача малюнкаў",
|
||||
"message-received": "Паведамленне атрымана",
|
||||
"message-received-plural": "Атрымана {{count}} паведамленняў",
|
||||
"file-received-plural": "Атрымана {{count}} файлаў",
|
||||
"file-transfer-requested": "Запытана перадача файла"
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,8 @@
|
||||
"cancel-share-mode": "Cancel·lar",
|
||||
"about_title": "Sobre PairDrop",
|
||||
"about_aria-label": "Obre Sobre PairDrop",
|
||||
"theme-light_title": "Utilitza sempre el mode clar"
|
||||
"theme-light_title": "Utilitza sempre el mode clar",
|
||||
"expand_title": "Expandeix la fila de botons de la capçalera"
|
||||
},
|
||||
"dialogs": {
|
||||
"message_placeholder": "Text",
|
||||
@@ -166,7 +167,11 @@
|
||||
"close-about_aria-label": "Tanca Sobre PairDrop",
|
||||
"buy-me-a-coffee_title": "Convida'm a un cafè!",
|
||||
"github_title": "PairDrop a GitHub",
|
||||
"faq_title": "Preguntes freqüents"
|
||||
"faq_title": "Preguntes freqüents",
|
||||
"mastodon_title": "Escriu sobre PairDrop a Mastodon",
|
||||
"bluesky_title": "Segueix-nos a BlueSky",
|
||||
"custom_title": "Segueix-nos",
|
||||
"privacypolicy_title": "Obre la nostra política de privacitat"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Transferència de Fitxers Sol·licitada",
|
||||
|
||||
184
public/lang/cs.json
Normal file
184
public/lang/cs.json
Normal file
@@ -0,0 +1,184 @@
|
||||
{
|
||||
"header": {
|
||||
"about_aria-label": "Otevřít o PairDrop",
|
||||
"about_title": "O službě PairDrop",
|
||||
"language-selector_title": "Nastavit jazyk",
|
||||
"theme-auto_title": "Automatické přizpůsobení tématu systému",
|
||||
"pair-device_title": "Spárovat zařízení permanentně",
|
||||
"theme-light_title": "Vždy používat světlé téma",
|
||||
"theme-dark_title": "Vždy používat tmavé téma",
|
||||
"notification_title": "Povolit upozornění",
|
||||
"install_title": "Nainstalovat PairDrop",
|
||||
"edit-paired-devices_title": "Upravit spárovaná zařízení",
|
||||
"join-public-room_title": "Připojte se dočasně k veřejné místnosti",
|
||||
"cancel-share-mode": "Zrušit",
|
||||
"edit-share-mode": "Upravit",
|
||||
"expand_title": "Rozbalit řádek tlačítka záhlaví"
|
||||
},
|
||||
"about": {
|
||||
"buy-me-a-coffee_title": "Kupte mi kávu!",
|
||||
"close-about_aria-label": "Zavřít O PairDrop",
|
||||
"claim": "Nejjednodušší způsob přenosu souborů mezi zařízeními",
|
||||
"github_title": "PairDrop na GitHubu",
|
||||
"tweet_title": "Tweet o PairDrop",
|
||||
"mastodon_title": "Napište o PairDrop na Mastodon",
|
||||
"custom_title": "Sledujte nás",
|
||||
"privacypolicy_title": "Otevřete naše zásady ochrany osobních údajů",
|
||||
"bluesky_title": "Sledujte nás na BlueSky",
|
||||
"faq_title": "Často kladené otázky"
|
||||
},
|
||||
"footer": {
|
||||
"webrtc": "pokud WebRTC není k dispozici.",
|
||||
"known-as": "Jste známí jako:",
|
||||
"display-name_data-placeholder": "Načítání…",
|
||||
"display-name_title": "Trvale upravit název zařízení",
|
||||
"discovery": "Můžete být objeveni:",
|
||||
"on-this-network": "na této síti",
|
||||
"on-this-network_title": "V této síti vás může objevit každý.",
|
||||
"paired-devices": "pomocí spárovaných zařízení",
|
||||
"paired-devices_title": "Spárovaná zařízení vás mohou kdykoli objevit nezávisle na síti.",
|
||||
"public-room-devices": "v místnosti {{roomId}}",
|
||||
"public-room-devices_title": "Zařízení v této veřejné místnosti vás mohou objevit nezávisle na síti.",
|
||||
"traffic": "Provoz je",
|
||||
"routed": "směrovány přes server"
|
||||
},
|
||||
"dialogs": {
|
||||
"auto-accept": "auto-accept",
|
||||
"pair-devices-title": "Spárujte zařízení trvale",
|
||||
"input-key-on-this-device": "Zadejte tento klíč na jiném zařízení",
|
||||
"scan-qr-code": "nebo naskenujte QR kód.",
|
||||
"enter-key-from-another-device": "Zde zadejte klíč z jiného zařízení.",
|
||||
"temporary-public-room-title": "Dočasná veřejná místnost",
|
||||
"input-room-id-on-another-device": "Zadejte toto ID místnosti na jiném zařízení",
|
||||
"enter-room-id-from-another-device": "Chcete-li se připojit k místnosti, zadejte ID místnosti z jiného zařízení.",
|
||||
"hr-or": "NEBO",
|
||||
"pair": "Párovat",
|
||||
"cancel": "Zrušit",
|
||||
"edit-paired-devices-title": "Upravit spárovaná zařízení",
|
||||
"unpair": "Zrušit spárování",
|
||||
"paired-device-removed": "Spárované zařízení bylo odstraněno.",
|
||||
"paired-devices-wrapper_data-empty": "Žádná spárovaná zařízení.",
|
||||
"auto-accept-instructions-1": "Aktivovat",
|
||||
"auto-accept-instructions-2": "automaticky přijímat všechny soubory odeslané z tohoto zařízení.",
|
||||
"close": "Zavřít",
|
||||
"join": "Připojit",
|
||||
"leave": "Odejít",
|
||||
"accept": "Přijmout",
|
||||
"decline": "Odmítnout",
|
||||
"would-like-to-share": "by se rád podělil",
|
||||
"has-sent": "odeslal:",
|
||||
"share": "Sdílet",
|
||||
"download": "Stáhnout",
|
||||
"send-message-title": "Poslat zprávu",
|
||||
"send-message-to": "Komu:",
|
||||
"message_title": "Vložte zprávu k odeslání",
|
||||
"message_placeholder": "Text",
|
||||
"send": "Odeslat",
|
||||
"receive-text-title": "Zpráva přijata",
|
||||
"copy": "Kopírovat",
|
||||
"base64-title-files": "Sdílet soubory",
|
||||
"base64-title-text": "Sdílet text",
|
||||
"base64-processing": "Zpracovává se…",
|
||||
"base64-tap-to-paste": "Klepnutím sem sdílejte {{type}}",
|
||||
"base64-files": "soubory",
|
||||
"file-other-description-image": "a 1 další obrázek",
|
||||
"base64-paste-to-send": "Sem vložte schránku pro sdílení {{type}}",
|
||||
"base64-text": "text",
|
||||
"file-other-description-file": "a 1 další soubor",
|
||||
"file-other-description-image-plural": "a další obrázky ({{count}})",
|
||||
"file-other-description-file-plural": "a {{count}} dalších souborů",
|
||||
"title-image": "Obrázek",
|
||||
"title-file": "Soubor",
|
||||
"title-image-plural": "Obrázky",
|
||||
"title-file-plural": "Soubory",
|
||||
"receive-title": "{{descriptor}} Přijato",
|
||||
"download-again": "Stáhnout znovu",
|
||||
"language-selector-title": "Nastavit jazyk",
|
||||
"system-language": "Jazyk systému",
|
||||
"public-room-qr-code_title": "Kliknutím zkopírujete odkaz do veřejné místnosti",
|
||||
"pair-devices-qr-code_title": "Kliknutím zkopírujete odkaz pro spárování tohoto zařízení",
|
||||
"approve": "schválit",
|
||||
"share-text-title": "Sdílet textovou zprávu",
|
||||
"share-text-subtitle": "Upravit zprávu před odesláním:",
|
||||
"share-text-checkbox": "Při sdílení textu vždy zobrazit tento dialog",
|
||||
"close-toast_title": "Zavřít oznámení"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers_data-drop-bg": "Uvolněním vyberte příjemce",
|
||||
"no-peers-title": "Otevřete PairDrop na jiných zařízeních a posílejte soubory",
|
||||
"no-peers-subtitle": "Spárujte zařízení nebo vstupte do veřejné místnosti, abyste byli zjistitelní v jiných sítích",
|
||||
"x-instructions_desktop": "Kliknutím odešlete soubory nebo kliknutím pravým tlačítkem odešlete zprávu",
|
||||
"x-instructions_mobile": "Klepnutím odešlete soubory nebo dlouhým klepnutím odešlete zprávu",
|
||||
"x-instructions_data-drop-peer": "Uvolněním odešlete",
|
||||
"x-instructions_data-drop-bg": "Uvolněním vyberte příjemce",
|
||||
"x-instructions-share-mode_desktop": "Kliknutím odešlete {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "Klepnutím odešlete {{descriptor}}",
|
||||
"activate-share-mode-base": "Pro odeslání otevřete PairDrop na jiných zařízeních",
|
||||
"activate-share-mode-and-other-file": "a 1 další soubor",
|
||||
"activate-share-mode-and-other-files-plural": "a {{count}} dalších souborů",
|
||||
"activate-share-mode-shared-text": "sdílený text",
|
||||
"activate-share-mode-shared-file": "sdílený soubor",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} sdílených souborů",
|
||||
"webrtc-requirement": "Chcete-li použít PairDrop, musí být povoleno WebRTC!"
|
||||
},
|
||||
"notifications": {
|
||||
"display-name-changed-permanently": "Zobrazované jméno je trvale změněno",
|
||||
"display-name-changed-temporarily": "Zobrazované jméno je změněno pouze pro tuto relaci",
|
||||
"display-name-random-again": "Zobrazované jméno je opět náhodně generováno",
|
||||
"download-successful": "{{descriptor}} staženo",
|
||||
"pairing-tabs-error": "Spárování dvou záložek webového prohlížeče není možné",
|
||||
"pairing-success": "Zařízení spárována",
|
||||
"pairing-not-persistent": "Spárovaná zařízení nejsou trvalá",
|
||||
"pairing-key-invalid": "Neplatný klíč",
|
||||
"pairing-key-invalidated": "Klíč {{key}} byl neplatný",
|
||||
"public-room-id-invalid": "Neplatné ID místnosti",
|
||||
"public-room-left": "Opustit veřejnou místnost {{publicRoomId}}",
|
||||
"copied-to-clipboard": "Zkopírováno do schránky",
|
||||
"pair-url-copied-to-clipboard": "Odkaz pro spárování tohoto zařízení byl zkopírován do schránky",
|
||||
"room-url-copied-to-clipboard": "Odkaz do veřejné místnosti zkopírován do schránky",
|
||||
"pairing-cleared": "Všechna nespárovaná zařízení",
|
||||
"copied-to-clipboard-error": "Kopírování není možné. Kopírovat ručně.",
|
||||
"text-content-incorrect": "Textový obsah je nesprávný",
|
||||
"file-content-incorrect": "Obsah souboru je nesprávný",
|
||||
"clipboard-content-incorrect": "Obsah schránky je nesprávný",
|
||||
"notifications-enabled": "Oznámení povolena",
|
||||
"notifications-permissions-error": "Oprávnění k oznámení bylo zablokováno, protože uživatel několikrát odmítl výzvu k povolení. Toto lze resetovat v části Informace o stránce, ke které se dostanete kliknutím na ikonu zámku vedle řádku adresy URL.",
|
||||
"link-received": "Odkaz obdržel {{name}} – kliknutím otevřete",
|
||||
"message-received": "Zpráva přijatá uživatelem {{name}} – kliknutím zkopírujte",
|
||||
"click-to-download": "Kliknutím stáhnete",
|
||||
"request-title": "{{name}} chce přenést {{count}} {{descriptor}}",
|
||||
"copied-text": "Text byl zkopírován do schránky",
|
||||
"click-to-show": "Kliknutím zobrazíte",
|
||||
"copied-text-error": "Zápis do schránky se nezdařil. Zkopírujte ručně!",
|
||||
"offline": "Jste offline",
|
||||
"online": "Jste zpět online",
|
||||
"connected": "Připojeno",
|
||||
"online-requirement-public-room": "Chcete-li vytvořit veřejnou místnost, musíte být online",
|
||||
"online-requirement-pairing": "Chcete-li spárovat zařízení, musíte být online",
|
||||
"connecting": "Připojování…",
|
||||
"files-incorrect": "Soubory jsou nesprávné",
|
||||
"file-transfer-completed": "Přenos souborů byl dokončen",
|
||||
"message-transfer-completed": "Přenos zprávy byl dokončen",
|
||||
"ios-memory-limit": "Odesílání souborů do iOS je možné pouze do velikosti 200 MB najednou",
|
||||
"unfinished-transfers-warning": "Existují nedokončené přenosy Opravdu chcete zavřít PairDrop?",
|
||||
"rate-limit-join-key": "Bylo dosaženo limitu. Počkejte 10 sekund a zkuste to znovu.",
|
||||
"selected-peer-left": "Vybraný partner odešel"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "Soubor byl přijat",
|
||||
"file-received-plural": "Počet přijatých souborů: {{count}}",
|
||||
"file-transfer-requested": "Požadován přenos souboru",
|
||||
"message-received": "Zpráva přijata",
|
||||
"image-transfer-requested": "Požadován přenos obrázku",
|
||||
"message-received-plural": "Počet přijatých zpráv: {{count}}"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send-share-mode": "Kliknutím odešlete {{descriptor}}",
|
||||
"click-to-send": "Kliknutím odešlete soubory nebo kliknutím pravým tlačítkem odešlete zprávu",
|
||||
"transferring": "Přenáší se…",
|
||||
"connection-hash": "Chcete-li ověřit bezpečnost šifrování typu end-to-end, porovnejte toto číslo zabezpečení na obou zařízeních",
|
||||
"preparing": "Připravuje se…",
|
||||
"waiting": "Čekání…",
|
||||
"processing": "Zpracovává se…"
|
||||
}
|
||||
}
|
||||
184
public/lang/da.json
Normal file
184
public/lang/da.json
Normal file
@@ -0,0 +1,184 @@
|
||||
{
|
||||
"notifications": {
|
||||
"public-room-left": "Forlod det offentlige rum {{publicRoomId}}",
|
||||
"room-url-copied-to-clipboard": "Link til offentligt rum kopieret til udklipsholder",
|
||||
"notifications-enabled": "Notifikationer aktiveret",
|
||||
"notifications-permissions-error": "Notifikationstilladelsen er blevet blokeret, da brugeren har afvist tilladelsesprompten flere gange. Dette kan nulstilles i sideoplysninger, som du kan få adgang til ved at klikke på låseikonet ved siden af URL-linjen.",
|
||||
"copied-text-error": "Skrivning til udklipsholder mislykkedes. Kopier manuelt!",
|
||||
"ios-memory-limit": "Det er kun muligt at sende filer til iOS op til 200 MB på én gang",
|
||||
"display-name-random-again": "Vist navn genereres tilfældigt igen",
|
||||
"display-name-changed-permanently": "Det viste navn blec ændret permanent",
|
||||
"display-name-changed-temporarily": "Vist navn blev kun ændret for denne session",
|
||||
"download-successful": "{{descriptor}} hentet",
|
||||
"pairing-tabs-error": "Det er umuligt at parre to webbrowserfaner",
|
||||
"pairing-success": "Enheder parret",
|
||||
"pairing-not-persistent": "Parrede enheder er ikke vedvarende",
|
||||
"pairing-key-invalid": "Ugyldig nøgle",
|
||||
"pairing-key-invalidated": "Nøglen {{key}} er ugyldig",
|
||||
"pairing-cleared": "Alle enheder er frakoblet",
|
||||
"public-room-id-invalid": "Ugyldigt rum-id",
|
||||
"copied-to-clipboard": "Kopieret til udklipsholder",
|
||||
"pair-url-copied-to-clipboard": "Link til at parre denne enhed kopieret til udklipsholder",
|
||||
"copied-to-clipboard-error": "Kopiering ikke mulig. Kopier manuelt.",
|
||||
"text-content-incorrect": "Tekstindholdet er forkert",
|
||||
"file-content-incorrect": "Filens indhold er forkert",
|
||||
"clipboard-content-incorrect": "Udklipsholderens indhold er forkert",
|
||||
"link-received": "Link modtaget af {{name}} - Klik for at åbne",
|
||||
"message-received": "Besked modtaget af {{name}} - Klik for at kopiere",
|
||||
"click-to-download": "Klik for at hente",
|
||||
"request-title": "{{name}} vil gerne overføre {{count}} {{descriptor}}",
|
||||
"click-to-show": "Klik for at vise",
|
||||
"copied-text": "Kopieret tekst til udklipsholder",
|
||||
"offline": "Du er offline",
|
||||
"online": "Du er online igen",
|
||||
"connected": "Forbundet",
|
||||
"online-requirement-pairing": "Du skal være online for at parre enheder",
|
||||
"online-requirement-public-room": "Du skal være online for at oprette et offentligt rum",
|
||||
"connecting": "Forbinder…",
|
||||
"files-incorrect": "Filerne er forkerte",
|
||||
"file-transfer-completed": "Filoverførsel gennemført",
|
||||
"message-transfer-completed": "Beskedoverførsel gennemført",
|
||||
"unfinished-transfers-warning": "Der er uafsluttede overførsler. Er du sikker på, at du vil lukke PairDrop?",
|
||||
"rate-limit-join-key": "Satsgrænsen er nået. Vent 10 sekunder, og prøv igen.",
|
||||
"selected-peer-left": "Valgt peer forlod"
|
||||
},
|
||||
"dialogs": {
|
||||
"message_placeholder": "Tekst",
|
||||
"base64-files": "filer",
|
||||
"file-other-description-image": "og 1 andet billede",
|
||||
"file-other-description-file": "og 1 anden fil",
|
||||
"download-again": "Hent igen",
|
||||
"system-language": "Systemsprog",
|
||||
"pair-devices-qr-code_title": "Klik for at kopiere linket for at parre denne enhed",
|
||||
"enter-key-from-another-device": "Indtast nøgle fra en anden enhed her.",
|
||||
"temporary-public-room-title": "Midlertidigt offentligt rum",
|
||||
"edit-paired-devices-title": "Rediger parrede enheder",
|
||||
"auto-accept-instructions-2": "for automatisk at acceptere alle filer sendt fra den pågældende enhed.",
|
||||
"pair-devices-title": "Par enheder permanent",
|
||||
"input-key-on-this-device": "Indtast denne nøgle på en anden enhed",
|
||||
"scan-qr-code": "eller scan QR-koden.",
|
||||
"input-room-id-on-another-device": "Indtast dette rum-id på en anden enhed",
|
||||
"enter-room-id-from-another-device": "Indtast rum-id fra en anden enhed for at deltage i rummet.",
|
||||
"hr-or": "ELLER",
|
||||
"pair": "Par",
|
||||
"cancel": "Annuller",
|
||||
"unpair": "Fjern parring",
|
||||
"paired-device-removed": "Parret enhed er blevet fjernet.",
|
||||
"paired-devices-wrapper_data-empty": "Ingen parrede enheder.",
|
||||
"auto-accept-instructions-1": "Aktiver",
|
||||
"auto-accept": "auto-accepter",
|
||||
"close": "Luk",
|
||||
"join": "Forbinde",
|
||||
"leave": "Forlad",
|
||||
"would-like-to-share": "gerne vil dele",
|
||||
"accept": "Accepter",
|
||||
"decline": "Nægt",
|
||||
"has-sent": "har sendt:",
|
||||
"share": "Del",
|
||||
"download": "Hent",
|
||||
"send-message-title": "Send besked",
|
||||
"send-message-to": "Til:",
|
||||
"message_title": "Indsæt besked for at sende",
|
||||
"send": "Send",
|
||||
"receive-text-title": "Besked modtaget",
|
||||
"copy": "Kopier",
|
||||
"base64-title-files": "Del filer",
|
||||
"base64-title-text": "Del tekst",
|
||||
"base64-processing": "Behandler…",
|
||||
"base64-tap-to-paste": "Tryk her for at dele {{type}}",
|
||||
"base64-paste-to-send": "Indsæt udklipsholder her for at dele {{type}}",
|
||||
"base64-text": "tekst",
|
||||
"file-other-description-image-plural": "og {{count}} andre billeder",
|
||||
"file-other-description-file-plural": "og {{count}} andre filer",
|
||||
"title-image": "Billede",
|
||||
"title-file": "Fil",
|
||||
"title-image-plural": "Billeder",
|
||||
"title-file-plural": "Filer",
|
||||
"receive-title": "{{descriptor}} Modtaget",
|
||||
"language-selector-title": "Indstil sprog",
|
||||
"public-room-qr-code_title": "Klik for at kopiere linket til det offentlige rum",
|
||||
"approve": "godkend",
|
||||
"share-text-title": "Del tekstbesked",
|
||||
"share-text-subtitle": "Rediger besked, før du sender:",
|
||||
"share-text-checkbox": "Vis altid denne dialogboks, når du deler tekst",
|
||||
"close-toast_title": "Luk besked"
|
||||
},
|
||||
"about": {
|
||||
"claim": "Den nemmeste måde at overføre filer på tværs af enheder",
|
||||
"faq_title": "Ofte stillede spørgsmål",
|
||||
"close-about_aria-label": "Luk Om PairDrop",
|
||||
"github_title": "PairDrop på GitHub",
|
||||
"buy-me-a-coffee_title": "Køb mig en kop kaffe!",
|
||||
"tweet_title": "Tweet om PairDrop",
|
||||
"mastodon_title": "Skriv om PairDrop på Mastodon",
|
||||
"bluesky_title": "Følg os på BlueSky",
|
||||
"custom_title": "Følg os",
|
||||
"privacypolicy_title": "Åbn vores privatlivspolitik"
|
||||
},
|
||||
"header": {
|
||||
"language-selector_title": "Indstil sprog",
|
||||
"about_aria-label": "Åbn Om PairDrop",
|
||||
"theme-auto_title": "Tilpas temaet til systemet automatisk",
|
||||
"theme-light_title": "Brug altid lyst tema",
|
||||
"theme-dark_title": "Brug altid mørkt tema",
|
||||
"notification_title": "Aktiver notifikationer",
|
||||
"install_title": "Installer PairDrop",
|
||||
"pair-device_title": "Par dine enheder permanent",
|
||||
"edit-paired-devices_title": "Rediger parrede enheder",
|
||||
"join-public-room_title": "Deltag midlertidigt i det offentlige rum",
|
||||
"cancel-share-mode": "Annuller",
|
||||
"edit-share-mode": "Redigere",
|
||||
"expand_title": "Udvid overskriftsknaprækken",
|
||||
"about_title": "Om PairDrop"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers-subtitle": "Par enheder, eller gå ind i et offentligt rum for at være synlig på andre netværk",
|
||||
"x-instructions_desktop": "Klik for at sende filer eller højreklik for at sende en besked",
|
||||
"activate-share-mode-base": "Åbn PairDrop på andre enheder for at sende",
|
||||
"no-peers_data-drop-bg": "Slip for at vælge modtager",
|
||||
"no-peers-title": "Åbn PairDrop på andre enheder for at sende filer",
|
||||
"x-instructions_mobile": "Tryk for at sende filer, eller tryk længe for at sende en besked",
|
||||
"x-instructions_data-drop-peer": "Slip for at sende til peer",
|
||||
"x-instructions_data-drop-bg": "Slip for at vælge modtager",
|
||||
"x-instructions-share-mode_desktop": "Klik for at sende {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "Tryk for at sende {{descriptor}}",
|
||||
"activate-share-mode-and-other-file": "og 1 anden fil",
|
||||
"activate-share-mode-and-other-files-plural": "og {{count}} andre filer",
|
||||
"activate-share-mode-shared-text": "delt tekst",
|
||||
"activate-share-mode-shared-file": "delt fil",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} delte filer",
|
||||
"webrtc-requirement": "For at bruge denne PairDrop-instans skal WebRTC være aktiveret!"
|
||||
},
|
||||
"footer": {
|
||||
"on-this-network_title": "Du kan blive opdaget af alle på dette netværk.",
|
||||
"public-room-devices_title": "Du kan blive opdaget af enheder i dette offentlige rum uafhængigt af netværket.",
|
||||
"known-as": "Du er kendt som:",
|
||||
"display-name_data-placeholder": "Indlæser…",
|
||||
"display-name_title": "Rediger dit enhedsnavn permanent",
|
||||
"discovery": "Du kan blive opdaget:",
|
||||
"on-this-network": "på dette netværk",
|
||||
"paired-devices": "af parrede enheder",
|
||||
"paired-devices_title": "Du kan til enhver tid blive opdaget af parrede enheder uafhængigt af netværket.",
|
||||
"public-room-devices": "i rum {{roomId}}",
|
||||
"traffic": "Trafikken er",
|
||||
"routed": "dirigeret gennem serveren",
|
||||
"webrtc": "hvis WebRTC ikke er tilgængelig."
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "Fil modtaget",
|
||||
"file-received-plural": "{{count}} Filer modtaget",
|
||||
"file-transfer-requested": "Filoverførsel anmodet",
|
||||
"image-transfer-requested": "Billedoverførsel anmodet",
|
||||
"message-received": "Besked modtaget",
|
||||
"message-received-plural": "{{count}} meddelelser modtaget"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send-share-mode": "Klik for at sende {{descriptor}}",
|
||||
"click-to-send": "Klik for at sende filer eller højreklik for at sende en besked",
|
||||
"connection-hash": "For at kontrollere sikkerheden for end-to-end-kryptering skal du sammenligne dette sikkerhedsnummer på begge enheder",
|
||||
"preparing": "Forbereder…",
|
||||
"waiting": "Venter…",
|
||||
"processing": "Behandler…",
|
||||
"transferring": "Overfører…"
|
||||
}
|
||||
}
|
||||
@@ -82,7 +82,7 @@
|
||||
"copy": "Copier",
|
||||
"base64-processing": "Traitement…",
|
||||
"base64-tap-to-paste": "Appuyez ici pour partager {{type}}",
|
||||
"base64-paste-to-send": "Coller ici pour partager {{type}}",
|
||||
"base64-paste-to-send": "Coller le presse-papiers ici pour partager {{type}}",
|
||||
"base64-text": "texte",
|
||||
"base64-files": "fichiers",
|
||||
"file-other-description-image": "et 1 autre image",
|
||||
@@ -119,7 +119,8 @@
|
||||
"faq_title": "Questions fréquemment posées",
|
||||
"bluesky_title": "Suis-nous sur BlueSky",
|
||||
"custom_title": "Suis-nous",
|
||||
"privacypolicy_title": "Ouvert sur notre politique de confidentialité"
|
||||
"privacypolicy_title": "Ouvert sur notre politique de confidentialité",
|
||||
"mastodon_title": "Écrire à propos de PairDrop sur Mastodon"
|
||||
},
|
||||
"notifications": {
|
||||
"display-name-changed-permanently": "Le nom d'affichage est modifié de manière permanente",
|
||||
|
||||
@@ -1 +1,184 @@
|
||||
{}
|
||||
{
|
||||
"header": {
|
||||
"about_title": "אודות PairDrop",
|
||||
"theme-light_title": "השתמש תמיד במצב בהיר",
|
||||
"install_title": "התקן את PairDrop",
|
||||
"edit-share-mode": "עריכה",
|
||||
"expand_title": "הרחב את שורת כפתור הכותרת",
|
||||
"language-selector_title": "שינוי השפה",
|
||||
"about_aria-label": "פתח אודות PairDrop",
|
||||
"theme-auto_title": "התאם את הרקע למערכת באופן אוטומטי",
|
||||
"theme-dark_title": "השתמש תמיד במצב כהה",
|
||||
"notification_title": "הפעל התראות",
|
||||
"pair-device_title": "התאם את המכשירים שלך לתמיד",
|
||||
"edit-paired-devices_title": "עריכת מכשירים מתואמים",
|
||||
"join-public-room_title": "הצטרף לחדר ציבורי באופן זמני",
|
||||
"cancel-share-mode": "ביטול"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers-subtitle": "תאם מכשירים או היכנס לחדר ציבורי כדי להיות ניתן לגילוי ברשתות אחרות",
|
||||
"x-instructions_data-drop-bg": "שחרר כדי לבחור נמען",
|
||||
"activate-share-mode-and-other-file": "וקובץ 1 אחר",
|
||||
"activate-share-mode-base": "פתח את PairDrop על מכשירים אחרים כדי לשלוח",
|
||||
"activate-share-mode-shared-file": "קובץ משותף",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} קבצים משותפים",
|
||||
"webrtc-requirement": "כדי להשתמש בPairdrop, WebRTC מוכרח להיות מופעל!",
|
||||
"no-peers_data-drop-bg": "שחרר כדי לבחור את הנמען",
|
||||
"no-peers-title": "פתח את PairDrop במכשירים אחרים כדי לשלוח קבצים",
|
||||
"x-instructions_desktop": "לחץ כדי לשלוח קבצים או בצע לחיצה ימנית כדי לשלוח הודעה",
|
||||
"x-instructions_mobile": "גע כדי לשלוח קבצים או בצע נגיעה ארוכה כדי לשלוח הודעה",
|
||||
"x-instructions_data-drop-peer": "שחרר כדי לשלוח למכשיר",
|
||||
"x-instructions-share-mode_desktop": "לחץ כדי לשלוח {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "גע כדי לשלוח {{descriptor}}",
|
||||
"activate-share-mode-and-other-files-plural": "ו{{count}} קבצים אחרים",
|
||||
"activate-share-mode-shared-text": "טקסט משותף"
|
||||
},
|
||||
"footer": {
|
||||
"paired-devices_title": "הנך ניתן לגילוי על ידי מכשירים מתואמים בכל עת ללא תלות ברשת.",
|
||||
"on-this-network": "ברשת הזו",
|
||||
"on-this-network_title": "אתה ניתן לגילוי על ידי כולם ברשת הזו.",
|
||||
"display-name_data-placeholder": "טוען…",
|
||||
"display-name_title": "שנה את שם המכשיר שלך לתמיד",
|
||||
"known-as": "הנך ידוע כ:",
|
||||
"discovery": "הנך ניתן לגילוי:",
|
||||
"paired-devices": "על ידי מכשירים מתואמים",
|
||||
"public-room-devices": "בחדר {{roomId}}",
|
||||
"public-room-devices_title": "הנך ניתן לגילוי על ידי מכשירים בחדר הציבורי הזה ללא תלות ברשת.",
|
||||
"traffic": "הנתונים",
|
||||
"routed": "מנותבים דרך השרת",
|
||||
"webrtc": "אם WebRTC אינו זמין."
|
||||
},
|
||||
"dialogs": {
|
||||
"input-room-id-on-another-device": "הזן את מזהה החדר הזה במכשיר אחר",
|
||||
"edit-paired-devices-title": "ערוך מכשירים מתואמים",
|
||||
"paired-device-removed": "המכשיר המתואם הוסר.",
|
||||
"download-again": "הורד שוב",
|
||||
"public-room-qr-code_title": "לחץ כדי להעתיק את הקישור לחדר הציבורי",
|
||||
"auto-accept-instructions-2": "כדי לקבל באופן אוטומטי את כל הקבצים שנשלחים ממכשיר זה.",
|
||||
"title-file-plural": "קבצים",
|
||||
"receive-title": "{{descriptor}} התקבל",
|
||||
"download": "הורד",
|
||||
"send-message-title": "שלח הודעה",
|
||||
"message_placeholder": "טקסט",
|
||||
"receive-text-title": "ההודעה התקבלה",
|
||||
"base64-text": "טקסט",
|
||||
"share-text-checkbox": "תמיד הצג את חלונית זו כאשר טקסט משותף",
|
||||
"system-language": "שפת המערכת",
|
||||
"title-file": "קובץ",
|
||||
"pair-devices-title": "תאם מכשירים לתמיד",
|
||||
"input-key-on-this-device": "הזן את הקוד הזה במכשיר אחר",
|
||||
"scan-qr-code": "או סרוק את הברקוד.",
|
||||
"enter-key-from-another-device": "הזן את הקוד ממכשיר אחר כאן.",
|
||||
"temporary-public-room-title": "חדר ציבורי זמני",
|
||||
"enter-room-id-from-another-device": "הזן מזהה חדר ממכשיר אחר כדי להצטרף לחדר.",
|
||||
"hr-or": "או",
|
||||
"pair": "תאם",
|
||||
"cancel": "ביטול",
|
||||
"unpair": "בטל התאמה",
|
||||
"paired-devices-wrapper_data-empty": "אין מכשירים מתואמים.",
|
||||
"auto-accept-instructions-1": "הפעל",
|
||||
"auto-accept": "קבלה אוטומטית",
|
||||
"close": "סגירה",
|
||||
"join": "הצטרף",
|
||||
"leave": "עזוב",
|
||||
"would-like-to-share": "רוצה לשתף",
|
||||
"accept": "קבל",
|
||||
"decline": "סרב",
|
||||
"has-sent": "שלח:",
|
||||
"share": "שתף",
|
||||
"send-message-to": "אל:",
|
||||
"message_title": "הזן את ההודעה לשליחה",
|
||||
"send": "שלח",
|
||||
"copy": "העתק",
|
||||
"base64-title-files": "שתף קבצים",
|
||||
"base64-title-text": "שתף טקסט",
|
||||
"base64-processing": "מעבד…",
|
||||
"base64-tap-to-paste": "גע כאן כדי לשתף {{type}}",
|
||||
"base64-paste-to-send": "הדבק כאן כדי לשתף {{type}}",
|
||||
"base64-files": "קבצים",
|
||||
"file-other-description-image": "ותמונה 1 אחרת",
|
||||
"file-other-description-file": "וקובץ 1 אחר",
|
||||
"file-other-description-image-plural": "ו{{count}} תמונות אחרות",
|
||||
"file-other-description-file-plural": "ו{{count}} קבצים אחרים",
|
||||
"title-image": "תמונה",
|
||||
"title-image-plural": "תמונות",
|
||||
"language-selector-title": "הגדר שפה",
|
||||
"pair-devices-qr-code_title": "לחץ כדי להעתיק את הקישור כדי לבצע תיאום עם מכשיר זה",
|
||||
"approve": "אשר",
|
||||
"share-text-title": "שתף הודעת טקסט",
|
||||
"share-text-subtitle": "ערוך את ההודעה לפני השליחה:",
|
||||
"close-toast_title": "סגירת ההתראה"
|
||||
},
|
||||
"about": {
|
||||
"mastodon_title": "כתוב על PairDrop בMastodon",
|
||||
"buy-me-a-coffee_title": "קנה לי קפה!",
|
||||
"claim": "הדרך הקלה ביותר להעברת קבצים בין מכשירים",
|
||||
"github_title": "PairDrop בGitHub",
|
||||
"tweet_title": "צייץ על PairDrop",
|
||||
"custom_title": "עקוב אחרינו",
|
||||
"bluesky_title": "עקוב אחרינו בBlueSky",
|
||||
"privacypolicy_title": "פתח את מדיניות הפרטיות שלנו",
|
||||
"faq_title": "שאלות נפוצות",
|
||||
"close-about_aria-label": "סגירת אודות PairDrop"
|
||||
},
|
||||
"notifications": {
|
||||
"display-name-changed-permanently": "שם התצוגה משתנה לתמיד",
|
||||
"download-successful": "{{descriptor}} הורד",
|
||||
"notifications-permissions-error": "ההרשאה להתראות נחסמה עקב סגירת חלונית בקשת ההרשאה מספר פעמים. אתה יכול לאפס זאת במידע על דף זה שניתן לגישה באמצעות לחיצה על אייקון המנעול ליד שורת הכתובת.",
|
||||
"click-to-show": "לחץ כדי להציג",
|
||||
"connecting": "מתחבר…",
|
||||
"online": "הנך מחובר שוב לאינטרנט",
|
||||
"pairing-cleared": "כל ההתאמות למכשירים הוסרו",
|
||||
"pair-url-copied-to-clipboard": "הקישור להתאמת המכשיר הזה הועתק",
|
||||
"connected": "מחובר",
|
||||
"online-requirement-pairing": "אתה צריך להיות מחובר לאינטרנט כדי לתאם מכשירים",
|
||||
"online-requirement-public-room": "אתה צריך להיות מחובר כדי ליצור חדר ציבורי",
|
||||
"files-incorrect": "הקבצים שגויים",
|
||||
"unfinished-transfers-warning": "יש עוד העברות שלא הסתיימו. אתה בטוח שאתה רוצה לסגור את PairDrop?",
|
||||
"rate-limit-join-key": "הגעת למגבלה. חכה 10 שניות ונסה שנית.",
|
||||
"selected-peer-left": "המכשיר הנבחר עזב",
|
||||
"display-name-changed-temporarily": "שם התצוגה משתנה להפעלה זו בלבד",
|
||||
"display-name-random-again": "שם התצוגה נוצר שוב באופן אקראי",
|
||||
"pairing-tabs-error": "תיאום בין שני כרטיסיות בדפדפן אינו אפשרי",
|
||||
"pairing-success": "המכשירים תואמו",
|
||||
"pairing-not-persistent": "המכשירים המתואמים אינם קבועים",
|
||||
"pairing-key-invalid": "קוד שגוי",
|
||||
"pairing-key-invalidated": "הקוד {{key}} לא תקף עוד",
|
||||
"public-room-id-invalid": "מזהה חדר שגוי",
|
||||
"public-room-left": "עזבת את החדר הציבורי {{publicRoomId}}",
|
||||
"copied-to-clipboard": "הועתק",
|
||||
"room-url-copied-to-clipboard": "הקישור לחדר הציבורי הועתק",
|
||||
"copied-to-clipboard-error": "העתקה אינה אפשרית. העתק ידנית.",
|
||||
"text-content-incorrect": "תוכן הטקסט שגוי",
|
||||
"file-content-incorrect": "תוכן הקובץ שגוי",
|
||||
"clipboard-content-incorrect": "התוכן שהודבק שגוי",
|
||||
"notifications-enabled": "ההתראות אופשרו",
|
||||
"link-received": "קישור התקבל מ{{name}} - לחץ כדי לפתוח",
|
||||
"message-received": "הודעה התקבלה מ{{name}} - לחץ כדי להעתיק",
|
||||
"click-to-download": "לחץ כדי להוריד",
|
||||
"request-title": "{{name}} רוצה לשלוח {{count}} {{descriptor}}",
|
||||
"copied-text": "הטקסט הועתק",
|
||||
"copied-text-error": "ההעתקה נכשלה. העתק ידנית!",
|
||||
"offline": "הנך לא מחובר לאינטרנט",
|
||||
"file-transfer-completed": "העברת הקובץ הושלמה בהצלחה",
|
||||
"ios-memory-limit": "שליחת קבצים למכשירי iOS אפשרית רק עד 200 MB בבת אחת",
|
||||
"message-transfer-completed": "העברת ההודעה הושלמה בהצלחה"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send": "לחץ כדי לשלוח קבצים או בצע לחיצה ימנית כדי לשלוח הודעה",
|
||||
"click-to-send-share-mode": "לחץ כדי לשלוח {{descriptor}}",
|
||||
"connection-hash": "כדי לאמת את האבטחה של ההצפנה מצד לצד, השווה את מספר אבטחה זה בין שני המכשירים",
|
||||
"preparing": "מתכונן…",
|
||||
"waiting": "מחכה…",
|
||||
"processing": "מעבד…",
|
||||
"transferring": "מעביר…"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "הקובץ התקבל",
|
||||
"file-received-plural": "{{count}} קבצים התקבלו",
|
||||
"file-transfer-requested": "העברת קבצים מתבקשת",
|
||||
"image-transfer-requested": "העברת תמונות מתבקשת",
|
||||
"message-received": "התקבלה הודעה",
|
||||
"message-received-plural": "{{count}} הודעות התקבלו"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
"transferring": "Mentransfer…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "Tempel di sini untuk mengirim {{type}}",
|
||||
"base64-paste-to-send": "Tempel salinan di sini untuk mengirim {{type}}",
|
||||
"auto-accept-instructions-2": "untuk secara otomatis menerima semua file yang dikirim dari perangkat tersebut.",
|
||||
"receive-text-title": "Pesan Diterima",
|
||||
"edit-paired-devices-title": "Edit Perangkat yg. Dipasangkan",
|
||||
@@ -154,7 +154,12 @@
|
||||
"base64-title-files": "Bagikan File",
|
||||
"base64-title-text": "Bagikan Teks",
|
||||
"message_placeholder": "Teks",
|
||||
"paired-device-removed": "Perangkat yang dipasangkan telah dihapus."
|
||||
"paired-device-removed": "Perangkat yang dipasangkan telah dihapus.",
|
||||
"approve": "menyetujui",
|
||||
"share-text-title": "Kirim Pesan Teks",
|
||||
"share-text-subtitle": "Edit pesan sebelum mengirim:",
|
||||
"share-text-checkbox": "Selalu tampilkan dialog ini ketika mengirimkan teks",
|
||||
"close-toast_title": "Tutup notifikasi"
|
||||
},
|
||||
"about": {
|
||||
"claim": "Cara termudah untuk mentransfer file lintas perangkat",
|
||||
@@ -162,7 +167,11 @@
|
||||
"close-about_aria-label": "Tutup Tentang PairDrop",
|
||||
"buy-me-a-coffee_title": "Traktir aku kopi!",
|
||||
"github_title": "PairDrop di GitHub",
|
||||
"faq_title": "Pertanyaan yang sering diajukan"
|
||||
"faq_title": "Pertanyaan yang sering diajukan",
|
||||
"mastodon_title": "Tulis tentang PairDrop di Mastodon",
|
||||
"bluesky_title": "Ikuti kami di BlueSky",
|
||||
"custom_title": "Ikuti kami",
|
||||
"privacypolicy_title": "Buka kebijakan privasi kami"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Permintaan Transfer File",
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"footer": {
|
||||
"webrtc": "WebRTCが利用できない場合。",
|
||||
"public-room-devices_title": "このデバイスはネットワークと関係なく、このパブリックルームのデバイスにより発見される可能性があります。",
|
||||
"webrtc": "(WebRTCが無効なため)",
|
||||
"public-room-devices_title": "公開ルーム内のデバイスは、接続中のネットワークと関係なくアクセスできます。",
|
||||
"display-name_data-placeholder": "読み込み中…",
|
||||
"display-name_title": "永続的なデバイス名を編集する",
|
||||
"traffic": "トラフィックは",
|
||||
"paired-devices_title": "このデバイスはネットワークと関係なく、常にペア設定したデバイスにより発見される可能性があります。",
|
||||
"public-room-devices": "ルーム{{roomId}}上",
|
||||
"paired-devices": "ペア設定したデバイス",
|
||||
"display-name_title": "デバイス名を変更する",
|
||||
"traffic": "この通信は",
|
||||
"paired-devices_title": "ペアリング済みデバイスであれば、接続中のネットワークに関わらずアクセスできます。",
|
||||
"public-room-devices": "ルーム{{roomId}}",
|
||||
"paired-devices": "ペアリング済みデバイス",
|
||||
"on-this-network": "このネットワーク上",
|
||||
"routed": "サーバーを経由します",
|
||||
"discovery": "このデバイスは以下で発見される可能性があります:",
|
||||
"on-this-network_title": "このデバイスはこのネットワーク上の誰にでも発見される可能性があります。",
|
||||
"discovery": "このデバイスを検出可能なネットワーク:",
|
||||
"on-this-network_title": "このネットワーク上のすべてのデバイスからアクセスできます。",
|
||||
"known-as": "他のデバイスに表示される名前:"
|
||||
},
|
||||
"notifications": {
|
||||
@@ -23,50 +23,50 @@
|
||||
"pairing-key-invalidated": "コード{{key}}が失効しました",
|
||||
"pairing-key-invalid": "無効なコード",
|
||||
"connected": "接続しました",
|
||||
"pairing-not-persistent": "ペア設定されたデバイスは永続化されていません",
|
||||
"text-content-incorrect": "テキストの内容が不正です",
|
||||
"pairing-not-persistent": "このデバイスとのペアリングは解除される可能性があります",
|
||||
"text-content-incorrect": "無効なテキスト内容です",
|
||||
"message-transfer-completed": "メッセージの送信が完了しました",
|
||||
"file-transfer-completed": "ファイルの転送が完了しました",
|
||||
"file-content-incorrect": "ファイルの内容が不正です",
|
||||
"file-transfer-completed": "ファイル転送が完了しました",
|
||||
"file-content-incorrect": "無効なファイル内容です",
|
||||
"files-incorrect": "ファイルが間違っています",
|
||||
"selected-peer-left": "選択した相手が退出しました",
|
||||
"selected-peer-left": "選択したデバイスが退出しました",
|
||||
"link-received": "{{name}}から受信したリンク(クリックして開く)",
|
||||
"online": "オンラインに復帰しました",
|
||||
"public-room-left": "パブリックルーム{{publicRoomId}}から退出しました",
|
||||
"public-room-left": "公開ルーム{{publicRoomId}}から退出しました",
|
||||
"copied-text": "テキストをクリップボードにコピーしました",
|
||||
"display-name-random-again": "表示名がもう一度ランダムに生成されました",
|
||||
"display-name-changed-permanently": "永続的な表示名が変更されました",
|
||||
"display-name-random-again": "新しいランダムなデバイス名に変更されました",
|
||||
"display-name-changed-permanently": "デバイス名が変更されました",
|
||||
"copied-to-clipboard-error": "コピーできませんでした。手動でコピーしてください。",
|
||||
"pairing-success": "デバイスがペア設定されました",
|
||||
"clipboard-content-incorrect": "クリップボードの内容が不正です",
|
||||
"display-name-changed-temporarily": "このセッションでの表示名が変更されました",
|
||||
"pairing-success": "ペアリングしました",
|
||||
"clipboard-content-incorrect": "無効なクリップボード内容です",
|
||||
"display-name-changed-temporarily": "この接続のみデバイス名が変更されました",
|
||||
"copied-to-clipboard": "クリップボードにコピーしました",
|
||||
"offline": "オフラインです",
|
||||
"pairing-tabs-error": "同じWebブラウザーの2つのタブをペア設定することはできません",
|
||||
"pairing-tabs-error": "同じWebブラウザーで開いたタブ同士でペアリングすることはできません",
|
||||
"public-room-id-invalid": "無効なルームID",
|
||||
"click-to-download": "クリックしてダウンロード",
|
||||
"pairing-cleared": "全てのデバイスのペア設定を解除しました",
|
||||
"notifications-enabled": "通知が有効です",
|
||||
"online-requirement-pairing": "デバイスをペア設定するにはオンラインである必要があります",
|
||||
"pairing-cleared": "全てのデバイスとのペアリングを解除しました",
|
||||
"notifications-enabled": "通知が有効になりました",
|
||||
"online-requirement-pairing": "ペアリングするにはオンラインである必要があります",
|
||||
"ios-memory-limit": "iOSへのファイル送信は一度に200MBまでしかできません",
|
||||
"online-requirement-public-room": "パブリックルームを作成するにはオンラインである必要があります",
|
||||
"online-requirement-public-room": "公開ルームを作成するにはオンラインである必要があります",
|
||||
"copied-text-error": "クリップボードにコピーできませんでした。手動でコピーしてください。",
|
||||
"download-successful": "{{descriptor}}をダウンロードしました",
|
||||
"click-to-show": "クリックして表示",
|
||||
"notifications-permissions-error": "ユーザーが権限のプロンプトを何度か閉じたため、通知の権限がブロックされました。これは、URL バーの横にある鍵アイコンをクリックしてアクセスできるページ情報からリセットできます。",
|
||||
"pair-url-copied-to-clipboard": "このデバイスをペア設定するリンクをクリップボードにコピーしました",
|
||||
"room-url-copied-to-clipboard": "パブリックルームへのリンクをクリップボードにコピーしました"
|
||||
"notifications-permissions-error": "通知がブロックされました。これはユーザーが通知許可を何度も拒否したためです。これをリセットするには、URLバーの隣にある鍵アイコンをクリックして、ページ情報にアクセスしてください。",
|
||||
"pair-url-copied-to-clipboard": "このデバイスとペアリングするリンクをクリップボードにコピーしました",
|
||||
"room-url-copied-to-clipboard": "公開ルームへのリンクをクリップボードにコピーしました"
|
||||
},
|
||||
"header": {
|
||||
"cancel-share-mode": "完了",
|
||||
"theme-auto_title": "テーマをシステムの設定に自動的に合わせる",
|
||||
"cancel-share-mode": "キャンセル",
|
||||
"theme-auto_title": "システムテーマに合わせる",
|
||||
"install_title": "PairDropをインストール",
|
||||
"theme-dark_title": "常にダークテーマを使用する",
|
||||
"pair-device_title": "あなたのデバイスを永続的にペア設定する",
|
||||
"join-public-room_title": "パブリックルームに一時的に参加する",
|
||||
"pair-device_title": "他のデバイスとペアリングする",
|
||||
"join-public-room_title": "公開ルームに参加する",
|
||||
"notification_title": "通知を有効にする",
|
||||
"edit-paired-devices_title": "ペア設定したデバイスを編集する",
|
||||
"language-selector_title": "言語を設定",
|
||||
"edit-paired-devices_title": "ペアリング設定",
|
||||
"language-selector_title": "言語設定",
|
||||
"about_title": "PairDropについて",
|
||||
"about_aria-label": "PairDropについてを開く",
|
||||
"theme-light_title": "常にライトテーマを使用する",
|
||||
@@ -74,19 +74,19 @@
|
||||
"expand_title": "ヘッダーボタン列を拡大する"
|
||||
},
|
||||
"instructions": {
|
||||
"x-instructions_mobile": "タップしてファイルを送信または長押ししてメッセージを送信します",
|
||||
"x-instructions-share-mode_desktop": "クリックして{{descriptor}}送信",
|
||||
"x-instructions_mobile": "タップでファイルを送信、長押しでメッセージを送信します",
|
||||
"x-instructions-share-mode_desktop": "クリックして{{descriptor}}を送信",
|
||||
"activate-share-mode-and-other-files-plural": "とその他{{count}}個のファイル",
|
||||
"x-instructions-share-mode_mobile": "タップして{{descriptor}}送信",
|
||||
"x-instructions-share-mode_mobile": "タップして{{descriptor}}を送信",
|
||||
"activate-share-mode-base": "他のデバイスでPairDropを開いて送信します",
|
||||
"no-peers-subtitle": "デバイスをペア設定するかパブリックルームに参加すると、他のネットワーク上からも見つけられるようになります",
|
||||
"no-peers-subtitle": "ペアリングや公開ルームを使用すると、他のネットワーク上のデバイスと共有できます",
|
||||
"activate-share-mode-shared-text": "共有されたテキスト",
|
||||
"x-instructions_desktop": "左クリックしてファイルを送信または右クリックしてメッセージを送信します",
|
||||
"no-peers-title": "他のデバイスでPairDropを開いてファイルを送信します",
|
||||
"x-instructions_data-drop-peer": "離すとこの相手に送信します",
|
||||
"x-instructions_data-drop-bg": "送信したい相手の上で離してください",
|
||||
"no-peers_data-drop-bg": "送信したい相手の上で離してください",
|
||||
"activate-share-mode-and-other-file": "もう1つの別のファイル",
|
||||
"x-instructions_desktop": "左クリックでファイルを送信、右クリックでメッセージを送信します",
|
||||
"no-peers-title": "ファイルを共有するには他のデバイスでPairDropを開いてください",
|
||||
"x-instructions_data-drop-peer": "ドロップするとこのデバイスに送信します",
|
||||
"x-instructions_data-drop-bg": "送信したいデバイスの上でドロップしてください",
|
||||
"no-peers_data-drop-bg": "送信したいデバイスの上でドロップしてください",
|
||||
"activate-share-mode-and-other-file": "とその他1個のファイル",
|
||||
"activate-share-mode-shared-file": "共有されたファイル",
|
||||
"activate-share-mode-shared-files-plural": "{{count}}個の共有されたファイル",
|
||||
"webrtc-requirement": "このPairDropインスタンスを使用するには、WebRTCを有効にする必要があります!"
|
||||
@@ -94,20 +94,20 @@
|
||||
"peer-ui": {
|
||||
"processing": "処理中…",
|
||||
"click-to-send-share-mode": "クリックして{{descriptor}}を送信",
|
||||
"click-to-send": "クリックしてファイルを送信または右クリックしてメッセージを送信します",
|
||||
"click-to-send": "左クリックでファイルを送信、右クリックでメッセージを送信します",
|
||||
"waiting": "待機中…",
|
||||
"connection-hash": "エンドツーエンド暗号化のセキュリティを確認するには、両方のデバイスのセキュリティナンバーを確認します",
|
||||
"connection-hash": "エンドツーエンド暗号化のセキュリティを確認するには、両方のデバイスのセキュリティナンバーを確認してください",
|
||||
"preparing": "準備中…",
|
||||
"transferring": "転送中…"
|
||||
},
|
||||
"dialogs": {
|
||||
"base64-paste-to-send": "ここをタップして{{type}}を送信",
|
||||
"auto-accept-instructions-2": "そのデバイスから送信される全てのファイルを自動的に承諾します。",
|
||||
"auto-accept-instructions-2": "」を有効にすると、そのデバイスから送信されたすべてのファイルを自動的に受け入れます。",
|
||||
"receive-text-title": "メッセージを受信しました",
|
||||
"edit-paired-devices-title": "ペア設定したデバイスを編集",
|
||||
"edit-paired-devices-title": "ペアリング設定",
|
||||
"cancel": "キャンセル",
|
||||
"auto-accept-instructions-1": "有効化",
|
||||
"pair-devices-title": "デバイスを永続的にペア設定",
|
||||
"auto-accept-instructions-1": "「",
|
||||
"pair-devices-title": "新規ペアリング",
|
||||
"download": "ダウンロード",
|
||||
"title-file": "ファイル",
|
||||
"base64-processing": "処理中…",
|
||||
@@ -117,58 +117,58 @@
|
||||
"join": "参加",
|
||||
"title-image-plural": "複数の画像",
|
||||
"send": "送信",
|
||||
"base64-tap-to-paste": "ここをタップして{{type}}を貼り付け",
|
||||
"base64-tap-to-paste": "ここをタップして{{type}}を共有",
|
||||
"base64-text": "テキスト",
|
||||
"copy": "コピー",
|
||||
"file-other-description-image": "と1個の他の画像",
|
||||
"temporary-public-room-title": "一時的なパブリックルーム",
|
||||
"file-other-description-image": "とその他1個の画像",
|
||||
"temporary-public-room-title": "公開ルーム",
|
||||
"base64-files": "ファイル",
|
||||
"has-sent": "が送信しました:",
|
||||
"file-other-description-file": "と1個の他のファイル",
|
||||
"file-other-description-file": "とその他1個のファイル",
|
||||
"close": "閉じる",
|
||||
"system-language": "システムの言語",
|
||||
"unpair": "ペア解除",
|
||||
"system-language": "システム言語",
|
||||
"unpair": "ペアリング解除",
|
||||
"title-image": "画像",
|
||||
"file-other-description-file-plural": "と{{count}}個の他のファイル",
|
||||
"file-other-description-file-plural": "とその他{{count}}個のファイル",
|
||||
"would-like-to-share": "が以下のファイルを共有しようとしています",
|
||||
"send-message-to": "このデバイスにメッセージを送信:",
|
||||
"language-selector-title": "言語を設定",
|
||||
"pair": "ペア設定",
|
||||
"language-selector-title": "言語設定",
|
||||
"pair": "ペアリング",
|
||||
"hr-or": "または",
|
||||
"scan-qr-code": "もしくはQRコードをスキャンします。",
|
||||
"input-key-on-this-device": "このキーを他のデバイスに入力する",
|
||||
"scan-qr-code": "もしくはQRコードをスキャンしてください。",
|
||||
"input-key-on-this-device": "このコードを他のデバイスに入力するか",
|
||||
"download-again": "もう一度ダウンロードする",
|
||||
"accept": "承諾",
|
||||
"paired-devices-wrapper_data-empty": "ペア設定したデバイスはありません。",
|
||||
"enter-key-from-another-device": "他のデバイスに表示されたキーをここに入力します。",
|
||||
"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を入力します。",
|
||||
"input-room-id-on-another-device": "このルームIDを他のデバイスに入力するか",
|
||||
"file-other-description-image-plural": "とその他{{count}}個の画像",
|
||||
"enter-room-id-from-another-device": "他のデバイスに表示されたルームIDを入力してください。",
|
||||
"message_title": "送信するメッセージを挿入",
|
||||
"pair-devices-qr-code_title": "クリックしてこのデバイスをペア設定するリンクをコピー",
|
||||
"public-room-qr-code_title": "クリックしてパブリックルームへのリンクをコピー",
|
||||
"paired-device-removed": "ペア設定されたデバイスが削除されました。",
|
||||
"pair-devices-qr-code_title": "クリックしてこのデバイスとペアリングするリンクをコピー",
|
||||
"public-room-qr-code_title": "クリックして公開ルームへのリンクをコピー",
|
||||
"paired-device-removed": "ペアリングを解除しました。",
|
||||
"message_placeholder": "テキスト",
|
||||
"base64-title-files": "共有されたファイル",
|
||||
"base64-title-text": "テキストを共有",
|
||||
"approve": "承諾",
|
||||
"approve": "OK",
|
||||
"share-text-subtitle": "送信する前にメッセージを編集する:",
|
||||
"share-text-checkbox": "テキストを共有するときに常にこのダイアログを表示する",
|
||||
"share-text-checkbox": "テキスト共有する際、毎回この画面を表示する",
|
||||
"close-toast_title": "通知を閉じる",
|
||||
"share-text-title": "テキストメッセージを共有します"
|
||||
},
|
||||
"about": {
|
||||
"claim": "デバイス間でファイルを転送する最も簡単な方法",
|
||||
"tweet_title": "PairDropについてツイートする",
|
||||
"claim": "デバイス間のファイル共有を手軽に実現します",
|
||||
"tweet_title": "PairDropのことをポストする",
|
||||
"close-about_aria-label": "PairDropについてを閉じる",
|
||||
"buy-me-a-coffee_title": "コーヒーをおごってください!",
|
||||
"github_title": "GitHubでPairDropを見る",
|
||||
"buy-me-a-coffee_title": "コーヒーを一杯おごってください!",
|
||||
"github_title": "PairDrop on GitHub",
|
||||
"faq_title": "FAQ",
|
||||
"mastodon_title": "MastodonにPairDropについて書く",
|
||||
"mastodon_title": "MastodonにPairDropのことをトゥートする",
|
||||
"bluesky_title": "BlueSkyでフォロー",
|
||||
"custom_title": "フォロー",
|
||||
"privacypolicy_title": "プライバシーポリシーを開く"
|
||||
|
||||
29
public/lang/ko.json
Normal file
29
public/lang/ko.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"header": {
|
||||
"notification_title": "알림 켜기",
|
||||
"edit-paired-devices_title": "연결된 기기 편집하기",
|
||||
"install_title": "PairDrop 설치",
|
||||
"theme-dark_title": "항상 다크 테마 사용",
|
||||
"about_title": "PairDrop에 대하여",
|
||||
"language-selector_title": "언어 설정",
|
||||
"about_aria-label": "PairDrop에 대하여 보기",
|
||||
"theme-light_title": "항상 라이트 테마 사용",
|
||||
"theme-auto_title": "시스템에 맞춰 테마 자동 적용",
|
||||
"join-public-room_title": "일시적으로 공개 방에 참여하기",
|
||||
"cancel-share-mode": "취소",
|
||||
"edit-share-mode": "편집",
|
||||
"pair-device_title": "영구적으로 기기 연결하기",
|
||||
"expand_title": "머리글 버튼 행 펼치기"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers-subtitle": "장치를 연결하거나 공개 방에 들어가 다른 네트워크에서 검색 가능하게 하세요",
|
||||
"no-peers_data-drop-bg": "해제하여 수신자 선택하기",
|
||||
"x-instructions_mobile": "탭하여 파일을 보내거나 길게 탭하여 메시지를 보내세요",
|
||||
"x-instructions_desktop": "클릭해 파일을 보내거나 오른쪽 클릭으로 메시지를 보내세요",
|
||||
"no-peers-title": "다른 장치에서 PairDrop을 열어 파일 보내기",
|
||||
"x-instructions_data-drop-bg": "해제하여 수신자 선택하기",
|
||||
"x-instructions-share-mode_desktop": "클릭하여 {{descriptor}} 보내기",
|
||||
"x-instructions-share-mode_mobile": "탭하여 {{descriptor}} 보내기",
|
||||
"activate-share-mode-base": "다른 기기에서 PairDrop을 열어 보내기"
|
||||
}
|
||||
}
|
||||
@@ -93,7 +93,9 @@
|
||||
"temporary-public-room-title": "Временная публичная комната",
|
||||
"message_title": "Вставьте сообщение для отправки",
|
||||
"pair-devices-qr-code_title": "Нажмите, чтобы скопировать ссылку для привязки этого устройства",
|
||||
"public-room-qr-code_title": "Нажмите, чтобы скопировать ссылку на публичную комнату"
|
||||
"public-room-qr-code_title": "Нажмите, чтобы скопировать ссылку на публичную комнату",
|
||||
"message_placeholder": "Текст",
|
||||
"paired-device-removed": "Связанное устройство удалено."
|
||||
},
|
||||
"about": {
|
||||
"close-about-aria-label": "Закрыть страницу \"О сервисе\"",
|
||||
|
||||
@@ -1,163 +1,163 @@
|
||||
{
|
||||
"header": {
|
||||
"about_title": "PairDrop Hakkında",
|
||||
"about_aria-label": "PairDrop Hakkındayı Aç",
|
||||
"theme-auto_title": "Temayı sisteme uyarla",
|
||||
"theme-light_title": "Daima açık tema kullan",
|
||||
"theme-dark_title": "Daima koyu tema kullan",
|
||||
"about_aria-label": "PairDrop Hakkında'yı Aç",
|
||||
"theme-auto_title": "Temayı sisteme otomatik olarak adapte et",
|
||||
"theme-light_title": "Her zaman açık temayı kullan",
|
||||
"theme-dark_title": "Her zaman koyu temayı kullan",
|
||||
"notification_title": "Bildirimleri etkinleştir",
|
||||
"install_title": "PairDrop'u Yükle",
|
||||
"pair-device_title": "Cihazı kalıcı olarak eşle",
|
||||
"edit-paired-devices_title": "Eşleştirilmiş cihazları düzenle",
|
||||
"cancel-share-mode": "Bitti",
|
||||
"join-public-room_title": "Geçici olarak genel odaya katılın",
|
||||
"language-selector_title": "Dili Seç",
|
||||
"pair-device_title": "Cihazlarınızı kalıcı olarak eşleştirin",
|
||||
"edit-paired-devices_title": "Eşleşmiş cihazları düzenle",
|
||||
"cancel-share-mode": "İptal Et",
|
||||
"join-public-room_title": "Geçici olarak ortak odaya katıl",
|
||||
"language-selector_title": "Dili Ayarla",
|
||||
"edit-share-mode": "Düzenle",
|
||||
"expand_title": "Başlık düğmesi satırını genişlet"
|
||||
"expand_title": "Başlık buton satırını genişlet"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers_data-drop-bg": "Alıcıyı seçmek için bırakın",
|
||||
"x-instructions_mobile": "Dosya göndermek için dokun veya mesaj göndermek için uzun dokun",
|
||||
"x-instructions-share-mode_desktop": "{{descriptor}} kişisine göndermek için tıkla",
|
||||
"x-instructions_mobile": "Dosya göndermek için dokunun veya mesaj göndermek için uzun dokunun",
|
||||
"x-instructions-share-mode_desktop": "{{descriptor}} göndermek için tıklayın",
|
||||
"activate-share-mode-and-other-files-plural": "ve {{count}} diğer dosya",
|
||||
"x-instructions-share-mode_mobile": "{{descriptor}} kişisine göndermek için dokun",
|
||||
"x-instructions-share-mode_mobile": "{{descriptor}} göndermek için dokunun",
|
||||
"activate-share-mode-base": "Göndermek için diğer cihazlarda PairDrop'u açın",
|
||||
"no-peers-subtitle": "Diğer ağlarda keşfedilebilir olmak için cihazları eşleştirin veya ortak bir odaya girin",
|
||||
"no-peers-subtitle": "Cihazları eşleştirin veya keşfedilebilir olmak için ortak bir odaya girin",
|
||||
"activate-share-mode-shared-text": "paylaşılan metin",
|
||||
"x-instructions_desktop": "Dosya göndermek için tıkla veya mesaj göndermek için sağ tıkla",
|
||||
"x-instructions_desktop": "Dosya göndermek için tıklayın veya mesaj göndermek için sağ tıklayın",
|
||||
"no-peers-title": "Dosya göndermek için diğer cihazlarda PairDrop'u açın",
|
||||
"x-instructions_data-drop-peer": "Göndermek için serbest bırak",
|
||||
"x-instructions_data-drop-peer": "Eşleştiriciye göndermek için bırakın",
|
||||
"x-instructions_data-drop-bg": "Alıcıyı seçmek için bırakın",
|
||||
"webrtc-requirement": "Bu PairDrop örneğini kullanmak için WebRTC etkinleştirilmelidir!",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} adet paylaşılan dosya",
|
||||
"webrtc-requirement": "Bu PairDrop örneğini kullanmak için WebRTC etkin olmalı!",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} paylaşılan dosya",
|
||||
"activate-share-mode-shared-file": "paylaşılan dosya",
|
||||
"activate-share-mode-and-other-file": "ve 1 dosya"
|
||||
"activate-share-mode-and-other-file": "ve 1 diğer dosya"
|
||||
},
|
||||
"footer": {
|
||||
"display-name_data-placeholder": "Yükleniyor…",
|
||||
"display-name_title": "Cihazının adını kalıcı olarak düzenle",
|
||||
"display-name_title": "Cihaz adınızı kalıcı olarak düzenleyin",
|
||||
"webrtc": "WebRTC mevcut değilse.",
|
||||
"public-room-devices_title": "Genel odada ağdan bağımsız olarak cihazlar tarafından keşfedilebilirsiniz.",
|
||||
"public-room-devices_title": "Ağdan bağımsız olarak bu ortak odadaki cihazlar tarafından keşfedilebilir olabilirsiniz.",
|
||||
"traffic": "Trafik",
|
||||
"paired-devices_title": "Eşleştirilmiş cihazlarda ağdan bağımsız olarak her zaman keşfedilebilirsiniz.",
|
||||
"public-room-devices": "{{roomId}} odası",
|
||||
"paired-devices_title": "Ağdan bağımsız olarak her zaman eşleştirilmiş cihazlar tarafından keşfedilebilir olabilirsiniz.",
|
||||
"public-room-devices": "{{roomId}} odasında",
|
||||
"paired-devices": "eşleştirilmiş cihazlar tarafından",
|
||||
"on-this-network": "bu ağ üzerinde",
|
||||
"routed": "sunucu üzerinden yönlendirilir",
|
||||
"discovery": "Keşfedilebilirsin:",
|
||||
"on-this-network_title": "Bu ağdaki herkes tarafından keşfedilebilirsiniz.",
|
||||
"known-as": "Bilinen adın:"
|
||||
"on-this-network": "bu ağda",
|
||||
"routed": "sunucu üzerinden yönlendirilmiş",
|
||||
"discovery": "Keşfedilebilir durumdasınız:",
|
||||
"on-this-network_title": "Bu ağdaki herkes tarafından keşfedilebilir olabilirsiniz.",
|
||||
"known-as": "Şu adla biliniyorsunuz:"
|
||||
},
|
||||
"dialogs": {
|
||||
"cancel": "İptal",
|
||||
"edit-paired-devices-title": "Eşleştirilmiş Cihazları Düzenle",
|
||||
"base64-paste-to-send": "{{type}} paylaşmak için buraya yapıştır",
|
||||
"auto-accept-instructions-2": "böylelikle cihazdan gönderilen tüm dosyaları otomatik olarak kabul eder.",
|
||||
"edit-paired-devices-title": "Eşleşmiş Cihazları Düzenle",
|
||||
"base64-paste-to-send": "{{type}} paylaşmak için buraya yapıştırın",
|
||||
"auto-accept-instructions-2": "bu cihazdan gönderilen tüm dosyaları otomatik olarak kabul etmek için.",
|
||||
"receive-text-title": "Mesaj Alındı",
|
||||
"auto-accept-instructions-1": "Etkinleştir",
|
||||
"pair-devices-title": "Cihazları Kalıcı Eşleştir",
|
||||
"auto-accept-instructions-1": "Aktive et",
|
||||
"pair-devices-title": "Cihazları Kalıcı Olarak Eşleştir",
|
||||
"download": "İndir",
|
||||
"title-file": "Dosya",
|
||||
"base64-processing": "İşleniyor…",
|
||||
"decline": "Reddet",
|
||||
"receive-title": "{{descriptor}} Alındı",
|
||||
"leave": "Ayrıl",
|
||||
"message_title": "Göndermek için mesaj girin",
|
||||
"message_title": "Göndermek için mesaj ekle",
|
||||
"join": "Katıl",
|
||||
"title-image-plural": "Resimler",
|
||||
"send": "Gönder",
|
||||
"base64-tap-to-paste": "{{type}} paylaşmak için buraya dokun",
|
||||
"base64-tap-to-paste": "{{type}} paylaşmak için buraya dokunun",
|
||||
"base64-text": "metin",
|
||||
"copy": "Kopyala",
|
||||
"file-other-description-image": "ve 1 diğer resim",
|
||||
"pair-devices-qr-code_title": "Bu cihazı eşleştirmek üzere bağlantıyı kopyalamak için tıklayın",
|
||||
"temporary-public-room-title": "Geçici Genel Oda",
|
||||
"pair-devices-qr-code_title": "Bu cihazı eşleştirmek için bağlantıyı kopyalamak için tıklayın",
|
||||
"temporary-public-room-title": "Geçici Ortak Oda",
|
||||
"base64-files": "dosyalar",
|
||||
"has-sent": "gönderdi:",
|
||||
"file-other-description-file": "ve 1 diğer dosya",
|
||||
"public-room-qr-code_title": "Genel odanın bağlantı linkini kopyalamak için tıkla",
|
||||
"public-room-qr-code_title": "Ortak oda bağlantısını kopyalamak için tıklayın",
|
||||
"close": "Kapat",
|
||||
"system-language": "Sistem Dili",
|
||||
"unpair": "Eşlemeyi Kaldır",
|
||||
"unpair": "Eşleşmeyi Kaldır",
|
||||
"title-image": "Resim",
|
||||
"file-other-description-file-plural": "ve {{count}} diğer dosya",
|
||||
"would-like-to-share": "paylaşmak istiyor",
|
||||
"send-message-to": "Kime:",
|
||||
"language-selector-title": "Dili Seç",
|
||||
"pair": "Eşle",
|
||||
"send-message-to": "Alıcı:",
|
||||
"language-selector-title": "Dili Ayarla",
|
||||
"pair": "Eşleştir",
|
||||
"hr-or": "VEYA",
|
||||
"scan-qr-code": "veya QR kodunu tarayın.",
|
||||
"input-key-on-this-device": "Bu anahtarı başka bir cihazda girin",
|
||||
"input-key-on-this-device": "Bu anahtarı başka bir cihaza girin",
|
||||
"download-again": "Tekrar indir",
|
||||
"accept": "Kabul Et",
|
||||
"paired-devices-wrapper_data-empty": "Eşlenmiş cihaz yok.",
|
||||
"enter-key-from-another-device": "Buraya başka bir cihazdan anahtar girin.",
|
||||
"paired-devices-wrapper_data-empty": "Eşleşmiş cihaz yok.",
|
||||
"enter-key-from-another-device": "Başka bir cihazdan alınan anahtarı buraya girin.",
|
||||
"share": "Paylaş",
|
||||
"auto-accept": "otomatik-kabul",
|
||||
"auto-accept": "otomatik kabul",
|
||||
"title-file-plural": "Dosyalar",
|
||||
"send-message-title": "Mesaj Gönder",
|
||||
"input-room-id-on-another-device": "Bu ID'yi diğer cihaza girin",
|
||||
"input-room-id-on-another-device": "Bu oda kimliğini başka bir cihaza girin",
|
||||
"file-other-description-image-plural": "ve {{count}} diğer resim",
|
||||
"enter-room-id-from-another-device": "Odaya katılmak için diğer cihazın ID'sini girin.",
|
||||
"enter-room-id-from-another-device": "Odaya katılmak için başka bir cihazdan oda kimliğini girin.",
|
||||
"message_placeholder": "Metin",
|
||||
"close-toast_title": "Bildirimleri kapat",
|
||||
"share-text-checkbox": "Metin paylaşırken her zaman bu pencereyi göster",
|
||||
"close-toast_title": "Bildirim kapat",
|
||||
"share-text-checkbox": "Metin paylaşırken her zaman bu iletişim kutusunu göster",
|
||||
"base64-title-files": "Dosyaları Paylaş",
|
||||
"approve": "onayla",
|
||||
"paired-device-removed": "Eşleştirilmiş cihaz kaldırıldı.",
|
||||
"share-text-title": "Kısa Mesaj Paylaş",
|
||||
"share-text-subtitle": "Göndermeden önce mesajı düzenle:",
|
||||
"base64-title-text": "Metin Paylaş"
|
||||
"paired-device-removed": "Eşleşmiş cihaz kaldırıldı.",
|
||||
"share-text-title": "Metin Mesajı Paylaş",
|
||||
"share-text-subtitle": "Göndermeden önce mesajı düzenleyin:",
|
||||
"base64-title-text": "Metni Paylaş"
|
||||
},
|
||||
"notifications": {
|
||||
"request-title": "{{name}} {{count}} {{descriptor}} transfer etmek istiyor",
|
||||
"unfinished-transfers-warning": "Bitmemiş transferler var. PairDrop'u kapatmak istediğinize emin misiniz?",
|
||||
"message-received": "Mesaj {{name}} tarafından alındı - Kopyalamak için tıkla",
|
||||
"notifications-permissions-error": "Kullanıcı izin isteğini birkaç kez reddettiği için bildirimler engellenmiştir. URL çubuğunun yanındaki kilit simgesine tıklayarak sıfırlanabilir.",
|
||||
"rate-limit-join-key": "İstek sınırına ulaşıldı. 10 saniye bekleyin ve tekrar deneyin.",
|
||||
"pair-url-copied-to-clipboard": "Bu cihazı eşleştirmek için bağlantı linki panoya kopyalandı",
|
||||
"connecting": "Bağlanılıyor…",
|
||||
"pairing-key-invalidated": "{{key}} anahtarı geçersiz",
|
||||
"unfinished-transfers-warning": "Tamamlanmamış transferler var. PairDrop'u kapatmak istediğinizden emin misiniz?",
|
||||
"message-received": "{{name}} tarafından mesaj alındı - Kopyalamak için tıklayın",
|
||||
"notifications-permissions-error": "Bildirim izinleri birkaç kez reddedildiği için engellendi. Bu, URL çubuğunun yanındaki kilit simgesine tıklayarak erişilebilen Sayfa Bilgilerinde sıfırlanabilir.",
|
||||
"rate-limit-join-key": "Hız sınırına ulaşıldı. 10 saniye bekleyin ve tekrar deneyin.",
|
||||
"pair-url-copied-to-clipboard": "Bu cihazı eşleştirmek için bağlantı panoya kopyalandı",
|
||||
"connecting": "Bağlanıyor…",
|
||||
"pairing-key-invalidated": "Anahtar {{key}} geçersiz kılındı",
|
||||
"pairing-key-invalid": "Geçersiz anahtar",
|
||||
"connected": "Bağlandı",
|
||||
"pairing-not-persistent": "Eşleştirilmiş cihazlar kalıcı değildir",
|
||||
"text-content-incorrect": "Metin içeriği yanlış",
|
||||
"connected": "Bağlı",
|
||||
"pairing-not-persistent": "Eşleşmiş cihazlar kalıcı değil",
|
||||
"text-content-incorrect": "Metin içeriği hatalı",
|
||||
"message-transfer-completed": "Mesaj transferi tamamlandı",
|
||||
"file-transfer-completed": "Dosya transferi bitti",
|
||||
"file-content-incorrect": "Dosya içeriği yanlış",
|
||||
"files-incorrect": "Dosyalar yanlış",
|
||||
"selected-peer-left": "Seçili aygıt ayrıldı",
|
||||
"link-received": "Link {{name}} tarafından alındı - Açmak için tıkla",
|
||||
"online": "Tekrar çevrimiçisin",
|
||||
"public-room-left": "{{publicRoomId}} genel odasından ayrıldın",
|
||||
"file-transfer-completed": "Dosya transferi tamamlandı",
|
||||
"file-content-incorrect": "Dosya içeriği hatalı",
|
||||
"files-incorrect": "Dosyalar hatalı",
|
||||
"selected-peer-left": "Seçilen eş ayrıldı",
|
||||
"link-received": "{{name}} tarafından bağlantı alındı - Açmak için tıklayın",
|
||||
"online": "Tekrar çevrimiçisiniz",
|
||||
"public-room-left": "Ortak odadan ayrıldı {{publicRoomId}}",
|
||||
"copied-text": "Metin panoya kopyalandı",
|
||||
"display-name-random-again": "Mevcut adın tekrardan rastgele oluşturuldu",
|
||||
"display-name-changed-permanently": "Mevcut adın kalıcı olarak değiştirildi",
|
||||
"copied-to-clipboard-error": "Kopyalama mümkün değil. Manuel olarak kopyalayın.",
|
||||
"display-name-random-again": "Görünen ad tekrar rastgele oluşturuldu",
|
||||
"display-name-changed-permanently": "Görünen ad kalıcı olarak değiştirildi",
|
||||
"copied-to-clipboard-error": "Kopyalama mümkün değil. Elle kopyalayın.",
|
||||
"pairing-success": "Cihazlar eşleştirildi",
|
||||
"clipboard-content-incorrect": "Pano içeriği yanlış",
|
||||
"display-name-changed-temporarily": "Mevcut adın yalnızca bu oturum için değiştirildi",
|
||||
"clipboard-content-incorrect": "Panodaki içerik hatalı",
|
||||
"display-name-changed-temporarily": "Görünen ad sadece bu oturum için değiştirildi",
|
||||
"copied-to-clipboard": "Panoya kopyalandı",
|
||||
"offline": "Çevrimdışısın",
|
||||
"pairing-tabs-error": "İki web tarayıcı sekmesini eşleştirmek mümkün değildir",
|
||||
"public-room-id-invalid": "Geçersiz oda ID'si",
|
||||
"click-to-download": "İndirmek için tıkla",
|
||||
"pairing-cleared": "Tüm cihazlar eşleştirmeden çıkarıldı",
|
||||
"offline": "Çevrimdışısınız",
|
||||
"pairing-tabs-error": "İki web tarayıcı sekmesini eşleştirmek imkansız",
|
||||
"public-room-id-invalid": "Geçersiz oda kimliği",
|
||||
"click-to-download": "İndirmek için tıklayın",
|
||||
"pairing-cleared": "Tüm cihazların eşleşmesi kaldırıldı",
|
||||
"notifications-enabled": "Bildirimler etkinleştirildi",
|
||||
"online-requirement-pairing": "Cihazları eşleştirmek için çevrimiçi olmanız lazım",
|
||||
"ios-memory-limit": "iOS'a tek seferde sadece 200MB'a kadar dosya gönderebilirsin",
|
||||
"online-requirement-public-room": "Genel oda oluşturmak için çevrimiçi olmanız lazım",
|
||||
"room-url-copied-to-clipboard": "Genel oda bağlantı linki panoya kopyalandı",
|
||||
"copied-text-error": "Panoya kopyalanamadı. Lütfen manuel olarak kopyalayın!",
|
||||
"online-requirement-pairing": "Cihazları eşleştirmek için çevrimiçi olmalısınız",
|
||||
"ios-memory-limit": "iOS'a dosya göndermek sadece bir seferde 200 MB'a kadar mümkündür",
|
||||
"online-requirement-public-room": "Ortak oda oluşturmak için çevrimiçi olmalısınız",
|
||||
"room-url-copied-to-clipboard": "Ortak oda bağlantısı panoya kopyalandı",
|
||||
"copied-text-error": "Panoya yazma başarısız oldu. Elle kopyalayın!",
|
||||
"download-successful": "{{descriptor}} indirildi",
|
||||
"click-to-show": "Görmek için tıkla"
|
||||
"click-to-show": "Göstermek için tıklayın"
|
||||
},
|
||||
"peer-ui": {
|
||||
"processing": "İşleniyor…",
|
||||
"click-to-send-share-mode": "{{descriptor}} göndermek için tıkla",
|
||||
"click-to-send": "Dosya göndermek için tıkla veya mesaj göndermek için sağ tıkla",
|
||||
"click-to-send-share-mode": "{{descriptor}} göndermek için tıklayın",
|
||||
"click-to-send": "Dosya göndermek için tıklayın veya mesaj göndermek için sağ tıklayın",
|
||||
"waiting": "Bekleniyor…",
|
||||
"connection-hash": "Uçtan uca şifrelemenin güvenliğini doğrulamak için her iki cihazda da bu güvenlik numarasını karşılaştırın",
|
||||
"connection-hash": "Uçtan uca şifrelemenin güvenliğini doğrulamak için, bu güvenlik numarasını her iki cihazda da karşılaştırın",
|
||||
"preparing": "Hazırlanıyor…",
|
||||
"transferring": "Transfer ediliyor…"
|
||||
},
|
||||
@@ -165,17 +165,17 @@
|
||||
"claim": "Cihazlar arasında dosya aktarmanın en kolay yolu",
|
||||
"tweet_title": "PairDrop hakkında tweet at",
|
||||
"close-about_aria-label": "PairDrop Hakkında'yı Kapat",
|
||||
"buy-me-a-coffee_title": "Bana bir kahve al!",
|
||||
"buy-me-a-coffee_title": "Bana bir kahve ısmarla!",
|
||||
"github_title": "GitHub'da PairDrop",
|
||||
"faq_title": "Sıkça sorulan sorular",
|
||||
"custom_title": "Bizi takip edin",
|
||||
"privacypolicy_title": "Gizlilik politikamızı açın",
|
||||
"mastodon_title": "Mastodon'da PairDrop hakkında yazın",
|
||||
"bluesky_title": "Bizi BlueSky'da takip edin"
|
||||
"privacypolicy_title": "Gizlilik politikamızı aç",
|
||||
"mastodon_title": "Mastodon'da PairDrop hakkında yaz",
|
||||
"bluesky_title": "BlueSky'da bizi takip edin"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-transfer-requested": "Dosya Transferi Talep Edildi",
|
||||
"image-transfer-requested": "Görüntü Aktarımı Talep Edildi",
|
||||
"image-transfer-requested": "Görüntü Transferi Talep Edildi",
|
||||
"message-received-plural": "{{count}} Mesaj Alındı",
|
||||
"message-received": "Mesaj Alındı",
|
||||
"file-received": "Dosya Alındı",
|
||||
|
||||
184
public/lang/uk.json
Normal file
184
public/lang/uk.json
Normal file
@@ -0,0 +1,184 @@
|
||||
{
|
||||
"header": {
|
||||
"about_aria-label": "Відкрити \"Про PairDrop\"",
|
||||
"theme-auto_title": "Автоматично адаптувати тему до системної",
|
||||
"theme-light_title": "Завжди використовувати світлу тему",
|
||||
"install_title": "Встановити PairDrop",
|
||||
"join-public-room_title": "Приєднатися до публічної кімнати тимчасово",
|
||||
"cancel-share-mode": "Скасувати",
|
||||
"edit-share-mode": "Редагувати",
|
||||
"about_title": "Про PairDrop",
|
||||
"language-selector_title": "Встановити мову",
|
||||
"theme-dark_title": "Завжди використовувати темну тему",
|
||||
"pair-device_title": "Зв'язати ваші пристрої назавжди",
|
||||
"notification_title": "Увімкнути сповіщення",
|
||||
"edit-paired-devices_title": "Редагувати зв'язані пристрої",
|
||||
"expand_title": "Розгорнути рядок кнопок заголовка"
|
||||
},
|
||||
"instructions": {
|
||||
"no-peers_data-drop-bg": "Відпустіть, щоб вибрати одержувача",
|
||||
"x-instructions_desktop": "Натисніть, щоб надіслати файли, або клацніть правою кнопкою миші, щоб надіслати повідомлення",
|
||||
"x-instructions_data-drop-peer": "Відпустіть, щоб надіслати партнеру",
|
||||
"x-instructions-share-mode_desktop": "Натисніть, щоб надіслати {{descriptor}}",
|
||||
"x-instructions-share-mode_mobile": "Торкніться, щоб надіслати {{descriptor}}",
|
||||
"activate-share-mode-and-other-file": "та 1 інший файл",
|
||||
"activate-share-mode-shared-file": "спільний файл",
|
||||
"webrtc-requirement": "Щоб використовувати цей екземпляр PairDrop, WebRTC має бути увімкнено!",
|
||||
"no-peers-title": "Відкрийте PairDrop на інших пристроях, щоб надіслати файли",
|
||||
"no-peers-subtitle": "Зв’яжіть пристрої або введіть публічну кімнату, щоб бути помітним в інших мережах",
|
||||
"x-instructions_mobile": "Торкніться, щоб надіслати файли, або довго натисніть, щоб надіслати повідомлення",
|
||||
"x-instructions_data-drop-bg": "Відпустіть, щоб вибрати одержувача",
|
||||
"activate-share-mode-base": "Відкрийте PairDrop на інших пристроях, щоб надіслати",
|
||||
"activate-share-mode-and-other-files-plural": "та {{count}} інших файлів",
|
||||
"activate-share-mode-shared-text": "спільний текст",
|
||||
"activate-share-mode-shared-files-plural": "{{count}} спільних файлів"
|
||||
},
|
||||
"footer": {
|
||||
"known-as": "Вам відомо як:",
|
||||
"discovery": "Вас можна знайти:",
|
||||
"public-room-devices": "у кімнаті {{roomId}}",
|
||||
"public-room-devices_title": "Вас можуть знайти пристрої в цій публічній кімнаті, незалежно від мережі.",
|
||||
"traffic": "Трафік",
|
||||
"webrtc": "якщо WebRTC недоступний.",
|
||||
"display-name_data-placeholder": "Завантаження…",
|
||||
"display-name_title": "Редагувати назву вашого пристрою назавжди",
|
||||
"on-this-network_title": "Вас можуть знайти всі на цій мережі.",
|
||||
"routed": "маршрутизований через сервер",
|
||||
"on-this-network": "в цій мережі",
|
||||
"paired-devices": "через зв'язані пристрої",
|
||||
"paired-devices_title": "Вас можуть знайти зв'язані пристрої в будь-який час, незалежно від мережі."
|
||||
},
|
||||
"dialogs": {
|
||||
"input-key-on-this-device": "Введіть цей ключ на іншому пристрої",
|
||||
"scan-qr-code": "або відскануйте QR-код.",
|
||||
"enter-key-from-another-device": "Введіть ключ з іншого пристрою тут.",
|
||||
"temporary-public-room-title": "Тимчасова публічна кімната",
|
||||
"input-room-id-on-another-device": "Введіть цей ID кімнати на іншому пристрої",
|
||||
"enter-room-id-from-another-device": "Введіть ID кімнати з іншого пристрою, щоб приєднатися до кімнати.",
|
||||
"hr-or": "АБО",
|
||||
"cancel": "Скасувати",
|
||||
"edit-paired-devices-title": "Редагувати Зв'язані пристрої",
|
||||
"unpair": "Від'єднати",
|
||||
"paired-device-removed": "Зв'язаний пристрій був видалений.",
|
||||
"paired-devices-wrapper_data-empty": "Немає зв'язаних пристроїв.",
|
||||
"auto-accept-instructions-1": "Активувати",
|
||||
"auto-accept": "автоматичне прийняття",
|
||||
"auto-accept-instructions-2": "щоб автоматично приймати всі файли, надіслані з цього пристрою.",
|
||||
"join": "Приєднатися",
|
||||
"leave": "Покинути",
|
||||
"accept": "Прийняти",
|
||||
"decline": "Відхилити",
|
||||
"has-sent": "відправив:",
|
||||
"share": "Поділитися",
|
||||
"download": "Завантажити",
|
||||
"send-message-title": "Надіслати повідомлення",
|
||||
"send-message-to": "Кому:",
|
||||
"message_title": "Введіть повідомлення для надсилання",
|
||||
"base64-title-text": "Поділитися текстом",
|
||||
"base64-processing": "Обробка…",
|
||||
"base64-text": "текст",
|
||||
"file-other-description-image": "та ще 1 зображення",
|
||||
"file-other-description-file": "та ще 1 файл",
|
||||
"file-other-description-image-plural": "та ще {{count}} зображень",
|
||||
"title-file": "Файл",
|
||||
"title-image-plural": "Зображення",
|
||||
"title-file-plural": "Файли",
|
||||
"receive-title": "{{descriptor}} отримано",
|
||||
"system-language": "Системна мова",
|
||||
"public-room-qr-code_title": "Натисніть, щоб скопіювати посилання на публічну кімнату",
|
||||
"share-text-title": "Поділитися текстовим повідомленням",
|
||||
"share-text-subtitle": "Редагувати повідомлення перед відправкою:",
|
||||
"share-text-checkbox": "Завжди показувати цей діалог при поділі тексту",
|
||||
"close-toast_title": "Закрити сповіщення",
|
||||
"pair-devices-title": "Зв’язати пристрої назавжди",
|
||||
"pair": "Приєднати",
|
||||
"close": "Закрити",
|
||||
"would-like-to-share": "хоче поділитися",
|
||||
"copy": "Копіювати",
|
||||
"message_placeholder": "Текст",
|
||||
"send": "Надіслати",
|
||||
"base64-title-files": "Поділитися файлами",
|
||||
"receive-text-title": "Повідомлення отримано",
|
||||
"base64-tap-to-paste": "Натисніть тут, щоб поділитися {{type}}",
|
||||
"base64-paste-to-send": "Вставте буфер обміну тут, щоб поділитися {{type}}",
|
||||
"file-other-description-file-plural": "та ще {{count}} файлів",
|
||||
"base64-files": "файли",
|
||||
"title-image": "Зображення",
|
||||
"language-selector-title": "Встановити мову",
|
||||
"approve": "схвалити",
|
||||
"download-again": "Завантажити знову",
|
||||
"pair-devices-qr-code_title": "Натисніть, щоб скопіювати посилання для зв'язування цього пристрою"
|
||||
},
|
||||
"about": {
|
||||
"close-about_aria-label": "Закрити \"Про PairDrop\"",
|
||||
"github_title": "PairDrop на GitHub",
|
||||
"buy-me-a-coffee_title": "Купи мені каву!",
|
||||
"tweet_title": "Твіт про PairDrop",
|
||||
"bluesky_title": "Підписуйтесь на нас у BlueSky",
|
||||
"privacypolicy_title": "Відкрити нашу політику конфіденційності",
|
||||
"faq_title": "Часто задавані питання",
|
||||
"mastodon_title": "Напишіть про PairDrop на Mastodon",
|
||||
"custom_title": "Підписуйтесь на нас",
|
||||
"claim": "Найпростіший спосіб передачі файлів між пристроями"
|
||||
},
|
||||
"notifications": {
|
||||
"display-name-changed-temporarily": "Відображуване ім'я було змінено тільки для цієї сесії",
|
||||
"display-name-random-again": "Відображуване ім'я згенерувалося випадковим чином знову",
|
||||
"download-successful": "{{descriptor}} завантажено",
|
||||
"pairing-tabs-error": "Зв'язування двох вкладок браузера неможливе",
|
||||
"pairing-success": "Пристрої зв'язані",
|
||||
"pairing-not-persistent": "Зв'язані пристрої не є постійними",
|
||||
"pairing-key-invalid": "Недійсний ключ",
|
||||
"pairing-key-invalidated": "Ключ {{key}} недійсний",
|
||||
"pairing-cleared": "Всі пристрої роз'єднані",
|
||||
"public-room-id-invalid": "Недійсний ID кімнати",
|
||||
"public-room-left": "Покинув публічну кімнату {{publicRoomId}}",
|
||||
"copied-to-clipboard-error": "Копіювання неможливе. Скопіюйте вручну.",
|
||||
"clipboard-content-incorrect": "Вміст буфера обміну неправильний",
|
||||
"link-received": "Посилання отримано від {{name}} - Натисніть, щоб відкрити",
|
||||
"message-received": "Повідомлення отримано від {{name}} - Натисніть, щоб скопіювати",
|
||||
"click-to-download": "Натисніть, щоб завантажити",
|
||||
"request-title": "{{name}} хоче передати {{count}} {{descriptor}}",
|
||||
"click-to-show": "Натисніть, щоб показати",
|
||||
"copied-text": "Текст скопійовано в буфер обміну",
|
||||
"copied-text-error": "Запис у буфер обміну не вдався. Скопіюйте вручну!",
|
||||
"offline": "Ви офлайн",
|
||||
"online-requirement-pairing": "Вам потрібно бути онлайн, щоб зв'язати пристрої",
|
||||
"online-requirement-public-room": "Вам потрібно бути онлайн, щоб створити публічну кімнату",
|
||||
"connecting": "Підключення…",
|
||||
"ios-memory-limit": "Відправка файлів на iOS можлива лише до 200 МБ за один раз",
|
||||
"message-transfer-completed": "Передача повідомлення завершена",
|
||||
"rate-limit-join-key": "Досягнуто ліміт швидкості. Зачекайте 10 секунд і спробуйте знову.",
|
||||
"selected-peer-left": "Обраний пір залишив",
|
||||
"files-incorrect": "Файли неправильні",
|
||||
"display-name-changed-permanently": "Відображуване ім'я було змінено назавжди",
|
||||
"notifications-permissions-error": "Дозвіл на сповіщення було заблоковано, оскільки користувач кілька разів відхилив запит на дозвіл. Це можна скинути в інформації про сторінку, до якої можна отримати доступ, натиснувши значок замка поруч з рядком URL.",
|
||||
"copied-to-clipboard": "Скопійовано в буфер обміну",
|
||||
"pair-url-copied-to-clipboard": "Посилання для зв'язування цього пристрою скопійовано в буфер обміну",
|
||||
"room-url-copied-to-clipboard": "Посилання на публічну кімнату скопійовано в буфер обміну",
|
||||
"text-content-incorrect": "Текстовий вміст неправильний",
|
||||
"file-content-incorrect": "Вміст файлу неправильний",
|
||||
"notifications-enabled": "Сповіщення увімкнені",
|
||||
"connected": "Підключено",
|
||||
"online": "Ви знову онлайн",
|
||||
"file-transfer-completed": "Передача файлу завершена",
|
||||
"unfinished-transfers-warning": "Є незавершені передачі. Ви впевнені, що хочете закрити PairDrop?"
|
||||
},
|
||||
"document-titles": {
|
||||
"file-received": "Файл отримано",
|
||||
"file-received-plural": "Отримано {{count}} файлів",
|
||||
"image-transfer-requested": "Запит на передачу зображення",
|
||||
"message-received": "Повідомлення отримано",
|
||||
"message-received-plural": "Отримано {{count}} повідомлень",
|
||||
"file-transfer-requested": "Запит на передачу файлу"
|
||||
},
|
||||
"peer-ui": {
|
||||
"click-to-send-share-mode": "Натисніть, щоб відправити {{descriptor}}",
|
||||
"connection-hash": "Щоб перевірити безпеку кінцевого шифрування, порівняйте цей номер безпеки на обох пристроях",
|
||||
"processing": "Обробка…",
|
||||
"click-to-send": "Натисніть, щоб відправити файли, або клацніть правою кнопкою миші, щоб відправити повідомлення",
|
||||
"preparing": "Підготовка…",
|
||||
"waiting": "Чекаю…",
|
||||
"transferring": "Переводимо…"
|
||||
}
|
||||
}
|
||||
1
public/scripts/heic2any.min.js
vendored
1
public/scripts/heic2any.min.js
vendored
File diff suppressed because one or more lines are too long
36
public/scripts/heif-convert.js
Normal file
36
public/scripts/heif-convert.js
Normal file
@@ -0,0 +1,36 @@
|
||||
function HeifConvert(libheif) {
|
||||
this.libheif = libheif;
|
||||
this.decoder = new libheif.HeifDecoder();
|
||||
}
|
||||
|
||||
|
||||
HeifConvert.prototype.convert = async function (buffer) {
|
||||
const decodeResult = this.decoder.decode(buffer);
|
||||
const image = decodeResult[0];
|
||||
|
||||
let w = image.get_width();
|
||||
let h = image.get_height();
|
||||
const canvas = document.createElement("canvas");
|
||||
canvas.width = w;
|
||||
canvas.height = h;
|
||||
|
||||
const ctx = canvas.getContext("2d");
|
||||
const imageData = ctx.createImageData(w, h);
|
||||
|
||||
await copyData(imageData, image);
|
||||
|
||||
ctx.putImageData(imageData, 0, 0);
|
||||
image.free();
|
||||
return canvas;
|
||||
};
|
||||
|
||||
function copyData(dataContainer, image) {
|
||||
return new Promise((resolve, reject) => {
|
||||
image.display(
|
||||
dataContainer,
|
||||
function () {
|
||||
resolve()
|
||||
}
|
||||
);
|
||||
})
|
||||
}
|
||||
41
public/scripts/libheif.js
Normal file
41
public/scripts/libheif.js
Normal file
File diff suppressed because one or more lines are too long
BIN
public/scripts/libheif.wasm
Normal file
BIN
public/scripts/libheif.wasm
Normal file
Binary file not shown.
@@ -3,8 +3,8 @@ class Localization {
|
||||
Localization.$htmlRoot = document.querySelector('html');
|
||||
|
||||
Localization.defaultLocale = "en";
|
||||
Localization.supportedLocales = ["ar", "ca", "de", "en", "es", "fr", "hu", "id", "it", "ja", "kn", "nb", "nl", "pl", "pt-BR", "ro", "ru", "tr", "zh-CN", "zh-TW"];
|
||||
Localization.supportedLocalesRtl = ["ar"];
|
||||
Localization.supportedLocales = ["ar", "be", "ca", "cs", "da", "de", "en", "es", "fr", "he", "hu", "id", "it", "ja", "kn", "nb", "nl", "pl", "pt-BR", "ro", "ru", "tr", "uk", "zh-CN", "zh-TW"];
|
||||
Localization.supportedLocalesRtl = ["ar", "he"];
|
||||
|
||||
Localization.translations = {};
|
||||
Localization.translationsDefaultLocale = {};
|
||||
|
||||
@@ -17,7 +17,8 @@ class PairDrop {
|
||||
"scripts/qr-code.min.js",
|
||||
"scripts/zip.min.js",
|
||||
"scripts/no-sleep.min.js",
|
||||
"scripts/heic2any.min.js"
|
||||
"scripts/heif-convert.js",
|
||||
"scripts/libheif.js"
|
||||
];
|
||||
|
||||
this.registerServiceWorker();
|
||||
|
||||
@@ -332,6 +332,8 @@ class Peer {
|
||||
this._filesQueue = [];
|
||||
this._busy = false;
|
||||
|
||||
this.maxMessageSize = 65536; // 64 KB
|
||||
|
||||
// evaluate auto accept
|
||||
this._evaluateAutoAccept();
|
||||
}
|
||||
@@ -450,14 +452,7 @@ class Peer {
|
||||
|
||||
Events.fire('set-progress', {peerId: this._peerId, progress: 0.8, status: 'prepare'})
|
||||
|
||||
let dataUrl = '';
|
||||
if (files[0].type.split('/')[0] === 'image') {
|
||||
try {
|
||||
dataUrl = await getThumbnailAsDataUrl(files[0], 400, null, 0.9);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
let dataUrl = await this.getFileTransferThumbnail(files[0]);
|
||||
|
||||
Events.fire('set-progress', {peerId: this._peerId, progress: 1, status: 'prepare'})
|
||||
|
||||
@@ -472,6 +467,30 @@ class Peer {
|
||||
Events.fire('set-progress', {peerId: this._peerId, progress: 0, status: 'wait'})
|
||||
}
|
||||
|
||||
async getFileTransferThumbnail(image) {
|
||||
if (image.type.split('/')[0] !== 'image') {
|
||||
// file is not of type image -> abort!
|
||||
return '';
|
||||
}
|
||||
|
||||
let dataUrl = '';
|
||||
try {
|
||||
// Iteratively lower thumbnail quality until its size is less than maxMessageSize - 2 kB
|
||||
let quality = 1;
|
||||
do {
|
||||
quality -= 0.1;
|
||||
if (quality <= 0) {
|
||||
console.error("Could not create thumbnail that fits into one message.");
|
||||
return '';
|
||||
}
|
||||
dataUrl = await getThumbnailAsDataUrl(image, 450, 450, quality);
|
||||
} while (new Blob([dataUrl]).size + 2_000 > this.maxMessageSize);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
return dataUrl;
|
||||
}
|
||||
|
||||
async sendFiles() {
|
||||
for (let i=0; i<this._filesRequested.length; i++) {
|
||||
this._filesQueue.push(this._filesRequested[i]);
|
||||
@@ -725,7 +744,8 @@ class RTCPeer extends Peer {
|
||||
super(serverConnection, isCaller, peerId, roomType, roomId);
|
||||
|
||||
this.rtcSupported = true;
|
||||
this.rtcConfig = rtcConfig
|
||||
this.rtcConfig = rtcConfig;
|
||||
this.maxMessageSize = 262144; // 256 KB
|
||||
|
||||
if (!this._isCaller) return; // we will listen for a caller
|
||||
this._connect();
|
||||
@@ -811,6 +831,13 @@ class RTCPeer extends Peer {
|
||||
Events.on('beforeunload', e => this._onBeforeUnload(e));
|
||||
Events.on('pagehide', _ => this._onPageHide());
|
||||
Events.fire('peer-connected', {peerId: this._peerId, connectionHash: this.getConnectionHash()});
|
||||
this._setMaxMessageSize();
|
||||
}
|
||||
|
||||
_setMaxMessageSize() {
|
||||
this.maxMessageSize = this._conn && this._conn.sctp
|
||||
? Math.min(this._conn.sctp.maxMessageSize, 1048576) // 1 MB max
|
||||
: 262144; // 256 KB
|
||||
}
|
||||
|
||||
_onMessage(message) {
|
||||
|
||||
@@ -201,15 +201,11 @@ class FooterUI {
|
||||
this.$discoveryWrapper = $$('footer .discovery-wrapper');
|
||||
|
||||
this.$displayName.addEventListener('keydown', e => this._onKeyDownDisplayName(e));
|
||||
this.$displayName.addEventListener('keyup', e => this._onKeyUpDisplayName(e));
|
||||
this.$displayName.addEventListener('blur', e => this._saveDisplayName(e.target.innerText));
|
||||
this.$displayName.addEventListener('focus', e => this._onFocusDisplayName(e));
|
||||
this.$displayName.addEventListener('blur', e => this._onBlurDisplayName(e));
|
||||
|
||||
Events.on('display-name', e => this._onDisplayName(e.detail.displayName));
|
||||
Events.on('self-display-name-changed', e => this._insertDisplayName(e.detail));
|
||||
|
||||
// Load saved display name on page load
|
||||
Events.on('ws-connected', _ => this._loadSavedDisplayName());
|
||||
|
||||
Events.on('evaluate-footer-badges', _ => this._evaluateFooterBadges());
|
||||
}
|
||||
|
||||
@@ -234,17 +230,20 @@ class FooterUI {
|
||||
}
|
||||
|
||||
async _loadSavedDisplayName() {
|
||||
const displayName = await this._getSavedDisplayName()
|
||||
const displayNameSaved = await this._getSavedDisplayName()
|
||||
|
||||
if (!displayName) return;
|
||||
if (!displayNameSaved) return;
|
||||
|
||||
console.log("Retrieved edited display name:", displayName)
|
||||
Events.fire('self-display-name-changed', displayName);
|
||||
console.log("Retrieved edited display name:", displayNameSaved)
|
||||
Events.fire('self-display-name-changed', displayNameSaved);
|
||||
}
|
||||
|
||||
_onDisplayName(displayName){
|
||||
// set display name
|
||||
this.$displayName.setAttribute('placeholder', displayName);
|
||||
async _onDisplayName(displayNameServer){
|
||||
// load saved displayname first to prevent flickering
|
||||
await this._loadSavedDisplayName();
|
||||
|
||||
// set original display name as placeholder
|
||||
this.$displayName.setAttribute('placeholder', displayNameServer);
|
||||
}
|
||||
|
||||
|
||||
@@ -259,9 +258,27 @@ class FooterUI {
|
||||
}
|
||||
}
|
||||
|
||||
_onKeyUpDisplayName(e) {
|
||||
_onFocusDisplayName(e) {
|
||||
if (!e.target.innerText) {
|
||||
// Fix z-position of cursor when div is completely empty (Firefox only)
|
||||
e.target.innerText = "\n";
|
||||
|
||||
// On Chromium based browsers the cursor position is lost when adding sth. to the focused node. This adds it back.
|
||||
let sel = window.getSelection();
|
||||
sel.collapse(e.target.lastChild);
|
||||
}
|
||||
}
|
||||
|
||||
async _onBlurDisplayName(e) {
|
||||
// fix for Firefox inserting a linebreak into div on edit which prevents the placeholder from showing automatically when it is empty
|
||||
if (/^(\n|\r|\r\n)$/.test(e.target.innerText)) e.target.innerText = '';
|
||||
if (/^(\n|\r|\r\n)$/.test(e.target.innerText)) {
|
||||
e.target.innerText = '';
|
||||
}
|
||||
|
||||
// Remove selection from text
|
||||
window.getSelection().removeAllRanges();
|
||||
|
||||
await this._saveDisplayName(e.target.innerText)
|
||||
}
|
||||
|
||||
async _saveDisplayName(newDisplayName) {
|
||||
|
||||
@@ -281,10 +281,8 @@ class PeersUI {
|
||||
|
||||
if (files[0].type.split('/')[0] === 'image') {
|
||||
try {
|
||||
let imageUrl = await getThumbnailAsDataUrl(files[0], 80, null, 0.9);
|
||||
|
||||
let imageUrl = await getThumbnailAsDataUrl(files[0], 80, 80, 0.9);
|
||||
this.$shareModeImageThumb.style.backgroundImage = `url(${imageUrl})`;
|
||||
|
||||
this.$shareModeImageThumb.removeAttribute('hidden');
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
|
||||
@@ -478,12 +478,7 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual
|
||||
try {
|
||||
if (file.type === "image/heif" || file.type === "image/heic") {
|
||||
// browsers can't show heic files --> convert to jpeg before creating thumbnail
|
||||
let blob = await fileToBlob(file);
|
||||
file = await heic2any({
|
||||
blob,
|
||||
toType: "image/jpeg",
|
||||
quality: quality
|
||||
});
|
||||
file = await heicToJpeg(file, 0.5);
|
||||
}
|
||||
|
||||
let imageUrl = URL.createObjectURL(file);
|
||||
@@ -493,26 +488,40 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual
|
||||
|
||||
await waitUntilImageIsLoaded(imageUrl);
|
||||
|
||||
let imageWidth = image.width;
|
||||
let imageHeight = image.height;
|
||||
let canvas = document.createElement('canvas');
|
||||
let heightForSpecifiedWidth;
|
||||
let widthForSpecifiedHeight;
|
||||
|
||||
// resize the canvas and draw the image data into it
|
||||
if (width) {
|
||||
heightForSpecifiedWidth = Math.floor(image.height * width / image.width);
|
||||
}
|
||||
if (height) {
|
||||
widthForSpecifiedHeight = Math.floor(image.width * height / image.height);
|
||||
}
|
||||
|
||||
// resize the canvas and draw the image on it
|
||||
if (width && height) {
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
// mode "contain": preserve aspect ratio and use arguments as boundaries
|
||||
if (height > heightForSpecifiedWidth) {
|
||||
canvas.width = width;
|
||||
canvas.height = heightForSpecifiedWidth;
|
||||
}
|
||||
else {
|
||||
canvas.width = widthForSpecifiedHeight;
|
||||
canvas.height = height;
|
||||
}
|
||||
}
|
||||
else if (width) {
|
||||
canvas.width = width;
|
||||
canvas.height = Math.floor(imageHeight * width / imageWidth)
|
||||
canvas.height = heightForSpecifiedWidth;
|
||||
}
|
||||
else if (height) {
|
||||
canvas.width = Math.floor(imageWidth * height / imageHeight);
|
||||
canvas.width = widthForSpecifiedHeight;
|
||||
canvas.height = height;
|
||||
}
|
||||
else {
|
||||
canvas.width = imageWidth;
|
||||
canvas.height = imageHeight
|
||||
canvas.width = image.width;
|
||||
canvas.height = image.height
|
||||
}
|
||||
|
||||
let ctx = canvas.getContext("2d");
|
||||
@@ -527,6 +536,32 @@ function getThumbnailAsDataUrl(file, width = undefined, height = undefined, qual
|
||||
})
|
||||
}
|
||||
|
||||
function initHeicConverter() {
|
||||
return new Promise((resolve, reject) => {
|
||||
fetch("libheif.wasm")
|
||||
.then((res) => res.arrayBuffer())
|
||||
.then(async (wasmBinary) => {
|
||||
resolve(new HeifConvert(libheif({ wasmBinary: wasmBinary })));
|
||||
})
|
||||
.catch(reject);
|
||||
});
|
||||
}
|
||||
|
||||
async function heicToJpeg(file, quality) {
|
||||
const heicConverter = await initHeicConverter();
|
||||
console.log("Using libheif", heicConverter.libheif.heif_get_version());
|
||||
|
||||
const buffer = await file.arrayBuffer();
|
||||
const canvas = await heicConverter.convert(buffer);
|
||||
|
||||
return new Promise(resolve => {
|
||||
canvas.toBlob(blob => resolve(blob),
|
||||
'image/jpeg',
|
||||
quality
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// Resolves returned promise when image is loaded and throws error if image cannot be shown
|
||||
function waitUntilImageIsLoaded(imageUrl, timeout = 10000) {
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const cacheVersion = 'v1.10.8';
|
||||
const cacheVersion = 'v1.10.10';
|
||||
const cacheTitle = `pairdrop-cache-${cacheVersion}`;
|
||||
const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions
|
||||
const relativePathsToCache = [
|
||||
@@ -7,6 +7,9 @@ const relativePathsToCache = [
|
||||
'manifest.json',
|
||||
'styles/styles-main.css',
|
||||
'styles/styles-deferred.css',
|
||||
'scripts/heif-convert.js',
|
||||
'scripts/libheif.js',
|
||||
'scripts/libheif.wasm',
|
||||
'scripts/localization.js',
|
||||
'scripts/main.js',
|
||||
'scripts/network.js',
|
||||
@@ -27,11 +30,15 @@ const relativePathsToCache = [
|
||||
'images/android-chrome-512x512-maskable.png',
|
||||
'images/apple-touch-icon.png',
|
||||
'lang/ar.json',
|
||||
'lang/be.json',
|
||||
'lang/ca.json',
|
||||
'lang/cs.json',
|
||||
'lang/da.json',
|
||||
'lang/de.json',
|
||||
'lang/en.json',
|
||||
'lang/es.json',
|
||||
'lang/fr.json',
|
||||
'lang/he.json',
|
||||
'lang/hu.json',
|
||||
'lang/id.json',
|
||||
'lang/it.json',
|
||||
@@ -44,6 +51,7 @@ const relativePathsToCache = [
|
||||
'lang/ro.json',
|
||||
'lang/ru.json',
|
||||
'lang/tr.json',
|
||||
'lang/uk.json',
|
||||
'lang/zh-CN.json',
|
||||
'lang/zh-TW.json'
|
||||
];
|
||||
|
||||
@@ -557,6 +557,10 @@ footer .logo {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#display-name:focus::before {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html:not([dir="rtl"]) #display-name,
|
||||
html:not([dir="rtl"]) .edit-pen {
|
||||
margin-left: -1rem;
|
||||
@@ -939,8 +943,8 @@ body {
|
||||
--lt-dialog-bg-color: #fff;
|
||||
--lt-bg-color: 255,255,255;
|
||||
--lt-bg-color-secondary: #f2f2f2;
|
||||
--lt-border-color: #a9a9a9;
|
||||
--lt-badge-color: #a5a5a5;
|
||||
--lt-border-color: #757575;
|
||||
--lt-badge-color: #757575;
|
||||
--lt-lang-hr-color: #DDD;
|
||||
|
||||
--lt-shadow-color-secondary-rgb: 0,0,0;
|
||||
@@ -953,8 +957,8 @@ body {
|
||||
--dt-dialog-bg-color: #141414;
|
||||
--dt-bg-color: 0,0,0;
|
||||
--dt-bg-color-secondary: #262628;
|
||||
--dt-border-color: #919191;
|
||||
--dt-badge-color: #717171;
|
||||
--dt-border-color: #757575;
|
||||
--dt-badge-color: #757575;
|
||||
--dt-lang-hr-color: #404040;
|
||||
|
||||
--dt-shadow-color-secondary-rgb: 255,255,255;
|
||||
|
||||
@@ -44,15 +44,18 @@ export default class Peer {
|
||||
_setIP(request) {
|
||||
if (request.headers['cf-connecting-ip']) {
|
||||
this.ip = request.headers['cf-connecting-ip'].split(/\s*,\s*/)[0];
|
||||
} else if (request.headers['x-forwarded-for']) {
|
||||
}
|
||||
else if (request.headers['x-forwarded-for']) {
|
||||
this.ip = request.headers['x-forwarded-for'].split(/\s*,\s*/)[0];
|
||||
} else {
|
||||
this.ip = request.connection.remoteAddress;
|
||||
}
|
||||
else {
|
||||
this.ip = request.socket.remoteAddress ?? '';
|
||||
}
|
||||
|
||||
// remove the prefix used for IPv4-translated addresses
|
||||
if (this.ip.substring(0,7) === "::ffff:")
|
||||
if (this.ip.substring(0,7) === "::ffff:") {
|
||||
this.ip = this.ip.substring(7);
|
||||
}
|
||||
|
||||
let ipv6_was_localized = false;
|
||||
if (this.conf.ipv6Localize && this.ip.includes(':')) {
|
||||
|
||||
Reference in New Issue
Block a user