Compare commits
479 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4950f6c68 | ||
|
|
9f2d248e8f | ||
|
|
5d1ede5f63 | ||
|
|
47666c153a | ||
|
|
cadf039c55 | ||
|
|
dbe374bdc6 | ||
|
|
48ab1cdd4e | ||
|
|
54150702da | ||
|
|
981f86946b | ||
|
|
b5865f00e9 | ||
|
|
7797f485f2 | ||
|
|
db169cb9f0 | ||
|
|
f999c4c44f | ||
|
|
e9b50b7682 | ||
|
|
a3e8646ea7 | ||
|
|
a6a3cae5e9 | ||
|
|
8d80ba1f69 | ||
|
|
e5f76a7b1f | ||
|
|
acf82a4e3e | ||
|
|
0acdf3a720 | ||
|
|
305dd2f5ef | ||
|
|
e53571e219 | ||
|
|
0eda8d2082 | ||
|
|
1cd4adfc2a | ||
|
|
0460bd2e97 | ||
|
|
60146541f2 | ||
|
|
79d314146b | ||
|
|
72d12c3d80 | ||
|
|
1469464c43 | ||
|
|
7cdef4bbfc | ||
|
|
24aa1f2e17 | ||
|
|
7a4a4fc849 | ||
|
|
97be1737cb | ||
|
|
ba33e022b0 | ||
|
|
0d6b3731ef | ||
|
|
0be4a65904 | ||
|
|
54c182ab0d | ||
|
|
b2e9907551 | ||
|
|
3b4a4d82e8 | ||
|
|
5747f55876 | ||
|
|
636a239e86 | ||
|
|
f9a1583078 | ||
|
|
0dfbe3566a | ||
|
|
98b84ba05f | ||
|
|
4ad4a65924 | ||
|
|
6e07ecf643 | ||
|
|
a39cfaf3d3 | ||
|
|
97e3d78ba8 | ||
|
|
28c48f51d1 | ||
|
|
239fba452a | ||
|
|
3631bc8f39 | ||
|
|
189f4cfb9b | ||
|
|
deb2d41de8 | ||
|
|
ab53f9cf3e | ||
|
|
facb61a9b5 | ||
|
|
d8ac413064 | ||
|
|
e0f51c7fde | ||
|
|
c44c4ba41c | ||
|
|
4e9625ef36 | ||
|
|
4413fc75a3 | ||
|
|
d13fda1419 | ||
|
|
7f7ba0e33f | ||
|
|
86c5553f58 | ||
|
|
7e173ec23d | ||
|
|
3ae6f9bd5a | ||
|
|
b5ef1785ab | ||
|
|
4b1b7cb821 | ||
|
|
b0b75f5daa | ||
|
|
e2562aec17 | ||
|
|
f64e772145 | ||
|
|
bc0ccc8e5d | ||
|
|
e909a3bae8 | ||
|
|
abc58518ea | ||
|
|
4f273eca03 | ||
|
|
b15c017dcd | ||
|
|
bfaac8f66d | ||
|
|
4ffc65274b | ||
|
|
1d492cd0df | ||
|
|
b4594c5280 | ||
|
|
aa47df79f9 | ||
|
|
7533ab1930 | ||
|
|
f10b2d5064 | ||
|
|
7463aeccf5 | ||
|
|
2d35cd33c9 | ||
|
|
beb194f3e0 | ||
|
|
175040acec | ||
|
|
9e5da3270c | ||
|
|
c6cab13e6a | ||
|
|
dd9d6c1660 | ||
|
|
0dd4f8d2cc | ||
|
|
f035132b95 | ||
|
|
561ed3994e | ||
|
|
e77d2b3722 | ||
|
|
45d5f41731 | ||
|
|
505eb8c585 | ||
|
|
ce04f162a4 | ||
|
|
47cf99140a | ||
|
|
c6fc1483f6 | ||
|
|
2c8ea3ecc8 | ||
|
|
24172a4665 | ||
|
|
daa5a3c5f1 | ||
|
|
806ebbe160 | ||
|
|
3e9be67641 | ||
|
|
402c8351bd | ||
|
|
ccbcb69666 | ||
|
|
e6ff9e486b | ||
|
|
17afd6ad58 | ||
|
|
7dd1fcca9b | ||
|
|
d5319f4fcf | ||
|
|
a3d880fc4f | ||
|
|
8a9a823842 | ||
|
|
3195ee7d16 | ||
|
|
f565954a54 | ||
|
|
4abfd7dd6e | ||
|
|
e930275042 | ||
|
|
960e29f800 | ||
|
|
7e637ae453 | ||
|
|
cca6b470b0 | ||
|
|
829d10f77f | ||
|
|
b7d7bb885d | ||
|
|
31e2e00b24 | ||
|
|
0ab2ec6a5c | ||
|
|
369b0b2614 | ||
|
|
b064152955 | ||
|
|
438b36dd28 | ||
|
|
a429b89322 | ||
|
|
bd0117628f | ||
|
|
c4299d05a1 | ||
|
|
e3027d2c59 | ||
|
|
be055ff7ba | ||
|
|
5a53eb85fb | ||
|
|
c249f26b4a | ||
|
|
b229547057 | ||
|
|
334f225f3d | ||
|
|
e8f3379ddb | ||
|
|
3dd3fa9808 | ||
|
|
9459e4bca8 | ||
|
|
888e99841e | ||
|
|
949dcce5d7 | ||
|
|
0c47991de6 | ||
|
|
63b96310d3 | ||
|
|
da37b9d96f | ||
|
|
931cfd108d | ||
|
|
cc7ea99ca9 | ||
|
|
996a7e4184 | ||
|
|
e5627698c4 | ||
|
|
1fdccd4dde | ||
|
|
b8c26aee06 | ||
|
|
b7d65517b3 | ||
|
|
4f5b804b5d | ||
|
|
a74491af40 | ||
|
|
09955a0231 | ||
|
|
301f6e87f6 | ||
|
|
8c0f1fbe3b | ||
|
|
b81535c820 | ||
|
|
f5f0a430eb | ||
|
|
ca55dedad4 | ||
|
|
76a3d6fc03 | ||
|
|
f9b5cadf17 | ||
|
|
458ef649f3 | ||
|
|
de063f75e5 | ||
|
|
e2876b119d | ||
|
|
25d41073b7 | ||
|
|
5fb9e395d5 | ||
|
|
c73ddcd464 | ||
|
|
3a98c295e0 | ||
|
|
899f921da3 | ||
|
|
97b9d24134 | ||
|
|
ab9dbecbd6 | ||
|
|
0cf77d94cb | ||
|
|
bfe3a4067d | ||
|
|
0226483c30 | ||
|
|
a6dbb9a58f | ||
|
|
c9e691bdc2 | ||
|
|
e88bfb597c | ||
|
|
190ded1ba7 | ||
|
|
7b7f1f3223 | ||
|
|
1f4473c278 | ||
|
|
27e86640be | ||
|
|
74d151d12c | ||
|
|
a370f01908 | ||
|
|
3078e1f90c | ||
|
|
d90830b285 | ||
|
|
74288cdba6 | ||
|
|
a37e59cdb3 | ||
|
|
ee5f63e11c | ||
|
|
b02f2768d3 | ||
|
|
da3a7c1e98 | ||
|
|
8180406467 | ||
|
|
be595de148 | ||
|
|
395b6518ee | ||
|
|
49243506cb | ||
|
|
69948f4a4a | ||
|
|
85aaeb9892 | ||
|
|
95098d5828 | ||
|
|
eb4aa04f7e | ||
|
|
5afb940718 | ||
|
|
b6e956e086 | ||
|
|
681ca8197c | ||
|
|
21e312dac3 | ||
|
|
5a02e32aec | ||
|
|
dfe3631bcd | ||
|
|
b7c53bf8e2 | ||
|
|
9bdf9c4416 | ||
|
|
7116c1c06e | ||
|
|
f210394d84 | ||
|
|
0679a29cdc | ||
|
|
7a9a75794e | ||
|
|
89469e3c9c | ||
|
|
01110b4ec1 | ||
|
|
b54cd58602 | ||
|
|
6cc00be4b5 | ||
|
|
b40594f0ee | ||
|
|
01f4ceca23 | ||
|
|
7aead375d8 | ||
|
|
471c9e8559 | ||
|
|
f45960263f | ||
|
|
0ee9cc69a8 | ||
|
|
2a3db78f97 | ||
|
|
e5f9265979 | ||
|
|
00416b5063 | ||
|
|
5a70362b79 | ||
|
|
97deb78de6 | ||
|
|
2d22573588 | ||
|
|
deec85be14 | ||
|
|
6342203256 | ||
|
|
949fbb68c3 | ||
|
|
222c21ddf9 | ||
|
|
ae20e55c50 | ||
|
|
765da48b0c | ||
|
|
3769a17300 | ||
|
|
cad853b196 | ||
|
|
804128b7c8 | ||
|
|
e136b9dc63 | ||
|
|
b4ffb8cf01 | ||
|
|
e24c1103b3 | ||
|
|
07202e684a | ||
|
|
ca774258d6 | ||
|
|
93d48c5787 | ||
|
|
aa65f20afa | ||
|
|
f3caa9841c | ||
|
|
4c6663948b | ||
|
|
c5a4f920c4 | ||
|
|
c6cbb727da | ||
|
|
830337b403 | ||
|
|
c11f8a059e | ||
|
|
6fd1ed18a1 | ||
|
|
0338382fdf | ||
|
|
aac2b8e6f4 | ||
|
|
40a111a2e9 | ||
|
|
cbb0b86712 | ||
|
|
51465a2797 | ||
|
|
fa99c75313 | ||
|
|
0b4bd40b32 | ||
|
|
c5b2dc826b | ||
|
|
1f7a58ea41 | ||
|
|
ca6e2963e3 | ||
|
|
9f019f100d | ||
|
|
5e91a72cd9 | ||
|
|
01d7383ae0 | ||
|
|
74234fa03c | ||
|
|
49b24294b1 | ||
|
|
5feb07a251 | ||
|
|
28b69c4f14 | ||
|
|
19e5fd269e | ||
|
|
52d708bf3f | ||
|
|
bb66a1bfa5 | ||
|
|
d31b1ebfcd | ||
|
|
4385d29aa0 | ||
|
|
111e1d5ed3 | ||
|
|
27d48f2ec3 | ||
|
|
1a6ddf7e75 | ||
|
|
cd8d01db29 | ||
|
|
dc8f56bc57 | ||
|
|
efb04397f7 | ||
|
|
19b34e8d39 | ||
|
|
b7c7e0ef27 | ||
|
|
b02c5ed4a9 | ||
|
|
59fb485ba6 | ||
|
|
71b22458ba | ||
|
|
ecb9391439 | ||
|
|
aaf341bd81 | ||
|
|
35ef24a40f | ||
|
|
3973f0552c | ||
|
|
767cc166b1 | ||
|
|
f24ad20ffe | ||
|
|
a1f915806a | ||
|
|
669212a9b7 | ||
|
|
59f6e51636 | ||
|
|
2515ba274d | ||
|
|
6c2fbfe6ff | ||
|
|
26fdb271dd | ||
|
|
4504c5cd74 | ||
|
|
2746556dfa | ||
|
|
5ff6266a5e | ||
|
|
e57fc1c2d8 | ||
|
|
097d3c8377 | ||
|
|
43c728d5d4 | ||
|
|
3dffb8da15 | ||
|
|
c49dbd6d6d | ||
|
|
356112e8cc | ||
|
|
ad0d862d92 | ||
|
|
2ca007af1a | ||
|
|
0a42c887d2 | ||
|
|
f54a95c965 | ||
|
|
eec8da890a | ||
|
|
32a58d85a3 | ||
|
|
1252aaed30 | ||
|
|
060ff1cae4 | ||
|
|
1c2955ed9e | ||
|
|
5e5bce8745 | ||
|
|
e43ba60792 | ||
|
|
e94fe58965 | ||
|
|
a21412844a | ||
|
|
666ca8e87b | ||
|
|
71ceffd9b4 | ||
|
|
cdbd669af2 | ||
|
|
027043edb7 | ||
|
|
e4a1f8e86b | ||
|
|
dfd5eb9b1e | ||
|
|
e3ee840b64 | ||
|
|
b8bd13c704 | ||
|
|
6238299a0a | ||
|
|
d40ddc3d3b | ||
|
|
d2746db969 | ||
|
|
95057ef503 | ||
|
|
aec2ec30d5 | ||
|
|
4d36b3d6e9 | ||
|
|
6b89197cfd | ||
|
|
dd2ebdd2de | ||
|
|
c479d326ed | ||
|
|
8434d91891 | ||
|
|
f9c761ea99 | ||
|
|
b14f5f16d0 | ||
|
|
4fbc8e0c89 | ||
|
|
ad2a1715b5 | ||
|
|
ac8f826612 | ||
|
|
c1aaa9d6e5 | ||
|
|
eac95ffff7 | ||
|
|
8121761cc8 | ||
|
|
7c720cd7cc | ||
|
|
4c2f809502 | ||
|
|
d42523651c | ||
|
|
b9775e0471 | ||
|
|
d2f37204e0 | ||
|
|
846dad6662 | ||
|
|
c966010ed3 | ||
|
|
e77fea09bc | ||
|
|
b63291c7d3 | ||
|
|
2ccc044a27 | ||
|
|
4144850f9d | ||
|
|
18630aadf9 | ||
|
|
605fff519e | ||
|
|
0b7ff9551d | ||
|
|
2c9716e01e | ||
|
|
cdde3fe654 | ||
|
|
3537667187 | ||
|
|
66086c460d | ||
|
|
a203a8de67 | ||
|
|
2bba9c53ed | ||
|
|
37af4d33fc | ||
|
|
107f40c8c9 | ||
|
|
cb325022dc | ||
|
|
b62b439218 | ||
|
|
47972fe2a1 | ||
|
|
7ad937266f | ||
|
|
2f34dffab4 | ||
|
|
4a956c0247 | ||
|
|
23ce7a1f84 | ||
|
|
66a8ad2e4f | ||
|
|
e8e2e31b59 | ||
|
|
7259c46d1c | ||
|
|
9d3c3d1924 | ||
|
|
a0d6317747 | ||
|
|
3810e09509 | ||
|
|
bb7678e7e4 | ||
|
|
3dcf01dd1f | ||
|
|
3b8f19b4c9 | ||
|
|
ab957c26a0 | ||
|
|
e835c82c27 | ||
|
|
d69a9e8537 | ||
|
|
1b286d664b | ||
|
|
f8c8a6c2cd | ||
|
|
b71234fc83 | ||
|
|
2eb35733da | ||
|
|
df276d5942 | ||
|
|
e1a6fb9569 | ||
|
|
99b2d636a1 | ||
|
|
78be59adac | ||
|
|
720ab6ae3a | ||
|
|
5e0dcc948c | ||
|
|
90400d72b1 | ||
|
|
8f1fd6cbf5 | ||
|
|
fef8788d55 | ||
|
|
d2f8156bde | ||
|
|
d4fbd48f1c | ||
|
|
a6d3948fbc | ||
|
|
005bbb1792 | ||
|
|
186230d211 | ||
|
|
ee1e8bc204 | ||
|
|
d1366fb764 | ||
|
|
d81dba6407 | ||
|
|
f35ddd8e9a | ||
|
|
ff798463e8 | ||
|
|
6308c386a3 | ||
|
|
5a6c338ab9 | ||
|
|
bc6401e7dd | ||
|
|
0667f22ddd | ||
|
|
594cd339b5 | ||
|
|
762497b867 | ||
|
|
9199a985d8 | ||
|
|
624e1234d9 | ||
|
|
a3d153db66 | ||
|
|
dc25bc5727 | ||
|
|
6a1670b550 | ||
|
|
8cd3a720fe | ||
|
|
9aa7da68be | ||
|
|
063042cd76 | ||
|
|
8ce3a5d236 | ||
|
|
0c58c84625 | ||
|
|
68ddcf3b56 | ||
|
|
a0648d7d91 | ||
|
|
5e674973db | ||
|
|
4f2b634825 | ||
|
|
48bbf07392 | ||
|
|
357f6da3b0 | ||
|
|
def21041d8 | ||
|
|
c44728865a | ||
|
|
f271140c5f | ||
|
|
3593aaf61f | ||
|
|
8b433a008d | ||
|
|
1ab1bf1b00 | ||
|
|
c04d15f806 | ||
|
|
977e8bdc21 | ||
|
|
454d1d03f5 | ||
|
|
f73ff7fa26 | ||
|
|
98317c94aa | ||
|
|
aa91d762af | ||
|
|
5cddd0842b | ||
|
|
4dee3d2283 | ||
|
|
2d20cb3819 | ||
|
|
c28beb3bc1 | ||
|
|
216a7a6ff8 | ||
|
|
a48d2bad4f | ||
|
|
04c60414e1 | ||
|
|
92c3f67020 | ||
|
|
49e6c064ac | ||
|
|
8551139a8a | ||
|
|
96461692ee | ||
|
|
a217ad4be5 | ||
|
|
18216ce430 | ||
|
|
1711a2d1d7 | ||
|
|
8b2080a2f0 | ||
|
|
006ee1d2e6 | ||
|
|
0a7c473965 | ||
|
|
4e124d174c | ||
|
|
524b2a5668 | ||
|
|
844f036a27 | ||
|
|
7d6c781ea5 | ||
|
|
ad9577daaf | ||
|
|
114068c531 | ||
|
|
0daa03e04c | ||
|
|
63348fd36a | ||
|
|
c71c246959 | ||
|
|
2b7504e969 | ||
|
|
b942554c80 | ||
|
|
1ae227fddd | ||
|
|
a63fe18d15 | ||
|
|
ea1ea2aa68 | ||
|
|
90d06d71d3 | ||
|
|
11f2deb7a6 | ||
|
|
0f5edf023a | ||
|
|
3be0621647 | ||
|
|
fc07bfdb85 | ||
|
|
581a989304 | ||
|
|
047d6a85ab | ||
|
|
90f6a07d4a | ||
|
|
8f4a53db64 | ||
|
|
30d7ec50f3 |
@@ -1,77 +1,48 @@
|
|||||||
version: 2.0
|
version: 2.0
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
|
||||||
docker:
|
|
||||||
- image: circleci/node:10
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- restore_cache:
|
|
||||||
key: send-build-{{ checksum "package-lock.json" }}
|
|
||||||
- run: npm install
|
|
||||||
- save_cache:
|
|
||||||
key: send-build-{{ checksum "package-lock.json" }}
|
|
||||||
paths:
|
|
||||||
- node_modules
|
|
||||||
- run: npm run build
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: .
|
|
||||||
paths:
|
|
||||||
- ./dist
|
|
||||||
test:
|
test:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:10-browsers
|
- image: circleci/node:12-browsers
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- restore_cache:
|
- run: npm ci
|
||||||
key: send-test-{{ checksum "package-lock.json" }}
|
|
||||||
- run: npm install
|
|
||||||
- save_cache:
|
|
||||||
key: send-test-{{ checksum "package-lock.json" }}
|
|
||||||
paths:
|
|
||||||
- node_modules
|
|
||||||
- run: npm run lint
|
- run: npm run lint
|
||||||
- run: npm run test
|
- run: npm test
|
||||||
- store_artifacts:
|
- store_artifacts:
|
||||||
path: coverage
|
path: coverage
|
||||||
integration_tests:
|
integration_tests:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:10-browsers
|
- image: circleci/node:12-browsers
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- restore_cache:
|
- run: npm ci
|
||||||
key: send-int-{{ checksum "package-lock.json" }}
|
- run:
|
||||||
- run: npm install
|
|
||||||
- save_cache:
|
|
||||||
key: send-int-{{ checksum "package-lock.json" }}
|
|
||||||
paths:
|
|
||||||
- node_modules
|
|
||||||
- run:
|
|
||||||
name: Run integration test
|
name: Run integration test
|
||||||
command: ./scripts/bin/run-integration-test-circleci.sh
|
command: ./scripts/bin/run-integration-test-circleci.sh
|
||||||
deploy_dev:
|
deploy_dev:
|
||||||
machine: true
|
docker:
|
||||||
|
- image: circleci/node:12
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- attach_workspace:
|
- setup_remote_docker
|
||||||
at: .
|
|
||||||
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
||||||
- run: docker build -t mozilla/send:latest .
|
- run: docker build -t mozilla/send:latest .
|
||||||
- run: docker push mozilla/send:latest
|
- run: docker push mozilla/send:latest
|
||||||
deploy_vnext:
|
deploy_vnext:
|
||||||
machine: true
|
docker:
|
||||||
|
- image: circleci/node:12
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- attach_workspace:
|
- setup_remote_docker
|
||||||
at: .
|
|
||||||
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
||||||
- run: docker build -t mozilla/send:vnext .
|
- run: docker build -t mozilla/send:vnext .
|
||||||
- run: docker push mozilla/send:vnext
|
- run: docker push mozilla/send:vnext
|
||||||
deploy_stage:
|
deploy_stage:
|
||||||
machine: true
|
docker:
|
||||||
|
- image: circleci/node:12
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- attach_workspace:
|
- setup_remote_docker
|
||||||
at: .
|
|
||||||
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
||||||
- run: docker build -t mozilla/send:$CIRCLE_TAG .
|
- run: docker build -t mozilla/send:$CIRCLE_TAG .
|
||||||
- run: docker push mozilla/send:$CIRCLE_TAG
|
- run: docker push mozilla/send:$CIRCLE_TAG
|
||||||
@@ -79,12 +50,6 @@ workflows:
|
|||||||
version: 2
|
version: 2
|
||||||
test_pr:
|
test_pr:
|
||||||
jobs:
|
jobs:
|
||||||
- build:
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
ignore:
|
|
||||||
- master
|
|
||||||
- vnext
|
|
||||||
- test:
|
- test:
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
@@ -97,25 +62,13 @@ workflows:
|
|||||||
ignore: master
|
ignore: master
|
||||||
build_and_deploy_dev:
|
build_and_deploy_dev:
|
||||||
jobs:
|
jobs:
|
||||||
- build:
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- vnext
|
|
||||||
tags:
|
|
||||||
ignore: /^v.*/
|
|
||||||
- deploy_dev:
|
- deploy_dev:
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: master
|
only: master
|
||||||
tags:
|
tags:
|
||||||
ignore: /^v.*/
|
ignore: /^v.*/
|
||||||
- deploy_vnext:
|
- deploy_vnext:
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: vnext
|
only: vnext
|
||||||
@@ -123,12 +76,6 @@ workflows:
|
|||||||
ignore: /^v.*/
|
ignore: /^v.*/
|
||||||
build_and_deploy_stage:
|
build_and_deploy_stage:
|
||||||
jobs:
|
jobs:
|
||||||
- build:
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
ignore: /.*/
|
|
||||||
tags:
|
|
||||||
only: /^v.*/
|
|
||||||
- test:
|
- test:
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
@@ -143,7 +90,6 @@ workflows:
|
|||||||
only: /^v.*/
|
only: /^v.*/
|
||||||
- deploy_stage:
|
- deploy_stage:
|
||||||
requires:
|
requires:
|
||||||
- build
|
|
||||||
- test
|
- test
|
||||||
- integration_tests
|
- integration_tests
|
||||||
filters:
|
filters:
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
node_modules
|
.circleci
|
||||||
.git
|
|
||||||
.tox
|
|
||||||
.DS_Store
|
|
||||||
firefox
|
|
||||||
assets
|
|
||||||
docs
|
|
||||||
test
|
|
||||||
coverage
|
|
||||||
.nyc_output
|
.nyc_output
|
||||||
|
.vscode
|
||||||
|
.DS_Store
|
||||||
|
coverage
|
||||||
|
docs
|
||||||
|
firefox
|
||||||
|
node_modules
|
||||||
@@ -4,4 +4,5 @@ firefox
|
|||||||
coverage
|
coverage
|
||||||
android/app/build
|
android/app/build
|
||||||
app/locale.js
|
app/locale.js
|
||||||
app/capabilities.js
|
app/capabilities.js
|
||||||
|
app/qrcode.js
|
||||||
@@ -19,6 +19,7 @@ rules:
|
|||||||
node/no-unsupported-features/es-syntax: off
|
node/no-unsupported-features/es-syntax: off
|
||||||
node/no-unsupported-features/node-builtins: off
|
node/no-unsupported-features/node-builtins: off
|
||||||
node/no-unpublished-require: off
|
node/no-unpublished-require: off
|
||||||
|
node/no-unpublished-import: off
|
||||||
|
|
||||||
security/detect-non-literal-fs-filename: off
|
security/detect-non-literal-fs-filename: off
|
||||||
security/detect-object-injection: off
|
security/detect-object-injection: off
|
||||||
|
|||||||
71
.gitlab-ci.yml
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
image: "node:12-slim"
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
- artifact
|
||||||
|
- release
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
# Install dependencies
|
||||||
|
- apt-get update
|
||||||
|
- apt-get install -y git python3 build-essential libxtst6
|
||||||
|
|
||||||
|
# Prepare Chrome for puppeteer
|
||||||
|
- apt-get install -y wget gnupg
|
||||||
|
- wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
|
||||||
|
- sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
|
||||||
|
- apt-get update
|
||||||
|
- apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 --no-install-recommends
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npm ci
|
||||||
|
- npm run lint
|
||||||
|
- npm test
|
||||||
|
|
||||||
|
# Release Docker image artifact for easy testing
|
||||||
|
artifact-docker:
|
||||||
|
stage: artifact
|
||||||
|
image: docker:latest
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
before_script: []
|
||||||
|
script:
|
||||||
|
- export IMG_NAME=registry.gitlab.com/timvisee/send:master-$CI_COMMIT_SHA
|
||||||
|
|
||||||
|
# Login in to registry
|
||||||
|
- 'docker login registry.gitlab.com -u $DOCKER_USER -p $DOCKER_PASS'
|
||||||
|
|
||||||
|
# Build and push image, report image name
|
||||||
|
- docker build -t $IMG_NAME .
|
||||||
|
- docker push $IMG_NAME
|
||||||
|
- 'echo Docker image artifact published, available as:'
|
||||||
|
- 'echo " docker pull $IMG_NAME"'
|
||||||
|
|
||||||
|
# Release public Docker image
|
||||||
|
release-docker:
|
||||||
|
stage: release
|
||||||
|
image: docker:latest
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
only:
|
||||||
|
- /^v(\d+\.)*\d+$/
|
||||||
|
before_script: []
|
||||||
|
script:
|
||||||
|
- export IMG_NAME=registry.gitlab.com/timvisee/send:$CI_COMMIT_REF_NAME
|
||||||
|
- export IMG_NAME_LATEST=registry.gitlab.com/timvisee/send:latest
|
||||||
|
|
||||||
|
# Login in to registry
|
||||||
|
- 'docker login registry.gitlab.com -u $DOCKER_USER -p $DOCKER_PASS'
|
||||||
|
|
||||||
|
# Build and push image, report image name
|
||||||
|
- docker build -t $IMG_NAME .
|
||||||
|
- docker tag $IMG_NAME $IMG_NAME_LATEST
|
||||||
|
- docker push $IMG_NAME
|
||||||
|
- docker push $IMG_NAME_LATEST
|
||||||
|
- 'echo Docker image artifact published, available as:'
|
||||||
|
- 'echo " docker pull $IMG_NAME_LATEST"'
|
||||||
|
- 'echo " docker pull $IMG_NAME"'
|
||||||
12
CONTRIBUTORS
@@ -1,6 +1,7 @@
|
|||||||
Abdalrahman Hwoij
|
Abdalrahman Hwoij
|
||||||
Abhinav Adduri
|
Abhinav Adduri
|
||||||
Adnan Kičin
|
Adnan Kičin
|
||||||
|
Adolfo Jayme Barrientos
|
||||||
Alberto Castro
|
Alberto Castro
|
||||||
Alexander Slovesnik
|
Alexander Slovesnik
|
||||||
Alfredos-Panagiotis Damkalis
|
Alfredos-Panagiotis Damkalis
|
||||||
@@ -63,6 +64,7 @@ George Raptis
|
|||||||
Georgianizator
|
Georgianizator
|
||||||
Gonçalo Matos
|
Gonçalo Matos
|
||||||
Gwenn
|
Gwenn
|
||||||
|
Hampus
|
||||||
Hugo
|
Hugo
|
||||||
Hugo Abreu
|
Hugo Abreu
|
||||||
Hyeonseok Shin
|
Hyeonseok Shin
|
||||||
@@ -93,6 +95,7 @@ Juraj Cigáň
|
|||||||
Kerim Kalamujić
|
Kerim Kalamujić
|
||||||
Khaled Hosny
|
Khaled Hosny
|
||||||
Kim Ludvigsen
|
Kim Ludvigsen
|
||||||
|
Kim Younggeon
|
||||||
Kohei Yoshino
|
Kohei Yoshino
|
||||||
Lan Glad
|
Lan Glad
|
||||||
Lasse Liehu
|
Lasse Liehu
|
||||||
@@ -101,6 +104,7 @@ Lobodzets
|
|||||||
LuFlo
|
LuFlo
|
||||||
Luis A. Sánchez
|
Luis A. Sánchez
|
||||||
Luiz Carlos de Morais
|
Luiz Carlos de Morais
|
||||||
|
Luiz Felipe F M Costa
|
||||||
Luna Jernberg
|
Luna Jernberg
|
||||||
Mahay Alam Khan
|
Mahay Alam Khan
|
||||||
Marcelo Ghelman
|
Marcelo Ghelman
|
||||||
@@ -110,6 +114,7 @@ Mark Heijl
|
|||||||
Mark Liang
|
Mark Liang
|
||||||
Mark Liang (You-Wen)
|
Mark Liang (You-Wen)
|
||||||
Marko Andrejić
|
Marko Andrejić
|
||||||
|
Martijn Dekker
|
||||||
Marwan Mohamad
|
Marwan Mohamad
|
||||||
Matjaž Horvat
|
Matjaž Horvat
|
||||||
Maykon Chagas
|
Maykon Chagas
|
||||||
@@ -131,6 +136,7 @@ Myungjae Won
|
|||||||
Nicholas Skinsacos
|
Nicholas Skinsacos
|
||||||
Nihad
|
Nihad
|
||||||
Nihad Suljić
|
Nihad Suljić
|
||||||
|
Niksend Mizuhara
|
||||||
Oscar
|
Oscar
|
||||||
Paulius
|
Paulius
|
||||||
Pedro Burlamaqui Bendahan
|
Pedro Burlamaqui Bendahan
|
||||||
@@ -138,7 +144,9 @@ Peter deHaan
|
|||||||
Pierre Neter
|
Pierre Neter
|
||||||
Pin-guang Chen
|
Pin-guang Chen
|
||||||
Piotr Drąg
|
Piotr Drąg
|
||||||
|
Quentí
|
||||||
Quế Tùng
|
Quế Tùng
|
||||||
|
Rachel Tublitz
|
||||||
Radu Popescu
|
Radu Popescu
|
||||||
Rhoslyn Prys
|
Rhoslyn Prys
|
||||||
RickieES
|
RickieES
|
||||||
@@ -161,6 +169,7 @@ Sara Todaro
|
|||||||
Sav22999
|
Sav22999
|
||||||
Schieck :)
|
Schieck :)
|
||||||
Selim Şumlu
|
Selim Şumlu
|
||||||
|
Selyan Sliman Amiri
|
||||||
Sidak Singh Aulakh
|
Sidak Singh Aulakh
|
||||||
Slimane Amiri
|
Slimane Amiri
|
||||||
Slimane Selyan AMIRI
|
Slimane Selyan AMIRI
|
||||||
@@ -183,6 +192,7 @@ Victor Bychek
|
|||||||
Vimal Raghubir
|
Vimal Raghubir
|
||||||
Vitaliy Krutko
|
Vitaliy Krutko
|
||||||
Weihang Lo
|
Weihang Lo
|
||||||
|
Wiktor Furman
|
||||||
Wil Clouser
|
Wil Clouser
|
||||||
YFdyh000
|
YFdyh000
|
||||||
Yassine Aït-El-Mouden
|
Yassine Aït-El-Mouden
|
||||||
@@ -213,9 +223,11 @@ jesferman1993
|
|||||||
jlG
|
jlG
|
||||||
josotrix
|
josotrix
|
||||||
jspam
|
jspam
|
||||||
|
julen
|
||||||
julenx
|
julenx
|
||||||
kenrick95
|
kenrick95
|
||||||
kumincir
|
kumincir
|
||||||
|
leo.toneff
|
||||||
m4hdi.pdroid
|
m4hdi.pdroid
|
||||||
mail
|
mail
|
||||||
manxmensch
|
manxmensch
|
||||||
|
|||||||
60
Dockerfile
@@ -1,19 +1,59 @@
|
|||||||
FROM node:10 AS builder
|
##
|
||||||
RUN addgroup --gid 10001 app && adduser --disabled-password --gecos '' --gid 10001 --home /app --uid 10001 app
|
# Send
|
||||||
COPY package*.json /app/
|
#
|
||||||
WORKDIR /app
|
# License https://gitlab.com/timvisee/send/blob/master/LICENSE
|
||||||
RUN npm install --production
|
##
|
||||||
|
|
||||||
FROM node:10-slim
|
|
||||||
RUN addgroup --gid 10001 app && adduser --disabled-password --gecos '' --gid 10001 --home /app --uid 10001 app
|
# Build project
|
||||||
|
FROM node:12 AS builder
|
||||||
|
RUN set -x \
|
||||||
|
# Add user
|
||||||
|
&& addgroup --gid 10001 app \
|
||||||
|
&& adduser --disabled-password \
|
||||||
|
--gecos '' \
|
||||||
|
--gid 10001 \
|
||||||
|
--home /app \
|
||||||
|
--uid 10001 \
|
||||||
|
app
|
||||||
|
COPY --chown=app:app . /app
|
||||||
USER app
|
USER app
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --chown=app:app --from=builder /app .
|
RUN set -x \
|
||||||
COPY --chown=app:app . .
|
# Build
|
||||||
|
&& PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm ci \
|
||||||
|
&& npm run build
|
||||||
|
|
||||||
|
|
||||||
|
# Main image
|
||||||
|
FROM node:12-slim
|
||||||
|
RUN set -x \
|
||||||
|
# Add user
|
||||||
|
&& addgroup --gid 10001 app \
|
||||||
|
&& adduser --disabled-password \
|
||||||
|
--gecos '' \
|
||||||
|
--gid 10001 \
|
||||||
|
--home /app \
|
||||||
|
--uid 10001 \
|
||||||
|
app
|
||||||
|
RUN apt-get update && apt-get -y install \
|
||||||
|
git-core \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
USER app
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --chown=app:app package*.json ./
|
||||||
|
COPY --chown=app:app app app
|
||||||
|
COPY --chown=app:app common common
|
||||||
|
COPY --chown=app:app public/locales public/locales
|
||||||
|
COPY --chown=app:app server server
|
||||||
|
COPY --chown=app:app --from=builder /app/dist dist
|
||||||
|
|
||||||
|
RUN npm ci --production && npm cache clean --force
|
||||||
RUN mkdir -p /app/.config/configstore
|
RUN mkdir -p /app/.config/configstore
|
||||||
RUN ln -s dist/version.json version.json
|
RUN ln -s dist/version.json version.json
|
||||||
|
|
||||||
ENV PORT=1443
|
ENV PORT=1443
|
||||||
EXPOSE $PORT
|
|
||||||
|
EXPOSE ${PORT}
|
||||||
|
|
||||||
CMD ["node", "server/bin/prod.js"]
|
CMD ["node", "server/bin/prod.js"]
|
||||||
|
|||||||
67
README.md
@@ -1,6 +1,57 @@
|
|||||||
# [](https://send.firefox.com/)
|
# [](https://gitlab.com/timvisee/send/) Send
|
||||||
|
|
||||||
[](https://circleci.com/gh/mozilla/send)
|
[![Build status on GitLab CI][gitlab-ci-master-badge]][gitlab-ci-link]
|
||||||
|
[![Latest release][release-badge]][release-link]
|
||||||
|
[![Docker image][docker-image-badge]][docker-image-link]
|
||||||
|
[![Project license][repo-license-badge]](LICENSE)
|
||||||
|
|
||||||
|
[docker-image-badge]: https://img.shields.io/badge/docker-latest-blue.svg
|
||||||
|
[docker-image-link]: https://gitlab.com/timvisee/send/container_registry/eyJuYW1lIjoidGltdmlzZWUvc2VuZCIsInRhZ3NfcGF0aCI6Ii90aW12aXNlZS9zZW5kL3JlZ2lzdHJ5L3JlcG9zaXRvcnkvMTQxODUwNC90YWdzP2Zvcm1hdD1qc29uIiwiaWQiOjE0MTg1MDQsImNsZWFudXBfcG9saWN5X3N0YXJ0ZWRfYXQiOm51bGx9
|
||||||
|
[gitlab-ci-link]: https://gitlab.com/timvisee/send/pipelines
|
||||||
|
[gitlab-ci-master-badge]: https://gitlab.com/timvisee/send/badges/master/pipeline.svg
|
||||||
|
[release-badge]: https://img.shields.io/github/v/tag/timvisee/send
|
||||||
|
[release-link]: https://gitlab.com/timvisee/send/-/tags
|
||||||
|
[repo-license-badge]: https://img.shields.io/github/license/timvisee/send.svg
|
||||||
|
|
||||||
|
A fork of Mozilla's [Firefox Send][mozilla-send].
|
||||||
|
Mozilla discontinued Send, this fork is a community effort to keep the project
|
||||||
|
up-to-date and alive.
|
||||||
|
|
||||||
|
- Forked [at][fork-commit] Mozilla's last publicly hosted version
|
||||||
|
- _Mozilla_ & _Firefox_ branding [is][remove-branding-pr] removed so you can legally self-host
|
||||||
|
- Kept compatible with [`ffsend`][ffsend] (CLI for Send)
|
||||||
|
- Dependencies have been updated
|
||||||
|
- Mozilla's [changes][mozilla-patches] since the fork have been selectively [merged][mozilla-patches-pr]
|
||||||
|
- Mozilla's experimental report feature, download tokens, trust warnings and FxA changes are not included
|
||||||
|
|
||||||
|
Find an up-to-date Docker image here: [docs/docker.md](docs/docker.md)
|
||||||
|
|
||||||
|
The original project by Mozilla can be found [here][mozilla-send].
|
||||||
|
The [`mozilla-master`][branch-mozilla-master] branch holds the `master` branch
|
||||||
|
as left by Mozilla.
|
||||||
|
The [`send-v3`][branch-send-v3] branch holds the commit tree of Mozilla's last
|
||||||
|
publicly hosted version, which this fork is based on.
|
||||||
|
The [`send-v4`][branch-send-v4] branch holds the commit tree of Mozilla's last
|
||||||
|
experimental version which was still a work in progress (featuring file
|
||||||
|
reporting, download tokens, trust warnings and FxA changes), this has
|
||||||
|
selectively been merged into this fork.
|
||||||
|
Please consider to [donate][donate] to allow me to keep working on this.
|
||||||
|
|
||||||
|
Thanks [Mozilla][mozilla] for building this amazing tool!
|
||||||
|
|
||||||
|
[branch-mozilla-master]: https://gitlab.com/timvisee/send/-/tree/mozilla-master
|
||||||
|
[branch-send-v3]: https://gitlab.com/timvisee/send/-/tree/send-v3
|
||||||
|
[branch-send-v4]: https://gitlab.com/timvisee/send/-/tree/send-v4
|
||||||
|
[donate]: https://timvisee.com/donate
|
||||||
|
[ffsend]: https://github.com/timvisee/ffsend
|
||||||
|
[fork-commit]: https://gitlab.com/timvisee/send/-/commit/3e9be676413a6e1baaf6a354c180e91899d10bec
|
||||||
|
[mozilla-patches-pr]: https://gitlab.com/timvisee/send/-/merge_requests/3
|
||||||
|
[mozilla-patches]: https://gitlab.com/timvisee/send/-/compare/3e9be676413a6e1baaf6a354c180e91899d10bec...mozilla-master
|
||||||
|
[mozilla-send]: https://github.com/mozilla/send
|
||||||
|
[mozilla]: https://mozilla.org/
|
||||||
|
[remove-branding-pr]: https://gitlab.com/timvisee/send/-/merge_requests/2
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
**Docs:** [FAQ](docs/faq.md), [Encryption](docs/encryption.md), [Build](docs/build.md), [Docker](docs/docker.md), [Metrics](docs/metrics.md), [More](docs/)
|
**Docs:** [FAQ](docs/faq.md), [Encryption](docs/encryption.md), [Build](docs/build.md), [Docker](docs/docker.md), [Metrics](docs/metrics.md), [More](docs/)
|
||||||
|
|
||||||
@@ -30,22 +81,22 @@ A file sharing experiment which allows you to send encrypted files to other user
|
|||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- [Node.js 10.0+](https://nodejs.org/)
|
- [Node.js 12.x](https://nodejs.org/)
|
||||||
- [Redis server](https://redis.io/) (optional for development)
|
- [Redis server](https://redis.io/) (optional for development)
|
||||||
- [AWS S3](https://aws.amazon.com/s3/) or compatible service. (optional)
|
- [AWS S3](https://aws.amazon.com/s3/) or compatible service (optional)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
To start an ephemeral development server run:
|
To start an ephemeral development server, run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm install
|
npm install
|
||||||
npm start
|
npm start
|
||||||
```
|
```
|
||||||
|
|
||||||
Then browse to http://localhost:8080
|
Then, browse to http://localhost:8080
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -70,7 +121,7 @@ The server is configured with environment variables. See [server/config.js](serv
|
|||||||
|
|
||||||
## Localization
|
## Localization
|
||||||
|
|
||||||
Firefox Send localization is managed via [Pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/), not direct pull requests to the repository. If you want to fix a typo, add a new language, or simply know more about localization, please get in touch with the [existing localization team](https://pontoon.mozilla.org/teams/) for your language or Mozilla’s [l10n-drivers](https://wiki.mozilla.org/L10n:Mozilla_Team#Mozilla_Corporation) for guidance.
|
Send localization is managed via [Pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/), not direct pull requests to the repository. If you want to fix a typo, add a new language, or simply know more about localization, please get in touch with the [existing localization team](https://pontoon.mozilla.org/teams/) for your language or Mozilla’s [l10n-drivers](https://wiki.mozilla.org/L10n:Mozilla_Team#Mozilla_Corporation) for guidance.
|
||||||
|
|
||||||
see also [docs/localization.md](docs/localization.md)
|
see also [docs/localization.md](docs/localization.md)
|
||||||
|
|
||||||
@@ -108,4 +159,6 @@ The android implementation is contained in the `android` directory, and can be v
|
|||||||
|
|
||||||
[Mozilla Public License Version 2.0](LICENSE)
|
[Mozilla Public License Version 2.0](LICENSE)
|
||||||
|
|
||||||
|
[qrcode.js](https://github.com/kazuhikoarase/qrcode-generator) licensed under MIT
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -60,9 +60,7 @@ function body(main) {
|
|||||||
</a>`;
|
</a>`;
|
||||||
*/
|
*/
|
||||||
return html`
|
return html`
|
||||||
<body
|
<body class="flex flex-col items-center font-sans bg-grey-10 h-screen">
|
||||||
class="flex flex-col items-center font-sans bg-grey-lightest h-screen"
|
|
||||||
>
|
|
||||||
${state.cache(Header, 'header').render()} ${main(state, emit)}
|
${state.cache(Header, 'header').render()} ${main(state, emit)}
|
||||||
</body>
|
</body>
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ module.exports = function(state, emit) {
|
|||||||
let content = '';
|
let content = '';
|
||||||
let button = html`
|
let button = html`
|
||||||
<div
|
<div
|
||||||
class="bg-blue rounded-full m-4 flex items-center justify-center shadow-lg"
|
class="bg-blue-50 rounded-full m-4 flex items-center justify-center shadow-lg"
|
||||||
style="width: 56px; height: 56px"
|
style="width: 56px; height: 56px"
|
||||||
onclick="${onclick}"
|
onclick="${onclick}"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -61,7 +61,10 @@ async function fetchWithAuth(url, params, keychain) {
|
|||||||
const result = {};
|
const result = {};
|
||||||
params = params || {};
|
params = params || {};
|
||||||
const h = await keychain.authHeader();
|
const h = await keychain.authHeader();
|
||||||
params.headers = new Headers({ Authorization: h });
|
params.headers = new Headers({
|
||||||
|
Authorization: h,
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
});
|
||||||
const response = await fetch(url, params);
|
const response = await fetch(url, params);
|
||||||
result.response = response;
|
result.response = response;
|
||||||
result.ok = response.ok;
|
result.ok = response.ok;
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ async function polyfillStreams() {
|
|||||||
|
|
||||||
export default async function getCapabilities() {
|
export default async function getCapabilities() {
|
||||||
const browser = browserName();
|
const browser = browserName();
|
||||||
|
const isMobile = /mobi|android/i.test(navigator.userAgent);
|
||||||
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
|
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
|
||||||
let crypto = await checkCrypto();
|
let crypto = await checkCrypto();
|
||||||
const nativeStreams = checkStreams();
|
const nativeStreams = checkStreams();
|
||||||
@@ -91,14 +92,15 @@ export default async function getCapabilities() {
|
|||||||
account = false;
|
account = false;
|
||||||
}
|
}
|
||||||
const share =
|
const share =
|
||||||
typeof navigator.share === 'function' && locale().startsWith('en'); // en until strings merge
|
isMobile &&
|
||||||
|
typeof navigator.share === 'function' &&
|
||||||
|
locale().startsWith('en'); // en until strings merge
|
||||||
|
|
||||||
const standalone =
|
const standalone =
|
||||||
window.matchMedia('(display-mode: standalone)').matches ||
|
window.matchMedia('(display-mode: standalone)').matches ||
|
||||||
navigator.standalone;
|
navigator.standalone;
|
||||||
|
|
||||||
const mobileFirefox =
|
const mobileFirefox = browser === 'firefox' && isMobile;
|
||||||
browser === 'firefox' && /mobile/i.test(navigator.userAgent);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
account,
|
account,
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
import FileSender from './fileSender';
|
|
||||||
import FileReceiver from './fileReceiver';
|
|
||||||
import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils';
|
|
||||||
import * as metrics from './metrics';
|
import * as metrics from './metrics';
|
||||||
import { bytes, locale } from './utils';
|
import FileReceiver from './fileReceiver';
|
||||||
import okDialog from './ui/okDialog';
|
import FileSender from './fileSender';
|
||||||
import copyDialog from './ui/copyDialog';
|
import copyDialog from './ui/copyDialog';
|
||||||
|
import faviconProgressbar from './ui/faviconProgressbar';
|
||||||
|
import okDialog from './ui/okDialog';
|
||||||
import shareDialog from './ui/shareDialog';
|
import shareDialog from './ui/shareDialog';
|
||||||
import signupDialog from './ui/signupDialog';
|
import signupDialog from './ui/signupDialog';
|
||||||
import surveyDialog from './ui/surveyDialog';
|
import surveyDialog from './ui/surveyDialog';
|
||||||
|
import { bytes, locale } from './utils';
|
||||||
|
import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils';
|
||||||
|
|
||||||
export default function(state, emitter) {
|
export default function(state, emitter) {
|
||||||
let lastRender = 0;
|
let lastRender = 0;
|
||||||
@@ -29,6 +30,7 @@ export default function(state, emitter) {
|
|||||||
if (updateTitle) {
|
if (updateTitle) {
|
||||||
emitter.emit('DOMTitleChange', percent(state.transfer.progressRatio));
|
emitter.emit('DOMTitleChange', percent(state.transfer.progressRatio));
|
||||||
}
|
}
|
||||||
|
faviconProgressbar.updateFavicon(state.transfer.progressRatio);
|
||||||
render();
|
render();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +38,8 @@ export default function(state, emitter) {
|
|||||||
document.addEventListener('blur', () => (updateTitle = true));
|
document.addEventListener('blur', () => (updateTitle = true));
|
||||||
document.addEventListener('focus', () => {
|
document.addEventListener('focus', () => {
|
||||||
updateTitle = false;
|
updateTitle = false;
|
||||||
emitter.emit('DOMTitleChange', 'Firefox Send');
|
emitter.emit('DOMTitleChange', 'Send');
|
||||||
|
faviconProgressbar.updateFavicon(0);
|
||||||
});
|
});
|
||||||
checkFiles();
|
checkFiles();
|
||||||
});
|
});
|
||||||
@@ -49,8 +52,8 @@ export default function(state, emitter) {
|
|||||||
state.user.login(email);
|
state.user.login(email);
|
||||||
});
|
});
|
||||||
|
|
||||||
emitter.on('logout', () => {
|
emitter.on('logout', async () => {
|
||||||
state.user.logout();
|
await state.user.logout();
|
||||||
metrics.loggedOut({ trigger: 'button' });
|
metrics.loggedOut({ trigger: 'button' });
|
||||||
emitter.emit('pushState', '/');
|
emitter.emit('pushState', '/');
|
||||||
});
|
});
|
||||||
@@ -83,6 +86,7 @@ export default function(state, emitter) {
|
|||||||
|
|
||||||
emitter.on('cancel', () => {
|
emitter.on('cancel', () => {
|
||||||
state.transfer.cancel();
|
state.transfer.cancel();
|
||||||
|
faviconProgressbar.updateFavicon(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
emitter.on('addFiles', async ({ files }) => {
|
emitter.on('addFiles', async ({ files }) => {
|
||||||
@@ -161,6 +165,7 @@ export default function(state, emitter) {
|
|||||||
state.storage.totalUploads += 1;
|
state.storage.totalUploads += 1;
|
||||||
const duration = Date.now() - start;
|
const duration = Date.now() - start;
|
||||||
metrics.completedUpload(archive, duration);
|
metrics.completedUpload(archive, duration);
|
||||||
|
faviconProgressbar.updateFavicon(0);
|
||||||
|
|
||||||
state.storage.addFile(ownedFile);
|
state.storage.addFile(ownedFile);
|
||||||
// TODO integrate password into /upload request
|
// TODO integrate password into /upload request
|
||||||
@@ -178,6 +183,12 @@ export default function(state, emitter) {
|
|||||||
//cancelled. do nothing
|
//cancelled. do nothing
|
||||||
metrics.cancelledUpload(archive, err.duration);
|
metrics.cancelledUpload(archive, err.duration);
|
||||||
render();
|
render();
|
||||||
|
} else if (err.message === '401') {
|
||||||
|
const refreshed = await state.user.refresh();
|
||||||
|
if (refreshed) {
|
||||||
|
return emitter.emit('upload');
|
||||||
|
}
|
||||||
|
emitter.emit('pushState', '/error');
|
||||||
} else {
|
} else {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.error(err);
|
console.error(err);
|
||||||
@@ -229,6 +240,9 @@ export default function(state, emitter) {
|
|||||||
if (!file.requiresPassword) {
|
if (!file.requiresPassword) {
|
||||||
return emitter.emit('pushState', '/404');
|
return emitter.emit('pushState', '/404');
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
console.error(e);
|
||||||
|
return emitter.emit('pushState', '/error');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,6 +269,7 @@ export default function(state, emitter) {
|
|||||||
duration,
|
duration,
|
||||||
password_protected: file.requiresPassword
|
password_protected: file.requiresPassword
|
||||||
});
|
});
|
||||||
|
faviconProgressbar.updateFavicon(0);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.message === '0') {
|
if (err.message === '0') {
|
||||||
// download cancelled
|
// download cancelled
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import Nanobus from 'nanobus';
|
import Nanobus from 'nanobus';
|
||||||
import Keychain from './keychain';
|
import Keychain from './keychain';
|
||||||
import { delay, bytes, streamToArrayBuffer } from './utils';
|
import { delay, bytes, streamToArrayBuffer } from './utils';
|
||||||
import { downloadFile, metadata, getApiUrl } from './api';
|
import { downloadFile, metadata, getApiUrl, reportLink } from './api';
|
||||||
import { blobStream } from './streams';
|
import { blobStream } from './streams';
|
||||||
import Zip from './zip';
|
import Zip from './zip';
|
||||||
|
|
||||||
@@ -53,6 +53,10 @@ export default class FileReceiver extends Nanobus {
|
|||||||
this.state = 'ready';
|
this.state = 'ready';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async reportLink(reason) {
|
||||||
|
await reportLink(this.fileInfo.id, this.keychain, reason);
|
||||||
|
}
|
||||||
|
|
||||||
sendMessageToSw(msg) {
|
sendMessageToSw(msg) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const channel = new MessageChannel();
|
const channel = new MessageChannel();
|
||||||
|
|||||||
107
app/main.css
@@ -39,7 +39,7 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
@apply bg-blue-dark;
|
@apply bg-blue-60;
|
||||||
@apply text-white;
|
@apply text-white;
|
||||||
@apply cursor-pointer;
|
@apply cursor-pointer;
|
||||||
@apply py-4;
|
@apply py-4;
|
||||||
@@ -48,11 +48,11 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.btn:hover {
|
.btn:hover {
|
||||||
@apply bg-blue-darker;
|
@apply bg-blue-70;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn:focus {
|
.btn:focus {
|
||||||
@apply bg-blue-darker;
|
@apply bg-blue-70;
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkbox {
|
.checkbox {
|
||||||
@@ -70,7 +70,7 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.checkbox > label::before {
|
.checkbox > label::before {
|
||||||
/* @apply bg-grey-lightest; */
|
/* @apply bg-grey-10; */
|
||||||
@apply border;
|
@apply border;
|
||||||
@apply rounded-sm;
|
@apply rounded-sm;
|
||||||
|
|
||||||
@@ -82,16 +82,16 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.checkbox > label:hover::before {
|
.checkbox > label:hover::before {
|
||||||
@apply border-blue-dark;
|
@apply border-blue-50;
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkbox > input:focus + label::before {
|
.checkbox > input:focus + label::before {
|
||||||
@apply border-blue-dark;
|
@apply border-blue-50;
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkbox > input:checked + label::before {
|
.checkbox > input:checked + label::before {
|
||||||
@apply bg-blue-dark;
|
@apply bg-blue-50;
|
||||||
@apply border-blue-dark;
|
@apply border-blue-50;
|
||||||
|
|
||||||
background-image: url('../assets/lock.svg');
|
background-image: url('../assets/lock.svg');
|
||||||
background-position: center;
|
background-position: center;
|
||||||
@@ -104,8 +104,8 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.checkbox > input:disabled + label::before {
|
.checkbox > input:disabled + label::before {
|
||||||
@apply bg-blue-dark;
|
@apply bg-blue-50;
|
||||||
@apply border-blue-dark;
|
@apply border-blue-50;
|
||||||
|
|
||||||
background-image: url('../assets/lock.svg');
|
background-image: url('../assets/lock.svg');
|
||||||
background-position: center;
|
background-position: center;
|
||||||
@@ -153,9 +153,21 @@ footer li:hover {
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.link-blue {
|
||||||
|
@apply text-blue-60;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-blue:hover {
|
||||||
|
@apply text-blue-70;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-blue:focus {
|
||||||
|
@apply text-blue-70;
|
||||||
|
}
|
||||||
|
|
||||||
.main-header img {
|
.main-header img {
|
||||||
height: 32px;
|
height: 32px;
|
||||||
width: 170px;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.intro {
|
.intro {
|
||||||
@@ -175,32 +187,19 @@ footer li:hover {
|
|||||||
@apply bg-white;
|
@apply bg-white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mozilla-logo {
|
|
||||||
background-image: url('../assets/mozilla-logo.svg');
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: 100px, 48px;
|
|
||||||
overflow: hidden;
|
|
||||||
text-indent: 120%;
|
|
||||||
white-space: nowrap;
|
|
||||||
display: inline-block;
|
|
||||||
height: 32px;
|
|
||||||
width: 100px;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#password-msg::after {
|
#password-msg::after {
|
||||||
content: '\200b';
|
content: '\200b';
|
||||||
}
|
}
|
||||||
|
|
||||||
progress {
|
progress {
|
||||||
@apply bg-grey-light;
|
@apply bg-grey-30;
|
||||||
@apply rounded-sm;
|
@apply rounded-sm;
|
||||||
@apply w-full;
|
@apply w-full;
|
||||||
@apply h-1;
|
@apply h-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
progress::-webkit-progress-bar {
|
progress::-webkit-progress-bar {
|
||||||
@apply bg-grey-light;
|
@apply bg-grey-30;
|
||||||
@apply rounded-sm;
|
@apply rounded-sm;
|
||||||
@apply w-full;
|
@apply w-full;
|
||||||
@apply h-1;
|
@apply h-1;
|
||||||
@@ -284,12 +283,56 @@ select {
|
|||||||
@apply m-auto;
|
@apply m-auto;
|
||||||
@apply py-8;
|
@apply py-8;
|
||||||
|
|
||||||
min-height: 36rem;
|
min-height: 42rem;
|
||||||
max-height: 42rem;
|
max-height: 42rem;
|
||||||
width: calc(100% - 3rem);
|
width: calc(100% - 3rem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@screen dark {
|
||||||
|
body {
|
||||||
|
@apply text-grey-10;
|
||||||
|
|
||||||
|
background-image: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
@apply bg-blue-40;
|
||||||
|
@apply text-white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn:hover {
|
||||||
|
@apply bg-blue-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn:focus {
|
||||||
|
@apply bg-blue-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-blue {
|
||||||
|
@apply text-blue-40;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-blue:hover {
|
||||||
|
@apply text-blue-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-blue:focus {
|
||||||
|
@apply text-blue-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main > section {
|
||||||
|
@apply bg-grey-90;
|
||||||
|
}
|
||||||
|
|
||||||
|
@screen md {
|
||||||
|
.main > section {
|
||||||
|
@apply border;
|
||||||
|
@apply border-grey-80;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
@responsive {
|
@responsive {
|
||||||
@@ -325,8 +368,6 @@ select {
|
|||||||
|
|
||||||
.signin:hover,
|
.signin:hover,
|
||||||
.signin:focus {
|
.signin:focus {
|
||||||
@apply shadow-btn;
|
|
||||||
|
|
||||||
transform: scale(1.0625);
|
transform: scale(1.0625);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,19 +378,19 @@ select {
|
|||||||
/* begin signin button color experiment */
|
/* begin signin button color experiment */
|
||||||
|
|
||||||
.white-blue {
|
.white-blue {
|
||||||
@apply border-blue-dark;
|
@apply border-blue-60;
|
||||||
@apply border-2;
|
@apply border-2;
|
||||||
@apply text-blue-dark;
|
@apply text-blue-60;
|
||||||
}
|
}
|
||||||
|
|
||||||
.white-blue:hover,
|
.white-blue:hover,
|
||||||
.white-blue:focus {
|
.white-blue:focus {
|
||||||
@apply bg-blue-dark;
|
@apply bg-blue-60;
|
||||||
@apply text-white;
|
@apply text-white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.blue {
|
.blue {
|
||||||
@apply bg-blue-dark;
|
@apply bg-blue-60;
|
||||||
@apply text-white;
|
@apply text-white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,8 @@ if (process.env.NODE_ENV === 'production') {
|
|||||||
sentry: Sentry,
|
sentry: Sentry,
|
||||||
user: new User(storage, LIMITS, window.AUTH_CONFIG),
|
user: new User(storage, LIMITS, window.AUTH_CONFIG),
|
||||||
transfer: null,
|
transfer: null,
|
||||||
fileInfo: null
|
fileInfo: null,
|
||||||
|
locale: locale()
|
||||||
};
|
};
|
||||||
|
|
||||||
const app = routes(choo({ hash: true }));
|
const app = routes(choo({ hash: true }));
|
||||||
|
|||||||
1076
app/qrcode.js
Normal file
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
`app/` contains the browser code that gets bundled into `app.[hash].js`. It's got all the logic, crypto, and UI. All of it gets used in the browser, and some of it by the server for server side rendering.
|
`app/` contains the browser code that gets bundled into `app.[hash].js`. It's got all the logic, crypto, and UI. All of it gets used in the browser, and some of it by the server for server side rendering.
|
||||||
|
|
||||||
The main entrypoint for the browser is [main.js](./main.js) and on the server [routes/index.js](./routes/index.js) gets imported by [/server/routes/pages.js](../server/routes/pages.js)
|
The main entrypoint for the browser is [main.js](./main.js) and on the server [routes.js](./routes.js) is imported by [/server/routes/pages.js](../server/routes/pages.js)
|
||||||
|
|
||||||
- `pages` contains display logic an markup for pages
|
- `pages` contains display logic an markup for pages
|
||||||
- `routes` contains route definitions and logic
|
- `routes` contains route definitions and logic
|
||||||
|
|||||||
@@ -13,7 +13,10 @@ module.exports = function(app = choo({ hash: true })) {
|
|||||||
app.route('/oauth', function(state, emit) {
|
app.route('/oauth', function(state, emit) {
|
||||||
emit('authenticate', state.query.code, state.query.state);
|
emit('authenticate', state.query.code, state.query.state);
|
||||||
});
|
});
|
||||||
app.route('/login', body(require('./ui/home')));
|
app.route('/login', function(state, emit) {
|
||||||
|
emit('replaceState', '/');
|
||||||
|
setTimeout(() => emit('render'));
|
||||||
|
});
|
||||||
app.route('*', body(require('./ui/notFound')));
|
app.route('*', body(require('./ui/notFound')));
|
||||||
return app;
|
return app;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import contentDisposition from 'content-disposition';
|
|||||||
let noSave = false;
|
let noSave = false;
|
||||||
const map = new Map();
|
const map = new Map();
|
||||||
const IMAGES = /.*\.(png|svg|jpg)$/;
|
const IMAGES = /.*\.(png|svg|jpg)$/;
|
||||||
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/;
|
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)(#\w+)?$/;
|
||||||
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
||||||
const FONT = /\.woff2?$/;
|
const FONT = /\.woff2?$/;
|
||||||
|
|
||||||
|
|||||||
@@ -54,18 +54,22 @@ class Account extends Component {
|
|||||||
createElement() {
|
createElement() {
|
||||||
if (!this.enabled) {
|
if (!this.enabled) {
|
||||||
return html`
|
return html`
|
||||||
<div></div>
|
<send-account></send-account>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
const user = this.state.user;
|
const user = this.state.user;
|
||||||
const translate = this.state.translate;
|
const translate = this.state.translate;
|
||||||
this.setLocal();
|
this.setLocal();
|
||||||
|
if (user.loginRequired && !this.local.loggedIn) {
|
||||||
|
return html`
|
||||||
|
<send-account></send-account>
|
||||||
|
`;
|
||||||
|
}
|
||||||
if (!this.local.loggedIn) {
|
if (!this.local.loggedIn) {
|
||||||
return html`
|
return html`
|
||||||
<send-account>
|
<send-account>
|
||||||
<button
|
<button
|
||||||
class="px-4 py-2 md:px-8 md:py-4 focus:outline signin ${this
|
class="px-4 py-2 md:px-8 md:py-4 focus:outline signin border-2 link-blue border-blue-60 hover:border-blue-70 dark:border-blue-40 dark:hover:border-blue-50"
|
||||||
.buttonClass}"
|
|
||||||
onclick="${e => this.login(e)}"
|
onclick="${e => this.login(e)}"
|
||||||
title="${translate('signInOnlyButton')}"
|
title="${translate('signInOnlyButton')}"
|
||||||
>
|
>
|
||||||
@@ -79,19 +83,19 @@ class Account extends Component {
|
|||||||
<input
|
<input
|
||||||
type="image"
|
type="image"
|
||||||
alt="${user.email}"
|
alt="${user.email}"
|
||||||
class="w-8 h-8 rounded-full border text-blue md:text-white focus:outline"
|
class="w-8 h-8 rounded-full border text-blue-50 md:text-white focus:outline"
|
||||||
src="${user.avatar}"
|
src="${user.avatar}"
|
||||||
onclick="${e => this.avatarClick(e)}"
|
onclick="${e => this.avatarClick(e)}"
|
||||||
/>
|
/>
|
||||||
<ul
|
<ul
|
||||||
id="accountMenu"
|
id="accountMenu"
|
||||||
class="invisible absolute top-0 right-0 mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50"
|
class="invisible absolute top-0 right-0 mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50 dark:bg-grey-80"
|
||||||
onblur="${e => this.hideMenu(e)}"
|
onblur="${e => this.hideMenu(e)}"
|
||||||
>
|
>
|
||||||
<li class="p-2 text-grey-dark">${user.email}</li>
|
<li class="p-2 text-grey-60 dark:text-grey-50">${user.email}</li>
|
||||||
<li>
|
<li>
|
||||||
<button
|
<button
|
||||||
class="block w-full text-left px-4 py-2 text-grey-darkest hover:bg-blue hover:text-white cursor-pointer focus:outline"
|
class="block w-full text-left px-4 py-2 text-grey-80 dark:text-grey-30 hover:bg-blue-50 hover:text-white cursor-pointer focus:outline"
|
||||||
onclick="${e => this.logout(e)}"
|
onclick="${e => this.logout(e)}"
|
||||||
title="${translate('signOut')}"
|
title="${translate('signOut')}"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -30,6 +30,12 @@ function password(state) {
|
|||||||
|
|
||||||
return html`
|
return html`
|
||||||
<div class="mb-2 px-1">
|
<div class="mb-2 px-1">
|
||||||
|
<input
|
||||||
|
id="autocomplete-decoy"
|
||||||
|
class="hidden"
|
||||||
|
type="password"
|
||||||
|
value="lol"
|
||||||
|
/>
|
||||||
<div class="checkbox inline-block mr-3">
|
<div class="checkbox inline-block mr-3">
|
||||||
<input
|
<input
|
||||||
id="add-password"
|
id="add-password"
|
||||||
@@ -42,36 +48,74 @@ function password(state) {
|
|||||||
${state.translate('addPassword')}
|
${state.translate('addPassword')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<input
|
<div class="relative inline-block my-1">
|
||||||
id="password-input"
|
<input
|
||||||
class="${state.archive.password
|
id="password-input"
|
||||||
? ''
|
class="${state.archive.password
|
||||||
: 'invisible'} border rounded focus:border-blue-dark leading-normal my-1 py-1 px-2 h-8"
|
? ''
|
||||||
autocomplete="off"
|
: 'invisible'} border rounded focus:border-blue-60 leading-normal my-1 py-1 px-2 h-8 dark:bg-grey-80"
|
||||||
maxlength="${MAX_LENGTH}"
|
autocomplete="off"
|
||||||
type="password"
|
maxlength="${MAX_LENGTH}"
|
||||||
oninput="${inputChanged}"
|
type="password"
|
||||||
onfocus="${focused}"
|
oninput="${inputChanged}"
|
||||||
placeholder="${state.translate('unlockInputPlaceholder')}"
|
onfocus="${focused}"
|
||||||
value="${state.archive.password || ''}"
|
placeholder="${state.translate('unlockInputPlaceholder')}"
|
||||||
/>
|
value="${state.archive.password || ''}"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
id="password-preview-button"
|
||||||
|
type="button"
|
||||||
|
class="${state.archive.password
|
||||||
|
? ''
|
||||||
|
: 'invisible'} absolute top-0 right-0 w-8 h-8"
|
||||||
|
onclick="${onPasswordPreviewButtonclicked}"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="${assets.get('eye.svg')}"
|
||||||
|
width="22"
|
||||||
|
height="22"
|
||||||
|
class="m-auto mt-2"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<label
|
<label
|
||||||
id="password-msg"
|
id="password-msg"
|
||||||
for="password-input"
|
for="password-input"
|
||||||
class="block text-xs text-grey-darker"
|
class="block text-xs text-grey-70"
|
||||||
></label>
|
></label>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
function onPasswordPreviewButtonclicked(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
const input = document.getElementById('password-input');
|
||||||
|
const eyeIcon = event.currentTarget.querySelector('img');
|
||||||
|
|
||||||
|
if (input.type === 'password') {
|
||||||
|
input.type = 'text';
|
||||||
|
eyeIcon.src = assets.get('eye-off.svg');
|
||||||
|
} else {
|
||||||
|
input.type = 'password';
|
||||||
|
eyeIcon.src = assets.get('eye.svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
input.focus();
|
||||||
|
}
|
||||||
|
|
||||||
function togglePasswordInput(event) {
|
function togglePasswordInput(event) {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
const checked = event.target.checked;
|
const checked = event.target.checked;
|
||||||
const input = document.getElementById('password-input');
|
const input = document.getElementById('password-input');
|
||||||
|
const passwordPreviewButton = document.getElementById(
|
||||||
|
'password-preview-button'
|
||||||
|
);
|
||||||
if (checked) {
|
if (checked) {
|
||||||
input.classList.remove('invisible');
|
input.classList.remove('invisible');
|
||||||
|
passwordPreviewButton.classList.remove('invisible');
|
||||||
input.focus();
|
input.focus();
|
||||||
} else {
|
} else {
|
||||||
input.classList.add('invisible');
|
input.classList.add('invisible');
|
||||||
|
passwordPreviewButton.classList.add('invisible');
|
||||||
input.value = '';
|
input.value = '';
|
||||||
document.getElementById('password-msg').textContent = '';
|
document.getElementById('password-msg').textContent = '';
|
||||||
state.archive.password = null;
|
state.archive.password = null;
|
||||||
@@ -106,7 +150,9 @@ function password(state) {
|
|||||||
function fileInfo(file, action) {
|
function fileInfo(file, action) {
|
||||||
return html`
|
return html`
|
||||||
<send-file class="flex flex-row items-center p-3 w-full">
|
<send-file class="flex flex-row items-center p-3 w-full">
|
||||||
<img class="h-8" src="${assets.get('blue_file.svg')}"/>
|
<svg class="h-8 w-8 text-white dark:text-grey-90">
|
||||||
|
<use xlink:href="${assets.get('blue_file.svg')}#icon"/>
|
||||||
|
</svg>
|
||||||
<p class="ml-4 w-full">
|
<p class="ml-4 w-full">
|
||||||
<h1 class="text-base font-medium word-break-all">${file.name}</h1>
|
<h1 class="text-base font-medium word-break-all">${file.name}</h1>
|
||||||
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
||||||
@@ -120,7 +166,9 @@ function fileInfo(file, action) {
|
|||||||
function archiveInfo(archive, action) {
|
function archiveInfo(archive, action) {
|
||||||
return html`
|
return html`
|
||||||
<p class="w-full flex items-center">
|
<p class="w-full flex items-center">
|
||||||
<img class="mr-3 flex-shrink-0" src="${assets.get('blue_file.svg')}"/>
|
<svg class="h-8 w-6 mr-3 flex-shrink-0 text-white dark:text-grey-90">
|
||||||
|
<use xlink:href="${assets.get('blue_file.svg')}#icon"/>
|
||||||
|
</svg>
|
||||||
<p class="flex-grow">
|
<p class="flex-grow">
|
||||||
<h1 class="text-base font-medium word-break-all">${archive.name}</h1>
|
<h1 class="text-base font-medium word-break-all">${archive.name}</h1>
|
||||||
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
||||||
@@ -140,7 +188,7 @@ function archiveDetails(translate, archive) {
|
|||||||
ontoggle="${toggled}"
|
ontoggle="${toggled}"
|
||||||
>
|
>
|
||||||
<summary
|
<summary
|
||||||
class="flex items-center text-blue-dark text-sm cursor-pointer outline-none"
|
class="flex items-center link-blue text-sm cursor-pointer outline-none"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="fill-current w-4 h-4 mr-1"
|
class="fill-current w-4 h-4 mr-1"
|
||||||
@@ -170,20 +218,25 @@ module.exports = function(state, emit, archive) {
|
|||||||
state.capabilities.share || platform() === 'android'
|
state.capabilities.share || platform() === 'android'
|
||||||
? html`
|
? html`
|
||||||
<button
|
<button
|
||||||
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker self-end flex items-end"
|
class="link-blue self-end flex items-start"
|
||||||
onclick=${share}
|
onclick=${share}
|
||||||
title="Share link"
|
title="Share link"
|
||||||
>
|
>
|
||||||
<img src="${assets.get('share-24.svg')}" class="mr-2" />Share link
|
<svg class="h-4 w-4 mr-2">
|
||||||
|
<use xlink:href="${assets.get('share-24.svg')}#icon" />
|
||||||
|
</svg>
|
||||||
|
Share link
|
||||||
</button>
|
</button>
|
||||||
`
|
`
|
||||||
: html`
|
: html`
|
||||||
<button
|
<button
|
||||||
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker focus:outline self-end flex items-center"
|
class="link-blue focus:outline self-end flex items-center"
|
||||||
onclick=${copy}
|
onclick=${copy}
|
||||||
title="${state.translate('copyLinkButton')}"
|
title="${state.translate('copyLinkButton')}"
|
||||||
>
|
>
|
||||||
<img src="${assets.get('copy-16.svg')}" class="mr-2" />
|
<svg class="h-4 w-4 mr-2">
|
||||||
|
<use xlink:href="${assets.get('copy-16.svg')}#icon" />
|
||||||
|
</svg>
|
||||||
${state.translate('copyLinkButton')}
|
${state.translate('copyLinkButton')}
|
||||||
</button>
|
</button>
|
||||||
`;
|
`;
|
||||||
@@ -191,12 +244,14 @@ module.exports = function(state, emit, archive) {
|
|||||||
platform() === 'web'
|
platform() === 'web'
|
||||||
? html`
|
? html`
|
||||||
<a
|
<a
|
||||||
class="flex items-baseline text-blue-dark hover:text-blue-darker focus:text-blue-darker"
|
class="flex items-baseline link-blue"
|
||||||
href="${archive.url}"
|
href="${archive.url}"
|
||||||
title="${state.translate('downloadButtonLabel')}"
|
title="${state.translate('downloadButtonLabel')}"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
>
|
>
|
||||||
<img src="${assets.get('dl.svg')}" class="mr-2" />
|
<svg class="h-4 w-3 mr-2">
|
||||||
|
<use xlink:href="${assets.get('dl.svg')}#icon" />
|
||||||
|
</svg>
|
||||||
${state.translate('downloadButtonLabel')}
|
${state.translate('downloadButtonLabel')}
|
||||||
</a>
|
</a>
|
||||||
`
|
`
|
||||||
@@ -206,7 +261,7 @@ module.exports = function(state, emit, archive) {
|
|||||||
return html`
|
return html`
|
||||||
<send-archive
|
<send-archive
|
||||||
id="archive-${archive.id}"
|
id="archive-${archive.id}"
|
||||||
class="flex flex-col items-start rounded shadow-light bg-white p-4 w-full"
|
class="flex flex-col items-start rounded shadow-light bg-white p-4 w-full dark:bg-grey-90 dark:border dark:border-grey-70"
|
||||||
>
|
>
|
||||||
${archiveInfo(
|
${archiveInfo(
|
||||||
archive,
|
archive,
|
||||||
@@ -225,7 +280,7 @@ module.exports = function(state, emit, archive) {
|
|||||||
${expiryInfo(state.translate, archive)}
|
${expiryInfo(state.translate, archive)}
|
||||||
</div>
|
</div>
|
||||||
${archiveDetails(state.translate, archive)}
|
${archiveDetails(state.translate, archive)}
|
||||||
<hr class="w-full border-t my-4" />
|
<hr class="w-full border-t my-4 dark:border-grey-70" />
|
||||||
<div class="flex justify-between w-full">
|
<div class="flex justify-between w-full">
|
||||||
${dl} ${copyOrShare}
|
${dl} ${copyOrShare}
|
||||||
</div>
|
</div>
|
||||||
@@ -256,7 +311,7 @@ module.exports = function(state, emit, archive) {
|
|||||||
try {
|
try {
|
||||||
await navigator.share({
|
await navigator.share({
|
||||||
title: state.translate('-send-brand'),
|
title: state.translate('-send-brand'),
|
||||||
text: `Download "${archive.name}" with Firefox Send: simple, safe file sharing`,
|
text: `Download "${archive.name}" with Send: simple, safe file sharing`,
|
||||||
//state.translate('shareMessage', { name }),
|
//state.translate('shareMessage', { name }),
|
||||||
url: archive.url
|
url: archive.url
|
||||||
});
|
});
|
||||||
@@ -269,18 +324,21 @@ module.exports = function(state, emit, archive) {
|
|||||||
|
|
||||||
module.exports.wip = function(state, emit) {
|
module.exports.wip = function(state, emit) {
|
||||||
return html`
|
return html`
|
||||||
<send-upload-area class="flex flex-col bg-white h-full w-full" id="wip">
|
<send-upload-area
|
||||||
|
class="flex flex-col bg-white h-full w-full dark:bg-grey-90"
|
||||||
|
id="wip"
|
||||||
|
>
|
||||||
${list(
|
${list(
|
||||||
Array.from(state.archive.files)
|
Array.from(state.archive.files)
|
||||||
.reverse()
|
.reverse()
|
||||||
.map(f =>
|
.map(f =>
|
||||||
fileInfo(f, remove(f, state.translate('deleteButtonHover')))
|
fileInfo(f, remove(f, state.translate('deleteButtonHover')))
|
||||||
),
|
),
|
||||||
'flex-shrink bg-grey-lightest rounded-t overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen',
|
'flex-shrink bg-grey-10 rounded-t overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen dark:bg-black',
|
||||||
'bg-white px-2 my-2 shadow-light rounded'
|
'bg-white px-2 my-2 shadow-light rounded dark:bg-grey-90 dark:border dark:border-grey-80'
|
||||||
)}
|
)}
|
||||||
<div
|
<div
|
||||||
class="flex-shrink-0 flex-grow flex items-end p-4 bg-grey-lightest rounded-b mb-1 font-medium"
|
class="flex-shrink-0 flex-grow flex items-end p-4 bg-grey-10 rounded-b mb-1 font-medium dark:bg-grey-90"
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
id="file-upload"
|
id="file-upload"
|
||||||
@@ -300,10 +358,12 @@ module.exports.wip = function(state, emit) {
|
|||||||
class="flex items-center cursor-pointer"
|
class="flex items-center cursor-pointer"
|
||||||
title="${state.translate('addFilesButton')}"
|
title="${state.translate('addFilesButton')}"
|
||||||
>
|
>
|
||||||
<img src="${assets.get('addfiles.svg')}" class="w-6 h-6 mr-2" />
|
<svg class="w-6 h-6 mr-2 link-blue">
|
||||||
|
<use xlink:href="${assets.get('addfiles.svg')}#plus" />
|
||||||
|
</svg>
|
||||||
${state.translate('addFilesButton')}
|
${state.translate('addFilesButton')}
|
||||||
</label>
|
</label>
|
||||||
<div class="font-normal text-sm text-grey-darker">
|
<div class="font-normal text-sm text-grey-70 dark:text-grey-40">
|
||||||
${state.translate('totalSize', {
|
${state.translate('totalSize', {
|
||||||
size: bytes(state.archive.size)
|
size: bytes(state.archive.size)
|
||||||
})}
|
})}
|
||||||
@@ -378,22 +438,22 @@ module.exports.uploading = function(state, emit) {
|
|||||||
return html`
|
return html`
|
||||||
<send-upload-area
|
<send-upload-area
|
||||||
id="${archive.id}"
|
id="${archive.id}"
|
||||||
class="flex flex-col items-start rounded shadow-light bg-white p-4 w-full"
|
class="flex flex-col items-start rounded shadow-light bg-white p-4 w-full dark:bg-grey-90"
|
||||||
>
|
>
|
||||||
${archiveInfo(archive)}
|
${archiveInfo(archive)}
|
||||||
<div class="text-xs text-grey-dark w-full mt-2 mb-2">
|
<div class="text-xs opacity-75 w-full mt-2 mb-2">
|
||||||
${expiryInfo(state.translate, {
|
${expiryInfo(state.translate, {
|
||||||
dlimit: state.archive.dlimit,
|
dlimit: state.archive.dlimit,
|
||||||
dtotal: 0,
|
dtotal: 0,
|
||||||
expiresAt: Date.now() + 500 + state.archive.timeLimit * 1000
|
expiresAt: Date.now() + 500 + state.archive.timeLimit * 1000
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-blue-dark text-sm font-medium mt-2">
|
<div class="link-blue text-sm font-medium mt-2">
|
||||||
${progressPercent}
|
${progressPercent}
|
||||||
</div>
|
</div>
|
||||||
<progress class="my-3" value="${progress}">${progressPercent}</progress>
|
<progress class="my-3" value="${progress}">${progressPercent}</progress>
|
||||||
<button
|
<button
|
||||||
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker self-end font-medium"
|
class="link-blue self-end font-medium"
|
||||||
onclick=${cancel}
|
onclick=${cancel}
|
||||||
title="${state.translate('deletePopupCancel')}"
|
title="${state.translate('deletePopupCancel')}"
|
||||||
>
|
>
|
||||||
@@ -415,7 +475,7 @@ module.exports.empty = function(state, emit) {
|
|||||||
? ''
|
? ''
|
||||||
: html`
|
: html`
|
||||||
<button
|
<button
|
||||||
class="center font-medium text-sm text-blue-dark hover:text-blue-darker focus:text-blue-darker mt-4 mb-2"
|
class="center font-medium text-sm link-blue mt-4 mb-2"
|
||||||
onclick="${event => {
|
onclick="${event => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
emit('signup-cta', 'drop');
|
emit('signup-cta', 'drop');
|
||||||
@@ -428,14 +488,16 @@ module.exports.empty = function(state, emit) {
|
|||||||
`;
|
`;
|
||||||
return html`
|
return html`
|
||||||
<send-upload-area
|
<send-upload-area
|
||||||
class="flex flex-col items-center justify-center border-2 border-dashed border-grey-transparent rounded px-6 py-16 h-full w-full"
|
class="flex flex-col items-center justify-center border-2 border-dashed border-grey-transparent rounded px-6 py-16 h-full w-full dark:border-grey-60"
|
||||||
onclick="${e => {
|
onclick="${e => {
|
||||||
if (e.target.tagName !== 'LABEL') {
|
if (e.target.tagName !== 'LABEL') {
|
||||||
document.getElementById('file-upload').click();
|
document.getElementById('file-upload').click();
|
||||||
}
|
}
|
||||||
}}"
|
}}"
|
||||||
>
|
>
|
||||||
<img src="${assets.get('addfiles.svg')}" width="48" height="48" />
|
<svg class="w-10 h-10 link-blue">
|
||||||
|
<use xlink:href="/${assets.get('addfiles.svg')}#plus" />
|
||||||
|
</svg>
|
||||||
<div class="pt-6 pb-2 text-center text-lg font-bold tracking-wide">
|
<div class="pt-6 pb-2 text-center text-lg font-bold tracking-wide">
|
||||||
${state.translate('dragAndDropFiles')}
|
${state.translate('dragAndDropFiles')}
|
||||||
</div>
|
</div>
|
||||||
@@ -469,14 +531,11 @@ module.exports.empty = function(state, emit) {
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
function focus(event) {
|
function focus(event) {
|
||||||
event.target.nextElementSibling.classList.add('bg-blue-darker', 'outline');
|
event.target.nextElementSibling.classList.add('bg-blue-70', 'outline');
|
||||||
}
|
}
|
||||||
|
|
||||||
function blur(event) {
|
function blur(event) {
|
||||||
event.target.nextElementSibling.classList.remove(
|
event.target.nextElementSibling.classList.remove('bg-blue-70', 'outline');
|
||||||
'bg-blue-darker',
|
|
||||||
'outline'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(event) {
|
function add(event) {
|
||||||
@@ -501,8 +560,10 @@ module.exports.preview = function(state, emit) {
|
|||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
return html`
|
return html`
|
||||||
<send-archive class="flex flex-col max-h-full bg-white p-4 w-full md:w-128">
|
<send-archive
|
||||||
<div class="border rounded py-3 px-6">
|
class="flex flex-col max-h-full bg-white p-4 w-full md:w-128 dark:bg-grey-90"
|
||||||
|
>
|
||||||
|
<div class="border rounded py-3 px-6 dark:border-grey-70">
|
||||||
${archiveInfo(archive)} ${details}
|
${archiveInfo(archive)} ${details}
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
@@ -529,10 +590,10 @@ module.exports.downloading = function(state) {
|
|||||||
const progressPercent = percent(progress);
|
const progressPercent = percent(progress);
|
||||||
return html`
|
return html`
|
||||||
<send-archive
|
<send-archive
|
||||||
class="flex flex-col bg-white rounded shadow-light p-4 w-full max-w-sm md:w-128"
|
class="flex flex-col bg-white rounded shadow-light p-4 w-full max-w-sm md:w-128 dark:bg-grey-90"
|
||||||
>
|
>
|
||||||
${archiveInfo(archive)}
|
${archiveInfo(archive)}
|
||||||
<div class="text-blue-dark text-sm font-medium mt-2">
|
<div class="link-blue text-sm font-medium mt-2">
|
||||||
${progressPercent}
|
${progressPercent}
|
||||||
</div>
|
</div>
|
||||||
<progress class="my-3" value="${progress}">${progressPercent}</progress>
|
<progress class="my-3" value="${progress}">${progressPercent}</progress>
|
||||||
|
|||||||
@@ -1,27 +1,15 @@
|
|||||||
const html = require('choo/html');
|
const html = require('choo/html');
|
||||||
const Promo = require('./promo');
|
|
||||||
const Header = require('./header');
|
const Header = require('./header');
|
||||||
const Footer = require('./footer');
|
const Footer = require('./footer');
|
||||||
|
|
||||||
function banner(state) {
|
|
||||||
if (state.layout) {
|
|
||||||
return; // server side
|
|
||||||
}
|
|
||||||
const show =
|
|
||||||
!state.capabilities.standalone && !state.route.startsWith('/unsupported/');
|
|
||||||
if (show) {
|
|
||||||
return state.cache(Promo, 'promo').render();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = function body(main) {
|
module.exports = function body(main) {
|
||||||
return function(state, emit) {
|
return function(state, emit) {
|
||||||
const b = html`
|
const b = html`
|
||||||
<body
|
<body
|
||||||
class="flex flex-col items-center font-sans md:h-screen md:bg-grey-lightest"
|
class="flex flex-col items-center font-sans md:h-screen md:bg-grey-10 dark:bg-black"
|
||||||
>
|
>
|
||||||
${banner(state, emit)} ${state.cache(Header, 'header').render()}
|
${state.cache(Header, 'header').render()} ${main(state, emit)}
|
||||||
${main(state, emit)} ${state.cache(Footer, 'footer').render()}
|
${state.cache(Footer, 'footer').render()}
|
||||||
</body>
|
</body>
|
||||||
`;
|
`;
|
||||||
if (state.layout) {
|
if (state.layout) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
const html = require('choo/html');
|
const html = require('choo/html');
|
||||||
const { copyToClipboard } = require('../utils');
|
const { copyToClipboard } = require('../utils');
|
||||||
|
const qr = require('./qr');
|
||||||
|
|
||||||
module.exports = function(name, url) {
|
module.exports = function(name, url) {
|
||||||
const dialog = function(state, emit, close) {
|
const dialog = function(state, emit, close) {
|
||||||
@@ -10,17 +11,29 @@ module.exports = function(name, url) {
|
|||||||
<h1 class="text-3xl font-bold my-4">
|
<h1 class="text-3xl font-bold my-4">
|
||||||
${state.translate('notifyUploadEncryptDone')}
|
${state.translate('notifyUploadEncryptDone')}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="font-normal leading-normal text-grey-darkest word-break-all">
|
<p
|
||||||
|
class="font-normal leading-normal text-grey-80 word-break-all dark:text-grey-40"
|
||||||
|
>
|
||||||
${state.translate('copyLinkDescription')} <br />
|
${state.translate('copyLinkDescription')} <br />
|
||||||
${name}
|
${name}
|
||||||
</p>
|
</p>
|
||||||
<input
|
<div class="flex flex-row items-center justify-center w-full">
|
||||||
type="text"
|
<input
|
||||||
id="share-url"
|
type="text"
|
||||||
class="w-full my-4 border rounded-lg leading-loose h-12 px-2 py-1"
|
id="share-url"
|
||||||
value="${url}"
|
class="block w-full my-4 border rounded-lg leading-loose h-12 px-2 py-1 dark:bg-grey-80"
|
||||||
readonly="true"
|
value="${url}"
|
||||||
/>
|
readonly="true"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
id="qr-btn"
|
||||||
|
class="w-16 m-1 p-1"
|
||||||
|
onclick="${toggleQR}"
|
||||||
|
title="QR code"
|
||||||
|
>
|
||||||
|
${qr(url)}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<button
|
<button
|
||||||
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
|
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
|
||||||
onclick="${copy}"
|
onclick="${copy}"
|
||||||
@@ -29,7 +42,7 @@ module.exports = function(name, url) {
|
|||||||
${state.translate('copyLinkButton')}
|
${state.translate('copyLinkButton')}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker my-4 font-medium cursor-pointer focus:outline"
|
class="link-blue my-4 font-medium cursor-pointer focus:outline"
|
||||||
onclick="${close}"
|
onclick="${close}"
|
||||||
title="${state.translate('okButton')}"
|
title="${state.translate('okButton')}"
|
||||||
>
|
>
|
||||||
@@ -38,6 +51,19 @@ module.exports = function(name, url) {
|
|||||||
</send-copy-dialog>
|
</send-copy-dialog>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
function toggleQR(event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
const shareUrl = document.getElementById('share-url');
|
||||||
|
const qrBtn = document.getElementById('qr-btn');
|
||||||
|
if (shareUrl.classList.contains('hidden')) {
|
||||||
|
shareUrl.classList.replace('hidden', 'block');
|
||||||
|
qrBtn.classList.replace('w-48', 'w-16');
|
||||||
|
} else {
|
||||||
|
shareUrl.classList.replace('block', 'hidden');
|
||||||
|
qrBtn.classList.replace('w-16', 'w-48');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function copy(event) {
|
function copy(event) {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
copyToClipboard(url);
|
copyToClipboard(url);
|
||||||
|
|||||||
@@ -41,7 +41,9 @@ function preview(state, emit) {
|
|||||||
<h1 class="text-3xl font-bold mb-4">
|
<h1 class="text-3xl font-bold mb-4">
|
||||||
${state.translate('downloadTitle')}
|
${state.translate('downloadTitle')}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="w-full text-grey-darkest text-center leading-normal">
|
<p
|
||||||
|
class="w-full text-grey-80 text-center leading-normal dark:text-grey-40"
|
||||||
|
>
|
||||||
${state.translate('downloadDescription')}
|
${state.translate('downloadDescription')}
|
||||||
</p>
|
</p>
|
||||||
${archiveTile.preview(state, emit)}
|
${archiveTile.preview(state, emit)}
|
||||||
@@ -53,9 +55,13 @@ module.exports = function(state, emit) {
|
|||||||
let content = '';
|
let content = '';
|
||||||
if (!state.fileInfo) {
|
if (!state.fileInfo) {
|
||||||
state.fileInfo = createFileInfo(state);
|
state.fileInfo = createFileInfo(state);
|
||||||
if (!state.fileInfo.nonce) {
|
if (downloadMetadata.status === 404) {
|
||||||
return notFound(state);
|
return notFound(state);
|
||||||
}
|
}
|
||||||
|
if (!state.fileInfo.nonce) {
|
||||||
|
// coming from something like the browser back button
|
||||||
|
return location.reload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!state.transfer && !state.fileInfo.requiresPassword) {
|
if (!state.transfer && !state.fileInfo.requiresPassword) {
|
||||||
|
|||||||
@@ -2,21 +2,27 @@ const html = require('choo/html');
|
|||||||
const assets = require('../../common/assets');
|
const assets = require('../../common/assets');
|
||||||
|
|
||||||
module.exports = function(state) {
|
module.exports = function(state) {
|
||||||
|
const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink';
|
||||||
return html`
|
return html`
|
||||||
<div
|
<div
|
||||||
id="download-complete"
|
id="download-complete"
|
||||||
class="flex flex-col items-center justify-center h-full w-full bg-white p-2"
|
class="flex flex-col items-center justify-center h-full w-full bg-white p-2 dark:bg-grey-90"
|
||||||
>
|
>
|
||||||
<h1 class="text-center text-3xl font-bold my-2">
|
<h1 class="text-center text-3xl font-bold my-2">
|
||||||
${state.translate('downloadFinish')}
|
${state.translate('downloadFinish')}
|
||||||
</h1>
|
</h1>
|
||||||
<img src="${assets.get('completed.svg')}" class="my-12 h-48" />
|
<img src="${assets.get('completed.svg')}" class="my-8 h-48" />
|
||||||
<p class="text-grey-darkest leading-normal">
|
<p
|
||||||
|
class="text-grey-80 leading-normal dark:text-grey-40 ${state.user
|
||||||
|
.loggedIn
|
||||||
|
? 'hidden'
|
||||||
|
: ''}"
|
||||||
|
>
|
||||||
${state.translate('trySendDescription')}
|
${state.translate('trySendDescription')}
|
||||||
</p>
|
</p>
|
||||||
<p class="my-5">
|
<p class="my-5">
|
||||||
<a href="/" class="btn rounded-lg flex items-center mt-4" role="button"
|
<a href="/" class="btn rounded-lg flex items-center mt-4" role="button"
|
||||||
>${state.translate('sendYourFilesLink')}</a
|
>${state.translate(btnText)}</a
|
||||||
>
|
>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,12 +6,14 @@ module.exports = function(state, emit) {
|
|||||||
|
|
||||||
const div = html`
|
const div = html`
|
||||||
<div
|
<div
|
||||||
class="h-full w-full flex flex-col items-center justify-center bg-white py-8 max-w-md mx-auto"
|
class="h-full w-full flex flex-col items-center justify-center bg-white py-8 max-w-md mx-auto dark:bg-grey-90"
|
||||||
>
|
>
|
||||||
<h1 class="text-3xl font-bold mb-4">
|
<h1 class="text-3xl font-bold mb-4">
|
||||||
${state.translate('downloadTitle')}
|
${state.translate('downloadTitle')}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="w-full mb-4 text-center text-grey-darkest leading-normal">
|
<p
|
||||||
|
class="w-full mb-4 text-center text-grey-80 dark:text-grey-40 leading-normal"
|
||||||
|
>
|
||||||
${state.translate('downloadDescription')}
|
${state.translate('downloadDescription')}
|
||||||
</p>
|
</p>
|
||||||
<form
|
<form
|
||||||
@@ -19,11 +21,17 @@ module.exports = function(state, emit) {
|
|||||||
onsubmit="${checkPassword}"
|
onsubmit="${checkPassword}"
|
||||||
data-no-csrf
|
data-no-csrf
|
||||||
>
|
>
|
||||||
|
<input
|
||||||
|
id="autocomplete-decoy"
|
||||||
|
class="hidden"
|
||||||
|
type="password"
|
||||||
|
value="lol"
|
||||||
|
/>
|
||||||
<input
|
<input
|
||||||
id="password-input"
|
id="password-input"
|
||||||
class="w-full border-l border-t border-b rounded-l-lg rounded-r-none ${invalid
|
class="w-full border-l border-t border-b rounded-l-lg rounded-r-none ${invalid
|
||||||
? 'border-red'
|
? 'border-red dark:border-red-40'
|
||||||
: 'border-grey'} leading-loose px-2 py-1"
|
: 'border-grey'} leading-loose px-2 py-1 dark:bg-grey-80"
|
||||||
maxlength="32"
|
maxlength="32"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="${state.translate('unlockInputPlaceholder')}"
|
placeholder="${state.translate('unlockInputPlaceholder')}"
|
||||||
@@ -34,7 +42,7 @@ module.exports = function(state, emit) {
|
|||||||
type="submit"
|
type="submit"
|
||||||
id="password-btn"
|
id="password-btn"
|
||||||
class="btn rounded-r-lg rounded-l-none ${invalid
|
class="btn rounded-r-lg rounded-l-none ${invalid
|
||||||
? 'bg-red hover:bg-red focus:bg-red'
|
? 'bg-red hover:bg-red focus:bg-red dark:bg-red-40'
|
||||||
: ''}"
|
: ''}"
|
||||||
value="${state.translate('unlockButtonLabel')}"
|
value="${state.translate('unlockButtonLabel')}"
|
||||||
title="${state.translate('unlockButtonLabel')}"
|
title="${state.translate('unlockButtonLabel')}"
|
||||||
@@ -42,7 +50,7 @@ module.exports = function(state, emit) {
|
|||||||
</form>
|
</form>
|
||||||
<label
|
<label
|
||||||
id="password-error"
|
id="password-error"
|
||||||
class="${invalid ? '' : 'invisible'} text-red my-4"
|
class="${invalid ? '' : 'invisible'} text-red dark:text-red-40 my-4"
|
||||||
for="password-input"
|
for="password-input"
|
||||||
>
|
>
|
||||||
${state.translate('passwordTryAgain')}
|
${state.translate('passwordTryAgain')}
|
||||||
@@ -61,8 +69,13 @@ module.exports = function(state, emit) {
|
|||||||
const input = document.getElementById('password-input');
|
const input = document.getElementById('password-input');
|
||||||
const btn = document.getElementById('password-btn');
|
const btn = document.getElementById('password-btn');
|
||||||
label.classList.add('invisible');
|
label.classList.add('invisible');
|
||||||
input.classList.remove('border-red');
|
input.classList.remove('border-red', 'dark:border-red-40');
|
||||||
btn.classList.remove('bg-red', 'hover:bg-red', 'focus:bg-red');
|
btn.classList.remove(
|
||||||
|
'bg-red',
|
||||||
|
'hover:bg-red',
|
||||||
|
'focus:bg-red',
|
||||||
|
'dark:bg-red-40'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkPassword(event) {
|
function checkPassword(event) {
|
||||||
@@ -72,7 +85,9 @@ module.exports = function(state, emit) {
|
|||||||
const password = el.value;
|
const password = el.value;
|
||||||
if (password.length > 0) {
|
if (password.length > 0) {
|
||||||
document.getElementById('password-btn').disabled = true;
|
document.getElementById('password-btn').disabled = true;
|
||||||
state.fileInfo.url = window.location.href;
|
// Strip any url parameters between fileId and secretKey
|
||||||
|
const fileInfoUrl = window.location.href.replace(/\?.+#/, '#');
|
||||||
|
state.fileInfo.url = fileInfoUrl;
|
||||||
state.fileInfo.password = password;
|
state.fileInfo.password = password;
|
||||||
emit('getMetadata');
|
emit('getMetadata');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ const assets = require('../../common/assets');
|
|||||||
const modal = require('./modal');
|
const modal = require('./modal');
|
||||||
|
|
||||||
module.exports = function(state, emit) {
|
module.exports = function(state, emit) {
|
||||||
|
const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink';
|
||||||
return html`
|
return html`
|
||||||
<main class="main">
|
<main class="main">
|
||||||
${state.modal && modal(state, emit)}
|
${state.modal && modal(state, emit)}
|
||||||
@@ -13,12 +14,17 @@ module.exports = function(state, emit) {
|
|||||||
${state.translate('errorPageHeader')}
|
${state.translate('errorPageHeader')}
|
||||||
</h1>
|
</h1>
|
||||||
<img class="my-12 h-48" src="${assets.get('error.svg')}" />
|
<img class="my-12 h-48" src="${assets.get('error.svg')}" />
|
||||||
<p class="max-w-md text-center text-grey-darkest leading-normal">
|
<p
|
||||||
|
class="max-w-md text-center text-grey-80 leading-normal dark:text-grey-40 ${state
|
||||||
|
.user.loggedIn
|
||||||
|
? 'hidden'
|
||||||
|
: ''}"
|
||||||
|
>
|
||||||
${state.translate('trySendDescription')}
|
${state.translate('trySendDescription')}
|
||||||
</p>
|
</p>
|
||||||
<p class="my-5">
|
<p class="my-5">
|
||||||
<a href="/" class="btn rounded-lg flex items-center" role="button"
|
<a href="/" class="btn rounded-lg flex items-center" role="button"
|
||||||
>${state.translate('sendYourFilesLink')}</a
|
>${state.translate(btnText)}</a
|
||||||
>
|
>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
41
app/ui/faviconProgressbar.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
const { platform } = require('../utils');
|
||||||
|
const assets = require('../../common/assets');
|
||||||
|
|
||||||
|
const size = 32;
|
||||||
|
const loaderWidth = 5;
|
||||||
|
const loaderColor = '#0090ed';
|
||||||
|
|
||||||
|
function drawCircle(canvas, context, color, lineWidth, outerWidth, percent) {
|
||||||
|
canvas.width = canvas.height = outerWidth;
|
||||||
|
context.translate(outerWidth * 0.5, outerWidth * 0.5);
|
||||||
|
context.rotate(-Math.PI * 0.5);
|
||||||
|
const radius = (outerWidth - lineWidth) * 0.5;
|
||||||
|
context.beginPath();
|
||||||
|
context.arc(0, 0, radius, 0, Math.PI * 2 * percent, false);
|
||||||
|
context.strokeStyle = color;
|
||||||
|
context.lineCap = 'square';
|
||||||
|
context.lineWidth = lineWidth;
|
||||||
|
context.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawNewFavicon(progressRatio) {
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
const context = canvas.getContext('2d');
|
||||||
|
drawCircle(canvas, context, '#efefef', loaderWidth, size, 1);
|
||||||
|
drawCircle(canvas, context, loaderColor, loaderWidth, size, progressRatio);
|
||||||
|
return canvas.toDataURL();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.updateFavicon = function(progressRatio) {
|
||||||
|
if (platform() === 'web') {
|
||||||
|
const link = document.querySelector("link[rel='icon'][sizes='32x32']");
|
||||||
|
const progress = progressRatio * 100;
|
||||||
|
if (progress === 0 || progress === 100) {
|
||||||
|
link.type = 'image/png';
|
||||||
|
link.href = assets.get('favicon-32x32.png');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
link.href = drawNewFavicon(progressRatio);
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
const html = require('choo/html');
|
const html = require('choo/html');
|
||||||
const Component = require('choo/component');
|
const Component = require('choo/component');
|
||||||
const version = require('../../package.json').version;
|
|
||||||
const { browserName } = require('../utils');
|
|
||||||
|
|
||||||
class Footer extends Component {
|
class Footer extends Component {
|
||||||
constructor(name, state) {
|
constructor(name, state) {
|
||||||
@@ -15,47 +13,19 @@ class Footer extends Component {
|
|||||||
|
|
||||||
createElement() {
|
createElement() {
|
||||||
const translate = this.state.translate;
|
const translate = this.state.translate;
|
||||||
const browser = browserName();
|
|
||||||
const feedbackUrl = `https://qsurvey.mozilla.com/s3/Firefox-Send-Product-Feedback?ver=${version}&browser=${browser}`;
|
|
||||||
return html`
|
return html`
|
||||||
<footer
|
<footer
|
||||||
class="flex flex-col md:flex-row items-start w-full flex-none self-start p-6 md:p-8 font-medium text-xs text-grey-dark md:items-center justify-between"
|
class="flex flex-col md:flex-row items-start w-full flex-none self-start p-6 md:p-8 font-medium text-xs text-grey-60 dark:text-grey-40 md:items-center justify-between"
|
||||||
>
|
>
|
||||||
<a
|
<div></div>
|
||||||
class="mozilla-logo pb-10 md:pb-0 m-2"
|
|
||||||
href="https://www.mozilla.org/"
|
|
||||||
>
|
|
||||||
Mozilla
|
|
||||||
</a>
|
|
||||||
<ul
|
<ul
|
||||||
class="flex flex-col md:flex-row items-start md:items-center md:justify-end"
|
class="flex flex-col md:flex-row items-start md:items-center md:justify-end"
|
||||||
>
|
>
|
||||||
<li class="m-2">
|
|
||||||
<a href="https://www.mozilla.org/about/legal/terms/services/#send">
|
|
||||||
${translate('footerLinkLegal')}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="m-2">
|
<li class="m-2">
|
||||||
<a href="/legal"> ${translate('footerLinkPrivacy')} </a>
|
<a href="/legal"> ${translate('footerLinkPrivacy')} </a>
|
||||||
</li>
|
</li>
|
||||||
<li class="m-2">
|
<li class="m-2">
|
||||||
<a href="https://www.mozilla.org/privacy/websites/#cookies">
|
<a href="https://gitlab.com/timvisee/send">Source</a>
|
||||||
${translate('footerLinkCookies')}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="m-2">
|
|
||||||
<a href="https://github.com/mozilla/send">GitHub </a>
|
|
||||||
</li>
|
|
||||||
<li class="m-2">
|
|
||||||
<a
|
|
||||||
href="${feedbackUrl}"
|
|
||||||
rel="noreferrer noopener"
|
|
||||||
class="feedback-link"
|
|
||||||
alt="Feedback"
|
|
||||||
target="_blank"
|
|
||||||
>
|
|
||||||
${translate('siteFeedback')}
|
|
||||||
</a>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -16,15 +16,27 @@ class Header extends Component {
|
|||||||
this.account.render();
|
this.account.render();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
createElement() {
|
createElement() {
|
||||||
const title =
|
const title =
|
||||||
platform() === 'android'
|
platform() === 'android'
|
||||||
? html`
|
? html`
|
||||||
<a class=""><img src="${assets.get('logo.svg')}"/></a>
|
<a class="flex flex-row items-center">
|
||||||
|
<img src="${assets.get('icon.svg')}" />
|
||||||
|
<svg class="w-48">
|
||||||
|
<use xlink:href="${assets.get('wordmark.svg')}#logo" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
`
|
`
|
||||||
: html`
|
: html`
|
||||||
<a class="" href="/"><img src="${assets.get('logo.svg')}"/></a>
|
<a class="flex flex-row items-center" href="/">
|
||||||
|
<img
|
||||||
|
alt="${this.state.translate('title')}"
|
||||||
|
src="${assets.get('icon.svg')}"
|
||||||
|
/>
|
||||||
|
<svg viewBox="66 0 340 64" class="w-48 md:w-64">
|
||||||
|
<use xlink:href="${assets.get('wordmark.svg')}#logo" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
`;
|
`;
|
||||||
return html`
|
return html`
|
||||||
<header
|
<header
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const assets = require('../../common/assets');
|
|||||||
module.exports = function intro(state) {
|
module.exports = function intro(state) {
|
||||||
return html`
|
return html`
|
||||||
<send-intro
|
<send-intro
|
||||||
class="flex flex-col items-center justify-center bg-white px-6 md:py-0 py-6 mb-0 h-full w-full"
|
class="flex flex-col items-center justify-center bg-white px-6 md:py-0 py-6 mb-0 h-full w-full dark:bg-grey-90"
|
||||||
>
|
>
|
||||||
<div class="mt-12 flex flex-col h-full">
|
<div class="mt-12 flex flex-col h-full">
|
||||||
<h1 class="text-3xl font-bold md:pb-2">
|
<h1 class="text-3xl font-bold md:pb-2">
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ const html = require('choo/html');
|
|||||||
const modal = require('./modal');
|
const modal = require('./modal');
|
||||||
|
|
||||||
module.exports = function(state, emit) {
|
module.exports = function(state, emit) {
|
||||||
|
state.modal = null;
|
||||||
return html`
|
return html`
|
||||||
<main class="main">
|
<main class="main">
|
||||||
${state.modal && modal(state, emit)}
|
${state.modal && modal(state, emit)}
|
||||||
<div
|
<div
|
||||||
class="flex flex-col items-center bg-white m-4 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
|
class="flex flex-col items-center bg-white m-4 px-6 py-8 border border-grey-30 md:border-none md:px-12 md:py-16 shadow w-full md:h-full dark:bg-grey-90"
|
||||||
>
|
>
|
||||||
<h1 class="text-center text-3xl font-bold">
|
<h1 class="text-center text-3xl font-bold">
|
||||||
${state.translate('legalTitle')}
|
${state.translate('legalTitle')}
|
||||||
@@ -19,19 +20,19 @@ module.exports = function(state, emit) {
|
|||||||
href="https://www.mozilla.org/privacy/"
|
href="https://www.mozilla.org/privacy/"
|
||||||
target="__blank"
|
target="__blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
class="text-blue-dark hover:underline"
|
class="link-blue hover:underline"
|
||||||
>Mozilla Privacy Policy</a
|
>Mozilla Privacy Policy</a
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
>describes how we handle that information. Below are the top
|
>describes how we handle that information. Below are the top
|
||||||
things you should know about Firefox Send. You can also view the
|
things you should know about Send. You can also view the
|
||||||
code</span
|
code</span
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
href="https://github.com/mozilla/send/blob/master/docs/metrics.md"
|
href="https://github.com/mozilla/send/blob/master/docs/metrics.md"
|
||||||
target="__blank"
|
target="__blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
class="text-blue-dark hover:underline"
|
class="link-blue hover:underline"
|
||||||
>here</a
|
>here</a
|
||||||
>.
|
>.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -3,13 +3,12 @@ const html = require('choo/html');
|
|||||||
module.exports = function(state, emit) {
|
module.exports = function(state, emit) {
|
||||||
return html`
|
return html`
|
||||||
<send-modal
|
<send-modal
|
||||||
class="absolute inset-0 flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-xl md:my-8"
|
class="absolute inset-0 flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-xl md:my-8 dark:bg-grey-90"
|
||||||
onclick="${close}"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="h-full w-full max-h-screen absolute top-0 flex items-center justify-center"
|
class="h-full w-full max-h-screen absolute top-0 flex justify-center md:items-center"
|
||||||
>
|
>
|
||||||
<div class="w-full" onclick="${e => e.stopPropagation()}">
|
<div class="w-full">
|
||||||
${state.modal(state, emit, close)}
|
${state.modal(state, emit, close)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -12,16 +12,16 @@ module.exports = function(state, emit) {
|
|||||||
'downloadTitle'
|
'downloadTitle'
|
||||||
)}</h1>
|
)}</h1>
|
||||||
<p
|
<p
|
||||||
class="w-full p-2 border border-yellow-light rounded md:w-4/5 text-orange-dark bg-yellow-lighter text-center leading-normal"
|
class="w-full p-2 border border-yellow-50 rounded md:w-4/5 text-orange-60 bg-yellow-40 text-center leading-normal"
|
||||||
>
|
>
|
||||||
⚠️ ${state.translate('noStreamsWarning')} ⚠️
|
⚠️ ${state.translate('noStreamsWarning')} ⚠️
|
||||||
</p>
|
</p>
|
||||||
<form class="md:w-128" onsubmit=${submit}>
|
<form class="md:w-128" onsubmit=${submit}>
|
||||||
<fieldset class="border rounded p-4 my-4" onchange=${optionChanged}>
|
<fieldset class="border rounded p-4 my-4" onchange=${optionChanged}>
|
||||||
<div class="flex items-center mb-2">
|
<div class="flex items-center mb-2">
|
||||||
<img class="mr-3 flex-shrink-0" src="${assets.get(
|
<svg class="h-8 w-6 mr-3 flex-shrink-0 text-white dark:text-grey-90">
|
||||||
'blue_file.svg'
|
<use xlink:href="${assets.get('blue_file.svg')}#icon"/>
|
||||||
)}"/>
|
</svg>
|
||||||
<p class="flex-grow">
|
<p class="flex-grow">
|
||||||
<h1 class="text-base font-medium word-break-all">${
|
<h1 class="text-base font-medium word-break-all">${
|
||||||
archive.name
|
archive.name
|
||||||
@@ -55,6 +55,11 @@ module.exports = function(state, emit) {
|
|||||||
value="${state.translate('copyLinkButton')}"
|
value="${state.translate('copyLinkButton')}"
|
||||||
title="${state.translate('copyLinkButton')}"
|
title="${state.translate('copyLinkButton')}"
|
||||||
type="submit" />
|
type="submit" />
|
||||||
|
<p
|
||||||
|
class="text-grey-80 leading-normal dark:text-grey-40 font-semibold text-center md:my-8 md:text-left"
|
||||||
|
>
|
||||||
|
${state.translate('downloadConfirmDescription')}
|
||||||
|
</p>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
@@ -64,6 +69,7 @@ module.exports = function(state, emit) {
|
|||||||
const choice = event.target.value;
|
const choice = event.target.value;
|
||||||
const button = event.currentTarget.nextElementSibling;
|
const button = event.currentTarget.nextElementSibling;
|
||||||
let title = button.title;
|
let title = button.title;
|
||||||
|
console.error(choice, title);
|
||||||
switch (choice) {
|
switch (choice) {
|
||||||
case 'copy':
|
case 'copy':
|
||||||
title = state.translate('copyLinkButton');
|
title = state.translate('copyLinkButton');
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ const assets = require('../../common/assets');
|
|||||||
const modal = require('./modal');
|
const modal = require('./modal');
|
||||||
|
|
||||||
module.exports = function(state, emit) {
|
module.exports = function(state, emit) {
|
||||||
|
const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink';
|
||||||
return html`
|
return html`
|
||||||
<main class="main">
|
<main class="main">
|
||||||
${state.modal && modal(state, emit)}
|
${state.modal && modal(state, emit)}
|
||||||
@@ -13,12 +14,17 @@ module.exports = function(state, emit) {
|
|||||||
${state.translate('expiredTitle')}
|
${state.translate('expiredTitle')}
|
||||||
</h1>
|
</h1>
|
||||||
<img src="${assets.get('notFound.svg')}" class="my-12" />
|
<img src="${assets.get('notFound.svg')}" class="my-12" />
|
||||||
<p class="max-w-md text-center text-grey-darkest leading-normal">
|
<p
|
||||||
|
class="max-w-md text-center text-grey-80 leading-normal dark:text-grey-40 ${state
|
||||||
|
.user.loggedIn
|
||||||
|
? 'hidden'
|
||||||
|
: ''}"
|
||||||
|
>
|
||||||
${state.translate('trySendDescription')}
|
${state.translate('trySendDescription')}
|
||||||
</p>
|
</p>
|
||||||
<p class="my-5">
|
<p class="my-5">
|
||||||
<a href="/" class="btn rounded-lg flex items-center" role="button"
|
<a href="/" class="btn rounded-lg flex items-center" role="button"
|
||||||
>${state.translate('sendYourFilesLink')}</a
|
>${state.translate(btnText)}</a
|
||||||
>
|
>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
const html = require('choo/html');
|
|
||||||
const Component = require('choo/component');
|
|
||||||
const assets = require('../../common/assets');
|
|
||||||
|
|
||||||
class Promo extends Component {
|
|
||||||
constructor(name, state) {
|
|
||||||
super(name);
|
|
||||||
this.state = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
update() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
createElement() {
|
|
||||||
return html`
|
|
||||||
<send-promo
|
|
||||||
class="w-full flex-row items-center content-center justify-center bg-white text-grey-darkest px-4 py-3 flex border-b border-grey-banner leading-normal"
|
|
||||||
>
|
|
||||||
<div class="flex items-center mx-auto">
|
|
||||||
<img
|
|
||||||
src="${assets.get('master-logo.svg')}"
|
|
||||||
class="w-6 h-6"
|
|
||||||
alt="Firefox"
|
|
||||||
/>
|
|
||||||
<span class="ml-2 sm:ml-4 text-xs sm:text-base">
|
|
||||||
${this.state.translate('trailheadPromo')}${' '}
|
|
||||||
<a
|
|
||||||
class="underline text-blue-dark"
|
|
||||||
href="http://www.mozilla.org/firefox/accounts/?utm_source=send.firefox.com&utm_medium=banner&utm_campaign=trailhead&utm_content=protect-your-privacy"
|
|
||||||
>${this.state.translate('learnMore')}</a
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</send-promo>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Promo;
|
|
||||||
10
app/ui/qr.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
const raw = require('choo/html/raw');
|
||||||
|
const qrcode = require('../qrcode');
|
||||||
|
|
||||||
|
module.exports = function(url) {
|
||||||
|
const gen = qrcode(5, 'L');
|
||||||
|
gen.addData(url);
|
||||||
|
gen.make();
|
||||||
|
const qr = gen.createSvgTag({ scalable: true });
|
||||||
|
return raw(qr);
|
||||||
|
};
|
||||||
@@ -6,7 +6,7 @@ module.exports = function(selected, options, translate, changed, htmlId) {
|
|||||||
return html`
|
return html`
|
||||||
<select
|
<select
|
||||||
id="${htmlId}"
|
id="${htmlId}"
|
||||||
class="appearance-none cursor-pointer border rounded bg-grey-lightest hover:border-blue-dark focus:border-blue-dark pl-1 pr-8 py-1 my-1 h-8"
|
class="appearance-none cursor-pointer border rounded bg-grey-10 hover:border-blue-50 focus:border-blue-50 pl-1 pr-8 py-1 my-1 h-8 dark:bg-grey-80"
|
||||||
onchange="${choose}"
|
onchange="${choose}"
|
||||||
>
|
>
|
||||||
${options.map(
|
${options.map(
|
||||||
|
|||||||
@@ -9,14 +9,16 @@ module.exports = function(name, url) {
|
|||||||
<h1 class="text-3xl font-bold my-4">
|
<h1 class="text-3xl font-bold my-4">
|
||||||
${state.translate('notifyUploadEncryptDone')}
|
${state.translate('notifyUploadEncryptDone')}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="font-normal leading-normal text-grey-darkest word-break-all">
|
<p
|
||||||
|
class="font-normal leading-normal text-grey-80 word-break-all dark:text-grey-40"
|
||||||
|
>
|
||||||
${state.translate('shareLinkDescription')}<br />
|
${state.translate('shareLinkDescription')}<br />
|
||||||
${name}
|
${name}
|
||||||
</p>
|
</p>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
id="share-url"
|
id="share-url"
|
||||||
class="w-full my-4 border rounded-lg leading-loose h-12 px-2 py-1"
|
class="w-full my-4 border rounded-lg leading-loose h-12 px-2 py-1 dark:bg-grey-80"
|
||||||
value="${url}"
|
value="${url}"
|
||||||
readonly="true"
|
readonly="true"
|
||||||
/>
|
/>
|
||||||
@@ -28,7 +30,7 @@ module.exports = function(name, url) {
|
|||||||
${state.translate('shareLinkButton')}
|
${state.translate('shareLinkButton')}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker my-4 font-medium cursor-pointer focus:outline"
|
class="link-blue my-4 font-medium cursor-pointer focus:outline"
|
||||||
onclick="${close}"
|
onclick="${close}"
|
||||||
title="${state.translate('okButton')}"
|
title="${state.translate('okButton')}"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,26 +1,23 @@
|
|||||||
const html = require('choo/html');
|
const html = require('choo/html');
|
||||||
const assets = require('../../common/assets');
|
const assets = require('../../common/assets');
|
||||||
const { bytes, platform } = require('../utils');
|
const { bytes } = require('../utils');
|
||||||
const { canceledSignup, submittedSignup } = require('../metrics');
|
const { canceledSignup, submittedSignup } = require('../metrics');
|
||||||
|
|
||||||
module.exports = function(trigger) {
|
module.exports = function(trigger) {
|
||||||
return function(state, emit, close) {
|
return function(state, emit, close) {
|
||||||
const DAYS = Math.floor(state.LIMITS.MAX_EXPIRE_SECONDS / 86400);
|
const DAYS = Math.floor(state.LIMITS.MAX_EXPIRE_SECONDS / 86400);
|
||||||
const hidden = platform() === 'android' ? 'hidden' : '';
|
|
||||||
let submitting = false;
|
let submitting = false;
|
||||||
return html`
|
return html`
|
||||||
<send-signup-dialog
|
<send-signup-dialog
|
||||||
class="flex flex-col lg:flex-row justify-center px-8 md:px-24 w-full h-full"
|
class="flex flex-col justify-center my-16 md:my-0 px-8 md:px-24 w-full h-full"
|
||||||
>
|
>
|
||||||
<img src="${assets.get('master-logo.svg')}" class="h-16 mt-1 mb-4" />
|
<img src="${assets.get('master-logo.svg')}" class="h-16 mt-1 mb-4" />
|
||||||
<section
|
<section class="flex flex-col flex-shrink-0 self-center">
|
||||||
class="flex flex-col flex-shrink-0 self-center lg:mx-6 lg:max-w-xs"
|
<h1 class="text-3xl font-bold text-center">
|
||||||
>
|
|
||||||
<h1 class="text-3xl font-bold text-center lg:text-left">
|
|
||||||
${state.translate('accountBenefitTitle')}
|
${state.translate('accountBenefitTitle')}
|
||||||
</h1>
|
</h1>
|
||||||
<ul
|
<ul
|
||||||
class="leading-normal text-grey-darkest my-2 mt-4 pl-4 md:self-center"
|
class="leading-normal list-disc text-grey-80 my-2 mt-4 pl-4 md:self-center dark:text-grey-40"
|
||||||
>
|
>
|
||||||
<li>
|
<li>
|
||||||
${state.translate('accountBenefitLargeFiles', {
|
${state.translate('accountBenefitLargeFiles', {
|
||||||
@@ -32,17 +29,14 @@ module.exports = function(trigger) {
|
|||||||
${state.translate('accountBenefitTimeLimit', { count: DAYS })}
|
${state.translate('accountBenefitTimeLimit', { count: DAYS })}
|
||||||
</li>
|
</li>
|
||||||
<li>${state.translate('accountBenefitSync')}</li>
|
<li>${state.translate('accountBenefitSync')}</li>
|
||||||
<li>${state.translate('accountBenefitMoz')}</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
<section
|
<section class="flex flex-col flex-grow m-4 md:self-center md:w-128">
|
||||||
class="flex flex-col flex-grow m-4 md:self-center md:w-128 lg:max-w-xs"
|
|
||||||
>
|
|
||||||
<form onsubmit=${submitEmail} data-no-csrf>
|
<form onsubmit=${submitEmail} data-no-csrf>
|
||||||
<input
|
<input
|
||||||
id="email-input"
|
id="email-input"
|
||||||
type="email"
|
type="email"
|
||||||
class="${hidden} border rounded-lg w-full px-2 py-1 h-12 mb-3 text-lg text-grey-darker leading-loose"
|
class="hidden border rounded-lg w-full px-2 py-1 h-12 mb-3 text-lg text-grey-70 leading-loose dark:bg-grey-80 dark:text-white"
|
||||||
placeholder=${state.translate('emailPlaceholder')}
|
placeholder=${state.translate('emailPlaceholder')}
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
@@ -53,13 +47,17 @@ module.exports = function(trigger) {
|
|||||||
type="submit"
|
type="submit"
|
||||||
/>
|
/>
|
||||||
</form>
|
</form>
|
||||||
<button
|
${state.user.loginRequired
|
||||||
class="my-3 text-blue-dark hover:text-blue-darker focus:text-blue-darker font-medium"
|
? ''
|
||||||
title="${state.translate('deletePopupCancel')}"
|
: html`
|
||||||
onclick=${cancel}
|
<button
|
||||||
>
|
class="my-3 link-blue font-medium"
|
||||||
${state.translate('deletePopupCancel')}
|
title="${state.translate('deletePopupCancel')}"
|
||||||
</button>
|
onclick=${cancel}
|
||||||
|
>
|
||||||
|
${state.translate('deletePopupCancel')}
|
||||||
|
</button>
|
||||||
|
`}
|
||||||
</section>
|
</section>
|
||||||
</send-signup-dialog>
|
</send-signup-dialog>
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ module.exports = function() {
|
|||||||
<h1 class="text-3xl font-bold my-4">
|
<h1 class="text-3xl font-bold my-4">
|
||||||
Tell us what you think.
|
Tell us what you think.
|
||||||
</h1>
|
</h1>
|
||||||
<p class="font-normal leading-normal text-grey-darkest px-4">
|
<p class="font-normal leading-normal text-grey-80 px-4">
|
||||||
Love Firefox Send? Take a quick survey to let us know how we can make
|
Love Send? Take a quick survey to let us know how we can make it
|
||||||
it better.
|
better.
|
||||||
</p>
|
</p>
|
||||||
<a
|
<a
|
||||||
class="btn rounded-lg w-full flex-shrink-0 focus:outline my-5"
|
class="btn rounded-lg w-full flex-shrink-0 focus:outline my-5"
|
||||||
@@ -30,7 +30,7 @@ module.exports = function() {
|
|||||||
Give feedback
|
Give feedback
|
||||||
</a>
|
</a>
|
||||||
<button
|
<button
|
||||||
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker font-medium cursor-pointer focus:outline"
|
class="link-blue font-medium cursor-pointer focus:outline"
|
||||||
onclick="${close}"
|
onclick="${close}"
|
||||||
title="Skip"
|
title="Skip"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ module.exports = function(state, emit) {
|
|||||||
<main class="main">
|
<main class="main">
|
||||||
${state.modal && modal(state, emit)}
|
${state.modal && modal(state, emit)}
|
||||||
<section
|
<section
|
||||||
class="flex flex-col items-center justify-center text-center bg-white m-6 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
|
class="flex flex-col items-center justify-center text-center bg-white m-6 px-6 py-8 border border-grey-30 md:border-none md:px-12 md:py-16 shadow w-full md:h-full dark:bg-grey-90"
|
||||||
>
|
>
|
||||||
<h1 class="text-3xl font-bold">${strings.header}</h1>
|
<h1 class="text-3xl font-bold">${strings.header}</h1>
|
||||||
<p class="mt-4 mb-8 max-w-md leading-normal">${strings.description}</p>
|
<p class="mt-4 mb-8 max-w-md leading-normal">${strings.description}</p>
|
||||||
|
|||||||
79
app/user.js
@@ -76,6 +76,10 @@ export default class User {
|
|||||||
return this.info.access_token;
|
return this.info.access_token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get refreshToken() {
|
||||||
|
return this.info.refresh_token;
|
||||||
|
}
|
||||||
|
|
||||||
get maxSize() {
|
get maxSize() {
|
||||||
return this.loggedIn
|
return this.loggedIn
|
||||||
? this.limits.MAX_FILE_SIZE
|
? this.limits.MAX_FILE_SIZE
|
||||||
@@ -135,6 +139,7 @@ export default class User {
|
|||||||
const code_challenge = await preparePkce(this.storage);
|
const code_challenge = await preparePkce(this.storage);
|
||||||
const options = {
|
const options = {
|
||||||
action: 'email',
|
action: 'email',
|
||||||
|
access_type: 'offline',
|
||||||
client_id: this.authConfig.client_id,
|
client_id: this.authConfig.client_id,
|
||||||
code_challenge,
|
code_challenge,
|
||||||
code_challenge_method: 'S256',
|
code_challenge_method: 'S256',
|
||||||
@@ -192,12 +197,69 @@ export default class User {
|
|||||||
});
|
});
|
||||||
const userInfo = await infoResponse.json();
|
const userInfo = await infoResponse.json();
|
||||||
userInfo.access_token = auth.access_token;
|
userInfo.access_token = auth.access_token;
|
||||||
|
userInfo.refresh_token = auth.refresh_token;
|
||||||
userInfo.fileListKey = await getFileListKey(this.storage, auth.keys_jwe);
|
userInfo.fileListKey = await getFileListKey(this.storage, auth.keys_jwe);
|
||||||
this.info = userInfo;
|
this.info = userInfo;
|
||||||
this.storage.remove('pkceVerifier');
|
this.storage.remove('pkceVerifier');
|
||||||
}
|
}
|
||||||
|
|
||||||
logout() {
|
async refresh() {
|
||||||
|
if (!this.refreshToken) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const tokenResponse = await fetch(this.authConfig.token_endpoint, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
client_id: this.authConfig.client_id,
|
||||||
|
grant_type: 'refresh_token',
|
||||||
|
refresh_token: this.refreshToken
|
||||||
|
})
|
||||||
|
});
|
||||||
|
if (tokenResponse.ok) {
|
||||||
|
const auth = await tokenResponse.json();
|
||||||
|
const info = { ...this.info, access_token: auth.access_token };
|
||||||
|
this.info = info;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
await this.logout();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async logout() {
|
||||||
|
try {
|
||||||
|
if (this.refreshToken) {
|
||||||
|
await fetch(this.authConfig.revocation_endpoint, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
refresh_token: this.refreshToken
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (this.bearerToken) {
|
||||||
|
await fetch(this.authConfig.revocation_endpoint, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
token: this.bearerToken
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
// oh well, we tried
|
||||||
|
}
|
||||||
this.storage.clearLocalFiles();
|
this.storage.clearLocalFiles();
|
||||||
this.info = {};
|
this.info = {};
|
||||||
}
|
}
|
||||||
@@ -211,6 +273,14 @@ export default class User {
|
|||||||
const key = b64ToArray(this.info.fileListKey);
|
const key = b64ToArray(this.info.fileListKey);
|
||||||
const sha = await crypto.subtle.digest('SHA-256', key);
|
const sha = await crypto.subtle.digest('SHA-256', key);
|
||||||
const kid = arrayToB64(new Uint8Array(sha)).substring(0, 16);
|
const kid = arrayToB64(new Uint8Array(sha)).substring(0, 16);
|
||||||
|
const retry = async () => {
|
||||||
|
const refreshed = await this.refresh();
|
||||||
|
if (refreshed) {
|
||||||
|
return await this.syncFileList();
|
||||||
|
} else {
|
||||||
|
return { incoming: true };
|
||||||
|
}
|
||||||
|
};
|
||||||
try {
|
try {
|
||||||
const encrypted = await getFileList(this.bearerToken, kid);
|
const encrypted = await getFileList(this.bearerToken, kid);
|
||||||
const decrypted = await streamToArrayBuffer(
|
const decrypted = await streamToArrayBuffer(
|
||||||
@@ -219,8 +289,7 @@ export default class User {
|
|||||||
list = JSON.parse(textDecoder.decode(decrypted));
|
list = JSON.parse(textDecoder.decode(decrypted));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e.message === '401') {
|
if (e.message === '401') {
|
||||||
this.logout();
|
return retry(e);
|
||||||
return { incoming: true };
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
changes = await this.storage.merge(list);
|
changes = await this.storage.merge(list);
|
||||||
@@ -236,7 +305,9 @@ export default class User {
|
|||||||
);
|
);
|
||||||
await setFileList(this.bearerToken, kid, encrypted);
|
await setFileList(this.bearerToken, kid, encrypted);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//
|
if (e.message === '401') {
|
||||||
|
return retry(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return changes;
|
return changes;
|
||||||
}
|
}
|
||||||
|
|||||||
11
app/utils.js
@@ -1,5 +1,10 @@
|
|||||||
/* global Android */
|
/* global Android */
|
||||||
const html = require('choo/html');
|
let html;
|
||||||
|
try {
|
||||||
|
html = require('choo/html');
|
||||||
|
} catch (e) {
|
||||||
|
// running in the service worker
|
||||||
|
}
|
||||||
const b64 = require('base64-js');
|
const b64 = require('base64-js');
|
||||||
|
|
||||||
function arrayToB64(array) {
|
function arrayToB64(array) {
|
||||||
@@ -137,12 +142,16 @@ function openLinksInNewTab(links, should = true) {
|
|||||||
|
|
||||||
function browserName() {
|
function browserName() {
|
||||||
try {
|
try {
|
||||||
|
// order of these matters
|
||||||
if (/firefox/i.test(navigator.userAgent)) {
|
if (/firefox/i.test(navigator.userAgent)) {
|
||||||
return 'firefox';
|
return 'firefox';
|
||||||
}
|
}
|
||||||
if (/edge/i.test(navigator.userAgent)) {
|
if (/edge/i.test(navigator.userAgent)) {
|
||||||
return 'edge';
|
return 'edge';
|
||||||
}
|
}
|
||||||
|
if (/edg/i.test(navigator.userAgent)) {
|
||||||
|
return 'edgium';
|
||||||
|
}
|
||||||
if (/trident/i.test(navigator.userAgent)) {
|
if (/trident/i.test(navigator.userAgent)) {
|
||||||
return 'ie';
|
return 'ie';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<defs>
|
<symbol id="plus" viewBox="0 0 24 24">
|
||||||
<polygon id="addfiles-a" points="11.143 6 11.143 11.143 6 11.143 6 12.857 11.143 12.857 11.143 18 12.857 18 12.857 12.857 18 12.857 18 11.143 12.857 11.143 12.857 6"/>
|
|
||||||
</defs>
|
|
||||||
<g fill="none" fill-rule="evenodd">
|
<g fill="none" fill-rule="evenodd">
|
||||||
<path fill="#0060df" fill-rule="nonzero" d="M12,22.6666667 C17.8910373,22.6666667 22.6666667,17.8910373 22.6666667,12 C22.6666667,6.10896267 17.8910373,1.33333333 12,1.33333333 C6.10896267,1.33333333 1.33333333,6.10896267 1.33333333,12 C1.33333333,17.8910373 6.10896267,22.6666667 12,22.6666667 Z M12,24 C5.372583,24 0,18.627417 0,12 C0,5.372583 5.372583,0 12,0 C18.627417,0 24,5.372583 24,12 C24,18.627417 18.627417,24 12,24 Z"/>
|
<path fill="currentColor" fill-rule="nonzero" d="M12,22.6666667 C17.8910373,22.6666667 22.6666667,17.8910373 22.6666667,12 C22.6666667,6.10896267 17.8910373,1.33333333 12,1.33333333 C6.10896267,1.33333333 1.33333333,6.10896267 1.33333333,12 C1.33333333,17.8910373 6.10896267,22.6666667 12,22.6666667 Z M12,24 C5.372583,24 0,18.627417 0,12 C0,5.372583 5.372583,0 12,0 C18.627417,0 24,5.372583 24,12 C24,18.627417 18.627417,24 12,24 Z"/>
|
||||||
<use fill="#0060df" xlink:href="#addfiles-a"/>
|
<polygon fill="currentColor" points="11.143 6 11.143 11.143 6 11.143 6 12.857 11.143 12.857 11.143 18 12.857 18 12.857 12.857 18 12.857 18 11.143 12.857 11.143 12.857 6"/>
|
||||||
</g>
|
</g>
|
||||||
|
</symbol>
|
||||||
|
<use xlink:href="#plus"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 856 B After Width: | Height: | Size: 831 B |
@@ -1,8 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg width="26px" height="32px" viewBox="0 0 26 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<!-- Generator: sketchtool 53 (72520) - https://sketchapp.com -->
|
<symbol id="icon" viewBox="0 0 26 32">
|
||||||
<title>6AF7DAB4-6456-44F2-AABE-F001D910B641</title>
|
|
||||||
<desc>Created with sketchtool.</desc>
|
|
||||||
<defs>
|
<defs>
|
||||||
<path d="M21.848475,31.6653183 L2.89005487,31.6653183 C1.32717435,31.6653183 0.104050469,30.3742431 0.104050469,28.8793139 L0.104050469,2.7860044 C0.104050469,1.22312388 1.39512568,0 2.89005487,0 L14.7135857,0 C15.4610503,0 16.2085149,0.271805307 16.6841742,0.815415921 L23.8190635,7.95030523 C24.3626741,8.49391584 24.6344794,9.17342911 24.6344794,9.9208937 L24.6344794,28.8793139 C24.6344794,30.3742431 23.4113555,31.6653183 21.848475,31.6653183 Z" id="path-1"></path>
|
<path d="M21.848475,31.6653183 L2.89005487,31.6653183 C1.32717435,31.6653183 0.104050469,30.3742431 0.104050469,28.8793139 L0.104050469,2.7860044 C0.104050469,1.22312388 1.39512568,0 2.89005487,0 L14.7135857,0 C15.4610503,0 16.2085149,0.271805307 16.6841742,0.815415921 L23.8190635,7.95030523 C24.3626741,8.49391584 24.6344794,9.17342911 24.6344794,9.9208937 L24.6344794,28.8793139 C24.6344794,30.3742431 23.4113555,31.6653183 21.848475,31.6653183 Z" id="path-1"></path>
|
||||||
</defs>
|
</defs>
|
||||||
@@ -14,14 +12,15 @@
|
|||||||
<mask id="mask-2" fill="white">
|
<mask id="mask-2" fill="white">
|
||||||
<use xlink:href="#path-1"></use>
|
<use xlink:href="#path-1"></use>
|
||||||
</mask>
|
</mask>
|
||||||
<use id="Mask" fill="#45A1FF" opacity="0.6" xlink:href="#path-1"></use>
|
<use id="Mask" fill="#45a1ff" xlink:href="#path-1"></use>
|
||||||
<path d="M24.3031318,10.6474633 L16.7826187,10.6474633 C15.2742552,10.6474633 14.051485,9.42469306 14.051485,7.91632957 L14.051485,0.395816478" id="Path" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
<path d="M24.3031318,10.6474633 L16.7826187,10.6474633 C15.2742552,10.6474633 14.051485,9.42469306 14.051485,7.91632957 L14.051485,0.395816478" id="Path" stroke="currentColor" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
||||||
<path d="M7.2830232,8.93885547 L8.91906464,8.93885547" id="Path" stroke="#0060DF" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
<path d="M7.2830232,8.93885547 L8.91906464,8.93885547" id="Path" stroke="currentColor" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
||||||
<path d="M7.2830232,15.7798836 L17.5412669,15.7798836" id="Path" stroke="#0060DF" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
<path d="M7.2830232,15.7798836 L17.5412669,15.7798836" id="Path" stroke="currentColor" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
||||||
<path d="M7.2830232,22.6209117 L17.5412669,22.6209117" id="Path" stroke="#0060DF" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
<path d="M7.2830232,22.6209117 L17.5412669,22.6209117" id="Path" stroke="currentColor" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
|
</symbol>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.1 KiB |
@@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" 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>
|
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 16 16"><path fill="#737373" 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>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 287 B After Width: | Height: | Size: 287 B |
@@ -1 +1,5 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#0060df" 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>
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<symbol id="icon" viewBox="0 0 16 16">
|
||||||
|
<path fill="currentColor" 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"/>
|
||||||
|
</symbol>
|
||||||
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 398 B After Width: | Height: | Size: 411 B |
@@ -1,15 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg width="12px" height="16px" viewBox="0 0 12 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
<svg width="12px" height="16px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<!-- Generator: sketchtool 53 (72520) - https://sketchapp.com -->
|
<symbol id="icon" viewBox="0 0 12 16">
|
||||||
<title>728D143F-562C-4AE5-80DA-9DBBD9D647D8</title>
|
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
<desc>Created with sketchtool.</desc>
|
<g transform="translate(-770.000000, -481.000000)" fill="currentColor">
|
||||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
<g transform="translate(744.000000, 350.000000)">
|
||||||
<g id="Send_Sending" transform="translate(-770.000000, -481.000000)" fill="#0060DF">
|
<g transform="translate(26.000000, 131.000000)">
|
||||||
<g id="List-Item-3" transform="translate(744.000000, 350.000000)">
|
<path d="M5.293,12.707 C5.6835,13.097382 6.316501,13.097383 6.707001,12.707 L11.707,7.707 C12.08597,7.31462 12.08054,6.69092 11.69481,6.305189 C11.30908,5.91946 10.68538,5.91403 10.293,6.293 L7,9.586 L7,1 C7,0.44772 6.552285,0 6,0 C5.447715,0 5,0.44772 5,1 L5,9.586 L1.707,6.293 C1.314621,5.91403 0.690915,5.91945 0.305181,6.305182 C-0.080553,6.690915 -0.085973,7.314622 0.293,7.707001 L5.293,12.707 Z M11,14 L1,14 C0.447715,14 0,14.447715 0,15 C0,15.5522852 0.447715,16 1,16 L11,16 C11.55228,16 12,15.5522852 12,15 C12,14.447715 11.55229,14 11,14 Z"></path>
|
||||||
<g id="Download-Icon" transform="translate(26.000000, 131.000000)">
|
|
||||||
<path d="M5.293,12.707 C5.6835,13.097382 6.316501,13.097383 6.707001,12.707 L11.707,7.707 C12.08597,7.31462 12.08054,6.69092 11.69481,6.305189 C11.30908,5.91946 10.68538,5.91403 10.293,6.293 L7,9.586 L7,1 C7,0.44772 6.552285,0 6,0 C5.447715,0 5,0.44772 5,1 L5,9.586 L1.707,6.293 C1.314621,5.91403 0.690915,5.91945 0.305181,6.305182 C-0.080553,6.690915 -0.085973,7.314622 0.293,7.707001 L5.293,12.707 Z M11,14 L1,14 C0.447715,14 0,14.447715 0,15 C0,15.5522852 0.447715,16 1,16 L11,16 C11.55228,16 12,15.5522852 12,15 C12,14.447715 11.55229,14 11,14 Z" id="Fill-1"></path>
|
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
|
</symbol>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.1 KiB |
1
assets/eye-off.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#8795a1" d="M256.1 144.8c56.2 0 101.9 45.3 101.9 101.1 0 13.1-2.6 25.5-7.3 37l59.5 59c30.8-25.5 55-58.4 69.9-96-35.3-88.7-122.3-151.6-224.2-151.6-28.5 0-55.8 5.1-81.1 14.1l44 43.7c11.6-4.6 24.1-7.3 37.3-7.3zM52.4 89.7l46.5 46.1 9.4 9.3c-33.9 26-60.4 60.8-76.3 100.8 35.2 88.7 122.2 151.6 224.1 151.6 31.6 0 61.7-6.1 89.2-17l8.6 8.5 59.7 59 25.9-25.7L78.2 64 52.4 89.7zM165 201.4l31.6 31.3c-1 4.2-1.6 8.7-1.6 13.1 0 33.5 27.3 60.6 61.1 60.6 4.5 0 9-.6 13.2-1.6l31.6 31.3c-13.6 6.7-28.7 10.7-44.8 10.7-56.2 0-101.9-45.3-101.9-101.1 0-15.8 4.1-30.7 10.8-44.3zm87.8-15.7l64.2 63.7.4-3.2c0-33.5-27.3-60.6-61.1-60.6l-3.5.1z"/></svg>
|
||||||
|
After Width: | Height: | Size: 701 B |
1
assets/eye.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#8795a1" d="M256 105c-101.8 0-188.4 62.4-224 151 35.6 88.6 122.2 151 224 151s188.4-62.4 224-151c-35.6-88.6-122.2-151-224-151zm0 251.7c-56 0-101.8-45.3-101.8-100.7S200 155.3 256 155.3 357.8 200.6 357.8 256 312 356.7 256 356.7zm0-161.1c-33.6 0-61.1 27.2-61.1 60.4s27.5 60.4 61.1 60.4 61.1-27.2 61.1-60.4-27.5-60.4-61.1-60.4z"/></svg>
|
||||||
|
After Width: | Height: | Size: 406 B |
41
assets/icon.svg
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<svg viewBox="0 0 65 64" height="64" width="65" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="linear-gradient" x1="46.37" y1="59.71" x2="15.42" y2="6.11" gradientTransform="matrix(1, 0, 0, -1, 0, 64)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#ff980e"/>
|
||||||
|
<stop offset="0.21" stop-color="#ff7139"/>
|
||||||
|
<stop offset="0.36" stop-color="#ff5854"/>
|
||||||
|
<stop offset="0.46" stop-color="#ff4f5e"/>
|
||||||
|
<stop offset="0.69" stop-color="#ff3750"/>
|
||||||
|
<stop offset="0.86" stop-color="#f92261"/>
|
||||||
|
<stop offset="1" stop-color="#f5156c"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-2" x1="46.37" y1="59.71" x2="15.42" y2="6.11" gradientTransform="matrix(1, 0, 0, -1, 0, 64)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#fff44f" stop-opacity="0.8"/>
|
||||||
|
<stop offset="0.09" stop-color="#fff44f" stop-opacity="0.7"/>
|
||||||
|
<stop offset="0.75" stop-color="#fff44f" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-3" x1="40.19" y1="26.08" x2="54.32" y2="50.55" gradientTransform="matrix(1, 0, 0, -1, 0, 64)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#3a8ee6"/>
|
||||||
|
<stop offset="0.24" stop-color="#5c79f0"/>
|
||||||
|
<stop offset="0.63" stop-color="#9059ff"/>
|
||||||
|
<stop offset="1" stop-color="#c139e6"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-4" x1="54.32" y1="50.58" x2="48.39" y2="40.31" gradientTransform="matrix(1, 0, 0, -1, 0, 64)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#6e008b" stop-opacity="0.5"/>
|
||||||
|
<stop offset="0.5" stop-color="#c846cb" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-5" x1="56.96" y1="22.5" x2="41.98" y2="37.46" gradientTransform="matrix(1, 0, 0, -1, 0, 64)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0.14" stop-color="#6a2bea" stop-opacity="0"/>
|
||||||
|
<stop offset="0.34" stop-color="#642de4" stop-opacity="0.03"/>
|
||||||
|
<stop offset="0.55" stop-color="#5131d3" stop-opacity="0.12"/>
|
||||||
|
<stop offset="0.76" stop-color="#3139b7" stop-opacity="0.27"/>
|
||||||
|
<stop offset="0.98" stop-color="#054490" stop-opacity="0.48"/>
|
||||||
|
<stop offset="1" stop-color="#00458b" stop-opacity="0.5"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<path d="M32.56,0C14.61,0,0,14.33,0,31.94a3.42,3.42,0,0,0,3.42,3.42H29.14V52.3l-8-8a3.42,3.42,0,1,0-4.84,4.84L30.14,63a2.73,2.73,0,0,0,.25.23l.23.17h.05l.24.14.27.13.28.1.29.07L32,64h1.27l.29-.07.29-.1.27-.13.24-.14.24-.17L35,63,48.8,49.18A3.43,3.43,0,0,0,44,44.34l-8,8v-17H61.7a3.42,3.42,0,0,0,3.42-3.42h0C65.12,14.33,50.51,0,32.56,0ZM7.09,28.51A25.54,25.54,0,0,1,32.56,6.85,25.55,25.55,0,0,1,58,28.51Z" fill="url(#linear-gradient)"/>
|
||||||
|
<path d="M32.56,0C14.61,0,0,14.33,0,31.94a3.42,3.42,0,0,0,3.42,3.42H29.14V52.3l-8-8a3.42,3.42,0,1,0-4.84,4.84L30.14,63a2.73,2.73,0,0,0,.25.23l.23.17h.05l.24.14.27.13.28.1.29.07L32,64h1.27l.29-.07.29-.1.27-.13.24-.14.24-.17L35,63,48.8,49.18A3.43,3.43,0,0,0,44,44.34l-8,8v-17H61.7a3.42,3.42,0,0,0,3.42-3.42h0C65.12,14.33,50.51,0,32.56,0ZM7.09,28.51A25.54,25.54,0,0,1,32.56,6.85,25.55,25.55,0,0,1,58,28.51Z" fill="url(#linear-gradient-2)"/>
|
||||||
|
<path d="M36,7.08A25.45,25.45,0,0,1,58,28.51H42.85A6.85,6.85,0,0,0,36,35.36H61.7a3.43,3.43,0,0,0,3.42-3.43c0-12.2-8.63-18.13-16-21.59A35.75,35.75,0,0,0,36,7.08Z" fill="url(#linear-gradient-3)"/>
|
||||||
|
<path d="M57.89,27.76c2.31,1.86,4.63,3.71,6.9,5.61a3.27,3.27,0,0,0,.33-1.44c0-12.2-8.63-18.13-16-21.59A35.75,35.75,0,0,0,36,7.08,25.47,25.47,0,0,1,57.89,27.76Z" fill="url(#linear-gradient-4)"/>
|
||||||
|
<path d="M57.5,28.51H42.85A6.85,6.85,0,0,0,36,35.36H61.7a3.36,3.36,0,0,0,2.64-1.28C62.09,32.19,59.79,30.36,57.5,28.51Z" opacity=".9" fill="url(#linear-gradient-5)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 8.1 KiB |
@@ -1 +0,0 @@
|
|||||||
<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>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,8 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg width="8px" height="6px" viewBox="0 0 8 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
<svg width="8px" height="6px" viewBox="0 0 8 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<!-- Generator: sketchtool 53 (72520) - https://sketchapp.com -->
|
|
||||||
<title>37845F0A-2932-4C2D-98E1-89BE1B168092</title>
|
|
||||||
<desc>Created with sketchtool.</desc>
|
|
||||||
<defs>
|
<defs>
|
||||||
<path d="M6,8.48771202 C5.73480519,8.48765538 5.48049273,8.3822614 5.293,8.19471202 L2.293,5.19471202 C1.91402779,4.80233313 1.91944763,4.17862724 2.30518142,3.79289345 C2.69091522,3.40715965 3.31462111,3.40173981 3.707,3.78071202 L6,6.07371202 L8.293,3.78071202 C8.68537889,3.40173981 9.30908478,3.40715965 9.69481858,3.79289345 C10.0805524,4.17862724 10.0859722,4.80233313 9.707,5.19471202 L6.707,8.19471202 C6.51950727,8.3822614 6.26519481,8.48765538 6,8.48771202 Z" id="path-1"></path>
|
<path d="M6,8.48771202 C5.73480519,8.48765538 5.48049273,8.3822614 5.293,8.19471202 L2.293,5.19471202 C1.91402779,4.80233313 1.91944763,4.17862724 2.30518142,3.79289345 C2.69091522,3.40715965 3.31462111,3.40173981 3.707,3.78071202 L6,6.07371202 L8.293,3.78071202 C8.68537889,3.40173981 9.30908478,3.40715965 9.69481858,3.79289345 C10.0805524,4.17862724 10.0859722,4.80233313 9.707,5.19471202 L6.707,8.19471202 C6.51950727,8.3822614 6.26519481,8.48765538 6,8.48771202 Z" id="path-1"></path>
|
||||||
</defs>
|
</defs>
|
||||||
@@ -14,7 +11,7 @@
|
|||||||
<mask id="mask-2" fill="white">
|
<mask id="mask-2" fill="white">
|
||||||
<use xlink:href="#path-1"></use>
|
<use xlink:href="#path-1"></use>
|
||||||
</mask>
|
</mask>
|
||||||
<use id="Shape" fill="#0C0C0D" fill-rule="nonzero" opacity="0.599283854" xlink:href="#path-1"></use>
|
<use id="Shape" fill="#b1b1b3" fill-rule="nonzero" opacity="0.599283854" xlink:href="#path-1"></use>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -1,4 +1,5 @@
|
|||||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
<!-- 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
|
- 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/. -->
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 9a3 3 0 1 0-2.977-2.63l-6.94 3.47a3 3 0 1 0 0 4.319l6.94 3.47a3 3 0 1 0 .895-1.789l-6.94-3.47a3.03 3.03 0 0 0 0-.74l6.94-3.47C16.456 8.68 17.19 9 18 9z" fill="#0060df" fill-opacity=".8"></path></svg>
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<symbol id="icon" viewBox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 9a3 3 0 1 0-2.977-2.63l-6.94 3.47a3 3 0 1 0 0 4.319l6.94 3.47a3 3 0 1 0 .895-1.789l-6.94-3.47a3.03 3.03 0 0 0 0-.74l6.94-3.47C16.456 8.68 17.19 9 18 9z" fill="currentColor"></path></symbol></svg>
|
||||||
|
Before Width: | Height: | Size: 559 B After Width: | Height: | Size: 539 B |
6
assets/wordmark.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<symbol id="logo">
|
||||||
|
<path d="m 105.17,33.27 c -1.04895,-0.638175 -2.18377,-1.123082 -3.37,-1.44 -1.25,-0.34 -2.46,-0.63 -3.63,-0.88 l -3.08,-0.7 C 94.22073,30.069182 93.37751,29.78027 92.58,29.39 91.90449,29.074134 91.31719,28.596738 90.87,28 c -0.43741,-0.644047 -0.65489,-1.412243 -0.62,-2.19 -0.0406,-1.405196 0.53693,-2.75754 1.58,-3.7 1.06,-1 2.73,-1.44 5,-1.44 1.76437,-0.07198 3.51559,0.332147 5.07,1.17 1.35935,0.80694 2.51833,1.911219 3.39,3.23 l 2.79,-2.18 c -1.26761,-1.5933 -2.84201,-2.916072 -4.63,-3.89 -2.04373,-1.017745 -4.30804,-1.512526 -6.59,-1.44 -1.40785,-0.02195 -2.80876,0.201387 -4.14,0.66 -1.16063,0.399115 -2.24085,1.001871 -3.19,1.78 -0.8713,0.712445 -1.5718,1.611145 -2.05,2.63 -0.4819,1.011666 -0.72807,2.119452 -0.72,3.24 -0.05,1.231532 0.24064,2.452997 0.84,3.53 0.55827,0.895068 1.31002,1.653654 2.2,2.22 0.94422,0.612326 1.97599,1.077636 3.06,1.38 1.13,0.32 2.29,0.6 3.47,0.84 l 3.26,0.74 c 0.96945,0.22193 1.90929,0.557589 2.8,1 0.77256,0.367753 1.45522,0.900225 2,1.56 0.51019,0.701297 0.77072,1.553301 0.74,2.42 0.0438,1.566414 -0.62122,3.069031 -1.81,4.09 -1.52512,1.147855 -3.41702,1.699065 -5.32,1.55 -4.03416,0.15747 -7.83041,-1.90763 -9.89,-5.38 l -3,2.34 c 1.3876,1.880136 3.1735,3.430427 5.23,4.54 2.3855,1.197767 5.03194,1.782045 7.7,1.7 1.49114,0.02151 2.97422,-0.222285 4.38,-0.72 1.21788,-0.44929 2.33816,-1.128248 3.3,-2 0.88604,-0.797749 1.60053,-1.767412 2.1,-2.85 0.48895,-1.06318 0.74142,-2.219779 0.74,-3.39 0.0397,-1.336553 -0.30755,-2.656119 -1,-3.8 -0.62101,-0.95962 -1.44763,-1.769154 -2.42,-2.37 z m 27.51,-4.72 c -1.0207,-1.016684 -2.23916,-1.813109 -3.58,-2.34 -1.42831,-0.567565 -2.95311,-0.852828 -4.49,-0.84 -1.58532,-0.01887 -3.15769,0.287432 -4.62,0.9 -1.3691,0.572827 -2.61257,1.408599 -3.66,2.46 -2.1451,2.217513 -3.33989,5.184759 -3.33,8.27 -0.0138,1.54162 0.26439,3.071916 0.82,4.51 0.5255,1.363982 1.32922,2.603618 2.36,3.64 1.06096,1.043663 2.31862,1.866239 3.7,2.42 1.53222,0.610739 3.17082,0.909903 4.82,0.88 2.13421,0.08534 4.25095,-0.416179 6.12,-1.45 1.69947,-1.049265 3.13073,-2.480527 4.18,-4.18 l -2.88,-1.69 c -1.41279,2.768876 -4.32635,4.443291 -7.43,4.27 -1.09666,0.02103 -2.18793,-0.158593 -3.22,-0.53 -0.93382,-0.341463 -1.79784,-0.849713 -2.55,-1.5 -0.72694,-0.645531 -1.33013,-1.418157 -1.78,-2.28 -0.47812,-0.903522 -0.77374,-1.892313 -0.87,-2.91 h 19.59 v -1.52 c 0.0166,-1.555338 -0.27566,-3.098506 -0.86,-4.54 -0.54053,-1.333176 -1.33916,-2.54641 -2.35,-3.57 z m -16.28,6.67 c 0.18109,-0.958759 0.51895,-1.881119 1,-2.73 0.47186,-0.820757 1.07675,-1.557447 1.79,-2.18 0.72195,-0.61779 1.5482,-1.102022 2.44,-1.43 0.95944,-0.356614 1.97651,-0.532906 3,-0.52 4.04346,-0.224227 7.5255,2.82256 7.84,6.86 z M 158.82,28 c -0.83726,-0.883328 -1.8626,-1.566885 -3,-2 -1.25447,-0.462049 -2.58329,-0.689169 -3.92,-0.67 -1.60057,-0.03131 -3.18086,0.362037 -4.58,1.14 -1.28188,0.720594 -2.36173,1.752297 -3.14,3 v -3.65 h -3.29 V 48 h 3.37 V 35.67 c -0.0102,-1.001391 0.16968,-1.995625 0.53,-2.93 0.3373,-0.856524 0.84023,-1.638106 1.48,-2.3 0.62704,-0.649648 1.38331,-1.160636 2.22,-1.5 0.87089,-0.363534 1.8063,-0.547214 2.75,-0.54 1.87023,-0.128793 3.70135,0.578019 5,1.93 1.22147,1.441484 1.85048,3.292756 1.76,5.18 V 48 h 3.41 V 35.34 c 0.0211,-1.424123 -0.20214,-2.84132 -0.66,-4.19 -0.40985,-1.176324 -1.06809,-2.250653 -1.93,-3.15 z m 27,-12.42 v 14.1 c -0.43264,-0.685249 -0.96517,-1.302051 -1.58,-1.83 -0.60967,-0.53196 -1.28117,-0.98858 -2,-1.36 -0.73088,-0.369676 -1.5029,-0.651634 -2.3,-0.84 -0.78611,-0.187908 -1.59174,-0.281898 -2.4,-0.28 -1.50724,-0.0078 -3.00162,0.277523 -4.4,0.84 -1.34071,0.551089 -2.56038,1.35967 -3.59,2.38 -1.03697,1.047216 -1.85907,2.287165 -2.42,3.65 -1.17023,2.996466 -1.17023,6.323534 0,9.32 0.55964,1.361695 1.37424,2.603955 2.4,3.66 1.02081,1.031107 2.2428,1.841226 3.59,2.38 1.40561,0.561607 2.90636,0.846817 4.42,0.84 0.80981,-0.0026 1.6161,-0.106786 2.4,-0.31 0.79636,-0.199929 1.56783,-0.488392 2.3,-0.86 0.72123,-0.371416 1.39312,-0.831661 2,-1.37 0.61025,-0.540083 1.14205,-1.162767 1.58,-1.85 v 4 h 3.33 V 15.59 Z m -0.37,24.58 c -1.76276,4.229524 -6.6195,6.23041 -10.85,4.47 v 0 c -0.97862,-0.401365 -1.86378,-1.000551 -2.6,-1.76 -0.7522,-0.76312 -1.34086,-1.671634 -1.73,-2.67 -0.41974,-1.066531 -0.63023,-2.203893 -0.62,-3.35 -0.0103,-1.129892 0.20027,-2.250911 0.62,-3.3 0.39328,-0.993283 0.98151,-1.897738 1.73,-2.66 0.74207,-0.76001 1.62521,-1.368023 2.6,-1.79 2.07874,-0.890012 4.43126,-0.890012 6.51,0 0.98149,0.434716 1.87338,1.048526 2.63,1.81 0.74927,0.763509 1.33458,1.672102 1.72,2.67 0.41464,1.036611 0.62516,2.14355 0.62,3.26 -1.3e-4,1.141508 -0.22084,2.272237 -0.65,3.33 z" fill="currentColor"/>
|
||||||
|
</symbol>
|
||||||
|
<use xlink:href="#logo"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.7 KiB |
@@ -2,4 +2,5 @@ last 2 chrome versions
|
|||||||
last 2 firefox versions
|
last 2 firefox versions
|
||||||
last 2 safari versions
|
last 2 safari versions
|
||||||
last 2 edge versions
|
last 2 edge versions
|
||||||
|
edge 18
|
||||||
firefox esr
|
firefox esr
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class AndroidIndexPlugin {
|
|||||||
const page = html`
|
const page = html`
|
||||||
<html lang="en-US">
|
<html lang="en-US">
|
||||||
<head>
|
<head>
|
||||||
<title>Firefox Send</title>
|
<title>Send</title>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta
|
<meta
|
||||||
name="viewport"
|
name="viewport"
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Custom Loaders
|
# Custom Loaders
|
||||||
|
|
||||||
## Generate Asset Map
|
## Android Index Plugin
|
||||||
|
|
||||||
This loader enumerates all the files in `assets/` so that `common/assets.js` can provide mappings from the source filename to the hashed filename used on the site.
|
Generates the `index.html` page for the native android client
|
||||||
|
|
||||||
## Version Plugin
|
## Version Plugin
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
const commit = require('git-rev-sync').short();
|
const gitRevSync = require('git-rev-sync');
|
||||||
const pkg = require('../package.json');
|
const pkg = require('../package.json');
|
||||||
|
|
||||||
|
let commit = 'unknown';
|
||||||
|
|
||||||
|
try {
|
||||||
|
commit = gitRevSync.short();
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Error fetching current git commit: ' + e);
|
||||||
|
}
|
||||||
|
|
||||||
const version = JSON.stringify({
|
const version = JSON.stringify({
|
||||||
commit,
|
commit,
|
||||||
source: pkg.homepage,
|
source: pkg.homepage,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const genmap = require('../build/generate_asset_map');
|
const genmap = require('./generate_asset_map');
|
||||||
const isServer = typeof genmap === 'function';
|
const isServer = typeof genmap === 'function';
|
||||||
let prefix = '';
|
let prefix = '';
|
||||||
let manifest = {};
|
let manifest = {};
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
# Common Code
|
# Common Code
|
||||||
|
|
||||||
This directory contains code loaded by both the frontend `app` and backend `server`. The code here can be challenging to understand at first because the contexts for the two (three counting the dev server) environments that include them are quite different, but the purpose of these modules are quite simple, to provide mappings from the source assets (`copy-16.png`) to the concrete production assets (`copy-16.db66e0bf.svg`).
|
This directory contains code loaded by both the frontend `app` and backend `server`. The code here can be challenging to understand at first because the contexts for the two (three counting the dev server) environments that include them are quite different, but the purpose of these modules are quite simple, to provide mappings from the source assets (`copy-16.png`) to the concrete production assets (`copy-16.db66e0bf.svg`).
|
||||||
|
|
||||||
|
## Generate Asset Map
|
||||||
|
|
||||||
|
This loader enumerates all the files in `assets/` so that `common/assets.js` can provide mappings from the source filename to the hashed filename used on the site.
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
Adapted from [this spreadsheet](https://airtable.com/shrkcBPOLkvNFOrpp)
|
Adapted from [this spreadsheet](https://airtable.com/shrkcBPOLkvNFOrpp)
|
||||||
|
|
||||||
- [ ] It should look and feel of an Android App
|
- [ ] It should look and feel of an Android App
|
||||||
- [ ] It should look and feel like the Firefox Send Web Client
|
- [ ] It should look and feel like the Send Web Client
|
||||||
|
|
||||||
### Main Screen
|
### Main Screen
|
||||||
- [ ] It should clearly Indicate the name of the product
|
- [ ] It should clearly Indicate the name of the product
|
||||||
@@ -59,7 +59,7 @@ Adapted from [this spreadsheet](https://airtable.com/shrkcBPOLkvNFOrpp)
|
|||||||
- [ ] It should allow users to opt into notifications when their link is downloaded
|
- [ ] It should allow users to opt into notifications when their link is downloaded
|
||||||
|
|
||||||
## Annotations on Mobile Spec
|
## Annotations on Mobile Spec
|
||||||
This document tracks differences between the UX spec for Firefox Send and the intended MVP.
|
This document tracks differences between the UX spec for Send and the intended MVP.
|
||||||
|
|
||||||
[Spec Link](https://mozilla.invisionapp.com/share/GNN6KKOQ5XS)
|
[Spec Link](https://mozilla.invisionapp.com/share/GNN6KKOQ5XS)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
## Requirements
|
## Requirements
|
||||||
This document describes how to do a full deployment of Firefox Send on your own Linux server. You will need:
|
This document describes how to do a full deployment of Send on your own Linux server. You will need:
|
||||||
|
|
||||||
* A working (and ideally somewhat recent) installation of NodeJS and NPM
|
* A working (and ideally somewhat recent) installation of NodeJS and NPM
|
||||||
* GIT
|
* GIT
|
||||||
@@ -12,14 +12,14 @@ For Debian/Ubuntu systems this probably just means something like this:
|
|||||||
|
|
||||||
## Building
|
## Building
|
||||||
* We assume an already configured virtual-host on your webserver with an existing empty htdocs folder
|
* We assume an already configured virtual-host on your webserver with an existing empty htdocs folder
|
||||||
* First, remove that htdocs folder - we will replace it with Firefox Send's version now
|
* First, remove that htdocs folder - we will replace it with Send's version now
|
||||||
* git clone https://github.com/mozilla/send.git htdocs
|
* git clone https://github.com/mozilla/send.git htdocs
|
||||||
* Make now sure you are NOT root but rather the user your webserver is serving files under (e.g. "su www-data" or whoever the owner of your htdocs folder is)
|
* Make now sure you are NOT root but rather the user your webserver is serving files under (e.g. "su www-data" or whoever the owner of your htdocs folder is)
|
||||||
* npm install
|
* npm install
|
||||||
* npm run build
|
* npm run build
|
||||||
|
|
||||||
## Running
|
## Running
|
||||||
To have a permanently running version of Firefox Send as a background process:
|
To have a permanently running version of Send as a background process:
|
||||||
|
|
||||||
* Create a file "run.sh" with:
|
* Create a file "run.sh" with:
|
||||||
```
|
```
|
||||||
@@ -29,11 +29,11 @@ nohup su www-data -c "npm run prod" 2>/dev/null &
|
|||||||
* chmod +x run.sh
|
* chmod +x run.sh
|
||||||
* ./run.sh
|
* ./run.sh
|
||||||
|
|
||||||
Now the Firefox Send backend should be running on port 1443. You can check with:
|
Now the Send backend should be running on port 1443. You can check with:
|
||||||
* telnet localhost 1443
|
* telnet localhost 1443
|
||||||
|
|
||||||
## Reverse Proxy
|
## Reverse Proxy
|
||||||
Of course, we don't want to expose the service on port 1443. Instead we want our normal webserver to forward all requests to Firefox send ("Reverse proxy").
|
Of course, we don't want to expose the service on port 1443. Instead we want our normal webserver to forward all requests to Send ("Reverse proxy").
|
||||||
|
|
||||||
# Apache webserver
|
# Apache webserver
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
Before building the Docker image, you must build the production assets:
|
Use `registry.gitlab.com/timvisee/send:latest` from [`timvisee/send`'s registry](https://gitlab.com/timvisee/send/container_registry) for the latest Docker image.
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
npm run build
|
docker pull registry.gitlab.com/timvisee/send:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
Then you can run either `docker build` or `docker-compose up`.
|
Or run `docker build -t send:latest .` to create an image locally or `docker-compose up` to run a full testable stack. *We don't recommend using docker-compose for production.*
|
||||||
|
|
||||||
|
|
||||||
## Environment variables:
|
## Environment variables:
|
||||||
|
|
||||||
@@ -20,6 +19,7 @@ Then you can run either `docker build` or `docker-compose up`.
|
|||||||
| `SENTRY_DSN` | Sentry DSN
|
| `SENTRY_DSN` | Sentry DSN
|
||||||
| `MAX_FILE_SIZE` | in bytes (defaults to 2147483648)
|
| `MAX_FILE_SIZE` | in bytes (defaults to 2147483648)
|
||||||
| `NODE_ENV` | "production"
|
| `NODE_ENV` | "production"
|
||||||
|
| `BASE_URL` | The HTTPS URL where traffic will be served (e.g. `https://send.firefox.com`)
|
||||||
|
|
||||||
## Example:
|
## Example:
|
||||||
|
|
||||||
@@ -29,5 +29,6 @@ $ docker run --net=host -e 'NODE_ENV=production' \
|
|||||||
-e 'REDIS_HOST=dyf9s2r4vo3.bolxr4.0001.usw2.cache.amazonaws.com' \
|
-e 'REDIS_HOST=dyf9s2r4vo3.bolxr4.0001.usw2.cache.amazonaws.com' \
|
||||||
-e 'SENTRY_CLIENT=https://51e23d7263e348a7a3b90a5357c61cb2@sentry.prod.mozaws.net/168' \
|
-e 'SENTRY_CLIENT=https://51e23d7263e348a7a3b90a5357c61cb2@sentry.prod.mozaws.net/168' \
|
||||||
-e 'SENTRY_DSN=https://51e23d7263e348a7a3b90a5357c61cb2:65e23d7263e348a7a3b90a5357c61c44@sentry.prod.mozaws.net/168' \
|
-e 'SENTRY_DSN=https://51e23d7263e348a7a3b90a5357c61cb2:65e23d7263e348a7a3b90a5357c61c44@sentry.prod.mozaws.net/168' \
|
||||||
mozilla/send:latest
|
-e 'BASE_URL=https://send.firefox.com' \
|
||||||
|
registry.gitlab.com/timvisee/send:latest
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# File Encryption
|
# File Encryption
|
||||||
|
|
||||||
Send use 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt files in the browser before uploading them to the server. The code is in [app/keychain.js](../app/keychain.js).
|
Send uses 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt files in the browser before uploading them to the server. The code is in [app/keychain.js](../app/keychain.js).
|
||||||
|
|
||||||
## Steps
|
## Steps
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
## How big of a file can I transfer with Firefox Send?
|
## How big of a file can I transfer with Send?
|
||||||
|
|
||||||
There is a 2.5GB file size limit built in to Send(1GB for non-signed in users), however, in practice you may
|
There is a 2.5GB file size limit built in to Send(1GB for non-signed in users), however, in practice you may
|
||||||
be unable to send files that large. Send encrypts and decrypts the files in
|
be unable to send files that large. Send encrypts and decrypts the files in
|
||||||
@@ -17,9 +17,9 @@ Many browsers support this standard and should work fine, but some have not
|
|||||||
implemented it yet (mobile browsers lag behind on this, in
|
implemented it yet (mobile browsers lag behind on this, in
|
||||||
particular).
|
particular).
|
||||||
|
|
||||||
## Why does Firefox Send require JavaScript?
|
## Why does Send require JavaScript?
|
||||||
|
|
||||||
Firefox Send uses JavaScript to:
|
Send uses JavaScript to:
|
||||||
|
|
||||||
- Encrypt and decrypt files locally on the client instead of the server.
|
- Encrypt and decrypt files locally on the client instead of the server.
|
||||||
- Render the user interface.
|
- Render the user interface.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en-US">
|
<html lang="en-US">
|
||||||
<head>
|
<head>
|
||||||
<title>Firefox Send</title>
|
<title>Send</title>
|
||||||
<link href="index.css" rel="stylesheet">
|
<link href="index.css" rel="stylesheet">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||||
</head>
|
</head>
|
||||||
@@ -14,4 +14,4 @@
|
|||||||
<script src="ios.js"></script>
|
<script src="ios.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|||||||
14614
package-lock.json
generated
118
package.json
@@ -1,10 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "firefox-send",
|
"name": "send",
|
||||||
"description": "File Sharing Experiment",
|
"description": "File Sharing Experiment",
|
||||||
"version": "3.0.18",
|
"version": "3.3.1",
|
||||||
"author": "Mozilla (https://mozilla.org)",
|
"author": "Mozilla (https://mozilla.org)",
|
||||||
"repository": "mozilla/send",
|
"contributors": [
|
||||||
"homepage": "https://github.com/mozilla/send/",
|
"Tim Visee <3a4fb3964f@sinenomine.email> (https://timvisee.com)"
|
||||||
|
],
|
||||||
|
"repository": "gitlab:timvisee/send",
|
||||||
|
"homepage": "https://gitlab.com/timvisee/send/",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -26,7 +29,7 @@
|
|||||||
"test:frontend": "cross-env NODE_ENV=development node test/frontend/runner.js",
|
"test:frontend": "cross-env NODE_ENV=development node test/frontend/runner.js",
|
||||||
"test:report": "nyc report --reporter=html",
|
"test:report": "nyc report --reporter=html",
|
||||||
"test-integration": "cross-env NODE_ENV=development wdio test/wdio.docker.conf.js",
|
"test-integration": "cross-env NODE_ENV=development wdio test/wdio.docker.conf.js",
|
||||||
"circleci-test-integration": "cross-env NODE_ENV=development wdio test/wdio.circleci.conf.js",
|
"circleci-test-integration": "echo 'webdriverio tests need to be updated to node 12'",
|
||||||
"start": "npm run clean && cross-env NODE_ENV=development L10N_DEV=true FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:8080 webpack-dev-server --mode=development",
|
"start": "npm run clean && cross-env NODE_ENV=development L10N_DEV=true FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:8080 webpack-dev-server --mode=development",
|
||||||
"android": "cross-env ANDROID=1 npm start",
|
"android": "cross-env ANDROID=1 npm start",
|
||||||
"prod": "node server/bin/prod.js"
|
"prod": "node server/bin/prod.js"
|
||||||
@@ -58,111 +61,105 @@
|
|||||||
"cache": true
|
"cache": true
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": "^12.16.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.6.0",
|
"@babel/core": "^7.12.3",
|
||||||
"@babel/plugin-proposal-class-properties": "^7.5.5",
|
"@babel/plugin-proposal-class-properties": "^7.12.1",
|
||||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||||
"@babel/preset-env": "^7.6.0",
|
"@babel/preset-env": "^7.12.1",
|
||||||
"@dannycoates/webcrypto-liner": "^0.1.37",
|
"@dannycoates/webcrypto-liner": "^0.1.37",
|
||||||
"@fullhuman/postcss-purgecss": "^1.2.0",
|
"@fullhuman/postcss-purgecss": "^1.3.0",
|
||||||
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
||||||
"@sentry/browser": "^5.6.3",
|
"@sentry/browser": "^5.27.0",
|
||||||
"asmcrypto.js": "^0.22.0",
|
"asmcrypto.js": "^0.22.0",
|
||||||
"babel-loader": "^8.0.6",
|
"babel-loader": "^8.0.6",
|
||||||
"babel-plugin-istanbul": "^5.2.0",
|
"babel-plugin-istanbul": "^5.2.0",
|
||||||
"base64-js": "^1.3.1",
|
"base64-js": "^1.3.1",
|
||||||
"content-disposition": "^0.5.3",
|
"content-disposition": "^0.5.3",
|
||||||
"copy-webpack-plugin": "^5.0.4",
|
"copy-webpack-plugin": "^5.1.2",
|
||||||
"core-js": "^3.2.1",
|
"core-js": "^3.4.0",
|
||||||
"crc": "^3.8.0",
|
"crc": "^3.8.0",
|
||||||
"cross-env": "^5.2.1",
|
"cross-env": "^6.0.3",
|
||||||
"css-loader": "^3.2.0",
|
"css-loader": "^3.6.0",
|
||||||
"css-mqpacker": "^7.0.0",
|
"css-mqpacker": "^7.0.0",
|
||||||
"cssnano": "^4.1.10",
|
"cssnano": "^4.1.10",
|
||||||
"eslint": "^6.3.0",
|
"eslint": "^6.6.0",
|
||||||
"eslint-config-prettier": "^6.2.0",
|
"eslint-config-prettier": "^6.14.0",
|
||||||
"eslint-plugin-mocha": "^6.1.0",
|
"eslint-plugin-mocha": "^6.2.1",
|
||||||
"eslint-plugin-node": "^9.2.0",
|
"eslint-plugin-node": "^10.0.0",
|
||||||
"eslint-plugin-security": "^1.4.0",
|
"eslint-plugin-security": "^1.4.0",
|
||||||
"expose-loader": "^0.7.5",
|
"expose-loader": "^0.7.5",
|
||||||
"extract-loader": "^3.1.0",
|
"extract-loader": "^3.2.0",
|
||||||
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
||||||
"fast-text-encoding": "^1.0.0",
|
"fast-text-encoding": "^1.0.3",
|
||||||
"file-loader": "^4.2.0",
|
"file-loader": "^4.2.0",
|
||||||
"git-rev-sync": "^1.12.0",
|
"git-rev-sync": "^1.12.0",
|
||||||
"html-loader": "^0.5.5",
|
"html-loader": "^0.5.5",
|
||||||
"http_ece": "^1.1.0",
|
"http_ece": "^1.1.0",
|
||||||
"husky": "^3.0.5",
|
"husky": "^3.0.9",
|
||||||
"intl-pluralrules": "^1.0.3",
|
"intl-pluralrules": "^1.2.2",
|
||||||
"lint-staged": "^9.2.5",
|
"lint-staged": "^9.4.2",
|
||||||
"mocha": "^6.2.0",
|
"mocha": "^6.2.2",
|
||||||
"morgan": "^1.9.1",
|
"morgan": "^1.9.1",
|
||||||
"nanobus": "^4.4.0",
|
"nanobus": "^4.4.0",
|
||||||
"nanohtml": "^1.8.1",
|
"nanohtml": "^1.9.0",
|
||||||
"nanotiming": "^7.3.1",
|
"nanotiming": "^7.3.1",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"nyc": "^14.1.1",
|
"nyc": "^14.1.1",
|
||||||
"postcss-loader": "^3.0.0",
|
"postcss-loader": "^3.0.0",
|
||||||
"postcss-preset-env": "^6.7.0",
|
"postcss-preset-env": "^6.7.0",
|
||||||
"prettier": "^1.18.2",
|
"prettier": "^1.19.1",
|
||||||
"proxyquire": "^2.1.3",
|
"proxyquire": "^2.1.3",
|
||||||
"puppeteer": "^1.19.0",
|
"puppeteer": "^2.0.0",
|
||||||
"raw-loader": "^3.1.0",
|
"raw-loader": "^3.1.0",
|
||||||
"redis-mock": "^0.46.0",
|
"redis-mock": "^0.47.0",
|
||||||
"rimraf": "^3.0.0",
|
"rimraf": "^3.0.0",
|
||||||
"script-loader": "^0.7.2",
|
"script-loader": "^0.7.2",
|
||||||
"sinon": "^7.4.2",
|
"sinon": "^7.5.0",
|
||||||
"string-hash": "^1.1.3",
|
"string-hash": "^1.1.3",
|
||||||
"stylelint": "^10.1.0",
|
"stylelint": "^13.7.2",
|
||||||
"stylelint-config-standard": "^18.3.0",
|
"stylelint-config-standard": "^19.0.0",
|
||||||
"stylelint-no-unsupported-browser-features": "^3.0.2",
|
"stylelint-no-unsupported-browser-features": "^4.0.0",
|
||||||
"svgo": "^1.3.0",
|
"svgo": "^1.3.2",
|
||||||
"svgo-loader": "^2.2.1",
|
"svgo-loader": "^2.2.1",
|
||||||
"tailwindcss": "^1.1.2",
|
"tailwindcss": "^1.9.5",
|
||||||
"val-loader": "^1.1.1",
|
"val-loader": "^1.1.1",
|
||||||
"wdio-docker-service": "^1.4.2",
|
|
||||||
"wdio-dot-reporter": "0.0.10",
|
|
||||||
"wdio-firefox-profile-service": "^0.1.3",
|
|
||||||
"wdio-mocha-framework": "^0.6.3",
|
|
||||||
"wdio-sauce-service": "^0.4.14",
|
|
||||||
"wdio-selenium-standalone-service": "0.0.12",
|
|
||||||
"wdio-spec-reporter": "^0.1.5",
|
|
||||||
"webdriverio": "^4.14.4",
|
|
||||||
"webpack": "4.38.0",
|
"webpack": "4.38.0",
|
||||||
"webpack-cli": "^3.3.8",
|
"webpack-cli": "^3.3.12",
|
||||||
"webpack-dev-middleware": "^3.7.1",
|
"webpack-dev-middleware": "^3.7.2",
|
||||||
"webpack-dev-server": "^3.8.0",
|
"webpack-dev-server": "^3.11.0",
|
||||||
"webpack-manifest-plugin": "^2.0.4",
|
"webpack-manifest-plugin": "^2.2.0",
|
||||||
"webpack-unassert-loader": "^1.2.0"
|
"webpack-unassert-loader": "^1.2.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dannycoates/express-ws": "^5.0.3",
|
"@dannycoates/express-ws": "^5.0.3",
|
||||||
"@fluent/bundle": "^0.13.0",
|
"@fluent/bundle": "^0.13.0",
|
||||||
"@fluent/langneg": "^0.3.0",
|
"@fluent/langneg": "^0.3.0",
|
||||||
"@google-cloud/storage": "^3.2.1",
|
"@google-cloud/storage": "^5.1.2",
|
||||||
"@sentry/node": "^5.6.2",
|
"@sentry/node": "^5.27.0",
|
||||||
"aws-sdk": "^2.524.0",
|
"aws-sdk": "^2.775.0",
|
||||||
"body-parser": "^1.19.0",
|
"body-parser": "^1.19.0",
|
||||||
"choo": "^7.0.0",
|
"choo": "^7.0.0",
|
||||||
"cldr-core": "^35.1.0",
|
"cldr-core": "^35.1.0",
|
||||||
"configstore": "github:dannycoates/configstore#master",
|
"configstore": "github:dannycoates/configstore#master",
|
||||||
"convict": "^5.1.0",
|
"convict": "^5.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"fxa-geodb": "^1.0.4",
|
"helmet": "^3.23.3",
|
||||||
"helmet": "^3.21.0",
|
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"mozlog": "^2.2.0",
|
"mozlog": "^2.2.0",
|
||||||
"node-fetch": "^2.6.0",
|
"node-fetch": "^2.6.1",
|
||||||
"redis": "^2.8.0",
|
"redis": "^2.8.0",
|
||||||
"selenium-standalone": "^6.15.6",
|
"selenium-standalone": "^6.20.1",
|
||||||
"ua-parser-js": "^0.7.20"
|
"ua-parser-js": "^0.7.22"
|
||||||
},
|
},
|
||||||
"availableLanguages": [
|
"availableLanguages": [
|
||||||
"en-US",
|
"en-US",
|
||||||
|
"an",
|
||||||
"ar",
|
"ar",
|
||||||
"ast",
|
"ast",
|
||||||
|
"azz",
|
||||||
|
"be",
|
||||||
"bn",
|
"bn",
|
||||||
"br",
|
"br",
|
||||||
"ca",
|
"ca",
|
||||||
@@ -181,13 +178,17 @@
|
|||||||
"es-MX",
|
"es-MX",
|
||||||
"et",
|
"et",
|
||||||
"eu",
|
"eu",
|
||||||
|
"fa",
|
||||||
"fi",
|
"fi",
|
||||||
"fr",
|
"fr",
|
||||||
"fy-NL",
|
"fy-NL",
|
||||||
|
"gn",
|
||||||
"he",
|
"he",
|
||||||
"hr",
|
"hr",
|
||||||
"hsb",
|
"hsb",
|
||||||
"hu",
|
"hu",
|
||||||
|
"hus",
|
||||||
|
"hy-AM",
|
||||||
"ia",
|
"ia",
|
||||||
"id",
|
"id",
|
||||||
"it",
|
"it",
|
||||||
@@ -196,6 +197,8 @@
|
|||||||
"kab",
|
"kab",
|
||||||
"ko",
|
"ko",
|
||||||
"lt",
|
"lt",
|
||||||
|
"meh",
|
||||||
|
"mix",
|
||||||
"ml",
|
"ml",
|
||||||
"nb-NO",
|
"nb-NO",
|
||||||
"nl",
|
"nl",
|
||||||
@@ -203,8 +206,10 @@
|
|||||||
"oc",
|
"oc",
|
||||||
"pa-IN",
|
"pa-IN",
|
||||||
"pl",
|
"pl",
|
||||||
|
"ppl",
|
||||||
"pt-BR",
|
"pt-BR",
|
||||||
"pt-PT",
|
"pt-PT",
|
||||||
|
"quc",
|
||||||
"ro",
|
"ro",
|
||||||
"ru",
|
"ru",
|
||||||
"sk",
|
"sk",
|
||||||
@@ -213,6 +218,7 @@
|
|||||||
"sr",
|
"sr",
|
||||||
"su",
|
"su",
|
||||||
"sv-SE",
|
"sv-SE",
|
||||||
|
"te",
|
||||||
"th",
|
"th",
|
||||||
"tr",
|
"tr",
|
||||||
"uk",
|
"uk",
|
||||||
|
|||||||
152
public/locales/an/send.ftl
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
title = Send
|
||||||
|
importingFile = Se ye importando…
|
||||||
|
encryptingFile = Se ye cifrando…
|
||||||
|
decryptingFile = Se ye descifrando…
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 descarga
|
||||||
|
*[other] { $num } descargas
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
[one] hora
|
||||||
|
*[other] { $num } horas
|
||||||
|
}
|
||||||
|
copiedUrl = Copiau!
|
||||||
|
unlockInputPlaceholder = Clau
|
||||||
|
unlockButtonLabel = Desblocar
|
||||||
|
downloadButtonLabel = Descargar
|
||||||
|
downloadFinish = Descarga completa
|
||||||
|
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||||
|
sendYourFilesLink = Preba Send
|
||||||
|
errorPageHeader = I ha habiu bell problema!
|
||||||
|
fileTooBig = Ixe fichero ye masiau gran pa cargar-lo. Ha de tener menos de { $size }
|
||||||
|
linkExpiredAlt = Lo vinclo ye caducau
|
||||||
|
notSupportedHeader = Lo suyo navegador no ye compatible
|
||||||
|
notSupportedLink = Per qué no ye compatible lo mío navegador?
|
||||||
|
notSupportedOutdatedDetail = Esta versión de Firefox no admite la tecnolochía web con que funciona lo Send. Habrás d'esviellar lo navegador.
|
||||||
|
updateFirefox = Esviellar Firefox
|
||||||
|
deletePopupCancel = Cancelar
|
||||||
|
deleteButtonHover = Borrar
|
||||||
|
footerLinkLegal = Aviso legal
|
||||||
|
footerLinkPrivacy = Privacidat
|
||||||
|
footerLinkCookies = Cookies
|
||||||
|
passwordTryAgain = La contrasenya ye incorrecta. Torne-lo a intentar.
|
||||||
|
javascriptRequired = Send necesita JavaScript
|
||||||
|
whyJavascript = Per qué Send necesita JavaScript?
|
||||||
|
enableJavascript = Activa JavaScript y torna-lo a intentar.
|
||||||
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
|
expiresHoursMinutes = { $hours } h { $minutes } min
|
||||||
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
|
expiresMinutes = { $minutes } min
|
||||||
|
# A short status message shown when the user enters a long password
|
||||||
|
maxPasswordLength = Maxima lonchitut d'a clau: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = No s'ha puesto definir la clau
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
-send-brand = Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Compartición de fichers simpla y privada
|
||||||
|
introDescription = { -send-brand } te permite de compartir fichers cifraus de cabo a cabo, y tamién un vinclo que expira automaticament. Asinas, puetz mantener en privau lo que compartes y asegurar-te de que los tuyos contenius no se quedan pa cutio en linia.
|
||||||
|
notifyUploadEncryptDone = Lo fichero s'ha cifrau y ye presto pa ninviar-se
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Caduca dimpués de { $downloadCount } u { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 minuto
|
||||||
|
*[other] { $num } minutos
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 día
|
||||||
|
*[other] { $num } días
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 semana
|
||||||
|
*[other] { $num } semanas
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 fichero
|
||||||
|
*[other] { $num } fichers
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = KB
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = MB
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = GB
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = Mida total: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Copiar lo vinclo que quiers compartir
|
||||||
|
copyLinkButton = Copiar lo vinclo
|
||||||
|
downloadTitle = Descargar los fichers
|
||||||
|
downloadDescription = Este fichero s'ha compartiu per medio de { -send-brand } con cifrau de cabo a cabo y un vinclo que caduca automaticament.
|
||||||
|
trySendDescription = Preba { -send-brand } pa una compartición de fichers simpla y segura.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Nomás se puet puyar 1 fitxer de vez.
|
||||||
|
*[other] Nomás se pueden puyar { $count } fichers de vez.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Nomás se permite 1 ficher.
|
||||||
|
*[other] Nomás se permiten { $count } fichers.
|
||||||
|
}
|
||||||
|
expiredTitle = Este vinclo ye caducau.
|
||||||
|
notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona millor con a zaguera versión de { -firefox } y funcionará con a versión mas recient d'a mayor parte de navegadors.
|
||||||
|
downloadFirefox = Descargar { -firefox }
|
||||||
|
legalTitle = Aviso de privacidat de { -send-short-brand }
|
||||||
|
legalDateStamp = Versió 1.0, con data d'o 12 de marzo de 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min
|
||||||
|
addFilesButton = Triar los fichers a cargar
|
||||||
|
uploadButton = Cargar
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Arrociega y suelta los fichers
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = u fes clic aquí pa ninviar dica { $size }
|
||||||
|
addPassword = Protecher con una clau
|
||||||
|
emailPlaceholder = Escribe la tuya adreza de correu
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Inicia una sesión pa ninviar dica { $size }
|
||||||
|
signInOnlyButton = Iniciar la sesión
|
||||||
|
accountBenefitTitle = Crea una cuenta de { -firefox } u dentra-ie
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Compartir fichers dica { $size }
|
||||||
|
accountBenefitDownloadCount = Compartir fichers con mas chent
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Mantiene los vinclos activos dica 1 dia
|
||||||
|
*[other] Mantiene los vinclos activos dica { $count } días
|
||||||
|
}
|
||||||
|
accountBenefitSync = Chestiona los fichers compartius dende qualsequier dispositivo
|
||||||
|
accountBenefitMoz = Descubre mas cosas sobre los atros servicios de { -mozilla }
|
||||||
|
signOut = Zarrar la sesión
|
||||||
|
okButton = Vale
|
||||||
|
downloadingTitle = Se ye descargando
|
||||||
|
noStreamsWarning = Este navegador talment no pueda descifrar un fichero tant gran.
|
||||||
|
noStreamsOptionCopy = Copia lo vinclo pa ubrir-lo en belatro navegador
|
||||||
|
noStreamsOptionFirefox = Preba lo nuestro navegador favorito
|
||||||
|
noStreamsOptionDownload = Continar con este navegador
|
||||||
|
downloadFirefoxPromo = Lo nuevo { -firefox } t'ofreix { -send-short-brand }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Comparte lo vinclo enta lo tuyo fichero:
|
||||||
|
shareLinkButton = Compartir lo vinclo
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Baixa-te «{ $name }» con { -send-brand }: compartición de fiches simpla y segura
|
||||||
|
trailheadPromo = I hai una manera de protecher la tuya privacidat. Une-te a Firefox.
|
||||||
|
learnMore = Mas información
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
title = فَيَرفُكس سِنْد
|
title = فَيَرفُكس سِنْد
|
||||||
siteFeedback = الانطباعات
|
|
||||||
importingFile = يستورد…
|
importingFile = يستورد…
|
||||||
encryptingFile = يعمّي…
|
encryptingFile = يعمّي…
|
||||||
decryptingFile = يفك التعمية…
|
decryptingFile = يفك التعمية…
|
||||||
@@ -56,6 +54,10 @@ passwordSetError = يجب ألا تُضبط كلمة السر هذه
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
|
-send-brand = Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
introTitle = شارِك ملفاتك بلا عناء وبخصوصية تامة
|
introTitle = شارِك ملفاتك بلا عناء وبخصوصية تامة
|
||||||
introDescription = يتيح لك { -send-brand } مشاركة الملفات عبر تعميتها من الطرفين وإتاحتها في رابط ينقضي أجله تلقائيا. هكذا يمكنك إبقاء ما شاركته خاصًا فتضمن بأن ملفاتك لن تبقى في الوِب أبد الدهر.
|
introDescription = يتيح لك { -send-brand } مشاركة الملفات عبر تعميتها من الطرفين وإتاحتها في رابط ينقضي أجله تلقائيا. هكذا يمكنك إبقاء ما شاركته خاصًا فتضمن بأن ملفاتك لن تبقى في الوِب أبد الدهر.
|
||||||
notifyUploadEncryptDone = اكتملت تعمية الملف وأصبح جاهزًا لإرساله
|
notifyUploadEncryptDone = اكتملت تعمية الملف وأصبح جاهزًا لإرساله
|
||||||
@@ -182,4 +184,5 @@ shareLinkDescription = شارِك الرابط الذي يصل إلى الملف
|
|||||||
shareLinkButton = شارِك الرابط
|
shareLinkButton = شارِك الرابط
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة
|
shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة
|
||||||
|
trailheadPromo = يمكنك حماية خصوصيتك، طبعا. انضم إلى فَيَرفُكس.
|
||||||
learnMore = اطّلع على المزيد.
|
learnMore = اطّلع على المزيد.
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Comentarios
|
|
||||||
importingFile = Importando...
|
importingFile = Importando...
|
||||||
encryptingFile = Cifrando...
|
encryptingFile = Cifrando...
|
||||||
decryptingFile = Descifrando...
|
decryptingFile = Descifrando...
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Desbloquiar
|
|||||||
downloadButtonLabel = Baxar
|
downloadButtonLabel = Baxar
|
||||||
downloadFinish = Completóse la descarga
|
downloadFinish = Completóse la descarga
|
||||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||||
sendYourFilesLink = Probar Firefox Send
|
sendYourFilesLink = Probar Send
|
||||||
errorPageHeader = ¡Daqué foi mal!
|
errorPageHeader = ¡Asocedió daqué malo!
|
||||||
fileTooBig = Esti ficheru ye mui grande como pa xubilu. Debería tener menos de { $size }.
|
fileTooBig = Esti ficheru ye mui grande como pa xubilu. Debería tener menos de { $size }.
|
||||||
linkExpiredAlt = Caducó l'enllaz
|
linkExpiredAlt = Caducó l'enllaz
|
||||||
notSupportedHeader = El to restolador nun ta sofitáu.
|
notSupportedHeader = El to restolador nun ta sofitáu.
|
||||||
notSupportedLink = ¿Por qué'l mio restolador nun ta sofitáu?
|
notSupportedLink = ¿Por qué'l mio restolador nun ta sofitáu?
|
||||||
notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox nun sofita la teunoloxía web qu'usa Firefox Send. Vas precisar anovar Firefox.
|
notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox nun sofita la teunoloxía web qu'usa Send. Vas precisar anovar el restolador.
|
||||||
updateFirefox = Anovar Firefox
|
updateFirefox = Anovar Firefox
|
||||||
deletePopupCancel = Encaboxar
|
deletePopupCancel = Encaboxar
|
||||||
deleteButtonHover = Desaniciar
|
deleteButtonHover = Desaniciar
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Llegal
|
|||||||
footerLinkPrivacy = Privacidá
|
footerLinkPrivacy = Privacidá
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = La contraseña ye incorreuta. Volvi tentalo.
|
passwordTryAgain = La contraseña ye incorreuta. Volvi tentalo.
|
||||||
javascriptRequired = Firefox Send rique JavaScript
|
javascriptRequired = Send rique JavaScript
|
||||||
whyJavascript = ¿Por qué Firefox Send rique JavaScript?
|
whyJavascript = ¿Por qué Send rique JavaScript?
|
||||||
enableJavascript = Activa JavaScript y volvi tentalo, por favor.
|
enableJavascript = Activa JavaScript y volvi tentalo, por favor.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -48,15 +46,15 @@ passwordSetError = Nun pudo afitase esta contraseña
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Compartición de ficheros privada y cenciella
|
introTitle = Compartición de ficheros privada y cenciella
|
||||||
|
introDescription = { -send-brand } déxate compartir ficheros con cifráu puntu a puntu y un enllaz que caduca automáticamente. D'esti mou, asegúreste de que lo que compartes ye privao y nun va tar siempres en llinia.
|
||||||
notifyUploadEncryptDone = El ficheru ta cifráu y preparáu pa unviase
|
notifyUploadEncryptDone = El ficheru ta cifráu y preparáu pa unviase
|
||||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
archiveExpiryInfo = Caduca tres { $downloadCount } ó { $timespan }
|
archiveExpiryInfo = Caduca dempués de { $downloadCount } ó { $timespan }
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 minutu
|
[one] 1 minutu
|
||||||
@@ -108,8 +106,10 @@ tooManyArchives =
|
|||||||
*[other] Namái se permiten { $count } archivos
|
*[other] Namái se permiten { $count } archivos
|
||||||
}
|
}
|
||||||
expiredTitle = Esti enllaz caducó.
|
expiredTitle = Esti enllaz caducó.
|
||||||
notSupportedDescription = { -send-brand } nun va funcionar con esti restolador. { -send-short-brand } funciona meyor cola versión última de { -firefox } y cola versión actual de la mayoría de restoladores.
|
notSupportedDescription = { -send-brand } nun va funcionar con esti restolador. { -send-short-brand } funciona meyor cola última versión de { -firefox } y l'actual de la mayoría de restoladores.
|
||||||
legalTitle = Noticia de privacidá de { -send-short-brand }
|
downloadFirefox = Baxar { -firefox }
|
||||||
|
legalTitle = Avisu de privacidá de { -send-short-brand }
|
||||||
|
legalDateStamp = Versión 1.0, con data del 12 de marzu de 2019
|
||||||
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m
|
expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m
|
||||||
addFilesButton = Esbillar los ficheros a unviar
|
addFilesButton = Esbillar los ficheros a unviar
|
||||||
@@ -123,15 +123,15 @@ addPassword = Protexer con una contraseña
|
|||||||
emailPlaceholder = Introduz el to corréu
|
emailPlaceholder = Introduz el to corréu
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Anicia sesión pa unviar hasta { $size }
|
signInSizeBump = Anicia sesión pa unviar hasta { $size }
|
||||||
signInButton = Rexistrase/aniciar sesión
|
signInOnlyButton = Aniciar sesión
|
||||||
accountBenefitTitle = Creación d'una cuenta { -firefox } o aniciu de sesión nella
|
accountBenefitTitle = Creación d'una cuenta de { -firefox } o aniciu de sesión nella
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Comparti ficheros d'hasta { $size }
|
accountBenefitLargeFiles = Comparti ficheros d'hasta { $size }
|
||||||
accountBenefitDownloadCount = Comparti ficheros con más xente
|
accountBenefitDownloadCount = Comparti ficheros con más xente
|
||||||
accountBenefitTimeLimit =
|
accountBenefitTimeLimit =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
[one] Caltén activos los enllaces demientres 1 día
|
[one] Caltién activos los enllaces demientres 1 día
|
||||||
*[other] Caltén activos los enllaces demientres 1 díes
|
*[other] Caltién activos los enllaces demientres { $count } díes
|
||||||
}
|
}
|
||||||
accountBenefitSync = Xestiona los ficheros compartíos dende cualesquier preséu
|
accountBenefitSync = Xestiona los ficheros compartíos dende cualesquier preséu
|
||||||
accountBenefitMoz = Deprendi más tocante a otros servicios de { -mozilla }
|
accountBenefitMoz = Deprendi más tocante a otros servicios de { -mozilla }
|
||||||
@@ -139,3 +139,5 @@ signOut = Zarrar sesión
|
|||||||
okButton = Aceutar
|
okButton = Aceutar
|
||||||
downloadingTitle = Baxando
|
downloadingTitle = Baxando
|
||||||
noStreamsWarning = Esti restolador quiciabes nun seya a descifrar un ficheru d'esti tamañu.
|
noStreamsWarning = Esti restolador quiciabes nun seya a descifrar un ficheru d'esti tamañu.
|
||||||
|
trailheadPromo = Hai un mou de protexer la to privacidá. Xúnite a Firefox.
|
||||||
|
learnMore = Deprender más.
|
||||||
|
|||||||
@@ -1,31 +1,7 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteSubtitle = web eksperiment
|
|
||||||
siteFeedback = Geri dönüş
|
|
||||||
uploadPageHeader = Məxfi, Şifrələnmiş Fayl Paylaşma
|
|
||||||
uploadPageExplainer = Fayllarınızı təhlükəsiz, məxfi, şifrələnmiş və daima onlayn qalmaması üçün avtomatik silinən keçidlə göndərin.
|
|
||||||
uploadPageLearnMore = Ətraflı öyrən
|
|
||||||
uploadPageDropMessage = Yükləmək üçün faylınızı buraya daşıyın
|
|
||||||
uploadPageSizeMessage = Xidmətin daha yaxşı işləməsi üçün faylınız 1 GB-dan az olmalıdır
|
|
||||||
uploadPageBrowseButton = Kompüterinizdən fayl seçin
|
|
||||||
uploadPageBrowseButton1 = Yüklənəcək faylı seçin
|
|
||||||
uploadPageMultipleFilesAlert = Birdən çox fayl və ya qovluq yükləmə hələlik dəstəklənmir.
|
|
||||||
uploadPageBrowseButtonTitle = Fayl yüklə
|
|
||||||
uploadingPageProgress = { $filename } ({ $size }) yüklənir
|
|
||||||
importingFile = İdxal edilir…
|
importingFile = İdxal edilir…
|
||||||
verifyingFile = Təsdiqlənir…
|
|
||||||
encryptingFile = Şifrələnir...
|
encryptingFile = Şifrələnir...
|
||||||
decryptingFile = Şifrə açılır...
|
decryptingFile = Şifrə açılır...
|
||||||
notifyUploadDone = Yükləməniz hazırdır.
|
|
||||||
uploadingPageMessage = Faylınız yükləndikdən sonra vaxtı çıxma seçimlərini qura biləcəksiz.
|
|
||||||
uploadingPageCancel = Yükləməni ləğv et
|
|
||||||
uploadCancelNotification = Yükləməniz ləğv edildi.
|
|
||||||
uploadingPageLargeFileMessage = Fayl böyükdür və yükləmək çox vaxt ala bilər. Səbirli olun!
|
|
||||||
uploadingFileNotification = Yükləmə bitdiyində xəbər ver.
|
|
||||||
uploadSuccessConfirmHeader = Göndərməyə hazır
|
|
||||||
uploadSvgAlt = Yüklə
|
|
||||||
uploadSuccessTimingHeader = Faylınızın keçidinin 1 endirmədən və ya 24 saatdan sonra vaxtı çıxacaq.
|
|
||||||
expireInfo = Faylınız üçün keçidin vaxtı { $downloadCount } sonra və ya { $timespan } tarixində keçəcək.
|
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 endirmə
|
[one] 1 endirmə
|
||||||
@@ -36,86 +12,58 @@ timespanHours =
|
|||||||
[one] 1 saat
|
[one] 1 saat
|
||||||
*[other] { $num } saat
|
*[other] { $num } saat
|
||||||
}
|
}
|
||||||
copyUrlFormLabelWithName = Faylınızı göndərmək üçün keçidi köçürün: { $filename }
|
|
||||||
copyUrlFormButton = Buferə köçür
|
|
||||||
copiedUrl = Köçürüldü!
|
copiedUrl = Köçürüldü!
|
||||||
deleteFileButton = Faylı sil
|
|
||||||
sendAnotherFileLink = Başqa fayl göndər
|
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
downloadAltText = Endir
|
|
||||||
downloadsFileList = Endirmələr
|
|
||||||
# Used as header in a column indicating the amount of time left before a
|
|
||||||
# download link expires (e.g. "10h 5m")
|
|
||||||
timeFileList = Vaxt
|
|
||||||
# Used as header in a column indicating the number of times a file has been
|
|
||||||
# downloaded
|
|
||||||
downloadFileName = { $filename } faylını endir
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
unlockInputLabel = Parol daxil edin
|
|
||||||
unlockInputPlaceholder = Parol
|
unlockInputPlaceholder = Parol
|
||||||
unlockButtonLabel = Aç
|
unlockButtonLabel = Aç
|
||||||
downloadFileTitle = Şifrələnmiş Faylı Endir
|
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
downloadMessage = Yoldaşınız Firefox Send ilə sizə fayl göndərir, fayllarınızı təhlükəsiz, məxfi, şifrələnmiş və daima onlayn qalmaması üçün avtomatik silən fayl göndərmə xidməti.
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = Endir
|
downloadButtonLabel = Endir
|
||||||
downloadNotification = Endirməniz tamamlandı.
|
|
||||||
downloadFinish = Endirmə Tamamlandı
|
downloadFinish = Endirmə Tamamlandı
|
||||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
|
||||||
fileSizeProgress = ({ $partialSize } / { $totalSize })
|
fileSizeProgress = ({ $partialSize } / { $totalSize })
|
||||||
# Firefox Send is a brand name and should not be localized.
|
sendYourFilesLink = Send Yoxla
|
||||||
sendYourFilesLink = Firefox Send Yoxla
|
|
||||||
downloadingPageProgress = { $filename } faylı ({ $size }) endirilir
|
|
||||||
downloadingPageMessage = Lütfən faylı endirib şifrəsini açarkən vərəqi açıq buraxın.
|
|
||||||
errorAltText = Yükləmə xətası
|
|
||||||
errorPageHeader = Nəsə səhv getdi!
|
errorPageHeader = Nəsə səhv getdi!
|
||||||
errorPageMessage = Faylı yüklərkən xəta baş verdi.
|
|
||||||
errorPageLink = Başqa fayl göndər
|
|
||||||
fileTooBig = Fayl yükləmək üçün çox böyükdür. Fayl { $size }-dan az olmalıdır.
|
fileTooBig = Fayl yükləmək üçün çox böyükdür. Fayl { $size }-dan az olmalıdır.
|
||||||
linkExpiredAlt = Keçidin vaxtı çıxıb
|
linkExpiredAlt = Keçidin vaxtı çıxıb
|
||||||
expiredPageHeader = Keçidin vaxtı çıxıb və ya heç vaxt olmayıb!
|
|
||||||
notSupportedHeader = Səyyahınız dəstəklənmir.
|
notSupportedHeader = Səyyahınız dəstəklənmir.
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
notSupportedDetail = Heyf ki, bu səyyah Firefox Send-ə güc verən web texnologiyalarını dəstəkləmir. Fərqli bir səyyah yoxlamalısınız. Biz Firefox məsləhət görürük!
|
|
||||||
notSupportedLink = Səyyahım niyə dəstəklənmir?
|
notSupportedLink = Səyyahım niyə dəstəklənmir?
|
||||||
notSupportedOutdatedDetail = Heyf ki, Firefox səyyahının bu versiyası Firefox Send-ə güc verən web texnologiyalarını dəstəkləmir. Səyyahınızı yeniləməlisiniz.
|
notSupportedOutdatedDetail = Heyf ki, Firefox səyyahının bu versiyası Send-ə güc verən web texnologiyalarını dəstəkləmir. Səyyahınızı yeniləməlisiniz.
|
||||||
updateFirefox = Firefox-u Yenilə
|
updateFirefox = Firefox-u Yenilə
|
||||||
downloadFirefoxButtonSub = Pulsuz Endir
|
|
||||||
uploadedFile = Fayl
|
|
||||||
copyFileList = Keçidi Köçürt
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = Vaxtı çıxma tarixi
|
|
||||||
deleteFileList = Sil
|
|
||||||
nevermindButton = Vacib deyil
|
|
||||||
legalHeader = Şərtlər və Məxfilik
|
|
||||||
legalNoticeTestPilot = Firefox Send Test Pilot eksperimentidir, Test Pilot <a>Xidmət Şərtləri</a> və <a>Məxfilik Bildirişi</a>-nə tabedir. Bu eksperiment və məlumat yığma haqqında <a>buradan</a> öyrənə bilərsiz.
|
|
||||||
legalNoticeMozilla = Firefox Send saytının istifadəsi həmçinin Mozilla-nın <a>Saytlar üçün Məxfilik Bildirişi</a> və <a>Sayt İstifadə Şərtləri</a>-nə tabedir.
|
|
||||||
deletePopupText = Fayl silinsin?
|
|
||||||
deletePopupYes = Bəli
|
|
||||||
deletePopupCancel = Ləğv et
|
deletePopupCancel = Ləğv et
|
||||||
deleteButtonHover = Sil
|
deleteButtonHover = Sil
|
||||||
copyUrlHover = Keçidi Köçürt
|
|
||||||
footerLinkLegal = Hüquqi
|
footerLinkLegal = Hüquqi
|
||||||
# Test Pilot is a proper name and should not be localized.
|
|
||||||
footerLinkAbout = Test Pilot Haqqında
|
|
||||||
footerLinkPrivacy = Məxfilik
|
footerLinkPrivacy = Məxfilik
|
||||||
footerLinkTerms = Şərtlər
|
|
||||||
footerLinkCookies = Çərəzlər
|
footerLinkCookies = Çərəzlər
|
||||||
requirePasswordCheckbox = Bu faylı endirmək üçün parol tələb et
|
|
||||||
addPasswordButton = Parol əlavə et
|
|
||||||
changePasswordButton = Dəyişdir
|
|
||||||
passwordTryAgain = Səhv parol. Təkrar yoxlayın.
|
passwordTryAgain = Səhv parol. Təkrar yoxlayın.
|
||||||
reportIPInfringement = Əqli-mülkiyyət pozuntusu bildir
|
javascriptRequired = Send üçün JavaScript lazımdır
|
||||||
javascriptRequired = Firefox Send üçün JavaScript lazımdır
|
whyJavascript = Send niyə JavaScript tələb edir?
|
||||||
whyJavascript = Firefox Send niyə JavaScript tələb edir?
|
|
||||||
enableJavascript = Lütfən JavaScript-i aktiv edib təkrar yoxlayın.
|
enableJavascript = Lütfən JavaScript-i aktiv edib təkrar yoxlayın.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours } saat { $minutes } dəq
|
expiresHoursMinutes = { $hours } saat { $minutes } dəq
|
||||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
expiresMinutes = { $minutes } dəq
|
expiresMinutes = { $minutes } dəq
|
||||||
# A short status message shown when a password is successfully set
|
|
||||||
passwordIsSet = Parol quruldu
|
|
||||||
# A short status message shown when the user enters a long password
|
# A short status message shown when the user enters a long password
|
||||||
maxPasswordLength = Maksimum parol uzunluğu: { $length }
|
maxPasswordLength = Maksimum parol uzunluğu: { $length }
|
||||||
# A short status message shown when there was an error setting the password
|
# A short status message shown when there was an error setting the password
|
||||||
passwordSetError = Parol qurula bilmədi
|
passwordSetError = Parol qurula bilmədi
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
-send-brand = Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = KB
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = MB
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = GB
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
copyLinkButton = Keçidi köçür
|
||||||
|
uploadButton = Yüklə
|
||||||
|
signInOnlyButton = Daxil ol
|
||||||
|
signOut = Çıx
|
||||||
|
okButton = Tamam
|
||||||
|
downloadingTitle = Endirilir
|
||||||
|
shareLinkButton = Keçidi paylaş
|
||||||
|
|||||||
143
public/locales/azz/send.ftl
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
title = Send
|
||||||
|
importingFile = Mokalakijtok…
|
||||||
|
encryptingFile = Motatijtok…
|
||||||
|
decryptingFile = Kichiujtok se uelis kiixtajtoltis ya…
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
*[undefined] 1 kitemouijtok / { $num } kintemouijtok
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
*[undefined] 1 hora / { $num } hora
|
||||||
|
}
|
||||||
|
copiedUrl = ¡Moixkopinak!
|
||||||
|
unlockInputPlaceholder = Ichtakatajtol
|
||||||
|
unlockButtonLabel = Xikajchiua tein amo kikaua maj tekiti
|
||||||
|
downloadButtonLabel = Xiktemoui
|
||||||
|
downloadFinish = Nochi motemouij ya
|
||||||
|
fileSizeProgress = ({ $partialSize } itech { $totalSize })
|
||||||
|
sendYourFilesLink = Xikejeko Send
|
||||||
|
errorPageHeader = ¡Tensa amo kuali kisak!
|
||||||
|
fileTooBig = Nejin tajkuilol semi ueyi. Moneki amo panos { $size }
|
||||||
|
linkExpiredAlt = Nejin tein tikpatskilij amo tekititok ya
|
||||||
|
notSupportedHeader = Monavegador amo kualtia.
|
||||||
|
notSupportedLink = ¿Keyej nonavegador amo kualtia?
|
||||||
|
notSupportedOutdatedDetail = Tetayokoltij, Firefox tein tikuitok amo kiselia tepostekitilis tecnología web tein ika tekiti Send. Moneki tikyankuilis monavegador.
|
||||||
|
updateFirefox = Maj Firefox moyankuili
|
||||||
|
deletePopupCancel = Maj motsakuili uan amo tami tein kichiujtok
|
||||||
|
deleteButtonHover = Maj majchiua
|
||||||
|
footerLinkLegal = Keniuj motekitiltis
|
||||||
|
footerLinkPrivacy = Keniuj tikyekpiaj tein tikseliaj
|
||||||
|
footerLinkCookies = Cookies
|
||||||
|
passwordTryAgain = Amo yektik ichtakatajtol. Oksepa xikijkuilo.
|
||||||
|
javascriptRequired = Send kineki maj moajsi JavaScript
|
||||||
|
whyJavascript = ¿Keyej Send kineki maj moajsi JavaScript?
|
||||||
|
enableJavascript = Se kualtakayot, xikaua maj peua tekiti JavaScript uan oksepa xikejeko.
|
||||||
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
|
expiresMinutes = { $minutes }m
|
||||||
|
# A short status message shown when the user enters a long password
|
||||||
|
maxPasswordLength = Keniuj ueyak ichtakatajtol, maj amo pano: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = Nejin ichtakatajtol amo uel kiixtaliani
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
-send-brand = Send
|
||||||
|
-send-short-brand = Xiktitani
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Amo ouij uan ichtaka xikinpanoltili oksekin motajkuiloluan archivos
|
||||||
|
introDescription = { -send-brand } mitspaleuia uan ijkon tikinpanoltilis oksekin motajkuiloluan archivos ika tapoualmej tein amo aksa uelis kiajsikamatis, uan no kitemaka kampa se kipatskilis tein niman ixpoliui. Ijkuin uelis tikichtakaeuas tein tikintitanilis oksekin uan tikyekmatis tein moaxka amo nochipaya mokauas itech Internet.
|
||||||
|
notifyUploadEncryptDone = Moarchivo moijkuiloj ya kemej amo akin uelis kiixtajtoltis uan se uelis kititanis ya
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Poliui ijkuak tiajsis { $downloadCount } oso { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
*[undefined] 1 minuto / { $num } minuto
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
*[undefined] 1 tonal / { $num } tonalmej
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
*[undefined] 1 semana / { $num } semana
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
*[undefined] 1 archivo / { $num } archivos
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = KB
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = MB
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = GB
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = Nochi tamachiua: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Xikixkopina tein se kipatskilis uan xikinpanoltili oksekin moarchivo:
|
||||||
|
copyLinkButton = Xikixkopina tein se kipatskilis
|
||||||
|
downloadTitle = Xiktemoui tajkuilolmej archivos
|
||||||
|
downloadDescription = Nejin archivo mopanoltij itechkopa { -send-brand } ika tapoualmej tein amo aksa uelis kiajsikamatis, uan no tein ika se kipatskilis tein niman ixpoliui.
|
||||||
|
trySendDescription = Xikejeko { -send-brand } ijkon amo ouij uelis tikinpanoltilis oksekin motajkuiloluan archivos uan tikyekmatis ke amo tej kipanos.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
*[other] Sayoj { $count } tajkuilolmej archivos uelis tikolochtejkoltis saj.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
*[other] Sayoj { $count } tajkuilolmej archivos uelis moajsiskej saj.
|
||||||
|
}
|
||||||
|
expiredTitle = Nejin tein tikpatskilij amo tekititos ok.
|
||||||
|
notSupportedDescription = { -send-brand } amo tekiti ika nejin navegador. { -send-short-brand } okachi kuali tekiti tein ika okachi yankuik { -firefox }, uan no tekitis tein ika okachi yankuikej tel miak navegadores.
|
||||||
|
downloadFirefox = Xiktemoui { -firefox }
|
||||||
|
legalTitle = { -send-short-brand } tanauatia ika yekpialis tein moaxka itech tepos
|
||||||
|
legalDateStamp = Versión 1.0 tein kikixtijkej 12 tonal metsti marzo 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days }t { $hours }h { $minutes }m
|
||||||
|
addFilesButton = Xikinixpejpena tajkuilolmej archivos tein tikintejkoltis
|
||||||
|
uploadButton = Xiktejkolti
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Xikintilana uan xikinkajkaua tajkuilolmej archivos
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = oso xikpatskili uan tiktitanis, sayoj tein amo panoua { $size }
|
||||||
|
addPassword = Xikyekpia ika se ichtakatajtol
|
||||||
|
emailPlaceholder = Xikijkuilo mocorreo itech tepos
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Xikalakteua uan uelis tiktitanis tein amo panos { $size }
|
||||||
|
signInOnlyButton = Kampa se kalakteua
|
||||||
|
accountBenefitTitle = Ximochiuili se cuenta itech { -firefox } oso xikalakteua
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Xikintitani tajkuilolmej archivos tein amo panouaj { $size }
|
||||||
|
accountBenefitDownloadCount = Xikintitanili tajkuilolmej archivos oksekin
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
*[undefined] Kampa se kipatskilis maj kisentokakan kualtiakan se tonal ok / { $count } tonalmej ok
|
||||||
|
}
|
||||||
|
accountBenefitSync = Itech tein yeski tepos xikixyekana motajkuiloluan archivos tein tikinpanoltilij oksekin
|
||||||
|
accountBenefitMoz = Okachi tikmatis okseki tapaleuilmej tein kitemaka { -mozilla }
|
||||||
|
signOut = Kampa se kisa
|
||||||
|
okButton = Kuali yetok
|
||||||
|
downloadingTitle = Kitemouijtok
|
||||||
|
noStreamsWarning = Xa navegador amo uelis kitalij nejin tajkuilol archivo tein tel ueyi kemej se uelis kiyekixtajtoltis ya.
|
||||||
|
noStreamsOptionCopy = Xikixkopina tein se kipatskilis uan ijkon se uelis kitatapos itech okse navegador
|
||||||
|
noStreamsOptionFirefox = Xikejeko navegador tein semi techuelita
|
||||||
|
noStreamsOptionDownload = Maj niksentoka niktatekiujti nejin navegador
|
||||||
|
downloadFirefoxPromo = Yankuik { -firefox } mitsixpantilia { -send-short-brand }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Xikinpanoltili oksekin tein se kipatskilis uan teuika motajkuilol archivo:
|
||||||
|
shareLinkButton = Kampa se kipatskilis tein uelis tikinpanoltilis oksekin
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Xiktemoui “{ $name }” ika { -send-brand }: amo ouij uelis tikinpanoltilis oksekin motajkuiloluan archivos uan tikyekmatis ke amo tej kipanos
|
||||||
|
trailheadPromo = Kemaj, uelis tikyekpias tein moaxka itech tepos. Xipoui Firefox.
|
||||||
|
learnMore = Xiktemoui tajkuilolmej archivos.
|
||||||
161
public/locales/be/send.ftl
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
title = Send
|
||||||
|
importingFile = Імпартаванне...
|
||||||
|
encryptingFile = Зашыфроўка...
|
||||||
|
decryptingFile = Расшыфроўка...
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } сцягванне
|
||||||
|
[few] { $num } сцягванні
|
||||||
|
*[many] { $num } сцягванняў
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } гадзіна
|
||||||
|
[few] { $num } гадзіны
|
||||||
|
*[many] { $num } гадзін
|
||||||
|
}
|
||||||
|
copiedUrl = Скапіявана!
|
||||||
|
unlockInputPlaceholder = Пароль
|
||||||
|
unlockButtonLabel = Разблакаваць
|
||||||
|
downloadButtonLabel = Сцягнуць
|
||||||
|
downloadFinish = Сцягванне скончана
|
||||||
|
fileSizeProgress = ({ $partialSize } з { $totalSize })
|
||||||
|
sendYourFilesLink = Паспрабуйце Send
|
||||||
|
errorPageHeader = Нешта пайшло не так!
|
||||||
|
fileTooBig = Гэты файл надта вялікі. Ён мусіць быць меншым за { $size }
|
||||||
|
linkExpiredAlt = Тэрмін дзеяння спасылкі сышоў
|
||||||
|
notSupportedHeader = Ваш браўзер не падтрымліваецца.
|
||||||
|
notSupportedLink = Чаму мой браўзер не падтрымліваецца?
|
||||||
|
notSupportedOutdatedDetail = На жаль, гэтая версія Firefox не падтрымлівае вэб-тэхналогію, што забяспечвае працу Send. Вам трэба абнавіць свой браўзер.
|
||||||
|
updateFirefox = Абнавіць Firefox
|
||||||
|
deletePopupCancel = Скасаваць
|
||||||
|
deleteButtonHover = Выдаліць
|
||||||
|
footerLinkLegal = Прававыя звесткі
|
||||||
|
footerLinkPrivacy = Прыватнасць
|
||||||
|
footerLinkCookies = Кукі
|
||||||
|
passwordTryAgain = Некарэктны пароль. Паспрабуйце зноў.
|
||||||
|
javascriptRequired = Для Send неабходны JavaScript
|
||||||
|
whyJavascript = Чаму для Send неабходны JavaScript?
|
||||||
|
enableJavascript = Калі ласка, уключыце JavaScript і паспрабуйце зноў.
|
||||||
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
|
expiresHoursMinutes = { $hours } г. { $minutes } хв.
|
||||||
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
|
expiresMinutes = { $minutes } хв.
|
||||||
|
# A short status message shown when the user enters a long password
|
||||||
|
maxPasswordLength = Максімальная даўжыня пароля: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = Гэты пароль немагчыма паставіць
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
-send-brand = Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Просты і прыватны абмен файламі
|
||||||
|
introDescription = { -send-brand } дазваляе вам абменьвацца файламі са скразным шыфраваннем і спасылкамі з абмежаваным тэрмінам дзеяння. Такім чынам, вы можаце дзяліцца файламі прыватна і быць упэўненым, што яны не застануцца ў сеціве назаўжды.
|
||||||
|
notifyUploadEncryptDone = Ваш файл зашыфраваны і гатовы да адпраўкі
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Тэрмін дзеяння сыдзе праз { $downloadCount } або { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } хвіліна
|
||||||
|
[few] { $num } хвіліны
|
||||||
|
*[many] { $num } хвілін
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } дзень
|
||||||
|
[few] { $num } дні
|
||||||
|
*[many] { $num } дзён
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } тыдзень
|
||||||
|
[few] { $num } тыдні
|
||||||
|
*[many] { $num } тыдняў
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } файл
|
||||||
|
[few] { $num } файлы
|
||||||
|
*[many] { $num } файлаў
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = Б
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = КБ
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = МБ
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = ГБ
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num } { $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = Агульны памер: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Скапіруйце спасылку, каб падзяліцца сваім файлам:
|
||||||
|
copyLinkButton = Скапіраваць спасылку
|
||||||
|
downloadTitle = Сцягнуць файлы
|
||||||
|
downloadDescription = Гэтым файлам падзяліліся праз { -send-brand } са скразным шыфраваннем і спасылкай з абмежаваным тэрмінам дзеяння.
|
||||||
|
trySendDescription = Паспрабуйце { -send-brand } для простага і бяспечнага абмену файламі.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Толькі { $count } файл можна загрузіць за раз.
|
||||||
|
[few] Толькі { $count } файлы можна загрузіць за раз.
|
||||||
|
*[many] Толькі { $count } файлаў можна загрузіць за раз.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Толькі { $count } архіў дазволены.
|
||||||
|
[few] Толькі { $count } архівы дазволены.
|
||||||
|
*[many] Толькі { $count } архіваў дазволена.
|
||||||
|
}
|
||||||
|
expiredTitle = Тэрмін дзеяння гэтай спасылкі сышоў.
|
||||||
|
notSupportedDescription = { -send-brand } не будзе працаваць у гэтым браўзеры. Лепей за ўсё { -send-short-brand } працуе з апошняй версіяй { -firefox } і будзе працаваць з бягучай версіяй большасці браўзераў.
|
||||||
|
downloadFirefox = Сцягнуць { -firefox }
|
||||||
|
legalTitle = Палітыка прыватнасці { -send-short-brand }
|
||||||
|
legalDateStamp = Версія 1.0 ад 12 сакавіка 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days } д. { $hours } г. { $minutes } хв.
|
||||||
|
addFilesButton = Выберыце файлы для загрузкі
|
||||||
|
uploadButton = Загрузіць
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Перацягніце файлы сюды
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = або клікніце, каб адправіць да { $size }:
|
||||||
|
addPassword = Абараніць паролем
|
||||||
|
emailPlaceholder = Увядзіце сваю электронную пошту
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Увайдзіце, каб адпраўляць да { $size }
|
||||||
|
signInOnlyButton = Увайсці
|
||||||
|
accountBenefitTitle = Стварыце ўліковы запіс { -firefox } або ўвайдзіце
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Дзяліцеся файламі да { $size }
|
||||||
|
accountBenefitDownloadCount = Дзяліцеся файламі з большай колькасцю людзей
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Трымайце спасылкі актыўнымі да { $count } дня
|
||||||
|
[few] Трымайце спасылкі актыўнымі да { $count } дзён
|
||||||
|
*[many] Трымайце спасылкі актыўнымі да { $count } дзён
|
||||||
|
}
|
||||||
|
accountBenefitSync = Кіруйце адпраўленымі файламі з любой прылады
|
||||||
|
accountBenefitMoz = Даведайцеся пра іншыя сэрвісы { -mozilla }
|
||||||
|
signOut = Выйсці
|
||||||
|
okButton = ОК
|
||||||
|
downloadingTitle = Сцягваецца
|
||||||
|
noStreamsWarning = Гэты браўзер не мае магчымасці расшыфраваць такі вялікі файл.
|
||||||
|
noStreamsOptionCopy = Скапіруйце спасылку, каб адкрыць у іншым браўзеры
|
||||||
|
noStreamsOptionFirefox = Паспрабуйце наш любімы браўзер
|
||||||
|
noStreamsOptionDownload = Працягнуць з гэтым браўзерам
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } прыйшоў да вас з цалкам новага { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Падзяліцеся спасылкай на свой файл:
|
||||||
|
shareLinkButton = Падзяліцца спасылкай
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Сцягніце «{ $name }» з { -send-brand }: простага і бяспечнага файлаабменніка
|
||||||
|
trailheadPromo = Ёсць спосаб абараніць вашу прыватнасць. Далучайцеся да Firefox.
|
||||||
|
learnMore = Падрабязней.
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = প্রতিক্রিয়া
|
|
||||||
importingFile = ইম্পোর্ট হচ্ছে...
|
importingFile = ইম্পোর্ট হচ্ছে...
|
||||||
encryptingFile = ইনক্রিপট হচ্ছে...
|
encryptingFile = ইনক্রিপট হচ্ছে...
|
||||||
decryptingFile = ডিক্রিপট হচ্ছে...
|
decryptingFile = ডিক্রিপট হচ্ছে...
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = আনলক করুন
|
|||||||
downloadButtonLabel = ডাউনলোড
|
downloadButtonLabel = ডাউনলোড
|
||||||
downloadFinish = ডাউনলোড সম্পন্ন
|
downloadFinish = ডাউনলোড সম্পন্ন
|
||||||
fileSizeProgress = ({ $totalSize } এর { $partialSize })
|
fileSizeProgress = ({ $totalSize } এর { $partialSize })
|
||||||
sendYourFilesLink = Firefox Send পরখ করে দেখুন
|
sendYourFilesLink = Send পরখ করে দেখুন
|
||||||
errorPageHeader = কোন সমস্যা হয়েছে!
|
errorPageHeader = কোন সমস্যা হয়েছে!
|
||||||
fileTooBig = ফাইলটি আপলোড করার জন্যে খুব বড়। এটি { $size } এর চেয়ে কম হওয়া উচিত।
|
fileTooBig = ফাইলটি আপলোড করার জন্যে খুব বড়। এটি { $size } এর চেয়ে কম হওয়া উচিত।
|
||||||
linkExpiredAlt = লিঙ্ক মেয়াদউত্তীর্ণ হয়েছে
|
linkExpiredAlt = লিঙ্ক মেয়াদউত্তীর্ণ হয়েছে
|
||||||
notSupportedHeader = আপনার ব্রাউজার সমর্থিত নয়।
|
notSupportedHeader = আপনার ব্রাউজার সমর্থিত নয়।
|
||||||
notSupportedLink = আমার ব্রাউজার কেন সমর্থিত নয়?
|
notSupportedLink = আমার ব্রাউজার কেন সমর্থিত নয়?
|
||||||
notSupportedOutdatedDetail = দুর্ভাগ্যবশত Firefox এই সংস্করণটি ওয়েব প্রযুক্তিকে সমর্থন করে না যা Firefox Send কে সমর্থন করে। আপনাকে আপনার ব্রাউজারটি আপডেট করতে হবে।
|
notSupportedOutdatedDetail = দুর্ভাগ্যবশত Firefox এই সংস্করণটি ওয়েব প্রযুক্তিকে সমর্থন করে না যা Send কে সমর্থন করে। আপনাকে আপনার ব্রাউজারটি আপডেট করতে হবে।
|
||||||
updateFirefox = Firefox হালনাগাদ করুন
|
updateFirefox = Firefox হালনাগাদ করুন
|
||||||
deletePopupCancel = বাতিল
|
deletePopupCancel = বাতিল
|
||||||
deleteButtonHover = মুছে ফেলুন
|
deleteButtonHover = মুছে ফেলুন
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = আইনগত
|
|||||||
footerLinkPrivacy = গোপনীয়তা
|
footerLinkPrivacy = গোপনীয়তা
|
||||||
footerLinkCookies = কুকি
|
footerLinkCookies = কুকি
|
||||||
passwordTryAgain = ভুল পাসওয়ার্ড। আবার চেষ্টা করুন।
|
passwordTryAgain = ভুল পাসওয়ার্ড। আবার চেষ্টা করুন।
|
||||||
javascriptRequired = Firefox Send এর জাভাস্ক্রিপ্ট প্রয়োজন।
|
javascriptRequired = Send এর জাভাস্ক্রিপ্ট প্রয়োজন।
|
||||||
whyJavascript = কেন Firefox Send এর জাভাস্ক্রিপ্ট প্রয়োজন?
|
whyJavascript = কেন Send এর জাভাস্ক্রিপ্ট প্রয়োজন?
|
||||||
enableJavascript = জাভাস্ক্রিপ্ট সক্রিয় করুন এবং আবার চেষ্টা করুন।
|
enableJavascript = জাভাস্ক্রিপ্ট সক্রিয় করুন এবং আবার চেষ্টা করুন।
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }ঘ { $minutes }মি
|
expiresHoursMinutes = { $hours }ঘ { $minutes }মি
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = এই পাসওয়ার্ড সেট করা য
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = প্রেরণ
|
-send-short-brand = প্রেরণ
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Roit hoc'h ali
|
|
||||||
importingFile = Oc'h enporzhiañ …
|
importingFile = Oc'h enporzhiañ …
|
||||||
encryptingFile = Oc'h enrinegañ..
|
encryptingFile = Oc'h enrinegañ..
|
||||||
decryptingFile = Oc'h ezrinegañ...
|
decryptingFile = Oc'h ezrinegañ...
|
||||||
@@ -26,13 +24,13 @@ unlockButtonLabel = Dibrennañ
|
|||||||
downloadButtonLabel = Pellgargañ
|
downloadButtonLabel = Pellgargañ
|
||||||
downloadFinish = Pellgargadur echu
|
downloadFinish = Pellgargadur echu
|
||||||
fileSizeProgress = ({ $partialSize } war { $totalSize })
|
fileSizeProgress = ({ $partialSize } war { $totalSize })
|
||||||
sendYourFilesLink = Esaeit Firefox Send
|
sendYourFilesLink = Esaeit Send
|
||||||
errorPageHeader = Degouezhet ez eus bet ur fazi!
|
errorPageHeader = Degouezhet ez eus bet ur fazi!
|
||||||
fileTooBig = Re vras eo ar restr-mañ evit e pellgas. Rankout a ra bezañ nebeutoc'h eget { $size }
|
fileTooBig = Re vras eo ar restr-mañ evit e pellgas. Rankout a ra bezañ nebeutoc'h eget { $size }
|
||||||
linkExpiredAlt = Ere diamzeret
|
linkExpiredAlt = Ere diamzeret
|
||||||
notSupportedHeader = N'eo ket skoret ho merdeer.
|
notSupportedHeader = N'eo ket skoret ho merdeer.
|
||||||
notSupportedLink = Perak n'eo ket skoret ma merdeer?
|
notSupportedLink = Perak n'eo ket skoret ma merdeer?
|
||||||
notSupportedOutdatedDetail = Siwazh n'eo ket skoret ar c'halvezerezhioù implijet evit Firefox Send gant an handelv-mañ eus Firefox. Ret e vo deoc'h hizivaat ho merdeer.
|
notSupportedOutdatedDetail = Siwazh n'eo ket skoret ar c'halvezerezhioù implijet evit Send gant an handelv-mañ eus Firefox. Ret e vo deoc'h hizivaat ho merdeer.
|
||||||
updateFirefox = Hizivaat Firefox
|
updateFirefox = Hizivaat Firefox
|
||||||
deletePopupCancel = Nullañ
|
deletePopupCancel = Nullañ
|
||||||
deleteButtonHover = Dilemel
|
deleteButtonHover = Dilemel
|
||||||
@@ -40,8 +38,8 @@ footerLinkLegal = Lezennel
|
|||||||
footerLinkPrivacy = Buhez prevez
|
footerLinkPrivacy = Buhez prevez
|
||||||
footerLinkCookies = Toupinoù
|
footerLinkCookies = Toupinoù
|
||||||
passwordTryAgain = Ger-tremen direizh. Klaskit en-dro.
|
passwordTryAgain = Ger-tremen direizh. Klaskit en-dro.
|
||||||
javascriptRequired = Firefox Send a azgoulenn Javascript
|
javascriptRequired = Send a azgoulenn Javascript
|
||||||
whyJavascript = Perak e azgoulenn Firefox Send Javascript?
|
whyJavascript = Perak e azgoulenn Send Javascript?
|
||||||
enableJavascript = Gweredekait Javascript ha klaskit en-dro.
|
enableJavascript = Gweredekait Javascript ha klaskit en-dro.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }e { $minutes }m
|
expiresHoursMinutes = { $hours }e { $minutes }m
|
||||||
@@ -54,8 +52,7 @@ passwordSetError = N'haller ket despizañ ar ger-tremen
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteSubtitle = web eksperiment
|
siteSubtitle = web eksperiment
|
||||||
siteFeedback = Povratne informacije
|
|
||||||
uploadPageHeader = Privatno, šifrovano dijeljenje datoteka
|
uploadPageHeader = Privatno, šifrovano dijeljenje datoteka
|
||||||
uploadPageExplainer = Pošaljite datoteke putem sigurne, privatne i šifrovane veze koja automatski ističe kako bi se osiguralo da vaše stvari ne ostaju na mreži zauvijek.
|
uploadPageExplainer = Pošaljite datoteke putem sigurne, privatne i šifrovane veze koja automatski ističe kako bi se osiguralo da vaše stvari ne ostaju na mreži zauvijek.
|
||||||
uploadPageLearnMore = Saznajte više
|
uploadPageLearnMore = Saznajte više
|
||||||
@@ -57,16 +55,14 @@ unlockInputLabel = Unesite lozinku
|
|||||||
unlockInputPlaceholder = Lozinka
|
unlockInputPlaceholder = Lozinka
|
||||||
unlockButtonLabel = Otključaj
|
unlockButtonLabel = Otključaj
|
||||||
downloadFileTitle = Preuzmi šifrovanu datoteku
|
downloadFileTitle = Preuzmi šifrovanu datoteku
|
||||||
# Firefox Send is a brand name and should not be localized.
|
downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu.
|
||||||
downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Firefox Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu.
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
# Text and title used on the download link/button (indicates an action).
|
||||||
downloadButtonLabel = Preuzmi
|
downloadButtonLabel = Preuzmi
|
||||||
downloadNotification = Vaše preuzimanje je završeno.
|
downloadNotification = Vaše preuzimanje je završeno.
|
||||||
downloadFinish = Preuzimanje završeno
|
downloadFinish = Preuzimanje završeno
|
||||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||||
fileSizeProgress = ({ $partialSize } od { $totalSize })
|
fileSizeProgress = ({ $partialSize } od { $totalSize })
|
||||||
# Firefox Send is a brand name and should not be localized.
|
sendYourFilesLink = Probajte Send
|
||||||
sendYourFilesLink = Probajte Firefox Send
|
|
||||||
downloadingPageProgress = Preuzimanje { $filename } ({ $size })
|
downloadingPageProgress = Preuzimanje { $filename } ({ $size })
|
||||||
downloadingPageMessage = Ostavite ovaj tab otvorenim dok ne dobavimo vašu datoteku i dok je ne dešifrujemo.
|
downloadingPageMessage = Ostavite ovaj tab otvorenim dok ne dobavimo vašu datoteku i dok je ne dešifrujemo.
|
||||||
errorAltText = Greška pri otpremanju
|
errorAltText = Greška pri otpremanju
|
||||||
@@ -77,10 +73,9 @@ fileTooBig = Ta datoteka je prevelika za otpremanje. Treba biti manja od { $size
|
|||||||
linkExpiredAlt = Veza istekla
|
linkExpiredAlt = Veza istekla
|
||||||
expiredPageHeader = Veza je istekla ili nikad nije postojala!
|
expiredPageHeader = Veza je istekla ili nikad nije postojala!
|
||||||
notSupportedHeader = Vaš pretraživač nije podržan.
|
notSupportedHeader = Vaš pretraživač nije podržan.
|
||||||
# Firefox Send is a brand name and should not be localized.
|
notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Send. Trebate probati drugi pretraživač. Preporučujemo Firefox!
|
||||||
notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Firefox Send. Trebate probati drugi pretraživač. Preporučujemo Firefox!
|
|
||||||
notSupportedLink = Zašto moj pretraživač nije podržan?
|
notSupportedLink = Zašto moj pretraživač nije podržan?
|
||||||
notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Firefox Send. Morate ažurirati vaš pretraživač.
|
notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Send. Morate ažurirati vaš pretraživač.
|
||||||
updateFirefox = Ažuriraj Firefox
|
updateFirefox = Ažuriraj Firefox
|
||||||
downloadFirefoxButtonSub = Besplatno preuzimanje
|
downloadFirefoxButtonSub = Besplatno preuzimanje
|
||||||
uploadedFile = Datoteka
|
uploadedFile = Datoteka
|
||||||
@@ -90,8 +85,8 @@ expiryFileList = Ističe za
|
|||||||
deleteFileList = Izbriši
|
deleteFileList = Izbriši
|
||||||
nevermindButton = Zanemari
|
nevermindButton = Zanemari
|
||||||
legalHeader = Uslovi i privatnost
|
legalHeader = Uslovi i privatnost
|
||||||
legalNoticeTestPilot = Firefox Send je trenutno Test Pilot eksperiment i podržan je <a>uslovima korištenja</a> i <a>obavještenjem o privatnosti</a>. Možete saznati više o ovom eksperimentu i o njegovom sakupljanju podataka <a>ovdje</a>.
|
legalNoticeTestPilot = Send je trenutno Test Pilot eksperiment i podržan je <a>uslovima korištenja</a> i <a>obavještenjem o privatnosti</a>. Možete saznati više o ovom eksperimentu i o njegovom sakupljanju podataka <a>ovdje</a>.
|
||||||
legalNoticeMozilla = Korištenje Firefox Send web stranice podlaže Mozillinom <a>obavještenju o privatnosti na web stranicama</a> i <a>uslovima korištenja web stranica</a>.
|
legalNoticeMozilla = Korištenje Send web stranice podlaže Mozillinom <a>obavještenju o privatnosti na web stranicama</a> i <a>uslovima korištenja web stranica</a>.
|
||||||
deletePopupText = Izbrisati ovu datoteku?
|
deletePopupText = Izbrisati ovu datoteku?
|
||||||
deletePopupYes = Da
|
deletePopupYes = Da
|
||||||
deletePopupCancel = Otkaži
|
deletePopupCancel = Otkaži
|
||||||
@@ -108,8 +103,8 @@ addPasswordButton = Dodaj lozinku
|
|||||||
changePasswordButton = Promijeni
|
changePasswordButton = Promijeni
|
||||||
passwordTryAgain = Netačna lozinka. Pokušajte ponovo.
|
passwordTryAgain = Netačna lozinka. Pokušajte ponovo.
|
||||||
reportIPInfringement = Prijavite IP prekršaj
|
reportIPInfringement = Prijavite IP prekršaj
|
||||||
javascriptRequired = Firefox Send zahtjeva JavaScript
|
javascriptRequired = Send zahtjeva JavaScript
|
||||||
whyJavascript = Zašto Firefox Send zahtjeva JavaScript?
|
whyJavascript = Zašto Send zahtjeva JavaScript?
|
||||||
enableJavascript = Molimo omogućite JavaScript i pokušajte ponovo.
|
enableJavascript = Molimo omogućite JavaScript i pokušajte ponovo.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Comentaris
|
|
||||||
importingFile = S'està important…
|
importingFile = S'està important…
|
||||||
encryptingFile = S'està xifrant…
|
encryptingFile = S'està xifrant…
|
||||||
decryptingFile = S'està desxifrant…
|
decryptingFile = S'està desxifrant…
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Desbloca
|
|||||||
downloadButtonLabel = Baixa
|
downloadButtonLabel = Baixa
|
||||||
downloadFinish = Ha acabat la baixada
|
downloadFinish = Ha acabat la baixada
|
||||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||||
sendYourFilesLink = Proveu el Firefox Send
|
sendYourFilesLink = Proveu el Send
|
||||||
errorPageHeader = Hi ha hagut un problema
|
errorPageHeader = Hi ha hagut un problema
|
||||||
fileTooBig = Aquest fitxer és massa gros per pujar-lo. Ha de tenir menys de { $size }.
|
fileTooBig = Aquest fitxer és massa gros per pujar-lo. Ha de tenir menys de { $size }.
|
||||||
linkExpiredAlt = L'enllaç ha caducat
|
linkExpiredAlt = L'enllaç ha caducat
|
||||||
notSupportedHeader = El vostre navegador no és compatible.
|
notSupportedHeader = El vostre navegador no és compatible.
|
||||||
notSupportedLink = Per què el meu navegador no és compatible?
|
notSupportedLink = Per què el meu navegador no és compatible?
|
||||||
notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'actualitzar el navegador.
|
notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Send. Haureu d'actualitzar el navegador.
|
||||||
updateFirefox = Actualitza el Firefox
|
updateFirefox = Actualitza el Firefox
|
||||||
deletePopupCancel = Cancel·la
|
deletePopupCancel = Cancel·la
|
||||||
deleteButtonHover = Suprimeix
|
deleteButtonHover = Suprimeix
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Avís legal
|
|||||||
footerLinkPrivacy = Privadesa
|
footerLinkPrivacy = Privadesa
|
||||||
footerLinkCookies = Galetes
|
footerLinkCookies = Galetes
|
||||||
passwordTryAgain = La contrasenya és incorrecta. Torneu-ho a provar.
|
passwordTryAgain = La contrasenya és incorrecta. Torneu-ho a provar.
|
||||||
javascriptRequired = El Firefox Send necessita JavaScript
|
javascriptRequired = El Send necessita JavaScript
|
||||||
whyJavascript = Per què el Firefox Send necessita JavaScript?
|
whyJavascript = Per què el Send necessita JavaScript?
|
||||||
enableJavascript = Activeu el JavaScript i torneu-ho a provar.
|
enableJavascript = Activeu el JavaScript i torneu-ho a provar.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours } h { $minutes } min
|
expiresHoursMinutes = { $hours } h { $minutes } min
|
||||||
@@ -48,9 +46,8 @@ passwordSetError = No s'ha pogut definir la contrasenya
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
-send-short-brand = Send
|
||||||
-send-short-brand = Firefox Send
|
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Compartició de fitxers senzilla i privada
|
introTitle = Compartició de fitxers senzilla i privada
|
||||||
@@ -151,3 +148,5 @@ shareLinkDescription = Compartiu l'enllaç al vostre fitxer:
|
|||||||
shareLinkButton = Comparteix l'enllaç
|
shareLinkButton = Comparteix l'enllaç
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Baixeu «{ $name }» amb el { -send-brand }: compartició de fitxers senzilla i segura
|
shareMessage = Baixeu «{ $name }» amb el { -send-brand }: compartició de fitxers senzilla i segura
|
||||||
|
trailheadPromo = Hi ha una manera de protegir la vostra privadesa. Uniu-vos al Firefox.
|
||||||
|
learnMore = Més informació.
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Rutzijol
|
|
||||||
importingFile = Tajin nijik…
|
importingFile = Tajin nijik…
|
||||||
encryptingFile = Tajin newäx rusik'ixik...
|
encryptingFile = Tajin newäx rusik'ixik…
|
||||||
decryptingFile = Tajin netamäx rusik'ixik...
|
decryptingFile = Tajin netamäx rusik'ixik...
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Titzij chik
|
|||||||
downloadButtonLabel = Tiqasäx
|
downloadButtonLabel = Tiqasäx
|
||||||
downloadFinish = Xtz'aqät qasanïk
|
downloadFinish = Xtz'aqät qasanïk
|
||||||
fileSizeProgress = ({ $partialSize } richin { $totalSize })
|
fileSizeProgress = ({ $partialSize } richin { $totalSize })
|
||||||
sendYourFilesLink = Titojtob'ëx Firefox Send
|
sendYourFilesLink = Titojtob'ëx Send
|
||||||
errorPageHeader = ¡K'o ri man ütz ta xub'än!
|
errorPageHeader = ¡K'o ri man ütz ta xub'än!
|
||||||
fileTooBig = Yalan nïm re yakb'äl re' richin nijotob'äx. K'o ta chi man nik'o ta chi re ri { $size }.
|
fileTooBig = Yalan nïm re yakb'äl re' richin nijotob'äx. K'o ta chi man nik'o ta chi re ri { $size }.
|
||||||
linkExpiredAlt = Xk'is ruq'ijul ri ximonel
|
linkExpiredAlt = Xk'is ruq'ijul ri ximonel
|
||||||
notSupportedHeader = Man koch'el ta ri awokik'amaya'l.
|
notSupportedHeader = Man koch'el ta ri awokik'amaya'l.
|
||||||
notSupportedLink = ¿Achike ruma man nikoch' taq ri wokik'amaya'l?
|
notSupportedLink = ¿Achike ruma man nikoch' taq ri wokik'amaya'l?
|
||||||
notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Firefox Send. Rajowaxik nak'ëx ri awokik'amaya'l.
|
notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Send. Rajowaxik nak'ëx ri awokik'amaya'l.
|
||||||
updateFirefox = Tik'ex ri Firefox
|
updateFirefox = Tik'ex ri Firefox
|
||||||
deletePopupCancel = Tiq'at
|
deletePopupCancel = Tiq'at
|
||||||
deleteButtonHover = Tiyuj
|
deleteButtonHover = Tiyuj
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Taqanel tzijol
|
|||||||
footerLinkPrivacy = Ichinanem
|
footerLinkPrivacy = Ichinanem
|
||||||
footerLinkCookies = Taq kaxlanwey
|
footerLinkCookies = Taq kaxlanwey
|
||||||
passwordTryAgain = Itzel ri ewan tzij. Tatojtob'ej chik.
|
passwordTryAgain = Itzel ri ewan tzij. Tatojtob'ej chik.
|
||||||
javascriptRequired = K'atzinel JavaScript chi re ri Firefox Send
|
javascriptRequired = K'atzinel JavaScript chi re ri Send
|
||||||
whyJavascript = ¿Achike ruma toq ri Firefox Send nrajo' JavaScript?
|
whyJavascript = ¿Achike ruma toq ri Send nrajo' JavaScript?
|
||||||
enableJavascript = Titz'ij JavaScript richin nitojtob'ëx chik.
|
enableJavascript = Titz'ij JavaScript richin nitojtob'ëx chik.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }r { $minutes }ch
|
expiresHoursMinutes = { $hours }r { $minutes }ch
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = Man tikirel ta ninuk' re ewan tzij re'
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Titaq
|
-send-short-brand = Titaq
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
@@ -151,3 +148,5 @@ shareLinkDescription = Nakomonij ri ximonel rik'in ri awokisab'al:
|
|||||||
shareLinkButton = Tikomonïx ximonel
|
shareLinkButton = Tikomonïx ximonel
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Tiqasäx "{ $name }" rik'in { -send-brand }: man k'ayew ta chuqa' ütz kikomonik ri yakb'äl
|
shareMessage = Tiqasäx "{ $name }" rik'in { -send-brand }: man k'ayew ta chuqa' ütz kikomonik ri yakb'äl
|
||||||
|
trailheadPromo = K'o jun rub'anikil richin nachajij ri awichinanem. Tatunu' awi' rik'in ri Firefox.
|
||||||
|
learnMore = Tetamäx ch'aqa' chik.
|
||||||
|
|||||||
152
public/locales/ckb/send.ftl
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
title = Send
|
||||||
|
importingFile = هاوردەکردن...
|
||||||
|
encryptingFile = بەهێماکردن...
|
||||||
|
decryptingFile = هێمالابردن...
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 داگرتن
|
||||||
|
*[other] { $num } داگرتن
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 کاژێر
|
||||||
|
*[other] { $num } کاژێر
|
||||||
|
}
|
||||||
|
copiedUrl = لەبەرگیرا!
|
||||||
|
unlockInputPlaceholder = وشەی تێپەڕبوون
|
||||||
|
unlockButtonLabel = کردنەوە
|
||||||
|
downloadButtonLabel = داگرتن
|
||||||
|
downloadFinish = داگرتن تەواو بوو
|
||||||
|
fileSizeProgress = ({ $partialSize } لە { $totalSize })
|
||||||
|
sendYourFilesLink = Firefox ناردن تاقیبکەرەوە
|
||||||
|
errorPageHeader = هەڵەیەک ڕوویدا
|
||||||
|
fileTooBig = ئەم پەڕگەیە زۆر گەورەیە بۆ بارکردن. پێویستە لە { $size } بچووک تر بێت
|
||||||
|
linkExpiredAlt = بەستەر بەسەرچووە
|
||||||
|
notSupportedHeader = وێبگەڕەکەت پشتگیری ناکرێت
|
||||||
|
notSupportedLink = بۆ وێبگەڕەکەم پشتگیری ناکرێت؟
|
||||||
|
notSupportedOutdatedDetail = بەداخەوە ئەم وەشانەی Firefox پشتگیری ئەو جۆرە تەکنەلۆژییە ناکات کە پێویستە بۆ Send. پێویستە وێبگەڕەکەت نوێبکەیتەوە.
|
||||||
|
updateFirefox = فاەرفۆکس نوێبکەرەوە
|
||||||
|
deletePopupCancel = پاشگەزبوونەوە
|
||||||
|
deleteButtonHover = سڕینەوە
|
||||||
|
footerLinkLegal = یاسایی
|
||||||
|
footerLinkPrivacy = تایبەتیی
|
||||||
|
footerLinkCookies = شەکرۆکە
|
||||||
|
passwordTryAgain = وشەی تێپەڕبوون هەڵەیە. هەوڵ بدەرەوە.
|
||||||
|
javascriptRequired = فارفۆکسی ناردن پێویستە بە JavaScript هەیە
|
||||||
|
whyJavascript = بۆچی پێویستی بە JavaScript هەیە؟
|
||||||
|
enableJavascript = تکایە JavaScript چالاک بکە وهەوڵ بدەرەوە.
|
||||||
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
|
expiresHoursMinutes = { $hours }ک { $minutes }خ
|
||||||
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
|
expiresMinutes = { $minutes }خ
|
||||||
|
# A short status message shown when the user enters a long password
|
||||||
|
maxPasswordLength = زۆرترین درێژی وشەی تێپەڕی ڕێگەپێدراو: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = ناتوانرێت وشەی تێپەڕ دابنرێت
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
-send-brand = Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = سانا، بڵاوکەرەوەی پەڕگەی تایبەتیی
|
||||||
|
introDescription = { -send-brand } ڕێگەت دەدات پەڕگەکان بڵاوبکەیتەوە بە شێوەی هێما کردنی کۆتا-بۆ-کۆتا و بەستەرێک کە خۆکارانە بەسەردەچێت. بۆیە دەتوانیت ئاگاداری ئەوە بیت کە چ پەڕگەیەک بە تایبەتی بڵاودەکەیتەوە و دڵنیادەبیتەوە کە شتەکانت بە سەرهێڵی نامێننەوە هەتا کۆتایی.
|
||||||
|
notifyUploadEncryptDone = پەڕگەیە بەهێماکراوە ئێستا ئامادەیە بۆ ناردن
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = بەسەردەچێت دووای { $downloadCount } یان { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 خولەک
|
||||||
|
*[other] { $num } خولەک
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 ڕؤژ
|
||||||
|
*[other] { $num } ڕۆژ
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 هەفتە
|
||||||
|
*[other] { $num } هەفتە
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 پەڕگە
|
||||||
|
*[other] { $num } پەڕگە
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = بایت
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = ک.بایت
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = م.بایت
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = گ.بایت
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = قەبارەی گشتی: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = بەستەر لەبەربگرەوە بۆ بڵاوکردنەوەی پەڕگە:
|
||||||
|
copyLinkButton = بەستەر لەبەربگرەوە
|
||||||
|
downloadTitle = پەڕگەکان دابگرە
|
||||||
|
downloadDescription = ئەم پەڕگەیە لە لایەن { -send-brand } بلاوکراوەتەوە کە بەهێماکراوە بە شێوەی کۆتا-بۆ-کۆتا بە بەستەرێک کە خۆکارانە بەسەردەچێت.
|
||||||
|
trySendDescription = { -send-brand } تاقیبکەرەوە بۆ سانایی، پارێزراو لە بڵاوکردنەوەی پەڕگە.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] تەنها 1 پەڕگە دەتوانیت باربکەیت لەم کاتەدا.
|
||||||
|
*[other] تەنها { $count } پەڕگە دەتوانی باربکەیت لەم کاتەدا.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] تەنها 1 ئەرشیف ڕێپێدراوە.
|
||||||
|
*[other] تەنها { $count } ئەرشیف ڕێپێدراوە.
|
||||||
|
}
|
||||||
|
expiredTitle = بەستەر بەسەرچووە.
|
||||||
|
notSupportedDescription = { -send-brand } کارنکات لەگەڵ ئەم وێبگەڕە. { -send-short-brand } باش کاردەکات لەگەڵ کۆتا وەشانی { -firefox }، وکاردەکات لەگەڵ زۆربەی وەشانی ئێستای وێبگەڕەکان.
|
||||||
|
downloadFirefox = { -firefox } دابگرە
|
||||||
|
legalTitle = تێبینی تایبەتیی { -send-short-brand }
|
||||||
|
legalDateStamp = وەشان 1.0، بەروار کراو لە 12 ئازار، 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days } ڕ { $hours } ک{ $minutes } خ
|
||||||
|
addFilesButton = پەڕگەکان هەڵبژێرە بۆ بارکردن
|
||||||
|
uploadButton = بارکردن
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = ڕاکێشان و دانانی پەڕگەکان
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = یان کرتە بکە بۆ ناردنی قەبارەی تاوەکوو { $size }
|
||||||
|
addPassword = بپارێزە لەگەڵ وشەی تێپەڕ
|
||||||
|
emailPlaceholder = پۆستی ئەلکترۆنی بنووسە
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = بچۆژوورەوە بۆ ناردنی قەبارەی تاوەکوو { $size }
|
||||||
|
signInOnlyButton = بچۆژوورەوە
|
||||||
|
accountBenefitTitle = هەژماری { -firefox } درووست بکە یان بچۆژوورەوە
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = پەڕگە بڵاوبکەرەوە تاوەکوو قەبارەی { $size }
|
||||||
|
accountBenefitDownloadCount = پەڕگەکان لەگەڵ خەڵکی زیاتر بڵاوبکەرەوە
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] بەستەرەکان بەکارایی بهێڵەوە تا 1 ڕۆژ
|
||||||
|
*[other] بەستەرەکان بەکارایی بهێڵەوە تا { $count } ڕۆژ
|
||||||
|
}
|
||||||
|
accountBenefitSync = پەڕگە بڵآوکراوەکان بەڕێوەبەرە لەهەر ئامێرێکەوە
|
||||||
|
accountBenefitMoz = زیاتر بزانە دەربارەی خزمەتگوزارییەکانی تری { -mozilla }
|
||||||
|
signOut = بچۆ دەرەوە
|
||||||
|
okButton = باشە
|
||||||
|
downloadingTitle = دادەگیرێت...
|
||||||
|
noStreamsWarning = لەوانەیە ئەم وێبگەڕە نەتوانێت پەڕگەی وا گەورە بە هێما بکات.
|
||||||
|
noStreamsOptionCopy = بەستەر لەبەربگرەوە بۆ کردنەوەی لە وێبگەڕێکی تر
|
||||||
|
noStreamsOptionFirefox = وێبگەڕی دڵخوازی ئێمە تاقیبکەرەوە
|
||||||
|
noStreamsOptionDownload = بەردەوام بە لەگەڵ ئەم وێبگەڕە
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } پیشکەش کراوە بە تۆ لە لایەن { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = بەستەر بڵاوبکەرەوە بۆ پەڕگەکەت:
|
||||||
|
shareLinkButton = بەستەر بڵاوبکەرەوە
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = “{ $name }” دابگرە لەگەڵ { -send-brand }: سانا، پاریزراو لە بڵاوکردنەوەی پەڕگە
|
||||||
|
trailheadPromo = ڕێگەیەک هەیە بۆ پارێزگاریکردنی تایبەتێتی خۆت. بەشدار بە لە فایەرفۆکس.
|
||||||
|
learnMore = زیاتر بزانە
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Zpětná vazba
|
|
||||||
importingFile = Probíhá import…
|
importingFile = Probíhá import…
|
||||||
encryptingFile = Probíhá šifrování…
|
encryptingFile = Probíhá šifrování…
|
||||||
decryptingFile = Probíhá dešifrování…
|
decryptingFile = Probíhá dešifrování…
|
||||||
@@ -22,13 +20,13 @@ unlockButtonLabel = Odemknout
|
|||||||
downloadButtonLabel = Stáhnout
|
downloadButtonLabel = Stáhnout
|
||||||
downloadFinish = Stahování dokončeno
|
downloadFinish = Stahování dokončeno
|
||||||
fileSizeProgress = ({ $partialSize } z { $totalSize })
|
fileSizeProgress = ({ $partialSize } z { $totalSize })
|
||||||
sendYourFilesLink = Vyzkoušejte Firefox Send
|
sendYourFilesLink = Vyzkoušet Send
|
||||||
errorPageHeader = Nastala chyba!
|
errorPageHeader = Nastala chyba!
|
||||||
fileTooBig = Tento soubor je příliš veliký. Velikost nahrávaných souborů by neměla překročit { $size }.
|
fileTooBig = Tento soubor je příliš veliký. Velikost nahrávaných souborů by neměla překročit { $size }.
|
||||||
linkExpiredAlt = Platnost odkazu vypršela
|
linkExpiredAlt = Platnost odkazu vypršela
|
||||||
notSupportedHeader = Váš prohlížeč není podporován.
|
notSupportedHeader = Váš prohlížeč není podporován.
|
||||||
notSupportedLink = Proč není můj prohlížeč podporovaný?
|
notSupportedLink = Proč není můj prohlížeč podporovaný?
|
||||||
notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Firefox Send. Musíte aktualizovat svůj prohlížeč.
|
notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Send. Musíte aktualizovat svůj prohlížeč.
|
||||||
updateFirefox = Aktualizovat Firefox
|
updateFirefox = Aktualizovat Firefox
|
||||||
deletePopupCancel = Zrušit
|
deletePopupCancel = Zrušit
|
||||||
deleteButtonHover = Smazat
|
deleteButtonHover = Smazat
|
||||||
@@ -36,8 +34,8 @@ footerLinkLegal = Právní informace
|
|||||||
footerLinkPrivacy = Soukromí
|
footerLinkPrivacy = Soukromí
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Špatné heslo. Zkuste to znovu.
|
passwordTryAgain = Špatné heslo. Zkuste to znovu.
|
||||||
javascriptRequired = Firefox Send vyžaduje povolený JavaScript
|
javascriptRequired = Send vyžaduje povolený JavaScript
|
||||||
whyJavascript = Proč Firefox Send vyžaduje povolený JavaScript?
|
whyJavascript = Proč Send vyžaduje povolený JavaScript?
|
||||||
enableJavascript = Povolte JavaScript a zkuste to znovu.
|
enableJavascript = Povolte JavaScript a zkuste to znovu.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours } h { $minutes } m
|
expiresHoursMinutes = { $hours } h { $minutes } m
|
||||||
@@ -50,16 +48,15 @@ passwordSetError = Toto heslo nemohlo být nastaveno
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
|
||||||
-send-brand =
|
-send-brand =
|
||||||
{ $case ->
|
{ $case ->
|
||||||
*[nom] Firefox Send
|
*[nom] Send
|
||||||
[gen] Firefoxu Send
|
[gen] Send
|
||||||
[dat] Firefoxu Send
|
[dat] Send
|
||||||
[acc] Firefox Send
|
[acc] Send
|
||||||
[voc] Firefoxe Send
|
[voc] Send
|
||||||
[loc] Firefoxu Send
|
[loc] Send
|
||||||
[ins] Firefoxem Send
|
[ins] Send
|
||||||
}
|
}
|
||||||
-send-short-brand =
|
-send-short-brand =
|
||||||
{ $case ->
|
{ $case ->
|
||||||
@@ -137,7 +134,7 @@ copyLinkDescription = Soubor můžete sdílet tímto odkazem:
|
|||||||
copyLinkButton = Zkopírovat odkaz
|
copyLinkButton = Zkopírovat odkaz
|
||||||
downloadTitle = Stáhnout soubory
|
downloadTitle = Stáhnout soubory
|
||||||
downloadDescription = Tento soubor byl sdílen přes { -send-brand(case: "acc") } s end-to-end šifrováním a odkazem s omezenou platností.
|
downloadDescription = Tento soubor byl sdílen přes { -send-brand(case: "acc") } s end-to-end šifrováním a odkazem s omezenou platností.
|
||||||
trySendDescription = Zkuste { -send-brand(case: "acc") } pro jednoduché a bezpečné sdílení souborů
|
trySendDescription = Vyzkoušejte jednoduché a bezpečné sdílení souborů s { -send-brand(case: "ins") }
|
||||||
# count will always be > 10
|
# count will always be > 10
|
||||||
tooManyFiles =
|
tooManyFiles =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Adborth
|
|
||||||
importingFile = Mewnforio…
|
importingFile = Mewnforio…
|
||||||
encryptingFile = Wrthi'n amgryptio…
|
encryptingFile = Wrthi'n amgryptio…
|
||||||
decryptingFile = Wrthi'n dadgryptio…
|
decryptingFile = Wrthi'n dadgryptio…
|
||||||
@@ -28,13 +26,13 @@ unlockButtonLabel = Datgloi
|
|||||||
downloadButtonLabel = Llwytho i Lawr
|
downloadButtonLabel = Llwytho i Lawr
|
||||||
downloadFinish = Llwytho wedi Gorffen
|
downloadFinish = Llwytho wedi Gorffen
|
||||||
fileSizeProgress = ({ $partialSize } o { $totalSize })
|
fileSizeProgress = ({ $partialSize } o { $totalSize })
|
||||||
sendYourFilesLink = Rhowch gynnig ar Firefox Send
|
sendYourFilesLink = Rhowch gynnig ar Send
|
||||||
errorPageHeader = Aeth rhywbeth o'i le!
|
errorPageHeader = Aeth rhywbeth o'i le!
|
||||||
fileTooBig = Mae'r ffeil yn rhy fawr i'w llwytho. Dylai fod yn llai na { $size }.
|
fileTooBig = Mae'r ffeil yn rhy fawr i'w llwytho. Dylai fod yn llai na { $size }.
|
||||||
linkExpiredAlt = Mae'r ddolen wedi dod i ben
|
linkExpiredAlt = Mae'r ddolen wedi dod i ben
|
||||||
notSupportedHeader = Nid yw eich porwr yn cael ei gynnal.
|
notSupportedHeader = Nid yw eich porwr yn cael ei gynnal.
|
||||||
notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal?
|
notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal?
|
||||||
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.
|
notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Send. Bydd angen i chi ddiweddaru eich porwr.
|
||||||
updateFirefox = Diweddaru Firefox
|
updateFirefox = Diweddaru Firefox
|
||||||
deletePopupCancel = Diddymu
|
deletePopupCancel = Diddymu
|
||||||
deleteButtonHover = Dileu
|
deleteButtonHover = Dileu
|
||||||
@@ -42,8 +40,8 @@ footerLinkLegal = Cyfreithiol
|
|||||||
footerLinkPrivacy = Preifatrwydd
|
footerLinkPrivacy = Preifatrwydd
|
||||||
footerLinkCookies = Cwcis
|
footerLinkCookies = Cwcis
|
||||||
passwordTryAgain = Cyfrinair anghywir. Ceisiwch eto.
|
passwordTryAgain = Cyfrinair anghywir. Ceisiwch eto.
|
||||||
javascriptRequired = Mae Firefox Send angen JavaScript
|
javascriptRequired = Mae Send angen JavaScript
|
||||||
whyJavascript = Pam fod Firefox Send angen JavaScript?
|
whyJavascript = Pam fod Send angen JavaScript?
|
||||||
enableJavascript = Galluogwch JavaScript a cheisio eto.
|
enableJavascript = Galluogwch JavaScript a cheisio eto.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }a { $minutes }m
|
expiresHoursMinutes = { $hours }a { $minutes }m
|
||||||
@@ -56,8 +54,7 @@ passwordSetError = Nid oedd modd gosod y cyfrinair hwn
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Anfon
|
-send-short-brand = Anfon
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Feedback
|
|
||||||
importingFile = Importerer…
|
importingFile = Importerer…
|
||||||
encryptingFile = Krypterer…
|
encryptingFile = Krypterer…
|
||||||
decryptingFile = Dekrypterer…
|
decryptingFile = Dekrypterer…
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Lås op
|
|||||||
downloadButtonLabel = Hent
|
downloadButtonLabel = Hent
|
||||||
downloadFinish = Hentning fuldført
|
downloadFinish = Hentning fuldført
|
||||||
fileSizeProgress = ({ $partialSize } af { $totalSize })
|
fileSizeProgress = ({ $partialSize } af { $totalSize })
|
||||||
sendYourFilesLink = Prøv Firefox Send
|
sendYourFilesLink = Prøv Send
|
||||||
errorPageHeader = Der gik noget galt!
|
errorPageHeader = Der gik noget galt!
|
||||||
fileTooBig = Den fil er for stor at uploade. Den skal være mindre end { $size }.
|
fileTooBig = Den fil er for stor at uploade. Den skal være mindre end { $size }.
|
||||||
linkExpiredAlt = Link er udløbet
|
linkExpiredAlt = Link er udløbet
|
||||||
notSupportedHeader = Din browser understøttes ikke.
|
notSupportedHeader = Din browser understøttes ikke.
|
||||||
notSupportedLink = Hvorfor understøttes min browser ikke?
|
notSupportedLink = Hvorfor understøttes min browser ikke?
|
||||||
notSupportedOutdatedDetail = Desværre understøtter denne version af Firefox ikke den webteknologi, som driver Firefox Send. Du skal opdatere din browser.
|
notSupportedOutdatedDetail = Desværre understøtter denne version af Firefox ikke den webteknologi, som driver Send. Du skal opdatere din browser.
|
||||||
updateFirefox = Opdater Firefox
|
updateFirefox = Opdater Firefox
|
||||||
deletePopupCancel = Annuller
|
deletePopupCancel = Annuller
|
||||||
deleteButtonHover = Slet
|
deleteButtonHover = Slet
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Juridisk
|
|||||||
footerLinkPrivacy = Privatliv
|
footerLinkPrivacy = Privatliv
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Forkert adgangskode. Prøv igen.
|
passwordTryAgain = Forkert adgangskode. Prøv igen.
|
||||||
javascriptRequired = Firefox Send kræver JavaScript
|
javascriptRequired = Send kræver JavaScript
|
||||||
whyJavascript = Hvorfor kræver Firefox Send JavaScript?
|
whyJavascript = Hvorfor kræver Send JavaScript?
|
||||||
enableJavascript = Aktiver JavaScript og prøv igen.
|
enableJavascript = Aktiver JavaScript og prøv igen.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours } t { $minutes } m
|
expiresHoursMinutes = { $hours } t { $minutes } m
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = Adgangskoden kunne ikke sættes
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Feedback
|
|
||||||
importingFile = Wird importiert…
|
importingFile = Wird importiert…
|
||||||
encryptingFile = Wird verschlüsselt…
|
encryptingFile = Wird verschlüsselt…
|
||||||
decryptingFile = Wird entschlüsselt…
|
decryptingFile = Wird entschlüsselt…
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Entsperren
|
|||||||
downloadButtonLabel = Herunterladen
|
downloadButtonLabel = Herunterladen
|
||||||
downloadFinish = Download abgeschlossen
|
downloadFinish = Download abgeschlossen
|
||||||
fileSizeProgress = ({ $partialSize } von { $totalSize })
|
fileSizeProgress = ({ $partialSize } von { $totalSize })
|
||||||
sendYourFilesLink = Firefox Send ausprobieren
|
sendYourFilesLink = Send ausprobieren
|
||||||
errorPageHeader = Ein Fehler ist aufgetreten!
|
errorPageHeader = Ein Fehler ist aufgetreten!
|
||||||
fileTooBig = Die Datei ist zu groß zum Hochladen. Sie sollte maximal { $size } groß sein.
|
fileTooBig = Die Datei ist zu groß zum Hochladen. Sie sollte maximal { $size } groß sein.
|
||||||
linkExpiredAlt = Link abgelaufen
|
linkExpiredAlt = Link abgelaufen
|
||||||
notSupportedHeader = Dein Browser wird nicht unterstützt.
|
notSupportedHeader = Dein Browser wird nicht unterstützt.
|
||||||
notSupportedLink = Warum wird mein Browser nicht unterstützt?
|
notSupportedLink = Warum wird mein Browser nicht unterstützt?
|
||||||
notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Firefox Send basiert. Du musst deinen Browser aktualisieren.
|
notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Send basiert. Du musst deinen Browser aktualisieren.
|
||||||
updateFirefox = Firefox aktualisieren
|
updateFirefox = Firefox aktualisieren
|
||||||
deletePopupCancel = Abbrechen
|
deletePopupCancel = Abbrechen
|
||||||
deleteButtonHover = Löschen
|
deleteButtonHover = Löschen
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Rechtliches
|
|||||||
footerLinkPrivacy = Datenschutz
|
footerLinkPrivacy = Datenschutz
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Falsches Passwort. Versuche es nochmal.
|
passwordTryAgain = Falsches Passwort. Versuche es nochmal.
|
||||||
javascriptRequired = Firefox Send benötigt JavaScript
|
javascriptRequired = Send benötigt JavaScript
|
||||||
whyJavascript = Warum benötigt Firefox Send JavaScript?
|
whyJavascript = Warum benötigt Send JavaScript?
|
||||||
enableJavascript = Bitte aktiviere JavaScript und versuche es erneut.
|
enableJavascript = Bitte aktiviere JavaScript und versuche es erneut.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = Dieses Passwort konnte nicht eingerichtet werden
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Komentar
|
|
||||||
importingFile = Importěrujo se...
|
importingFile = Importěrujo se...
|
||||||
encryptingFile = Koděrujo se...
|
encryptingFile = Koděrujo se...
|
||||||
decryptingFile = Dešifrěrujo se...
|
decryptingFile = Dešifrěrujo se...
|
||||||
@@ -24,13 +22,13 @@ unlockButtonLabel = Wótwóriś
|
|||||||
downloadButtonLabel = Ześěgnuś
|
downloadButtonLabel = Ześěgnuś
|
||||||
downloadFinish = Ześěgnjenje dokóńcone
|
downloadFinish = Ześěgnjenje dokóńcone
|
||||||
fileSizeProgress = ({ $partialSize } z { $totalSize })
|
fileSizeProgress = ({ $partialSize } z { $totalSize })
|
||||||
sendYourFilesLink = Firefox Send wopytaś
|
sendYourFilesLink = Send wopytaś
|
||||||
errorPageHeader = Něco njejo se raźiło!
|
errorPageHeader = Něco njejo se raźiło!
|
||||||
fileTooBig = Toś ta dataja jo pśewjelika za nagraśe. Měła mjeńša ako { $size } byś.
|
fileTooBig = Toś ta dataja jo pśewjelika za nagraśe. Měła mjeńša ako { $size } byś.
|
||||||
linkExpiredAlt = Wótkaz spadnjony
|
linkExpiredAlt = Wótkaz spadnjony
|
||||||
notSupportedHeader = Waš wobglědowak se njepódpěra.
|
notSupportedHeader = Waš wobglědowak se njepódpěra.
|
||||||
notSupportedLink = Cogodla se mój wobglědowak njepódpěra?
|
notSupportedLink = Cogodla se mój wobglědowak njepódpěra?
|
||||||
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ś.
|
notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś.
|
||||||
updateFirefox = Firefox aktualizěrowaś
|
updateFirefox = Firefox aktualizěrowaś
|
||||||
deletePopupCancel = Pśetergnuś
|
deletePopupCancel = Pśetergnuś
|
||||||
deleteButtonHover = Wulašowaś
|
deleteButtonHover = Wulašowaś
|
||||||
@@ -38,8 +36,8 @@ footerLinkLegal = Pšawniske
|
|||||||
footerLinkPrivacy = Priwatnosć
|
footerLinkPrivacy = Priwatnosć
|
||||||
footerLinkCookies = Cookieje
|
footerLinkCookies = Cookieje
|
||||||
passwordTryAgain = Wopacne gronidło. Wopytajśo hyšći raz.
|
passwordTryAgain = Wopacne gronidło. Wopytajśo hyšći raz.
|
||||||
javascriptRequired = Firefox Send JavaScript trjeba
|
javascriptRequired = Send JavaScript trjeba
|
||||||
whyJavascript = Cogodla Firefox Send JavaScript trjeba?
|
whyJavascript = Cogodla Send JavaScript trjeba?
|
||||||
enableJavascript = Pšosym zmóžniśo JavaScript a wopytajśo hyšći raz.
|
enableJavascript = Pšosym zmóžniśo JavaScript a wopytajśo hyšći raz.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours } góź. { $minutes } min.
|
expiresHoursMinutes = { $hours } góź. { $minutes } min.
|
||||||
@@ -52,8 +50,7 @@ passwordSetError = Toś to gronidło njedajo se nastajiś
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Σχόλια
|
|
||||||
importingFile = Εισαγωγή…
|
importingFile = Εισαγωγή…
|
||||||
encryptingFile = Κρυπτογράφηση…
|
encryptingFile = Κρυπτογράφηση…
|
||||||
decryptingFile = Αποκρυπτογράφηση…
|
decryptingFile = Αποκρυπτογράφηση…
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Ξεκλείδωμα
|
|||||||
downloadButtonLabel = Λήψη
|
downloadButtonLabel = Λήψη
|
||||||
downloadFinish = Η λήψη ολοκληρώθηκε
|
downloadFinish = Η λήψη ολοκληρώθηκε
|
||||||
fileSizeProgress = ({ $partialSize } από { $totalSize })
|
fileSizeProgress = ({ $partialSize } από { $totalSize })
|
||||||
sendYourFilesLink = Δοκιμάστε το Firefox Send
|
sendYourFilesLink = Δοκιμάστε το Send
|
||||||
errorPageHeader = Κάτι πήγε στραβά!
|
errorPageHeader = Κάτι πήγε στραβά!
|
||||||
fileTooBig = Αυτό το αρχείο είναι πολύ μεγάλο για μεταφόρτωση. Πρέπει να είναι μικρότερο από { $size }.
|
fileTooBig = Αυτό το αρχείο είναι πολύ μεγάλο για μεταφόρτωση. Πρέπει να είναι μικρότερο από { $size }.
|
||||||
linkExpiredAlt = Ο σύνδεσμος έληξε
|
linkExpiredAlt = Ο σύνδεσμος έληξε
|
||||||
notSupportedHeader = Το πρόγραμμα περιήγησής σας δεν υποστηρίζεται.
|
notSupportedHeader = Το πρόγραμμα περιήγησής σας δεν υποστηρίζεται.
|
||||||
notSupportedLink = Γιατί δεν υποστηρίζεται το πρόγραμμα περιήγησής μου;
|
notSupportedLink = Γιατί δεν υποστηρίζεται το πρόγραμμα περιήγησής μου;
|
||||||
notSupportedOutdatedDetail = Δυστυχώς, αυτή η έκδοση του Firefox δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Firefox Send. Πρέπει να ενημερώσετε το πρόγραμμα περιήγησής σας.
|
notSupportedOutdatedDetail = Δυστυχώς, αυτή η έκδοση του Firefox δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Send. Πρέπει να ενημερώσετε το πρόγραμμα περιήγησής σας.
|
||||||
updateFirefox = Ενημέρωση Firefox
|
updateFirefox = Ενημέρωση Firefox
|
||||||
deletePopupCancel = Ακύρωση
|
deletePopupCancel = Ακύρωση
|
||||||
deleteButtonHover = Διαγραφή
|
deleteButtonHover = Διαγραφή
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Νομικά
|
|||||||
footerLinkPrivacy = Απόρρητο
|
footerLinkPrivacy = Απόρρητο
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Λάθος κωδικός πρόσβασης. Δοκιμάστε ξανά.
|
passwordTryAgain = Λάθος κωδικός πρόσβασης. Δοκιμάστε ξανά.
|
||||||
javascriptRequired = Το Firefox Send απαιτεί JavaScript
|
javascriptRequired = Το Send απαιτεί JavaScript
|
||||||
whyJavascript = Γιατί το Firefox Send απαιτεί JavaScript;
|
whyJavascript = Γιατί το Send απαιτεί JavaScript;
|
||||||
enableJavascript = Παρακαλώ ενεργοποιήστε το JavaScript και δοκιμάστε ξανά.
|
enableJavascript = Παρακαλώ ενεργοποιήστε το JavaScript και δοκιμάστε ξανά.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }ώ { $minutes }λ
|
expiresHoursMinutes = { $hours }ώ { $minutes }λ
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = Δεν ήταν δυνατός ο ορισμός αυτού
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
@@ -140,7 +137,7 @@ accountBenefitSync = Διαχειριστείτε τα διαμοιρασμέν
|
|||||||
accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla }
|
accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla }
|
||||||
signOut = Αποσύνδεση
|
signOut = Αποσύνδεση
|
||||||
okButton = OK
|
okButton = OK
|
||||||
downloadingTitle = Λήψη
|
downloadingTitle = Γίνεται λήψη
|
||||||
noStreamsWarning = Αυτό το πρόγραμμα περιήγησης ενδέχεται να μην μπορέσει να αποκρυπτογραφήσει αρχεία αυτού του μεγέθους.
|
noStreamsWarning = Αυτό το πρόγραμμα περιήγησης ενδέχεται να μην μπορέσει να αποκρυπτογραφήσει αρχεία αυτού του μεγέθους.
|
||||||
noStreamsOptionCopy = Αντιγράψτε το σύνδεσμο για άνοιγμα σε άλλο πρόγραμμα περιήγησης
|
noStreamsOptionCopy = Αντιγράψτε το σύνδεσμο για άνοιγμα σε άλλο πρόγραμμα περιήγησης
|
||||||
noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης
|
noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Feedback
|
|
||||||
importingFile = Importing…
|
importingFile = Importing…
|
||||||
encryptingFile = Encrypting…
|
encryptingFile = Encrypting…
|
||||||
decryptingFile = Decrypting…
|
decryptingFile = Decrypting…
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Unlock
|
|||||||
downloadButtonLabel = Download
|
downloadButtonLabel = Download
|
||||||
downloadFinish = Download Complete
|
downloadFinish = Download Complete
|
||||||
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
||||||
sendYourFilesLink = Try Firefox Send
|
sendYourFilesLink = Try Send
|
||||||
errorPageHeader = Something went wrong!
|
errorPageHeader = Something went wrong!
|
||||||
fileTooBig = That file is too big to upload. It should be less than { $size }.
|
fileTooBig = That file is too big to upload. It should be less than { $size }.
|
||||||
linkExpiredAlt = Link expired
|
linkExpiredAlt = Link expired
|
||||||
notSupportedHeader = Your browser is not supported.
|
notSupportedHeader = Your browser is not supported.
|
||||||
notSupportedLink = Why is my browser not supported?
|
notSupportedLink = Why is my browser not supported?
|
||||||
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser.
|
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser.
|
||||||
updateFirefox = Update Firefox
|
updateFirefox = Update Firefox
|
||||||
deletePopupCancel = Cancel
|
deletePopupCancel = Cancel
|
||||||
deleteButtonHover = Delete
|
deleteButtonHover = Delete
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Legal
|
|||||||
footerLinkPrivacy = Privacy
|
footerLinkPrivacy = Privacy
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Incorrect password. Try again.
|
passwordTryAgain = Incorrect password. Try again.
|
||||||
javascriptRequired = Firefox Send requires JavaScript
|
javascriptRequired = Send requires JavaScript
|
||||||
whyJavascript = Why does Firefox Send require JavaScript?
|
whyJavascript = Why does Send require JavaScript?
|
||||||
enableJavascript = Please enable JavaScript and try again.
|
enableJavascript = Please enable JavaScript and try again.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = This password could not be set
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Feedback
|
|
||||||
importingFile = Importing…
|
importingFile = Importing…
|
||||||
encryptingFile = Encrypting…
|
encryptingFile = Encrypting…
|
||||||
decryptingFile = Decrypting…
|
decryptingFile = Decrypting…
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Unlock
|
|||||||
downloadButtonLabel = Download
|
downloadButtonLabel = Download
|
||||||
downloadFinish = Download Complete
|
downloadFinish = Download Complete
|
||||||
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
||||||
sendYourFilesLink = Try Firefox Send
|
sendYourFilesLink = Try Send
|
||||||
errorPageHeader = Something went wrong!
|
errorPageHeader = Something went wrong!
|
||||||
fileTooBig = That file is too big to upload. It should be less than { $size }.
|
fileTooBig = That file is too big to upload. It should be less than { $size }.
|
||||||
linkExpiredAlt = Link expired
|
linkExpiredAlt = Link expired
|
||||||
notSupportedHeader = Your browser is not supported.
|
notSupportedHeader = Your browser is not supported.
|
||||||
notSupportedLink = Why is my browser not supported?
|
notSupportedLink = Why is my browser not supported?
|
||||||
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser.
|
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser.
|
||||||
updateFirefox = Update Firefox
|
updateFirefox = Update Firefox
|
||||||
deletePopupCancel = Cancel
|
deletePopupCancel = Cancel
|
||||||
deleteButtonHover = Delete
|
deleteButtonHover = Delete
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Legal
|
|||||||
footerLinkPrivacy = Privacy
|
footerLinkPrivacy = Privacy
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Incorrect password. Try again.
|
passwordTryAgain = Incorrect password. Try again.
|
||||||
javascriptRequired = Firefox Send requires JavaScript
|
javascriptRequired = Send requires JavaScript
|
||||||
whyJavascript = Why does Firefox Send require JavaScript?
|
whyJavascript = Why does Send require JavaScript?
|
||||||
enableJavascript = Please enable JavaScript and try again.
|
enableJavascript = Please enable JavaScript and try again.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = This password could not be set
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Feedback
|
|
||||||
importingFile = Importing…
|
importingFile = Importing…
|
||||||
encryptingFile = Encrypting…
|
encryptingFile = Encrypting…
|
||||||
decryptingFile = Decrypting…
|
decryptingFile = Decrypting…
|
||||||
@@ -18,13 +16,13 @@ unlockButtonLabel = Unlock
|
|||||||
downloadButtonLabel = Download
|
downloadButtonLabel = Download
|
||||||
downloadFinish = Download complete
|
downloadFinish = Download complete
|
||||||
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
||||||
sendYourFilesLink = Try Firefox Send
|
sendYourFilesLink = Try Send
|
||||||
errorPageHeader = Something went wrong!
|
errorPageHeader = Something went wrong!
|
||||||
fileTooBig = That file is too big to upload. It should be less than { $size }
|
fileTooBig = That file is too big to upload. It should be less than { $size }
|
||||||
linkExpiredAlt = Link expired
|
linkExpiredAlt = Link expired
|
||||||
notSupportedHeader = Your browser is not supported.
|
notSupportedHeader = Your browser is not supported.
|
||||||
notSupportedLink = Why is my browser not supported?
|
notSupportedLink = Why is my browser not supported?
|
||||||
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser.
|
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser.
|
||||||
updateFirefox = Update Firefox
|
updateFirefox = Update Firefox
|
||||||
deletePopupCancel = Cancel
|
deletePopupCancel = Cancel
|
||||||
deleteButtonHover = Delete
|
deleteButtonHover = Delete
|
||||||
@@ -32,8 +30,8 @@ footerLinkLegal = Legal
|
|||||||
footerLinkPrivacy = Privacy
|
footerLinkPrivacy = Privacy
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Incorrect password. Try again.
|
passwordTryAgain = Incorrect password. Try again.
|
||||||
javascriptRequired = Firefox Send requires JavaScript
|
javascriptRequired = Send requires JavaScript
|
||||||
whyJavascript = Why does Firefox Send require JavaScript?
|
whyJavascript = Why does Send require JavaScript?
|
||||||
enableJavascript = Please enable JavaScript and try again.
|
enableJavascript = Please enable JavaScript and try again.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -46,8 +44,7 @@ passwordSetError = This password could not be set
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
@@ -143,5 +140,4 @@ shareLinkDescription = Share the link to your file:
|
|||||||
shareLinkButton = Share link
|
shareLinkButton = Share link
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing
|
shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing
|
||||||
trailheadPromo = There is a way to protect your privacy. Join Firefox.
|
|
||||||
learnMore = Learn more.
|
learnMore = Learn more.
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Opinión
|
|
||||||
importingFile = Importando…
|
importingFile = Importando…
|
||||||
encryptingFile = Cifrando…
|
encryptingFile = Cifrando…
|
||||||
decryptingFile = Descifrando…
|
decryptingFile = Descifrando…
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Desbloquear
|
|||||||
downloadButtonLabel = Descargar
|
downloadButtonLabel = Descargar
|
||||||
downloadFinish = Descarga completa
|
downloadFinish = Descarga completa
|
||||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||||
sendYourFilesLink = Probá Firefox Send
|
sendYourFilesLink = Probá Send
|
||||||
errorPageHeader = ¡Algo falló!
|
errorPageHeader = ¡Algo falló!
|
||||||
fileTooBig = El archivo es demasiado grande para subir. Debería tener menos de { $size }.
|
fileTooBig = El archivo es demasiado grande para subir. Debería tener menos de { $size }.
|
||||||
linkExpiredAlt = Enlace explirado
|
linkExpiredAlt = Enlace explirado
|
||||||
notSupportedHeader = El navegador no está soportado.
|
notSupportedHeader = El navegador no está soportado.
|
||||||
notSupportedLink = ¿Por qué mi navegador no está soportado?
|
notSupportedLink = ¿Por qué mi navegador no está soportado?
|
||||||
notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox no soporta la tecnología web que necesita Firefox Send. Necesitás actualizar el navegador.
|
notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox no soporta la tecnología web que necesita Send. Necesitás actualizar el navegador.
|
||||||
updateFirefox = Actualizar Firefox
|
updateFirefox = Actualizar Firefox
|
||||||
deletePopupCancel = Cancelar
|
deletePopupCancel = Cancelar
|
||||||
deleteButtonHover = Borrar
|
deleteButtonHover = Borrar
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Legales
|
|||||||
footerLinkPrivacy = Privacidad
|
footerLinkPrivacy = Privacidad
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Contraseña incorrecta. Intentá nuevamente.
|
passwordTryAgain = Contraseña incorrecta. Intentá nuevamente.
|
||||||
javascriptRequired = Firefox Send requiere JavaScript
|
javascriptRequired = Send requiere JavaScript
|
||||||
whyJavascript = ¿Por qué Firefox Send requiere Java Script?
|
whyJavascript = ¿Por qué Send requiere Java Script?
|
||||||
enableJavascript = Por favor habilite JavaScript y pruebe de nuevo.
|
enableJavascript = Por favor habilite JavaScript y pruebe de nuevo.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = h { $hours } m { $minutes }
|
expiresHoursMinutes = h { $hours } m { $minutes }
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = No se pudo establecer la contraseña
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Comentarios
|
|
||||||
importingFile = Importando…
|
importingFile = Importando…
|
||||||
encryptingFile = Cifrando…
|
encryptingFile = Cifrando…
|
||||||
decryptingFile = Descifrando…
|
decryptingFile = Descifrando…
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Desbloquear
|
|||||||
downloadButtonLabel = Descargar
|
downloadButtonLabel = Descargar
|
||||||
downloadFinish = Descarga completa
|
downloadFinish = Descarga completa
|
||||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||||
sendYourFilesLink = Probar Firefox Send
|
sendYourFilesLink = Probar Send
|
||||||
errorPageHeader = ¡Algo se fue a las pailas!
|
errorPageHeader = ¡Algo se fue a las pailas!
|
||||||
fileTooBig = Ese archivo es muy grande para ser subido. Debiera tener un tamaño menor a { $size }.
|
fileTooBig = Ese archivo es muy grande para ser subido. Debiera tener un tamaño menor a { $size }.
|
||||||
linkExpiredAlt = Enlace expirado
|
linkExpiredAlt = Enlace expirado
|
||||||
notSupportedHeader = Tu navegador no está soportado.
|
notSupportedHeader = Tu navegador no está soportado.
|
||||||
notSupportedLink = ¿Por qué mi navegador no es soportado?
|
notSupportedLink = ¿Por qué mi navegador no es soportado?
|
||||||
notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador.
|
notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Send. Deberás actualizar tu navegador.
|
||||||
updateFirefox = Actualizar Firefox
|
updateFirefox = Actualizar Firefox
|
||||||
deletePopupCancel = Cancelar
|
deletePopupCancel = Cancelar
|
||||||
deleteButtonHover = Eliminar
|
deleteButtonHover = Eliminar
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Legal
|
|||||||
footerLinkPrivacy = Privacidad
|
footerLinkPrivacy = Privacidad
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Contraseña incorrecta. Vuelve a intentarlo.
|
passwordTryAgain = Contraseña incorrecta. Vuelve a intentarlo.
|
||||||
javascriptRequired = Firefox Send requiere JavaScript.
|
javascriptRequired = Send requiere JavaScript.
|
||||||
whyJavascript = ¿Por qué Firefox Send requiere JavaScript?
|
whyJavascript = ¿Por qué Send requiere JavaScript?
|
||||||
enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo.
|
enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -48,12 +46,11 @@ passwordSetError = Esta contraseña no pudo ser establecida
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Intercambio de archivos sencillo y privado
|
introTitle = Intercambio de archivos simple y privado
|
||||||
introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que expira automáticamente. Así puedes mantener lo que compartes en privado y asegurarte de que tus cosas no permanezcan en línea para siempre.
|
introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que expira automáticamente. Así puedes mantener lo que compartes en privado y asegurarte de que tus cosas no permanezcan en línea para siempre.
|
||||||
notifyUploadEncryptDone = Tu archivo está cifrado y listo para enviar
|
notifyUploadEncryptDone = Tu archivo está cifrado y listo para enviar
|
||||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
@@ -95,7 +92,7 @@ copyLinkDescription = Copiar el enlace para compartir el archivo:
|
|||||||
copyLinkButton = Copiar enlace
|
copyLinkButton = Copiar enlace
|
||||||
downloadTitle = Bajando archivos
|
downloadTitle = Bajando archivos
|
||||||
downloadDescription = Este archivo fue compartido a través de { -send-brand } con cifrado de punto a punto y un enlace que expira automáticamente.
|
downloadDescription = Este archivo fue compartido a través de { -send-brand } con cifrado de punto a punto y un enlace que expira automáticamente.
|
||||||
trySendDescription = Prueba { -send-brand } para compartir archivos de forma sencilla y segura.
|
trySendDescription = Prueba { -send-brand } para compartir archivos de forma simple y segura.
|
||||||
# count will always be > 10
|
# count will always be > 10
|
||||||
tooManyFiles =
|
tooManyFiles =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Comentario
|
|
||||||
importingFile = Importando...
|
importingFile = Importando...
|
||||||
encryptingFile = Encriptando...
|
encryptingFile = Cifrando...
|
||||||
decryptingFile = Desencriptando...
|
decryptingFile = Descifrando...
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 descarga
|
[one] 1 descarga
|
||||||
@@ -20,22 +18,22 @@ unlockButtonLabel = Desbloquear
|
|||||||
downloadButtonLabel = Descargar
|
downloadButtonLabel = Descargar
|
||||||
downloadFinish = Descarga completa
|
downloadFinish = Descarga completa
|
||||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||||
sendYourFilesLink = Prueba Firefox Send
|
sendYourFilesLink = Prueba Send
|
||||||
errorPageHeader = ¡Se produjo un error!
|
errorPageHeader = ¡Se ha producido un error!
|
||||||
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
|
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
|
||||||
linkExpiredAlt = Enlace caducado
|
linkExpiredAlt = Enlace caducado
|
||||||
notSupportedHeader = Tu navegador no está admitido.
|
notSupportedHeader = Tu navegador no es compatible.
|
||||||
notSupportedLink = ¿Por qué no se admite mi navegador?
|
notSupportedLink = ¿Por qué mi navegador no es compatible?
|
||||||
notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Firefox Send. Tendrás que actualizar tu navegador.
|
notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Send. Tendrás que actualizar tu navegador.
|
||||||
updateFirefox = Actualizar Firefox
|
updateFirefox = Actualizar Firefox
|
||||||
deletePopupCancel = Cancelar
|
deletePopupCancel = Cancelar
|
||||||
deleteButtonHover = Eliminar
|
deleteButtonHover = Eliminar
|
||||||
footerLinkLegal = Legal
|
footerLinkLegal = Legal
|
||||||
footerLinkPrivacy = Privacidad
|
footerLinkPrivacy = Privacidad
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Contraseña incorrecta. Inténtelo de nuevo.
|
passwordTryAgain = Contraseña incorrecta. Inténtalo de nuevo.
|
||||||
javascriptRequired = Firefox Send requiere JavaScript
|
javascriptRequired = Send requiere JavaScript
|
||||||
whyJavascript = ¿Por qué Firefox Send requiere JavaScript?
|
whyJavascript = ¿Por qué Send requiere JavaScript?
|
||||||
enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo.
|
enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = No se ha podido establecer la contraseña
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Enviar
|
-send-short-brand = Enviar
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Comentario
|
|
||||||
importingFile = Importando...
|
importingFile = Importando...
|
||||||
encryptingFile = Encriptando...
|
encryptingFile = Encriptando…
|
||||||
decryptingFile = Desencriptando...
|
decryptingFile = Desencriptando…
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 descarga
|
[one] 1 descarga
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Desbloquear
|
|||||||
downloadButtonLabel = Descargar
|
downloadButtonLabel = Descargar
|
||||||
downloadFinish = Descarga completa
|
downloadFinish = Descarga completa
|
||||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||||
sendYourFilesLink = Prueba Firefox Send
|
sendYourFilesLink = Prueba Send
|
||||||
errorPageHeader = ¡Algo salió mal!
|
errorPageHeader = ¡Algo salió mal!
|
||||||
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
|
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
|
||||||
linkExpiredAlt = Enlace caducado
|
linkExpiredAlt = Enlace caducado
|
||||||
notSupportedHeader = Tu navegador no está soportado.
|
notSupportedHeader = Tu navegador no está soportado.
|
||||||
notSupportedLink = ¿Por qué mi navegador no tiene soporte?
|
notSupportedLink = ¿Por qué mi navegador no tiene soporte?
|
||||||
notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador.
|
notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Send. Deberás actualizar tu navegador.
|
||||||
updateFirefox = Actualizar Firefox
|
updateFirefox = Actualizar Firefox
|
||||||
deletePopupCancel = Cancelar
|
deletePopupCancel = Cancelar
|
||||||
deleteButtonHover = Eliminar
|
deleteButtonHover = Eliminar
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Legal
|
|||||||
footerLinkPrivacy = Privacidad
|
footerLinkPrivacy = Privacidad
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
passwordTryAgain = Contraseña incorrecta. Intenta de nuevo.
|
passwordTryAgain = Contraseña incorrecta. Intenta de nuevo.
|
||||||
javascriptRequired = Firefox Send requiere JavaScript
|
javascriptRequired = Send requiere JavaScript
|
||||||
whyJavascript = ¿Por qué Firefox Send requiere JavaScript?
|
whyJavascript = ¿Por qué Send requiere JavaScript?
|
||||||
enableJavascript = Por favor, habilita JavaScript e intenta de nuevo.
|
enableJavascript = Por favor, habilita JavaScript e intenta de nuevo.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = No se ha podido establecer la contraseña
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Enviar
|
-send-short-brand = Enviar
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Tagasiside
|
|
||||||
importingFile = Importimine...
|
importingFile = Importimine...
|
||||||
encryptingFile = Krüptimine…
|
encryptingFile = Krüptimine…
|
||||||
decryptingFile = Dekrüptimine...
|
decryptingFile = Dekrüptimine...
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Ava
|
|||||||
downloadButtonLabel = Laadi alla
|
downloadButtonLabel = Laadi alla
|
||||||
downloadFinish = Allalaadimine lõpetati
|
downloadFinish = Allalaadimine lõpetati
|
||||||
fileSizeProgress = ({ $partialSize }/{ $totalSize })
|
fileSizeProgress = ({ $partialSize }/{ $totalSize })
|
||||||
sendYourFilesLink = Proovi Firefox Send'i
|
sendYourFilesLink = Proovi Send'i
|
||||||
errorPageHeader = Midagi läks valesti!
|
errorPageHeader = Midagi läks valesti!
|
||||||
fileTooBig = Fail on üleslaadimiseks liiga suur. See peaks olema väiksem kui { $size }.
|
fileTooBig = Fail on üleslaadimiseks liiga suur. See peaks olema väiksem kui { $size }.
|
||||||
linkExpiredAlt = Link on aegunud
|
linkExpiredAlt = Link on aegunud
|
||||||
notSupportedHeader = Sinu brauser pole toetatud.
|
notSupportedHeader = Sinu brauser pole toetatud.
|
||||||
notSupportedLink = Miks mu brauser toetatud pole?
|
notSupportedLink = Miks mu brauser toetatud pole?
|
||||||
notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama.
|
notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama.
|
||||||
updateFirefox = Uuenda Firefox
|
updateFirefox = Uuenda Firefox
|
||||||
deletePopupCancel = Loobu
|
deletePopupCancel = Loobu
|
||||||
deleteButtonHover = Kustuta
|
deleteButtonHover = Kustuta
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Õiguslik teave
|
|||||||
footerLinkPrivacy = Privaatsusest
|
footerLinkPrivacy = Privaatsusest
|
||||||
footerLinkCookies = Küpsistest
|
footerLinkCookies = Küpsistest
|
||||||
passwordTryAgain = Vale parool. Palun proovi uuesti.
|
passwordTryAgain = Vale parool. Palun proovi uuesti.
|
||||||
javascriptRequired = Firefox Send'i kasutamiseks tuleb JavaScript lubada
|
javascriptRequired = Send'i kasutamiseks tuleb JavaScript lubada
|
||||||
whyJavascript = Miks Firefox Send JavaScripti vajab?
|
whyJavascript = Miks Send JavaScripti vajab?
|
||||||
enableJavascript = Palun luba JavaScript ja proovi uuesti.
|
enableJavascript = Palun luba JavaScript ja proovi uuesti.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }t { $minutes }m
|
expiresHoursMinutes = { $hours }t { $minutes }m
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = Parooli muutmine ebaõnnestus
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
@@ -151,3 +148,5 @@ shareLinkDescription = Jaga linki failile:
|
|||||||
shareLinkButton = Jaga linki
|
shareLinkButton = Jaga linki
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Laadi “{ $name }” alla teenusega { -send-brand }, mis pakub lihtsat ja turvalist failijagamist
|
shareMessage = Laadi “{ $name }” alla teenusega { -send-brand }, mis pakub lihtsat ja turvalist failijagamist
|
||||||
|
trailheadPromo = Oma privaatsust on võimalik kaitsta. Liitu Firefoxiga.
|
||||||
|
learnMore = Rohkem teavet.
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
title = Send
|
||||||
title = Firefox Send
|
|
||||||
siteFeedback = Iritzia
|
|
||||||
importingFile = Inportatzen…
|
importingFile = Inportatzen…
|
||||||
encryptingFile = Zifratzen...
|
encryptingFile = Zifratzen...
|
||||||
decryptingFile = Deszifratzen...
|
decryptingFile = Deszifratzen...
|
||||||
@@ -20,13 +18,13 @@ unlockButtonLabel = Desblokeatu
|
|||||||
downloadButtonLabel = Deskargatu
|
downloadButtonLabel = Deskargatu
|
||||||
downloadFinish = Deskarga burututa
|
downloadFinish = Deskarga burututa
|
||||||
fileSizeProgress = ({ $totalSize } / { $partialSize })
|
fileSizeProgress = ({ $totalSize } / { $partialSize })
|
||||||
sendYourFilesLink = Probatu Firefox Send
|
sendYourFilesLink = Probatu Send
|
||||||
errorPageHeader = Zerbait gaizki joan da!
|
errorPageHeader = Zerbait gaizki joan da!
|
||||||
fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du.
|
fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du.
|
||||||
linkExpiredAlt = Lotura iraungi da
|
linkExpiredAlt = Lotura iraungi da
|
||||||
notSupportedHeader = Zure nabigatzailea ez da onartzen.
|
notSupportedHeader = Zure nabigatzailea ez da onartzen.
|
||||||
notSupportedLink = Zergatik ez da nire nabigatzailea onartzen?
|
notSupportedLink = Zergatik ez da nire nabigatzailea onartzen?
|
||||||
notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Firefox Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu.
|
notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu.
|
||||||
updateFirefox = Eguneratu Firefox
|
updateFirefox = Eguneratu Firefox
|
||||||
deletePopupCancel = Utzi
|
deletePopupCancel = Utzi
|
||||||
deleteButtonHover = Ezabatu
|
deleteButtonHover = Ezabatu
|
||||||
@@ -34,8 +32,8 @@ footerLinkLegal = Lege-oharra
|
|||||||
footerLinkPrivacy = Pribatutasuna
|
footerLinkPrivacy = Pribatutasuna
|
||||||
footerLinkCookies = Cookieak
|
footerLinkCookies = Cookieak
|
||||||
passwordTryAgain = Pasahitz okerra. Saiatu berriro.
|
passwordTryAgain = Pasahitz okerra. Saiatu berriro.
|
||||||
javascriptRequired = JavaScript beharrezkoa da Firefox Send erabiltzeko.
|
javascriptRequired = JavaScript beharrezkoa da Send erabiltzeko.
|
||||||
whyJavascript = Zergatik behar du Firefox Send-ek JavasScript?
|
whyJavascript = Zergatik behar du Send-ek JavasScript?
|
||||||
enableJavascript = Gaitu JavaScript eta saiatu berriro.
|
enableJavascript = Gaitu JavaScript eta saiatu berriro.
|
||||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||||
@@ -48,8 +46,7 @@ passwordSetError = Pasahitz hau ezin da ezarri
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
-send-brand = Send
|
||||||
-send-brand = Firefox Send
|
|
||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
|
|||||||