Compare commits
413 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
967100bf50 | ||
|
|
3e52c6f69f | ||
|
|
81be38fbc8 | ||
|
|
566de14016 | ||
|
|
9a285df790 | ||
|
|
02dda0f97e | ||
|
|
6edd4b7f5c | ||
|
|
40d6d1d4e6 | ||
|
|
1c7baed241 | ||
|
|
257924431d | ||
|
|
4a590753c9 | ||
|
|
460e5c6bbf | ||
|
|
51cc366cfa | ||
|
|
78b7bea284 | ||
|
|
65d4f9219b | ||
|
|
6d20f09d0a | ||
|
|
dc83ec1123 | ||
|
|
dff443287c | ||
|
|
8e8b5cefe5 | ||
|
|
616831ebfb | ||
|
|
d8a8087c2c | ||
|
|
85a9ef9539 | ||
|
|
aeacf7f0e7 | ||
|
|
0cd6882e0d | ||
|
|
41f68e2735 | ||
|
|
d42fa37962 | ||
|
|
c327507989 | ||
|
|
2f02fff999 | ||
|
|
b3a97cec2e | ||
|
|
a17744a075 | ||
|
|
8f023e36cf | ||
|
|
da1b0689a5 | ||
|
|
3adea6d815 | ||
|
|
8d1baca60e | ||
|
|
87be7aa64f | ||
|
|
9e91e7349a | ||
|
|
f4b538b8dc | ||
|
|
63d0c2e679 | ||
|
|
52fd555ffc | ||
|
|
3517ad0826 | ||
|
|
4796fbeaa9 | ||
|
|
42ef0facc9 | ||
|
|
a5b5628d88 | ||
|
|
1bf8dd93fd | ||
|
|
ae83e47813 | ||
|
|
83f9853112 | ||
|
|
16bba3ff86 | ||
|
|
a42a54670b | ||
|
|
0586c00aed | ||
|
|
197cd18838 | ||
|
|
f97de2cd31 | ||
|
|
8164f3585e | ||
|
|
f829e90408 | ||
|
|
5e73841952 | ||
|
|
e31f6faa9f | ||
|
|
03e4d7e687 | ||
|
|
a9fdd5b1a5 | ||
|
|
d7be980147 | ||
|
|
abf2a0a9f8 | ||
|
|
c7b3ee6098 | ||
|
|
aded224632 | ||
|
|
2a43477cd4 | ||
|
|
6be94156db | ||
|
|
8cb40effa5 | ||
|
|
4cd4b2a060 | ||
|
|
27fa13caed | ||
|
|
3ee72ca065 | ||
|
|
114a99a358 | ||
|
|
0c59b2330c | ||
|
|
f9410d5698 | ||
|
|
4e9b6e25ca | ||
|
|
82bc6cad74 | ||
|
|
139007bece | ||
|
|
0afd70db8c | ||
|
|
934b98cafd | ||
|
|
7bb85bc5aa | ||
|
|
a1973d8b96 | ||
|
|
84b01ba58b | ||
|
|
188429e03d | ||
|
|
d3003228e7 | ||
|
|
50c7c3bef9 | ||
|
|
07b9545b03 | ||
|
|
0f031e2d8b | ||
|
|
083df44395 | ||
|
|
a932af87b5 | ||
|
|
8d8c2efa23 | ||
|
|
318e1a49bf | ||
|
|
c9e914faba | ||
|
|
7a53ed96ed | ||
|
|
8eae1f282b | ||
|
|
fae6561393 | ||
|
|
6b291ae012 | ||
|
|
303b34a70b | ||
|
|
d7b856f8ca | ||
|
|
6111e71506 | ||
|
|
5b0de9f9b5 | ||
|
|
8cc50e2ecb | ||
|
|
f6f6b4a4e2 | ||
|
|
2de6037a83 | ||
|
|
9d3f6680cb | ||
|
|
462002d84b | ||
|
|
bb6c747297 | ||
|
|
e09385be05 | ||
|
|
11bbf34feb | ||
|
|
8214409ac5 | ||
|
|
098ece066f | ||
|
|
e0e7853882 | ||
|
|
40d8c441db | ||
|
|
bacafb02be | ||
|
|
68ed9a6953 | ||
|
|
cd8b09f900 | ||
|
|
305cbb8a41 | ||
|
|
d5b2b4c4f1 | ||
|
|
f2b4e3f661 | ||
|
|
0d45799202 | ||
|
|
ba66e0a72a | ||
|
|
b5244c75ca | ||
|
|
1f85096422 | ||
|
|
3ecf0e7d29 | ||
|
|
046d4ce142 | ||
|
|
4c2ae4fd6b | ||
|
|
dd62a137d2 | ||
|
|
ea63c4a0bf | ||
|
|
47ee702fcb | ||
|
|
d0c6a18363 | ||
|
|
91dec114a6 | ||
|
|
702a0a7eae | ||
|
|
19eec66ece | ||
|
|
f63496e46c | ||
|
|
e2671e6634 | ||
|
|
d441bb3125 | ||
|
|
13efe45f88 | ||
|
|
137acb54a9 | ||
|
|
d72ba8af03 | ||
|
|
5b178b93f1 | ||
|
|
2f5a1dda5b | ||
|
|
62b1d86f7c | ||
|
|
2e9de12f7a | ||
|
|
5e7c99e0fb | ||
|
|
68f40c773f | ||
|
|
300b0fce18 | ||
|
|
78c58bf4d3 | ||
|
|
e57dbdf95c | ||
|
|
91831ce1dd | ||
|
|
fef9473810 | ||
|
|
b19d71ebc0 | ||
|
|
a84ecf77a2 | ||
|
|
e9ad080e35 | ||
|
|
c024f039c1 | ||
|
|
e6fd97744a | ||
|
|
c880936ba4 | ||
|
|
7eba49027c | ||
|
|
7e0a8f76d5 | ||
|
|
322f8cc168 | ||
|
|
c7ef83b6a1 | ||
|
|
cc47067870 | ||
|
|
41662987a6 | ||
|
|
4557e2fb6f | ||
|
|
3690dbcb14 | ||
|
|
e36c698720 | ||
|
|
245a9a2ddd | ||
|
|
2d938514d3 | ||
|
|
640e3811b4 | ||
|
|
c0a1268df4 | ||
|
|
8d0aaadb7e | ||
|
|
339cddd67b | ||
|
|
dddb9e66b9 | ||
|
|
cd0477d747 | ||
|
|
020b037f69 | ||
|
|
ff5f0040e3 | ||
|
|
7d48c5e793 | ||
|
|
993fa1a3a4 | ||
|
|
9b88d3f5e4 | ||
|
|
cd4df5f6d8 | ||
|
|
7c461eab52 | ||
|
|
1b7e94c2d8 | ||
|
|
dcd3c0b3ff | ||
|
|
bfe16a5300 | ||
|
|
8a1f905831 | ||
|
|
e5b4165eff | ||
|
|
be596e91ef | ||
|
|
f20c995d1a | ||
|
|
5f97c130bd | ||
|
|
13bf765be0 | ||
|
|
443de49db8 | ||
|
|
3d82ce0909 | ||
|
|
b259cba882 | ||
|
|
a138586dd7 | ||
|
|
e427203a45 | ||
|
|
8882024e8f | ||
|
|
581ae224e7 | ||
|
|
dccf3329ca | ||
|
|
1450322585 | ||
|
|
5d1639851b | ||
|
|
77939cc280 | ||
|
|
7fd8fb4914 | ||
|
|
91ede1bdec | ||
|
|
29698a55c4 | ||
|
|
abfc07b1e3 | ||
|
|
a0401b24e8 | ||
|
|
dbf39efd35 | ||
|
|
fe7d71d165 | ||
|
|
977fe65dce | ||
|
|
4e79925c7b | ||
|
|
416e8d81f9 | ||
|
|
215f0f74ad | ||
|
|
93930b91a2 | ||
|
|
65c24990cd | ||
|
|
424eb2c37a | ||
|
|
d10cbcba3e | ||
|
|
553f0958ba | ||
|
|
ae2bae88cf | ||
|
|
313b145297 | ||
|
|
faf5fd17d3 | ||
|
|
dd0ab710de | ||
|
|
c2bcac76e9 | ||
|
|
bf7024c6d9 | ||
|
|
992cdcc70e | ||
|
|
10e446bb41 | ||
|
|
15ac0e1d49 | ||
|
|
4946e9c382 | ||
|
|
ece302342e | ||
|
|
721aa48d53 | ||
|
|
0761fcf902 | ||
|
|
33602f1432 | ||
|
|
74b305442c | ||
|
|
f30393cf33 | ||
|
|
e7688a62c6 | ||
|
|
109617d817 | ||
|
|
8f66db2295 | ||
|
|
57e0d17cbc | ||
|
|
93138773ca | ||
|
|
1bfa6321b1 | ||
|
|
10d489f766 | ||
|
|
4065bbcfd7 | ||
|
|
330da9b258 | ||
|
|
3febcfe1ea | ||
|
|
0cdae11456 | ||
|
|
5996bceef7 | ||
|
|
ba277b9382 | ||
|
|
5046b5022a | ||
|
|
74334433cd | ||
|
|
33bf82e963 | ||
|
|
c72896aeb7 | ||
|
|
b306ffec8d | ||
|
|
e1c21dd9b0 | ||
|
|
9f8cedc0db | ||
|
|
12c02ef6af | ||
|
|
5a564e2c37 | ||
|
|
4b8445191b | ||
|
|
12033edda5 | ||
|
|
8e6d8eaddd | ||
|
|
faaa8afe17 | ||
|
|
84e8abf2c5 | ||
|
|
5db8a20b9d | ||
|
|
117c6ea12d | ||
|
|
83880d97e6 | ||
|
|
c3be5228cb | ||
|
|
ade214c69c | ||
|
|
4cb040d70d | ||
|
|
73ccce627c | ||
|
|
4043d35c8b | ||
|
|
a576cc0198 | ||
|
|
fa1f0208a4 | ||
|
|
193d3b1aef | ||
|
|
3b28ce88bf | ||
|
|
c77983d902 | ||
|
|
6ef9f8fa43 | ||
|
|
1eabc1a11e | ||
|
|
9136694d29 | ||
|
|
ec7f058afc | ||
|
|
62989ee2c9 | ||
|
|
85068e97ae | ||
|
|
eb73dbfe78 | ||
|
|
dde2c4d5a9 | ||
|
|
20cf8d0a15 | ||
|
|
b2bd623a49 | ||
|
|
fc3001978c | ||
|
|
d6823f492d | ||
|
|
c3751c2efc | ||
|
|
70396e2f36 | ||
|
|
b557665d04 | ||
|
|
6393d70a33 | ||
|
|
834df8526f | ||
|
|
f5bd332ff8 | ||
|
|
0d5fb1740d | ||
|
|
5ed4db9689 | ||
|
|
31b810eb7d | ||
|
|
168a711c05 | ||
|
|
7243a10340 | ||
|
|
b18bcd3b6e | ||
|
|
09a6192bf5 | ||
|
|
9585850d6d | ||
|
|
14f3d837f9 | ||
|
|
d660eda64c | ||
|
|
2bbb0f14f3 | ||
|
|
b123b736e9 | ||
|
|
28e496fe05 | ||
|
|
8ebfaf9ad9 | ||
|
|
47fd387799 | ||
|
|
fbf906fe5b | ||
|
|
463393552b | ||
|
|
18a811aa31 | ||
|
|
cb0d69c5cd | ||
|
|
2c77d94af7 | ||
|
|
b9eb653f1f | ||
|
|
37bb6fd982 | ||
|
|
e5d1e8f028 | ||
|
|
99477774cf | ||
|
|
8d419072d7 | ||
|
|
a2fcce9e40 | ||
|
|
55d3d1a792 | ||
|
|
88dbda87dc | ||
|
|
76a6f02eb7 | ||
|
|
34f26fc017 | ||
|
|
4f36f2befa | ||
|
|
f816c0bc12 | ||
|
|
60bfd1b67c | ||
|
|
fc7c7e2c71 | ||
|
|
a9e0ab17e5 | ||
|
|
80cf343516 | ||
|
|
744dbb3a6f | ||
|
|
e4301963a2 | ||
|
|
48da85b12b | ||
|
|
e02bc54172 | ||
|
|
3bb6a6fa44 | ||
|
|
64e7182f30 | ||
|
|
8c1ba8b45a | ||
|
|
85a7be01cb | ||
|
|
262322b9e8 | ||
|
|
88904621b3 | ||
|
|
da8f7c7172 | ||
|
|
caf594877f | ||
|
|
ffc9386221 | ||
|
|
6670d9ad69 | ||
|
|
6d8db25d61 | ||
|
|
a38a27dc60 | ||
|
|
69055a504b | ||
|
|
902010704a | ||
|
|
1992626da8 | ||
|
|
3c8cdbc7df | ||
|
|
72b07b82c9 | ||
|
|
846f5c7254 | ||
|
|
b0e18b29ff | ||
|
|
bbc9cab661 | ||
|
|
6179e07dd8 | ||
|
|
1363f4d6a2 | ||
|
|
3e47556560 | ||
|
|
aa3a2f8c55 | ||
|
|
6e7283664c | ||
|
|
fc89da153d | ||
|
|
8c4cb90b3a | ||
|
|
3cdd207953 | ||
|
|
5b1e2f38f4 | ||
|
|
5822900508 | ||
|
|
e898f35c46 | ||
|
|
7ed30f497b | ||
|
|
e66bc966d2 | ||
|
|
acfcae5dec | ||
|
|
95a83922df | ||
|
|
f7329e3316 | ||
|
|
cde63595e8 | ||
|
|
ca6efdae55 | ||
|
|
b712a9d175 | ||
|
|
45eccc1cad | ||
|
|
4068291f7c | ||
|
|
e4a724422e | ||
|
|
4fa22a6262 | ||
|
|
1fae4cfd8d | ||
|
|
9a6dbee694 | ||
|
|
716555f76f | ||
|
|
cc35206ee4 | ||
|
|
359e77f451 | ||
|
|
b805c78a9a | ||
|
|
a4ee6ad5e5 | ||
|
|
22b1c3a286 | ||
|
|
cd6648be56 | ||
|
|
8d00372824 | ||
|
|
729f716e97 | ||
|
|
93d2e91afa | ||
|
|
26b228a976 | ||
|
|
9735aa62bd | ||
|
|
4122f4dc3e | ||
|
|
b88cf22d8a | ||
|
|
6970e9228a | ||
|
|
5ce0846580 | ||
|
|
61c49fb329 | ||
|
|
2127857790 | ||
|
|
ba348b6839 | ||
|
|
188521f985 | ||
|
|
e0847e08c3 | ||
|
|
d287f67ac0 | ||
|
|
8f327fa439 | ||
|
|
ab60262cc9 | ||
|
|
e5f2b386bb | ||
|
|
61f131af58 | ||
|
|
2cf2fcebc9 | ||
|
|
c2e8139c6e | ||
|
|
ef9b15c1d7 | ||
|
|
e9c49073a8 | ||
|
|
cec3d6b548 | ||
|
|
3f89c2bf0a | ||
|
|
b419a6025f | ||
|
|
b07671719c | ||
|
|
6379a360fe | ||
|
|
89bc51c821 | ||
|
|
5dd5743871 | ||
|
|
91cc82d570 | ||
|
|
fcdb905430 | ||
|
|
9032e42912 | ||
|
|
00462947e3 | ||
|
|
b411447ebb | ||
|
|
af0c497aab |
@@ -5,3 +5,4 @@ static
|
||||
test
|
||||
scripts
|
||||
docs
|
||||
firefox
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
public/bundle.js
|
||||
public/webcrypto-shim.js
|
||||
public
|
||||
test/frontend/bundle.js
|
||||
firefox
|
||||
|
||||
@@ -19,6 +19,7 @@ rules:
|
||||
security/detect-non-literal-fs-filename: off
|
||||
security/detect-object-injection: off
|
||||
|
||||
eol-last: [error, always]
|
||||
eqeqeq: error
|
||||
no-console: warn
|
||||
no-path-concat: error
|
||||
@@ -26,4 +27,4 @@ rules:
|
||||
no-var: error
|
||||
one-var: [error, never]
|
||||
prefer-const: error
|
||||
quotes: [error, single]
|
||||
quotes: [error, single, {avoidEscape: true}]
|
||||
|
||||
5
.gitignore
vendored
@@ -1,6 +1,9 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
public/bundle.js
|
||||
public/upload.js
|
||||
public/download.js
|
||||
public/version.json
|
||||
public/l20n.min.js
|
||||
static/*
|
||||
!static/info.txt
|
||||
test/frontend/bundle.js
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
extends: stylelint-config-standard
|
||||
|
||||
rules:
|
||||
color-hex-case: upper
|
||||
color-hex-case: lower
|
||||
declaration-colon-newline-after: null
|
||||
selector-list-comma-newline-after: null
|
||||
value-list-comma-newline-after: null
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
FROM node:8-alpine
|
||||
|
||||
RUN apk add --no-cache git
|
||||
RUN addgroup -S -g 10001 app && adduser -S -D -G app -u 10001 app
|
||||
COPY . /app
|
||||
RUN chown -R app /app
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
# Firefox Send
|
||||
|
||||
[](https://circleci.com/gh/mozilla/send)
|
||||
[](https://circleci.com/gh/mozilla/send)
|
||||
[](https://testpilot.firefox.com/experiments/send)
|
||||
|
||||
**Docs:** [Docker](docs/docker.md), [Metrics](docs/metrics.md)
|
||||
|
||||
## What it does
|
||||
|
||||
A P2P file sharing experiment which allows you to send encrypted files to other users.
|
||||
A file sharing experiment which allows you to send encrypted files to other users.
|
||||
|
||||
## Requirements
|
||||
|
||||
|
||||
12
circle.yml
@@ -4,12 +4,19 @@ machine:
|
||||
services:
|
||||
- docker
|
||||
- redis
|
||||
environment:
|
||||
PATH: "/home/ubuntu/send/firefox:$PATH"
|
||||
|
||||
dependencies:
|
||||
pre:
|
||||
- npm i -g get-firefox geckodriver nsp
|
||||
- get-firefox --platform linux --extract --target /home/ubuntu/send
|
||||
|
||||
deployment:
|
||||
latest:
|
||||
branch: master
|
||||
commands:
|
||||
- npm run predocker
|
||||
- npm run build
|
||||
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
|
||||
- docker build -t mozilla/send:latest .
|
||||
- docker push mozilla/send:latest
|
||||
@@ -17,7 +24,7 @@ deployment:
|
||||
tag: /.*/
|
||||
owner: mozilla
|
||||
commands:
|
||||
- npm run predocker
|
||||
- npm run build
|
||||
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
|
||||
- docker build -t mozilla/send:$CIRCLE_TAG .
|
||||
- docker push mozilla/send:$CIRCLE_TAG
|
||||
@@ -26,3 +33,4 @@ test:
|
||||
override:
|
||||
- npm run lint
|
||||
- npm test
|
||||
- nsp check
|
||||
|
||||
@@ -7,6 +7,6 @@ services:
|
||||
ports:
|
||||
- "1443:1443"
|
||||
environment:
|
||||
- P2P_REDIS_HOST=redis
|
||||
- REDIS_HOST=redis
|
||||
redis:
|
||||
image: redis:alpine
|
||||
|
||||
2
docs/CODEOWNERS
Normal file
@@ -0,0 +1,2 @@
|
||||
# flod as main contact for string changes
|
||||
public/locales/en-US/*.ftl @flodolo
|
||||
@@ -3,12 +3,22 @@
|
||||
| Name | Description
|
||||
|------------------|-------------|
|
||||
| `PORT` | Port the server will listen on (defaults to 1443).
|
||||
| `P2P_S3_BUCKET` | The S3 bucket name.
|
||||
| `P2P_REDIS_HOST` | Host name of the Redis server.
|
||||
| `S3_BUCKET` | The S3 bucket name.
|
||||
| `REDIS_HOST` | Host name of the Redis server.
|
||||
| `GOOGLE_ANALYTICS_ID` | Google Analytics ID
|
||||
| `SENTRY_CLIENT` | Sentry Client ID
|
||||
| `SENTRY_DSN` | Sentry DSN
|
||||
| `MAX_FILE_SIZE` | in bytes (defaults to 2147483648)
|
||||
| `NODE_ENV` | "production"
|
||||
|
||||
## Example:
|
||||
|
||||
```sh
|
||||
$ docker run --net=host -e 'NODE_ENV=production' -e 'P2P_S3_BUCKET=testpilot-p2p-dev' -e 'P2P_REDIS_HOST=dyf9s2r4vo3.bolxr4.0001.usw2.cache.amazonaws.com' mozilla/send:latest
|
||||
$ docker run --net=host -e 'NODE_ENV=production' \
|
||||
-e 'S3_BUCKET=testpilot-p2p-dev' \
|
||||
-e 'REDIS_HOST=dyf9s2r4vo3.bolxr4.0001.usw2.cache.amazonaws.com' \
|
||||
-e 'GOOGLE_ANALYTICS_ID=UA-35433268-78' \
|
||||
-e 'SENTRY_CLIENT=https://51e23d7263e348a7a3b90a5357c61cb2@sentry.prod.mozaws.net/168' \
|
||||
-e 'SENTRY_DSN=https://51e23d7263e348a7a3b90a5357c61cb2:65e23d7263e348a7a3b90a5357c61c44@sentry.prod.mozaws.net/168' \
|
||||
mozilla/send:latest
|
||||
```
|
||||
|
||||
32
docs/faq.md
Normal file
@@ -0,0 +1,32 @@
|
||||
## How big of a file can I transfer with Firefox Send?
|
||||
|
||||
There is a 2GB file size limit built in to Send, however, in practice you may
|
||||
be unable to send files that large. Send encrypts and decrypts the files in
|
||||
the browser which is great for security but will tax your system resources. In
|
||||
particular you can expect to see your memory usage go up by at least the size
|
||||
of the file when the transfer is processing. You can see [the results of some
|
||||
testing](https://github.com/mozilla/send/issues/170#issuecomment-314107793).
|
||||
For the most reliable operation on common computers, it’s probably best to stay
|
||||
under a few hundred megabytes.
|
||||
|
||||
## Why is my browser not supported?
|
||||
|
||||
We’re using the [Web Cryptography JavaScript API with the AES-GCM
|
||||
algorithm](https://www.w3.org/TR/WebCryptoAPI/#aes-gcm) for our encryption.
|
||||
Many browsers support this standard and should work fine, but some have not
|
||||
implemented it yet (mobile browsers lag behind on this, in
|
||||
particular).
|
||||
|
||||
## How long are files available for?
|
||||
|
||||
Files are available to be downloaded for 24 hours, after which they are removed
|
||||
from the server. They are also removed immediately after a download completes.
|
||||
|
||||
## Can a file be downloaded more than once?
|
||||
|
||||
Not currently, but we're considering multiple download support in a future
|
||||
release.
|
||||
|
||||
|
||||
*Disclaimer: Send is an experiment and under active development. The answers
|
||||
here may change as we get feedback from you and the project matures.*
|
||||
136
docs/metrics.md
Normal file
@@ -0,0 +1,136 @@
|
||||
# Send Metrics
|
||||
The metrics collection and analysis plan for Send, a forthcoming Test Pilot experiment.
|
||||
|
||||
## Analysis
|
||||
Data collected by Send will be used to answer the following high-level questions:
|
||||
|
||||
- Do users send files?
|
||||
- How often? How many?
|
||||
- What is the retention?
|
||||
- What is the distribution of senders?
|
||||
- How do recipients interact with promotional UI elements?
|
||||
- Are file recipients converted to file senders?
|
||||
- Are non-Firefox users converted to Firefox users?
|
||||
- Where does it go wrong?
|
||||
- How often are there errors in uploading or downloading files?
|
||||
- What types of errors to users commonly see?
|
||||
- At what point do errors affect retention?
|
||||
|
||||
## Collection
|
||||
Data will be collected with Google Analytics and follow [Test Pilot standards](https://github.com/mozilla/testpilot/blob/master/docs/experiments/ga.md) for reporting.
|
||||
|
||||
### Custom Metrics
|
||||
- `cm1` - the size of the file, in bytes.
|
||||
- `cm2` - the amount of time it took to complete the file transfer, in milliseconds. Only include if the file completed transferring (ref: `cd2`).
|
||||
- `cm3` - the rate of the file transfer, in bytes per second. This is computed by dividing `cm1` by `cm2`, not by monitoring transfer speeds. Only include if the file completed transferring (ref: `cd2`).
|
||||
- `cm4` - the amount of time until the file will expire, in milliseconds.
|
||||
- `cm5` - the number of files the user has ever uploaded.
|
||||
- `cm6` - the number of unexpired files the user has uploaded.
|
||||
- `cm7` - the number of files the user has ever downloaded.
|
||||
|
||||
### Custom Dimensions
|
||||
- `cd1` - the method by which the user initiated an upload. One of `drag`, `click`.
|
||||
- `cd2` - the reason that the file transfer stopped. One of `completed`, `errored`, `cancelled`.
|
||||
- `cd3` - the destination of a link click. One of `experiment-page`, `download-firefox`, `twitter`, `github`, `cookies`, `terms`, `privacy`, `about`, `legal`, `mozilla`.
|
||||
- `cd4` - the location from which the user copied the URL to an upload file. One of `success-screen`, `upload-list`.
|
||||
- `cd5` - the referring location. One of `completed-download`, `errored-download`, `cancelled-download`, `completed-upload`, `errored-upload`, `cancelled-upload`, `testpilot`, `external`.
|
||||
- `cd6` - identifying information about an error. Exclude if there is no error involved. **TODO:** enumerate a list of possibilities.
|
||||
|
||||
### Events
|
||||
|
||||
_NB:_ due to how files are being tracked, there are no events indicating file expiry. This carries some risk: most notably, we can only derive expiration rates by looking at download rates, which is prone to skew if there are problems in data collection.
|
||||
|
||||
#### `upload-started`
|
||||
Triggered whenever a user begins uploading a file. Includes:
|
||||
|
||||
- `ec` - `sender`
|
||||
- `ea` - `upload-started`
|
||||
- `cm1`
|
||||
- `cm5`
|
||||
- `cm6`
|
||||
- `cm7`
|
||||
- `cd1`
|
||||
- `cd5`
|
||||
|
||||
#### `upload-stopped`
|
||||
Triggered whenever a user stops uploading a file. Includes:
|
||||
|
||||
- `ec` - `sender`
|
||||
- `ea` - `upload-stopped`
|
||||
- `cm1`
|
||||
- `cm2`
|
||||
- `cm3`
|
||||
- `cm5`
|
||||
- `cm6`
|
||||
- `cm7`
|
||||
- `cd1`
|
||||
- `cd2`
|
||||
- `cd6`
|
||||
|
||||
#### `download-started`
|
||||
Triggered whenever a user begins downloading a file. Includes:
|
||||
|
||||
- `ec` - `recipient`
|
||||
- `ea` - `download-started`
|
||||
- `cm1`
|
||||
- `cm4`
|
||||
- `cm5`
|
||||
- `cm6`
|
||||
- `cm7`
|
||||
|
||||
#### `download-stopped`
|
||||
Triggered whenever a user stops downloading a file.
|
||||
|
||||
- `ec` - `recipient`
|
||||
- `ea` - `download-stopped`
|
||||
- `cm1`
|
||||
- `cm2` (if possible and applicable)
|
||||
- `cm3` (if possible and applicable)
|
||||
- `cm5`
|
||||
- `cm6`
|
||||
- `cm7`
|
||||
- `cd2`
|
||||
- `cd6`
|
||||
|
||||
#### `exited`
|
||||
Fired whenever a user follows a link external to Send.
|
||||
|
||||
- `ec` - `recipient`, `sender`, or `other`, as applicable.
|
||||
- `ea` - `exited`
|
||||
- `cd3`
|
||||
|
||||
#### `upload-deleted`
|
||||
Fired whenever a user deletes a file they’ve uploaded.
|
||||
|
||||
- `ec` - `sender`
|
||||
- `ea` - `upload-deleted`
|
||||
- `cm1`
|
||||
- `cm2`
|
||||
- `cm3`
|
||||
- `cm4`
|
||||
- `cm5`
|
||||
- `cm6`
|
||||
- `cm7`
|
||||
- `cd1`
|
||||
- `cd4`
|
||||
|
||||
#### `copied`
|
||||
Fired whenever a user copies the URL of an upload file.
|
||||
|
||||
- `ec` - `sender`
|
||||
- `ea` - `copied`
|
||||
- `cd4`
|
||||
|
||||
#### `restarted`
|
||||
Fired whenever the user interrupts any part of funnel to return to the start of it (e.g. with a “send another file” or “send your own files” link).
|
||||
|
||||
- `ec` - `recipient`, `sender`, or `other`, as applicable.
|
||||
- `ea` - `restarted`
|
||||
- `cd2`
|
||||
|
||||
#### `unsupported`
|
||||
Fired whenever a user is presented a message saying that their browser is unsupported due to missing crypto APIs.
|
||||
|
||||
- `ec` - `recipient` or `sender`, as applicable.
|
||||
- `ea` - `unsupported`
|
||||
- `cd6`
|
||||
34
frontend/src/common.js
Normal file
@@ -0,0 +1,34 @@
|
||||
window.Raven = require('raven-js');
|
||||
window.Raven.config(window.dsn).install();
|
||||
window.dsn = undefined;
|
||||
|
||||
const testPilotGA = require('testpilot-ga');
|
||||
const { gcmCompliant, sendEvent } = require('./utils');
|
||||
window.analytics = new testPilotGA({
|
||||
an: 'Firefox Send',
|
||||
ds: 'web',
|
||||
tid: window.trackerId
|
||||
});
|
||||
|
||||
const isSender = !location.pathname.includes('/download');
|
||||
const ec = isSender ? 'sender' : 'recipient';
|
||||
const ua = navigator.userAgent.toLowerCase();
|
||||
|
||||
gcmCompliant().catch(err => {
|
||||
sendEvent(ec, 'unsupported', {
|
||||
cd6: err
|
||||
}).then(() => {
|
||||
location.replace('/unsupported/gcm');
|
||||
});
|
||||
});
|
||||
|
||||
if (
|
||||
ua.indexOf('firefox') > -1 &&
|
||||
parseInt(ua.match(/firefox\/*([^\n\r]*)\./)[1], 10) <= 49
|
||||
) {
|
||||
sendEvent(ec, 'unsupported', {
|
||||
cd6: new Error('Firefox is outdated.')
|
||||
}).then(() => {
|
||||
location.replace('/unsupported/outdated');
|
||||
});
|
||||
}
|
||||
@@ -1,71 +1,169 @@
|
||||
require('./common');
|
||||
const FileReceiver = require('./fileReceiver');
|
||||
const { notify } = require('./utils');
|
||||
const { notify, findMetric, sendEvent } = require('./utils');
|
||||
const bytes = require('bytes');
|
||||
const Storage = require('./storage');
|
||||
const storage = new Storage(localStorage);
|
||||
|
||||
const $ = require('jquery');
|
||||
require('jquery-circle-progress');
|
||||
|
||||
const Raven = window.Raven;
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#download-progress').hide();
|
||||
$('#send-file').click(() => {
|
||||
window.location.replace(`${window.location.origin}`);
|
||||
//link back to homepage
|
||||
$('.send-new').attr('href', window.location.origin);
|
||||
|
||||
$('.send-new').click(function(target) {
|
||||
target.preventDefault();
|
||||
sendEvent('recipient', 'restarted', {
|
||||
cd2: 'completed'
|
||||
}).then(() => {
|
||||
location.href = target.currentTarget.href;
|
||||
});
|
||||
});
|
||||
|
||||
$('.legal-links a, .social-links a, #dl-firefox').click(function(target) {
|
||||
target.preventDefault();
|
||||
const metric = findMetric(target.currentTarget.href);
|
||||
// record exited event by recipient
|
||||
sendEvent('recipient', 'exited', {
|
||||
cd3: metric
|
||||
}).then(() => {
|
||||
location.href = target.currentTarget.href;
|
||||
});
|
||||
});
|
||||
|
||||
const filename = $('#dl-filename').text();
|
||||
const bytelength = Number($('#dl-bytelength').text());
|
||||
const timeToExpiry = Number($('#dl-ttl').text());
|
||||
|
||||
//initiate progress bar
|
||||
$('#dl-progress').circleProgress({
|
||||
value: 0.0,
|
||||
startAngle: -Math.PI / 2,
|
||||
fill: '#3B9DFF',
|
||||
size: 158,
|
||||
animation: { duration: 300 }
|
||||
});
|
||||
$('#download-btn').click(download);
|
||||
function download() {
|
||||
const fileReceiver = new FileReceiver();
|
||||
const name = document.createElement('p');
|
||||
const $btn = $('#download-btn');
|
||||
storage.totalDownloads += 1;
|
||||
|
||||
fileReceiver.on('progress', percentComplete => {
|
||||
$('#download-page-one').hide();
|
||||
$('.send-new').hide();
|
||||
$('#download-progress').show();
|
||||
const fileReceiver = new FileReceiver();
|
||||
const unexpiredFiles = storage.numFiles;
|
||||
|
||||
fileReceiver.on('progress', progress => {
|
||||
window.onunload = function() {
|
||||
storage.referrer = 'cancelled-download';
|
||||
// record download-stopped (cancelled by tab close or reload)
|
||||
sendEvent('recipient', 'download-stopped', {
|
||||
cm1: bytelength,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd2: 'cancelled'
|
||||
});
|
||||
};
|
||||
|
||||
$('#download-page-one').attr('hidden', true);
|
||||
$('#download-progress').removeAttr('hidden');
|
||||
const percent = progress[0] / progress[1];
|
||||
// update progress bar
|
||||
document
|
||||
.querySelector('#progress-bar')
|
||||
.style.setProperty('--progress', percentComplete + '%');
|
||||
$('#progress-text').html(`${percentComplete}%`);
|
||||
//on complete
|
||||
if (percentComplete === 100) {
|
||||
fileReceiver.removeAllListeners('progress');
|
||||
$('#download-text').html('Download complete!');
|
||||
$('.send-new').show();
|
||||
$btn.text('Download complete!');
|
||||
$btn.attr('disabled', 'true');
|
||||
notify('Your download has finished.');
|
||||
}
|
||||
$('#dl-progress').circleProgress('value', percent);
|
||||
$('.percent-number').text(`${Math.floor(percent * 100)}`);
|
||||
$('.progress-text').text(
|
||||
`${filename} (${bytes(progress[0], {
|
||||
decimalPlaces: 1,
|
||||
fixedDecimals: true
|
||||
})} of ${bytes(progress[1], { decimalPlaces: 1 })})`
|
||||
);
|
||||
});
|
||||
|
||||
let downloadEnd;
|
||||
fileReceiver.on('decrypting', isStillDecrypting => {
|
||||
// The file is being decrypted
|
||||
if (isStillDecrypting) {
|
||||
console.log('Decrypting');
|
||||
fileReceiver.removeAllListeners('progress');
|
||||
window.onunload = null;
|
||||
document.l10n.formatValue('decryptingFile').then(decryptingFile => {
|
||||
$('.progress-text').text(decryptingFile);
|
||||
});
|
||||
} else {
|
||||
console.log('Done decrypting');
|
||||
downloadEnd = Date.now();
|
||||
}
|
||||
});
|
||||
|
||||
fileReceiver.on('hashing', isStillHashing => {
|
||||
// The file is being hashed to make sure a malicious user hasn't tampered with it
|
||||
if (isStillHashing) {
|
||||
console.log('Checking file integrity');
|
||||
document.l10n.formatValue('verifyingFile').then(verifyingFile => {
|
||||
$('.progress-text').text(verifyingFile);
|
||||
});
|
||||
} else {
|
||||
console.log('Integrity check done');
|
||||
$('.progress-text').text(' ');
|
||||
document.l10n
|
||||
.formatValues('downloadNotification', 'downloadFinish')
|
||||
.then(translated => {
|
||||
notify(translated[0]);
|
||||
$('.title').text(translated[1]);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
// record download-started by recipient
|
||||
sendEvent('recipient', 'download-started', {
|
||||
cm1: bytelength,
|
||||
cm4: timeToExpiry,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads
|
||||
});
|
||||
|
||||
fileReceiver
|
||||
.download()
|
||||
.catch(() => {
|
||||
$('.title').text(
|
||||
'This link has expired or never existed in the first place.'
|
||||
);
|
||||
$('#download-btn').hide();
|
||||
$('#expired-img').show();
|
||||
console.log('The file has expired, or has already been deleted.');
|
||||
.catch(err => {
|
||||
// record download-stopped (errored) by recipient
|
||||
sendEvent('recipient', 'download-stopped', {
|
||||
cm1: bytelength,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd2: 'errored',
|
||||
cd6: err
|
||||
});
|
||||
|
||||
if (err.message === 'notfound') {
|
||||
location.reload();
|
||||
} else {
|
||||
document.l10n.formatValue('errorPageHeader').then(translated => {
|
||||
$('.title').text(translated);
|
||||
});
|
||||
$('#download-btn').attr('hidden', true);
|
||||
$('#expired-img').removeAttr('hidden');
|
||||
}
|
||||
return;
|
||||
})
|
||||
.then(([decrypted, fname]) => {
|
||||
name.innerText = fname;
|
||||
const endTime = Date.now();
|
||||
const totalTime = endTime - startTime;
|
||||
const downloadTime = endTime - downloadEnd;
|
||||
const downloadSpeed = bytelength / (downloadTime / 1000);
|
||||
|
||||
storage.referrer = 'completed-download';
|
||||
// record download-stopped (completed) by recipient
|
||||
sendEvent('recipient', 'download-stopped', {
|
||||
cm1: bytelength,
|
||||
cm2: totalTime,
|
||||
cm3: downloadSpeed,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd2: 'completed'
|
||||
});
|
||||
|
||||
const dataView = new DataView(decrypted);
|
||||
const blob = new Blob([dataView]);
|
||||
const downloadUrl = URL.createObjectURL(blob);
|
||||
|
||||
@@ -13,18 +13,13 @@ class FileReceiver extends EventEmitter {
|
||||
|
||||
xhr.onprogress = event => {
|
||||
if (event.lengthComputable && event.target.status !== 404) {
|
||||
const percentComplete = Math.floor(
|
||||
event.loaded / event.total * 100
|
||||
);
|
||||
this.emit('progress', percentComplete);
|
||||
this.emit('progress', [event.loaded, event.total]);
|
||||
}
|
||||
};
|
||||
|
||||
xhr.onload = function(event) {
|
||||
if (xhr.status === 404) {
|
||||
reject(
|
||||
new Error('The file has expired, or has already been deleted.')
|
||||
);
|
||||
reject(new Error('notfound'));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -70,23 +65,18 @@ class FileReceiver extends EventEmitter {
|
||||
{
|
||||
name: 'AES-GCM',
|
||||
iv: hexToArray(fdata.iv),
|
||||
additionalData: hexToArray(fdata.aad)
|
||||
additionalData: hexToArray(fdata.aad),
|
||||
tagLength: 128
|
||||
},
|
||||
key,
|
||||
fdata.data
|
||||
)
|
||||
.then(decrypted => {
|
||||
this.emit('decrypting', false);
|
||||
return new Promise((resolve, reject) => {
|
||||
resolve(decrypted);
|
||||
});
|
||||
return Promise.resolve(decrypted);
|
||||
}),
|
||||
new Promise((resolve, reject) => {
|
||||
resolve(fdata.filename);
|
||||
}),
|
||||
new Promise((resolve, reject) => {
|
||||
resolve(hexToArray(fdata.aad));
|
||||
})
|
||||
fdata.filename,
|
||||
hexToArray(fdata.aad)
|
||||
]);
|
||||
})
|
||||
.then(([decrypted, fname, proposedHash]) => {
|
||||
@@ -99,20 +89,12 @@ class FileReceiver extends EventEmitter {
|
||||
new Uint8Array(calculatedHash).toString() ===
|
||||
proposedHash.toString();
|
||||
if (!integrity) {
|
||||
return new Promise((resolve, reject) => {
|
||||
console.log('This file has been tampered with.');
|
||||
reject();
|
||||
});
|
||||
this.emit('unsafe', true);
|
||||
return Promise.reject();
|
||||
} else {
|
||||
this.emit('safe', true);
|
||||
return Promise.all([decrypted, decodeURIComponent(fname)]);
|
||||
}
|
||||
|
||||
return Promise.all([
|
||||
new Promise((resolve, reject) => {
|
||||
resolve(decrypted);
|
||||
}),
|
||||
new Promise((resolve, reject) => {
|
||||
resolve(fname);
|
||||
})
|
||||
]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ class FileSender extends EventEmitter {
|
||||
super();
|
||||
this.file = file;
|
||||
this.iv = window.crypto.getRandomValues(new Uint8Array(12));
|
||||
this.uploadXHR = new XMLHttpRequest();
|
||||
}
|
||||
|
||||
static delete(fileId, token) {
|
||||
@@ -23,18 +24,16 @@ class FileSender extends EventEmitter {
|
||||
if (xhr.readyState === XMLHttpRequest.DONE) {
|
||||
resolve();
|
||||
}
|
||||
|
||||
if (xhr.status === 200) {
|
||||
console.log('The file was successfully deleted.');
|
||||
} else {
|
||||
console.log('The file has expired, or has already been deleted.');
|
||||
}
|
||||
};
|
||||
|
||||
xhr.send(JSON.stringify({ delete_token: token }));
|
||||
});
|
||||
}
|
||||
|
||||
cancel() {
|
||||
this.uploadXHR.abort();
|
||||
}
|
||||
|
||||
upload() {
|
||||
const self = this;
|
||||
self.emit('loading', true);
|
||||
@@ -47,9 +46,6 @@ class FileSender extends EventEmitter {
|
||||
},
|
||||
true,
|
||||
['encrypt', 'decrypt']
|
||||
)
|
||||
.catch(err =>
|
||||
console.log('There was an error generating a crypto key')
|
||||
),
|
||||
new Promise((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
@@ -103,25 +99,26 @@ class FileSender extends EventEmitter {
|
||||
const fd = new FormData();
|
||||
fd.append('data', blob, file.name);
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
const xhr = self.uploadXHR;
|
||||
|
||||
xhr.upload.addEventListener('progress', e => {
|
||||
if (e.lengthComputable) {
|
||||
const percentComplete = Math.floor(e.loaded / e.total * 100);
|
||||
self.emit('progress', percentComplete);
|
||||
self.emit('progress', [e.loaded, e.total]);
|
||||
}
|
||||
});
|
||||
|
||||
xhr.onreadystatechange = () => {
|
||||
if (xhr.readyState === XMLHttpRequest.DONE) {
|
||||
// uuid field and url field
|
||||
const responseObj = JSON.parse(xhr.responseText);
|
||||
resolve({
|
||||
url: responseObj.url,
|
||||
fileId: responseObj.id,
|
||||
secretKey: keydata.k,
|
||||
deleteToken: responseObj.delete
|
||||
});
|
||||
if (xhr.status === 200) {
|
||||
const responseObj = JSON.parse(xhr.responseText);
|
||||
return resolve({
|
||||
url: responseObj.url,
|
||||
fileId: responseObj.id,
|
||||
secretKey: keydata.k,
|
||||
deleteToken: responseObj.delete
|
||||
});
|
||||
}
|
||||
reject(xhr.status);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -131,7 +128,7 @@ class FileSender extends EventEmitter {
|
||||
JSON.stringify({
|
||||
aad: arrayToHex(hash),
|
||||
id: fileId,
|
||||
filename: file.name
|
||||
filename: encodeURIComponent(file.name)
|
||||
})
|
||||
);
|
||||
xhr.send(fd);
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
window.Raven = require('raven-js');
|
||||
window.Raven.config(window.dsn).install();
|
||||
window.dsn = undefined;
|
||||
require('./upload');
|
||||
require('./download');
|
||||
70
frontend/src/storage.js
Normal file
@@ -0,0 +1,70 @@
|
||||
const { isFile } = require('./utils');
|
||||
|
||||
class Storage {
|
||||
constructor(engine) {
|
||||
this.engine = engine;
|
||||
}
|
||||
|
||||
get totalDownloads() {
|
||||
return Number(this.engine.getItem('totalDownloads'));
|
||||
}
|
||||
set totalDownloads(n) {
|
||||
this.engine.setItem('totalDownloads', n);
|
||||
}
|
||||
get totalUploads() {
|
||||
return Number(this.engine.getItem('totalUploads'));
|
||||
}
|
||||
set totalUploads(n) {
|
||||
this.engine.setItem('totalUploads', n);
|
||||
}
|
||||
get referrer() {
|
||||
return this.engine.getItem('referrer');
|
||||
}
|
||||
set referrer(str) {
|
||||
this.engine.setItem('referrer', str);
|
||||
}
|
||||
|
||||
get files() {
|
||||
const fs = [];
|
||||
for (let i = 0; i < this.engine.length; i++) {
|
||||
const k = this.engine.key(i);
|
||||
if (isFile(k)) {
|
||||
fs.push(JSON.parse(this.engine.getItem(k))); // parse or whatever else
|
||||
}
|
||||
}
|
||||
return fs.sort((file1, file2) => {
|
||||
const creationDate1 = new Date(file1.creationDate);
|
||||
const creationDate2 = new Date(file2.creationDate);
|
||||
return creationDate1 - creationDate2;
|
||||
});
|
||||
}
|
||||
|
||||
get numFiles() {
|
||||
let length = 0;
|
||||
for (let i = 0; i < this.engine.length; i++) {
|
||||
const k = this.engine.key(i);
|
||||
if (isFile(k)) {
|
||||
length += 1;
|
||||
}
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
getFileById(id) {
|
||||
return this.engine.getItem(id);
|
||||
}
|
||||
|
||||
has(property) {
|
||||
return this.engine.hasOwnProperty(property);
|
||||
}
|
||||
|
||||
remove(property) {
|
||||
this.engine.removeItem(property);
|
||||
}
|
||||
|
||||
addFile(id, file) {
|
||||
this.engine.setItem(id, JSON.stringify(file));
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Storage;
|
||||
@@ -1,41 +1,89 @@
|
||||
/* global MAXFILESIZE EXPIRE_SECONDS */
|
||||
require('./common');
|
||||
const FileSender = require('./fileSender');
|
||||
const { notify, gcmCompliant } = require('./utils');
|
||||
const {
|
||||
notify,
|
||||
findMetric,
|
||||
sendEvent,
|
||||
ONE_DAY_IN_MS
|
||||
} = require('./utils');
|
||||
const bytes = require('bytes');
|
||||
const Storage = require('./storage');
|
||||
const storage = new Storage(localStorage);
|
||||
|
||||
const $ = require('jquery');
|
||||
require('jquery-circle-progress');
|
||||
|
||||
const Raven = window.Raven;
|
||||
|
||||
if (storage.has('referrer')) {
|
||||
window.referrer = storage.referrer;
|
||||
storage.remove('referrer');
|
||||
} else {
|
||||
window.referrer = 'external';
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
gcmCompliant().catch(err => {
|
||||
$('#page-one').hide();
|
||||
$('#compliance-error').show();
|
||||
$('#file-upload').change(onUpload);
|
||||
|
||||
$('.legal-links a, .social-links a, #dl-firefox').click(function(target) {
|
||||
target.preventDefault();
|
||||
const metric = findMetric(target.currentTarget.href);
|
||||
// record exited event by recipient
|
||||
sendEvent('sender', 'exited', {
|
||||
cd3: metric
|
||||
}).then(() => {
|
||||
location.href = target.currentTarget.href;
|
||||
});
|
||||
});
|
||||
|
||||
$('#file-upload').change(onUpload);
|
||||
$('#page-one').on('dragover', allowDrop).on('drop', onUpload);
|
||||
$('#send-new-completed').click(function(target) {
|
||||
target.preventDefault();
|
||||
// record restarted event
|
||||
sendEvent('sender', 'restarted', {
|
||||
cd2: 'completed'
|
||||
}).then(() => {
|
||||
storage.referrer = 'completed-upload';
|
||||
location.href = target.currentTarget.href;
|
||||
});
|
||||
});
|
||||
|
||||
$('#send-new-error').click(function(target) {
|
||||
target.preventDefault();
|
||||
// record restarted event
|
||||
sendEvent('sender', 'restarted', {
|
||||
cd2: 'errored'
|
||||
}).then(() => {
|
||||
storage.referrer = 'errored-upload';
|
||||
location.href = target.currentTarget.href;
|
||||
});
|
||||
});
|
||||
|
||||
$('body').on('dragover', allowDrop).on('drop', onUpload);
|
||||
// reset copy button
|
||||
const $copyBtn = $('#copy-btn');
|
||||
$copyBtn.attr('disabled', false);
|
||||
$copyBtn.html('Copy');
|
||||
$('#link').attr('disabled', false);
|
||||
$copyBtn.attr('data-l10n-id', 'copyUrlFormButton');
|
||||
|
||||
$('#page-one').show();
|
||||
$('#file-list').show();
|
||||
$('#upload-progress').hide();
|
||||
$('#share-link').hide();
|
||||
$('#upload-error').hide();
|
||||
$('#compliance-error').hide();
|
||||
|
||||
if (localStorage.length === 0) {
|
||||
const files = storage.files;
|
||||
if (files.length === 0) {
|
||||
toggleHeader();
|
||||
} else {
|
||||
for (let i = 0; i < localStorage.length; i++) {
|
||||
const id = localStorage.key(i);
|
||||
//check if file exists before adding to list
|
||||
checkExistence(id, true);
|
||||
// eslint-disable-next-line prefer-const
|
||||
for (let index in files) {
|
||||
const id = files[index].fileId;
|
||||
//check if file still exists before adding to list
|
||||
checkExistence(id, files[index], true);
|
||||
}
|
||||
}
|
||||
|
||||
// copy link to clipboard
|
||||
$copyBtn.click(() => {
|
||||
// record copied event from success screen
|
||||
sendEvent('sender', 'copied', {
|
||||
cd4: 'success-screen'
|
||||
});
|
||||
const aux = document.createElement('input');
|
||||
aux.setAttribute('value', $('#link').attr('value'));
|
||||
document.body.appendChild(aux);
|
||||
@@ -44,123 +92,247 @@ $(document).ready(function() {
|
||||
document.body.removeChild(aux);
|
||||
//disable button for 3s
|
||||
$copyBtn.attr('disabled', true);
|
||||
$copyBtn.html('Copied!');
|
||||
$('#link').attr('disabled', true);
|
||||
$copyBtn.html(
|
||||
'<img src="/resources/check-16.svg" class="icon-check"></img>'
|
||||
);
|
||||
window.setTimeout(() => {
|
||||
$copyBtn.attr('disabled', false);
|
||||
$copyBtn.html('Copy');
|
||||
$('#link').attr('disabled', false);
|
||||
$copyBtn.attr('data-l10n-id', 'copyUrlFormButton');
|
||||
}, 3000);
|
||||
});
|
||||
|
||||
// link back to home page
|
||||
$('.send-new').click(() => {
|
||||
$('#page-one').show();
|
||||
$('#file-list').show();
|
||||
$('#upload-progress').hide();
|
||||
$('#share-link').hide();
|
||||
$('#upload-error').hide();
|
||||
$copyBtn.attr('disabled', false);
|
||||
$copyBtn.html('Copy');
|
||||
$('.upload-window').on('dragover', () => {
|
||||
$('.upload-window').addClass('ondrag');
|
||||
});
|
||||
$('.upload-window').on('dragleave', () => {
|
||||
$('.upload-window').removeClass('ondrag');
|
||||
});
|
||||
//initiate progress bar
|
||||
$('#ul-progress').circleProgress({
|
||||
value: 0.0,
|
||||
startAngle: -Math.PI / 2,
|
||||
fill: '#3B9DFF',
|
||||
size: 158,
|
||||
animation: { duration: 300 }
|
||||
});
|
||||
|
||||
//link back to homepage
|
||||
$('.send-new').attr('href', window.location);
|
||||
|
||||
// on file upload by browse or drag & drop
|
||||
function onUpload(event) {
|
||||
event.preventDefault();
|
||||
|
||||
// don't allow upload if not on upload page
|
||||
if ($('#page-one').attr('hidden')) {
|
||||
return;
|
||||
}
|
||||
|
||||
storage.totalUploads += 1;
|
||||
|
||||
let file = '';
|
||||
if (event.type === 'drop') {
|
||||
if (!event.originalEvent.dataTransfer.files[0]) {
|
||||
$('.upload-window').removeClass('ondrag');
|
||||
return;
|
||||
}
|
||||
if (
|
||||
event.originalEvent.dataTransfer.files.length > 1 ||
|
||||
event.originalEvent.dataTransfer.files[0].size === 0
|
||||
) {
|
||||
$('.upload-window').removeClass('ondrag');
|
||||
document.l10n.formatValue('uploadPageMultipleFilesAlert').then(str => {
|
||||
alert(str);
|
||||
});
|
||||
return;
|
||||
}
|
||||
file = event.originalEvent.dataTransfer.files[0];
|
||||
} else {
|
||||
file = event.target.files[0];
|
||||
}
|
||||
const expiration = 24 * 60 * 60 * 1000; //will eventually come from a field
|
||||
|
||||
if (file.size > MAXFILESIZE) {
|
||||
return document.l10n
|
||||
.formatValue('fileTooBig', { size: bytes(MAXFILESIZE) })
|
||||
.then(alert);
|
||||
}
|
||||
|
||||
$('#page-one').attr('hidden', true);
|
||||
$('#upload-error').attr('hidden', true);
|
||||
$('#upload-progress').removeAttr('hidden');
|
||||
document.l10n.formatValue('importingFile').then(importingFile => {
|
||||
$('.progress-text').text(importingFile);
|
||||
});
|
||||
//don't allow drag and drop when not on page-one
|
||||
$('body').off('drop', onUpload);
|
||||
|
||||
const fileSender = new FileSender(file);
|
||||
fileSender.on('progress', percentComplete => {
|
||||
$('#page-one').hide();
|
||||
$('#file-list').hide();
|
||||
$('#upload-progress').show();
|
||||
$('#upload-error').hide();
|
||||
$('#upload-filename').innerHTML += file.name;
|
||||
// update progress bar
|
||||
document
|
||||
.querySelector('#progress-bar')
|
||||
.style.setProperty('--progress', percentComplete + '%');
|
||||
$('#progress-text').html(`${percentComplete}%`);
|
||||
$('#cancel-upload').click(() => {
|
||||
fileSender.cancel();
|
||||
storage.referrer = 'cancelled-upload';
|
||||
|
||||
// record upload-stopped (cancelled) by sender
|
||||
sendEvent('sender', 'upload-stopped', {
|
||||
cm1: file.size,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: event.type === 'drop' ? 'drop' : 'click',
|
||||
cd2: 'cancelled'
|
||||
});
|
||||
location.reload();
|
||||
});
|
||||
|
||||
fileSender.on('loading', isStillLoading => {
|
||||
// The file is loading into Firefox at this stage
|
||||
if (isStillLoading) {
|
||||
console.log('Processing');
|
||||
} else {
|
||||
console.log('Finished processing');
|
||||
}
|
||||
fileSender.on('progress', progress => {
|
||||
const percent = progress[0] / progress[1];
|
||||
// update progress bar
|
||||
$('#ul-progress').circleProgress('value', percent);
|
||||
$('#ul-progress').circleProgress().on('circle-animation-end', function() {
|
||||
$('.percent-number').text(`${Math.floor(percent * 100)}`);
|
||||
});
|
||||
$('.progress-text').text(
|
||||
`${file.name} (${bytes(progress[0], {
|
||||
decimalPlaces: 1,
|
||||
fixedDecimals: true
|
||||
})} of ${bytes(progress[1], { decimalPlaces: 1 })})`
|
||||
);
|
||||
});
|
||||
|
||||
fileSender.on('hashing', isStillHashing => {
|
||||
// The file is being hashed
|
||||
if (isStillHashing) {
|
||||
console.log('Hashing');
|
||||
} else {
|
||||
console.log('Finished hashing');
|
||||
document.l10n.formatValue('verifyingFile').then(verifyingFile => {
|
||||
$('.progress-text').text(verifyingFile);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
let uploadStart;
|
||||
fileSender.on('encrypting', isStillEncrypting => {
|
||||
// The file is being encrypted
|
||||
if (isStillEncrypting) {
|
||||
console.log('Encrypting');
|
||||
document.l10n.formatValue('encryptingFile').then(encryptingFile => {
|
||||
$('.progress-text').text(encryptingFile);
|
||||
});
|
||||
} else {
|
||||
console.log('Finished encrypting');
|
||||
uploadStart = Date.now();
|
||||
}
|
||||
});
|
||||
|
||||
fileSender
|
||||
.upload()
|
||||
.then(info => {
|
||||
const url = info.url.trim() + `#${info.secretKey}`.trim();
|
||||
$('#link').attr('value', url);
|
||||
const fileData = {
|
||||
name: file.name,
|
||||
fileId: info.fileId,
|
||||
url: info.url,
|
||||
secretKey: info.secretKey,
|
||||
deleteToken: info.deleteToken,
|
||||
creationDate: new Date(),
|
||||
expiry: expiration
|
||||
};
|
||||
localStorage.setItem(info.fileId, JSON.stringify(fileData));
|
||||
let t;
|
||||
const startTime = Date.now();
|
||||
const unexpiredFiles = storage.numFiles + 1;
|
||||
|
||||
$('#page-one').hide();
|
||||
$('#file-list').hide();
|
||||
$('#upload-progress').hide();
|
||||
$('#share-link').show();
|
||||
$('#upload-error').hide();
|
||||
// record upload-started event by sender
|
||||
sendEvent('sender', 'upload-started', {
|
||||
cm1: file.size,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: event.type === 'drop' ? 'drop' : 'click',
|
||||
cd5: window.referrer
|
||||
});
|
||||
|
||||
populateFileList(JSON.stringify(fileData));
|
||||
notify('Your upload has finished.');
|
||||
})
|
||||
.catch(err => {
|
||||
Raven.captureException(err);
|
||||
console.log(err);
|
||||
$('#page-one').hide();
|
||||
$('#upload-error').show();
|
||||
});
|
||||
// For large files we need to give the ui a tick to breathe and update
|
||||
// before we kick off the FileSender
|
||||
setTimeout(() => {
|
||||
fileSender
|
||||
.upload()
|
||||
.then(info => {
|
||||
const endTime = Date.now();
|
||||
const totalTime = endTime - startTime;
|
||||
const uploadTime = endTime - uploadStart;
|
||||
const uploadSpeed = file.size / (uploadTime / 1000);
|
||||
const expiration = EXPIRE_SECONDS * 1000;
|
||||
|
||||
// record upload-stopped (completed) by sender
|
||||
sendEvent('sender', 'upload-stopped', {
|
||||
cm1: file.size,
|
||||
cm2: totalTime,
|
||||
cm3: uploadSpeed,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: event.type === 'drop' ? 'drop' : 'click',
|
||||
cd2: 'completed'
|
||||
});
|
||||
|
||||
const fileData = {
|
||||
name: file.name,
|
||||
size: file.size,
|
||||
fileId: info.fileId,
|
||||
url: info.url,
|
||||
secretKey: info.secretKey,
|
||||
deleteToken: info.deleteToken,
|
||||
creationDate: new Date(),
|
||||
expiry: expiration,
|
||||
totalTime: totalTime,
|
||||
typeOfUpload: event.type === 'drop' ? 'drop' : 'click',
|
||||
uploadSpeed: uploadSpeed
|
||||
};
|
||||
|
||||
storage.addFile(info.fileId, fileData);
|
||||
$('#upload-filename').attr(
|
||||
'data-l10n-id',
|
||||
'uploadSuccessConfirmHeader'
|
||||
);
|
||||
t = window.setTimeout(() => {
|
||||
$('#page-one').attr('hidden', true);
|
||||
$('#upload-progress').attr('hidden', true);
|
||||
$('#upload-error').attr('hidden', true);
|
||||
$('#share-link').removeAttr('hidden');
|
||||
}, 1000);
|
||||
|
||||
populateFileList(fileData);
|
||||
document.l10n.formatValue('notifyUploadDone').then(str => {
|
||||
notify(str);
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
// err is 0 when coming from a cancel upload event
|
||||
if (err === 0) {
|
||||
return;
|
||||
}
|
||||
// only show error page when the error is anything other than user cancelling the upload
|
||||
Raven.captureException(err);
|
||||
$('#page-one').attr('hidden', true);
|
||||
$('#upload-progress').attr('hidden', true);
|
||||
$('#upload-error').removeAttr('hidden');
|
||||
window.clearTimeout(t);
|
||||
|
||||
// record upload-stopped (errored) by sender
|
||||
sendEvent('sender', 'upload-stopped', {
|
||||
cm1: file.size,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: event.type === 'drop' ? 'drop' : 'click',
|
||||
cd2: 'errored',
|
||||
cd6: err
|
||||
});
|
||||
});
|
||||
}, 10);
|
||||
}
|
||||
|
||||
function allowDrop(ev) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
|
||||
function checkExistence(id, populate) {
|
||||
function checkExistence(id, file, populate) {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = () => {
|
||||
if (xhr.readyState === XMLHttpRequest.DONE) {
|
||||
if (xhr.status === 200) {
|
||||
if (populate) {
|
||||
populateFileList(localStorage.getItem(id));
|
||||
populateFileList(file);
|
||||
}
|
||||
} else if (xhr.status === 404) {
|
||||
localStorage.removeItem(id);
|
||||
storage.remove(id);
|
||||
if (storage.numFiles === 0) {
|
||||
toggleHeader();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -168,32 +340,73 @@ $(document).ready(function() {
|
||||
xhr.send();
|
||||
}
|
||||
|
||||
//update file table with current files in localStorage
|
||||
//update file table with current files in storage
|
||||
function populateFileList(file) {
|
||||
try {
|
||||
file = JSON.parse(file);
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
|
||||
const row = document.createElement('tr');
|
||||
const name = document.createElement('td');
|
||||
const link = document.createElement('td');
|
||||
const $copyIcon = $('<img>', {
|
||||
src: '/resources/copy-16.svg',
|
||||
class: 'icon-copy',
|
||||
'data-l10n-id': 'copyUrlHover'
|
||||
});
|
||||
const expiry = document.createElement('td');
|
||||
const del = document.createElement('td');
|
||||
del.setAttribute('align', 'center');
|
||||
const btn = document.createElement('button');
|
||||
const $delIcon = $('<img>', {
|
||||
src: '/resources/close-16.svg',
|
||||
class: 'icon-delete',
|
||||
'data-l10n-id': 'deleteButtonHover'
|
||||
});
|
||||
const popupDiv = document.createElement('div');
|
||||
const $popupText = $('<span>', { class: 'popuptext' });
|
||||
const $popupText = $('<div>', { class: 'popuptext' });
|
||||
const cellText = document.createTextNode(file.name);
|
||||
|
||||
const url = file.url.trim() + `#${file.secretKey}`.trim();
|
||||
|
||||
$('#link').attr('value', url);
|
||||
$('#copy-text').attr('data-l10n-args', '{"filename": "' + file.name + '"}');
|
||||
$('#copy-text').attr('data-l10n-id', 'copyUrlFormLabelWithName');
|
||||
$popupText.attr('tabindex', '-1');
|
||||
|
||||
name.appendChild(cellText);
|
||||
|
||||
// create delete button
|
||||
btn.innerHTML = 'x';
|
||||
btn.classList.add('delete-btn');
|
||||
|
||||
link.innerHTML = file.url.trim() + `#${file.secretKey}`.trim();
|
||||
const delSpan = document.createElement('span');
|
||||
$(delSpan).addClass('icon-cancel-1');
|
||||
$(delSpan).attr('data-l10n-id', 'deleteButtonHover');
|
||||
del.appendChild(delSpan);
|
||||
|
||||
const linkSpan = document.createElement('span');
|
||||
$(linkSpan).addClass('icon-docs');
|
||||
$(linkSpan).attr('data-l10n-id', 'copyUrlHover');
|
||||
link.appendChild(linkSpan);
|
||||
|
||||
link.style.color = '#0A8DFF';
|
||||
|
||||
//copy link to clipboard when icon clicked
|
||||
$copyIcon.click(function() {
|
||||
// record copied event from upload list
|
||||
sendEvent('sender', 'copied', {
|
||||
cd4: 'upload-list'
|
||||
});
|
||||
const aux = document.createElement('input');
|
||||
aux.setAttribute('value', url);
|
||||
document.body.appendChild(aux);
|
||||
aux.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(aux);
|
||||
document.l10n.formatValue('copiedUrl').then(translated => {
|
||||
link.innerHTML = translated;
|
||||
});
|
||||
window.setTimeout(() => {
|
||||
const linkImg = document.createElement('img');
|
||||
$(linkImg).addClass('icon-copy');
|
||||
$(linkImg).attr('data-l10n-id', 'copyUrlHover');
|
||||
$(linkImg).attr('src', '/resources/copy-16.svg');
|
||||
$(link).html(linkImg);
|
||||
}, 500);
|
||||
});
|
||||
|
||||
file.creationDate = new Date(file.creationDate);
|
||||
|
||||
@@ -201,7 +414,7 @@ $(document).ready(function() {
|
||||
future.setTime(file.creationDate.getTime() + file.expiry);
|
||||
|
||||
let countdown = 0;
|
||||
countdown = future.getTime() - new Date().getTime();
|
||||
countdown = future.getTime() - Date.now();
|
||||
let minutes = Math.floor(countdown / 1000 / 60);
|
||||
let hours = Math.floor(minutes / 60);
|
||||
let seconds = Math.floor(countdown / 1000 % 60);
|
||||
@@ -209,84 +422,129 @@ $(document).ready(function() {
|
||||
poll();
|
||||
|
||||
function poll() {
|
||||
countdown = future.getTime() - new Date().getTime();
|
||||
countdown = future.getTime() - Date.now();
|
||||
minutes = Math.floor(countdown / 1000 / 60);
|
||||
hours = Math.floor(minutes / 60);
|
||||
seconds = Math.floor(countdown / 1000 % 60);
|
||||
let t;
|
||||
|
||||
if (hours > 1) {
|
||||
expiry.innerHTML = hours + 'h';
|
||||
t = window.setTimeout(() => {
|
||||
poll();
|
||||
}, 3600000);
|
||||
} else if (hours === 1) {
|
||||
expiry.innerHTML = hours + 'h';
|
||||
if (hours >= 1) {
|
||||
expiry.innerHTML = hours + 'h ' + minutes % 60 + 'm';
|
||||
t = window.setTimeout(() => {
|
||||
poll();
|
||||
}, 60000);
|
||||
} else if (hours === 0) {
|
||||
expiry.innerHTML = minutes + 'm' + seconds + 's';
|
||||
expiry.innerHTML = minutes + 'm ' + seconds + 's';
|
||||
t = window.setTimeout(() => {
|
||||
poll();
|
||||
}, 1000);
|
||||
}
|
||||
//remove from list when expired
|
||||
if (countdown <= 0) {
|
||||
localStorage.removeItem(file.fileId);
|
||||
storage.remove(file.fileId);
|
||||
$(expiry).parents('tr').remove();
|
||||
window.clearTimeout(t);
|
||||
toggleHeader();
|
||||
}
|
||||
}
|
||||
|
||||
// create popup
|
||||
popupDiv.classList.add('popup');
|
||||
$popupText.html(
|
||||
'<span class="del-file">Delete</span><span class="nvm" > Nevermind</span>'
|
||||
);
|
||||
const $popupMessage = $('<div>', { class: 'popup-message' });
|
||||
$popupMessage.attr('data-l10n-id', 'deletePopupText');
|
||||
const $popupAction = $('<div>', { class: 'popup-action' });
|
||||
const $popupNvmSpan = $('<span>', { class: 'popup-no' });
|
||||
$popupNvmSpan.attr('data-l10n-id', 'deletePopupCancel');
|
||||
const $popupDelSpan = $('<span>', { class: 'popup-yes' });
|
||||
$popupDelSpan.attr('data-l10n-id', 'deletePopupYes');
|
||||
|
||||
$popupText.html([$popupMessage, $popupAction]);
|
||||
$popupAction.html([$popupNvmSpan, $popupDelSpan]);
|
||||
|
||||
// add data cells to table row
|
||||
row.appendChild(name);
|
||||
$(link).append($copyIcon);
|
||||
row.appendChild(link);
|
||||
row.appendChild(expiry);
|
||||
$(popupDiv).append($popupText);
|
||||
$(del).append($delIcon);
|
||||
del.appendChild(popupDiv);
|
||||
row.appendChild(del);
|
||||
$('tbody').append(row); //add row to table
|
||||
|
||||
const unexpiredFiles = storage.numFiles;
|
||||
|
||||
// delete file
|
||||
$popupText.find('.del-file').click(e => {
|
||||
$popupText.find('.popup-yes').click(e => {
|
||||
FileSender.delete(file.fileId, file.deleteToken).then(() => {
|
||||
$(e.target).parents('tr').remove();
|
||||
localStorage.removeItem(file.fileId);
|
||||
const timeToExpiry =
|
||||
ONE_DAY_IN_MS - (Date.now() - file.creationDate.getTime());
|
||||
// record upload-deleted from file list
|
||||
sendEvent('sender', 'upload-deleted', {
|
||||
cm1: file.size,
|
||||
cm2: file.totalTime,
|
||||
cm3: file.uploadSpeed,
|
||||
cm4: timeToExpiry,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: file.typeOfUpload,
|
||||
cd4: 'upload-list'
|
||||
}).then(() => {
|
||||
storage.remove(file.fileId);
|
||||
});
|
||||
toggleHeader();
|
||||
});
|
||||
});
|
||||
|
||||
// add data cells to table row
|
||||
row.appendChild(name);
|
||||
row.appendChild(link);
|
||||
row.appendChild(expiry);
|
||||
popupDiv.appendChild(btn);
|
||||
$(popupDiv).append($popupText);
|
||||
del.appendChild(popupDiv);
|
||||
row.appendChild(del);
|
||||
|
||||
document.getElementById('delete-file').onclick = () => {
|
||||
FileSender.delete(file.fileId, file.deleteToken).then(() => {
|
||||
const timeToExpiry =
|
||||
ONE_DAY_IN_MS - (Date.now() - file.creationDate.getTime());
|
||||
// record upload-deleted from success screen
|
||||
sendEvent('sender', 'upload-deleted', {
|
||||
cm1: file.size,
|
||||
cm2: file.totalTime,
|
||||
cm3: file.uploadSpeed,
|
||||
cm4: timeToExpiry,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: unexpiredFiles,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: file.typeOfUpload,
|
||||
cd4: 'success-screen'
|
||||
}).then(() => {
|
||||
storage.remove(file.fileId);
|
||||
location.reload();
|
||||
});
|
||||
});
|
||||
};
|
||||
// show popup
|
||||
del.addEventListener('click', toggleShow);
|
||||
$delIcon.click(function() {
|
||||
$popupText.addClass('show');
|
||||
$popupText.focus();
|
||||
});
|
||||
// hide popup
|
||||
$popupText.find('.nvm').click(function(e) {
|
||||
$popupText.find('.popup-no').click(function(e) {
|
||||
e.stopPropagation();
|
||||
toggleShow();
|
||||
$popupText.removeClass('show');
|
||||
});
|
||||
$popupText.click(function(e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
//close when popup loses focus
|
||||
$popupText.blur(() => {
|
||||
$popupText.removeClass('show');
|
||||
});
|
||||
|
||||
$('tbody').append(row); //add row to table
|
||||
|
||||
function toggleShow() {
|
||||
$popupText.toggleClass('show');
|
||||
}
|
||||
toggleHeader();
|
||||
}
|
||||
function toggleHeader() {
|
||||
//hide table header if empty list
|
||||
if (document.querySelector('tbody').childNodes.length === 1) {
|
||||
$('#file-list').hide();
|
||||
$('#file-list').attr('hidden', true);
|
||||
} else {
|
||||
$('#file-list').show();
|
||||
$('#file-list').removeAttr('hidden');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
function arrayToHex(iv) {
|
||||
let hexStr = '';
|
||||
for (const i in iv) {
|
||||
// eslint-disable-next-line prefer-const
|
||||
for (let i in iv) {
|
||||
if (iv[i] < 16) {
|
||||
hexStr += '0' + iv[i].toString(16);
|
||||
} else {
|
||||
hexStr += iv[i].toString(16);
|
||||
}
|
||||
}
|
||||
window.hexStr = hexStr;
|
||||
return hexStr;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,8 @@ function hexToArray(str) {
|
||||
}
|
||||
|
||||
function notify(str) {
|
||||
return str;
|
||||
/* TODO: enable once we have an opt-in ui element
|
||||
if (!('Notification' in window)) {
|
||||
return;
|
||||
} else if (Notification.permission === 'granted') {
|
||||
@@ -30,6 +32,7 @@ function notify(str) {
|
||||
if (permission === 'granted') new Notification(str);
|
||||
});
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
function gcmCompliant() {
|
||||
@@ -70,9 +73,55 @@ function gcmCompliant() {
|
||||
}
|
||||
}
|
||||
|
||||
function findMetric(href) {
|
||||
switch (href) {
|
||||
case 'https://www.mozilla.org/':
|
||||
return 'mozilla';
|
||||
case 'https://www.mozilla.org/about/legal':
|
||||
return 'legal';
|
||||
case 'https://testpilot.firefox.com/about':
|
||||
return 'about';
|
||||
case 'https://testpilot.firefox.com/privacy':
|
||||
return 'privacy';
|
||||
case 'https://testpilot.firefox.com/terms':
|
||||
return 'terms';
|
||||
case 'https://www.mozilla.org/privacy/websites/#cookies':
|
||||
return 'cookies';
|
||||
case 'https://github.com/mozilla/send':
|
||||
return 'github';
|
||||
case 'https://twitter.com/FxTestPilot':
|
||||
return 'twitter';
|
||||
case 'https://www.mozilla.org/firefox/new/?scene=2':
|
||||
return 'download-firefox';
|
||||
default:
|
||||
return 'other';
|
||||
}
|
||||
}
|
||||
|
||||
function isFile(id) {
|
||||
return ![
|
||||
'referrer',
|
||||
'totalDownloads',
|
||||
'totalUploads',
|
||||
'testpilot_ga__cid'
|
||||
].includes(id);
|
||||
}
|
||||
|
||||
function sendEvent() {
|
||||
return window.analytics.sendEvent
|
||||
.apply(window.analytics, arguments)
|
||||
.catch(() => 0);
|
||||
}
|
||||
|
||||
const ONE_DAY_IN_MS = 86400000;
|
||||
|
||||
module.exports = {
|
||||
arrayToHex,
|
||||
hexToArray,
|
||||
notify,
|
||||
gcmCompliant
|
||||
gcmCompliant,
|
||||
findMetric,
|
||||
isFile,
|
||||
sendEvent,
|
||||
ONE_DAY_IN_MS
|
||||
};
|
||||
|
||||
12
l10n.toml
Normal file
@@ -0,0 +1,12 @@
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
basepath = "."
|
||||
|
||||
[env]
|
||||
l = "{l10n_base}/public/locales/{locale}/"
|
||||
|
||||
[[paths]]
|
||||
reference = "public/locales/en-US/**"
|
||||
l10n = "{l}**"
|
||||
4029
package-lock.json
generated
78
package.json
@@ -1,41 +1,43 @@
|
||||
{
|
||||
"name": "firefox-send",
|
||||
"description": "File Sharing Experiment",
|
||||
"version": "0.1.2",
|
||||
"version": "1.0.1",
|
||||
"author": "Mozilla (https://mozilla.org)",
|
||||
"dependencies": {
|
||||
"aws-sdk": "^2.62.0",
|
||||
"aws-sdk": "^2.89.0",
|
||||
"body-parser": "^1.17.2",
|
||||
"bytes": "^2.5.0",
|
||||
"connect-busboy": "0.0.2",
|
||||
"convict": "^3.0.0",
|
||||
"cross-env": "^5.0.1",
|
||||
"express": "^4.15.3",
|
||||
"express-handlebars": "^3.0.0",
|
||||
"helmet": "^3.6.1",
|
||||
"jquery": "^3.2.1",
|
||||
"helmet": "^3.8.0",
|
||||
"mozlog": "^2.1.1",
|
||||
"raven": "^2.1.0",
|
||||
"raven-js": "^3.16.0",
|
||||
"redis": "^2.7.1",
|
||||
"supertest": "^3.0.0",
|
||||
"uglify-es": "3.0.19"
|
||||
"redis": "^2.7.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"browserify": "^14.4.0",
|
||||
"eslint": "^4.0.0",
|
||||
"eslint": "^4.3.0",
|
||||
"eslint-plugin-mocha": "^4.11.0",
|
||||
"eslint-plugin-node": "^5.0.0",
|
||||
"eslint-plugin-node": "^5.1.1",
|
||||
"eslint-plugin-security": "^1.4.0",
|
||||
"git-rev-sync": "^1.9.1",
|
||||
"jquery": "^3.2.1",
|
||||
"jquery-circle-progress": "^1.2.2",
|
||||
"l20n": "^5.0.0",
|
||||
"mocha": "^3.4.2",
|
||||
"npm-run-all": "^4.0.2",
|
||||
"prettier": "^1.4.4",
|
||||
"prettier": "^1.5.3",
|
||||
"proxyquire": "^1.8.0",
|
||||
"sinon": "^2.3.5",
|
||||
"stylelint": "^7.11.0",
|
||||
"stylelint-config-standard": "^16.0.0",
|
||||
"watchify": "^3.9.0"
|
||||
"raven-js": "^3.17.0",
|
||||
"selenium-webdriver": "^3.5.0",
|
||||
"sinon": "^2.3.8",
|
||||
"stylelint": "^8.0.0",
|
||||
"stylelint-config-standard": "^17.0.0",
|
||||
"supertest": "^3.0.0",
|
||||
"testpilot-ga": "^0.3.0",
|
||||
"uglifyify": "^4.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.0.0"
|
||||
@@ -43,15 +45,49 @@
|
||||
"homepage": "https://github.com/mozilla/send/",
|
||||
"license": "MPL-2.0",
|
||||
"repository": "mozilla/send",
|
||||
"availableLanguages": [
|
||||
"en-US",
|
||||
"zh-TW",
|
||||
"zh-CN",
|
||||
"cs",
|
||||
"fr",
|
||||
"fy-NL",
|
||||
"de",
|
||||
"hu",
|
||||
"it",
|
||||
"ja",
|
||||
"kab",
|
||||
"ms",
|
||||
"nb-NO",
|
||||
"nn-NO",
|
||||
"pt-PT",
|
||||
"pt-BR",
|
||||
"ru",
|
||||
"sk",
|
||||
"sl",
|
||||
"dsb",
|
||||
"hsb",
|
||||
"es-CL",
|
||||
"es-ES",
|
||||
"sv-SE",
|
||||
"tr",
|
||||
"cy"
|
||||
],
|
||||
"scripts": {
|
||||
"predocker": "browserify frontend/src/main.js | uglifyjs > public/bundle.js && npm run version",
|
||||
"dev": "npm run version && watchify frontend/src/main.js -o public/bundle.js -d | node server/server",
|
||||
"format": "prettier '{frontend/src/,scripts/,server/,test/}*.js' 'public/*.css' --single-quote --write",
|
||||
"build": "npm-run-all build:*",
|
||||
"build:upload": "browserify frontend/src/upload.js -g uglifyify -o public/upload.js",
|
||||
"build:download": "browserify frontend/src/download.js -g uglifyify -o public/download.js",
|
||||
"build:version": "node scripts/version",
|
||||
"build:l10n": "cp node_modules/l20n/dist/web/l20n.min.js public",
|
||||
"dev": "npm run build && npm start",
|
||||
"format": "prettier '{frontend/src/,scripts/,server/,test/**/!(bundle)}*.js' 'public/*.css' --single-quote --write",
|
||||
"lint": "npm-run-all lint:*",
|
||||
"lint:css": "stylelint 'public/*.css'",
|
||||
"lint:js": "eslint .",
|
||||
"start": "node server/server",
|
||||
"test": "mocha test/unit && mocha test/server",
|
||||
"version": "node scripts/version"
|
||||
"test": "npm-run-all test:*",
|
||||
"test:unit": "mocha test/unit",
|
||||
"test:server": "mocha test/server",
|
||||
"test:browser": "browserify test/frontend/frontend.bundle.js -o test/frontend/bundle.js -d && node test/frontend/driver.js"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
"JavaScript",
|
||||
"jQuery",
|
||||
"Node",
|
||||
"P2P",
|
||||
"Redis"
|
||||
]
|
||||
}
|
||||
|
||||
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
94
public/locales/cs/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = webový experiment
|
||||
siteFeedback = Zpětná vazba
|
||||
uploadPageHeader = Soukromé a šifrované sdílení souborů
|
||||
uploadPageExplainer = Posílejte soubory přes bezpečné, soukromé a šifrované odkazy, které automaticky soubor smažou, aby nezůstal na internetu navěky.
|
||||
uploadPageLearnMore = Zjistit více
|
||||
uploadPageDropMessage = Přesunutím souboru sem spustíte jeho nahrávání
|
||||
uploadPageSizeMessage = Nahrávání funguje nejlépe pro soubory do velikosti 1 GB.
|
||||
uploadPageBrowseButton = Vybrat soubor z počítače
|
||||
.title = Výběr souboru z počítače
|
||||
uploadPageMultipleFilesAlert = Nahrávání více souborů najednou nebo celých složek zatím není podporováno.
|
||||
uploadPageBrowseButtonTitle = Nahrát soubor
|
||||
uploadingPageHeader = Nahrávání vašeho souboru
|
||||
importingFile = Probíhá import…
|
||||
verifyingFile = Probíhá ověřování…
|
||||
encryptingFile = Probíhá šifrování…
|
||||
decryptingFile = Probíhá dešifrování…
|
||||
notifyUploadDone = Nahrávání vašeho souboru bylo dokončeno.
|
||||
uploadingPageMessage = Po dokončení nahrávání můžete nastavit dobu expirace souboru.
|
||||
uploadingPageCancel = Zrušit nahrávání
|
||||
.title = Zrušit nahrávání
|
||||
uploadCancelNotification = Nahrávání vašeho souboru bylo zrušeno.
|
||||
uploadingPageLargeFileMessage = Tento soubor je veliký a jeho nahrávání může chvíli trvat. Posaďte se na chvilku.
|
||||
uploadingFileNotification = Upozornit, až bude nahrávání dokončeno.
|
||||
uploadSuccessConfirmHeader = Připraveno k odeslání
|
||||
uploadSvgAlt
|
||||
.alt = Nahrát
|
||||
uploadSuccessTimingHeader = Platnost odkazu na váš souboru vyprší pro jeho prvním stažení, nebo po 24 hodinách.
|
||||
copyUrlFormLabelWithName = Zkopírujte a sdílejte odkaz na váš soubor: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Zkopírovat do schránky
|
||||
.title = Zkopírovat do schránky
|
||||
copiedUrl = Zkopírováno!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Smazat soubor
|
||||
.title = Smazání souboru
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Poslat další soubor
|
||||
.title = Poslat další soubor
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Stáhnout
|
||||
downloadFileName = Stáhnout { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Někdo vám posílá soubor pomocí služby Firefox Send, které umožňuje bezpečné, soukromí a šifrované sdílení souborů, které jsou pak automaticky smazány, aby nezůstaly na internetu navěky.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Stáhnout
|
||||
.title = Stáhnout
|
||||
downloadNotification = Stahování bylo dokončeno.
|
||||
downloadFinish = Stahování dokončeno
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Vyzkoušejte Firefox Send
|
||||
.title = Vyzkoušejte Firefox Send
|
||||
downloadingPageProgress = Stahování { $filename } ({ $size })
|
||||
downloadingPageMessage = Ponechte prosím tento panel otevřený, dokud nepřipravíme váš soubor a nedešifrujeme ho.
|
||||
errorAltText
|
||||
.alt = Chyba při nahrávání souboru
|
||||
errorPageHeader = Nastala chyba!
|
||||
errorPageMessage = Při nahrávání souboru se vyskytl problém.
|
||||
errorPageLink = Poslat další soubor
|
||||
fileTooBig = Tento soubor je příliš veliký. Velikost nahrávaných souborů by neměla překročit { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Platnost odkazu vypršela
|
||||
expiredPageHeader = Platnost tohoto odkazu buď vypršela, nebo vůbec nikdy neexistoval.
|
||||
notSupportedHeader = Váš prohlížeč není podporován.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Bohužel tento prohlížeč nepodporuje technologii, kterou Firefox Send používá. Zkuste prosím jiný prohlížeč, doporučujeme Firefox!
|
||||
notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Firefox Send. Musíte aktualizovat svůj prohlížeč.
|
||||
updateFirefox = Aktualizovat Firefox
|
||||
downloadFirefoxButtonSub = Stáhnout zdarma
|
||||
uploadedFile = Soubor
|
||||
copyFileList = Kopírovat URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Platnost vyprší za
|
||||
deleteFileList = Smazat
|
||||
nevermindButton = Nevadí
|
||||
legalHeader = Podmínky a ochrana soukromí
|
||||
legalNoticeTestPilot = Firefox Send je ve fázi experimentu projektu Test Pilot a platí tak pro něj stejné <a>Podmínky používání</a> a <a>Zásady ochrany soukromí</a>. Více o tomto experimentu a sbíraných datech se dozvíte <a>zde</a>.
|
||||
legalNoticeMozilla = Používání webové služby Firefox Send se řídí <a>Zásadami ochrany soukromí</a> a <a>Podmínkami používání</a> webových stránek Mozilly.
|
||||
deletePopupText = Smazat tento soubor?
|
||||
deletePopupYes = Ano
|
||||
deletePopupCancel = Zrušit
|
||||
deleteButtonHover
|
||||
.title = Smazat
|
||||
copyUrlHover
|
||||
.title = Kopírovat URL
|
||||
footerLinkLegal = Právní informace
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = O programu Test Pilot
|
||||
footerLinkPrivacy = Soukromí
|
||||
footerLinkTerms = Podmínky
|
||||
footerLinkCookies = Cookies
|
||||
94
public/locales/cy/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = arbrawf gwe
|
||||
siteFeedback = Adborth
|
||||
uploadPageHeader = Rhannu Ffeiliau wedi eu Hamgryptio Preifat
|
||||
uploadPageExplainer = Anfon ffeiliau drwy ddolen diogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich pethau'n bodoli ar lein am byth.
|
||||
uploadPageLearnMore = Dysgu rhagor
|
||||
uploadPageDropMessage = Gollyngwch eich ffeiliau yma i gychwyn llwytho i fyny
|
||||
uploadPageSizeMessage = Mae'n well cadw maint y ffeiliau o dan 1GB er mwyn iddo weithio ar ei orau.
|
||||
uploadPageBrowseButton = Dewiswch ffeil ar eich cyfrifiadur
|
||||
.title = Dewiswch ffeil ar eich cyfrifiadur
|
||||
uploadPageMultipleFilesAlert = Nid yw llwytho nifer lluosog o ffeilia neu ffolder yn cael ei gynnal ar hyn o bryd.
|
||||
uploadPageBrowseButtonTitle = Llwytho ffeil i fyny
|
||||
uploadingPageHeader = Llwytho eich Ffeiliau i Fyny
|
||||
importingFile = Mewnforio…
|
||||
verifyingFile = Wrthi'n gwirio…
|
||||
encryptingFile = Wrthi'n amgryptio…
|
||||
decryptingFile = Wrthi'n dadgryptio…
|
||||
notifyUploadDone = Mae eich llwytho wedi gorffen.
|
||||
uploadingPageMessage = Unwaith y bydd eich ffeil wedi llwytho bydd modd gosod manylion dod i ben.
|
||||
uploadingPageCancel = Diddymu'r llwytho
|
||||
.title = Diddymu'r llwytho
|
||||
uploadCancelNotification = Cafodd eich llwytho ei ddiddymu.
|
||||
uploadingPageLargeFileMessage = Mae'r ffeil yn fawr a gall gymryd peth amser i'w llwytho. Arhoswch!
|
||||
uploadingFileNotification = Dweud wrtha i pan fydd y llwytho wedi gorffen.
|
||||
uploadSuccessConfirmHeader = Yn Barod i Anfon
|
||||
uploadSvgAlt
|
||||
.alt = LLwytho i Fyny
|
||||
uploadSuccessTimingHeader = Bydd y ddolen i'ch ffeil y dod i ben ar ôl 1 llwytho neu o fewn 24 awr.
|
||||
copyUrlFormLabelWithName = Copïo a rhannu'r ddolen i anfon eich ffeil: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copïo i'r clipfwrdd
|
||||
.title = Copïo i'r clipfwrdd
|
||||
copiedUrl = Wedi eu copïo!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Dileu ffeil
|
||||
.title = Dileu ffeil
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Anfon ffeil arall
|
||||
.title = Anfon ffeil arall
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Llwytho i lawr
|
||||
downloadFileName = Llwytho i lawr { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Mae ffrind i chi yn anfon ffeil atoch drwy Firefox Send, gwasanaeth sy'n caniatáu i chi rannu ffeiliau drwy ddolen ddiogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich deunydd yn aros ar-lein am byth.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Llwytho i Lawr
|
||||
.title = Llwytho i Lawr
|
||||
downloadNotification = Mae eich llwytho wedi gorffen
|
||||
downloadFinish = Llwytho wedi Gorffen
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Profwch Firefox Send
|
||||
.title = Profwch Firefox Send
|
||||
downloadingPageProgress = Llwytho i lawr { $filename } ({ $size })
|
||||
downloadingPageMessage = Gadewch y tab yma ar agor tra fyddwn yn estyn eich ffeil a'i dad-amgryptio.
|
||||
errorAltText
|
||||
.alt = Gwall llwytho
|
||||
errorPageHeader = Aeth rhywbeth o'i le!
|
||||
errorPageMessage = Bu gwall wrth lwytho'r ffeil.
|
||||
errorPageLink = Anfon ffeil arall
|
||||
fileTooBig = Mae'r ffeil yn rhy fawr i'w llwytho. Dylai fod yn llai na { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Mae'r ddolen wedi dod i ben
|
||||
expiredPageHeader = Mae'r ddolen wedi dod i ben neu nad yw wedi bodoli erioed!
|
||||
notSupportedHeader = Nid yw eich porwr yn cael ei gynnal.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Yn anffodus nid yw'r porwr hwn yn cynnal y technoleg gwe sy'n cynnal Firefox Send. Bydd angen i chi ddefnyddio porwr arall. Rydym ni'n argymell Firefox!
|
||||
notSupportedOutdatedDetail = Yn anffodus nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Firefox Send. Bydd angen i chi ddiweddaru eich porwr.
|
||||
updateFirefox = Diweddaru Firefox
|
||||
downloadFirefoxButtonSub = Llwytho i Lawr am Ddim
|
||||
uploadedFile = Ffeil
|
||||
copyFileList = Copïo URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Daw i ben ymhen
|
||||
deleteFileList = Dileu
|
||||
nevermindButton = Dim ots
|
||||
legalHeader = Amodau a Phreifatrwydd
|
||||
legalNoticeTestPilot = Ar hyn o mae Firefox Send yn arbrawf o fewn rhaglen Test Pilot ac yn destun <a>Amodau Gwasanaeth</a> a <a>Hysbysiad Preifatrwydd</a> Test Pilot . Gallwch ddysgu rhagor am yr arbrawf a'i gasglu data <a>yma</a>.
|
||||
legalNoticeMozilla = Mae'r defnydd o wefan Firefox Send hefyd yn destun <a>Hysbysiad Preifatrwydd Gwefannau</a> ac <a>Amodau Defnydd Gwefannau</a> Mozilla.
|
||||
deletePopupText = Dileu'r ffeil?
|
||||
deletePopupYes = Iawn
|
||||
deletePopupCancel = Diddymu
|
||||
deleteButtonHover
|
||||
.title = Dileu
|
||||
copyUrlHover
|
||||
.title = Copïo'r URL
|
||||
footerLinkLegal = Cyfreithiol
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Ynghylch Test Pilot
|
||||
footerLinkPrivacy = Preifatrwydd
|
||||
footerLinkTerms = Amodau
|
||||
footerLinkCookies = Cwcis
|
||||
94
public/locales/de/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = Web-Experiment
|
||||
siteFeedback = Feedback
|
||||
uploadPageHeader = Privates, verschlüsseltes Austauschen von Dateien
|
||||
uploadPageExplainer = Senden Sie Dateien über einen sicheren, privaten und verschlüsselten Link, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben.
|
||||
uploadPageLearnMore = Mehr erfahren
|
||||
uploadPageDropMessage = Ziehen Sie eine Datei zum Hochladen hierher
|
||||
uploadPageSizeMessage = Dateien unter 1 GB sorgen für erhöhte Zuverlässigkeit des Betriebs
|
||||
uploadPageBrowseButton = Wählen Sie eine Datei auf Ihrem Computer aus
|
||||
.title = Wählen Sie eine Datei auf Ihrem Computer aus
|
||||
uploadPageMultipleFilesAlert = Hochladen mehrerer Dateien oder eines Ordners wird derzeit nicht unterstützt.
|
||||
uploadPageBrowseButtonTitle = Datei hochladen
|
||||
uploadingPageHeader = Ihre Datei wird hochgeladen
|
||||
importingFile = Wird importiert…
|
||||
verifyingFile = Wird überprüft…
|
||||
encryptingFile = Wird verschlüsselt…
|
||||
decryptingFile = Wird entschlüsselt…
|
||||
notifyUploadDone = Ihr Upload ist abgeschlossen.
|
||||
uploadingPageMessage = Sobald Ihre Datei hochgeladen wird, können Sie die Optionen zum Ablaufdatum auswählen.
|
||||
uploadingPageCancel = Hochladen abbrechen
|
||||
.title = Hochladen abbrechen
|
||||
uploadCancelNotification = Ihr Upload wurde abgebrochen.
|
||||
uploadingPageLargeFileMessage = Diese Datei ist groß, sodass das hochladen einige Zeit dauern könnte. Haben Sie Geduld!
|
||||
uploadingFileNotification = Mich benachrichtigen, wenn der Upload abgeschlossen ist.
|
||||
uploadSuccessConfirmHeader = Bereit zum Senden
|
||||
uploadSvgAlt
|
||||
.alt = Hochladen
|
||||
uploadSuccessTimingHeader = Der Link zu Ihrer Datei läuft nach einem Download oder in 24 Stunden ab.
|
||||
copyUrlFormLabelWithName = Kopieren und teilen Sie den Link, um Ihre Datei zu senden: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = In Zwischenablage kopieren
|
||||
.title = In Zwischenablage kopieren
|
||||
copiedUrl = Kopiert!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Datei löschen
|
||||
.title = Datei löschen
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Eine weitere Datei senden
|
||||
.title = Eine weitere Datei senden
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Herunterladen
|
||||
downloadFileName = { $filename } herunterladen
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Ihr Freund schickt Ihnen eine Datei mit Firefox Send, einem Dienst, mit dem Sie Dateien über einen sicheren, privaten und verschlüsselten Link teilen können, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Herunterladen
|
||||
.title = Herunterladen
|
||||
downloadNotification = Der Download wurde abgeschlossen.
|
||||
downloadFinish = Download abgeschlossen
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Firefox Send ausprobieren
|
||||
.title = Firefox Send ausprobieren
|
||||
downloadingPageProgress = { $filename } ({ $size }) wird heruntergeladen
|
||||
downloadingPageMessage = Bitte lassen Sie diesen Tab geöffnet, während Ihre Datei heruntergeladen und entschlüsselt wird.
|
||||
errorAltText
|
||||
.alt = Fehler beim Hochladen
|
||||
errorPageHeader = Ein Fehler ist aufgetreten!
|
||||
errorPageMessage = Beim Hochladen der Datei ist ein Fehler aufgetreten.
|
||||
errorPageLink = Eine weitere Datei senden
|
||||
fileTooBig = Die Datei ist zu groß zum Hochladen. Sie sollte maximal { $size } groß sein.
|
||||
linkExpiredAlt
|
||||
.alt = Link abgelaufen
|
||||
expiredPageHeader = Dieser Link ist abgelaufen oder hat nie existiert!
|
||||
notSupportedHeader = Ihr Browser wird nicht unterstützt.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Leider unterstützt dieser Browser die Web-Technologie nicht, auf der Firefox Send basiert. Sie benötigen einen anderen Browser. Wir empfehlen Firefox!
|
||||
notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Firefox Send basiert. Sie müssen Ihren Browser aktualisieren.
|
||||
updateFirefox = Firefox aktualisieren
|
||||
downloadFirefoxButtonSub = Kostenloser Download
|
||||
uploadedFile = Datei
|
||||
copyFileList = Adresse kopieren
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Läuft ab in
|
||||
deleteFileList = Löschen
|
||||
nevermindButton = Egal
|
||||
legalHeader = Nutzungsbedingungen und Datenschutz
|
||||
legalNoticeTestPilot = Firefox Send ist aktuell ein Test-Pilot-Experiment und unterliegt den <a>Nutzungsbedingungen</a> und dem <a>Datenschutzhinweis</a> von Test Pilot. Mehr über diese Experiment und die Daten, die es sammelt, erfahren Sie <a>hier</a>.
|
||||
legalNoticeMozilla = Die Nutzung der Website von Firefox Send unterliegt außerdem Mozillas <a>Datenschutzhinweis für Websites</a> und <a>Nutzungsbedingungen für Websites</a>.
|
||||
deletePopupText = Diese Datei löschen?
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Abbrechen
|
||||
deleteButtonHover
|
||||
.title = Löschen
|
||||
copyUrlHover
|
||||
.title = Adresse kopieren
|
||||
footerLinkLegal = Rechtliches
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Über Test Pilot
|
||||
footerLinkPrivacy = Datenschutz
|
||||
footerLinkTerms = Nutzungsbedingungen
|
||||
footerLinkCookies = Cookies
|
||||
94
public/locales/dsb/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = webeksperiment
|
||||
siteFeedback = Komentar
|
||||
uploadPageHeader = Priwatne, skoděrowane źělenje datajow
|
||||
uploadPageExplainer = Pósćelśo dataje pśez wěsty, priwatny a skoděrowany wótkaz, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali.
|
||||
uploadPageLearnMore = Dalšne informacije
|
||||
uploadPageDropMessage = Śěgniśo swóju dataju sem, aby ju nagrał
|
||||
uploadPageSizeMessage = Wužywajśo nejlěpje dataje, kótarež su mjeńše ako 1 GB za lěpšu spušćobnosć.
|
||||
uploadPageBrowseButton = Wubjeŕśo dataju na swójom licadle
|
||||
.title = Wubjeŕśo dataju na swójom licadle
|
||||
uploadPageMultipleFilesAlert = Nagrawanje někotarych datajow abo zarědnika se tuchylu njepódpěra.
|
||||
uploadPageBrowseButtonTitle = Dataju nagraś
|
||||
uploadingPageHeader = Waša dataja se nagrawa
|
||||
importingFile = Importěrujo se...
|
||||
verifyingFile = Pśespytujo se...
|
||||
encryptingFile = Koděrujo se...
|
||||
decryptingFile = Dešifrěrujo se...
|
||||
notifyUploadDone = Wašo nagraśe jo dokóńcone.
|
||||
uploadingPageMessage = Gaž se waša dataja nagrawa, móžośo nastajenja spadnjenja póstajiś.
|
||||
uploadingPageCancel = Nagraśe pśetergnus
|
||||
.title = Nagraśe pśetergnus
|
||||
uploadCancelNotification = Wašo nagraśe jo se pśetergnuło.
|
||||
uploadingPageLargeFileMessage = Toś ta dataja jo wjelika a nagrawanje mógło chylku traś. Buźćo sćerpliwy!
|
||||
uploadingFileNotification = K wěsći daś, gaž nagraśe jo dokóńcone.
|
||||
uploadSuccessConfirmHeader = Gótowy za słanje
|
||||
uploadSvgAlt
|
||||
.alt = Nagraś
|
||||
uploadSuccessTimingHeader = Wótkaz k wašej dataji pó 1 ześěgnjenju abo 24 góźinach spadnjo.
|
||||
copyUrlFormLabelWithName = Kopěrujśo a źělśo wótkaz, aby swóju dataju pósłał: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Do mjazywótkłada kopěrowaś
|
||||
.title = Do mjazywótkłada kopěrowaś
|
||||
copiedUrl = Kopěrowany!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Dataju wulašowaś
|
||||
.title = Dataju wulašowaś
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Drugu dataju pósłaś
|
||||
.title = Drugu dataju pósłaś
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Ześěgnuś
|
||||
downloadFileName = { $filename } ześěgnuś
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Waš pśijaśel wam dataju z Firefox Send sćelo, słužba, kótaraž wam zmóžnja, dataje pśez wěsty, priwatny a skoděrowany wótkaz źěliś, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Ześěgnuś
|
||||
.title = Ześěgnuś
|
||||
downloadNotification = Wašo ześěgnjenje jo dokóńcone.
|
||||
downloadFinish = Ześěgnjenje dokóńcone
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Firefox Send wopytaś
|
||||
.title = Firefox Send wopytaś
|
||||
downloadingPageProgress = { $filename } ({ $size }) se ześěgujo
|
||||
downloadingPageMessage = Pšosym wóstajśo toś ten rejtark wócynjony, mjaztym až wašu dataju ześěgujomy a dešifrěrujomy.
|
||||
errorAltText
|
||||
.alt = Nagrawańska zmólka
|
||||
errorPageHeader = Něco njejo se raźiło!
|
||||
errorPageMessage = Pśi nagrawanju dataje jo zmólka nastała.
|
||||
errorPageLink = Drugu dataju pósłaś
|
||||
fileTooBig = Toś ta dataja jo pśewjelika za nagraśe. Měła mjeńša ako { $size } byś.
|
||||
linkExpiredAlt
|
||||
.alt = Wótkaz spadnjony
|
||||
expiredPageHeader = Toś ten wótkaz jo spadnjony abo njejo nigda eksistěrował!
|
||||
notSupportedHeader = Waš wobglědowak se njepódpěra.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Bóžko toś ten wobglědowak webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo drugi wobglědowak wužywaś. My Firefox dopórucujomy!
|
||||
notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś.
|
||||
updateFirefox = Firefox aktualizěrowaś
|
||||
downloadFirefoxButtonSub = Dermotne ześěgnjenje
|
||||
uploadedFile = Dataja
|
||||
copyFileList = URL kopěrowaś
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Spadnjo za
|
||||
deleteFileList = Wulašowaś
|
||||
nevermindButton = Wšojadno
|
||||
legalHeader = Wuměnjenja a priwatnosć
|
||||
legalNoticeTestPilot = Firefox jo tuchylu eksperiment Test Pilot, a pódlažy <a>wužywańskim wuměnjenjam</a> a <a>pokazce priwatnosći</a> Test Pilot. Wěcej wó toś tom eksperimenśe a daty, kótarež gromaźi, <a>how</a> zgónijośo.
|
||||
legalNoticeMozilla = Teke wužywanje websedła Firefox Send <a>pokazce priwatnosći za websedła</a> a <a>wužywańskim wuměnjenjam za websedła</a> Mozilla pódlažy.
|
||||
deletePopupText = Toś tu dataju lašowaś?
|
||||
deletePopupYes = Jo
|
||||
deletePopupCancel = Pśetergnuś
|
||||
deleteButtonHover
|
||||
.title = Wulašowaś
|
||||
copyUrlHover
|
||||
.title = URL kopěrowaś
|
||||
footerLinkLegal = Pšawniske
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Wó Test Pilot
|
||||
footerLinkPrivacy = Priwatnosć
|
||||
footerLinkTerms = Wuměnjenja
|
||||
footerLinkCookies = Cookieje
|
||||
77
public/locales/el/send.ftl
Normal file
@@ -0,0 +1,77 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = πείραμα διαδικτύου
|
||||
siteFeedback = Σχόλια
|
||||
uploadPageLearnMore = Μάθετε περισσότερα
|
||||
uploadPageDropMessage = Εναποθέστε το αρχείο σας εδώ για έναρξη μεταφόρτωσης
|
||||
uploadPageBrowseButton = Επιλέξτε αρχείο από τον υπολογιστή σας
|
||||
.title = Επιλέξτε αρχείο από τον υπολογιστή σας
|
||||
uploadPageMultipleFilesAlert = Η μεταφόρτωση πολλαπλών αρχείων ή φακέλου δεν υποστηρίζεται αυτή τη στιγμή.
|
||||
uploadPageBrowseButtonTitle = Μεταφόρτωση αρχείου
|
||||
uploadingPageHeader = Γίνετε μεταφόρτωση του αρχείου σας
|
||||
importingFile = Εισαγωγή…
|
||||
verifyingFile = Επαλήθευση...
|
||||
encryptingFile = Κρυπτογράφηση…
|
||||
decryptingFile = Αποκρυπτογράφηση…
|
||||
notifyUploadDone = Η μεταφόρτωσή σας ολοκληρώθηκε.
|
||||
uploadingPageCancel = Ακύρωση μεταφόρτωσης
|
||||
.title = Ακύρωση μεταφόρτωσης
|
||||
uploadCancelNotification = Η μεταφόρτωσή σας ακυρώθηκε.
|
||||
uploadingPageLargeFileMessage = Αυτό το αρχείο είναι μεγάλο και ίσως χρειαστεί λίγος αρκετός χρόνος για μεταφόρτωση. Χαλαρώστε!
|
||||
uploadingFileNotification = Ειδοποίηση όταν ολοκληρωθεί η μεταφόρτωση.
|
||||
uploadSuccessConfirmHeader = Έτοιμο για αποστολή
|
||||
uploadSvgAlt
|
||||
.alt = Μεταφόρτωση
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Αντιγραφή στο πρόχειρο
|
||||
.title = Αντιγραφή στο πρόχειρο
|
||||
copiedUrl = Αντιγράφτηκε!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Διαγραφή αρχείου
|
||||
.title = Διαγραφή αρχείου
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Αποστολή άλλου αρχείου
|
||||
.title = Αποστολή άλλου αρχείου
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Λήψη
|
||||
downloadFileName = Λήψη του { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Λήψη
|
||||
.title = Λήψη
|
||||
downloadNotification = Η λήψη σας ολοκληρώθηκε.
|
||||
downloadFinish = Η λήψη ολοκληρώθηκε
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Δοκιμάστε το Firefox Send
|
||||
.title = Δοκιμάστε το Firefox Send
|
||||
downloadingPageProgress = Γίνεται λήψη του { $filename } ({ $size })
|
||||
errorAltText
|
||||
.alt = Σφάλμα μεταφόρτωσης
|
||||
errorPageHeader = Κάτι πήγε στραβά!
|
||||
errorPageMessage = Παρουσιάστηκε σφάλμα κατά τη μεταφόρτωση του αρχείου.
|
||||
errorPageLink = Αποστολή άλλου αρχείου
|
||||
linkExpiredAlt
|
||||
.alt = Ο σύνδεσμος έληξε
|
||||
notSupportedHeader = Το πρόγραμμα περιήγησής σας δεν υποστηρίζεται.
|
||||
downloadFirefoxButtonSub = Δωρεάν λήψη
|
||||
uploadedFile = Αρχείο
|
||||
copyFileList = Αντιγραφή URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Λήγει σε
|
||||
deleteFileList = Διαγραφή
|
||||
nevermindButton = Μην ανησυχείτε
|
||||
legalHeader = Όροι & απόρρητο
|
||||
deletePopupText = Διαγραφή αρχείου;
|
||||
deletePopupYes = Ναι
|
||||
deletePopupCancel = Ακύρωση
|
||||
deleteButtonHover
|
||||
.title = Διαγραφή
|
||||
copyUrlHover
|
||||
.title = Αντιγραφή URL
|
||||
footerLinkLegal = Νομικά
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Σχετικά με το Test Pilot
|
||||
footerLinkPrivacy = Απόρρητο
|
||||
footerLinkTerms = Όροι
|
||||
footerLinkCookies = Cookies
|
||||
94
public/locales/en-US/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = web experiment
|
||||
siteFeedback = Feedback
|
||||
uploadPageHeader = Private, Encrypted File Sharing
|
||||
uploadPageExplainer = Send files through a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
|
||||
uploadPageLearnMore = Learn more
|
||||
uploadPageDropMessage = Drop your file here to start uploading
|
||||
uploadPageSizeMessage = For the most reliable operation, it’s best to keep your file under 1GB
|
||||
uploadPageBrowseButton = Select a file on your computer
|
||||
.title = Select a file on your computer
|
||||
uploadPageMultipleFilesAlert = Uploading multiple files or a folder is currently not supported.
|
||||
uploadPageBrowseButtonTitle = Upload file
|
||||
uploadingPageHeader = Uploading Your File
|
||||
importingFile = Importing…
|
||||
verifyingFile = Verifying…
|
||||
encryptingFile = Encrypting…
|
||||
decryptingFile = Decrypting…
|
||||
notifyUploadDone = Your upload has finished.
|
||||
uploadingPageMessage = Once your file uploads you will be able to set expiry options.
|
||||
uploadingPageCancel = Cancel upload
|
||||
.title = Cancel upload
|
||||
uploadCancelNotification = Your upload was cancelled.
|
||||
uploadingPageLargeFileMessage = This file is large and may take a while to upload. Sit tight!
|
||||
uploadingFileNotification = Notify me when the upload is complete.
|
||||
uploadSuccessConfirmHeader = Ready to Send
|
||||
uploadSvgAlt
|
||||
.alt = Upload
|
||||
uploadSuccessTimingHeader = The link to your file will expire after 1 download or in 24 hours.
|
||||
copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copy to clipboard
|
||||
.title = Copy to clipboard
|
||||
copiedUrl = Copied!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Delete file
|
||||
.title = Delete file
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Send another file
|
||||
.title = Send another file
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Download
|
||||
downloadFileName = Download { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Your friend is sending you a file with Firefox Send, a service that allows you to share files with a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Download
|
||||
.title = Download
|
||||
downloadNotification = Your download has completed.
|
||||
downloadFinish = Download Complete
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Try Firefox Send
|
||||
.title = Try Firefox Send
|
||||
downloadingPageProgress = Downloading { $filename } ({ $size })
|
||||
downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it.
|
||||
errorAltText
|
||||
.alt = Upload error
|
||||
errorPageHeader = Something went wrong!
|
||||
errorPageMessage = There has been an error uploading the file.
|
||||
errorPageLink = Send another file
|
||||
fileTooBig = That file is too big to upload. It should be less than { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Link expired
|
||||
expiredPageHeader = This link has expired or never existed in the first place!
|
||||
notSupportedHeader = Your browser is not supported.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Unfortunately this browser does not support the web technology that powers Firefox Send. You’ll need to try another browser. We recommend Firefox!
|
||||
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser.
|
||||
updateFirefox = Update Firefox
|
||||
downloadFirefoxButtonSub = Free Download
|
||||
uploadedFile = File
|
||||
copyFileList = Copy URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Expires In
|
||||
deleteFileList = Delete
|
||||
nevermindButton = Never mind
|
||||
legalHeader = Terms & Privacy
|
||||
legalNoticeTestPilot = Firefox Send is currently a Test Pilot experiment, and subject to the Test Pilot <a>Terms of Service</a> and <a>Privacy Notice</a>. You can learn more about this experiment and its data collection <a>here</a>.
|
||||
legalNoticeMozilla = Use of the Firefox Send website is also subject to Mozilla’s <a>Websites Privacy Notice</a> and <a>Websites Terms of Use</a>.
|
||||
deletePopupText = Delete this file?
|
||||
deletePopupYes = Yes
|
||||
deletePopupCancel = Cancel
|
||||
deleteButtonHover
|
||||
.title = Delete
|
||||
copyUrlHover
|
||||
.title = Copy URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = About Test Pilot
|
||||
footerLinkPrivacy = Privacy
|
||||
footerLinkTerms = Terms
|
||||
footerLinkCookies = Cookies
|
||||
87
public/locales/es-AR/send.ftl
Normal file
@@ -0,0 +1,87 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = experimento web
|
||||
siteFeedback = Opinión
|
||||
uploadPageHeader = Compartir archivos cifrados y privados
|
||||
uploadPageExplainer = Enviá archivos a través de un enlace cifrado, privado y seguro que expirará automáticamente para que tus datos no queden en línea para siempre.
|
||||
uploadPageLearnMore = Conocer más
|
||||
uploadPageDropMessage = Arrastrá el archivo hasta acá para empezar a subir
|
||||
uploadPageSizeMessage = Para una operación más confiable, es mejor que el archivo tenga menos de 1GB
|
||||
uploadPageBrowseButton = Seleccioná un archivo en tu computadora
|
||||
.title = Seleccioná un archivo en tu computadora
|
||||
uploadPageMultipleFilesAlert = Cargar múltiples archivos o una carpeta todavía no está soportado.
|
||||
uploadPageBrowseButtonTitle = Subir archivo
|
||||
uploadingPageHeader = Subiendo el archivo
|
||||
importingFile = Importando…
|
||||
verifyingFile = Verificando…
|
||||
encryptingFile = Cifrando…
|
||||
decryptingFile = Descifrando…
|
||||
notifyUploadDone = La carga ha terminado.
|
||||
uploadingPageMessage = Una vez que se cargue el archivo podrás modificar las opciones de expiración.
|
||||
uploadingPageCancel = Cancelar subida
|
||||
.title = Cancelar subida
|
||||
uploadCancelNotification = La subida fue cancelada.
|
||||
uploadingPageLargeFileMessage = El archivo es grande y puede tardar un rato en subir. ¡Quedate quieto!
|
||||
uploadingFileNotification = Notificarme cuando la subida se complete.
|
||||
uploadSuccessConfirmHeader = Listo para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Subir
|
||||
uploadSuccessTimingHeader = El enlace al archivo expirará después de 1 descarga o en 24 horas.
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar al portapapeles
|
||||
.title = Copiar al portapapeles
|
||||
copiedUrl = ¡Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Borrar archivo
|
||||
.title = Borrar archivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar otro archivo
|
||||
.title = Enviar otro archivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descargar
|
||||
downloadFileName = Descargar { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Tu amigo te está enviando un archivo con Firefox Send, un servicio que permite compartir archivos con un enlace cifrado, seguro y privado que expira automáticamente para asegurar que tus datos no quedan en línea para siempre.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descargar
|
||||
.title = Descargar
|
||||
downloadNotification = La descarga se completó.
|
||||
downloadFinish = Descarga completa
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Probá Firefox Send
|
||||
.title = Probá Firefox Send
|
||||
downloadingPageProgress = Descargando { $filename } ({ $size })
|
||||
downloadingPageMessage = Dejá esta pestaña abierta mientras descargamos el archivo y lo desciframos.
|
||||
errorAltText
|
||||
.alt = Error de subida
|
||||
errorPageHeader = ¡Algo falló!
|
||||
errorPageMessage = Hubo un error al subir el archivo.
|
||||
errorPageLink = Enviar otro archivo
|
||||
fileTooBig = El archivo es demasiado grande para subir. Debería tener menos de { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enlace explirado
|
||||
expiredPageHeader = ¡Este enlace ha expirado o nunca existió en primer lugar!
|
||||
notSupportedHeader = El navegador no está soportado.
|
||||
updateFirefox = Actualizar Firefox
|
||||
downloadFirefoxButtonSub = Descarga gratuita
|
||||
uploadedFile = Archivo
|
||||
copyFileList = Copiar URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Expira en
|
||||
deleteFileList = Borrar
|
||||
legalHeader = Términos y privacidad
|
||||
deletePopupText = ¿Borrar este archivo?
|
||||
deletePopupYes = Si
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Borrar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
footerLinkLegal = Legales
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Acerca de Test Pilot
|
||||
footerLinkPrivacy = Privacidad
|
||||
footerLinkTerms = Términos
|
||||
footerLinkCookies = Cookies
|
||||
89
public/locales/es-CL/send.ftl
Normal file
@@ -0,0 +1,89 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = experimento web
|
||||
siteFeedback = Comentarios
|
||||
uploadPageHeader = Compartir archivos de forma privada y cifrada
|
||||
uploadPageExplainer = Enviar archivos a través de un enlace seguro, privado y cifrado que automáticamente expira para asegurar que tus cosas no permanecerán en línea por la eternidad.
|
||||
uploadPageLearnMore = Aprender más
|
||||
uploadPageDropMessage = Suelta tu archivo aquí para empezar a subirlo
|
||||
uploadPageSizeMessage = Para una operación más confiable, es mejor mantener el tamaño del archivo bajo 1 GB
|
||||
uploadPageBrowseButton = Selecciona un archivo en tu computador
|
||||
uploadPageMultipleFilesAlert = Subir múltiples archivos o una carpeta actualmente no es posible.
|
||||
uploadPageBrowseButtonTitle = Subir archivo
|
||||
uploadingPageHeader = Subiendo tu archivo
|
||||
importingFile = Importando…
|
||||
verifyingFile = Verificando…
|
||||
encryptingFile = Cifrando…
|
||||
decryptingFile = Descifrando…
|
||||
notifyUploadDone = Tu subida ha terminado.
|
||||
uploadingPageMessage = Una vez que tu archivo sea subido podrás ajustar las opciones de expiración.
|
||||
uploadingPageCancel = Cancelar subida
|
||||
uploadCancelNotification = Tu subida fue cancelada.
|
||||
uploadingPageLargeFileMessage = Este archivo es grande y puede tardar un rato en subir. ¡Aprovecha de hacer algo mientras!
|
||||
uploadingFileNotification = Notificarme cuando la subida sea completada.
|
||||
uploadSuccessConfirmHeader = Listo para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Subir
|
||||
uploadSuccessTimingHeader = El enlace a tu archivo expirará tras 1 descarga o en 24 horas.
|
||||
copyUrlFormLabelWithName = Copia y comparte el enlace para enviar tu archivo: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar al portapapeles
|
||||
copiedUrl = ¡Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Eliminar archivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar otro archivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descargar
|
||||
downloadFileName = Descargar { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Tu amigo te está enviando un archivo con Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que expira automáticamente para asegurar que tus cosas no queden en línea de por vida.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descargar
|
||||
downloadNotification = Tu descarga se completó.
|
||||
downloadFinish = Descarga completa
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Probar Firefox Send
|
||||
downloadingPageProgress = Descargando { $filename } ({ $size })
|
||||
downloadingPageMessage = Por favor, deja esta pestaña abierta mientras recibimos tu archivo y lo desciframos.
|
||||
errorAltText = Error de subida
|
||||
errorPageHeader = ¡Algo se fue a las pailas!
|
||||
errorPageMessage = Hubo un error al subir el archivo.
|
||||
errorPageLink = Enviar otro archivo
|
||||
fileTooBig = Ese archivo es muy grande para ser subido. Debiera tener un tamaño menor a { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enlace expirado
|
||||
expiredPageHeader = ¡Este enlace ha expirado o quizá jamás existió!
|
||||
notSupportedHeader = Tu navegador no está soportado.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Lamentablemente este navegador no soporta la tecnología web que potencia a Firefox Send. Deberás probar en otro navegador. ¡Recomendamos Firefox!
|
||||
notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador.
|
||||
updateFirefox = Actualizar Firefox
|
||||
downloadFirefoxButtonSub = Descarga gratuita
|
||||
uploadedFile = Archivo
|
||||
copyFileList = Copiar URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Expira en
|
||||
deleteFileList = Eliminar
|
||||
nevermindButton = Da lo mismo
|
||||
legalHeader = Términos y privacidad
|
||||
legalNoticeTestPilot =
|
||||
Firefox Send es actualmente un experimento de Test Pilot, y está sujeto a los <a>Términos del servicio</a> y la <a>Política de privacidad</a> de Test Pilot. Puedes aprender más sobre este experimento y su recolección de datos <a>aquí</a>.
|
||||
|
||||
|
||||
legalNoticeMozilla = El uso del sitio web de Firefox Send también está sujeto a la <a>Política de privacidad de sitios web</a> y los <a>Términos de uso de sitios web</a> de Mozilla.
|
||||
deletePopupText = ¿Eliminar este archivo?
|
||||
deletePopupYes = Sí
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Eliminar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Acerca de Test Pilot
|
||||
footerLinkPrivacy = Privacidad
|
||||
footerLinkTerms = Términos
|
||||
footerLinkCookies = Cookies
|
||||
92
public/locales/es-ES/send.ftl
Normal file
@@ -0,0 +1,92 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = experimento web
|
||||
siteFeedback = Comentario
|
||||
uploadPageHeader = Compartir archivos encriptados y privados
|
||||
uploadPageExplainer = Envía archivos a través de un enlace encriptado, privado y seguro que caducará automáticamente para que tus datos no sean accesibles en línea de por vida.
|
||||
uploadPageLearnMore = Descubre más
|
||||
uploadPageDropMessage = Suelta aquí tu archivo para empezar a subirlo
|
||||
uploadPageSizeMessage = Para que la operación sea más segura, el archivo debería ocupar menos de 1GB
|
||||
uploadPageBrowseButton = Seleccionar un archivo en el equipo
|
||||
.title = Seleccionar un archivo en el equipo
|
||||
uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta.
|
||||
uploadPageBrowseButtonTitle = Subir archivo
|
||||
uploadingPageHeader = Subiendo archivo
|
||||
importingFile = Imporando...
|
||||
verifyingFile = Comprobando...
|
||||
encryptingFile = Encriptando...
|
||||
decryptingFile = Desencriptando...
|
||||
notifyUploadDone = La subida ha finalizado.
|
||||
uploadingPageMessage = Cuando se suba tu archivo podrás condigurar las opciones de caducidad.
|
||||
uploadingPageCancel = Cancelar subida
|
||||
.title = Cancelar subida
|
||||
uploadCancelNotification = Se canceló la subida.
|
||||
uploadingPageLargeFileMessage = El archivo es grande y puede tardar unos minutos en subirse. ¡Tómatelo con calma!
|
||||
uploadingFileNotification = Notificarme cuando se complete la subida.
|
||||
uploadSuccessConfirmHeader = Listo para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Subir
|
||||
uploadSuccessTimingHeader = El enlace al archivo caducará tras descargarlo una vez o en 24 horas.
|
||||
copyUrlFormLabelWithName = Copiar y compartir el enlace para enviar tu archivo: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar en el portapapeles
|
||||
.title = Copiar en el portapapeles
|
||||
copiedUrl = ¡Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Eliminar archivo
|
||||
.title = Eliminar archivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar otro archivo
|
||||
.title = Enviar otro archivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descargar
|
||||
downloadFileName = Descargar { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y encriptado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descargar
|
||||
.title = Descargar
|
||||
downloadNotification = Se completó la descarga.
|
||||
downloadFinish = Descarga completa
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Prueba Firefox Send
|
||||
.title = Prueba Firefox Send
|
||||
downloadingPageProgress = Descargando { $filename } ({ $size })
|
||||
downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos.
|
||||
errorAltText
|
||||
.alt = Error en la subida
|
||||
errorPageHeader = ¡Se produjo un error!
|
||||
errorPageMessage = Se produjo un error al subir el archivo.
|
||||
errorPageLink = Enviar otro archivo
|
||||
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enlace caducado
|
||||
expiredPageHeader = ¡El enlace ha caducado o nunca existió!
|
||||
notSupportedHeader = Tu navegador no está admitido.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox!
|
||||
downloadFirefoxButtonSub = Descarga gratuita
|
||||
uploadedFile = Archivo
|
||||
copyFileList = Copiar URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Caduca en
|
||||
deleteFileList = Eliminar
|
||||
nevermindButton = Da igual
|
||||
legalHeader = Términos y privacidad
|
||||
legalNoticeTestPilot = Firefox Send sigue siendo un experimento de Test Pilot y está sujero a las <a>Condiciones del servicio</a> y al <a>Aviso de privacidad</a> de Test Pilot.
|
||||
legalNoticeMozilla = El uso de la página de Firefox Send también está sujeto al <a>Aviso de privacidad sobre sitios web</a> y a los <a>Términos de uso sobre sitios web</a>.
|
||||
deletePopupText = ¿Eliminar el archivo?
|
||||
deletePopupYes = Sí
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Eliminar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Sobre Test Pilot
|
||||
footerLinkPrivacy = Privacidad
|
||||
footerLinkTerms = Términos
|
||||
footerLinkCookies = Cookies
|
||||
65
public/locales/es-MX/send.ftl
Normal file
@@ -0,0 +1,65 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = experimento web
|
||||
siteFeedback = Comentario
|
||||
uploadPageHeader = Compartir archivos encriptados y privados
|
||||
uploadPageExplainer = Enviar archivos a través de un enlace encriptado, privado y seguro que caducará automáticamente para que tus datos no sean accesibles en línea de por vida.
|
||||
uploadPageLearnMore = Saber más
|
||||
uploadPageDropMessage = Suelta aquí tu archivo para empezar a subirlo
|
||||
uploadPageSizeMessage = Para que la operación sea más segura, el archivo debería ocupar menos de 1GB
|
||||
uploadPageBrowseButton = Selecciona un archivo de tu computadora
|
||||
.title = Selecciona un archivo de tu computadora
|
||||
uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta.
|
||||
uploadPageBrowseButtonTitle = Subir archivo
|
||||
uploadingPageHeader = Subiendo tu archivo
|
||||
importingFile = Importando...
|
||||
verifyingFile = Verificando...
|
||||
encryptingFile = Encriptando...
|
||||
decryptingFile = Desencriptando...
|
||||
notifyUploadDone = La subida ha terminado.
|
||||
uploadingPageMessage = Una vez que tu archivo haya subido podrás configurar las opciones de caducidad.
|
||||
uploadingPageCancel = Cancelar subida
|
||||
.title = Cancelar subida
|
||||
uploadCancelNotification = Se canceló la subida.
|
||||
uploadingPageLargeFileMessage = Este archivo es grande y puede tomar un rato para que suba. ¡Mantente tranquilo!
|
||||
uploadingFileNotification = Avísame cuando la subida del archivo esté completa.
|
||||
uploadSuccessConfirmHeader = Listo para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Subir
|
||||
uploadSuccessTimingHeader = El enlace a tu archivo expirará después de una descarga o en 24 horas.
|
||||
copyUrlFormLabelWithName = Copiar y compartir el enlace para enviar tu archivo: ($filename)
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar a portapapeles
|
||||
.title = Copiar a portapapeles
|
||||
copiedUrl = ¡Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Eliminar archivo
|
||||
.title = Eliminar archivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar otro archivo
|
||||
.title = Enviar otro archivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descargar
|
||||
downloadFileName = Descargar ($filename)
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y encriptado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descargar
|
||||
.title = Descargar
|
||||
downloadNotification = Tu descarga se ha completado
|
||||
downloadFinish = Descarga completa
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Prueba Firefox Send
|
||||
.title = Prueba Firefox Send
|
||||
downloadingPageProgress = Descargando { $filename } ({ $size })
|
||||
downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos.
|
||||
errorAltText
|
||||
.alt = Error en la subida
|
||||
errorPageHeader = ¡Algo salió mal!
|
||||
errorPageMessage = Ha ocurrido un error mientras subiamos tu archivo.
|
||||
errorPageLink = Enviar otro archivo
|
||||
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enlace caducado
|
||||
94
public/locales/fr/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = expérience web
|
||||
siteFeedback = Votre avis
|
||||
uploadPageHeader = Partage de fichiers de façon confidentielle et chiffrée
|
||||
uploadPageExplainer = Envoyez des fichiers de façon sécurisée, confidentielle et chiffrée, via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment.
|
||||
uploadPageLearnMore = En savoir plus
|
||||
uploadPageDropMessage = Déposez votre fichier ici pour l’envoyer
|
||||
uploadPageSizeMessage = Pour un résultat fiable, il est conseillé d’utiliser des fichiers de taille inférieure à 1 Go
|
||||
uploadPageBrowseButton = Sélectionner un fichier sur l’ordinateur
|
||||
.title = Sélectionner un fichier sur l’ordinateur
|
||||
uploadPageMultipleFilesAlert = L’envoi de plusieurs fichiers ou de dossiers n’est pas pris en charge pour le moment.
|
||||
uploadPageBrowseButtonTitle = Envoyer le fichier
|
||||
uploadingPageHeader = Envoi du fichier en cours
|
||||
importingFile = Importation…
|
||||
verifyingFile = Vérification…
|
||||
encryptingFile = Chiffrement…
|
||||
decryptingFile = Déchiffrement…
|
||||
notifyUploadDone = L’envoi est terminé.
|
||||
uploadingPageMessage = Une fois l’envoi terminé, vous serez en mesure de régler les options d’expiration.
|
||||
uploadingPageCancel = Annuler l’envoi
|
||||
.title = Annuler l’envoi
|
||||
uploadCancelNotification = L’envoi a été annulé.
|
||||
uploadingPageLargeFileMessage = Ce fichier est volumineux et son envoi peut prendre un peu de temps.
|
||||
uploadingFileNotification = M’envoyer une notification lorsque l’envoi est terminé.
|
||||
uploadSuccessConfirmHeader = Paré à l’envoi
|
||||
uploadSvgAlt
|
||||
.alt = Envoyer
|
||||
uploadSuccessTimingHeader = Le lien vers votre fichier expirera après le premier téléchargement ou au bout de 24 heures.
|
||||
copyUrlFormLabelWithName = Copiez et partagez le lien pour envoyer votre fichier : { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copier dans le presse-papiers
|
||||
.title = Copier dans le presse-papiers
|
||||
copiedUrl = Lien copié !
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Supprimer le fichier
|
||||
.title = Supprimer le fichier
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Envoyer un autre fichier
|
||||
.title = Envoyer un autre fichier
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Télécharger
|
||||
downloadFileName = Télécharger { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Votre ami⋅e vous a envoyé un fichier avec Firefox Send, un service qui permet d’envoyer des fichiers de façon sécurisée, confidentielle et chiffrée via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Télécharger
|
||||
.title = Télécharger
|
||||
downloadNotification = Le téléchargement est terminé.
|
||||
downloadFinish = Téléchargement terminé
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Essayer Firefox Send
|
||||
.title = Essayer Firefox Send
|
||||
downloadingPageProgress = Téléchargement en cours de { $filename } ({ $size })
|
||||
downloadingPageMessage = Merci de laisser cet onglet ouvert pendant que nous récupérons le fichier et que nous le déchiffrons.
|
||||
errorAltText
|
||||
.alt = Erreur lors de l’envoi
|
||||
errorPageHeader = Une erreur s’est produite.
|
||||
errorPageMessage = Une erreur s’est produite lors de l’envoi du fichier.
|
||||
errorPageLink = Envoyer un autre fichier
|
||||
fileTooBig = Ce fichier est trop volumineux pour être envoyé. Sa taille doit être inférieure à { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Le lien a expiré
|
||||
expiredPageHeader = Ce lien a expiré ou n’a jamais existé.
|
||||
notSupportedHeader = Votre navigateur n’est pas pris en charge.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Malheureusement, ce navigateur ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devrez utiliser un autre navigateur. Nous vous recommandons Firefox !
|
||||
notSupportedOutdatedDetail = Malheureusement, cette version de Firefox ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devez mettre à jour votre navigateur.
|
||||
updateFirefox = Mettre à jour Firefox
|
||||
downloadFirefoxButtonSub = Téléchargement gratuit
|
||||
uploadedFile = Fichier
|
||||
copyFileList = Copier le lien
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Expire dans
|
||||
deleteFileList = Supprimer
|
||||
nevermindButton = Non merci
|
||||
legalHeader = Confidentialité et conditions d’utilisation
|
||||
legalNoticeTestPilot = Firefox Send est actuellement une expérience Test Pilot, et en tant que tel est soumis aux <a>conditions d’utilisation</a> et à la <a>politique de confidentialité</a> de Test Pilot. Vous pouvez en apprendre plus sur cette expérience et sur la collecte de données <a>ici</a>.
|
||||
legalNoticeMozilla = L’utilisation du site web Firefox Send est aussi soumise à <a>l’avis de confidentialité relatif aux sites Web</a> ainsi qu’aux <a>conditions d’utilisation des sites Web</a> de Mozilla.
|
||||
deletePopupText = Supprimer ce fichier ?
|
||||
deletePopupYes = Oui
|
||||
deletePopupCancel = Annuler
|
||||
deleteButtonHover
|
||||
.title = Supprimer
|
||||
copyUrlHover
|
||||
.title = Copier le lien
|
||||
footerLinkLegal = Mentions légales
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = À propos de Test Pilot
|
||||
footerLinkPrivacy = Confidentialité
|
||||
footerLinkTerms = Conditions d’utilisation
|
||||
footerLinkCookies = Cookies
|
||||
94
public/locales/fy-NL/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = webeksperiment
|
||||
siteFeedback = Kommentaar
|
||||
uploadPageHeader = Privee, fersifere bestânsdieling
|
||||
uploadPageExplainer = Ferstjoer bestannen troch in feilich, privee en fersifere keppeling dy't automatysk ferrint, om foar te kommen dat jo guod net foar altyd online bliuwt.
|
||||
uploadPageLearnMore = Mear ynfo
|
||||
uploadPageDropMessage = Sleep jo bestân hjir hinne om opladen te starten
|
||||
uploadPageSizeMessage = Foar de meast betrouber wurking, is it it bêste om jo bestân lytser as 1 GB te hâlden
|
||||
uploadPageBrowseButton = Selektearje in bestân op jo kompjûter
|
||||
.title = Selektearje in bestân op jo kompjûter
|
||||
uploadPageMultipleFilesAlert = Opladen fan mear bestannen tagelyk of in map wurdt op dit stuit net stipe.
|
||||
uploadPageBrowseButtonTitle = Bestân oplade
|
||||
uploadingPageHeader = Jo bestân wurdt opladen
|
||||
importingFile = Ymportearje…
|
||||
verifyingFile = Ferifiearje…
|
||||
encryptingFile = Fersiferje…
|
||||
decryptingFile = Untsiferje…
|
||||
notifyUploadDone = Jo oplaad is foltôge.
|
||||
uploadingPageMessage = Sa gau as jo bestân opladen wurdt, kinne jo de opsjes foar de ferrindatum ynstelle.
|
||||
uploadingPageCancel = Opladen annulearje
|
||||
.title = Opladen annulearje
|
||||
uploadCancelNotification = Jo oplaad is annulearre.
|
||||
uploadingPageLargeFileMessage = Dit is in grut bestân en it opladen kin efkes duorje. In amerijke!
|
||||
uploadingFileNotification = Jou in melding as de oplaad foltôge is.
|
||||
uploadSuccessConfirmHeader = Ree om te ferstjoeren
|
||||
uploadSvgAlt
|
||||
.alt = Oplaad
|
||||
uploadSuccessTimingHeader = De keppeling nei jo bestân sil nei 1 download ferrinne of nei 24 oeren.
|
||||
copyUrlFormLabelWithName = Kopiearje en diel de keppeling om jo bestân te ferstjoeren: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Nei klamboerd kopiearje
|
||||
.title = Nei klamboerd kopiearje
|
||||
copiedUrl = Kopiearre!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Bestân fuortsmite
|
||||
.title = Bestân fuortsmite
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Noch in bestân ferstjoere
|
||||
.title = Noch in bestân ferstjoere
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Downloade
|
||||
downloadFileName = { $filename } downloade
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Jo freon stjoert jo in best^n mei Firefox Send, in tsjinst dy't jo yn steat stelt bestannen te dielen mei in feilige, privee en fersifere keppeling dy't automatysk ferrint om wis te wêzen dat jo guod net foar altyd online bliuwt.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Downloade
|
||||
.title = Downloade
|
||||
downloadNotification = Jo download is foltôge.
|
||||
downloadFinish = Download foltôge
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Firefox Send probearje
|
||||
.title = Firefox Send probearje
|
||||
downloadingPageProgress = { $filename } ({ $size }) wurdt download
|
||||
downloadingPageMessage = Lit dit ljepblêd iepen wylst wy jo bestân krije en ûntsiferje.
|
||||
errorAltText
|
||||
.alt = Oplaadflater
|
||||
errorPageHeader = Der is wat misgien!
|
||||
errorPageMessage = Der is in flater bard wylst it opladen fan jo bestân.
|
||||
errorPageLink = Noch in bestân ferstjoere
|
||||
fileTooBig = It bestân is te grut om op te laden. It moat lytser wêze as { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Keppeling ferrûn
|
||||
expiredPageHeader = Dizze keppeling is ferrûn of hat nea bestien!
|
||||
notSupportedHeader = Jo browser wurdt net stipe.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Spitigernôch stipet dizze browser de webtechnology dy't Firefox Send mooglik makket net. Jo moatte in oare browser probearje. Wy rekommandearje Firefox!
|
||||
notSupportedOutdatedDetail = Spitigernôch stipet dizze ferzje fan Firefox de webtechnology dy't Firefox Send mooflik makket net. Jo moatte jo browser fernije.
|
||||
updateFirefox = Firefox fernije
|
||||
downloadFirefoxButtonSub = Fergese download
|
||||
uploadedFile = Bestân
|
||||
copyFileList = URL kopiearje
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Ferrint oer
|
||||
deleteFileList = Fuortsmite
|
||||
nevermindButton = Lit mar
|
||||
legalHeader = Betingsten en privacy
|
||||
legalNoticeTestPilot = Firefox Send is op dit stuit in Test Pilot-eksperimint en falt ûnder de <a>Betingsten</a> en <a>Privacybelied</a> fan Test Pilot. Mear ynformaasje oer dit eksperimint en de gegevenssamling stiet<a>hjir</a>.
|
||||
legalNoticeMozilla = Gebrûk fan de Firefox Send-website falt ek ûnder it <a>Websites Privacybelied</a> en <a>Websites Gebrûksbetingsten</a> fan Mozilla.
|
||||
deletePopupText = Dit bestân fuortsmite
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Annulearje
|
||||
deleteButtonHover
|
||||
.title = Fuortsmite
|
||||
copyUrlHover
|
||||
.title = URL kopiearje
|
||||
footerLinkLegal = Juridysk
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Oer Test Pilot
|
||||
footerLinkPrivacy = Privacy
|
||||
footerLinkTerms = Betingsten
|
||||
footerLinkCookies = Cookies
|
||||
94
public/locales/hsb/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = webeksperiment
|
||||
siteFeedback = Komentar
|
||||
uploadPageHeader = Priwatne, zaklučowane dźělenje datajow
|
||||
uploadPageExplainer = Pósćelće dataje přez wěsty, priwatny a zaklučowany wotkaz, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostali.
|
||||
uploadPageLearnMore = Dalše informacije
|
||||
uploadPageDropMessage = Ćehńće swoju dataju sem, zo byšće ju nahrał
|
||||
uploadPageSizeMessage = Wužiwajće najlěpje dataje, kotrež su mjeńše hač 1 GB za lěpšu spušćomnosć.
|
||||
uploadPageBrowseButton = Wubjerće dataju na swojim ličaku
|
||||
.title = Wubjerće dataju na swojim ličaku
|
||||
uploadPageMultipleFilesAlert = Nahrawanje wjacorych datajow abo rjadowaka so tuchwilu njepodpěruje.
|
||||
uploadPageBrowseButtonTitle = Dataju nahrać
|
||||
uploadingPageHeader = Waša dataja so nahrawa
|
||||
importingFile = Importuje so...
|
||||
verifyingFile = Přepruwuje so...
|
||||
encryptingFile = Zaklučuje so...
|
||||
decryptingFile = Dešifruje so...
|
||||
notifyUploadDone = Waše nahraće je dokónčene.
|
||||
uploadingPageMessage = Hdyž so waša dataja nahrawa, móžeće nastajenja spadnjenja postajić.
|
||||
uploadingPageCancel = Nahraće přetorhnyć
|
||||
.title = Nahraće přetorhnyć
|
||||
uploadCancelNotification = Waše nahraće je so přetorhnyło.
|
||||
uploadingPageLargeFileMessage = Tuta dataja je wulka a nahrawanje móhło chwilku trać. Budźće sćerpliwy!
|
||||
uploadingFileNotification = Zdźělić, hdyž nahraće je dokónčene.
|
||||
uploadSuccessConfirmHeader = Hotowy za słanje
|
||||
uploadSvgAlt
|
||||
.alt = Nahrać
|
||||
uploadSuccessTimingHeader = Wotkaz k wašej dataji po 1 sćehnjenju abo 24 hodźinach spadnje.
|
||||
copyUrlFormLabelWithName = Kopěrujće a dźělće wotkaz, zo byšće swoju dataju pósłał: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Do mjezyskłada kopěrować
|
||||
.title = Do mjezyskłada kopěrować
|
||||
copiedUrl = Kopěrowany!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Dataju zhašeć
|
||||
.title = Dataju zhašeć
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Druhu dataju pósłać
|
||||
.title = Druhu dataju pósłać
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Sćahnyć
|
||||
downloadFileName = { $filename } sćahnyć
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Waš přećel wam dataju z Firefox Send sćele, słužba, kotraž wam zmóžnja, dataje přez wěsty, priwatny a zaklučowany wotkaz dźělić, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostawali.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Sćahnyć
|
||||
.title = Sćahnyć
|
||||
downloadNotification = Waše sćehnjenje je dokónčene.
|
||||
downloadFinish = Sćehnjenje dokónčene
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Firefox Send wupruwować
|
||||
.title = Firefox Send wupruwować
|
||||
downloadingPageProgress = { $filename } ({ $size }) so sćahuje
|
||||
downloadingPageMessage = Prošu wostajće tutón rajtark wočinjeny, mjeztym zo wašu dataju sćahujemy a dešifrujemy.
|
||||
errorAltText
|
||||
.alt = Nahrawanski zmylk
|
||||
errorPageHeader = Něšto je so nimokuliło!
|
||||
errorPageMessage = Při nahrawanju dataje je zmylk wustupił.
|
||||
errorPageLink = Druhu dataju pósłać
|
||||
fileTooBig = Tuta dataja je přewulka za nahraće. Měła mjeńša hač { $size } być.
|
||||
linkExpiredAlt
|
||||
.alt = Wotkaz je spadnjeny
|
||||
expiredPageHeader = Tutón wotkaz je spadnjeny abo njeje ženje eksistował!
|
||||
notSupportedHeader = Waš wobhladowak so njepodpěruje.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Bohužel tutón wobhladowak webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće druhi wobhladowak wužiwać. My Firefox doporučemy!
|
||||
notSupportedOutdatedDetail = Bohužel tuta wersija Firefox webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće swój wobhladowak aktualizować.
|
||||
updateFirefox = Firefox aktualizować
|
||||
downloadFirefoxButtonSub = Darmotne sćehnjenje
|
||||
uploadedFile = Dataja
|
||||
copyFileList = URL kopěrować
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Spadnje za
|
||||
deleteFileList = Zhašeć
|
||||
nevermindButton = Wšojedne
|
||||
legalHeader = Wuměnjenja a priwatnosć
|
||||
legalNoticeTestPilot = Firefox je tuchwilu eksperiment Test Pilot, a podleži <a>wužiwanskim wuměnjenjam</a> a <a>pokazce priwatnosće</a> Test Pilot. Wjace wo tutym eksperimenće a daty, kotrež hromadźi, <a>tu</a> zhoniće.
|
||||
legalNoticeMozilla = Tež wužiwanje websydła Firefox Send <a>pokazce priwatnosće za websydła</a> a <a>wužiwanskim wuměnjenjam za websydła</a> Mozilla podleži.
|
||||
deletePopupText = Tutu dataju zhašeć?
|
||||
deletePopupYes = Haj
|
||||
deletePopupCancel = Přetorhnyć
|
||||
deleteButtonHover
|
||||
.title = Zhašeć
|
||||
copyUrlHover
|
||||
.title = URL kopěrować
|
||||
footerLinkLegal = Prawniske
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Wo Test Pilot
|
||||
footerLinkPrivacy = Priwatnosć
|
||||
footerLinkTerms = Wuměnjenja
|
||||
footerLinkCookies = Placki
|
||||
94
public/locales/hu/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = webes kísérlet
|
||||
siteFeedback = Visszajelzés
|
||||
uploadPageHeader = Privát, titkosított fájlmegosztás
|
||||
uploadPageExplainer = Küldjön át fájlokat biztonságos, privát és titkosított hivatkozáson keresztül, amely automatikusan elévül, hogy ne maradjanak a dolgai örökké online.
|
||||
uploadPageLearnMore = Tudjon meg többet
|
||||
uploadPageDropMessage = Dobja ide a fájljait, és kezdjen feltölteni
|
||||
uploadPageSizeMessage = A megbízható működés érdekében a legjobb, ha a fájlok 1 GB-nál kisebbek maradnak
|
||||
uploadPageBrowseButton = Válasszon egy fájlt a számítógépén
|
||||
.title = Válasszon egy fájlt a számítógépén
|
||||
uploadPageMultipleFilesAlert = Több fájl vagy mappa feltöltése pillanatnyilag nem támogatott.
|
||||
uploadPageBrowseButtonTitle = Fájl feltöltése
|
||||
uploadingPageHeader = A fájlja feltöltése
|
||||
importingFile = Importálás…
|
||||
verifyingFile = Ellenőrzés…
|
||||
encryptingFile = Titkosítás…
|
||||
decryptingFile = Visszafejtés…
|
||||
notifyUploadDone = A feltöltése befejeződött.
|
||||
uploadingPageMessage = Ha a fájl feltöltésre került, akkor megadhatja a lejárati beállításokat.
|
||||
uploadingPageCancel = Feltöltés megszakítása
|
||||
.title = Feltöltés megszakítása
|
||||
uploadCancelNotification = A feltöltés megszakításra került.
|
||||
uploadingPageLargeFileMessage = Ez a fájl nagy, és a feltöltése eltarthat egy ideig. Türelmét kérjük!
|
||||
uploadingFileNotification = Értesítsen, ha a feltöltés elkészült.
|
||||
uploadSuccessConfirmHeader = Küldésre kész
|
||||
uploadSvgAlt
|
||||
.alt = Feltöltés
|
||||
uploadSuccessTimingHeader = A fájl hivatkozása lejár 1 letöltés vagy 24 óra múlva.
|
||||
copyUrlFormLabelWithName = Másolja és ossza meg a hivatkozást a fájl küldéséhez: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Vágólapra másolás
|
||||
.title = Vágólapra másolás
|
||||
copiedUrl = Másolva!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Fájl törlése
|
||||
.title = Fájl törlése
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Még egy fájl küldése
|
||||
.title = Még egy fájl küldése
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Letöltés
|
||||
downloadFileName = { $filename } letöltése
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Az ismerőse egy fájlt küld a Firefox Senddel, egy olyan fájlmegosztó szolgáltatással, amely biztonságos, privát és titkosított hivatkozáson keresztül működik, amely automatikusan elévül, így biztosítva hogy a dolga ne maradjon örökre online.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Letöltés
|
||||
.title = Letöltés
|
||||
downloadNotification = A letöltés befejeződött.
|
||||
downloadFinish = A letöltés befejeződött
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Próbálja ki a Firefox Sendet
|
||||
.title = Próbálja ki a Firefox Sendet
|
||||
downloadingPageProgress = { $filename } letöltése ({ $size })
|
||||
downloadingPageMessage = Hagyja nyitva ezt a lapot, amíg lekérésre és visszafejtésre kerül a fájlja.
|
||||
errorAltText
|
||||
.alt = Feltöltési hiba
|
||||
errorPageHeader = Hiba történt!
|
||||
errorPageMessage = Hiba történt a fájl feltöltésekor.
|
||||
errorPageLink = Még egy fájl küldése
|
||||
fileTooBig = Ez a fájl túl nagy a feltöltéshez. Kevesebb mint { $size } kell legyen.
|
||||
linkExpiredAlt
|
||||
.alt = A hivatkozás lejárt
|
||||
expiredPageHeader = Ez a hivatkozás lejárt, vagy sosem létezett!
|
||||
notSupportedHeader = A böngésző nem támogatott.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Sajnos ez a böngésző nem támogatja a Firefox Send alapját képező webes technológiát. Egy másik böngészőben kell megpróbálnia. Mi a Firefoxot javasoljuk!
|
||||
notSupportedOutdatedDetail = Sajnos a Firefox ezen verziója nem támogatja a Firefox Send alapját képező technológiát. Frissítenie kell a böngészőjét.
|
||||
updateFirefox = Firefox frissítése
|
||||
downloadFirefoxButtonSub = Ingyenes letöltés
|
||||
uploadedFile = Fájl
|
||||
copyFileList = URL másolása
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Lejár:
|
||||
deleteFileList = Törlés
|
||||
nevermindButton = Mindegy
|
||||
legalHeader = Feltételek és adatvédelem
|
||||
legalNoticeTestPilot = A Firefox Send pillanatnyilag egy Tesztpilóta kísérlet, és a <a>Szolgáltatási feltételek</a> valamint az <a>Adatvédelmi nyilatkozat</a> vonatkozik rá. Többet tudhat meg a kísérletről, és az adatgyűjtéséről <a>itt</a>.
|
||||
legalNoticeMozilla = A Firefox Send weboldal használatakor a Mozilla <a>Webhelyekre vonatkozó adatvédelmi nyilatkozata</a> és a <a>Weboldalak felhasználási feltételei</a> is vonatkoznak Önre.
|
||||
deletePopupText = Törli ezt a fájlt?
|
||||
deletePopupYes = Igen
|
||||
deletePopupCancel = Mégse
|
||||
deleteButtonHover
|
||||
.title = Törlés
|
||||
copyUrlHover
|
||||
.title = URL másolása
|
||||
footerLinkLegal = Jogi információk
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = A Tesztpilóta névjegye
|
||||
footerLinkPrivacy = Adatvédelem
|
||||
footerLinkTerms = Feltételek
|
||||
footerLinkCookies = Sütik
|
||||
94
public/locales/it/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = un esperimento web
|
||||
siteFeedback = Feedback
|
||||
uploadPageHeader = Condivisione di file riservata e crittata
|
||||
uploadPageExplainer = Invia file in modo sicuro, riservato e crittato, con un link che scade automaticamente per garantire che i tuoi dati non rimangano online per sempre.
|
||||
uploadPageLearnMore = Ulteriori informazioni
|
||||
uploadPageDropMessage = Trascina qui un file per caricarlo
|
||||
uploadPageSizeMessage = Per evitare problemi è consigliabile caricare file di dimensione inferiore a 1 GB
|
||||
uploadPageBrowseButton = Seleziona un file sul computer
|
||||
.title = Seleziona un file sul computer
|
||||
uploadPageMultipleFilesAlert = Il caricamento di più file o cartelle non è attualmente supportato.
|
||||
uploadPageBrowseButtonTitle = Carica file
|
||||
uploadingPageHeader = Caricamento file
|
||||
importingFile = Importazione in corso…
|
||||
verifyingFile = Verifica in corso…
|
||||
encryptingFile = Crittazione in corso…
|
||||
decryptingFile = Decrittazione in corso…
|
||||
notifyUploadDone = Caricamento completato.
|
||||
uploadingPageMessage = È possibile impostare le opzioni di scadenza del file al termine del caricamento.
|
||||
uploadingPageCancel = Annulla caricamento
|
||||
.title = Annulla caricamento
|
||||
uploadCancelNotification = Caricamento annullato.
|
||||
uploadingPageLargeFileMessage = Si tratta di un file di grandi dimensioni e potrebbe richiedere un po' di tempo.
|
||||
uploadingFileNotification = Invia una notifica quando il caricamento è completato.
|
||||
uploadSuccessConfirmHeader = Pronto per l’invio
|
||||
uploadSvgAlt
|
||||
.alt = Carica
|
||||
uploadSuccessTimingHeader = Il link al file scadrà dopo 1 download o in 24 ore.
|
||||
copyUrlFormLabelWithName = Copia e condividi il link per inviare il tuo file: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copia negli appunti
|
||||
.title = Copia negli appunti
|
||||
copiedUrl = Copiato
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Elimina file
|
||||
.title = Elimina file
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Invia un altro file
|
||||
.title = Invia un altro file
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Scarica
|
||||
downloadFileName = Scarica { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Qualcuno ha utilizzato Firefox Send per inviarti un file. Si tratta di un servizio che permette di condividere file in modo sicuro, riservato e crittato, utilizzando un link che smette di funzionare automaticamente dopo un certo periodo di tempo, garantendo così che i tuoi dati non rimangano online per sempre.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Scarica
|
||||
.title = Scarica
|
||||
downloadNotification = Download completato.
|
||||
downloadFinish = Download completato
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Prova Firefox Send
|
||||
.title = Prova Firefox Send
|
||||
downloadingPageProgress = Download in corso di { $filename } ({ $size })
|
||||
downloadingPageMessage = Mantieni aperta questa scheda mentre il file viene scaricato e decrittato.
|
||||
errorAltText
|
||||
.alt = Errore durante il caricamento
|
||||
errorPageHeader = Si è verificato un errore.
|
||||
errorPageMessage = Si è verificato un errore durante il caricamento del file.
|
||||
errorPageLink = Invia un altro file
|
||||
fileTooBig = Le dimensioni di questo file sono eccessive. Dovrebbe essere inferiore a { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Link scaduto
|
||||
expiredPageHeader = Questo link è scaduto oppure non è mai esistito.
|
||||
notSupportedHeader = Il browser in uso non è supportato.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Purtroppo questo browser non supporta le tecnologie web alla base di Firefox Send. Devi utilizzare un altro browser. Ti consigliamo Firefox!
|
||||
notSupportedOutdatedDetail = Purtroppo questa versione di Firefox non supporta le tecnologie web alla base di Firefox Send. È necessario aggiornare il browser.
|
||||
updateFirefox = Aggiorna Firefox
|
||||
downloadFirefoxButtonSub = Download gratuito
|
||||
uploadedFile = File
|
||||
copyFileList = Copia indirizzo
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Scade in
|
||||
deleteFileList = Elimina
|
||||
nevermindButton = No, grazie
|
||||
legalHeader = Termini di utilizzo e privacy
|
||||
legalNoticeTestPilot = Firefox Send è attualmente un esperimento di Test Pilot ed è soggetto alle <a>Condizioni di utilizzo</a> e all’<a>Informativa sulla privacy</a> di Test Pilot. Per ulteriori informazioni su questo esperimento e i dati raccolti, consulta <a>questa pagina<a>.
|
||||
legalNoticeMozilla = L’utilizzo del sito di Firefox Send è soggetto all’<a>Informativa sulla privacy</a> e le <a>Condizioni di utilizzo</a> dei siti web Mozilla.
|
||||
deletePopupText = Eliminare questo file?
|
||||
deletePopupYes = Sì
|
||||
deletePopupCancel = Annulla
|
||||
deleteButtonHover
|
||||
.title = Elimina
|
||||
copyUrlHover
|
||||
.title = Copia indirizzo
|
||||
footerLinkLegal = Note legali
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Informazioni su Test Pilot
|
||||
footerLinkPrivacy = Privacy
|
||||
footerLinkTerms = Condizioni di utilizzo
|
||||
footerLinkCookies = Cookie
|
||||
94
public/locales/ja/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = ウェブ実験
|
||||
siteFeedback = フィードバック
|
||||
uploadPageHeader = プライベートな暗号化されたファイル共有
|
||||
uploadPageExplainer = 安全で、プライベートで、暗号化されたリンクを通じてファイルを送信。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。
|
||||
uploadPageLearnMore = 詳しくはこちら
|
||||
uploadPageDropMessage = ここにファイルをドロップしてアップロードを開始
|
||||
uploadPageSizeMessage = 確実に処理できるよう、ファイルサイズは 1 GB 以下にすることを推奨します。
|
||||
uploadPageBrowseButton = コンピューター上のファイルを選択
|
||||
.title = コンピューター上のファイルを選択
|
||||
uploadPageMultipleFilesAlert = 今のところ複数ファイルやフォルダーのアップロードには対応していません。
|
||||
uploadPageBrowseButtonTitle = ファイルをアップロード
|
||||
uploadingPageHeader = ファイルをアップロードしています
|
||||
importingFile = インポート中...
|
||||
verifyingFile = 検証中...
|
||||
encryptingFile = 暗号化中...
|
||||
decryptingFile = 復号化中...
|
||||
notifyUploadDone = アップロードが完了しました。
|
||||
uploadingPageMessage = ファイルのアップロード完了後に期限を設定できます。
|
||||
uploadingPageCancel = アップロードを中止
|
||||
.title = アップロードを中止
|
||||
uploadCancelNotification = アップロードは中止されました。
|
||||
uploadingPageLargeFileMessage = このファイルは大きいのでアップロードに多少時間が掛かるかもしれません。しばらくお待ちください。
|
||||
uploadingFileNotification = アップロード完了時に通知を受け取る
|
||||
uploadSuccessConfirmHeader = 送信準備完了
|
||||
uploadSvgAlt
|
||||
.alt = アップロード
|
||||
uploadSuccessTimingHeader = ファイルへのリンクは、1 回ダウンロードされた後、もしくは 24 時間以内に期限切れとなります。
|
||||
copyUrlFormLabelWithName = ファイルを送信するにはこのリンクをコピー、共有してください: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = クリップボードへコピー
|
||||
.title = クリップボードへコピー
|
||||
copiedUrl = コピー完了!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = ファイルを削除
|
||||
.title = ファイルを削除
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = 他のファイルを送信
|
||||
.title = 他のファイルを送信
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = ダウンロード
|
||||
downloadFileName = { $filename } をダウンロード
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = あなたの友人が Firefox Send を通じてファイルを送ってきています。これは、安全で、プライベートで、暗号化されたリンクを通じてファイルを共有できるサービスです。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = ダウンロード
|
||||
.title = ダウンロード
|
||||
downloadNotification = ダウンロードが完了しました。
|
||||
downloadFinish = ダウンロード完了
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Firefox Send を試す
|
||||
.title = Firefox Send を試す
|
||||
downloadingPageProgress = { $filename } ({ $size }) をダウンロードしています
|
||||
downloadingPageMessage = ファイルの取得と暗号化が完了するまでこのタブを開いたままにしておいてください。
|
||||
errorAltText
|
||||
.alt = アップロードエラー
|
||||
errorPageHeader = 何か問題が発生しました。
|
||||
errorPageMessage = ファイルのアップロード中に問題が発生しました。
|
||||
errorPageLink = 他のファイルを送信
|
||||
fileTooBig = このファイルは大きすぎるためアップロードできません。上限は { $size } です。
|
||||
linkExpiredAlt
|
||||
.alt = リンク期限切れ
|
||||
expiredPageHeader = このリンクは期限切れとなったか元々存在していません。
|
||||
notSupportedHeader = お使いのブラウザーには対応していません。
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = 残念ながらお使いのブラウザーは Firefox Send が活用しているウェブ技術に対応していません。他のブラウザーで試してください。私たちは Firefox をお勧めします!
|
||||
notSupportedOutdatedDetail = 残念ながらお使いのバージョンの Firefox は Firefox Send が活用しているウェブ技術に対応していません。ブラウザーを更新する必要があります。
|
||||
updateFirefox = Firefox を更新
|
||||
downloadFirefoxButtonSub = 無料ダウンロード
|
||||
uploadedFile = ファイル
|
||||
copyFileList = URL をコピー
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = 有効期限:
|
||||
deleteFileList = 削除
|
||||
nevermindButton = 気にしないでください
|
||||
legalHeader = 利用規約とプライバシー
|
||||
legalNoticeTestPilot = Firefox Send は今のところ Test Pilot 実験のひとつであり、Test Pilot <a>利用規約</a> と <a>プライバシー通知</a> が適用されます。この実験とそのデータ収集に関する詳細は <a>こちら</a> をご覧ください。
|
||||
legalNoticeMozilla = Firefox Send のサイトの利用には、Mozilla の <a>ウェブサイトプライバシー通知</a> と <a>ウェブサイト利用規約</a> も適用されます。
|
||||
deletePopupText = このファイルを削除しますか?
|
||||
deletePopupYes = はい
|
||||
deletePopupCancel = キャンセル
|
||||
deleteButtonHover
|
||||
.title = 削除
|
||||
copyUrlHover
|
||||
.title = URL をコピー
|
||||
footerLinkLegal = 法的情報
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilot について
|
||||
footerLinkPrivacy = プライバシー
|
||||
footerLinkTerms = 利用規約
|
||||
footerLinkCookies = Cookie
|
||||
94
public/locales/kab/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = Tarmit web
|
||||
siteFeedback = Tikti
|
||||
uploadPageHeader = Beṭṭu n ifuyla s uwgelhen akked tbaḍnit
|
||||
uploadPageExplainer = Azen ifuyla s wudem aɣelsant, s tbaḍnit akked uwgelhen, s useqdec n useɣwen ara yemten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda.
|
||||
uploadPageLearnMore = Issin ugar
|
||||
uploadPageDropMessage = Zuɣeṛ afaylu-ik ar dagi akken ad tebduḍ asali
|
||||
uploadPageSizeMessage = I ugmuḍ ufrin, yelha ad tesqedceḍ ifuyla daw n 1 GAṬ
|
||||
uploadPageBrowseButton = Fren afaylu sef uselkim-ik
|
||||
.title = Fren afaylu seg uselkim-ik
|
||||
uploadPageMultipleFilesAlert = Asali n ddeqs n ifuyla neɣ ikaramen ur ittusefrak ara yakan.
|
||||
uploadPageBrowseButtonTitle = Sali ifuyla
|
||||
uploadingPageHeader = Asali n ufaylu-ik
|
||||
importingFile = Akter...
|
||||
verifyingFile = Asenqed...
|
||||
encryptingFile = Awgelhen...
|
||||
decryptingFile = Azmek...
|
||||
notifyUploadDone = Asali n ufaylu yemmed.
|
||||
uploadingPageMessage = Ticki afaylu-ik yettali, ad tizmired ad ternuḍ iɣewwaṛen n wazen n tagara.
|
||||
uploadingPageCancel = Sefsex asali
|
||||
.title = Safsex Asali
|
||||
uploadCancelNotification = Asali-ik yefsex.
|
||||
uploadingPageLargeFileMessage = Afaylu meqqer aṭas ihi yezmer ad yawi ddeqs n wakud. Rǧu ihi!
|
||||
uploadingFileNotification = Lɣu-yid ticki yemmed usali.
|
||||
uploadSuccessConfirmHeader = Ihegga i walluy
|
||||
uploadSvgAlt
|
||||
.alt = Sali
|
||||
uploadSuccessTimingHeader = Aseɣwen ar ufaylu-ik ad yemmet ticki yuder-d neɣ deffir n 24 n yisragen.
|
||||
copyUrlFormLabelWithName = Nɣel sakin Bḍu aseɣwen akken ad tazneḍ afaylu-ik: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Sers ɣef afus
|
||||
.title = Sers ɣef afus
|
||||
copiedUrl = Yenɣel!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Kkes afaylu
|
||||
.title = Kkes afaylu
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Azen afaylu-nniḍen
|
||||
.title = Azen afaylu-nniḍen
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Sider
|
||||
downloadFileName = Sider { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Amdakel-ik yuzen-ak-d afaylu s Firefox Firefox Send, ameẓlu ara yeǧǧen tuzna n ifuyla s wudem aɣelsan, s tbadnit akked uwgelhen s useqdec n useqwen ara yeùten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Sider
|
||||
.title = Sider
|
||||
downloadNotification = Asider-ik yemmed.
|
||||
downloadFinish = Asider yemmed
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Ɛreḍ Firefox Send
|
||||
.title = Ɛreḍ Firefox Send
|
||||
downloadingPageProgress = Asider n { $filename } ({ $size })
|
||||
downloadingPageMessage = Eǧǧ iccer-agi yeldi ticki nettnadi afaylu akken ad newgelhen.
|
||||
errorAltText
|
||||
.alt = Tuccḍa n tuzna
|
||||
errorPageHeader = Yella wayen yeḍran!
|
||||
errorPageMessage = Teḍra-d tuccḍa deg usali n ufaylu.
|
||||
errorPageLink = Azen afaylu-nniḍen
|
||||
fileTooBig = Afaylu-agi meqqeṛ aṭas. Yessefk ad yili daw n { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Aseɣwen yemmut
|
||||
expiredPageHeader = Aseɣwen-agi yemmut neɣ wurǧin yella seg tazwara!
|
||||
notSupportedHeader = Iminig-ik ur ittusefrak ara
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Ad nesḥissef imi iminig-ik ur isefrak ara tatiknulujit web iseqdac Firefox Send. Yessefk ad tesqedceḍ iminig-nniḍen. Seqdec Firefox!
|
||||
notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Firefox Send. Yessefk ad tleqmeḍ iminig-ik.
|
||||
updateFirefox = Leqqem Firefox
|
||||
downloadFirefoxButtonSub = Asider ilelli
|
||||
uploadedFile = Afaylu
|
||||
copyFileList = Nɣel URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Ad ifak di
|
||||
deleteFileList = Kkes
|
||||
nevermindButton = Wicqa
|
||||
legalHeader = Tiwtilin &tabaḍnit
|
||||
legalNoticeTestPilot = Firefox Send yettwasekyad akka tura am tarmit Test Pilot, ihi ad yili daw n <a>n tewtilin n useqdec </a> n Test Pilot akked <a>Tasertit n tbaḍnit</a>. Tzemreḍ ad teẓreḍ ugar ɣeef tarmit-agi akked ulqaḍ n isefka<a> dagihere</a>.
|
||||
legalNoticeMozilla = Aseqdec n usmel n Firefox Send yella daw n <a> ilugan tbaḍnit n yismal web </a> n Mozilla akked <a> Tiwtilin n useqdec n yismal Web</a> n Mozilla.
|
||||
deletePopupText = Kkes afaylu-agi?
|
||||
deletePopupYes = Ih
|
||||
deletePopupCancel = Sefsex
|
||||
deleteButtonHover
|
||||
.title = Kkes
|
||||
copyUrlHover
|
||||
.title = Nɣel URL.
|
||||
footerLinkLegal = Usḍif
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Ɣef Test Pilot
|
||||
footerLinkPrivacy = Tabaḍnit
|
||||
footerLinkTerms = Tiwtilin
|
||||
footerLinkCookies = Inagan n tuqqna
|
||||
94
public/locales/ms/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = experimen web
|
||||
siteFeedback = Maklum balas
|
||||
uploadPageHeader = Peribadi, Perkongsian Fail Dienkrip
|
||||
uploadPageExplainer = Hantar fail melalui pautan yang selamat, peribadi dan dienkrip, yang akan luput secara automatik untuk memastikan fail anda itu tidak terus berada dalam talian selama-lamanya.
|
||||
uploadPageLearnMore = Ketahui selanjutnya
|
||||
uploadPageDropMessage = Letakkan fail anda di sini untuk mulakan memuat naik
|
||||
uploadPageSizeMessage = Untuk operasi yang paling selamat, lebih baik pastikan fail anda itu kurang 1GB
|
||||
uploadPageBrowseButton = Pilih fail dalam komputer anda
|
||||
.title = Pilih fail dalam komputer anda
|
||||
uploadPageMultipleFilesAlert = Memuat naik pelbagai fail atau satu folder masih belum disokong.
|
||||
uploadPageBrowseButtonTitle = Muat naik fail
|
||||
uploadingPageHeader = Memuat naik Fail Anda
|
||||
importingFile = Mengimport…
|
||||
verifyingFile = Mengesahkan...
|
||||
encryptingFile = Mengenkripsi...
|
||||
decryptingFile = Mengenkripsi...
|
||||
notifyUploadDone = Muat naik anda sudah siap.
|
||||
uploadingPageMessage = Setelah siap fail anda dimuat naik, akan boleh tetapkan pilihan luput.
|
||||
uploadingPageCancel = Batal muat naik
|
||||
.title = Batal muat naik
|
||||
uploadCancelNotification = Muat naik anda dibatalkan.
|
||||
uploadingPageLargeFileMessage = Fail ini besar dan mungkin mengambil masa untuk dimuat naik. Tunggu!
|
||||
uploadingFileNotification = Maklumkan saya apabila muat naik selesai.
|
||||
uploadSuccessConfirmHeader = Sedia untuk Hantar
|
||||
uploadSvgAlt
|
||||
.alt = Muat naik
|
||||
uploadSuccessTimingHeader = Pautan ke fail anda akan luput selepas 1 muat turun atau dalam 24 jam.
|
||||
copyUrlFormLabelWithName = Salin dan kongsi pautan untuk menghantar fail anda: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Salin ke Klipbod
|
||||
.title = Salin ke Klipbod
|
||||
copiedUrl = Disalin!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Hapus fail
|
||||
.title = Hapus fail
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Hantar fail lain
|
||||
.title = Hantar fail lain
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Muat turun
|
||||
downloadFileName = Muat turun { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan Firefox Send, satu perkhidmatan yang membolehkan anda berkongsi fail dengan pautan yang selamat, peribadi dan dienkrip, yang secara automatik akan luput bagi memastikan fail anda tidak terus berada dalam talian selama-lamanya.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Muat turun
|
||||
.title = Muat turun
|
||||
downloadNotification = Muat turun anda sudah siap.
|
||||
downloadFinish = Muat turun Selesai
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Cuba Firefox Send
|
||||
.title = Cuba Firefox Send
|
||||
downloadingPageProgress = Memuat turun { $filename } ({ $size })
|
||||
downloadingPageMessage = Sila biarkan tab ini terbuka semasa kami mengambil fail anda dan menghuraikannya.
|
||||
errorAltText
|
||||
.alt = Ralat memuat naik
|
||||
errorPageHeader = Ada sesuatu yang tidak kena!
|
||||
errorPageMessage = Ada ralat semasa memuat naik fail.
|
||||
errorPageLink = Hantar fail lain
|
||||
fileTooBig = Fail terlalu besar untuk dimuat naik. Perlu kurang daripada { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Pautan sudah luput
|
||||
expiredPageHeader = Pautan ini sudah luput atau pun tidak pernah wujud!
|
||||
notSupportedHeader = Pelayar anda tidak disokong.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Malangnya, pelayar ini tidak menyokong teknologi web yang melaksanakan Firefox Send. Anda perlu cuba pelayar lain. Kami syorkan Firefox!
|
||||
notSupportedOutdatedDetail = Malangnya versi Firefox ini tidak menyokong teknologi web yang menguasakan Firefox Send. Anda perlu mengemaskini pelayar anda.
|
||||
updateFirefox = Kemaskini Firefox
|
||||
downloadFirefoxButtonSub = Muat turun Percuma
|
||||
uploadedFile = Fail
|
||||
copyFileList = Salin URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Luput Pada
|
||||
deleteFileList = Hapus
|
||||
nevermindButton = Tak apalah
|
||||
legalHeader = Terma & Privasi
|
||||
legalNoticeTestPilot = Firefox Send adalah eksperimen Ujian Perintis, dan tertakluk kepada <a>Terma Perkhidmatan</a> dan <a>Privacy Notice</a> Ujian Perintis. Anda boleh ketahui selanjutnya perihal eksperimen ini dan pengumpulan data <a>di sini</a>.
|
||||
legalNoticeMozilla = Penggunaan laman web Firefox Send juga tertakluk kepada <a>Notis Privasi Laman web</a> dan <a>Terma Penggunaan Laman web</a> Mozilla.
|
||||
deletePopupText = Hapus fail ini?
|
||||
deletePopupYes = Ya
|
||||
deletePopupCancel = Batal
|
||||
deleteButtonHover
|
||||
.title = Hapus
|
||||
copyUrlHover
|
||||
.title = Salin URL
|
||||
footerLinkLegal = Perundangan
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Perihal Ujian Perintis
|
||||
footerLinkPrivacy = Privasi
|
||||
footerLinkTerms = Terma
|
||||
footerLinkCookies = Kuki
|
||||
94
public/locales/nb-NO/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = netteksperiment
|
||||
siteFeedback = Tilbakemelding
|
||||
uploadPageHeader = Privat, kryptert fildeling
|
||||
uploadPageExplainer = Send filer gjennom en sikker, privat og kryptert lenke som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid.
|
||||
uploadPageLearnMore = Les mer
|
||||
uploadPageDropMessage = Slipp din fil her for å starte opplastingen
|
||||
uploadPageSizeMessage = For den mest problemfrie bruken, er det best å holde filen under 1 GB
|
||||
uploadPageBrowseButton = Velg en fil på din datamaskin
|
||||
.title = Velg en fil på din datamaskin
|
||||
uploadPageMultipleFilesAlert = Opplasting av flere filer eller en mappe støttes ikke for øyeblikket.
|
||||
uploadPageBrowseButtonTitle = Last opp fil
|
||||
uploadingPageHeader = Laster opp din fil
|
||||
importingFile = Importerer…
|
||||
verifyingFile = Verifiserer...
|
||||
encryptingFile = Krypterer...
|
||||
decryptingFile = Dekrypterer...
|
||||
notifyUploadDone = Opplastingen din er ferdig.
|
||||
uploadingPageMessage = Når filopplastingen din er ferdig, kan du angi utløpsalternativer.
|
||||
uploadingPageCancel = Avbryt opplasting
|
||||
.title = Avbryt opplasting
|
||||
uploadCancelNotification = Din opplasting ble avbrutt
|
||||
uploadingPageLargeFileMessage = Denne filen er stor, og det kan ta litt tid å laste opp. Vent litt!
|
||||
uploadingFileNotification = Varsle meg når opplastingen er ferdig.
|
||||
uploadSuccessConfirmHeader = Klar til å sende
|
||||
uploadSvgAlt
|
||||
.alt = Last opp
|
||||
uploadSuccessTimingHeader = Lenken til filen din utløper etter 1 nedlasting eller om 24 timer.
|
||||
copyUrlFormLabelWithName = Kopier og del linken for å sende filen: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Kopier til utklippstavle
|
||||
.title = Kopier til utklippstavle
|
||||
copiedUrl = Kopiert!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Slett fil
|
||||
.title = Slett fil
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Send en annen fil
|
||||
.title = Send en annen fil
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Last ned
|
||||
downloadFileName = Last ned { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Din venn sender deg en fil med Firefox Send, en tjeneste som lar deg dele filer med en sikker, privat og kryptert lenke, som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Last ned
|
||||
.title = Last ned
|
||||
downloadNotification = Nedlastingen er fullført.
|
||||
downloadFinish = Nedlastingen er fullført.
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Prøv Firefox Send
|
||||
.title = Prøv Firefox Send
|
||||
downloadingPageProgress = Laster ned { $filename } ({ $size })
|
||||
downloadingPageMessage = La denne fanen være åpen mens vi henter filen og dekrypterer den.
|
||||
errorAltText
|
||||
.alt = Opplastingsfeil
|
||||
errorPageHeader = Det oppstod en feil.
|
||||
errorPageMessage = Det har oppstått en feil under opplasting av filen.
|
||||
errorPageLink = Send en annen fil
|
||||
fileTooBig = Filen er for stor til å laste opp. Det må være mindre enn { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Lenke utløpt
|
||||
expiredPageHeader = Denne lenken er utløpt eller har aldri eksistert i utgangspunktet!
|
||||
notSupportedHeader = Din nettleser er ikke støttet.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Dessverre støtter denne nettleseren ikke webteknologien som driver Firefox Send. Du må prøve en annen nettleser. Vi anbefaler Firefox!
|
||||
notSupportedOutdatedDetail = Dessverre støtter ikke denne versjonen av Firefox netteknologien som driver Firefox Send. Du trenger å oppdatere nettleseren din.
|
||||
updateFirefox = Oppdater Firefox
|
||||
downloadFirefoxButtonSub = Gratis nedlasting
|
||||
uploadedFile = Fil
|
||||
copyFileList = Kopier URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Utløper om
|
||||
deleteFileList = Slett
|
||||
nevermindButton = Glem det
|
||||
legalHeader = Vilkår og personvern
|
||||
legalNoticeTestPilot = Firefox Send er for øyeblikket et Test Pilot-eksperiment, og er underlagt Test Pilots <a>tjenestevilkår</a> og <a>personvernbestemmelser</a>. Du kan lære mer om dette eksperimentet og datainnsamlingen <a>her</a>.
|
||||
legalNoticeMozilla = Bruk av Firefox Send-nettsiden er også underlagt Mozillas <a>personvernbestemmelser for nettsider</a> og <a>brukervilkår for nettsider</a>.
|
||||
deletePopupText = Slette denne filen?
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Avbryt
|
||||
deleteButtonHover
|
||||
.title = Slett
|
||||
copyUrlHover
|
||||
.title = Kopier URL
|
||||
footerLinkLegal = Juridisk informasjon
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Om Test Pilot
|
||||
footerLinkPrivacy = Personvern
|
||||
footerLinkTerms = Vilkår
|
||||
footerLinkCookies = Infokapsler
|
||||
94
public/locales/nn-NO/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = netteksperiment
|
||||
siteFeedback = Tilbakemelding
|
||||
uploadPageHeader = Privat, kryptert fildeling
|
||||
uploadPageExplainer = Send filer gjennom ei sikker, privat og kryptert lenke som automatisk går ut, for å sikre at ting ikkje vert verande på nettet for alltid.
|
||||
uploadPageLearnMore = Les meir
|
||||
uploadPageDropMessage = Slepp fila di her for å starte opplastinga
|
||||
uploadPageSizeMessage = For mest problemfrie bruk, er det best å halde fila under 1 GB
|
||||
uploadPageBrowseButton = Vel ei fil på datamaskina di
|
||||
.title = Vel ei fil på datamaskina di
|
||||
uploadPageMultipleFilesAlert = Opplasting av fleire filer eller ei mappe er for tida ikkje støtta.
|
||||
uploadPageBrowseButtonTitle = Last opp fil
|
||||
uploadingPageHeader = Lastar opp fila di
|
||||
importingFile = Importerer…
|
||||
verifyingFile = Stadfestar…
|
||||
encryptingFile = Krypterer…
|
||||
decryptingFile = Dekrypterer...
|
||||
notifyUploadDone = Opplastinga di er ferdig.
|
||||
uploadingPageMessage = Når filopplastinga di er ferdig, kan du spesifisere utgått-alternativ.
|
||||
uploadingPageCancel = Avbryt opplasting
|
||||
.title = Avbryt opplasting
|
||||
uploadCancelNotification = Opplastinga di vart avbroten
|
||||
uploadingPageLargeFileMessage = Denne fila er stor, og det kan ta litt tid å laste henne opp. Ver tolmodig!
|
||||
uploadingFileNotification = Varsle meg når opplastinga er ferdig.
|
||||
uploadSuccessConfirmHeader = Klår til å senda
|
||||
uploadSvgAlt
|
||||
.alt = Last opp
|
||||
uploadSuccessTimingHeader = Lenka til fila di går ut etter 1 nedlasting eller om 24 timar.
|
||||
copyUrlFormLabelWithName = Kopier og del lenka for å sende fila: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Kopier til utklippstavla
|
||||
.title = Kopier til utklippstavla
|
||||
copiedUrl = Kopiert!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Slett fil
|
||||
.title = Slett fil
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Send ei anna fil
|
||||
.title = Send ei anna fil
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Last ned
|
||||
downloadFileName = Last ned { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Vennen din sender deg eni fil med Firefox Send, ei teneste som lar deg dele filer med ei sikker, privat og kryptert lenke, som automatisk går ut, for å sikre at ting ikkje vert verande på nettet for alltid.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Last ned
|
||||
.title = Last ned
|
||||
downloadNotification = Nedlastinga er fullført.
|
||||
downloadFinish = Nedlastinga er fullført.
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Prøv Firefox Send
|
||||
.title = Prøv Firefox Send
|
||||
downloadingPageProgress = Lastar ned { $filename } ({ $size })
|
||||
downloadingPageMessage = La denne fana vere open mens vi hentar filen og dekrypterar henne.
|
||||
errorAltText
|
||||
.alt = Opplastingsfeil
|
||||
errorPageHeader = Noko gjekk gale!
|
||||
errorPageMessage = Dett oppstod ein feil under opplasting av fila.
|
||||
errorPageLink = Send ei anna fil
|
||||
fileTooBig = Fila er for stor, og kan ikkje lastast opp. Ho må vere mindre enn { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Lenka har gått ut
|
||||
expiredPageHeader = Denne lenka har gått ut eller har aldri eksistert i utgangspunktet!
|
||||
notSupportedHeader = Nettlesaren din er ikkje støtta.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Diverre støttar denne nettlesaren ikkje webteknologien som driv Firefox Send. Du må prøve ein annan nettleser. Vi tilrår Firefox!
|
||||
notSupportedOutdatedDetail = Dessverre støttar ikkje denne versjonen av Firefox nett-teknologien som driv Firefox Send. Du må å oppdatere nettlesaren din.
|
||||
updateFirefox = Oppdater Firefox
|
||||
downloadFirefoxButtonSub = Gratis nedlasting
|
||||
uploadedFile = Fil
|
||||
copyFileList = Kopier URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Går ut om
|
||||
deleteFileList = Slett
|
||||
nevermindButton = Gløym det
|
||||
legalHeader = Vilkår og personvern
|
||||
legalNoticeTestPilot = Firefox Send er for tida eit Test Pilot-eksperiment, og er underlagt <a>tenestevilkåra</a> og <a>personvernvilkåra</a> til Test Pilot. Du kan lære meir om dette eksperimentet og datainnsamlinga <a>her</a>.
|
||||
legalNoticeMozilla = Bruk av Firefox Send-nettsida er også underlagt Mozillas <a>personvernvilkår for nettsider</a> og <a>brukarvilkår for nettsider</a>.
|
||||
deletePopupText = Slette denne fila?
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Avbryt
|
||||
deleteButtonHover
|
||||
.title = Slett
|
||||
copyUrlHover
|
||||
.title = Kopier URL
|
||||
footerLinkLegal = Juridisk informasjon
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Om Test Pilot
|
||||
footerLinkPrivacy = Personvern
|
||||
footerLinkTerms = Vilkår
|
||||
footerLinkCookies = Infokapslar
|
||||
94
public/locales/pt-BR/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = experimento web
|
||||
siteFeedback = Opinião
|
||||
uploadPageHeader = Compartilhamento de arquivos privados e criptografados
|
||||
uploadPageExplainer = Envie arquivos por meio de um link seguro, privado e criptografado que expira automaticamente para garantir que as suas coisas não permaneçam on-line para sempre.
|
||||
uploadPageLearnMore = Saiba mais
|
||||
uploadPageDropMessage = Arraste o arquivo para cá para iniciar o envio
|
||||
uploadPageSizeMessage = Para uma operação mais confiável, é melhor manter seu arquivo menor que 1GB
|
||||
uploadPageBrowseButton = Selecione um arquivo em seu computador
|
||||
.title = Selecione um arquivo em seu computador
|
||||
uploadPageMultipleFilesAlert = Enviar múltiplos arquivos ou uma pasta ainda não é suportado.
|
||||
uploadPageBrowseButtonTitle = Enviar arquivo
|
||||
uploadingPageHeader = Enviando seu arquivo
|
||||
importingFile = Importando…
|
||||
verifyingFile = Verificando…
|
||||
encryptingFile = Criptografando…
|
||||
decryptingFile = Descriptografando…
|
||||
notifyUploadDone = Arquivo enviado.
|
||||
uploadingPageMessage = Uma vez que seu arquivo seja enviado você poderá definir opções de expiração.
|
||||
uploadingPageCancel = Cancelar envio
|
||||
.title = Cancelar envio
|
||||
uploadCancelNotification = Você cancelou o envio.
|
||||
uploadingPageLargeFileMessage = Esse arquivo é grande e pode demorar para ser enviado. Aguarde!
|
||||
uploadingFileNotification = Me avise quando completar o envio.
|
||||
uploadSuccessConfirmHeader = Pronto para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Enviado
|
||||
uploadSuccessTimingHeader = O link para o seu arquivo expirará após 1 download ou em 24 horas.
|
||||
copyUrlFormLabelWithName = Copie e compartilhe o link para enviar o seu arquivo: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar para área de transferência
|
||||
.title = Copiar para área de transferência
|
||||
copiedUrl = Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Excluir arquivo
|
||||
.title = Excluir arquivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar outro arquivo
|
||||
.title = Enviar outro arquivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Download
|
||||
downloadFileName = Download { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Seu amigo está te enviando um arquivo através do Firefox Send, um serviço que permite compartilhar arquivos com segurança, privacidade e um link encriptado que automaticamente expira para garantir que suas coisas não permaneçam on-line eternamente.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Download
|
||||
.title = Download
|
||||
downloadNotification = Seu download terminou.
|
||||
downloadFinish = Download completo
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Experimente o Firefox Send
|
||||
.title = Experimente o Firefox Send
|
||||
downloadingPageProgress = Baixando { $filename } ({ $size })
|
||||
downloadingPageMessage = Por favor deixe essa aba aberta enquanto buscamos seu arquivo e o decriptamos.
|
||||
errorAltText
|
||||
.alt = Erro no envio
|
||||
errorPageHeader = Oops, ocorreu um erro!
|
||||
errorPageMessage = Houve um erro ao enviar o arquivo.
|
||||
errorPageLink = Enviar outro arquivo
|
||||
fileTooBig = Esse arquivo é muito grande. Ele deve ser menor que { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Link expirou
|
||||
expiredPageHeader = Esse link expirou, ou talvez nunca tenha existido!
|
||||
notSupportedHeader = Seu navegador não tem suporte.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Infelizmente esse navegador não suporta a tecnologia utilizada pelo Firefox Send. Tente com outro navegador. Nós recomendamos o Firefox! ;-)
|
||||
notSupportedOutdatedDetail = Infelizmente esta versão do Firefox não suporta a tecnologia web que faz o Firefox Send funcionar. Você precisa atualizar o seu navegador.
|
||||
updateFirefox = Atualizar o Firefox
|
||||
downloadFirefoxButtonSub = Download gratuito
|
||||
uploadedFile = Arquivo
|
||||
copyFileList = Copiar URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Expira em
|
||||
deleteFileList = Excluir
|
||||
nevermindButton = Esqueça
|
||||
legalHeader = Termos e privacidade
|
||||
legalNoticeTestPilot = Firefox Send é um experimento do Test Pilot, e sujeito aos <a>Termos de Serviço</a> e <a>Políticas de Privacidade</a> do Test Pilot. Você pode aprender mais sobre esse experimento e a coleta de dados <a>aqui</a>.
|
||||
legalNoticeMozilla = O uso do site Firefox Send também está sujeito a <a>Política de Privacidade</a> e <a>Websites Terms of Use</a> da Mozilla.
|
||||
deletePopupText = Excluir este arquivo
|
||||
deletePopupYes = Sim
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Excluir
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Sobre o Test Pilot
|
||||
footerLinkPrivacy = Privacidade
|
||||
footerLinkTerms = Termos
|
||||
footerLinkCookies = Cookies
|
||||
94
public/locales/pt-PT/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = experiência web
|
||||
siteFeedback = Feedback
|
||||
uploadPageHeader = Partilha de ficheiros privada e encriptada
|
||||
uploadPageExplainer = Envie ficheiros através de uma ligação segura, privada e encriptada que automaticamente expira para garantir que as suas coisas não fiquem online para sempre.
|
||||
uploadPageLearnMore = Saber mais
|
||||
uploadPageDropMessage = Largue o seu ficheiro aqui para começar a carregar
|
||||
uploadPageSizeMessage = Para uma operação mais confiável, é melhor manter o seu ficheiro abaixo de 1GB
|
||||
uploadPageBrowseButton = Selecione um ficheiro no seu computador
|
||||
.title = Selecione um ficheiro no seu computador
|
||||
uploadPageMultipleFilesAlert = Carregar múltiplos ficheiros ou uma pasta não é atualmente suportado.
|
||||
uploadPageBrowseButtonTitle = Carregar ficheiro
|
||||
uploadingPageHeader = A carregar o seu ficheiro
|
||||
importingFile = A importar...
|
||||
verifyingFile = A verificar...
|
||||
encryptingFile = A encriptar...
|
||||
decryptingFile = A desencriptar...
|
||||
notifyUploadDone = O seu carregamento terminou.
|
||||
uploadingPageMessage = Assim que o seu ficheiro carregar irá poder definir as opções de expiração.
|
||||
uploadingPageCancel = Cancelar carregamento
|
||||
.title = Cancelar carregamento
|
||||
uploadCancelNotification = O seu carregamento foi cancelado.
|
||||
uploadingPageLargeFileMessage = Este ficheiro é grande e pode demorar um pouco a carregar. Fique onde está!
|
||||
uploadingFileNotification = Notificar-me quando o carregamento estiver completo.
|
||||
uploadSuccessConfirmHeader = Pronto para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Carregar
|
||||
uploadSuccessTimingHeader = A ligação para o seu ficheiro irá expirar depois de 1 descarga ou em 24 horas.
|
||||
copyUrlFormLabelWithName = Copie e partilhe a ligação para enviar o seu ficheiro: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar para a área de transferência
|
||||
.title = Copiar para a área de transferência
|
||||
copiedUrl = Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Apagar ficheiro
|
||||
.title = Apagar ficheiro
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar outro ficheiro
|
||||
.title = Enviar outro ficheiro
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descarregar
|
||||
downloadFileName = Descarregar { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = O seu amigo está a enviar-lhe um ficheiro com o Firefox Send, um serviço que lhe permite partilhar ficheiro com uma ligação segura, privada e encriptada que automaticamente expira para garantir que as suas coisas não fiquem online para sempre.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descarregar
|
||||
.title = Descarregar
|
||||
downloadNotification = A sua descarga foi completada.
|
||||
downloadFinish = Descarga completada
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Tentar o Firefox Send
|
||||
.title = Tentar o Firefox Send
|
||||
downloadingPageProgress = A descarregar { $filename } ({ $size })
|
||||
downloadingPageMessage = Por favor deixe este separador aberto enquanto obtemos o seu ficheiro e o desencriptamos.
|
||||
errorAltText
|
||||
.alt = Erro ao carregar
|
||||
errorPageHeader = Algo correu mal.
|
||||
errorPageMessage = Houve um erro ao carregar o ficheiro.
|
||||
errorPageLink = Enviar outro ficheiro
|
||||
fileTooBig = Esse ficheiro é muito grande para carregar. Deve ser menor do que { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Ligação expirada
|
||||
expiredPageHeader = Esta ligação expirou ou nunca existiu em primeiro lugar!
|
||||
notSupportedHeader = O seu navegador não é suportado.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Infelizmente este navegador não suporta a tecnologia web que faz o Firefox Send funcionar. Irá precisar de tentar outro navegador. Nós recomendamos o Firefox!
|
||||
notSupportedOutdatedDetail = Infelizmente esta versão do Firefox não suporta a tecnologia web que faz o Firefox Send funcionar. Precisa de atualizar o seu navegador.
|
||||
updateFirefox = Atualizar o Firefox
|
||||
downloadFirefoxButtonSub = Descarga gratuita
|
||||
uploadedFile = Ficheiro
|
||||
copyFileList = Copiar URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Expira em
|
||||
deleteFileList = Apagar
|
||||
nevermindButton = Esquecer
|
||||
legalHeader = Termos e privacidade
|
||||
legalNoticeTestPilot = O Firefox Send é atualmente uma experiência do Test Pilot, e sujeita aos <a>Termos de serviço</a> e <a>Aviso de privacidade</a> do Test Pilot. Pode saber mais acerca desta experiência e a sua recolha de dados <a>aqui</a>.
|
||||
legalNoticeMozilla = A utilização do website do Firefox Send está também sujeita ao <a>Aviso de privacidade dos websites</a> e <a>Termos de serviço dos websites</a> da Mozilla.
|
||||
deletePopupText = Apagar este ficheiro?
|
||||
deletePopupYes = Sim
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Apagar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Acerca do Test Pilot
|
||||
footerLinkPrivacy = Privacidade
|
||||
footerLinkTerms = Termos
|
||||
footerLinkCookies = Cookies
|
||||
94
public/locales/ru/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = веб-эксперимент
|
||||
siteFeedback = Отзывы
|
||||
uploadPageHeader = Приватный, зашифрованный обмен файлами
|
||||
uploadPageExplainer = Отсылайте файлы, используя безопасные, приватные и зашифрованные ссылки, которые автоматически просрочатся, чтобы ваш материал не остался онлайн навсегда.
|
||||
uploadPageLearnMore = Подробнее
|
||||
uploadPageDropMessage = Перетащите свой файл сюда, чтобы начать загрузку
|
||||
uploadPageSizeMessage = Для более надёжной работы сервиса, размер вашего файла не должен превышать 1ГБ.
|
||||
uploadPageBrowseButton = Выбрать файл с моего компьютера
|
||||
.title = Выбрать файл с моего компьютера
|
||||
uploadPageMultipleFilesAlert = Загрузка нескольких файлов или папок в настоящее время не поддерживается.
|
||||
uploadPageBrowseButtonTitle = Загрузить файл
|
||||
uploadingPageHeader = Загрузка вашего файла
|
||||
importingFile = Импортирование...
|
||||
verifyingFile = Проверка...
|
||||
encryptingFile = Шифрование...
|
||||
decryptingFile = Расшифровка...
|
||||
notifyUploadDone = Ваша загрузка завершена.
|
||||
uploadingPageMessage = Как только вы загрузите свой файл, вы сможете установить срок хранения.
|
||||
uploadingPageCancel = Отменить загрузку
|
||||
.title = Отменить загрузку
|
||||
uploadCancelNotification = Ваша загрузка была отменена.
|
||||
uploadingPageLargeFileMessage = Этот файл довольно большой и его загрузка может занять продолжительное время. Держитесь!
|
||||
uploadingFileNotification = Оповестить меня, когда загрузка завершится.
|
||||
uploadSuccessConfirmHeader = Готов к отправке
|
||||
uploadSvgAlt
|
||||
.alt = Загрузить
|
||||
uploadSuccessTimingHeader = Ссылка на ваш файл просрочится после 1 загрузки файла или через 24 часа.
|
||||
copyUrlFormLabelWithName = Скопировать и поделиться ссылкой на отправку вашего файла: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Скопировать в буфер обмена
|
||||
.title = Скопировать в буфер обмена
|
||||
copiedUrl = Скопировано!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Удалить файл
|
||||
.title = Удалить файл
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Отправить другой файл
|
||||
.title = Отправить другой файл
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Загрузить
|
||||
downloadFileName = Загрузить { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Ваш друг отправил вам файл с помощью Firefox Send, сервиса, который позволяет вам делиться файлами, используя безопасные, приватные и зашифрованные ссылки, которые автоматически просрачиваются, чтобы ваши файлы не остались в онлайне навсегда.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Скачать
|
||||
.title = Скачать
|
||||
downloadNotification = Ваша загрузка завершена.
|
||||
downloadFinish = Загрузка завершена
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Попробовать Firefox Send
|
||||
.title = Попробовать Firefox Send
|
||||
downloadingPageProgress = Загрузка { $filename } ({ $size })
|
||||
downloadingPageMessage = Пожалуйста, оставьте эту вкладку открытой, пока мы загружаем ваш файл и расшифровываем его.
|
||||
errorAltText
|
||||
.alt = Ошибка загрузки
|
||||
errorPageHeader = Что-то пошло не так!
|
||||
errorPageMessage = Произошла ошибка при загрузке файла.
|
||||
errorPageLink = Отправить другой файл.
|
||||
fileTooBig = Этот файл слишком большой для загрузки. Он должен быть меньше { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Ссылка просрочена
|
||||
expiredPageHeader = Это ссылка просрочена или никогда не существовала!
|
||||
notSupportedHeader = Ваш браузер не поддерживается.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = К сожалению, этот браузер не поддерживает веб-технологию, благодаря которой работает Firefox Send. Ваш нужно попробовать использовать другой браузер. Мы рекомендуем Firefox!
|
||||
notSupportedOutdatedDetail = К сожалению, эта версия Firefox не поддерживает веб-технологию, благодаря которой работает Firefox Send. Ваш нужно обновить свой браузер.
|
||||
updateFirefox = Обновить Firefox
|
||||
downloadFirefoxButtonSub = Бесплатная загрузка
|
||||
uploadedFile = Файл
|
||||
copyFileList = Скопировать URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Просрочится через
|
||||
deleteFileList = Удалить
|
||||
nevermindButton = Неважно
|
||||
legalHeader = Условия и конфиденциальность
|
||||
legalNoticeTestPilot = Firefox Send в настоящее время является экспериментом Лётчика-испытателя, и поэтому подпадает под <a>условия службы</a> и <a>уведомление о приватности</a> Лётчика-испытателя. Вы можете узнать больше об этом эксперименте и его сборе данных <a>здесь</a>.
|
||||
legalNoticeMozilla = Использование сайта Firefox Send также подпадает под <a>уведомление о конфиденциальности веб-сайтов</a> и <a>правила использования веб-сайтов</a> Mozilla.
|
||||
deletePopupText = Удалить этот файл?
|
||||
deletePopupYes = Да
|
||||
deletePopupCancel = Отмена
|
||||
deleteButtonHover
|
||||
.title = Удалить
|
||||
copyUrlHover
|
||||
.title = Скопировать URL
|
||||
footerLinkLegal = Права
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = О программе Лётчика-испытателя
|
||||
footerLinkPrivacy = Приватность
|
||||
footerLinkTerms = Условия
|
||||
footerLinkCookies = Куки
|
||||
94
public/locales/sk/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = experiment pre web
|
||||
siteFeedback = Spätná väzba
|
||||
uploadPageHeader = Súkromné a šifrované zdieľanie súborov
|
||||
uploadPageExplainer = Odosielajte súbory pomocou bezpečného, súkromného a šifrovaného odkazu, ktorého platnosť automaticky vyprší. Vďaka tomu máte istotu, že vaše súbory nezostanú na internete naveky.
|
||||
uploadPageLearnMore = Ďalšie informácie
|
||||
uploadPageDropMessage = Presunutím súboru sem začnete nahrávanie
|
||||
uploadPageSizeMessage = Pre zaistenie čo najväčšej spoľahlivosti vám odporúčame nahrávať súbory menšie než 1GB.
|
||||
uploadPageBrowseButton = Vyberte súbor vo vašom počítači
|
||||
.title = Vyberte súbor vo vašom počítači
|
||||
uploadPageMultipleFilesAlert = Nahrávanie viacerých súborov alebo priečinkov momentálne nie je podporované.
|
||||
uploadPageBrowseButtonTitle = Nahrať súbor
|
||||
uploadingPageHeader = Nahrávanie vášho súboru
|
||||
importingFile = Importuje sa…
|
||||
verifyingFile = Overuje sa…
|
||||
encryptingFile = Šifruje sa…
|
||||
decryptingFile = Dešifruje sa…
|
||||
notifyUploadDone = Vaše nahrávanie sa dokončilo.
|
||||
uploadingPageMessage = Po nahratí súboru budete môcť nastaviť vypršanie platnosti.
|
||||
uploadingPageCancel = Zrušiť nahrávanie
|
||||
.title = Zrušiť nahrávanie
|
||||
uploadCancelNotification = Vaše nahrávanie bolo zrušené.
|
||||
uploadingPageLargeFileMessage = Tento súbor je veľký. Nahrávanie tak môže chvíľu trvať.
|
||||
uploadingFileNotification = Upozorniť ma na ukončenie nahrávania
|
||||
uploadSuccessConfirmHeader = Pripravené na odoslanie
|
||||
uploadSvgAlt
|
||||
.alt = Nahrať
|
||||
uploadSuccessTimingHeader = Platnosť odkazu vyprší po 1 prevzatí alebo po uplynutí 24 hodín.
|
||||
copyUrlFormLabelWithName = Skopírovaním a zdieľaním odkazu odošlete váš súbor: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Kopírovať do schránky
|
||||
.title = Kopírovať do schránky
|
||||
copiedUrl = Skopírované!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Odstrániť súbor
|
||||
.title = Odstrániť súbor
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Odoslať ďalší súbor
|
||||
.title = Odoslať ďalší súbor
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Prevziať
|
||||
downloadFileName = Prevziať { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Váš priateľ vám odoslal súbor pomocou služby Firefox Sync - táto vám umožňuje zdieľať súbory pomocou bezpečného, súkromného a zašifrovaného odkazu, ktorého platnosť automaticky vyprší. Vďaka tomu máte istotu, že vaše súbory neostanú na internete naveky.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Prevziať
|
||||
.title = Prevziať
|
||||
downloadNotification = Vaše preberanie bolo dokončené.
|
||||
downloadFinish = Preberanie bolo dokončené
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Vyskúšajte Firefox Send
|
||||
.title = Vyskúšajte Firefox Send
|
||||
downloadingPageProgress = Preberá sa { $filename } ({ $size })
|
||||
downloadingPageMessage = Prosím, ponechajte túto kartu otvorenú zatiaľ čo váš súbor prevezmeme a dešifrujeme.
|
||||
errorAltText
|
||||
.alt = Pri nahrávaní sa vyskytla chyba
|
||||
errorPageHeader = Vyskytol sa problém.
|
||||
errorPageMessage = Pri nahrávaní súboru nastala chyba.
|
||||
errorPageLink = Odošlite ďalší súbor
|
||||
fileTooBig = Súbor je príliš veľký. Mal by byť menší než { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Platnosť odkazu vypršala
|
||||
expiredPageHeader = Platnosť tohto odkazu vypršala alebo daný odkaz nikdy neexistoval.
|
||||
notSupportedHeader = Váš prehliadač nie je podporovaný.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Žiaľ, tento prehliadač nepodporuje webovú technológiu, ktorá poháňa službu Firefox Send. Budete musieť vyskúšať iný prehliadač. My vám odporúčame Firefox!
|
||||
notSupportedOutdatedDetail = Žiaľ, táto verzia Firefoxu nepodporuje webovú technológiu, ktorá poháňa Firefox Send. Budete musieť aktualizovať svoj prehliadač.
|
||||
updateFirefox = Aktualizovať Firefox
|
||||
downloadFirefoxButtonSub = Prevziať zadarmo
|
||||
uploadedFile = Súbor
|
||||
copyFileList = Kopírovať adresu URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Platnosť vyprší
|
||||
deleteFileList = Odstrániť
|
||||
nevermindButton = Zrušiť
|
||||
legalHeader = Podmienky používania a súkromie
|
||||
legalNoticeTestPilot = Firefox Send je v súčasnosti experimentom projektu Test Pilot a vzťahujú sa naň <a>podmienky používania</a> a <a>zásady ochrany súkromia</a> Test Pilotu. Viac sa o zbieraní údajov experimentami dozviete <a>tu</a>.
|
||||
legalNoticeMozilla = Na použitie webovej stránky služby Firefox Send sa vzťahujú <a>zásady ochrany súkromia na webových stránkach</a> a <a>podmienky použitia webových stránok</a> Mozilly.
|
||||
deletePopupText = Naozaj chcete odstrániť tento súbor?
|
||||
deletePopupYes = Áno
|
||||
deletePopupCancel = Zrušiť
|
||||
deleteButtonHover
|
||||
.title = Odstrániť
|
||||
copyUrlHover
|
||||
.title = Skopírovať adresu URL
|
||||
footerLinkLegal = Právne informácie
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = O projekte Test Pilot
|
||||
footerLinkPrivacy = Súkromie
|
||||
footerLinkTerms = Podmienky používania
|
||||
footerLinkCookies = Cookies
|
||||
94
public/locales/sl/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = spletni poskus
|
||||
siteFeedback = Povratne informacije
|
||||
uploadPageHeader = Zasebno, šifrirano deljenje datotek
|
||||
uploadPageExplainer = Pošljite datoteke preko varne, zasebne in šifrirane povezave, ki samodejno poteče, kar vam zagotavlja, da vaše datoteke ne bodo ostale za vedno na spletu.
|
||||
uploadPageLearnMore = Več o tem
|
||||
uploadPageDropMessage = Tukaj spustite datoteko za začetek nalaganja
|
||||
uploadPageSizeMessage = Za zanesljivo delovanje je najbolje, da datoteka ne presega 1 GB
|
||||
uploadPageBrowseButton = Izberite datoteko na računalniku
|
||||
.title = Izberite datoteko na računalniku
|
||||
uploadPageMultipleFilesAlert = Nalaganje več datotek ali map trenutno ni podprto.
|
||||
uploadPageBrowseButtonTitle = Naloži datoteko
|
||||
uploadingPageHeader = Nalaganje datoteke
|
||||
importingFile = Uvažanje …
|
||||
verifyingFile = Preverjanje …
|
||||
encryptingFile = Šifriranje ...
|
||||
decryptingFile = Dešifriranje ...
|
||||
notifyUploadDone = Nalaganje je končano.
|
||||
uploadingPageMessage = Ko bo vaša datoteka naložena, boste lahko nastavili možnosti poteka.
|
||||
uploadingPageCancel = Prekliči nalaganje
|
||||
.title = Prekliči nalaganje
|
||||
uploadCancelNotification = Nalaganje je preklicano.
|
||||
uploadingPageLargeFileMessage = Datoteka je velika in lahko traja nekaj časa, da se naloži. Počakajte trenutek!
|
||||
uploadingFileNotification = Obvesti me, ko bo nalaganje končano.
|
||||
uploadSuccessConfirmHeader = Pripravljeno za pošiljanje
|
||||
uploadSvgAlt
|
||||
.alt = Naloži
|
||||
uploadSuccessTimingHeader = Povezava do vaše datoteke bo potekla po enem prenosu ali v 24 urah.
|
||||
copyUrlFormLabelWithName = Kopirajte in delite to povezavo, da pošljete datoteko: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Kopiraj v odložišče
|
||||
.title = Kopiraj v odložišče
|
||||
copiedUrl = Kopirano!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Izbriši datoteko
|
||||
.title = Izbriši datoteko
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Pošlji drugo datoteko
|
||||
.title = Pošlji drugo datoteko
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Prenesi
|
||||
downloadFileName = Prenesi { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Prijatelj vam pošilja datoteko preko storitve Firefox Send, ki vam omogoča deljenje datotek preko varne, zasebne in šifrirane povezave, ki samodejno poteče, kar vam zagotavlja, da vaše stvari ne ostanejo na spletu za vedno.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Prenesi
|
||||
.title = Prenesi
|
||||
downloadNotification = Vaš prenos je končan.
|
||||
downloadFinish = Prenos končan
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Preskusite Firefox Send
|
||||
.title = Preskusite Firefox Send
|
||||
downloadingPageProgress = Prenašanje { $filename } ({ $size })
|
||||
downloadingPageMessage = Medtem ko pridobivamo vašo datoteko in jo dešifriramo, pustite ta zavihek odprt.
|
||||
errorAltText
|
||||
.alt = Napaka pri nalaganju
|
||||
errorPageHeader = Prišlo je do težave!
|
||||
errorPageMessage = Pri nalaganju vaše datoteke je prišlo do napake.
|
||||
errorPageLink = Pošlji drugo datoteko
|
||||
fileTooBig = Ta datoteka je prevelika za nalaganje. Največja možna velikost je { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Povezava je potekla
|
||||
expiredPageHeader = Ta povezava je potekla ali pa sploh ni obstajala!
|
||||
notSupportedHeader = Vaš brskalnik ni podprt.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Ta brskalnik na žalost ne podpira tehnologije, na kateri temelji Firefox Send. Uporabiti boste morali drug brskalnik. Priporočamo Firefox!
|
||||
notSupportedOutdatedDetail = Ta brskalnik žal ne podpira tehnologije, na kateri temelji Firefox Send. Svoj brskalnik boste morali posodobiti.
|
||||
updateFirefox = Posodobi Firefox
|
||||
downloadFirefoxButtonSub = Brezplačen prenos
|
||||
uploadedFile = Datoteka
|
||||
copyFileList = Kopiraj spletni naslov
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Poteče
|
||||
deleteFileList = Izbriši
|
||||
nevermindButton = Pozabi
|
||||
legalHeader = Pogoji in zasebnost
|
||||
legalNoticeTestPilot = Firefox Send je trenutno poskus projekta Test Pilot ter zanj veljajo <a>pogoji uporabe</a> in <a>obvestilo o zasebnosti</a> Test Pilota. Več o tem poskusu in njegovem zbiranju podatkov lahko izveste <a>tukaj</a>.
|
||||
legalNoticeMozilla = Za uporabo spletne strani Firefox Send veljajo Mozillini <a>obvestilo o zasebnosti za spletne strani</a> in <a>pogoji uporabe spletnih strani</a>.
|
||||
deletePopupText = Izbrišem to datoteko?
|
||||
deletePopupYes = Da
|
||||
deletePopupCancel = Prekliči
|
||||
deleteButtonHover
|
||||
.title = Izbriši
|
||||
copyUrlHover
|
||||
.title = Kopiraj spletni naslov
|
||||
footerLinkLegal = Pravno obvestilo
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = O programu Test Pilot
|
||||
footerLinkPrivacy = Zasebnost
|
||||
footerLinkTerms = Pogoji
|
||||
footerLinkCookies = Piškotki
|
||||
96
public/locales/sv-SE/send.ftl
Normal file
@@ -0,0 +1,96 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = webbexperiment
|
||||
siteFeedback = Återkoppling
|
||||
uploadPageHeader = Privat, krypterad fildelning
|
||||
uploadPageExplainer = Skicka filer via en säker, privat och krypterad länk som automatiskt upphör för att säkerställa att dina saker inte förblir på nätet för alltid.
|
||||
uploadPageLearnMore = Läs mer
|
||||
uploadPageDropMessage = Släpp filen här för att börja ladda upp
|
||||
uploadPageSizeMessage = För den mest tillförlitliga driften är det bäst att hålla din fil under 1 GB
|
||||
uploadPageBrowseButton = Välj en fil på din dator
|
||||
.title = Välj en fil på din dator
|
||||
uploadPageMultipleFilesAlert = Överföring av flera filer eller en mapp stöds för närvarande inte.
|
||||
uploadPageBrowseButtonTitle = Ladda upp fil
|
||||
uploadingPageHeader = Överför din fil
|
||||
importingFile = Importerar…
|
||||
verifyingFile = Verifierar…
|
||||
encryptingFile = Krypterar…
|
||||
decryptingFile = Avkodar…
|
||||
notifyUploadDone = Din uppladdning har slutförts.
|
||||
uploadingPageMessage = När din filuppladdning är klar kommer du att kunna ange alternativ för upphörande.
|
||||
uploadingPageCancel = Avbryt uppladdning
|
||||
.title = Avbryt uppladdning
|
||||
uploadCancelNotification = Din uppladdning avbröts.
|
||||
uploadingPageLargeFileMessage = Den här filen är stor och kan ta ett tag att ladda upp. Ha tålamod!
|
||||
uploadingFileNotification = Meddela mig när uppladdningen är klar.
|
||||
uploadSuccessConfirmHeader = Klar för att skicka
|
||||
uploadSvgAlt
|
||||
.alt = Ladda upp
|
||||
uploadSuccessTimingHeader = Länken till din fil upphör att gälla efter 1 nedladdning eller om 24 timmar.
|
||||
copyUrlFormLabelWithName = Kopiera och dela länken för att skicka din fil: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Kopiera till urklipp
|
||||
.title = Kopiera till urklipp
|
||||
copiedUrl = Kopierad!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Ta bort fil
|
||||
.title = Ta bort fil
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Skicka en annan fil
|
||||
.title = Skicka en annan fil
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Ladda ner
|
||||
downloadFileName = Ladda ner { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Din vän skickar dig en fil med Firefox Send, en tjänst som låter dig dela filer med en säker, privat och krypterad länk som automatiskt upphör för att säkerställa att dina saker inte förblir på nätet för alltid.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Ladda ner
|
||||
.title = Ladda ner
|
||||
downloadNotification = Din nedladdning har slutförts.
|
||||
downloadFinish = Nedladdning klar
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Testa Firefox Send
|
||||
.title = Testa Firefox Send
|
||||
downloadingPageProgress = Laddar ner { $filename } ({ $size })
|
||||
downloadingPageMessage = Lämna den här fliken öppen medan vi laddar ner din fil och dekrypterar den.
|
||||
errorAltText
|
||||
.alt = Uppladdningsfel
|
||||
errorPageHeader = Något gick fel!
|
||||
errorPageMessage = Det har uppstått ett fel vid uppladdning av filen.
|
||||
errorPageLink = Skicka en annan fil
|
||||
fileTooBig = Den filen är för stor för att ladda upp. Det ska vara mindre än { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Länk upphörd
|
||||
expiredPageHeader = Den här länken har upphört eller har aldrig existerat i första hand!
|
||||
notSupportedHeader = Din webbläsare stöds inte.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Tyvärr stöder inte webbläsaren den webbteknologi som används av Firefox Send. Du måste försöka med en annan webbläsare. Vi rekommenderar Firefox!
|
||||
notSupportedOutdatedDetail =
|
||||
Tyvärr stödjer den här versionen av Firefox inte webbtekniken som driver Firefox Send. Du måste uppdatera din webbläsare.
|
||||
|
||||
updateFirefox = Uppdatera Firefox
|
||||
downloadFirefoxButtonSub = Gratis nedladdning
|
||||
uploadedFile = Fil
|
||||
copyFileList = Kopiera URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Upphör
|
||||
deleteFileList = Ta bort
|
||||
nevermindButton = Glöm det
|
||||
legalHeader = Villkor och sekretess
|
||||
legalNoticeTestPilot = Firefox Send är för närvarande ett Test Pilot experiment och omfattas av Test Pilots <a>användarvillkor</a> och <a>sekretesspolicy</a>. Du kan läsa dig mer om detta experiment och dess datainsamling <a>här</a>.
|
||||
legalNoticeMozilla = Användning av webbplatsen för Firefox Send är också föremål för Mozillas <a>sekretesspolicy för webbplatser</a> och <a>användarvillkor för webbplatser</a>.
|
||||
deletePopupText = Ta bort den här filen?
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Avbryt
|
||||
deleteButtonHover
|
||||
.title = Ta bort
|
||||
copyUrlHover
|
||||
.title = Kopiera URL
|
||||
footerLinkLegal = Juridisk information
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Om Test Pilot
|
||||
footerLinkPrivacy = Sekretess
|
||||
footerLinkTerms = Villkor
|
||||
footerLinkCookies = Kakor
|
||||
91
public/locales/tr/send.ftl
Normal file
@@ -0,0 +1,91 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = web deneyi
|
||||
siteFeedback = Görüş bildir
|
||||
uploadPageHeader = Kişiye özel, şifrelenmiş dosya paylaşımı
|
||||
uploadPageExplainer = Dosyalarınızı güvenli, size özel, şifrelenmiş ve otomatik olarak silinen bir bağlantıyla gönderin. Özel dosyalarınız sonsuza dek internette kalmasın.
|
||||
uploadPageLearnMore = Daha fazla bilgi alın
|
||||
uploadPageDropMessage = Yüklemeyi başlatmak için dosyanızı buraya bırakın
|
||||
uploadPageSizeMessage = Sorun yaşamamak adına dosyanızın 1 GB’den küçük olmasını öneririz
|
||||
uploadPageBrowseButton = Bilgisayarınızdan bir dosya seçin
|
||||
.title = Bilgisayarınızdan bir dosya seçin
|
||||
uploadPageMultipleFilesAlert = Birden fazla dosya veya klasör yükleme şimdilik desteklenmiyor.
|
||||
uploadPageBrowseButtonTitle = Dosyayı yükle
|
||||
uploadingPageHeader = Dosyanız yükleniyor
|
||||
importingFile = İçe aktarılıyor…
|
||||
verifyingFile = Doğrulanıyor…
|
||||
encryptingFile = Şifreleniyor…
|
||||
decryptingFile = Şifre çözülüyor…
|
||||
notifyUploadDone = Yüklemeniz tamamlandı.
|
||||
uploadingPageMessage = Dosyanız yüklendikten sonra zaman aşımını ayarlayabileceksiniz.
|
||||
uploadingPageCancel = Yüklemeyi iptal et
|
||||
.title = Yüklemeyi iptal et
|
||||
uploadCancelNotification = Yüklemeniz iptal edildi.
|
||||
uploadingPageLargeFileMessage = Bu dosya büyük olduğu için yüklenmesi zaman alabilir. Sayfayı kapatmayın!
|
||||
uploadingFileNotification = Yükleme bitince bana haber ver.
|
||||
uploadSuccessConfirmHeader = Göndermeye hazır
|
||||
uploadSvgAlt
|
||||
.alt = Yükle
|
||||
uploadSuccessTimingHeader = Dosyanız 1 kez indirildikten veya 24 saat geçtikten sonra linkiniz geçersiz olacaktır.
|
||||
copyUrlFormLabelWithName = { $filename } dosyanızı başkasına göndermek için aşağıdaki linki kopyalayın.
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Panoya kopyala
|
||||
copiedUrl = Kopyalandı!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Dosyayı sil
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Başka bir dosya daha gönder
|
||||
.title = Başka bir dosya daha gönder
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = İndir
|
||||
downloadFileName = { $filename } dosyasını indir
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Arkadaşınız size Firefox Send ile bir dosya gönderdi. Firefox Send; dosyalarınızı güvenli, size özel, şifrelenmiş ve otomatik olarak silinen bir bağlantıyla paylaşmayı sağlar. Böylece özel dosyalarınız sonsuza dek internette kalmaz.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = İndir
|
||||
.title = İndir
|
||||
downloadNotification = İndirme tamamlandı.
|
||||
downloadFinish = İndirme tamamlandı
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = Firefox Send’i deneyin
|
||||
downloadingPageProgress = { $filename } indiriliyor ({ $size })
|
||||
downloadingPageMessage = Dosyanız indirilip şifresi çözülürken lütfen bu sekmeyi açık bırakın.
|
||||
errorAltText
|
||||
.alt = Yükleme hatası
|
||||
errorPageHeader = Bir şeyler ters gitti!
|
||||
errorPageMessage = Dosyanız yüklenirken bir hata oluştu.
|
||||
errorPageLink = Başka bir dosya gönder
|
||||
fileTooBig = Dosyanız çok büyük. En fazla { $size } boyutunda olmalı.
|
||||
linkExpiredAlt
|
||||
.alt = Bağlantı zaman aşımına uğramış
|
||||
expiredPageHeader = Bu bağlantı zaman aşımına uğramış veya böyle bir bağlantı hiç yoktu.
|
||||
notSupportedHeader = Tarayıcınız desteklenmiyor.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Ne yazık ki tarayıcınız Firefox Send için gereken web teknolojilerini desteklemiyor. Başka bir tarayıcıyla deneyebilirsiniz. Önerimiz tabii ki Firefox!
|
||||
notSupportedOutdatedDetail = Kullandığınız Firefox sürümü Firefox Send için gereken web teknolojilerini desteklemiyor. Tarayıcınızı güncellemeniz gerekiyor.
|
||||
updateFirefox = Firefox’u güncelle
|
||||
downloadFirefoxButtonSub = Ücretsiz indirin
|
||||
uploadedFile = Dosya
|
||||
copyFileList = Adresi kopyala
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Bitiş süresi
|
||||
deleteFileList = Sil
|
||||
nevermindButton = Boş ver
|
||||
legalHeader = Şart ve Koşullar
|
||||
legalNoticeTestPilot = Firefox Send bir Test Pilotu deneyidir ve Test Pilotu <a>Hizmet Koşulları</a> ile <a>Gizlilik Bildirimi</a>’ne tabidir. Bu deney ve topladığı veriler hakkında daha fazla bilgi almak isterseniz <a>buraya</a> bakabilirsiniz.
|
||||
legalNoticeMozilla = Firefox Send’i kullanmak Mozilla’nın <a>Web Siteleri Gizlilik Bildirimi</a> ve <a>Web Siteleri Kullanım Koşulları</a>’na da tabidir.
|
||||
deletePopupText = Bu dosya silinsin mi?
|
||||
deletePopupYes = Evet
|
||||
deletePopupCancel = Vazgeç
|
||||
deleteButtonHover
|
||||
.title = Sil
|
||||
copyUrlHover
|
||||
.title = Adresi kopyala
|
||||
footerLinkLegal = Yasal Bilgiler
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilotu hakkında
|
||||
footerLinkPrivacy = Gizlilik
|
||||
footerLinkTerms = Şartlar
|
||||
footerLinkCookies = Çerezler
|
||||
94
public/locales/zh-CN/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = Web 实验
|
||||
siteFeedback = 反馈
|
||||
uploadPageHeader = 私密、安全的文件分享服务
|
||||
uploadPageExplainer = 通过一个安全、私密且受加密的链接发送文件,链接到期后文件将从网上彻底抹去。
|
||||
uploadPageLearnMore = 详细了解
|
||||
uploadPageDropMessage = 拖放您的文件到此处以开始上传
|
||||
uploadPageSizeMessage = 为保证运行稳定,建议文件大小不超过 1GB
|
||||
uploadPageBrowseButton = 选择一个您电脑上的文件
|
||||
.title = 选择一个您电脑上的文件
|
||||
uploadPageMultipleFilesAlert = 目前不支持上传多个文件或上传文件夹。
|
||||
uploadPageBrowseButtonTitle = 上传文件
|
||||
uploadingPageHeader = 正在上传您的文件
|
||||
importingFile = 正在导入…
|
||||
verifyingFile = 正在验证…
|
||||
encryptingFile = 正在加密…
|
||||
decryptingFile = 正在解密…
|
||||
notifyUploadDone = 您的上传已完成。
|
||||
uploadingPageMessage = 在文件上传后,您可以设定过期选项。
|
||||
uploadingPageCancel = 取消上传
|
||||
.title = 取消上传
|
||||
uploadCancelNotification = 您的上传已取消。
|
||||
uploadingPageLargeFileMessage = 此文件较大,可能要花费一些时间。请稍候。
|
||||
uploadingFileNotification = 上传完成后通知我。
|
||||
uploadSuccessConfirmHeader = 准备好发送
|
||||
uploadSvgAlt
|
||||
.alt = 上传
|
||||
uploadSuccessTimingHeader = 您的文件的链接将在首次下载或 24 小时后过期。
|
||||
copyUrlFormLabelWithName = 复制并分享链接以发送您的文件:{ $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = 复制到剪贴板
|
||||
.title = 复制到剪贴板
|
||||
copiedUrl = 已复制!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = 删除文件
|
||||
.title = 删除文件
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = 发送其他文件
|
||||
.title = 发送其他文件
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = 下载
|
||||
downloadFileName = 下载 { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = 您的朋友使用 Firefox Send 向您发送一个文件。该服务允许用户以安全、私密、受加密的链接分享一个文件,链接到期后文件将从网上彻底抹去。
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = 下载
|
||||
.title = 下载
|
||||
downloadNotification = 您的下载已完成。
|
||||
downloadFinish = 下载完成
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = 尝试 Firefox Send
|
||||
.title = 尝试 Firefox Send
|
||||
downloadingPageProgress = 正在下载 { $filename } ({ $size })
|
||||
downloadingPageMessage = 在我们获取您的文件并解密的期间,请不要关闭此网页。
|
||||
errorAltText
|
||||
.alt = 上传出错
|
||||
errorPageHeader = 我们遇到错误。
|
||||
errorPageMessage = 上传文件时发生错误。
|
||||
errorPageLink = 发送其他文件
|
||||
fileTooBig = 此文件太大。文件大小上限为 { $size }。
|
||||
linkExpiredAlt
|
||||
.alt = 链接已过期
|
||||
expiredPageHeader = 此链接已过期或者从未生效。
|
||||
notSupportedHeader = 不支持您的浏览器。
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = 很可惜,您的浏览器不支持 Firefox Send 所使用的 Web 技术。请改用其他浏览器。我们推荐使用 Firefox!
|
||||
notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支持 Firefox Send 所使用的 Web 技术。您需要更新浏览器才能使用它。
|
||||
updateFirefox = 更新 Firefox
|
||||
downloadFirefoxButtonSub = 免费下载
|
||||
uploadedFile = 文件
|
||||
copyFileList = 复制网址
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = 过期时间
|
||||
deleteFileList = 删除
|
||||
nevermindButton = 没关系
|
||||
legalHeader = 条款和隐私
|
||||
legalNoticeTestPilot = Firefox Send 目前是一个 Test Pilot 实验,并遵守 Test Pilot <a>服务条款</a>和<a>隐私声明</a>。您可以在<a>这里</a>了解此实验及数据收集的有关信息。
|
||||
legalNoticeMozilla = 使用 Firefox Send 网站亦受到 Mozilla <a>网站隐私声明</a>和<a>网站使用条款</a>的约束。
|
||||
deletePopupText = 删除此文件?
|
||||
deletePopupYes = 是
|
||||
deletePopupCancel = 取消
|
||||
deleteButtonHover
|
||||
.title = 删除
|
||||
copyUrlHover
|
||||
.title = 复制网址
|
||||
footerLinkLegal = 法律
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = 关于 Test Pilot
|
||||
footerLinkPrivacy = 隐私
|
||||
footerLinkTerms = 条款
|
||||
footerLinkCookies = Cookie
|
||||
94
public/locales/zh-TW/send.ftl
Normal file
@@ -0,0 +1,94 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = 網頁實驗
|
||||
siteFeedback = 意見回饋
|
||||
uploadPageHeader = 私密、有加密的檔案分享服務
|
||||
uploadPageExplainer = 透過安全、隱私、加密過的管道來傳送檔案,而且鏈結會自動過期,可確保您的東西不會在網路上無限停留。
|
||||
uploadPageLearnMore = 了解更多
|
||||
uploadPageDropMessage = 將檔案放到此處開始上傳
|
||||
uploadPageSizeMessage = 為了讓系統能最穩定地執行,請盡量將檔案控制在 1GB 以下。
|
||||
uploadPageBrowseButton = 選擇您電腦上的檔案
|
||||
.title = 選擇您電腦上的檔案
|
||||
uploadPageMultipleFilesAlert = 目前暫不支援上傳多個檔案或資料夾。
|
||||
uploadPageBrowseButtonTitle = 上傳檔案
|
||||
uploadingPageHeader = 正在上傳檔案
|
||||
importingFile = 匯入中…
|
||||
verifyingFile = 驗證中…
|
||||
encryptingFile = 加密中…
|
||||
decryptingFile = 解密中…
|
||||
notifyUploadDone = 已完成上傳。
|
||||
uploadingPageMessage = 檔案上傳後,即可設定過期時間。
|
||||
uploadingPageCancel = 取消上傳
|
||||
.title = 取消上傳
|
||||
uploadCancelNotification = 已取消上傳。
|
||||
uploadingPageLargeFileMessage = 這個檔案有點大,可能需要花點時間上傳,再等會兒!
|
||||
uploadingFileNotification = 上傳完成時通知我。
|
||||
uploadSuccessConfirmHeader = 準備好傳送
|
||||
uploadSvgAlt
|
||||
.alt = 上傳
|
||||
uploadSuccessTimingHeader = 您的檔案鏈結將會在首次下載,或 24 小時後失效。
|
||||
copyUrlFormLabelWithName = 複製並分享鏈結來傳送您的檔案: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = 複製到剪貼簿
|
||||
.title = 複製到剪貼簿
|
||||
copiedUrl = 已複製!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = 刪除檔案
|
||||
.title = 刪除檔案
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = 傳送另一個檔案
|
||||
.title = 傳送另一個檔案
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = 下載
|
||||
downloadFileName = 下載 { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = 您的朋友正透過 Firefox Send 傳送檔案給您。這是一個可讓您透過安全、隱密、並且會將鏈結加密過,自動失效以確保檔案不會在網路上無限停留的檔案分享服務。
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = 下載
|
||||
.title = 下載
|
||||
downloadNotification = 下載完成。
|
||||
downloadFinish = 下載完成
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
sendYourFilesLink = 試用 Firefox Send
|
||||
.title = 試用 Firefox Send
|
||||
downloadingPageProgress = 正在下載 { $filename }({ $size })
|
||||
downloadingPageMessage = 請保留此分頁開啟,我們將取回這個檔案並進行解密。
|
||||
errorAltText
|
||||
.alt = 上傳錯誤
|
||||
errorPageHeader = 有些東西不對勁!
|
||||
errorPageMessage = 上傳檔案時發生錯誤。
|
||||
errorPageLink = 傳送另一個檔案
|
||||
fileTooBig = 檔案太大無法上傳。檔案大小限制為 { $size }。
|
||||
linkExpiredAlt
|
||||
.alt = 鏈結已過期
|
||||
expiredPageHeader = 鏈結已失效,或根本不存在!
|
||||
notSupportedHeader = 不支援您的瀏覽器。
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = 很可惜,您使用的瀏覽器並不支援 Firefox Send 所需的 Web 技術。請改用其他瀏覽器,我們推薦使用 Firefox!
|
||||
notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支援 Firefox Send 所需的 Web 技術。請更新瀏覽器後再使用。
|
||||
updateFirefox = 更新 Firefox
|
||||
downloadFirefoxButtonSub = 免費下載
|
||||
uploadedFile = 檔案
|
||||
copyFileList = 複製網址
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = 失效於
|
||||
deleteFileList = 刪除
|
||||
nevermindButton = 沒關係
|
||||
legalHeader = 使用條款及隱私權
|
||||
legalNoticeTestPilot = Firefox Send 目前是一個 Test Pilot 實驗,依照 Test Pilot 的<a>服務條款</a>及<a>隱私權公告</a>提供服務。您可以在<a>此處</a>了解實驗內容,以及所收集資料的詳細資訊。
|
||||
legalNoticeMozilla = 使用 Firefox Send 網站時,亦受到 Mozilla 的<a>網站隱私權公告</a>以及<a>網站使用條款</a>約束。
|
||||
deletePopupText = 真的要刪除這個檔案嗎?
|
||||
deletePopupYes = 好的,刪除
|
||||
deletePopupCancel = 不要刪除
|
||||
deleteButtonHover
|
||||
.title = 刪除
|
||||
copyUrlHover
|
||||
.title = 複製網址
|
||||
footerLinkLegal = 法律資訊
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = 關於 Test Pilot
|
||||
footerLinkPrivacy = 隱私權
|
||||
footerLinkTerms = 使用條款
|
||||
footerLinkCookies = Cookie
|
||||
816
public/main.css
@@ -1,44 +1,180 @@
|
||||
/*** index.html ***/
|
||||
html {
|
||||
background: url('resources/background.png');
|
||||
font-family: 'Fira Sans';
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
background-size: contain;
|
||||
background: url('resources/send_bg.svg');
|
||||
font-family: -apple-system,
|
||||
BlinkMacSystemFont,
|
||||
'SF Pro Text',
|
||||
Helvetica,
|
||||
Arial,
|
||||
sans-serif;
|
||||
font-weight: 200;
|
||||
background-size: 110%;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center top;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
flex-direction: column;
|
||||
max-width: 1440px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
input, select, textarea, button {
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin: 0;
|
||||
min-height: 100vh;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.header {
|
||||
align-items: flex-start;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 31px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.send-logo {
|
||||
display: flex;
|
||||
position: relative;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.send-logo > a {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.site-title {
|
||||
color: #3e3d40;
|
||||
font-size: 32px;
|
||||
font-weight: 500;
|
||||
margin: 0;
|
||||
position: relative;
|
||||
top: -1px;
|
||||
letter-spacing: 1px;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.site-subtitle {
|
||||
color: #3e3d40;
|
||||
font-size: 12px;
|
||||
margin: 0 8px;
|
||||
}
|
||||
|
||||
.site-subtitle a {
|
||||
font-weight: bold;
|
||||
color: #3e3d40;
|
||||
transition: color 50ms;
|
||||
}
|
||||
|
||||
.send-logo:hover a {
|
||||
color: #0297f8;
|
||||
}
|
||||
|
||||
.feedback {
|
||||
background-color: #0297f8;
|
||||
background-image: url('resources/feedback.svg');
|
||||
background-position: 2px 4px;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 18px;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #0297f8;
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
float: right;
|
||||
font-size: 12px;
|
||||
line-height: 12px;
|
||||
opacity: 0.9;
|
||||
padding: 5px;
|
||||
overflow: hidden;
|
||||
min-width: 12px;
|
||||
max-width: 12px;
|
||||
text-indent: 17px;
|
||||
transition: all 250ms ease-in-out;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.feedback:hover,
|
||||
.feedback:focus {
|
||||
min-width: 30px;
|
||||
max-width: 300px;
|
||||
text-indent: 2px;
|
||||
padding: 5px 5px 5px 20px;
|
||||
background-color: #0287e8;
|
||||
}
|
||||
|
||||
.feedback:active {
|
||||
background-color: #0277d8;
|
||||
}
|
||||
|
||||
.all {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
max-width: 630px;
|
||||
margin: 0 auto;
|
||||
padding: 0 20px;
|
||||
box-sizing: border-box;
|
||||
width: 96%;
|
||||
}
|
||||
|
||||
input,
|
||||
select,
|
||||
textarea,
|
||||
button {
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
/** page-one **/
|
||||
.main-window {
|
||||
border: 1px solid;
|
||||
width: 606px;
|
||||
min-height: 447px;
|
||||
background-color: white;
|
||||
border-radius: 5px;
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/** page-one **/
|
||||
|
||||
.title {
|
||||
font-size: 14px;
|
||||
width: 80%;
|
||||
margin: 40px auto;
|
||||
font-size: 33px;
|
||||
line-height: 40px;
|
||||
margin: 20px auto;
|
||||
text-align: center;
|
||||
max-width: 520px;
|
||||
font-family: 'SF Pro Display', sans-serif;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 15px;
|
||||
line-height: 23px;
|
||||
max-width: 630px;
|
||||
text-align: center;
|
||||
margin: 0 auto 60px;
|
||||
color: #0c0c0d;
|
||||
width: 92%;
|
||||
}
|
||||
|
||||
.upload-window {
|
||||
border: 1px dashed;
|
||||
border: 1px dashed rgba(0, 148, 251, 0.5);
|
||||
margin: 0 auto;
|
||||
width: 470px;
|
||||
height: 250px;
|
||||
border-radius: 5px;
|
||||
height: 255px;
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
transition: transform 150ms;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.upload-window.ondrag {
|
||||
border: 3px dashed rgba(0, 148, 251, 0.5);
|
||||
margin: 0 auto;
|
||||
height: 251px;
|
||||
transform: scale(1.04);
|
||||
border-radius: 4.2px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
@@ -46,112 +182,135 @@ input, select, textarea, button {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.link {
|
||||
color: #0094fb;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.link:hover {
|
||||
color: #0287e8;
|
||||
}
|
||||
|
||||
#upload-text {
|
||||
font-size: 22px;
|
||||
color: #737373;
|
||||
margin: 20px 0 10px;
|
||||
font-family: 'SF Pro Display', sans-serif;
|
||||
}
|
||||
|
||||
#browse {
|
||||
float: right;
|
||||
color: #2D7EFF;
|
||||
}
|
||||
|
||||
#browse-text {
|
||||
float: left;
|
||||
width: 128px;
|
||||
}
|
||||
|
||||
#upload-img {
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.upload-window > div:nth-child(2) {
|
||||
font-size: 26px;
|
||||
}
|
||||
|
||||
.upload {
|
||||
font-size: 12px;
|
||||
width: auto;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.file-upload {
|
||||
background: #0297f8;
|
||||
border-radius: 5px;
|
||||
font-size: 15px;
|
||||
color: #fff;
|
||||
width: 240px;
|
||||
height: 44px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#browse:hover {
|
||||
background-color: #0287e8;
|
||||
}
|
||||
|
||||
input[type="file"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
form {
|
||||
width: 45px;
|
||||
float: right;
|
||||
#file-size-msg {
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
color: #737373;
|
||||
margin-bottom: 22px;
|
||||
}
|
||||
|
||||
/** file-list **/
|
||||
th {
|
||||
font-size: 10px;
|
||||
color: #737373;
|
||||
font-weight: normal;
|
||||
font-size: 16px;
|
||||
color: #858585;
|
||||
font-weight: lighter;
|
||||
text-align: left;
|
||||
background: rgba(0, 148, 251, 0.05);
|
||||
height: 40px;
|
||||
border-top: 1px solid rgba(0, 148, 251, 0.1);
|
||||
padding: 0 19px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
td {
|
||||
font-size: 12px;
|
||||
font-size: 15px;
|
||||
vertical-align: top;
|
||||
color: #4a4a4a;
|
||||
padding: 17px 19px 0;
|
||||
line-height: 23px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
table {
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
|
||||
}
|
||||
|
||||
tbody {
|
||||
word-wrap: break-word;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
#uploaded-files {
|
||||
width: 472px;
|
||||
margin: 10px auto;
|
||||
margin: 45.3px auto;
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
||||
.delete-btn {
|
||||
padding: 0;
|
||||
border: none;
|
||||
background: none;
|
||||
.icon-delete,
|
||||
.icon-copy,
|
||||
.icon-check {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Popup container */
|
||||
.popup {
|
||||
position: relative;
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* The actual popup (appears on top) */
|
||||
.popup .popuptext {
|
||||
visibility: hidden;
|
||||
width: 160px;
|
||||
background-color: #555;
|
||||
color: #FFF;
|
||||
min-width: 204px;
|
||||
min-height: 105px;
|
||||
background-color: #fff;
|
||||
color: #000;
|
||||
border: 1px solid #d7d7db;
|
||||
padding: 15px 24px;
|
||||
box-sizing: content-box;
|
||||
text-align: center;
|
||||
border-radius: 6px;
|
||||
padding: 8px 0;
|
||||
border-radius: 5px;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
bottom: 125%;
|
||||
left: 50%;
|
||||
margin-left: -80px;
|
||||
bottom: 20px;
|
||||
left: -40px;
|
||||
transition: opacity 0.5s;
|
||||
opacity: 0;
|
||||
outline: 0;
|
||||
box-shadow: 3px 3px 7px rgba(136, 136, 136, 0.3);
|
||||
}
|
||||
|
||||
/* Popup arrow */
|
||||
.popup .popuptext::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 50%;
|
||||
margin-left: -5px;
|
||||
border-width: 5px;
|
||||
border-style: solid;
|
||||
border-color: #555 transparent transparent;
|
||||
bottom: -11px;
|
||||
left: 20px;
|
||||
background-color: #fff;
|
||||
display: block;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
transform: rotate(45deg);
|
||||
border-radius: 0 0 5px;
|
||||
border-right: 1px solid #d7d7db;
|
||||
border-bottom: 1px solid #d7d7db;
|
||||
}
|
||||
|
||||
.popup .show {
|
||||
@@ -159,32 +318,120 @@ tbody {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/** upload-progress **/
|
||||
#progress-bar {
|
||||
width: 300px;
|
||||
height: 5px;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
#FD9800,
|
||||
#D73000 var(--progress),
|
||||
white var(--progress)
|
||||
);
|
||||
border: 0.5px solid;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
/** share-link **/
|
||||
.share-window {
|
||||
margin: 0 auto;
|
||||
width: 470px;
|
||||
height: 250px;
|
||||
.popup-message {
|
||||
height: 40px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border-bottom: 1px #ebebeb solid;
|
||||
color: #0c0c0d;
|
||||
font-size: 15px;
|
||||
font-weight: normal;
|
||||
padding-bottom: 15px;
|
||||
white-space: nowrap;
|
||||
width: calc(100% + 48px);
|
||||
margin-left: -24px;
|
||||
}
|
||||
|
||||
#share-window-r {
|
||||
width: 50%;
|
||||
.popup-action {
|
||||
margin-top: 15px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.popup-yes {
|
||||
color: #fff;
|
||||
background-color: #0297f8;
|
||||
border-radius: 5px;
|
||||
padding: 5px 25px;
|
||||
font-weight: normal;
|
||||
cursor: pointer;
|
||||
min-width: 94px;
|
||||
box-sizing: border-box;
|
||||
white-space: nowrap;
|
||||
margin-left: 12px;
|
||||
}
|
||||
|
||||
.popup-yes:hover {
|
||||
background-color: #0287e8;
|
||||
}
|
||||
|
||||
.popup-no {
|
||||
color: #4a4a4a;
|
||||
background-color: #fbfbfb;
|
||||
border: 1px #c1c1c1 solid;
|
||||
border-radius: 5px;
|
||||
padding: 5px 25px;
|
||||
font-weight: normal;
|
||||
min-width: 94px;
|
||||
box-sizing: border-box;
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.popup-no:hover {
|
||||
background-color: #efeff1;
|
||||
}
|
||||
|
||||
/** upload-progress **/
|
||||
.progress-bar {
|
||||
margin-top: 3px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.percentage {
|
||||
position: absolute;
|
||||
letter-spacing: -0.78px;
|
||||
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
|
||||
top: 53px;
|
||||
left: 246.75px;
|
||||
width: 98.5px;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.percent-number {
|
||||
font-size: 43.2px;
|
||||
line-height: 58px;
|
||||
}
|
||||
|
||||
.percent-sign {
|
||||
font-size: 28.8px;
|
||||
color: rgb(104, 104, 104);
|
||||
}
|
||||
|
||||
.upload {
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.progress-text {
|
||||
color: rgba(0, 0, 0, 0.5);
|
||||
letter-spacing: -0.4px;
|
||||
margin-top: 24px;
|
||||
margin-bottom: 74px;
|
||||
}
|
||||
|
||||
#cancel-upload {
|
||||
color: #d70022;
|
||||
cursor: pointer;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/** share-link **/
|
||||
#share-window {
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
@@ -200,61 +447,191 @@ tbody {
|
||||
#copy {
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
width: 640px;
|
||||
}
|
||||
|
||||
#copy-text {
|
||||
align-self: flex-start;
|
||||
margin-top: 60px;
|
||||
margin-bottom: 10px;
|
||||
color: #0c0c0d;
|
||||
max-width: 614px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
#link {
|
||||
width: 216px;
|
||||
height: 41px;
|
||||
border: 1px solid #979797;
|
||||
flex: 1;
|
||||
height: 56px;
|
||||
border: 1px solid #0297f8;
|
||||
border-radius: 6px 0 0 6px;
|
||||
font-size: 24px;
|
||||
color: #737373;
|
||||
font-family: 'SF Pro Display', sans-serif;
|
||||
letter-spacing: 0;
|
||||
line-height: 23px;
|
||||
font-weight: 300;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
#link:disabled {
|
||||
border: 1px solid #05a700;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#copy-btn {
|
||||
width: 60px;
|
||||
height: 45px;
|
||||
background: #337FEB;
|
||||
border: 1px solid #979797;
|
||||
flex: 0 1 165px;
|
||||
background: #0297f8;
|
||||
border-radius: 0 6px 6px 0;
|
||||
border: 1px solid #0297f8;
|
||||
color: white;
|
||||
cursor: pointer;
|
||||
font-size: 15px;
|
||||
height: 60px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#copy-btn:hover {
|
||||
background-color: #0287e8;
|
||||
}
|
||||
|
||||
#copy-btn:disabled {
|
||||
background: #47B04B;
|
||||
background: #05a700;
|
||||
border: 1px solid #05a700;
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
.send-new {
|
||||
font-size: 14px;
|
||||
margin: auto;
|
||||
width: 80%;
|
||||
text-align: center;
|
||||
color: #2D7EFF;
|
||||
#delete-file {
|
||||
width: 176px;
|
||||
height: 44px;
|
||||
background: #fff;
|
||||
border: 1px solid rgba(12, 12, 13, 0.3);
|
||||
border-radius: 5px;
|
||||
font-size: 15px;
|
||||
margin-top: 50px;
|
||||
margin-bottom: 12px;
|
||||
cursor: pointer;
|
||||
color: #313131;
|
||||
}
|
||||
|
||||
#delete-file:hover {
|
||||
background: #efeff1;
|
||||
}
|
||||
|
||||
.send-new {
|
||||
font-size: 15px;
|
||||
margin: auto;
|
||||
text-align: center;
|
||||
color: #0094fb;
|
||||
cursor: pointer;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.send-new:hover,
|
||||
.send-new:focus,
|
||||
.send-new:active {
|
||||
color: #0287e8;
|
||||
}
|
||||
|
||||
/* upload-error */
|
||||
#upload-error {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#upload-error[hidden],
|
||||
#unsupported-browser[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#upload-error-img {
|
||||
margin: 51px 0 71px;
|
||||
}
|
||||
|
||||
/* unsupported-browser */
|
||||
#unsupported-browser {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.unsupported-description {
|
||||
font-size: 13px;
|
||||
line-height: 23px;
|
||||
text-align: center;
|
||||
color: #7d7d7d;
|
||||
margin: 0 auto 23px;
|
||||
}
|
||||
|
||||
.firefox-logo {
|
||||
width: 70px;
|
||||
}
|
||||
|
||||
#dl-firefox,
|
||||
#update-firefox {
|
||||
margin-bottom: 181px;
|
||||
height: 80px;
|
||||
background: #12bc00;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
border: 0;
|
||||
box-shadow: 0 5px 3px rgb(234, 234, 234);
|
||||
font-family: 'Fira Sans';
|
||||
font-weight: 500;
|
||||
color: #fff;
|
||||
font-size: 26px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
line-height: 1;
|
||||
padding: 0 25px;
|
||||
}
|
||||
|
||||
.unsupported-button-text {
|
||||
text-align: left;
|
||||
margin-left: 20.4px;
|
||||
}
|
||||
|
||||
.unsupported-button-text > span {
|
||||
font-family: 'Fira Sans';
|
||||
font-weight: 300;
|
||||
font-size: 18px;
|
||||
letter-spacing: -0.69px;
|
||||
}
|
||||
|
||||
/** download.html **/
|
||||
#download-btn {
|
||||
font-size: 18px;
|
||||
font-size: 15px;
|
||||
color: white;
|
||||
width: 214px;
|
||||
height: 87px;
|
||||
margin: 50px auto;
|
||||
width: 180px;
|
||||
height: 44px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 30px;
|
||||
text-align: center;
|
||||
background: #337FEB;
|
||||
border: 1px solid #3EA050;
|
||||
border-radius: 6px;
|
||||
background: #0297f8;
|
||||
border: 1px solid #0297f8;
|
||||
border-radius: 5px;
|
||||
font-weight: 300;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#download-btn:hover {
|
||||
background-color: #0287e8;
|
||||
}
|
||||
|
||||
#download-btn:disabled {
|
||||
background: #47B04B;
|
||||
background: #47b04b;
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
#download-page-one {
|
||||
#download {
|
||||
margin: 0 auto;
|
||||
width: 470px;
|
||||
height: 250px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
@@ -263,20 +640,187 @@ tbody {
|
||||
}
|
||||
|
||||
#expired-img {
|
||||
display: none;
|
||||
margin: 51px 0 71px;
|
||||
}
|
||||
|
||||
.expired-description {
|
||||
font-size: 15px;
|
||||
line-height: 23px;
|
||||
text-align: center;
|
||||
color: #7d7d7d;
|
||||
margin: 0 auto 23px;
|
||||
}
|
||||
|
||||
#download-progress {
|
||||
margin: 0 auto;
|
||||
width: 470px;
|
||||
height: 250px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
width: 590px;
|
||||
}
|
||||
|
||||
#download-text {
|
||||
margin-bottom: 40px;
|
||||
#download-progress[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#download-img {
|
||||
width: 283px;
|
||||
height: 196px;
|
||||
}
|
||||
|
||||
/* footer */
|
||||
.footer {
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
font-size: 13px;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
padding: 50px 31px 41px;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.mozilla-logo {
|
||||
width: 112px;
|
||||
height: 32px;
|
||||
margin-bottom: -5px;
|
||||
}
|
||||
|
||||
.legal-links {
|
||||
width: 81vw;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.legal-links > a {
|
||||
color: #858585;
|
||||
opacity: 0.9;
|
||||
white-space: nowrap;
|
||||
margin-right: 2vw;
|
||||
}
|
||||
|
||||
.legal-links > a:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.legal-links > a:visited {
|
||||
color: #858585;
|
||||
}
|
||||
|
||||
.social-links {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 94px;
|
||||
}
|
||||
|
||||
.social-links > a {
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.social-links > a:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.github,
|
||||
.twitter {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin-bottom: -5px;
|
||||
}
|
||||
|
||||
@media (max-device-width: 992px), (max-width: 992px) {
|
||||
.popup .popuptext {
|
||||
left: auto;
|
||||
right: -40px;
|
||||
}
|
||||
|
||||
.popup .popuptext::after {
|
||||
left: auto;
|
||||
right: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-device-width: 768px), (max-width: 768px) {
|
||||
.description {
|
||||
margin: 0 auto 25px;
|
||||
}
|
||||
|
||||
#copy {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#link {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
align-items: flex-start;
|
||||
max-width: 630px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.mozilla-logo {
|
||||
margin-left: -7px;
|
||||
}
|
||||
|
||||
.legal-links {
|
||||
flex-direction: column;
|
||||
margin: auto;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.legal-links > * {
|
||||
display: block;
|
||||
padding: 10px 0;
|
||||
align-self: flex-start;
|
||||
}
|
||||
|
||||
.social-links {
|
||||
margin-top: 20px;
|
||||
align-self: flex-start;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-device-width: 520px), (max-width: 520px) {
|
||||
.header {
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.feedback {
|
||||
margin-top: 10px;
|
||||
min-width: 30px;
|
||||
max-width: 300px;
|
||||
text-indent: 2px;
|
||||
padding: 5px 5px 5px 20px;
|
||||
}
|
||||
|
||||
#copy {
|
||||
width: 100%;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
#link {
|
||||
font-size: 22px;
|
||||
padding: 15px 10px;
|
||||
border-radius: 6px 6px 0 0;
|
||||
}
|
||||
|
||||
#copy-btn {
|
||||
border-radius: 0 0 6px 6px;
|
||||
flex: 0 1 65px;
|
||||
}
|
||||
|
||||
th {
|
||||
font-size: 14px;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
td {
|
||||
font-size: 13px;
|
||||
padding: 17px 5px 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 2.5 MiB |
1
public/resources/check-16.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 16 16"><path fill="#fff" d="M6 14a1 1 0 0 1-.707-.293l-3-3a1 1 0 0 1 1.414-1.414l2.157 2.157 6.316-9.023a1 1 0 0 1 1.639 1.146l-7 10a1 1 0 0 1-.732.427A.863.863 0 0 1 6 14z"/></svg>
|
||||
|
After Width: | Height: | Size: 257 B |
1
public/resources/close-16.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#4A4A4A" d="M9.414 8l5.293-5.293a1 1 0 0 0-1.414-1.414L8 6.586 2.707 1.293a1 1 0 0 0-1.414 1.414L6.586 8l-5.293 5.293a1 1 0 1 0 1.414 1.414L8 9.414l5.293 5.293a1 1 0 0 0 1.414-1.414z"/></svg>
|
||||
|
After Width: | Height: | Size: 286 B |
1
public/resources/copy-16.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path class="icon-copy" fill="#0A8DFF" d="M14.707 8.293l-3-3A1 1 0 0 0 11 5h-1V4a1 1 0 0 0-.293-.707l-3-3A1 1 0 0 0 6 0H3a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3v3a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2V9a1 1 0 0 0-.293-.707zM12.586 9H11V7.414zm-5-5H6V2.414zM6 7v2H3V2h2v2.5a.5.5 0 0 0 .5.5H8a2 2 0 0 0-2 2zm2 7V7h2v2.5a.5.5 0 0 0 .5.5H13v4z"/></svg>
|
||||
|
After Width: | Height: | Size: 416 B |
BIN
public/resources/favicon-32x32.png
Executable file
|
After Width: | Height: | Size: 1.8 KiB |
1
public/resources/feedback.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="15" height="13" viewBox="0 0 15 13" xmlns="http://www.w3.org/2000/svg"><title>Combined Shape</title><path d="M10.274 9.193a5.957 5.957 0 0 1-2.98.778C4.37 9.97 2 7.963 2 5.485 2 3.008 4.37 1 7.294 1c2.924 0 5.294 2.008 5.294 4.485 0 .843-.274 1.632-.751 2.305l.577 2.21-2.14-.807zm-5.983-2.96a.756.756 0 0 0 .763-.748.756.756 0 0 0-.763-.747.756.756 0 0 0-.764.747c0 .413.342.748.764.748zm3.054 0a.756.756 0 0 0 .764-.748.756.756 0 0 0-.764-.747.756.756 0 0 0-.764.747c0 .413.342.748.764.748zm3.054 0a.756.756 0 0 0 .764-.748.756.756 0 0 0-.764-.747.756.756 0 0 0-.763.747c0 .413.342.748.763.748z" fill="#FFF" fill-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 649 B |
1
public/resources/firefox_logo-only.svg
Normal file
|
After Width: | Height: | Size: 239 KiB |
1
public/resources/github-icon.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="438.549" height="438.549" viewBox="0 0 438.549 438.549"><path d="M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 0 1-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z"/></svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
1
public/resources/illustration_download.svg
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
1
public/resources/illustration_error.svg
Normal file
|
After Width: | Height: | Size: 11 KiB |
1
public/resources/illustration_expired.svg
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 20 KiB |
1
public/resources/mozilla-logo.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 578.55 185.54"><path d="M503.5 117.21c0 4.92 2.37 8.82 9 8.82 7.8 0 16.11-5.6 16.61-18.31a80.86 80.86 0 0 0-11-1c-7.83-.01-14.61 2.19-14.61 10.49z"/><path d="M0 0v185.54h578.55V0zm163.78 139.93h-32V96.87c0-13.22-4.41-18.31-13.05-18.31-10.51 0-14.75 7.46-14.75 18.14v26.64h10.12v16.61h-32V96.87c0-13.22-4.4-18.31-13.05-18.31-10.51 0-14.75 7.46-14.75 18.14v26.64h14.54v16.61H22.22v-16.61h10.17V80.09h-11V63.48h32.87V75c4.58-8.13 12.55-13.05 23.22-13.05 11 0 21.19 5.26 24.92 16.45 4.24-10.17 12.88-16.45 24.92-16.45 13.73 0 26.28 8.31 26.28 26.45v34.94h10.17zm48.65 1.69c-23.56 0-39.84-14.41-39.84-38.82 0-22.38 13.56-40.86 41-40.86s40.86 18.48 40.86 39.84c.02 24.42-17.61 39.85-42.02 39.85zm121.72-1.69h-66.8l-2.2-11.53 42-48.32h-23.9l-3.39 11.87-15.77-1.69 2.71-26.79H334L335.69 75l-42.4 48.34H318l3.56-11.87 17.29 1.69zm41.36 0h-22.89v-27.46h22.89zm0-49h-22.89V63.48h22.89zm12 49L420.6 23.34h21.53l-33.06 116.59zm44.42 0L465 23.34h21.53l-33.04 116.59zm113.92 1.69c-10.17 0-15.76-5.94-16.78-15.26-4.41 7.8-12.21 15.26-24.58 15.26-11 0-23.56-5.94-23.56-21.87 0-18.82 18.14-23.22 35.6-23.22a100.23 100.23 0 0 1 12.55.68v-2.54c0-7.8-.17-17.12-12.55-17.12-4.58 0-8.14.34-11.7 2.2L502 90.6l-17.46-1.87 3.39-19.83c13.39-5.43 20.17-7 32.72-7 16.45 0 30.35 8.48 30.35 25.94v33.23c0 4.41 1.69 5.94 5.26 5.94a11.5 11.5 0 0 0 3.22-.51l.17 11.53a29.57 29.57 0 0 1-13.77 3.6z"/><path d="M213.27 78.73c-11.19 0-18.14 8.3-18.14 22.72 0 13.22 6.1 23.39 18 23.39 11.36 0 18.82-9.15 18.82-23.73-.03-15.43-8.33-22.38-18.68-22.38z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
1
public/resources/send_bg.svg
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
1
public/resources/send_logo.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="30" height="27" viewBox="0 0 30 27" xmlns="http://www.w3.org/2000/svg"><title>send logo</title><g stroke="#3E3D40" fill="none" fill-rule="evenodd"><path d="M22.364 19.989l-2.153-2.103a2.046 2.046 0 0 0-2.665-.151l3.402 3.323a.531.531 0 0 1 0 .766l-2.466 2.408a.563.563 0 0 1-.784 0l-3.398-3.32a1.932 1.932 0 0 0 .188 2.564l2.153 2.103c.788.77 2.066.77 2.855 0l2.868-2.802a1.94 1.94 0 0 0 0-2.788M8.77 14.745a.534.534 0 0 0 0 .766l3.399 3.32a2.05 2.05 0 0 1-2.625-.184l-2.153-2.102a1.94 1.94 0 0 1 0-2.79l2.869-2.801a2.052 2.052 0 0 1 2.854 0l2.153 2.103c.73.713.775 1.83.154 2.603l-3.401-3.323a.565.565 0 0 0-.784 0L8.77 14.745zm9.464 5.682a.777.777 0 0 1 0 1.118.822.822 0 0 1-1.144 0l-5.6-5.47a.777.777 0 0 1 0-1.118.822.822 0 0 1 1.144 0l5.6 5.47z" stroke-width=".618" fill="#3E3D40"/><path d="M6.065 20.606c-2.913-1.586-3.988-3.656-3.988-6.468 0-2.81 2.265-6.425 5.786-6.289.1.004.55-.006.649 0 .895-3.27 2.508-6.353 6.898-6.353 4.557 0 7.336 3.716 6.75 7.785.08-.005 1.232.17 1.31.186 3.096.644 4.915 3.275 4.915 5.18 0 1.905-.107 3.029-2.023 4.947" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 22 KiB |
1
public/resources/twitter-icon.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 612"><path d="M612 116.258a250.714 250.714 0 0 1-72.088 19.772c25.929-15.527 45.777-40.155 55.184-69.411-24.322 14.379-51.169 24.82-79.775 30.48-22.907-24.437-55.49-39.658-91.63-39.658-69.334 0-125.551 56.217-125.551 125.513 0 9.828 1.109 19.427 3.251 28.606-104.326-5.24-196.835-55.223-258.75-131.174-10.823 18.51-16.98 40.078-16.98 63.101 0 43.559 22.181 81.993 55.835 104.479a125.556 125.556 0 0 1-56.867-15.756v1.568c0 60.806 43.291 111.554 100.693 123.104-10.517 2.83-21.607 4.398-33.08 4.398-8.107 0-15.947-.803-23.634-2.333 15.985 49.907 62.336 86.199 117.253 87.194-42.947 33.654-97.099 53.655-155.916 53.655-10.134 0-20.116-.612-29.944-1.721 55.567 35.681 121.536 56.485 192.438 56.485 230.948 0 357.188-191.291 357.188-357.188l-.421-16.253c24.666-17.593 46.005-39.697 62.794-64.861z" fill="#010002"/></svg>
|
||||
|
After Width: | Height: | Size: 873 B |
@@ -1,93 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="148px" height="113px" viewBox="0 0 148 113" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 14</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<filter x="-81.6%" y="-21.2%" width="210.5%" height="180.8%" filterUnits="objectBoundingBox" id="filter-1">
|
||||
<feOffset dx="-10" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.126754982 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-83.8%" y="-21.6%" width="213.5%" height="182.4%" filterUnits="objectBoundingBox" id="filter-2">
|
||||
<feOffset dx="-10" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.126754982 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-78.0%" y="-21.6%" width="204.9%" height="182.4%" filterUnits="objectBoundingBox" id="filter-3">
|
||||
<feOffset dx="-10" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.126754982 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-58.8%" y="-21.7%" width="178.4%" height="189.1%" filterUnits="objectBoundingBox" id="filter-4">
|
||||
<feOffset dx="-10" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.13 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
<g id="Sidebar" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Group-14" transform="translate(19.000000, 1.000000)">
|
||||
<g id="Group-11" filter="url(#filter-1)" transform="translate(28.573415, 37.189410) rotate(-25.000000) translate(-28.573415, -37.189410) translate(9.573415, 11.189410)">
|
||||
<g id="noun_775738_cc" stroke="#00C8D8" stroke-width="2">
|
||||
<g id="Group-10" transform="translate(0.143028, 0.571288)">
|
||||
<path d="M0,3.11187997 C0,1.44994393 1.33795046,0.102678571 2.99700349,0.102678571 L24.2431693,0.102678571 L36.6460185,10.8658088 L36.6460185,46.9983075 C36.6460185,48.658562 35.2983063,50.0044643 33.647121,50.0044643 L2.9988975,50.0044643 C1.34265214,50.0044643 0,48.6697121 0,46.9952629 L0,3.11187997 Z" id="Rectangle-7" fill="#BFF1F5"></path>
|
||||
<path d="M24.430679,0.631293163 C24.430679,0.0822437139 24.7706307,-0.0632105526 25.1876619,0.304366627 L36.3833191,10.1723775 C36.8013892,10.5408704 36.6879598,10.8395929 36.1429992,10.8395929 L27.4265882,10.8395929 C25.7719932,10.8395929 24.430679,9.48831667 24.430679,7.83754409 L24.430679,0.631293163 Z" id="Rectangle-8" fill="#2FD2DF"></path>
|
||||
</g>
|
||||
</g>
|
||||
<g id="noun_1029125_cc" transform="translate(3.901518, 8.349380)" fill-rule="nonzero" fill="#2FD2DF">
|
||||
<g id="Group">
|
||||
<path d="M24.1801115,8.08668825 C23.3856986,7.07396809 21.8961743,7.07396809 21.1514122,8.08668825 L12.1646161,19.682334 C11.9660128,19.9355141 11.6184572,19.9355141 11.419854,19.73297 L7.89464663,15.8339974 C7.10023371,14.9225493 5.7100111,14.9225493 4.91559818,15.8339974 L0.943533576,20.2393301 C0.546327116,20.6950542 0.347723886,21.2520503 0.347723886,21.8596824 L0.347723886,36.5947607 C0.347723886,37.1517567 0.794581154,37.5568448 1.29108923,37.5568448 L27.8542712,37.5568448 C28.4004301,37.5568448 28.7976366,37.1011207 28.7976366,36.5947607 L28.7976366,14.7706413 C28.7976366,14.2136452 28.5990334,13.7072851 28.3011285,13.3021971 L24.1801115,8.08668825 Z" id="Shape"></path>
|
||||
<ellipse id="Oval" cx="5.51140787" cy="3.98517161" rx="3.17765168" ry="3.2407045"></ellipse>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group-10" filter="url(#filter-2)" transform="translate(44.984738, 0.000000)">
|
||||
<path d="M0,3.11187997 C0,1.44994393 1.33795046,0.102678571 2.99700349,0.102678571 L24.2431693,0.102678571 L36.6460185,10.8658088 L36.6460185,46.9983075 C36.6460185,48.658562 35.2983063,50.0044643 33.647121,50.0044643 L2.9988975,50.0044643 C1.34265214,50.0044643 0,48.6697121 0,46.9952629 L0,3.11187997 Z" id="Rectangle-7" stroke="#FF5B6D" stroke-width="2" fill="#FFDEE2"></path>
|
||||
<path d="M5.44129888,23.9323409 L30.6937957,23.9323409 C31.424931,23.9323409 32.0211705,23.4883258 32.0211705,22.9438547 C32.0211705,22.3993836 31.424931,21.9553685 30.6937957,21.9553685 L5.44129888,21.9553685 C4.71016356,21.9553685 4.11392405,22.3993836 4.11392405,22.9438547 C4.11392405,23.4883258 4.71016356,23.9323409 5.44129888,23.9323409 Z" id="Shape" fill="#FF9CA7" fill-rule="nonzero"></path>
|
||||
<path d="M5.44129888,17.9049859 L30.6937957,17.9049859 C31.424931,17.9049859 32.0211705,17.4609707 32.0211705,16.9164996 C32.0211705,16.3720286 31.424931,15.9280134 30.6937957,15.9280134 L5.44129888,15.9280134 C4.71016356,15.9280134 4.11392405,16.3720286 4.11392405,16.9164996 C4.11392405,17.4609707 4.71016356,17.9049859 5.44129888,17.9049859 Z" id="Shape" fill="#FF9CA7" fill-rule="nonzero"></path>
|
||||
<path d="M5.44129888,29.959696 L30.6937957,29.959696 C31.424931,29.959696 32.0211705,29.5156809 32.0211705,28.9712098 C32.0211705,28.4267387 31.424931,27.9827235 30.6937957,27.9827235 L5.44129888,27.9827235 C4.71016356,27.9827235 4.11392405,28.4267387 4.11392405,28.9712098 C4.11392405,29.5156809 4.71016356,29.959696 5.44129888,29.959696 Z" id="Shape" fill="#FF9CA7" fill-rule="nonzero"></path>
|
||||
<path d="M5.44129888,35.9870511 L30.6937957,35.9870511 C31.424931,35.9870511 32.0211705,35.5430359 32.0211705,34.9985649 C32.0211705,34.4540938 31.424931,34.0100786 30.6937957,34.0100786 L5.44129888,34.0100786 C4.71016356,34.0100786 4.11392405,34.4540938 4.11392405,34.9985649 C4.11392405,35.5430359 4.71016356,35.9870511 5.44129888,35.9870511 Z" id="Shape" fill="#FF9CA7" fill-rule="nonzero"></path>
|
||||
<path d="M5.44129888,42.0144062 L30.6937957,42.0144062 C31.424931,42.0144062 32.0211705,41.570391 32.0211705,41.0259199 C32.0211705,40.4814489 31.424931,40.0374337 30.6937957,40.0374337 L5.44129888,40.0374337 C4.71016356,40.0374337 4.11392405,40.4814489 4.11392405,41.0259199 C4.11392405,41.5724001 4.71016356,42.0144062 5.44129888,42.0144062 Z" id="Shape" fill="#FF9CA7" fill-rule="nonzero"></path>
|
||||
<path d="M24.430679,0.631293163 C24.430679,0.0822437139 24.7706307,-0.0632105526 25.1876619,0.304366627 L36.3833191,10.1723775 C36.8013892,10.5408704 36.6879598,10.8395929 36.1429992,10.8395929 L27.4265882,10.8395929 C25.7719932,10.8395929 24.430679,9.48831667 24.430679,7.83754409 L24.430679,0.631293163 Z" id="Rectangle-8" stroke="#FF5B6D" stroke-width="2" fill="#FF9CA7"></path>
|
||||
</g>
|
||||
<g id="Group-10" filter="url(#filter-3)" transform="translate(99.755713, 40.795908) rotate(25.000000) translate(-99.755713, -40.795908) translate(79.255713, 15.295908)">
|
||||
<path d="M-2.72848411e-12,3.11187997 C-2.72848411e-12,1.44994393 1.34238993,0.102678571 2.99799713,0.102678571 L37.4077263,0.102678571 L36.6460185,10.8658088 L36.6460185,46.9983075 C36.6460185,48.658562 35.2983063,50.0044643 33.647121,50.0044643 L2.9988975,50.0044643 C1.34265214,50.0044643 -2.72848411e-12,48.6697121 -2.72848411e-12,46.9952629 L-2.72848411e-12,3.11187997 Z" id="Rectangle-7" stroke="#FFBC38" stroke-width="2" fill="#FFEECD"></path>
|
||||
<g id="Group" transform="translate(11.566360, 15.461370)" stroke-linecap="round" stroke="#FFCD6A" stroke-linejoin="round">
|
||||
<g transform="translate(3.291139, 15.607143)" id="Shape" stroke-width="1.5">
|
||||
<path d="M0.507658228,0 L6.07462025,0"></path>
|
||||
<path d="M0.507658228,1.64285714 L6.07462025,1.64285714"></path>
|
||||
<path d="M1.80189873,3.28571429 L4.78037975,3.28571429"></path>
|
||||
</g>
|
||||
<g id="Shape" stroke-width="2">
|
||||
<path d="M12.8823418,6.68478571 C12.8823418,3.197 10.0618354,0.369642857 6.58227848,0.369642857 C3.10272152,0.369642857 0.28221519,3.197 0.28221519,6.68478571 C0.28221519,8.54367857 1.08772152,10.2095357 2.36221519,11.3652857 L3.79879747,13.7646786 L9.36658228,13.7646786 L10.8023418,11.3661071 C12.0768354,10.2095357 12.8823418,8.54367857 12.8823418,6.68478571 Z"></path>
|
||||
<polyline points="5.85164557 13.7991786 4.73759494 9.82264286 8.42696203 9.82264286 7.31291139 13.7991786"></polyline>
|
||||
</g>
|
||||
</g>
|
||||
<path d="M59.4642883,25.2355179 L31.4194394,25.2355179 C30.0529755,25.2355179 29.4086334,24.2834821 28.8404333,23.4439821 C28.2288404,22.5387679 27.6508156,21.6844821 26.2032973,21.6844821 L15.5761548,21.6844821 C14.0655941,21.6844821 12.8366772,23.3429464 12.8366772,25.3809107 L12.8366772,27.8451964 C13.4900254,27.0204821 14.4684103,26.4824464 15.5761548,26.4824464 L59.4642883,26.4824464 C60.5720328,26.4824464 61.5504176,27.0204821 62.2037658,27.8451964 L62.2037658,27.2882679 C62.2029471,25.251125 60.9740302,25.2355179 59.4642883,25.2355179 Z" id="Shape" stroke="#FFBC38" stroke-width="2" fill="#FFCD6A" transform="translate(37.520222, 24.764839) rotate(90.000000) translate(-37.520222, -24.764839) "></path>
|
||||
</g>
|
||||
<g id="Group-12" filter="url(#filter-4)" transform="translate(37.025316, 46.000000)">
|
||||
<path d="M24.196055,2.68359965 C24.8899407,1.8177448 26.0064693,1.82521173 26.6836283,2.69225814 L40.872699,20.8601973 C41.5526621,21.7308341 41.2103747,22.4366247 40.1012607,22.4366247 L31.1853858,22.4366247 L31.1853858,38.5236322 L19.6604889,38.5236322 L19.6604889,22.4366247 L10.3594066,22.4366247 C9.25859767,22.4366247 8.92499102,21.7393653 9.62260704,20.8688558 L24.196055,2.68359965 Z" id="Polygon" fill="#1F7FFF"></path>
|
||||
<g id="noun_47280_cc" fill-rule="nonzero" fill="#165CE4">
|
||||
<path d="M31.2533248,39.1323944 L19.5010415,39.1323944 C19.1136036,39.1323944 18.8553116,38.8732394 18.8553116,38.484507 L18.8553116,23.0647887 L8.45906105,23.0647887 C8.20076911,23.0647887 8.00705015,22.9352113 7.87790418,22.6760563 C7.74875821,22.4816901 7.8133312,22.1577465 7.94247717,21.9633803 L24.8605993,0.777464789 C25.1188912,0.453521127 25.6354751,0.453521127 25.893767,0.777464789 L42.7473161,21.8985915 C42.8764621,22.028169 42.9410351,22.2225352 42.9410351,22.4169014 C42.9410351,22.8056338 42.6827432,23.0647887 42.2953052,23.0647887 L42.2953052,23.0647887 L31.8990546,23.0647887 L31.8990546,38.484507 C31.8990546,38.8732394 31.5761897,39.1323944 31.2533248,39.1323944 Z M20.1467714,37.8366197 L30.543022,37.8366197 L30.543022,22.4169014 C30.543022,22.028169 30.8013139,21.7690141 31.1887518,21.7690141 L40.9392726,21.7690141 L25.3771831,2.26760563 L9.81509373,21.7690141 L19.5656145,21.7690141 C19.9530524,21.7690141 20.2113443,22.028169 20.2113443,22.4169014 L20.2113443,37.8366197 L20.1467714,37.8366197 Z" id="Shape"></path>
|
||||
<path d="M49.9794905,45.8056338 L1.22688672,45.8056338 C0.839448806,45.8056338 0.581156866,45.5464789 0.581156866,45.1577465 L0.581156866,36.8647887 C0.581156866,36.4760563 0.839448806,36.2169014 1.22688672,36.2169014 C1.61432463,36.2169014 1.87261657,36.4760563 1.87261657,36.8647887 L1.87261657,44.5098592 L49.3337606,44.5098592 L49.3337606,36.8647887 C49.3337606,36.4760563 49.5920526,36.2169014 49.9794905,36.2169014 C50.3669284,36.2169014 50.6252203,36.4760563 50.6252203,36.8647887 L50.6252203,45.1577465 C50.6252203,45.4816901 50.3023554,45.8056338 49.9794905,45.8056338 Z" id="Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<svg width="57" height="57" viewBox="0 0 57 57" xmlns="http://www.w3.org/2000/svg"><title>upload</title><g transform="translate(1 1)" stroke-width="2" stroke="#7FC9FD" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"><path d="M18 24l10-9 10 9M28 39.545V15"/><circle cx="27.5" cy="27.5" r="27.5"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 336 B |
@@ -14,7 +14,7 @@ const filename = path.join(__dirname, '..', 'public', 'version.json');
|
||||
const filedata = {
|
||||
commit,
|
||||
source: pkg.homepage,
|
||||
version: pkg.version
|
||||
version: process.env.CIRCLE_TAG || pkg.version
|
||||
};
|
||||
|
||||
fs.writeFileSync(filename, JSON.stringify(filedata, null, 2) + '\n');
|
||||
|
||||
@@ -4,12 +4,12 @@ const conf = convict({
|
||||
s3_bucket: {
|
||||
format: String,
|
||||
default: '',
|
||||
env: 'P2P_S3_BUCKET'
|
||||
env: 'S3_BUCKET'
|
||||
},
|
||||
redis_host: {
|
||||
format: String,
|
||||
default: 'localhost',
|
||||
env: 'P2P_REDIS_HOST'
|
||||
env: 'REDIS_HOST'
|
||||
},
|
||||
listen_port: {
|
||||
format: 'port',
|
||||
@@ -25,17 +25,32 @@ const conf = convict({
|
||||
sentry_id: {
|
||||
format: String,
|
||||
default: '',
|
||||
env: 'P2P_SENTRY_CLIENT'
|
||||
env: 'SENTRY_CLIENT'
|
||||
},
|
||||
sentry_dsn: {
|
||||
format: String,
|
||||
default: '',
|
||||
env: 'P2P_SENTRY_DSN'
|
||||
env: 'SENTRY_DSN'
|
||||
},
|
||||
env: {
|
||||
format: ['production', 'development', 'test'],
|
||||
default: 'development',
|
||||
env: 'NODE_ENV'
|
||||
},
|
||||
max_file_size: {
|
||||
format: Number,
|
||||
default: 1024 * 1024 * 1024 * 2,
|
||||
env: 'MAX_FILE_SIZE'
|
||||
},
|
||||
expire_seconds: {
|
||||
format: Number,
|
||||
default: 86400,
|
||||
env: 'EXPIRE_SECONDS'
|
||||
},
|
||||
l10n_dev: {
|
||||
format: Boolean,
|
||||
default: false,
|
||||
env: 'L10N_DEV'
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
154
server/server.js
@@ -9,6 +9,7 @@ const conf = require('./config.js');
|
||||
const storage = require('./storage.js');
|
||||
const Raven = require('raven');
|
||||
const crypto = require('crypto');
|
||||
const fs = require('fs');
|
||||
|
||||
if (conf.sentry_dsn) {
|
||||
Raven.config(conf.sentry_dsn).install();
|
||||
@@ -22,48 +23,94 @@ const STATIC_PATH = path.join(__dirname, '../public');
|
||||
|
||||
const app = express();
|
||||
|
||||
function allLangs() {
|
||||
return fs
|
||||
.readdirSync(path.join(STATIC_PATH, 'locales'))
|
||||
.map(function(f) {
|
||||
return f.split('.')[0];
|
||||
})
|
||||
.join(',');
|
||||
}
|
||||
|
||||
function prodLangs() {
|
||||
return require('../package.json').availableLanguages.join(',');
|
||||
}
|
||||
|
||||
const availableLanguages = conf.l10n_dev ? allLangs() : prodLangs();
|
||||
|
||||
app.engine(
|
||||
'handlebars',
|
||||
exphbs({
|
||||
defaultLayout: 'main',
|
||||
partialsDir: 'views/partials/'
|
||||
partialsDir: 'views/partials/',
|
||||
helpers: {
|
||||
availableLanguages,
|
||||
l10nDev: conf.l10n_dev
|
||||
}
|
||||
})
|
||||
);
|
||||
app.set('view engine', 'handlebars');
|
||||
|
||||
app.use(helmet());
|
||||
app.use(
|
||||
helmet.hsts({
|
||||
maxAge: 31536000,
|
||||
force: conf.env === 'production'
|
||||
})
|
||||
);
|
||||
app.use(
|
||||
helmet.contentSecurityPolicy({
|
||||
directives: {
|
||||
defaultSrc: ['\'self\''],
|
||||
defaultSrc: ["'self'"],
|
||||
connectSrc: [
|
||||
'\'self\'',
|
||||
"'self'",
|
||||
'https://sentry.prod.mozaws.net',
|
||||
'https://www.google-analytics.com',
|
||||
'https://ssl.google-analytics.com'
|
||||
'https://www.google-analytics.com'
|
||||
],
|
||||
imgSrc: [
|
||||
'\'self\'',
|
||||
'https://www.google-analytics.com',
|
||||
'https://ssl.google-analytics.com'
|
||||
],
|
||||
scriptSrc: ['\'self\'', 'https://ssl.google-analytics.com'],
|
||||
styleSrc: ['\'self\'', 'https://code.cdn.mozilla.net'],
|
||||
fontSrc: ['\'self\'', 'https://code.cdn.mozilla.net'],
|
||||
formAction: ['\'none\''],
|
||||
frameAncestors: ['\'none\''],
|
||||
objectSrc: ['\'none\'']
|
||||
imgSrc: ["'self'", 'https://www.google-analytics.com'],
|
||||
scriptSrc: ["'self'"],
|
||||
styleSrc: ["'self'", 'https://code.cdn.mozilla.net'],
|
||||
fontSrc: ["'self'", 'https://code.cdn.mozilla.net'],
|
||||
formAction: ["'none'"],
|
||||
frameAncestors: ["'none'"],
|
||||
objectSrc: ["'none'"],
|
||||
reportUri: '/__cspreport__'
|
||||
}
|
||||
})
|
||||
);
|
||||
app.use(
|
||||
busboy({
|
||||
limits: {
|
||||
fileSize: conf.max_file_size
|
||||
}
|
||||
})
|
||||
);
|
||||
app.use(busboy());
|
||||
app.use(bodyParser.json());
|
||||
app.use(express.static(STATIC_PATH));
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
res.render('index', {
|
||||
res.render('index');
|
||||
});
|
||||
|
||||
app.get('/unsupported/:reason', (req, res) => {
|
||||
const outdated = req.params.reason === 'outdated';
|
||||
res.render('unsupported', {
|
||||
outdated: outdated
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/legal', (req, res) => {
|
||||
res.render('legal');
|
||||
});
|
||||
|
||||
app.get('/jsconfig.js', (req, res) => {
|
||||
res.set('Content-Type', 'application/javascript');
|
||||
res.render('jsconfig', {
|
||||
trackerId: conf.analytics_id,
|
||||
dsn: conf.sentry_id
|
||||
dsn: conf.sentry_id,
|
||||
maxFileSize: conf.max_file_size,
|
||||
expireSeconds: conf.expire_seconds,
|
||||
layout: false
|
||||
});
|
||||
});
|
||||
|
||||
@@ -89,21 +136,23 @@ app.get('/download/:id', (req, res) => {
|
||||
return;
|
||||
}
|
||||
|
||||
storage.filename(id).then(filename => {
|
||||
storage
|
||||
.length(id)
|
||||
.then(contentLength => {
|
||||
res.render('download', {
|
||||
filename: filename,
|
||||
filesize: bytes(contentLength),
|
||||
trackerId: conf.analytics_id,
|
||||
dsn: conf.sentry_id
|
||||
storage
|
||||
.filename(id)
|
||||
.then(filename => {
|
||||
return storage.length(id).then(contentLength => {
|
||||
storage.ttl(id).then(timeToExpiry => {
|
||||
res.render('download', {
|
||||
filename: decodeURIComponent(filename),
|
||||
filesize: bytes(contentLength),
|
||||
sizeInBytes: contentLength,
|
||||
timeToExpiry: timeToExpiry
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
res.render('download');
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
res.status(404).render('notfound');
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/assets/download/:id', (req, res) => {
|
||||
@@ -189,10 +238,10 @@ app.post('/upload', (req, res, next) => {
|
||||
}
|
||||
|
||||
if (
|
||||
!validateIV(meta.id) ||
|
||||
!meta.hasOwnProperty('aad') ||
|
||||
!meta.hasOwnProperty('id') ||
|
||||
!meta.hasOwnProperty('filename')
|
||||
!meta.hasOwnProperty('filename') ||
|
||||
!validateIV(meta.id)
|
||||
) {
|
||||
res.sendStatus(404);
|
||||
return;
|
||||
@@ -205,15 +254,36 @@ app.post('/upload', (req, res, next) => {
|
||||
req.busboy.on('file', (fieldname, file, filename) => {
|
||||
log.info('Uploading:', newId);
|
||||
|
||||
storage.set(newId, file, filename, meta).then(() => {
|
||||
const protocol = conf.env === 'production' ? 'https' : req.protocol;
|
||||
const url = `${protocol}://${req.get('host')}/download/${newId}/`;
|
||||
res.json({
|
||||
url,
|
||||
delete: meta.delete,
|
||||
id: newId
|
||||
storage.set(newId, file, filename, meta).then(
|
||||
() => {
|
||||
const protocol = conf.env === 'production' ? 'https' : req.protocol;
|
||||
const url = `${protocol}://${req.get('host')}/download/${newId}/`;
|
||||
res.json({
|
||||
url,
|
||||
delete: meta.delete,
|
||||
id: newId
|
||||
});
|
||||
},
|
||||
err => {
|
||||
if (err.message === 'limit') {
|
||||
return res.sendStatus(413);
|
||||
}
|
||||
res.sendStatus(500);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
req.on('close', err => {
|
||||
storage
|
||||
.forceDelete(newId)
|
||||
.then(err => {
|
||||
if (!err) {
|
||||
log.info('Deleted:', newId);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
log.info('DeleteError:', newId);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -23,10 +23,10 @@ if (conf.s3_bucket) {
|
||||
module.exports = {
|
||||
filename: filename,
|
||||
exists: exists,
|
||||
ttl: ttl,
|
||||
length: awsLength,
|
||||
get: awsGet,
|
||||
set: awsSet,
|
||||
aad: aad,
|
||||
setField: setField,
|
||||
delete: awsDelete,
|
||||
forceDelete: awsForceDelete,
|
||||
@@ -39,10 +39,10 @@ if (conf.s3_bucket) {
|
||||
module.exports = {
|
||||
filename: filename,
|
||||
exists: exists,
|
||||
ttl: ttl,
|
||||
length: localLength,
|
||||
get: localGet,
|
||||
set: localSet,
|
||||
aad: aad,
|
||||
setField: setField,
|
||||
delete: localDelete,
|
||||
forceDelete: localForceDelete,
|
||||
@@ -64,11 +64,21 @@ function quit() {
|
||||
function metadata(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
redis_client.hgetall(id, (err, reply) => {
|
||||
if (!err) {
|
||||
resolve(reply);
|
||||
} else {
|
||||
reject(err);
|
||||
if (err || !reply) {
|
||||
return reject(err);
|
||||
}
|
||||
resolve(reply);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function ttl(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
redis_client.ttl(id, (err, reply) => {
|
||||
if (err || !reply) {
|
||||
return reject(err);
|
||||
}
|
||||
resolve(reply * 1000);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -76,11 +86,10 @@ function metadata(id) {
|
||||
function filename(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
redis_client.hget(id, 'filename', (err, reply) => {
|
||||
if (!err) {
|
||||
resolve(reply);
|
||||
} else {
|
||||
reject(err);
|
||||
if (err || !reply) {
|
||||
return reject();
|
||||
}
|
||||
resolve(reply);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -101,18 +110,6 @@ function setField(id, key, value) {
|
||||
redis_client.hset(id, key, value);
|
||||
}
|
||||
|
||||
function aad(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
redis_client.hget(id, 'aad', (err, reply) => {
|
||||
if (!err) {
|
||||
resolve(reply);
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function localLength(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
@@ -129,20 +126,24 @@ function localGet(id) {
|
||||
|
||||
function localSet(newId, file, filename, meta) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const fstream = fs.createWriteStream(
|
||||
path.join(__dirname, '../static', newId)
|
||||
);
|
||||
const filepath = path.join(__dirname, '../static', newId);
|
||||
const fstream = fs.createWriteStream(filepath);
|
||||
file.pipe(fstream);
|
||||
fstream.on('close', () => {
|
||||
file.on('limit', () => {
|
||||
file.unpipe(fstream);
|
||||
fstream.destroy(new Error('limit'));
|
||||
});
|
||||
fstream.on('finish', () => {
|
||||
redis_client.hmset(newId, meta);
|
||||
redis_client.expire(newId, 86400000);
|
||||
redis_client.expire(newId, conf.expire_seconds);
|
||||
log.info('localSet:', 'Upload Finished of ' + newId);
|
||||
resolve(meta.delete);
|
||||
});
|
||||
|
||||
fstream.on('error', () => {
|
||||
fstream.on('error', err => {
|
||||
log.error('localSet:', 'Failed upload of ' + newId);
|
||||
reject();
|
||||
fs.unlinkSync(filepath);
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -211,21 +212,26 @@ function awsSet(newId, file, filename, meta) {
|
||||
Key: newId,
|
||||
Body: file
|
||||
};
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
s3.upload(params, function(err, _data) {
|
||||
if (err) {
|
||||
log.info('awsUploadError:', err.stack); // an error occurred
|
||||
reject();
|
||||
} else {
|
||||
redis_client.hmset(newId, meta);
|
||||
|
||||
redis_client.expire(newId, 86400000);
|
||||
log.info('awsUploadFinish', 'Upload Finished of ' + filename);
|
||||
resolve(meta.delete);
|
||||
}
|
||||
});
|
||||
let hitLimit = false;
|
||||
const upload = s3.upload(params);
|
||||
file.on('limit', () => {
|
||||
hitLimit = true;
|
||||
upload.abort();
|
||||
});
|
||||
return upload.promise().then(
|
||||
() => {
|
||||
redis_client.hmset(newId, meta);
|
||||
redis_client.expire(newId, conf.expire_seconds);
|
||||
log.info('awsUploadFinish', 'Upload Finished of ' + filename);
|
||||
},
|
||||
err => {
|
||||
if (hitLimit) {
|
||||
throw new Error('limit');
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function awsDelete(id, delete_token) {
|
||||
@@ -234,13 +240,13 @@ function awsDelete(id, delete_token) {
|
||||
if (!reply || delete_token !== reply) {
|
||||
reject();
|
||||
} else {
|
||||
redis_client.del(id);
|
||||
const params = {
|
||||
Bucket: conf.s3_bucket,
|
||||
Key: id
|
||||
};
|
||||
|
||||
s3.deleteObject(params, function(err, _data) {
|
||||
redis_client.del(id);
|
||||
err ? reject(err) : resolve(err);
|
||||
});
|
||||
}
|
||||
@@ -250,13 +256,13 @@ function awsDelete(id, delete_token) {
|
||||
|
||||
function awsForceDelete(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
redis_client.del(id);
|
||||
const params = {
|
||||
Bucket: conf.s3_bucket,
|
||||
Key: id
|
||||
};
|
||||
|
||||
s3.deleteObject(params, function(err, _data) {
|
||||
redis_client.del(id);
|
||||
err ? reject(err) : resolve(err);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -19,3 +19,5 @@ rules:
|
||||
mocha/no-pending-tests: error
|
||||
mocha/no-return-and-callback: warn
|
||||
mocha/no-skipped-tests: error
|
||||
|
||||
no-console: off # ¯\_(ツ)_/¯
|
||||
|
||||
2
test/frontend/.eslintrc.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
env:
|
||||
browser: true
|
||||
22
test/frontend/driver.js
Normal file
@@ -0,0 +1,22 @@
|
||||
const webdriver = require('selenium-webdriver');
|
||||
const path = require('path');
|
||||
const until = webdriver.until;
|
||||
|
||||
const driver = new webdriver.Builder().forBrowser('firefox').build();
|
||||
|
||||
driver.get(path.join('file:///', __dirname, '/frontend.test.html'));
|
||||
driver.wait(until.titleIs('Mocha Tests'));
|
||||
driver.wait(until.titleMatches(/^[0-1]$/));
|
||||
|
||||
driver.getTitle().then(title => {
|
||||
driver.quit().then(() => {
|
||||
if (title === '0') {
|
||||
console.log('Frontend tests have passed.');
|
||||
} else {
|
||||
throw new Error(
|
||||
'Frontend tests are failing. ' +
|
||||
'Please open the frontend.test.html file in a browser.'
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
22
test/frontend/frontend.bundle.js
Normal file
@@ -0,0 +1,22 @@
|
||||
class FakeFile extends Blob {
|
||||
constructor(name, data, opt) {
|
||||
super(data, opt);
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
window.Raven = {
|
||||
captureException: function(err) {
|
||||
console.error(err, err.stack);
|
||||
}
|
||||
}
|
||||
|
||||
window.FakeFile = FakeFile;
|
||||
window.FileSender = require('../../frontend/src/fileSender');
|
||||
window.FileReceiver = require('../../frontend/src/fileReceiver');
|
||||
window.sinon = require('sinon');
|
||||
window.server = window.sinon.fakeServer.create();
|
||||
window.assert = require('assert');
|
||||
const utils = require('../../frontend/src/utils');
|
||||
window.hexToArray = utils.hexToArray;
|
||||
window.arrayToHex = utils.arrayToHex;
|
||||
24
test/frontend/frontend.test.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Mocha Tests</title>
|
||||
<link rel="stylesheet" href="../../node_modules/mocha/mocha.css">
|
||||
<script src="bundle.js"></script>
|
||||
<meta charset="utf-8"/>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mocha"></div>
|
||||
<script src="../../node_modules/mocha/mocha.js"></script>
|
||||
<script>mocha.setup('bdd')</script>
|
||||
|
||||
<script src="frontend.test.js"></script>
|
||||
|
||||
<script>
|
||||
mocha.checkLeaks();
|
||||
mocha.globals(['jQuery']);
|
||||
mocha.run(function(err) {
|
||||
document.title = err;
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
360
test/frontend/frontend.test.js
Normal file
@@ -0,0 +1,360 @@
|
||||
const FileSender = window.FileSender;
|
||||
const FileReceiver = window.FileReceiver;
|
||||
const FakeFile = window.FakeFile;
|
||||
const assert = window.assert;
|
||||
const server = window.server;
|
||||
const hexToArray = window.hexToArray;
|
||||
const arrayToHex = window.arrayToHex;
|
||||
const sinon = window.sinon;
|
||||
|
||||
let file;
|
||||
let encryptedIV;
|
||||
let fileHash;
|
||||
let secretKey;
|
||||
let originalBlob;
|
||||
|
||||
describe('File Sender', function() {
|
||||
before(function() {
|
||||
server.respondImmediately = true;
|
||||
server.respondWith(
|
||||
'POST',
|
||||
'/upload',
|
||||
function(request) {
|
||||
const reader = new FileReader();
|
||||
reader.readAsArrayBuffer(request.requestBody.get('data'));
|
||||
|
||||
reader.onload = function(event) {
|
||||
file = this.result;
|
||||
}
|
||||
|
||||
const responseObj = JSON.parse(request.requestHeaders['X-File-Metadata']);
|
||||
request.respond(
|
||||
200,
|
||||
{'Content-Type': 'application/json'},
|
||||
JSON.stringify({url: 'some url',
|
||||
id: responseObj.id,
|
||||
delete: responseObj.delete})
|
||||
)
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
it('Should get a loading event emission', function() {
|
||||
const file = new FakeFile('hello_world.txt', ['This is some data.'])
|
||||
const fs = new FileSender(file);
|
||||
let testLoading = true;
|
||||
|
||||
fs.on('loading', isStillLoading => {
|
||||
assert(!(!testLoading && isStillLoading));
|
||||
testLoading = isStillLoading;
|
||||
})
|
||||
|
||||
return fs.upload()
|
||||
.then(info => {
|
||||
assert(info);
|
||||
assert(!testLoading);
|
||||
})
|
||||
.catch(err => {
|
||||
console.log(err, err.stack);
|
||||
assert.fail();
|
||||
});
|
||||
})
|
||||
|
||||
it('Should get a hashing event emission', function() {
|
||||
const file = new FakeFile('hello_world.txt', ['This is some data.'])
|
||||
const fs = new FileSender(file);
|
||||
let testHashing = true;
|
||||
|
||||
fs.on('hashing', isStillHashing => {
|
||||
assert(!(!testHashing && isStillHashing));
|
||||
testHashing = isStillHashing;
|
||||
})
|
||||
|
||||
return fs.upload()
|
||||
.then(info => {
|
||||
assert(info);
|
||||
assert(!testHashing);
|
||||
})
|
||||
.catch(err => {
|
||||
console.log(err, err.stack);
|
||||
assert.fail();
|
||||
});
|
||||
})
|
||||
|
||||
it('Should get a encrypting event emission', function() {
|
||||
const file = new FakeFile('hello_world.txt', ['This is some data.'])
|
||||
const fs = new FileSender(file);
|
||||
let testEncrypting = true;
|
||||
|
||||
fs.on('encrypting', isStillEncrypting => {
|
||||
assert(!(!testEncrypting && isStillEncrypting));
|
||||
testEncrypting = isStillEncrypting;
|
||||
})
|
||||
|
||||
return fs.upload()
|
||||
.then(info => {
|
||||
assert(info);
|
||||
assert(!testEncrypting);
|
||||
})
|
||||
.catch(err => {
|
||||
console.log(err, err.stack);
|
||||
assert.fail();
|
||||
});
|
||||
})
|
||||
|
||||
it('Should encrypt a file properly', function(done) {
|
||||
const newFile = new FakeFile('hello_world.txt', ['This is some data.'])
|
||||
const fs = new FileSender(newFile);
|
||||
fs.upload().then(info => {
|
||||
const key = info.secretKey;
|
||||
secretKey = info.secretKey;
|
||||
const IV = info.fileId;
|
||||
encryptedIV = info.fileId;
|
||||
|
||||
const readRaw = new FileReader;
|
||||
readRaw.onload = function(event) {
|
||||
const rawArray = new Uint8Array(this.result);
|
||||
originalBlob = rawArray;
|
||||
|
||||
window.crypto.subtle.digest('SHA-256', rawArray).then(hash => {
|
||||
fileHash = hash;
|
||||
window.crypto.subtle.importKey(
|
||||
'jwk',
|
||||
{
|
||||
kty: 'oct',
|
||||
k: key,
|
||||
alg: 'A128GCM',
|
||||
ext: true,
|
||||
},
|
||||
{
|
||||
name: 'AES-GCM'
|
||||
},
|
||||
true,
|
||||
['encrypt', 'decrypt']
|
||||
)
|
||||
.then(cryptoKey => {
|
||||
window.crypto.subtle.encrypt(
|
||||
{
|
||||
name: 'AES-GCM',
|
||||
iv: hexToArray(IV),
|
||||
additionalData: hash,
|
||||
tagLength: 128
|
||||
},
|
||||
cryptoKey,
|
||||
rawArray
|
||||
)
|
||||
.then(encrypted => {
|
||||
assert(new Uint8Array(encrypted).toString() ===
|
||||
new Uint8Array(file).toString());
|
||||
done();
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
readRaw.readAsArrayBuffer(newFile);
|
||||
})
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
describe('File Receiver', function() {
|
||||
|
||||
class FakeXHR {
|
||||
constructor() {
|
||||
this.response = file;
|
||||
this.status = 200;
|
||||
}
|
||||
|
||||
static setup() {
|
||||
FakeXHR.prototype.open = sinon.spy();
|
||||
FakeXHR.prototype.send = function () {
|
||||
this.onload();
|
||||
}
|
||||
|
||||
FakeXHR.prototype.originalXHR = window.XMLHttpRequest;
|
||||
|
||||
FakeXHR.prototype.getResponseHeader = function () {
|
||||
return JSON.stringify({
|
||||
aad: arrayToHex(new Uint8Array(fileHash)),
|
||||
filename: 'hello_world.txt',
|
||||
id: encryptedIV
|
||||
})
|
||||
}
|
||||
window.XMLHttpRequest = FakeXHR;
|
||||
}
|
||||
|
||||
static restore() {
|
||||
// originalXHR is a sinon FakeXMLHttpRequest, since
|
||||
// fakeServer.create() is called in frontend.bundle.js
|
||||
window.XMLHttpRequest.prototype.originalXHR.restore();
|
||||
}
|
||||
}
|
||||
|
||||
const cb = function(done) {
|
||||
if (file === undefined ||
|
||||
encryptedIV === undefined ||
|
||||
fileHash === undefined ||
|
||||
secretKey === undefined) {
|
||||
assert.fail('Please run file sending tests before trying to receive the files.');
|
||||
done();
|
||||
}
|
||||
|
||||
FakeXHR.setup();
|
||||
done();
|
||||
}
|
||||
|
||||
before(cb)
|
||||
|
||||
after(function() {
|
||||
FakeXHR.restore();
|
||||
})
|
||||
|
||||
it('Should decrypt properly', function() {
|
||||
const fr = new FileReceiver();
|
||||
location.hash = secretKey;
|
||||
return fr.download().then(([decrypted, name]) => {
|
||||
assert(name);
|
||||
assert(new Uint8Array(decrypted).toString() ===
|
||||
new Uint8Array(originalBlob).toString())
|
||||
}).catch(err => {
|
||||
console.log(err, err.stack);
|
||||
assert.fail();
|
||||
})
|
||||
})
|
||||
|
||||
it('Should emit decrypting events', function() {
|
||||
const fr = new FileReceiver();
|
||||
location.hash = secretKey;
|
||||
|
||||
let testDecrypting = true;
|
||||
|
||||
fr.on('decrypting', isStillDecrypting => {
|
||||
assert(!(!testDecrypting && isStillDecrypting));
|
||||
testDecrypting = isStillDecrypting;
|
||||
});
|
||||
|
||||
fr.on('safe', isSafe => {
|
||||
assert(isSafe);
|
||||
})
|
||||
|
||||
return fr.download().then(([decrypted, name]) => {
|
||||
assert(decrypted);
|
||||
assert(name);
|
||||
assert(!testDecrypting);
|
||||
}).catch(err => {
|
||||
console.log(err, err.stack);
|
||||
assert.fail();
|
||||
})
|
||||
})
|
||||
|
||||
it('Should emit hashing events', function() {
|
||||
const fr = new FileReceiver();
|
||||
location.hash = secretKey;
|
||||
|
||||
let testHashing = true;
|
||||
|
||||
fr.on('hashing', isStillHashing => {
|
||||
assert(!(!testHashing && isStillHashing));
|
||||
testHashing = isStillHashing;
|
||||
});
|
||||
|
||||
fr.on('safe', isSafe => {
|
||||
assert(isSafe);
|
||||
})
|
||||
|
||||
return fr.download().then(([decrypted, name]) => {
|
||||
assert(decrypted);
|
||||
assert(name);
|
||||
assert(!testHashing);
|
||||
}).catch(err => {
|
||||
assert.fail();
|
||||
})
|
||||
})
|
||||
|
||||
it('Should catch fraudulent checksums', function(done) {
|
||||
// Use the secret key and file hash of the previous file to encrypt,
|
||||
// which has a different hash than this one (different strings).
|
||||
const newFile = new FakeFile('hello_world.txt',
|
||||
['This is some data, with a changed hash.'])
|
||||
const readRaw = new FileReader();
|
||||
|
||||
readRaw.onload = function(event) {
|
||||
const plaintext = new Uint8Array(this.result);
|
||||
window.crypto.subtle.importKey(
|
||||
'jwk',
|
||||
{
|
||||
kty: 'oct',
|
||||
k: secretKey,
|
||||
alg: 'A128GCM',
|
||||
ext: true
|
||||
},
|
||||
{
|
||||
name: 'AES-GCM'
|
||||
},
|
||||
true,
|
||||
['encrypt', 'decrypt']
|
||||
)
|
||||
.then(key => {
|
||||
// The file hash used here is the hash of the fake
|
||||
// file from the previous test; it's a phony checksum.
|
||||
return window.crypto.subtle.encrypt(
|
||||
{
|
||||
name: 'AES-GCM',
|
||||
iv: hexToArray(encryptedIV),
|
||||
additionalData: fileHash,
|
||||
tagLength: 128
|
||||
},
|
||||
key,
|
||||
plaintext
|
||||
)
|
||||
})
|
||||
.then(encrypted => {
|
||||
file = encrypted;
|
||||
const fr = new FileReceiver();
|
||||
location.hash = secretKey;
|
||||
|
||||
fr.on('unsafe', isUnsafe => {
|
||||
assert(isUnsafe)
|
||||
})
|
||||
|
||||
fr.on('safe', () => {
|
||||
// This event should not be emitted.
|
||||
assert.fail();
|
||||
})
|
||||
|
||||
fr.download().then(() => {
|
||||
assert.fail();
|
||||
done();
|
||||
}).catch(err => {
|
||||
assert(1);
|
||||
done();
|
||||
})
|
||||
})
|
||||
}
|
||||
readRaw.readAsArrayBuffer(newFile);
|
||||
})
|
||||
|
||||
it('Should not decrypt with an incorrect checksum', function() {
|
||||
FakeXHR.prototype.getResponseHeader = function () {
|
||||
return JSON.stringify({
|
||||
aad: 'some_bad_hashz',
|
||||
filename: 'hello_world.txt',
|
||||
id: encryptedIV
|
||||
})
|
||||
}
|
||||
|
||||
const fr = new FileReceiver();
|
||||
location.hash = secretKey;
|
||||
|
||||
return fr.download().then(([decrypted, name]) => {
|
||||
assert(decrypted);
|
||||
assert(name);
|
||||
assert.fail();
|
||||
}).catch(err => {
|
||||
assert(1);
|
||||
})
|
||||
})
|
||||
|
||||
})
|
||||
@@ -110,20 +110,20 @@ describe('Testing Set using aws', function() {
|
||||
it('Should pass when the file is successfully uploaded', function() {
|
||||
const buf = Buffer.alloc(10);
|
||||
sinon.stub(crypto, 'randomBytes').returns(buf);
|
||||
s3Stub.upload.callsArgWith(1, null, {});
|
||||
s3Stub.upload.returns({promise: () => Promise.resolve()});
|
||||
return storage
|
||||
.set('123', {}, 'Filename.moz', {})
|
||||
.set('123', {on: sinon.stub()}, 'Filename.moz', {})
|
||||
.then(() => {
|
||||
assert(expire.calledOnce);
|
||||
assert(expire.calledWith('123', 86400000));
|
||||
assert(expire.calledWith('123', 86400));
|
||||
})
|
||||
.catch(err => assert.fail());
|
||||
});
|
||||
|
||||
it('Should fail if there was an error during uploading', function() {
|
||||
s3Stub.upload.callsArgWith(1, new Error(), null);
|
||||
s3Stub.upload.returns({promise: () => Promise.reject()});
|
||||
return storage
|
||||
.set('123', {}, 'Filename.moz', 'url.com')
|
||||
.set('123', {on: sinon.stub()}, 'Filename.moz', 'url.com')
|
||||
.then(_reply => assert.fail())
|
||||
.catch(err => assert(1));
|
||||
});
|
||||
|
||||
@@ -117,12 +117,12 @@ describe('Testing Get from local filesystem', function() {
|
||||
describe('Testing Set to local filesystem', function() {
|
||||
it('Successfully writes the file to the local filesystem', function() {
|
||||
const stub = sinon.stub();
|
||||
stub.withArgs('close', sinon.match.any).callsArgWithAsync(1);
|
||||
stub.withArgs('finish', sinon.match.any).callsArgWithAsync(1);
|
||||
stub.withArgs('error', sinon.match.any).returns(1);
|
||||
fsStub.createWriteStream.returns({ on: stub });
|
||||
|
||||
return storage
|
||||
.set('test', { pipe: sinon.stub() }, 'Filename.moz', {})
|
||||
.set('test', { pipe: sinon.stub(), on: sinon.stub() }, 'Filename.moz', {})
|
||||
.then(() => {
|
||||
assert(1);
|
||||
})
|
||||
|
||||
@@ -1,69 +1,39 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Download your file</title>
|
||||
{{#if dsn}}
|
||||
{{> sentry dsn=dsn}}
|
||||
{{/if}}
|
||||
<script src="/bundle.js"></script>
|
||||
<link rel="stylesheet" href="https://code.cdn.mozilla.net/fonts/fira.css" />
|
||||
<link rel="stylesheet" type="text/css" href="/main.css" />
|
||||
{{#if trackerId}}
|
||||
{{> analytics trackerId=trackerId}}
|
||||
{{/if}}
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="main-window">
|
||||
<div id="download">
|
||||
{{#if filename}}
|
||||
<div class="title">
|
||||
Your friend is sending you a file: <br />
|
||||
{{{filename}}} ({{{filesize}}})
|
||||
</div>
|
||||
<div id="download-page-one">
|
||||
<div>
|
||||
<button id="download-btn">Download File</button>
|
||||
</div>
|
||||
<div id='expired-img'>
|
||||
<img src='/resources/link_expired.png' />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="download-progress">
|
||||
<div id="download-text">
|
||||
Downloading File...
|
||||
</div>
|
||||
<div class="upload">
|
||||
<!-- progress bar here -->
|
||||
<div id="progress-bar"></div>
|
||||
<div id="progress-text"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="send-new" id="send-file">
|
||||
Send your own files
|
||||
</div>
|
||||
|
||||
{{else}}
|
||||
|
||||
<div class="title">
|
||||
This link has expired or never existed in the first place.
|
||||
</div>
|
||||
|
||||
<div class="share-window">
|
||||
<img src="/resources/link_expired.png" alt="Link expired" />
|
||||
</div>
|
||||
<div class="send-new" id="send-file">
|
||||
Send your own files
|
||||
</div>
|
||||
{{/if}}
|
||||
<div id="download">
|
||||
<script src="/download.js"></script>
|
||||
<div id="download-page-one">
|
||||
<div class="title">
|
||||
<span id="dl-filename"
|
||||
data-l10n-id="downloadFileName"
|
||||
data-l10n-args='{"filename": "{{filename}}"}'></span>
|
||||
<span data-l10n-id="downloadFileSize"
|
||||
data-l10n-args='{"size": "{{filesize}}"}'></span>
|
||||
<span id="dl-bytelength" hidden="true">{{sizeInBytes}}</span>
|
||||
<span id="dl-ttl" hidden="true">{{timeToExpiry}}</span>
|
||||
</div>
|
||||
<div class="description" data-l10n-id="downloadMessage"></div>
|
||||
<img src="/resources/illustration_download.svg" id="download-img" data-l10n-id="downloadAltText"/>
|
||||
<div>
|
||||
<button id="download-btn" data-l10n-id="downloadButtonLabel"></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <ul id="downloaded_files">
|
||||
</ul> -->
|
||||
<div id="download-progress" hidden="true">
|
||||
<div class="title"
|
||||
data-l10n-id="downloadingPageProgress"
|
||||
data-l10n-args='{"filename": "{{filename}}", "size": "{{filesize}}"}'>
|
||||
</div>
|
||||
<div class="description" data-l10n-id="downloadingPageMessage"></div>
|
||||
<!-- progress bar here -->
|
||||
<div class="progress-bar" id="dl-progress">
|
||||
<div class="percentage">
|
||||
<span class="percent-number"></span>
|
||||
<span class="percent-sign">%</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="upload">
|
||||
<div class="progress-text">{{filename}}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<a class="send-new" data-l10n-id="sendYourFilesLink"></a>
|
||||
</div>
|
||||
|
||||
@@ -1,113 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Firefox Send</title>
|
||||
{{#if dsn}}
|
||||
{{> sentry dsn=dsn}}
|
||||
{{/if}}
|
||||
<script src="/bundle.js"></script>
|
||||
<link rel="stylesheet" href="https://code.cdn.mozilla.net/fonts/fira.css" />
|
||||
<link rel="stylesheet" type="text/css" href="/main.css" />
|
||||
{{#if trackerId}}
|
||||
{{> analytics trackerId=trackerId}}
|
||||
{{/if}}
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="main-window">
|
||||
<div id="page-one">
|
||||
<div class="title">
|
||||
Share your files quickly, privately and securely.
|
||||
</div>
|
||||
<div class="upload-window">
|
||||
<div id="upload-img"><img src="/resources/upload.svg" alt="Upload"/></div>
|
||||
<div>
|
||||
DRAG & DROP
|
||||
</div>
|
||||
<div class="upload">
|
||||
<div id="browse-text">
|
||||
your file/folder here or
|
||||
</div>
|
||||
<div id="browse">
|
||||
<form method="post" action="upload" enctype="multipart/form-data">
|
||||
<label for="file-upload" class="file-upload">browse</label>
|
||||
<input id="file-upload" type="file" name="fileUploaded" />
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="file-list">
|
||||
<table id="uploaded-files">
|
||||
<thead>
|
||||
<tr>
|
||||
<!-- htmllint attr-bans="false" -->
|
||||
<th width="30%">File</th>
|
||||
<th width="45%">Copy URL</th>
|
||||
<th width="18%">Expires in</th>
|
||||
<th width="7%">Delete</th>
|
||||
<!-- htmllint tag-bans="$previous" -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="upload-progress">
|
||||
<div class="title" id="upload-filename">
|
||||
Uploading
|
||||
</div>
|
||||
<div class="upload-window">
|
||||
<div id="upload-img"><img src="/resources/upload.svg" alt="Upload" /></div>
|
||||
<div class="upload">
|
||||
<!-- progress bar here -->
|
||||
<div id="progress-bar"></div>
|
||||
<div id="progress-text"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="share-link">
|
||||
<div class="title">
|
||||
Copy the link below to share your file!
|
||||
</div>
|
||||
<div class="share-window">
|
||||
<img src="/resources/share.png" alt="Share" />
|
||||
<div id="share-window-r">
|
||||
<div id="copy">
|
||||
<input id="link" type="url" value="" readonly/>
|
||||
<button id="copy-btn">Copy</button>
|
||||
</div>
|
||||
<div>
|
||||
This link expires after one download
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="send-new">
|
||||
Send another file
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="upload-error">
|
||||
<div class="title">
|
||||
Upload error<br>
|
||||
This file cannot be uploaded!
|
||||
</div>
|
||||
<div class="send-new">
|
||||
Send another file
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="compliance-error">
|
||||
<div class="title">
|
||||
Encryption error<br>
|
||||
Your browser does not support gcm encryption.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="page-one">
|
||||
<script src="/upload.js"></script>
|
||||
<div class="title" data-l10n-id="uploadPageHeader"></div>
|
||||
<div class="description">
|
||||
<div data-l10n-id="uploadPageExplainer"></div>
|
||||
<a href="https://testpilot.firefox.com/experiments/send" class="link" data-l10n-id="uploadPageLearnMore"></a>
|
||||
</div>
|
||||
<div class="upload-window" >
|
||||
<div id="upload-img"><img data-l10n-id="uploadSvgAlt" src="/resources/upload.svg"/></div>
|
||||
<div id="upload-text" data-l10n-id="uploadPageDropMessage"></div>
|
||||
<span id="file-size-msg"><em data-l10n-id="uploadPageSizeMessage"></em></span>
|
||||
<form method="post" action="upload" enctype="multipart/form-data">
|
||||
<label for="file-upload" id="browse"
|
||||
data-l10n-id="uploadPageBrowseButton"></label>
|
||||
<input id="file-upload" type="file" name="fileUploaded" />
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<div id="file-list">
|
||||
<table id="uploaded-files">
|
||||
<thead>
|
||||
<tr>
|
||||
<!-- htmllint attr-bans="false" -->
|
||||
<th width="35%" data-l10n-id="uploadedFile"></th>
|
||||
<th width="25%" data-l10n-id="copyFileList"></th>
|
||||
<th width="21%" data-l10n-id="expiryFileList"></th>
|
||||
<th width="12%" data-l10n-id="deleteFileList"></th>
|
||||
<!-- htmllint tag-bans="$previous" -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="upload-progress" hidden="true">
|
||||
<div class="title" id="upload-filename" data-l10n-id="uploadingPageHeader"></div>
|
||||
<div class="description"></div>
|
||||
<!-- progress bar here -->
|
||||
<div class="progress-bar" id="ul-progress">
|
||||
<div class="percentage">
|
||||
<span class="percent-number">0</span>
|
||||
<span class="percent-sign">%</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="upload">
|
||||
<div class="progress-text"></div>
|
||||
<div id="cancel-upload"
|
||||
data-l10n-id="uploadingPageCancel"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="share-link" hidden="true">
|
||||
<div class="title" data-l10n-id="uploadSuccessTimingHeader"></div>
|
||||
<div id="share-window">
|
||||
<div id="copy-text"></div>
|
||||
<div id="copy">
|
||||
<input id="link" type="url" value="" readonly/>
|
||||
<button id="copy-btn" data-l10n-id="copyUrlFormButton"></button>
|
||||
</div>
|
||||
<button id="delete-file" data-l10n-id="deleteFileButton"></button>
|
||||
<a class="send-new" id="send-new-completed" data-l10n-id="sendAnotherFileLink"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="upload-error" hidden="true">
|
||||
<div class="title" data-l10n-id="errorPageHeader"></div>
|
||||
<div class="expired-description" data-l10n-id="errorPageMessage"></div>
|
||||
<img id="upload-error-img" data-l10n-id="errorAltText" src="/resources/illustration_error.svg"/>
|
||||
<a class="send-new" id="send-new-error" data-l10n-id="sendAnotherFileLink"></a>
|
||||
</div>
|
||||
|
||||
15
views/jsconfig.handlebars
Normal file
@@ -0,0 +1,15 @@
|
||||
{{!-- This file should be es5 only --}}
|
||||
var isIE = /trident\/7\.|msie/i.test(navigator.userAgent);
|
||||
var isUnsupportedPage = /\/unsupported/.test(location.pathname);
|
||||
if (isIE && !isUnsupportedPage) {
|
||||
window.location.replace('/unsupported/ie');
|
||||
}
|
||||
|
||||
{{#if dsn}}
|
||||
window.dsn = '{{{dsn}}}';
|
||||
{{/if}}
|
||||
{{#if trackerId}}
|
||||
window.trackerId = '{{{trackerId}}}';
|
||||
{{/if}}
|
||||
var MAXFILESIZE = {{{maxFileSize}}};
|
||||
var EXPIRE_SECONDS = {{{expireSeconds}}};
|
||||
@@ -1 +1,48 @@
|
||||
{{{body}}}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Firefox Send</title>
|
||||
<script src="/jsconfig.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/main.css" />
|
||||
<link rel="stylesheet" href="https://code.cdn.mozilla.net/fonts/fira.css">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<meta name="defaultLanguage" content="en-US">
|
||||
<meta name="availableLanguages" content="{{availableLanguages}}">
|
||||
|
||||
<link rel="icon" type="image/png" href="/resources/favicon-32x32.png" sizes="32x32" />
|
||||
<link rel="localization" href="/locales/{locale}/send.ftl">
|
||||
<script defer src="/l20n.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="send-logo">
|
||||
<a href="/">
|
||||
<img src="/resources/send_logo.svg" alt="Send"/><h1 class="site-title">Send</h1>
|
||||
</a>
|
||||
<div class="site-subtitle">
|
||||
<a href="https://testpilot.firefox.com" target="_blank">Firefox Test Pilot</a>
|
||||
<div data-l10n-id="siteSubtitle">web experiment</div>
|
||||
</div>
|
||||
</div>
|
||||
<a href="https://qsurvey.mozilla.com/s3/txp-firefox-send" rel="noreferrer noopener" class="feedback" target="_blank" data-l10n-id="siteFeedback">Feedback</a>
|
||||
</header>
|
||||
<div class="all">
|
||||
{{{body}}}
|
||||
</div>
|
||||
<div class="footer">
|
||||
<div class="legal-links">
|
||||
<a href="https://www.mozilla.org"><img class="mozilla-logo" src="/resources/mozilla-logo.svg"/></a>
|
||||
<a href="https://www.mozilla.org/about/legal" data-l10n-id="footerLinkLegal"></a>
|
||||
<a href="https://testpilot.firefox.com/about" data-l10n-id="footerLinkAbout"></a>
|
||||
<a href="/legal" data-l10n-id="footerLinkPrivacy"></a>
|
||||
<a href="/legal" data-l10n-id="footerLinkTerms"></a>
|
||||
<a href="https://www.mozilla.org/privacy/websites/#cookies" data-l10n-id="footerLinkCookies"></a>
|
||||
</div>
|
||||
<div class="social-links">
|
||||
<a href="https://github.com/mozilla/send" target="_blank" rel="noreferrer noopener"><img class="github" src="/resources/github-icon.svg"/></a>
|
||||
<a href="https://twitter.com/FxTestPilot" target="_blank" rel="noreferrer noopener"><img class="twitter" src="/resources/twitter-icon.svg"/></a>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
12
views/legal.handlebars
Normal file
@@ -0,0 +1,12 @@
|
||||
<div id="legal">
|
||||
<div class="title" data-l10n-id="legalHeader"></div>
|
||||
<div class="description" data-l10n-id="legalNoticeTestPilot">
|
||||
<a href="https://testpilot.firefox.com/terms"></a>
|
||||
<a href="https://testpilot.firefox.com/privacy"></a>
|
||||
<a href="https://testpilot.firefox.com/experiments/send"></a>
|
||||
</div>
|
||||
<div class="description" data-l10n-id="legalNoticeMozilla">
|
||||
<a href="https://www.mozilla.org/privacy/websites/"></a>
|
||||
<a href="https://www.mozilla.org/about/legal/terms/mozilla/"></a>
|
||||
</div>
|
||||
</div>
|
||||
8
views/notfound.handlebars
Normal file
@@ -0,0 +1,8 @@
|
||||
<div id="download">
|
||||
<div class="title" data-l10n-id="expiredPageHeader"></div>
|
||||
<div class="share-window">
|
||||
<img src="/resources/illustration_expired.svg" id="expired-img" data-l10n-id="linkExpiredAlt"/>
|
||||
</div>
|
||||
<div class="expired-description" data-l10n-id="uploadPageExplainer"></div>
|
||||
<a class="send-new" href="/" id="expired-send-new" data-l10n-id="sendYourFilesLink"></a>
|
||||
</div>
|
||||
@@ -1,17 +0,0 @@
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', '{{{trackerId}}}', 'auto');
|
||||
|
||||
if (window.URL && document.referrer) {
|
||||
ga("set", "referrer", (new URL(document.referrer)).origin);
|
||||
} else {
|
||||
ga("set", "referrer", "");
|
||||
}
|
||||
|
||||
ga('set', 'anonymizeIp', true);
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
@@ -1,3 +0,0 @@
|
||||
<script>
|
||||
window.dsn = '{{{dsn}}}';
|
||||
</script>
|
||||
19
views/unsupported.handlebars
Normal file
@@ -0,0 +1,19 @@
|
||||
<div id="unsupported-browser">
|
||||
<div class="title" data-l10n-id="notSupportedHeader">Your browser is not supported.</div>
|
||||
{{#if outdated}}
|
||||
<div class="description" data-l10n-id="notSupportedOutdatedDetail">Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser.</div>
|
||||
<a id="update-firefox" href="https://support.mozilla.org/kb/update-firefox-latest-version">
|
||||
<img src="/resources/firefox_logo-only.svg" class="firefox-logo" alt="Firefox"/>
|
||||
<div class="unsupported-button-text" data-l10n-id="updateFirefox">Update Firefox</div>
|
||||
</a>
|
||||
{{else}}
|
||||
<div class="description" data-l10n-id="notSupportedDetail">Unfortunately this browser does not support the web technology that powers Firefox Send. You’ll need to try another browser. We recommend Firefox!</div>
|
||||
<a id="dl-firefox" href="https://www.mozilla.org/firefox/new/?scene=2" target="_blank">
|
||||
<img src="/resources/firefox_logo-only.svg" class="firefox-logo" alt="Firefox"/>
|
||||
<div class="unsupported-button-text">Firefox<br>
|
||||
<span data-l10n-id="downloadFirefoxButtonSub">Free Download</span>
|
||||
</div>
|
||||
</a>
|
||||
{{/if}}
|
||||
<div class="unsupported-description" data-l10n-id="uploadPageExplainer">Send files through a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.</div>
|
||||
</div>
|
||||