Compare commits

...

143 Commits

Author SHA1 Message Date
Danny Coates
94f1eabbc7 v3.0.17 2019-09-05 15:59:42 -07:00
Danny Coates
902bc6628e cache fonts 2019-09-05 15:57:07 -07:00
Danny Coates
460b741f17 clean service worker cache after activate instead of on install 2019-09-05 15:24:26 -07:00
Danny Coates
d5c488196d no-cache harder 2019-09-05 13:33:12 -07:00
Danny Coates
9ad9c9feb2 fixed git hooks 2019-09-05 13:16:32 -07:00
Danny Coates
6576e4a74c added sync-npm-dependencies script and hooks 2019-09-05 08:14:14 -07:00
Danny Coates
950872109e updated deps 2019-09-05 08:11:20 -07:00
Martijn Dekker
87051d27ed Pontoon: Update Interlingua (ia) localization of Firefox Send
Localization authors:
- Martijn Dekker <martijn@inlv.org>
2019-09-03 22:52:26 +00:00
Marcelo Ghelman
3451803b37 Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Firefox Send
Localization authors:
- Marcelo Ghelman <marcelo.ghelman@gmail.com>
2019-08-29 10:32:02 +00:00
dskmori
ac15153e8f Pontoon: Update Japanese (ja) localization of Firefox Send
Localization authors:
- dskmori <ghoti.fish.dsk@gmail.com>
2019-08-28 13:12:29 +00:00
Danny Coates
924f5dc682 disable streaming download on mobile firefox 2019-08-26 10:49:19 -07:00
Danny Coates
ff9be6a213 updated deps 2019-08-26 08:58:34 -07:00
Roberto Alvarado
883728570e Pontoon: Update Spanish (Mexico) (es-MX) localization of Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
- Adolfo Jayme Barrientos <fitoschido@gmail.com>
2019-08-25 05:52:41 +00:00
Adolfo Jayme Barrientos
0435f17f9a Pontoon: Update Spanish (Mexico) (es-MX) localization of Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
- Adolfo Jayme Barrientos <fitoschido@gmail.com>
2019-08-20 16:34:33 +00:00
Danny Coates
1e1268fff0 fixed hebrew fluent variable name 2019-08-19 10:59:35 -07:00
Quế Tùng
252d7817e3 Pontoon: Update Vietnamese (vi) localization of Firefox Send
Localization authors:
- Quế Tùng <best.cloney.1301@gmail.com>
2019-08-17 15:53:31 +00:00
Danny Coates
ce28c38ebe v3.0.16 2019-08-12 10:10:07 -07:00
Danny Coates
f0407f9beb use custom configstore that doesn't use the fs 2019-08-12 10:00:57 -07:00
Sahithi
c6f222eb57 Pontoon: Update Telugu (te) localization of Firefox Send
Localization authors:
- Sahithi <sahithi@swecha.net>
2019-08-11 08:54:01 +00:00
leo.toneff
6dd6135185 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Firefox Send
Localization authors:
- leo.toneff <leo.toneff@gmail.com>
- Håvar Henriksen <havar@firefox.no>
2019-08-10 16:33:36 +00:00
Danny Coates
8df339b66d v3.0.15 2019-08-09 12:26:09 -07:00
Danny Coates
8702fda651 handle websocket construction exceptions 2019-08-09 11:47:44 -07:00
Danny Coates
807ecff471 updated sentry libs from raven to @sentry 2019-08-09 11:06:21 -07:00
Danny Coates
927c981cd7 added size/time info to up/download error reporting 2019-08-09 10:09:34 -07:00
Danny Coates
7073cc8ce6 added download hang detection and error reporting 2019-08-08 13:54:02 -07:00
Danny Coates
c925fae696 updated deps 2019-08-08 13:01:57 -07:00
Danny Coates
966d7a5e35 create configstore dir in docker container 2019-08-08 10:42:57 -07:00
Danny Coates
96c750c098 added size and duration to connection error reporting 2019-08-08 09:52:22 -07:00
Danny Coates
0729064753 Merge pull request #1378 from mozilla/new-ws
Use resumable uploads to GCS
2019-08-08 08:54:00 -07:00
Joergen
259a5a5f24 Pontoon: Update Danish (da) localization of Firefox Send
Localization authors:
- Joergen <joergenr@stofanet.dk>
2019-08-08 14:02:32 +00:00
Danny Coates
27be72e0cd refactored client side upload loop 2019-08-07 13:51:23 -07:00
Danny Coates
e4231bbc0f updated deps 2019-08-07 13:47:26 -07:00
Danny Coates
1d184f06bf revert webpack for broken css extraction 2019-08-07 12:14:27 -07:00
Quentí
f7b46a99ac Pontoon: Update Occitan (oc) localization of Firefox Send
Localization authors:
- Quentí <quentinantonin@free.fr>
2019-08-07 18:12:20 +00:00
Quentí
3fadb489c7 Pontoon: Update Occitan (oc) localization of Firefox Send
Localization authors:
- Quentí <quentinantonin@free.fr>
2019-08-07 17:13:10 +00:00
Danny Coates
6378676c2d use resumable uploads to GCS 2019-08-07 10:10:42 -07:00
Quentí
014d84e4c7 Pontoon: Update Occitan (oc) localization of Firefox Send
Localization authors:
- Quentí <quentinantonin@free.fr>
2019-08-07 16:54:33 +00:00
Quentí
a08d8435a9 Pontoon: Update Occitan (oc) localization of Firefox Send
Localization authors:
- Quentí <quentinantonin@free.fr>
2019-08-07 07:12:56 +00:00
Quentí
40a05c9ecf Pontoon: Update Occitan (oc) localization of Firefox Send
Localization authors:
- Quentí <quentinantonin@free.fr>
2019-08-07 06:52:27 +00:00
Danny Coates
527040afef updated ws dependency and slightly improved client side error handling, hung uploads will error instead of hang forever 2019-08-06 14:47:21 -07:00
Michal Stanke
a48a447808 Pontoon: Update Czech (cs) localization of Firefox Send
Localization authors:
- Michal Stanke <mstanke@mozilla.cz>
2019-08-06 12:14:20 +00:00
julen
f3569d7f98 Pontoon: Update Basque (eu) localization of Firefox Send
Localization authors:
- julen <julenx@gmail.com>
- Ander Elortondo <ander.elor@gmail.com>
2019-08-05 08:52:40 +00:00
صفا الفليج
6ca7d11efb Pontoon: Update Arabic (ar) localization of Firefox Send
Localization authors:
- صفا الفليج <safa1996alfulaij@gmail.com>
2019-08-05 08:52:37 +00:00
julen
b71ae4a0ff Pontoon: Update Basque (eu) localization of Firefox Send
Localization authors:
- p.sanroman.bengoetxea <p.sanroman.bengoetxea@gmail.com>
- julen <julenx@gmail.com>
- Ander Elortondo <ander.elor@gmail.com>
2019-08-05 08:34:11 +00:00
Aman Alam
7ba25664b5 Pontoon: Update Punjabi (pa-IN) localization of Firefox Send
Localization authors:
- Aman Alam <amanpreet.alam@gmail.com>
2019-08-05 00:52:41 +00:00
Danny Coates
80fb42ad3d v3.0.14 2019-08-02 12:13:39 -07:00
Danny Coates
f036df5f47 updated eslint config 2019-08-02 12:03:53 -07:00
Danny Coates
20c063db7c fixed logged error in integration tests 2019-08-02 11:26:52 -07:00
Danny Coates
a6b43c9eef v3.0.13 2019-07-29 16:24:48 -07:00
Danny Coates
c80f9ada65 updated deps 2019-07-29 15:26:11 -07:00
aefgh39622
e0ae5cb3c6 Pontoon: Update Thai (th) localization of Firefox Send
Localization authors:
- aefgh39622 <aefgh39622@gmail.com>
2019-07-28 12:12:35 +00:00
Марко Костић (Marko Kostić)
c0fb3d17be Pontoon: Update Serbian (sr) localization of Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2019-07-24 21:52:22 +00:00
Ратко Вујановић
116f090b7e Pontoon: Update Serbian (sr) localization of Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
- Ратко Вујановић <arheopterics@gmail.com>
- Isidora Barad Dur <barad.dur@yahoo.com>
2019-07-23 19:52:46 +00:00
Danny Coates
7cbd9716e2 updated deps 2019-07-23 10:30:43 -07:00
Danny Coates
58191975b9 stubbed /login page for redirect base login flow 2019-07-23 09:27:34 -07:00
Anesu Chiodza
76695aee5d Pontoon: Update Shona (sn) localization of Firefox Send
Localization authors:
- Anesu Chiodza <anesuchiodza@gmail.com>
2019-07-16 17:31:47 +00:00
Anesu Chiodza
b356b4cad3 Pontoon: Update Shona (sn) localization of Firefox Send
Localization authors:
- Anesu Chiodza <anesuchiodza@gmail.com>
2019-07-16 17:11:53 +00:00
m4hdi.pdroid
63ddbeefc4 Pontoon: Update Persian (fa) localization of Firefox Send
Localization authors:
- m4hdi.pdroid <m4hdi.pdroid@gmail.com>
- Amin Mahmudian <amin.mahmudian@gmail.com>
2019-07-14 18:31:39 +00:00
Belayet Hossain
7b423b24b6 Pontoon: Update Bengali (bn) localization of Firefox Send
Localization authors:
- Belayet Hossain <bellayet@gmail.com>
2019-07-13 18:31:39 +00:00
Belayet Hossain
b67050b742 Pontoon: Update Bengali (bn) localization of Firefox Send
Localization authors:
- Belayet Hossain <bellayet@gmail.com>
2019-07-13 18:11:35 +00:00
rgpublic
06242dfd38 Add deployment instructions (#1366) 2019-07-12 10:07:24 -04:00
Danny Coates
3b8dbfd81c npm run format 2019-07-11 10:47:42 -07:00
Danny Coates
9c2fe39764 updated deps 2019-07-11 10:46:07 -07:00
Danny Coates
8b21d43bfa Merge pull request #1363 from flodolo/bengali
Rename bn-BD as bn
2019-07-10 09:54:32 -07:00
Francesco Lodolo [:flod]
e7e39f4d4a Rename bn-BD as bn 2019-07-10 06:52:22 +02:00
Top
e4c801d9a1 Pontoon: Update Thai (th) localization of Firefox Send
Localization authors:
- aefgh39622 <aefgh39622@gmail.com>
- Top <teerapatxtop@yahoo.com>
2019-07-08 16:12:27 +00:00
Cristian Silaghi
324f275dd4 Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2019-07-08 15:31:49 +00:00
Pin-guang Chen
594e0bd28e Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2019-07-08 14:12:25 +00:00
aefgh39622
6a7fdfe780 Pontoon: Update Thai (th) localization of Firefox Send
Localization authors:
- aefgh39622 <aefgh39622@gmail.com>
2019-07-08 13:51:49 +00:00
aefgh39622
0c82741b98 Pontoon: Update Thai (th) localization of Firefox Send
Localization authors:
- aefgh39622 <aefgh39622@gmail.com>
2019-07-08 13:33:33 +00:00
aefgh39622
fe57734792 Pontoon: Update Thai (th) localization of Firefox Send
Localization authors:
- aefgh39622 <aefgh39622@gmail.com>
2019-07-08 13:12:28 +00:00
Top
4754bed9b8 Pontoon: Update Thai (th) localization of Firefox Send
Localization authors:
- Top <teerapatxtop@yahoo.com>
2019-07-07 18:52:25 +00:00
aefgh39622
a60da467b9 Pontoon: Update Thai (th) localization of Firefox Send
Localization authors:
- aefgh39622 <aefgh39622@gmail.com>
2019-07-07 15:53:12 +00:00
Tomer Cohen
362da2bbfc Pontoon: Update Hebrew (he) localization of Firefox Send
Localization authors:
- Tomer Cohen <tomer.mozilla@tomercohen.com>
2019-07-05 18:54:16 +00:00
ItielMaN
1a9ef4a246 Pontoon: Update Hebrew (he) localization of Firefox Send
Localization authors:
- ItielMaN <itiel_yn8@walla.com>
- Yaron Shahrabani <sh.yaron@gmail.com>
- Tomer Cohen <tomer.mozilla@tomercohen.com>
2019-07-05 16:52:35 +00:00
Marcelo Ghelman
f51dbbb8f5 Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Firefox Send
Localization authors:
- Marcelo Ghelman <marcelo.ghelman@gmail.com>
2019-07-04 21:32:59 +00:00
Cristian Silaghi
e497107e59 Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2019-07-02 09:32:42 +00:00
sergio
10ad6fc1ae Pontoon: Update Russian (ru) localization of Firefox Send
Localization authors:
- sergio <sergio+it@outerface.net>
2019-07-01 12:32:41 +00:00
Christian Elbrianno
c982db4c75 Pontoon: Update Indonesian (id) localization of Firefox Send
Localization authors:
- Christian Elbrianno <christian.elbrianno41@gmail.com>
- Ringgo <armen.ringgo@yahoo.de>
2019-06-30 04:52:51 +00:00
Cristian Silaghi
cd8130563d Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2019-06-27 12:58:48 +00:00
Cristian Silaghi
730a569d43 Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2019-06-26 13:33:36 +00:00
kumincir
769dae1bdc Pontoon: Update Sundanese (su) localization of Firefox Send
Localization authors:
- kumincir <ia.adnan@gmail.com>
2019-06-26 02:33:06 +00:00
Cristian Silaghi
54a8c504ce Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2019-06-24 15:33:56 +00:00
robbp
92dc9a0f71 Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- robbp <robbpaun@gmail.com>
2019-06-23 05:17:32 +00:00
Besnik Bleta
80a7c92056 Pontoon: Update Albanian (sq) localization of Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2019-06-21 11:52:47 +00:00
p.sanroman.bengoetxea
c6ebea0100 Pontoon: Update Basque (eu) localization of Firefox Send
Localization authors:
- p.sanroman.bengoetxea <p.sanroman.bengoetxea@gmail.com>
2019-06-18 12:35:09 +00:00
mail
039b5daaed Pontoon: Update Korean (ko) localization of Firefox Send
Localization authors:
- mail <mail@kyg.kr>
2019-06-18 06:31:42 +00:00
Marcelo Ghelman
4bf4e61c2c Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Firefox Send
Localization authors:
- Marcelo Ghelman <marcelo.ghelman@gmail.com>
2019-06-17 18:13:25 +00:00
Cristian Silaghi
3c21e2a00f Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2019-06-17 13:13:34 +00:00
Cristian Silaghi
38a379d1de Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2019-06-16 20:11:54 +00:00
Sahithi
adeb19d974 Pontoon: Update Telugu (te) localization of Firefox Send
Localization authors:
- Sahithi <sahithi.thinker@gmail.com>
2019-06-16 10:53:05 +00:00
Sahithi
744c410704 Pontoon: Update Telugu (te) localization of Firefox Send
Localization authors:
- Sahithi <sahithi.thinker@gmail.com>
2019-06-16 10:32:18 +00:00
Sahithi
99ab3882eb Pontoon: Update Telugu (te) localization of Firefox Send
Localization authors:
- Sahithi <sahithi.thinker@gmail.com>
2019-06-16 10:13:18 +00:00
Danny Coates
7cdf566bcd updated deps 2019-06-14 11:58:39 -07:00
Danny Coates
b6e4877d93 Merge pull request #1352 from mozilla/tailwind-1
updated tailwindcss to 1.0
2019-06-14 11:45:10 -07:00
Danny Coates
b9c87fd779 updated tailwindcss to 1.0 2019-06-14 11:37:30 -07:00
Joe ST
6ef5b5133c Pontoon: Update English (Great Britain) (en-GB) localization of Firefox Send
Localization authors:
- Joe ST <joe@fbstj.net>
2019-06-14 16:39:06 +00:00
Yassine Aït-El-Mouden
b7d2420765 Pontoon: Update Tamazight (zgh) localization of Firefox Send
Localization authors:
- Yassine Aït-El-Mouden <yaitelmouden@outlook.com>
- Brahim Essaidi <Essaidib2@gmail.com>
2019-06-14 12:33:45 +00:00
Artem Polivanchuk
c139531c91 Pontoon: Update Ukrainian (uk) localization of Firefox Send
Localization authors:
- Artem Polivanchuk <artem@mozilla.org.ua>
2019-06-14 09:14:39 +00:00
Muhend Belkacem
88fe3902bc Pontoon: Update Kabyle (kab) localization of Firefox Send
Localization authors:
- Muhend Belkacem <taqbaylitassa@gmail.com>
2019-06-14 08:52:19 +00:00
Muhend Belkacem
645fd062ac Pontoon: Update Kabyle (kab) localization of Firefox Send
Localization authors:
- Muhend Belkacem <taqbaylitassa@gmail.com>
2019-06-13 23:51:58 +00:00
Uccen Marzuq
ccb0b71df5 Pontoon: Update Kabyle (kab) localization of Firefox Send
Localization authors:
- Uccen Marzuq <merzouk.ouchene@laposte.net>
2019-06-13 21:52:28 +00:00
Muhend Belkacem
b8ec90a398 Pontoon: Update Kabyle (kab) localization of Firefox Send
Localization authors:
- Muhend Belkacem <taqbaylitassa@gmail.com>
2019-06-13 20:51:59 +00:00
marsf
7ed5f37c66 Pontoon: Update Japanese (ja) localization of Firefox Send
Localization authors:
- marsf <chimantaea_mirabilis@yahoo.co.jp>
2019-06-13 10:32:28 +00:00
Victor Bychek
c899129f9a Pontoon: Update Russian (ru) localization of Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2019-06-12 12:34:13 +00:00
Hyeonseok Shin
1bb91690c5 Pontoon: Update Korean (ko) localization of Firefox Send
Localization authors:
- Hyeonseok Shin <hyeonseok@gmail.com>
- Jonathan Joseph Chiarella <jonathan.chiarella@gmail.com>
2019-06-12 03:12:53 +00:00
Mikeyy
073f6f67d3 Pontoon: Update Croatian (hr) localization of Firefox Send
Localization authors:
- Mikeyy <mihovil@miho.im>
2019-06-10 19:54:19 +00:00
Danny Coates
533bfdb496 updated deps 2019-06-06 18:01:57 -07:00
Paulius
34de65d7d2 Pontoon: Update Lithuanian (lt) localization of Firefox Send
Localization authors:
- Paulius <paulius@mozilla.lt>
2019-06-06 13:13:09 +00:00
Danny Coates
209fdf34f8 Merge pull request #1348 from georapbox/issue-1332
Fixes blurry Sign in button when hovered
2019-06-05 09:33:53 -07:00
Brahim Essaidi
ba5c2a049d Pontoon: Update Tamazight (zgh) localization of Firefox Send
Localization authors:
- Brahim Essaidi <Essaidib2@gmail.com>
2019-06-05 11:33:42 +00:00
George Raptis
1528aa3f1b Fixes blurry Sign in button when hovered 2019-06-05 11:58:11 +03:00
Danny Coates
b1f1b9bd19 v3.0.12 2019-06-03 13:20:37 -07:00
Fjoerfoks
2963b2fc05 Pontoon: Update Frisian (fy-NL) localization of Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2019-06-03 12:16:57 +00:00
Gwenn
e4f9cfa023 Pontoon: Update Breton (br) localization of Firefox Send
Localization authors:
- Gwenn <tornoz@laposte.net>
2019-06-03 12:16:54 +00:00
Mark Heijl
09e961219d Pontoon: Update Dutch (nl) localization of Firefox Send
Localization authors:
- Mark Heijl <markh@babelzilla.org>
2019-06-03 11:52:36 +00:00
Gwenn
b36a5f6973 Pontoon: Update Breton (br) localization of Firefox Send
Localization authors:
- Gwenn <tornoz@laposte.net>
2019-06-03 11:52:34 +00:00
Cristian Silaghi
1a36dc084e Pontoon: Update Romanian (ro) localization of Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2019-06-03 10:53:39 +00:00
Björn I
c66347b3da Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Firefox Send
Localization authors:
- Björn I. <bjorni.svindseth@yahoo.com>
2019-06-03 07:12:53 +00:00
Björn I
a7d0551509 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Firefox Send
Localization authors:
- Björn I. <bjorni.svindseth@yahoo.com>
2019-06-03 03:32:42 +00:00
Björn I
f6f6324aa1 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Firefox Send
Localization authors:
- Björn I. <bjorni.svindseth@yahoo.com>
2019-06-03 02:51:33 +00:00
Marcelo Poli
a24597695b Pontoon: Update Spanish (Argentina) (es-AR) localization of Firefox Send
Localization authors:
- Marcelo Poli <enzomatrix@gmail.com>
2019-06-02 19:11:41 +00:00
ravmn
706ac638da Pontoon: Update Spanish (Chile) (es-CL) localization of Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2019-06-01 23:32:20 +00:00
Selim Şumlu
d66d08f0ed Pontoon: Update Turkish (tr) localization of Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2019-06-01 23:12:28 +00:00
Michael Wolf
ab9af7fd9b Pontoon: Update Sorbian, Lower (dsb) localization of Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2019-06-01 18:51:55 +00:00
Jiri Grönroos
466a087689 Pontoon: Update Finnish (fi) localization of Firefox Send
Localization authors:
- Jiri Grönroos <jiri.gronroos@iki.fi>
2019-06-01 05:53:37 +00:00
Piotr Drąg
71956739f8 Pontoon: Update Polish (pl) localization of Firefox Send
Localization authors:
- Piotr Drąg <piotrdrag@gmail.com>
2019-05-31 18:13:10 +00:00
Danny Coates
62689b9556 Merge pull request #1344 from mozilla/update-promo-banner
tweak promo banner to match spec'
2019-05-31 09:23:51 -07:00
Danny Coates
7d1b8e002f a couple promo style tweaks 2019-05-31 09:18:20 -07:00
Slimane Selyan AMIRI
8c535ce50d Pontoon: Update Kabyle (kab) localization of Firefox Send
Localization authors:
- Slimane Selyan AMIRI <slimane.amiri@gmail.com>
2019-05-31 14:32:26 +00:00
John Gruen
a3bdcd8478 tweak promo banner to match spec' 2019-05-31 13:48:32 +02:00
Jim Spentzos
1e77d86e8a Pontoon: Update Greek (el) localization of Firefox Send
Localization authors:
- Jim Spentzos <jimspentzos2000@gmail.com>
2019-05-31 04:12:41 +00:00
Jim Spentzos
1af01b1ee3 Pontoon: Update Greek (el) localization of Firefox Send
Localization authors:
- Jim Spentzos <jimspentzos2000@gmail.com>
2019-05-31 03:51:26 +00:00
Balázs Meskó
eb1bcde37f Pontoon: Update Hungarian (hu) localization of Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2019-05-30 11:31:25 +00:00
avelper
8def910d61 Pontoon: Update Spanish (Spain) (es-ES) localization of Firefox Send
Localization authors:
- avelper <avelper@mozilla-hispano.org>
2019-05-30 11:11:30 +00:00
Quế Tùng
5892532d03 Pontoon: Update Vietnamese (vi) localization of Firefox Send
Localization authors:
- Quế Tùng <best.cloney.1301@gmail.com>
2019-05-30 10:16:41 +00:00
Rhoslyn Prys
8ede5cf05c Pontoon: Update Welsh (cy) localization of Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@posteo.net>
2019-05-30 08:12:25 +00:00
Danny Coates
7213fef7c3 updated deps 2019-05-29 19:27:47 -07:00
Danny Coates
d3e9bb09df trailhead promo 2019-05-29 19:27:47 -07:00
Michael Wolf
2682aec90d Pontoon: Update Sorbian, Upper (hsb) localization of Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2019-05-29 21:12:41 +00:00
Rodrigo
0ea89a58b0 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2019-05-29 21:12:39 +00:00
Marcelo Ghelman
2a2a3ad21f Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Firefox Send
Localization authors:
- Marcelo Ghelman <marcelo.ghelman@gmail.com>
2019-05-29 20:52:57 +00:00
yusup.ramdani
36c73bae7b Pontoon: Update Sundanese (su) localization of Firefox Send
Localization authors:
- yusup.ramdani <yusup.ramdani@wikimedia.or.id>
2019-05-29 18:51:34 +00:00
110 changed files with 5836 additions and 4824 deletions

View File

@@ -2,5 +2,6 @@ dist
assets assets
firefox firefox
coverage coverage
android/app/build
app/locale.js app/locale.js
app/capabilities.js app/capabilities.js

View File

@@ -4,6 +4,7 @@ env:
extends: extends:
- eslint:recommended - eslint:recommended
- prettier
- plugin:node/recommended - plugin:node/recommended
- plugin:security/recommended - plugin:security/recommended
@@ -22,13 +23,5 @@ rules:
security/detect-non-literal-fs-filename: off security/detect-non-literal-fs-filename: off
security/detect-object-injection: off security/detect-object-injection: off
eol-last: [error, always]
eqeqeq: error
no-alert: warn
no-console: warn
no-path-concat: error
no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}] no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}]
no-var: error require-atomic-updates: warn
one-var: [error, never]
prefer-const: error
quotes: [error, single, {avoidEscape: true}]

View File

@@ -4,15 +4,18 @@ Adnan Kičin
Alberto Castro Alberto Castro
Alexander Slovesnik Alexander Slovesnik
Alfredos-Panagiotis Damkalis Alfredos-Panagiotis Damkalis
Aman Alam
Amin Mahmudian Amin Mahmudian
Ander Elortondo Ander Elortondo
Andreas Pettersson Andreas Pettersson
Anesu Chiodza Anesu Chiodza
Anika Dorn Anika Dorn
Anish Sheela
Arash Mousavi Arash Mousavi
Artem Polivanchuk Artem Polivanchuk
Ashikur Rahman Ashikur Rahman
Ashok kumar Ashok kumar
Balasankar C
Balázs Meskó Balázs Meskó
Belayet Hossain Belayet Hossain
Benjamin Forehand Jr Benjamin Forehand Jr
@@ -20,8 +23,11 @@ Besnik Bleta
Björn I Björn I
Bjørn I Bjørn I
Boopesh Mahendran Boopesh Mahendran
Brahim Essaidi
Brainlulz Brainlulz
Breana Gonzales Breana Gonzales
Christian Elbrianno
Christoph Kührer
Christopher Ramírez Christopher Ramírez
Chuck Harmston Chuck Harmston
Cloney 173741 Cloney 173741
@@ -31,6 +37,7 @@ Cynthia Pereira
Daniel Thorn Daniel Thorn
Daniela Arcese Daniela Arcese
Danny Coates Danny Coates
Davide
Derek Tamsen Derek Tamsen
Dhyey Thakore Dhyey Thakore
Donovan Preston Donovan Preston
@@ -52,11 +59,16 @@ Frederick Villaluna
G12r G12r
Gabriela Gabriela
Gautam krishna.R Gautam krishna.R
George Raptis
Georgianizator Georgianizator
Gonçalo Matos Gonçalo Matos
Gwenn
Hugo
Hugo Abreu
Hyeonseok Shin Hyeonseok Shin
Håvar Henriksen Håvar Henriksen
Ian Neal Ian Neal
ItielMaN
Jae Hyeon Park Jae Hyeon Park
Jakob Kappel Jakob Kappel
Jakub Rychlý Jakub Rychlý
@@ -65,6 +77,8 @@ Jarmo
Jim Spentzos Jim Spentzos
Jiri Grönroos Jiri Grönroos
Jobava Jobava
Joe Becher
Joe ST
Joergen Joergen
Johann-S Johann-S
John Gruen John Gruen
@@ -81,9 +95,11 @@ Khaled Hosny
Kim Ludvigsen Kim Ludvigsen
Kohei Yoshino Kohei Yoshino
Lan Glad Lan Glad
Lasse Liehu
Laurent Jouanneau Laurent Jouanneau
Lobodzets Lobodzets
LuFlo LuFlo
Luis A. Sánchez
Luiz Carlos de Morais Luiz Carlos de Morais
Luna Jernberg Luna Jernberg
Mahay Alam Khan Mahay Alam Khan
@@ -106,14 +122,18 @@ Michal Vašíček
Mikeyy Mikeyy
Miro Rauhala Miro Rauhala
Mozilla Pontoon Mozilla Pontoon
Mozilla-GitHub-Standards
Mozinet Mozinet
Moḥend Belqasem Moḥend Belqasem
Muhend Belkacem
Muḥend Belqasem Muḥend Belqasem
Myungjae Won Myungjae Won
Nicholas Skinsacos Nicholas Skinsacos
Nihad Nihad
Nihad Suljić Nihad Suljić
Oscar Oscar
Paulius
Pedro Burlamaqui Bendahan
Peter deHaan Peter deHaan
Pierre Neter Pierre Neter
Pin-guang Chen Pin-guang Chen
@@ -125,10 +145,12 @@ RickieES
Rimas Kudelis Rimas Kudelis
Rizky Ariestiyansyah Rizky Ariestiyansyah
Rob Powell Rob Powell
Robert
Roberto Alvarado Roberto Alvarado
Rodrigo Rodrigo
Rodrigo Guerra Rodrigo Guerra
Rok Žerdin Rok Žerdin
Romi Hardiyanto
Rongjian Zhang Rongjian Zhang
Ruba Ruba
Sahithi Sahithi
@@ -139,9 +161,12 @@ Sara Todaro
Sav22999 Sav22999
Schieck :) Schieck :)
Selim Şumlu Selim Şumlu
Sidak Singh Aulakh
Slimane Amiri Slimane Amiri
Slimane Selyan AMIRI
Soumya Himanish Mohapatra Soumya Himanish Mohapatra
Staś Małolepszy Staś Małolepszy
Suriyaa ✌️️
Tema Tema
Thomas Dalichow Thomas Dalichow
Théo Chevalier Théo Chevalier
@@ -150,6 +175,7 @@ Tim Visée
Tomer Cohen Tomer Cohen
Tomáš Zelina Tomáš Zelina
Ton Ton
Top
Tymur Faradzhev Tymur Faradzhev
Uccen Marzuq Uccen Marzuq
Varghese Thomas Varghese Thomas
@@ -159,6 +185,7 @@ Vitaliy Krutko
Weihang Lo Weihang Lo
Wil Clouser Wil Clouser
YFdyh000 YFdyh000
Yassine Aït-El-Mouden
Yongmin H Yongmin H
You-Wen Liang (Mark) You-Wen Liang (Mark)
aaaaalbert aaaaalbert
@@ -169,6 +196,7 @@ alex_mayorga
ariestiyansyah ariestiyansyah
avelper avelper
chilledfrogs chilledfrogs
clouserw-mozilla-owner
dgadelha dgadelha
dskmori dskmori
ehuggett ehuggett
@@ -180,25 +208,35 @@ gmontagu
goofy goofy
hello hello
hi hi
ivan.pompa
jesferman1993 jesferman1993
jlG jlG
josotrix josotrix
jspam jspam
julenx julenx
kenrick95 kenrick95
kumincir
m4hdi.pdroid
mail
manxmensch manxmensch
marigalicer marigalicer
marsf
merianosnikos
mirzet.omerovic.1992 mirzet.omerovic.1992
mujeebcpy
p.sanroman.bengoetxea
passionforlife passionforlife
paul.trevor paul.trevor
pyup.io bot pyup.io bot
ravmn ravmn
rcmainak rcmainak
reza.habibi2008 reza.habibi2008
rgpublic
risger risger
robbp robbp
ruikunai ruikunai
savemore99.sm savemore99.sm
sergio
shikhar-scs shikhar-scs
siparon siparon
skystar-p skystar-p
@@ -210,10 +248,13 @@ victor.gonzalezro
xcffl xcffl
ybouhamam ybouhamam
yoshimitsu002 yoshimitsu002
yusup.ramdani
Μιχάλης Μιχάλης
Марко Костић (Marko Kostić) Марко Костић (Marko Kostić)
Ратко Вујановић
صفا الفليج صفا الفليج
వీవెన్ వీవెన్
ജോയ്സ്
张无忌 张无忌
新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美 新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美
莫非前世那一眼 莫非前世那一眼

View File

@@ -10,6 +10,8 @@ USER app
WORKDIR /app WORKDIR /app
COPY --chown=app:app --from=builder /app . COPY --chown=app:app --from=builder /app .
COPY --chown=app:app . . COPY --chown=app:app . .
RUN mkdir -p /app/.config/configstore
RUN ln -s dist/version.json version.json
ENV PORT=1443 ENV PORT=1443
EXPOSE $PORT EXPOSE $PORT

View File

@@ -16,6 +16,7 @@
* [Localization](#localization) * [Localization](#localization)
* [Contributing](#contributing) * [Contributing](#contributing)
* [Testing](#testing) * [Testing](#testing)
* [Deployment](#deployment)
* [Android](#android) * [Android](#android)
* [License](#license) * [License](#license)
@@ -91,6 +92,12 @@ Pull requests are always welcome! Feel free to check out the list of ["good firs
--- ---
## Deployment
see also [docs/deployment.md](docs/deployment.md)
---
## Android ## Android
The android implementation is contained in the `android` directory, and can be viewed locally for easy testing and editing by running `ANDROID=1 npm start` and then visiting <http://localhost:8080>. CSS and image files are located in the `android/app/src/main/assets` directory. The android implementation is contained in the `android` directory, and can be viewed locally for easy testing and editing by running `ANDROID=1 npm start` and then visiting <http://localhost:8080>. CSS and image files are located in the `android/app/src/main/assets` directory.

View File

@@ -1,8 +1,7 @@
/* global window, navigator */ import 'intl-pluralrules';
import 'fluent-intl-polyfill';
import choo from 'choo'; import choo from 'choo';
import html from 'choo/html'; import html from 'choo/html';
import Raven from 'raven-js'; import * as Sentry from '@sentry/browser';
import { setApiUrlPrefix, getConstants } from '../app/api'; import { setApiUrlPrefix, getConstants } from '../app/api';
import metrics from '../app/metrics'; import metrics from '../app/metrics';
@@ -53,7 +52,7 @@ function body(main) {
const menu = html`<a const menu = html`<a
id="hamburger" id="hamburger"
class="absolute pin-t pin-r z-50" class="absolute top-0 right-0 z-50"
href="#" href="#"
onclick="${clickPreferences}" onclick="${clickPreferences}"
> >
@@ -83,7 +82,7 @@ function body(main) {
state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS); state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS);
state.storage = storage; state.storage = storage;
state.user = new User(storage, LIMITS); state.user = new User(storage, LIMITS);
state.raven = Raven; state.sentry = Sentry;
}); });
app.use(metrics); app.use(metrics);
app.route('/', body(home)); app.route('/', body(home));

View File

@@ -42,11 +42,7 @@ module.exports = function(state, emit) {
content = content =
archives.length < 1 archives.length < 1
? intro(state) ? intro(state)
: list( : list(archives, 'h-full overflow-y-auto w-full', 'mb-3 w-full');
archives,
'list-reset h-full overflow-y-auto w-full',
'mb-3 w-full'
);
} }
return html` return html`
@@ -57,7 +53,7 @@ module.exports = function(state, emit) {
> >
${content} ${content}
</section> </section>
<div class="fixed pin-r pin-b z-20"> <div class="fixed right-0 bottom-0 z-20">
${button} ${button}
<input <input
id="file-upload" id="file-upload"

View File

@@ -12,7 +12,7 @@ export default function initialState(state, emitter) {
getAsset(name) { getAsset(name) {
return `${state.prefix}/${name}`; return `${state.prefix}/${name}`;
}, },
raven: { sentry: {
captureException: e => { captureException: e => {
console.error('ERROR ' + e + ' ' + e.stack); console.error('ERROR ' + e + ' ' + e.stack);
} }

View File

@@ -11,6 +11,15 @@ if (!fileProtocolWssUrl) {
fileProtocolWssUrl = 'wss://send.firefox.com/api/ws'; fileProtocolWssUrl = 'wss://send.firefox.com/api/ws';
} }
export class ConnectionError extends Error {
constructor(cancelled, duration, size) {
super(cancelled ? '0' : 'connection closed');
this.cancelled = cancelled;
this.duration = duration;
this.size = size;
}
}
export function setFileProtocolWssUrl(url) { export function setFileProtocolWssUrl(url) {
localStorage && localStorage.setItem('wssURL', url); localStorage && localStorage.setItem('wssURL', url);
fileProtocolWssUrl = url; fileProtocolWssUrl = url;
@@ -137,17 +146,25 @@ export async function setPassword(id, owner_token, keychain) {
} }
function asyncInitWebSocket(server) { function asyncInitWebSocket(server) {
return new Promise(resolve => { return new Promise((resolve, reject) => {
const ws = new WebSocket(server); try {
ws.onopen = () => { const ws = new WebSocket(server);
resolve(ws); ws.addEventListener('open', () => resolve(ws), { once: true });
}; } catch (e) {
reject(new ConnectionError(false));
}
}); });
} }
function listenForResponse(ws, canceller) { function listenForResponse(ws, canceller) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
function handleClose(event) {
// a 'close' event before a 'message' event means the request failed
ws.removeEventListener('message', handleMessage);
reject(new ConnectionError(canceller.cancelled));
}
function handleMessage(msg) { function handleMessage(msg) {
ws.removeEventListener('close', handleClose);
try { try {
const response = JSON.parse(msg.data); const response = JSON.parse(msg.data);
if (response.error) { if (response.error) {
@@ -156,13 +173,11 @@ function listenForResponse(ws, canceller) {
resolve(response); resolve(response);
} }
} catch (e) { } catch (e) {
ws.close();
canceller.cancelled = true;
canceller.error = e;
reject(e); reject(e);
} }
} }
ws.addEventListener('message', handleMessage, { once: true }); ws.addEventListener('message', handleMessage, { once: true });
ws.addEventListener('close', handleClose, { once: true });
}); });
} }
@@ -176,6 +191,8 @@ async function upload(
onprogress, onprogress,
canceller canceller
) { ) {
let size = 0;
const start = Date.now();
const host = window.location.hostname; const host = window.location.hostname;
const port = window.location.port; const port = window.location.port;
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
@@ -203,31 +220,41 @@ async function upload(
const reader = stream.getReader(); const reader = stream.getReader();
let state = await reader.read(); let state = await reader.read();
let size = 0;
while (!state.done) { while (!state.done) {
const buf = state.value;
if (canceller.cancelled) { if (canceller.cancelled) {
throw canceller.error; ws.close();
} }
if (ws.readyState !== WebSocket.OPEN) {
break;
}
const buf = state.value;
ws.send(buf); ws.send(buf);
onprogress(size); onprogress(size);
size += buf.length; size += buf.length;
state = await reader.read(); state = await reader.read();
while (ws.bufferedAmount > ECE_RECORD_SIZE * 2) { while (
ws.bufferedAmount > ECE_RECORD_SIZE * 2 &&
ws.readyState === WebSocket.OPEN &&
!canceller.cancelled
) {
await delay(); await delay();
} }
} }
const footer = new Uint8Array([0]); if (ws.readyState === WebSocket.OPEN) {
ws.send(footer); ws.send(new Uint8Array([0])); //EOF
}
await completedResponse; await completedResponse;
ws.close(); uploadInfo.duration = Date.now() - start;
return uploadInfo; return uploadInfo;
} catch (e) { } catch (e) {
ws.close(4000); e.size = size;
e.duration = Date.now() - start;
throw e; throw e;
} finally {
if (![WebSocket.CLOSED, WebSocket.CLOSING].includes(ws.readyState)) {
ws.close();
}
} }
} }
@@ -244,7 +271,6 @@ export function uploadWs(
return { return {
cancel: function() { cancel: function() {
canceller.error = new Error(0);
canceller.cancelled = true; canceller.cancelled = true;
}, },
@@ -284,7 +310,7 @@ async function downloadS(id, keychain, signal) {
return response.body; return response.body;
} }
async function tryDownloadStream(id, keychain, signal, tries = 1) { async function tryDownloadStream(id, keychain, signal, tries = 2) {
try { try {
const result = await downloadS(id, keychain, signal); const result = await downloadS(id, keychain, signal);
return result; return result;
@@ -306,18 +332,19 @@ export function downloadStream(id, keychain) {
} }
return { return {
cancel, cancel,
result: tryDownloadStream(id, keychain, controller.signal, 2) result: tryDownloadStream(id, keychain, controller.signal)
}; };
} }
////////////////// //////////////////
function download(id, keychain, onprogress, canceller) { async function download(id, keychain, onprogress, canceller) {
const auth = await keychain.authHeader();
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
canceller.oncancel = function() { canceller.oncancel = function() {
xhr.abort(); xhr.abort();
}; };
return new Promise(async function(resolve, reject) { return new Promise(function(resolve, reject) {
xhr.addEventListener('loadend', function() { xhr.addEventListener('loadend', function() {
canceller.oncancel = function() {}; canceller.oncancel = function() {};
const authHeader = xhr.getResponseHeader('WWW-Authenticate'); const authHeader = xhr.getResponseHeader('WWW-Authenticate');
@@ -337,7 +364,6 @@ function download(id, keychain, onprogress, canceller) {
onprogress(event.loaded); onprogress(event.loaded);
} }
}); });
const auth = await keychain.authHeader();
xhr.open('get', getApiUrl(`/api/download/blob/${id}`)); xhr.open('get', getApiUrl(`/api/download/blob/${id}`));
xhr.setRequestHeader('Authorization', auth); xhr.setRequestHeader('Authorization', auth);
xhr.responseType = 'blob'; xhr.responseType = 'blob';
@@ -346,7 +372,7 @@ function download(id, keychain, onprogress, canceller) {
}); });
} }
async function tryDownload(id, keychain, onprogress, canceller, tries = 1) { async function tryDownload(id, keychain, onprogress, canceller, tries = 2) {
try { try {
const result = await download(id, keychain, onprogress, canceller); const result = await download(id, keychain, onprogress, canceller);
return result; return result;
@@ -367,7 +393,7 @@ export function downloadFile(id, keychain, onprogress) {
} }
return { return {
cancel, cancel,
result: tryDownload(id, keychain, onprogress, canceller, 2) result: tryDownload(id, keychain, onprogress, canceller)
}; };
} }

View File

@@ -76,8 +76,8 @@ async function polyfillStreams() {
} }
export default async function getCapabilities() { export default async function getCapabilities() {
const serviceWorker = const browser = browserName();
'serviceWorker' in navigator && browserName() !== 'edge'; const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
let crypto = await checkCrypto(); let crypto = await checkCrypto();
const nativeStreams = checkStreams(); const nativeStreams = checkStreams();
let polyStreams = false; let polyStreams = false;
@@ -97,13 +97,16 @@ export default async function getCapabilities() {
window.matchMedia('(display-mode: standalone)').matches || window.matchMedia('(display-mode: standalone)').matches ||
navigator.standalone; navigator.standalone;
const mobileFirefox =
browser === 'firefox' && /mobile/i.test(navigator.userAgent);
return { return {
account, account,
crypto, crypto,
serviceWorker, serviceWorker,
streamUpload: nativeStreams || polyStreams, streamUpload: nativeStreams || polyStreams,
streamDownload: streamDownload:
nativeStreams && serviceWorker && browserName() !== 'safari', nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox,
multifile: nativeStreams || polyStreams, multifile: nativeStreams || polyStreams,
share, share,
standalone standalone

View File

@@ -76,7 +76,7 @@ export default function(state, emitter) {
state.storage.remove(ownedFile.id); state.storage.remove(ownedFile.id);
await ownedFile.del(); await ownedFile.del();
} catch (e) { } catch (e) {
state.raven.captureException(e); state.sentry.captureException(e);
} }
render(); render();
}); });
@@ -176,14 +176,17 @@ export default function(state, emitter) {
} catch (err) { } catch (err) {
if (err.message === '0') { if (err.message === '0') {
//cancelled. do nothing //cancelled. do nothing
const duration = Date.now() - start; metrics.cancelledUpload(archive, err.duration);
metrics.cancelledUpload(archive, duration);
render(); render();
} else { } else {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.error(err); console.error(err);
state.raven.captureException(err); state.sentry.withScope(scope => {
metrics.stoppedUpload(archive); scope.setExtra('duration', err.duration);
scope.setExtra('size', err.size);
state.sentry.captureException(err);
});
metrics.stoppedUpload(archive, err.duration);
emitter.emit('pushState', '/error'); emitter.emit('pushState', '/error');
} }
} finally { } finally {
@@ -262,7 +265,12 @@ export default function(state, emitter) {
state.transfer = null; state.transfer = null;
const location = err.message === '404' ? '/404' : '/error'; const location = err.message === '404' ? '/404' : '/error';
if (location === '/error') { if (location === '/error') {
state.raven.captureException(err); state.sentry.withScope(scope => {
scope.setExtra('duration', err.duration);
scope.setExtra('size', err.size);
scope.setExtra('progress', err.progress);
state.sentry.captureException(err);
});
const duration = Date.now() - start; const duration = Date.now() - start;
metrics.stoppedDownload({ metrics.stoppedDownload({
size, size,

View File

@@ -112,6 +112,7 @@ export default class FileReceiver extends Nanobus {
} }
async downloadStream(noSave = false) { async downloadStream(noSave = false) {
const start = Date.now();
const onprogress = p => { const onprogress = p => {
this.progress = [p, this.fileInfo.size]; this.progress = [p, this.fileInfo.size];
this.emit('progress'); this.emit('progress');
@@ -153,9 +154,7 @@ export default class FileReceiver extends Nanobus {
const downloadPath = `/api/download/${this.fileInfo.id}`; const downloadPath = `/api/download/${this.fileInfo.id}`;
let downloadUrl = getApiUrl(downloadPath); let downloadUrl = getApiUrl(downloadPath);
if (downloadUrl === downloadPath) { if (downloadUrl === downloadPath) {
downloadUrl = `${location.protocol}//${location.host}/api/download/${ downloadUrl = `${location.protocol}//${location.host}${downloadPath}`;
this.fileInfo.id
}`;
} }
const a = document.createElement('a'); const a = document.createElement('a');
a.href = downloadUrl; a.href = downloadUrl;
@@ -164,11 +163,29 @@ export default class FileReceiver extends Nanobus {
} }
let prog = 0; let prog = 0;
let hangs = 0;
while (prog < this.fileInfo.size) { while (prog < this.fileInfo.size) {
const msg = await this.sendMessageToSw({ const msg = await this.sendMessageToSw({
request: 'progress', request: 'progress',
id: this.fileInfo.id id: this.fileInfo.id
}); });
if (msg.progress === prog) {
hangs++;
} else {
hangs = 0;
}
if (hangs > 30) {
// TODO: On Chrome we don't get a cancel
// signal so one is indistinguishable from
// a hang. We may be able to detect
// which end is hung in the service worker
// to improve on this.
const e = new Error('hung download');
e.duration = Date.now() - start;
e.size = this.fileInfo.size;
e.progress = prog;
throw e;
}
prog = msg.progress; prog = msg.progress;
onprogress(prog); onprogress(prog);
await delay(1000); await delay(1000);

View File

@@ -44,7 +44,6 @@ export default class FileSender extends Nanobus {
} }
async upload(archive, bearerToken) { async upload(archive, bearerToken) {
const start = Date.now();
if (this.cancelled) { if (this.cancelled) {
throw new Error(0); throw new Error(0);
} }
@@ -76,7 +75,6 @@ export default class FileSender extends Nanobus {
this.emit('progress'); // HACK to kick MS Edge this.emit('progress'); // HACK to kick MS Edge
try { try {
const result = await this.uploadRequest.result; const result = await this.uploadRequest.result;
const time = Date.now() - start;
this.msg = 'notifyUploadEncryptDone'; this.msg = 'notifyUploadEncryptDone';
this.uploadRequest = null; this.uploadRequest = null;
this.progress = [1, 1]; this.progress = [1, 1];
@@ -87,8 +85,8 @@ export default class FileSender extends Nanobus {
name: archive.name, name: archive.name,
size: archive.size, size: archive.size,
manifest: archive.manifest, manifest: archive.manifest,
time: time, time: result.duration,
speed: archive.size / (time / 1000), speed: archive.size / (result.duration / 1000),
createdAt: Date.now(), createdAt: Date.now(),
expiresAt: Date.now() + archive.timeLimit * 1000, expiresAt: Date.now() + archive.timeLimit * 1000,
secretKey: secretKey, secretKey: secretKey,

View File

@@ -1,4 +1,4 @@
import { FluentBundle } from 'fluent'; import { FluentBundle } from '@fluent/bundle';
function makeBundle(locale, ftl) { function makeBundle(locale, ftl) {
const bundle = new FluentBundle(locale, { useIsolating: false }); const bundle = new FluentBundle(locale, { useIsolating: false });
@@ -10,9 +10,9 @@ export async function getTranslator(locale) {
const bundles = []; const bundles = [];
const { default: en } = await import('../public/locales/en-US/send.ftl'); const { default: en } = await import('../public/locales/en-US/send.ftl');
if (locale !== 'en-US') { if (locale !== 'en-US') {
const { const { default: ftl } = await import(
default: ftl `../public/locales/${locale}/send.ftl`
} = await import(`../public/locales/${locale}/send.ftl`); );
bundles.push(makeBundle(locale, ftl)); bundles.push(makeBundle(locale, ftl));
} }
bundles.push(makeBundle('en-US', en)); bundles.push(makeBundle('en-US', en));

View File

@@ -1,4 +1,9 @@
@tailwind preflight; @tailwind base;
html {
line-height: 1.15;
}
@tailwind components; @tailwind components;
:not(input) { :not(input) {
@@ -311,6 +316,7 @@ select {
} }
.signin { .signin {
backface-visibility: hidden;
border-radius: 6px; border-radius: 6px;
transition-property: transform, background-color; transition-property: transform, background-color;
transition-duration: 250ms; transition-duration: 250ms;

View File

@@ -1,7 +1,7 @@
/* global DEFAULTS LIMITS PREFS */ /* global DEFAULTS LIMITS PREFS */
import 'core-js'; import 'core-js';
import 'fast-text-encoding'; // MS Edge support import 'fast-text-encoding'; // MS Edge support
import 'fluent-intl-polyfill'; import 'intl-pluralrules';
import choo from 'choo'; import choo from 'choo';
import nanotiming from 'nanotiming'; import nanotiming from 'nanotiming';
import routes from './routes'; import routes from './routes';
@@ -12,15 +12,15 @@ import pasteManager from './pasteManager';
import storage from './storage'; import storage from './storage';
import metrics from './metrics'; import metrics from './metrics';
import experiments from './experiments'; import experiments from './experiments';
import Raven from 'raven-js'; import * as Sentry from '@sentry/browser';
import './main.css'; import './main.css';
import User from './user'; import User from './user';
import { getTranslator } from './locale'; import { getTranslator } from './locale';
import Archive from './archive'; import Archive from './archive';
import { setTranslate, locale } from './utils'; import { setTranslate, locale } from './utils';
if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) { if (navigator.doNotTrack !== '1' && window.SENTRY_CONFIG) {
Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install(); Sentry.init(window.SENTRY_CONFIG);
} }
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
@@ -47,6 +47,7 @@ if (process.env.NODE_ENV === 'production') {
const translate = await getTranslator(locale()); const translate = await getTranslator(locale());
setTranslate(translate); setTranslate(translate);
// eslint-disable-next-line require-atomic-updates
window.initialState = { window.initialState = {
LIMITS, LIMITS,
DEFAULTS, DEFAULTS,
@@ -55,13 +56,14 @@ if (process.env.NODE_ENV === 'production') {
capabilities, capabilities,
translate, translate,
storage, storage,
raven: Raven, sentry: Sentry,
user: new User(storage, LIMITS, window.AUTH_CONFIG), user: new User(storage, LIMITS, window.AUTH_CONFIG),
transfer: null, transfer: null,
fileInfo: null fileInfo: null
}; };
const app = routes(choo()); const app = routes(choo({ hash: true }));
// eslint-disable-next-line require-atomic-updates
window.app = app; window.app = app;
app.use(experiments); app.use(experiments);
app.use(metrics); app.use(metrics);

View File

@@ -107,9 +107,10 @@ function completedUpload(archive, duration) {
}); });
} }
function stoppedUpload(archive) { function stoppedUpload(archive, duration = 0) {
return addEvent('client_upload', { return addEvent('client_upload', {
download_limit: archive.dlimit, download_limit: archive.dlimit,
duration: sizeOrder(duration),
file_count: archive.numFiles, file_count: archive.numFiles,
password_protected: !!archive.password, password_protected: !!archive.password,
size: sizeOrder(archive.size), size: sizeOrder(archive.size),

View File

@@ -2,7 +2,7 @@ const choo = require('choo');
const download = require('./ui/download'); const download = require('./ui/download');
const body = require('./ui/body'); const body = require('./ui/body');
module.exports = function(app = choo()) { module.exports = function(app = choo({ hash: true })) {
app.route('/', body(require('./ui/home'))); app.route('/', body(require('./ui/home')));
app.route('/download/:id', body(download)); app.route('/download/:id', body(download));
app.route('/download/:id/:key', body(download)); app.route('/download/:id/:key', body(download));
@@ -13,6 +13,7 @@ module.exports = function(app = choo()) {
app.route('/oauth', function(state, emit) { app.route('/oauth', function(state, emit) {
emit('authenticate', state.query.code, state.query.state); emit('authenticate', state.query.code, state.query.state);
}); });
app.route('/login', body(require('./ui/home')));
app.route('*', body(require('./ui/notFound'))); app.route('*', body(require('./ui/notFound')));
return app; return app;
}; };

View File

@@ -11,13 +11,14 @@ const map = new Map();
const IMAGES = /.*\.(png|svg|jpg)$/; const IMAGES = /.*\.(png|svg|jpg)$/;
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/; const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/;
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/; const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
const FONT = /\.woff2?$/;
self.addEventListener('install', event => { self.addEventListener('install', event => {
event.waitUntil(precache()); event.waitUntil(precache());
}); });
self.addEventListener('activate', event => { self.addEventListener('activate', event => {
event.waitUntil(self.clients.claim()); event.waitUntil(self.clients.claim().then(cleanCache));
}); });
async function decryptStream(id) { async function decryptStream(id) {
@@ -83,16 +84,23 @@ async function decryptStream(id) {
} }
async function precache() { async function precache() {
const cache = await caches.open(version);
const images = assets.match(IMAGES);
await cache.addAll(images);
return self.skipWaiting();
}
async function cleanCache() {
const oldCaches = await caches.keys(); const oldCaches = await caches.keys();
for (const c of oldCaches) { for (const c of oldCaches) {
if (c !== version) { if (c !== version) {
await caches.delete(c); await caches.delete(c);
} }
} }
const cache = await caches.open(version); }
const images = assets.match(IMAGES);
await cache.addAll(images); function cacheable(url) {
return self.skipWaiting(); return VERSIONED_ASSET.test(url) || FONT.test(url);
} }
async function cachedOrFetched(req) { async function cachedOrFetched(req) {
@@ -102,7 +110,7 @@ async function cachedOrFetched(req) {
return cached; return cached;
} }
const fetched = await fetch(req); const fetched = await fetch(req);
if (fetched.ok && VERSIONED_ASSET.test(req.url)) { if (fetched.ok && cacheable(req.url)) {
cache.put(req, fetched.clone()); cache.put(req, fetched.clone());
} }
return fetched; return fetched;
@@ -115,7 +123,7 @@ self.onfetch = event => {
const dlmatch = DOWNLOAD_URL.exec(url.pathname); const dlmatch = DOWNLOAD_URL.exec(url.pathname);
if (dlmatch) { if (dlmatch) {
event.respondWith(decryptStream(dlmatch[1])); event.respondWith(decryptStream(dlmatch[1]));
} else if (VERSIONED_ASSET.test(url.pathname)) { } else if (cacheable(url.pathname)) {
event.respondWith(cachedOrFetched(req)); event.respondWith(cachedOrFetched(req));
} }
}; };

View File

@@ -1,4 +1,4 @@
/* global ReadableStream TransformStream */ /* global TransformStream */
export function transformStream(readable, transformer, oncancel) { export function transformStream(readable, transformer, oncancel) {
try { try {

View File

@@ -85,7 +85,7 @@ class Account extends Component {
/> />
<ul <ul
id="accountMenu" id="accountMenu"
class="invisible list-reset absolute pin-t pin-r mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50" class="invisible absolute top-0 right-0 mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50"
onblur="${e => this.hideMenu(e)}" onblur="${e => this.hideMenu(e)}"
> >
<li class="p-2 text-grey-dark">${user.email}</li> <li class="p-2 text-grey-dark">${user.email}</li>

View File

@@ -120,7 +120,7 @@ function fileInfo(file, action) {
function archiveInfo(archive, action) { function archiveInfo(archive, action) {
return html` return html`
<p class="w-full flex items-center"> <p class="w-full flex items-center">
<img class="mr-3 flex-no-shrink" src="${assets.get('blue_file.svg')}"/> <img class="mr-3 flex-shrink-0" src="${assets.get('blue_file.svg')}"/>
<p class="flex-grow"> <p class="flex-grow">
<h1 class="text-base font-medium word-break-all">${archive.name}</h1> <h1 class="text-base font-medium word-break-all">${archive.name}</h1>
<div class="text-sm font-normal opacity-75 pt-1">${bytes( <div class="text-sm font-normal opacity-75 pt-1">${bytes(
@@ -155,7 +155,7 @@ function archiveDetails(translate, archive) {
num: archive.manifest.files.length num: archive.manifest.files.length
})} })}
</summary> </summary>
${list(archive.manifest.files.map(f => fileInfo(f)), 'list-reset')} ${list(archive.manifest.files.map(f => fileInfo(f)))}
</details> </details>
`; `;
} }
@@ -213,7 +213,7 @@ module.exports = function(state, emit, archive) {
html` html`
<input <input
type="image" type="image"
class="self-start flex-no-shrink text-white hover:opacity-75 focus:outline" class="self-start flex-shrink-0 text-white hover:opacity-75 focus:outline"
alt="${state.translate('deleteButtonHover')}" alt="${state.translate('deleteButtonHover')}"
title="${state.translate('deleteButtonHover')}" title="${state.translate('deleteButtonHover')}"
src="${assets.get('close-16.svg')}" src="${assets.get('close-16.svg')}"
@@ -256,9 +256,7 @@ module.exports = function(state, emit, archive) {
try { try {
await navigator.share({ await navigator.share({
title: state.translate('-send-brand'), title: state.translate('-send-brand'),
text: `Download "${ text: `Download "${archive.name}" with Firefox Send: simple, safe file sharing`,
archive.name
}" with Firefox Send: simple, safe file sharing`,
//state.translate('shareMessage', { name }), //state.translate('shareMessage', { name }),
url: archive.url url: archive.url
}); });
@@ -278,11 +276,11 @@ module.exports.wip = function(state, emit) {
.map(f => .map(f =>
fileInfo(f, remove(f, state.translate('deleteButtonHover'))) fileInfo(f, remove(f, state.translate('deleteButtonHover')))
), ),
'flex-shrink bg-grey-lightest rounded-t list-reset overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen', 'flex-shrink bg-grey-lightest rounded-t overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen',
'bg-white px-2 my-2 shadow-light rounded' 'bg-white px-2 my-2 shadow-light rounded'
)} )}
<div <div
class="flex-no-shrink flex-grow flex items-end p-4 bg-grey-lightest rounded-b mb-1 font-medium" class="flex-shrink-0 flex-grow flex items-end p-4 bg-grey-lightest rounded-b mb-1 font-medium"
> >
<input <input
id="file-upload" id="file-upload"
@@ -315,7 +313,7 @@ module.exports.wip = function(state, emit) {
${expiryOptions(state, emit)} ${password(state, emit)} ${expiryOptions(state, emit)} ${password(state, emit)}
<button <button
id="upload-btn" id="upload-btn"
class="btn rounded-lg flex-no-shrink focus:outline" class="btn rounded-lg flex-shrink-0 focus:outline"
title="${state.translate('uploadButton')}" title="${state.translate('uploadButton')}"
onclick="${upload}" onclick="${upload}"
> >
@@ -509,7 +507,7 @@ module.exports.preview = function(state, emit) {
</div> </div>
<button <button
id="download-btn" id="download-btn"
class="btn rounded-lg mt-4 w-full flex-no-shrink focus:outline" class="btn rounded-lg mt-4 w-full flex-shrink-0 focus:outline"
title="${state.translate('downloadButtonLabel')}" title="${state.translate('downloadButtonLabel')}"
onclick=${download} onclick=${download}
> >

View File

@@ -8,9 +8,7 @@ function banner(state) {
return; // server side return; // server side
} }
const show = const show =
!state.capabilities.standalone && !state.capabilities.standalone && !state.route.startsWith('/unsupported/');
!/firefox/i.test(navigator.userAgent) &&
!state.route.startsWith('/unsupported/');
if (show) { if (show) {
return state.cache(Promo, 'promo').render(); return state.cache(Promo, 'promo').render();
} }

View File

@@ -7,7 +7,7 @@ module.exports = function(name, url) {
<send-copy-dialog <send-copy-dialog
class="flex flex-col items-center text-center p-4 max-w-sm m-auto" class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
> >
<h1 class="font-bold my-4"> <h1 class="text-3xl font-bold my-4">
${state.translate('notifyUploadEncryptDone')} ${state.translate('notifyUploadEncryptDone')}
</h1> </h1>
<p class="font-normal leading-normal text-grey-darkest word-break-all"> <p class="font-normal leading-normal text-grey-darkest word-break-all">
@@ -22,7 +22,7 @@ module.exports = function(name, url) {
readonly="true" readonly="true"
/> />
<button <button
class="btn rounded-lg w-full flex-no-shrink focus:outline" class="btn rounded-lg w-full flex-shrink-0 focus:outline"
onclick="${copy}" onclick="${copy}"
title="${state.translate('copyLinkButton')}" title="${state.translate('copyLinkButton')}"
> >

View File

@@ -22,7 +22,9 @@ function downloading(state, emit) {
<div <div
class="flex flex-col w-full h-full items-center md:justify-center md:-mt-8" class="flex flex-col w-full h-full items-center md:justify-center md:-mt-8"
> >
<h1 class="mb-4">${state.translate('downloadingTitle')}</h1> <h1 class="text-3xl font-bold mb-4">
${state.translate('downloadingTitle')}
</h1>
${archiveTile.downloading(state, emit)} ${archiveTile.downloading(state, emit)}
</div> </div>
`; `;
@@ -36,7 +38,9 @@ function preview(state, emit) {
<div <div
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center" class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
> >
<h1 class="mb-4">${state.translate('downloadTitle')}</h1> <h1 class="text-3xl font-bold mb-4">
${state.translate('downloadTitle')}
</h1>
<p class="w-full text-grey-darkest text-center leading-normal"> <p class="w-full text-grey-darkest text-center leading-normal">
${state.translate('downloadDescription')} ${state.translate('downloadDescription')}
</p> </p>

View File

@@ -7,7 +7,7 @@ module.exports = function(state) {
id="download-complete" id="download-complete"
class="flex flex-col items-center justify-center h-full w-full bg-white p-2" class="flex flex-col items-center justify-center h-full w-full bg-white p-2"
> >
<h1 class="text-center font-bold my-2"> <h1 class="text-center text-3xl font-bold my-2">
${state.translate('downloadFinish')} ${state.translate('downloadFinish')}
</h1> </h1>
<img src="${assets.get('completed.svg')}" class="my-12 h-48" /> <img src="${assets.get('completed.svg')}" class="my-12 h-48" />

View File

@@ -8,7 +8,9 @@ module.exports = function(state, emit) {
<div <div
class="h-full w-full flex flex-col items-center justify-center bg-white py-8 max-w-md mx-auto" class="h-full w-full flex flex-col items-center justify-center bg-white py-8 max-w-md mx-auto"
> >
<h1 class="mb-4">${state.translate('downloadTitle')}</h1> <h1 class="text-3xl font-bold mb-4">
${state.translate('downloadTitle')}
</h1>
<p class="w-full mb-4 text-center text-grey-darkest leading-normal"> <p class="w-full mb-4 text-center text-grey-darkest leading-normal">
${state.translate('downloadDescription')} ${state.translate('downloadDescription')}
</p> </p>

View File

@@ -9,7 +9,7 @@ module.exports = function(state, emit) {
<section <section
class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big" class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big"
> >
<h1 class="text-center font-bold my-2"> <h1 class="text-center text-3xl font-bold my-2">
${state.translate('errorPageHeader')} ${state.translate('errorPageHeader')}
</h1> </h1>
<img class="my-12 h-48" src="${assets.get('error.svg')}" /> <img class="my-12 h-48" src="${assets.get('error.svg')}" />

View File

@@ -28,7 +28,7 @@ class Footer extends Component {
Mozilla Mozilla
</a> </a>
<ul <ul
class="list-reset flex flex-col md:flex-row items-start md:items-center md:justify-end" class="flex flex-col md:flex-row items-start md:items-center md:justify-end"
> >
<li class="m-2"> <li class="m-2">
<a href="https://www.mozilla.org/about/legal/terms/services/#send"> <a href="https://www.mozilla.org/about/legal/terms/services/#send">

View File

@@ -20,11 +20,7 @@ module.exports = function(state, emit) {
const right = const right =
archives.length === 0 archives.length === 0
? intro(state) ? intro(state)
: list( : list(archives, 'p-2 h-full overflow-y-auto w-full', 'mb-4 w-full');
archives,
'list-reset p-2 h-full overflow-y-auto w-full',
'mb-4 w-full'
);
return html` return html`
<main class="main"> <main class="main">

View File

@@ -7,7 +7,7 @@ module.exports = function intro(state) {
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"
> >
<div class="mt-12 flex flex-col h-full"> <div class="mt-12 flex flex-col h-full">
<h1 class="font-bold md:pb-2"> <h1 class="text-3xl font-bold md:pb-2">
${state.translate('introTitle')} ${state.translate('introTitle')}
</h1> </h1>
<p class="max-w-sm leading-loose mt-6 md:mt-2 md:pr-14"> <p class="max-w-sm leading-loose mt-6 md:mt-2 md:pr-14">

View File

@@ -8,7 +8,9 @@ module.exports = function(state, emit) {
<div <div
class="flex flex-col items-center bg-white m-4 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full" class="flex flex-col items-center bg-white m-4 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
> >
<h1 class="text-center">${state.translate('legalTitle')}</h1> <h1 class="text-center text-3xl font-bold">
${state.translate('legalTitle')}
</h1>
<p class="mt-2">${state.translate('legalDateStamp')}</p> <p class="mt-2">${state.translate('legalDateStamp')}</p>
<div class="overflow-y-scroll py-8 px-12"> <div class="overflow-y-scroll py-8 px-12">
<p class="leading-normal"> <p class="leading-normal">

View File

@@ -3,11 +3,11 @@ const html = require('choo/html');
module.exports = function(state, emit) { module.exports = function(state, emit) {
return html` return html`
<send-modal <send-modal
class="absolute pin flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-xl md:my-8" class="absolute inset-0 flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-xl md:my-8"
onclick="${close}" onclick="${close}"
> >
<div <div
class="h-full w-full max-h-screen absolute pin-t flex items-center justify-center" class="h-full w-full max-h-screen absolute top-0 flex items-center justify-center"
> >
<div class="w-full" onclick="${e => e.stopPropagation()}"> <div class="w-full" onclick="${e => e.stopPropagation()}">
${state.modal(state, emit, close)} ${state.modal(state, emit, close)}

View File

@@ -8,7 +8,9 @@ module.exports = function(state, emit) {
<div <div
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center" class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
> >
<h1 class="mb-4">${state.translate('downloadTitle')}</h1> <h1 class="mb-4 text-3xl font-bold">${state.translate(
'downloadTitle'
)}</h1>
<p <p
class="w-full p-2 border border-yellow-light rounded md:w-4/5 text-orange-dark bg-yellow-lighter text-center leading-normal" class="w-full p-2 border border-yellow-light rounded md:w-4/5 text-orange-dark bg-yellow-lighter text-center leading-normal"
> >
@@ -17,7 +19,7 @@ module.exports = function(state, emit) {
<form class="md:w-128" onsubmit=${submit}> <form class="md:w-128" onsubmit=${submit}>
<fieldset class="border rounded p-4 my-4" onchange=${optionChanged}> <fieldset class="border rounded p-4 my-4" onchange=${optionChanged}>
<div class="flex items-center mb-2"> <div class="flex items-center mb-2">
<img class="mr-3 flex-no-shrink" src="${assets.get( <img class="mr-3 flex-shrink-0" src="${assets.get(
'blue_file.svg' 'blue_file.svg'
)}"/> )}"/>
<p class="flex-grow"> <p class="flex-grow">
@@ -49,7 +51,7 @@ module.exports = function(state, emit) {
</div> </div>
</fieldset> </fieldset>
<input <input
class="btn rounded-lg w-full flex flex-no-shrink items-center justify-center" class="btn rounded-lg w-full flex flex-shrink-0 items-center justify-center"
value="${state.translate('copyLinkButton')}" value="${state.translate('copyLinkButton')}"
title="${state.translate('copyLinkButton')}" title="${state.translate('copyLinkButton')}"
type="submit" /> type="submit" />

View File

@@ -9,7 +9,7 @@ module.exports = function(state, emit) {
<section <section
class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big" class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big"
> >
<h1 class="text-center font-bold my-2"> <h1 class="text-center text-3xl font-bold my-2">
${state.translate('expiredTitle')} ${state.translate('expiredTitle')}
</h1> </h1>
<img src="${assets.get('notFound.svg')}" class="my-12" /> <img src="${assets.get('notFound.svg')}" class="my-12" />

View File

@@ -4,9 +4,11 @@ module.exports = function(message) {
return function(state, emit, close) { return function(state, emit, close) {
return html` return html`
<send-ok-dialog class="flex flex-col max-w-sm p-4 m-auto"> <send-ok-dialog class="flex flex-col max-w-sm p-4 m-auto">
<h2 class="text-center m-8 leading-normal">${message}</h2> <h2 class="text-center text-xl font-bold m-8 leading-normal">
${message}
</h2>
<button <button
class="btn rounded-lg w-full flex-no-shrink" class="btn rounded-lg w-full flex-shrink-0"
onclick="${close}" onclick="${close}"
title="${state.translate('okButton')}" title="${state.translate('okButton')}"
> >

View File

@@ -15,20 +15,20 @@ class Promo extends Component {
createElement() { createElement() {
return html` return html`
<send-promo <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-darkest px-4 py-3 flex border-b border-grey-banner leading-normal"
> >
<div class="flex items-center mx-auto"> <div class="flex items-center mx-auto">
<img <img
src="${assets.get('firefox_logo-only.svg')}" src="${assets.get('master-logo.svg')}"
class="w-6" class="w-6 h-6"
alt="Firefox" alt="Firefox"
/> />
<span class="ml-3"> <span class="ml-2 sm:ml-4 text-xs sm:text-base">
${this.state.translate('downloadFirefoxPromo')}${' '} ${this.state.translate('trailheadPromo')}${' '}
<a <a
class="text-blue" class="underline text-blue-dark"
href="https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com" 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('downloadFirefox')}</a >${this.state.translate('learnMore')}</a
> >
</span> </span>
</div> </div>

View File

@@ -6,7 +6,7 @@ module.exports = function(name, url) {
<send-share-dialog <send-share-dialog
class="flex flex-col items-center text-center p-4 max-w-sm m-auto" class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
> >
<h1 class="font-bold my-4"> <h1 class="text-3xl font-bold my-4">
${state.translate('notifyUploadEncryptDone')} ${state.translate('notifyUploadEncryptDone')}
</h1> </h1>
<p class="font-normal leading-normal text-grey-darkest word-break-all"> <p class="font-normal leading-normal text-grey-darkest word-break-all">
@@ -21,7 +21,7 @@ module.exports = function(name, url) {
readonly="true" readonly="true"
/> />
<button <button
class="btn rounded-lg w-full flex-no-shrink focus:outline" class="btn rounded-lg w-full flex-shrink-0 focus:outline"
onclick="${share}" onclick="${share}"
title="${state.translate('shareLinkButton')}" title="${state.translate('shareLinkButton')}"
> >

View File

@@ -12,14 +12,11 @@ module.exports = function(trigger) {
<send-signup-dialog <send-signup-dialog
class="flex flex-col lg:flex-row justify-center px-8 md:px-24 w-full h-full" class="flex flex-col lg:flex-row justify-center px-8 md:px-24 w-full h-full"
> >
<img <img src="${assets.get('master-logo.svg')}" class="h-16 mt-1 mb-4" />
src="${assets.get('firefox_logo-only.svg')}"
class="h-16 mt-1 mb-4"
/>
<section <section
class="flex flex-col flex-no-shrink self-center lg:mx-6 lg:max-w-xs" class="flex flex-col flex-shrink-0 self-center lg:mx-6 lg:max-w-xs"
> >
<h1 class="font-bold text-center lg:text-left"> <h1 class="text-3xl font-bold text-center lg:text-left">
${state.translate('accountBenefitTitle')} ${state.translate('accountBenefitTitle')}
</h1> </h1>
<ul <ul
@@ -49,7 +46,7 @@ module.exports = function(trigger) {
placeholder=${state.translate('emailPlaceholder')} placeholder=${state.translate('emailPlaceholder')}
/> />
<input <input
class="btn rounded-lg w-full flex flex-no-shrink items-center justify-center" class="btn rounded-lg w-full flex flex-shrink-0 items-center justify-center"
value="${state.translate('signInOnlyButton')}" value="${state.translate('signInOnlyButton')}"
title="${state.translate('signInOnlyButton')}" title="${state.translate('signInOnlyButton')}"
id="email-submit" id="email-submit"

View File

@@ -13,7 +13,7 @@ module.exports = function() {
<send-survey-dialog <send-survey-dialog
class="flex flex-col items-center text-center p-4 max-w-sm m-auto" class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
> >
<h1 class="font-bold my-4"> <h1 class="text-3xl font-bold my-4">
Tell us what you think. Tell us what you think.
</h1> </h1>
<p class="font-normal leading-normal text-grey-darkest px-4"> <p class="font-normal leading-normal text-grey-darkest px-4">
@@ -21,7 +21,7 @@ module.exports = function() {
it better. it better.
</p> </p>
<a <a
class="btn rounded-lg w-full flex-no-shrink focus:outline my-5" class="btn rounded-lg w-full flex-shrink-0 focus:outline my-5"
onclick="${() => emit('closeModal')}" onclick="${() => emit('closeModal')}"
title="Give feedback" title="Give feedback"
href="${surveyUrl}" href="${surveyUrl}"

View File

@@ -29,7 +29,7 @@ module.exports = function(state, emit) {
<section <section
class="flex flex-col items-center justify-center text-center bg-white m-6 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full" class="flex flex-col items-center justify-center text-center bg-white m-6 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
> >
<h1 class="">${strings.header}</h1> <h1 class="text-3xl font-bold">${strings.header}</h1>
<p class="mt-4 mb-8 max-w-md leading-normal">${strings.description}</p> <p class="mt-4 mb-8 max-w-md leading-normal">${strings.description}</p>
${why} ${why}
<a href="${url}" class="btn rounded-lg mt-8 px-8"> <a href="${url}" class="btn rounded-lg mt-8 px-8">

68
docs/deployment.md Normal file
View 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"
```

7371
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "firefox-send", "name": "firefox-send",
"description": "File Sharing Experiment", "description": "File Sharing Experiment",
"version": "3.0.11", "version": "3.0.17",
"author": "Mozilla (https://mozilla.org)", "author": "Mozilla (https://mozilla.org)",
"repository": "mozilla/send", "repository": "mozilla/send",
"homepage": "https://github.com/mozilla/send/", "homepage": "https://github.com/mozilla/send/",
@@ -35,7 +35,8 @@
"hooks": { "hooks": {
"pre-commit": "lint-staged", "pre-commit": "lint-staged",
"pre-push": "npm test", "pre-push": "npm test",
"post-merge": "npm install" "post-merge": "npm install",
"post-checkout": "scripts/sync-npm-dependencies.sh"
} }
}, },
"lint-staged": { "lint-staged": {
@@ -60,65 +61,66 @@
"node": ">=10.0.0" "node": ">=10.0.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.4.4", "@babel/core": "^7.5.5",
"@babel/plugin-proposal-class-properties": "^7.4.4", "@babel/plugin-proposal-class-properties": "^7.5.5",
"@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/preset-env": "^7.4.4", "@babel/preset-env": "^7.5.5",
"@dannycoates/webcrypto-liner": "^0.1.37", "@dannycoates/webcrypto-liner": "^0.1.37",
"@fullhuman/postcss-purgecss": "^1.2.0", "@fullhuman/postcss-purgecss": "^1.2.0",
"@mattiasbuelens/web-streams-polyfill": "0.2.1", "@mattiasbuelens/web-streams-polyfill": "0.2.1",
"@sentry/browser": "^5.6.3",
"asmcrypto.js": "^0.22.0", "asmcrypto.js": "^0.22.0",
"babel-loader": "^8.0.5", "babel-loader": "^8.0.6",
"babel-plugin-istanbul": "^5.1.4", "babel-plugin-istanbul": "^5.2.0",
"base64-js": "^1.3.0", "base64-js": "^1.3.1",
"content-disposition": "^0.5.3", "content-disposition": "^0.5.3",
"copy-webpack-plugin": "^5.0.3", "copy-webpack-plugin": "^5.0.4",
"core-js": "^3.0.1", "core-js": "^3.2.1",
"crc": "^3.8.0", "crc": "^3.8.0",
"cross-env": "^5.2.0", "cross-env": "^5.2.1",
"css-loader": "^2.1.1", "css-loader": "^3.2.0",
"css-mqpacker": "^7.0.0", "css-mqpacker": "^7.0.0",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
"eslint": "^5.16.0", "eslint": "^6.3.0",
"eslint-plugin-mocha": "^5.3.0", "eslint-config-prettier": "^6.2.0",
"eslint-plugin-node": "^8.0.1", "eslint-plugin-mocha": "^6.1.0",
"eslint-plugin-node": "^9.2.0",
"eslint-plugin-security": "^1.4.0", "eslint-plugin-security": "^1.4.0",
"expose-loader": "^0.7.5", "expose-loader": "^0.7.5",
"extract-loader": "^3.1.0", "extract-loader": "^3.1.0",
"extract-text-webpack-plugin": "^4.0.0-beta.0", "extract-text-webpack-plugin": "^4.0.0-beta.0",
"fast-text-encoding": "^1.0.0", "fast-text-encoding": "^1.0.0",
"file-loader": "^3.0.1", "file-loader": "^4.2.0",
"fluent-intl-polyfill": "^0.1.0",
"git-rev-sync": "^1.12.0", "git-rev-sync": "^1.12.0",
"html-loader": "^0.5.5", "html-loader": "^0.5.5",
"http_ece": "^1.1.0", "http_ece": "^1.1.0",
"husky": "^2.2.0", "husky": "^3.0.5",
"lint-staged": "^8.1.6", "intl-pluralrules": "^1.0.3",
"mocha": "^6.1.4", "lint-staged": "^9.2.5",
"mocha": "^6.2.0",
"morgan": "^1.9.1", "morgan": "^1.9.1",
"nanobus": "^4.4.0", "nanobus": "^4.4.0",
"nanohtml": "^1.6.1", "nanohtml": "^1.8.1",
"nanotiming": "^7.3.1", "nanotiming": "^7.3.1",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"nyc": "^14.1.0", "nyc": "^14.1.1",
"postcss-loader": "^3.0.0", "postcss-loader": "^3.0.0",
"postcss-preset-env": "^6.6.0", "postcss-preset-env": "^6.7.0",
"prettier": "^1.17.0", "prettier": "^1.18.2",
"proxyquire": "^2.1.0", "proxyquire": "^2.1.3",
"puppeteer": "^1.15.0", "puppeteer": "^1.19.0",
"raven-js": "^3.27.0", "raw-loader": "^3.1.0",
"raw-loader": "^2.0.0", "redis-mock": "^0.46.0",
"redis-mock": "^0.43.0", "rimraf": "^3.0.0",
"rimraf": "^2.6.3",
"script-loader": "^0.7.2", "script-loader": "^0.7.2",
"sinon": "^7.3.2", "sinon": "^7.4.2",
"string-hash": "^1.1.3", "string-hash": "^1.1.3",
"stylelint": "^10.0.1", "stylelint": "^10.1.0",
"stylelint-config-standard": "^18.3.0", "stylelint-config-standard": "^18.3.0",
"stylelint-no-unsupported-browser-features": "^3.0.2", "stylelint-no-unsupported-browser-features": "^3.0.2",
"svgo": "^1.2.2", "svgo": "^1.3.0",
"svgo-loader": "^2.2.0", "svgo-loader": "^2.2.1",
"tailwindcss": "^0.7.4", "tailwindcss": "^1.1.2",
"val-loader": "^1.1.1", "val-loader": "^1.1.1",
"wdio-docker-service": "^1.4.2", "wdio-docker-service": "^1.4.2",
"wdio-dot-reporter": "0.0.10", "wdio-dot-reporter": "0.0.10",
@@ -128,39 +130,41 @@
"wdio-selenium-standalone-service": "0.0.12", "wdio-selenium-standalone-service": "0.0.12",
"wdio-spec-reporter": "^0.1.5", "wdio-spec-reporter": "^0.1.5",
"webdriverio": "^4.14.4", "webdriverio": "^4.14.4",
"webpack": "^4.30.0", "webpack": "4.38.0",
"webpack-cli": "^3.3.1", "webpack-cli": "^3.3.7",
"webpack-dev-middleware": "^3.6.2", "webpack-dev-middleware": "^3.7.1",
"webpack-dev-server": "^3.3.1", "webpack-dev-server": "^3.8.0",
"webpack-manifest-plugin": "^2.0.4", "webpack-manifest-plugin": "^2.0.4",
"webpack-unassert-loader": "^1.2.0" "webpack-unassert-loader": "^1.2.0"
}, },
"dependencies": { "dependencies": {
"@google-cloud/storage": "^2.5.0", "@dannycoates/express-ws": "^5.0.3",
"aws-sdk": "^2.449.0", "@fluent/bundle": "^0.13.0",
"@fluent/langneg": "^0.3.0",
"@google-cloud/storage": "^3.2.1",
"@sentry/node": "^5.6.2",
"aws-sdk": "^2.523.0",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"choo": "^6.13.3", "choo": "^7.0.0",
"cldr-core": "^35.1.0", "cldr-core": "^35.1.0",
"convict": "^4.4.1", "configstore": "github:dannycoates/configstore#master",
"express": "^4.16.3", "convict": "^5.1.0",
"express-ws": "github:dannycoates/express-ws", "express": "^4.17.1",
"fluent": "^0.12.0",
"fluent-langneg": "^0.1.1",
"fxa-geodb": "^1.0.4", "fxa-geodb": "^1.0.4",
"helmet": "^3.17.0", "helmet": "^3.21.0",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"mozlog": "^2.2.0", "mozlog": "^2.2.0",
"node-fetch": "^2.5.0", "node-fetch": "^2.6.0",
"raven": "^2.6.4",
"redis": "^2.8.0", "redis": "^2.8.0",
"selenium-standalone": "^6.15.6", "selenium-standalone": "^6.15.6",
"ua-parser-js": "^0.7.19", "ua-parser-js": "^0.7.20"
"websocket-stream": "^5.5.0"
}, },
"availableLanguages": [ "availableLanguages": [
"en-US", "en-US",
"ar",
"ast", "ast",
"bn-BD", "bn",
"br",
"ca", "ca",
"cak", "cak",
"cs", "cs",
@@ -175,9 +179,12 @@
"es-CL", "es-CL",
"es-ES", "es-ES",
"es-MX", "es-MX",
"et",
"eu",
"fi", "fi",
"fr", "fr",
"fy-NL", "fy-NL",
"he",
"hr", "hr",
"hsb", "hsb",
"hu", "hu",
@@ -189,8 +196,12 @@
"kab", "kab",
"ko", "ko",
"lt", "lt",
"ml",
"nb-NO",
"nl", "nl",
"nn-NO", "nn-NO",
"oc",
"pa-IN",
"pl", "pl",
"pt-BR", "pt-BR",
"pt-PT", "pt-PT",
@@ -200,10 +211,13 @@
"sl", "sl",
"sq", "sq",
"sr", "sr",
"su",
"sv-SE", "sv-SE",
"th",
"tr", "tr",
"uk", "uk",
"vi", "vi",
"zgh",
"zh-CN", "zh-CN",
"zh-TW" "zh-TW"
] ]

View File

@@ -6,7 +6,7 @@ class TailwindExtractor {
const options = { const options = {
plugins: [ plugins: [
require('tailwindcss')('./tailwind.js'), require('tailwindcss')('./tailwind.config.js'),
require('postcss-preset-env') require('postcss-preset-env')
] ]
}; };

View File

@@ -182,3 +182,4 @@ shareLinkDescription = شارِك الرابط الذي يصل إلى الملف
shareLinkButton = شارِك الرابط shareLinkButton = شارِك الرابط
# $name is the name of the file # $name is the name of the file
shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة
learnMore = اطّلع على المزيد.

View File

@@ -126,7 +126,7 @@ addPassword = পাসওয়ার্ড দ্বারা সুরক্ষ
emailPlaceholder = আপনার ইমেইল দিন emailPlaceholder = আপনার ইমেইল দিন
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন
signInButton = সাইন ইন/আপ signInOnlyButton = সাইন ইন
accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন
@@ -145,3 +145,11 @@ noStreamsWarning = এই ব্রাউজার এতো বড় একট
noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন
noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন
noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন
downloadFirefoxPromo = { -send-short-brand } আপনারদের জন্য নিয়ে এসেছে একেবারে নতুন { -firefox }।
# the next line after the colon contains a file name
shareLinkDescription = আপনার ফাইলে লিঙ্ক শেয়ার করুন:
shareLinkButton = লিঙ্ক শেয়ার করুন
# $name is the name of the file
shareMessage = { -send-brand } এর মাধ্যমে "{ $name }" ডাউনলোড করুন: সরল, নিরাপদ ফাইল শেয়ারিং
trailheadPromo = আপনার গোপনীয়তা রক্ষা করার একটি উপায় আছে। Firefox এ যোগ দিন।
learnMore = আরও জানুন।

182
public/locales/br/send.ftl Normal file
View 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.

View File

@@ -196,5 +196,5 @@ shareLinkDescription = Sdílet odkaz na soubor:
shareLinkButton = Sdílet odkaz shareLinkButton = Sdílet odkaz
# $name is the name of the file # $name is the name of the file
shareMessage = Stáhněte si soubor „{ $name }“ s { -send-brand(case: "ins") } - jednoduché a bezpečné sdílení souborů shareMessage = Stáhněte si soubor „{ $name }“ s { -send-brand(case: "ins") } - jednoduché a bezpečné sdílení souborů
trailheadPromo = Existuje snadný způsob pro ochranu vašeho soukromí. Používejte Firefox. trailheadPromo = Existuje způsob, jak ochránit své soukromí. Používejte Firefox.
learnMore = Zjistit více. learnMore = Zjistit více.

View File

@@ -187,3 +187,5 @@ shareLinkDescription = Rhannu'r ddolen i'ch ffeil:
shareLinkButton = Rhannu'r ddolen shareLinkButton = Rhannu'r ddolen
# $name is the name of the file # $name is the name of the file
shareMessage = Llwytho i lawr “{ $name }” gyda { -send-brand }: rhannu ffeiliau syml a diogel 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.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Del linket til din fil:
shareLinkButton = Del link shareLinkButton = Del link
# $name is the name of the file # $name is the name of the file
shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling
trailheadPromo = Beskyt dine digitale rettigheder. Slut dig til Firefox.
learnMore = Læs mere.

View File

@@ -169,3 +169,5 @@ shareLinkDescription = Źělśo wótkaz k swójej dataji:
shareLinkButton = Wótkaz źěliś shareLinkButton = Wótkaz źěliś
# $name is the name of the file # $name is the name of the file
shareMessage = Ześěgniśo „{ $name }“ z { -send-brand }: jadnore, wěste źělenje datajow 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.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Μοιραστείτε το σύνδεσμο του αρ
shareLinkButton = Κοινή χρήση συνδέσμου shareLinkButton = Κοινή χρήση συνδέσμου
# $name is the name of the file # $name is the name of the file
shareMessage = Λήψη του “{ $name }” με το { -send-brand }: απλός και ασφαλής διαμοιρασμός αρχείων shareMessage = Λήψη του “{ $name }” με το { -send-brand }: απλός και ασφαλής διαμοιρασμός αρχείων
trailheadPromo = Υπάρχει τρόπος να προστατέψετε το απόρρητό σας. Γίνετε μέλος του Firefox.
learnMore = Μάθετε περισσότερα.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Share the link to your file:
shareLinkButton = Share link shareLinkButton = Share link
# $name is the name of the file # $name is the name of the file
shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing
trailheadPromo = There is a way to protect your privacy. Join Firefox.
learnMore = Learn more.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Compartir el enlace con tu dispositivo:
shareLinkButton = Compartir el enlace shareLinkButton = Compartir el enlace
# $name is the name of the file # $name is the name of the file
shareMessage = Descargar "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura 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.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Comparte el enlace a tu dispositivo:
shareLinkButton = Compartir enlace shareLinkButton = Compartir enlace
# $name is the name of the file # $name is the name of the file
shareMessage = Baja "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura 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.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Compartir el enlace a tu archivo:
shareLinkButton = Compartir enlace shareLinkButton = Compartir enlace
# $name is the name of the file # $name is the name of the file
shareMessage = Descargar “{ $name }” con { -send-brand }: comparte archivos de forma segura y sencilla 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.

View File

@@ -126,7 +126,7 @@ addPassword = Protegido con contraseña
emailPlaceholder = Ingresa tu correo electrónico emailPlaceholder = Ingresa tu correo electrónico
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = Iniciar sesión para enviar hasta { $size } signInSizeBump = Iniciar sesión para enviar hasta { $size }
signInButton = Iniciar sesión/registrarse signInOnlyButton = Iniciar sesión
accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = Compartir archivos de hasta { $size } accountBenefitLargeFiles = Compartir archivos de hasta { $size }
@@ -145,3 +145,11 @@ noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan gr
noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador
noStreamsOptionFirefox = Prueba nuestro navegador favorito noStreamsOptionFirefox = Prueba nuestro navegador favorito
noStreamsOptionDownload = Continuar con este navegador noStreamsOptionDownload = Continuar con este navegador
downloadFirefoxPromo = { -send-short-brand } te lo ofrece el nuevo { -firefox }.
# the next line after the colon contains a file name
shareLinkDescription = Comparte el enlace a tu archivo:
shareLinkButton = Enlace para compartir
# $name is the name of the file
shareMessage = Descarga «{ $name }» con { -send-brand }: es sencillo y seguro
trailheadPromo = Existe una forma de proteger tu privacidad. Únete a Firefox.
learnMore = Saber más.

View File

@@ -23,7 +23,7 @@ fileSizeProgress = ({ $totalSize } / { $partialSize })
sendYourFilesLink = Probatu Firefox Send sendYourFilesLink = Probatu Firefox Send
errorPageHeader = Zerbait gaizki joan da! errorPageHeader = Zerbait gaizki joan da!
fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du. fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du.
linkExpiredAlt = Lotura iraungita linkExpiredAlt = Lotura iraungi da
notSupportedHeader = Zure nabigatzailea ez da onartzen. notSupportedHeader = Zure nabigatzailea ez da onartzen.
notSupportedLink = Zergatik ez da nire nabigatzailea onartzen? notSupportedLink = Zergatik ez da nire nabigatzailea onartzen?
notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Firefox Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu. notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Firefox Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu.
@@ -50,10 +50,34 @@ passwordSetError = Pasahitz hau ezin da ezarri
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized # Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
-send-brand = Firefox Send -send-brand = Firefox Send
-send-short-brand = Send
-firefox = Firefox -firefox = Firefox
-mozilla = Mozilla -mozilla = Mozilla
introTitle = Partekatu fitxategiak modu sinple eta pribatuan introTitle = Partekatu fitxategiak modu sinple eta pribatuan
introDescription = { -send-brand } tresna fitxategiak partekatzeko da, muturretik muturrera zifratuta eta automatikoki iraungitzen diren loturekin. Hortaz, partekatzen duzuna pribatua izango da eta ziur egon zaitezke zure fitxategiak ez direla online egongo betirako.
notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = { $downloadCount } edo { $timespan } ondoren iraungiko da
timespanMinutes =
{ $num ->
[one] minutu 1
*[other] { $num } minutu
}
timespanDays =
{ $num ->
[one] egun 1
*[other] { $num } egun
}
timespanWeeks =
{ $num ->
[one] aste 1
*[other] { $num } aste
}
fileCount =
{ $num ->
[one] fitxategi 1
*[other] { $num } fitxategi
}
# byte abbreviation # byte abbreviation
bytes = B bytes = B
# kibibyte abbreviation # kibibyte abbreviation
@@ -64,9 +88,33 @@ mb = MB
gb = GB gb = GB
# localized number and byte abbreviation. example "2.5MB" # localized number and byte abbreviation. example "2.5MB"
fileSize = { $num }{ $units } fileSize = { $num }{ $units }
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
totalSize = Tamaina guztira: { $size }
# the next line after the colon contains a file name
copyLinkDescription = Kopiatu fitxategia partekatzeko lotura:
copyLinkButton = Kopiatu lotura
downloadTitle = Deskargatu fitxategiak downloadTitle = Deskargatu fitxategiak
downloadDescription = { -send-brand } bidez partekatu da fitxategia muturretik muturrera zifratuta eta automatikoki iraungitzen den lotura batekin.
trySendDescription = Probatu { -send-brand } fitxategiak partekatzeko modu sinple eta segururako.
# count will always be > 10
tooManyFiles =
{ $count ->
[one] Soilik fitxategi bakarra igo daiteke aldi berean.
*[other] Soilik { $count } fitxategi igo daitezke aldi berean.
}
# count will always be > 10
tooManyArchives =
{ $count ->
[one] Soilik artxibo bakarra onartzen da.
*[other] Soilik { $count } artxibo onartzen dira.
}
expiredTitle = Lotura hau iraungi da.
notSupportedDescription = { -send-brand } ez da nabigatzaile honetan ibiliko. { -send-short-brand } hobeto dabil { -firefox }(r)en azken bertsioarekin; halaber, nabigatzaile gehienen azken bertsioarekin ibiliko da.
downloadFirefox = Deskargatu { -firefox } downloadFirefox = Deskargatu { -firefox }
legalTitle = { -send-short-brand } pribatutasun-oharra
legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa. legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa.
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
expiresDaysHoursMinutes = { $days }e { $hours }h { $minutes }m
addFilesButton = Hautatu igotzeko fitxategiak addFilesButton = Hautatu igotzeko fitxategiak
uploadButton = Igo uploadButton = Igo
# the first part of the string 'Drag and drop files or click to send up to 1GB' # the first part of the string 'Drag and drop files or click to send up to 1GB'
@@ -76,8 +124,32 @@ dragAndDropFiles = Arrastatu eta jaregin fitxategiak
orClickWithSize = edo egin klik { $size } arte igotzeko orClickWithSize = edo egin klik { $size } arte igotzeko
addPassword = Babestu pasahitzarekin addPassword = Babestu pasahitzarekin
emailPlaceholder = Idatzi zure helbide elektronikoa emailPlaceholder = Idatzi zure helbide elektronikoa
signInButton = Hasi saioa/eman izena # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = Hasi saioa { $size } arte bidaltzeko
signInOnlyButton = Hasi saioa
accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak
accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin
accountBenefitTimeLimit =
{ $count ->
[one] Utzi loturak erabilgarri egun batez
*[other] Utzi loturak erabilgarri { $count } egunez
}
accountBenefitSync = Kudeatu partekatutako fitxategiak edozein gailutatik
accountBenefitMoz = { -mozilla }ren beste zerbitzuei buruzko argibide gehiago
signOut = Amaitu saioa
okButton = Ados
downloadingTitle = Deskargatzen
noStreamsWarning = Baliteke nabigatzailea gai ez izatea horrelako tamaina handiko fitxategiak deszifratzeko.
noStreamsOptionCopy = Kopiatu lotura beste nabigatzaile batean irekitzeko
noStreamsOptionFirefox = Probatu gure nabigatzaile gogokoena
noStreamsOptionDownload = Jarraitu nabigatzaile honekin
downloadFirefoxPromo = Erabat berritutako { -firefox }(e)k eskaintzen dizu { -send-short-brand }
# the next line after the colon contains a file name
shareLinkDescription = Partekatu zure fitxategirako lotura:
shareLinkButton = Partekatu lotura
# $name is the name of the file
shareMessage = Deskargatu "{ $name }" { -send-brand } erabiliz: fitxategi-partekatze sinple eta segurua
trailheadPromo = Badago zure pribatutasuna babesteko modua. Egizu bat Firefoxekin.
learnMore = Argibide gehiago.

View File

@@ -1,31 +1,9 @@
# Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
title = Firefox Send title = Firefox Send
siteSubtitle = آزمایش وب
siteFeedback = بازخورد siteFeedback = بازخورد
uploadPageHeader = اشتراک‌گذاری پرونده‌ها، رمزنگاری شده و خصوصی
uploadPageExplainer = پرونده های خود را به صورت ایمن، خصوصی و رمزنگاری شده با تعیین تاریخ انقضا خودکار ارسال کنید تا اطمینان پیدا کنید چیزهای شما همیشه آنلاین باقی نماند.
uploadPageLearnMore = بیشتر بدانید
uploadPageDropMessage = برای شروع بارگذاری پرونده‌های خود را اینجا بیاندازید
uploadPageSizeMessage = برای بیشترین قابلیت اطمینان، بهتر است که پرونده‌تان کمتر از ۱ گیگابایت باشد
uploadPageBrowseButton = یک پرونده را از روی کامپیوتر خود انتخاب کنید
uploadPageBrowseButton1 = یک پرونده را برای بارگذاری انتخاب کنید
uploadPageMultipleFilesAlert = بارگذاری چندین پرونده یا یک پوشه در حال حاضر پشتیبانی نمی‌شود.
uploadPageBrowseButtonTitle = بارگذاری پرونده
uploadingPageProgress = در حال بارگذاری پرونده { $filename } ({ $size })
importingFile = در حال وارد کردن… importingFile = در حال وارد کردن…
verifyingFile = در حال تایید…
encryptingFile = در حال رمزنگاری… encryptingFile = در حال رمزنگاری…
decryptingFile = در حال رمزگشایی… decryptingFile = در حال رمزگشایی…
notifyUploadDone = بارگذاری شما پایان یافت.
uploadingPageMessage = به محض بارگذاری پرونده شما قادر خواهید بود برای آن گزینه انقضا تعیین کنید.
uploadingPageCancel = لغو بارگذاری
uploadCancelNotification = بارگذاری شما لغو شد
uploadingPageLargeFileMessage = پرونده بزرگ است و ممکن است بارگذاری آن مدتی طول بکشد. محکم بشینید!
uploadingFileNotification = هر وقت بارگذاری تمام شد به من اطلاع بده.
uploadSuccessConfirmHeader = آماده برای ارسال
uploadSvgAlt = بارگذاری
uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد.
expireInfo = این پیوند به فایل شما پس از { $downloadCount } یا { $timespan } منقضی خواهد شد.
downloadCount = downloadCount =
{ $num -> { $num ->
[one] ۱ بارگیری [one] ۱ بارگیری
@@ -36,76 +14,26 @@ timespanHours =
[one] ۱ ساعت [one] ۱ ساعت
*[other] { $num } ساعت *[other] { $num } ساعت
} }
copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename }
copyUrlFormButton = رونوشت به کلیپ‌بورد
copiedUrl = رونوشت شد! copiedUrl = رونوشت شد!
deleteFileButton = حذف پرونده
sendAnotherFileLink = ارسال پرونده دیگر
# Alternative text used on the download link/button (indicates an action).
downloadAltText = دریافت
downloadsFileList = دریافت‌ها
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = زمان
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = بارگیری { $filename }
downloadFileSize = ({ $size })
unlockInputLabel = گذرواژه را وارد کنید
unlockInputPlaceholder = گذرواژه unlockInputPlaceholder = گذرواژه
unlockButtonLabel = باز کردن unlockButtonLabel = باز کردن
downloadFileTitle = دریافت پروندهٔ رمزنگاری شده
# Firefox Send is a brand name and should not be localized.
downloadMessage = دوست شما درحال ارسال پرونده ای به وسیله Firefox Send است،‌ این سرویس این امکان را به شما می‌دهد تا پرونده‌های خود را به صورت ایمن،‌خصوصی و رمزنگاری شده به همراه پیوند انقضا خودکار همرسانی کنید تا اطمینان حاصل کنید چیزهای شما برای همیشه آنلاین باقی نخواهد ماند.
# Text and title used on the download link/button (indicates an action).
downloadButtonLabel = بارگیری downloadButtonLabel = بارگیری
downloadNotification = بارگیری شما کامل شد.
downloadFinish = بارگیری کامل شد downloadFinish = بارگیری کامل شد
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } از { $totalSize }) fileSizeProgress = ({ $partialSize } از { $totalSize })
# Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Firefox Send را امتحان کنید sendYourFilesLink = Firefox Send را امتحان کنید
downloadingPageProgress = دریافت { $filename } ({ $size })
downloadingPageMessage = لطفا این زبانه را باز بگذارید در حالی که ما فایل شما را دریافت می‌کنیم و کدگذاری می‌کنیم.
errorAltText = خطا در بارگذاری
errorPageHeader = چیزی دچار اشکال شده است! errorPageHeader = چیزی دچار اشکال شده است!
errorPageMessage = خطایی در هنگام بارگذاری پرونده شما رخ داده است.
errorPageLink = پرونده دیگری ارسال کنید.
fileTooBig = این پرونده بسیار حجیم است. حجم آن می‌بایستی کم تر { $size } باشد. fileTooBig = این پرونده بسیار حجیم است. حجم آن می‌بایستی کم تر { $size } باشد.
linkExpiredAlt = پیوند منقضی شده است linkExpiredAlt = پیوند منقضی شده است
expiredPageHeader = پیوند منقضی شده است یا در از همان ابتدا وجود نداشته است!
notSupportedHeader = مرورگر شما پشتیبانی نمی‌کند. notSupportedHeader = مرورگر شما پشتیبانی نمی‌کند.
# Firefox Send is a brand name and should not be localized.
notSupportedDetail = متاسفانه این مرورگر این تکنولوژی وب را که به Firefox Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما بایستی مرورگری دیگری را امتحان کنید. پیشنهاد ما به شما فایرفاکس است !
notSupportedLink = چرا مرورگر من پشتیبانی نمی‌کند؟ notSupportedLink = چرا مرورگر من پشتیبانی نمی‌کند؟
notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما نیاز دارید تا مرورگر خود را بروز کنید. notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما نیاز دارید تا مرورگر خود را بروز کنید.
updateFirefox = بروزرسانی فایرفاکس updateFirefox = بروزرسانی فایرفاکس
downloadFirefoxButtonSub = دریافت رایگان
uploadedFile = پرونده‌
copyFileList = رونوشت از نشانی
# expiryFileList is used as a column header
expiryFileList = زمان انقضا
deleteFileList = حذف
nevermindButton = بیخیال
legalHeader = شرایط و حریم‌خصوصی
legalNoticeTestPilot = Firefox Send در حال حاضر در نسخه آزمایشی خود به صورت می‌دهد و تحت عنوان خلبان آموزشی <a>شرایط و خدمات</a> و <a>موارد حریم خصوصی </a> کار می‌کند. شما می‌توانید اطلاعات بیشتر در مورد این آزمایش و اطلاعات که ذخیره می‌کنید را از <a> اینجا </a> کسب کنید.
legalNoticeMozilla = استفاده از Firefox Send همچنین منصوب به موزیلا است. <a>پایگاه اینترنتی نکات حریم شخصی </a> و <a> پایگاه اطلاع رسانی شرایط خدمات و استفاده </a>.
deletePopupText = حذف این پرونده؟
deletePopupYes = بله
deletePopupCancel = انصراف deletePopupCancel = انصراف
deleteButtonHover = حذف deleteButtonHover = حذف
copyUrlHover = رونوشت از نشانی
footerLinkLegal = ملاحظات حقوقی footerLinkLegal = ملاحظات حقوقی
# Test Pilot is a proper name and should not be localized.
footerLinkAbout = درباره Test Pilot
footerLinkPrivacy = حریم‌خصوصی footerLinkPrivacy = حریم‌خصوصی
footerLinkTerms = شرایط
footerLinkCookies = کوکی‌ها footerLinkCookies = کوکی‌ها
requirePasswordCheckbox = دریافت این پرونده نیاز به گذرواژه دارد
addPasswordButton = افزودن گذرواژه
changePasswordButton = تغییر
passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید. passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید.
reportIPInfringement = گزارش تخلف IP
javascriptRequired = Firefox Send نیازمند جاوااسکریپت است javascriptRequired = Firefox Send نیازمند جاوااسکریپت است
whyJavascript = چرا Firefox Send جاوااسکریپت لازم داد؟ whyJavascript = چرا Firefox Send جاوااسکریپت لازم داد؟
enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید. enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید.
@@ -113,9 +41,25 @@ enableJavascript = لطفا جاوااسکریپت را فعال کنید و م
expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes } دقیقه expiresMinutes = { $minutes } دقیقه
# A short status message shown when a password is successfully set
passwordIsSet = گذرواژه تنظیم شد
# A short status message shown when the user enters a long password # A short status message shown when the user enters a long password
maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $length } maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $length }
# A short status message shown when there was an error setting the password # A short status message shown when there was an error setting the password
passwordSetError = امکان ثبت این گذواژه نیست passwordSetError = امکان ثبت این گذواژه نیست
## Send version 2 strings
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
-send-brand = Firefox Send
-send-short-brand = ارسال
-firefox = فایرفاکس
-mozilla = موزیلا
# 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 }

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Jaa linkki tiedostoosi:
shareLinkButton = Jaa linkki shareLinkButton = Jaa linkki
# $name is the name of the file # $name is the name of the file
shareMessage = Lataa tiedosto ”{ $name }” { -send-brand } -palvelusta: yksinkertaista ja turvallista tiedostonjakoa shareMessage = Lataa tiedosto ”{ $name }” { -send-brand } -palvelusta: yksinkertaista ja turvallista tiedostonjakoa
trailheadPromo = On tapa suojata yksityisyyttään. Liity Firefoxiin.
learnMore = Lue lisää.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Diel de keppeling nei jo bestân:
shareLinkButton = Keppeling diele shareLinkButton = Keppeling diele
# $name is the name of the file # $name is the name of the file
shareMessage = Download { $name } mei { -send-brand }: ienfâldich, feilich bestannen diele 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.

View File

@@ -1,66 +1,158 @@
# Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
title = Firefox Send title = Firefox Send
siteSubtitle = ניסוי אינטרנט
siteFeedback = משוב siteFeedback = משוב
uploadPageHeader = שיתוף קבצים פרטי, מוצפן
uploadPageExplainer = לשלוח קבצים דרך קישור בטוח, פרטי ומוצפן שפג אוטומטית, כדי לוודא שהתכנים הפרטיים שלך לא יהיו ברשת לנצח.
uploadPageLearnMore = מידע נוסף
uploadPageDropMessage = יש לגרור קבצים לכאן כדי להתחיל בהעלאה
uploadPageSizeMessage = להשגת ביצועים מיטביים, מוטב לשמור על הקובץ מתחת לגודל של 1 ג״ב
uploadPageBrowseButton1 = נא לבחור קובץ להעלאה
uploadPageMultipleFilesAlert = העלאה של מספר קבצים או ספריה אינה נתמכת כרגע.
uploadPageBrowseButtonTitle = העלאת קובץ
uploadingPageProgress = { $filename } ({ $size }) בהעלאה
importingFile = מתבצע ייבוא... importingFile = מתבצע ייבוא...
verifyingFile = מתבצע אימות…
encryptingFile = מתבצעת הצפנה... encryptingFile = מתבצעת הצפנה...
decryptingFile = מתבצע פענוח... decryptingFile = מתבצע פענוח...
notifyUploadDone = ההעלאה שלך הסתיימה downloadCount =
uploadingPageMessage = אחרי שהקובץ שלך יעלה, ניתן יהיה להגדיר אפשרויות תפוגה. { $num ->
uploadCancelNotification = ההעלאה שלך בוטלה. [one] הורדה אחת
uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות! *[other] { $num } הורדות
uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה. }
uploadSuccessConfirmHeader = מוכן לשליחה timespanHours =
uploadSvgAlt = העלאה { $num ->
uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות. [one] שעה אחת
copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename } [two] שעתיים
*[other] { $num } שעות
}
copiedUrl = הועתק! copiedUrl = הועתק!
deleteFileButton = מחיקת קובץ unlockInputPlaceholder = ססמה
sendAnotherFileLink = שליחת קובץ נוסף unlockButtonLabel = שחרור נעילה
# Alternative text used on the download link/button (indicates an action).
downloadAltText = הורדה
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = ההורדה נכשלה
downloadFileSize = ({ $size })
# Text and title used on the download link/button (indicates an action).
downloadButtonLabel = הורדה downloadButtonLabel = הורדה
downloadNotification = ההורדה הושלמה.
downloadFinish = ההורדה הושלמה downloadFinish = ההורדה הושלמה
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } מתוך { $totalSize }) fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
downloadingPageProgress = בהורדה: { $filename } ({ $size }) sendYourFilesLink = נסו את Firefox Send
errorAltText = תקלה בהעלאה
errorPageHeader = משהו השתבש! errorPageHeader = משהו השתבש!
errorPageLink = שליחת קובץ נוסף
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }. fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
linkExpiredAlt = הקישור פג linkExpiredAlt = הקישור פג
notSupportedHeader = הדפדפן שלך לא נתמך. notSupportedHeader = הדפדפן שלך לא נתמך.
notSupportedLink = למה אין תמיכה בדפדפן שלי? notSupportedLink = למה אין תמיכה בדפדפן שלי?
downloadFirefoxButtonSub = הורדה בחינם notSupportedOutdatedDetail = לצערנו גרסת Firefox זו לא תומכת בטכנולוגית הרשת שמפעילה את Firefox Send. יש לעדכן את הגרסה של הדפדפן שלך.
uploadedFile = קובץ updateFirefox = עדכון Firefox
copyFileList = העתקת כתובת
# expiryFileList is used as a column header
expiryFileList = יפוג בעוד
deleteFileList = מחיקה
nevermindButton = לא משנה
legalHeader = תנאי שירות ופרטיות
deletePopupText = למחוק דף זה?
deletePopupYes = כן
deletePopupCancel = ביטול deletePopupCancel = ביטול
deleteButtonHover = מחיקה deleteButtonHover = מחיקה
copyUrlHover = העתקת קישור
footerLinkLegal = מידע משפטי footerLinkLegal = מידע משפטי
footerLinkPrivacy = פרטיות footerLinkPrivacy = פרטיות
footerLinkTerms = תנאי שימוש
footerLinkCookies = קובצי עוגיות footerLinkCookies = קובצי עוגיות
passwordTryAgain = סיסמה שגויה. נא לנסות שוב.
javascriptRequired = ל־Firefox Send דרוש JavaScript
whyJavascript = למה ל־Firefox Send דרוש JavaScript?
enableJavascript = נא להפעיל JavaScript ולנסות שוב.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours } שע׳ { $minutes } דק׳
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes } דק׳
# A short status message shown when the user enters a long password
maxPasswordLength = אורך הססמה המרבי: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = לא ניתן להגדיר את הססמה הזאת
## Send version 2 strings
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
-send-brand = Firefox Send
-send-short-brand = Send
-firefox = Firefox
-mozilla = Mozilla
introTitle = שיתוף קבצים פרטי ופשוט
introDescription = { -send-brand } מאפשר לך לשתף קבצים עם הצפנה מקצה לקצה וקישור עם תפוגה אוטומטית. בצורה זו תוכלו לשתף קבצים באופן פרטי ולהבטיח שהדברים שלכם לא נשארים ברשת לנצח.
notifyUploadEncryptDone = הקובץ שלך מוצפן ומוכן לשליחה
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = יפוג לאחר { $downloadCount } או { $timespan }
timespanMinutes =
{ $num ->
[one] דקה אחת
*[other] { $num } דקות
}
timespanDays =
{ $num ->
[one] יום אחד
[two] יומיים
*[other] { $num } ימים
}
timespanWeeks =
{ $num ->
[one] שבוע אחד
[two] שבועיים
*[other] { $num } שבועות
}
fileCount =
{ $num ->
[one] קובץ אחד
*[other] { $num } קבצים
}
# byte abbreviation
bytes = בתים
# kibibyte abbreviation
kb = ק״ב
# mebibyte abbreviation
mb = מ״ב
# gibibyte abbreviation
gb = ג״ב
# localized number and byte abbreviation. example "2.5MB"
fileSize = { $num } { $units }
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
totalSize = גודל כולל: { $size }
# the next line after the colon contains a file name
copyLinkDescription = יש להעתיק את הקישור כדי לשתף את הקובץ שלך:
copyLinkButton = העתקת קישור
downloadTitle = הורדת קבצים
downloadDescription = קובץ זה שותף באמצעות { -send-brand } עם הצפנה מקצה לקצה וקישור שפג באופן אוטומטי.
trySendDescription = כדאי לנסות את { -send-brand } לשיתוף קבצים פשוט ומאובטח.
# count will always be > 10
tooManyFiles =
{ $count ->
[one] ניתן להעלות רק קובץ אחד בכל פעם.
*[other] ניתן להעלות רק { $count } קבצים בכל פעם.
}
# count will always be > 10
tooManyArchives =
{ $count ->
[one] רק ארכיון אחד מורשה.
*[other] רק { $count } ארכיונים מורשים.
}
expiredTitle = פג תוקפו של קישור זה.
notSupportedDescription = { -send-brand } לא יפעל עם דפדפן זה. { -send-short-brand } פועל בצורה הטובה ביותר עם הגרסה העדכנית ביותר של { -firefox }, ויעבוד עם הגרסה הנוכחית של רוב הדפדפנים.
downloadFirefox = הורדת { -firefox }
legalTitle = הצהרת פרטיות של { -send-short-brand }
legalDateStamp = גרסה 1.0, בתאריך 12 במרץ 2019
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
expiresDaysHoursMinutes = { $days } ימים { $hours } שעות { $minutes } דקות
addFilesButton = בחירת קבצים להעלאה
uploadButton = העלאה
# the first part of the string 'Drag and drop files or click to send up to 1GB'
dragAndDropFiles = גרירה והשלכת קבצים
# the second part of the string 'Drag and drop files or click to send up to 1GB'
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
orClickWithSize = או ללחוץ כדי לשלוח קבצים עד לגודל של { $size }
addPassword = הגנה באמצעות ססמה
emailPlaceholder = נא להכניס כתובת דוא״ל
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = נא להירשם כדי לשלוח קבצים עד גודל של { $size }
signInOnlyButton = כניסה
accountBenefitTitle = נא ליצור חשבון { -firefox } או להיכנס לחשבון
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = שיתוף קבצים עד גודל של { $size }
accountBenefitDownloadCount = שיתוף קבצים עם יותר אנשים
accountBenefitTimeLimit =
{ $count ->
[one] שמירה על קישורים פעילים עד ליום אחד
*[other] שמירה על קישורים פעילים עד ל־{ $count } ימים
}
accountBenefitSync = ניהול קבצים משותפים מכל מכשיר
accountBenefitMoz = מידע נוסף על שירותי { -mozilla } אחרים
signOut = יציאה
okButton = אישור
downloadingTitle = בהורדה
noStreamsWarning = ייתכן שדפדפן זה לא יוכל לפענח קובץ בגודל כזה.
noStreamsOptionCopy = העתקת הקישור לפתיחה בדפדפן אחר
noStreamsOptionFirefox = נסו את הדפדפן המועדף עלינו
noStreamsOptionDownload = המשך בדפדפן זה
downloadFirefoxPromo = { -send-short-brand } מובא אליך בחסות { -firefox }
# the next line after the colon contains a file name
shareLinkDescription = שיתוף הקישור לקובץ שלך:
shareLinkButton = שיתוף קישור
# $name is the name of the file
shareMessage = הורדת ״{ $name }״ עם { -send-brand }: שיתוף קבצים פשוט ובטוח
trailheadPromo = ישנן דרכים נוספות להגן על הפרטיות שלכם. הצטרפו אל Firefox.
learnMore = מידע נוסף.

View File

@@ -160,3 +160,5 @@ shareLinkDescription = Dijelite poveznicu na svoju datoteku:
shareLinkButton = Dijeli poveznicu shareLinkButton = Dijeli poveznicu
# $name is the name of the file # $name is the name of the file
shareMessage = Preuzmite “{ $name }” sa { -send-brand }: jednostavno i sigurno dijeljenje datoteka shareMessage = 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.

View File

@@ -169,3 +169,5 @@ shareLinkDescription = Dźělće wotkaz k swojej dataji:
shareLinkButton = Wotkaz dźělić shareLinkButton = Wotkaz dźělić
# $name is the name of the file # $name is the name of the file
shareMessage = Sćehńće „{ $name }“ z { -send-brand }: jednore, wěste dźělenje datajow 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.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Ossza meg a fájlja hivatkozását:
shareLinkButton = Hivatkozás megosztása shareLinkButton = Hivatkozás megosztása
# $name is the name of the file # $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 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.

View File

@@ -123,7 +123,7 @@ dragAndDropFiles = Traher e deponer files
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
orClickWithSize = o cliccar pro inviar usque { $size } orClickWithSize = o cliccar pro inviar usque { $size }
addPassword = Proteger per contrasigno addPassword = Proteger per contrasigno
emailPlaceholder = Insere tu adresse email emailPlaceholder = Insere tu adresse de e-mail
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = Accede pro inviar usque { $size } signInSizeBump = Accede pro inviar usque { $size }
signInOnlyButton = Authentica te signInOnlyButton = Authentica te

View File

@@ -142,3 +142,5 @@ shareLinkDescription = Bagikan tautan ke berkas Anda:
shareLinkButton = Bagikan tautan shareLinkButton = Bagikan tautan
# $name is the name of the file # $name is the name of the file
shareMessage = Unduh "{ $name }" dengan { -send-brand }: berbagi berkas dengan sederhana dan aman shareMessage = Unduh "{ $name }" dengan { -send-brand }: berbagi berkas dengan sederhana dan aman
trailheadPromo = Ada cara untuk melindungi privasi Anda. Bergabunglah dengan Firefox.
learnMore = Pelajari lebih lanjut.

View File

@@ -140,3 +140,5 @@ shareLinkDescription = ファイルへのリンクを共有しましょう:
shareLinkButton = リンクを共有 shareLinkButton = リンクを共有
# $name is the name of the file # $name is the name of the file
shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有 shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有
trailheadPromo = プライバシーを保護する方法があります。Firefox を試してください。
learnMore = 詳細情報

View File

@@ -54,6 +54,10 @@ passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded
-firefox = Firefox -firefox = Firefox
-mozilla = Mozilla -mozilla = Mozilla
introTitle = Afessas, beṭṭu n ifuyla s wudem uslig introTitle = Afessas, beṭṭu n ifuyla s wudem uslig
introDescription = { -send-brand } ad k(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 = timespanMinutes =
{ $num -> { $num ->
[one] 1 n tsedat [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 copyLinkDescription = Nɣel aseɣwen akken ad tebḍuḍ afaylu-inek
copyLinkButton = Nɣel aseɣwen copyLinkButton = Nɣel aseɣwen
downloadTitle = Sider ifuyla downloadTitle = Sider ifuyla
downloadDescription = Afaylu-a yettwabḍa s { -send-brand } s uwgelhen s ṭṭerf ɣer ṭṭerf s useɣwen ara yemmten s wudem awurman.
trySendDescription = Ɛreḍ { -send-brand } i beḍḍu afessas n ifuyla s wudem ameɣtu.
# count will always be > 10
tooManyFiles =
{ $count ->
[one] Ala 1 n ufaylu i yemzren ad yali i tikkelt.
*[other] Ala { $count } n yifuyla i yemzren ad alin i tikkelt.
}
# count will always be > 10
tooManyArchives =
{ $count ->
[one] Ala 1 n teṛcibt i yettwasirgen.
*[other] Ala { $count } n teṛcibin i yettwasiregn.
}
expiredTitle = Immut useɣwen. expiredTitle = Immut useɣwen.
notSupportedDescription = { -send-brand } ur iteddu ara s yiminig-a. { -send-short-brand } iteddu akken iwata s lqem aneggaru n { -firefox }, daɣen iteddu s lqem amiran n tuget n yiminigen.
downloadFirefox = Sider { -firefox } downloadFirefox = Sider { -firefox }
legalTitle = Tasertit tabaḍnit n { -send-short-brand }
legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 2019 legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 2019
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
expiresDaysHoursMinutes = { $days } ass { $hours } srg { $minutes } tsd
addFilesButton = Fren ifuyla ad tessaliḍ addFilesButton = Fren ifuyla ad tessaliḍ
uploadButton = Sali uploadButton = Sali
# the first part of the string 'Drag and drop files or click to send up to 1GB' # the first part of the string 'Drag and drop files or click to send up to 1GB'
dragAndDropFiles = Ẓuɣer sakin sers ifuyla dragAndDropFiles = Ẓuɣer sakin sers ifuyla
# the second part of the string 'Drag and drop files or click to send up to 1GB'
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
orClickWithSize = neɣ sit akken ad tazneḍ arma d { $size }
addPassword = Ḥrez s wawal uffir addPassword = Ḥrez s wawal uffir
emailPlaceholder = Sekcem imayl inek emailPlaceholder = Sekcem imayl inek
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ɣ signOut = Ffeɣ
okButton = IH okButton = IH
downloadingTitle = Azdam downloadingTitle = Azdam
noStreamsWarning = Iminig-a ur yezmir ara ad yezmek afaylu meqqren.
noStreamsOptionCopy = Nɣel aseɣwen i tulya deg yiminig-nniden
noStreamsOptionFirefox = Ɛreḍ iminig-ik ufrin
noStreamsOptionDownload = Kemmel akked iminig-a noStreamsOptionDownload = Kemmel akked iminig-a
downloadFirefoxPromo = { -send-short-brand } yettwasumer i yal { -firefox } amaynut.
# the next line after the colon contains a file name
shareLinkDescription = Bḍu aseɣwen ɣer ufaylu-ik:
shareLinkButton = Bḍu aseɣwen
# $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.

View File

@@ -4,7 +4,7 @@ siteFeedback = 사용자 의견
importingFile = 가져오는 중… importingFile = 가져오는 중…
encryptingFile = 암호화 중… encryptingFile = 암호화 중…
decryptingFile = 복호화 중… decryptingFile = 복호화 중…
downloadCount = { $num } 다운로드 downloadCount = 다운로드 { $num }
timespanHours = 1 시간 timespanHours = 1 시간
copiedUrl = 복사 완료! copiedUrl = 복사 완료!
unlockInputPlaceholder = 비밀번호 unlockInputPlaceholder = 비밀번호
@@ -49,7 +49,7 @@ introTitle = 간단하고, 사생활을 보호하는 파일 공유
introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다. introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다.
notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다 notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = { $downloadCount } { $timespan } 후 만료됨 archiveExpiryInfo = { $downloadCount } 혹은 { $timespan } 후 만료됨
timespanMinutes = timespanMinutes =
{ $num -> { $num ->
*[other] { $num }분 *[other] { $num }분
@@ -112,7 +112,7 @@ addPassword = 비밀번호로 파일 보호
emailPlaceholder = 이메일 입력 emailPlaceholder = 이메일 입력
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인 signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인
signInButton = 로그인/등록 signInOnlyButton = 로그인
accountBenefitTitle = { -firefox } 계정을 하나 만들거나, 로그인 accountBenefitTitle = { -firefox } 계정을 하나 만들거나, 로그인
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = { $size }까지의 파일 공유 accountBenefitLargeFiles = { $size }까지의 파일 공유
@@ -130,3 +130,11 @@ noStreamsWarning = 이 브라우저는 이렇게 큰 용량의 파일 암호화
noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사 noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사
noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요 noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요
noStreamsOptionDownload = 이 브라우저로 계속하기 noStreamsOptionDownload = 이 브라우저로 계속하기
downloadFirefoxPromo = 완전히 새로운 { -firefox }로 { -send-short-brand }가 제공됩니다.
# the next line after the colon contains a file name
shareLinkDescription = 파일 링크 공유:
shareLinkButton = 링크 공유
# $name is the name of the file
shareMessage = { -send-brand }으로 “{ $name }” 파일을 내려받으세요: 쉽고 안전한 파일 공유입니다.
trailheadPromo = 개인 정보를 보호하는 방법이 있습니다. 파이어폭스와 함께 하세요.
learnMore = 자세히 알아보기

View File

@@ -168,3 +168,5 @@ shareLinkDescription = Pasidalinkite saitu į jūsų failą:
shareLinkButton = Dalintis saitu shareLinkButton = Dalintis saitu
# $name is the name of the file # $name is the name of the file
shareMessage = Atsisiųskite „{ $name }“ su „{ -send-brand }“: paprastas, saugus dalinimasis failais shareMessage = Atsisiųskite „{ $name }“ su „{ -send-brand }“: paprastas, saugus dalinimasis failais
trailheadPromo = Yra būdas apsaugoti jūsų privatumą. Naudokite „Firefox“.
learnMore = Sužinoti daugiau.

View File

@@ -54,6 +54,7 @@ passwordSetError = Dette passordet kunne ikke settes
-firefox = Firefox -firefox = Firefox
-mozilla = Mozilla -mozilla = Mozilla
introTitle = Enkel, privat fildeling introTitle = Enkel, privat fildeling
introDescription = { -send-brand } lar deg dele filer via en tidsbegrenset lenke med ende-til-ende-kryptering. På den måten kan du dele filer privat og samtidig være trygg på at filene dine ikke blir liggende på nettet for alltid.
notifyUploadEncryptDone = Filen din er kryptert og klar til å sende notifyUploadEncryptDone = Filen din er kryptert og klar til å sende
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = Utløper etter { $downloadCount } eller { $timespan } archiveExpiryInfo = Utløper etter { $downloadCount } eller { $timespan }
@@ -77,9 +78,78 @@ fileCount =
[one] 1 fil [one] 1 fil
*[other] { $num } filer *[other] { $num } filer
} }
# size is a localized number followed by a unit of bytes, ex. 2.5GB # 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 = Total størrelse: { $size } totalSize = Total størrelse: { $size }
# the next line after the colon contains a file name # the next line after the colon contains a file name
copyLinkDescription = Kopier lenken for å dele filen din: copyLinkDescription = Kopier lenken for å dele filen din:
copyLinkButton = Kopier lenke copyLinkButton = Kopier lenke
downloadTitle = Last ned filer downloadTitle = Last ned filer
downloadDescription = Denne filen ble delt via { -send-brand } med ende-til-ende-kryptering og en lenke som automatisk utløper.
trySendDescription = Prøv { -send-brand } for enkel, sikker fildeling.
# count will always be > 10
tooManyFiles =
{ $count ->
[one] Kun 1 fil kan lastes opp om gangen.
*[other] Kun { $count } filer kan lastes opp om gangen.
}
# count will always be > 10
tooManyArchives =
{ $count ->
[one] Kun 1 arkiv er tillatt.
*[other] Kun { $count } arkiver er tillatt.
}
expiredTitle = Denne lenken er utløpt.
notSupportedDescription = { -send-brand } virker ikke med denne nettleseren. { -send-short-brand } fungerer best med den nyeste versjonen av { -firefox }, og vil fungere med den nyeste versjonen av de fleste nettlesere.
downloadFirefox = Last ned { -firefox }
legalTitle = { -send-short-brand } Personvernerklæring
legalDateStamp = Versjon 1.0, datert den 12. mars 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 }t { $minutes }m
addFilesButton = Velg filer du vil laste opp
uploadButton = Last opp
# the first part of the string 'Drag and drop files or click to send up to 1GB'
dragAndDropFiles = Dra og slipp filer
# 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 = eller klikk for å sende filer på opptil { $size }
addPassword = Beskytt med passord
emailPlaceholder = Skriv inn e-postadressen din
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = Logg inn for å sende opptil { $size }
signInOnlyButton = Logg inn
accountBenefitTitle = Opprett en { -firefox }-konto eller logg inn
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = Del filer på opptil { $size }
accountBenefitDownloadCount = Del filer med flere personer
accountBenefitTimeLimit =
{ $count ->
[one] Hold lenker aktiv opptil 1 dag
*[other] Hold lenker aktiv opptil { $count } dager
}
accountBenefitSync = Behandle delte filer fra en hvilken som helst enhet
accountBenefitMoz = Les om andre { -mozilla }-tjenester
signOut = Logg ut
okButton = OK
downloadingTitle = Laster ned
noStreamsWarning = Denne nettleseren kan kanskje ikke dekryptere en så stor fil.
noStreamsOptionCopy = Kopier lenken for å åpne den i en annen nettleser
noStreamsOptionFirefox = Prøv favorittnettleseren vår
noStreamsOptionDownload = Fortsett med denne nettleseren
downloadFirefoxPromo = { -send-short-brand } presenteres for deg av den helt nye { -firefox }.
# the next line after the colon contains a file name
shareLinkDescription = Del lenken til filen din:
shareLinkButton = Del lenke
# $name is the name of the file
shareMessage = Last ned { $name } med { -send-brand }: enkel, trygg fildeling
trailheadPromo = Det finnes en måte å ta vare på personvernet ditt. Bruk Firefox.
learnMore = Les mer.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Deel de koppeling naar uw bestand:
shareLinkButton = Koppeling delen shareLinkButton = Koppeling delen
# $name is the name of the file # $name is the name of the file
shareMessage = Download { $name } met { -send-brand }: eenvoudig, veilig bestanden delen shareMessage = Download { $name } met { -send-brand }: eenvoudig, veilig bestanden delen
trailheadPromo = Er is een manier om uw privacy te beschermen. Doe mee met Firefox.
learnMore = Meer info.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Del lenka til fila di:
shareLinkButton = Del lenke shareLinkButton = Del lenke
# $name is the name of the file # $name is the name of the file
shareMessage = Last ned "{ $name }" med { -send-brand }: enkel, trygg fildelning shareMessage = Last ned "{ $name }" med { -send-brand }: enkel, trygg fildelning
trailheadPromo = Det finst ein måte å ta vare på personvernet ditt. Ver med Firefox på ferda.
learnMore = Les meir.

155
public/locales/oc/send.ftl Normal file
View File

@@ -0,0 +1,155 @@
# Firefox Send is a brand name and should not be localized.
title = Firefox Send
siteFeedback = Comentaris
importingFile = Importacion…
encryptingFile = Chiframent…
decryptingFile = Deschiframent…
downloadCount =
{ $num ->
[one] 1 telecargament
*[other] { $num } telecargaments
}
timespanHours =
{ $num ->
[one] 1 ora
*[other] { $num } oras
}
copiedUrl = Copiat !
unlockInputPlaceholder = Senhal
unlockButtonLabel = Desverrolhar
downloadButtonLabel = Telecargar
downloadFinish = Telecargament acabat
fileSizeProgress = ({ $partialSize } sus { $totalSize })
sendYourFilesLink = Ensajar Firefox Send
errorPageHeader = I a quicòm que truca.
fileTooBig = Aqueste fichièr es tròp gròs per lenviar. Sa talha deu èsser inferiora a { $size }.
linkExpiredAlt = Lo ligam a expirat
notSupportedHeader = Vòstre navegador es pas compatible.
notSupportedLink = Perqué mon navegador es pas compatible ?
notSupportedOutdatedDetail = Aquesta version de Firefox es pas compatibla amb la tecnologia web amb la quala fonciona Firefox Send. Vos cal metre a jorn lo navegador.
updateFirefox = Metre a jorn Firefox
deletePopupCancel = Anullar
deleteButtonHover = Suprimir
footerLinkLegal = Mencions legalas
footerLinkPrivacy = Vida privada
footerLinkCookies = Cookies
passwordTryAgain = Senhal incorrècte. Tornatz ensajar.
javascriptRequired = Firefox Send requesís JavaScript
whyJavascript = Perque Firefox Send requesís JavaScript ?
enableJavascript = Volgatz activar lo JavaScript e ensajatz tornamai.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours } h { $minutes } min
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes } min
# A short status message shown when the user enters a long password
maxPasswordLength = Talha maximala del senhal : { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Aqueste senhal a pas pogut èsser definit
## 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 = Partatge simple e privat de fichièrs
introDescription = { -send-brand } vos permet de partejar de fichièr amb un chiframent del cap a la fin e un ligam quexpira automaticament. Atal podètz gardar privat çò que partejatz e vos assegurar que demorarà pas en linha per totjorn.
notifyUploadEncryptDone = Vòstre fichièr es chifrat e prèst per mandadís
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = Expira aprèp { $downloadCount } o { $timespan }
timespanMinutes =
{ $num ->
[one] 1 minuta
*[other] { $num } minutas
}
timespanDays =
{ $num ->
[one] 1 jorn
*[other] { $num } jorns
}
timespanWeeks =
{ $num ->
[one] 1 setmana
*[other] { $num } setmanas
}
fileCount =
{ $num ->
[one] 1 fichièr
*[other] { $num } fichièrs
}
# byte abbreviation
bytes = o
# kibibyte abbreviation
kb = Ko
# mebibyte abbreviation
mb = Mo
# gibibyte abbreviation
gb = Go
# 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 = Talha totala : { $size }
# the next line after the colon contains a file name
copyLinkDescription = Copiatz lo ligam per partejar vòstre fichièr :
copyLinkButton = Copiar lo ligam
downloadTitle = Telecargar los fichièrs
downloadDescription = Aqueste fichièr foguèt partejat via { -send-brand } amb chiframent del cap a la fin e un ligam quexpira automaticament.
trySendDescription = Ensajatz { -send-brand } per un partiment de fichièrs simple e segur.
# count will always be > 10
tooManyFiles =
{ $count ->
[one] Òm pòt pas quenviar 1 fichièr al còp.
*[other] Òm pòt pas quenviar { $count } fichièrs al còp.
}
# count will always be > 10
tooManyArchives =
{ $count ->
[one] Pas quun archiu es autorizat.
*[other] Pas que { $count } archius son autorizats.
}
expiredTitle = Aqueste ligam a expirat.
notSupportedDescription = { -send-brand } foncionarà pas amb aqueste navegador. { -send-short-brand } fonciona melhor amb la darrièra version de { -firefox } e foncionarà amb la version mai recenta de la màger part dels navegadors.
downloadFirefox = Telecargar { -firefox }
legalTitle = Avís de confidencialitat de { -send-short-brand }
legalDateStamp = Version 1.0 del 12 de març 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 } j { $hours } h { $minutes } min
addFilesButton = Seleccionatz los fichièrs de mandar
uploadButton = Enviar
# the first part of the string 'Drag and drop files or click to send up to 1GB'
dragAndDropFiles = Lissatz-depausatz de fichièrs
# the second part of the string 'Drag and drop files or click to send up to 1GB'
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
orClickWithSize = o clicatz per enviar fins a { $size }
addPassword = Protegir amb un senhal
emailPlaceholder = Picatz vòstra adreça electronica
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = Connectatz-vos per enviar fins a { $size }
signInOnlyButton = Connexion
accountBenefitTitle = Creatz un compte { -firefox } o connectatz-vos
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = Partejatz de fichièrs fins a { $size }
accountBenefitDownloadCount = Partejatz de fichièrs amb mai de personas
accountBenefitTimeLimit =
{ $count ->
[one] Mantenètz los ligams actius fins a 1 jorn
*[other] Mantenètz los ligams actius fins a { $count } jorns
}
accountBenefitSync = Gerissètz los fichièrs partejats de qualque siá periferic estant
accountBenefitMoz = Aprenètz-ne mai suls autres servicis { -mozilla }
signOut = Desconnexion
okButton = D'acòrd
downloadingTitle = Telecargament
noStreamsWarning = Pòt arribar quaqueste navegador pòsca pas deschifrar un fichièr tan gròs.
noStreamsOptionCopy = Copiatz lo ligam per lo dobrir dins un autre navegador
noStreamsOptionFirefox = Ensajatz nòstre navegador preferit
noStreamsOptionDownload = Contunhar amb aqueste navegador
downloadFirefoxPromo = Lo nòu { -firefox } vos provesís { -send-short-brand }.
# the next line after the colon contains a file name
shareLinkDescription = Partejatz lo ligam cap a vòstre fichièr :
shareLinkButton = Partejar lo ligam
# $name is the name of the file
shareMessage = Telecargar « { $name } » amb { -send-brand } : un biais simple e segur de partejar de fichièrs.
trailheadPromo = Existís un biais de protegir vòstra vida privada. Rejonhètz Firefox.
learnMore = Ne saber mai.

View File

@@ -151,3 +151,5 @@ shareLinkDescription = ਆਪਣੀ ਫਾਇਲ ਲਈ ਲਿੰਕ ਸਾਂ
shareLinkButton = ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ shareLinkButton = ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ
# $name is the name of the file # $name is the name of the file
shareMessage = { -send-brand } ਨਾਲ "{ $name }" ਡਾਊਨਲੋਡ ਕਰੋ: ਸੌਖਾ, ਸੁਰੱਖਿਅਤ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨਾ shareMessage = { -send-brand } ਨਾਲ "{ $name }" ਡਾਊਨਲੋਡ ਕਰੋ: ਸੌਖਾ, ਸੁਰੱਖਿਅਤ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨਾ
trailheadPromo = ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ ਦੀ ਸੁਰੱਖਿਆ ਦਾ ਢੰਗ ਹੈ। ਫਾਇਰਫਾਕਸ ਨਾਲ ਜੁੜੋ।
learnMore = ਹੋਰ ਸਿੱਖੋ

View File

@@ -160,3 +160,5 @@ shareLinkDescription = Udostępnij odnośnik do pliku:
shareLinkButton = Udostępnij odnośnik shareLinkButton = Udostępnij odnośnik
# $name is the name of the file # $name is the name of the file
shareMessage = Pobierz „{ $name }” za pomocą { -send-brand }: prostego i bezpiecznego udostępniania plików shareMessage = Pobierz „{ $name }” za pomocą { -send-brand }: prostego i bezpiecznego udostępniania plików
trailheadPromo = Jest sposób na ochronę swojej prywatności. Dołącz do Firefoksa.
learnMore = Więcej informacji.

View File

@@ -54,7 +54,7 @@ passwordSetError = Essa senha não pôde ser definida
-firefox = Firefox -firefox = Firefox
-mozilla = Mozilla -mozilla = Mozilla
introTitle = Compartilhamento de arquivos fácil e privativo introTitle = Compartilhamento de arquivos fácil e privativo
introDescription = O { -send-brand } permite compartilhar arquivos com criptografia ponto a ponto e um link que expira automaticamente. Assim você pode manter o que compartilha privativo e ter certeza que suas coisas não ficarão online para sempre. introDescription = O { -send-brand } permite compartilhar arquivos com criptografia de ponta a ponta e um link que expira automaticamente. Assim você pode manter o que compartilha privativo e ter certeza que suas coisas não ficarão online para sempre.
notifyUploadEncryptDone = Seu arquivo foi criptografado e está pronto para ser enviado notifyUploadEncryptDone = Seu arquivo foi criptografado e está pronto para ser enviado
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = Expirar após { $downloadCount } ou { $timespan } archiveExpiryInfo = Expirar após { $downloadCount } ou { $timespan }
@@ -94,7 +94,7 @@ totalSize = Tamanho total: { $size }
copyLinkDescription = Copie o link para compartilhar seu arquivo: copyLinkDescription = Copie o link para compartilhar seu arquivo:
copyLinkButton = Copiar link copyLinkButton = Copiar link
downloadTitle = Baixar arquivos downloadTitle = Baixar arquivos
downloadDescription = Este arquivo foi compartilhado via { -send-brand } com criptografia ponto a ponto e um link que expira automaticamente. downloadDescription = Este arquivo foi compartilhado via { -send-brand } com criptografia de ponta a ponta e um link que expira automaticamente.
trySendDescription = Experimente o { -send-brand } para compartilhamento de arquivos simples e seguro. trySendDescription = Experimente o { -send-brand } para compartilhamento de arquivos simples e seguro.
# count will always be > 10 # count will always be > 10
tooManyFiles = tooManyFiles =
@@ -143,7 +143,7 @@ okButton = OK
downloadingTitle = Baixando downloadingTitle = Baixando
noStreamsWarning = Este navegador pode não conseguir descriptografar um arquivo tão grande. noStreamsWarning = Este navegador pode não conseguir descriptografar um arquivo tão grande.
noStreamsOptionCopy = Copiar o link para abrir em outro navegador noStreamsOptionCopy = Copiar o link para abrir em outro navegador
noStreamsOptionFirefox = Experimentar nosso navegador preferido noStreamsOptionFirefox = Experimente nosso navegador preferido
noStreamsOptionDownload = Continuar com este navegador noStreamsOptionDownload = Continuar com este navegador
downloadFirefoxPromo = O { -send-short-brand } é apresentado pelo novo { -firefox }. downloadFirefoxPromo = O { -send-short-brand } é apresentado pelo novo { -firefox }.
# the next line after the colon contains a file name # the next line after the colon contains a file name
@@ -151,3 +151,5 @@ shareLinkDescription = Compartilhe o link para o seu arquivo:
shareLinkButton = Compartilhar link shareLinkButton = Compartilhar link
# $name is the name of the file # $name is the name of the file
shareMessage = Baixe "{ $name }" com o { -send-brand }: compartilhamento de arquivos simples e seguro shareMessage = Baixe "{ $name }" com o { -send-brand }: compartilhamento de arquivos simples e seguro
trailheadPromo = Existe um meio de proteger sua privacidade. Use o Firefox.
learnMore = Saiba mais.

View File

@@ -147,3 +147,5 @@ shareLinkDescription = Partilhe a ligação para o seu ficheiro:
shareLinkButton = Partilhar ligação shareLinkButton = Partilhar ligação
# $name is the name of the file # $name is the name of the file
shareMessage = Transferir “{ $name }“ com o { -send-brand }: partilha de ficheiros simples e segura shareMessage = Transferir “{ $name }“ com o { -send-brand }: partilha de ficheiros simples e segura
trailheadPromo = Existe uma maneira de proteger a sua privacidade. Junte-se ao Firefox.
learnMore = Saiba mais.

View File

@@ -23,7 +23,7 @@ downloadButtonLabel = Descarcă
downloadFinish = Descărcare încheiată downloadFinish = Descărcare încheiată
fileSizeProgress = ({ $partialSize } din { $totalSize }) fileSizeProgress = ({ $partialSize } din { $totalSize })
sendYourFilesLink = Încearcă Firefox Send sendYourFilesLink = Încearcă Firefox Send
errorPageHeader = Ceva a mers prost! errorPageHeader = Ceva nu a funcționat!
fileTooBig = Acest fișier este prea mare. Ar trebuie să fie sub { $size }. fileTooBig = Acest fișier este prea mare. Ar trebuie să fie sub { $size }.
linkExpiredAlt = Link expirat linkExpiredAlt = Link expirat
notSupportedHeader = Browserul tău nu este suportat. notSupportedHeader = Browserul tău nu este suportat.
@@ -35,7 +35,7 @@ deleteButtonHover = Șterge
footerLinkLegal = Mențiuni legale footerLinkLegal = Mențiuni legale
footerLinkPrivacy = Confidențialitate footerLinkPrivacy = Confidențialitate
footerLinkCookies = Cookie-uri footerLinkCookies = Cookie-uri
passwordTryAgain = Parola este incorectă. Încearcă din nou. passwordTryAgain = Parolă incorectă. Încearcă din nou.
javascriptRequired = Firefox Send necesită JavaScript javascriptRequired = Firefox Send necesită JavaScript
whyJavascript = De ce Firefox Send necesită JavaScript? whyJavascript = De ce Firefox Send necesită JavaScript?
enableJavascript = Te rugăm să reactivezi JavaScript și să încerci din nou. enableJavascript = Te rugăm să reactivezi JavaScript și să încerci din nou.
@@ -56,7 +56,7 @@ passwordSetError = Această parolă nu a putut fi setată
-firefox = Firefox -firefox = Firefox
-mozilla = Mozilla -mozilla = Mozilla
introTitle = Partajare de fișiere simplă și privată introTitle = Partajare de fișiere simplă și privată
introDescription = { -send-brand } îți permite să partajezi fișiere cu criptare end-to-end și un link care expiră automat. Deci, poți păstra confidențial ceea ce partajezi și te poți asigura că ce ai partajat nu rămâne online pentru totdeauna. introDescription = { -send-brand } îți permite să partajezi fișiere cu criptare capăt-la-capăt și un link care expiră automat. Deci, poți păstra confidențial ceea ce partajezi și te poți asigura că ce ai partajat nu rămâne online pentru totdeauna.
notifyUploadEncryptDone = Fișierul tău este criptat și gata de trimitere notifyUploadEncryptDone = Fișierul tău este criptat și gata de trimitere
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = Expiră după { $downloadCount } sau { $timespan } archiveExpiryInfo = Expiră după { $downloadCount } sau { $timespan }
@@ -100,8 +100,8 @@ totalSize = Mărime totală: { $size }
copyLinkDescription = Copiază linkul pentru partajarea fișierului: copyLinkDescription = Copiază linkul pentru partajarea fișierului:
copyLinkButton = Copiază linkul copyLinkButton = Copiază linkul
downloadTitle = Descarcă fișierele downloadTitle = Descarcă fișierele
downloadDescription = Acest fișier a fost partajat prin { -send-brand }, cu criptare end-to-end și un link ce expiră automat. downloadDescription = Acest fișier a fost partajat prin { -send-brand }, cu criptare capăt-la-capăt și un link care expiră automat.
trySendDescription = Încearcă { -send-brand } pentru o partajare de fișiere simplă și sigură. trySendDescription = Încearcă { -send-brand } pentru o partajare simplă și sigură a fișierelor.
# count will always be > 10 # count will always be > 10
tooManyFiles = tooManyFiles =
{ $count -> { $count ->
@@ -133,7 +133,7 @@ orClickWithSize = sau dă clic pentru a trimite până la { $size }
addPassword = Protejează cu parolă addPassword = Protejează cu parolă
emailPlaceholder = Introdu e-mailul tău emailPlaceholder = Introdu e-mailul tău
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = Autentifică-te ca să trimiți până la { $size } signInSizeBump = Autentifică-te pentru a trimite până la { $size }
signInOnlyButton = Autentificare signInOnlyButton = Autentificare
accountBenefitTitle = Creează un cont { -firefox } sau autentifică-te accountBenefitTitle = Creează un cont { -firefox } sau autentifică-te
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
@@ -160,3 +160,5 @@ shareLinkDescription = Partajează linkul către fișier:
shareLinkButton = Partajează linkul shareLinkButton = Partajează linkul
# $name is the name of the file # $name is the name of the file
shareMessage = Descarcă „{ $name }” cu { -send-brand }: partajare simplă și sigură a fișierelor shareMessage = Descarcă „{ $name }” cu { -send-brand }: partajare simplă și sigură a fișierelor
trailheadPromo = Există o modalitate de a-ți proteja viața privată. Alătură-te Firefox.
learnMore = Află mai multe.

View File

@@ -24,7 +24,7 @@ downloadFinish = Загрузка завершена
fileSizeProgress = ({ $partialSize } из { $totalSize }) fileSizeProgress = ({ $partialSize } из { $totalSize })
sendYourFilesLink = Попробовать Firefox Send sendYourFilesLink = Попробовать Firefox Send
errorPageHeader = Что-то пошло не так! errorPageHeader = Что-то пошло не так!
fileTooBig = Этот файл слишком большой для загрузки. Он должен быть меньше { $size }. fileTooBig = Файл слишком большой. Он должен быть меньше { $size }.
linkExpiredAlt = Истёк срок действия ссылки linkExpiredAlt = Истёк срок действия ссылки
notSupportedHeader = Ваш браузер не поддерживается. notSupportedHeader = Ваш браузер не поддерживается.
notSupportedLink = Почему мой браузер не поддерживается? notSupportedLink = Почему мой браузер не поддерживается?
@@ -160,3 +160,5 @@ shareLinkDescription = Поделитесь ссылкой на ваш файл:
shareLinkButton = Поделиться ссылкой shareLinkButton = Поделиться ссылкой
# $name is the name of the file # $name is the name of the file
shareMessage = Загрузите «{ $name }» с { -send-brand }: простой и безопасный обмен файлами shareMessage = Загрузите «{ $name }» с { -send-brand }: простой и безопасный обмен файлами
trailheadPromo = Существует способ защитить вашу приватность. Присоединяйтесь к Firefox.
learnMore = Подробнее.

View File

@@ -1,20 +1,17 @@
# Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
title = Firefox Send title = Firefox Send
siteFeedback = Zvirikutaurwa siteFeedback = Zvirikutaurwa
uploadPageLearnMore = Dzidza zvimwe importingFile = Kutora faira
# Used as header in a column indicating the amount of time left before a encryptingFile = Kuinikiriputa
# download link expires (e.g. "10h 5m")
timeFileList = Nguva
deletePopupYes = Hongu
changePasswordButton = Shandura
enableJavascript = Ndinokumbira mubvumidze JavaScript moedza zvekare enableJavascript = Ndinokumbira mubvumidze JavaScript moedza zvekare
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }maawa { $minutes }mineti expiresHoursMinutes = { $hours }maawa { $minutes }mineti
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }mineti expiresMinutes = { $minutes }mineti
# A short status message shown when a password is successfully set
passwordIsSet = Pasiwedhi yaita
# A short status message shown when the user enters a long password # A short status message shown when the user enters a long password
maxPasswordLength = Pasiwedhi haipfuuri mavara:{ $length } maxPasswordLength = Pasiwedhi haipfuuri mavara:{ $length }
# A short status message shown when there was an error setting the password # A short status message shown when there was an error setting the password
passwordSetError = Pasiwedhi haina kuita passwordSetError = Pasiwedhi haina kuita
## Send version 2 strings

View File

@@ -151,3 +151,5 @@ shareLinkDescription = Ndani me të tjerët lidhjen për te kartela juaj:
shareLinkButton = Ndani me të tjerët lidhjen shareLinkButton = Ndani me të tjerët lidhjen
# $name is the name of the file # $name is the name of the file
shareMessage = Shkarkojeni “{ $name }” me { -send-brand }: shkëmbim kartelash dhe thjesht dhe pa rrezik shareMessage = Shkarkojeni “{ $name }” me { -send-brand }: shkëmbim kartelash dhe thjesht dhe pa rrezik
trailheadPromo = Ka një rrugë për të mbrojtur privatësinë tuaj. Bëhuni pjesë e Firefox-it.
learnMore = Mësoni më tepër.

View File

@@ -134,7 +134,7 @@ addPassword = Заштитите лозинком
emailPlaceholder = Унесите вашу е-адресу emailPlaceholder = Унесите вашу е-адресу
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = Пријавите се да пошаљете садржај до { $size } signInSizeBump = Пријавите се да пошаљете садржај до { $size }
signInButton = Пријава/регистрација signInOnlyButton = Пријавите се
accountBenefitTitle = Направите { -firefox } налог или се пријавите accountBenefitTitle = Направите { -firefox } налог или се пријавите
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = Поделите датотеке велике до { $size } accountBenefitLargeFiles = Поделите датотеке велике до { $size }
@@ -154,3 +154,11 @@ noStreamsWarning = Овај прегледач можда неће моћи да
noStreamsOptionCopy = Копирај везу за отварање у другом прегледачу noStreamsOptionCopy = Копирај везу за отварање у другом прегледачу
noStreamsOptionFirefox = Пробајте наш омиљени прегледач noStreamsOptionFirefox = Пробајте наш омиљени прегледач
noStreamsOptionDownload = Наставите у овом прегледачу noStreamsOptionDownload = Наставите у овом прегледачу
downloadFirefoxPromo = { -send-short-brand } вам је омогућен захваљући потпуно новом програму { -firefox }.
# the next line after the colon contains a file name
shareLinkDescription = Поделите везу до датотеке:
shareLinkButton = Поделите везу
# $name is the name of the file
shareMessage = Преузмите „{ $name }“ помоћу програма { -send-brand }: једноставно и безбедно дељење датотека
trailheadPromo = Постоји начин да заштитите вашу приватност. Придружите се Firefox-у.
learnMore = Сазнајте више.

View File

@@ -30,7 +30,7 @@ deletePopupCancel = Bolay
deleteButtonHover = Pupus deleteButtonHover = Pupus
footerLinkLegal = Légal footerLinkLegal = Légal
footerLinkPrivacy = Privasi footerLinkPrivacy = Privasi
footerLinkCookies = Kuki footerLinkCookies = Réréméh
passwordTryAgain = Kecap sandi salah. Pecakan deui. passwordTryAgain = Kecap sandi salah. Pecakan deui.
javascriptRequired = Firefox Send merlukeun JavaScript javascriptRequired = Firefox Send merlukeun JavaScript
whyJavascript = Naha Firefox Send merlukeun JavaScript? whyJavascript = Naha Firefox Send merlukeun JavaScript?
@@ -149,3 +149,5 @@ shareLinkDescription = Bagikeun tutumbu ka koropak anjeun:
shareLinkButton = Bagikeun tutumbu shareLinkButton = Bagikeun tutumbu
# $name is the name of the file # $name is the name of the file
shareMessage = Undeur "{ $name }" ku { -send-brand }: simpel, babagi koropak aman shareMessage = Undeur "{ $name }" ku { -send-brand }: simpel, babagi koropak aman
trailheadPromo = Aya cara pikeun ngamankeun privasi anjeun. Jabung jeung Firefox.
learnMore = Lenyepan.

View File

@@ -1,29 +1,9 @@
# Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
title = Firefox Send title = Firefox Send
siteSubtitle = జాల ప్రయోగం
siteFeedback = అభిప్రాయం siteFeedback = అభిప్రాయం
uploadPageLearnMore = ఇంకా తెలుసుకోండి
uploadPageDropMessage = ఎగుమతిని ప్రారంభించడానికి మీ ఫైలును ఇక్కడ విడిచిపెట్టండి
uploadPageSizeMessage = అత్యంత నమ్మకమైన కార్యం కోసం, మీ ఫైలును 1GB కంటే తక్కువగా ఉంచడం ఉత్తమం
uploadPageBrowseButton = మీ కంప్యూటర్లో ఒక ఫైలును ఎంచుకోండి
uploadPageBrowseButton1 = ఎక్కించటానికి ఒక ఫైలును ఎంచుకోండి
uploadPageMultipleFilesAlert = పలు ఫైళ్ళను లేదా సంయచాన్ని ఎక్కించడానికి ప్రస్తుతం తోడ్పాటు లేదు.
uploadPageBrowseButtonTitle = ఫైలును ఎగుమతి చేయండి
uploadingPageProgress = { $filename } ({ $size }) ఎక్కుతోంది
importingFile = దిగుమతవుతోంది... importingFile = దిగుమతవుతోంది...
verifyingFile = పరిశీలిస్తున్నది…
encryptingFile = గుప్తీకరిస్తోంది... encryptingFile = గుప్తీకరిస్తోంది...
decryptingFile = వ్యక్తపరుస్తోంది... decryptingFile = వ్యక్తపరుస్తోంది...
notifyUploadDone = మీ ఎగుమతి పూర్తయింది.
uploadingPageMessage = మీ ఫైలును మీరు ఎగుమతి చేసిన తర్వాత గడువు ఎంపికలను సరిగా ఏర్పాటు చేయగలరు.
uploadingPageCancel = ఎగుమతి రద్దు చేయండి
uploadCancelNotification = మీ ఎగుమతి రద్దు చేయబడింది.
uploadingPageLargeFileMessage = ఈ ఫైలు పెద్దగా ఉంది అందువలన ఎగుమతి చేయడానికి కొంత సమయం పట్టవచ్చు. వేచి ఉండండి!
uploadingFileNotification = ఎగుమతి పూర్తయినప్పుడు నాకు తెలియచేయండి.
uploadSuccessConfirmHeader = పంపించడానికి సిద్ధంగా ఉంది
uploadSvgAlt = ఎగుమతి చేయండి
uploadSuccessTimingHeader = మీ ఫైలు లంకె గడువు 1 దిగుమతి తరువాత లేదా 24 గంటల తరువాత ముగుస్తుంది.
expireInfo = మీ ఫైలుకు లంకె { $downloadCount } లేదా { $timespan } తర్వాత గడువు అవుతుంది.
downloadCount = downloadCount =
{ $num -> { $num ->
[one] 1 దింపుకోలు [one] 1 దింపుకోలు
@@ -34,68 +14,26 @@ timespanHours =
[one] 1 గంట [one] 1 గంట
*[other] { $num } గంటలు *[other] { $num } గంటలు
} }
copyUrlFormLabelWithName = మీ ఫైల్ను పంపడానికి లంకెను నకలు చేయండి మరియు పంచండి: { $filename }
copyUrlFormButton = క్లిప్బోర్డ్కు నకలు చేయండి
copiedUrl = నకలు చేయబడింది! copiedUrl = నకలు చేయబడింది!
deleteFileButton = ఫైలును తొలగించండి
sendAnotherFileLink = మరో ఫైలును పంపండి
# Alternative text used on the download link/button (indicates an action).
downloadAltText = దిగుమతి
downloadsFileList = దింపుకోళ్ళు
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = సమయం
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = దిగుమతి { $filename }
downloadFileSize = ({ $size })
unlockInputLabel = సంకేతపదాన్ని తెలపండి
unlockInputPlaceholder = సంకేతపదం unlockInputPlaceholder = సంకేతపదం
unlockButtonLabel = తాళం తీయి unlockButtonLabel = తాళం తీయి
# Text and title used on the download link/button (indicates an action).
downloadButtonLabel = దిగుమతి downloadButtonLabel = దిగుమతి
downloadNotification = మీ దిగుమతి పూర్తయ్యింది.
downloadFinish = దిగుమతి పూర్తయింది downloadFinish = దిగుమతి పూర్తయింది
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = { $totalSize }) యొక్క ({ $partialSize } fileSizeProgress = { $totalSize }) యొక్క ({ $partialSize }
# Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Firefox sendను ప్రయత్నించండి sendYourFilesLink = Firefox sendను ప్రయత్నించండి
downloadingPageProgress = దిగుమతిచేస్తున్నది { $filename } ({ $size })
errorAltText = ఎగుమతిలో లోపం
errorPageHeader = ఏదో తప్పిదం జరిగింది! errorPageHeader = ఏదో తప్పిదం జరిగింది!
errorPageMessage = ఫైల్ను ఎగుమతి చేయడంలో లోపం ఉంది.
errorPageLink = మరో ఫైలును పంపండి
fileTooBig = ఆ ఫైలు ఎక్కించడానికి చాలా పెద్దగా ఉంది. ఫైళ్ళు { $size } కంటే తక్కువ పరిమాణంలో ఉండాలి. fileTooBig = ఆ ఫైలు ఎక్కించడానికి చాలా పెద్దగా ఉంది. ఫైళ్ళు { $size } కంటే తక్కువ పరిమాణంలో ఉండాలి.
linkExpiredAlt = లంకె గడువు ముగిసింది linkExpiredAlt = లంకె గడువు ముగిసింది
expiredPageHeader = ఈ లంకె గడువు ముగిసింది లేదా ముందు ఎప్పుడూ ఉనికిలో లేదు!
notSupportedHeader = మీ విహారిణికి మద్దతు లేదు. notSupportedHeader = మీ విహారిణికి మద్దతు లేదు.
notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు? notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు?
notSupportedOutdatedDetail = దురదృష్టవశాత్తు Firefox యొక్క ఈ వెర్షన్ Firefox సాంకేతికతను పంపే వెబ్ సాంకేతికతకు మద్దతు ఇవ్వదు. మీరు మీ బ్రౌజర్ని నవీకరించాలి. notSupportedOutdatedDetail = దురదృష్టవశాత్తు Firefox యొక్క ఈ వెర్షన్ Firefox సాంకేతికతను పంపే వెబ్ సాంకేతికతకు మద్దతు ఇవ్వదు. మీరు మీ బ్రౌజర్ని నవీకరించాలి.
updateFirefox = Firefoxను నవీకరించు updateFirefox = Firefoxను నవీకరించు
downloadFirefoxButtonSub = ఉచిత దిగుమతులు
uploadedFile = దస్త్రం
copyFileList = URL నకలుతీయి
# expiryFileList is used as a column header
expiryFileList = ఇంతలో గడువుతీరును
deleteFileList = తొలగించు
nevermindButton = పర్వాలేదు
legalHeader = నిబంధనలు మరియు గోప్యత
deletePopupText = ఈ ఫైలును తొలగించాలా?
deletePopupYes = అవును
deletePopupCancel = రద్దుచేయి deletePopupCancel = రద్దుచేయి
deleteButtonHover = తొలగించు deleteButtonHover = తొలగించు
copyUrlHover = URLను నకలు చేయండి
footerLinkLegal = చట్టపరమైన footerLinkLegal = చట్టపరమైన
# Test Pilot is a proper name and should not be localized.
footerLinkAbout = టెస్ట్ పైలట్ గురించి
footerLinkPrivacy = గోప్యత footerLinkPrivacy = గోప్యత
footerLinkTerms = నియమాలు
footerLinkCookies = కుకీలు footerLinkCookies = కుకీలు
requirePasswordCheckbox = ఈ ఫైల్ను దింపుకోటానికి సంకేతపదం అవసరం
addPasswordButton = సంకేతపదం జోడించండి
changePasswordButton = మార్చు
passwordTryAgain = సరికాని సంకేతపదం. మళ్ళీ ప్రయత్నించండి. passwordTryAgain = సరికాని సంకేతపదం. మళ్ళీ ప్రయత్నించండి.
reportIPInfringement = మేధో సంపత్తి హక్కుల ఉల్లంఘనను నివేదించండి
javascriptRequired = Firefox Sendకి జావాస్క్రిప్టు కావాలి javascriptRequired = Firefox Sendకి జావాస్క్రిప్టు కావాలి
whyJavascript = Firefox Sendకి జావాస్క్రిప్టు ఎందుకు కావాలి? whyJavascript = Firefox Sendకి జావాస్క్రిప్టు ఎందుకు కావాలి?
enableJavascript = జావాస్క్రిప్టు చేతనంచేసి మళ్ళీ ప్రయత్నించండి. enableJavascript = జావాస్క్రిప్టు చేతనంచేసి మళ్ళీ ప్రయత్నించండి.
@@ -103,9 +41,86 @@ enableJavascript = జావాస్క్రిప్టు చేతనంచ
expiresHoursMinutes = { $hours }గం { $minutes }ని expiresHoursMinutes = { $hours }గం { $minutes }ని
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }ని expiresMinutes = { $minutes }ని
# A short status message shown when a password is successfully set
passwordIsSet = సంకేతపదం అమరింది
# A short status message shown when the user enters a long password # A short status message shown when the user enters a long password
maxPasswordLength = సంకేతపదం గరిష్ఠ పొడవు: { $length } maxPasswordLength = సంకేతపదం గరిష్ఠ పొడవు: { $length }
# A short status message shown when there was an error setting the password # A short status message shown when there was an error setting the password
passwordSetError = ఈ సంకేతపదం పెట్టలేకపోయాం passwordSetError = ఈ సంకేతపదం పెట్టలేకపోయాం
## Send version 2 strings
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
-send-brand = Firefox Send
-send-short-brand = పంపించు
-firefox = Firefox
-mozilla = Mozilla
timespanMinutes =
{ $num ->
[one] 1 నిమిషం
*[other] { $num } నిమిషాలు
}
timespanDays =
{ $num ->
[one] 1 రోజు
*[other] { $num } రోజులు
}
timespanWeeks =
{ $num ->
[one] 1 వారం
*[other] { $num } వారాలు
}
fileCount =
{ $num ->
[one] 1 ఫైలు
*[other] { $num } ఫైళ్లు
}
# byte abbreviation
bytes = 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 = మొత్తం పరిమాణం: { $size }
# the next line after the colon contains a file name
copyLinkDescription = మీ ఫైలును భాగస్వామ్యం చేయడానికి ఈ లంకెను నకలు చేయండి:
copyLinkButton = లంకెను నకలుతీయి
downloadTitle = ఫైళ్లను దింపుకోండి
expiredTitle = ఈ లంకె గడువు ముగిసింది.
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 }d { $hours }h { $minutes }m
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 = ఫైళ్లను ఎక్కువ మందితో పంచుకోండి
accountBenefitSync = ఏదైనా పరికరం నుండి పంచుకున్న ఫైళ్ళను నిర్వహించండి
signOut = నిష్క్రమించు
okButton = సరే
downloadingTitle = దింపుకుంటోంది
noStreamsWarning = ఈ బ్రౌజర్ ఈ ఫైలును పెద్దగా డీక్రిప్ట్ చేయలేకపోవచ్చు.
noStreamsOptionCopy = మరొక బ్రౌజర్‌లో తెరవడానికి లంకెను నకలు చేయండి
noStreamsOptionFirefox = మా అభిమాన బ్రౌజర్‌ను ప్రయత్నించండి
noStreamsOptionDownload = ఈ బ్రౌజర్‌తో కొనసాగించండి
downloadFirefoxPromo = { -send-short-brand } క్రొత్త { -firefox } ద్వారా మీ ముందుకు తీసుకురాబడుతుంది.
# the next line after the colon contains a file name
shareLinkDescription = మీ ఫైలుకు లంకెను పంచుకోండి:
shareLinkButton = లంకెను పంచుకోండి
learnMore = ఇంకా తెలుసుకోండి.

146
public/locales/th/send.ftl Normal file
View File

@@ -0,0 +1,146 @@
# Firefox Send is a brand name and should not be localized.
title = Firefox Send
siteFeedback = ข้อคิดเห็น
importingFile = กำลังนำเข้า…
encryptingFile = กำลังเข้ารหัส…
decryptingFile = กำลังถอดรหัส…
downloadCount =
{ $num ->
*[other] { $num } การดาวน์โหลด
}
timespanHours =
{ $num ->
*[other] { $num } ชั่วโมง
}
copiedUrl = คัดลอกแล้ว!
unlockInputPlaceholder = รหัสผ่าน
unlockButtonLabel = ปลดล็อก
downloadButtonLabel = ดาวน์โหลด
downloadFinish = การดาวน์โหลดเสร็จสมบูรณ์
fileSizeProgress = ({ $partialSize } จาก { $totalSize })
sendYourFilesLink = ลองใช้ Firefox Send
errorPageHeader = มีบางอย่างผิดพลาด!
fileTooBig = ไฟล์นั้นใหญ่เกินกว่าจะอัปโหลดได้ ไฟล์ที่จะอัปโหลดควรมีขนาดน้อยกว่า { $size }
linkExpiredAlt = ลิงก์หมดอายุแล้ว
notSupportedHeader = ไม่รองรับเบราว์เซอร์ของคุณ
notSupportedLink = ทำไมจึงไม่รองรับเบราว์เซอร์ของฉัน?
notSupportedOutdatedDetail = น่าเสียดายที่ Firefox รุ่นนี้ไม่สนับสนุนเทคโนโลยีเว็บที่ขับเคลื่อน Firefox Send คุณจะต้องอัปเดตเบราว์เซอร์ของคุณ
updateFirefox = อัปเดต Firefox
deletePopupCancel = ยกเลิก
deleteButtonHover = ลบ
footerLinkLegal = ข้อกฎหมาย
footerLinkPrivacy = ความเป็นส่วนตัว
footerLinkCookies = คุกกี้
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 ->
*[other] { $num } นาที
}
timespanDays =
{ $num ->
*[other] { $num } วัน
}
timespanWeeks =
{ $num ->
*[other] { $num } สัปดาห์
}
fileCount =
{ $num ->
*[other] { $num } ไฟล์
}
# 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 = ขนาดรวม: { $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 ->
*[other] สามารถอัปโหลดได้ครั้งละ { $count } ไฟล์เท่านั้น
}
# count will always be > 10
tooManyArchives =
{ $count ->
*[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 ->
*[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 = เรียนรู้เพิ่มเติม

View File

@@ -147,3 +147,5 @@ shareLinkDescription = Dosyanızın bağlantısını paylaşın:
shareLinkButton = Bağlantıyı paylaş shareLinkButton = Bağlantıyı paylaş
# $name is the name of the file # $name is the name of the file
shareMessage = “{ $name }” dosyasını { -send-brand } ile indirin: basit ve güvenli dosya paylaşımı shareMessage = “{ $name }” dosyasını { -send-brand } ile indirin: basit ve güvenli dosya paylaşımı
trailheadPromo = Gizliliğinizi korumanın bir yolu var. Firefoxa katılın.
learnMore = Daha fazla bilgi alın.

View File

@@ -160,3 +160,5 @@ shareLinkDescription = Надішліть посилання на свій фа
shareLinkButton = Поділитись посиланням shareLinkButton = Поділитись посиланням
# $name is the name of the file # $name is the name of the file
shareMessage = Завантажте “{ $name }” з { -send-brand }: простий та безпечний обмін файлами shareMessage = Завантажте “{ $name }” з { -send-brand }: простий та безпечний обмін файлами
trailheadPromo = Існує спосіб захистити вашу приватність. Приєднуйтесь до Firefox.
learnMore = Докладніше.

View File

@@ -87,7 +87,7 @@ totalSize = Tổng kích thước: { $size }
# the next line after the colon contains a file name # the next line after the colon contains a file name
copyLinkDescription = Sao chép liên kết để chia sẻ tập tin của bạn: copyLinkDescription = Sao chép liên kết để chia sẻ tập tin của bạn:
copyLinkButton = Sao chép liên kết copyLinkButton = Sao chép liên kết
downloadTitle = Tải tập tin downloadTitle = Tải xuống tập tin
downloadDescription = Tập tin này đã được chia sẻ qua { -send-brand } với mã hóa đầu cuối và liên kết tự động hết hạn. downloadDescription = Tập tin này đã được chia sẻ qua { -send-brand } với mã hóa đầu cuối và liên kết tự động hết hạn.
trySendDescription = Hãy thử { -send-brand } để chia sẻ tập tin đơn giản, an toàn. trySendDescription = Hãy thử { -send-brand } để chia sẻ tập tin đơn giản, an toàn.
# count will always be > 10 # count will always be > 10
@@ -142,3 +142,5 @@ shareLinkDescription = Chia sẻ liên kết đến tập tin của bạn:
shareLinkButton = Chia sẻ liên kết shareLinkButton = Chia sẻ liên kết
# $name is the name of the file # $name is the name of the file
shareMessage = Tải xuống “{ $name }“ với { -send-brand }: chia sẻ tập tin đơn giản, an toàn shareMessage = Tải xuống “{ $name }“ với { -send-brand }: chia sẻ tập tin đơn giản, an toàn
trailheadPromo = Đây là một cách để bảo vệ sự riêng tư của bạn. Tham gia Firefox.
learnMore = Tìm hiểu thêm.

View File

@@ -33,7 +33,7 @@ deleteButtonHover = ⴽⴽⵙ
footerLinkLegal = ⵓⵙⴹⵉⴼ footerLinkLegal = ⵓⵙⴹⵉⴼ
footerLinkPrivacy = ⵜⵉⵏⵏⵓⵜⵍⴰ footerLinkPrivacy = ⵜⵉⵏⵏⵓⵜⵍⴰ
footerLinkCookies = ⵉⴽⵓⴽⵉⵜⵏ footerLinkCookies = ⵉⴽⵓⴽⵉⵜⵏ
passwordTryAgain = ⵜⴰⴳⵓⵔⵉ ⵓⵣⵔⴰⵢ ⵓⵔ ⵢⵓⵖⴷⵏ. ⴰⵔⵎ ⴷⴰⵖ. passwordTryAgain = ⵜⴰⴳⵓⵔⵉ ⵓⵣⵔⴰⵢ ⵓⵔ ⵢⵓⵖⴷⵏ. ⴰⵔⵎ ⴷⴰⵖ.
javascriptRequired = ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ javascriptRequired = ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ
whyJavascript = ⵎⴰⵖⴼ ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ? whyJavascript = ⵎⴰⵖⴼ ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ?
enableJavascript = ⵎⴽ ⵜⵓⴼⴰⵎ, ⵙⵏⵓⵛⵛⴳⴰⵜ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ, ⵜⴰⵔⵎⵎ ⴷⴰⵖ. enableJavascript = ⵎⴽ ⵜⵓⴼⴰⵎ, ⵙⵏⵓⵛⵛⴳⴰⵜ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ, ⵜⴰⵔⵎⵎ ⴷⴰⵖ.
@@ -95,7 +95,7 @@ copyLinkDescription = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜ
copyLinkButton = ⵙⵙⵏⵖⵍ ⴰⵙⵖⵏ copyLinkButton = ⵙⵙⵏⵖⵍ ⴰⵙⵖⵏ
downloadTitle = ⴰⴳⵎ ⵉⴼⵓⵢⵍⴰ downloadTitle = ⴰⴳⵎ ⵉⴼⵓⵢⵍⴰ
downloadDescription = ⵉⵜⵜⵓⴱⴹⴰ ⵓⴼⴰⵢⵍⵓ ⴰ ⵙⴳ { -send-brand } ⵙ ⵓⵙⵙⵏⵜⵍ ⵙⴳ ⵜⴰⵎⴰ ⴰⵔ ⵜⴰⵎⴰ ⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵏⵏⴰ ⵉⵜⵜⵎⵎⵜⴰⵜⵏ ⵙ ⵓⵡⵔⵎⴰⵏ. downloadDescription = ⵉⵜⵜⵓⴱⴹⴰ ⵓⴼⴰⵢⵍⵓ ⴰ ⵙⴳ { -send-brand } ⵙ ⵓⵙⵙⵏⵜⵍ ⵙⴳ ⵜⴰⵎⴰ ⴰⵔ ⵜⴰⵎⴰ ⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵏⵏⴰ ⵉⵜⵜⵎⵎⵜⴰⵜⵏ ⵙ ⵓⵡⵔⵎⴰⵏ.
trySendDescription = ⴰⵔⵎ { -send-brand } ⵉ ⵓⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⴼⵔⵉⴳ. trySendDescription = ⴰⵔⵎⴰⵜ { -send-brand } ⵉ ⵓⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⴼⵔⵉⴳ ⵉⴼⵓⵢⵍⴰ.
# count will always be > 10 # count will always be > 10
tooManyFiles = tooManyFiles =
{ $count -> { $count ->
@@ -126,7 +126,7 @@ addPassword = ⴰⵔⵢ ⵙ ⵜⴳⵓⵔⵉ ⵓⵣⵔⴰⵢ
emailPlaceholder = ⵙⵙⴽⵛⵎⴰⵜ ⵉⵎⴰⵢⵍ ⵏⵏⵓⵏ emailPlaceholder = ⵙⵙⴽⵛⵎⴰⵜ ⵉⵎⴰⵢⵍ ⵏⵏⵓⵏ
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
signInSizeBump = ⴽⵛⵎ ⴰⴼⴰⴷ ⴰⴷ ⵜⴰⵣⵏⴷ ⴰⵔ { $size } signInSizeBump = ⴽⵛⵎ ⴰⴼⴰⴷ ⴰⴷ ⵜⴰⵣⵏⴷ ⴰⵔ { $size }
signInButton = ⴽⵛⵎ/ⵣⵎⵎⴻⵎ signInOnlyButton = ⴽⵛⵎ
accountBenefitTitle = ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ { -firefox } ⵏⵉⵖ ⵜⵣⵎⵎⴻⵎⴷ accountBenefitTitle = ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ { -firefox } ⵏⵉⵖ ⵜⵣⵎⵎⴻⵎⴷ
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
accountBenefitLargeFiles = ⴱⴹⵓ ⵉⴼⵓⵢⵍⴰ ⴰⵔ { $size } accountBenefitLargeFiles = ⴱⴹⵓ ⵉⴼⵓⵢⵍⴰ ⴰⵔ { $size }
@@ -145,3 +145,11 @@ noStreamsWarning = ⵉⵣⵎⵔ ⵓⵎⵙⵙⴰⵔⴰ ⴰ ⴰⴷ ⵓⵔ ⵉⵖ
noStreamsOptionCopy = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜ ⵜⵕⵥⵎⵎ ⴳ ⴽⵔⴰ ⵓⵎⵙⵙⴰⵔⴰ ⵢⴰⴹⵏ noStreamsOptionCopy = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜ ⵜⵕⵥⵎⵎ ⴳ ⴽⵔⴰ ⵓⵎⵙⵙⴰⵔⴰ ⵢⴰⴹⵏ
noStreamsOptionFirefox = ⴰⵔⵎⴰⵜ ⴰⵎⵙⵙⴰⵔⴰ ⵏⵏⵖ ⴰⵎⵓⴼⴰⵢ noStreamsOptionFirefox = ⴰⵔⵎⴰⵜ ⴰⵎⵙⵙⴰⵔⴰ ⵏⵏⵖ ⴰⵎⵓⴼⴰⵢ
noStreamsOptionDownload = ⵙⵎⴷ ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ noStreamsOptionDownload = ⵙⵎⴷ ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ
downloadFirefoxPromo = ⵉⵜⵜⵓⵙⵓⵎⵔ ⴰⵡⵏ { -send-short-brand } ⵙⴳ ⵖⵓⵔ { -firefox } ⴰⵎⴰⵢⵏⵓ ⴰⴽⴽⵯ.
# the next line after the colon contains a file name
shareLinkDescription = ⴱⴹⵓⵢⴰⵜ ⴰⵙⵖⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ:
shareLinkButton = ⴱⴹⵓ ⴰⵙⵖⵏ
# $name is the name of the file
shareMessage = ⴰⴳⵎⴰⵜ "{ $name }" ⵙ { -send-brand }: ⴰⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⵙⵍⵉⴳ ⵉⴼⵓⵢⵍⴰ
trailheadPromo = ⵜⵍⵍⴰ ⵢⴰⵜ ⵜⵖⴰⵔⴰⵙⵜ ⴰⴼⴰⴷ ⴰⴷ ⵜⴼⵔⴳⵎ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵏⵏⵓⵏ. ⵍⴽⵎⴰⵜ ⴼⴰⵢⵔⴼⵓⴽⵙ.
learnMore = ⵙⵙⵏ ⵓⴳⴳⴰⵔ.

View File

@@ -55,7 +55,7 @@ introTitle = 簡單而私密的檔案共享服務
introDescription = { -send-brand } 讓您可透過點對點加密的方式來分享檔案,並提供會自動失效的鏈結。這樣一來就可以保留分享時的隱私,也確保檔案不會永久保存於網路上。 introDescription = { -send-brand } 讓您可透過點對點加密的方式來分享檔案,並提供會自動失效的鏈結。這樣一來就可以保留分享時的隱私,也確保檔案不會永久保存於網路上。
notifyUploadEncryptDone = 已加密您的檔案,可以傳送 notifyUploadEncryptDone = 已加密您的檔案,可以傳送
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = { $downloadCount } 次下載或 { $timespan } 後失效 archiveExpiryInfo = { $downloadCount } 或 { $timespan } 後失效
timespanMinutes = timespanMinutes =
{ $num -> { $num ->
*[other] { $num } 分鐘 *[other] { $num } 分鐘

View File

@@ -19,8 +19,8 @@ exec(cmd)
const locales = Object.keys(summary) const locales = Object.keys(summary)
.filter(locale => { .filter(locale => {
const loc = summary[locale]; const loc = summary[locale];
const hasMissing = loc.hasOwnProperty('missing'); const hasMissing = Object.prototype.hasOwnProperty.call(loc, 'missing');
const hasErrors = loc.hasOwnProperty('errors'); const hasErrors = Object.prototype.hasOwnProperty.call(loc, 'errors');
return !hasMissing && !hasErrors; return !hasMissing && !hasErrors;
}) })
.sort(); .sort();

View File

@@ -33,7 +33,7 @@ function filterErrors(details) {
.sort() .sort()
.map(locale => { .map(locale => {
const data = details[locale] const data = details[locale]
.filter(item => item.hasOwnProperty('error')) .filter(item => Object.prototype.hasOwnProperty.call(item, 'error'))
.map(({ error }) => error); .map(({ error }) => error);
return { locale, data }; return { locale, data };
}) })

View File

@@ -0,0 +1,13 @@
#!/bin/bash
echo "checking package-lock.json for changes"
IFS=' '
read -ra G_PARAMS <<< "$HUSKY_GIT_PARAMS"
PREV=${G_PARAMS[0]}
NEXT=${G_PARAMS[1]}
if [ "$PREV" != "$NEXT" ]; then
DIFF=$(git diff $PREV $NEXT package-lock.json)
if [ "$DIFF" != "" ]; then
npm install
fi
fi

View File

@@ -3,7 +3,7 @@ const routes = require('../routes');
const pages = require('../routes/pages'); const pages = require('../routes/pages');
const tests = require('../../test/frontend/routes'); const tests = require('../../test/frontend/routes');
const express = require('express'); const express = require('express');
const expressWs = require('express-ws'); const expressWs = require('@dannycoates/express-ws');
const morgan = require('morgan'); const morgan = require('morgan');
const config = require('../config'); const config = require('../config');

View File

@@ -1,13 +1,13 @@
const express = require('express'); const express = require('express');
const path = require('path'); const path = require('path');
const Raven = require('raven'); const Sentry = require('@sentry/node');
const config = require('../config'); const config = require('../config');
const routes = require('../routes'); const routes = require('../routes');
const pages = require('../routes/pages'); const pages = require('../routes/pages');
const expressWs = require('express-ws'); const expressWs = require('@dannycoates/express-ws');
if (config.sentry_dsn) { if (config.sentry_dsn) {
Raven.config(config.sentry_dsn).install(); Sentry.init({ dsn: config.sentry_dsn });
} }
const app = express(); const app = express();

View File

@@ -2,7 +2,7 @@ const assets = require('../../common/assets');
const routes = require('../routes'); const routes = require('../routes');
const pages = require('../routes/pages'); const pages = require('../routes/pages');
const tests = require('../../test/frontend/routes'); const tests = require('../../test/frontend/routes');
const expressWs = require('express-ws'); const expressWs = require('@dannycoates/express-ws');
module.exports = function(app, devServer) { module.exports = function(app, devServer) {
assets.setMiddleware(devServer.middleware); assets.setMiddleware(devServer.middleware);

View File

@@ -8,12 +8,10 @@ if (config.sentry_id) {
//eslint-disable-next-line node/no-missing-require //eslint-disable-next-line node/no-missing-require
const version = require('../dist/version.json'); const version = require('../dist/version.json');
sentry = ` sentry = `
var RAVEN_CONFIG = { var SENTRY_CONFIG = {
dsn: '${config.sentry_id}',
release: '${version.version}', release: '${version.version}',
tags: { beforeSend: function (data) {
commit: '${version.commit}'
},
dataCallback: function (data) {
var hash = window.location.hash; var hash = window.location.hash;
if (hash) { if (hash) {
return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), '')); return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), ''));
@@ -21,7 +19,6 @@ var RAVEN_CONFIG = {
return data; return data;
} }
} }
var SENTRY_ID = '${config.sentry_id}';
`; `;
} }

Some files were not shown because too many files have changed in this diff Show More