Compare commits
492 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
c2dd51c638 | ||
|
|
cdd98af86a | ||
|
|
883f2bc0f9 | ||
|
|
94f1eabbc7 | ||
|
|
902bc6628e | ||
|
|
460b741f17 | ||
|
|
d5c488196d | ||
|
|
9ad9c9feb2 | ||
|
|
6576e4a74c | ||
|
|
950872109e | ||
|
|
87051d27ed | ||
|
|
3451803b37 | ||
|
|
ac15153e8f | ||
|
|
924f5dc682 | ||
|
|
ff9be6a213 | ||
|
|
883728570e | ||
|
|
0435f17f9a | ||
|
|
1e1268fff0 | ||
|
|
252d7817e3 | ||
|
|
ce28c38ebe | ||
|
|
f0407f9beb | ||
|
|
c6f222eb57 | ||
|
|
6dd6135185 | ||
|
|
8df339b66d | ||
|
|
8702fda651 | ||
|
|
807ecff471 | ||
|
|
927c981cd7 | ||
|
|
7073cc8ce6 | ||
|
|
c925fae696 | ||
|
|
966d7a5e35 | ||
|
|
96c750c098 | ||
|
|
0729064753 | ||
|
|
259a5a5f24 | ||
|
|
27be72e0cd | ||
|
|
e4231bbc0f | ||
|
|
1d184f06bf | ||
|
|
f7b46a99ac | ||
|
|
3fadb489c7 | ||
|
|
6378676c2d | ||
|
|
014d84e4c7 | ||
|
|
a08d8435a9 | ||
|
|
40a05c9ecf | ||
|
|
527040afef | ||
|
|
a48a447808 | ||
|
|
f3569d7f98 | ||
|
|
6ca7d11efb | ||
|
|
b71ae4a0ff | ||
|
|
7ba25664b5 | ||
|
|
80fb42ad3d | ||
|
|
f036df5f47 | ||
|
|
20c063db7c | ||
|
|
a6b43c9eef | ||
|
|
c80f9ada65 | ||
|
|
e0ae5cb3c6 | ||
|
|
c0fb3d17be | ||
|
|
116f090b7e | ||
|
|
7cbd9716e2 | ||
|
|
58191975b9 | ||
|
|
76695aee5d | ||
|
|
b356b4cad3 | ||
|
|
63ddbeefc4 | ||
|
|
7b423b24b6 | ||
|
|
b67050b742 | ||
|
|
06242dfd38 | ||
|
|
3b8dbfd81c | ||
|
|
9c2fe39764 | ||
|
|
8b21d43bfa | ||
|
|
e7e39f4d4a | ||
|
|
e4c801d9a1 | ||
|
|
324f275dd4 | ||
|
|
594e0bd28e | ||
|
|
6a7fdfe780 | ||
|
|
0c82741b98 | ||
|
|
fe57734792 | ||
|
|
4754bed9b8 | ||
|
|
a60da467b9 | ||
|
|
362da2bbfc | ||
|
|
1a9ef4a246 | ||
|
|
f51dbbb8f5 | ||
|
|
e497107e59 | ||
|
|
10ad6fc1ae | ||
|
|
c982db4c75 | ||
|
|
cd8130563d | ||
|
|
730a569d43 | ||
|
|
769dae1bdc | ||
|
|
54a8c504ce | ||
|
|
92dc9a0f71 | ||
|
|
80a7c92056 | ||
|
|
c6ebea0100 | ||
|
|
039b5daaed | ||
|
|
4bf4e61c2c | ||
|
|
3c21e2a00f | ||
|
|
38a379d1de | ||
|
|
adeb19d974 | ||
|
|
744c410704 | ||
|
|
99ab3882eb | ||
|
|
7cdf566bcd | ||
|
|
b6e4877d93 | ||
|
|
b9c87fd779 | ||
|
|
6ef5b5133c | ||
|
|
b7d2420765 | ||
|
|
c139531c91 | ||
|
|
88fe3902bc | ||
|
|
645fd062ac | ||
|
|
ccb0b71df5 | ||
|
|
b8ec90a398 | ||
|
|
7ed5f37c66 | ||
|
|
c899129f9a | ||
|
|
1bb91690c5 | ||
|
|
073f6f67d3 | ||
|
|
533bfdb496 | ||
|
|
34de65d7d2 | ||
|
|
209fdf34f8 | ||
|
|
ba5c2a049d | ||
|
|
1528aa3f1b | ||
|
|
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: npm install
|
|
||||||
- save_cache:
|
|
||||||
key: send-int-{{ checksum "package-lock.json" }}
|
|
||||||
paths:
|
|
||||||
- node_modules
|
|
||||||
- run:
|
- 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
|
||||||
@@ -2,5 +2,6 @@ dist
|
|||||||
assets
|
assets
|
||||||
firefox
|
firefox
|
||||||
coverage
|
coverage
|
||||||
|
android/app/build
|
||||||
app/locale.js
|
app/locale.js
|
||||||
app/capabilities.js
|
app/capabilities.js
|
||||||
@@ -4,6 +4,7 @@ env:
|
|||||||
|
|
||||||
extends:
|
extends:
|
||||||
- eslint:recommended
|
- eslint:recommended
|
||||||
|
- prettier
|
||||||
- plugin:node/recommended
|
- plugin:node/recommended
|
||||||
- plugin:security/recommended
|
- plugin:security/recommended
|
||||||
|
|
||||||
@@ -18,17 +19,10 @@ 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
|
||||||
|
|
||||||
eol-last: [error, always]
|
|
||||||
eqeqeq: error
|
|
||||||
no-alert: warn
|
|
||||||
no-console: warn
|
|
||||||
no-path-concat: error
|
|
||||||
no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}]
|
no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}]
|
||||||
no-var: error
|
require-atomic-updates: warn
|
||||||
one-var: [error, never]
|
|
||||||
prefer-const: error
|
|
||||||
quotes: [error, single, {avoidEscape: true}]
|
|
||||||
|
|||||||
53
CONTRIBUTORS
@@ -1,18 +1,22 @@
|
|||||||
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
|
||||||
|
Aman Alam
|
||||||
Amin Mahmudian
|
Amin Mahmudian
|
||||||
Ander Elortondo
|
Ander Elortondo
|
||||||
Andreas Pettersson
|
Andreas Pettersson
|
||||||
Anesu Chiodza
|
Anesu Chiodza
|
||||||
Anika Dorn
|
Anika Dorn
|
||||||
|
Anish Sheela
|
||||||
Arash Mousavi
|
Arash Mousavi
|
||||||
Artem Polivanchuk
|
Artem Polivanchuk
|
||||||
Ashikur Rahman
|
Ashikur Rahman
|
||||||
Ashok kumar
|
Ashok kumar
|
||||||
|
Balasankar C
|
||||||
Balázs Meskó
|
Balázs Meskó
|
||||||
Belayet Hossain
|
Belayet Hossain
|
||||||
Benjamin Forehand Jr
|
Benjamin Forehand Jr
|
||||||
@@ -20,8 +24,11 @@ Besnik Bleta
|
|||||||
Björn I
|
Björn I
|
||||||
Bjørn I
|
Bjørn I
|
||||||
Boopesh Mahendran
|
Boopesh Mahendran
|
||||||
|
Brahim Essaidi
|
||||||
Brainlulz
|
Brainlulz
|
||||||
Breana Gonzales
|
Breana Gonzales
|
||||||
|
Christian Elbrianno
|
||||||
|
Christoph Kührer
|
||||||
Christopher Ramírez
|
Christopher Ramírez
|
||||||
Chuck Harmston
|
Chuck Harmston
|
||||||
Cloney 173741
|
Cloney 173741
|
||||||
@@ -31,6 +38,7 @@ Cynthia Pereira
|
|||||||
Daniel Thorn
|
Daniel Thorn
|
||||||
Daniela Arcese
|
Daniela Arcese
|
||||||
Danny Coates
|
Danny Coates
|
||||||
|
Davide
|
||||||
Derek Tamsen
|
Derek Tamsen
|
||||||
Dhyey Thakore
|
Dhyey Thakore
|
||||||
Donovan Preston
|
Donovan Preston
|
||||||
@@ -52,11 +60,17 @@ Frederick Villaluna
|
|||||||
G12r
|
G12r
|
||||||
Gabriela
|
Gabriela
|
||||||
Gautam krishna.R
|
Gautam krishna.R
|
||||||
|
George Raptis
|
||||||
Georgianizator
|
Georgianizator
|
||||||
Gonçalo Matos
|
Gonçalo Matos
|
||||||
|
Gwenn
|
||||||
|
Hampus
|
||||||
|
Hugo
|
||||||
|
Hugo Abreu
|
||||||
Hyeonseok Shin
|
Hyeonseok Shin
|
||||||
Håvar Henriksen
|
Håvar Henriksen
|
||||||
Ian Neal
|
Ian Neal
|
||||||
|
ItielMaN
|
||||||
Jae Hyeon Park
|
Jae Hyeon Park
|
||||||
Jakob Kappel
|
Jakob Kappel
|
||||||
Jakub Rychlý
|
Jakub Rychlý
|
||||||
@@ -65,6 +79,8 @@ Jarmo
|
|||||||
Jim Spentzos
|
Jim Spentzos
|
||||||
Jiri Grönroos
|
Jiri Grönroos
|
||||||
Jobava
|
Jobava
|
||||||
|
Joe Becher
|
||||||
|
Joe ST
|
||||||
Joergen
|
Joergen
|
||||||
Johann-S
|
Johann-S
|
||||||
John Gruen
|
John Gruen
|
||||||
@@ -79,12 +95,16 @@ 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
|
||||||
Laurent Jouanneau
|
Laurent Jouanneau
|
||||||
Lobodzets
|
Lobodzets
|
||||||
LuFlo
|
LuFlo
|
||||||
|
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
|
||||||
@@ -94,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
|
||||||
@@ -106,29 +127,38 @@ Michal Vašíček
|
|||||||
Mikeyy
|
Mikeyy
|
||||||
Miro Rauhala
|
Miro Rauhala
|
||||||
Mozilla Pontoon
|
Mozilla Pontoon
|
||||||
|
Mozilla-GitHub-Standards
|
||||||
Mozinet
|
Mozinet
|
||||||
Moḥend Belqasem
|
Moḥend Belqasem
|
||||||
|
Muhend Belkacem
|
||||||
Muḥend Belqasem
|
Muḥend Belqasem
|
||||||
Myungjae Won
|
Myungjae Won
|
||||||
Nicholas Skinsacos
|
Nicholas Skinsacos
|
||||||
Nihad
|
Nihad
|
||||||
Nihad Suljić
|
Nihad Suljić
|
||||||
|
Niksend Mizuhara
|
||||||
Oscar
|
Oscar
|
||||||
|
Paulius
|
||||||
|
Pedro Burlamaqui Bendahan
|
||||||
Peter deHaan
|
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
|
||||||
Rimas Kudelis
|
Rimas Kudelis
|
||||||
Rizky Ariestiyansyah
|
Rizky Ariestiyansyah
|
||||||
Rob Powell
|
Rob Powell
|
||||||
|
Robert
|
||||||
Roberto Alvarado
|
Roberto Alvarado
|
||||||
Rodrigo
|
Rodrigo
|
||||||
Rodrigo Guerra
|
Rodrigo Guerra
|
||||||
Rok Žerdin
|
Rok Žerdin
|
||||||
|
Romi Hardiyanto
|
||||||
Rongjian Zhang
|
Rongjian Zhang
|
||||||
Ruba
|
Ruba
|
||||||
Sahithi
|
Sahithi
|
||||||
@@ -139,9 +169,13 @@ Sara Todaro
|
|||||||
Sav22999
|
Sav22999
|
||||||
Schieck :)
|
Schieck :)
|
||||||
Selim Şumlu
|
Selim Şumlu
|
||||||
|
Selyan Sliman Amiri
|
||||||
|
Sidak Singh Aulakh
|
||||||
Slimane Amiri
|
Slimane Amiri
|
||||||
|
Slimane Selyan AMIRI
|
||||||
Soumya Himanish Mohapatra
|
Soumya Himanish Mohapatra
|
||||||
Staś Małolepszy
|
Staś Małolepszy
|
||||||
|
Suriyaa ✌️️
|
||||||
Tema
|
Tema
|
||||||
Thomas Dalichow
|
Thomas Dalichow
|
||||||
Théo Chevalier
|
Théo Chevalier
|
||||||
@@ -150,6 +184,7 @@ Tim Visée
|
|||||||
Tomer Cohen
|
Tomer Cohen
|
||||||
Tomáš Zelina
|
Tomáš Zelina
|
||||||
Ton
|
Ton
|
||||||
|
Top
|
||||||
Tymur Faradzhev
|
Tymur Faradzhev
|
||||||
Uccen Marzuq
|
Uccen Marzuq
|
||||||
Varghese Thomas
|
Varghese Thomas
|
||||||
@@ -157,8 +192,10 @@ 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
|
||||||
Yongmin H
|
Yongmin H
|
||||||
You-Wen Liang (Mark)
|
You-Wen Liang (Mark)
|
||||||
aaaaalbert
|
aaaaalbert
|
||||||
@@ -169,6 +206,7 @@ alex_mayorga
|
|||||||
ariestiyansyah
|
ariestiyansyah
|
||||||
avelper
|
avelper
|
||||||
chilledfrogs
|
chilledfrogs
|
||||||
|
clouserw-mozilla-owner
|
||||||
dgadelha
|
dgadelha
|
||||||
dskmori
|
dskmori
|
||||||
ehuggett
|
ehuggett
|
||||||
@@ -180,25 +218,37 @@ gmontagu
|
|||||||
goofy
|
goofy
|
||||||
hello
|
hello
|
||||||
hi
|
hi
|
||||||
|
ivan.pompa
|
||||||
jesferman1993
|
jesferman1993
|
||||||
jlG
|
jlG
|
||||||
josotrix
|
josotrix
|
||||||
jspam
|
jspam
|
||||||
|
julen
|
||||||
julenx
|
julenx
|
||||||
kenrick95
|
kenrick95
|
||||||
|
kumincir
|
||||||
|
leo.toneff
|
||||||
|
m4hdi.pdroid
|
||||||
|
mail
|
||||||
manxmensch
|
manxmensch
|
||||||
marigalicer
|
marigalicer
|
||||||
|
marsf
|
||||||
|
merianosnikos
|
||||||
mirzet.omerovic.1992
|
mirzet.omerovic.1992
|
||||||
|
mujeebcpy
|
||||||
|
p.sanroman.bengoetxea
|
||||||
passionforlife
|
passionforlife
|
||||||
paul.trevor
|
paul.trevor
|
||||||
pyup.io bot
|
pyup.io bot
|
||||||
ravmn
|
ravmn
|
||||||
rcmainak
|
rcmainak
|
||||||
reza.habibi2008
|
reza.habibi2008
|
||||||
|
rgpublic
|
||||||
risger
|
risger
|
||||||
robbp
|
robbp
|
||||||
ruikunai
|
ruikunai
|
||||||
savemore99.sm
|
savemore99.sm
|
||||||
|
sergio
|
||||||
shikhar-scs
|
shikhar-scs
|
||||||
siparon
|
siparon
|
||||||
skystar-p
|
skystar-p
|
||||||
@@ -210,10 +260,13 @@ victor.gonzalezro
|
|||||||
xcffl
|
xcffl
|
||||||
ybouhamam
|
ybouhamam
|
||||||
yoshimitsu002
|
yoshimitsu002
|
||||||
|
yusup.ramdani
|
||||||
Μιχάλης
|
Μιχάλης
|
||||||
Марко Костић (Marko Kostić)
|
Марко Костић (Marko Kostić)
|
||||||
|
Ратко Вујановић
|
||||||
صفا الفليج
|
صفا الفليج
|
||||||
వీవెన్
|
వీవెన్
|
||||||
|
ജോയ്സ്
|
||||||
张无忌
|
张无忌
|
||||||
新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美
|
新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美
|
||||||
莫非前世那一眼
|
莫非前世那一眼
|
||||||
|
|||||||
62
Dockerfile
@@ -1,18 +1,60 @@
|
|||||||
FROM node:10 AS builder
|
##
|
||||||
RUN addgroup --gid 10001 app && adduser --disabled-password --gecos '' --gid 10001 --home /app --uid 10001 app
|
# Firefox Send - Mozilla
|
||||||
COPY package*.json /app/
|
#
|
||||||
WORKDIR /app
|
# License https://github.com/mozilla/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
|
||||||
|
RUN npm i -g npm
|
||||||
|
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
|
||||||
|
&& 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 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"]
|
||||||
|
|||||||
17
README.md
@@ -1,4 +1,4 @@
|
|||||||
# [](https://send.firefox.com/)
|
# [](https://send.firefox.com/) Firefox Send
|
||||||
|
|
||||||
[](https://circleci.com/gh/mozilla/send)
|
[](https://circleci.com/gh/mozilla/send)
|
||||||
|
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
* [Localization](#localization)
|
* [Localization](#localization)
|
||||||
* [Contributing](#contributing)
|
* [Contributing](#contributing)
|
||||||
* [Testing](#testing)
|
* [Testing](#testing)
|
||||||
|
* [Deployment](#deployment)
|
||||||
* [Android](#android)
|
* [Android](#android)
|
||||||
* [License](#license)
|
* [License](#license)
|
||||||
|
|
||||||
@@ -29,22 +30,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
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -91,6 +92,12 @@ Pull requests are always welcome! Feel free to check out the list of ["good firs
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
see also [docs/deployment.md](docs/deployment.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Android
|
## Android
|
||||||
|
|
||||||
The android implementation is contained in the `android` directory, and can be viewed locally for easy testing and editing by running `ANDROID=1 npm start` and then visiting <http://localhost:8080>. CSS and image files are located in the `android/app/src/main/assets` directory.
|
The android implementation is contained in the `android` directory, and can be viewed locally for easy testing and editing by running `ANDROID=1 npm start` and then visiting <http://localhost:8080>. CSS and image files are located in the `android/app/src/main/assets` directory.
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
/* global window, navigator */
|
import 'intl-pluralrules';
|
||||||
import 'fluent-intl-polyfill';
|
|
||||||
import choo from 'choo';
|
import choo from 'choo';
|
||||||
import html from 'choo/html';
|
import html from 'choo/html';
|
||||||
import Raven from 'raven-js';
|
import * as Sentry from '@sentry/browser';
|
||||||
|
|
||||||
import { setApiUrlPrefix, getConstants } from '../app/api';
|
import { setApiUrlPrefix, getConstants } from '../app/api';
|
||||||
import metrics from '../app/metrics';
|
import metrics from '../app/metrics';
|
||||||
@@ -53,7 +52,7 @@ function body(main) {
|
|||||||
|
|
||||||
const menu = html`<a
|
const menu = html`<a
|
||||||
id="hamburger"
|
id="hamburger"
|
||||||
class="absolute pin-t pin-r z-50"
|
class="absolute top-0 right-0 z-50"
|
||||||
href="#"
|
href="#"
|
||||||
onclick="${clickPreferences}"
|
onclick="${clickPreferences}"
|
||||||
>
|
>
|
||||||
@@ -61,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>
|
||||||
`;
|
`;
|
||||||
@@ -83,7 +80,7 @@ function body(main) {
|
|||||||
state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS);
|
state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS);
|
||||||
state.storage = storage;
|
state.storage = storage;
|
||||||
state.user = new User(storage, LIMITS);
|
state.user = new User(storage, LIMITS);
|
||||||
state.raven = Raven;
|
state.sentry = Sentry;
|
||||||
});
|
});
|
||||||
app.use(metrics);
|
app.use(metrics);
|
||||||
app.route('/', body(home));
|
app.route('/', body(home));
|
||||||
|
|||||||
@@ -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}"
|
||||||
>
|
>
|
||||||
@@ -42,11 +42,7 @@ module.exports = function(state, emit) {
|
|||||||
content =
|
content =
|
||||||
archives.length < 1
|
archives.length < 1
|
||||||
? intro(state)
|
? intro(state)
|
||||||
: list(
|
: list(archives, 'h-full overflow-y-auto w-full', 'mb-3 w-full');
|
||||||
archives,
|
|
||||||
'list-reset h-full overflow-y-auto w-full',
|
|
||||||
'mb-3 w-full'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
@@ -57,7 +53,7 @@ module.exports = function(state, emit) {
|
|||||||
>
|
>
|
||||||
${content}
|
${content}
|
||||||
</section>
|
</section>
|
||||||
<div class="fixed pin-r pin-b z-20">
|
<div class="fixed right-0 bottom-0 z-20">
|
||||||
${button}
|
${button}
|
||||||
<input
|
<input
|
||||||
id="file-upload"
|
id="file-upload"
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export default function initialState(state, emitter) {
|
|||||||
getAsset(name) {
|
getAsset(name) {
|
||||||
return `${state.prefix}/${name}`;
|
return `${state.prefix}/${name}`;
|
||||||
},
|
},
|
||||||
raven: {
|
sentry: {
|
||||||
captureException: e => {
|
captureException: e => {
|
||||||
console.error('ERROR ' + e + ' ' + e.stack);
|
console.error('ERROR ' + e + ' ' + e.stack);
|
||||||
}
|
}
|
||||||
|
|||||||
78
app/api.js
@@ -11,6 +11,15 @@ if (!fileProtocolWssUrl) {
|
|||||||
fileProtocolWssUrl = 'wss://send.firefox.com/api/ws';
|
fileProtocolWssUrl = 'wss://send.firefox.com/api/ws';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class ConnectionError extends Error {
|
||||||
|
constructor(cancelled, duration, size) {
|
||||||
|
super(cancelled ? '0' : 'connection closed');
|
||||||
|
this.cancelled = cancelled;
|
||||||
|
this.duration = duration;
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function setFileProtocolWssUrl(url) {
|
export function setFileProtocolWssUrl(url) {
|
||||||
localStorage && localStorage.setItem('wssURL', url);
|
localStorage && localStorage.setItem('wssURL', url);
|
||||||
fileProtocolWssUrl = url;
|
fileProtocolWssUrl = url;
|
||||||
@@ -137,17 +146,25 @@ export async function setPassword(id, owner_token, keychain) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function asyncInitWebSocket(server) {
|
function asyncInitWebSocket(server) {
|
||||||
return new Promise(resolve => {
|
return new Promise((resolve, reject) => {
|
||||||
const ws = new WebSocket(server);
|
try {
|
||||||
ws.onopen = () => {
|
const ws = new WebSocket(server);
|
||||||
resolve(ws);
|
ws.addEventListener('open', () => resolve(ws), { once: true });
|
||||||
};
|
} catch (e) {
|
||||||
|
reject(new ConnectionError(false));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function listenForResponse(ws, canceller) {
|
function listenForResponse(ws, canceller) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
function handleClose(event) {
|
||||||
|
// a 'close' event before a 'message' event means the request failed
|
||||||
|
ws.removeEventListener('message', handleMessage);
|
||||||
|
reject(new ConnectionError(canceller.cancelled));
|
||||||
|
}
|
||||||
function handleMessage(msg) {
|
function handleMessage(msg) {
|
||||||
|
ws.removeEventListener('close', handleClose);
|
||||||
try {
|
try {
|
||||||
const response = JSON.parse(msg.data);
|
const response = JSON.parse(msg.data);
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
@@ -156,13 +173,11 @@ function listenForResponse(ws, canceller) {
|
|||||||
resolve(response);
|
resolve(response);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ws.close();
|
|
||||||
canceller.cancelled = true;
|
|
||||||
canceller.error = e;
|
|
||||||
reject(e);
|
reject(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ws.addEventListener('message', handleMessage, { once: true });
|
ws.addEventListener('message', handleMessage, { once: true });
|
||||||
|
ws.addEventListener('close', handleClose, { once: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,6 +191,8 @@ async function upload(
|
|||||||
onprogress,
|
onprogress,
|
||||||
canceller
|
canceller
|
||||||
) {
|
) {
|
||||||
|
let size = 0;
|
||||||
|
const start = Date.now();
|
||||||
const host = window.location.hostname;
|
const host = window.location.hostname;
|
||||||
const port = window.location.port;
|
const port = window.location.port;
|
||||||
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||||
@@ -203,31 +220,41 @@ async function upload(
|
|||||||
|
|
||||||
const reader = stream.getReader();
|
const reader = stream.getReader();
|
||||||
let state = await reader.read();
|
let state = await reader.read();
|
||||||
let size = 0;
|
|
||||||
while (!state.done) {
|
while (!state.done) {
|
||||||
const buf = state.value;
|
|
||||||
if (canceller.cancelled) {
|
if (canceller.cancelled) {
|
||||||
throw canceller.error;
|
ws.close();
|
||||||
}
|
}
|
||||||
|
if (ws.readyState !== WebSocket.OPEN) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const buf = state.value;
|
||||||
ws.send(buf);
|
ws.send(buf);
|
||||||
|
|
||||||
onprogress(size);
|
onprogress(size);
|
||||||
size += buf.length;
|
size += buf.length;
|
||||||
state = await reader.read();
|
state = await reader.read();
|
||||||
while (ws.bufferedAmount > ECE_RECORD_SIZE * 2) {
|
while (
|
||||||
|
ws.bufferedAmount > ECE_RECORD_SIZE * 2 &&
|
||||||
|
ws.readyState === WebSocket.OPEN &&
|
||||||
|
!canceller.cancelled
|
||||||
|
) {
|
||||||
await delay();
|
await delay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const footer = new Uint8Array([0]);
|
if (ws.readyState === WebSocket.OPEN) {
|
||||||
ws.send(footer);
|
ws.send(new Uint8Array([0])); //EOF
|
||||||
|
}
|
||||||
|
|
||||||
await completedResponse;
|
await completedResponse;
|
||||||
ws.close();
|
uploadInfo.duration = Date.now() - start;
|
||||||
return uploadInfo;
|
return uploadInfo;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ws.close(4000);
|
e.size = size;
|
||||||
|
e.duration = Date.now() - start;
|
||||||
throw e;
|
throw e;
|
||||||
|
} finally {
|
||||||
|
if (![WebSocket.CLOSED, WebSocket.CLOSING].includes(ws.readyState)) {
|
||||||
|
ws.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,7 +271,6 @@ export function uploadWs(
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
cancel: function() {
|
cancel: function() {
|
||||||
canceller.error = new Error(0);
|
|
||||||
canceller.cancelled = true;
|
canceller.cancelled = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -284,7 +310,7 @@ async function downloadS(id, keychain, signal) {
|
|||||||
return response.body;
|
return response.body;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function tryDownloadStream(id, keychain, signal, tries = 1) {
|
async function tryDownloadStream(id, keychain, signal, tries = 2) {
|
||||||
try {
|
try {
|
||||||
const result = await downloadS(id, keychain, signal);
|
const result = await downloadS(id, keychain, signal);
|
||||||
return result;
|
return result;
|
||||||
@@ -306,18 +332,19 @@ export function downloadStream(id, keychain) {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
cancel,
|
cancel,
|
||||||
result: tryDownloadStream(id, keychain, controller.signal, 2)
|
result: tryDownloadStream(id, keychain, controller.signal)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////
|
//////////////////
|
||||||
|
|
||||||
function download(id, keychain, onprogress, canceller) {
|
async function download(id, keychain, onprogress, canceller) {
|
||||||
|
const auth = await keychain.authHeader();
|
||||||
const xhr = new XMLHttpRequest();
|
const xhr = new XMLHttpRequest();
|
||||||
canceller.oncancel = function() {
|
canceller.oncancel = function() {
|
||||||
xhr.abort();
|
xhr.abort();
|
||||||
};
|
};
|
||||||
return new Promise(async function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
xhr.addEventListener('loadend', function() {
|
xhr.addEventListener('loadend', function() {
|
||||||
canceller.oncancel = function() {};
|
canceller.oncancel = function() {};
|
||||||
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
|
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
|
||||||
@@ -337,7 +364,6 @@ function download(id, keychain, onprogress, canceller) {
|
|||||||
onprogress(event.loaded);
|
onprogress(event.loaded);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const auth = await keychain.authHeader();
|
|
||||||
xhr.open('get', getApiUrl(`/api/download/blob/${id}`));
|
xhr.open('get', getApiUrl(`/api/download/blob/${id}`));
|
||||||
xhr.setRequestHeader('Authorization', auth);
|
xhr.setRequestHeader('Authorization', auth);
|
||||||
xhr.responseType = 'blob';
|
xhr.responseType = 'blob';
|
||||||
@@ -346,7 +372,7 @@ function download(id, keychain, onprogress, canceller) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function tryDownload(id, keychain, onprogress, canceller, tries = 1) {
|
async function tryDownload(id, keychain, onprogress, canceller, tries = 2) {
|
||||||
try {
|
try {
|
||||||
const result = await download(id, keychain, onprogress, canceller);
|
const result = await download(id, keychain, onprogress, canceller);
|
||||||
return result;
|
return result;
|
||||||
@@ -367,7 +393,7 @@ export function downloadFile(id, keychain, onprogress) {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
cancel,
|
cancel,
|
||||||
result: tryDownload(id, keychain, onprogress, canceller, 2)
|
result: tryDownload(id, keychain, onprogress, canceller)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,8 +76,8 @@ async function polyfillStreams() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default async function getCapabilities() {
|
export default async function getCapabilities() {
|
||||||
const serviceWorker =
|
const browser = browserName();
|
||||||
'serviceWorker' in navigator && browserName() !== 'edge';
|
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
|
||||||
let crypto = await checkCrypto();
|
let crypto = await checkCrypto();
|
||||||
const nativeStreams = checkStreams();
|
const nativeStreams = checkStreams();
|
||||||
let polyStreams = false;
|
let polyStreams = false;
|
||||||
@@ -97,13 +97,16 @@ export default async function getCapabilities() {
|
|||||||
window.matchMedia('(display-mode: standalone)').matches ||
|
window.matchMedia('(display-mode: standalone)').matches ||
|
||||||
navigator.standalone;
|
navigator.standalone;
|
||||||
|
|
||||||
|
const mobileFirefox =
|
||||||
|
browser === 'firefox' && /mobile/i.test(navigator.userAgent);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
account,
|
account,
|
||||||
crypto,
|
crypto,
|
||||||
serviceWorker,
|
serviceWorker,
|
||||||
streamUpload: nativeStreams || polyStreams,
|
streamUpload: nativeStreams || polyStreams,
|
||||||
streamDownload:
|
streamDownload:
|
||||||
nativeStreams && serviceWorker && browserName() !== 'safari',
|
nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox,
|
||||||
multifile: nativeStreams || polyStreams,
|
multifile: nativeStreams || polyStreams,
|
||||||
share,
|
share,
|
||||||
standalone
|
standalone
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ export default function(state, emitter) {
|
|||||||
state.storage.remove(ownedFile.id);
|
state.storage.remove(ownedFile.id);
|
||||||
await ownedFile.del();
|
await ownedFile.del();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
state.raven.captureException(e);
|
state.sentry.captureException(e);
|
||||||
}
|
}
|
||||||
render();
|
render();
|
||||||
});
|
});
|
||||||
@@ -176,14 +176,17 @@ export default function(state, emitter) {
|
|||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.message === '0') {
|
if (err.message === '0') {
|
||||||
//cancelled. do nothing
|
//cancelled. do nothing
|
||||||
const duration = Date.now() - start;
|
metrics.cancelledUpload(archive, err.duration);
|
||||||
metrics.cancelledUpload(archive, duration);
|
|
||||||
render();
|
render();
|
||||||
} else {
|
} else {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.error(err);
|
console.error(err);
|
||||||
state.raven.captureException(err);
|
state.sentry.withScope(scope => {
|
||||||
metrics.stoppedUpload(archive);
|
scope.setExtra('duration', err.duration);
|
||||||
|
scope.setExtra('size', err.size);
|
||||||
|
state.sentry.captureException(err);
|
||||||
|
});
|
||||||
|
metrics.stoppedUpload(archive, err.duration);
|
||||||
emitter.emit('pushState', '/error');
|
emitter.emit('pushState', '/error');
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@@ -262,7 +265,12 @@ export default function(state, emitter) {
|
|||||||
state.transfer = null;
|
state.transfer = null;
|
||||||
const location = err.message === '404' ? '/404' : '/error';
|
const location = err.message === '404' ? '/404' : '/error';
|
||||||
if (location === '/error') {
|
if (location === '/error') {
|
||||||
state.raven.captureException(err);
|
state.sentry.withScope(scope => {
|
||||||
|
scope.setExtra('duration', err.duration);
|
||||||
|
scope.setExtra('size', err.size);
|
||||||
|
scope.setExtra('progress', err.progress);
|
||||||
|
state.sentry.captureException(err);
|
||||||
|
});
|
||||||
const duration = Date.now() - start;
|
const duration = Date.now() - start;
|
||||||
metrics.stoppedDownload({
|
metrics.stoppedDownload({
|
||||||
size,
|
size,
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ export default class FileReceiver extends Nanobus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async downloadStream(noSave = false) {
|
async downloadStream(noSave = false) {
|
||||||
|
const start = Date.now();
|
||||||
const onprogress = p => {
|
const onprogress = p => {
|
||||||
this.progress = [p, this.fileInfo.size];
|
this.progress = [p, this.fileInfo.size];
|
||||||
this.emit('progress');
|
this.emit('progress');
|
||||||
@@ -153,9 +154,7 @@ export default class FileReceiver extends Nanobus {
|
|||||||
const downloadPath = `/api/download/${this.fileInfo.id}`;
|
const downloadPath = `/api/download/${this.fileInfo.id}`;
|
||||||
let downloadUrl = getApiUrl(downloadPath);
|
let downloadUrl = getApiUrl(downloadPath);
|
||||||
if (downloadUrl === downloadPath) {
|
if (downloadUrl === downloadPath) {
|
||||||
downloadUrl = `${location.protocol}//${location.host}/api/download/${
|
downloadUrl = `${location.protocol}//${location.host}${downloadPath}`;
|
||||||
this.fileInfo.id
|
|
||||||
}`;
|
|
||||||
}
|
}
|
||||||
const a = document.createElement('a');
|
const a = document.createElement('a');
|
||||||
a.href = downloadUrl;
|
a.href = downloadUrl;
|
||||||
@@ -164,11 +163,29 @@ export default class FileReceiver extends Nanobus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let prog = 0;
|
let prog = 0;
|
||||||
|
let hangs = 0;
|
||||||
while (prog < this.fileInfo.size) {
|
while (prog < this.fileInfo.size) {
|
||||||
const msg = await this.sendMessageToSw({
|
const msg = await this.sendMessageToSw({
|
||||||
request: 'progress',
|
request: 'progress',
|
||||||
id: this.fileInfo.id
|
id: this.fileInfo.id
|
||||||
});
|
});
|
||||||
|
if (msg.progress === prog) {
|
||||||
|
hangs++;
|
||||||
|
} else {
|
||||||
|
hangs = 0;
|
||||||
|
}
|
||||||
|
if (hangs > 30) {
|
||||||
|
// TODO: On Chrome we don't get a cancel
|
||||||
|
// signal so one is indistinguishable from
|
||||||
|
// a hang. We may be able to detect
|
||||||
|
// which end is hung in the service worker
|
||||||
|
// to improve on this.
|
||||||
|
const e = new Error('hung download');
|
||||||
|
e.duration = Date.now() - start;
|
||||||
|
e.size = this.fileInfo.size;
|
||||||
|
e.progress = prog;
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
prog = msg.progress;
|
prog = msg.progress;
|
||||||
onprogress(prog);
|
onprogress(prog);
|
||||||
await delay(1000);
|
await delay(1000);
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ export default class FileSender extends Nanobus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async upload(archive, bearerToken) {
|
async upload(archive, bearerToken) {
|
||||||
const start = Date.now();
|
|
||||||
if (this.cancelled) {
|
if (this.cancelled) {
|
||||||
throw new Error(0);
|
throw new Error(0);
|
||||||
}
|
}
|
||||||
@@ -76,7 +75,6 @@ export default class FileSender extends Nanobus {
|
|||||||
this.emit('progress'); // HACK to kick MS Edge
|
this.emit('progress'); // HACK to kick MS Edge
|
||||||
try {
|
try {
|
||||||
const result = await this.uploadRequest.result;
|
const result = await this.uploadRequest.result;
|
||||||
const time = Date.now() - start;
|
|
||||||
this.msg = 'notifyUploadEncryptDone';
|
this.msg = 'notifyUploadEncryptDone';
|
||||||
this.uploadRequest = null;
|
this.uploadRequest = null;
|
||||||
this.progress = [1, 1];
|
this.progress = [1, 1];
|
||||||
@@ -87,8 +85,8 @@ export default class FileSender extends Nanobus {
|
|||||||
name: archive.name,
|
name: archive.name,
|
||||||
size: archive.size,
|
size: archive.size,
|
||||||
manifest: archive.manifest,
|
manifest: archive.manifest,
|
||||||
time: time,
|
time: result.duration,
|
||||||
speed: archive.size / (time / 1000),
|
speed: archive.size / (result.duration / 1000),
|
||||||
createdAt: Date.now(),
|
createdAt: Date.now(),
|
||||||
expiresAt: Date.now() + archive.timeLimit * 1000,
|
expiresAt: Date.now() + archive.timeLimit * 1000,
|
||||||
secretKey: secretKey,
|
secretKey: secretKey,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FluentBundle } from 'fluent';
|
import { FluentBundle } from '@fluent/bundle';
|
||||||
|
|
||||||
function makeBundle(locale, ftl) {
|
function makeBundle(locale, ftl) {
|
||||||
const bundle = new FluentBundle(locale, { useIsolating: false });
|
const bundle = new FluentBundle(locale, { useIsolating: false });
|
||||||
@@ -10,9 +10,9 @@ export async function getTranslator(locale) {
|
|||||||
const bundles = [];
|
const bundles = [];
|
||||||
const { default: en } = await import('../public/locales/en-US/send.ftl');
|
const { default: en } = await import('../public/locales/en-US/send.ftl');
|
||||||
if (locale !== 'en-US') {
|
if (locale !== 'en-US') {
|
||||||
const {
|
const { default: ftl } = await import(
|
||||||
default: ftl
|
`../public/locales/${locale}/send.ftl`
|
||||||
} = await import(`../public/locales/${locale}/send.ftl`);
|
);
|
||||||
bundles.push(makeBundle(locale, ftl));
|
bundles.push(makeBundle(locale, ftl));
|
||||||
}
|
}
|
||||||
bundles.push(makeBundle('en-US', en));
|
bundles.push(makeBundle('en-US', en));
|
||||||
|
|||||||
105
app/main.css
@@ -1,4 +1,9 @@
|
|||||||
@tailwind preflight;
|
@tailwind base;
|
||||||
|
|
||||||
|
html {
|
||||||
|
line-height: 1.15;
|
||||||
|
}
|
||||||
|
|
||||||
@tailwind components;
|
@tailwind components;
|
||||||
|
|
||||||
:not(input) {
|
:not(input) {
|
||||||
@@ -34,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;
|
||||||
@@ -43,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 {
|
||||||
@@ -65,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;
|
||||||
|
|
||||||
@@ -77,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;
|
||||||
@@ -99,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;
|
||||||
@@ -148,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 {
|
||||||
@@ -188,14 +205,14 @@ footer li:hover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
@@ -285,6 +302,55 @@ select {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mozilla-logo {
|
||||||
|
background-color: white;
|
||||||
|
border: 1px solid white;
|
||||||
|
}
|
||||||
|
|
||||||
|
@screen md {
|
||||||
|
.main > section {
|
||||||
|
@apply border;
|
||||||
|
@apply border-grey-80;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
@responsive {
|
@responsive {
|
||||||
@@ -311,6 +377,7 @@ select {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.signin {
|
.signin {
|
||||||
|
backface-visibility: hidden;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
transition-property: transform, background-color;
|
transition-property: transform, background-color;
|
||||||
transition-duration: 250ms;
|
transition-duration: 250ms;
|
||||||
@@ -319,8 +386,6 @@ select {
|
|||||||
|
|
||||||
.signin:hover,
|
.signin:hover,
|
||||||
.signin:focus {
|
.signin:focus {
|
||||||
@apply shadow-btn;
|
|
||||||
|
|
||||||
transform: scale(1.0625);
|
transform: scale(1.0625);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,19 +396,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
17
app/main.js
@@ -1,7 +1,7 @@
|
|||||||
/* global DEFAULTS LIMITS PREFS */
|
/* global DEFAULTS LIMITS PREFS */
|
||||||
import 'core-js';
|
import 'core-js';
|
||||||
import 'fast-text-encoding'; // MS Edge support
|
import 'fast-text-encoding'; // MS Edge support
|
||||||
import 'fluent-intl-polyfill';
|
import 'intl-pluralrules';
|
||||||
import choo from 'choo';
|
import choo from 'choo';
|
||||||
import nanotiming from 'nanotiming';
|
import nanotiming from 'nanotiming';
|
||||||
import routes from './routes';
|
import routes from './routes';
|
||||||
@@ -12,15 +12,15 @@ import pasteManager from './pasteManager';
|
|||||||
import storage from './storage';
|
import storage from './storage';
|
||||||
import metrics from './metrics';
|
import metrics from './metrics';
|
||||||
import experiments from './experiments';
|
import experiments from './experiments';
|
||||||
import Raven from 'raven-js';
|
import * as Sentry from '@sentry/browser';
|
||||||
import './main.css';
|
import './main.css';
|
||||||
import User from './user';
|
import User from './user';
|
||||||
import { getTranslator } from './locale';
|
import { getTranslator } from './locale';
|
||||||
import Archive from './archive';
|
import Archive from './archive';
|
||||||
import { setTranslate, locale } from './utils';
|
import { setTranslate, locale } from './utils';
|
||||||
|
|
||||||
if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) {
|
if (navigator.doNotTrack !== '1' && window.SENTRY_CONFIG) {
|
||||||
Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install();
|
Sentry.init(window.SENTRY_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'production') {
|
if (process.env.NODE_ENV === 'production') {
|
||||||
@@ -47,6 +47,7 @@ if (process.env.NODE_ENV === 'production') {
|
|||||||
|
|
||||||
const translate = await getTranslator(locale());
|
const translate = await getTranslator(locale());
|
||||||
setTranslate(translate);
|
setTranslate(translate);
|
||||||
|
// eslint-disable-next-line require-atomic-updates
|
||||||
window.initialState = {
|
window.initialState = {
|
||||||
LIMITS,
|
LIMITS,
|
||||||
DEFAULTS,
|
DEFAULTS,
|
||||||
@@ -55,13 +56,15 @@ if (process.env.NODE_ENV === 'production') {
|
|||||||
capabilities,
|
capabilities,
|
||||||
translate,
|
translate,
|
||||||
storage,
|
storage,
|
||||||
raven: Raven,
|
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());
|
const app = routes(choo({ hash: true }));
|
||||||
|
// eslint-disable-next-line require-atomic-updates
|
||||||
window.app = app;
|
window.app = app;
|
||||||
app.use(experiments);
|
app.use(experiments);
|
||||||
app.use(metrics);
|
app.use(metrics);
|
||||||
|
|||||||
@@ -107,9 +107,10 @@ function completedUpload(archive, duration) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function stoppedUpload(archive) {
|
function stoppedUpload(archive, duration = 0) {
|
||||||
return addEvent('client_upload', {
|
return addEvent('client_upload', {
|
||||||
download_limit: archive.dlimit,
|
download_limit: archive.dlimit,
|
||||||
|
duration: sizeOrder(duration),
|
||||||
file_count: archive.numFiles,
|
file_count: archive.numFiles,
|
||||||
password_protected: !!archive.password,
|
password_protected: !!archive.password,
|
||||||
size: sizeOrder(archive.size),
|
size: sizeOrder(archive.size),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ const choo = require('choo');
|
|||||||
const download = require('./ui/download');
|
const download = require('./ui/download');
|
||||||
const body = require('./ui/body');
|
const body = require('./ui/body');
|
||||||
|
|
||||||
module.exports = function(app = choo()) {
|
module.exports = function(app = choo({ hash: true })) {
|
||||||
app.route('/', body(require('./ui/home')));
|
app.route('/', body(require('./ui/home')));
|
||||||
app.route('/download/:id', body(download));
|
app.route('/download/:id', body(download));
|
||||||
app.route('/download/:id/:key', body(download));
|
app.route('/download/:id/:key', body(download));
|
||||||
@@ -13,6 +13,7 @@ module.exports = function(app = choo()) {
|
|||||||
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('*', body(require('./ui/notFound')));
|
app.route('*', body(require('./ui/notFound')));
|
||||||
return app;
|
return app;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,13 +11,14 @@ 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)$/;
|
||||||
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
||||||
|
const FONT = /\.woff2?$/;
|
||||||
|
|
||||||
self.addEventListener('install', event => {
|
self.addEventListener('install', () => {
|
||||||
event.waitUntil(precache());
|
self.skipWaiting();
|
||||||
});
|
});
|
||||||
|
|
||||||
self.addEventListener('activate', event => {
|
self.addEventListener('activate', event => {
|
||||||
event.waitUntil(self.clients.claim());
|
event.waitUntil(self.clients.claim().then(precache));
|
||||||
});
|
});
|
||||||
|
|
||||||
async function decryptStream(id) {
|
async function decryptStream(id) {
|
||||||
@@ -83,16 +84,28 @@ async function decryptStream(id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function precache() {
|
async function precache() {
|
||||||
|
try {
|
||||||
|
await cleanCache();
|
||||||
|
const cache = await caches.open(version);
|
||||||
|
const images = assets.match(IMAGES);
|
||||||
|
await cache.addAll(images);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
// cache will get populated on demand
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function cleanCache() {
|
||||||
const oldCaches = await caches.keys();
|
const oldCaches = await caches.keys();
|
||||||
for (const c of oldCaches) {
|
for (const c of oldCaches) {
|
||||||
if (c !== version) {
|
if (c !== version) {
|
||||||
await caches.delete(c);
|
await caches.delete(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const cache = await caches.open(version);
|
}
|
||||||
const images = assets.match(IMAGES);
|
|
||||||
await cache.addAll(images);
|
function cacheable(url) {
|
||||||
return self.skipWaiting();
|
return VERSIONED_ASSET.test(url) || FONT.test(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cachedOrFetched(req) {
|
async function cachedOrFetched(req) {
|
||||||
@@ -102,7 +115,7 @@ async function cachedOrFetched(req) {
|
|||||||
return cached;
|
return cached;
|
||||||
}
|
}
|
||||||
const fetched = await fetch(req);
|
const fetched = await fetch(req);
|
||||||
if (fetched.ok && VERSIONED_ASSET.test(req.url)) {
|
if (fetched.ok && cacheable(req.url)) {
|
||||||
cache.put(req, fetched.clone());
|
cache.put(req, fetched.clone());
|
||||||
}
|
}
|
||||||
return fetched;
|
return fetched;
|
||||||
@@ -115,7 +128,7 @@ self.onfetch = event => {
|
|||||||
const dlmatch = DOWNLOAD_URL.exec(url.pathname);
|
const dlmatch = DOWNLOAD_URL.exec(url.pathname);
|
||||||
if (dlmatch) {
|
if (dlmatch) {
|
||||||
event.respondWith(decryptStream(dlmatch[1]));
|
event.respondWith(decryptStream(dlmatch[1]));
|
||||||
} else if (VERSIONED_ASSET.test(url.pathname)) {
|
} else if (cacheable(url.pathname)) {
|
||||||
event.respondWith(cachedOrFetched(req));
|
event.respondWith(cachedOrFetched(req));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* global ReadableStream TransformStream */
|
/* global TransformStream */
|
||||||
|
|
||||||
export function transformStream(readable, transformer, oncancel) {
|
export function transformStream(readable, transformer, oncancel) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -64,8 +64,7 @@ class Account extends Component {
|
|||||||
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 +78,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 list-reset absolute pin-t pin-r 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')}"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ function password(state) {
|
|||||||
id="password-input"
|
id="password-input"
|
||||||
class="${state.archive.password
|
class="${state.archive.password
|
||||||
? ''
|
? ''
|
||||||
: 'invisible'} border rounded focus:border-blue-dark leading-normal my-1 py-1 px-2 h-8"
|
: 'invisible'} border rounded focus:border-blue-60 leading-normal my-1 py-1 px-2 h-8 dark:bg-grey-80"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
maxlength="${MAX_LENGTH}"
|
maxlength="${MAX_LENGTH}"
|
||||||
type="password"
|
type="password"
|
||||||
@@ -58,7 +58,7 @@ function password(state) {
|
|||||||
<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>
|
||||||
`;
|
`;
|
||||||
@@ -106,7 +106,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 +122,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-no-shrink" 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 +144,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"
|
||||||
@@ -155,7 +159,7 @@ function archiveDetails(translate, archive) {
|
|||||||
num: archive.manifest.files.length
|
num: archive.manifest.files.length
|
||||||
})}
|
})}
|
||||||
</summary>
|
</summary>
|
||||||
${list(archive.manifest.files.map(f => fileInfo(f)), 'list-reset')}
|
${list(archive.manifest.files.map(f => fileInfo(f)))}
|
||||||
</details>
|
</details>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
@@ -170,20 +174,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 +200,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,14 +217,14 @@ 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,
|
||||||
html`
|
html`
|
||||||
<input
|
<input
|
||||||
type="image"
|
type="image"
|
||||||
class="self-start flex-no-shrink text-white hover:opacity-75 focus:outline"
|
class="self-start flex-shrink-0 text-white hover:opacity-75 focus:outline"
|
||||||
alt="${state.translate('deleteButtonHover')}"
|
alt="${state.translate('deleteButtonHover')}"
|
||||||
title="${state.translate('deleteButtonHover')}"
|
title="${state.translate('deleteButtonHover')}"
|
||||||
src="${assets.get('close-16.svg')}"
|
src="${assets.get('close-16.svg')}"
|
||||||
@@ -225,7 +236,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,9 +267,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 "${
|
text: `Download "${archive.name}" with Firefox Send: simple, safe file sharing`,
|
||||||
archive.name
|
|
||||||
}" with Firefox Send: simple, safe file sharing`,
|
|
||||||
//state.translate('shareMessage', { name }),
|
//state.translate('shareMessage', { name }),
|
||||||
url: archive.url
|
url: archive.url
|
||||||
});
|
});
|
||||||
@@ -271,18 +280,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 list-reset 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-no-shrink 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"
|
||||||
@@ -302,10 +314,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)
|
||||||
})}
|
})}
|
||||||
@@ -315,7 +329,7 @@ module.exports.wip = function(state, emit) {
|
|||||||
${expiryOptions(state, emit)} ${password(state, emit)}
|
${expiryOptions(state, emit)} ${password(state, emit)}
|
||||||
<button
|
<button
|
||||||
id="upload-btn"
|
id="upload-btn"
|
||||||
class="btn rounded-lg flex-no-shrink focus:outline"
|
class="btn rounded-lg flex-shrink-0 focus:outline"
|
||||||
title="${state.translate('uploadButton')}"
|
title="${state.translate('uploadButton')}"
|
||||||
onclick="${upload}"
|
onclick="${upload}"
|
||||||
>
|
>
|
||||||
@@ -380,22 +394,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')}"
|
||||||
>
|
>
|
||||||
@@ -417,7 +431,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');
|
||||||
@@ -430,14 +444,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>
|
||||||
@@ -471,14 +487,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) {
|
||||||
@@ -503,13 +516,15 @@ 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
|
||||||
id="download-btn"
|
id="download-btn"
|
||||||
class="btn rounded-lg mt-4 w-full flex-no-shrink focus:outline"
|
class="btn rounded-lg mt-4 w-full flex-shrink-0 focus:outline"
|
||||||
title="${state.translate('downloadButtonLabel')}"
|
title="${state.translate('downloadButtonLabel')}"
|
||||||
onclick=${download}
|
onclick=${download}
|
||||||
>
|
>
|
||||||
@@ -531,10 +546,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>
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ function banner(state) {
|
|||||||
return; // server side
|
return; // server side
|
||||||
}
|
}
|
||||||
const show =
|
const show =
|
||||||
!state.capabilities.standalone && !state.route.startsWith('/unsupported/');
|
!state.capabilities.standalone &&
|
||||||
|
!state.route.startsWith('/unsupported/') &&
|
||||||
|
state.locale === 'en-US';
|
||||||
if (show) {
|
if (show) {
|
||||||
return state.cache(Promo, 'promo').render();
|
return state.cache(Promo, 'promo').render();
|
||||||
}
|
}
|
||||||
@@ -18,7 +20,7 @@ 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()}
|
${banner(state, emit)} ${state.cache(Header, 'header').render()}
|
||||||
${main(state, emit)} ${state.cache(Footer, 'footer').render()}
|
${main(state, emit)} ${state.cache(Footer, 'footer').render()}
|
||||||
|
|||||||
@@ -7,29 +7,31 @@ module.exports = function(name, url) {
|
|||||||
<send-copy-dialog
|
<send-copy-dialog
|
||||||
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
||||||
>
|
>
|
||||||
<h1 class="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
|
<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"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
class="btn rounded-lg w-full flex-no-shrink focus:outline"
|
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
|
||||||
onclick="${copy}"
|
onclick="${copy}"
|
||||||
title="${state.translate('copyLinkButton')}"
|
title="${state.translate('copyLinkButton')}"
|
||||||
>
|
>
|
||||||
${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')}"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ function downloading(state, emit) {
|
|||||||
<div
|
<div
|
||||||
class="flex flex-col w-full h-full items-center md:justify-center md:-mt-8"
|
class="flex flex-col w-full h-full items-center md:justify-center md:-mt-8"
|
||||||
>
|
>
|
||||||
<h1 class="mb-4">${state.translate('downloadingTitle')}</h1>
|
<h1 class="text-3xl font-bold mb-4">
|
||||||
|
${state.translate('downloadingTitle')}
|
||||||
|
</h1>
|
||||||
${archiveTile.downloading(state, emit)}
|
${archiveTile.downloading(state, emit)}
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
@@ -36,8 +38,12 @@ function preview(state, emit) {
|
|||||||
<div
|
<div
|
||||||
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
||||||
>
|
>
|
||||||
<h1 class="mb-4">${state.translate('downloadTitle')}</h1>
|
<h1 class="text-3xl font-bold mb-4">
|
||||||
<p class="w-full text-grey-darkest text-center leading-normal">
|
${state.translate('downloadTitle')}
|
||||||
|
</h1>
|
||||||
|
<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)}
|
||||||
|
|||||||
@@ -5,13 +5,13 @@ module.exports = function(state) {
|
|||||||
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 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-12 h-48" />
|
||||||
<p class="text-grey-darkest leading-normal">
|
<p class="text-grey-80 leading-normal dark:text-grey-40">
|
||||||
${state.translate('trySendDescription')}
|
${state.translate('trySendDescription')}
|
||||||
</p>
|
</p>
|
||||||
<p class="my-5">
|
<p class="my-5">
|
||||||
|
|||||||
@@ -6,10 +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="mb-4">${state.translate('downloadTitle')}</h1>
|
<h1 class="text-3xl font-bold mb-4">
|
||||||
<p class="w-full mb-4 text-center text-grey-darkest leading-normal">
|
${state.translate('downloadTitle')}
|
||||||
|
</h1>
|
||||||
|
<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
|
||||||
@@ -20,8 +24,8 @@ module.exports = function(state, emit) {
|
|||||||
<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')}"
|
||||||
@@ -32,7 +36,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')}"
|
||||||
@@ -40,7 +44,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')}
|
||||||
@@ -70,7 +74,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');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,11 +9,11 @@ module.exports = function(state, emit) {
|
|||||||
<section
|
<section
|
||||||
class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big"
|
class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big"
|
||||||
>
|
>
|
||||||
<h1 class="text-center font-bold my-2">
|
<h1 class="text-center text-3xl font-bold my-2">
|
||||||
${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">
|
||||||
${state.translate('trySendDescription')}
|
${state.translate('trySendDescription')}
|
||||||
</p>
|
</p>
|
||||||
<p class="my-5">
|
<p class="my-5">
|
||||||
|
|||||||
@@ -19,16 +19,13 @@ class Footer extends Component {
|
|||||||
const feedbackUrl = `https://qsurvey.mozilla.com/s3/Firefox-Send-Product-Feedback?ver=${version}&browser=${browser}`;
|
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
|
<a class="mozilla-logo m-2" href="https://www.mozilla.org/">
|
||||||
class="mozilla-logo pb-10 md:pb-0 m-2"
|
|
||||||
href="https://www.mozilla.org/"
|
|
||||||
>
|
|
||||||
Mozilla
|
Mozilla
|
||||||
</a>
|
</a>
|
||||||
<ul
|
<ul
|
||||||
class="list-reset 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">
|
<li class="m-2">
|
||||||
<a href="https://www.mozilla.org/about/legal/terms/services/#send">
|
<a href="https://www.mozilla.org/about/legal/terms/services/#send">
|
||||||
|
|||||||
@@ -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 class="w-48 md:w-64">
|
||||||
|
<use xlink:href="${assets.get('wordmark.svg')}#logo" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
`;
|
`;
|
||||||
return html`
|
return html`
|
||||||
<header
|
<header
|
||||||
|
|||||||
@@ -20,11 +20,7 @@ module.exports = function(state, emit) {
|
|||||||
const right =
|
const right =
|
||||||
archives.length === 0
|
archives.length === 0
|
||||||
? intro(state)
|
? intro(state)
|
||||||
: list(
|
: list(archives, 'p-2 h-full overflow-y-auto w-full', 'mb-4 w-full');
|
||||||
archives,
|
|
||||||
'list-reset p-2 h-full overflow-y-auto w-full',
|
|
||||||
'mb-4 w-full'
|
|
||||||
);
|
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<main class="main">
|
<main class="main">
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ 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="font-bold md:pb-2">
|
<h1 class="text-3xl font-bold md:pb-2">
|
||||||
${state.translate('introTitle')}
|
${state.translate('introTitle')}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="max-w-sm leading-loose mt-6 md:mt-2 md:pr-14">
|
<p class="max-w-sm leading-loose mt-6 md:mt-2 md:pr-14">
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ module.exports = function(state, emit) {
|
|||||||
<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">${state.translate('legalTitle')}</h1>
|
<h1 class="text-center text-3xl font-bold">
|
||||||
|
${state.translate('legalTitle')}
|
||||||
|
</h1>
|
||||||
<p class="mt-2">${state.translate('legalDateStamp')}</p>
|
<p class="mt-2">${state.translate('legalDateStamp')}</p>
|
||||||
<div class="overflow-y-scroll py-8 px-12">
|
<div class="overflow-y-scroll py-8 px-12">
|
||||||
<p class="leading-normal">
|
<p class="leading-normal">
|
||||||
@@ -17,7 +19,7 @@ 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
|
||||||
@@ -29,7 +31,7 @@ module.exports = function(state, emit) {
|
|||||||
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 pin 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 pin-t flex items-center justify-center"
|
class="h-full w-full max-h-screen absolute top-0 flex items-center justify-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>
|
||||||
|
|||||||
@@ -8,16 +8,18 @@ module.exports = function(state, emit) {
|
|||||||
<div
|
<div
|
||||||
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
||||||
>
|
>
|
||||||
<h1 class="mb-4">${state.translate('downloadTitle')}</h1>
|
<h1 class="mb-4 text-3xl font-bold">${state.translate(
|
||||||
|
'downloadTitle'
|
||||||
|
)}</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-no-shrink" src="${assets.get(
|
<img class="mr-3 flex-shrink-0" src="${assets.get(
|
||||||
'blue_file.svg'
|
'blue_file.svg'
|
||||||
)}"/>
|
)}"/>
|
||||||
<p class="flex-grow">
|
<p class="flex-grow">
|
||||||
@@ -49,7 +51,7 @@ module.exports = function(state, emit) {
|
|||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<input
|
<input
|
||||||
class="btn rounded-lg w-full flex flex-no-shrink items-center justify-center"
|
class="btn rounded-lg w-full flex flex-shrink-0 items-center justify-center"
|
||||||
value="${state.translate('copyLinkButton')}"
|
value="${state.translate('copyLinkButton')}"
|
||||||
title="${state.translate('copyLinkButton')}"
|
title="${state.translate('copyLinkButton')}"
|
||||||
type="submit" />
|
type="submit" />
|
||||||
|
|||||||
@@ -9,11 +9,11 @@ module.exports = function(state, emit) {
|
|||||||
<section
|
<section
|
||||||
class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big"
|
class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big"
|
||||||
>
|
>
|
||||||
<h1 class="text-center font-bold my-2">
|
<h1 class="text-center text-3xl font-bold my-2">
|
||||||
${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">
|
||||||
${state.translate('trySendDescription')}
|
${state.translate('trySendDescription')}
|
||||||
</p>
|
</p>
|
||||||
<p class="my-5">
|
<p class="my-5">
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ module.exports = function(message) {
|
|||||||
return function(state, emit, close) {
|
return function(state, emit, close) {
|
||||||
return html`
|
return html`
|
||||||
<send-ok-dialog class="flex flex-col max-w-sm p-4 m-auto">
|
<send-ok-dialog class="flex flex-col max-w-sm p-4 m-auto">
|
||||||
<h2 class="text-center m-8 leading-normal">${message}</h2>
|
<h2 class="text-center text-xl font-bold m-8 leading-normal">
|
||||||
|
${message}
|
||||||
|
</h2>
|
||||||
<button
|
<button
|
||||||
class="btn rounded-lg w-full flex-no-shrink"
|
class="btn rounded-lg w-full flex-shrink-0"
|
||||||
onclick="${close}"
|
onclick="${close}"
|
||||||
title="${state.translate('okButton')}"
|
title="${state.translate('okButton')}"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class Promo extends Component {
|
|||||||
createElement() {
|
createElement() {
|
||||||
return html`
|
return html`
|
||||||
<send-promo
|
<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"
|
class="w-full flex-row items-center content-center justify-center bg-white text-grey-80 px-4 py-3 flex border-b border-grey-banner leading-normal dark:bg-grey-90 dark:text-grey-20 dark:border-grey-80"
|
||||||
>
|
>
|
||||||
<div class="flex items-center mx-auto">
|
<div class="flex items-center mx-auto">
|
||||||
<img
|
<img
|
||||||
@@ -24,11 +24,11 @@ class Promo extends Component {
|
|||||||
alt="Firefox"
|
alt="Firefox"
|
||||||
/>
|
/>
|
||||||
<span class="ml-2 sm:ml-4 text-xs sm:text-base">
|
<span class="ml-2 sm:ml-4 text-xs sm:text-base">
|
||||||
${this.state.translate('trailheadPromo')}${' '}
|
${`Like Firefox Send? You'll love our new full-device VPN. `}
|
||||||
<a
|
<a
|
||||||
class="underline text-blue-dark"
|
class="underline link-blue"
|
||||||
href="http://www.mozilla.org/firefox/accounts/?utm_source=send.firefox.com&utm_medium=banner&utm_campaign=trailhead&utm_content=protect-your-privacy"
|
href="https://vpn.mozilla.org/?utm_source=send.firefox.com&utm_medium=referral&utm_content=Try+Firefox+Private+Network&utm_campaign=top-bar"
|
||||||
>${this.state.translate('learnMore')}</a
|
>${`Get it today`}</a
|
||||||
>
|
>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -6,29 +6,31 @@ module.exports = function(name, url) {
|
|||||||
<send-share-dialog
|
<send-share-dialog
|
||||||
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
||||||
>
|
>
|
||||||
<h1 class="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"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
class="btn rounded-lg w-full flex-no-shrink focus:outline"
|
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
|
||||||
onclick="${share}"
|
onclick="${share}"
|
||||||
title="${state.translate('shareLinkButton')}"
|
title="${state.translate('shareLinkButton')}"
|
||||||
>
|
>
|
||||||
${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')}"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -14,13 +14,13 @@ module.exports = function(trigger) {
|
|||||||
>
|
>
|
||||||
<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-no-shrink self-center lg:mx-6 lg:max-w-xs"
|
class="flex flex-col flex-shrink-0 self-center lg:mx-6 lg:max-w-xs"
|
||||||
>
|
>
|
||||||
<h1 class="font-bold text-center lg:text-left">
|
<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', {
|
||||||
@@ -42,11 +42,11 @@ module.exports = function(trigger) {
|
|||||||
<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
|
||||||
class="btn rounded-lg w-full flex flex-no-shrink items-center justify-center"
|
class="btn rounded-lg w-full flex flex-shrink-0 items-center justify-center"
|
||||||
value="${state.translate('signInOnlyButton')}"
|
value="${state.translate('signInOnlyButton')}"
|
||||||
title="${state.translate('signInOnlyButton')}"
|
title="${state.translate('signInOnlyButton')}"
|
||||||
id="email-submit"
|
id="email-submit"
|
||||||
@@ -54,7 +54,7 @@ module.exports = function(trigger) {
|
|||||||
/>
|
/>
|
||||||
</form>
|
</form>
|
||||||
<button
|
<button
|
||||||
class="my-3 text-blue-dark hover:text-blue-darker focus:text-blue-darker font-medium"
|
class="my-3 link-blue font-medium"
|
||||||
title="${state.translate('deletePopupCancel')}"
|
title="${state.translate('deletePopupCancel')}"
|
||||||
onclick=${cancel}
|
onclick=${cancel}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -13,15 +13,15 @@ module.exports = function() {
|
|||||||
<send-survey-dialog
|
<send-survey-dialog
|
||||||
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
||||||
>
|
>
|
||||||
<h1 class="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 Firefox Send? Take a quick survey to let us know how we can make
|
||||||
it better.
|
it better.
|
||||||
</p>
|
</p>
|
||||||
<a
|
<a
|
||||||
class="btn rounded-lg w-full flex-no-shrink focus:outline my-5"
|
class="btn rounded-lg w-full flex-shrink-0 focus:outline my-5"
|
||||||
onclick="${() => emit('closeModal')}"
|
onclick="${() => emit('closeModal')}"
|
||||||
title="Give feedback"
|
title="Give feedback"
|
||||||
href="${surveyUrl}"
|
href="${surveyUrl}"
|
||||||
@@ -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,9 +27,9 @@ 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="">${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>
|
||||||
${why}
|
${why}
|
||||||
<a href="${url}" class="btn rounded-lg mt-8 px-8">
|
<a href="${url}" class="btn rounded-lg mt-8 px-8">
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 |
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,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" viewBox="66 0 340 64">
|
||||||
|
<path d="M84,48h5.83V35.87H103.3V30.45H89.83V23.51H103.3V18H84Zm23.57,0h5.79V25.81h-5.79Zm2.88-32.12a3.46,3.46,0,0,0-2.59,1,3.62,3.62,0,0,0-1,2.65,3.57,3.57,0,0,0,1,2.59,3.52,3.52,0,0,0,2.61,1,3.46,3.46,0,0,0,3.65-3.26c0-.12,0-.23,0-.35a3.71,3.71,0,0,0-1-2.65,3.5,3.5,0,0,0-2.67-1Zm19.14,9.53a7.22,7.22,0,0,0-3.72.93,5.82,5.82,0,0,0-2.4,2.89V25.81h-5.59V48h5.63V36.29a5.27,5.27,0,0,1,1.31-4,4.94,4.94,0,0,1,3.49-1.21,6.33,6.33,0,0,1,1.73.23,4,4,0,0,1,1.23.55l2-5.59a7.51,7.51,0,0,0-1.66-.61,8.11,8.11,0,0,0-2-.26Zm23.94,3.19a11.15,11.15,0,0,0-3.61-2.37,12.08,12.08,0,0,0-4.6-.86,11.62,11.62,0,0,0-8.3,3.37,11.17,11.17,0,0,0-2.44,3.67,11.59,11.59,0,0,0-.89,4.54,12.24,12.24,0,0,0,.83,4.52,10.52,10.52,0,0,0,2.36,3.66,10.93,10.93,0,0,0,3.71,2.44,12.75,12.75,0,0,0,4.85.88,12.15,12.15,0,0,0,6.12-1.39,13.25,13.25,0,0,0,4.11-3.74L151,40.6a6.23,6.23,0,0,1-2.18,2.15,6.36,6.36,0,0,1-3.33.8,6.7,6.7,0,0,1-4.13-1.25,6,6,0,0,1-2.23-3.43h17.62V36.74a11.71,11.71,0,0,0-.87-4.56,10.5,10.5,0,0,0-2.35-3.59Zm-14.21,5.85a6.38,6.38,0,0,1,2.26-3.12,6.11,6.11,0,0,1,3.74-1.15,6.26,6.26,0,0,1,3.73,1.08,5.56,5.56,0,0,1,2.1,3.19ZM167,16.08a6.05,6.05,0,0,0-2.91,1.54,6.15,6.15,0,0,0-1.56,2.89,18.1,18.1,0,0,0-.48,4.52v.78H158.4v5.1h3.65V48h5.63V30.91H173v-5.1h-5.3V24.75a13.34,13.34,0,0,1,.12-2,2,2,0,0,1,.6-1.19,2.45,2.45,0,0,1,1.33-.57,15.25,15.25,0,0,1,2.34-.15H173V15.63h-1.48A19.06,19.06,0,0,0,167,16.08Zm27.4,12.65a12,12,0,0,0-16.72,0,10.87,10.87,0,0,0-2.46,3.67,11.61,11.61,0,0,0-.89,4.5,11.46,11.46,0,0,0,7.07,10.64,11.73,11.73,0,0,0,4.64.9,12,12,0,0,0,4.66-.9,11.26,11.26,0,0,0,3.72-2.49,11.83,11.83,0,0,0,2.46-3.67,11.31,11.31,0,0,0,.9-4.48A11.43,11.43,0,0,0,194.4,28.73ZM191.7,39.3a5.88,5.88,0,0,1-1.29,2,6.53,6.53,0,0,1-1.93,1.31,6,6,0,0,1-4.76,0,6.34,6.34,0,0,1-1.93-1.31,6.06,6.06,0,0,1-1.3-2,6.48,6.48,0,0,1,0-4.86,5.76,5.76,0,0,1,1.3-2,6.08,6.08,0,0,1,1.93-1.32,6,6,0,0,1,4.76,0,6.37,6.37,0,0,1,1.93,1.32,5.73,5.73,0,0,1,1.29,2A6.39,6.39,0,0,1,191.7,39.3Zm29.47-13.49h-6.65l-4.68,6.57-4.64-6.57h-6.74l7.84,10.8L198,48h6.82l5-6.94L214.89,48h6.86l-8.46-11.34Zm34,7.46a12.88,12.88,0,0,0-3.37-1.44c-1.25-.34-2.46-.63-3.63-.88l-3.08-.7a10.64,10.64,0,0,1-2.51-.86A4.54,4.54,0,0,1,240.87,28a3.61,3.61,0,0,1-.62-2.19,4.8,4.8,0,0,1,1.58-3.7c1.06-1,2.73-1.44,5-1.44a9.84,9.84,0,0,1,5.07,1.17,10.47,10.47,0,0,1,3.39,3.23l2.79-2.18A15.22,15.22,0,0,0,253.45,19a13.8,13.8,0,0,0-6.59-1.44,12.13,12.13,0,0,0-4.14.66A10.33,10.33,0,0,0,239.53,20a7.53,7.53,0,0,0-2.05,2.63,7.41,7.41,0,0,0-.72,3.24,6.7,6.7,0,0,0,.84,3.53,7.06,7.06,0,0,0,2.2,2.22A11.11,11.11,0,0,0,242.86,33c1.13.32,2.29.6,3.47.84l3.26.74a12.63,12.63,0,0,1,2.8,1,5.86,5.86,0,0,1,2,1.56,3.88,3.88,0,0,1,.74,2.42,5.2,5.2,0,0,1-1.81,4.09A7.83,7.83,0,0,1,248,45.2a11,11,0,0,1-9.89-5.38l-3,2.34a15.86,15.86,0,0,0,5.23,4.54,16.06,16.06,0,0,0,7.7,1.7,12.58,12.58,0,0,0,4.38-.72,10.14,10.14,0,0,0,3.3-2,8.79,8.79,0,0,0,2.1-2.85,8.09,8.09,0,0,0,.74-3.39,6.94,6.94,0,0,0-1-3.8,7.71,7.71,0,0,0-2.42-2.37Zm27.51-4.72a10.53,10.53,0,0,0-3.58-2.34,11.89,11.89,0,0,0-4.49-.84,11.6,11.6,0,0,0-4.62.9,11.35,11.35,0,0,0-3.66,2.46A11.84,11.84,0,0,0,263,37a12.21,12.21,0,0,0,.82,4.51,10.53,10.53,0,0,0,2.36,3.64,11.24,11.24,0,0,0,3.7,2.42,12.41,12.41,0,0,0,4.82.88A11.68,11.68,0,0,0,280.82,47,12.84,12.84,0,0,0,285,42.82l-2.88-1.69a7.85,7.85,0,0,1-7.43,4.27,9,9,0,0,1-3.22-.53,8.21,8.21,0,0,1-2.55-1.5,8,8,0,0,1-1.78-2.28,7.79,7.79,0,0,1-.87-2.91h19.59V36.66a11.75,11.75,0,0,0-.86-4.54,10.92,10.92,0,0,0-2.35-3.57ZM266.4,35.22a8.88,8.88,0,0,1,1-2.73,8.55,8.55,0,0,1,1.79-2.18,8,8,0,0,1,2.44-1.43,8.31,8.31,0,0,1,3-.52,7.45,7.45,0,0,1,7.84,6.86ZM308.82,28a8.11,8.11,0,0,0-3-2,10.89,10.89,0,0,0-3.92-.67,9.06,9.06,0,0,0-4.58,1.14,8.76,8.76,0,0,0-3.14,3V25.82h-3.29V48h3.37V35.67a7.92,7.92,0,0,1,.53-2.93,7,7,0,0,1,1.48-2.3,6.46,6.46,0,0,1,2.22-1.5,7,7,0,0,1,2.75-.54,6.33,6.33,0,0,1,5,1.93A7.46,7.46,0,0,1,308,35.51V48h3.41V35.34a12.46,12.46,0,0,0-.66-4.19A8.68,8.68,0,0,0,308.82,28Zm27-12.42v14.1a8.14,8.14,0,0,0-1.58-1.83,10.08,10.08,0,0,0-2-1.36,10.39,10.39,0,0,0-2.3-.84,10.22,10.22,0,0,0-2.4-.28,11.63,11.63,0,0,0-4.4.84,11.09,11.09,0,0,0-3.59,2.38,11.3,11.3,0,0,0-2.42,3.65,12.81,12.81,0,0,0,0,9.32,11.56,11.56,0,0,0,2.4,3.66,10.58,10.58,0,0,0,3.59,2.38,11.77,11.77,0,0,0,4.42.84,9.69,9.69,0,0,0,2.4-.31,11,11,0,0,0,2.3-.86,9.72,9.72,0,0,0,2-1.37,8.75,8.75,0,0,0,1.58-1.85v4h3.33V15.59Zm-.37,24.58a8.3,8.3,0,0,1-10.85,4.47h0a7.68,7.68,0,0,1-2.6-1.76,7.88,7.88,0,0,1-1.73-2.67,8.93,8.93,0,0,1-.62-3.35,8.67,8.67,0,0,1,.62-3.3A8,8,0,0,1,322,30.89a8.17,8.17,0,0,1,2.6-1.79,8.27,8.27,0,0,1,6.51,0,8.64,8.64,0,0,1,2.63,1.81,7.85,7.85,0,0,1,1.72,2.67,8.67,8.67,0,0,1,.62,3.26,8.86,8.86,0,0,1-.65,3.33Z" fill="currentColor"/>
|
||||||
|
</symbol>
|
||||||
|
<use xlink:href="#logo"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.7 KiB |
@@ -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.
|
||||||
68
docs/deployment.md
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
## Requirements
|
||||||
|
This document describes how to do a full deployment of Firefox Send on your own Linux server. You will need:
|
||||||
|
|
||||||
|
* A working (and ideally somewhat recent) installation of NodeJS and NPM
|
||||||
|
* GIT
|
||||||
|
* An Apache webserver
|
||||||
|
* Optionally telnet, to be able to quickly check your installation
|
||||||
|
|
||||||
|
For Debian/Ubuntu systems this probably just means something like this:
|
||||||
|
|
||||||
|
* apt install git apache2 nodejs npm telnet
|
||||||
|
|
||||||
|
## Building
|
||||||
|
* 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
|
||||||
|
* 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)
|
||||||
|
* npm install
|
||||||
|
* npm run build
|
||||||
|
|
||||||
|
## Running
|
||||||
|
To have a permanently running version of Firefox Send as a background process:
|
||||||
|
|
||||||
|
* Create a file "run.sh" with:
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
nohup su www-data -c "npm run prod" 2>/dev/null &
|
||||||
|
```
|
||||||
|
* chmod +x run.sh
|
||||||
|
* ./run.sh
|
||||||
|
|
||||||
|
Now the Firefox Send backend should be running on port 1443. You can check with:
|
||||||
|
* telnet localhost 1443
|
||||||
|
|
||||||
|
## 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").
|
||||||
|
|
||||||
|
# Apache webserver
|
||||||
|
|
||||||
|
* a2enmod proxy
|
||||||
|
* a2enmod proxy_http
|
||||||
|
* a2enmod proxy_wstunnel
|
||||||
|
|
||||||
|
In your Apache virtual host configuration file, insert this:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Enable rewrite engine
|
||||||
|
RewriteEngine on
|
||||||
|
|
||||||
|
# Make sure the original domain name is forwarded to Send
|
||||||
|
# Otherwise the generated URLs will be wrong
|
||||||
|
ProxyPreserveHost on
|
||||||
|
|
||||||
|
# Make sure the generated URL is https://
|
||||||
|
RequestHeader set X-Forwarded-Proto https
|
||||||
|
|
||||||
|
# If it's a normal file (e.g. PNG, CSS) just return it
|
||||||
|
RewriteCond %{REQUEST_FILENAME} -f
|
||||||
|
RewriteRule .* - [L]
|
||||||
|
|
||||||
|
# If it's a websocket connection, redirect it to a Send WS connection
|
||||||
|
RewriteCond %{HTTP:Upgrade} =websocket [NC]
|
||||||
|
RewriteRule /(.*) ws://127.0.0.1:1443/$1 [P,L]
|
||||||
|
|
||||||
|
# Otherwise redirect it to a normal HTTP connection
|
||||||
|
RewriteRule ^/(.*)$ http://127.0.0.1:1443/$1 [P,QSA]
|
||||||
|
ProxyPassReverse "/" "http://127.0.0.1:1443"
|
||||||
|
```
|
||||||
@@ -1,13 +1,6 @@
|
|||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
Before building the Docker image, you must build the production assets:
|
Run `docker build -t send:latest .` to create an image or `docker-compose up` to run a full testable stack. *We don't recommend using docker-compose for production.*
|
||||||
|
|
||||||
```sh
|
|
||||||
npm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
Then you can run either `docker build` or `docker-compose up`.
|
|
||||||
|
|
||||||
|
|
||||||
## Environment variables:
|
## Environment variables:
|
||||||
|
|
||||||
@@ -20,6 +13,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 +23,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' \
|
||||||
|
-e 'BASE_URL=https://send.firefox.com' \
|
||||||
mozilla/send:latest
|
mozilla/send:latest
|
||||||
```
|
```
|
||||||
|
|||||||
11818
package-lock.json
generated
142
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "firefox-send",
|
"name": "firefox-send",
|
||||||
"description": "File Sharing Experiment",
|
"description": "File Sharing Experiment",
|
||||||
"version": "3.0.12",
|
"version": "3.0.22",
|
||||||
"author": "Mozilla (https://mozilla.org)",
|
"author": "Mozilla (https://mozilla.org)",
|
||||||
"repository": "mozilla/send",
|
"repository": "mozilla/send",
|
||||||
"homepage": "https://github.com/mozilla/send/",
|
"homepage": "https://github.com/mozilla/send/",
|
||||||
@@ -26,7 +26,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"
|
||||||
@@ -35,7 +35,8 @@
|
|||||||
"hooks": {
|
"hooks": {
|
||||||
"pre-commit": "lint-staged",
|
"pre-commit": "lint-staged",
|
||||||
"pre-push": "npm test",
|
"pre-push": "npm test",
|
||||||
"post-merge": "npm install"
|
"post-merge": "npm install",
|
||||||
|
"post-checkout": "scripts/sync-npm-dependencies.sh"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
@@ -57,110 +58,108 @@
|
|||||||
"cache": true
|
"cache": true
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": "^12.16.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.4.5",
|
"@babel/core": "^7.7.2",
|
||||||
"@babel/plugin-proposal-class-properties": "^7.4.4",
|
"@babel/plugin-proposal-class-properties": "^7.7.0",
|
||||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||||
"@babel/preset-env": "^7.4.5",
|
"@babel/preset-env": "^7.7.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.8.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.1.4",
|
"babel-plugin-istanbul": "^5.2.0",
|
||||||
"base64-js": "^1.3.0",
|
"base64-js": "^1.3.1",
|
||||||
"content-disposition": "^0.5.3",
|
"content-disposition": "^0.5.3",
|
||||||
"copy-webpack-plugin": "^5.0.3",
|
"copy-webpack-plugin": "^5.0.5",
|
||||||
"core-js": "^3.1.3",
|
"core-js": "^3.4.0",
|
||||||
"crc": "^3.8.0",
|
"crc": "^3.8.0",
|
||||||
"cross-env": "^5.2.0",
|
"cross-env": "^6.0.3",
|
||||||
"css-loader": "^2.1.1",
|
"css-loader": "^3.2.0",
|
||||||
"css-mqpacker": "^7.0.0",
|
"css-mqpacker": "^7.0.0",
|
||||||
"cssnano": "^4.1.10",
|
"cssnano": "^4.1.10",
|
||||||
"eslint": "^5.16.0",
|
"eslint": "^6.6.0",
|
||||||
"eslint-plugin-mocha": "^5.3.0",
|
"eslint-config-prettier": "^6.5.0",
|
||||||
"eslint-plugin-node": "^8.0.1",
|
"eslint-plugin-mocha": "^6.2.1",
|
||||||
|
"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.1.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.0",
|
||||||
"file-loader": "^3.0.1",
|
"file-loader": "^4.2.0",
|
||||||
"fluent-intl-polyfill": "^0.1.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": "^2.3.0",
|
"husky": "^3.0.9",
|
||||||
"lint-staged": "^8.1.7",
|
"intl-pluralrules": "^1.1.1",
|
||||||
"mocha": "^6.1.4",
|
"lint-staged": "^9.4.2",
|
||||||
|
"mocha": "^6.2.2",
|
||||||
"morgan": "^1.9.1",
|
"morgan": "^1.9.1",
|
||||||
"nanobus": "^4.4.0",
|
"nanobus": "^4.4.0",
|
||||||
"nanohtml": "^1.6.2",
|
"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.6.0",
|
"postcss-preset-env": "^6.7.0",
|
||||||
"prettier": "^1.17.1",
|
"prettier": "^1.19.1",
|
||||||
"proxyquire": "^2.1.0",
|
"proxyquire": "^2.1.3",
|
||||||
"puppeteer": "^1.17.0",
|
"puppeteer": "^2.0.0",
|
||||||
"raven-js": "^3.27.1",
|
"raw-loader": "^3.1.0",
|
||||||
"raw-loader": "^2.0.0",
|
"redis-mock": "^0.47.0",
|
||||||
"redis-mock": "^0.43.0",
|
"rimraf": "^3.0.0",
|
||||||
"rimraf": "^2.6.3",
|
|
||||||
"script-loader": "^0.7.2",
|
"script-loader": "^0.7.2",
|
||||||
"sinon": "^7.3.2",
|
"sinon": "^7.5.0",
|
||||||
"string-hash": "^1.1.3",
|
"string-hash": "^1.1.3",
|
||||||
"stylelint": "^10.0.1",
|
"stylelint": "^11.1.1",
|
||||||
"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": "^3.0.2",
|
||||||
"svgo": "^1.2.2",
|
"svgo": "^1.3.2",
|
||||||
"svgo-loader": "^2.2.0",
|
"svgo-loader": "^2.2.1",
|
||||||
"tailwindcss": "^0.7.4",
|
"tailwindcss": "^1.1.3",
|
||||||
"val-loader": "^1.1.1",
|
"val-loader": "^1.1.1",
|
||||||
"wdio-docker-service": "^1.4.2",
|
"webpack": "4.38.0",
|
||||||
"wdio-dot-reporter": "0.0.10",
|
"webpack-cli": "^3.3.10",
|
||||||
"wdio-firefox-profile-service": "^0.1.3",
|
"webpack-dev-middleware": "^3.7.2",
|
||||||
"wdio-mocha-framework": "^0.6.3",
|
"webpack-dev-server": "^3.9.0",
|
||||||
"wdio-sauce-service": "^0.4.14",
|
"webpack-manifest-plugin": "^2.2.0",
|
||||||
"wdio-selenium-standalone-service": "0.0.12",
|
|
||||||
"wdio-spec-reporter": "^0.1.5",
|
|
||||||
"webdriverio": "^4.14.4",
|
|
||||||
"webpack": "^4.32.2",
|
|
||||||
"webpack-cli": "^3.3.2",
|
|
||||||
"webpack-dev-middleware": "^3.7.0",
|
|
||||||
"webpack-dev-server": "^3.4.1",
|
|
||||||
"webpack-manifest-plugin": "^2.0.4",
|
|
||||||
"webpack-unassert-loader": "^1.2.0"
|
"webpack-unassert-loader": "^1.2.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@google-cloud/storage": "^2.5.0",
|
"@dannycoates/express-ws": "^5.0.3",
|
||||||
"aws-sdk": "^2.465.0",
|
"@fluent/bundle": "^0.13.0",
|
||||||
|
"@fluent/langneg": "^0.3.0",
|
||||||
|
"@google-cloud/storage": "^4.1.1",
|
||||||
|
"@sentry/node": "^5.8.0",
|
||||||
|
"aws-sdk": "^2.568.0",
|
||||||
"body-parser": "^1.19.0",
|
"body-parser": "^1.19.0",
|
||||||
"choo": "^6.13.3",
|
"choo": "^7.0.0",
|
||||||
"cldr-core": "^35.1.0",
|
"cldr-core": "^35.1.0",
|
||||||
"convict": "^4.4.1",
|
"configstore": "github:dannycoates/configstore#master",
|
||||||
|
"convict": "^5.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"express-ws": "github:dannycoates/express-ws",
|
|
||||||
"fluent": "^0.12.0",
|
|
||||||
"fluent-langneg": "^0.1.1",
|
|
||||||
"fxa-geodb": "^1.0.4",
|
"fxa-geodb": "^1.0.4",
|
||||||
"helmet": "^3.18.0",
|
"helmet": "^3.21.2",
|
||||||
"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.0",
|
||||||
"raven": "^2.6.4",
|
|
||||||
"redis": "^2.8.0",
|
"redis": "^2.8.0",
|
||||||
"selenium-standalone": "^6.15.6",
|
"selenium-standalone": "^6.15.6",
|
||||||
"ua-parser-js": "^0.7.19",
|
"ua-parser-js": "^0.7.20"
|
||||||
"websocket-stream": "^5.5.0"
|
|
||||||
},
|
},
|
||||||
"availableLanguages": [
|
"availableLanguages": [
|
||||||
"en-US",
|
"en-US",
|
||||||
|
"an",
|
||||||
|
"ar",
|
||||||
"ast",
|
"ast",
|
||||||
"bn-BD",
|
"azz",
|
||||||
|
"be",
|
||||||
|
"bn",
|
||||||
|
"br",
|
||||||
"ca",
|
"ca",
|
||||||
"cak",
|
"cak",
|
||||||
"cs",
|
"cs",
|
||||||
@@ -175,12 +174,19 @@
|
|||||||
"es-CL",
|
"es-CL",
|
||||||
"es-ES",
|
"es-ES",
|
||||||
"es-MX",
|
"es-MX",
|
||||||
|
"et",
|
||||||
|
"eu",
|
||||||
|
"fa",
|
||||||
"fi",
|
"fi",
|
||||||
"fr",
|
"fr",
|
||||||
"fy-NL",
|
"fy-NL",
|
||||||
|
"gn",
|
||||||
|
"he",
|
||||||
"hr",
|
"hr",
|
||||||
"hsb",
|
"hsb",
|
||||||
"hu",
|
"hu",
|
||||||
|
"hus",
|
||||||
|
"hy-AM",
|
||||||
"ia",
|
"ia",
|
||||||
"id",
|
"id",
|
||||||
"it",
|
"it",
|
||||||
@@ -189,21 +195,33 @@
|
|||||||
"kab",
|
"kab",
|
||||||
"ko",
|
"ko",
|
||||||
"lt",
|
"lt",
|
||||||
|
"meh",
|
||||||
|
"mix",
|
||||||
|
"ml",
|
||||||
|
"nb-NO",
|
||||||
"nl",
|
"nl",
|
||||||
"nn-NO",
|
"nn-NO",
|
||||||
|
"oc",
|
||||||
|
"pa-IN",
|
||||||
"pl",
|
"pl",
|
||||||
|
"ppl",
|
||||||
"pt-BR",
|
"pt-BR",
|
||||||
"pt-PT",
|
"pt-PT",
|
||||||
|
"quc",
|
||||||
"ro",
|
"ro",
|
||||||
"ru",
|
"ru",
|
||||||
"sk",
|
"sk",
|
||||||
"sl",
|
"sl",
|
||||||
"sq",
|
"sq",
|
||||||
"sr",
|
"sr",
|
||||||
|
"su",
|
||||||
"sv-SE",
|
"sv-SE",
|
||||||
|
"te",
|
||||||
|
"th",
|
||||||
"tr",
|
"tr",
|
||||||
"uk",
|
"uk",
|
||||||
"vi",
|
"vi",
|
||||||
|
"zgh",
|
||||||
"zh-CN",
|
"zh-CN",
|
||||||
"zh-TW"
|
"zh-TW"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ class TailwindExtractor {
|
|||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
plugins: [
|
plugins: [
|
||||||
require('tailwindcss')('./tailwind.js'),
|
require('tailwindcss')('./tailwind.config.js'),
|
||||||
require('postcss-preset-env')
|
require('postcss-preset-env')
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|||||||
155
public/locales/an/send.ftl
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = Comentarios
|
||||||
|
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 Firefox 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 Firefox 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 = Firefox Send necesita JavaScript
|
||||||
|
whyJavascript = Per qué Firefox 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
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox 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
|
||||||
@@ -56,6 +56,11 @@ passwordSetError = يجب ألا تُضبط كلمة السر هذه
|
|||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
introTitle = شارِك ملفاتك بلا عناء وبخصوصية تامة
|
introTitle = شارِك ملفاتك بلا عناء وبخصوصية تامة
|
||||||
introDescription = يتيح لك { -send-brand } مشاركة الملفات عبر تعميتها من الطرفين وإتاحتها في رابط ينقضي أجله تلقائيا. هكذا يمكنك إبقاء ما شاركته خاصًا فتضمن بأن ملفاتك لن تبقى في الوِب أبد الدهر.
|
introDescription = يتيح لك { -send-brand } مشاركة الملفات عبر تعميتها من الطرفين وإتاحتها في رابط ينقضي أجله تلقائيا. هكذا يمكنك إبقاء ما شاركته خاصًا فتضمن بأن ملفاتك لن تبقى في الوِب أبد الدهر.
|
||||||
notifyUploadEncryptDone = اكتملت تعمية الملف وأصبح جاهزًا لإرساله
|
notifyUploadEncryptDone = اكتملت تعمية الملف وأصبح جاهزًا لإرساله
|
||||||
@@ -182,3 +187,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 = اطّلع على المزيد.
|
||||||
|
|||||||
@@ -21,12 +21,12 @@ 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 Firefox 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 Firefox Send. Vas precisar anovar el restolador.
|
||||||
updateFirefox = Anovar Firefox
|
updateFirefox = Anovar Firefox
|
||||||
deletePopupCancel = Encaboxar
|
deletePopupCancel = Encaboxar
|
||||||
deleteButtonHover = Desaniciar
|
deleteButtonHover = Desaniciar
|
||||||
@@ -54,9 +54,10 @@ passwordSetError = Nun pudo afitase esta contraseña
|
|||||||
-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
|
||||||
@@ -109,7 +110,9 @@ tooManyArchives =
|
|||||||
}
|
}
|
||||||
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 versión última de { -firefox } y cola versión 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 +126,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] Caltén activos los enllaces demientres 1 día
|
||||||
*[other] Caltén activos los enllaces demientres 1 díes
|
*[other] Calté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 +142,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,9 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteSubtitle = web eksperiment
|
|
||||||
siteFeedback = Geri dönüş
|
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,76 +14,26 @@ 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 = Firefox 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ı Firefox 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 = Firefox Send üçün JavaScript lazımdır
|
javascriptRequired = Firefox Send üçün JavaScript lazımdır
|
||||||
whyJavascript = Firefox 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.
|
||||||
@@ -113,9 +41,32 @@ enableJavascript = Lütfən JavaScript-i aktiv edib təkrar yoxlayın.
|
|||||||
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
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox 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ş
|
||||||
|
|||||||
146
public/locales/azz/send.ftl
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = Nikan uelis tikijkuilos tein tiknemilijtos
|
||||||
|
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 Firefox 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 Firefox 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 = Firefox Send kineki maj moajsi JavaScript
|
||||||
|
whyJavascript = ¿Keyej Firefox 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
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox 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.
|
||||||
164
public/locales/be/send.ftl
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = Водгук
|
||||||
|
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 = Паспрабуйце Firefox Send
|
||||||
|
errorPageHeader = Нешта пайшло не так!
|
||||||
|
fileTooBig = Гэты файл надта вялікі. Ён мусіць быць меншым за { $size }
|
||||||
|
linkExpiredAlt = Тэрмін дзеяння спасылкі сышоў
|
||||||
|
notSupportedHeader = Ваш браўзер не падтрымліваецца.
|
||||||
|
notSupportedLink = Чаму мой браўзер не падтрымліваецца?
|
||||||
|
notSupportedOutdatedDetail = На жаль, гэтая версія Firefox не падтрымлівае вэб-тэхналогію, што забяспечвае працу Firefox Send. Вам трэба абнавіць свой браўзер.
|
||||||
|
updateFirefox = Абнавіць Firefox
|
||||||
|
deletePopupCancel = Скасаваць
|
||||||
|
deleteButtonHover = Выдаліць
|
||||||
|
footerLinkLegal = Прававыя звесткі
|
||||||
|
footerLinkPrivacy = Прыватнасць
|
||||||
|
footerLinkCookies = Кукі
|
||||||
|
passwordTryAgain = Некарэктны пароль. Паспрабуйце зноў.
|
||||||
|
javascriptRequired = Для Firefox Send неабходны JavaScript
|
||||||
|
whyJavascript = Чаму для Firefox 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
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox 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 = Падрабязней.
|
||||||
@@ -126,7 +126,7 @@ addPassword = পাসওয়ার্ড দ্বারা সুরক্ষ
|
|||||||
emailPlaceholder = আপনার ইমেইল দিন
|
emailPlaceholder = আপনার ইমেইল দিন
|
||||||
# $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 = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন
|
signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন
|
||||||
signInButton = সাইন ইন/আপ
|
signInOnlyButton = সাইন ইন
|
||||||
accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন
|
accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন
|
||||||
# $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 = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন
|
accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = এই ব্রাউজার এতো বড় একট
|
|||||||
noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন
|
noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন
|
||||||
noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন
|
noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন
|
||||||
noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন
|
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 = { -send-brand } এর মাধ্যমে "{ $name }" ডাউনলোড করুন: সরল, নিরাপদ ফাইল শেয়ারিং
|
||||||
|
trailheadPromo = আপনার গোপনীয়তা রক্ষা করার একটি উপায় আছে। Firefox এ যোগ দিন।
|
||||||
|
learnMore = আরও জানুন।
|
||||||
@@ -151,3 +151,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ó.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteFeedback = Rutzijol
|
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 ->
|
||||||
@@ -151,3 +151,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.
|
||||||
|
|||||||
155
public/locales/ckb/send.ftl
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = ڕەخنەوپێشنیار
|
||||||
|
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 پشتگیری ئەو جۆرە تەکنەلۆژییە ناکات کە پێویستە بۆ 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
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox 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 = زیاتر بزانە
|
||||||
@@ -22,7 +22,7 @@ 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 Firefox 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
|
||||||
@@ -137,7 +137,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 ->
|
||||||
@@ -196,5 +196,5 @@ shareLinkDescription = Sdílet odkaz na soubor:
|
|||||||
shareLinkButton = Sdílet odkaz
|
shareLinkButton = Sdílet odkaz
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Stáhněte si soubor „{ $name }“ s { -send-brand(case: "ins") } - jednoduché a bezpečné sdílení souborů
|
shareMessage = Stáhněte si soubor „{ $name }“ s { -send-brand(case: "ins") } - jednoduché a bezpečné sdílení souborů
|
||||||
trailheadPromo = Existuje snadný způsob pro ochranu vašeho soukromí. Používejte Firefox.
|
trailheadPromo = Existuje způsob, jak ochránit své soukromí. Používejte Firefox.
|
||||||
learnMore = Zjistit více.
|
learnMore = Zjistit více.
|
||||||
|
|||||||
@@ -151,3 +151,5 @@ shareLinkDescription = Del linket til din fil:
|
|||||||
shareLinkButton = Del link
|
shareLinkButton = Del link
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling
|
shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling
|
||||||
|
trailheadPromo = Beskyt dine digitale rettigheder. Slut dig til Firefox.
|
||||||
|
learnMore = Læs mere.
|
||||||
|
|||||||
@@ -151,3 +151,5 @@ 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.
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ passwordSetError = Esta contraseña no pudo ser establecida
|
|||||||
-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 +95,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 ->
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteFeedback = Comentario
|
siteFeedback = Comentario
|
||||||
importingFile = Importando...
|
importingFile = Importando...
|
||||||
encryptingFile = Encriptando...
|
encryptingFile = Encriptando…
|
||||||
decryptingFile = Desencriptando...
|
decryptingFile = Desencriptando…
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 descarga
|
[one] 1 descarga
|
||||||
@@ -126,7 +126,7 @@ addPassword = Protegido con contraseña
|
|||||||
emailPlaceholder = Ingresa tu correo electrónico
|
emailPlaceholder = Ingresa tu correo electrónico
|
||||||
# $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 = Iniciar sesión para enviar hasta { $size }
|
signInSizeBump = Iniciar sesión para enviar hasta { $size }
|
||||||
signInButton = Iniciar sesión/registrarse
|
signInOnlyButton = Iniciar sesión
|
||||||
accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión
|
accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión
|
||||||
# $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 = Compartir archivos de hasta { $size }
|
accountBenefitLargeFiles = Compartir archivos de hasta { $size }
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan gr
|
|||||||
noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador
|
noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador
|
||||||
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
||||||
noStreamsOptionDownload = Continuar con este navegador
|
noStreamsOptionDownload = Continuar con este navegador
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } te lo ofrece el nuevo { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Comparte el enlace a tu archivo:
|
||||||
|
shareLinkButton = Enlace para compartir
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Descarga «{ $name }» con { -send-brand }: es sencillo y seguro
|
||||||
|
trailheadPromo = Existe una forma de proteger tu privacidad. Únete a Firefox.
|
||||||
|
learnMore = Saber más.
|
||||||
|
|||||||
@@ -151,3 +151,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.
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ fileSizeProgress = ({ $totalSize } / { $partialSize })
|
|||||||
sendYourFilesLink = Probatu Firefox Send
|
sendYourFilesLink = Probatu Firefox 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 iraungita
|
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 Firefox Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu.
|
||||||
@@ -50,10 +50,34 @@ passwordSetError = Pasahitz hau ezin da ezarri
|
|||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
-send-brand = Firefox Send
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Partekatu fitxategiak modu sinple eta pribatuan
|
introTitle = Partekatu fitxategiak modu sinple eta pribatuan
|
||||||
|
introDescription = { -send-brand } tresna fitxategiak partekatzeko da, muturretik muturrera zifratuta eta automatikoki iraungitzen diren loturekin. Hortaz, partekatzen duzuna pribatua izango da eta ziur egon zaitezke zure fitxategiak ez direla online egongo betirako.
|
||||||
notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago
|
notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = { $downloadCount } edo { $timespan } ondoren iraungiko da
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] minutu 1
|
||||||
|
*[other] { $num } minutu
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] egun 1
|
||||||
|
*[other] { $num } egun
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] aste 1
|
||||||
|
*[other] { $num } aste
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] fitxategi 1
|
||||||
|
*[other] { $num } fitxategi
|
||||||
|
}
|
||||||
# byte abbreviation
|
# byte abbreviation
|
||||||
bytes = B
|
bytes = B
|
||||||
# kibibyte abbreviation
|
# kibibyte abbreviation
|
||||||
@@ -64,9 +88,33 @@ mb = MB
|
|||||||
gb = GB
|
gb = GB
|
||||||
# localized number and byte abbreviation. example "2.5MB"
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
fileSize = { $num }{ $units }
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = Tamaina guztira: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Kopiatu fitxategia partekatzeko lotura:
|
||||||
|
copyLinkButton = Kopiatu lotura
|
||||||
downloadTitle = Deskargatu fitxategiak
|
downloadTitle = Deskargatu fitxategiak
|
||||||
|
downloadDescription = { -send-brand } bidez partekatu da fitxategia muturretik muturrera zifratuta eta automatikoki iraungitzen den lotura batekin.
|
||||||
|
trySendDescription = Probatu { -send-brand } fitxategiak partekatzeko modu sinple eta segururako.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Soilik fitxategi bakarra igo daiteke aldi berean.
|
||||||
|
*[other] Soilik { $count } fitxategi igo daitezke aldi berean.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Soilik artxibo bakarra onartzen da.
|
||||||
|
*[other] Soilik { $count } artxibo onartzen dira.
|
||||||
|
}
|
||||||
|
expiredTitle = Lotura hau iraungi da.
|
||||||
|
notSupportedDescription = { -send-brand } ez da nabigatzaile honetan ibiliko. { -send-short-brand } hobeto dabil { -firefox }(r)en azken bertsioarekin; halaber, nabigatzaile gehienen azken bertsioarekin ibiliko da.
|
||||||
downloadFirefox = Deskargatu { -firefox }
|
downloadFirefox = Deskargatu { -firefox }
|
||||||
|
legalTitle = { -send-short-brand } pribatutasun-oharra
|
||||||
legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa.
|
legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa.
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days }e { $hours }h { $minutes }m
|
||||||
addFilesButton = Hautatu igotzeko fitxategiak
|
addFilesButton = Hautatu igotzeko fitxategiak
|
||||||
uploadButton = Igo
|
uploadButton = Igo
|
||||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
@@ -76,8 +124,32 @@ dragAndDropFiles = Arrastatu eta jaregin fitxategiak
|
|||||||
orClickWithSize = edo egin klik { $size } arte igotzeko
|
orClickWithSize = edo egin klik { $size } arte igotzeko
|
||||||
addPassword = Babestu pasahitzarekin
|
addPassword = Babestu pasahitzarekin
|
||||||
emailPlaceholder = Idatzi zure helbide elektronikoa
|
emailPlaceholder = Idatzi zure helbide elektronikoa
|
||||||
signInButton = Hasi saioa/eman izena
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Hasi saioa { $size } arte bidaltzeko
|
||||||
|
signInOnlyButton = Hasi saioa
|
||||||
accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa
|
accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa
|
||||||
# $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 = Partekatu { $size } arteko fitxategiak
|
accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak
|
||||||
accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin
|
accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Utzi loturak erabilgarri egun batez
|
||||||
|
*[other] Utzi loturak erabilgarri { $count } egunez
|
||||||
|
}
|
||||||
|
accountBenefitSync = Kudeatu partekatutako fitxategiak edozein gailutatik
|
||||||
|
accountBenefitMoz = { -mozilla }ren beste zerbitzuei buruzko argibide gehiago
|
||||||
|
signOut = Amaitu saioa
|
||||||
|
okButton = Ados
|
||||||
|
downloadingTitle = Deskargatzen
|
||||||
|
noStreamsWarning = Baliteke nabigatzailea gai ez izatea horrelako tamaina handiko fitxategiak deszifratzeko.
|
||||||
|
noStreamsOptionCopy = Kopiatu lotura beste nabigatzaile batean irekitzeko
|
||||||
|
noStreamsOptionFirefox = Probatu gure nabigatzaile gogokoena
|
||||||
|
noStreamsOptionDownload = Jarraitu nabigatzaile honekin
|
||||||
|
downloadFirefoxPromo = Erabat berritutako { -firefox }(e)k eskaintzen dizu { -send-short-brand }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Partekatu zure fitxategirako lotura:
|
||||||
|
shareLinkButton = Partekatu lotura
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Deskargatu "{ $name }" { -send-brand } erabiliz: fitxategi-partekatze sinple eta segurua
|
||||||
|
trailheadPromo = Badago zure pribatutasuna babesteko modua. Egizu bat Firefoxekin.
|
||||||
|
learnMore = Argibide gehiago.
|
||||||
|
|||||||
@@ -1,31 +1,9 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteSubtitle = آزمایش وب
|
|
||||||
siteFeedback = بازخورد
|
siteFeedback = بازخورد
|
||||||
uploadPageHeader = اشتراکگذاری پروندهها، رمزنگاری شده و خصوصی
|
|
||||||
uploadPageExplainer = پرونده های خود را به صورت ایمن، خصوصی و رمزنگاری شده با تعیین تاریخ انقضا خودکار ارسال کنید تا اطمینان پیدا کنید چیزهای شما همیشه آنلاین باقی نماند.
|
|
||||||
uploadPageLearnMore = بیشتر بدانید
|
|
||||||
uploadPageDropMessage = برای شروع بارگذاری پروندههای خود را اینجا بیاندازید
|
|
||||||
uploadPageSizeMessage = برای بیشترین قابلیت اطمینان، بهتر است که پروندهتان کمتر از ۱ گیگابایت باشد
|
|
||||||
uploadPageBrowseButton = یک پرونده را از روی کامپیوتر خود انتخاب کنید
|
|
||||||
uploadPageBrowseButton1 = یک پرونده را برای بارگذاری انتخاب کنید
|
|
||||||
uploadPageMultipleFilesAlert = بارگذاری چندین پرونده یا یک پوشه در حال حاضر پشتیبانی نمیشود.
|
|
||||||
uploadPageBrowseButtonTitle = بارگذاری پرونده
|
|
||||||
uploadingPageProgress = در حال بارگذاری پرونده { $filename } ({ $size })
|
|
||||||
importingFile = در حال وارد کردن…
|
importingFile = در حال وارد کردن…
|
||||||
verifyingFile = در حال تایید…
|
|
||||||
encryptingFile = در حال رمزنگاری…
|
encryptingFile = در حال رمزنگاری…
|
||||||
decryptingFile = در حال رمزگشایی…
|
decryptingFile = در حال رمزگشایی…
|
||||||
notifyUploadDone = بارگذاری شما پایان یافت.
|
|
||||||
uploadingPageMessage = به محض بارگذاری پرونده شما قادر خواهید بود برای آن گزینه انقضا تعیین کنید.
|
|
||||||
uploadingPageCancel = لغو بارگذاری
|
|
||||||
uploadCancelNotification = بارگذاری شما لغو شد
|
|
||||||
uploadingPageLargeFileMessage = پرونده بزرگ است و ممکن است بارگذاری آن مدتی طول بکشد. محکم بشینید!
|
|
||||||
uploadingFileNotification = هر وقت بارگذاری تمام شد به من اطلاع بده.
|
|
||||||
uploadSuccessConfirmHeader = آماده برای ارسال
|
|
||||||
uploadSvgAlt = بارگذاری
|
|
||||||
uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد.
|
|
||||||
expireInfo = این پیوند به فایل شما پس از { $downloadCount } یا { $timespan } منقضی خواهد شد.
|
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] ۱ بارگیری
|
[one] ۱ بارگیری
|
||||||
@@ -36,76 +14,26 @@ timespanHours =
|
|||||||
[one] ۱ ساعت
|
[one] ۱ ساعت
|
||||||
*[other] { $num } ساعت
|
*[other] { $num } ساعت
|
||||||
}
|
}
|
||||||
copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename }
|
|
||||||
copyUrlFormButton = رونوشت به کلیپبورد
|
|
||||||
copiedUrl = رونوشت شد!
|
copiedUrl = رونوشت شد!
|
||||||
deleteFileButton = حذف پرونده
|
|
||||||
sendAnotherFileLink = ارسال پرونده دیگر
|
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
downloadAltText = دریافت
|
|
||||||
downloadsFileList = دریافتها
|
|
||||||
# Used as header in a column indicating the amount of time left before a
|
|
||||||
# download link expires (e.g. "10h 5m")
|
|
||||||
timeFileList = زمان
|
|
||||||
# Used as header in a column indicating the number of times a file has been
|
|
||||||
# downloaded
|
|
||||||
downloadFileName = بارگیری { $filename }
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
unlockInputLabel = گذرواژه را وارد کنید
|
|
||||||
unlockInputPlaceholder = گذرواژه
|
unlockInputPlaceholder = گذرواژه
|
||||||
unlockButtonLabel = باز کردن
|
unlockButtonLabel = باز کردن
|
||||||
downloadFileTitle = دریافت پروندهٔ رمزنگاری شده
|
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
downloadMessage = دوست شما درحال ارسال پرونده ای به وسیله Firefox Send است، این سرویس این امکان را به شما میدهد تا پروندههای خود را به صورت ایمن،خصوصی و رمزنگاری شده به همراه پیوند انقضا خودکار همرسانی کنید تا اطمینان حاصل کنید چیزهای شما برای همیشه آنلاین باقی نخواهد ماند.
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = بارگیری
|
downloadButtonLabel = بارگیری
|
||||||
downloadNotification = بارگیری شما کامل شد.
|
|
||||||
downloadFinish = بارگیری کامل شد
|
downloadFinish = بارگیری کامل شد
|
||||||
# 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 = Firefox Send را امتحان کنید
|
sendYourFilesLink = Firefox Send را امتحان کنید
|
||||||
downloadingPageProgress = دریافت { $filename } ({ $size })
|
errorPageHeader = خطایی رخ داد!
|
||||||
downloadingPageMessage = لطفا این زبانه را باز بگذارید در حالی که ما فایل شما را دریافت میکنیم و کدگذاری میکنیم.
|
|
||||||
errorAltText = خطا در بارگذاری
|
|
||||||
errorPageHeader = چیزی دچار اشکال شده است!
|
|
||||||
errorPageMessage = خطایی در هنگام بارگذاری پرونده شما رخ داده است.
|
|
||||||
errorPageLink = پرونده دیگری ارسال کنید.
|
|
||||||
fileTooBig = این پرونده بسیار حجیم است. حجم آن میبایستی کم تر { $size } باشد.
|
fileTooBig = این پرونده بسیار حجیم است. حجم آن میبایستی کم تر { $size } باشد.
|
||||||
linkExpiredAlt = پیوند منقضی شده است
|
linkExpiredAlt = پیوند منقضی شده است
|
||||||
expiredPageHeader = پیوند منقضی شده است یا در از همان ابتدا وجود نداشته است!
|
notSupportedHeader = مرورگر شما پشتیبانی نمیشود.
|
||||||
notSupportedHeader = مرورگر شما پشتیبانی نمیکند.
|
notSupportedLink = چرا از مرورگر من پشتیبانی نمیشود؟
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
notSupportedDetail = متاسفانه این مرورگر این تکنولوژی وب را که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما بایستی مرورگری دیگری را امتحان کنید. پیشنهاد ما به شما فایرفاکس است !
|
|
||||||
notSupportedLink = چرا مرورگر من پشتیبانی نمیکند؟
|
|
||||||
notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما نیاز دارید تا مرورگر خود را بروز کنید.
|
notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما نیاز دارید تا مرورگر خود را بروز کنید.
|
||||||
updateFirefox = بروزرسانی فایرفاکس
|
updateFirefox = بروزرسانی فایرفاکس
|
||||||
downloadFirefoxButtonSub = دریافت رایگان
|
|
||||||
uploadedFile = پرونده
|
|
||||||
copyFileList = رونوشت از نشانی
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = زمان انقضا
|
|
||||||
deleteFileList = حذف
|
|
||||||
nevermindButton = بیخیال
|
|
||||||
legalHeader = شرایط و حریمخصوصی
|
|
||||||
legalNoticeTestPilot = Firefox Send در حال حاضر در نسخه آزمایشی خود به صورت میدهد و تحت عنوان خلبان آموزشی <a>شرایط و خدمات</a> و <a>موارد حریم خصوصی </a> کار میکند. شما میتوانید اطلاعات بیشتر در مورد این آزمایش و اطلاعات که ذخیره میکنید را از <a> اینجا </a> کسب کنید.
|
|
||||||
legalNoticeMozilla = استفاده از Firefox Send همچنین منصوب به موزیلا است. <a>پایگاه اینترنتی نکات حریم شخصی </a> و <a> پایگاه اطلاع رسانی شرایط خدمات و استفاده </a>.
|
|
||||||
deletePopupText = حذف این پرونده؟
|
|
||||||
deletePopupYes = بله
|
|
||||||
deletePopupCancel = انصراف
|
deletePopupCancel = انصراف
|
||||||
deleteButtonHover = حذف
|
deleteButtonHover = حذف
|
||||||
copyUrlHover = رونوشت از نشانی
|
|
||||||
footerLinkLegal = ملاحظات حقوقی
|
footerLinkLegal = ملاحظات حقوقی
|
||||||
# Test Pilot is a proper name and should not be localized.
|
|
||||||
footerLinkAbout = درباره Test Pilot
|
|
||||||
footerLinkPrivacy = حریمخصوصی
|
footerLinkPrivacy = حریمخصوصی
|
||||||
footerLinkTerms = شرایط
|
|
||||||
footerLinkCookies = کوکیها
|
footerLinkCookies = کوکیها
|
||||||
requirePasswordCheckbox = دریافت این پرونده نیاز به گذرواژه دارد
|
|
||||||
addPasswordButton = افزودن گذرواژه
|
|
||||||
changePasswordButton = تغییر
|
|
||||||
passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید.
|
passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید.
|
||||||
reportIPInfringement = گزارش تخلف IP
|
|
||||||
javascriptRequired = Firefox Send نیازمند جاوااسکریپت است
|
javascriptRequired = Firefox Send نیازمند جاوااسکریپت است
|
||||||
whyJavascript = چرا Firefox Send جاوااسکریپت لازم داد؟
|
whyJavascript = چرا Firefox Send جاوااسکریپت لازم داد؟
|
||||||
enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید.
|
enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید.
|
||||||
@@ -113,9 +41,115 @@ enableJavascript = لطفا جاوااسکریپت را فعال کنید و م
|
|||||||
expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه
|
expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه
|
||||||
# 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 } دقیقه
|
expiresMinutes = { $minutes } دقیقه
|
||||||
# A short status message shown when a password is successfully set
|
|
||||||
passwordIsSet = گذرواژه تنظیم شد
|
|
||||||
# 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 = حداکثر اندازهٔ گذرواژه: { $length }
|
maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $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 = امکان ثبت این گذواژه نیست
|
passwordSetError = امکان ثبت این گذواژه نیست
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = ارسال
|
||||||
|
-firefox = فایرفاکس
|
||||||
|
-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 = نسخه ۱.۰، مورخ ۱۲، ۲۰۱۹
|
||||||
|
# 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 = راهی برای محافظت از حریم خصوصی شما وجود دارد. به Firefox بپیوندید.
|
||||||
|
learnMore = بیشتر بدانید.
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ downloadCount =
|
|||||||
timespanHours =
|
timespanHours =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 oer
|
[one] 1 oer
|
||||||
*[other] { $num } oeren
|
*[other] { $num } oer
|
||||||
}
|
}
|
||||||
copiedUrl = Kopiearre!
|
copiedUrl = Kopiearre!
|
||||||
unlockInputPlaceholder = Wachtwurd
|
unlockInputPlaceholder = Wachtwurd
|
||||||
|
|||||||
155
public/locales/gn/send.ftl
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = Je’ejey
|
||||||
|
importingFile = Ojegueruhína…
|
||||||
|
encryptingFile = Mo’ãmby…
|
||||||
|
decryptingFile = Ñemo’ã’o…
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 mboguejy
|
||||||
|
*[other] { $num } mboguejy
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 aravo
|
||||||
|
*[other] { $num } aravo
|
||||||
|
}
|
||||||
|
copiedUrl = Monguatiapyre!
|
||||||
|
unlockInputPlaceholder = Ñe’ẽñemi
|
||||||
|
unlockButtonLabel = Mbojera
|
||||||
|
downloadButtonLabel = Mboguejy
|
||||||
|
downloadFinish = Oguejypáma
|
||||||
|
fileSizeProgress = ({ $partialSize } rehe { $totalSize })
|
||||||
|
sendYourFilesLink = Eipuru Firefox Send
|
||||||
|
errorPageHeader = ¡Oiko jejavy!
|
||||||
|
fileTooBig = Marandurenda tuichaiterei ehupi hag̃ua. Michĩveva’erã { $size } gui.
|
||||||
|
linkExpiredAlt = Juajuha ndoikóiva
|
||||||
|
notSupportedHeader = Ne kundaha ndorekói pytyvõ.
|
||||||
|
notSupportedLink = ¿Mba’ére che kundahára ndorekói ñepytyvõ?
|
||||||
|
notSupportedOutdatedDetail = Ko Firefox rembiapo ndaipu’akái ñanduti rembipurupyahu oikotevẽva Firefox Send. Embohekopyahúke ne kundahára.
|
||||||
|
updateFirefox = Firefox mbohekopyahu
|
||||||
|
deletePopupCancel = Heja
|
||||||
|
deleteButtonHover = Mboguete
|
||||||
|
footerLinkLegal = Añetegua
|
||||||
|
footerLinkPrivacy = Ñemigua
|
||||||
|
footerLinkCookies = Kookie
|
||||||
|
passwordTryAgain = Ñe’ẽñemi ndoikóiva. Eha’ãjey.
|
||||||
|
javascriptRequired = Firefox Send oikotevẽ JavaScript
|
||||||
|
whyJavascript = ¿Mba’ére Firefox Send oikotevẽ JavaScript?
|
||||||
|
enableJavascript = Ikatúpa embojuruja JavaScript ha eha’ãjey uperire.
|
||||||
|
# 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 = Ñe’ẽñemi pukukue: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = Ndaikatúi oikóvo ko ñe’ẽñemi
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Marandurenda ñemoambue hasy'ỹ ha ñemiguáva
|
||||||
|
introDescription = { -send-brand } omoherakuãkuaa marandurenda papapýpe ñepyrũ guive opa peve ha juajuha opareíva ijehegui. Ikatu oreko ñemihápe emoherakuãva ha ehecháta mba’éicha ne mba’ekuéra noĩri ñandutípe opa ára.
|
||||||
|
notifyUploadEncryptDone = Ne marandurenda oñemo’ã ha ikatúma emondo
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Opáta { $downloadCount } rire térã { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 aravo’i
|
||||||
|
*[other] { $num } aravo’i
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 ára
|
||||||
|
*[other] { $num } ára
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 arapokõindy
|
||||||
|
*[other] { $num } arapokõindy
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 marandurenda
|
||||||
|
*[other] { $num } marandurenda
|
||||||
|
}
|
||||||
|
# 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 = Tuichakue: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Emonguatia juajuha ha emoherakuã ne marandurenda:
|
||||||
|
copyLinkButton = Emonguatia juajuha
|
||||||
|
downloadTitle = Emboguejy marandurenda
|
||||||
|
downloadDescription = Ko marandurenda omoherakuã { -send-brand } rupive papapýpe ñepyrũ guive opa peve ha juajuha opáva ijehegui reheve.
|
||||||
|
trySendDescription = Eipuru { -send-brand } emoherakuã hag̃ua marandurenda tasy’ỹ ha tekorosãme.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Ikatu ehupi 1 marandurenda oñondive
|
||||||
|
*[other] Ikatu ehupi { $count } marandurenda oñondive
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Oñemoneĩ 1 marandurenda añoite
|
||||||
|
*[other] Oñemoneĩ { $count } marandurenda añoite
|
||||||
|
}
|
||||||
|
expiredTitle = Ko juajuha ndoikovéima.
|
||||||
|
notSupportedDescription = { -send-brand } ndoikomo’ãi ko kundahára ndive. { -send-short-brand } oikoporãvéta { -firefox } rembiapokue ipyahuvéva ndive, ha oikóta opavavete kundahára ndive.
|
||||||
|
downloadFirefox = Emboguejy { -firefox }
|
||||||
|
legalTitle = { -send-short-brand } Marandu ñemigua
|
||||||
|
legalDateStamp = Mba’epyahu 1.0, 12 jasyapy 2019 peguare
|
||||||
|
# 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
|
||||||
|
addFilesButton = Eiporavo marandurenda ehupi hag̃ua
|
||||||
|
uploadButton = Hupi
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Embosyryry ha epoi marandurenda
|
||||||
|
# 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 = térã eikutu emondo hag̃ua { $size } peve
|
||||||
|
addPassword = Ñe’ẽñemíme mo’ãmbyre
|
||||||
|
emailPlaceholder = Emoinge ne ñanduti veve
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Eñepyrũ tembiapo emondo hag̃ua { $size } peve
|
||||||
|
signInOnlyButton = Eñepyrũ tembiapo
|
||||||
|
accountBenefitTitle = Emoheñói { -firefox } mba’ete térã eñepyrũ tembiapo
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Emoherakuã marandurenda { $size } peve
|
||||||
|
accountBenefitDownloadCount = Emoherakuã marandurenda hetave tapicha ndive
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Eguereko juajuha hendyhápe 1 ára
|
||||||
|
*[other] Eguereko juajuha hendyhápe { $count } ára
|
||||||
|
}
|
||||||
|
accountBenefitSync = Eñangareko marandurenda moherakuãmbyrére oimeraẽ mba’e’oka guive.
|
||||||
|
accountBenefitMoz = Eikuaa ambue { -mozilla } mba'epytyvõrã
|
||||||
|
signOut = Emboty tembiapo
|
||||||
|
okButton = OK
|
||||||
|
downloadingTitle = Oñemboguejyhína
|
||||||
|
noStreamsWarning = Ikatu ko kundahára ndoikuaái marandurenda tuichaitereíva.
|
||||||
|
noStreamsOptionCopy = Embokuatia juajuha embojuruja hag̃ua ambue kundahárape.
|
||||||
|
noStreamsOptionFirefox = Eipuru ore kundahára rohayhuvéva
|
||||||
|
noStreamsOptionDownload = Eku’ejey ko kundahára ndive
|
||||||
|
downloadFirefoxPromo = Ipyahúva { -firefox } ome’ẽse ndéve { -send-short-brand }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Emoherakuã juajuha ne mba’e’oka ndive:
|
||||||
|
shareLinkButton = Emoherakuã juajuha
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Emboguejy “{ $name }” { -send-brand } ndive: emoherakuã marandurenda tasy'ỹ ha tekorosãme
|
||||||
|
trailheadPromo = Mba’éichapa emo’ãta ne ñemigua. Eipuru Firefox.
|
||||||
|
learnMore = Kuaave.
|
||||||
@@ -1,66 +1,158 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteSubtitle = ניסוי אינטרנט
|
|
||||||
siteFeedback = משוב
|
siteFeedback = משוב
|
||||||
uploadPageHeader = שיתוף קבצים פרטי, מוצפן
|
importingFile = מתבצע ייבוא…
|
||||||
uploadPageExplainer = לשלוח קבצים דרך קישור בטוח, פרטי ומוצפן שפג אוטומטית, כדי לוודא שהתכנים הפרטיים שלך לא יהיו ברשת לנצח.
|
|
||||||
uploadPageLearnMore = מידע נוסף
|
|
||||||
uploadPageDropMessage = יש לגרור קבצים לכאן כדי להתחיל בהעלאה
|
|
||||||
uploadPageSizeMessage = להשגת ביצועים מיטביים, מוטב לשמור על הקובץ מתחת לגודל של 1 ג״ב
|
|
||||||
uploadPageBrowseButton1 = נא לבחור קובץ להעלאה
|
|
||||||
uploadPageMultipleFilesAlert = העלאה של מספר קבצים או ספריה אינה נתמכת כרגע.
|
|
||||||
uploadPageBrowseButtonTitle = העלאת קובץ
|
|
||||||
uploadingPageProgress = { $filename } ({ $size }) בהעלאה
|
|
||||||
importingFile = מתבצע ייבוא...
|
|
||||||
verifyingFile = מתבצע אימות…
|
|
||||||
encryptingFile = מתבצעת הצפנה...
|
encryptingFile = מתבצעת הצפנה...
|
||||||
decryptingFile = מתבצע פענוח...
|
decryptingFile = מתבצע פענוח...
|
||||||
notifyUploadDone = ההעלאה שלך הסתיימה
|
downloadCount =
|
||||||
uploadingPageMessage = אחרי שהקובץ שלך יעלה, ניתן יהיה להגדיר אפשרויות תפוגה.
|
{ $num ->
|
||||||
uploadCancelNotification = ההעלאה שלך בוטלה.
|
[one] הורדה אחת
|
||||||
uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות!
|
*[other] { $num } הורדות
|
||||||
uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה.
|
}
|
||||||
uploadSuccessConfirmHeader = מוכן לשליחה
|
timespanHours =
|
||||||
uploadSvgAlt = העלאה
|
{ $num ->
|
||||||
uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות.
|
[one] שעה אחת
|
||||||
copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename }
|
[two] שעתיים
|
||||||
|
*[other] { $num } שעות
|
||||||
|
}
|
||||||
copiedUrl = הועתק!
|
copiedUrl = הועתק!
|
||||||
deleteFileButton = מחיקת קובץ
|
unlockInputPlaceholder = ססמה
|
||||||
sendAnotherFileLink = שליחת קובץ נוסף
|
unlockButtonLabel = שחרור נעילה
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
downloadAltText = הורדה
|
|
||||||
# Used as header in a column indicating the number of times a file has been
|
|
||||||
# downloaded
|
|
||||||
downloadFileName = ההורדה נכשלה
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = הורדה
|
downloadButtonLabel = הורדה
|
||||||
downloadNotification = ההורדה הושלמה.
|
|
||||||
downloadFinish = ההורדה הושלמה
|
downloadFinish = ההורדה הושלמה
|
||||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
|
||||||
fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
|
fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
|
||||||
downloadingPageProgress = בהורדה: { $filename } ({ $size })
|
sendYourFilesLink = נסו את Firefox Send
|
||||||
errorAltText = תקלה בהעלאה
|
|
||||||
errorPageHeader = משהו השתבש!
|
errorPageHeader = משהו השתבש!
|
||||||
errorPageLink = שליחת קובץ נוסף
|
|
||||||
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
|
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
|
||||||
linkExpiredAlt = הקישור פג
|
linkExpiredAlt = הקישור פג
|
||||||
notSupportedHeader = הדפדפן שלך לא נתמך.
|
notSupportedHeader = הדפדפן שלך לא נתמך.
|
||||||
notSupportedLink = למה אין תמיכה בדפדפן שלי?
|
notSupportedLink = למה אין תמיכה בדפדפן שלי?
|
||||||
downloadFirefoxButtonSub = הורדה בחינם
|
notSupportedOutdatedDetail = לצערנו גרסת Firefox זו לא תומכת בטכנולוגית הרשת שמפעילה את Firefox Send. יש לעדכן את הגרסה של הדפדפן שלך.
|
||||||
uploadedFile = קובץ
|
updateFirefox = עדכון Firefox
|
||||||
copyFileList = העתקת כתובת
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = יפוג בעוד
|
|
||||||
deleteFileList = מחיקה
|
|
||||||
nevermindButton = לא משנה
|
|
||||||
legalHeader = תנאי שירות ופרטיות
|
|
||||||
deletePopupText = למחוק דף זה?
|
|
||||||
deletePopupYes = כן
|
|
||||||
deletePopupCancel = ביטול
|
deletePopupCancel = ביטול
|
||||||
deleteButtonHover = מחיקה
|
deleteButtonHover = מחיקה
|
||||||
copyUrlHover = העתקת קישור
|
|
||||||
footerLinkLegal = מידע משפטי
|
footerLinkLegal = מידע משפטי
|
||||||
footerLinkPrivacy = פרטיות
|
footerLinkPrivacy = פרטיות
|
||||||
footerLinkTerms = תנאי שימוש
|
|
||||||
footerLinkCookies = קובצי עוגיות
|
footerLinkCookies = קובצי עוגיות
|
||||||
|
passwordTryAgain = סיסמה שגויה. נא לנסות שוב.
|
||||||
|
javascriptRequired = ל־Firefox Send דרוש JavaScript
|
||||||
|
whyJavascript = למה ל־Firefox 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
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox 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] דקה אחת
|
||||||
|
*[other] { $num } דקות
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] יום אחד
|
||||||
|
[two] יומיים
|
||||||
|
*[other] { $num } ימים
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] שבוע אחד
|
||||||
|
[two] שבועיים
|
||||||
|
*[other] { $num } שבועות
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] קובץ אחד
|
||||||
|
*[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] ניתן להעלות רק קובץ אחד בכל פעם.
|
||||||
|
*[other] ניתן להעלות רק { $count } קבצים בכל פעם.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] רק ארכיון אחד מורשה.
|
||||||
|
*[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] שמירה על קישורים פעילים עד ליום אחד
|
||||||
|
*[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 = ישנן דרכים נוספות להגן על הפרטיות שלכם. הצטרפו אל Firefox.
|
||||||
|
learnMore = מידע נוסף.
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteFeedback = Povratne informacije
|
siteFeedback = Povratne informacije
|
||||||
importingFile = Uvoz…
|
importingFile = Uvoz…
|
||||||
encryptingFile = Kriptiranje…
|
encryptingFile = Šifriranje …
|
||||||
decryptingFile = Dekriptiranje…
|
decryptingFile = Dešifriranje …
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] { $num } preuzimanje
|
[one] { $num } preuzimanje
|
||||||
@@ -22,29 +22,29 @@ unlockButtonLabel = Otključaj
|
|||||||
downloadButtonLabel = Preuzmi
|
downloadButtonLabel = Preuzmi
|
||||||
downloadFinish = Preuzimanje je završeno.
|
downloadFinish = Preuzimanje je završeno.
|
||||||
fileSizeProgress = ({ $partialSize } od { $totalSize })
|
fileSizeProgress = ({ $partialSize } od { $totalSize })
|
||||||
sendYourFilesLink = Isprobajte Firefox Send
|
sendYourFilesLink = Isprobaj Firefox Send
|
||||||
errorPageHeader = Nešto je pošlo naopako!
|
errorPageHeader = Dogodila se neka greška!
|
||||||
fileTooBig = Datoteka je prevelika za prijenos. Treba biti manja od { $size }.
|
fileTooBig = Datoteka je prevelika za prijenos. Mora biti manja od { $size }.
|
||||||
linkExpiredAlt = Poveznica je istekla
|
linkExpiredAlt = Poveznica je istekla
|
||||||
notSupportedHeader = Vaš preglednik nije podržan.
|
notSupportedHeader = Tvoj preglednik nije podržan.
|
||||||
notSupportedLink = Zašto moj preglednik nije podržan?
|
notSupportedLink = Zašto moj preglednik nije podržan?
|
||||||
notSupportedOutdatedDetail = Nažalost, ovo izdanje Firefoxa ne podržava web tehnologiju koja omogućava Firefox Send. Morat ćete ažurirati vaš preglednik.
|
notSupportedOutdatedDetail = Nažalost, ovo izdanje Firefoxa ne podržava web tehnologiju koja omogućava Firefox Send. Morat ćeš ažurirati preglednik.
|
||||||
updateFirefox = Ažuriraj Firefox
|
updateFirefox = Ažuriraj Firefox
|
||||||
deletePopupCancel = Otkaži
|
deletePopupCancel = Odustani
|
||||||
deleteButtonHover = Obriši
|
deleteButtonHover = Obriši
|
||||||
footerLinkLegal = Pravni podaci
|
footerLinkLegal = Pravni podaci
|
||||||
footerLinkPrivacy = Privatnost
|
footerLinkPrivacy = Privatnost
|
||||||
footerLinkCookies = Kolačići
|
footerLinkCookies = Kolačići
|
||||||
passwordTryAgain = Netočna lozinka. Pokušaj ponovo.
|
passwordTryAgain = Netočna lozinka. Pokušaj ponovo.
|
||||||
javascriptRequired = Za Firefox Send je potreban JavaScript
|
javascriptRequired = Za Firefox Send potreban je JavaScript
|
||||||
whyJavascript = Zašto je za Firefox Send potreban JavaScript?
|
whyJavascript = Zašto je za Firefox Send potreban JavaScript?
|
||||||
enableJavascript = Omogućite JavaScript i pokušajte ponovo.
|
enableJavascript = Aktiviraj JavaScript i pokušaj 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 }s { $minutes }m
|
expiresHoursMinutes = { $hours }s { $minutes }m
|
||||||
# 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 }m
|
expiresMinutes = { $minutes }min
|
||||||
# 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 = Najveća dužina lozinke: { $length }
|
maxPasswordLength = Maksimalna duljina lozinke: { $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 = Lozinku nije moguće postaviti
|
passwordSetError = Lozinku nije moguće postaviti
|
||||||
|
|
||||||
@@ -56,10 +56,10 @@ passwordSetError = Lozinku nije moguće postaviti
|
|||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Jednostavno i privatno dijeljenje datoteka
|
introTitle = Jednostavno i privatno dijeljenje datoteka
|
||||||
introDescription = { -send-brand } vam omogućava dijeljenje datoteka s kriptiranjem i poveznicu koja automatski ističe. Ovim putem stvari koje dijelite ostaju privatne i osiguravate se da ne ostaju zauvijek dostupne na Internetu.
|
introDescription = { -send-brand } omogućava dijeljenje datoteka sa šifriranjem i poveznicom koja će automatski isteći. Ovim putem, stvari koje dijeliš ostaju privatne i osiguravaš se da ne ostaju zauvijek dostupne na internetu.
|
||||||
notifyUploadEncryptDone = Vaša datoteka je kriptirana i spremna za slanje.
|
notifyUploadEncryptDone = Tvoja je datoteka šifrirana i spremna za slanje.
|
||||||
# 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 = Istječe nakon { $downloadCount } ili { $timespan }
|
archiveExpiryInfo = Isteći će nakon { $downloadCount } ili { $timespan }
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] { $num } minuta
|
[one] { $num } minuta
|
||||||
@@ -97,11 +97,11 @@ fileSize = { $num }{ $units }
|
|||||||
# $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")
|
||||||
totalSize = Ukupna veličina: { $size }
|
totalSize = Ukupna veličina: { $size }
|
||||||
# the next line after the colon contains a file name
|
# the next line after the colon contains a file name
|
||||||
copyLinkDescription = Kopirajte poveznicu da biste podijelili svoju datoteku:
|
copyLinkDescription = Kopiraj poveznicu za dijeljenje svoje datoteke:
|
||||||
copyLinkButton = Kopiraj poveznicu
|
copyLinkButton = Kopiraj poveznicu
|
||||||
downloadTitle = Preuzmite datoteke
|
downloadTitle = Preuzmi datoteke
|
||||||
downloadDescription = Ova datoteka je podjeljena putem { -send-brand } s kriptiranjem i poveznicom koja automatski istječe.
|
downloadDescription = Ova se datoteka dijelila putem usluge { -send-brand } sa šifriranjem i poveznicom koja će automatski isteći.
|
||||||
trySendDescription = Probajte { -send-brand } za jednostavno i sigurno dijeljenje datoteka.
|
trySendDescription = Probaj { -send-brand } za jednostavno i sigurno dijeljenje datoteka.
|
||||||
# count will always be > 10
|
# count will always be > 10
|
||||||
tooManyFiles =
|
tooManyFiles =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
@@ -117,46 +117,48 @@ tooManyArchives =
|
|||||||
*[other] Dozvoljeno je samo { $count } arhiva.
|
*[other] Dozvoljeno je samo { $count } arhiva.
|
||||||
}
|
}
|
||||||
expiredTitle = Poveznica je istekla.
|
expiredTitle = Poveznica je istekla.
|
||||||
notSupportedDescription = { -send-brand } neće raditi s ovim preglednikom. { -send-short-brand } radi najbolje s zadnjom { -firefox } inačicom i radit će s trenutnom inačicom većine preglednika.
|
notSupportedDescription = { -send-brand } neće raditi s ovim preglednikom. { -send-short-brand } najbolje radi sa zadnjom { -firefox } verzijom i radit će s aktualnim verzijama većine preglednika.
|
||||||
downloadFirefox = Preuzmite { -firefox }
|
downloadFirefox = Preuzmi { -firefox }
|
||||||
legalTitle = { -send-short-brand } politika privatnosti
|
legalTitle = { -send-short-brand } politika privatnosti
|
||||||
legalDateStamp = Inačica 1.0, od 12. ožujka 2019. godine
|
legalDateStamp = Verzija 1.0, od 12. ožujka 2019. godine
|
||||||
# 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 }s { $minutes }m
|
expiresDaysHoursMinutes = { $days }d { $hours }s { $minutes }m
|
||||||
addFilesButton = Odaberite datoteke za prijenos
|
addFilesButton = Odaberi datoteke za prijenos
|
||||||
uploadButton = Prijenos
|
uploadButton = Prijenos
|
||||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
dragAndDropFiles = Povucite i ispustite datoteke
|
dragAndDropFiles = Povuci i ispusti datoteke
|
||||||
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
# 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")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
orClickWithSize = ili kliknite za slanje do { $size }
|
orClickWithSize = ili pritisni gumb, za slanje do { $size }
|
||||||
addPassword = Zaštitite lozinkom
|
addPassword = Zaštiti s lozinkom
|
||||||
emailPlaceholder = Unesite svoju adresu e-pošte
|
emailPlaceholder = Upiši svoju e-adresu
|
||||||
# $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 = Prijavite se za slanje do { $size }
|
signInSizeBump = Prijavi se, za slanje do { $size }
|
||||||
signInOnlyButton = Prijavi se
|
signInOnlyButton = Prijavi se
|
||||||
accountBenefitTitle = Stvorite { -firefox } račun ili se prijavite
|
accountBenefitTitle = Otvori { -firefox } račun ili se prijavi
|
||||||
# $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 = Dijelite datoteke do { $size }
|
accountBenefitLargeFiles = Dijeli datoteke do { $size }
|
||||||
accountBenefitDownloadCount = Dijelite datoteke s više osoba
|
accountBenefitDownloadCount = Dijeli datoteke s više osoba
|
||||||
accountBenefitTimeLimit =
|
accountBenefitTimeLimit =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
[one] Neka poveznice budu aktivne { $count } dan
|
[one] Ostavi poveznice aktivnima { $count } dan
|
||||||
[few] Neka poveznice budu aktivne { $count } dana
|
[few] Ostavi poveznice aktivnima { $count } dana
|
||||||
*[other] Neka poveznice budu aktivne { $count } dana
|
*[other] Ostavi poveznice aktivnima { $count } dana
|
||||||
}
|
}
|
||||||
accountBenefitSync = Upravljanje dijeljenim datotekama s bilo kojeg uređaja
|
accountBenefitSync = Upravljaj dijeljenim datotekama s bilo kojeg uređaja
|
||||||
accountBenefitMoz = Saznajte više o drugim { -mozilla } uslugama
|
accountBenefitMoz = Saznaj više o drugim { -mozilla } uslugama
|
||||||
signOut = Odjavi se
|
signOut = Odjavi se
|
||||||
okButton = U redu
|
okButton = U redu
|
||||||
downloadingTitle = Preuzimanje
|
downloadingTitle = Preuzimanje
|
||||||
noStreamsWarning = Ovaj preglednik možda neće moći dekriptirati datoteku ove veličine.
|
noStreamsWarning = Ovaj preglednik možda neće moći dešifrirati datoteku ove veličine.
|
||||||
noStreamsOptionCopy = Kopirajte poveznicu kako biste je otvorili u drugom pregledniku
|
noStreamsOptionCopy = Za otvaranje u drugom pregledniku, kopiraj poveznicu
|
||||||
noStreamsOptionFirefox = Isprobajte naš omiljeni preglednik
|
noStreamsOptionFirefox = Isprobaj naš omiljeni preglednik
|
||||||
noStreamsOptionDownload = Nastavite s ovim preglednikom
|
noStreamsOptionDownload = Nastavi s ovim preglednikom
|
||||||
downloadFirefoxPromo = Potpuno novi { -firefox } vam donosi { -send-short-brand }.
|
downloadFirefoxPromo = Potpuno novi { -firefox } donosi { -send-short-brand }.
|
||||||
# the next line after the colon contains a file name
|
# the next line after the colon contains a file name
|
||||||
shareLinkDescription = Dijelite poveznicu na svoju datoteku:
|
shareLinkDescription = Dijeli poveznicu na tvoju datoteku:
|
||||||
shareLinkButton = Dijeli poveznicu
|
shareLinkButton = Dijeli poveznicu
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Preuzmite “{ $name }” sa { -send-brand }: jednostavno i sigurno dijeljenje datoteka
|
shareMessage = Preuzmi „{ $name }” pomoću { -send-brand }: jednostavno i sigurno dijeljenje datoteka
|
||||||
|
trailheadPromo = Postoji način, kako zaštititi vlastitu privatnost. Pridruži se Firefoxu.
|
||||||
|
learnMore = Saznaj više.
|
||||||
|
|||||||
152
public/locales/hus/send.ftl
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = Ka olna' max jant'oj yab u t'ojnal alwa'
|
||||||
|
importingFile = k'wajat i chiyál...
|
||||||
|
encryptingFile = K'wajat i tsinat dheyál...
|
||||||
|
decryptingFile = K'wajat i exal ki wila'...
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
*[other] 1 pa'badh { $num } pa'badh
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
*[other] 1 hora { $num } hora
|
||||||
|
}
|
||||||
|
copiedUrl = Letsbadh...
|
||||||
|
unlockInputPlaceholder = Tsinat japixtal
|
||||||
|
unlockButtonLabel = Ka japiy
|
||||||
|
downloadButtonLabel = Ka pa'ba'
|
||||||
|
downloadFinish = Tala' pa'iyits
|
||||||
|
fileSizeProgress = { $partialSize } xi ti { $totalSize }
|
||||||
|
sendYourFilesLink = Ka eyendha' Firefox Send
|
||||||
|
errorPageHeader = ¡Yab kalej alwa'!
|
||||||
|
fileTooBig = Tekedh pulik axi a le' ka kadh'ba', kwa'al kin alemna' { $size }
|
||||||
|
linkExpiredAlt = Yabats u awil ki ela'
|
||||||
|
notSupportedHeader = Yab u awil ka japiyat k'al axi NAVEGADOR
|
||||||
|
notSupportedLink = ¿Jale' ti u NAVEGADOR yab in japiyal?
|
||||||
|
notSupportedOutdatedDetail = Yab u awil ka eyendha' Firefox Send kom an NAVEGADOR Firefox biyalits. Ka Pa'ba' axi it.
|
||||||
|
updateFirefox = Ka itmedha' Firefox
|
||||||
|
deletePopupCancel = Ka kuba'
|
||||||
|
deleteButtonHover = Ka pakuw
|
||||||
|
footerLinkLegal = Axi walkadh ka t'ajan
|
||||||
|
footerLinkPrivacy = Tsinataláb
|
||||||
|
footerLinkCookies = Cookies
|
||||||
|
passwordTryAgain = Yab ja' an tsinat japixtaláb. Ka exa' junil.
|
||||||
|
javascriptRequired = Firefox Send in yejenchal JavaScript
|
||||||
|
whyJavascript = ¿Jale' Firefox Send in yejenchal JavaScript?
|
||||||
|
enableJavascript = Ka lek'wtsiy JavaScript ani ka exa' junil.
|
||||||
|
# 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 = In puwél an tsinat japixtaláb pel: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = Axi tsinat japixtaláb yab u awil ka eyendha'
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Yab k'ibat, a tsinat t'ojlabil u awil ka buk'uw
|
||||||
|
introDescription = { -send-brand } in t'ajál abal ka buk'uw a t'ojlabil po axé' tsinat abal an atikláb axi tat yab a le' kin tsu'uw yab kin ejtow, aniyej an enlace abal ka pa'ba' an t'ojláb u talél kwetém. Antsan patal axi ka abna' u awil ka buk'uw tsinat ani antsan jayej axi ka buk'uw yab u jilk'onal ets'ey ti ébtsolom (internet).
|
||||||
|
notifyUploadEncryptDone = A t'ojlabil xo' tsinadhits ani u awilits ka abna'
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Ne'ets ka taliy ti { $downloadCount } o ti { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
*[other] 1 minuto { $num }
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
*[other] 1 k'icháj { $num } k'ichajchik
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
*[other] 1 semana { $num } i semanachik
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
*[other] 1 t'ojláb { $num } t'ojlabchik
|
||||||
|
}
|
||||||
|
# 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 = In puwél an t'ojláb: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Ka k'ot'biy an enlace abal ka ejtow ka buk'uw a t'ojlabil:
|
||||||
|
copyLinkButton = ka k'ot'biy an enlace
|
||||||
|
downloadTitle = Ka pa'ba' an t'ojláb
|
||||||
|
downloadDescription = Axi t'ojláb aban k'al in tolmixtal an { -send-brand } ani tsinat, aniyej in tsap an enlace u talél kwetém.
|
||||||
|
trySendDescription = Ka eyendha' { -send-brand } abal ka abna' a t'ojlabil, yab k'ibat ani k'anidh.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
*[other]
|
||||||
|
Expidh u awil ka k'adhba' 1 i t'ojláb
|
||||||
|
Expidh u awil ka k'adhba' { $count } i t'ojláb.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
*[other]
|
||||||
|
Expidh u awil 1 i t'ojláb.
|
||||||
|
Expidh u awil { $count } i t'ojláb.
|
||||||
|
}
|
||||||
|
expiredTitle = An enlace talíts in tsap.
|
||||||
|
notSupportedDescription = { -send-brand } yab u t'ojnal al axi navegador. { -send-short-brand } u t'ojnal alwa' k'al an { -firefox } axi it, ani ne'ets ka t'ojon alwa' k'al an it navegadorchik.
|
||||||
|
downloadFirefox = Ka pa'ba' { -firefox }
|
||||||
|
legalTitle = Tin kwentaj an "Tsinaxtaláb a k'al" { -send-short-brand }
|
||||||
|
legalDateStamp = Versión 1.0 ani t'ajadh ti Marzo 12 ti tamub 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 } k'icháj { $hours } hora { $minutes } minuto
|
||||||
|
addFilesButton = Ka takuy an t'ojláb axi ne'ets ka k'adhba'
|
||||||
|
uploadButton = Ka k'adhba'
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Ka kina' a t'ojlabil ani ka walka' te'
|
||||||
|
# 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 = o ka t'aja' an clic abal ka abna' ma { $size }
|
||||||
|
addPassword = Ka k'aniy k'al jún i tsinat japixtaláb
|
||||||
|
emailPlaceholder = Ka punuw a abnax dhuchlab Correo Electrónico.
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Kit otsits abal ka ejtow ka abna' ma { $size }
|
||||||
|
signInOnlyButton = Kit otsits
|
||||||
|
accountBenefitTitle = Ka ts'ejka' jún a it k'al (cuenta) { -firefox } o kit otsits max a kwa'alits jún.
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Ka buk'uw a t'ojlabil, ma { $size }
|
||||||
|
accountBenefitDownloadCount = Ka buk'uw a t'ojlabil k'al pil i atiklabchik
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
*[other]
|
||||||
|
Ka ko'oy an enlace ma 1 a k'icháj
|
||||||
|
Ka ko'oy an enlacechik ma { $count } a k'icháhchik
|
||||||
|
}
|
||||||
|
accountBenefitSync = Ka ejtow tit t'ojnal k'al t'ojlabil al jawakitsk'ij tum eyendhabnél
|
||||||
|
accountBenefitMoz = Ka exla' jant'oj ti pidhál { -mozilla }
|
||||||
|
signOut = Kit kalej
|
||||||
|
okButton = Ka bats'uw
|
||||||
|
downloadingTitle = K'wajat ti pa'íl
|
||||||
|
noStreamsWarning = Walám axi navegador yab ne'ets kin ejtow kin japiy jún i t'ojláb tekedh pulik.
|
||||||
|
noStreamsOptionCopy = Ka k'ot'biy an enlace abal ka japiy al pil i navegador
|
||||||
|
noStreamsOptionFirefox = Ka eyendha' i navegador
|
||||||
|
noStreamsOptionDownload = yab kit kalej al axi navegador
|
||||||
|
downloadFirefoxPromo = An it { -firefox } ti pidhál { -send-short-brand }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Ka abna' an enlace al an eyendhanél:
|
||||||
|
shareLinkButton = Ka abna' an enlace
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Ka pa'ba' “{ $name }” k'al { -send-brand }: ka abna' a t'ojlabil, yab k'ibat ani k'anidh
|
||||||
|
trailheadPromo = U awil ka k'aniy axi tat a k'al. Kit tamkun k'al Firefox.
|
||||||
|
learnMore = Ka ajiy más.
|
||||||
155
public/locales/hy-AM/send.ftl
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = Արձագանք
|
||||||
|
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 Send-ը
|
||||||
|
errorPageHeader = Ինչ-որ բան այն չէ
|
||||||
|
fileTooBig = Այդ ֆայլը չափազանց մեծ է վերբեռնելու համար: Այն պետք է լինի ավելի քիչ, քան { $size }-ը
|
||||||
|
linkExpiredAlt = Հղումն ավարտված է
|
||||||
|
notSupportedHeader = Ձեր զննարկիչը չի աջակցվում:
|
||||||
|
notSupportedLink = Ինչու իմ զննարկիչը չի աջակցվում:
|
||||||
|
notSupportedOutdatedDetail = Դժբախտաբար, Firefox- ի այս տարբերակը չի աջակցում այն վեբ տեխնոլոգիան, որը պետք է Firefox Send-ի համար: Դուք պետք է թարմացնեք ձեր զննարկիչը:
|
||||||
|
updateFirefox = Թարմացնել Firefox-ը
|
||||||
|
deletePopupCancel = Չեղարկել
|
||||||
|
deleteButtonHover = Ջնջել
|
||||||
|
footerLinkLegal = Իրավական
|
||||||
|
footerLinkPrivacy = Գաղտնիություն
|
||||||
|
footerLinkCookies = Cookie-ներ
|
||||||
|
passwordTryAgain = Սխալ գաղտնաբառ. Կրկին փորձեք:
|
||||||
|
javascriptRequired = Firefox Send-ը պահանջում է JavaScript
|
||||||
|
whyJavascript = Ինչո՞ւ է Firefox 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
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Ուղարկել
|
||||||
|
-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, թվագրված՝ 2019 թ. մարտի 12-ով
|
||||||
|
# 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 = Ձեր գաղտնիությունը պաշտպանելու միջոց կա: Միացեք Firefox- ին:
|
||||||
|
learnMore = Իմանալ ավելին
|
||||||
@@ -6,13 +6,13 @@ encryptingFile = Cryptation...
|
|||||||
decryptingFile = Decryptation…
|
decryptingFile = Decryptation…
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] discargamento
|
[one] { $num } discargamento
|
||||||
*[other] discargamentos
|
*[other] { $num } discargamentos
|
||||||
}
|
}
|
||||||
timespanHours =
|
timespanHours =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] hora
|
[one] { $num } hora
|
||||||
*[other] horas
|
*[other] { $num } horas
|
||||||
}
|
}
|
||||||
copiedUrl = Copiate!
|
copiedUrl = Copiate!
|
||||||
unlockInputPlaceholder = Contrasigno
|
unlockInputPlaceholder = Contrasigno
|
||||||
@@ -22,11 +22,11 @@ downloadFinish = Discargamento completate
|
|||||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||||
sendYourFilesLink = Proba Firefox Send
|
sendYourFilesLink = Proba Firefox Send
|
||||||
errorPageHeader = Un error occurreva!
|
errorPageHeader = Un error occurreva!
|
||||||
fileTooBig = Iste file es troppo grande pro lo cargar. Illo debe ser inferior a { $size }.
|
fileTooBig = Iste file es troppo grande pro incargar. Illo debe esser inferior a { $size }.
|
||||||
linkExpiredAlt = Ligamine expirate
|
linkExpiredAlt = Ligamine expirate
|
||||||
notSupportedHeader = Tu navigator non es supportate
|
notSupportedHeader = Tu navigator non es supportate
|
||||||
notSupportedLink = Perque iste navigator non es supportate?
|
notSupportedLink = Proque non es mi navigator supportate?
|
||||||
notSupportedOutdatedDetail = Infelicemente iste version de Firefox non supporta le nove technologias web que move Firefox Send. Tu besonia de actualisar tu navigator.
|
notSupportedOutdatedDetail = Infelicemente iste version de Firefox non supporta le nove technologia web que actiona Firefox Send. Tu debe actualisar tu navigator.
|
||||||
updateFirefox = Actualisar Firefox
|
updateFirefox = Actualisar Firefox
|
||||||
deletePopupCancel = Cancellar
|
deletePopupCancel = Cancellar
|
||||||
deleteButtonHover = Deler
|
deleteButtonHover = Deler
|
||||||
@@ -44,7 +44,7 @@ expiresMinutes = { $minutes }m
|
|||||||
# 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 = Maxime longor del contrasigno: { $length }
|
maxPasswordLength = Maxime longor del contrasigno: { $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 = Iste contrasigno non pote ser definite
|
passwordSetError = Iste contrasigno non ha potite esser establite
|
||||||
|
|
||||||
## Send version 2 strings
|
## Send version 2 strings
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ passwordSetError = Iste contrasigno non pote ser definite
|
|||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Comparti file in maniera confidential
|
introTitle = Comparti file in maniera confidential
|
||||||
introDescription = { -send-brand } te pone in grado de compartir files con cryptographia bilateral e un ligamine que automaticamente expira. Assi que tu pote mantener private lo que tu comparti e liberar te del anxietate que tu problema resta online per sempre.
|
introDescription = { -send-brand } te pone in grado de compartir files con cryptographia bilateral e un ligamine que automaticamente expira. Assi que tu pote mantener private lo que tu comparti e liberar te del anxietate que tu problema resta online per sempre.
|
||||||
notifyUploadEncryptDone = Tu file es cryptate e preste pro ser inviate.
|
notifyUploadEncryptDone = Tu file es cryptate e preste pro esser inviate
|
||||||
# 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 = Expira post { $downloadCount } o { $timespan }
|
archiveExpiryInfo = Expira post { $downloadCount } o { $timespan }
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
@@ -99,34 +99,34 @@ trySendDescription = Prova { -send-brand } pro le compartimento de file simple e
|
|||||||
# count will always be > 10
|
# count will always be > 10
|
||||||
tooManyFiles =
|
tooManyFiles =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
[one] Solo 1 file al vice pote ser cargate.
|
[one] Solmente 1 file pote ser incargate al vice.
|
||||||
*[other] Solo { $count } files al vice pote ser cargate.
|
*[other] Solmente { $count } files pote esser incargate al vice.
|
||||||
}
|
}
|
||||||
# count will always be > 10
|
# count will always be > 10
|
||||||
tooManyArchives =
|
tooManyArchives =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
[one] Solo 1 archivo es consentite.
|
[one] Solo 1 archivo es permittite.
|
||||||
*[other] Solo { $count } archivos es consentite.
|
*[other] Solo { $count } archivos es permitter.
|
||||||
}
|
}
|
||||||
expiredTitle = Iste ligamine ha expirate.
|
expiredTitle = Iste ligamine ha expirate.
|
||||||
notSupportedDescription = { -send-brand } non functionara con iste navigator. { -send-short-brand } functiona melio con le ultime version de { -firefox }, e functionara con le version actual de plure navigatores.
|
notSupportedDescription = { -send-brand } non functionara con iste navigator. { -send-short-brand } functiona melio con le ultime version de { -firefox }, e functionara con le version actual de plure navigatores.
|
||||||
downloadFirefox = Discargar { -firefox }
|
downloadFirefox = Discargar { -firefox }
|
||||||
legalTitle = Politica de confidentialitate de { -send-short-brand }
|
legalTitle = Aviso de confidentialitate de { -send-short-brand }
|
||||||
legalDateStamp = Version 1.0 del 12 martio 2019
|
legalDateStamp = Version 1.0 del 12 martio 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 = Selige le files a cargar
|
addFilesButton = Selige le files a incargar
|
||||||
uploadButton = Cargar
|
uploadButton = Incargar
|
||||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
dragAndDropFiles = Traher e deponer files
|
dragAndDropFiles = Traher e deponer files
|
||||||
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
# 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")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
orClickWithSize = o cliccar pro inviar usque { $size }
|
orClickWithSize = o cliccar pro inviar usque { $size }
|
||||||
addPassword = Proteger per contrasigno
|
addPassword = Proteger per contrasigno
|
||||||
emailPlaceholder = Insere tu adresse email
|
emailPlaceholder = Insere tu adresse de e-mail
|
||||||
# $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 = Accede pro inviar usque { $size }
|
signInSizeBump = Aperi session pro inviar usque a { $size }
|
||||||
signInOnlyButton = Authentica te
|
signInOnlyButton = Aperir session
|
||||||
accountBenefitTitle = Crea un conto { -firefox } o registra te
|
accountBenefitTitle = Crea un conto { -firefox } o registra te
|
||||||
# $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 files usque { $size }
|
accountBenefitLargeFiles = Comparti files usque { $size }
|
||||||
@@ -136,12 +136,12 @@ accountBenefitTimeLimit =
|
|||||||
[one] Retene active le ligamine pro 1 die
|
[one] Retene active le ligamine pro 1 die
|
||||||
*[other] Retene active le ligamine pro { $count } dies
|
*[other] Retene active le ligamine pro { $count } dies
|
||||||
}
|
}
|
||||||
accountBenefitSync = Gere files compartite ab ulle apparato
|
accountBenefitSync = Gere files compartite ab non importa qual apparato
|
||||||
accountBenefitMoz = Discoperi altere servicios de { -mozilla }
|
accountBenefitMoz = Discoperi altere servicios de { -mozilla }
|
||||||
signOut = Disconnecter
|
signOut = Clauder session
|
||||||
okButton = OK
|
okButton = OK
|
||||||
downloadingTitle = Discargamento
|
downloadingTitle = Discargamento
|
||||||
noStreamsWarning = Iste navigator pote non pote decifrar un file assi grande.
|
noStreamsWarning = Es possibile que iste navigator non pote decryptar un file de iste proportiones.
|
||||||
noStreamsOptionCopy = Copiar le ligamine e aperir lo in un altere navigator
|
noStreamsOptionCopy = Copiar le ligamine e aperir lo in un altere navigator
|
||||||
noStreamsOptionFirefox = Prova nostre navigator favorite
|
noStreamsOptionFirefox = Prova nostre navigator favorite
|
||||||
noStreamsOptionDownload = Continuar con iste navigator
|
noStreamsOptionDownload = Continuar con iste navigator
|
||||||
|
|||||||
@@ -142,3 +142,5 @@ shareLinkDescription = Bagikan tautan ke berkas Anda:
|
|||||||
shareLinkButton = Bagikan tautan
|
shareLinkButton = Bagikan tautan
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Unduh "{ $name }" dengan { -send-brand }: berbagi berkas dengan sederhana dan aman
|
shareMessage = Unduh "{ $name }" dengan { -send-brand }: berbagi berkas dengan sederhana dan aman
|
||||||
|
trailheadPromo = Ada cara untuk melindungi privasi Anda. Bergabunglah dengan Firefox.
|
||||||
|
learnMore = Pelajari lebih lanjut.
|
||||||
|
|||||||
65
public/locales/ig/send.ftl
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Zipu
|
||||||
|
siteFeedback = Nzaghachi
|
||||||
|
importingFile = Mbubata…
|
||||||
|
encryptingFile = ezoro ezo...
|
||||||
|
decryptingFile = Kpebie
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] ụbọchị { $num }
|
||||||
|
*[other] Abuọ
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } otu
|
||||||
|
*[other] { $num } abụọ
|
||||||
|
}
|
||||||
|
copiedUrl = edepụtachaghiri
|
||||||
|
unlockInputPlaceholder = okwuntughe
|
||||||
|
unlockButtonLabel = imeghe
|
||||||
|
downloadButtonLabel = budata
|
||||||
|
downloadFinish = Mbudata zuru ezu
|
||||||
|
fileSizeProgress = ({ $partialSize } nke { $totalSize })
|
||||||
|
sendYourFilesLink = Firefox Zipu
|
||||||
|
errorPageHeader = Onwere ihe na-adighi mma
|
||||||
|
fileTooBig = Failu a ebuka ibulite. Ọ kwẹsịghi ịkalị { $size }
|
||||||
|
linkExpiredAlt = Njiko jedebe
|
||||||
|
notSupportedHeader = Adighi akwado ihe nchogharị gị
|
||||||
|
notSupportedLink = Gịnị kpatara na akwadoghị ihe nchọgharị m?
|
||||||
|
notSupportedOutdatedDetail = Ọ dị nwute na ụdị Firefox a anaghị akwado teknụzụ weebụ na-eji Firefox Zipụ. Ikwesiri imelite ihe nchọgharị gị.
|
||||||
|
updateFirefox = Melite Firefox
|
||||||
|
deletePopupCancel = Kagbuo
|
||||||
|
deleteButtonHover = Hichapụ
|
||||||
|
whyJavascript = Kedu ihe kpatara Firefox Send jiri chọ JavaScript?
|
||||||
|
enableJavascript = Biko họrọ JavaScript ma nwaa ọzọ
|
||||||
|
# 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 = Oke okwuntughe kachasị: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = Enweghị ike ịtọ paswọọdụ a
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Zipu, Ziga
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Mfe, nkekọrịta faịlụ nkeonwe
|
||||||
|
notifyUploadEncryptDone = Failu gi zoro ezo ma di njikere iziga
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Ọ ga-agwu mgbe { $downloadCount } ma ọ bụ { $timespan } gasịrị
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 ụbọchị
|
||||||
|
*[other] ụbọchị { $num }
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 izu
|
||||||
|
*[other] izu { $num }
|
||||||
|
}
|
||||||
|
okButton = O
|
||||||
@@ -57,7 +57,7 @@ introTitle = Condividi file in modo semplice e riservato
|
|||||||
introDescription = { -send-brand } permette di condividere file con crittografia end-to-end attraverso un link che scade automaticamente. In questo modo hai la garanzia che i tuoi contenuti vengano condivisi in modo riservato e non rimangano online per sempre.
|
introDescription = { -send-brand } permette di condividere file con crittografia end-to-end attraverso un link che scade automaticamente. In questo modo hai la garanzia che i tuoi contenuti vengano condivisi in modo riservato e non rimangano online per sempre.
|
||||||
notifyUploadEncryptDone = Il file è crittato e pronto per l’invio
|
notifyUploadEncryptDone = Il file è crittato e pronto per l’invio
|
||||||
# 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 = Scade dopo { $downloadCount } o dopo { $timespan }
|
archiveExpiryInfo = Scade dopo { $downloadCount } o tra { $timespan }
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 minuto
|
[one] 1 minuto
|
||||||
@@ -143,5 +143,5 @@ shareLinkDescription = Condividi il link al tuo file:
|
|||||||
shareLinkButton = Condividi link
|
shareLinkButton = Condividi link
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Scarica “{ $name }” con { -send-brand }: condivisione di file semplice e sicura
|
shareMessage = Scarica “{ $name }” con { -send-brand }: condivisione di file semplice e sicura
|
||||||
trailheadPromo = C’è un modo per proteggere la tua privacy. Entra a far parte di Firefox.
|
trailheadPromo = C’è un modo per proteggere la tua privacy. Entra in Firefox.
|
||||||
learnMore = Ulteriori informazioni.
|
learnMore = Ulteriori informazioni.
|
||||||
|
|||||||
58
public/locales/ixl/send.ftl
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = Aq'a yol sti'
|
||||||
|
importingFile = Eq'otzan
|
||||||
|
encryptingFile = La muj isik'lele
|
||||||
|
decryptingFile = Ni jaj ve't isik'lele'
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] Eq'omal ku'tzan
|
||||||
|
*[other] { $num } Eq'omalaj ku'tzan
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 Ch'ich'
|
||||||
|
*[other] { $num } Nimalaj ch'ich'
|
||||||
|
}
|
||||||
|
copiedUrl = Eesamal ivatz!
|
||||||
|
unlockInputPlaceholder = Kach'ub'al
|
||||||
|
unlockButtonLabel = Eesa ikach'ub'al
|
||||||
|
downloadButtonLabel = Eq'o ku'tzan
|
||||||
|
downloadFinish = Eq'o ku'tzan kaajayil
|
||||||
|
fileSizeProgress = ({ $partialSize }tetz{ $totalSize })
|
||||||
|
sendYourFilesLink = B'anb'e ve't u Firefox Send
|
||||||
|
errorPageHeader = At ma'l kam valexh kat eli!
|
||||||
|
notSupportedHeader = U chukb'al aq'one' ye' ni toleb'e'.
|
||||||
|
notSupportedLink = Kam q'ii uve' ye' kuxh ni toleb' u chukb'al vaq'one'?
|
||||||
|
updateFirefox = Tz'ajsa tatine' Firefox
|
||||||
|
deletePopupCancel = Ya'samal
|
||||||
|
deleteButtonHover = Sojsa
|
||||||
|
footerLinkPrivacy = Tetz kuxhtu'
|
||||||
|
footerLinkCookies = Cookies
|
||||||
|
# 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
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Aq'b'en
|
||||||
|
-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 }
|
||||||
|
# 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
|
||||||
|
emailPlaceholder = Aq'ku' a correo
|
||||||
|
shareLinkButton = La jatxb'en u vaa'
|
||||||
|
learnMore = Ootzi ka'te.
|
||||||
@@ -134,9 +134,13 @@ okButton = OK
|
|||||||
downloadingTitle = ダウンロード中
|
downloadingTitle = ダウンロード中
|
||||||
noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。
|
noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。
|
||||||
noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください
|
noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください
|
||||||
|
noStreamsOptionFirefox = Firefox を試してみる
|
||||||
noStreamsOptionDownload = このブラウザーで続ける
|
noStreamsOptionDownload = このブラウザーで続ける
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } はすべてが新しくなった { -firefox } により提供されています。
|
||||||
# the next line after the colon contains a file name
|
# the next line after the colon contains a file name
|
||||||
shareLinkDescription = ファイルへのリンクを共有しましょう:
|
shareLinkDescription = ファイルへのリンクを共有しましょう:
|
||||||
shareLinkButton = リンクを共有
|
shareLinkButton = リンクを共有
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有
|
shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有
|
||||||
|
trailheadPromo = プライバシーを保護する方法があります。Firefox を試してください。
|
||||||
|
learnMore = 詳細情報
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ downloadFinish = Asider yemmed
|
|||||||
fileSizeProgress = ({ $partialSize } seg { $totalSize })
|
fileSizeProgress = ({ $partialSize } seg { $totalSize })
|
||||||
sendYourFilesLink = Ɛreḍ Firefox Send
|
sendYourFilesLink = Ɛreḍ Firefox Send
|
||||||
errorPageHeader = Yella wayen yeḍran!
|
errorPageHeader = Yella wayen yeḍran!
|
||||||
fileTooBig = Afaylu-agi meqqeṛ aṭas. Yessefk ad yili daw n { $size }.
|
fileTooBig = Afaylu-agi meqqer aṭas. Yessefk ad yili daw n { $size }.
|
||||||
linkExpiredAlt = Aseɣwen yemmut
|
linkExpiredAlt = Aseɣwen yemmut
|
||||||
notSupportedHeader = Iminig-ik ur ittusefrak ara
|
notSupportedHeader = Iminig-ik ur ittusefrak ara
|
||||||
notSupportedLink = Ayγer iminig inu ur yettwasefrek ara?
|
notSupportedLink = Ayγer iminig inu ur yettwasefrek ara?
|
||||||
@@ -54,6 +54,10 @@ passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded
|
|||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Afessas, beṭṭu n ifuyla s wudem uslig
|
introTitle = Afessas, beṭṭu n ifuyla s wudem uslig
|
||||||
|
introDescription = { -send-brand } ad k·kem-yeǧǧ ad tebḍuḍ ifuyla iwgelhanen si ṭṭerf ɣer ṭṭerf akked useɣwen ara yemmten s wudem awurman. Daɣen, ad tizmireḍ ad tḥerzeḍ ayen i tbeṭṭuḍ s wudem uslig daɣen ad tamneḍ imi agbur-ik·im ur yettɣimi ara i lebda.
|
||||||
|
notifyUploadEncryptDone = Afaylu-ik yewgelhen daɣen ihegga i tuzna
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Ad yemmet deffir { $downloadCount } neɣ { $timespan }
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 n tsedat
|
[one] 1 n tsedat
|
||||||
@@ -90,18 +94,62 @@ totalSize = Tuɣzi s umata: { $size }
|
|||||||
copyLinkDescription = Nɣel aseɣwen akken ad tebḍuḍ afaylu-inek
|
copyLinkDescription = Nɣel aseɣwen akken ad tebḍuḍ afaylu-inek
|
||||||
copyLinkButton = Nɣel aseɣwen
|
copyLinkButton = Nɣel aseɣwen
|
||||||
downloadTitle = Sider ifuyla
|
downloadTitle = Sider ifuyla
|
||||||
|
downloadDescription = Afaylu-a yettwabḍa s { -send-brand } s uwgelhen s ṭṭerf ɣer ṭṭerf s useɣwen ara yemmten s wudem awurman.
|
||||||
|
trySendDescription = Ɛreḍ { -send-brand } i beḍḍu afessas n ifuyla s wudem ameɣtu.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Ala 1 n ufaylu i yemzren ad yali i tikkelt.
|
||||||
|
*[other] Ala { $count } n yifuyla i yemzren ad alin i tikkelt.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Ala 1 n teṛcibt i yettwasirgen.
|
||||||
|
*[other] Ala { $count } n teṛcibin i yettwasiregn.
|
||||||
|
}
|
||||||
expiredTitle = Immut useɣwen.
|
expiredTitle = Immut useɣwen.
|
||||||
|
notSupportedDescription = { -send-brand } ur iteddu ara s yiminig-a. { -send-short-brand } iteddu akken iwata s lqem aneggaru n { -firefox }, daɣen iteddu s lqem amiran n tuget n yiminigen.
|
||||||
downloadFirefox = Sider { -firefox }
|
downloadFirefox = Sider { -firefox }
|
||||||
|
legalTitle = Tasertit tabaḍnit n { -send-short-brand }
|
||||||
legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 2019
|
legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 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 } ass { $hours } srg { $minutes } tsd
|
||||||
addFilesButton = Fren ifuyla ad tessaliḍ
|
addFilesButton = Fren ifuyla ad tessaliḍ
|
||||||
uploadButton = Sali
|
uploadButton = Sali
|
||||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
dragAndDropFiles = Ẓuɣer sakin sers ifuyla
|
dragAndDropFiles = Ẓuɣer sakin sers ifuyla
|
||||||
|
# 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 = neɣ sit akken ad tazneḍ arma d { $size }
|
||||||
addPassword = Ḥrez s wawal uffir
|
addPassword = Ḥrez s wawal uffir
|
||||||
emailPlaceholder = Sekcem imayl inek
|
emailPlaceholder = Sekcem imayl inek
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Qqen akken ad tazneḍ arma d { $size }
|
||||||
|
signInOnlyButton = Qqen
|
||||||
|
accountBenefitTitle = Rnu amiḍan { -firefox } akken ad teqqneḍ
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Bḍu ifuyla arma d { $size }
|
||||||
|
accountBenefitDownloadCount = Bḍu ifuyla d wugan n medden
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Eǧǧ iseɣwan d urmiden arma d 1 n wass
|
||||||
|
*[other] Eǧǧ iseɣwan d urmiden arma d { $count } n wassan
|
||||||
|
}
|
||||||
|
accountBenefitSync = Sefrek ifuyla yebdan seg yal ibenk
|
||||||
|
accountBenefitMoz = Issin ugar ɣef yimeẓla-nniḍen n { -mozilla }
|
||||||
signOut = Ffeɣ
|
signOut = Ffeɣ
|
||||||
okButton = IH
|
okButton = IH
|
||||||
downloadingTitle = Azdam
|
downloadingTitle = Azdam
|
||||||
|
noStreamsWarning = Iminig-a ur yezmir ara ad yezmek afaylu meqqren.
|
||||||
|
noStreamsOptionCopy = Nɣel aseɣwen i tulya deg yiminig-nniden
|
||||||
|
noStreamsOptionFirefox = Ɛreḍ iminig-ik ufrin
|
||||||
noStreamsOptionDownload = Kemmel akked iminig-a
|
noStreamsOptionDownload = Kemmel akked iminig-a
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } yettwasumer i yal { -firefox } amaynut.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Bḍu aseɣwen ɣer ufaylu-ik:
|
||||||
shareLinkButton = Bḍu aseɣwen
|
shareLinkButton = Bḍu aseɣwen
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Sider "{ $name }" s { -send-brand }: d fessas, d aɣelsan i beṭṭu n yifuyla.
|
||||||
|
trailheadPromo = Yella wallal n ummesten n tudert-ik tusligt. Ddu ɣer Firefox.
|
||||||
learnMore = Issin ugar.
|
learnMore = Issin ugar.
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ siteFeedback = 사용자 의견
|
|||||||
importingFile = 가져오는 중…
|
importingFile = 가져오는 중…
|
||||||
encryptingFile = 암호화 중…
|
encryptingFile = 암호화 중…
|
||||||
decryptingFile = 복호화 중…
|
decryptingFile = 복호화 중…
|
||||||
downloadCount = { $num } 다운로드
|
downloadCount = 다운로드 { $num }회
|
||||||
timespanHours = 1 시간
|
timespanHours = { $num }시간
|
||||||
copiedUrl = 복사 완료!
|
copiedUrl = 복사 완료!
|
||||||
unlockInputPlaceholder = 비밀번호
|
unlockInputPlaceholder = 비밀번호
|
||||||
unlockButtonLabel = 잠금 해제
|
unlockButtonLabel = 잠금 해제
|
||||||
@@ -26,9 +26,9 @@ footerLinkLegal = 법적 정보
|
|||||||
footerLinkPrivacy = 개인정보 보호
|
footerLinkPrivacy = 개인정보 보호
|
||||||
footerLinkCookies = 쿠키
|
footerLinkCookies = 쿠키
|
||||||
passwordTryAgain = 비밀번호가 맞지 않습니다. 다시 시도해 주세요.
|
passwordTryAgain = 비밀번호가 맞지 않습니다. 다시 시도해 주세요.
|
||||||
javascriptRequired = Firefox Send는 자바스크립트를 필요로 합니다
|
javascriptRequired = Firefox Send는 JavaScript를 필요로 합니다
|
||||||
whyJavascript = 왜 Firefox Send에 자바스크립트가 필요하죠?
|
whyJavascript = 왜 Firefox Send에 JavaScript가 필요하죠?
|
||||||
enableJavascript = 자바스크립트를 활성화하고 다시 시도해 주세요.
|
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 }분
|
||||||
# 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"
|
||||||
@@ -49,7 +49,7 @@ introTitle = 간단하고, 사생활을 보호하는 파일 공유
|
|||||||
introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다.
|
introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다.
|
||||||
notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다
|
notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다
|
||||||
# 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 = { $downloadCount }나 { $timespan } 후 만료됨
|
archiveExpiryInfo = { $downloadCount } 혹은 { $timespan } 후 만료됨
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
*[other] { $num }분
|
*[other] { $num }분
|
||||||
@@ -96,15 +96,15 @@ tooManyArchives =
|
|||||||
}
|
}
|
||||||
expiredTitle = 이 링크는 만료되었습니다.
|
expiredTitle = 이 링크는 만료되었습니다.
|
||||||
notSupportedDescription = { -send-brand }는 이 브라우저와 작동하지 않습니다. { -send-short-brand }는 최신 { -firefox }와 가장 잘 작동하며, 대부분의 최신 웹 브라우저와도 잘 작동합니다.
|
notSupportedDescription = { -send-brand }는 이 브라우저와 작동하지 않습니다. { -send-short-brand }는 최신 { -firefox }와 가장 잘 작동하며, 대부분의 최신 웹 브라우저와도 잘 작동합니다.
|
||||||
downloadFirefox = 다운로드 { -firefox }
|
downloadFirefox = { -firefox } 다운로드
|
||||||
legalTitle = { -send-short-brand } 개인정보 보호 공지
|
legalTitle = { -send-short-brand } 개인정보 보호 공지
|
||||||
legalDateStamp = 버전 1.0, 2019년 3월 12일 출시됨
|
legalDateStamp = 버전 1.0, 2019년 3월 12일자
|
||||||
# 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 }일 { $hours }시간 { $minutes }분
|
expiresDaysHoursMinutes = { $days }일 { $hours }시간 { $minutes }분
|
||||||
addFilesButton = 업로드할 파일을 선택하세요
|
addFilesButton = 업로드할 파일들을 선택하세요
|
||||||
uploadButton = 업로드
|
uploadButton = 업로드
|
||||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
dragAndDropFiles = 파일을 이곳에 드래그 엔 드롭하세요.
|
dragAndDropFiles = 파일들을 여기에 끌어서 놓으세요
|
||||||
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
# 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")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
orClickWithSize = 또는 여기를 클릭하여 { $size }까지의 파일을 공유하세요.
|
orClickWithSize = 또는 여기를 클릭하여 { $size }까지의 파일을 공유하세요.
|
||||||
@@ -112,8 +112,8 @@ addPassword = 비밀번호로 파일 보호
|
|||||||
emailPlaceholder = 이메일 입력
|
emailPlaceholder = 이메일 입력
|
||||||
# $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 = { $size }까지 파일을 보낼 수 있게 로그인
|
signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인
|
||||||
signInButton = 로그인/등록
|
signInOnlyButton = 로그인
|
||||||
accountBenefitTitle = { -firefox } 계정을 하나 만들거나, 로그인
|
accountBenefitTitle = { -firefox } 계정 생성 또는 로그인
|
||||||
# $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 = { $size }까지의 파일 공유
|
accountBenefitLargeFiles = { $size }까지의 파일 공유
|
||||||
accountBenefitDownloadCount = 더 많은 사람들과 함께 파일 공유
|
accountBenefitDownloadCount = 더 많은 사람들과 함께 파일 공유
|
||||||
@@ -122,11 +122,19 @@ accountBenefitTimeLimit =
|
|||||||
*[other] 최대 { $count }일까지 링크 유지
|
*[other] 최대 { $count }일까지 링크 유지
|
||||||
}
|
}
|
||||||
accountBenefitSync = 어떤 기기에서든지 공유된 링크 관리
|
accountBenefitSync = 어떤 기기에서든지 공유된 링크 관리
|
||||||
accountBenefitMoz = 더 많은 { -mozilla } 서비스에 대해 알아보기
|
accountBenefitMoz = 다른 { -mozilla } 서비스에 대해 알아보기
|
||||||
signOut = 로그아웃
|
signOut = 로그아웃
|
||||||
okButton = 확인
|
okButton = 확인
|
||||||
downloadingTitle = 다운로드 중
|
downloadingTitle = 다운로드 중
|
||||||
noStreamsWarning = 이 브라우저는 이렇게 큰 용량의 파일 암호화를 풀 수 없을 수도 있습니다.
|
noStreamsWarning = 이 브라우저는 이렇게 큰 파일은 암호화 해제를 못할 수도 있습니다.
|
||||||
noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사
|
noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사
|
||||||
noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요
|
noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요
|
||||||
noStreamsOptionDownload = 이 브라우저로 계속하기
|
noStreamsOptionDownload = 이 브라우저로 계속하기
|
||||||
|
downloadFirefoxPromo = 완전히 새로운 { -firefox }로 { -send-short-brand }가 제공됩니다.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = 파일 링크 공유:
|
||||||
|
shareLinkButton = 링크 공유
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = { -send-brand }으로 “{ $name }” 파일을 내려받으세요: 쉽고 안전한 파일 공유입니다.
|
||||||
|
trailheadPromo = 개인 정보를 보호하는 방법이 있습니다. Firefox에 가입하세요.
|
||||||
|
learnMore = 더 알아보기.
|
||||||
|
|||||||
@@ -168,3 +168,5 @@ shareLinkDescription = Pasidalinkite saitu į jūsų failą:
|
|||||||
shareLinkButton = Dalintis saitu
|
shareLinkButton = Dalintis saitu
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = Atsisiųskite „{ $name }“ su „{ -send-brand }“: paprastas, saugus dalinimasis failais
|
shareMessage = Atsisiųskite „{ $name }“ su „{ -send-brand }“: paprastas, saugus dalinimasis failais
|
||||||
|
trailheadPromo = Yra būdas apsaugoti jūsų privatumą. Naudokite „Firefox“.
|
||||||
|
learnMore = Sužinoti daugiau.
|
||||||
|
|||||||