Compare commits
275 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
b1f1b9bd19 | ||
|
|
2963b2fc05 | ||
|
|
e4f9cfa023 | ||
|
|
09e961219d | ||
|
|
b36a5f6973 | ||
|
|
1a36dc084e | ||
|
|
c66347b3da | ||
|
|
a7d0551509 | ||
|
|
f6f6324aa1 | ||
|
|
a24597695b | ||
|
|
706ac638da | ||
|
|
d66d08f0ed | ||
|
|
ab9af7fd9b | ||
|
|
466a087689 | ||
|
|
71956739f8 | ||
|
|
62689b9556 | ||
|
|
7d1b8e002f | ||
|
|
8c535ce50d | ||
|
|
a3bdcd8478 | ||
|
|
1e77d86e8a | ||
|
|
1af01b1ee3 | ||
|
|
eb1bcde37f | ||
|
|
8def910d61 | ||
|
|
5892532d03 | ||
|
|
8ede5cf05c | ||
|
|
7213fef7c3 | ||
|
|
d3e9bb09df | ||
|
|
2682aec90d | ||
|
|
0ea89a58b0 | ||
|
|
2a2a3ad21f | ||
|
|
36c73bae7b |
@@ -1,36 +1,13 @@
|
||||
version: 2.0
|
||||
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:
|
||||
docker:
|
||||
- image: circleci/node:10-browsers
|
||||
steps:
|
||||
- checkout
|
||||
- restore_cache:
|
||||
key: send-test-{{ checksum "package-lock.json" }}
|
||||
- run: npm install
|
||||
- save_cache:
|
||||
key: send-test-{{ checksum "package-lock.json" }}
|
||||
paths:
|
||||
- node_modules
|
||||
- run: npm ci
|
||||
- run: npm run lint
|
||||
- run: npm run test
|
||||
- run: npm test
|
||||
- store_artifacts:
|
||||
path: coverage
|
||||
integration_tests:
|
||||
@@ -38,40 +15,34 @@ jobs:
|
||||
- image: circleci/node:10-browsers
|
||||
steps:
|
||||
- checkout
|
||||
- restore_cache:
|
||||
key: send-int-{{ checksum "package-lock.json" }}
|
||||
- run: npm install
|
||||
- save_cache:
|
||||
key: send-int-{{ checksum "package-lock.json" }}
|
||||
paths:
|
||||
- node_modules
|
||||
- run:
|
||||
- run: npm ci
|
||||
- run:
|
||||
name: Run integration test
|
||||
command: ./scripts/bin/run-integration-test-circleci.sh
|
||||
deploy_dev:
|
||||
machine: true
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- setup_remote_docker
|
||||
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
||||
- run: docker build -t mozilla/send:latest .
|
||||
- run: docker push mozilla/send:latest
|
||||
deploy_vnext:
|
||||
machine: true
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- setup_remote_docker
|
||||
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
||||
- run: docker build -t mozilla/send:vnext .
|
||||
- run: docker push mozilla/send:vnext
|
||||
deploy_stage:
|
||||
machine: true
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- setup_remote_docker
|
||||
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
||||
- run: docker build -t mozilla/send:$CIRCLE_TAG .
|
||||
- run: docker push mozilla/send:$CIRCLE_TAG
|
||||
@@ -79,12 +50,6 @@ workflows:
|
||||
version: 2
|
||||
test_pr:
|
||||
jobs:
|
||||
- build:
|
||||
filters:
|
||||
branches:
|
||||
ignore:
|
||||
- master
|
||||
- vnext
|
||||
- test:
|
||||
filters:
|
||||
branches:
|
||||
@@ -97,25 +62,13 @@ workflows:
|
||||
ignore: master
|
||||
build_and_deploy_dev:
|
||||
jobs:
|
||||
- build:
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- vnext
|
||||
tags:
|
||||
ignore: /^v.*/
|
||||
- deploy_dev:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
branches:
|
||||
only: master
|
||||
tags:
|
||||
ignore: /^v.*/
|
||||
- deploy_vnext:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
branches:
|
||||
only: vnext
|
||||
@@ -123,12 +76,6 @@ workflows:
|
||||
ignore: /^v.*/
|
||||
build_and_deploy_stage:
|
||||
jobs:
|
||||
- build:
|
||||
filters:
|
||||
branches:
|
||||
ignore: /.*/
|
||||
tags:
|
||||
only: /^v.*/
|
||||
- test:
|
||||
filters:
|
||||
branches:
|
||||
@@ -143,7 +90,6 @@ workflows:
|
||||
only: /^v.*/
|
||||
- deploy_stage:
|
||||
requires:
|
||||
- build
|
||||
- test
|
||||
- integration_tests
|
||||
filters:
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
node_modules
|
||||
.git
|
||||
.tox
|
||||
.DS_Store
|
||||
firefox
|
||||
assets
|
||||
docs
|
||||
test
|
||||
coverage
|
||||
.circleci
|
||||
.nyc_output
|
||||
.vscode
|
||||
.DS_Store
|
||||
coverage
|
||||
docs
|
||||
firefox
|
||||
node_modules
|
||||
@@ -2,5 +2,6 @@ dist
|
||||
assets
|
||||
firefox
|
||||
coverage
|
||||
android/app/build
|
||||
app/locale.js
|
||||
app/capabilities.js
|
||||
@@ -4,6 +4,7 @@ env:
|
||||
|
||||
extends:
|
||||
- eslint:recommended
|
||||
- prettier
|
||||
- plugin:node/recommended
|
||||
- plugin:security/recommended
|
||||
|
||||
@@ -18,17 +19,10 @@ rules:
|
||||
node/no-unsupported-features/es-syntax: off
|
||||
node/no-unsupported-features/node-builtins: off
|
||||
node/no-unpublished-require: off
|
||||
node/no-unpublished-import: off
|
||||
|
||||
security/detect-non-literal-fs-filename: 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-var: error
|
||||
one-var: [error, never]
|
||||
prefer-const: error
|
||||
quotes: [error, single, {avoidEscape: true}]
|
||||
require-atomic-updates: warn
|
||||
|
||||
53
CONTRIBUTORS
@@ -1,18 +1,22 @@
|
||||
Abdalrahman Hwoij
|
||||
Abhinav Adduri
|
||||
Adnan Kičin
|
||||
Adolfo Jayme Barrientos
|
||||
Alberto Castro
|
||||
Alexander Slovesnik
|
||||
Alfredos-Panagiotis Damkalis
|
||||
Aman Alam
|
||||
Amin Mahmudian
|
||||
Ander Elortondo
|
||||
Andreas Pettersson
|
||||
Anesu Chiodza
|
||||
Anika Dorn
|
||||
Anish Sheela
|
||||
Arash Mousavi
|
||||
Artem Polivanchuk
|
||||
Ashikur Rahman
|
||||
Ashok kumar
|
||||
Balasankar C
|
||||
Balázs Meskó
|
||||
Belayet Hossain
|
||||
Benjamin Forehand Jr
|
||||
@@ -20,8 +24,11 @@ Besnik Bleta
|
||||
Björn I
|
||||
Bjørn I
|
||||
Boopesh Mahendran
|
||||
Brahim Essaidi
|
||||
Brainlulz
|
||||
Breana Gonzales
|
||||
Christian Elbrianno
|
||||
Christoph Kührer
|
||||
Christopher Ramírez
|
||||
Chuck Harmston
|
||||
Cloney 173741
|
||||
@@ -31,6 +38,7 @@ Cynthia Pereira
|
||||
Daniel Thorn
|
||||
Daniela Arcese
|
||||
Danny Coates
|
||||
Davide
|
||||
Derek Tamsen
|
||||
Dhyey Thakore
|
||||
Donovan Preston
|
||||
@@ -52,11 +60,17 @@ Frederick Villaluna
|
||||
G12r
|
||||
Gabriela
|
||||
Gautam krishna.R
|
||||
George Raptis
|
||||
Georgianizator
|
||||
Gonçalo Matos
|
||||
Gwenn
|
||||
Hampus
|
||||
Hugo
|
||||
Hugo Abreu
|
||||
Hyeonseok Shin
|
||||
Håvar Henriksen
|
||||
Ian Neal
|
||||
ItielMaN
|
||||
Jae Hyeon Park
|
||||
Jakob Kappel
|
||||
Jakub Rychlý
|
||||
@@ -65,6 +79,8 @@ Jarmo
|
||||
Jim Spentzos
|
||||
Jiri Grönroos
|
||||
Jobava
|
||||
Joe Becher
|
||||
Joe ST
|
||||
Joergen
|
||||
Johann-S
|
||||
John Gruen
|
||||
@@ -79,12 +95,16 @@ Juraj Cigáň
|
||||
Kerim Kalamujić
|
||||
Khaled Hosny
|
||||
Kim Ludvigsen
|
||||
Kim Younggeon
|
||||
Kohei Yoshino
|
||||
Lan Glad
|
||||
Lasse Liehu
|
||||
Laurent Jouanneau
|
||||
Lobodzets
|
||||
LuFlo
|
||||
Luis A. Sánchez
|
||||
Luiz Carlos de Morais
|
||||
Luiz Felipe F M Costa
|
||||
Luna Jernberg
|
||||
Mahay Alam Khan
|
||||
Marcelo Ghelman
|
||||
@@ -94,6 +114,7 @@ Mark Heijl
|
||||
Mark Liang
|
||||
Mark Liang (You-Wen)
|
||||
Marko Andrejić
|
||||
Martijn Dekker
|
||||
Marwan Mohamad
|
||||
Matjaž Horvat
|
||||
Maykon Chagas
|
||||
@@ -106,29 +127,38 @@ Michal Vašíček
|
||||
Mikeyy
|
||||
Miro Rauhala
|
||||
Mozilla Pontoon
|
||||
Mozilla-GitHub-Standards
|
||||
Mozinet
|
||||
Moḥend Belqasem
|
||||
Muhend Belkacem
|
||||
Muḥend Belqasem
|
||||
Myungjae Won
|
||||
Nicholas Skinsacos
|
||||
Nihad
|
||||
Nihad Suljić
|
||||
Niksend Mizuhara
|
||||
Oscar
|
||||
Paulius
|
||||
Pedro Burlamaqui Bendahan
|
||||
Peter deHaan
|
||||
Pierre Neter
|
||||
Pin-guang Chen
|
||||
Piotr Drąg
|
||||
Quentí
|
||||
Quế Tùng
|
||||
Rachel Tublitz
|
||||
Radu Popescu
|
||||
Rhoslyn Prys
|
||||
RickieES
|
||||
Rimas Kudelis
|
||||
Rizky Ariestiyansyah
|
||||
Rob Powell
|
||||
Robert
|
||||
Roberto Alvarado
|
||||
Rodrigo
|
||||
Rodrigo Guerra
|
||||
Rok Žerdin
|
||||
Romi Hardiyanto
|
||||
Rongjian Zhang
|
||||
Ruba
|
||||
Sahithi
|
||||
@@ -139,9 +169,13 @@ Sara Todaro
|
||||
Sav22999
|
||||
Schieck :)
|
||||
Selim Şumlu
|
||||
Selyan Sliman Amiri
|
||||
Sidak Singh Aulakh
|
||||
Slimane Amiri
|
||||
Slimane Selyan AMIRI
|
||||
Soumya Himanish Mohapatra
|
||||
Staś Małolepszy
|
||||
Suriyaa ✌️️
|
||||
Tema
|
||||
Thomas Dalichow
|
||||
Théo Chevalier
|
||||
@@ -150,6 +184,7 @@ Tim Visée
|
||||
Tomer Cohen
|
||||
Tomáš Zelina
|
||||
Ton
|
||||
Top
|
||||
Tymur Faradzhev
|
||||
Uccen Marzuq
|
||||
Varghese Thomas
|
||||
@@ -157,8 +192,10 @@ Victor Bychek
|
||||
Vimal Raghubir
|
||||
Vitaliy Krutko
|
||||
Weihang Lo
|
||||
Wiktor Furman
|
||||
Wil Clouser
|
||||
YFdyh000
|
||||
Yassine Aït-El-Mouden
|
||||
Yongmin H
|
||||
You-Wen Liang (Mark)
|
||||
aaaaalbert
|
||||
@@ -169,6 +206,7 @@ alex_mayorga
|
||||
ariestiyansyah
|
||||
avelper
|
||||
chilledfrogs
|
||||
clouserw-mozilla-owner
|
||||
dgadelha
|
||||
dskmori
|
||||
ehuggett
|
||||
@@ -180,25 +218,37 @@ gmontagu
|
||||
goofy
|
||||
hello
|
||||
hi
|
||||
ivan.pompa
|
||||
jesferman1993
|
||||
jlG
|
||||
josotrix
|
||||
jspam
|
||||
julen
|
||||
julenx
|
||||
kenrick95
|
||||
kumincir
|
||||
leo.toneff
|
||||
m4hdi.pdroid
|
||||
mail
|
||||
manxmensch
|
||||
marigalicer
|
||||
marsf
|
||||
merianosnikos
|
||||
mirzet.omerovic.1992
|
||||
mujeebcpy
|
||||
p.sanroman.bengoetxea
|
||||
passionforlife
|
||||
paul.trevor
|
||||
pyup.io bot
|
||||
ravmn
|
||||
rcmainak
|
||||
reza.habibi2008
|
||||
rgpublic
|
||||
risger
|
||||
robbp
|
||||
ruikunai
|
||||
savemore99.sm
|
||||
sergio
|
||||
shikhar-scs
|
||||
siparon
|
||||
skystar-p
|
||||
@@ -210,10 +260,13 @@ victor.gonzalezro
|
||||
xcffl
|
||||
ybouhamam
|
||||
yoshimitsu002
|
||||
yusup.ramdani
|
||||
Μιχάλης
|
||||
Марко Костић (Marko Kostić)
|
||||
Ратко Вујановић
|
||||
صفا الفليج
|
||||
వీవెన్
|
||||
ജോയ്സ്
|
||||
张无忌
|
||||
新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美
|
||||
莫非前世那一眼
|
||||
|
||||
63
Dockerfile
@@ -1,17 +1,60 @@
|
||||
FROM node:10 AS builder
|
||||
RUN addgroup --gid 10001 app && adduser --disabled-password --gecos '' --gid 10001 --home /app --uid 10001 app
|
||||
COPY package*.json /app/
|
||||
WORKDIR /app
|
||||
RUN npm install --production
|
||||
##
|
||||
# Firefox Send - Mozilla
|
||||
#
|
||||
# License https://github.com/mozilla/send/blob/master/LICENSE
|
||||
##
|
||||
|
||||
FROM node:10-slim
|
||||
RUN addgroup --gid 10001 app && adduser --disabled-password --gecos '' --gid 10001 --home /app --uid 10001 app
|
||||
|
||||
# Build project
|
||||
FROM node:10 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
|
||||
WORKDIR /app
|
||||
COPY --chown=app:app --from=builder /app .
|
||||
COPY --chown=app:app . .
|
||||
RUN set -x \
|
||||
# Build
|
||||
&& npm ci \
|
||||
&& npm run build
|
||||
|
||||
|
||||
# Main image
|
||||
FROM node:10-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
|
||||
|
||||
ENV PORT=1443
|
||||
EXPOSE $PORT
|
||||
|
||||
EXPOSE ${PORT}
|
||||
|
||||
CMD ["node", "server/bin/prod.js"]
|
||||
|
||||
11
README.md
@@ -1,4 +1,4 @@
|
||||
# [](https://send.firefox.com/)
|
||||
# [](https://send.firefox.com/) Firefox Send
|
||||
|
||||
[](https://circleci.com/gh/mozilla/send)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
* [Localization](#localization)
|
||||
* [Contributing](#contributing)
|
||||
* [Testing](#testing)
|
||||
* [Deployment](#deployment)
|
||||
* [Android](#android)
|
||||
* [License](#license)
|
||||
|
||||
@@ -29,7 +30,7 @@ A file sharing experiment which allows you to send encrypted files to other user
|
||||
|
||||
## Requirements
|
||||
|
||||
- [Node.js 10.0+](https://nodejs.org/)
|
||||
- [Node.js 10.x](https://nodejs.org/)
|
||||
- [Redis server](https://redis.io/) (optional for development)
|
||||
- [AWS S3](https://aws.amazon.com/s3/) or compatible service. (optional)
|
||||
|
||||
@@ -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
|
||||
|
||||
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 'fluent-intl-polyfill';
|
||||
import 'intl-pluralrules';
|
||||
import choo from 'choo';
|
||||
import html from 'choo/html';
|
||||
import Raven from 'raven-js';
|
||||
import * as Sentry from '@sentry/browser';
|
||||
|
||||
import { setApiUrlPrefix, getConstants } from '../app/api';
|
||||
import metrics from '../app/metrics';
|
||||
@@ -53,7 +52,7 @@ function body(main) {
|
||||
|
||||
const menu = html`<a
|
||||
id="hamburger"
|
||||
class="absolute pin-t pin-r z-50"
|
||||
class="absolute top-0 right-0 z-50"
|
||||
href="#"
|
||||
onclick="${clickPreferences}"
|
||||
>
|
||||
@@ -61,9 +60,7 @@ function body(main) {
|
||||
</a>`;
|
||||
*/
|
||||
return html`
|
||||
<body
|
||||
class="flex flex-col items-center font-sans bg-grey-lightest h-screen"
|
||||
>
|
||||
<body class="flex flex-col items-center font-sans bg-grey-10 h-screen">
|
||||
${state.cache(Header, 'header').render()} ${main(state, emit)}
|
||||
</body>
|
||||
`;
|
||||
@@ -83,7 +80,7 @@ function body(main) {
|
||||
state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS);
|
||||
state.storage = storage;
|
||||
state.user = new User(storage, LIMITS);
|
||||
state.raven = Raven;
|
||||
state.sentry = Sentry;
|
||||
});
|
||||
app.use(metrics);
|
||||
app.route('/', body(home));
|
||||
|
||||
@@ -25,7 +25,7 @@ module.exports = function(state, emit) {
|
||||
let content = '';
|
||||
let button = html`
|
||||
<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"
|
||||
onclick="${onclick}"
|
||||
>
|
||||
@@ -42,11 +42,7 @@ module.exports = function(state, emit) {
|
||||
content =
|
||||
archives.length < 1
|
||||
? intro(state)
|
||||
: list(
|
||||
archives,
|
||||
'list-reset h-full overflow-y-auto w-full',
|
||||
'mb-3 w-full'
|
||||
);
|
||||
: list(archives, 'h-full overflow-y-auto w-full', 'mb-3 w-full');
|
||||
}
|
||||
|
||||
return html`
|
||||
@@ -57,7 +53,7 @@ module.exports = function(state, emit) {
|
||||
>
|
||||
${content}
|
||||
</section>
|
||||
<div class="fixed pin-r pin-b z-20">
|
||||
<div class="fixed right-0 bottom-0 z-20">
|
||||
${button}
|
||||
<input
|
||||
id="file-upload"
|
||||
|
||||
@@ -12,7 +12,7 @@ export default function initialState(state, emitter) {
|
||||
getAsset(name) {
|
||||
return `${state.prefix}/${name}`;
|
||||
},
|
||||
raven: {
|
||||
sentry: {
|
||||
captureException: e => {
|
||||
console.error('ERROR ' + e + ' ' + e.stack);
|
||||
}
|
||||
|
||||
78
app/api.js
@@ -11,6 +11,15 @@ if (!fileProtocolWssUrl) {
|
||||
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) {
|
||||
localStorage && localStorage.setItem('wssURL', url);
|
||||
fileProtocolWssUrl = url;
|
||||
@@ -137,17 +146,25 @@ export async function setPassword(id, owner_token, keychain) {
|
||||
}
|
||||
|
||||
function asyncInitWebSocket(server) {
|
||||
return new Promise(resolve => {
|
||||
const ws = new WebSocket(server);
|
||||
ws.onopen = () => {
|
||||
resolve(ws);
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
const ws = new WebSocket(server);
|
||||
ws.addEventListener('open', () => resolve(ws), { once: true });
|
||||
} catch (e) {
|
||||
reject(new ConnectionError(false));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function listenForResponse(ws, canceller) {
|
||||
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) {
|
||||
ws.removeEventListener('close', handleClose);
|
||||
try {
|
||||
const response = JSON.parse(msg.data);
|
||||
if (response.error) {
|
||||
@@ -156,13 +173,11 @@ function listenForResponse(ws, canceller) {
|
||||
resolve(response);
|
||||
}
|
||||
} catch (e) {
|
||||
ws.close();
|
||||
canceller.cancelled = true;
|
||||
canceller.error = e;
|
||||
reject(e);
|
||||
}
|
||||
}
|
||||
ws.addEventListener('message', handleMessage, { once: true });
|
||||
ws.addEventListener('close', handleClose, { once: true });
|
||||
});
|
||||
}
|
||||
|
||||
@@ -176,6 +191,8 @@ async function upload(
|
||||
onprogress,
|
||||
canceller
|
||||
) {
|
||||
let size = 0;
|
||||
const start = Date.now();
|
||||
const host = window.location.hostname;
|
||||
const port = window.location.port;
|
||||
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||
@@ -203,31 +220,41 @@ async function upload(
|
||||
|
||||
const reader = stream.getReader();
|
||||
let state = await reader.read();
|
||||
let size = 0;
|
||||
while (!state.done) {
|
||||
const buf = state.value;
|
||||
if (canceller.cancelled) {
|
||||
throw canceller.error;
|
||||
ws.close();
|
||||
}
|
||||
|
||||
if (ws.readyState !== WebSocket.OPEN) {
|
||||
break;
|
||||
}
|
||||
const buf = state.value;
|
||||
ws.send(buf);
|
||||
|
||||
onprogress(size);
|
||||
size += buf.length;
|
||||
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();
|
||||
}
|
||||
}
|
||||
const footer = new Uint8Array([0]);
|
||||
ws.send(footer);
|
||||
if (ws.readyState === WebSocket.OPEN) {
|
||||
ws.send(new Uint8Array([0])); //EOF
|
||||
}
|
||||
|
||||
await completedResponse;
|
||||
ws.close();
|
||||
uploadInfo.duration = Date.now() - start;
|
||||
return uploadInfo;
|
||||
} catch (e) {
|
||||
ws.close(4000);
|
||||
e.size = size;
|
||||
e.duration = Date.now() - start;
|
||||
throw e;
|
||||
} finally {
|
||||
if (![WebSocket.CLOSED, WebSocket.CLOSING].includes(ws.readyState)) {
|
||||
ws.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,7 +271,6 @@ export function uploadWs(
|
||||
|
||||
return {
|
||||
cancel: function() {
|
||||
canceller.error = new Error(0);
|
||||
canceller.cancelled = true;
|
||||
},
|
||||
|
||||
@@ -284,7 +310,7 @@ async function downloadS(id, keychain, signal) {
|
||||
return response.body;
|
||||
}
|
||||
|
||||
async function tryDownloadStream(id, keychain, signal, tries = 1) {
|
||||
async function tryDownloadStream(id, keychain, signal, tries = 2) {
|
||||
try {
|
||||
const result = await downloadS(id, keychain, signal);
|
||||
return result;
|
||||
@@ -306,18 +332,19 @@ export function downloadStream(id, keychain) {
|
||||
}
|
||||
return {
|
||||
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();
|
||||
canceller.oncancel = function() {
|
||||
xhr.abort();
|
||||
};
|
||||
return new Promise(async function(resolve, reject) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
xhr.addEventListener('loadend', function() {
|
||||
canceller.oncancel = function() {};
|
||||
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
|
||||
@@ -337,7 +364,6 @@ function download(id, keychain, onprogress, canceller) {
|
||||
onprogress(event.loaded);
|
||||
}
|
||||
});
|
||||
const auth = await keychain.authHeader();
|
||||
xhr.open('get', getApiUrl(`/api/download/blob/${id}`));
|
||||
xhr.setRequestHeader('Authorization', auth);
|
||||
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 {
|
||||
const result = await download(id, keychain, onprogress, canceller);
|
||||
return result;
|
||||
@@ -367,7 +393,7 @@ export function downloadFile(id, keychain, onprogress) {
|
||||
}
|
||||
return {
|
||||
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() {
|
||||
const serviceWorker =
|
||||
'serviceWorker' in navigator && browserName() !== 'edge';
|
||||
const browser = browserName();
|
||||
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
|
||||
let crypto = await checkCrypto();
|
||||
const nativeStreams = checkStreams();
|
||||
let polyStreams = false;
|
||||
@@ -97,13 +97,16 @@ export default async function getCapabilities() {
|
||||
window.matchMedia('(display-mode: standalone)').matches ||
|
||||
navigator.standalone;
|
||||
|
||||
const mobileFirefox =
|
||||
browser === 'firefox' && /mobile/i.test(navigator.userAgent);
|
||||
|
||||
return {
|
||||
account,
|
||||
crypto,
|
||||
serviceWorker,
|
||||
streamUpload: nativeStreams || polyStreams,
|
||||
streamDownload:
|
||||
nativeStreams && serviceWorker && browserName() !== 'safari',
|
||||
nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox,
|
||||
multifile: nativeStreams || polyStreams,
|
||||
share,
|
||||
standalone
|
||||
|
||||
@@ -76,7 +76,7 @@ export default function(state, emitter) {
|
||||
state.storage.remove(ownedFile.id);
|
||||
await ownedFile.del();
|
||||
} catch (e) {
|
||||
state.raven.captureException(e);
|
||||
state.sentry.captureException(e);
|
||||
}
|
||||
render();
|
||||
});
|
||||
@@ -176,14 +176,17 @@ export default function(state, emitter) {
|
||||
} catch (err) {
|
||||
if (err.message === '0') {
|
||||
//cancelled. do nothing
|
||||
const duration = Date.now() - start;
|
||||
metrics.cancelledUpload(archive, duration);
|
||||
metrics.cancelledUpload(archive, err.duration);
|
||||
render();
|
||||
} else {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(err);
|
||||
state.raven.captureException(err);
|
||||
metrics.stoppedUpload(archive);
|
||||
state.sentry.withScope(scope => {
|
||||
scope.setExtra('duration', err.duration);
|
||||
scope.setExtra('size', err.size);
|
||||
state.sentry.captureException(err);
|
||||
});
|
||||
metrics.stoppedUpload(archive, err.duration);
|
||||
emitter.emit('pushState', '/error');
|
||||
}
|
||||
} finally {
|
||||
@@ -262,7 +265,12 @@ export default function(state, emitter) {
|
||||
state.transfer = null;
|
||||
const location = err.message === '404' ? '/404' : '/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;
|
||||
metrics.stoppedDownload({
|
||||
size,
|
||||
|
||||
@@ -112,6 +112,7 @@ export default class FileReceiver extends Nanobus {
|
||||
}
|
||||
|
||||
async downloadStream(noSave = false) {
|
||||
const start = Date.now();
|
||||
const onprogress = p => {
|
||||
this.progress = [p, this.fileInfo.size];
|
||||
this.emit('progress');
|
||||
@@ -153,9 +154,7 @@ export default class FileReceiver extends Nanobus {
|
||||
const downloadPath = `/api/download/${this.fileInfo.id}`;
|
||||
let downloadUrl = getApiUrl(downloadPath);
|
||||
if (downloadUrl === downloadPath) {
|
||||
downloadUrl = `${location.protocol}//${location.host}/api/download/${
|
||||
this.fileInfo.id
|
||||
}`;
|
||||
downloadUrl = `${location.protocol}//${location.host}${downloadPath}`;
|
||||
}
|
||||
const a = document.createElement('a');
|
||||
a.href = downloadUrl;
|
||||
@@ -164,11 +163,29 @@ export default class FileReceiver extends Nanobus {
|
||||
}
|
||||
|
||||
let prog = 0;
|
||||
let hangs = 0;
|
||||
while (prog < this.fileInfo.size) {
|
||||
const msg = await this.sendMessageToSw({
|
||||
request: 'progress',
|
||||
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;
|
||||
onprogress(prog);
|
||||
await delay(1000);
|
||||
|
||||
@@ -44,7 +44,6 @@ export default class FileSender extends Nanobus {
|
||||
}
|
||||
|
||||
async upload(archive, bearerToken) {
|
||||
const start = Date.now();
|
||||
if (this.cancelled) {
|
||||
throw new Error(0);
|
||||
}
|
||||
@@ -76,7 +75,6 @@ export default class FileSender extends Nanobus {
|
||||
this.emit('progress'); // HACK to kick MS Edge
|
||||
try {
|
||||
const result = await this.uploadRequest.result;
|
||||
const time = Date.now() - start;
|
||||
this.msg = 'notifyUploadEncryptDone';
|
||||
this.uploadRequest = null;
|
||||
this.progress = [1, 1];
|
||||
@@ -87,8 +85,8 @@ export default class FileSender extends Nanobus {
|
||||
name: archive.name,
|
||||
size: archive.size,
|
||||
manifest: archive.manifest,
|
||||
time: time,
|
||||
speed: archive.size / (time / 1000),
|
||||
time: result.duration,
|
||||
speed: archive.size / (result.duration / 1000),
|
||||
createdAt: Date.now(),
|
||||
expiresAt: Date.now() + archive.timeLimit * 1000,
|
||||
secretKey: secretKey,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { FluentBundle } from 'fluent';
|
||||
import { FluentBundle } from '@fluent/bundle';
|
||||
|
||||
function makeBundle(locale, ftl) {
|
||||
const bundle = new FluentBundle(locale, { useIsolating: false });
|
||||
@@ -10,9 +10,9 @@ export async function getTranslator(locale) {
|
||||
const bundles = [];
|
||||
const { default: en } = await import('../public/locales/en-US/send.ftl');
|
||||
if (locale !== 'en-US') {
|
||||
const {
|
||||
default: ftl
|
||||
} = await import(`../public/locales/${locale}/send.ftl`);
|
||||
const { default: ftl } = await import(
|
||||
`../public/locales/${locale}/send.ftl`
|
||||
);
|
||||
bundles.push(makeBundle(locale, ftl));
|
||||
}
|
||||
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;
|
||||
|
||||
:not(input) {
|
||||
@@ -34,7 +39,7 @@ body {
|
||||
}
|
||||
|
||||
.btn {
|
||||
@apply bg-blue-dark;
|
||||
@apply bg-blue-60;
|
||||
@apply text-white;
|
||||
@apply cursor-pointer;
|
||||
@apply py-4;
|
||||
@@ -43,11 +48,11 @@ body {
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
@apply bg-blue-darker;
|
||||
@apply bg-blue-70;
|
||||
}
|
||||
|
||||
.btn:focus {
|
||||
@apply bg-blue-darker;
|
||||
@apply bg-blue-70;
|
||||
}
|
||||
|
||||
.checkbox {
|
||||
@@ -65,7 +70,7 @@ body {
|
||||
}
|
||||
|
||||
.checkbox > label::before {
|
||||
/* @apply bg-grey-lightest; */
|
||||
/* @apply bg-grey-10; */
|
||||
@apply border;
|
||||
@apply rounded-sm;
|
||||
|
||||
@@ -77,16 +82,16 @@ body {
|
||||
}
|
||||
|
||||
.checkbox > label:hover::before {
|
||||
@apply border-blue-dark;
|
||||
@apply border-blue-50;
|
||||
}
|
||||
|
||||
.checkbox > input:focus + label::before {
|
||||
@apply border-blue-dark;
|
||||
@apply border-blue-50;
|
||||
}
|
||||
|
||||
.checkbox > input:checked + label::before {
|
||||
@apply bg-blue-dark;
|
||||
@apply border-blue-dark;
|
||||
@apply bg-blue-50;
|
||||
@apply border-blue-50;
|
||||
|
||||
background-image: url('../assets/lock.svg');
|
||||
background-position: center;
|
||||
@@ -99,8 +104,8 @@ body {
|
||||
}
|
||||
|
||||
.checkbox > input:disabled + label::before {
|
||||
@apply bg-blue-dark;
|
||||
@apply border-blue-dark;
|
||||
@apply bg-blue-50;
|
||||
@apply border-blue-50;
|
||||
|
||||
background-image: url('../assets/lock.svg');
|
||||
background-position: center;
|
||||
@@ -148,9 +153,21 @@ footer li:hover {
|
||||
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 {
|
||||
height: 32px;
|
||||
width: 170px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.intro {
|
||||
@@ -188,14 +205,14 @@ footer li:hover {
|
||||
}
|
||||
|
||||
progress {
|
||||
@apply bg-grey-light;
|
||||
@apply bg-grey-30;
|
||||
@apply rounded-sm;
|
||||
@apply w-full;
|
||||
@apply h-1;
|
||||
}
|
||||
|
||||
progress::-webkit-progress-bar {
|
||||
@apply bg-grey-light;
|
||||
@apply bg-grey-30;
|
||||
@apply rounded-sm;
|
||||
@apply w-full;
|
||||
@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;
|
||||
|
||||
@responsive {
|
||||
@@ -311,6 +377,7 @@ select {
|
||||
}
|
||||
|
||||
.signin {
|
||||
backface-visibility: hidden;
|
||||
border-radius: 6px;
|
||||
transition-property: transform, background-color;
|
||||
transition-duration: 250ms;
|
||||
@@ -319,8 +386,6 @@ select {
|
||||
|
||||
.signin:hover,
|
||||
.signin:focus {
|
||||
@apply shadow-btn;
|
||||
|
||||
transform: scale(1.0625);
|
||||
}
|
||||
|
||||
@@ -331,19 +396,19 @@ select {
|
||||
/* begin signin button color experiment */
|
||||
|
||||
.white-blue {
|
||||
@apply border-blue-dark;
|
||||
@apply border-blue-60;
|
||||
@apply border-2;
|
||||
@apply text-blue-dark;
|
||||
@apply text-blue-60;
|
||||
}
|
||||
|
||||
.white-blue:hover,
|
||||
.white-blue:focus {
|
||||
@apply bg-blue-dark;
|
||||
@apply bg-blue-60;
|
||||
@apply text-white;
|
||||
}
|
||||
|
||||
.blue {
|
||||
@apply bg-blue-dark;
|
||||
@apply bg-blue-60;
|
||||
@apply text-white;
|
||||
}
|
||||
|
||||
|
||||
14
app/main.js
@@ -1,7 +1,7 @@
|
||||
/* global DEFAULTS LIMITS PREFS */
|
||||
import 'core-js';
|
||||
import 'fast-text-encoding'; // MS Edge support
|
||||
import 'fluent-intl-polyfill';
|
||||
import 'intl-pluralrules';
|
||||
import choo from 'choo';
|
||||
import nanotiming from 'nanotiming';
|
||||
import routes from './routes';
|
||||
@@ -12,15 +12,15 @@ import pasteManager from './pasteManager';
|
||||
import storage from './storage';
|
||||
import metrics from './metrics';
|
||||
import experiments from './experiments';
|
||||
import Raven from 'raven-js';
|
||||
import * as Sentry from '@sentry/browser';
|
||||
import './main.css';
|
||||
import User from './user';
|
||||
import { getTranslator } from './locale';
|
||||
import Archive from './archive';
|
||||
import { setTranslate, locale } from './utils';
|
||||
|
||||
if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) {
|
||||
Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install();
|
||||
if (navigator.doNotTrack !== '1' && window.SENTRY_CONFIG) {
|
||||
Sentry.init(window.SENTRY_CONFIG);
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
@@ -47,6 +47,7 @@ if (process.env.NODE_ENV === 'production') {
|
||||
|
||||
const translate = await getTranslator(locale());
|
||||
setTranslate(translate);
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
window.initialState = {
|
||||
LIMITS,
|
||||
DEFAULTS,
|
||||
@@ -55,13 +56,14 @@ if (process.env.NODE_ENV === 'production') {
|
||||
capabilities,
|
||||
translate,
|
||||
storage,
|
||||
raven: Raven,
|
||||
sentry: Sentry,
|
||||
user: new User(storage, LIMITS, window.AUTH_CONFIG),
|
||||
transfer: null,
|
||||
fileInfo: null
|
||||
};
|
||||
|
||||
const app = routes(choo());
|
||||
const app = routes(choo({ hash: true }));
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
window.app = app;
|
||||
app.use(experiments);
|
||||
app.use(metrics);
|
||||
|
||||
@@ -107,9 +107,10 @@ function completedUpload(archive, duration) {
|
||||
});
|
||||
}
|
||||
|
||||
function stoppedUpload(archive) {
|
||||
function stoppedUpload(archive, duration = 0) {
|
||||
return addEvent('client_upload', {
|
||||
download_limit: archive.dlimit,
|
||||
duration: sizeOrder(duration),
|
||||
file_count: archive.numFiles,
|
||||
password_protected: !!archive.password,
|
||||
size: sizeOrder(archive.size),
|
||||
|
||||
@@ -2,7 +2,7 @@ const choo = require('choo');
|
||||
const download = require('./ui/download');
|
||||
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('/download/:id', body(download));
|
||||
app.route('/download/:id/:key', body(download));
|
||||
@@ -13,6 +13,7 @@ module.exports = function(app = choo()) {
|
||||
app.route('/oauth', function(state, emit) {
|
||||
emit('authenticate', state.query.code, state.query.state);
|
||||
});
|
||||
app.route('/login', body(require('./ui/home')));
|
||||
app.route('*', body(require('./ui/notFound')));
|
||||
return app;
|
||||
};
|
||||
|
||||
@@ -11,13 +11,14 @@ const map = new Map();
|
||||
const IMAGES = /.*\.(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 FONT = /\.woff2?$/;
|
||||
|
||||
self.addEventListener('install', event => {
|
||||
event.waitUntil(precache());
|
||||
self.addEventListener('install', () => {
|
||||
self.skipWaiting();
|
||||
});
|
||||
|
||||
self.addEventListener('activate', event => {
|
||||
event.waitUntil(self.clients.claim());
|
||||
event.waitUntil(self.clients.claim().then(precache));
|
||||
});
|
||||
|
||||
async function decryptStream(id) {
|
||||
@@ -83,16 +84,28 @@ async function decryptStream(id) {
|
||||
}
|
||||
|
||||
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();
|
||||
for (const c of oldCaches) {
|
||||
if (c !== version) {
|
||||
await caches.delete(c);
|
||||
}
|
||||
}
|
||||
const cache = await caches.open(version);
|
||||
const images = assets.match(IMAGES);
|
||||
await cache.addAll(images);
|
||||
return self.skipWaiting();
|
||||
}
|
||||
|
||||
function cacheable(url) {
|
||||
return VERSIONED_ASSET.test(url) || FONT.test(url);
|
||||
}
|
||||
|
||||
async function cachedOrFetched(req) {
|
||||
@@ -102,7 +115,7 @@ async function cachedOrFetched(req) {
|
||||
return cached;
|
||||
}
|
||||
const fetched = await fetch(req);
|
||||
if (fetched.ok && VERSIONED_ASSET.test(req.url)) {
|
||||
if (fetched.ok && cacheable(req.url)) {
|
||||
cache.put(req, fetched.clone());
|
||||
}
|
||||
return fetched;
|
||||
@@ -115,7 +128,7 @@ self.onfetch = event => {
|
||||
const dlmatch = DOWNLOAD_URL.exec(url.pathname);
|
||||
if (dlmatch) {
|
||||
event.respondWith(decryptStream(dlmatch[1]));
|
||||
} else if (VERSIONED_ASSET.test(url.pathname)) {
|
||||
} else if (cacheable(url.pathname)) {
|
||||
event.respondWith(cachedOrFetched(req));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* global ReadableStream TransformStream */
|
||||
/* global TransformStream */
|
||||
|
||||
export function transformStream(readable, transformer, oncancel) {
|
||||
try {
|
||||
|
||||
@@ -64,8 +64,7 @@ class Account extends Component {
|
||||
return html`
|
||||
<send-account>
|
||||
<button
|
||||
class="px-4 py-2 md:px-8 md:py-4 focus:outline signin ${this
|
||||
.buttonClass}"
|
||||
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"
|
||||
onclick="${e => this.login(e)}"
|
||||
title="${translate('signInOnlyButton')}"
|
||||
>
|
||||
@@ -79,19 +78,19 @@ class Account extends Component {
|
||||
<input
|
||||
type="image"
|
||||
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}"
|
||||
onclick="${e => this.avatarClick(e)}"
|
||||
/>
|
||||
<ul
|
||||
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)}"
|
||||
>
|
||||
<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>
|
||||
<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)}"
|
||||
title="${translate('signOut')}"
|
||||
>
|
||||
|
||||
@@ -46,7 +46,7 @@ function password(state) {
|
||||
id="password-input"
|
||||
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"
|
||||
maxlength="${MAX_LENGTH}"
|
||||
type="password"
|
||||
@@ -58,7 +58,7 @@ function password(state) {
|
||||
<label
|
||||
id="password-msg"
|
||||
for="password-input"
|
||||
class="block text-xs text-grey-darker"
|
||||
class="block text-xs text-grey-70"
|
||||
></label>
|
||||
</div>
|
||||
`;
|
||||
@@ -106,7 +106,9 @@ function password(state) {
|
||||
function fileInfo(file, action) {
|
||||
return html`
|
||||
<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">
|
||||
<h1 class="text-base font-medium word-break-all">${file.name}</h1>
|
||||
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
||||
@@ -120,7 +122,9 @@ function fileInfo(file, action) {
|
||||
function archiveInfo(archive, action) {
|
||||
return html`
|
||||
<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">
|
||||
<h1 class="text-base font-medium word-break-all">${archive.name}</h1>
|
||||
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
||||
@@ -140,7 +144,7 @@ function archiveDetails(translate, archive) {
|
||||
ontoggle="${toggled}"
|
||||
>
|
||||
<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
|
||||
class="fill-current w-4 h-4 mr-1"
|
||||
@@ -155,7 +159,7 @@ function archiveDetails(translate, archive) {
|
||||
num: archive.manifest.files.length
|
||||
})}
|
||||
</summary>
|
||||
${list(archive.manifest.files.map(f => fileInfo(f)), 'list-reset')}
|
||||
${list(archive.manifest.files.map(f => fileInfo(f)))}
|
||||
</details>
|
||||
`;
|
||||
}
|
||||
@@ -170,20 +174,25 @@ module.exports = function(state, emit, archive) {
|
||||
state.capabilities.share || platform() === 'android'
|
||||
? html`
|
||||
<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}
|
||||
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>
|
||||
`
|
||||
: html`
|
||||
<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}
|
||||
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')}
|
||||
</button>
|
||||
`;
|
||||
@@ -191,12 +200,14 @@ module.exports = function(state, emit, archive) {
|
||||
platform() === 'web'
|
||||
? html`
|
||||
<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}"
|
||||
title="${state.translate('downloadButtonLabel')}"
|
||||
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')}
|
||||
</a>
|
||||
`
|
||||
@@ -206,14 +217,14 @@ module.exports = function(state, emit, archive) {
|
||||
return html`
|
||||
<send-archive
|
||||
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(
|
||||
archive,
|
||||
html`
|
||||
<input
|
||||
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')}"
|
||||
title="${state.translate('deleteButtonHover')}"
|
||||
src="${assets.get('close-16.svg')}"
|
||||
@@ -225,7 +236,7 @@ module.exports = function(state, emit, archive) {
|
||||
${expiryInfo(state.translate, archive)}
|
||||
</div>
|
||||
${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">
|
||||
${dl} ${copyOrShare}
|
||||
</div>
|
||||
@@ -256,9 +267,7 @@ module.exports = function(state, emit, archive) {
|
||||
try {
|
||||
await navigator.share({
|
||||
title: state.translate('-send-brand'),
|
||||
text: `Download "${
|
||||
archive.name
|
||||
}" with Firefox Send: simple, safe file sharing`,
|
||||
text: `Download "${archive.name}" with Firefox Send: simple, safe file sharing`,
|
||||
//state.translate('shareMessage', { name }),
|
||||
url: archive.url
|
||||
});
|
||||
@@ -271,18 +280,21 @@ module.exports = function(state, emit, archive) {
|
||||
|
||||
module.exports.wip = function(state, emit) {
|
||||
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(
|
||||
Array.from(state.archive.files)
|
||||
.reverse()
|
||||
.map(f =>
|
||||
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',
|
||||
'bg-white px-2 my-2 shadow-light rounded'
|
||||
'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 dark:bg-grey-90 dark:border dark:border-grey-80'
|
||||
)}
|
||||
<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
|
||||
id="file-upload"
|
||||
@@ -302,10 +314,12 @@ module.exports.wip = function(state, emit) {
|
||||
class="flex items-center cursor-pointer"
|
||||
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')}
|
||||
</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', {
|
||||
size: bytes(state.archive.size)
|
||||
})}
|
||||
@@ -315,7 +329,7 @@ module.exports.wip = function(state, emit) {
|
||||
${expiryOptions(state, emit)} ${password(state, emit)}
|
||||
<button
|
||||
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')}"
|
||||
onclick="${upload}"
|
||||
>
|
||||
@@ -380,22 +394,22 @@ module.exports.uploading = function(state, emit) {
|
||||
return html`
|
||||
<send-upload-area
|
||||
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)}
|
||||
<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, {
|
||||
dlimit: state.archive.dlimit,
|
||||
dtotal: 0,
|
||||
expiresAt: Date.now() + 500 + state.archive.timeLimit * 1000
|
||||
})}
|
||||
</div>
|
||||
<div class="text-blue-dark text-sm font-medium mt-2">
|
||||
<div class="link-blue text-sm font-medium mt-2">
|
||||
${progressPercent}
|
||||
</div>
|
||||
<progress class="my-3" value="${progress}">${progressPercent}</progress>
|
||||
<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}
|
||||
title="${state.translate('deletePopupCancel')}"
|
||||
>
|
||||
@@ -417,7 +431,7 @@ module.exports.empty = function(state, emit) {
|
||||
? ''
|
||||
: html`
|
||||
<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 => {
|
||||
event.stopPropagation();
|
||||
emit('signup-cta', 'drop');
|
||||
@@ -430,14 +444,16 @@ module.exports.empty = function(state, emit) {
|
||||
`;
|
||||
return html`
|
||||
<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 => {
|
||||
if (e.target.tagName !== 'LABEL') {
|
||||
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">
|
||||
${state.translate('dragAndDropFiles')}
|
||||
</div>
|
||||
@@ -471,14 +487,11 @@ module.exports.empty = function(state, emit) {
|
||||
`;
|
||||
|
||||
function focus(event) {
|
||||
event.target.nextElementSibling.classList.add('bg-blue-darker', 'outline');
|
||||
event.target.nextElementSibling.classList.add('bg-blue-70', 'outline');
|
||||
}
|
||||
|
||||
function blur(event) {
|
||||
event.target.nextElementSibling.classList.remove(
|
||||
'bg-blue-darker',
|
||||
'outline'
|
||||
);
|
||||
event.target.nextElementSibling.classList.remove('bg-blue-70', 'outline');
|
||||
}
|
||||
|
||||
function add(event) {
|
||||
@@ -503,13 +516,15 @@ module.exports.preview = function(state, emit) {
|
||||
</div>
|
||||
`;
|
||||
return html`
|
||||
<send-archive class="flex flex-col max-h-full bg-white p-4 w-full md:w-128">
|
||||
<div class="border rounded py-3 px-6">
|
||||
<send-archive
|
||||
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}
|
||||
</div>
|
||||
<button
|
||||
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')}"
|
||||
onclick=${download}
|
||||
>
|
||||
@@ -531,10 +546,10 @@ module.exports.downloading = function(state) {
|
||||
const progressPercent = percent(progress);
|
||||
return html`
|
||||
<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)}
|
||||
<div class="text-blue-dark text-sm font-medium mt-2">
|
||||
<div class="link-blue text-sm font-medium mt-2">
|
||||
${progressPercent}
|
||||
</div>
|
||||
<progress class="my-3" value="${progress}">${progressPercent}</progress>
|
||||
|
||||
@@ -8,9 +8,7 @@ function banner(state) {
|
||||
return; // server side
|
||||
}
|
||||
const show =
|
||||
!state.capabilities.standalone &&
|
||||
!/firefox/i.test(navigator.userAgent) &&
|
||||
!state.route.startsWith('/unsupported/');
|
||||
!state.capabilities.standalone && !state.route.startsWith('/unsupported/');
|
||||
if (show) {
|
||||
return state.cache(Promo, 'promo').render();
|
||||
}
|
||||
@@ -20,7 +18,7 @@ module.exports = function body(main) {
|
||||
return function(state, emit) {
|
||||
const b = html`
|
||||
<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()}
|
||||
${main(state, emit)} ${state.cache(Footer, 'footer').render()}
|
||||
|
||||
@@ -7,29 +7,31 @@ module.exports = function(name, url) {
|
||||
<send-copy-dialog
|
||||
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')}
|
||||
</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 />
|
||||
${name}
|
||||
</p>
|
||||
<input
|
||||
type="text"
|
||||
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}"
|
||||
readonly="true"
|
||||
/>
|
||||
<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}"
|
||||
title="${state.translate('copyLinkButton')}"
|
||||
>
|
||||
${state.translate('copyLinkButton')}
|
||||
</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}"
|
||||
title="${state.translate('okButton')}"
|
||||
>
|
||||
|
||||
@@ -22,7 +22,9 @@ function downloading(state, emit) {
|
||||
<div
|
||||
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)}
|
||||
</div>
|
||||
`;
|
||||
@@ -36,8 +38,12 @@ function preview(state, emit) {
|
||||
<div
|
||||
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>
|
||||
<p class="w-full text-grey-darkest text-center leading-normal">
|
||||
<h1 class="text-3xl font-bold mb-4">
|
||||
${state.translate('downloadTitle')}
|
||||
</h1>
|
||||
<p
|
||||
class="w-full text-grey-80 text-center leading-normal dark:text-grey-40"
|
||||
>
|
||||
${state.translate('downloadDescription')}
|
||||
</p>
|
||||
${archiveTile.preview(state, emit)}
|
||||
|
||||
@@ -5,13 +5,13 @@ module.exports = function(state) {
|
||||
return html`
|
||||
<div
|
||||
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')}
|
||||
</h1>
|
||||
<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')}
|
||||
</p>
|
||||
<p class="my-5">
|
||||
|
||||
@@ -6,10 +6,14 @@ module.exports = function(state, emit) {
|
||||
|
||||
const div = html`
|
||||
<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>
|
||||
<p class="w-full mb-4 text-center text-grey-darkest leading-normal">
|
||||
<h1 class="text-3xl font-bold mb-4">
|
||||
${state.translate('downloadTitle')}
|
||||
</h1>
|
||||
<p
|
||||
class="w-full mb-4 text-center text-grey-80 dark:text-grey-40 leading-normal"
|
||||
>
|
||||
${state.translate('downloadDescription')}
|
||||
</p>
|
||||
<form
|
||||
@@ -20,8 +24,8 @@ module.exports = function(state, emit) {
|
||||
<input
|
||||
id="password-input"
|
||||
class="w-full border-l border-t border-b rounded-l-lg rounded-r-none ${invalid
|
||||
? 'border-red'
|
||||
: 'border-grey'} leading-loose px-2 py-1"
|
||||
? 'border-red dark:border-red-40'
|
||||
: 'border-grey'} leading-loose px-2 py-1 dark:bg-grey-80"
|
||||
maxlength="32"
|
||||
autocomplete="off"
|
||||
placeholder="${state.translate('unlockInputPlaceholder')}"
|
||||
@@ -32,7 +36,7 @@ module.exports = function(state, emit) {
|
||||
type="submit"
|
||||
id="password-btn"
|
||||
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')}"
|
||||
title="${state.translate('unlockButtonLabel')}"
|
||||
@@ -40,7 +44,7 @@ module.exports = function(state, emit) {
|
||||
</form>
|
||||
<label
|
||||
id="password-error"
|
||||
class="${invalid ? '' : 'invisible'} text-red my-4"
|
||||
class="${invalid ? '' : 'invisible'} text-red dark:text-red-40 my-4"
|
||||
for="password-input"
|
||||
>
|
||||
${state.translate('passwordTryAgain')}
|
||||
@@ -70,7 +74,9 @@ module.exports = function(state, emit) {
|
||||
const password = el.value;
|
||||
if (password.length > 0) {
|
||||
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;
|
||||
emit('getMetadata');
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@ module.exports = function(state, emit) {
|
||||
<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"
|
||||
>
|
||||
<h1 class="text-center font-bold my-2">
|
||||
<h1 class="text-center text-3xl font-bold my-2">
|
||||
${state.translate('errorPageHeader')}
|
||||
</h1>
|
||||
<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')}
|
||||
</p>
|
||||
<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}`;
|
||||
return html`
|
||||
<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
|
||||
class="mozilla-logo pb-10 md:pb-0 m-2"
|
||||
href="https://www.mozilla.org/"
|
||||
>
|
||||
<a class="mozilla-logo m-2" href="https://www.mozilla.org/">
|
||||
Mozilla
|
||||
</a>
|
||||
<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">
|
||||
<a href="https://www.mozilla.org/about/legal/terms/services/#send">
|
||||
|
||||
@@ -16,15 +16,27 @@ class Header extends Component {
|
||||
this.account.render();
|
||||
return false;
|
||||
}
|
||||
|
||||
createElement() {
|
||||
const title =
|
||||
platform() === 'android'
|
||||
? 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`
|
||||
<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`
|
||||
<header
|
||||
|
||||
@@ -20,11 +20,7 @@ module.exports = function(state, emit) {
|
||||
const right =
|
||||
archives.length === 0
|
||||
? intro(state)
|
||||
: list(
|
||||
archives,
|
||||
'list-reset p-2 h-full overflow-y-auto w-full',
|
||||
'mb-4 w-full'
|
||||
);
|
||||
: list(archives, 'p-2 h-full overflow-y-auto w-full', 'mb-4 w-full');
|
||||
|
||||
return html`
|
||||
<main class="main">
|
||||
|
||||
@@ -4,10 +4,10 @@ const assets = require('../../common/assets');
|
||||
module.exports = function intro(state) {
|
||||
return html`
|
||||
<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">
|
||||
<h1 class="font-bold md:pb-2">
|
||||
<h1 class="text-3xl font-bold md:pb-2">
|
||||
${state.translate('introTitle')}
|
||||
</h1>
|
||||
<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">
|
||||
${state.modal && modal(state, emit)}
|
||||
<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>
|
||||
<div class="overflow-y-scroll py-8 px-12">
|
||||
<p class="leading-normal">
|
||||
@@ -17,7 +19,7 @@ module.exports = function(state, emit) {
|
||||
href="https://www.mozilla.org/privacy/"
|
||||
target="__blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-blue-dark hover:underline"
|
||||
class="link-blue hover:underline"
|
||||
>Mozilla Privacy Policy</a
|
||||
>
|
||||
<span
|
||||
@@ -29,7 +31,7 @@ module.exports = function(state, emit) {
|
||||
href="https://github.com/mozilla/send/blob/master/docs/metrics.md"
|
||||
target="__blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-blue-dark hover:underline"
|
||||
class="link-blue hover:underline"
|
||||
>here</a
|
||||
>.
|
||||
</p>
|
||||
|
||||
@@ -3,13 +3,12 @@ const html = require('choo/html');
|
||||
module.exports = function(state, emit) {
|
||||
return html`
|
||||
<send-modal
|
||||
class="absolute pin flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-xl md:my-8"
|
||||
onclick="${close}"
|
||||
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"
|
||||
>
|
||||
<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)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,16 +8,18 @@ module.exports = function(state, emit) {
|
||||
<div
|
||||
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
|
||||
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')} ⚠️
|
||||
</p>
|
||||
<form class="md:w-128" onsubmit=${submit}>
|
||||
<fieldset class="border rounded p-4 my-4" onchange=${optionChanged}>
|
||||
<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'
|
||||
)}"/>
|
||||
<p class="flex-grow">
|
||||
@@ -49,7 +51,7 @@ module.exports = function(state, emit) {
|
||||
</div>
|
||||
</fieldset>
|
||||
<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')}"
|
||||
title="${state.translate('copyLinkButton')}"
|
||||
type="submit" />
|
||||
|
||||
@@ -9,11 +9,11 @@ module.exports = function(state, emit) {
|
||||
<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"
|
||||
>
|
||||
<h1 class="text-center font-bold my-2">
|
||||
<h1 class="text-center text-3xl font-bold my-2">
|
||||
${state.translate('expiredTitle')}
|
||||
</h1>
|
||||
<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')}
|
||||
</p>
|
||||
<p class="my-5">
|
||||
|
||||
@@ -4,9 +4,11 @@ module.exports = function(message) {
|
||||
return function(state, emit, close) {
|
||||
return html`
|
||||
<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
|
||||
class="btn rounded-lg w-full flex-no-shrink"
|
||||
class="btn rounded-lg w-full flex-shrink-0"
|
||||
onclick="${close}"
|
||||
title="${state.translate('okButton')}"
|
||||
>
|
||||
|
||||
@@ -15,20 +15,20 @@ class Promo extends Component {
|
||||
createElement() {
|
||||
return html`
|
||||
<send-promo
|
||||
class="w-full flex-none flex-row items-center content-center justify-center text-sm bg-grey-light leading-tight text-grey-darkest px-4 py-3 hidden md:flex"
|
||||
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">
|
||||
<img
|
||||
src="${assets.get('firefox_logo-only.svg')}"
|
||||
class="w-6"
|
||||
src="${assets.get('master-logo.svg')}"
|
||||
class="w-6 h-6"
|
||||
alt="Firefox"
|
||||
/>
|
||||
<span class="ml-3">
|
||||
${this.state.translate('downloadFirefoxPromo')}${' '}
|
||||
<span class="ml-2 sm:ml-4 text-xs sm:text-base">
|
||||
${this.state.translate('trailheadPromo')}${' '}
|
||||
<a
|
||||
class="text-blue"
|
||||
href="https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com"
|
||||
>${this.state.translate('downloadFirefox')}</a
|
||||
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"
|
||||
>${this.state.translate('learnMore')}</a
|
||||
>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,7 @@ module.exports = function(selected, options, translate, changed, htmlId) {
|
||||
return html`
|
||||
<select
|
||||
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}"
|
||||
>
|
||||
${options.map(
|
||||
|
||||
@@ -6,29 +6,31 @@ module.exports = function(name, url) {
|
||||
<send-share-dialog
|
||||
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')}
|
||||
</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 />
|
||||
${name}
|
||||
</p>
|
||||
<input
|
||||
type="text"
|
||||
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}"
|
||||
readonly="true"
|
||||
/>
|
||||
<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}"
|
||||
title="${state.translate('shareLinkButton')}"
|
||||
>
|
||||
${state.translate('shareLinkButton')}
|
||||
</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}"
|
||||
title="${state.translate('okButton')}"
|
||||
>
|
||||
|
||||
@@ -12,18 +12,15 @@ module.exports = function(trigger) {
|
||||
<send-signup-dialog
|
||||
class="flex flex-col lg:flex-row justify-center px-8 md:px-24 w-full h-full"
|
||||
>
|
||||
<img
|
||||
src="${assets.get('firefox_logo-only.svg')}"
|
||||
class="h-16 mt-1 mb-4"
|
||||
/>
|
||||
<img src="${assets.get('master-logo.svg')}" class="h-16 mt-1 mb-4" />
|
||||
<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')}
|
||||
</h1>
|
||||
<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>
|
||||
${state.translate('accountBenefitLargeFiles', {
|
||||
@@ -45,11 +42,11 @@ module.exports = function(trigger) {
|
||||
<input
|
||||
id="email-input"
|
||||
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')}
|
||||
/>
|
||||
<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')}"
|
||||
title="${state.translate('signInOnlyButton')}"
|
||||
id="email-submit"
|
||||
@@ -57,7 +54,7 @@ module.exports = function(trigger) {
|
||||
/>
|
||||
</form>
|
||||
<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')}"
|
||||
onclick=${cancel}
|
||||
>
|
||||
|
||||
@@ -13,15 +13,15 @@ module.exports = function() {
|
||||
<send-survey-dialog
|
||||
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.
|
||||
</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
|
||||
it better.
|
||||
</p>
|
||||
<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')}"
|
||||
title="Give feedback"
|
||||
href="${surveyUrl}"
|
||||
@@ -30,7 +30,7 @@ module.exports = function() {
|
||||
Give feedback
|
||||
</a>
|
||||
<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}"
|
||||
title="Skip"
|
||||
>
|
||||
|
||||
@@ -27,9 +27,9 @@ module.exports = function(state, emit) {
|
||||
<main class="main">
|
||||
${state.modal && modal(state, emit)}
|
||||
<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>
|
||||
${why}
|
||||
<a href="${url}" class="btn rounded-lg mt-8 px-8">
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
/* 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');
|
||||
|
||||
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">
|
||||
<defs>
|
||||
<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>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<symbol id="plus" viewBox="0 0 24 24">
|
||||
<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"/>
|
||||
<use fill="#0060df" xlink:href="#addfiles-a"/>
|
||||
<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"/>
|
||||
<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>
|
||||
</symbol>
|
||||
<use xlink:href="#plus"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 856 B After Width: | Height: | Size: 831 B |
@@ -1,8 +1,6 @@
|
||||
<?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">
|
||||
<!-- Generator: sketchtool 53 (72520) - https://sketchapp.com -->
|
||||
<title>6AF7DAB4-6456-44F2-AABE-F001D910B641</title>
|
||||
<desc>Created with sketchtool.</desc>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<symbol id="icon" viewBox="0 0 26 32">
|
||||
<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>
|
||||
</defs>
|
||||
@@ -14,14 +12,15 @@
|
||||
<mask id="mask-2" fill="white">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</mask>
|
||||
<use id="Mask" fill="#45A1FF" opacity="0.6" 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="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,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,22.6209117 L17.5412669,22.6209117" id="Path" stroke="#0060DF" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
||||
<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="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="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="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="currentColor" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</symbol>
|
||||
</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"?>
|
||||
<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">
|
||||
<!-- Generator: sketchtool 53 (72520) - https://sketchapp.com -->
|
||||
<title>728D143F-562C-4AE5-80DA-9DBBD9D647D8</title>
|
||||
<desc>Created with sketchtool.</desc>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Send_Sending" transform="translate(-770.000000, -481.000000)" fill="#0060DF">
|
||||
<g id="List-Item-3" transform="translate(744.000000, 350.000000)">
|
||||
<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>
|
||||
<svg width="12px" height="16px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<symbol id="icon" viewBox="0 0 12 16">
|
||||
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g transform="translate(-770.000000, -481.000000)" fill="currentColor">
|
||||
<g transform="translate(744.000000, 350.000000)">
|
||||
<g 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"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</symbol>
|
||||
</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"?>
|
||||
<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>
|
||||
<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>
|
||||
@@ -14,7 +11,7 @@
|
||||
<mask id="mask-2" fill="white">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</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>
|
||||
|
||||
|
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
|
||||
- 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/. -->
|
||||
<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
|
||||
|
||||
## 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
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const genmap = require('../build/generate_asset_map');
|
||||
const genmap = require('./generate_asset_map');
|
||||
const isServer = typeof genmap === 'function';
|
||||
let prefix = '';
|
||||
let manifest = {};
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# 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
|
||||
|
||||
Before building the Docker image, you must build the production assets:
|
||||
|
||||
```sh
|
||||
npm run build
|
||||
```
|
||||
|
||||
Then you can run either `docker build` or `docker-compose up`.
|
||||
|
||||
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.*
|
||||
|
||||
## Environment variables:
|
||||
|
||||
|
||||
9242
package-lock.json
generated
133
package.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "firefox-send",
|
||||
"description": "File Sharing Experiment",
|
||||
"version": "3.0.11",
|
||||
"version": "3.0.21",
|
||||
"author": "Mozilla (https://mozilla.org)",
|
||||
"repository": "mozilla/send",
|
||||
"homepage": "https://github.com/mozilla/send/",
|
||||
@@ -35,7 +35,8 @@
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged",
|
||||
"pre-push": "npm test",
|
||||
"post-merge": "npm install"
|
||||
"post-merge": "npm install",
|
||||
"post-checkout": "scripts/sync-npm-dependencies.sh"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
@@ -57,68 +58,69 @@
|
||||
"cache": true
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
"node": ">=10.0.0 <11.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.4.4",
|
||||
"@babel/plugin-proposal-class-properties": "^7.4.4",
|
||||
"@babel/core": "^7.7.2",
|
||||
"@babel/plugin-proposal-class-properties": "^7.7.0",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||
"@babel/preset-env": "^7.4.4",
|
||||
"@babel/preset-env": "^7.7.1",
|
||||
"@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",
|
||||
"@sentry/browser": "^5.8.0",
|
||||
"asmcrypto.js": "^0.22.0",
|
||||
"babel-loader": "^8.0.5",
|
||||
"babel-plugin-istanbul": "^5.1.4",
|
||||
"base64-js": "^1.3.0",
|
||||
"babel-loader": "^8.0.6",
|
||||
"babel-plugin-istanbul": "^5.2.0",
|
||||
"base64-js": "^1.3.1",
|
||||
"content-disposition": "^0.5.3",
|
||||
"copy-webpack-plugin": "^5.0.3",
|
||||
"core-js": "^3.0.1",
|
||||
"copy-webpack-plugin": "^5.0.5",
|
||||
"core-js": "^3.4.0",
|
||||
"crc": "^3.8.0",
|
||||
"cross-env": "^5.2.0",
|
||||
"css-loader": "^2.1.1",
|
||||
"cross-env": "^6.0.3",
|
||||
"css-loader": "^3.2.0",
|
||||
"css-mqpacker": "^7.0.0",
|
||||
"cssnano": "^4.1.10",
|
||||
"eslint": "^5.16.0",
|
||||
"eslint-plugin-mocha": "^5.3.0",
|
||||
"eslint-plugin-node": "^8.0.1",
|
||||
"eslint": "^6.6.0",
|
||||
"eslint-config-prettier": "^6.5.0",
|
||||
"eslint-plugin-mocha": "^6.2.1",
|
||||
"eslint-plugin-node": "^10.0.0",
|
||||
"eslint-plugin-security": "^1.4.0",
|
||||
"expose-loader": "^0.7.5",
|
||||
"extract-loader": "^3.1.0",
|
||||
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
||||
"fast-text-encoding": "^1.0.0",
|
||||
"file-loader": "^3.0.1",
|
||||
"fluent-intl-polyfill": "^0.1.0",
|
||||
"file-loader": "^4.2.0",
|
||||
"git-rev-sync": "^1.12.0",
|
||||
"html-loader": "^0.5.5",
|
||||
"http_ece": "^1.1.0",
|
||||
"husky": "^2.2.0",
|
||||
"lint-staged": "^8.1.6",
|
||||
"mocha": "^6.1.4",
|
||||
"husky": "^3.0.9",
|
||||
"intl-pluralrules": "^1.1.1",
|
||||
"lint-staged": "^9.4.2",
|
||||
"mocha": "^6.2.2",
|
||||
"morgan": "^1.9.1",
|
||||
"nanobus": "^4.4.0",
|
||||
"nanohtml": "^1.6.1",
|
||||
"nanohtml": "^1.9.0",
|
||||
"nanotiming": "^7.3.1",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"nyc": "^14.1.0",
|
||||
"nyc": "^14.1.1",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"postcss-preset-env": "^6.6.0",
|
||||
"prettier": "^1.17.0",
|
||||
"proxyquire": "^2.1.0",
|
||||
"puppeteer": "^1.15.0",
|
||||
"raven-js": "^3.27.0",
|
||||
"raw-loader": "^2.0.0",
|
||||
"redis-mock": "^0.43.0",
|
||||
"rimraf": "^2.6.3",
|
||||
"postcss-preset-env": "^6.7.0",
|
||||
"prettier": "^1.19.1",
|
||||
"proxyquire": "^2.1.3",
|
||||
"puppeteer": "^2.0.0",
|
||||
"raw-loader": "^3.1.0",
|
||||
"redis-mock": "^0.47.0",
|
||||
"rimraf": "^3.0.0",
|
||||
"script-loader": "^0.7.2",
|
||||
"sinon": "^7.3.2",
|
||||
"sinon": "^7.5.0",
|
||||
"string-hash": "^1.1.3",
|
||||
"stylelint": "^10.0.1",
|
||||
"stylelint-config-standard": "^18.3.0",
|
||||
"stylelint": "^11.1.1",
|
||||
"stylelint-config-standard": "^19.0.0",
|
||||
"stylelint-no-unsupported-browser-features": "^3.0.2",
|
||||
"svgo": "^1.2.2",
|
||||
"svgo-loader": "^2.2.0",
|
||||
"tailwindcss": "^0.7.4",
|
||||
"svgo": "^1.3.2",
|
||||
"svgo-loader": "^2.2.1",
|
||||
"tailwindcss": "^1.1.3",
|
||||
"val-loader": "^1.1.1",
|
||||
"wdio-docker-service": "^1.4.2",
|
||||
"wdio-dot-reporter": "0.0.10",
|
||||
@@ -128,39 +130,42 @@
|
||||
"wdio-selenium-standalone-service": "0.0.12",
|
||||
"wdio-spec-reporter": "^0.1.5",
|
||||
"webdriverio": "^4.14.4",
|
||||
"webpack": "^4.30.0",
|
||||
"webpack-cli": "^3.3.1",
|
||||
"webpack-dev-middleware": "^3.6.2",
|
||||
"webpack-dev-server": "^3.3.1",
|
||||
"webpack-manifest-plugin": "^2.0.4",
|
||||
"webpack": "4.38.0",
|
||||
"webpack-cli": "^3.3.10",
|
||||
"webpack-dev-middleware": "^3.7.2",
|
||||
"webpack-dev-server": "^3.9.0",
|
||||
"webpack-manifest-plugin": "^2.2.0",
|
||||
"webpack-unassert-loader": "^1.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@google-cloud/storage": "^2.5.0",
|
||||
"aws-sdk": "^2.449.0",
|
||||
"@dannycoates/express-ws": "^5.0.3",
|
||||
"@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",
|
||||
"choo": "^6.13.3",
|
||||
"choo": "^7.0.0",
|
||||
"cldr-core": "^35.1.0",
|
||||
"convict": "^4.4.1",
|
||||
"express": "^4.16.3",
|
||||
"express-ws": "github:dannycoates/express-ws",
|
||||
"fluent": "^0.12.0",
|
||||
"fluent-langneg": "^0.1.1",
|
||||
"configstore": "github:dannycoates/configstore#master",
|
||||
"convict": "^5.2.0",
|
||||
"express": "^4.17.1",
|
||||
"fxa-geodb": "^1.0.4",
|
||||
"helmet": "^3.17.0",
|
||||
"helmet": "^3.21.2",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mozlog": "^2.2.0",
|
||||
"node-fetch": "^2.5.0",
|
||||
"raven": "^2.6.4",
|
||||
"node-fetch": "^2.6.0",
|
||||
"redis": "^2.8.0",
|
||||
"selenium-standalone": "^6.15.6",
|
||||
"ua-parser-js": "^0.7.19",
|
||||
"websocket-stream": "^5.5.0"
|
||||
"ua-parser-js": "^0.7.20"
|
||||
},
|
||||
"availableLanguages": [
|
||||
"en-US",
|
||||
"ar",
|
||||
"ast",
|
||||
"bn-BD",
|
||||
"be",
|
||||
"bn",
|
||||
"br",
|
||||
"ca",
|
||||
"cak",
|
||||
"cs",
|
||||
@@ -175,9 +180,12 @@
|
||||
"es-CL",
|
||||
"es-ES",
|
||||
"es-MX",
|
||||
"et",
|
||||
"eu",
|
||||
"fi",
|
||||
"fr",
|
||||
"fy-NL",
|
||||
"he",
|
||||
"hr",
|
||||
"hsb",
|
||||
"hu",
|
||||
@@ -189,21 +197,32 @@
|
||||
"kab",
|
||||
"ko",
|
||||
"lt",
|
||||
"meh",
|
||||
"ml",
|
||||
"nb-NO",
|
||||
"nl",
|
||||
"nn-NO",
|
||||
"oc",
|
||||
"pa-IN",
|
||||
"pl",
|
||||
"ppl",
|
||||
"pt-BR",
|
||||
"pt-PT",
|
||||
"quc",
|
||||
"ro",
|
||||
"ru",
|
||||
"sk",
|
||||
"sl",
|
||||
"sq",
|
||||
"sr",
|
||||
"su",
|
||||
"sv-SE",
|
||||
"te",
|
||||
"th",
|
||||
"tr",
|
||||
"uk",
|
||||
"vi",
|
||||
"zgh",
|
||||
"zh-CN",
|
||||
"zh-TW"
|
||||
]
|
||||
|
||||
@@ -6,7 +6,7 @@ class TailwindExtractor {
|
||||
|
||||
const options = {
|
||||
plugins: [
|
||||
require('tailwindcss')('./tailwind.js'),
|
||||
require('tailwindcss')('./tailwind.config.js'),
|
||||
require('postcss-preset-env')
|
||||
]
|
||||
};
|
||||
|
||||
@@ -182,3 +182,5 @@ shareLinkDescription = شارِك الرابط الذي يصل إلى الملف
|
||||
shareLinkButton = شارِك الرابط
|
||||
# $name is the name of the file
|
||||
shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة
|
||||
trailheadPromo = يمكنك حماية خصوصيتك، طبعا. انضم إلى فَيَرفُكس.
|
||||
learnMore = اطّلع على المزيد.
|
||||
|
||||
@@ -1,31 +1,9 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = web eksperiment
|
||||
siteFeedback = Geri dönüş
|
||||
uploadPageHeader = Məxfi, Şifrələnmiş Fayl Paylaşma
|
||||
uploadPageExplainer = Fayllarınızı təhlükəsiz, məxfi, şifrələnmiş və daima onlayn qalmaması üçün avtomatik silinən keçidlə göndərin.
|
||||
uploadPageLearnMore = Ətraflı öyrən
|
||||
uploadPageDropMessage = Yükləmək üçün faylınızı buraya daşıyın
|
||||
uploadPageSizeMessage = Xidmətin daha yaxşı işləməsi üçün faylınız 1 GB-dan az olmalıdır
|
||||
uploadPageBrowseButton = Kompüterinizdən fayl seçin
|
||||
uploadPageBrowseButton1 = Yüklənəcək faylı seçin
|
||||
uploadPageMultipleFilesAlert = Birdən çox fayl və ya qovluq yükləmə hələlik dəstəklənmir.
|
||||
uploadPageBrowseButtonTitle = Fayl yüklə
|
||||
uploadingPageProgress = { $filename } ({ $size }) yüklənir
|
||||
importingFile = İdxal edilir…
|
||||
verifyingFile = Təsdiqlənir…
|
||||
encryptingFile = Şifrələnir...
|
||||
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 =
|
||||
{ $num ->
|
||||
[one] 1 endirmə
|
||||
@@ -36,76 +14,26 @@ timespanHours =
|
||||
[one] 1 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ü!
|
||||
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
|
||||
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
|
||||
downloadNotification = Endirməniz 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 })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
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!
|
||||
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.
|
||||
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.
|
||||
# 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?
|
||||
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ə
|
||||
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
|
||||
deleteButtonHover = Sil
|
||||
copyUrlHover = Keçidi Köçürt
|
||||
footerLinkLegal = Hüquqi
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilot Haqqında
|
||||
footerLinkPrivacy = Məxfilik
|
||||
footerLinkTerms = Şərtlə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.
|
||||
reportIPInfringement = Əqli-mülkiyyət pozuntusu bildir
|
||||
javascriptRequired = Firefox Send üçün JavaScript lazımdır
|
||||
whyJavascript = Firefox Send niyə JavaScript tələb edir?
|
||||
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
|
||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||
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
|
||||
maxPasswordLength = Maksimum parol uzunluğu: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
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ş
|
||||
|
||||
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 = আপনার ইমেইল দিন
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন
|
||||
signInButton = সাইন ইন/আপ
|
||||
signInOnlyButton = সাইন ইন
|
||||
accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন
|
||||
@@ -145,3 +145,11 @@ 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 = { -send-brand } এর মাধ্যমে "{ $name }" ডাউনলোড করুন: সরল, নিরাপদ ফাইল শেয়ারিং
|
||||
trailheadPromo = আপনার গোপনীয়তা রক্ষা করার একটি উপায় আছে। Firefox এ যোগ দিন।
|
||||
learnMore = আরও জানুন।
|
||||
182
public/locales/br/send.ftl
Normal file
@@ -0,0 +1,182 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteFeedback = Roit hoc'h ali
|
||||
importingFile = Oc'h enporzhiañ …
|
||||
encryptingFile = Oc'h enrinegañ..
|
||||
decryptingFile = Oc'h ezrinegañ...
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] { $num } bellgargadenn
|
||||
[two] { $num } bellgargadenn
|
||||
[few] { $num } fellgargadenn
|
||||
[many] { $num } a bellgargadennoù
|
||||
*[other] { $num } pellgargadenn
|
||||
}
|
||||
timespanHours =
|
||||
{ $num ->
|
||||
[one] { $num } eur
|
||||
[two] { $num } eur
|
||||
[few] { $num } eur
|
||||
[many] { $num } a eurioù
|
||||
*[other] { $num } eur
|
||||
}
|
||||
copiedUrl = Eilet!
|
||||
unlockInputPlaceholder = Ger-tremen
|
||||
unlockButtonLabel = Dibrennañ
|
||||
downloadButtonLabel = Pellgargañ
|
||||
downloadFinish = Pellgargadur echu
|
||||
fileSizeProgress = ({ $partialSize } war { $totalSize })
|
||||
sendYourFilesLink = Esaeit Firefox Send
|
||||
errorPageHeader = Degouezhet ez eus bet ur fazi!
|
||||
fileTooBig = Re vras eo ar restr-mañ evit e pellgas. Rankout a ra bezañ nebeutoc'h eget { $size }
|
||||
linkExpiredAlt = Ere diamzeret
|
||||
notSupportedHeader = N'eo ket skoret ho merdeer.
|
||||
notSupportedLink = Perak n'eo ket skoret ma merdeer?
|
||||
notSupportedOutdatedDetail = Siwazh n'eo ket skoret ar c'halvezerezhioù implijet evit Firefox Send gant an handelv-mañ eus Firefox. Ret e vo deoc'h hizivaat ho merdeer.
|
||||
updateFirefox = Hizivaat Firefox
|
||||
deletePopupCancel = Nullañ
|
||||
deleteButtonHover = Dilemel
|
||||
footerLinkLegal = Lezennel
|
||||
footerLinkPrivacy = Buhez prevez
|
||||
footerLinkCookies = Toupinoù
|
||||
passwordTryAgain = Ger-tremen direizh. Klaskit en-dro.
|
||||
javascriptRequired = Firefox Send a azgoulenn Javascript
|
||||
whyJavascript = Perak e azgoulenn Firefox Send Javascript?
|
||||
enableJavascript = Gweredekait Javascript ha klaskit en-dro.
|
||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||
expiresHoursMinutes = { $hours }e { $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 = Hirder brasañ aotreet evit ar ger-tremen: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
passwordSetError = N'haller ket despizañ ar ger-tremen
|
||||
|
||||
## 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 = Rannañ restroù en un doare eeun ha prevez
|
||||
introDescription = A-drugarez da { -send-brand } a c'hallit rannañ restroù gant un enrinegañ penn-ouzh-penn hag un ere a ziamzero ent emgefreek. Evel-se e c'hallit mirout ar pezh a rannit prevez ha bezañ sur ne chomo ket ho traoù enlinenn da viken.
|
||||
notifyUploadEncryptDone = Enrineget eo ho restr ha prest eo da vezañ kaset
|
||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||
archiveExpiryInfo = Diamzeriñ a raio goude { $downloadCount } pe { $timespan }
|
||||
timespanMinutes =
|
||||
{ $num ->
|
||||
[one] { $num } vunutenn
|
||||
[two] { $num } vunutenn
|
||||
[few] { $num } munutenn
|
||||
[many] { $num } a vunutennoù
|
||||
*[other] { $num } munutenn
|
||||
}
|
||||
timespanDays =
|
||||
{ $num ->
|
||||
[one] { $num } devezh
|
||||
[two] { $num } zevezh
|
||||
[few] { $num } devezh
|
||||
[many] { $num } a zevezhioù
|
||||
*[other] { $num } devezh
|
||||
}
|
||||
timespanWeeks =
|
||||
{ $num ->
|
||||
[one] { $num } sizhun
|
||||
[two] { $num } sizhun
|
||||
[few] { $num } sizhun
|
||||
[many] { $num } a sizhunioù
|
||||
*[other] { $num } sizhun
|
||||
}
|
||||
fileCount =
|
||||
{ $num ->
|
||||
[one] { $num } restr
|
||||
[two] { $num } restr
|
||||
[few] { $num } restr
|
||||
[many] { $num } a restroù
|
||||
*[other] { $num } restr
|
||||
}
|
||||
# byte abbreviation
|
||||
bytes = e
|
||||
# kibibyte abbreviation
|
||||
kb = Ke
|
||||
# mebibyte abbreviation
|
||||
mb = Me
|
||||
# gibibyte abbreviation
|
||||
gb = Ge
|
||||
# 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 = Ment hollek: { $size }
|
||||
# the next line after the colon contains a file name
|
||||
copyLinkDescription = Eilit an ere evit rannañ ho restr
|
||||
copyLinkButton = Eilañ an ere
|
||||
downloadTitle = Pellgargañ ar restroù
|
||||
downloadDescription = Dre { -send-brand } eo bet rannet ar restr-mañ, gant un enrinegañ penn-ouzh-penn hag un ere a ziamzer ent emgefreek.
|
||||
trySendDescription = Esaeit { -send-brand } evit rannañ restroù en un doare eeun ha prevez.
|
||||
# count will always be > 10
|
||||
tooManyFiles =
|
||||
{ $count ->
|
||||
[one] N'haller pellgas nemet { $count } restr er memes mare.
|
||||
[two] N'haller pellgas nemet { $count } restr er memes mare.
|
||||
[few] N'haller pellgas nemet { $count } restr er memes mare.
|
||||
[many] N'haller pellgas nemet { $count } a restroù er memes mare.
|
||||
*[other] N'haller pellgas nemet { $count } restr er memes mare.
|
||||
}
|
||||
# count will always be > 10
|
||||
tooManyArchives =
|
||||
{ $count ->
|
||||
[one] Aotreet eo{ $count } diell nemetken.
|
||||
[two] Aotreet eo{ $count } ziell nemetken.
|
||||
[few] Aotreet eo{ $count } diell nemetken.
|
||||
[many] Aotreet eo{ $count } a zielloù nemetken.
|
||||
*[other] Aotreet eo{ $count } diell nemetken.
|
||||
}
|
||||
expiredTitle = Diamzeret eo an ere.
|
||||
notSupportedDescription = { -send-brand } n'aio ket en-dro war ar merdeer-mañ. { -send-short-brand } a za en-dro gwelloc'h gant handelv diwezhañ { -firefox }, ha mont a raio en-dro gant handelv bremanel lodenn vrasañ ar merdeerioù.
|
||||
downloadFirefox = Pellgargañ { -firefox }
|
||||
legalTitle = Evezhiadenn a fed buhez prevez { -send-short-brand }
|
||||
legalDateStamp = Handelv 1.0, d'an 12 a viz Meurzh 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 }e { $minutes }m
|
||||
addFilesButton = Diuzit ur restr da bellgas
|
||||
uploadButton = Pellgas
|
||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||
dragAndDropFiles = Riklit ha laoskit restroù
|
||||
# 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 = pe klikit evit kas betek { $size }
|
||||
addPassword = Gwareziñ gant ur ger-tremen
|
||||
emailPlaceholder = Enankit ho chomlec'h postel
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Kennaskit evit kas betek { $size }
|
||||
signInOnlyButton = Kennaskañ
|
||||
accountBenefitTitle = Krouit ur gont { -firefox } pe kennaskit
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = Rannit restroù betek { $size }
|
||||
accountBenefitDownloadCount = Rannit restroù gant muioc'h a dud
|
||||
accountBenefitTimeLimit =
|
||||
{ $count ->
|
||||
[one] Dalc'hit an ereoù oberiant e-pad { $count } devezh
|
||||
[two] Dalc'hit an ereoù oberiant e-pad { $count } zevezh
|
||||
[few] Dalc'hit an ereoù oberiant e-pad { $count } devezh
|
||||
[many] Dalc'hit an ereoù oberiant e-pad { $count } a zevezhioù
|
||||
*[other] Dalc'hit an ereoù oberiant e-pad { $count } devezh
|
||||
}
|
||||
accountBenefitSync = Merit ar restroù rannet gant forzh peseurt trevnad
|
||||
accountBenefitMoz = Gouzout hiroc'h a-zivout gwazerezhioù all { -mozilla }
|
||||
signOut = Digennaskañ
|
||||
okButton = Mat eo
|
||||
downloadingTitle = O pellgargañ
|
||||
noStreamsWarning = Posupl eo ne vefe ket gouest ar merdeer-mañ da ezrinegañ ur restr ken bras.
|
||||
noStreamsOptionCopy = Eilit an ere evit digeriñ anezhañ en ur merdeer all
|
||||
noStreamsOptionFirefox = Esaeit hor merdeer karetañ
|
||||
noStreamsOptionDownload = Kenderc'hel gant ar merdeer-mañ
|
||||
downloadFirefoxPromo = { -send-short-brand } a zo kinniget deoc'h gant ar { -firefox } nevez-flamm.
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = Rannit an ere etrezek ho restr:
|
||||
shareLinkButton = Rannañ an ere
|
||||
# $name is the name of the file
|
||||
shareMessage = Pellgargañ "{ $name }" gant { -send-brand }: rannañ restroù en un doare eeun ha prevez
|
||||
trailheadPromo = Un doare a zo da wareziñ ho puhez prevez. Tremenit da Firefox.
|
||||
learnMore = Gouzout hiroc'h.
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Compartiu l'enllaç al vostre fitxer:
|
||||
shareLinkButton = Comparteix l'enllaç
|
||||
# $name is the name of the file
|
||||
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
|
||||
siteFeedback = Rutzijol
|
||||
importingFile = Tajin nijik…
|
||||
encryptingFile = Tajin newäx rusik'ixik...
|
||||
encryptingFile = Tajin newäx rusik'ixik…
|
||||
decryptingFile = Tajin netamäx rusik'ixik...
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Nakomonij ri ximonel rik'in ri awokisab'al:
|
||||
shareLinkButton = Tikomonïx ximonel
|
||||
# $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
|
||||
trailheadPromo = K'o jun rub'anikil richin nachajij ri awichinanem. Tatunu' awi' rik'in ri Firefox.
|
||||
learnMore = Tetamäx ch'aqa' chik.
|
||||
|
||||
@@ -196,5 +196,5 @@ shareLinkDescription = Sdílet odkaz na soubor:
|
||||
shareLinkButton = Sdílet odkaz
|
||||
# $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ů
|
||||
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.
|
||||
|
||||
@@ -187,3 +187,5 @@ shareLinkDescription = Rhannu'r ddolen i'ch ffeil:
|
||||
shareLinkButton = Rhannu'r ddolen
|
||||
# $name is the name of the file
|
||||
shareMessage = Llwytho i lawr “{ $name }” gyda { -send-brand }: rhannu ffeiliau syml a diogel
|
||||
trailheadPromo = Mae ffordd o ddiogelu eich preifatrwydd. Ymunwch â Firefox.
|
||||
learnMore = Dysgu rhagor.
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Del linket til din fil:
|
||||
shareLinkButton = Del link
|
||||
# $name is the name of the file
|
||||
shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling
|
||||
trailheadPromo = Beskyt dine digitale rettigheder. Slut dig til Firefox.
|
||||
learnMore = Læs mere.
|
||||
|
||||
@@ -169,3 +169,5 @@ shareLinkDescription = Źělśo wótkaz k swójej dataji:
|
||||
shareLinkButton = Wótkaz źěliś
|
||||
# $name is the name of the file
|
||||
shareMessage = Ześěgniśo „{ $name }“ z { -send-brand }: jadnore, wěste źělenje datajow
|
||||
trailheadPromo = Jo móžnosć, wašu priwatnosć šćitaś. Pśiźćo k Firefox.
|
||||
learnMore = Dalšne informacije.
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Μοιραστείτε το σύνδεσμο του αρ
|
||||
shareLinkButton = Κοινή χρήση συνδέσμου
|
||||
# $name is the name of the file
|
||||
shareMessage = Λήψη του “{ $name }” με το { -send-brand }: απλός και ασφαλής διαμοιρασμός αρχείων
|
||||
trailheadPromo = Υπάρχει τρόπος να προστατέψετε το απόρρητό σας. Γίνετε μέλος του Firefox.
|
||||
learnMore = Μάθετε περισσότερα.
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Share the link to your file:
|
||||
shareLinkButton = Share link
|
||||
# $name is the name of the file
|
||||
shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing
|
||||
trailheadPromo = There is a way to protect your privacy. Join Firefox.
|
||||
learnMore = Learn more.
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Compartir el enlace con tu dispositivo:
|
||||
shareLinkButton = Compartir el enlace
|
||||
# $name is the name of the file
|
||||
shareMessage = Descargar "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura
|
||||
trailheadPromo = Hay una forma de proteger tu privacidad. Unite a Firefox.
|
||||
learnMore = Conocer más.
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Comparte el enlace a tu dispositivo:
|
||||
shareLinkButton = Compartir enlace
|
||||
# $name is the name of the file
|
||||
shareMessage = Baja "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura
|
||||
trailheadPromo = Hay una forma de proteger tu privacidad. Únete a Firefox.
|
||||
learnMore = Aprender más.
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Compartir el enlace a tu archivo:
|
||||
shareLinkButton = Compartir enlace
|
||||
# $name is the name of the file
|
||||
shareMessage = Descargar “{ $name }” con { -send-brand }: comparte archivos de forma segura y sencilla
|
||||
trailheadPromo = Existe la forma de proteger tu privacidad. Únete a Firefox.
|
||||
learnMore = Saber más.
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
title = Firefox Send
|
||||
siteFeedback = Comentario
|
||||
importingFile = Importando...
|
||||
encryptingFile = Encriptando...
|
||||
decryptingFile = Desencriptando...
|
||||
encryptingFile = Encriptando…
|
||||
decryptingFile = Desencriptando…
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] 1 descarga
|
||||
@@ -126,7 +126,7 @@ addPassword = Protegido con contraseña
|
||||
emailPlaceholder = Ingresa tu correo electrónico
|
||||
# $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 }
|
||||
signInButton = Iniciar sesión/registrarse
|
||||
signInOnlyButton = 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")
|
||||
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
|
||||
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
||||
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
|
||||
# $name is the name of the file
|
||||
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
|
||||
errorPageHeader = Zerbait gaizki joan da!
|
||||
fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du.
|
||||
linkExpiredAlt = Lotura iraungita
|
||||
linkExpiredAlt = Lotura iraungi da
|
||||
notSupportedHeader = Zure nabigatzailea ez da 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.
|
||||
@@ -50,10 +50,34 @@ passwordSetError = Pasahitz hau ezin da ezarri
|
||||
|
||||
# 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 = 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
|
||||
# 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
|
||||
bytes = B
|
||||
# kibibyte abbreviation
|
||||
@@ -64,9 +88,33 @@ mb = MB
|
||||
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 = Tamaina guztira: { $size }
|
||||
# the next line after the colon contains a file name
|
||||
copyLinkDescription = Kopiatu fitxategia partekatzeko lotura:
|
||||
copyLinkButton = Kopiatu lotura
|
||||
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 }
|
||||
legalTitle = { -send-short-brand } pribatutasun-oharra
|
||||
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
|
||||
uploadButton = Igo
|
||||
# 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
|
||||
addPassword = Babestu pasahitzarekin
|
||||
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
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak
|
||||
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.
|
||||
title = Firefox Send
|
||||
siteSubtitle = آزمایش وب
|
||||
siteFeedback = بازخورد
|
||||
uploadPageHeader = اشتراکگذاری پروندهها، رمزنگاری شده و خصوصی
|
||||
uploadPageExplainer = پرونده های خود را به صورت ایمن، خصوصی و رمزنگاری شده با تعیین تاریخ انقضا خودکار ارسال کنید تا اطمینان پیدا کنید چیزهای شما همیشه آنلاین باقی نماند.
|
||||
uploadPageLearnMore = بیشتر بدانید
|
||||
uploadPageDropMessage = برای شروع بارگذاری پروندههای خود را اینجا بیاندازید
|
||||
uploadPageSizeMessage = برای بیشترین قابلیت اطمینان، بهتر است که پروندهتان کمتر از ۱ گیگابایت باشد
|
||||
uploadPageBrowseButton = یک پرونده را از روی کامپیوتر خود انتخاب کنید
|
||||
uploadPageBrowseButton1 = یک پرونده را برای بارگذاری انتخاب کنید
|
||||
uploadPageMultipleFilesAlert = بارگذاری چندین پرونده یا یک پوشه در حال حاضر پشتیبانی نمیشود.
|
||||
uploadPageBrowseButtonTitle = بارگذاری پرونده
|
||||
uploadingPageProgress = در حال بارگذاری پرونده { $filename } ({ $size })
|
||||
importingFile = در حال وارد کردن…
|
||||
verifyingFile = در حال تایید…
|
||||
encryptingFile = در حال رمزنگاری…
|
||||
decryptingFile = در حال رمزگشایی…
|
||||
notifyUploadDone = بارگذاری شما پایان یافت.
|
||||
uploadingPageMessage = به محض بارگذاری پرونده شما قادر خواهید بود برای آن گزینه انقضا تعیین کنید.
|
||||
uploadingPageCancel = لغو بارگذاری
|
||||
uploadCancelNotification = بارگذاری شما لغو شد
|
||||
uploadingPageLargeFileMessage = پرونده بزرگ است و ممکن است بارگذاری آن مدتی طول بکشد. محکم بشینید!
|
||||
uploadingFileNotification = هر وقت بارگذاری تمام شد به من اطلاع بده.
|
||||
uploadSuccessConfirmHeader = آماده برای ارسال
|
||||
uploadSvgAlt = بارگذاری
|
||||
uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد.
|
||||
expireInfo = این پیوند به فایل شما پس از { $downloadCount } یا { $timespan } منقضی خواهد شد.
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] ۱ بارگیری
|
||||
@@ -36,76 +14,26 @@ timespanHours =
|
||||
[one] ۱ ساعت
|
||||
*[other] { $num } ساعت
|
||||
}
|
||||
copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename }
|
||||
copyUrlFormButton = رونوشت به کلیپبورد
|
||||
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 = گذرواژه
|
||||
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 = بارگیری
|
||||
downloadNotification = بارگیری شما کامل شد.
|
||||
downloadFinish = بارگیری کامل شد
|
||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } از { $totalSize })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send را امتحان کنید
|
||||
downloadingPageProgress = دریافت { $filename } ({ $size })
|
||||
downloadingPageMessage = لطفا این زبانه را باز بگذارید در حالی که ما فایل شما را دریافت میکنیم و کدگذاری میکنیم.
|
||||
errorAltText = خطا در بارگذاری
|
||||
errorPageHeader = چیزی دچار اشکال شده است!
|
||||
errorPageMessage = خطایی در هنگام بارگذاری پرونده شما رخ داده است.
|
||||
errorPageLink = پرونده دیگری ارسال کنید.
|
||||
fileTooBig = این پرونده بسیار حجیم است. حجم آن میبایستی کم تر { $size } باشد.
|
||||
linkExpiredAlt = پیوند منقضی شده است
|
||||
expiredPageHeader = پیوند منقضی شده است یا در از همان ابتدا وجود نداشته است!
|
||||
notSupportedHeader = مرورگر شما پشتیبانی نمیکند.
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = متاسفانه این مرورگر این تکنولوژی وب را که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما بایستی مرورگری دیگری را امتحان کنید. پیشنهاد ما به شما فایرفاکس است !
|
||||
notSupportedLink = چرا مرورگر من پشتیبانی نمیکند؟
|
||||
notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما نیاز دارید تا مرورگر خود را بروز کنید.
|
||||
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 = انصراف
|
||||
deleteButtonHover = حذف
|
||||
copyUrlHover = رونوشت از نشانی
|
||||
footerLinkLegal = ملاحظات حقوقی
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = درباره Test Pilot
|
||||
footerLinkPrivacy = حریمخصوصی
|
||||
footerLinkTerms = شرایط
|
||||
footerLinkCookies = کوکیها
|
||||
requirePasswordCheckbox = دریافت این پرونده نیاز به گذرواژه دارد
|
||||
addPasswordButton = افزودن گذرواژه
|
||||
changePasswordButton = تغییر
|
||||
passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید.
|
||||
reportIPInfringement = گزارش تخلف IP
|
||||
javascriptRequired = Firefox Send نیازمند جاوااسکریپت است
|
||||
whyJavascript = چرا Firefox Send جاوااسکریپت لازم داد؟
|
||||
enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید.
|
||||
@@ -113,9 +41,26 @@ enableJavascript = لطفا جاوااسکریپت را فعال کنید و م
|
||||
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 a password is successfully set
|
||||
passwordIsSet = گذرواژه تنظیم شد
|
||||
# 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 = فایرفاکس
|
||||
-mozilla = موزیلا
|
||||
introTitle = اشتراکگذاری ساده و خصوصیِ پروندهها
|
||||
# byte abbreviation
|
||||
bytes = B
|
||||
# kibibyte abbreviation
|
||||
kb = KB
|
||||
# mebibyte abbreviation
|
||||
mb = MB
|
||||
# gibibyte abbreviation
|
||||
gb = GB
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
totalSize = حجم کل: { $size }
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Jaa linkki tiedostoosi:
|
||||
shareLinkButton = Jaa linkki
|
||||
# $name is the name of the file
|
||||
shareMessage = Lataa tiedosto ”{ $name }” { -send-brand } -palvelusta: yksinkertaista ja turvallista tiedostonjakoa
|
||||
trailheadPromo = On tapa suojata yksityisyyttään. Liity Firefoxiin.
|
||||
learnMore = Lue lisää.
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Diel de keppeling nei jo bestân:
|
||||
shareLinkButton = Keppeling diele
|
||||
# $name is the name of the file
|
||||
shareMessage = Download ‘{ $name }’ mei { -send-brand }: ienfâldich, feilich bestannen diele
|
||||
trailheadPromo = Der is in manier om jo privacy te beskermjen. Doch mei mei Firefox.
|
||||
learnMore = Mear ynfo.
|
||||
|
||||
151
public/locales/gn/send.ftl
Normal file
@@ -0,0 +1,151 @@
|
||||
# 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õ?
|
||||
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
|
||||
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
|
||||
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.
|
||||
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.
|
||||
title = Firefox Send
|
||||
siteSubtitle = ניסוי אינטרנט
|
||||
siteFeedback = משוב
|
||||
uploadPageHeader = שיתוף קבצים פרטי, מוצפן
|
||||
uploadPageExplainer = לשלוח קבצים דרך קישור בטוח, פרטי ומוצפן שפג אוטומטית, כדי לוודא שהתכנים הפרטיים שלך לא יהיו ברשת לנצח.
|
||||
uploadPageLearnMore = מידע נוסף
|
||||
uploadPageDropMessage = יש לגרור קבצים לכאן כדי להתחיל בהעלאה
|
||||
uploadPageSizeMessage = להשגת ביצועים מיטביים, מוטב לשמור על הקובץ מתחת לגודל של 1 ג״ב
|
||||
uploadPageBrowseButton1 = נא לבחור קובץ להעלאה
|
||||
uploadPageMultipleFilesAlert = העלאה של מספר קבצים או ספריה אינה נתמכת כרגע.
|
||||
uploadPageBrowseButtonTitle = העלאת קובץ
|
||||
uploadingPageProgress = { $filename } ({ $size }) בהעלאה
|
||||
importingFile = מתבצע ייבוא...
|
||||
verifyingFile = מתבצע אימות…
|
||||
importingFile = מתבצע ייבוא…
|
||||
encryptingFile = מתבצעת הצפנה...
|
||||
decryptingFile = מתבצע פענוח...
|
||||
notifyUploadDone = ההעלאה שלך הסתיימה
|
||||
uploadingPageMessage = אחרי שהקובץ שלך יעלה, ניתן יהיה להגדיר אפשרויות תפוגה.
|
||||
uploadCancelNotification = ההעלאה שלך בוטלה.
|
||||
uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות!
|
||||
uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה.
|
||||
uploadSuccessConfirmHeader = מוכן לשליחה
|
||||
uploadSvgAlt = העלאה
|
||||
uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות.
|
||||
copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename }
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] הורדה אחת
|
||||
*[other] { $num } הורדות
|
||||
}
|
||||
timespanHours =
|
||||
{ $num ->
|
||||
[one] שעה אחת
|
||||
[two] שעתיים
|
||||
*[other] { $num } שעות
|
||||
}
|
||||
copiedUrl = הועתק!
|
||||
deleteFileButton = מחיקת קובץ
|
||||
sendAnotherFileLink = שליחת קובץ נוסף
|
||||
# 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).
|
||||
unlockInputPlaceholder = ססמה
|
||||
unlockButtonLabel = שחרור נעילה
|
||||
downloadButtonLabel = הורדה
|
||||
downloadNotification = ההורדה הושלמה.
|
||||
downloadFinish = ההורדה הושלמה
|
||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
|
||||
downloadingPageProgress = בהורדה: { $filename } ({ $size })
|
||||
errorAltText = תקלה בהעלאה
|
||||
sendYourFilesLink = נסו את Firefox Send
|
||||
errorPageHeader = משהו השתבש!
|
||||
errorPageLink = שליחת קובץ נוסף
|
||||
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
|
||||
linkExpiredAlt = הקישור פג
|
||||
notSupportedHeader = הדפדפן שלך לא נתמך.
|
||||
notSupportedLink = למה אין תמיכה בדפדפן שלי?
|
||||
downloadFirefoxButtonSub = הורדה בחינם
|
||||
uploadedFile = קובץ
|
||||
copyFileList = העתקת כתובת
|
||||
# expiryFileList is used as a column header
|
||||
expiryFileList = יפוג בעוד
|
||||
deleteFileList = מחיקה
|
||||
nevermindButton = לא משנה
|
||||
legalHeader = תנאי שירות ופרטיות
|
||||
deletePopupText = למחוק דף זה?
|
||||
deletePopupYes = כן
|
||||
notSupportedOutdatedDetail = לצערנו גרסת Firefox זו לא תומכת בטכנולוגית הרשת שמפעילה את Firefox Send. יש לעדכן את הגרסה של הדפדפן שלך.
|
||||
updateFirefox = עדכון Firefox
|
||||
deletePopupCancel = ביטול
|
||||
deleteButtonHover = מחיקה
|
||||
copyUrlHover = העתקת קישור
|
||||
footerLinkLegal = מידע משפטי
|
||||
footerLinkPrivacy = פרטיות
|
||||
footerLinkTerms = תנאי שימוש
|
||||
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 = מידע נוסף.
|
||||
|
||||
@@ -160,3 +160,5 @@ shareLinkDescription = Dijelite poveznicu na svoju datoteku:
|
||||
shareLinkButton = Dijeli poveznicu
|
||||
# $name is the name of the file
|
||||
shareMessage = Preuzmite “{ $name }” sa { -send-brand }: jednostavno i sigurno dijeljenje datoteka
|
||||
trailheadPromo = Postoji način da zaštitite svoju privatnost. Pridružite se Firefoxu.
|
||||
learnMore = Saznajte više.
|
||||
|
||||
@@ -169,3 +169,5 @@ shareLinkDescription = Dźělće wotkaz k swojej dataji:
|
||||
shareLinkButton = Wotkaz dźělić
|
||||
# $name is the name of the file
|
||||
shareMessage = Sćehńće „{ $name }“ z { -send-brand }: jednore, wěste dźělenje datajow
|
||||
trailheadPromo = Je móžnosć, wašu priwatnosć škitać. Přińdźće k Firefox.
|
||||
learnMore = Dalše informacije.
|
||||
|
||||
@@ -151,3 +151,5 @@ shareLinkDescription = Ossza meg a fájlja hivatkozását:
|
||||
shareLinkButton = Hivatkozás megosztása
|
||||
# $name is the name of the file
|
||||
shareMessage = „{ $name }” letöltése a { -send-brand } segítségével: egyszerű, biztonságos fájlmegosztás
|
||||
trailheadPromo = Védje meg a magánszféráját. Csatlakozzon a Firefoxhoz.
|
||||
learnMore = További tudnivalók.
|
||||
|
||||
@@ -26,7 +26,7 @@ fileTooBig = Iste file es troppo grande pro lo cargar. Illo debe ser inferior a
|
||||
linkExpiredAlt = Ligamine expirate
|
||||
notSupportedHeader = Tu navigator non es supportate
|
||||
notSupportedLink = Perque iste navigator non es 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
|
||||
deletePopupCancel = Cancellar
|
||||
deleteButtonHover = Deler
|
||||
@@ -44,7 +44,7 @@ expiresMinutes = { $minutes }m
|
||||
# A short status message shown when the user enters a long password
|
||||
maxPasswordLength = Maxime longor del contrasigno: { $length }
|
||||
# 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
|
||||
|
||||
@@ -123,10 +123,10 @@ dragAndDropFiles = Traher e deponer files
|
||||
# $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 }
|
||||
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")
|
||||
signInSizeBump = Accede pro inviar usque { $size }
|
||||
signInOnlyButton = Authentica te
|
||||
signInSizeBump = Aperi session pro inviar usque a { $size }
|
||||
signInOnlyButton = Aperir session
|
||||
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")
|
||||
accountBenefitLargeFiles = Comparti files usque { $size }
|
||||
@@ -136,9 +136,9 @@ accountBenefitTimeLimit =
|
||||
[one] Retene active le ligamine pro 1 die
|
||||
*[other] Retene active le ligamine pro { $count } dies
|
||||
}
|
||||
accountBenefitSync = Gere files compartite ab ulle apparato
|
||||
accountBenefitSync = Gere files compartite ab non importa qual dispositivo
|
||||
accountBenefitMoz = Discoperi altere servicios de { -mozilla }
|
||||
signOut = Disconnecter
|
||||
signOut = Clauder session
|
||||
okButton = OK
|
||||
downloadingTitle = Discargamento
|
||||
noStreamsWarning = Iste navigator pote non pote decifrar un file assi grande.
|
||||
|
||||
@@ -142,3 +142,5 @@ shareLinkDescription = Bagikan tautan ke berkas Anda:
|
||||
shareLinkButton = Bagikan tautan
|
||||
# $name is the name of the file
|
||||
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.
|
||||
|
||||
26
public/locales/ixl/send.ftl
Normal file
@@ -0,0 +1,26 @@
|
||||
# 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
|
||||
|
||||
## Send version 2 strings
|
||||
|
||||
@@ -135,8 +135,11 @@ downloadingTitle = ダウンロード中
|
||||
noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。
|
||||
noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください
|
||||
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 = 詳細情報
|
||||
|
||||
@@ -54,6 +54,10 @@ passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = Afessas, beṭṭu n ifuyla s wudem uslig
|
||||
introDescription = { -send-brand } ad k(kem)-yeǧǧ ad tebḍuḍ ifuyla iwgelhanensi ṭṭerf ɣer ṭṭerf akked useɣwen ara yemmten s wudem awurman. Daɣen, ad tizmireḍ ad tḥ€rzeḍ ayen i tbeṭṭuḍ s wudem uslig daɣen ad temneḍ imi agbur-ik ur yettɣimi ara srid 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 =
|
||||
{ $num ->
|
||||
[one] 1 n tsedat
|
||||
@@ -90,17 +94,62 @@ totalSize = Tuɣzi s umata: { $size }
|
||||
copyLinkDescription = Nɣel aseɣwen akken ad tebḍuḍ afaylu-inek
|
||||
copyLinkButton = Nɣel aseɣwen
|
||||
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.
|
||||
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 }
|
||||
legalTitle = Tasertit tabaḍnit n { -send-short-brand }
|
||||
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ḍ
|
||||
uploadButton = Sali
|
||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||
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
|
||||
emailPlaceholder = Sekcem imayl inek
|
||||
signInButton = Kcem/jerred
|
||||
# $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ɣ
|
||||
okButton = IH
|
||||
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
|
||||
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
|
||||
# $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.
|
||||
|
||||
@@ -4,8 +4,8 @@ siteFeedback = 사용자 의견
|
||||
importingFile = 가져오는 중…
|
||||
encryptingFile = 암호화 중…
|
||||
decryptingFile = 복호화 중…
|
||||
downloadCount = { $num } 다운로드
|
||||
timespanHours = 1 시간
|
||||
downloadCount = 다운로드 { $num }회
|
||||
timespanHours = { $num }시간
|
||||
copiedUrl = 복사 완료!
|
||||
unlockInputPlaceholder = 비밀번호
|
||||
unlockButtonLabel = 잠금 해제
|
||||
@@ -49,7 +49,7 @@ 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 } 후 만료됨
|
||||
archiveExpiryInfo = { $downloadCount } 혹은 { $timespan } 후 만료됨
|
||||
timespanMinutes =
|
||||
{ $num ->
|
||||
*[other] { $num }분
|
||||
@@ -112,7 +112,7 @@ addPassword = 비밀번호로 파일 보호
|
||||
emailPlaceholder = 이메일 입력
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인
|
||||
signInButton = 로그인/등록
|
||||
signInOnlyButton = 로그인
|
||||
accountBenefitTitle = { -firefox } 계정을 하나 만들거나, 로그인
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = { $size }까지의 파일 공유
|
||||
@@ -130,3 +130,11 @@ noStreamsWarning = 이 브라우저는 이렇게 큰 용량의 파일 암호화
|
||||
noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사
|
||||
noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요
|
||||
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 = 개인 정보를 보호하는 방법이 있습니다. 파이어폭스와 함께 하세요.
|
||||
learnMore = 자세히 알아보기
|
||||
|
||||
@@ -168,3 +168,5 @@ shareLinkDescription = Pasidalinkite saitu į jūsų failą:
|
||||
shareLinkButton = Dalintis saitu
|
||||
# $name is the name of the file
|
||||
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.
|
||||
|
||||
154
public/locales/meh/send.ftl
Normal file
@@ -0,0 +1,154 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteFeedback = Tu'un jianininu
|
||||
importingFile = Nasia´a…
|
||||
encryptingFile = Encriptando...
|
||||
decryptingFile = Desencriptando…
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
*[other] { $num } nxinuun
|
||||
}
|
||||
timespanHours =
|
||||
{ $num ->
|
||||
[one] 1 hora
|
||||
*[other] { $num } horas
|
||||
}
|
||||
copiedUrl = Ntɨɨn
|
||||
unlockInputPlaceholder = Contraseña
|
||||
unlockButtonLabel = Nkasɨ
|
||||
downloadButtonLabel = Xinuu
|
||||
downloadFinish = Nnɨ´ɨ xinuu
|
||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||
sendYourFilesLink = Ni´i Firefox Send
|
||||
errorPageHeader = ¡Iyo iin ntu nkene va´a!
|
||||
fileTooBig = Archivo ya´a ka´nu. Nejia chunku´va { $size }
|
||||
linkExpiredAlt = Nnɨ´ɨ enlace
|
||||
notSupportedHeader = Ntu íyo tiñu nuu ka̱a̱ nánuku ya´a.
|
||||
notSupportedLink = ¿Navi ntu satiñu nuu ka̱a̱ nánuku ya´a?
|
||||
notSupportedOutdatedDetail = Tuni Firefox ya´a ntu satiñu vii jii Firefox Send. Nejika xinunu a jíía ka̱a̱ nánuku.
|
||||
updateFirefox = Naxi´ñá Firefox
|
||||
deletePopupCancel = Nkuvi-ka
|
||||
deleteButtonHover = Xita
|
||||
footerLinkLegal = Tu´un nichi
|
||||
footerLinkPrivacy = Tu´un xitu a kumiji noo´o
|
||||
footerLinkCookies = Cookies
|
||||
passwordTryAgain = Contraseña ntu vatu. Nachu´un tuku.
|
||||
javascriptRequired = Firefox Send ni´i JavaScript
|
||||
whyJavascript = ¿Navi Firefox Send ni´i JavaScript?
|
||||
enableJavascript = Kua´a jia´a JavaScript jee nachu´un tuku.
|
||||
# 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 = Naja ka´nu koo contraseña: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
passwordSetError = Ntu nkuvi sá´á contraseñ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 = Send
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = Kua´a daa archivo ñama jee yu´u
|
||||
introDescription = { -send-brand } taji jia´anu archivos jii cifrado uvi nuu jee iin enlace nɨ´ɨ. Sukuan kuvi kumi yu´unu daa archivo jia´anu jee kuninu nkino daa ya´a kue´e kuiya íchi nuu.
|
||||
notifyUploadEncryptDone = Archivo noo´o íyo cifrado jee kuvi chu´un íchi
|
||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||
archiveExpiryInfo = Nɨ'ɨ dee nña´a { $downloadCount } a xiin { $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 archivo
|
||||
*[other] { $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 = Ka´nu: { $size }
|
||||
# the next line after the colon contains a file name
|
||||
copyLinkDescription = Tɨɨn enlace jee kua´a archivo:
|
||||
copyLinkButton = Tɨɨn enlacae
|
||||
downloadTitle = Xinuu archivo
|
||||
downloadDescription = Archivo ya´a nsajia { -send-brand } jíí cifrado punto a punto jee iin enlace naa.
|
||||
trySendDescription = Nasá´á jii { -send-brand } kua´a ñama jee vatu.
|
||||
# count will always be > 10
|
||||
tooManyFiles =
|
||||
{ $count ->
|
||||
[one] Ntuxini 1 archivo kuvi ska.
|
||||
*[other] Ntuxini { $count } archivos kuvi ska.
|
||||
}
|
||||
# count will always be > 10
|
||||
tooManyArchives =
|
||||
{ $count ->
|
||||
[one] Ntu xini 1 archivo íyo
|
||||
*[other] Ntu xini { $count } archivos íyo
|
||||
}
|
||||
expiredTitle = Nnɨ'ɨ link ya´a.
|
||||
notSupportedDescription = { -send-brand } nsatiñu jii ka̱a̱ nánuku ya´a. { -send-short-brand } satiñu va´a jii tuni íchi yata { -firefox }, jee satiñu va´a jii tuni íyo ntañu´u kuaiyo daa ka̱a̱ nánuku.
|
||||
downloadFirefox = Xinuun { -firefox }
|
||||
legalTitle = Tu´un xitu a kumiji noo´o { -send-short-brand }
|
||||
legalDateStamp = Versión 1.0 del 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 }m
|
||||
addFilesButton = Kaji archivos ska
|
||||
uploadButton = Ska
|
||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||
dragAndDropFiles = Staka jee sía daa archivo
|
||||
# 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 = a xiin kuaxin saa chu´un íchi nee { $size }
|
||||
addPassword = Iyo yu´u jii contraseña
|
||||
emailPlaceholder = Chu´un email noo´o
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Kajie´e sesión saa chu´un íchi nee { $size }
|
||||
signInOnlyButton = Kajie´e sesión
|
||||
accountBenefitTitle = Sá´á iin cuenta { -firefox } a xiin kajie´e sesión
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = Kua´a archivo ka´nu { $size }
|
||||
accountBenefitDownloadCount = Kua´a archivos jii inka ñivɨ
|
||||
accountBenefitTimeLimit =
|
||||
{ $count ->
|
||||
[one] Kuteku enlaces 1 kivɨ
|
||||
*[other] Kuteku daa enlaces { $count } kivɨ
|
||||
}
|
||||
accountBenefitSync = Tetiñu archivos jia´anu ntaka ka̱a̱
|
||||
accountBenefitMoz = Ka´vi kue´eka jiee inka tiñu { -mozilla }
|
||||
signOut = Kasɨ sesión
|
||||
okButton = Kuvi
|
||||
downloadingTitle = Xinuu
|
||||
noStreamsWarning = Kuvi ka̱a̱ nánaku ya´a nxituvi a vaji nuu iin archivo ka´nu.
|
||||
noStreamsOptionCopy = Tɨɨn enlace jee síne nuu inka ka̱a̱ nánuku
|
||||
noStreamsOptionFirefox = Ni´i ka̱a̱ nánuku va´a
|
||||
noStreamsOptionDownload = Kaka jii ka̱a̱ nánuku ya´a
|
||||
downloadFirefoxPromo = { -send-short-brand } taji jíía { -firefox }.
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = Kua´a enlace archivo noo´o
|
||||
shareLinkButton = Kua´a link
|
||||
# $name is the name of the file
|
||||
shareMessage = Xinuu “{ $name }” jii { -send-brand }: ntu viji
|
||||
trailheadPromo = Iyo iin kuvi kumi privacidad noo´o. Nayonika Firefox.
|
||||
learnMore = Ka´vi kue´eka
|
||||