Compare commits

...

149 Commits

Author SHA1 Message Date
Danny Coates
8d658dc159 v2.4.0 2018-02-26 17:55:29 -08:00
Danny Coates
fb8e0afd85 fixed checkFiles bug 2018-02-26 17:50:58 -08:00
Danny Coates
5263839731 undo a fup from previous commit 2018-02-26 13:54:41 -08:00
Danny Coates
484063a596 fixed some html nits 2018-02-26 13:49:26 -08:00
Danny Coates
5650c7f778 Merge pull request #769 from mozilla/i740
removed unsafe-inline styles via svgo-loader
2018-02-26 11:52:42 -08:00
Danny Coates
74728782f3 removed unsafe-inline styles via svgo-loader. fixes #740 2018-02-26 11:48:28 -08:00
Danny Coates
0a0980f9e3 Merge pull request #767 from mozilla/circl
added coverage artifact to circleci
2018-02-26 10:15:37 -08:00
Danny Coates
26c46b8488 added coverage artifact to circleci 2018-02-26 10:09:28 -08:00
Danny Coates
c469696687 ignore all branch pushes for stage builds 2018-02-25 17:14:37 -08:00
Danny Coates
27550a7781 fix? circleci deploy 2018-02-25 17:06:28 -08:00
Danny Coates
e79bacd268 Merge pull request #766 from mozilla/frontend-tests
Some frontend unit tests [WIP]
2018-02-25 16:53:02 -08:00
Danny Coates
fd2dfcc4f2 circleci v2 2018-02-25 16:39:45 -08:00
Danny Coates
74b9e364fe updated deps 2018-02-25 10:59:35 -08:00
Filip Hruška
d2412679ea Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Michal Stanke <mstanke@mozilla.cz>
- Filip Hruška <fhr@fhrnet.eu>
2018-02-25 12:10:47 +00:00
Марко Костић (Marko Kostić)
98e6fc3b4a Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2018-02-25 08:10:19 +00:00
Slimane Amiri
b64b2a3091 Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- Slimane Amiri <slimane.amiri@gmail.com>
2018-02-25 07:50:44 +00:00
Slimane Amiri
6275f3abf7 Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- Slimane Amiri <slimane.amiri@gmail.com>
2018-02-25 07:31:42 +00:00
Danny Coates
22e836c98a removed unused deps 2018-02-24 18:00:43 -08:00
Danny Coates
d6c0489fa3 more frontend tests and some factoring based on them 2018-02-24 12:57:19 -08:00
Danny Coates
78728ce4ca some frontend unit tests 2018-02-24 11:21:48 -08:00
Bjørn I
6803a34b51 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2018-02-24 09:32:28 +00:00
jlG
42b6383283 Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- jlG <jlg.l10n.es@gmail.com>
2018-02-23 21:32:57 +00:00
Georgianizator
147f009279 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2018-02-23 17:52:11 +00:00
Andreas Pettersson
b899781b69 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2018-02-23 16:51:56 +00:00
Alexander Slovesnik
64d0819ab4 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Alexander Slovesnik <unghost@mozilla-russia.org>
2018-02-23 13:31:50 +00:00
Rhoslyn Prys
3ea4af816a Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2018-02-23 11:51:38 +00:00
Pin-guang Chen
037d2c6974 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2018-02-23 11:51:24 +00:00
Ton
fe2c664474 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2018-02-23 09:50:46 +00:00
Nihad Suljić
a3d429b9c3 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad Suljić <nihad.suljic92@gmail.com>
2018-02-23 06:51:18 +00:00
manxmensch
d0e6f4118d Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2018-02-23 02:12:08 +00:00
Kohei Yoshino
75fb58e454 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2018-02-23 01:31:39 +00:00
Selim Şumlu
6563b7fd11 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2018-02-22 23:30:59 +00:00
Maykon Chagas
e1b78174e2 Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Maykon Chagas <mchagas@riseup.net>
2018-02-22 20:51:34 +00:00
Michael Wolf
aab7e25f80 Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-02-22 20:12:32 +00:00
Michael Wolf
24b2ba7b35 Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-02-22 20:12:28 +00:00
Juan Esteban Ajsivinac Sián
20ae667b3b Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-02-22 20:12:24 +00:00
Juraj Cigáň
d8cb9da483 Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2018-02-22 19:51:15 +00:00
Besnik Bleta
8abce2ccf3 Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2018-02-22 19:31:23 +00:00
Rodrigo
aa3ebd3bd2 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-02-22 19:12:18 +00:00
Michael Köhler
4929437283 Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2018-02-22 18:51:36 +00:00
Balázs Meskó
389dd19a8a Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2018-02-22 18:31:38 +00:00
Francesco Lodolo
a8b6b3335b Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2018-02-22 17:50:43 +00:00
Théo Chevalier
a925e2fae0 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2018-02-22 17:31:29 +00:00
YFdyh000
dc79b5923e Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2018-02-22 17:31:25 +00:00
Danny Coates
b39bbaf6fb Merge pull request #761 from mozilla/i741
added maxPasswordLength and passwordError messages
2018-02-22 09:10:26 -08:00
Danny Coates
14b40d820b added password setting error UI 2018-02-22 09:01:29 -08:00
Rhoslyn Prys
354d5963ec Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2018-02-22 15:51:26 +00:00
Victor Bychek
6a32b94336 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2018-02-22 10:31:30 +00:00
Danny Coates
5c68437b1c trimmed progress.css 2018-02-21 16:59:54 -08:00
Danny Coates
0106f280f0 removed unused css class on preview page 2018-02-21 16:53:14 -08:00
Danny Coates
b567aaac69 updated preview page 2018-02-21 16:40:52 -08:00
Danny Coates
36b419202b updated notFound page 2018-02-21 16:33:06 -08:00
Danny Coates
c80d01c648 updated error page 2018-02-21 16:28:40 -08:00
Danny Coates
1d00646b17 go back to faster createObjectURL for saveFile on non-iOS 2018-02-21 15:43:32 -08:00
Danny Coates
e4b98fe65a moved saveFile from utils to fileReceiver 2018-02-21 14:58:41 -08:00
Danny Coates
12443db891 Merge pull request #764 from mozilla/prog
added indefinite progress mode
2018-02-21 14:17:11 -08:00
Danny Coates
03f08de32f added indefinite progress mode 2018-02-21 13:59:06 -08:00
Danny Coates
c18f488be7 added maxPasswordLength and passwordError messages 2018-02-21 10:03:19 -08:00
Danny Coates
099012fac9 updated password input behavior. fixes #762 & fixes #763 2018-02-21 09:55:04 -08:00
Jordi Serratosa
fa510af65a Pontoon: Update Catalan (ca) localization of Test Pilot: Firefox Send
Localization authors:
- Jordi Serratosa <jordis@softcatala.cat>
2018-02-21 17:11:33 +00:00
Luna Jernberg
46b514cc61 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Luna Jernberg <bittin@cafe8bitar.se>
2018-02-21 14:12:13 +00:00
Danny Coates
019c8814f6 disable nanotiming without localstorage (as of 7.3.0) 2018-02-20 16:00:19 -08:00
Danny Coates
46249935b2 moved babel-polyfill to prod deps 2018-02-20 12:52:44 -08:00
Danny Coates
ebecc6bb81 updated download password input style 2018-02-20 12:21:00 -08:00
Danny Coates
130ddca135 make 'change' button visible by default after pwd set 2018-02-20 11:27:56 -08:00
Danny Coates
f2661989dc updated deps 2018-02-20 10:56:16 -08:00
Roberto Alvarado
3f6cb8c356 Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2018-02-20 18:51:01 +00:00
YFdyh000
228d9cca6c Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2018-02-20 18:33:03 +00:00
Марко Костић (Marko Kostić)
d08a1dd2ca Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2018-02-20 18:11:41 +00:00
Selim Şumlu
7d76a60db7 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2018-02-20 13:11:34 +00:00
Ton
e4f0865067 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2018-02-20 10:50:53 +00:00
Rok Žerdin
cad4bd7c04 Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
2018-02-20 10:11:54 +00:00
Nihad Suljić
f85aaf0370 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad Suljić <nihad.suljic92@gmail.com>
2018-02-20 10:11:50 +00:00
Michael Köhler
312d78617d Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2018-02-20 08:50:58 +00:00
Balázs Meskó
af5aa12fa1 Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2018-02-20 08:31:19 +00:00
Håvar Henriksen
1c7e2edae0 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2018-02-20 08:11:41 +00:00
Fjoerfoks
a49eee9685 Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2018-02-20 07:50:53 +00:00
Danny Coates
61938c8e66 fixed css bundle filename hash 2018-02-19 23:44:18 -08:00
manxmensch
76d10f5920 Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2018-02-20 07:11:54 +00:00
صفا الفليج
2cf85926e9 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- صفا الفليج <safa1996alfulaij@gmail.com>
2018-02-20 07:11:51 +00:00
Danny Coates
afb099f9df updated noscript style 2018-02-19 23:10:03 -08:00
Pin-guang Chen
343627eb82 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2018-02-20 05:31:40 +00:00
Francesco Lodolo
86f2477c63 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2018-02-20 04:50:41 +00:00
Frederick Villaluna
2684150141 Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2018-02-20 03:11:09 +00:00
Maykon Chagas
3f8d8d055d Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Maykon Chagas <mchagas@riseup.net>
2018-02-20 01:32:00 +00:00
Georgianizator
e775e0542e Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2018-02-20 00:51:15 +00:00
Danny Coates
7992ba5bc1 tweaked password input style 2018-02-19 16:22:17 -08:00
Rodrigo
d24bbaa65a Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-02-20 00:10:28 +00:00
Kohei Yoshino
58a91e1b86 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2018-02-19 23:31:29 +00:00
Kohei Yoshino
cfed1d0230 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2018-02-19 23:10:56 +00:00
Danny Coates
b14c70f4b6 fixed file button style on input focus 2018-02-19 15:06:46 -08:00
Danny Coates
ad77fc20c6 fixed dnd after css changes 2018-02-19 14:29:13 -08:00
Danny Coates
029633f3d3 tweaked input styles 2018-02-19 14:02:26 -08:00
Michael Wolf
78459d759c Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-02-19 21:51:15 +00:00
Michael Wolf
a0d5a3dd07 Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-02-19 21:51:13 +00:00
Juan Esteban Ajsivinac Sián
d76d983d5d Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-02-19 21:51:10 +00:00
Juraj Cigáň
68b8e7dc7c Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2018-02-19 21:31:59 +00:00
Théo Chevalier
1a7aff5102 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2018-02-19 21:31:56 +00:00
Danny Coates
677edffb80 Merge pull request #760 from mozilla/refactor-css
refactored css: phase 1
2018-02-19 13:10:10 -08:00
ybouhamam
2cd90c998b Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- ybouhamam <ybouhamam@gmail.com>
2018-02-18 20:32:16 +00:00
Danny Coates
346e604f34 updated password input UI 2018-02-17 15:07:47 -08:00
Danny Coates
8d41111cd6 refactored css, including some markup changes 2018-02-15 15:54:59 -08:00
Danny Coates
3163edcbe4 exclude fxios from fxPromo banner. fixes #753 2018-02-15 11:49:41 -08:00
Danny Coates
18df43c9cb Merge pull request #759 from flodolo/ftl_en
Switch en-US FTL file to new syntax
2018-02-15 08:56:56 -08:00
Francesco Lodolo [:flod]
4f2179c4d7 Switch en-US FTL file to new syntax 2018-02-15 11:24:21 +01:00
Danny Coates
b89546ac22 ignore stylelint until refactor-css is merged 2018-02-14 10:47:09 -08:00
Danny Coates
c0ad7635f2 change saveFile. attempting to fix for iOS 2018-02-14 09:29:37 -08:00
Bjørn I
a82688163e Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2018-02-14 11:11:09 +00:00
Danny Coates
29c36ee110 updated deps 2018-02-12 11:39:35 -08:00
Merike Sell
43698f8d61 Pontoon: Update Estonian (et) localization of Test Pilot: Firefox Send
Localization authors:
- Merike Sell <merikes@gmail.com>
2018-02-12 18:10:42 +00:00
Danny Coates
b5b29aeb17 focus download password input on render. fixes #745 2018-02-12 09:53:34 -08:00
Melo46
fdcf4c152a Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send
Localization authors:
- Melo46 <melo@carmu.com>
2018-02-12 08:10:33 +00:00
Danny Coates
dcfda9521b nit: use 'html/raw' instead of html() where possible 2018-02-11 14:03:00 -08:00
Jim Spentzos
950c9cdaeb Pontoon: Update Greek (el) localization of Test Pilot: Firefox Send
Localization authors:
- Jim Spentzos <jamesspentzos@hotmail.com>
2018-02-10 20:32:06 +00:00
Danny Coates
1e9641a40e Merge pull request #758 from mozilla/refactor-backend
refactored server
2018-02-09 15:10:22 -08:00
Danny Coates
3fd2537311 refactored server 2018-02-09 15:03:05 -08:00
Danny Coates
6d470b8eba Merge pull request #757 from stasm/update-fluent-0.4.3
Update to fluent 0.4.3
2018-02-09 09:33:52 -08:00
Staś Małolepszy
71ad81a67d Update to fluent 0.4.3 2018-02-09 15:22:41 +01:00
Juan Esteban Ajsivinac Sián
9a1852ea05 Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-02-08 20:10:59 +00:00
Besnik Bleta
629a86de99 Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2018-02-08 15:31:55 +00:00
Mozilla Pontoon
3539868683 Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send 2018-02-08 07:50:55 +00:00
Mozilla Pontoon
71d4566df5 Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send 2018-02-08 07:50:52 +00:00
Mozilla Pontoon
caaa613ce9 Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send 2018-02-08 07:50:49 +00:00
Danny Coates
cf36a33aea localize other displayed numbers 2018-02-07 19:46:18 -08:00
Danny Coates
a777a808ee renamed localization ctx global to reduce the chance of collision (seen in sentry) 2018-02-07 19:18:11 -08:00
Danny Coates
a78150b7ad disable nanotiming 2018-02-07 18:52:41 -08:00
Danny Coates
deb177c6bb updated availableLanguages and localized progress percentage. fixes #747 2018-02-07 12:09:23 -08:00
Danny Coates
1c5e47b4c4 validate id param without middleware 2018-02-05 17:21:32 -08:00
Danny Coates
aae61f9451 extracted server id validation 2018-02-05 16:37:06 -08:00
Khaled Hosny
807c44f057 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Khaled Hosny <khaledhosny@eglug.org>
2018-02-06 00:11:42 +00:00
Khaled Hosny
9782007f7e Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Khaled Hosny <khaledhosny@eglug.org>
2018-02-05 23:50:56 +00:00
Danny Coates
77d5f1e603 fixed welcome page flicker 2018-02-05 13:28:38 -08:00
Michal Vašíček
81ee6de0a3 Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Michal Vašíček <michalvasicek@icloud.com>
- Filip Hruška <fhr@fhrnet.eu>
2018-02-05 18:10:59 +00:00
Danny Coates
82fe65ada2 v2.3.1 2018-02-05 09:34:22 -08:00
Danny Coates
ce79d7b745 reset FileReceiver on cancel. fixes #751 2018-02-05 09:11:42 -08:00
Rhoslyn Prys
755cc4f5ec Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2018-02-05 12:12:00 +00:00
Danny Coates
fde4d311e3 added FileReceiver.reset 2018-02-04 18:30:33 -08:00
Sara Todaro
b08f40aaa3 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Sara Todaro <sara.todaro@mozillaitalia.org>
2018-02-04 21:11:34 +00:00
Victor Bychek
e12ade6b31 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2018-02-04 11:32:24 +00:00
Sara Todaro
43fc80ef41 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Sara Todaro <sara.todaro@mozillaitalia.org>
- Winfox <openlib@email.it>
2018-02-04 10:50:45 +00:00
Georgianizator
6ca96157f6 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2018-02-04 10:12:00 +00:00
jlG
856181ea54 Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- jlG <jlg.l10n.es@gmail.com>
- Jordi Cuevas <jordicuevas@gmail.com>
2018-02-03 23:31:26 +00:00
Jordi Cuevas
f84bd46cdc Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- Jordi Cuevas <jordicuevas@gmail.com>
2018-02-03 23:12:07 +00:00
Victor Bychek
0b43924ee2 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2018-02-03 18:32:13 +00:00
Selim Şumlu
16d3fd3828 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2018-02-03 17:50:50 +00:00
Danny Coates
cf5defa6a9 fixed file list time wrap. fixes #749 2018-02-02 10:37:28 -08:00
Danny Coates
3de760db12 added fileTooBig alert to drop handler. fixes #578 2018-02-02 10:22:32 -08:00
Danny Coates
1366f0b68e moved ownedFile.type assignment 2018-02-02 10:15:17 -08:00
Danny Coates
be498e0bd3 /api/info values should be numbers. fixes #748 2018-02-02 10:10:51 -08:00
163 changed files with 14101 additions and 6664 deletions

View File

@@ -6,3 +6,5 @@ assets
docs docs
public public
test test
coverage
.nyc_output

View File

@@ -1,3 +1,4 @@
dist dist
assets assets
firefox firefox
coverage

3
.gitignore vendored
View File

@@ -1,3 +1,6 @@
node_modules node_modules
coverage
dist dist
.idea .idea
.DS_Store
.nyc_output

3
.nsprc
View File

@@ -1,3 +0,0 @@
{
"exceptions": ["https://nodesecurity.io/advisories/534"]
}

View File

@@ -1,2 +1,3 @@
dist dist
assets/*.js assets/*.js
coverage

View File

@@ -1,5 +1,87 @@
## Change Log ## Change Log
### upcoming (2018/02/27 01:52 +00:00)
- [#769](https://github.com/mozilla/send/pull/769) removed unsafe-inline styles via svgo-loader (@dannycoates)
- [#767](https://github.com/mozilla/send/pull/767) added coverage artifact to circleci (@dannycoates)
- [#766](https://github.com/mozilla/send/pull/766) Some frontend unit tests [WIP] (@dannycoates)
- [#761](https://github.com/mozilla/send/pull/761) added maxPasswordLength and passwordError messages (@dannycoates)
- [#764](https://github.com/mozilla/send/pull/764) added indefinite progress mode (@dannycoates)
- [#760](https://github.com/mozilla/send/pull/760) refactored css: phase 1 (@dannycoates)
- [#759](https://github.com/mozilla/send/pull/759) Switch en-US FTL file to new syntax (@flodolo)
- [#758](https://github.com/mozilla/send/pull/758) refactored server (@dannycoates)
- [#757](https://github.com/mozilla/send/pull/757) Update to fluent 0.4.3 (@stasm)
### v2.3.0 (2018/02/01 23:27 +00:00)
- [#536](https://github.com/mozilla/send/pull/536) use redis expire event to delete stored data immediately (@ehuggett)
- [#744](https://github.com/mozilla/send/pull/744) Gradient experiment (@dannycoates)
- [#739](https://github.com/mozilla/send/pull/739) added /api/info/:id route (@dannycoates)
- [#737](https://github.com/mozilla/send/pull/737) big refactor (@dannycoates)
- [#722](https://github.com/mozilla/send/pull/722) Add localization note to 'Time' and 'Downloads' string (@flodolo)
- [#721](https://github.com/mozilla/send/pull/721) show download Limits on page; Fixes #661 (@shikhar-scs)
- [#694](https://github.com/mozilla/send/pull/694) Passwords can now be changed (#687) (@himanish-star)
- [#702](https://github.com/mozilla/send/pull/702) Restricted the banner from showing on unsupported browsers (@himanish-star)
- [#701](https://github.com/mozilla/send/pull/701) improved popup for mobile display; Fixes #699 (@shikhar-scs)
- [#683](https://github.com/mozilla/send/pull/683) API changes to accommodate 3rd party clients (@ehuggett)
- [#698](https://github.com/mozilla/send/pull/698) Popup for delete button attached (@himanish-star)
- [#695](https://github.com/mozilla/send/pull/695) Show Warning, Cancel and Redirect on size > 2GB ; fixes #578 (@shikhar-scs)
- [#684](https://github.com/mozilla/send/pull/684) delete btn popup attached (@himanish-star)
- [#686](https://github.com/mozilla/send/pull/686) Hide password while Typing and after Entering: Fixes #670 (@shikhar-scs)
- [#679](https://github.com/mozilla/send/pull/679) changed font to sans sherif: Solves #676 (@shikhar-scs)
- [#693](https://github.com/mozilla/send/pull/693) README: Fix query link for "good first bugs" (@jspam)
- [#685](https://github.com/mozilla/send/pull/685) checkbox now has a hover effect: fixes #635 (@himanish-star)
- [#668](https://github.com/mozilla/send/pull/668) Add possibility to bind to a specific IP address (@TwizzyDizzy)
- [#682](https://github.com/mozilla/send/pull/682) [Docs] - README.md - minor spelling fixes (@tmm2018)
- [#672](https://github.com/mozilla/send/pull/672) Use EXPIRE_SECONDS to calculate file ttl for static content (@derektamsen)
- [#680](https://github.com/mozilla/send/pull/680) adjusted line height of label : fixes #609 (@himanish-star)
### v2.2.2 (2017/12/19 18:06 +00:00)
- [#667](https://github.com/mozilla/send/pull/667) Make develop the default NODE_ENV (@claudijd)
### v2.2.1 (2017/12/08 18:00 +00:00)
- [#665](https://github.com/mozilla/send/pull/665) stop drag target from flickering when dragging over children (@ericawright)
### v2.2.0 (2017/12/06 23:57 +00:00)
- [#654](https://github.com/mozilla/send/pull/654) Multiple download UI (@dannycoates)
- [#650](https://github.com/mozilla/send/pull/650) #634: overwrite appearance of password submit input (@ovlb)
- [#649](https://github.com/mozilla/send/pull/649) #609 share interface: align text in input and button (@ovlb)
### v2.1.2 (2017/11/16 19:03 +00:00)
- [#645](https://github.com/mozilla/send/pull/645) Remove the leak of the password into the console (@laurentj)
### v2.1.0 (2017/11/15 03:07 +00:00)
- [#641](https://github.com/mozilla/send/pull/641) Added experiment for firefox download promo (@dannycoates)
- [#640](https://github.com/mozilla/send/pull/640) use fluent-langneg for subtag support (@dannycoates)
- [#639](https://github.com/mozilla/send/pull/639) wrap number localization in try/catch (@dannycoates)
### v2.0.0 (2017/11/08 05:31 +00:00)
- [#633](https://github.com/mozilla/send/pull/633) Keyboard navigation/visual feedback regression (@ehuggett)
- [#632](https://github.com/mozilla/send/pull/632) display the 'add password' button only when the input field isn't empty (@dannycoates)
- [#626](https://github.com/mozilla/send/pull/626) Partial fix for #623 (@ehuggett)
- [#624](https://github.com/mozilla/send/pull/624) set a default MIME type in file metadata (@ehuggett)
- [#612](https://github.com/mozilla/send/pull/612) Password UI nits (@dannycoates, @ericawright)
- [#617](https://github.com/mozilla/send/pull/617) allow drag and drop if navigating from shared page (@ericawright)
- [#608](https://github.com/mozilla/send/pull/608) disable copying link when password not completed (@ericawright)
- [#605](https://github.com/mozilla/send/pull/605) align the "Password" and "Copy to clipboard" fields. (@ericawright)
- [#582](https://github.com/mozilla/send/pull/582) Add optional password to the download url (@dannycoates)
### v1.2.4 (2017/10/10 17:34 +00:00)
- [#583](https://github.com/mozilla/send/pull/583) Promote the beefy UI to default (@dannycoates)
- [#581](https://github.com/mozilla/send/pull/581) introducing ToC to README.md (@tmm2018)
- [#579](https://github.com/mozilla/send/pull/579) Hide cancel button when upload reaches 100% (@ericawright)
- [#580](https://github.com/mozilla/send/pull/580) Change Favicon in to look better in a variety of cases (@ericawright)
- [#571](https://github.com/mozilla/send/pull/571) Centre logo (@ehuggett)
- [#574](https://github.com/mozilla/send/pull/574) Make upload button focusable (accessibility/tab navigation) (@ehuggett)
### v1.2.0 (2017/09/12 22:42 +00:00)
- [#559](https://github.com/mozilla/send/pull/559) added first A/B experiment (@dannycoates)
- [#542](https://github.com/mozilla/send/pull/542) fix docker link typo (@ehuggett)
- [#541](https://github.com/mozilla/send/pull/541) removed .title and .alt attributes from ftl (@dannycoates)
- [#537](https://github.com/mozilla/send/pull/537) a few changes to make A/B testing easier (@dannycoates)
- [#533](https://github.com/mozilla/send/pull/533) minor UI fixes (@youwenliang)
- [#531](https://github.com/mozilla/send/pull/531) Add CHANGELOG script (@pdehaan)
- [#535](https://github.com/mozilla/send/pull/535) Fixed minimum NodeJS version in README (@LuFlo)
- [#528](https://github.com/mozilla/send/pull/528) adding separators to README (@tmm2018)
### v1.1.1 (2017/08/17 01:29 +00:00) ### v1.1.1 (2017/08/17 01:29 +00:00)
- [#516](https://github.com/mozilla/send/pull/516) cache assets (@dannycoates) - [#516](https://github.com/mozilla/send/pull/516) cache assets (@dannycoates)
- [#520](https://github.com/mozilla/send/pull/520) fix drag & drop (@dannycoates) - [#520](https://github.com/mozilla/send/pull/520) fix drag & drop (@dannycoates)

View File

@@ -1,74 +1,122 @@
Abdalrahman Hwoij
Abhinav Adduri Abhinav Adduri
Adnan Kičin
Alberto Castro
Alexander Slovesnik Alexander Slovesnik
Amin Mahmudian Amin Mahmudian
Andreas Pettersson Andreas Pettersson
Arash Mousavi Arash Mousavi
Artem Polivanchuk
Ashikur Rahman
Balázs Meskó Balázs Meskó
Belayet Hossain Belayet Hossain
Besnik Bleta
Bjørn I Bjørn I
Boopesh Mahendran Boopesh Mahendran
Breana Gonzales
Chuck Harmston Chuck Harmston
Cláudio Esperança Cláudio Esperança
Cristian Silaghi
Cynthia Pereira Cynthia Pereira
Daniel Thorn Daniel Thorn
Daniela Arcese Daniela Arcese
Danny Coates Danny Coates
Derek Tamsen
Edmund Huggett
Elisa X
Emin Mastizada Emin Mastizada
Enol Enol
Erica Erica
Erica Wright Erica Wright
Filip Hruška
Fjoerfoks Fjoerfoks
Francesco Lodolo Francesco Lodolo
Francesco Lodolo [:flod] Francesco Lodolo [:flod]
Frederick Villaluna
Gautam krishna.R Gautam krishna.R
Georgianizator
Hyeonseok Shin
Håvar Henriksen Håvar Henriksen
Jae Hyeon Park Jae Hyeon Park
Jakub Rychlý Jakub Rychlý
Jamie Jamie
Jim Spentzos Jim Spentzos
Jobava
Johann-S Johann-S
John Gruen John Gruen
Jon Vadillo Jon Vadillo
Jonathan Claudius
Jordi Cuevas
Jordi Serratosa Jordi Serratosa
Juan Esteban Ajsivinac Sián
Juraj Cigáň Juraj Cigáň
Kerim Kalamujić
Khaled Hosny
Kohei Yoshino Kohei Yoshino
Lan Glad Lan Glad
Laurent Jouanneau
Lobodzets
LuFlo
Luiz Carlos de Morais
Luna Jernberg Luna Jernberg
Marcelo Poli Marcelo Poli
Marco Aurélio Marco Aurélio
Mark Heijl
Mark Liang Mark Liang
Marko Andrejić
Matjaž Horvat Matjaž Horvat
Maykon Chagas Maykon Chagas
Melo46
Merike Sell
Michael Köhler Michael Köhler
Michael Wolf Michael Wolf
Michal Stanke Michal Stanke
Michal Vašíček Michal Vašíček
Mozilla Pontoon
Moḥend Belqasem Moḥend Belqasem
Muḥend Belqasem
Nicholas Skinsacos Nicholas Skinsacos
Nihad
Nihad Suljić
Oscar
Peter deHaan Peter deHaan
Pierre Neter Pierre Neter
Pin-guang Chen Pin-guang Chen
Radu Popescu
Rhoslyn Prys Rhoslyn Prys
RickieES
Rizky Ariestiyansyah Rizky Ariestiyansyah
Roberto Alvarado Roberto Alvarado
Rodrigo Rodrigo
Rodrigo Guerra
Rok Žerdin Rok Žerdin
Sahithi Sahithi
Sairam Raavi Sairam Raavi
Sander Lepik
Sandro Sandro
Sara Todaro
Sav22999
Schieck :) Schieck :)
Selim Şumlu Selim Şumlu
Slimane Amiri Slimane Amiri
Soumya Himanish Mohapatra
Staś Małolepszy
Tema
Thomas Dalichow
Théo Chevalier Théo Chevalier
Tiago Morais Morgado
Tomáš Zelina Tomáš Zelina
Ton Ton
Tymur Faradzhev Tymur Faradzhev
Uccen Marzuq
Varghese Thomas Varghese Thomas
Victor Bychek Victor Bychek
Weihang Lo Weihang Lo
Wil Clouser Wil Clouser
YFdyh000 YFdyh000
You-Wen Liang (Mark) You-Wen Liang (Mark)
aefgh39622
albertdcastro
alex_mayorga alex_mayorga
ariestiyansyah ariestiyansyah
avelper avelper
@@ -77,16 +125,26 @@ ehuggett
eljuno eljuno
erdem cobanoglu erdem cobanoglu
gautamkrishnar gautamkrishnar
gmontagu
goofy goofy
hello
hi hi
jesferman1993 jesferman1993
jlG
josotrix josotrix
jspam
kenrick95 kenrick95
manxmensch manxmensch
mirzet.omerovic.1992
ravmn ravmn
reza.habibi2008 reza.habibi2008
savemore99.sm
shikhar-scs
siparon siparon
skystar-p skystar-p
tiagomoraismorgado
xcffl xcffl
ybouhamam
Μιχάλης Μιχάλης
Марко Костић (Marko Kostić) Марко Костић (Marko Kostić)
صفا الفليج

View File

@@ -91,10 +91,15 @@ export async function setPassword(id, owner_token, keychain) {
return response.ok; return response.ok;
} }
export function uploadFile(encrypted, metadata, verifierB64, keychain) { export function uploadFile(
encrypted,
metadata,
verifierB64,
keychain,
onprogress
) {
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
const upload = { const upload = {
onprogress: function() {},
cancel: function() { cancel: function() {
xhr.abort(); xhr.abort();
}, },
@@ -122,7 +127,7 @@ export function uploadFile(encrypted, metadata, verifierB64, keychain) {
fd.append('data', blob); fd.append('data', blob);
xhr.upload.addEventListener('progress', function(event) { xhr.upload.addEventListener('progress', function(event) {
if (event.lengthComputable) { if (event.lengthComputable) {
upload.onprogress([event.loaded, event.total]); onprogress([event.loaded, event.total]);
} }
}); });
xhr.open('post', '/api/upload', true); xhr.open('post', '/api/upload', true);
@@ -132,82 +137,63 @@ export function uploadFile(encrypted, metadata, verifierB64, keychain) {
return upload; return upload;
} }
function download(id, keychain) { function download(id, keychain, onprogress, canceller) {
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
const download = { canceller.oncancel = function() {
onprogress: function() {}, xhr.abort();
cancel: function() {
xhr.abort();
},
result: new Promise(async function(resolve, reject) {
xhr.addEventListener('loadend', function() {
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
if (authHeader) {
keychain.nonce = parseNonce(authHeader);
}
if (xhr.status === 404) {
return reject(new Error('notfound'));
}
if (xhr.status !== 200) {
return reject(new Error(xhr.status));
}
const blob = new Blob([xhr.response]);
const fileReader = new FileReader();
fileReader.readAsArrayBuffer(blob);
fileReader.onload = function() {
resolve(this.result);
};
});
xhr.addEventListener('progress', function(event) {
if (event.lengthComputable && event.target.status === 200) {
download.onprogress([event.loaded, event.total]);
}
});
const auth = await keychain.authHeader();
xhr.open('get', `/api/download/${id}`);
xhr.setRequestHeader('Authorization', auth);
xhr.responseType = 'blob';
xhr.send();
})
}; };
return new Promise(async function(resolve, reject) {
xhr.addEventListener('loadend', function() {
canceller.oncancel = function() {};
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
if (authHeader) {
keychain.nonce = parseNonce(authHeader);
}
if (xhr.status !== 200) {
return reject(new Error(xhr.status));
}
return download; const blob = new Blob([xhr.response]);
const fileReader = new FileReader();
fileReader.readAsArrayBuffer(blob);
fileReader.onload = function() {
resolve(this.result);
};
});
xhr.addEventListener('progress', function(event) {
if (event.lengthComputable && event.target.status === 200) {
onprogress([event.loaded, event.total]);
}
});
const auth = await keychain.authHeader();
xhr.open('get', `/api/download/${id}`);
xhr.setRequestHeader('Authorization', auth);
xhr.responseType = 'blob';
xhr.send();
});
} }
async function tryDownload(id, keychain, onprogress, tries = 1) { async function tryDownload(id, keychain, onprogress, canceller, tries = 1) {
const dl = download(id, keychain);
dl.onprogress = onprogress;
try { try {
const result = await dl.result; const result = await download(id, keychain, onprogress, canceller);
return result; return result;
} catch (e) { } catch (e) {
if (e.message === '401' && --tries > 0) { if (e.message === '401' && --tries > 0) {
return tryDownload(id, keychain, onprogress, tries); return tryDownload(id, keychain, onprogress, canceller, tries);
} }
throw e; throw e;
} }
} }
export function downloadFile(id, keychain) { export function downloadFile(id, keychain, onprogress) {
let cancelled = false; const canceller = {
function updateProgress(p) { oncancel: function() {} // download() sets this
if (cancelled) { };
// This is a bit of a hack function cancel() {
// We piggyback off of the progress event as a chance to cancel. canceller.oncancel();
// Otherwise wiring the xhr abort up while allowing retries }
// gets pretty nasty. return {
// 'this' here is the object returned by download(id, keychain) cancel,
return this.cancel(); result: tryDownload(id, keychain, onprogress, canceller, 2)
}
dl.onprogress(p);
}
const dl = {
onprogress: function() {},
cancel: function() {
cancelled = true;
},
result: tryDownload(id, keychain, updateProgress, 2)
}; };
return dl;
} }

267
app/base.css Normal file
View File

@@ -0,0 +1,267 @@
:root {
--pageBGColor: #fff;
--primaryControlBGColor: #0297f8;
--primaryControlFGColor: #fff;
--primaryControlHoverColor: #0287e8;
--inputTextColor: #737373;
--errorColor: #d70022;
--linkColor: #0094fb;
--textColor: #0c0c0d;
--lightTextColor: #737373;
--successControlBGColor: #05a700;
--successControlFGColor: #fff;
}
html {
background: url('../assets/send_bg.svg');
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui',
'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif;
font-weight: 200;
background-size: 110%;
background-repeat: no-repeat;
background-position: center top;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui',
'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif;
display: flex;
flex-direction: column;
margin: 0;
min-height: 100vh;
}
input,
select,
textarea,
button {
font-family: inherit;
margin: 0;
}
a {
text-decoration: none;
}
.main {
flex: auto;
max-width: 650px;
margin: 0 auto;
padding: 0 20px;
box-sizing: border-box;
width: 96%;
}
.noscript {
text-align: center;
border: 3px solid var(--errorColor);
border-radius: 6px;
}
.btn {
font-size: 15px;
font-weight: 500;
color: var(--primaryControlFGColor);
cursor: pointer;
text-align: center;
background: var(--primaryControlBGColor);
border: 1px solid var(--primaryControlBGColor);
border-radius: 5px;
}
.btn:hover {
background-color: var(--primaryControlHoverColor);
}
.btn--cancel {
color: var(--errorColor);
background: var(--pageBGColor);
font-size: 15px;
border: 0;
cursor: pointer;
text-decoration: underline;
}
.btn--cancel:disabled {
text-decoration: none;
cursor: auto;
}
.btn--cancel:hover {
background-color: var(--pageBGColor);
}
.input {
flex: 2 0 auto;
border: 1px solid var(--primaryControlBGColor);
border-radius: 6px 0 0 6px;
font-size: 20px;
color: var(--inputTextColor);
font-family: 'SF Pro Text', sans-serif;
letter-spacing: 0;
line-height: 23px;
font-weight: 300;
height: 46px;
padding-left: 10px;
padding-right: 10px;
}
.input--error {
border-color: var(--errorColor);
}
.input--noBtn {
border-radius: 6px;
}
.inputBtn {
flex: auto;
background: var(--primaryControlBGColor);
border-radius: 0 6px 6px 0;
border: 1px solid var(--primaryControlBGColor);
color: var(--primaryControlFGColor);
cursor: pointer;
/* Force flat button look */
appearance: none;
font-size: 15px;
padding-bottom: 3px;
padding-left: 10px;
padding-right: 10px;
white-space: nowrap;
}
.inputBtn:disabled {
cursor: auto;
}
.inputBtn:hover {
background-color: var(--primaryControlHoverColor);
}
.inputBtn--hidden {
display: none;
}
.cursor--pointer {
cursor: pointer;
}
.link {
color: var(--linkColor);
text-decoration: none;
}
.link:focus,
.link:active,
.link:hover {
color: var(--primaryControlHoverColor);
}
.link--action {
text-decoration: underline;
text-align: center;
}
.page {
margin: 0 auto 30px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
}
.progressSection {
margin: 0 auto;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
font-size: 15px;
}
.progressSection__text {
color: var(--lightTextColor);
letter-spacing: -0.4px;
margin-top: 24px;
margin-bottom: 74px;
}
.effect--fadeOut {
opacity: 0;
animation: fadeout 200ms linear;
}
@keyframes fadeout {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.effect--fadeIn {
opacity: 1;
animation: fadein 200ms linear;
}
@keyframes fadein {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.error {
color: var(--errorColor);
}
.title {
font-size: 33px;
line-height: 40px;
margin: 20px auto;
text-align: center;
max-width: 520px;
font-family: 'SF Pro Text', sans-serif;
word-wrap: break-word;
}
.description {
font-size: 15px;
line-height: 23px;
max-width: 630px;
text-align: center;
margin: 0 auto 60px;
color: var(--textColor);
width: 92%;
}
@media (max-device-width: 768px), (max-width: 768px) {
.description {
margin: 0 auto 25px;
}
}
@media (max-device-width: 520px), (max-width: 520px) {
.input {
font-size: 22px;
padding: 10px 10px;
border-radius: 6px 6px 0 0;
}
.inputBtn {
border-radius: 0 0 6px 6px;
flex: 0 1 65px;
}
.input--noBtn {
border-radius: 6px;
}
}

View File

@@ -1,3 +1,6 @@
/* global MAXFILESIZE */
const { bytes } = require('./utils');
export default function(state, emitter) { export default function(state, emitter) {
emitter.on('DOMContentLoaded', () => { emitter.on('DOMContentLoaded', () => {
document.body.addEventListener('dragover', event => { document.body.addEventListener('dragover', event => {
@@ -8,15 +11,26 @@ export default function(state, emitter) {
document.body.addEventListener('drop', event => { document.body.addEventListener('drop', event => {
if (state.route === '/' && !state.uploading) { if (state.route === '/' && !state.uploading) {
event.preventDefault(); event.preventDefault();
document.querySelector('.upload-window').classList.remove('ondrag'); document
.querySelector('.uploadArea')
.classList.remove('uploadArea--dragging');
const target = event.dataTransfer; const target = event.dataTransfer;
if (target.files.length === 0) { if (target.files.length === 0) {
return; return;
} }
if (target.files.length > 1 || target.files[0].size === 0) { if (target.files.length > 1) {
return alert(state.translate('uploadPageMultipleFilesAlert')); return alert(state.translate('uploadPageMultipleFilesAlert'));
} }
const file = target.files[0]; const file = target.files[0];
if (file.size === 0) {
return;
}
if (file.size > MAXFILESIZE) {
window.alert(
state.translate('fileTooBig', { size: bytes(MAXFILESIZE) })
);
return;
}
emitter.emit('upload', { file, type: 'drop' }); emitter.emit('upload', { file, type: 'drop' });
} }
}); });

View File

@@ -18,7 +18,7 @@ const experiments = {
}, },
eligible: function() { eligible: function() {
return ( return (
!/firefox/i.test(navigator.userAgent) && !/firefox|fxios/i.test(navigator.userAgent) &&
document.querySelector('html').lang === 'en-US' document.querySelector('html').lang === 'en-US'
); );
}, },

View File

@@ -5,8 +5,7 @@ import {
delay, delay,
fadeOut, fadeOut,
openLinksInNewTab, openLinksInNewTab,
percent, percent
saveFile
} from './utils'; } from './utils';
import * as metrics from './metrics'; import * as metrics from './metrics';
@@ -19,7 +18,7 @@ export default function(state, emitter) {
} }
async function checkFiles() { async function checkFiles() {
const files = state.storage.files; const files = state.storage.files.slice();
let rerender = false; let rerender = false;
for (const file of files) { for (const file of files) {
const oldLimit = file.dlimit; const oldLimit = file.dlimit;
@@ -100,6 +99,7 @@ export default function(state, emitter) {
try { try {
metrics.startedUpload({ size, type }); metrics.startedUpload({ size, type });
const ownedFile = await sender.upload(); const ownedFile = await sender.upload();
ownedFile.type = type;
state.storage.totalUploads += 1; state.storage.totalUploads += 1;
metrics.completedUpload(ownedFile); metrics.completedUpload(ownedFile);
@@ -107,7 +107,7 @@ export default function(state, emitter) {
document.getElementById('cancel-upload').hidden = 'hidden'; document.getElementById('cancel-upload').hidden = 'hidden';
await delay(1000); await delay(1000);
await fadeOut('upload-progress'); await fadeOut('.page');
openLinksInNewTab(links, false); openLinksInNewTab(links, false);
emitter.emit('pushState', `/share/${ownedFile.id}`); emitter.emit('pushState', `/share/${ownedFile.id}`);
} catch (err) { } catch (err) {
@@ -129,11 +129,17 @@ export default function(state, emitter) {
emitter.on('password', async ({ password, file }) => { emitter.on('password', async ({ password, file }) => {
try { try {
state.settingPassword = true;
render();
await file.setPassword(password); await file.setPassword(password);
state.storage.writeFile(file); state.storage.writeFile(file);
metrics.addedPassword({ size: file.size }); metrics.addedPassword({ size: file.size });
await delay(1000);
} catch (err) { } catch (err) {
console.error(err); console.error(err);
state.passwordSetError = err;
} finally {
state.settingPassword = false;
} }
render(); render();
}); });
@@ -143,8 +149,6 @@ export default function(state, emitter) {
const receiver = new FileReceiver(file); const receiver = new FileReceiver(file);
try { try {
await receiver.getMetadata(); await receiver.getMetadata();
receiver.on('progress', updateProgress);
receiver.on('decrypting', render);
state.transfer = receiver; state.transfer = receiver;
} catch (e) { } catch (e) {
if (e.message === '401') { if (e.message === '401') {
@@ -158,36 +162,39 @@ export default function(state, emitter) {
}); });
emitter.on('download', async file => { emitter.on('download', async file => {
state.transfer.on('progress', render); state.transfer.on('progress', updateProgress);
state.transfer.on('decrypting', render); state.transfer.on('decrypting', render);
const links = openLinksInNewTab(); const links = openLinksInNewTab();
const size = file.size; const size = file.size;
try { try {
const start = Date.now(); const start = Date.now();
metrics.startedDownload({ size: file.size, ttl: file.ttl }); metrics.startedDownload({ size: file.size, ttl: file.ttl });
const f = await state.transfer.download(); const dl = state.transfer.download();
render();
await dl;
const time = Date.now() - start; const time = Date.now() - start;
const speed = size / (time / 1000); const speed = size / (time / 1000);
await delay(1000); await delay(1000);
await fadeOut('download-progress'); await fadeOut('.page');
saveFile(f);
state.storage.totalDownloads += 1; state.storage.totalDownloads += 1;
state.transfer.reset();
metrics.completedDownload({ size, time, speed }); metrics.completedDownload({ size, time, speed });
emitter.emit('pushState', '/completed'); emitter.emit('pushState', '/completed');
} catch (err) { } catch (err) {
if (err.message === '0') { if (err.message === '0') {
// download cancelled // download cancelled
state.transfer.reset();
return render(); return render();
} }
console.error(err); console.error(err);
const location = err.message === 'notfound' ? '/404' : '/error'; state.transfer = null;
const location = err.message === '404' ? '/404' : '/error';
if (location === '/error') { if (location === '/error') {
state.raven.captureException(err); state.raven.captureException(err);
metrics.stoppedDownload({ size, err }); metrics.stoppedDownload({ size, err });
} }
emitter.emit('pushState', location); emitter.emit('pushState', location);
} finally { } finally {
state.transfer = null;
openLinksInNewTab(links, false); openLinksInNewTab(links, false);
} }
}); });

View File

@@ -11,17 +11,17 @@ export default class FileReceiver extends Nanobus {
this.keychain.setPassword(fileInfo.password, fileInfo.url); this.keychain.setPassword(fileInfo.password, fileInfo.url);
} }
this.fileInfo = fileInfo; this.fileInfo = fileInfo;
this.fileDownload = null; this.reset();
this.msg = 'fileSizeProgress';
this.state = 'initialized';
this.progress = [0, 1];
this.cancelled = false;
} }
get progressRatio() { get progressRatio() {
return this.progress[0] / this.progress[1]; return this.progress[0] / this.progress[1];
} }
get progressIndefinite() {
return this.state !== 'downloading';
}
get sizes() { get sizes() {
return { return {
partialSize: bytes(this.progress[0]), partialSize: bytes(this.progress[0]),
@@ -30,56 +30,95 @@ export default class FileReceiver extends Nanobus {
} }
cancel() { cancel() {
this.cancelled = true; if (this.downloadRequest) {
if (this.fileDownload) { this.downloadRequest.cancel();
this.fileDownload.cancel();
} }
} }
reset() {
this.msg = 'fileSizeProgress';
this.state = 'initialized';
this.progress = [0, 1];
}
async getMetadata() { async getMetadata() {
const meta = await metadata(this.fileInfo.id, this.keychain); const meta = await metadata(this.fileInfo.id, this.keychain);
if (meta) { this.keychain.setIV(meta.iv);
this.keychain.setIV(meta.iv); this.fileInfo.name = meta.name;
this.fileInfo.name = meta.name; this.fileInfo.type = meta.type;
this.fileInfo.type = meta.type; this.fileInfo.iv = meta.iv;
this.fileInfo.iv = meta.iv; this.fileInfo.size = meta.size;
this.fileInfo.size = meta.size; this.state = 'ready';
this.state = 'ready';
return;
}
this.state = 'invalid';
return;
} }
async download() { async download(noSave = false) {
this.state = 'downloading'; this.state = 'downloading';
this.emit('progress', this.progress); this.downloadRequest = await downloadFile(
try { this.fileInfo.id,
const download = await downloadFile(this.fileInfo.id, this.keychain); this.keychain,
download.onprogress = p => { p => {
this.progress = p; this.progress = p;
this.emit('progress', p); this.emit('progress');
}; }
this.fileDownload = download; );
const ciphertext = await download.result; try {
this.fileDownload = null; const ciphertext = await this.downloadRequest.result;
this.downloadRequest = null;
this.msg = 'decryptingFile'; this.msg = 'decryptingFile';
this.state = 'decrypting'; this.state = 'decrypting';
this.emit('decrypting'); this.emit('decrypting');
const plaintext = await this.keychain.decryptFile(ciphertext); const plaintext = await this.keychain.decryptFile(ciphertext);
if (this.cancelled) { if (!noSave) {
throw new Error(0); await saveFile({
plaintext,
name: decodeURIComponent(this.fileInfo.name),
type: this.fileInfo.type
});
} }
this.msg = 'downloadFinish'; this.msg = 'downloadFinish';
this.state = 'complete'; this.state = 'complete';
return {
plaintext,
name: decodeURIComponent(this.fileInfo.name),
type: this.fileInfo.type
};
} catch (e) { } catch (e) {
this.state = 'invalid'; this.downloadRequest = null;
throw e; throw e;
} }
} }
} }
async function saveFile(file) {
return new Promise(function(resolve, reject) {
const dataView = new DataView(file.plaintext);
const blob = new Blob([dataView], { type: file.type });
if (navigator.msSaveBlob) {
navigator.msSaveBlob(blob, file.name);
return resolve();
} else if (/iPhone|fxios/i.test(navigator.userAgent)) {
// This method is much slower but createObjectURL
// is buggy on iOS
const reader = new FileReader();
reader.addEventListener('loadend', function() {
if (reader.error) {
return reject(reader.error);
}
if (reader.result) {
const a = document.createElement('a');
a.href = reader.result;
a.download = file.name;
document.body.appendChild(a);
a.click();
}
resolve();
});
reader.readAsDataURL(blob);
} else {
const downloadUrl = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = downloadUrl;
a.download = file.name;
document.body.appendChild(a);
a.click();
URL.revokeObjectURL(downloadUrl);
setTimeout(resolve, 100);
}
});
}

View File

@@ -9,17 +9,18 @@ export default class FileSender extends Nanobus {
constructor(file) { constructor(file) {
super('FileSender'); super('FileSender');
this.file = file; this.file = file;
this.uploadRequest = null;
this.msg = 'importingFile';
this.progress = [0, 1];
this.cancelled = false;
this.keychain = new Keychain(); this.keychain = new Keychain();
this.reset();
} }
get progressRatio() { get progressRatio() {
return this.progress[0] / this.progress[1]; return this.progress[0] / this.progress[1];
} }
get progressIndefinite() {
return ['fileSizeProgress', 'notifyUploadDone'].indexOf(this.msg) === -1;
}
get sizes() { get sizes() {
return { return {
partialSize: bytes(this.progress[0]), partialSize: bytes(this.progress[0]),
@@ -27,6 +28,13 @@ export default class FileSender extends Nanobus {
}; };
} }
reset() {
this.uploadRequest = null;
this.msg = 'importingFile';
this.progress = [0, 1];
this.cancelled = false;
}
cancel() { cancel() {
this.cancelled = true; this.cancelled = true;
if (this.uploadRequest) { if (this.uploadRequest) {
@@ -67,13 +75,13 @@ export default class FileSender extends Nanobus {
encrypted, encrypted,
metadata, metadata,
authKeyB64, authKeyB64,
this.keychain this.keychain,
p => {
this.progress = p;
this.emit('progress', p);
}
); );
this.msg = 'fileSizeProgress'; this.msg = 'fileSizeProgress';
this.uploadRequest.onprogress = p => {
this.progress = p;
this.emit('progress', p);
};
try { try {
const result = await this.uploadRequest.result; const result = await this.uploadRequest.result;
const time = Date.now() - start; const time = Date.now() - start;
@@ -86,7 +94,6 @@ export default class FileSender extends Nanobus {
url: `${result.url}#${secretKey}`, url: `${result.url}#${secretKey}`,
name: this.file.name, name: this.file.name,
size: this.file.size, size: this.file.size,
type: this.file.type, //TODO 'click' ?
time: time, time: time,
speed: this.file.size / (time / 1000), speed: this.file.size / (time / 1000),
createdAt: Date.now(), createdAt: Date.now(),

16
app/main.css Normal file
View File

@@ -0,0 +1,16 @@
@import './base.css';
@import './templates/header/header.css';
@import './templates/downloadButton/downloadButton.css';
@import './templates/progress/progress.css';
@import './templates/passwordInput/passwordInput.css';
@import './templates/downloadPassword/downloadPassword.css';
@import './templates/setPasswordSection/setPasswordSection.css';
@import './templates/footer/footer.css';
@import './templates/fxPromo/fxPromo.css';
@import './templates/selectbox/selectbox.css';
@import './templates/fileList/fileList.css';
@import './templates/file/file.css';
@import './templates/popup/popup.css';
@import './pages/welcome/welcome.css';
@import './pages/share/share.css';
@import './pages/unsupported/unsupported.css';

View File

@@ -16,16 +16,22 @@ export default class OwnedFile {
this.ownerToken = obj.ownerToken; this.ownerToken = obj.ownerToken;
this.dlimit = obj.dlimit || 1; this.dlimit = obj.dlimit || 1;
this.dtotal = obj.dtotal || 0; this.dtotal = obj.dtotal || 0;
this.keychain = new Keychain(obj.secretKey); this.keychain = new Keychain(obj.secretKey, obj.nonce);
this._hasPassword = !!obj.hasPassword; this._hasPassword = !!obj.hasPassword;
} }
async setPassword(password) { async setPassword(password) {
this.password = password; try {
this._hasPassword = true; this.password = password;
this.keychain.setPassword(password, this.url); this._hasPassword = true;
const result = await setPassword(this.id, this.ownerToken, this.keychain); this.keychain.setPassword(password, this.url);
return result; const result = await setPassword(this.id, this.ownerToken, this.keychain);
return result;
} catch (e) {
this.password = null;
this._hasPassword = false;
throw e;
}
} }
del() { del() {
@@ -53,6 +59,7 @@ export default class OwnedFile {
if (e.message === '404') { if (e.message === '404') {
this.dtotal = this.dlimit; this.dtotal = this.dlimit;
} }
// ignore other errors
} }
} }

View File

@@ -1,6 +1,5 @@
const html = require('choo/html'); const html = require('choo/html');
module.exports = function() { module.exports = function() {
const div = html`<div></div>`; return html`<div></div>`;
return div;
}; };

View File

@@ -1,34 +0,0 @@
const html = require('choo/html');
const progress = require('../templates/progress');
const { fadeOut } = require('../utils');
module.exports = function(state, emit) {
const div = html`
<div id="page-one">
<div id="download" class="fadeIn">
<div id="download-progress">
<div id="dl-title" class="title">
${state.translate('downloadFinish')}
</div>
<div class="description"></div>
${progress(1)}
<div class="upload">
<div class="progress-text"></div>
</div>
</div>
<a class="send-new"
data-state="completed"
href="/"
onclick=${sendNew}>${state.translate('sendYourFilesLink')}</a>
</div>
</div>
`;
async function sendNew(e) {
e.preventDefault();
await fadeOut('download');
emit('pushState', '/');
}
return div;
};

View File

@@ -0,0 +1,26 @@
const html = require('choo/html');
const progress = require('../../templates/progress');
const { fadeOut } = require('../../utils');
module.exports = function(state, emit) {
return html`
<div class="page effect--fadeIn">
<div class="title">
${state.translate('downloadFinish')}
</div>
<div class="description"></div>
${progress(1)}
<div class="progressSection">
<div class="progressSection__text"></div>
</div>
<a class="link link--action"
href="/"
onclick=${sendNew}>${state.translate('sendYourFilesLink')}</a>
</div>`;
async function sendNew(e) {
e.preventDefault();
await fadeOut('.page');
emit('pushState', '/');
}
};

View File

@@ -1,46 +0,0 @@
const html = require('choo/html');
const progress = require('../templates/progress');
const { bytes } = require('../utils');
module.exports = function(state, emit) {
const transfer = state.transfer;
const cancelBtn = html`
<button
id="cancel-upload"
title="${state.translate('deletePopupCancel')}"
onclick=${cancel}>
${state.translate('deletePopupCancel')}
</button>`;
const div = html`
<div id="page-one">
<div id="download">
<div id="download-progress" class="fadeIn">
<div id="dl-title" class="title">
${state.translate('downloadingPageProgress', {
filename: state.fileInfo.name,
size: bytes(state.fileInfo.size)
})}
</div>
<div class="description">
${state.translate('downloadingPageMessage')}
</div>
${progress(transfer.progressRatio)}
<div class="upload">
<div class="progress-text">
${state.translate(transfer.msg, transfer.sizes)}
</div>
${transfer.state === 'downloading' ? cancelBtn : null}
</div>
</div>
</div>
</div>
`;
function cancel() {
const btn = document.getElementById('cancel-upload');
btn.remove();
emit('cancel');
}
return div;
};

View File

@@ -0,0 +1,42 @@
const html = require('choo/html');
const progress = require('../../templates/progress');
const { bytes } = require('../../utils');
module.exports = function(state, emit) {
const transfer = state.transfer;
const cancelBtn = html`
<button
id="cancel"
class="btn btn--cancel"
title="${state.translate('deletePopupCancel')}"
onclick=${cancel}>
${state.translate('deletePopupCancel')}
</button>`;
return html`
<div class="page effect--fadeIn">
<div class="title">
${state.translate('downloadingPageProgress', {
filename: state.fileInfo.name,
size: bytes(state.fileInfo.size)
})}
</div>
<div class="description">
${state.translate('downloadingPageMessage')}
</div>
${progress(transfer.progressRatio, transfer.progressIndefinite)}
<div class="progressSection">
<div class="progressSection__text">
${state.translate(transfer.msg, transfer.sizes)}
</div>
${transfer.state === 'downloading' ? cancelBtn : null}
</div>
</div>
`;
function cancel() {
const btn = document.getElementById('cancel');
btn.remove();
emit('cancel');
}
};

View File

@@ -1,10 +1,10 @@
const html = require('choo/html'); const html = require('choo/html');
const assets = require('../../common/assets'); const assets = require('../../../common/assets');
module.exports = function(state) { module.exports = function(state) {
return html` return html`
<div id="upload-error"> <div class="page">
<div class="title">${state.translate('errorPageHeader')}</div> <div class="title">${state.translate('errorPageHeader')}</div>
<img id="upload-error-img" src="${assets.get('illustration_error.svg')}"/> <img src="${assets.get('illustration_error.svg')}"/>
</div>`; </div>`;
}; };

View File

@@ -1,34 +1,32 @@
const html = require('choo/html'); const html = require('choo/html');
const raw = require('choo/html/raw');
function replaceLinks(str, urls) {
let i = -1;
const s = str.replace(/<a>([^<]+)<\/a>/g, (m, v) => {
i++;
return `<a href="${urls[i]}">${v}</a>`;
});
return [`<div class="description">${s}</div>`];
}
module.exports = function(state) { module.exports = function(state) {
const div = html` return html`
<div id="page-one"> <div>
<div id="legal"> <div class="title">${state.translate('legalHeader')}</div>
<div class="title">${state.translate('legalHeader')}</div> ${raw(
${html( replaceLinks(state.translate('legalNoticeTestPilot'), [
replaceLinks(state.translate('legalNoticeTestPilot'), [ 'https://testpilot.firefox.com/terms',
'https://testpilot.firefox.com/terms', 'https://testpilot.firefox.com/privacy',
'https://testpilot.firefox.com/privacy', 'https://testpilot.firefox.com/experiments/send'
'https://testpilot.firefox.com/experiments/send' ])
]) )}
)} ${raw(
${html( replaceLinks(state.translate('legalNoticeMozilla'), [
replaceLinks(state.translate('legalNoticeMozilla'), [ 'https://www.mozilla.org/privacy/websites/',
'https://www.mozilla.org/privacy/websites/', 'https://www.mozilla.org/about/legal/terms/mozilla/'
'https://www.mozilla.org/about/legal/terms/mozilla/' ])
]) )}
)}
</div>
</div> </div>
`; `;
return div;
}; };
function replaceLinks(str, urls) {
let i = 0;
const s = str.replace(
/<a>([^<]+)<\/a>/g,
(m, v) => `<a href="${urls[i++]}">${v}</a>`
);
return `<div class="description">${s}</div>`;
}

View File

@@ -1,21 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
module.exports = function(state) {
const div = html`
<div id="page-one">
<div id="download">
<div class="title">${state.translate('expiredPageHeader')}</div>
<div class="share-window">
<img src="${assets.get('illustration_expired.svg')}" id="expired-img">
</div>
<div class="expired-description">
${state.translate('uploadPageExplainer')}
</div>
<a class="send-new" href="/" data-state="notfound">
${state.translate('sendYourFilesLink')}
</a>
</div>
</div>`;
return div;
};

View File

@@ -0,0 +1,16 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
module.exports = function(state) {
return html`
<div class="page">
<div class="title">${state.translate('expiredPageHeader')}</div>
<img src="${assets.get('illustration_expired.svg')}" id="expired-img">
<div class="description">
${state.translate('uploadPageExplainer')}
</div>
<a class="link link--action" href="/">
${state.translate('sendYourFilesLink')}
</a>
</div>`;
};

View File

@@ -1,44 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
const { bytes } = require('../utils');
module.exports = function(state, pageAction) {
const fileInfo = state.fileInfo;
const size = fileInfo.size
? state.translate('downloadFileSize', { size: bytes(fileInfo.size) })
: '';
const title = fileInfo.name
? state.translate('downloadFileName', { filename: fileInfo.name })
: state.translate('downloadFileTitle');
const info = html`
<div id="dl-file"
data-nonce="${fileInfo.nonce}"
data-requires-password="${fileInfo.requiresPassword}"></div>`;
if (!pageAction) {
return info;
}
const div = html`
<div id="page-one">
<div id="download">
<div id="download-page-one">
<div class="title">
<span>${title}</span>
<span id="dl-filesize">${' ' + size}</span>
</div>
<div class="description">${state.translate('downloadMessage')}</div>
<img
src="${assets.get('illustration_download.svg')}"
id="download-img"
title="${state.translate('downloadAltText')}"/>
${pageAction}
</div>
<a class="send-new" href="/">${state.translate('sendYourFilesLink')}</a>
</div>
${info}
</div>
`;
return div;
};

View File

@@ -0,0 +1,40 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
const { bytes } = require('../../utils');
module.exports = function(state, pageAction) {
const fileInfo = state.fileInfo;
const size = fileInfo.size
? state.translate('downloadFileSize', { size: bytes(fileInfo.size) })
: '';
const title = fileInfo.name
? state.translate('downloadFileName', { filename: fileInfo.name })
: state.translate('downloadFileTitle');
const info = html`
<div id="dl-file"
data-nonce="${fileInfo.nonce}"
data-requires-password="${fileInfo.requiresPassword}"></div>`;
if (!pageAction) {
return info;
}
return html`
<div class="page">
<div class="title">
<span>${title}</span>
<span>${' ' + size}</span>
</div>
<div class="description">${state.translate('downloadMessage')}</div>
<img
src="${assets.get('illustration_download.svg')}"
title="${state.translate('downloadAltText')}"/>
${pageAction}
<a class="link link--action" href="/">
${state.translate('sendYourFilesLink')}
</a>
${info}
</div>
`;
};

View File

@@ -1,126 +0,0 @@
/* global EXPIRE_SECONDS */
const html = require('choo/html');
const assets = require('../../common/assets');
const notFound = require('./notFound');
const uploadPasswordSet = require('../templates/uploadPasswordSet');
const uploadPasswordUnset = require('../templates/uploadPasswordUnset');
const selectbox = require('../templates/selectbox');
const { allowedCopy, delay, fadeOut } = require('../utils');
function expireInfo(file, translate, emit) {
const hours = Math.floor(EXPIRE_SECONDS / 60 / 60);
const el = html([
`<div>${translate('expireInfo', {
downloadCount: '<select></select>',
timespan: translate('timespanHours', { num: hours })
})}</div>`
]);
const select = el.querySelector('select');
const options = [1, 2, 3, 4, 5, 20].filter(i => i > (file.dtotal || 0));
const t = num => translate('downloadCount', { num });
const changed = value => emit('changeLimit', { file, value });
select.parentNode.replaceChild(
selectbox(file.dlimit || 1, options, t, changed),
select
);
return el;
}
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
if (!file) {
return notFound(state, emit);
}
const passwordSection = file.hasPassword
? uploadPasswordSet(state, emit)
: uploadPasswordUnset(state, emit);
const div = html`
<div id="share-link" class="fadeIn">
<div class="title">${expireInfo(file, state.translate, emit)}</div>
<div id="share-window">
<div id="copy-text">
${state.translate('copyUrlFormLabelWithName', { filename: file.name })}
</div>
<div id="copy">
<input id="link" type="url" value="${file.url}" readonly="true"/>
<button id="copy-btn"
class="btn"
title="${state.translate('copyUrlFormButton')}"
onclick=${copyLink}>${state.translate('copyUrlFormButton')}</button>
</div>
${passwordSection}
<button id="delete-file"
class="btn"
title="${state.translate('deleteFileButton')}"
onclick=${showPopup}>${state.translate('deleteFileButton')}
</button>
<div id="deletePopup" class="popup">
<div class="popuptext" onblur=${cancel} tabindex="-1">
<div class="popup-message">${state.translate('deletePopupText')}
</div>
<div class="popup-action">
<span class="popup-no" onclick=${cancel}>
${state.translate('deletePopupCancel')}
</span>
<span class="popup-yes" onclick=${deleteFile}>
${state.translate('deletePopupYes')}
</span>
</div>
</div>
</div>
<a class="send-new"
data-state="completed"
href="/"
onclick=${sendNew}>${state.translate('sendAnotherFileLink')}</a>
</div>
</div>
`;
function showPopup() {
const popupText = document.querySelector('.popuptext');
popupText.classList.add('show');
popupText.focus();
}
function cancel(e) {
e.stopPropagation();
const popupText = document.querySelector('.popuptext');
popupText.classList.remove('show');
}
async function sendNew(e) {
e.preventDefault();
await fadeOut('share-link');
emit('pushState', '/');
}
async function copyLink() {
if (allowedCopy()) {
emit('copy', { url: file.url, location: 'success-screen' });
const input = document.getElementById('link');
input.disabled = true;
const copyBtn = document.getElementById('copy-btn');
copyBtn.disabled = true;
copyBtn.classList.add('success');
copyBtn.replaceChild(
html`<img src="${assets.get('check-16.svg')}" class="icon-check">`,
copyBtn.firstChild
);
await delay(2000);
input.disabled = false;
if (!copyBtn.parentNode.classList.contains('wait-password')) {
copyBtn.disabled = false;
}
copyBtn.classList.remove('success');
copyBtn.textContent = state.translate('copyUrlFormButton');
}
}
async function deleteFile() {
emit('delete', { file, location: 'success-screen' });
await fadeOut('share-link');
emit('pushState', '/');
}
return div;
};

115
app/pages/share/index.js Normal file
View File

@@ -0,0 +1,115 @@
/* global EXPIRE_SECONDS */
const html = require('choo/html');
const raw = require('choo/html/raw');
const assets = require('../../../common/assets');
const notFound = require('../notFound');
const setPasswordSection = require('../../templates/setPasswordSection');
const selectbox = require('../../templates/selectbox');
const deletePopup = require('../../templates/popup');
const { allowedCopy, delay, fadeOut } = require('../../utils');
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
if (!file) {
return notFound(state, emit);
}
return html`
<div id="shareWrapper" class="effect--fadeIn">
<div class="title">${expireInfo(file, state.translate, emit)}</div>
<div class="sharePage">
<div class="sharePage__copyText">
${state.translate('copyUrlFormLabelWithName', { filename: file.name })}
</div>
<div class="copySection">
<input
id="fileUrl"
class="copySection__url"
type="url"
value="${file.url}"
readonly="true"/>
<button id="copyBtn"
class="inputBtn inputBtn--copy"
title="${state.translate('copyUrlFormButton')}"
onclick=${copyLink}>${state.translate('copyUrlFormButton')}</button>
</div>
${setPasswordSection(state, emit)}
<button
class="btn btn--delete"
title="${state.translate('deleteFileButton')}"
onclick=${showPopup}>${state.translate('deleteFileButton')}
</button>
<div class="sharePage__deletePopup">
${deletePopup(
state.translate('deletePopupText'),
state.translate('deletePopupYes'),
state.translate('deletePopupCancel'),
deleteFile
)}
</div>
<a class="link link--action"
href="/"
onclick=${sendNew}>${state.translate('sendAnotherFileLink')}</a>
</div>
</div>
`;
function showPopup() {
const popup = document.querySelector('.popup');
popup.classList.add('popup--show');
popup.focus();
}
async function sendNew(e) {
e.preventDefault();
await fadeOut('#shareWrapper');
emit('pushState', '/');
}
async function copyLink() {
if (allowedCopy()) {
emit('copy', { url: file.url, location: 'success-screen' });
const input = document.getElementById('fileUrl');
input.disabled = true;
input.classList.add('input--copied');
const copyBtn = document.getElementById('copyBtn');
copyBtn.disabled = true;
copyBtn.classList.add('inputBtn--copied');
copyBtn.replaceChild(
html`<img src="${assets.get('check-16.svg')}" class="cursor--pointer">`,
copyBtn.firstChild
);
await delay(2000);
input.disabled = false;
input.classList.remove('input--copied');
copyBtn.disabled = false;
copyBtn.classList.remove('inputBtn--copied');
copyBtn.textContent = state.translate('copyUrlFormButton');
}
}
async function deleteFile() {
emit('delete', { file, location: 'success-screen' });
await fadeOut('#shareWrapper');
emit('pushState', '/');
}
};
function expireInfo(file, translate, emit) {
const hours = Math.floor(EXPIRE_SECONDS / 60 / 60);
const el = html`<div>${raw(
translate('expireInfo', {
downloadCount: '<select></select>',
timespan: translate('timespanHours', { num: hours })
})
)}</div>`;
const select = el.querySelector('select');
const options = [1, 2, 3, 4, 5, 20].filter(i => i > (file.dtotal || 0));
const t = num => translate('downloadCount', { num });
const changed = value => emit('changeLimit', { file, value });
select.parentNode.replaceChild(
selectbox(file.dlimit || 1, options, t, changed),
select
);
return el;
}

112
app/pages/share/share.css Normal file
View File

@@ -0,0 +1,112 @@
.sharePage {
margin: 0 auto;
display: flex;
justify-content: center;
flex-direction: column;
width: 100%;
max-width: 640px;
}
.sharePage__copyText {
align-self: flex-start;
margin-top: 60px;
margin-bottom: 10px;
color: var(--textColor);
max-width: 614px;
word-wrap: break-word;
}
.sharePage__deletePopup {
position: relative;
align-self: center;
bottom: 50px;
}
.copySection {
display: flex;
flex-wrap: nowrap;
width: 100%;
}
.copySection__url {
flex: 1;
height: 56px;
border: 1px solid var(--primaryControlBGColor);
border-radius: 6px 0 0 6px;
font-size: 20px;
color: var(--inputTextColor);
font-family: 'SF Pro Text', sans-serif;
letter-spacing: 0;
line-height: 23px;
font-weight: 300;
padding-left: 10px;
}
.copySection__url:disabled {
border: 1px solid var(--successControlBGColor);
background: var(--successControlFGColor);
}
.inputBtn--copy {
flex: 0 1 165px;
padding-bottom: 4px;
}
.input--copied {
border-color: var(--successControlBGColor);
}
.inputBtn--copied,
.inputBtn--copied:hover {
background: var(--successControlBGColor);
border: 1px solid var(--successControlBGColor);
color: var(--successControlFGColor);
}
.btn--delete {
align-self: center;
width: 176px;
height: 44px;
background: #fff;
border-color: rgba(12, 12, 13, 0.3);
margin-top: 50px;
margin-bottom: 12px;
color: #313131;
}
.btn--delete:hover {
background: #efeff1;
}
@media (max-device-width: 768px), (max-width: 768px) {
.copySection {
width: 100%;
}
.copySection__url {
font-size: 18px;
}
}
@media (max-device-width: 520px), (max-width: 520px) {
.copySection {
width: 100%;
flex-direction: column;
padding-left: 0;
}
.copySection__url {
font-size: 22px;
padding: 15px 10px;
border-radius: 6px 6px 0 0;
}
.sharePage__copyText {
text-align: center;
}
.inputBtn--copy {
border-radius: 0 0 6px 6px;
flex: 0 1 65px;
}
}

View File

@@ -1,52 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
module.exports = function(state) {
const msg =
state.params.reason === 'outdated'
? html`
<div id="unsupported-browser">
<div class="title">${state.translate('notSupportedHeader')}</div>
<div class="description">
${state.translate('notSupportedOutdatedDetail')}
</div>
<a
id="update-firefox"
href="https://support.mozilla.org/kb/update-firefox-latest-version">
<img
src="${assets.get('firefox_logo-only.svg')}"
class="firefox-logo"
alt="Firefox"/>
<div class="unsupported-button-text">
${state.translate('updateFirefox')}
</div>
</a>
<div class="unsupported-description">
${state.translate('uploadPageExplainer')}
</div>
</div>`
: html`
<div id="unsupported-browser">
<div class="title">${state.translate('notSupportedHeader')}</div>
<div class="description">${state.translate('notSupportedDetail')}</div>
<div class="description">
<a href="https://github.com/mozilla/send/blob/master/docs/faq.md#why-is-my-browser-not-supported">
${state.translate('notSupportedLink')}
</a>
</div>
<a id="dl-firefox" href="https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com">
<img
src="${assets.get('firefox_logo-only.svg')}"
class="firefox-logo"
alt="Firefox"/>
<div class="unsupported-button-text">Firefox<br>
<span>${state.translate('downloadFirefoxButtonSub')}</span>
</div>
</a>
<div class="unsupported-description">
${state.translate('uploadPageExplainer')}
</div>
</div>`;
const div = html`<div id="page-one">${msg}</div>`;
return div;
};

View File

@@ -0,0 +1,67 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
module.exports = function(state) {
let strings = {};
let why = '';
let url = '';
let buttonAction = '';
if (state.params.reason !== 'outdated') {
strings = unsupportedStrings(state);
why = html`
<div class="description">
<a href="https://github.com/mozilla/send/blob/master/docs/faq.md#why-is-my-browser-not-supported">
${state.translate('notSupportedLink')}
</a>
</div>`;
url =
'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com';
buttonAction = html`
<div class="firefoxDownload__action">
Firefox<br><span class="firefoxDownload__text">${strings.button}</span>
</div>`;
} else {
strings = outdatedStrings(state);
url = 'https://support.mozilla.org/kb/update-firefox-latest-version';
buttonAction = html`
<div class="firefoxDownload__action">
${strings.button}
</div>`;
}
return html`
<div class="unsupportedPage">
<div class="title">${strings.title}</div>
<div class="description">
${strings.description}
</div>
${why}
<a href="${url}" class="firefoxDownload">
<img
src="${assets.get('firefox_logo-only.svg')}"
class="firefoxDownload__logo"
alt="Firefox"/>
${buttonAction}
</a>
<div class="unsupportedPage__info">
${strings.explainer}
</div>
</div>`;
};
function outdatedStrings(state) {
return {
title: state.translate('notSupportedHeader'),
description: state.translate('notSupportedOutdatedDetail'),
button: state.translate('updateFirefox'),
explainer: state.translate('uploadPageExplainer')
};
}
function unsupportedStrings(state) {
return {
title: state.translate('notSupportedHeader'),
description: state.translate('notSupportedDetail'),
button: state.translate('downloadFirefoxButtonSub'),
explainer: state.translate('uploadPageExplainer')
};
}

View File

@@ -0,0 +1,49 @@
.unsupportedPage {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.unsupportedPage__info {
font-size: 13px;
line-height: 23px;
text-align: center;
color: var(--lightTextColor);
margin: 0 auto 23px;
}
.firefoxDownload {
margin-bottom: 181px;
height: 80px;
background: #98e02b;
border-radius: 3px;
cursor: pointer;
border: 0;
box-shadow: 0 5px 3px rgb(234, 234, 234);
font-family: 'Fira Sans', 'segoe ui', sans-serif;
font-weight: 500;
color: var(--primaryControlFGColor);
font-size: 26px;
display: flex;
justify-content: center;
align-items: center;
line-height: 1;
padding: 0 25px;
}
.firefoxDownload__logo {
width: 70px;
}
.firefoxDownload__action {
text-align: left;
margin-left: 20.4px;
}
.firefoxDownload__text {
font-family: 'Fira Sans', 'segoe ui', sans-serif;
font-weight: 300;
font-size: 18px;
letter-spacing: -0.69px;
}

View File

@@ -1,41 +0,0 @@
const html = require('choo/html');
const progress = require('../templates/progress');
const { bytes } = require('../utils');
module.exports = function(state, emit) {
const transfer = state.transfer;
const div = html`
<div id="download">
<div id="upload-progress" class="fadeIn">
<div class="title" id="upload-filename">
${state.translate('uploadingPageProgress', {
filename: transfer.file.name,
size: bytes(transfer.file.size)
})}
</div>
<div class="description"></div>
${progress(transfer.progressRatio)}
<div class="upload">
<div class="progress-text">
${state.translate(transfer.msg, transfer.sizes)}
</div>
<button
id="cancel-upload"
title="${state.translate('uploadingPageCancel')}"
onclick=${cancel}>
${state.translate('uploadingPageCancel')}
</button>
</div>
</div>
</div>
`;
function cancel() {
const btn = document.getElementById('cancel-upload');
btn.disabled = true;
btn.textContent = state.translate('uploadCancelNotification');
emit('cancel');
}
return div;
};

39
app/pages/upload/index.js Normal file
View File

@@ -0,0 +1,39 @@
const html = require('choo/html');
const progress = require('../../templates/progress');
const { bytes } = require('../../utils');
module.exports = function(state, emit) {
const transfer = state.transfer;
return html`
<div class="page effect--fadeIn">
<div class="title">
${state.translate('uploadingPageProgress', {
filename: transfer.file.name,
size: bytes(transfer.file.size)
})}
</div>
<div class="description"></div>
${progress(transfer.progressRatio, transfer.progressIndefinite)}
<div class="progressSection">
<div class="progressSection__text">
${state.translate(transfer.msg, transfer.sizes)}
</div>
<button
id="cancel-upload"
class="btn btn--cancel"
title="${state.translate('uploadingPageCancel')}"
onclick=${cancel}>
${state.translate('uploadingPageCancel')}
</button>
</div>
</div>
`;
function cancel() {
const btn = document.getElementById('cancel-upload');
btn.disabled = true;
btn.textContent = state.translate('uploadCancelNotification');
emit('cancel');
}
};

View File

@@ -1,12 +1,14 @@
/* global MAXFILESIZE */ /* global MAXFILESIZE */
const html = require('choo/html'); const html = require('choo/html');
const assets = require('../../common/assets'); const assets = require('../../../common/assets');
const fileList = require('../templates/fileList'); const fileList = require('../../templates/fileList');
const { bytes, fadeOut } = require('../utils'); const { bytes, fadeOut } = require('../../utils');
module.exports = function(state, emit) { module.exports = function(state, emit) {
const div = html` // the page flickers if both the server and browser set 'effect--fadeIn'
<div id="page-one" class="fadeIn"> const fade = state.layout ? '' : 'effect--fadeIn';
return html`
<div id="page-one" class="${fade}">
<div class="title">${state.translate('uploadPageHeader')}</div> <div class="title">${state.translate('uploadPageHeader')}</div>
<div class="description"> <div class="description">
<div>${state.translate('uploadPageExplainer')}</div> <div>${state.translate('uploadPageExplainer')}</div>
@@ -16,27 +18,27 @@ module.exports = function(state, emit) {
${state.translate('uploadPageLearnMore')} ${state.translate('uploadPageLearnMore')}
</a> </a>
</div> </div>
<div class="upload-window" <div class="uploadArea"
ondragover=${dragover} ondragover=${dragover}
ondragleave=${dragleave}> ondragleave=${dragleave}>
<div id="upload-img"> <img
<img src="${assets.get('upload.svg')}"
src="${assets.get('upload.svg')}" title="${state.translate('uploadSvgAlt')}"/>
title="${state.translate('uploadSvgAlt')}"/> <div class="uploadArea__msg">
${state.translate('uploadPageDropMessage')}
</div> </div>
<div id="upload-text">${state.translate('uploadPageDropMessage')}</div> <span class="uploadArea__sizeMsg">
<span id="file-size-msg"> ${state.translate('uploadPageSizeMessage')}
<em>${state.translate('uploadPageSizeMessage')}</em>
</span> </span>
<input id="file-upload" <input id="file-upload"
class="inputFile"
type="file" type="file"
name="fileUploaded" name="fileUploaded"
onfocus=${onfocus} onfocus=${onfocus}
onblur=${onblur} onblur=${onblur}
onchange=${upload} /> onchange=${upload} />
<label for="file-upload" <label for="file-upload"
id="browse" class="btn btn--file"
class="btn browse"
title="${state.translate('uploadPageBrowseButton1')}"> title="${state.translate('uploadPageBrowseButton1')}">
${state.translate('uploadPageBrowseButton1')} ${state.translate('uploadPageBrowseButton1')}
</label> </label>
@@ -46,21 +48,21 @@ module.exports = function(state, emit) {
`; `;
function dragover(event) { function dragover(event) {
const div = document.querySelector('.upload-window'); const div = document.querySelector('.uploadArea');
div.classList.add('ondrag'); div.classList.add('uploadArea--dragging');
} }
function dragleave(event) { function dragleave(event) {
const div = document.querySelector('.upload-window'); const div = document.querySelector('.uploadArea');
div.classList.remove('ondrag'); div.classList.remove('uploadArea--dragging');
} }
function onfocus(event) { function onfocus(event) {
event.target.classList.add('has-focus'); event.target.classList.add('inputFile--focused');
} }
function onblur(event) { function onblur(event) {
event.target.classList.remove('has-focus'); event.target.classList.remove('inputFile--focused');
} }
async function upload(event) { async function upload(event) {
@@ -75,8 +77,7 @@ module.exports = function(state, emit) {
return; return;
} }
await fadeOut('page-one'); await fadeOut('#page-one');
emit('upload', { file, type: 'click' }); emit('upload', { file, type: 'click' });
} }
return div;
}; };

View File

@@ -0,0 +1,65 @@
.uploadArea {
border: 3px dashed rgba(0, 148, 251, 0.5);
margin: 0 auto 10px;
height: 255px;
border-radius: 4px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
transition: transform 150ms;
padding: 15px;
}
.uploadArea__msg {
font-size: 22px;
color: var(--lightTextColor);
margin: 20px 0 10px;
font-family: 'SF Pro Text', sans-serif;
}
.uploadArea__sizeMsg {
font-style: italic;
font-size: 12px;
line-height: 16px;
color: var(--lightTextColor);
margin-bottom: 22px;
}
.uploadArea--dragging {
border: 5px dashed rgba(0, 148, 251, 0.5);
height: 251px;
transform: scale(1.04);
border-radius: 4.2px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
}
.uploadArea--dragging * {
pointer-events: none;
}
.btn--file {
font-size: 20px;
min-width: 240px;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
padding: 0 10px;
}
.inputFile {
opacity: 0;
position: absolute;
}
.inputFile--focused + .btn--file {
background-color: var(--primaryControlHoverColor);
outline: 1px dotted #000;
outline: -webkit-focus-ring-color auto 5px;
}

View File

@@ -1,10 +1,12 @@
const choo = require('choo'); const choo = require('choo');
const html = require('choo/html'); const html = require('choo/html');
const nanotiming = require('nanotiming');
const download = require('./download'); const download = require('./download');
const header = require('../templates/header'); const header = require('../templates/header');
const footer = require('../templates/footer'); const footer = require('../templates/footer');
const fxPromo = require('../templates/fxPromo'); const fxPromo = require('../templates/fxPromo');
nanotiming.disabled = true;
const app = choo(); const app = choo();
function banner(state, emit) { function banner(state, emit) {
@@ -18,18 +20,20 @@ function body(template) {
const b = html`<body> const b = html`<body>
${banner(state, emit)} ${banner(state, emit)}
${header(state)} ${header(state)}
<div class="all"> <main class="main">
<noscript> <noscript>
<h2>${state.translate('javascriptRequired')}</h2> <div class="noscript">
<p> <h2>${state.translate('javascriptRequired')}</h2>
<a href="https://github.com/mozilla/send/blob/master/docs/faq.md#why-does-firefox-send-require-javascript"> <p>
${state.translate('whyJavascript')} <a class="link" href="https://github.com/mozilla/send/blob/master/docs/faq.md#why-does-firefox-send-require-javascript">
</a> ${state.translate('whyJavascript')}
</p> </a>
<p>${state.translate('enableJavascript')}</p> </p>
<p>${state.translate('enableJavascript')}</p>
</div>
</noscript> </noscript>
${template(state, emit)} ${template(state, emit)}
</div> </main>
${footer(state)} ${footer(state)}
</body>`; </body>`;
if (state.layout) { if (state.layout) {

View File

@@ -0,0 +1,6 @@
.btn--download {
width: 180px;
height: 44px;
margin-top: 20px;
margin-bottom: 30px;
}

View File

@@ -1,16 +1,13 @@
const html = require('choo/html'); const html = require('choo/html');
module.exports = function(state, emit) { module.exports = function(state, emit) {
return html`
<button class="btn btn--download"
onclick=${download}>${state.translate('downloadButtonLabel')}
</button>`;
function download(event) { function download(event) {
event.preventDefault(); event.preventDefault();
emit('download', state.fileInfo); emit('download', state.fileInfo);
} }
return html`
<div>
<button id="download-btn"
class="btn"
onclick=${download}>${state.translate('downloadButtonLabel')}
</button>
</div>`;
}; };

View File

@@ -1,59 +0,0 @@
const html = require('choo/html');
module.exports = function(state, emit) {
const fileInfo = state.fileInfo;
const label =
fileInfo.password === null
? html`
<label class="red" for="unlock-input">
${state.translate('passwordTryAgain')}
</label>`
: html`
<label for="unlock-input">
${state.translate('unlockInputLabel')}
</label>`;
const div = html`
<div class="enterPassword">
${label}
<form id="unlock" onsubmit=${checkPassword} data-no-csrf>
<input id="unlock-input"
class="unlock-input input-no-btn"
maxlength="64"
autocomplete="off"
placeholder="${state.translate('unlockInputPlaceholder')}"
oninput=${inputChanged}
type="password"
autofocus />
<input type="submit"
id="unlock-btn"
class="btn btn-hidden"
value="${state.translate('unlockButtonLabel')}"/>
</form>
</div>`;
function inputChanged() {
const input = document.getElementById('unlock-input');
const btn = document.getElementById('unlock-btn');
if (input.value.length > 0) {
btn.classList.remove('btn-hidden');
input.classList.remove('input-no-btn');
} else {
btn.classList.add('btn-hidden');
input.classList.add('input-no-btn');
}
}
function checkPassword(event) {
event.preventDefault();
const password = document.getElementById('unlock-input').value;
if (password.length > 0) {
document.getElementById('unlock-btn').disabled = true;
state.fileInfo.url = window.location.href;
state.fileInfo.password = password;
emit('getMetadata');
}
return false;
}
return div;
};

View File

@@ -0,0 +1,22 @@
.passwordSection {
text-align: left;
padding: 40px 0;
width: 80%;
}
.passwordForm {
display: flex;
flex-wrap: nowrap;
width: 100%;
padding: 10px 0;
}
@media (max-device-width: 520px), (max-width: 520px) {
.passwordSection {
width: 100%;
}
.passwordForm {
flex-direction: column;
}
}

View File

@@ -0,0 +1,66 @@
const html = require('choo/html');
module.exports = function(state, emit) {
const fileInfo = state.fileInfo;
const invalid = fileInfo.password === null;
const label = invalid
? html`
<label class="error" for="password-input">
${state.translate('passwordTryAgain')}
</label>`
: html`
<label for="password-input">
${state.translate('unlockInputLabel')}
</label>`;
const inputClass = invalid
? 'input input--noBtn input--error'
: 'input input--noBtn';
const div = html`
<div class="passwordSection">
${label}
<form class="passwordForm" onsubmit=${checkPassword} data-no-csrf>
<input id="password-input"
class="${inputClass}"
maxlength="64"
autocomplete="off"
placeholder="${state.translate('unlockInputPlaceholder')}"
oninput=${inputChanged}
type="password" />
<input type="submit"
id="password-btn"
class="inputBtn inputBtn--hidden"
value="${state.translate('unlockButtonLabel')}"/>
</form>
</div>`;
if (!(div instanceof String)) {
setTimeout(() => document.getElementById('password-input').focus());
}
function inputChanged() {
const input = document.getElementById('password-input');
const btn = document.getElementById('password-btn');
input.classList.remove('input--error');
if (input.value.length > 0) {
btn.classList.remove('inputBtn--hidden');
input.classList.remove('input--noBtn');
} else {
btn.classList.add('inputBtn--hidden');
input.classList.add('input--noBtn');
}
}
function checkPassword(event) {
event.preventDefault();
const password = document.getElementById('password-input').value;
if (password.length > 0) {
document.getElementById('password-btn').disabled = true;
state.fileInfo.url = window.location.href;
state.fileInfo.password = password;
emit('getMetadata');
}
return false;
}
return div;
};

View File

@@ -0,0 +1,26 @@
.fileData {
font-size: 15px;
vertical-align: top;
color: var(--lightTextColor);
padding: 17px 19px 0;
line-height: 23px;
position: relative;
}
.fileData--overflow {
text-overflow: ellipsis;
max-width: 0;
overflow: hidden;
white-space: nowrap;
}
.fileData--center {
text-align: center;
}
@media (max-device-width: 520px), (max-width: 520px) {
.fileData {
font-size: 13px;
padding: 17px 5px 0;
}
}

View File

@@ -1,22 +1,7 @@
const html = require('choo/html'); const html = require('choo/html');
const assets = require('../../common/assets'); const assets = require('../../../common/assets');
const number = require('../../utils').number;
function timeLeft(milliseconds, state) { const deletePopup = require('../popup');
const minutes = Math.floor(milliseconds / 1000 / 60);
const hours = Math.floor(minutes / 60);
if (hours >= 1) {
return state.translate('expiresHoursMinutes', {
hours,
minutes: minutes % 60
});
} else if (hours === 0) {
if (minutes === 0) {
return state.translate('expiresMinutes', { minutes: '< 1' });
}
return state.translate('expiresMinutes', { minutes });
}
return null;
}
module.exports = function(file, state, emit) { module.exports = function(file, state, emit) {
const ttl = file.expiresAt - Date.now(); const ttl = file.expiresAt - Date.now();
@@ -24,42 +9,37 @@ module.exports = function(file, state, emit) {
timeLeft(ttl, state) || state.translate('linkExpiredAlt'); timeLeft(ttl, state) || state.translate('linkExpiredAlt');
const downloadLimit = file.dlimit || 1; const downloadLimit = file.dlimit || 1;
const totalDownloads = file.dtotal || 0; const totalDownloads = file.dtotal || 0;
const row = html` return html`
<tr id="${file.id}"> <tr id="${file.id}">
<td class="overflow-col" title="${file.name}"> <td class="fileData fileData--overflow" title="${file.name}">
<a class="link" href="/share/${file.id}">${file.name}</a> <a class="link" href="/share/${file.id}">${file.name}</a>
</td> </td>
<td class="center-col"> <td class="fileData fileData--center">
<img <img
onclick=${copyClick} onclick=${copyClick}
src="${assets.get('copy-16.svg')}" src="${assets.get('copy-16.svg')}"
class="icon-copy" class="cursor--pointer"
title="${state.translate('copyUrlHover')}"> title="${state.translate('copyUrlHover')}">
<span class="text-copied" hidden="true"> <span hidden="true">
${state.translate('copiedUrl')} ${state.translate('copiedUrl')}
</span> </span>
</td> </td>
<td>${remainingTime}</td> <td class="fileData fileData--overflow">${remainingTime}</td>
<td class="center-col">${totalDownloads} / ${downloadLimit}</td> <td class="fileData fileData--center">${number(totalDownloads)} / ${number(
<td class="center-col"> downloadLimit
)}</td>
<td class="fileData fileData--center">
<img <img
onclick=${showPopup} onclick=${showPopup}
src="${assets.get('close-16.svg')}" src="${assets.get('close-16.svg')}"
class="icon-delete" class="cursor--pointer"
title="${state.translate('deleteButtonHover')}"> title="${state.translate('deleteButtonHover')}">
<div class="popup"> ${deletePopup(
<div class="popuptext" onblur=${cancel} tabindex="-1"> state.translate('deletePopupText'),
<div class="popup-message">${state.translate('deletePopupText')}</div> state.translate('deletePopupYes'),
<div class="popup-action"> state.translate('deletePopupCancel'),
<span class="popup-no" onclick=${cancel}> deleteFile
${state.translate('deletePopupCancel')} )}
</span>
<span class="popup-yes" onclick=${deleteFile}>
${state.translate('deletePopupYes')}
</span>
</div>
</div>
</div>
</td> </td>
</tr> </tr>
`; `;
@@ -78,22 +58,30 @@ module.exports = function(file, state, emit) {
function showPopup() { function showPopup() {
const tr = document.getElementById(file.id); const tr = document.getElementById(file.id);
const popup = tr.querySelector('.popuptext'); const popup = tr.querySelector('.popup');
popup.classList.add('show'); popup.classList.add('popup--show');
popup.focus(); popup.focus();
} }
function cancel(e) {
e.stopPropagation();
const tr = document.getElementById(file.id);
const popup = tr.querySelector('.popuptext');
popup.classList.remove('show');
}
function deleteFile() { function deleteFile() {
emit('delete', { file, location: 'upload-list' }); emit('delete', { file, location: 'upload-list' });
emit('render'); emit('render');
} }
return row;
}; };
function timeLeft(milliseconds, state) {
const minutes = Math.floor(milliseconds / 1000 / 60);
const hours = Math.floor(minutes / 60);
if (hours >= 1) {
return state.translate('expiresHoursMinutes', {
hours,
minutes: minutes % 60
});
} else if (hours === 0) {
if (minutes === 0) {
return state.translate('expiresMinutes', { minutes: '< 1' });
}
return state.translate('expiresMinutes', { minutes });
}
return null;
}

View File

@@ -0,0 +1,52 @@
.fileList {
margin: 45.3px auto;
table-layout: fixed;
border-collapse: collapse;
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
}
.fileList__header {
font-size: 16px;
color: var(--lightTextColor);
font-weight: lighter;
text-align: left;
background: rgba(0, 148, 251, 0.05);
height: 40px;
border-top: 1px solid rgba(0, 148, 251, 0.1);
padding: 0 19px;
white-space: nowrap;
}
.fileList__body {
word-wrap: break-word;
word-break: break-all;
}
.fileList__nameCol {
width: 35%;
}
.fileList__copyCol {
text-align: center;
width: 25%;
}
.fileList__expireCol {
width: 25%;
}
.fileList__dlCol {
width: 8%;
}
.fileList__delCol {
text-align: center;
width: 7%;
}
@media (max-device-width: 520px), (max-width: 520px) {
.fileList__header {
font-size: 14px;
padding: 0 5px;
}
}

View File

@@ -1,37 +1,33 @@
const html = require('choo/html'); const html = require('choo/html');
const file = require('./file'); const file = require('../file');
module.exports = function(state, emit) { module.exports = function(state, emit) {
let table = '';
if (state.storage.files.length) { if (state.storage.files.length) {
table = html` return html`
<table id="uploaded-files"> <table class="fileList">
<thead> <thead>
<tr> <tr>
<th id="uploaded-file">${state.translate('uploadedFile')}</th> <th class="fileList__header fileList__nameCol">
<th id="copy-file-list" class="center-col"> ${state.translate('uploadedFile')}
</th>
<th class="fileList__header fileList__copyCol">
${state.translate('copyFileList')} ${state.translate('copyFileList')}
</th> </th>
<th id="expiry-time-file-list" > <th class="fileList__header fileList__expireCol" >
${state.translate('timeFileList')} ${state.translate('timeFileList')}
</th> </th>
<th id="expiry-downloads-file-list" > <th class="fileList__header fileList__dlCol" >
${state.translate('downloadsFileList')} ${state.translate('downloadsFileList')}
</th> </th>
<th id="delete-file-list" class="center-col"> <th class="fileList__header fileList__delCol">
${state.translate('deleteFileList')} ${state.translate('deleteFileList')}
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody class="fileList__body">
${state.storage.files.map(f => file(f, state, emit))} ${state.storage.files.map(f => file(f, state, emit))}
</tbody> </tbody>
</table> </table>
`; `;
} }
return html`
<div id="file-list">
${table}
</div>
`;
}; };

View File

@@ -1,43 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
module.exports = function(state) {
return html`<div class="footer">
<div class="legal-links">
<a href="https://www.mozilla.org" role="presentation">
<img
class="mozilla-logo"
src="${assets.get('mozilla-logo.svg')}"
alt="mozilla"/>
</a>
<a href="https://www.mozilla.org/about/legal">
${state.translate('footerLinkLegal')}
</a>
<a href="https://testpilot.firefox.com/about">
${state.translate('footerLinkAbout')}
</a>
<a href="/legal">${state.translate('footerLinkPrivacy')}</a>
<a href="/legal">${state.translate('footerLinkTerms')}</a>
<a href="https://www.mozilla.org/privacy/websites/#cookies">
${state.translate('footerLinkCookies')}
</a>
<a href="https://www.mozilla.org/about/legal/report-infringement/">
${state.translate('reportIPInfringement')}
</a>
</div>
<div class="social-links">
<a href="https://github.com/mozilla/send" role="presentation">
<img
class="github"
src="${assets.get('github-icon.svg')}"
alt="github"/>
</a>
<a href="https://twitter.com/FxTestPilot" role="presentation">
<img
class="twitter"
src="${assets.get('twitter-icon.svg')}"
alt="twitter"/>
</a>
</div>
</div>`;
};

View File

@@ -0,0 +1,93 @@
.footer {
right: 0;
bottom: 0;
left: 0;
font-size: 13px;
display: flex;
align-items: flex-end;
flex-direction: row;
justify-content: space-between;
padding: 50px 31px 41px;
width: 100%;
box-sizing: border-box;
}
.legalSection {
max-width: 81vw;
display: flex;
align-items: center;
flex-direction: row;
}
.legalSection__link {
color: var(--lightTextColor);
opacity: 0.9;
white-space: nowrap;
margin-right: 2vw;
}
.legalSection__link:hover {
opacity: 1;
}
.legalSection__link:visited {
color: var(--lightTextColor);
}
.legalSection__mozLogo {
width: 112px;
height: 32px;
margin-bottom: -5px;
}
.socialSection {
display: flex;
justify-content: space-between;
width: 94px;
}
.socialSection__link {
opacity: 0.9;
}
.socialSection__link:hover {
opacity: 1;
}
.socialSection__icon {
width: 32px;
height: 32px;
margin-bottom: -5px;
}
@media (max-device-width: 768px), (max-width: 768px) {
.footer {
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
max-width: 630px;
margin: auto;
}
.legalSection__mozLogo {
margin-left: -7px;
}
.legalSection {
flex-direction: column;
margin: auto;
width: 100%;
max-width: 100%;
}
.legalSection__link {
display: block;
padding: 10px 0;
align-self: flex-start;
}
.socialSection {
margin-top: 20px;
align-self: flex-start;
}
}

View File

@@ -0,0 +1,64 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
module.exports = function(state) {
return html`<footer class="footer">
<div class="legalSection">
<a
href="https://www.mozilla.org"
class="legalSection__link"
role="presentation">
<img
class="legalSection__mozLogo"
src="${assets.get('mozilla-logo.svg')}"
alt="mozilla"/>
</a>
<a
href="https://www.mozilla.org/about/legal"
class="legalSection__link">
${state.translate('footerLinkLegal')}
</a>
<a
href="https://testpilot.firefox.com/about"
class="legalSection__link">
${state.translate('footerLinkAbout')}
</a>
<a
href="/legal"
class="legalSection__link">${state.translate('footerLinkPrivacy')}</a>
<a
href="/legal"
class="legalSection__link">${state.translate('footerLinkTerms')}</a>
<a
href="https://www.mozilla.org/privacy/websites/#cookies"
class="legalSection__link">
${state.translate('footerLinkCookies')}
</a>
<a
href="https://www.mozilla.org/about/legal/report-infringement/"
class="legalSection__link">
${state.translate('reportIPInfringement')}
</a>
</div>
<div class="socialSection">
<a
href="https://github.com/mozilla/send"
class="socialSection__link"
role="presentation">
<img
class="socialSection__icon"
src="${assets.get('github-icon.svg')}"
alt="github"/>
</a>
<a
href="https://twitter.com/FxTestPilot"
class="socialSection__link"
role="presentation">
<img
class="socialSection__icon"
src="${assets.get('twitter-icon.svg')}"
alt="twitter"/>
</a>
</div>
</footer>`;
};

View File

@@ -0,0 +1,56 @@
.fxPromo {
padding: 0 15px;
height: 48px;
background-color: #efeff1;
color: #4a4a4f;
font-size: 13px;
display: flex;
flex-direction: row;
align-content: center;
align-items: center;
justify-content: center;
}
.fxPromo > div {
display: flex;
align-items: center;
margin: 0 auto;
}
.fxPromo > div > span {
margin-left: 10px;
}
.fxPromo__logo {
width: 24px;
}
.fxPromo--blue {
background: linear-gradient(-180deg, #45a1ff 0%, #00feff 94%);
color: #fff;
}
.fxPromo--pink {
background: linear-gradient(-180deg, #ff9400 0%, #ff1ad9 94%);
color: #fff;
}
.fxPromo--blue a {
color: #fff;
font-weight: bold;
}
.fxPromo--pink a {
color: #fff;
font-weight: bold;
}
.fxPromo--blue a:hover {
color: #eee;
font-weight: bold;
}
.fxPromo--pink a:hover {
color: #eee;
font-weight: bold;
}

View File

@@ -1,17 +1,14 @@
const html = require('choo/html'); const html = require('choo/html');
const assets = require('../../common/assets'); const assets = require('../../../common/assets');
module.exports = function(state, emit) { module.exports = function(state, emit) {
function clicked() { let classes = 'fxPromo';
emit('experiment', { cd3: 'promo' });
}
let classes = 'banner';
switch (state.promo) { switch (state.promo) {
case 'blue': case 'blue':
classes = 'banner banner-blue'; classes = 'fxPromo fxPromo--blue';
break; break;
case 'pink': case 'pink':
classes = 'banner banner-pink'; classes = 'fxPromo fxPromo--pink';
break; break;
} }
@@ -20,7 +17,7 @@ module.exports = function(state, emit) {
<div> <div>
<img <img
src="${assets.get('firefox_logo-only.svg')}" src="${assets.get('firefox_logo-only.svg')}"
class="firefox-logo-small" class="fxPromo__logo"
alt="Firefox"/> alt="Firefox"/>
<span>Send is brought to you by the all-new Firefox. <span>Send is brought to you by the all-new Firefox.
<a <a
@@ -30,4 +27,8 @@ module.exports = function(state, emit) {
>Download Firefox now </a></span> >Download Firefox now </a></span>
</div> </div>
</div>`; </div>`;
function clicked() {
emit('experiment', { cd3: 'promo' });
}
}; };

View File

@@ -0,0 +1,104 @@
.header {
align-items: flex-start;
box-sizing: border-box;
display: flex;
justify-content: space-between;
padding: 31px;
width: 100%;
}
.logo {
display: flex;
position: relative;
align-items: center;
}
.logo__link {
display: flex;
flex-direction: row;
}
.logo__title {
color: #3e3d40;
font-size: 32px;
font-weight: 500;
margin: 0;
position: relative;
top: -1px;
letter-spacing: 1px;
margin-left: 8px;
transition: color 50ms;
}
.logo__title:hover {
color: var(--primaryControlBGColor);
}
.logo__subtitle {
color: #3e3d40;
font-size: 12px;
margin: 0 8px;
}
.logo__subtitle-link {
font-weight: bold;
color: #3e3d40;
transition: color 50ms;
}
.logo__subtitle-link:hover {
color: var(--primaryControlBGColor);
}
.feedback {
background-color: var(--primaryControlBGColor);
background-image: url('../assets/feedback.svg');
background-position: 2px 4px;
background-repeat: no-repeat;
background-size: 18px;
border-radius: 3px;
border: 1px solid var(--primaryControlBGColor);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
color: var(--primaryControlFGColor);
cursor: pointer;
display: block;
float: right;
font-size: 12px;
line-height: 12px;
opacity: 0.9;
padding: 5px;
overflow: hidden;
min-width: 12px;
max-width: 12px;
text-indent: 17px;
transition: all 250ms ease-in-out;
white-space: nowrap;
}
.feedback:hover,
.feedback:focus {
min-width: 30px;
max-width: 300px;
text-indent: 2px;
padding: 5px 5px 5px 20px;
background-color: var(--primaryControlHoverColor);
}
.feedback:active {
background-color: var(--primaryControlHoverColor);
}
@media (max-device-width: 520px), (max-width: 520px) {
.header {
flex-direction: column;
justify-content: flex-start;
}
.feedback {
margin-top: 10px;
min-width: 30px;
max-width: 300px;
text-indent: 2px;
padding: 5px 5px 5px 20px;
}
}

View File

@@ -1,5 +1,5 @@
const html = require('choo/html'); const html = require('choo/html');
const assets = require('../../common/assets'); const assets = require('../../../common/assets');
/* /*
The current weback config uses package.json to generate The current weback config uses package.json to generate
version.json for /__version__ meaning `require` returns the version.json for /__version__ meaning `require` returns the
@@ -10,7 +10,30 @@ const assets = require('../../common/assets');
has a custom loader (/build/version_loader.js) just to replace has a custom loader (/build/version_loader.js) just to replace
string with the value from package.json. 🤢 string with the value from package.json. 🤢
*/ */
const version = require('../../package.json').version || 'VERSION'; const version = require('../../../package.json').version || 'VERSION';
const browser = browserName();
module.exports = function(state) {
const feedbackUrl = `https://qsurvey.mozilla.com/s3/txp-firefox-send?ver=${version}&browser=${browser}`;
return html`<header class="header">
<div class="logo">
<a class="logo__link" href="/">
<img
src="${assets.get('send_logo.svg')}"
alt="Send"/>
<h1 class="logo__title">Send</h1>
</a>
<div class="logo__subtitle">
<a class="logo__subtitle-link" href="https://testpilot.firefox.com">Firefox Test Pilot</a>
<div>${state.translate('siteSubtitle')}</div>
</div>
</div>
<a href="${feedbackUrl}"
rel="noreferrer noopener"
class="feedback"
target="_blank">${state.translate('siteFeedback')}</a>
</header>`;
};
function browserName() { function browserName() {
try { try {
@@ -34,26 +57,3 @@ function browserName() {
return 'unknown'; return 'unknown';
} }
} }
const browser = browserName();
module.exports = function(state) {
return html`<header class="header">
<div class="send-logo">
<a href="/">
<img
src="${assets.get('send_logo.svg')}"
alt="Send"/>
<h1 class="site-title">Send</h1>
</a>
<div class="site-subtitle">
<a href="https://testpilot.firefox.com">Firefox Test Pilot</a>
<div>${state.translate('siteSubtitle')}</div>
</div>
</div>
<a href="https://qsurvey.mozilla.com/s3/txp-firefox-send?ver=${version}&browser=${browser}"
rel="noreferrer noopener"
class="feedback"
target="_blank">${state.translate('siteFeedback')}</a>
</header>`;
};

View File

@@ -0,0 +1,109 @@
const html = require('choo/html');
const MAX_LENGTH = 32;
module.exports = function(file, state, emit) {
const loading = state.settingPassword;
const pwd = file.hasPassword;
const sectionClass =
pwd || state.passwordSetError
? 'passwordInput'
: 'passwordInput passwordInput--hidden';
const inputClass = loading || pwd ? 'input' : 'input input--noBtn';
let btnClass = 'inputBtn inputBtn--password inputBtn--hidden';
if (loading) {
btnClass = 'inputBtn inputBtn--password inputBtn--loading';
} else if (pwd) {
btnClass = 'inputBtn inputBtn--password';
}
const action = pwd
? state.translate('changePasswordButton')
: state.translate('addPasswordButton');
return html`
<div class="${sectionClass}">
<form
class="passwordInput__form"
onsubmit=${setPassword}
data-no-csrf>
<input id="password-input"
${loading ? 'disabled' : ''}
class="${inputClass}"
maxlength="${MAX_LENGTH}"
autocomplete="off"
type="password"
oninput=${inputChanged}
onfocus=${focused}
placeholder="${
pwd && !state.passwordSetError
? passwordPlaceholder(file.password)
: state.translate('unlockInputPlaceholder')
}">
<input type="submit"
id="password-btn"
${loading ? 'disabled' : ''}
class="${btnClass}"
value="${loading ? '' : action}">
</form>
<label
class="passwordInput__msg ${
state.passwordSetError ? 'passwordInput__msg--error' : ''
}"
for="password-input">${message(state, pwd)}</label>
</div>`;
function inputChanged() {
state.passwordSetError = null;
const resetInput = document.getElementById('password-input');
const resetBtn = document.getElementById('password-btn');
const pwdmsg = document.querySelector('.passwordInput__msg');
const length = resetInput.value.length;
if (length === MAX_LENGTH) {
pwdmsg.textContent = state.translate('maxPasswordLength', {
length: MAX_LENGTH
});
} else {
pwdmsg.textContent = '';
}
if (length > 0) {
resetBtn.classList.remove('inputBtn--hidden');
resetInput.classList.remove('input--noBtn');
} else {
resetBtn.classList.add('inputBtn--hidden');
resetInput.classList.add('input--noBtn');
}
}
function focused(event) {
event.preventDefault();
const el = document.getElementById('password-input');
if (el.placeholder !== state.translate('unlockInputPlaceholder')) {
el.placeholder = '';
}
}
function setPassword(event) {
event.preventDefault();
const el = document.getElementById('password-input');
const password = el.value;
if (password.length > 0) {
emit('password', { password, file });
} else {
el.focus();
}
return false;
}
};
function passwordPlaceholder(password) {
return password ? password.replace(/./g, '●') : '●●●●●●●●●●●●';
}
function message(state, pwd) {
if (state.passwordSetError) {
return state.translate('passwordSetError');
}
if (state.settingPassword || !pwd) {
return '';
}
return state.translate('passwordIsSet');
}

View File

@@ -0,0 +1,42 @@
.passwordInput {
width: 90%;
height: 100px;
padding: 10px 5px 5px;
}
.passwordInput--hidden {
visibility: hidden;
}
.passwordInput__form {
display: flex;
flex-wrap: nowrap;
padding-bottom: 5px;
}
.passwordInput__msg {
font-size: 15px;
color: var(--lightTextColor);
}
.passwordInput__msg--error {
color: var(--errorColor);
}
.inputBtn--loading {
background-image: url('../assets/spinner.svg');
background-position: center;
background-size: 30px 30px;
background-repeat: no-repeat;
}
.inputBtn--password {
flex: 0 0 200px;
}
@media (max-device-width: 520px), (max-width: 520px) {
.passwordInput {
flex-direction: column;
width: inherit;
}
}

View File

@@ -0,0 +1,26 @@
const html = require('choo/html');
module.exports = function(msg, confirmText, cancelText, confirmCallback) {
return html`
<div class="popup__wrapper">
<div class="popup" onblur=${hide} tabindex="-1">
<div class="popup__message">${msg}</div>
<div class="popup__action">
<span class="popup__no" onclick=${hide}>
${cancelText}
</span>
<span class="popup__yes" onclick=${confirmCallback}>
${confirmText}
</span>
</div>
</div>
</div>`;
function hide(e) {
e.stopPropagation();
const popup = document.querySelector('.popup.popup--show');
if (popup) {
popup.classList.remove('popup--show');
}
}
};

View File

@@ -0,0 +1,122 @@
.popup {
visibility: hidden;
min-width: 204px;
min-height: 105px;
background-color: var(--pageBGColor);
color: var(--textColor);
border: 1px solid #d7d7db;
padding: 15px 24px;
box-sizing: content-box;
text-align: center;
border-radius: 5px;
position: absolute;
z-index: 1;
bottom: 20px;
left: -40px;
transition: opacity 0.5s;
opacity: 0;
outline: 0;
box-shadow: 3px 3px 7px rgba(136, 136, 136, 0.3);
}
.popup::after {
content: '';
position: absolute;
bottom: -11px;
left: 20px;
background-color: #fff;
display: block;
width: 20px;
height: 20px;
transform: rotate(45deg);
border-radius: 0 0 5px;
border-right: 1px solid #d7d7db;
border-bottom: 1px solid #d7d7db;
border-left: 1px solid #fff;
border-top: 1px solid #fff;
}
.popup__wrapper {
position: absolute;
display: inline-block;
}
.popup__message {
height: 40px;
display: flex;
justify-content: center;
align-items: center;
border-bottom: 1px #ebebeb solid;
color: var(--textColor);
font-size: 15px;
font-weight: normal;
padding-bottom: 15px;
white-space: nowrap;
width: calc(100% + 48px);
margin-left: -24px;
}
.popup__action {
margin-top: 15px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.popup__no {
color: #4a4a4a;
background-color: #fbfbfb;
border: 1px #c1c1c1 solid;
border-radius: 5px;
padding: 5px 25px;
font-weight: normal;
min-width: 94px;
box-sizing: border-box;
cursor: pointer;
white-space: nowrap;
}
.popup__no:hover {
background-color: #efeff1;
}
.popup__yes {
color: var(--primaryControlFGColor);
background-color: var(--primaryControlBGColor);
border-radius: 5px;
padding: 5px 25px;
font-weight: normal;
cursor: pointer;
min-width: 94px;
box-sizing: border-box;
white-space: nowrap;
margin-left: 12px;
}
.popup__yes:hover {
background-color: var(--primaryControlHoverColor);
}
.popup--show {
visibility: visible;
opacity: 1;
}
@media (max-device-width: 992px), (max-width: 992px) {
.popup {
left: auto;
right: -40px;
}
.popup::after {
left: auto;
right: 36px;
}
}
@media (max-device-width: 520px), (max-width: 520px) {
.popup::after {
left: 125px;
}
}

View File

@@ -1,28 +1,34 @@
const html = require('choo/html'); const html = require('choo/html');
const percent = require('../../utils').percent;
const radius = 73; const radius = 73;
const oRadius = radius + 10; const oRadius = radius + 10;
const oDiameter = oRadius * 2; const oDiameter = oRadius * 2;
const circumference = 2 * Math.PI * radius; const circumference = 2 * Math.PI * radius;
module.exports = function(progressRatio) { module.exports = function(progressRatio, indefinite = false) {
const dashOffset = (1 - progressRatio) * circumference; const p = indefinite ? 0.2 : progressRatio;
const percent = Math.floor(progressRatio * 100); const dashOffset = (1 - p) * circumference;
const div = html` const progressPercent = html`
<div class="progress-bar"> <text class="progress__percent" text-anchor="middle" x="50%" y="98">
${percent(progressRatio)}
</text>`;
return html`
<div class="progress">
<svg <svg
id="progress"
width="${oDiameter}" width="${oDiameter}"
height="${oDiameter}" height="${oDiameter}"
viewPort="0 0 ${oDiameter} ${oDiameter}" viewPort="0 0 ${oDiameter} ${oDiameter}"
version="1.1"> version="1.1">
<circle <circle
class="progress__bg"
r="${radius}" r="${radius}"
cx="${oRadius}" cx="${oRadius}"
cy="${oRadius}" cy="${oRadius}"
fill="transparent"/> fill="transparent"/>
<circle <circle
id="bar" class="${indefinite ? 'progress__indefinite' : 'progress__bar'}"
r="${radius}" r="${radius}"
cx="${oRadius}" cx="${oRadius}"
cy="${oRadius}" cy="${oRadius}"
@@ -30,12 +36,8 @@ module.exports = function(progressRatio) {
transform="rotate(-90 ${oRadius} ${oRadius})" transform="rotate(-90 ${oRadius} ${oRadius})"
stroke-dasharray="${circumference}" stroke-dasharray="${circumference}"
stroke-dashoffset="${dashOffset}"/> stroke-dashoffset="${dashOffset}"/>
<text class="percentage" text-anchor="middle" x="50%" y="98"> ${indefinite ? '' : progressPercent}
<tspan class="percent-number">${percent}</tspan>
<tspan class="percent-sign">%</tspan>
</text>
</svg> </svg>
</div> </div>
`; `;
return div;
}; };

View File

@@ -0,0 +1,39 @@
.progress {
margin-top: 3px;
}
.progress__bg {
stroke: #eee;
stroke-width: 0.75em;
}
.progress__bar {
stroke: #3b9dff;
stroke-width: 0.75em;
transition: stroke-dashoffset 300ms linear;
}
.progress__indefinite {
stroke: #3b9dff;
stroke-width: 0.75em;
animation: 1s linear infinite spin;
transform-origin: center;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.progress__percent {
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
font-size: 43.2px;
letter-spacing: -0.78px;
line-height: 58px;
user-select: none;
}

View File

@@ -1,23 +1,43 @@
const html = require('choo/html'); const html = require('choo/html');
const number = require('../../utils').number;
module.exports = function(selected, options, translate, changed) { module.exports = function(selected, options, translate, changed) {
const id = `select-${Math.random()}`; const id = `select-${Math.random()}`;
let x = selected; let x = selected;
return html`
<div class="selectbox">
<div onclick=${toggle}>
<span class="link">${translate(selected)}</span>
<svg width="32" height="32">
<polygon points="8 18 17 28 26 18" fill="#0094fb"/>
</svg>
</div>
<ul id="${id}" class="selectbox__options">
${options.map(
i => html`
<li
class="selectbox__option"
onclick=${choose}
data-value="${i}">${number(i)}</li>`
)}
</ul>
</div>`;
function close() { function close() {
const ul = document.getElementById(id); const ul = document.getElementById(id);
const body = document.querySelector('body'); const body = document.querySelector('body');
ul.classList.remove('active'); ul.classList.remove('selectbox__options--active');
body.removeEventListener('click', close); body.removeEventListener('click', close);
} }
function toggle(event) { function toggle(event) {
event.stopPropagation(); event.stopPropagation();
const ul = document.getElementById(id); const ul = document.getElementById(id);
if (ul.classList.contains('active')) { if (ul.classList.contains('selectbox__options--active')) {
close(); close();
} else { } else {
ul.classList.add('active'); ul.classList.add('selectbox__options--active');
const body = document.querySelector('body'); const body = document.querySelector('body');
body.addEventListener('click', close); body.addEventListener('click', close);
} }
@@ -36,19 +56,4 @@ module.exports = function(selected, options, translate, changed) {
} }
close(); close();
} }
return html`
<div class="selectbox">
<div onclick=${toggle}>
<span class="link">${translate(selected)}</span>
<svg width="32" height="32">
<polygon points="8 18 17 28 26 18" fill="#0094fb"/>
</svg>
</div>
<ul id="${id}" class="selectOptions">
${options.map(
i =>
html`<li class="selectOption" onclick=${choose} data-value="${i}">${i}</li>`
)}
</ul>
</div>`;
}; };

View File

@@ -0,0 +1,36 @@
.selectbox {
display: inline-block;
position: relative;
cursor: pointer;
}
.selectbox__options {
display: none;
}
.selectbox__options--active {
display: block;
position: absolute;
top: 0;
left: 0;
padding: 0;
margin: 40px 0;
background-color: var(--pageBGColor);
border: 1px solid rgba(12, 12, 13, 0.3);
border-radius: 4px;
box-shadow: 1px 2px 4px rgba(12, 12, 13, 0.3);
}
.selectbox__option {
color: var(--lightTextColor);
font-size: 12pt;
list-style: none;
user-select: none;
white-space: nowrap;
padding: 0 60px;
border-bottom: 1px solid rgba(12, 12, 13, 0.3);
}
.selectbox__option:hover {
background-color: #f4f4f4;
}

View File

@@ -0,0 +1,37 @@
const html = require('choo/html');
const passwordInput = require('../passwordInput');
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
return html`
<div class="setPasswordSection">
<div class="checkbox">
<input
${file.hasPassword ? 'disabled' : ''}
${file.hasPassword || state.passwordSetError ? 'checked' : ''}
class="checkbox__input"
id="add-password"
type="checkbox"
autocomplete="off"
onchange=${togglePasswordInput}/>
<label class="checkbox__label" for="add-password">
${state.translate('requirePasswordCheckbox')}
</label>
</div>
${passwordInput(file, state, emit)}
</div>`;
function togglePasswordInput(e) {
const unlockInput = document.getElementById('password-input');
const boxChecked = e.target.checked;
document
.querySelector('.passwordInput')
.classList.toggle('passwordInput--hidden', !boxChecked);
if (boxChecked) {
unlockInput.focus();
} else {
unlockInput.value = '';
}
}
};

View File

@@ -0,0 +1,68 @@
.setPasswordSection {
padding: 10px 0;
max-width: 100%;
overflow-wrap: break-word;
}
.checkbox {
min-height: 24px;
}
.checkbox__input {
position: absolute;
opacity: 0;
}
.checkbox__label {
line-height: 23px;
cursor: pointer;
color: var(--lightTextColor);
}
.checkbox__label::before {
content: '';
height: 20px;
width: 20px;
margin-right: 10px;
margin-left: 5px;
float: left;
border: 1px solid rgba(12, 12, 13, 0.3);
border-radius: 2px;
}
.checkbox__input:focus + .checkbox__label::before,
.checkbox:hover .checkbox__label::before {
border: 1px solid var(--primaryControlBGColor);
}
.checkbox__input:checked + .checkbox__label {
color: var(--textColor);
}
.checkbox__input:checked + .checkbox__label::before {
background-image: url('../assets/check-16-blue.svg');
background-position: 2px 1px;
}
.checkbox__input:disabled + .checkbox__label {
cursor: auto;
}
.checkbox__input:disabled + .checkbox__label::before {
background-image: url('../assets/check-16-blue.svg');
background-repeat: no-repeat;
background-size: 26px 26px;
border: none;
cursor: auto;
}
@media (max-device-width: 520px), (max-width: 520px) {
.setPasswordSection {
align-self: center;
min-width: 95%;
}
.checkbox__label::before {
margin-left: 0;
}
}

View File

@@ -1,80 +0,0 @@
const html = require('choo/html');
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
return html`<div class="selectPassword">
${passwordSpan(file.password)}
<button
id="resetButton"
onclick=${toggleResetInput}
>${state.translate('changePasswordButton')}</button>
<form
id='reset-form'
class="setPassword hidden"
onsubmit=${resetPassword}
data-no-csrf>
<input id="unlock-reset-input"
class="unlock-input input-no-btn"
maxlength="32"
autocomplete="off"
type="password"
oninput=${inputChanged}
placeholder="${state.translate('unlockInputPlaceholder')}">
<input type="submit"
id="unlock-reset-btn"
class="btn btn-hidden"
value="${state.translate('changePasswordButton')}"/>
</form>
</div>`;
function passwordSpan(password) {
password = password || '●●●●●';
const span = html([
`<span>${state.translate('passwordResult', {
password:
'<pre class="passwordOriginal"></pre><pre class="passwordMask"></pre>'
})}</span>`
]);
const og = span.querySelector('.passwordOriginal');
const masked = span.querySelector('.passwordMask');
og.textContent = password;
masked.textContent = password.replace(/./g, '●');
return span;
}
function inputChanged() {
const resetInput = document.getElementById('unlock-reset-input');
const resetBtn = document.getElementById('unlock-reset-btn');
if (resetInput.value.length > 0) {
resetBtn.classList.remove('btn-hidden');
resetInput.classList.remove('input-no-btn');
} else {
resetBtn.classList.add('btn-hidden');
resetInput.classList.add('input-no-btn');
}
}
function resetPassword(event) {
event.preventDefault();
const password = document.querySelector('#unlock-reset-input').value;
if (password.length > 0) {
document.getElementById('copy').classList.remove('wait-password');
document.getElementById('copy-btn').disabled = false;
emit('password', { password, file });
}
return false;
}
function toggleResetInput(event) {
const form = event.target.parentElement.querySelector('form');
const input = document.getElementById('unlock-reset-input');
if (form.style.visibility === 'hidden' || form.style.visibility === '') {
form.style.visibility = 'visible';
input.focus();
} else {
form.style.visibility = 'hidden';
}
inputChanged();
}
};

View File

@@ -1,70 +0,0 @@
const html = require('choo/html');
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
const div = html`
<div class="selectPassword">
<div id="addPasswordWrapper">
<input
id="addPassword"
type="checkbox"
autocomplete="off"
onchange=${togglePasswordInput}/>
<label for="addPassword">
${state.translate('requirePasswordCheckbox')}
</label>
</div>
<form class="setPassword hidden" onsubmit=${setPassword} data-no-csrf>
<input id="unlock-input"
class="unlock-input input-no-btn"
maxlength="32"
autocomplete="off"
placeholder="${state.translate('unlockInputPlaceholder')}"
type="password"
oninput=${inputChanged}/>
<input type="submit"
id="unlock-btn"
class="btn btn-hidden"
value="${state.translate('addPasswordButton')}"/>
</form>
</div>`;
function inputChanged() {
const input = document.getElementById('unlock-input');
const btn = document.getElementById('unlock-btn');
if (input.value.length > 0) {
btn.classList.remove('btn-hidden');
input.classList.remove('input-no-btn');
} else {
btn.classList.add('btn-hidden');
input.classList.add('input-no-btn');
}
}
function togglePasswordInput(e) {
const unlockInput = document.getElementById('unlock-input');
const boxChecked = e.target.checked;
document
.querySelector('.setPassword')
.classList.toggle('hidden', !boxChecked);
if (boxChecked) {
unlockInput.focus();
} else {
unlockInput.value = '';
}
inputChanged();
}
function setPassword(event) {
event.preventDefault();
const password = document.getElementById('unlock-input').value;
if (password.length > 0) {
document.getElementById('copy').classList.remove('wait-password');
document.getElementById('copy-btn').disabled = false;
emit('password', { password, file });
}
return false;
}
return div;
};

View File

@@ -117,6 +117,14 @@ function percent(ratio) {
return `${Math.floor(ratio * 100)}%`; return `${Math.floor(ratio * 100)}%`;
} }
function number(n) {
if (LOCALIZE_NUMBERS) {
const locale = document.querySelector('html').lang;
return n.toLocaleString(locale);
}
return n.toString();
}
function allowedCopy() { function allowedCopy() {
const support = !!document.queryCommandSupported; const support = !!document.queryCommandSupported;
return support ? document.queryCommandSupported('copy') : false; return support ? document.queryCommandSupported('copy') : false;
@@ -126,29 +134,13 @@ function delay(delay = 100) {
return new Promise(resolve => setTimeout(resolve, delay)); return new Promise(resolve => setTimeout(resolve, delay));
} }
function fadeOut(id) { function fadeOut(selector) {
const classes = document.getElementById(id).classList; const classes = document.querySelector(selector).classList;
classes.remove('fadeIn'); classes.remove('effect--fadeIn');
classes.add('fadeOut'); classes.add('effect--fadeOut');
return delay(300); return delay(300);
} }
function saveFile(file) {
const dataView = new DataView(file.plaintext);
const blob = new Blob([dataView], { type: file.type });
const downloadUrl = URL.createObjectURL(blob);
if (window.navigator.msSaveBlob) {
return window.navigator.msSaveBlob(blob, file.name);
}
const a = document.createElement('a');
a.href = downloadUrl;
a.download = file.name;
document.body.appendChild(a);
a.click();
URL.revokeObjectURL(downloadUrl);
}
function openLinksInNewTab(links, should = true) { function openLinksInNewTab(links, should = true) {
links = links || Array.from(document.querySelectorAll('a:not([target])')); links = links || Array.from(document.querySelectorAll('a:not([target])'));
if (should) { if (should) {
@@ -171,11 +163,11 @@ module.exports = {
allowedCopy, allowedCopy,
bytes, bytes,
percent, percent,
number,
copyToClipboard, copyToClipboard,
arrayToB64, arrayToB64,
b64ToArray, b64ToArray,
canHasSend, canHasSend,
isFile, isFile,
saveFile,
openLinksInNewTab openLinksInNewTab
}; };

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path class="icon-copy" fill="#0A8DFF" d="M14.707 8.293l-3-3A1 1 0 0 0 11 5h-1V4a1 1 0 0 0-.293-.707l-3-3A1 1 0 0 0 6 0H3a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3v3a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2V9a1 1 0 0 0-.293-.707zM12.586 9H11V7.414zm-5-5H6V2.414zM6 7v2H3V2h2v2.5a.5.5 0 0 0 .5.5H8a2 2 0 0 0-2 2zm2 7V7h2v2.5a.5.5 0 0 0 .5.5H13v4z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#0A8DFF" d="M14.707 8.293l-3-3A1 1 0 0 0 11 5h-1V4a1 1 0 0 0-.293-.707l-3-3A1 1 0 0 0 6 0H3a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3v3a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2V9a1 1 0 0 0-.293-.707zM12.586 9H11V7.414zm-5-5H6V2.414zM6 7v2H3V2h2v2.5a.5.5 0 0 0 .5.5H8a2 2 0 0 0-2 2zm2 7V7h2v2.5a.5.5 0 0 0 .5.5H13v4z"/></svg>

Before

Width:  |  Height:  |  Size: 416 B

After

Width:  |  Height:  |  Size: 398 B

File diff suppressed because it is too large Load Diff

17
assets/spinner.svg Normal file
View File

@@ -0,0 +1,17 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" stroke="#fff">
<g fill="none" fill-rule="evenodd">
<g transform="translate(1 1)" stroke-width="2">
<circle stroke-opacity=".5" cx="18" cy="18" r="18"/>
<path d="M36 18c0-9.94-8.06-18-18-18">
<animateTransform
attributeName="transform"
type="rotate"
from="0 18 18"
to="360 18 18"
dur="1s"
repeatCount="indefinite"/>
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 694 B

View File

@@ -1,5 +1,4 @@
last 2 chrome versions last 2 chrome versions
last 2 firefox versions last 2 firefox versions
firefox esr firefox esr
ie >= 9 safari > 9
safari >= 9

View File

@@ -1,4 +1,7 @@
const { MessageContext } = require('fluent'); // TODO: when node supports 'for await' we can remove babel-polyfill
// and use 'fluent' instead of 'fluent/compat' (also below near line 42)
require('babel-polyfill');
const { MessageContext } = require('fluent/compat');
const fs = require('fs'); const fs = require('fs');
function toJSON(map) { function toJSON(map) {
@@ -36,16 +39,17 @@ module.exports = function(source) {
return ` return `
module.exports = \` module.exports = \`
if (typeof window === 'undefined') { if (typeof window === 'undefined') {
var fluent = require('fluent'); require('babel-polyfill');
var fluent = require('fluent/compat');
} }
var ctx = new fluent.MessageContext('${locale}', {useIsolating: false}); var fluentContext = new fluent.MessageContext('${locale}', {useIsolating: false});
ctx._messages = new Map(${toJSON(merged)}); fluentContext._messages = new Map(${toJSON(merged)});
function translate(id, data) { function translate(id, data) {
var msg = ctx.getMessage(id); var msg = fluentContext.getMessage(id);
if (typeof(msg) !== 'string' && !msg.val && msg.attrs) { if (typeof(msg) !== 'string' && !msg.val && msg.attrs) {
msg = msg.attrs.title || msg.attrs.alt msg = msg.attrs.title || msg.attrs.alt
} }
return ctx.format(msg, data); return fluentContext.format(msg, data);
} }
if (typeof window === 'undefined') { if (typeof window === 'undefined') {
module.exports = translate; module.exports = translate;

View File

@@ -1,35 +1,99 @@
machine: version: 2.0
node: jobs:
version: 8 build:
services: docker:
- docker - image: circleci/node:8
- redis steps:
environment: - checkout
PATH: "/home/ubuntu/send/firefox:$PATH" - restore_cache:
key: send-{{ checksum "package-lock.json" }}
dependencies: - run: npm install
pre: - save_cache:
- npm i -g get-firefox geckodriver nsp key: send-{{ checksum "package-lock.json" }}
- get-firefox --platform linux --extract --target /home/ubuntu/send paths:
- node_modules
deployment: - run: npm run build
latest: - persist_to_workspace:
branch: master root: .
commands: paths:
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - ./*
- docker build -t mozilla/send:latest . test:
- docker push mozilla/send:latest docker:
tags: - image: circleci/node:8-browsers
tag: /.*/ steps:
owner: mozilla - checkout
commands: - restore_cache:
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS key: send-{{ checksum "package-lock.json" }}
- docker build -t mozilla/send:$CIRCLE_TAG . - run: npm install
- docker push mozilla/send:$CIRCLE_TAG - save_cache:
key: send-{{ checksum "package-lock.json" }}
test: paths:
override: - node_modules
- npm run build - run: npm run check
- npm run lint - run: npm run lint
- npm test - run: npm test
- nsp check - store_artifacts:
path: coverage
deploy_dev:
machine: true
steps:
- attach_workspace:
at: .
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
- run: docker build -t mozilla/send:latest .
- run: docker push mozilla/send:latest
deploy_stage:
machine: true
steps:
- attach_workspace:
at: .
- run: docker login -u $DOCKER_USER -p $DOCKER_PASS
- run: docker build -t mozilla/send:$CIRCLE_TAG .
- run: docker push mozilla/send:$CIRCLE_TAG
workflows:
version: 2
test_pr:
jobs:
- test:
filters:
branches:
ignore: master
build_and_deploy_dev:
jobs:
- build:
filters:
branches:
only: master
tags:
ignore: /^v.*/
- deploy_dev:
requires:
- build
filters:
branches:
only: master
tags:
ignore: /^v.*/
build_and_deploy_stage:
jobs:
- build:
filters:
branches:
ignore: /.*/
tags:
only: /^v.*/
- test:
filters:
branches:
ignore: /.*/
tags:
only: /^v.*/
- deploy_stage:
requires:
- build
- test
filters:
branches:
ignore: /.*/
tags:
only: /^v.*/

11596
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": "2.3.0", "version": "2.4.0",
"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/",
@@ -9,10 +9,12 @@
"private": true, "private": true,
"scripts": { "scripts": {
"precommit": "lint-staged", "precommit": "lint-staged",
"prepush": "npm test",
"check": "nsp check",
"clean": "rimraf dist", "clean": "rimraf dist",
"build": "npm run clean && webpack -p", "build": "npm run clean && webpack -p",
"lint": "npm-run-all lint:*", "lint": "npm-run-all lint:*",
"lint:css": "stylelint 'assets/*.css'", "lint:css": "stylelint app/*.css app/**/*.css",
"lint:js": "eslint .", "lint:js": "eslint .",
"lint-locales": "node scripts/lint-locales", "lint-locales": "node scripts/lint-locales",
"lint-locales:dev": "npm run lint-locales", "lint-locales:dev": "npm run lint-locales",
@@ -23,9 +25,12 @@
"changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges", "changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges",
"contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS", "contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS",
"release": "npm-run-all contributors changelog", "release": "npm-run-all contributors changelog",
"test": "mocha test/unit", "test": "npm-run-all test:*",
"test:backend": "nyc mocha --reporter=min test/unit",
"test:frontend": "cross-env NODE_ENV=development node test/frontend/runner.js && nyc report --reporter=html",
"start": "cross-env NODE_ENV=development webpack-dev-server", "start": "cross-env NODE_ENV=development webpack-dev-server",
"prod": "node server/prod.js" "prod": "node server/prod.js",
"cover": "nyc --reporter=html mocha test/unit"
}, },
"lint-staged": { "lint-staged": {
"*.js": [ "*.js": [
@@ -39,78 +44,93 @@
"git add" "git add"
] ]
}, },
"nyc": {
"reporter": [
"text"
],
"cache": true
},
"engines": { "engines": {
"node": ">=8.2.0" "node": ">=8.2.0"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "^7.2.5",
"babel-core": "^6.26.0", "babel-core": "^6.26.0",
"babel-loader": "^7.1.2", "babel-loader": "^7.1.3",
"babel-plugin-istanbul": "^4.1.5",
"babel-plugin-yo-yoify": "^1.0.2", "babel-plugin-yo-yoify": "^1.0.2",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.6.1", "babel-preset-env": "^1.6.1",
"babel-preset-es2015": "^6.24.1", "babel-preset-es2015": "^6.24.1",
"babel-preset-stage-2": "^6.24.1", "babel-preset-stage-2": "^6.24.1",
"base64-js": "^1.2.1", "babel-preset-stage-3": "^6.24.1",
"copy-webpack-plugin": "^4.3.1", "base64-js": "^1.2.3",
"copy-webpack-plugin": "^4.4.2",
"cross-env": "^5.1.3", "cross-env": "^5.1.3",
"css-loader": "^0.28.9", "css-loader": "^0.28.10",
"css-mqpacker": "^6.0.2", "css-mqpacker": "^6.0.2",
"cssnano": "^3.10.0", "eslint": "^4.18.1",
"eslint": "^4.16.0",
"eslint-plugin-mocha": "^4.11.0", "eslint-plugin-mocha": "^4.11.0",
"eslint-plugin-node": "^5.2.1", "eslint-plugin-node": "^6.0.1",
"eslint-plugin-security": "^1.4.0", "eslint-plugin-security": "^1.4.0",
"expose-loader": "^0.7.4", "expose-loader": "^0.7.4",
"extract-loader": "^1.0.2", "extract-loader": "^1.0.2",
"file-loader": "^1.1.6", "extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.9",
"fluent-intl-polyfill": "^0.1.0", "fluent-intl-polyfill": "^0.1.0",
"git-rev-sync": "^1.9.1", "git-rev-sync": "^1.10.0",
"github-changes": "^1.1.2", "github-changes": "^1.1.2",
"html-loader": "^0.5.5", "html-loader": "^0.5.5",
"husky": "^0.14.3", "husky": "^0.14.3",
"lint-staged": "^4.3.0", "lint-staged": "^7.0.0",
"mocha": "^3.5.3", "mocha": "^5.0.0",
"nanobus": "^4.3.2", "nanobus": "^4.3.2",
"nanotiming": "^7.3.0",
"npm-run-all": "^4.1.2", "npm-run-all": "^4.1.2",
"postcss-loader": "^2.0.10", "nsp": "^3.2.1",
"nyc": "^11.5.0",
"postcss-cssnext": "^3.1.0",
"postcss-import": "^11.1.0",
"postcss-loader": "^2.1.0",
"prettier": "^1.10.2", "prettier": "^1.10.2",
"proxyquire": "^1.8.0", "proxyquire": "^1.8.0",
"raven-js": "^3.22.1", "puppeteer": "^1.1.1",
"redis-mock": "^0.20.0", "raven-js": "^3.22.2",
"redis-mock": "^0.21.0",
"require-from-string": "^2.0.1", "require-from-string": "^2.0.1",
"rimraf": "^2.6.2", "rimraf": "^2.6.2",
"selenium-webdriver": "^3.6.0", "sinon": "^4.4.2",
"sinon": "^4.2.2",
"string-hash": "^1.1.3", "string-hash": "^1.1.3",
"stylelint-config-standard": "^17.0.0", "stylelint": "^9.1.1",
"stylelint-no-unsupported-browser-features": "^1.0.1", "stylelint-config-standard": "^18.1.0",
"supertest": "^3.0.0", "stylelint-no-unsupported-browser-features": "^2.0.0",
"svgo": "^1.0.5",
"svgo-loader": "^2.1.0",
"testpilot-ga": "^0.3.0", "testpilot-ga": "^0.3.0",
"val-loader": "^1.1.0", "val-loader": "^1.1.0",
"webpack": "^3.10.0", "webpack": "^3.11.0",
"webpack-dev-middleware": "^2.0.6",
"webpack-dev-server": "2.9.1", "webpack-dev-server": "2.9.1",
"webpack-manifest-plugin": "^1.3.2", "webpack-manifest-plugin": "^1.3.2",
"webpack-unassert-loader": "^1.2.0" "webpack-unassert-loader": "^1.2.0"
}, },
"dependencies": { "dependencies": {
"aws-sdk": "^2.188.0", "aws-sdk": "^2.202.0",
"body-parser": "^1.18.2", "babel-polyfill": "^6.26.0",
"choo": "^6.7.0", "choo": "^6.7.0",
"cldr-core": "^32.0.0", "cldr-core": "^32.0.0",
"connect-busboy": "0.0.2", "connect-busboy": "0.0.2",
"convict": "^4.0.1", "convict": "^4.0.1",
"express": "^4.16.2", "express": "^4.16.2",
"fluent": "^0.4.1", "fluent": "^0.6.3",
"fluent-langneg": "^0.1.0", "fluent-langneg": "^0.1.0",
"helmet": "^3.10.0", "helmet": "^3.11.0",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"mozlog": "^2.2.0", "mozlog": "^2.2.0",
"raven": "^2.4.0", "raven": "^2.4.1",
"redis": "^2.8.0" "redis": "^2.8.0"
}, },
"availableLanguages": [ "availableLanguages": [
"en-US", "en-US",
"ar",
"ast", "ast",
"az", "az",
"bs", "bs",
@@ -131,6 +151,7 @@
"fy-NL", "fy-NL",
"hsb", "hsb",
"hu", "hu",
"ia",
"id", "id",
"it", "it",
"ja", "ja",
@@ -143,9 +164,11 @@
"nn-NO", "nn-NO",
"pt-BR", "pt-BR",
"pt-PT", "pt-PT",
"ro",
"ru", "ru",
"sk", "sk",
"sl", "sl",
"sq",
"sr", "sr",
"sv-SE", "sv-SE",
"tl", "tl",

View File

@@ -1,14 +1,12 @@
const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano');
const mqpacker = require('css-mqpacker');
const config = require('./server/config');
const options = { const options = {
plugins: [autoprefixer, mqpacker, cssnano] plugins: {
'postcss-import': {},
'postcss-cssnext': {},
'css-mqpacker': {}
}
}; };
if (config.env === 'development') { if (process.env.NODE_ENV === 'development') {
options.map = { inline: true }; options.map = { inline: true };
} }

View File

@@ -1,4 +1,4 @@
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
title = فَيَرفُكس سِنْد title = فَيَرفُكس سِنْد
siteSubtitle = تجربة وِبّيّة siteSubtitle = تجربة وِبّيّة
siteFeedback = الانطباعات siteFeedback = الانطباعات
@@ -25,7 +25,7 @@ uploadCancelNotification = أُلغي الرفع.
uploadingPageLargeFileMessage = هذا الملف كبير الحجم وسيأخذ رفعه وقتا. انتظر رجاءً. uploadingPageLargeFileMessage = هذا الملف كبير الحجم وسيأخذ رفعه وقتا. انتظر رجاءً.
uploadingFileNotification = أعلِمني عندما يكتمل الرفع. uploadingFileNotification = أعلِمني عندما يكتمل الرفع.
uploadSuccessConfirmHeader = جاهز للإرسال uploadSuccessConfirmHeader = جاهز للإرسال
uploadSvgAlt uploadSvgAlt =
.alt = ارفع .alt = ارفع
uploadSuccessTimingHeader = ستنتهي صلاحية الرابط الذي يشير إلى الملف في حال: نُزِّل لأول مرة، أو مرّ ٢٤ ساعة على رفعه. uploadSuccessTimingHeader = ستنتهي صلاحية الرابط الذي يشير إلى الملف في حال: نُزِّل لأول مرة، أو مرّ ٢٤ ساعة على رفعه.
expireInfo = ستنتهي صلاحية رابط الملف بعد { $downloadCount } أو { $timespan }. expireInfo = ستنتهي صلاحية رابط الملف بعد { $downloadCount } أو { $timespan }.
@@ -53,35 +53,35 @@ deleteFileButton = احذف الملف
.title = احذف الملف .title = احذف الملف
sendAnotherFileLink = أرسل ملفّا آخر sendAnotherFileLink = أرسل ملفّا آخر
.title = أرسل ملفّا آخر .title = أرسل ملفّا آخر
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText downloadAltText =
.alt = نزّل .alt = نزّل
downloadsFileList = التنزيلات downloadsFileList = التنزيلات
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = الوقت timeFileList = الوقت
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = نزّل { $filename } downloadFileName = نزّل { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = أدخل كلمة السر unlockInputLabel = أدخل كلمة السر
unlockInputPlaceholder = كلمة السر unlockInputPlaceholder = كلمة السر
unlockButtonLabel = افتح القفل unlockButtonLabel = افتح القفل
downloadFileTitle = نزِّل الملف المعمّى downloadFileTitle = نزِّل الملف المعمّى
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = يُرسل إليك صديقك ملفا عبر «فَيَرفُكس سِنْد»، وهي خدمة تتيح لك مشاركة الملفات عبر رابط آمن وخاص ومعمّى، حيث تنتهي صلاحياتها تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد. downloadMessage = يُرسل إليك صديقك ملفا عبر «فَيَرفُكس سِنْد»، وهي خدمة تتيح لك مشاركة الملفات عبر رابط آمن وخاص ومعمّى، حيث تنتهي صلاحياتها تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = نزّل downloadButtonLabel = نزّل
.title = نزّل .title = نزّل
downloadNotification = لقد اكتمل التنزيل. downloadNotification = لقد اكتمل التنزيل.
downloadFinish = اكتمل التنزيل downloadFinish = اكتمل التنزيل
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } من أصل { $totalSize }) fileSizeProgress = ({ $partialSize } من أصل { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = جرِّب «فَيَرفُكس سِنْد» sendYourFilesLink = جرِّب «فَيَرفُكس سِنْد»
downloadingPageProgress = ينزّل { $filename } ({ $size }) downloadingPageProgress = ينزّل { $filename } ({ $size })
downloadingPageMessage = رجاء أبقِ هذا اللسان مفتوحا حتى نجلب الملف ونفك تعميته. downloadingPageMessage = رجاء أبقِ هذا اللسان مفتوحا حتى نجلب الملف ونفك تعميته.
errorAltText errorAltText =
.alt = خطأ أثناء الرفع .alt = خطأ أثناء الرفع
errorPageHeader = حدث خطب ما. errorPageHeader = حدث خطب ما.
errorPageMessage = حدث خطب ما أثناء رفع الملف. errorPageMessage = حدث خطب ما أثناء رفع الملف.
@@ -90,7 +90,7 @@ fileTooBig = حجم الملف كبير للغاية لرفعه. يجب أن ي
linkExpiredAlt = انتهت صلاحية الرابط linkExpiredAlt = انتهت صلاحية الرابط
expiredPageHeader = انتهت صلاحية هذا الرابط أو لم يكن موجودا في المقام الأول! expiredPageHeader = انتهت صلاحية هذا الرابط أو لم يكن موجودا في المقام الأول!
notSupportedHeader = متصفحك غير مدعوم. notSupportedHeader = متصفحك غير مدعوم.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = للأسف فإن متصفحك لا يدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تجربة متصفح آخر، ونحن ننصحك بِفَيَرفُكس! notSupportedDetail = للأسف فإن متصفحك لا يدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تجربة متصفح آخر، ونحن ننصحك بِفَيَرفُكس!
notSupportedLink = لماذا متصفحي غير مدعوم؟ notSupportedLink = لماذا متصفحي غير مدعوم؟
notSupportedOutdatedDetail = للأسف فإن إصدارة فَيَرفُكس هذه لا تدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تحديث متصفحك. notSupportedOutdatedDetail = للأسف فإن إصدارة فَيَرفُكس هذه لا تدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تحديث متصفحك.
@@ -98,7 +98,7 @@ updateFirefox = حدّث فَيَرفُكس
downloadFirefoxButtonSub = تنزيل مجاني downloadFirefoxButtonSub = تنزيل مجاني
uploadedFile = ملف uploadedFile = ملف
copyFileList = انسخ الرابط copyFileList = انسخ الرابط
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = ينتهي في expiryFileList = ينتهي في
deleteFileList = احذف deleteFileList = احذف
nevermindButton = لا بأس nevermindButton = لا بأس
@@ -108,12 +108,12 @@ legalNoticeMozilla = يخضع استخدام موقع «فَيَرفُكس سِ
deletePopupText = أأحذف هذا الملف؟ deletePopupText = أأحذف هذا الملف؟
deletePopupYes = نعم deletePopupYes = نعم
deletePopupCancel = ألغِ deletePopupCancel = ألغِ
deleteButtonHover deleteButtonHover =
.title = احذف .title = احذف
copyUrlHover copyUrlHover =
.title = انسخ الرابط .title = انسخ الرابط
footerLinkLegal = القانونية footerLinkLegal = القانونية
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = حول الاختبار التجريبي footerLinkAbout = حول الاختبار التجريبي
footerLinkPrivacy = الخصوصية footerLinkPrivacy = الخصوصية
footerLinkTerms = الشروط footerLinkTerms = الشروط
@@ -122,6 +122,15 @@ requirePasswordCheckbox = اطلب كلمة سر لتنزيل هذا الملف
addPasswordButton = أضِف كلمة سر addPasswordButton = أضِف كلمة سر
changePasswordButton = غيّر changePasswordButton = غيّر
passwordTryAgain = كلمة السر خاطئة. أعِد المحاولة. passwordTryAgain = كلمة السر خاطئة. أعِد المحاولة.
// This label is followed by the password needed to download a file # This label is followed by the password needed to download a file
passwordResult = كلمة السر: { $password } passwordResult = كلمة السر: { $password }
reportIPInfringement = أبلغ عن انتهاك للملكية الفكرية reportIPInfringement = أبلغ عن انتهاك للملكية الفكرية
javascriptRequired = يتطلب فَيَرفُكس سِنْد جافاسكربت
whyJavascript = لماذا يتطلب فَيَرفُكس سِنْد جافاسكربت؟
enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاولة.
# 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 a password is successfully set
passwordIsSet = ضُبطت كلمة السر

View File

@@ -1,4 +1,4 @@
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
title = Firefox Send title = Firefox Send
siteSubtitle = web eksperiment siteSubtitle = web eksperiment
siteFeedback = Povratne informacije siteFeedback = Povratne informacije
@@ -41,29 +41,29 @@ copyUrlFormButton = Kopiraj u međuspremnik
copiedUrl = Kopirano! copiedUrl = Kopirano!
deleteFileButton = Izbriši datoteku deleteFileButton = Izbriši datoteku
sendAnotherFileLink = Pošalji drugu datoteku sendAnotherFileLink = Pošalji drugu datoteku
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Preuzmi downloadAltText = Preuzmi
downloadsFileList = Preuzimanja downloadsFileList = Preuzimanja
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Vrijeme timeFileList = Vrijeme
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = Preuzmi { $filename } downloadFileName = Preuzmi { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Unesite lozinku unlockInputLabel = Unesite lozinku
unlockInputPlaceholder = Lozinka unlockInputPlaceholder = Lozinka
unlockButtonLabel = Otključaj unlockButtonLabel = Otključaj
downloadFileTitle = Preuzmi šifrovanu datoteku downloadFileTitle = Preuzmi šifrovanu datoteku
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Firefox Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu. downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Firefox Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Preuzmi downloadButtonLabel = Preuzmi
downloadNotification = Vaše preuzimanje je završeno. downloadNotification = Vaše preuzimanje je završeno.
downloadFinish = Preuzimanje završeno downloadFinish = Preuzimanje završeno
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } od { $totalSize }) fileSizeProgress = ({ $partialSize } od { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Probajte Firefox Send sendYourFilesLink = Probajte Firefox Send
downloadingPageProgress = Preuzimanje { $filename } ({ $size }) downloadingPageProgress = Preuzimanje { $filename } ({ $size })
downloadingPageMessage = Ostavite ovaj tab otvorenim dok ne dobavimo vašu datoteku i dok je ne dešifrujemo. downloadingPageMessage = Ostavite ovaj tab otvorenim dok ne dobavimo vašu datoteku i dok je ne dešifrujemo.
@@ -75,7 +75,7 @@ fileTooBig = Ta datoteka je prevelika za otpremanje. Treba biti manja od { $size
linkExpiredAlt = Veza istekla linkExpiredAlt = Veza istekla
expiredPageHeader = Veza je istekla ili nikad nije postojala! expiredPageHeader = Veza je istekla ili nikad nije postojala!
notSupportedHeader = Vaš pretraživač nije podržan. notSupportedHeader = Vaš pretraživač nije podržan.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Firefox Send. Trebate probati drugi pretraživač. Preporučujemo Firefox! notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Firefox Send. Trebate probati drugi pretraživač. Preporučujemo Firefox!
notSupportedLink = Zašto moj pretraživač nije podržan? notSupportedLink = Zašto moj pretraživač nije podržan?
notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Firefox Send. Morate ažurirati vaš pretraživač. notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Firefox Send. Morate ažurirati vaš pretraživač.
@@ -83,7 +83,7 @@ updateFirefox = Ažuriraj Firefox
downloadFirefoxButtonSub = Besplatno preuzimanje downloadFirefoxButtonSub = Besplatno preuzimanje
uploadedFile = Datoteka uploadedFile = Datoteka
copyFileList = Kopiraj URL copyFileList = Kopiraj URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Ističe za expiryFileList = Ističe za
deleteFileList = Izbriši deleteFileList = Izbriši
nevermindButton = Zanemari nevermindButton = Zanemari
@@ -96,7 +96,7 @@ deletePopupCancel = Otkaži
deleteButtonHover = Izbriši deleteButtonHover = Izbriši
copyUrlHover = Kopiraj URL copyUrlHover = Kopiraj URL
footerLinkLegal = Pravno footerLinkLegal = Pravno
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = O Test Pilotu footerLinkAbout = O Test Pilotu
footerLinkPrivacy = Privatnost footerLinkPrivacy = Privatnost
footerLinkTerms = Uslovi footerLinkTerms = Uslovi
@@ -105,13 +105,17 @@ requirePasswordCheckbox = Zahtjevaj lozinku za preuzimanje ove datoteke
addPasswordButton = Dodaj lozinku addPasswordButton = Dodaj lozinku
changePasswordButton = Promijeni changePasswordButton = Promijeni
passwordTryAgain = Netačna lozinka. Pokušajte ponovo. passwordTryAgain = Netačna lozinka. Pokušajte ponovo.
// This label is followed by the password needed to download a file
passwordResult = Lozinka: { $password }
reportIPInfringement = Prijavite IP prekršaj reportIPInfringement = Prijavite IP prekršaj
javascriptRequired = Firefox Send zahtjeva JavaScript javascriptRequired = Firefox Send zahtjeva JavaScript
whyJavascript = Zašto Firefox Send zahtjeva JavaScript? whyJavascript = Zašto Firefox Send zahtjeva JavaScript?
enableJavascript = Molimo omogućite JavaScript i pokušajte ponovo. enableJavascript = Molimo omogućite JavaScript i pokušajte ponovo.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m expiresHoursMinutes = { $hours }h { $minutes }m
// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Lozinka postavljena
# A short status message shown when the user enters a long password
maxPasswordLength = Maksimalna veličina lozinke: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Ova lozinka se ne može postaviti

View File

@@ -1,4 +1,4 @@
// 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 = experiment web siteSubtitle = experiment web
siteFeedback = Comentaris siteFeedback = Comentaris
@@ -39,23 +39,29 @@ copyUrlFormButton = Copia al porta-retalls
copiedUrl = Copiat! copiedUrl = Copiat!
deleteFileButton = Suprimeix el fitxer deleteFileButton = Suprimeix el fitxer
sendAnotherFileLink = Envieu un altre fitxer sendAnotherFileLink = Envieu un altre fitxer
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Baixa downloadAltText = Baixa
downloadsFileList = Baixades
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = Temps
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = Baixeu { $filename } downloadFileName = Baixeu { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Introduïu la contrasenya unlockInputLabel = Introduïu la contrasenya
unlockInputPlaceholder = Contrasenya unlockInputPlaceholder = Contrasenya
unlockButtonLabel = Desbloca unlockButtonLabel = Desbloca
downloadFileTitle = Baixa el fitxer xifrat downloadFileTitle = Baixa el fitxer xifrat
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Un amic us ha enviat un fitxer amb el Firefox Send, un servei que permet compartir fitxers mitjançant un enllaç segur, privat i xifrat que caduca automàticament per tal que les vostres dades no es conservin a Internet per sempre. downloadMessage = Un amic us ha enviat un fitxer amb el Firefox Send, un servei que permet compartir fitxers mitjançant un enllaç segur, privat i xifrat que caduca automàticament per tal que les vostres dades no es conservin a Internet per sempre.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Baixa downloadButtonLabel = Baixa
downloadNotification = La baixada ha acabat. downloadNotification = La baixada ha acabat.
downloadFinish = Ha acabat la baixada downloadFinish = Ha acabat la baixada
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } de { $totalSize }) fileSizeProgress = ({ $partialSize } de { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Proveu el Firefox Send sendYourFilesLink = Proveu el Firefox Send
downloadingPageProgress = S'està baixant { $filename } ({ $size }) downloadingPageProgress = S'està baixant { $filename } ({ $size })
downloadingPageMessage = Deixeu aquesta pestanya oberta per tal que el fitxer es pugui baixar i desxifrar. downloadingPageMessage = Deixeu aquesta pestanya oberta per tal que el fitxer es pugui baixar i desxifrar.
@@ -67,7 +73,7 @@ fileTooBig = Aquest fitxer és massa gros per pujar-lo. Ha de tenir menys de { $
linkExpiredAlt = L'enllaç ha caducat linkExpiredAlt = L'enllaç ha caducat
expiredPageHeader = Aquest enllaç ha caducat o no existeix. expiredPageHeader = Aquest enllaç ha caducat o no existeix.
notSupportedHeader = El vostre navegador no és compatible. notSupportedHeader = El vostre navegador no és compatible.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Aquest navegador no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'utilitzar un altre navegador. Us recomanem el Firefox! notSupportedDetail = Aquest navegador no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'utilitzar un altre navegador. Us recomanem el Firefox!
notSupportedLink = Per què el meu navegador no és compatible? notSupportedLink = Per què el meu navegador no és compatible?
notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'actualitzar el navegador. notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'actualitzar el navegador.
@@ -75,7 +81,7 @@ updateFirefox = Actualitza el Firefox
downloadFirefoxButtonSub = Baixada gratuïta downloadFirefoxButtonSub = Baixada gratuïta
uploadedFile = Fitxer uploadedFile = Fitxer
copyFileList = Copia l'URL copyFileList = Copia l'URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Caduca d'aquí expiryFileList = Caduca d'aquí
deleteFileList = Suprimeix deleteFileList = Suprimeix
nevermindButton = No, gràcies nevermindButton = No, gràcies
@@ -88,14 +94,24 @@ deletePopupCancel = Cancel·la
deleteButtonHover = Suprimeix deleteButtonHover = Suprimeix
copyUrlHover = Copia l'URL copyUrlHover = Copia l'URL
footerLinkLegal = Avís legal footerLinkLegal = Avís legal
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Quant al Test Pilot footerLinkAbout = Quant al Test Pilot
footerLinkPrivacy = Privadesa footerLinkPrivacy = Privadesa
footerLinkTerms = Condicions d'ús footerLinkTerms = Condicions d'ús
footerLinkCookies = Galetes footerLinkCookies = Galetes
requirePasswordCheckbox = Sol·licita una contrasenya per baixar aquest fitxer requirePasswordCheckbox = Sol·licita una contrasenya per baixar aquest fitxer
addPasswordButton = Afegeix una contrasenya addPasswordButton = Afegeix una contrasenya
changePasswordButton = Canvia
passwordTryAgain = La contrasenya és incorrecta. Torneu-ho a provar. passwordTryAgain = La contrasenya és incorrecta. Torneu-ho a provar.
// This label is followed by the password needed to download a file # This label is followed by the password needed to download a file
passwordResult = Contrasenya: { $password } passwordResult = Contrasenya: { $password }
reportIPInfringement = Denuncieu una infracció de propietat intel·lectual reportIPInfringement = Denuncieu una infracció de propietat intel·lectual
javascriptRequired = El Firefox Send necessita JavaScript
whyJavascript = Per què el Firefox Send necessita JavaScript?
enableJavascript = Activeu el JavaScript i torneu-ho a provar.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
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 a password is successfully set
passwordIsSet = S'ha definit la contrasenya

View File

@@ -1,4 +1,4 @@
// 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 = ajk'amaya'l solna'onem siteSubtitle = ajk'amaya'l solna'onem
siteFeedback = Rutzijol siteFeedback = Rutzijol
@@ -39,29 +39,29 @@ copyUrlFormButton = Tiwachib'ëx pa molwuj
copiedUrl = ¡Xwachib'ëx! copiedUrl = ¡Xwachib'ëx!
deleteFileButton = Tiyuj yakb'äl deleteFileButton = Tiyuj yakb'äl
sendAnotherFileLink = Titaq jun chik yakb'äl sendAnotherFileLink = Titaq jun chik yakb'äl
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Tiqasäx downloadAltText = Tiqasäx
downloadsFileList = Taq qasanïk downloadsFileList = Taq qasanïk
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Q'ijul timeFileList = Q'ijul
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = Tiqasäx { $filename } downloadFileName = Tiqasäx { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Titz'ib'äx Ewan Tzij unlockInputLabel = Titz'ib'äx Ewan Tzij
unlockInputPlaceholder = Ewan tzij unlockInputPlaceholder = Ewan tzij
unlockButtonLabel = Titzij chik unlockButtonLabel = Titzij chik
downloadFileTitle = Tiqasäx Yakb'äl Ewan Rusik'ixik downloadFileTitle = Tiqasäx Yakb'äl Ewan Rusik'ixik
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Jun awachib'il xutäq jun yakb'äl chawe rik'in ri Firefox Send, jun samaj ri nuya' q'ij chawe ye'akomonij taq yakb'äl rik'in jun jikïl, ichinan chuqa' ewan rusik'ixik ximonel, ri nik'is ruq'ijul pa ruyonil richin chi ri taq awachinaq man junelïk ta e okel pa k'amab'ey. downloadMessage = Jun awachib'il xutäq jun yakb'äl chawe rik'in ri Firefox Send, jun samaj ri nuya' q'ij chawe ye'akomonij taq yakb'äl rik'in jun jikïl, ichinan chuqa' ewan rusik'ixik ximonel, ri nik'is ruq'ijul pa ruyonil richin chi ri taq awachinaq man junelïk ta e okel pa k'amab'ey.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Tiqasäx downloadButtonLabel = Tiqasäx
downloadNotification = Xtz'aqät ri aqasanik. downloadNotification = Xtz'aqät ri aqasanik.
downloadFinish = Xtz'aqät qasanïk downloadFinish = Xtz'aqät qasanïk
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } richin { $totalSize }) fileSizeProgress = ({ $partialSize } richin { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Titojtob'ëx Firefox Send sendYourFilesLink = Titojtob'ëx Firefox Send
downloadingPageProgress = Tajin niqasäx { $filename } ({ $size }) downloadingPageProgress = Tajin niqasäx { $filename } ({ $size })
downloadingPageMessage = Tijaq kan re ruwi' re' richin niqaqasaj ri yakb'äl chuqa' richin niqetamaj rusik'ixik. downloadingPageMessage = Tijaq kan re ruwi' re' richin niqaqasaj ri yakb'äl chuqa' richin niqetamaj rusik'ixik.
@@ -73,7 +73,7 @@ fileTooBig = Yalan nïm re yakb'äl re' richin nijotob'äx. K'o ta chi man nik'o
linkExpiredAlt = Xk'is ruq'ijul ri ximonel linkExpiredAlt = Xk'is ruq'ijul ri ximonel
expiredPageHeader = ¡Xk'is ruq'ijul re ximonel re' o rik'in jub'a' majub'ey xk'oje'! expiredPageHeader = ¡Xk'is ruq'ijul re ximonel re' o rik'in jub'a' majub'ey xk'oje'!
notSupportedHeader = Man koch'el ta ri awokik'amaya'l. notSupportedHeader = Man koch'el ta ri awokik'amaya'l.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = K'ayew ruma re okik'amaya'l re' man nuköch' ta ajk'amaya'l na'ob'äl nik'atzin chi re ri Firefox Send. K'o chi natojtob'ej jun chik okik'amaya'l. ¡Niqachilab'ej chawe ri Firefox! notSupportedDetail = K'ayew ruma re okik'amaya'l re' man nuköch' ta ajk'amaya'l na'ob'äl nik'atzin chi re ri Firefox Send. K'o chi natojtob'ej jun chik okik'amaya'l. ¡Niqachilab'ej chawe ri Firefox!
notSupportedLink = ¿Achike ruma man nikoch' taq ri wokik'amaya'l? notSupportedLink = ¿Achike ruma man nikoch' taq ri wokik'amaya'l?
notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Firefox Send. Rajowaxik nak'ëx ri awokik'amaya'l. notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Firefox Send. Rajowaxik nak'ëx ri awokik'amaya'l.
@@ -81,7 +81,7 @@ updateFirefox = Tik'ex ri Firefox
downloadFirefoxButtonSub = Sipan Ruqasaxik downloadFirefoxButtonSub = Sipan Ruqasaxik
uploadedFile = Yakb'äl uploadedFile = Yakb'äl
copyFileList = Tiwachib'ëx URL copyFileList = Tiwachib'ëx URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Nik'is Ruq'ijul Pa expiryFileList = Nik'is Ruq'ijul Pa
deleteFileList = Tiyuj deleteFileList = Tiyuj
nevermindButton = Junam nub'än nevermindButton = Junam nub'än
@@ -94,7 +94,7 @@ deletePopupCancel = Tiq'at
deleteButtonHover = Tiyuj deleteButtonHover = Tiyuj
copyUrlHover = Tiwachib'ëx URL copyUrlHover = Tiwachib'ëx URL
footerLinkLegal = Taqanel tzijol footerLinkLegal = Taqanel tzijol
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Chi rij Test Pilot footerLinkAbout = Chi rij Test Pilot
footerLinkPrivacy = Ichinanem footerLinkPrivacy = Ichinanem
footerLinkTerms = Taq ojqanem footerLinkTerms = Taq ojqanem
@@ -103,13 +103,17 @@ requirePasswordCheckbox = Tik'utüx jun ewan tzij richin niqasäx re yakb'äl re
addPasswordButton = Titz'aqatisäx Ewan Tzij addPasswordButton = Titz'aqatisäx Ewan Tzij
changePasswordButton = Tijalwachïx changePasswordButton = Tijalwachïx
passwordTryAgain = Itzel ri ewan tzij. Tatojtob'ej chik. passwordTryAgain = Itzel ri ewan tzij. Tatojtob'ej chik.
// This label is followed by the password needed to download a file
passwordResult = Ewan tzij: { $password }
reportIPInfringement = Tiya' rutzijol ri Ritzelanik Ajna'oj Ichinil reportIPInfringement = Tiya' rutzijol ri Ritzelanik Ajna'oj Ichinil
javascriptRequired = K'atzinel JavaScript chi re ri Firefox Send javascriptRequired = K'atzinel JavaScript chi re ri Firefox Send
whyJavascript = whyJavascript = ¿Achike ruma toq ri Firefox Send nrajo' JavaScript?
enableJavascript = Titz'ij JavaScript richin nitojtob'ëx chik. enableJavascript = Titz'ij JavaScript richin nitojtob'ëx chik.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }r { $minutes }ch expiresHoursMinutes = { $hours }r { $minutes }ch
// 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 }ch expiresMinutes = { $minutes }ch
# A short status message shown when a password is successfully set
passwordIsSet = Xjikib'äx ewan tzij
# A short status message shown when the user enters a long password
maxPasswordLength = Nïm raqän ewan tzij: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Man tikirel ta ninuk' re ewan tzij re'

View File

@@ -1,4 +1,4 @@
// 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 = webový experiment siteSubtitle = webový experiment
siteFeedback = Zpětná vazba siteFeedback = Zpětná vazba
@@ -41,25 +41,29 @@ copyUrlFormButton = Zkopírovat do schránky
copiedUrl = Zkopírováno! copiedUrl = Zkopírováno!
deleteFileButton = Smazat soubor deleteFileButton = Smazat soubor
sendAnotherFileLink = Poslat další soubor sendAnotherFileLink = Poslat další soubor
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Stáhnout downloadAltText = Stáhnout
downloadsFileList = Stažení downloadsFileList = Stažení
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = Zbývá timeFileList = Zbývá
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = Stáhnout { $filename } downloadFileName = Stáhnout { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Zadejte heslo unlockInputLabel = Zadejte heslo
unlockInputPlaceholder = Heslo unlockInputPlaceholder = Heslo
unlockButtonLabel = Odemknout unlockButtonLabel = Odemknout
downloadFileTitle = Stáhnout šifrovaný soubor downloadFileTitle = Stáhnout šifrovaný soubor
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Někdo vám posílá soubor pomocí služby Firefox Send, které umožňuje bezpečné, soukromé a šifrované sdílení souborů, které jsou pak automaticky smazány, aby nezůstaly na internetu navěky. downloadMessage = Někdo vám posílá soubor pomocí služby Firefox Send, které umožňuje bezpečné, soukromé a šifrované sdílení souborů, které jsou pak automaticky smazány, aby nezůstaly na internetu navěky.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Stáhnout downloadButtonLabel = Stáhnout
downloadNotification = Stahování bylo dokončeno. downloadNotification = Stahování bylo dokončeno.
downloadFinish = Stahování dokončeno downloadFinish = Stahování dokončeno
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } z { $totalSize }) fileSizeProgress = ({ $partialSize } z { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Vyzkoušejte Firefox Send sendYourFilesLink = Vyzkoušejte Firefox Send
downloadingPageProgress = Stahování { $filename } ({ $size }) downloadingPageProgress = Stahování { $filename } ({ $size })
downloadingPageMessage = Ponechte prosím tento panel otevřený, dokud nepřipravíme váš soubor a nedešifrujeme ho. downloadingPageMessage = Ponechte prosím tento panel otevřený, dokud nepřipravíme váš soubor a nedešifrujeme ho.
@@ -71,7 +75,7 @@ fileTooBig = Tento soubor je příliš veliký. Velikost nahrávaných souborů
linkExpiredAlt = Platnost odkazu vypršela linkExpiredAlt = Platnost odkazu vypršela
expiredPageHeader = Platnost tohoto odkazu buď vypršela, nebo vůbec nikdy neexistoval. expiredPageHeader = Platnost tohoto odkazu buď vypršela, nebo vůbec nikdy neexistoval.
notSupportedHeader = Váš prohlížeč není podporován. notSupportedHeader = Váš prohlížeč není podporován.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Bohužel tento prohlížeč nepodporuje technologii, kterou Firefox Send používá. Zkuste prosím jiný prohlížeč, doporučujeme Firefox! notSupportedDetail = Bohužel tento prohlížeč nepodporuje technologii, kterou Firefox Send používá. Zkuste prosím jiný prohlížeč, doporučujeme Firefox!
notSupportedLink = Proč není můj prohlížeč podporovaný? notSupportedLink = Proč není můj prohlížeč podporovaný?
notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Firefox Send. Musíte aktualizovat svůj prohlížeč. notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Firefox Send. Musíte aktualizovat svůj prohlížeč.
@@ -79,7 +83,7 @@ updateFirefox = Aktualizovat Firefox
downloadFirefoxButtonSub = Stáhnout zdarma downloadFirefoxButtonSub = Stáhnout zdarma
uploadedFile = Soubor uploadedFile = Soubor
copyFileList = Kopírovat URL copyFileList = Kopírovat URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Platnost vyprší za expiryFileList = Platnost vyprší za
deleteFileList = Smazat deleteFileList = Smazat
nevermindButton = Nevadí nevermindButton = Nevadí
@@ -92,7 +96,7 @@ deletePopupCancel = Zrušit
deleteButtonHover = Smazat deleteButtonHover = Smazat
copyUrlHover = Kopírovat URL copyUrlHover = Kopírovat URL
footerLinkLegal = Právní informace footerLinkLegal = Právní informace
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = O programu Test Pilot footerLinkAbout = O programu Test Pilot
footerLinkPrivacy = Soukromí footerLinkPrivacy = Soukromí
footerLinkTerms = Podmínky footerLinkTerms = Podmínky
@@ -101,6 +105,17 @@ requirePasswordCheckbox = Vyžadovat heslo pro stažení tohoto souboru
addPasswordButton = Přidat heslo addPasswordButton = Přidat heslo
changePasswordButton = Změnit changePasswordButton = Změnit
passwordTryAgain = Špatné heslo. Zkuste to znovu. passwordTryAgain = Špatné heslo. Zkuste to znovu.
// This label is followed by the password needed to download a file
passwordResult = Heslo: { $password }
reportIPInfringement = Nahlásit porušení autorských práv reportIPInfringement = Nahlásit porušení autorských práv
javascriptRequired = Firefox Send vyžaduje povolený JavaScript
whyJavascript = Proč Firefox Send vyžaduje povolený JavaScript?
enableJavascript = Povolte JavaScript a zkuste to znovu.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Heslo nastaveno
# A short status message shown when the user enters a long password
maxPasswordLength = Maximální délka hesla: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Toto heslo nemohlo být nastaveno

View File

@@ -1,4 +1,4 @@
// 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 = arbrawf gwe siteSubtitle = arbrawf gwe
siteFeedback = Adborth siteFeedback = Adborth
@@ -43,25 +43,29 @@ copyUrlFormButton = Copïo i'r clipfwrdd
copiedUrl = Wedi eu copïo! copiedUrl = Wedi eu copïo!
deleteFileButton = Dileu ffeil deleteFileButton = Dileu ffeil
sendAnotherFileLink = Anfon ffeil arall sendAnotherFileLink = Anfon ffeil arall
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Llwytho i lawr downloadAltText = Llwytho i lawr
downloadsFileList = Llwythi downloadsFileList = Llwythi
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = Amser timeFileList = Amser
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = Llwytho i lawr { $filename } downloadFileName = Llwytho i lawr { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Rhowch Gyfrinair unlockInputLabel = Rhowch Gyfrinair
unlockInputPlaceholder = Cyfrinair unlockInputPlaceholder = Cyfrinair
unlockButtonLabel = Datgloi unlockButtonLabel = Datgloi
downloadFileTitle = Llwythwch Ffeil wedi ei Hamgryptio i Lawr downloadFileTitle = Llwythwch Ffeil wedi ei Hamgryptio i Lawr
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Mae ffrind i chi yn anfon ffeil atoch drwy Firefox Send, gwasanaeth sy'n caniatáu i chi rannu ffeiliau drwy ddolen ddiogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich deunydd yn aros ar-lein am byth. downloadMessage = Mae ffrind i chi yn anfon ffeil atoch drwy Firefox Send, gwasanaeth sy'n caniatáu i chi rannu ffeiliau drwy ddolen ddiogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich deunydd yn aros ar-lein am byth.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Llwytho i Lawr downloadButtonLabel = Llwytho i Lawr
downloadNotification = Mae eich llwytho wedi gorffen downloadNotification = Mae eich llwytho wedi gorffen
downloadFinish = Llwytho wedi Gorffen downloadFinish = Llwytho wedi Gorffen
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } o { $totalSize }) fileSizeProgress = ({ $partialSize } o { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Rhowch gynnig ar Firefox Send sendYourFilesLink = Rhowch gynnig ar Firefox Send
downloadingPageProgress = Llwytho i lawr { $filename } ({ $size }) downloadingPageProgress = Llwytho i lawr { $filename } ({ $size })
downloadingPageMessage = Gadewch y tab yma ar agor tra fyddwn yn estyn eich ffeil a'i dad-amgryptio. downloadingPageMessage = Gadewch y tab yma ar agor tra fyddwn yn estyn eich ffeil a'i dad-amgryptio.
@@ -73,7 +77,7 @@ fileTooBig = Mae'r ffeil yn rhy fawr i'w llwytho. Dylai fod yn llai na { $size }
linkExpiredAlt = Mae'r ddolen wedi dod i ben linkExpiredAlt = Mae'r ddolen wedi dod i ben
expiredPageHeader = Mae'r ddolen wedi dod i ben neu nad yw wedi bodoli erioed! expiredPageHeader = Mae'r ddolen wedi dod i ben neu nad yw wedi bodoli erioed!
notSupportedHeader = Nid yw eich porwr yn cael ei gynnal. notSupportedHeader = Nid yw eich porwr yn cael ei gynnal.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Yn anffodus, nid yw'r porwr hwn yn cynnal y technoleg gwe sy'n cynnal Firefox Send. Bydd angen i chi ddefnyddio porwr arall. Rydym ni'n argymell Firefox! notSupportedDetail = Yn anffodus, nid yw'r porwr hwn yn cynnal y technoleg gwe sy'n cynnal Firefox Send. Bydd angen i chi ddefnyddio porwr arall. Rydym ni'n argymell Firefox!
notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal? notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal?
notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Firefox Send. Bydd angen i chi ddiweddaru eich porwr. notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Firefox Send. Bydd angen i chi ddiweddaru eich porwr.
@@ -81,7 +85,7 @@ updateFirefox = Diweddaru Firefox
downloadFirefoxButtonSub = Llwytho i Lawr am Ddim downloadFirefoxButtonSub = Llwytho i Lawr am Ddim
uploadedFile = Ffeil uploadedFile = Ffeil
copyFileList = Copïo URL copyFileList = Copïo URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Daw i ben ymhen expiryFileList = Daw i ben ymhen
deleteFileList = Dileu deleteFileList = Dileu
nevermindButton = Dim ots nevermindButton = Dim ots
@@ -94,7 +98,7 @@ deletePopupCancel = Diddymu
deleteButtonHover = Dileu deleteButtonHover = Dileu
copyUrlHover = Copïo'r URL copyUrlHover = Copïo'r URL
footerLinkLegal = Cyfreithiol footerLinkLegal = Cyfreithiol
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Ynghylch Test Pilot footerLinkAbout = Ynghylch Test Pilot
footerLinkPrivacy = Preifatrwydd footerLinkPrivacy = Preifatrwydd
footerLinkTerms = Amodau footerLinkTerms = Amodau
@@ -103,6 +107,17 @@ requirePasswordCheckbox = Gosod angen cyfrinair i lwytho'r ffeil hon i lawr
addPasswordButton = Ychwanegu Cyfrinair addPasswordButton = Ychwanegu Cyfrinair
changePasswordButton = Newid changePasswordButton = Newid
passwordTryAgain = Cyfrinair anghywir. Ceisiwch eto. passwordTryAgain = Cyfrinair anghywir. Ceisiwch eto.
// This label is followed by the password needed to download a file
passwordResult = Cyfrinair: { $password }
reportIPInfringement = Adrodd ar Gamddefnydd o'r IP reportIPInfringement = Adrodd ar Gamddefnydd o'r IP
javascriptRequired = Mae Firefox Send angen JavaScript
whyJavascript = Pam fod Firefox Send angen JavaScript?
enableJavascript = Galluogwch JavaScript a cheisio eto.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }a { $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 a password is successfully set
passwordIsSet = Wedi gosod y cyfrinair
# A short status message shown when the user enters a long password
maxPasswordLength = Hyd mwyaf cyfrinair: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Nid oedd modd gosod y cyfrinair hwn

View File

@@ -1,4 +1,4 @@
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
title = Firefox Send title = Firefox Send
siteSubtitle = Web-Experiment siteSubtitle = Web-Experiment
siteFeedback = Feedback siteFeedback = Feedback
@@ -39,29 +39,29 @@ copyUrlFormButton = In Zwischenablage kopieren
copiedUrl = Kopiert! copiedUrl = Kopiert!
deleteFileButton = Datei löschen deleteFileButton = Datei löschen
sendAnotherFileLink = Eine weitere Datei senden sendAnotherFileLink = Eine weitere Datei senden
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Herunterladen downloadAltText = Herunterladen
downloadsFileList = Downloads downloadsFileList = Downloads
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Zeit timeFileList = Zeit
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = { $filename } herunterladen downloadFileName = { $filename } herunterladen
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Passwort eingeben unlockInputLabel = Passwort eingeben
unlockInputPlaceholder = Passwort unlockInputPlaceholder = Passwort
unlockButtonLabel = Entsperren unlockButtonLabel = Entsperren
downloadFileTitle = Verschlüsselte Datei herunterladen downloadFileTitle = Verschlüsselte Datei herunterladen
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Ihr Freund schickt Ihnen eine Datei mit Firefox Send, einem Dienst, mit dem Sie Dateien über einen sicheren, privaten und verschlüsselten Link teilen können, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben. downloadMessage = Ihr Freund schickt Ihnen eine Datei mit Firefox Send, einem Dienst, mit dem Sie Dateien über einen sicheren, privaten und verschlüsselten Link teilen können, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Herunterladen downloadButtonLabel = Herunterladen
downloadNotification = Der Download wurde abgeschlossen. downloadNotification = Der Download wurde abgeschlossen.
downloadFinish = Download abgeschlossen downloadFinish = Download abgeschlossen
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } von { $totalSize }) fileSizeProgress = ({ $partialSize } von { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Firefox Send ausprobieren sendYourFilesLink = Firefox Send ausprobieren
downloadingPageProgress = { $filename } ({ $size }) wird heruntergeladen downloadingPageProgress = { $filename } ({ $size }) wird heruntergeladen
downloadingPageMessage = Bitte lassen Sie diesen Tab geöffnet, während Ihre Datei heruntergeladen und entschlüsselt wird. downloadingPageMessage = Bitte lassen Sie diesen Tab geöffnet, während Ihre Datei heruntergeladen und entschlüsselt wird.
@@ -73,7 +73,7 @@ fileTooBig = Die Datei ist zu groß zum Hochladen. Sie sollte maximal { $size }
linkExpiredAlt = Link abgelaufen linkExpiredAlt = Link abgelaufen
expiredPageHeader = Dieser Link ist abgelaufen oder hat nie existiert! expiredPageHeader = Dieser Link ist abgelaufen oder hat nie existiert!
notSupportedHeader = Ihr Browser wird nicht unterstützt. notSupportedHeader = Ihr Browser wird nicht unterstützt.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Leider unterstützt dieser Browser die Web-Technologie nicht, auf der Firefox Send basiert. Sie benötigen einen anderen Browser. Wir empfehlen Firefox! notSupportedDetail = Leider unterstützt dieser Browser die Web-Technologie nicht, auf der Firefox Send basiert. Sie benötigen einen anderen Browser. Wir empfehlen Firefox!
notSupportedLink = Warum wird mein Browser nicht unterstützt? notSupportedLink = Warum wird mein Browser nicht unterstützt?
notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Firefox Send basiert. Sie müssen Ihren Browser aktualisieren. notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Firefox Send basiert. Sie müssen Ihren Browser aktualisieren.
@@ -81,7 +81,7 @@ updateFirefox = Firefox aktualisieren
downloadFirefoxButtonSub = Kostenloser Download downloadFirefoxButtonSub = Kostenloser Download
uploadedFile = Datei uploadedFile = Datei
copyFileList = Adresse kopieren copyFileList = Adresse kopieren
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Läuft ab in expiryFileList = Läuft ab in
deleteFileList = Löschen deleteFileList = Löschen
nevermindButton = Egal nevermindButton = Egal
@@ -94,7 +94,7 @@ deletePopupCancel = Abbrechen
deleteButtonHover = Löschen deleteButtonHover = Löschen
copyUrlHover = Adresse kopieren copyUrlHover = Adresse kopieren
footerLinkLegal = Rechtliches footerLinkLegal = Rechtliches
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Über Test Pilot footerLinkAbout = Über Test Pilot
footerLinkPrivacy = Datenschutz footerLinkPrivacy = Datenschutz
footerLinkTerms = Nutzungsbedingungen footerLinkTerms = Nutzungsbedingungen
@@ -103,13 +103,17 @@ requirePasswordCheckbox = Zum Herunterladen dieser Datei soll ein Passwort erfor
addPasswordButton = Passwort hinzufügen addPasswordButton = Passwort hinzufügen
changePasswordButton = Ändern changePasswordButton = Ändern
passwordTryAgain = Falsches Passwort. Versuchen Sie es erneut. passwordTryAgain = Falsches Passwort. Versuchen Sie es erneut.
// This label is followed by the password needed to download a file
passwordResult = Passwort: { $password }
reportIPInfringement = IP-Verletzung melden reportIPInfringement = IP-Verletzung melden
javascriptRequired = Firefox Send benötigt JavaScript javascriptRequired = Firefox Send benötigt JavaScript
whyJavascript = Warum benötigt Firefox Send JavaScript? whyJavascript = Warum benötigt Firefox Send JavaScript?
enableJavascript = Bitte akivieren Sie JavaScript und versuchen Sie es erneut. enableJavascript = Bitte akivieren Sie JavaScript und versuchen Sie es erneut.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m expiresHoursMinutes = { $hours }h { $minutes }m
// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Passwort gesetzt
# A short status message shown when the user enters a long password
maxPasswordLength = Maximale Passwortlänge: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Dieses Passwort konnte nicht eingerichtet werden

View File

@@ -1,4 +1,4 @@
// 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 = webeksperiment siteSubtitle = webeksperiment
siteFeedback = Komentar siteFeedback = Komentar
@@ -43,29 +43,29 @@ copyUrlFormButton = Do mjazywótkłada kopěrowaś
copiedUrl = Kopěrowany! copiedUrl = Kopěrowany!
deleteFileButton = Dataju wulašowaś deleteFileButton = Dataju wulašowaś
sendAnotherFileLink = Drugu dataju pósłaś sendAnotherFileLink = Drugu dataju pósłaś
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Ześěgnuś downloadAltText = Ześěgnuś
downloadsFileList = Ześěgnjenja downloadsFileList = Ześěgnjenja
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Cas timeFileList = Cas
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = { $filename } ześěgnuś downloadFileName = { $filename } ześěgnuś
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Gronidło zapódaś unlockInputLabel = Gronidło zapódaś
unlockInputPlaceholder = Gronidło unlockInputPlaceholder = Gronidło
unlockButtonLabel = Wótwóriś unlockButtonLabel = Wótwóriś
downloadFileTitle = Skoděrowanu dataju ześěgnuś downloadFileTitle = Skoděrowanu dataju ześěgnuś
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Waš pśijaśel wam dataju z Firefox Send sćelo, słužba, kótaraž wam zmóžnja, dataje pśez wěsty, priwatny a skoděrowany wótkaz źěliś, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali. downloadMessage = Waš pśijaśel wam dataju z Firefox Send sćelo, słužba, kótaraž wam zmóžnja, dataje pśez wěsty, priwatny a skoděrowany wótkaz źěliś, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Ześěgnuś downloadButtonLabel = Ześěgnuś
downloadNotification = Wašo ześěgnjenje jo dokóńcone. downloadNotification = Wašo ześěgnjenje jo dokóńcone.
downloadFinish = Ześěgnjenje dokóńcone downloadFinish = Ześěgnjenje dokóńcone
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } z { $totalSize }) fileSizeProgress = ({ $partialSize } z { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Firefox Send wopytaś sendYourFilesLink = Firefox Send wopytaś
downloadingPageProgress = { $filename } ({ $size }) se ześěgujo downloadingPageProgress = { $filename } ({ $size }) se ześěgujo
downloadingPageMessage = Pšosym wóstajśo toś ten rejtark wócynjony, mjaztym až wašu dataju ześěgujomy a dešifrěrujomy. downloadingPageMessage = Pšosym wóstajśo toś ten rejtark wócynjony, mjaztym až wašu dataju ześěgujomy a dešifrěrujomy.
@@ -77,7 +77,7 @@ fileTooBig = Toś ta dataja jo pśewjelika za nagraśe. Měła mjeńša ako { $s
linkExpiredAlt = Wótkaz spadnjony linkExpiredAlt = Wótkaz spadnjony
expiredPageHeader = Toś ten wótkaz jo spadnjony abo njejo nigda eksistěrował! expiredPageHeader = Toś ten wótkaz jo spadnjony abo njejo nigda eksistěrował!
notSupportedHeader = Waš wobglědowak se njepódpěra. notSupportedHeader = Waš wobglědowak se njepódpěra.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Bóžko toś ten wobglědowak webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo drugi wobglědowak wužywaś. My Firefox dopórucujomy! notSupportedDetail = Bóžko toś ten wobglědowak webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo drugi wobglědowak wužywaś. My Firefox dopórucujomy!
notSupportedLink = Cogodla se mój wobglědowak njepódpěra? notSupportedLink = Cogodla se mój wobglědowak njepódpěra?
notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś. notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś.
@@ -85,7 +85,7 @@ updateFirefox = Firefox aktualizěrowaś
downloadFirefoxButtonSub = Dermotne ześěgnjenje downloadFirefoxButtonSub = Dermotne ześěgnjenje
uploadedFile = Dataja uploadedFile = Dataja
copyFileList = URL kopěrowaś copyFileList = URL kopěrowaś
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Spadnjo za expiryFileList = Spadnjo za
deleteFileList = Wulašowaś deleteFileList = Wulašowaś
nevermindButton = Wšojadno nevermindButton = Wšojadno
@@ -98,7 +98,7 @@ deletePopupCancel = Pśetergnuś
deleteButtonHover = Wulašowaś deleteButtonHover = Wulašowaś
copyUrlHover = URL kopěrowaś copyUrlHover = URL kopěrowaś
footerLinkLegal = Pšawniske footerLinkLegal = Pšawniske
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Wó Test Pilot footerLinkAbout = Wó Test Pilot
footerLinkPrivacy = Priwatnosć footerLinkPrivacy = Priwatnosć
footerLinkTerms = Wuměnjenja footerLinkTerms = Wuměnjenja
@@ -107,13 +107,17 @@ requirePasswordCheckbox = Gronidło za ześěgnjenje toś teje dataje pominaś
addPasswordButton = Gronidło pśidaś addPasswordButton = Gronidło pśidaś
changePasswordButton = Změniś changePasswordButton = Změniś
passwordTryAgain = Wopacne gronidło. Wopytajśo hyšći raz. passwordTryAgain = Wopacne gronidło. Wopytajśo hyšći raz.
// This label is followed by the password needed to download a file
passwordResult = Gronidło: { $password }
reportIPInfringement = Pśekśiwjenje IP k wěsći daś reportIPInfringement = Pśekśiwjenje IP k wěsći daś
javascriptRequired = Firefox Send JavaScript trjeba javascriptRequired = Firefox Send JavaScript trjeba
whyJavascript = Cogodla Firefox Send JavaScript trjeba? whyJavascript = Cogodla Firefox Send JavaScript trjeba?
enableJavascript = Pšosym zmóžniśo JavaScript a wopytajśo hyšći raz. enableJavascript = Pšosym zmóžniśo JavaScript a wopytajśo hyšći raz.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours } góź. { $minutes } min. expiresHoursMinutes = { $hours } góź. { $minutes } min.
// 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 } min. expiresMinutes = { $minutes } min.
# A short status message shown when a password is successfully set
passwordIsSet = Gronidło jo se nastajiło
# A short status message shown when the user enters a long password
maxPasswordLength = Maksimalna dłujkosć gronidła: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Toś to gronidło njedajo se nastajiś

View File

@@ -41,6 +41,12 @@ deleteFileButton = Διαγραφή αρχείου
sendAnotherFileLink = Αποστολή άλλου αρχείου sendAnotherFileLink = Αποστολή άλλου αρχείου
// Alternative text used on the download link/button (indicates an action). // Alternative text used on the download link/button (indicates an action).
downloadAltText = Λήψη 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 } downloadFileName = Λήψη του { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Εισαγωγή κωδικού πρόσβασης unlockInputLabel = Εισαγωγή κωδικού πρόσβασης
@@ -95,7 +101,15 @@ footerLinkTerms = Όροι
footerLinkCookies = Cookies footerLinkCookies = Cookies
requirePasswordCheckbox = Απαίτηση κωδικού πρόσβασης για λήψη του αρχείου requirePasswordCheckbox = Απαίτηση κωδικού πρόσβασης για λήψη του αρχείου
addPasswordButton = Προσθήκη κωδικού πρόσβασης addPasswordButton = Προσθήκη κωδικού πρόσβασης
changePasswordButton = Αλλαγή
passwordTryAgain = Λάθος κωδικός πρόσβασης. Δοκιμάστε ξανά. passwordTryAgain = Λάθος κωδικός πρόσβασης. Δοκιμάστε ξανά.
// This label is followed by the password needed to download a file // This label is followed by the password needed to download a file
passwordResult = Κωδικός πρόσβασης: { $password } passwordResult = Κωδικός πρόσβασης: { $password }
reportIPInfringement = Αναφορά παραβίασης IP reportIPInfringement = Αναφορά παραβίασης IP
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 }λ

View File

@@ -1,4 +1,4 @@
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
title = Firefox Send title = Firefox Send
siteSubtitle = web experiment siteSubtitle = web experiment
siteFeedback = Feedback siteFeedback = Feedback
@@ -39,29 +39,29 @@ copyUrlFormButton = Copy to clipboard
copiedUrl = Copied! copiedUrl = Copied!
deleteFileButton = Delete file deleteFileButton = Delete file
sendAnotherFileLink = Send another file sendAnotherFileLink = Send another file
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Download downloadAltText = Download
downloadsFileList = Downloads downloadsFileList = Downloads
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Time timeFileList = Time
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = Download { $filename } downloadFileName = Download { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Enter Password unlockInputLabel = Enter Password
unlockInputPlaceholder = Password unlockInputPlaceholder = Password
unlockButtonLabel = Unlock unlockButtonLabel = Unlock
downloadFileTitle = Download Encrypted File downloadFileTitle = Download Encrypted File
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Your friend is sending you a file with Firefox Send, a service that allows you to share files with a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever. downloadMessage = Your friend is sending you a file with Firefox Send, a service that allows you to share files with a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Download downloadButtonLabel = Download
downloadNotification = Your download has completed. downloadNotification = Your download has completed.
downloadFinish = Download Complete downloadFinish = Download Complete
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } of { $totalSize }) fileSizeProgress = ({ $partialSize } of { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Try Firefox Send sendYourFilesLink = Try Firefox Send
downloadingPageProgress = Downloading { $filename } ({ $size }) downloadingPageProgress = Downloading { $filename } ({ $size })
downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it. downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it.
@@ -73,7 +73,7 @@ fileTooBig = That file is too big to upload. It should be less than { $size }.
linkExpiredAlt = Link expired linkExpiredAlt = Link expired
expiredPageHeader = This link has expired or never existed in the first place! expiredPageHeader = This link has expired or never existed in the first place!
notSupportedHeader = Your browser is not supported. notSupportedHeader = Your browser is not supported.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Unfortunately this browser does not support the web technology that powers Firefox Send. Youll need to try another browser. We recommend Firefox! notSupportedDetail = Unfortunately this browser does not support the web technology that powers Firefox Send. Youll need to try another browser. We recommend Firefox!
notSupportedLink = Why is my browser not supported? notSupportedLink = Why is my browser not supported?
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. Youll need to update your browser. notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. Youll need to update your browser.
@@ -81,7 +81,7 @@ updateFirefox = Update Firefox
downloadFirefoxButtonSub = Free Download downloadFirefoxButtonSub = Free Download
uploadedFile = File uploadedFile = File
copyFileList = Copy URL copyFileList = Copy URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Expires In expiryFileList = Expires In
deleteFileList = Delete deleteFileList = Delete
nevermindButton = Never mind nevermindButton = Never mind
@@ -94,7 +94,7 @@ deletePopupCancel = Cancel
deleteButtonHover = Delete deleteButtonHover = Delete
copyUrlHover = Copy URL copyUrlHover = Copy URL
footerLinkLegal = Legal footerLinkLegal = Legal
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = About Test Pilot footerLinkAbout = About Test Pilot
footerLinkPrivacy = Privacy footerLinkPrivacy = Privacy
footerLinkTerms = Terms footerLinkTerms = Terms
@@ -103,13 +103,17 @@ requirePasswordCheckbox = Require a password to download this file
addPasswordButton = Add password addPasswordButton = Add password
changePasswordButton = Change changePasswordButton = Change
passwordTryAgain = Incorrect password. Try again. passwordTryAgain = Incorrect password. Try again.
// This label is followed by the password needed to download a file
passwordResult = Password: { $password }
reportIPInfringement = Report IP Infringement reportIPInfringement = Report IP Infringement
javascriptRequired = Firefox Send requires JavaScript javascriptRequired = Firefox Send requires JavaScript
whyJavascript = Why does Firefox Send require JavaScript? whyJavascript = Why does Firefox Send require JavaScript?
enableJavascript = Please enable JavaScript and try again. enableJavascript = Please enable JavaScript and try again.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m expiresHoursMinutes = { $hours }h { $minutes }m
// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Password set
# A short status message shown when the user enters a long password
maxPasswordLength = Maximum password length: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = This password could not be set

View File

@@ -1,4 +1,4 @@
// 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 = experimento web siteSubtitle = experimento web
siteFeedback = Comentario siteFeedback = Comentario
@@ -39,29 +39,29 @@ copyUrlFormButton = Copiar en el portapapeles
copiedUrl = ¡Copiado! copiedUrl = ¡Copiado!
deleteFileButton = Eliminar archivo deleteFileButton = Eliminar archivo
sendAnotherFileLink = Enviar otro archivo sendAnotherFileLink = Enviar otro archivo
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Descargar downloadAltText = Descargar
downloadsFileList = Descargas downloadsFileList = Descargas
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Fecha timeFileList = Fecha
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = Descargar { $filename } downloadFileName = Descargar { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Introducir contraseña unlockInputLabel = Introducir contraseña
unlockInputPlaceholder = Contraseña unlockInputPlaceholder = Contraseña
unlockButtonLabel = Desbloquear unlockButtonLabel = Desbloquear
downloadFileTitle = Descargar archivo encriptado downloadFileTitle = Descargar archivo encriptado
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida. downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Descargar downloadButtonLabel = Descargar
downloadNotification = Se completó la descarga. downloadNotification = Se completó la descarga.
downloadFinish = Descarga completa downloadFinish = Descarga completa
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } de { $totalSize }) fileSizeProgress = ({ $partialSize } de { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Prueba Firefox Send sendYourFilesLink = Prueba Firefox Send
downloadingPageProgress = Descargando { $filename } ({ $size }) downloadingPageProgress = Descargando { $filename } ({ $size })
downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos. downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos.
@@ -73,7 +73,7 @@ fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
linkExpiredAlt = Enlace caducado linkExpiredAlt = Enlace caducado
expiredPageHeader = ¡El enlace ha caducado o nunca existió! expiredPageHeader = ¡El enlace ha caducado o nunca existió!
notSupportedHeader = Tu navegador no está admitido. notSupportedHeader = Tu navegador no está admitido.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox! notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox!
notSupportedLink = ¿Por qué no se admite mi navegador? notSupportedLink = ¿Por qué no se admite mi navegador?
notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Firefox Send. Tendrás que actualizar tu navegador. notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Firefox Send. Tendrás que actualizar tu navegador.
@@ -81,7 +81,7 @@ updateFirefox = Actualizar Firefox
downloadFirefoxButtonSub = Descarga gratuita downloadFirefoxButtonSub = Descarga gratuita
uploadedFile = Archivo uploadedFile = Archivo
copyFileList = Copiar URL copyFileList = Copiar URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Caduca en expiryFileList = Caduca en
deleteFileList = Eliminar deleteFileList = Eliminar
nevermindButton = Da igual nevermindButton = Da igual
@@ -94,7 +94,7 @@ deletePopupCancel = Cancelar
deleteButtonHover = Eliminar deleteButtonHover = Eliminar
copyUrlHover = Copiar URL copyUrlHover = Copiar URL
footerLinkLegal = Legal footerLinkLegal = Legal
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Sobre Test Pilot footerLinkAbout = Sobre Test Pilot
footerLinkPrivacy = Privacidad footerLinkPrivacy = Privacidad
footerLinkTerms = Términos footerLinkTerms = Términos
@@ -103,6 +103,17 @@ requirePasswordCheckbox = Requerir una contraseña para descargar este archivo
addPasswordButton = Añadir contraseña addPasswordButton = Añadir contraseña
changePasswordButton = Cambiar changePasswordButton = Cambiar
passwordTryAgain = Contraseña incorrecta. Inténtelo de nuevo. passwordTryAgain = Contraseña incorrecta. Inténtelo de nuevo.
// This label is followed by the password needed to download a file
passwordResult = Contraseña: { $password }
reportIPInfringement = Denunciar vulneración de propiedad intelectual reportIPInfringement = Denunciar vulneración de propiedad intelectual
javascriptRequired = Firefox Send requiere JavaScript
whyJavascript = ¿Por qué Firefox Send requiere JavaScript?
enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Contraseña establecida
# A short status message shown when the user enters a long password
maxPasswordLength = Longitud máxima de la contraseña: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = No se ha podido establecer la contraseña

View File

@@ -1,4 +1,4 @@
// 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 = experimento web siteSubtitle = experimento web
siteFeedback = Comentario siteFeedback = Comentario
@@ -38,29 +38,29 @@ copyUrlFormButton = Copiar a portapapeles
copiedUrl = ¡Copiado! copiedUrl = ¡Copiado!
deleteFileButton = Eliminar archivo deleteFileButton = Eliminar archivo
sendAnotherFileLink = Enviar otro archivo sendAnotherFileLink = Enviar otro archivo
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Descargar downloadAltText = Descargar
downloadsFileList = Descargas downloadsFileList = Descargas
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Hora timeFileList = Hora
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = Descargar ($filename) downloadFileName = Descargar ($filename)
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Ingresar contraseña unlockInputLabel = Ingresar contraseña
unlockInputPlaceholder = Contraseña unlockInputPlaceholder = Contraseña
unlockButtonLabel = Desbloquear unlockButtonLabel = Desbloquear
downloadFileTitle = Descargar archivo encriptado downloadFileTitle = Descargar archivo encriptado
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y encriptado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida. downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y encriptado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Descargar downloadButtonLabel = Descargar
downloadNotification = Tu descarga se ha completado downloadNotification = Tu descarga se ha completado
downloadFinish = Descarga completa downloadFinish = Descarga completa
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } de { $totalSize }) fileSizeProgress = ({ $partialSize } de { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Prueba Firefox Send sendYourFilesLink = Prueba Firefox Send
downloadingPageProgress = Descargando { $filename } ({ $size }) downloadingPageProgress = Descargando { $filename } ({ $size })
downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos. downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos.
@@ -72,7 +72,7 @@ fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
linkExpiredAlt = Enlace caducado linkExpiredAlt = Enlace caducado
expiredPageHeader = ¡Este enlace ha caducado o nunca existió en primer lugar! expiredPageHeader = ¡Este enlace ha caducado o nunca existió en primer lugar!
notSupportedHeader = Tu navegador no está soportado. notSupportedHeader = Tu navegador no está soportado.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox! notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox!
notSupportedLink = ¿Por qué mi navegador no tiene soporte? notSupportedLink = ¿Por qué mi navegador no tiene soporte?
notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador. notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador.
@@ -80,7 +80,7 @@ updateFirefox = Actualizar Firefox
downloadFirefoxButtonSub = Descarga gratuita downloadFirefoxButtonSub = Descarga gratuita
uploadedFile = Archivo uploadedFile = Archivo
copyFileList = Copiar URL copyFileList = Copiar URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Caduca en expiryFileList = Caduca en
deleteFileList = Eliminar deleteFileList = Eliminar
nevermindButton = Da igual nevermindButton = Da igual
@@ -93,7 +93,7 @@ deletePopupCancel = Cancelar
deleteButtonHover = Eliminar deleteButtonHover = Eliminar
copyUrlHover = Copiar URL copyUrlHover = Copiar URL
footerLinkLegal = Legal footerLinkLegal = Legal
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Acerca de Test Pilot footerLinkAbout = Acerca de Test Pilot
footerLinkPrivacy = Privacidad footerLinkPrivacy = Privacidad
footerLinkTerms = Términos footerLinkTerms = Términos
@@ -102,13 +102,15 @@ requirePasswordCheckbox = Se necesita una contraseña para descargar este archiv
addPasswordButton = Agregar contraseña addPasswordButton = Agregar contraseña
changePasswordButton = Cambiar changePasswordButton = Cambiar
passwordTryAgain = Contraseña incorrecta. Intenta de nuevo. passwordTryAgain = Contraseña incorrecta. Intenta de nuevo.
// This label is followed by the password needed to download a file # This label is followed by the password needed to download a file
passwordResult = Contraseña: { $password } passwordResult = Contraseña: { $password }
reportIPInfringement = Denunciar una infracción de PI reportIPInfringement = Denunciar una infracción de PI
javascriptRequired = Firefox Send requiere JavaScript javascriptRequired = Firefox Send requiere JavaScript
whyJavascript = ¿Por qué Firefox Send requiere JavaScript? whyJavascript = ¿Por qué Firefox Send requiere JavaScript?
enableJavascript = Por favor, habilita JavaScript e intenta de nuevo. enableJavascript = Por favor, habilita JavaScript e intenta de nuevo.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m expiresHoursMinutes = { $hours }h { $minutes }m
// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Contraseña establecida

View File

@@ -25,6 +25,15 @@ uploadingFileNotification = Teavita mind üleslaadimise lõppemisest.
uploadSuccessConfirmHeader = Saatmiseks valmis uploadSuccessConfirmHeader = Saatmiseks valmis
uploadSvgAlt = Laadi üles uploadSvgAlt = Laadi üles
uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel. uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel.
expireInfo = Link failile aegub peale { $downloadCount } või { $timespan }.
downloadCount = { $num ->
[one] üht allalaadimist
*[other] { $num } allalaadimist
}
timespanHours = { $num ->
[one] üht tundi
*[other] { $num } tundi
}
copyUrlFormLabelWithName = Kopeeri ja jaga linki faili allalaadimiseks: { $filename } copyUrlFormLabelWithName = Kopeeri ja jaga linki faili allalaadimiseks: { $filename }
copyUrlFormButton = Kopeeri vahemällu copyUrlFormButton = Kopeeri vahemällu
copiedUrl = Kopeeritud! copiedUrl = Kopeeritud!
@@ -32,6 +41,12 @@ deleteFileButton = Kustuta fail
sendAnotherFileLink = Saada järgmine fail sendAnotherFileLink = Saada järgmine fail
// Alternative text used on the download link/button (indicates an action). // Alternative text used on the download link/button (indicates an action).
downloadAltText = Laadi alla downloadAltText = Laadi alla
downloadsFileList = Allalaadimised
// Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m")
timeFileList = Aega jäänud
// Used as header in a column indicating the number of times a file has been
// downloaded
downloadFileName = Laadi fail { $filename } alla downloadFileName = Laadi fail { $filename } alla
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Sisesta parool unlockInputLabel = Sisesta parool
@@ -86,6 +101,15 @@ footerLinkTerms = Teenusetingimused
footerLinkCookies = Küpsistest footerLinkCookies = Küpsistest
requirePasswordCheckbox = Selle faili allalaadimiseks nõutakse parooli requirePasswordCheckbox = Selle faili allalaadimiseks nõutakse parooli
addPasswordButton = Lisa parool addPasswordButton = Lisa parool
changePasswordButton = Muuda
passwordTryAgain = Vale parool. Palun proovi uuesti. passwordTryAgain = Vale parool. Palun proovi uuesti.
// This label is followed by the password needed to download a file // This label is followed by the password needed to download a file
passwordResult = Parool: { $password } passwordResult = Parool: { $password }
reportIPInfringement = Intellektuaalomandi keelatud kasutamise raporteerimine
javascriptRequired = Firefox Send'i kasutamiseks tuleb JavaScript lubada
whyJavascript = Miks Firefox Send JavaScripti vajab?
enableJavascript = Palun luba JavaScript ja proovi uuesti.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }t { $minutes }m
// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m

View File

@@ -1,4 +1,4 @@
// 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 = expérience web siteSubtitle = expérience web
siteFeedback = Votre avis siteFeedback = Votre avis
@@ -39,29 +39,29 @@ copyUrlFormButton = Copier dans le presse-papiers
copiedUrl = Lien copié ! copiedUrl = Lien copié !
deleteFileButton = Supprimer le fichier deleteFileButton = Supprimer le fichier
sendAnotherFileLink = Envoyer un autre fichier sendAnotherFileLink = Envoyer un autre fichier
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Télécharger downloadAltText = Télécharger
downloadsFileList = Téléchargements downloadsFileList = Téléchargements
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Heure timeFileList = Heure
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = Télécharger { $filename } downloadFileName = Télécharger { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Saisissez le mot de passe unlockInputLabel = Saisissez le mot de passe
unlockInputPlaceholder = Mot de passe unlockInputPlaceholder = Mot de passe
unlockButtonLabel = Déverrouiller unlockButtonLabel = Déverrouiller
downloadFileTitle = Télécharger le fichier chiffré downloadFileTitle = Télécharger le fichier chiffré
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Votre ami⋅e vous a envoyé un fichier avec Firefox Send, un service qui permet denvoyer des fichiers de façon sécurisée, confidentielle et chiffrée via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment. downloadMessage = Votre ami⋅e vous a envoyé un fichier avec Firefox Send, un service qui permet denvoyer des fichiers de façon sécurisée, confidentielle et chiffrée via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Télécharger downloadButtonLabel = Télécharger
downloadNotification = Le téléchargement est terminé. downloadNotification = Le téléchargement est terminé.
downloadFinish = Téléchargement terminé downloadFinish = Téléchargement terminé
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } sur { $totalSize }) fileSizeProgress = ({ $partialSize } sur { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Essayer Firefox Send sendYourFilesLink = Essayer Firefox Send
downloadingPageProgress = Téléchargement en cours de { $filename } ({ $size }) downloadingPageProgress = Téléchargement en cours de { $filename } ({ $size })
downloadingPageMessage = Merci de laisser cet onglet ouvert pendant que nous récupérons le fichier et que nous le déchiffrons. downloadingPageMessage = Merci de laisser cet onglet ouvert pendant que nous récupérons le fichier et que nous le déchiffrons.
@@ -73,7 +73,7 @@ fileTooBig = Ce fichier est trop volumineux pour être envoyé. Sa taille doit
linkExpiredAlt = Le lien a expiré linkExpiredAlt = Le lien a expiré
expiredPageHeader = Ce lien a expiré ou na jamais existé. expiredPageHeader = Ce lien a expiré ou na jamais existé.
notSupportedHeader = Votre navigateur nest pas pris en charge. notSupportedHeader = Votre navigateur nest pas pris en charge.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Malheureusement, ce navigateur ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devrez utiliser un autre navigateur. Nous vous recommandons Firefox ! notSupportedDetail = Malheureusement, ce navigateur ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devrez utiliser un autre navigateur. Nous vous recommandons Firefox !
notSupportedLink = Pourquoi mon navigateur nest-il pas pris en charge ? notSupportedLink = Pourquoi mon navigateur nest-il pas pris en charge ?
notSupportedOutdatedDetail = Malheureusement, cette version de Firefox ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devez mettre à jour votre navigateur. notSupportedOutdatedDetail = Malheureusement, cette version de Firefox ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devez mettre à jour votre navigateur.
@@ -81,7 +81,7 @@ updateFirefox = Mettre à jour Firefox
downloadFirefoxButtonSub = Téléchargement gratuit downloadFirefoxButtonSub = Téléchargement gratuit
uploadedFile = Fichier uploadedFile = Fichier
copyFileList = Copier le lien copyFileList = Copier le lien
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Expire dans expiryFileList = Expire dans
deleteFileList = Supprimer deleteFileList = Supprimer
nevermindButton = Non merci nevermindButton = Non merci
@@ -94,7 +94,7 @@ deletePopupCancel = Annuler
deleteButtonHover = Supprimer deleteButtonHover = Supprimer
copyUrlHover = Copier le lien copyUrlHover = Copier le lien
footerLinkLegal = Mentions légales footerLinkLegal = Mentions légales
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = À propos de Test Pilot footerLinkAbout = À propos de Test Pilot
footerLinkPrivacy = Confidentialité footerLinkPrivacy = Confidentialité
footerLinkTerms = Conditions dutilisation footerLinkTerms = Conditions dutilisation
@@ -103,13 +103,17 @@ requirePasswordCheckbox = Exiger un mot de passe pour télécharger ce fichier
addPasswordButton = Ajouter un mot de passe addPasswordButton = Ajouter un mot de passe
changePasswordButton = Changer changePasswordButton = Changer
passwordTryAgain = Mot de passe incorrect. Veuillez réessayer. passwordTryAgain = Mot de passe incorrect. Veuillez réessayer.
// This label is followed by the password needed to download a file
passwordResult = Mot de passe : { $password }
reportIPInfringement = Signaler une violation de la p.i. reportIPInfringement = Signaler une violation de la p.i.
javascriptRequired = Firefox Send nécessite JavaScript javascriptRequired = Firefox Send nécessite JavaScript
whyJavascript = Pourquoi Firefox Send nécessite-t-il JavaScript ? whyJavascript = Pourquoi Firefox Send nécessite-t-il JavaScript ?
enableJavascript = Veuillez activer JavaScript puis réessayer. enableJavascript = Veuillez activer JavaScript puis réessayer.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours } h { $minutes } min expiresHoursMinutes = { $hours } h { $minutes } min
// 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 } min expiresMinutes = { $minutes } min
# A short status message shown when a password is successfully set
passwordIsSet = Mot de passe défini
# A short status message shown when the user enters a long password
maxPasswordLength = Longueur maximale du mot de passe : { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Ce mot de passe na pas pu être défini

View File

@@ -1,4 +1,4 @@
// 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 = webeksperiment siteSubtitle = webeksperiment
siteFeedback = Kommentaar siteFeedback = Kommentaar
@@ -39,29 +39,29 @@ copyUrlFormButton = Nei klamboerd kopiearje
copiedUrl = Kopiearre! copiedUrl = Kopiearre!
deleteFileButton = Bestân fuortsmite deleteFileButton = Bestân fuortsmite
sendAnotherFileLink = Noch in bestân ferstjoere sendAnotherFileLink = Noch in bestân ferstjoere
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Downloade downloadAltText = Downloade
downloadsFileList = Downloads downloadsFileList = Downloads
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Tiid timeFileList = Tiid
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = { $filename } downloade downloadFileName = { $filename } downloade
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Wachtwurd ynfiere unlockInputLabel = Wachtwurd ynfiere
unlockInputPlaceholder = Wachtwurd unlockInputPlaceholder = Wachtwurd
unlockButtonLabel = Deblokkearje unlockButtonLabel = Deblokkearje
downloadFileTitle = Fersifere bestân downloade downloadFileTitle = Fersifere bestân downloade
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Jo freon stjoert jo in best^n mei Firefox Send, in tsjinst dy't jo yn steat stelt bestannen te dielen mei in feilige, privee en fersifere keppeling dy't automatysk ferrint om wis te wêzen dat jo guod net foar altyd online bliuwt. downloadMessage = Jo freon stjoert jo in best^n mei Firefox Send, in tsjinst dy't jo yn steat stelt bestannen te dielen mei in feilige, privee en fersifere keppeling dy't automatysk ferrint om wis te wêzen dat jo guod net foar altyd online bliuwt.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Downloade downloadButtonLabel = Downloade
downloadNotification = Jo download is foltôge. downloadNotification = Jo download is foltôge.
downloadFinish = Download foltôge downloadFinish = Download foltôge
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } fan { $totalSize }) fileSizeProgress = ({ $partialSize } fan { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Firefox Send probearje sendYourFilesLink = Firefox Send probearje
downloadingPageProgress = { $filename } ({ $size }) wurdt download downloadingPageProgress = { $filename } ({ $size }) wurdt download
downloadingPageMessage = Lit dit ljepblêd iepen wylst wy jo bestân krije en ûntsiferje. downloadingPageMessage = Lit dit ljepblêd iepen wylst wy jo bestân krije en ûntsiferje.
@@ -73,7 +73,7 @@ fileTooBig = It bestân is te grut om op te laden. It moat lytser wêze as { $si
linkExpiredAlt = Keppeling ferrûn linkExpiredAlt = Keppeling ferrûn
expiredPageHeader = Dizze keppeling is ferrûn of hat nea bestien! expiredPageHeader = Dizze keppeling is ferrûn of hat nea bestien!
notSupportedHeader = Jo browser wurdt net stipe. notSupportedHeader = Jo browser wurdt net stipe.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Spitigernôch stipet dizze browser de webtechnology dy't Firefox Send mooglik makket net. Jo moatte in oare browser probearje. Wy rekommandearje Firefox! notSupportedDetail = Spitigernôch stipet dizze browser de webtechnology dy't Firefox Send mooglik makket net. Jo moatte in oare browser probearje. Wy rekommandearje Firefox!
notSupportedLink = Wêrom wurdt myn browser net stipe? notSupportedLink = Wêrom wurdt myn browser net stipe?
notSupportedOutdatedDetail = Spitigernôch stipet dizze ferzje fan Firefox de webtechnology dy't Firefox Send mooflik makket net. Jo moatte jo browser fernije. notSupportedOutdatedDetail = Spitigernôch stipet dizze ferzje fan Firefox de webtechnology dy't Firefox Send mooflik makket net. Jo moatte jo browser fernije.
@@ -81,7 +81,7 @@ updateFirefox = Firefox fernije
downloadFirefoxButtonSub = Fergese download downloadFirefoxButtonSub = Fergese download
uploadedFile = Bestân uploadedFile = Bestân
copyFileList = URL kopiearje copyFileList = URL kopiearje
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Ferrint oer expiryFileList = Ferrint oer
deleteFileList = Fuortsmite deleteFileList = Fuortsmite
nevermindButton = Lit mar nevermindButton = Lit mar
@@ -94,7 +94,7 @@ deletePopupCancel = Annulearje
deleteButtonHover = Fuortsmite deleteButtonHover = Fuortsmite
copyUrlHover = URL kopiearje copyUrlHover = URL kopiearje
footerLinkLegal = Juridysk footerLinkLegal = Juridysk
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Oer Test Pilot footerLinkAbout = Oer Test Pilot
footerLinkPrivacy = Privacy footerLinkPrivacy = Privacy
footerLinkTerms = Betingsten footerLinkTerms = Betingsten
@@ -103,13 +103,15 @@ requirePasswordCheckbox = Om dit bestân te downloaden is in wachtwurd fereaske
addPasswordButton = Wachtwurd tafoegje addPasswordButton = Wachtwurd tafoegje
changePasswordButton = Wizigje changePasswordButton = Wizigje
passwordTryAgain = Net krekt wachtwurd. Probearje it opnij. passwordTryAgain = Net krekt wachtwurd. Probearje it opnij.
// This label is followed by the password needed to download a file # This label is followed by the password needed to download a file
passwordResult = Wachtwurd: { $password } passwordResult = Wachtwurd: { $password }
reportIPInfringement = IP-ynbrek melde reportIPInfringement = IP-ynbrek melde
javascriptRequired = Firefox Send fereasket JavaScript. javascriptRequired = Firefox Send fereasket JavaScript.
whyJavascript = Werom hat Firefox Send JavaScript nedich? whyJavascript = Werom hat Firefox Send JavaScript nedich?
enableJavascript = Skeakelje JavaScript yn en probearje nochris. enableJavascript = Skeakelje JavaScript yn en probearje nochris.
// 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 }o { $minutes }m expiresHoursMinutes = { $hours }o { $minutes }m
// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Wachtwurd ynsteld

View File

@@ -1,4 +1,4 @@
// 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 = webeksperiment siteSubtitle = webeksperiment
siteFeedback = Komentar siteFeedback = Komentar
@@ -43,29 +43,29 @@ copyUrlFormButton = Do mjezyskłada kopěrować
copiedUrl = Kopěrowany! copiedUrl = Kopěrowany!
deleteFileButton = Dataju zhašeć deleteFileButton = Dataju zhašeć
sendAnotherFileLink = Druhu dataju pósłać sendAnotherFileLink = Druhu dataju pósłać
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Sćahnyć downloadAltText = Sćahnyć
downloadsFileList = Sćehnjenja downloadsFileList = Sćehnjenja
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Čas timeFileList = Čas
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = { $filename } sćahnyć downloadFileName = { $filename } sćahnyć
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Hesło zapodać unlockInputLabel = Hesło zapodać
unlockInputPlaceholder = Hesło unlockInputPlaceholder = Hesło
unlockButtonLabel = Wotewrěć unlockButtonLabel = Wotewrěć
downloadFileTitle = Zaklučowanu dataju sćahnyć downloadFileTitle = Zaklučowanu dataju sćahnyć
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Waš přećel wam dataju z Firefox Send sćele, słužba, kotraž wam zmóžnja, dataje přez wěsty, priwatny a zaklučowany wotkaz dźělić, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostawali. downloadMessage = Waš přećel wam dataju z Firefox Send sćele, słužba, kotraž wam zmóžnja, dataje přez wěsty, priwatny a zaklučowany wotkaz dźělić, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostawali.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Sćahnyć downloadButtonLabel = Sćahnyć
downloadNotification = Waše sćehnjenje je dokónčene. downloadNotification = Waše sćehnjenje je dokónčene.
downloadFinish = Sćehnjenje dokónčene downloadFinish = Sćehnjenje dokónčene
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } z { $totalSize }) fileSizeProgress = ({ $partialSize } z { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Firefox Send wupruwować sendYourFilesLink = Firefox Send wupruwować
downloadingPageProgress = { $filename } ({ $size }) so sćahuje downloadingPageProgress = { $filename } ({ $size }) so sćahuje
downloadingPageMessage = Prošu wostajće tutón rajtark wočinjeny, mjeztym zo wašu dataju sćahujemy a dešifrujemy. downloadingPageMessage = Prošu wostajće tutón rajtark wočinjeny, mjeztym zo wašu dataju sćahujemy a dešifrujemy.
@@ -77,7 +77,7 @@ fileTooBig = Tuta dataja je přewulka za nahraće. Měła mjeńša hač { $size
linkExpiredAlt = Wotkaz je spadnjeny linkExpiredAlt = Wotkaz je spadnjeny
expiredPageHeader = Tutón wotkaz je spadnjeny abo njeje ženje eksistował! expiredPageHeader = Tutón wotkaz je spadnjeny abo njeje ženje eksistował!
notSupportedHeader = Waš wobhladowak so njepodpěruje. notSupportedHeader = Waš wobhladowak so njepodpěruje.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Bohužel tutón wobhladowak webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće druhi wobhladowak wužiwać. My Firefox doporučemy! notSupportedDetail = Bohužel tutón wobhladowak webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće druhi wobhladowak wužiwać. My Firefox doporučemy!
notSupportedLink = Čehodla so mój wobhladowak njepodpěruje? notSupportedLink = Čehodla so mój wobhladowak njepodpěruje?
notSupportedOutdatedDetail = Bohužel tuta wersija Firefox webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće swój wobhladowak aktualizować. notSupportedOutdatedDetail = Bohužel tuta wersija Firefox webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće swój wobhladowak aktualizować.
@@ -85,7 +85,7 @@ updateFirefox = Firefox aktualizować
downloadFirefoxButtonSub = Darmotne sćehnjenje downloadFirefoxButtonSub = Darmotne sćehnjenje
uploadedFile = Dataja uploadedFile = Dataja
copyFileList = URL kopěrować copyFileList = URL kopěrować
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Spadnje za expiryFileList = Spadnje za
deleteFileList = Zhašeć deleteFileList = Zhašeć
nevermindButton = Wšojedne nevermindButton = Wšojedne
@@ -98,7 +98,7 @@ deletePopupCancel = Přetorhnyć
deleteButtonHover = Zhašeć deleteButtonHover = Zhašeć
copyUrlHover = URL kopěrować copyUrlHover = URL kopěrować
footerLinkLegal = Prawniske footerLinkLegal = Prawniske
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Wo Test Pilot footerLinkAbout = Wo Test Pilot
footerLinkPrivacy = Priwatnosć footerLinkPrivacy = Priwatnosć
footerLinkTerms = Wuměnjenja footerLinkTerms = Wuměnjenja
@@ -107,13 +107,17 @@ requirePasswordCheckbox = Žadajće sej hesło za sćehnjenje tuteje dataje
addPasswordButton = Hesło přidać addPasswordButton = Hesło přidać
changePasswordButton = Změnić changePasswordButton = Změnić
passwordTryAgain = Wopačne hesło. Prošu spytajće hišće raz. passwordTryAgain = Wopačne hesło. Prošu spytajće hišće raz.
// This label is followed by the password needed to download a file
passwordResult = Hesło: { $password }
reportIPInfringement = Zranjenje IP zdźělić reportIPInfringement = Zranjenje IP zdźělić
javascriptRequired = Firefox Send JavaScript trjeba javascriptRequired = Firefox Send JavaScript trjeba
whyJavascript = Čehodla Firefox Send JavaScript trjeba? whyJavascript = Čehodla Firefox Send JavaScript trjeba?
enableJavascript = Prošu zmóžńće JavaScript a spytajće hišće raz. enableJavascript = Prošu zmóžńće JavaScript a spytajće hišće raz.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours } hodź. { $minutes } mjeń. expiresHoursMinutes = { $hours } hodź. { $minutes } mjeń.
// 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 } mjeń. expiresMinutes = { $minutes } mjeń.
# A short status message shown when a password is successfully set
passwordIsSet = Hesło je so nastajiło
# A short status message shown when the user enters a long password
maxPasswordLength = Maksimalna dołhosć hesła: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Tute hesło njeda so nastajić

View File

@@ -1,4 +1,4 @@
// 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 = webes kísérlet siteSubtitle = webes kísérlet
siteFeedback = Visszajelzés siteFeedback = Visszajelzés
@@ -39,29 +39,29 @@ copyUrlFormButton = Vágólapra másolás
copiedUrl = Másolva! copiedUrl = Másolva!
deleteFileButton = Fájl törlése deleteFileButton = Fájl törlése
sendAnotherFileLink = Még egy fájl küldése sendAnotherFileLink = Még egy fájl küldése
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Letöltés downloadAltText = Letöltés
downloadsFileList = Letöltések downloadsFileList = Letöltések
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Idő timeFileList = Idő
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = { $filename } letöltése downloadFileName = { $filename } letöltése
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Adja meg a jelszót unlockInputLabel = Adja meg a jelszót
unlockInputPlaceholder = Jelszó unlockInputPlaceholder = Jelszó
unlockButtonLabel = Feloldás unlockButtonLabel = Feloldás
downloadFileTitle = Titkosított fájl letöltése downloadFileTitle = Titkosított fájl letöltése
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Az ismerőse egy fájlt küld a Firefox Senddel, egy olyan fájlmegosztó szolgáltatással, amely biztonságos, privát és titkosított hivatkozáson keresztül működik, amely automatikusan elévül, így biztosítva hogy a dolga ne maradjon örökre online. downloadMessage = Az ismerőse egy fájlt küld a Firefox Senddel, egy olyan fájlmegosztó szolgáltatással, amely biztonságos, privát és titkosított hivatkozáson keresztül működik, amely automatikusan elévül, így biztosítva hogy a dolga ne maradjon örökre online.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Letöltés downloadButtonLabel = Letöltés
downloadNotification = A letöltés befejeződött. downloadNotification = A letöltés befejeződött.
downloadFinish = A letöltés befejeződött downloadFinish = A letöltés befejeződött
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } / { $totalSize }) fileSizeProgress = ({ $partialSize } / { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Próbálja ki a Firefox Sendet sendYourFilesLink = Próbálja ki a Firefox Sendet
downloadingPageProgress = { $filename } letöltése ({ $size }) downloadingPageProgress = { $filename } letöltése ({ $size })
downloadingPageMessage = Hagyja nyitva ezt a lapot, amíg lekérésre és visszafejtésre kerül a fájlja. downloadingPageMessage = Hagyja nyitva ezt a lapot, amíg lekérésre és visszafejtésre kerül a fájlja.
@@ -73,7 +73,7 @@ fileTooBig = Ez a fájl túl nagy a feltöltéshez. Kevesebb mint { $size } kell
linkExpiredAlt = A hivatkozás lejárt linkExpiredAlt = A hivatkozás lejárt
expiredPageHeader = Ez a hivatkozás lejárt, vagy sosem létezett! expiredPageHeader = Ez a hivatkozás lejárt, vagy sosem létezett!
notSupportedHeader = A böngésző nem támogatott. notSupportedHeader = A böngésző nem támogatott.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Sajnos ez a böngésző nem támogatja a Firefox Send alapját képező webes technológiát. Egy másik böngészőben kell megpróbálnia. Mi a Firefoxot javasoljuk! notSupportedDetail = Sajnos ez a böngésző nem támogatja a Firefox Send alapját képező webes technológiát. Egy másik böngészőben kell megpróbálnia. Mi a Firefoxot javasoljuk!
notSupportedLink = Miért nem támogatott a böngészőm? notSupportedLink = Miért nem támogatott a böngészőm?
notSupportedOutdatedDetail = Sajnos a Firefox ezen verziója nem támogatja a Firefox Send alapját képező technológiát. Frissítenie kell a böngészőjét. notSupportedOutdatedDetail = Sajnos a Firefox ezen verziója nem támogatja a Firefox Send alapját képező technológiát. Frissítenie kell a böngészőjét.
@@ -81,7 +81,7 @@ updateFirefox = Firefox frissítése
downloadFirefoxButtonSub = Ingyenes letöltés downloadFirefoxButtonSub = Ingyenes letöltés
uploadedFile = Fájl uploadedFile = Fájl
copyFileList = URL másolása copyFileList = URL másolása
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Lejár: expiryFileList = Lejár:
deleteFileList = Törlés deleteFileList = Törlés
nevermindButton = Mindegy nevermindButton = Mindegy
@@ -94,7 +94,7 @@ deletePopupCancel = Mégse
deleteButtonHover = Törlés deleteButtonHover = Törlés
copyUrlHover = URL másolása copyUrlHover = URL másolása
footerLinkLegal = Jogi információk footerLinkLegal = Jogi információk
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = A Tesztpilóta névjegye footerLinkAbout = A Tesztpilóta névjegye
footerLinkPrivacy = Adatvédelem footerLinkPrivacy = Adatvédelem
footerLinkTerms = Feltételek footerLinkTerms = Feltételek
@@ -103,13 +103,17 @@ requirePasswordCheckbox = Jelszó megkövetelése a fájl letöltéséhez
addPasswordButton = Jelszó hozzáadása addPasswordButton = Jelszó hozzáadása
changePasswordButton = Módosítás changePasswordButton = Módosítás
passwordTryAgain = Helytelen jelszó. Próbálja meg újra. passwordTryAgain = Helytelen jelszó. Próbálja meg újra.
// This label is followed by the password needed to download a file
passwordResult = Jelszó: { $password }
reportIPInfringement = Szellemi tulajdon megsértésének bejelentése reportIPInfringement = Szellemi tulajdon megsértésének bejelentése
javascriptRequired = A Firefox Sendhez JavaScript szükséges javascriptRequired = A Firefox Sendhez JavaScript szükséges
whyJavascript = Miért van szükség JavaScriptre a Firefox Sendhez? whyJavascript = Miért van szükség JavaScriptre a Firefox Sendhez?
enableJavascript = Kérjük engedélyezze a JavaScriptet, majd próbálkozzon újra. enableJavascript = Kérjük engedélyezze a JavaScriptet, majd próbálkozzon újra.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }ó { $minutes }p expiresHoursMinutes = { $hours }ó { $minutes }p
// 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 }p expiresMinutes = { $minutes }p
# A short status message shown when a password is successfully set
passwordIsSet = Jelszó megadva
# A short status message shown when the user enters a long password
maxPasswordLength = Maximális jelszóhossz: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Ez a jelszó nem állítható be

View File

@@ -89,7 +89,7 @@ legalHeader = Terminos & confidentialitate
legalNoticeTestPilot = Firefox Send es actualmente un Experimento pilota, e subjecte a <a>Terminos de servicio</a> e <a>Notitia de confidentialitate</a> de Experimento pilota. Tu pote saper plus re iste experimento e su recolta de datos <a>hic</a>. legalNoticeTestPilot = Firefox Send es actualmente un Experimento pilota, e subjecte a <a>Terminos de servicio</a> e <a>Notitia de confidentialitate</a> de Experimento pilota. Tu pote saper plus re iste experimento e su recolta de datos <a>hic</a>.
legalNoticeMozilla = Le uso del sito web de Firefox Send es anque subjecte a <a>Notitia de confidentialitate de sito web</a> e <a>Terminos de servicio sito web</a>. legalNoticeMozilla = Le uso del sito web de Firefox Send es anque subjecte a <a>Notitia de confidentialitate de sito web</a> e <a>Terminos de servicio sito web</a>.
deletePopupText = Deler iste file? deletePopupText = Deler iste file?
deletePopupYes = deletePopupYes = Si
deletePopupCancel = Cancellar deletePopupCancel = Cancellar
deleteButtonHover = Deler deleteButtonHover = Deler
copyUrlHover = Copiar le URL copyUrlHover = Copiar le URL

View File

@@ -1,4 +1,4 @@
// 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 = un esperimento web siteSubtitle = un esperimento web
siteFeedback = Feedback siteFeedback = Feedback
@@ -39,25 +39,29 @@ copyUrlFormButton = Copia negli appunti
copiedUrl = Copiato copiedUrl = Copiato
deleteFileButton = Elimina file deleteFileButton = Elimina file
sendAnotherFileLink = Invia un altro file sendAnotherFileLink = Invia un altro file
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Scarica downloadAltText = Scarica
downloadsFileList = Download downloadsFileList = Download
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = Scadenza timeFileList = Scadenza
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = Scarica { $filename } downloadFileName = Scarica { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Inserire la password unlockInputLabel = Inserire la password
unlockInputPlaceholder = Password unlockInputPlaceholder = Password
unlockButtonLabel = Sblocca unlockButtonLabel = Sblocca
downloadFileTitle = Scarica il file crittato downloadFileTitle = Scarica il file crittato
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Qualcuno ha utilizzato Firefox Send per inviarti un file. Si tratta di un servizio che permette di condividere file in modo sicuro, riservato e crittato, utilizzando un link che smette di funzionare automaticamente dopo un certo periodo di tempo, garantendo così che i tuoi dati non rimangano online per sempre. downloadMessage = Qualcuno ha utilizzato Firefox Send per inviarti un file. Si tratta di un servizio che permette di condividere file in modo sicuro, riservato e crittato, utilizzando un link che smette di funzionare automaticamente dopo un certo periodo di tempo, garantendo così che i tuoi dati non rimangano online per sempre.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Scarica downloadButtonLabel = Scarica
downloadNotification = Download completato. downloadNotification = Download completato.
downloadFinish = Download completato downloadFinish = Download completato
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } di { $totalSize }) fileSizeProgress = ({ $partialSize } di { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Prova Firefox Send sendYourFilesLink = Prova Firefox Send
downloadingPageProgress = Download in corso di { $filename } ({ $size }) downloadingPageProgress = Download in corso di { $filename } ({ $size })
downloadingPageMessage = Mantieni aperta questa scheda mentre il file viene scaricato e decrittato. downloadingPageMessage = Mantieni aperta questa scheda mentre il file viene scaricato e decrittato.
@@ -69,7 +73,7 @@ fileTooBig = Le dimensioni di questo file sono eccessive. Dovrebbe essere inferi
linkExpiredAlt = Link scaduto linkExpiredAlt = Link scaduto
expiredPageHeader = Questo link è scaduto oppure non è mai esistito. expiredPageHeader = Questo link è scaduto oppure non è mai esistito.
notSupportedHeader = Il browser in uso non è supportato. notSupportedHeader = Il browser in uso non è supportato.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Purtroppo questo browser non supporta le tecnologie web alla base di Firefox Send. Devi utilizzare un altro browser. Ti consigliamo Firefox! notSupportedDetail = Purtroppo questo browser non supporta le tecnologie web alla base di Firefox Send. Devi utilizzare un altro browser. Ti consigliamo Firefox!
notSupportedLink = Perché questo browser non risulta supportato? notSupportedLink = Perché questo browser non risulta supportato?
notSupportedOutdatedDetail = Purtroppo questa versione di Firefox non supporta le tecnologie web alla base di Firefox Send. È necessario aggiornare il browser. notSupportedOutdatedDetail = Purtroppo questa versione di Firefox non supporta le tecnologie web alla base di Firefox Send. È necessario aggiornare il browser.
@@ -77,7 +81,7 @@ updateFirefox = Aggiorna Firefox
downloadFirefoxButtonSub = Download gratuito downloadFirefoxButtonSub = Download gratuito
uploadedFile = File uploadedFile = File
copyFileList = Copia indirizzo copyFileList = Copia indirizzo
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Scade in expiryFileList = Scade in
deleteFileList = Elimina deleteFileList = Elimina
nevermindButton = No, grazie nevermindButton = No, grazie
@@ -90,7 +94,7 @@ deletePopupCancel = Annulla
deleteButtonHover = Elimina deleteButtonHover = Elimina
copyUrlHover = Copia indirizzo copyUrlHover = Copia indirizzo
footerLinkLegal = Note legali footerLinkLegal = Note legali
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Informazioni su Test Pilot footerLinkAbout = Informazioni su Test Pilot
footerLinkPrivacy = Privacy footerLinkPrivacy = Privacy
footerLinkTerms = Condizioni di utilizzo footerLinkTerms = Condizioni di utilizzo
@@ -99,6 +103,17 @@ requirePasswordCheckbox = Richiedi una password per poter scaricare questo file
addPasswordButton = Aggiungi password addPasswordButton = Aggiungi password
changePasswordButton = Modifica changePasswordButton = Modifica
passwordTryAgain = Password errata, riprovare. passwordTryAgain = Password errata, riprovare.
// This label is followed by the password needed to download a file
passwordResult = Password: { $password }
reportIPInfringement = Segnala violazione della proprietà intellettuale reportIPInfringement = Segnala violazione della proprietà intellettuale
javascriptRequired = Firefox Send richiede JavaScript
whyJavascript = Perché Firefox Send richiede JavaScript?
enableJavascript = Attiva JavaScript e riprova.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Password impostata
# A short status message shown when the user enters a long password
maxPasswordLength = Lunghezza massima della password: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Impossibile impostare la password

View File

@@ -1,4 +1,4 @@
// 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 = ウェブ実験 siteSubtitle = ウェブ実験
siteFeedback = フィードバック siteFeedback = フィードバック
@@ -37,29 +37,29 @@ copyUrlFormButton = クリップボードへコピー
copiedUrl = コピー完了! copiedUrl = コピー完了!
deleteFileButton = ファイルを削除 deleteFileButton = ファイルを削除
sendAnotherFileLink = 他のファイルを送信 sendAnotherFileLink = 他のファイルを送信
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = ダウンロード downloadAltText = ダウンロード
downloadsFileList = ダウンロード downloadsFileList = ダウンロード
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = 時間 timeFileList = 時間
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = { $filename } をダウンロード downloadFileName = { $filename } をダウンロード
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = パスワードを入力 unlockInputLabel = パスワードを入力
unlockInputPlaceholder = パスワード unlockInputPlaceholder = パスワード
unlockButtonLabel = ロック解除 unlockButtonLabel = ロック解除
downloadFileTitle = 暗号化されたファイルをダウンロード downloadFileTitle = 暗号化されたファイルをダウンロード
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = あなたの友人が Firefox Send を通じてファイルを送ってきています。これは、安全で、プライベートで、暗号化されたリンクを通じてファイルを共有できるサービスです。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。 downloadMessage = あなたの友人が Firefox Send を通じてファイルを送ってきています。これは、安全で、プライベートで、暗号化されたリンクを通じてファイルを共有できるサービスです。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = ダウンロード downloadButtonLabel = ダウンロード
downloadNotification = ダウンロードが完了しました。 downloadNotification = ダウンロードが完了しました。
downloadFinish = ダウンロード完了 downloadFinish = ダウンロード完了
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } / { $totalSize }) fileSizeProgress = ({ $partialSize } / { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Firefox Send を試す sendYourFilesLink = Firefox Send を試す
downloadingPageProgress = { $filename } ({ $size }) をダウンロードしています downloadingPageProgress = { $filename } ({ $size }) をダウンロードしています
downloadingPageMessage = ファイルの取得と復号化が完了するまでこのタブを開いたままにしておいてください。 downloadingPageMessage = ファイルの取得と復号化が完了するまでこのタブを開いたままにしておいてください。
@@ -71,7 +71,7 @@ fileTooBig = このファイルは大きすぎるためアップロードでき
linkExpiredAlt = リンク期限切れ linkExpiredAlt = リンク期限切れ
expiredPageHeader = このリンクは期限切れとなったか元々存在していません。 expiredPageHeader = このリンクは期限切れとなったか元々存在していません。
notSupportedHeader = お使いのブラウザーには対応していません。 notSupportedHeader = お使いのブラウザーには対応していません。
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = 残念ながらお使いのブラウザーは Firefox Send が活用しているウェブ技術に対応していません。他のブラウザーで試してください。私たちは Firefox をお勧めします! notSupportedDetail = 残念ながらお使いのブラウザーは Firefox Send が活用しているウェブ技術に対応していません。他のブラウザーで試してください。私たちは Firefox をお勧めします!
notSupportedLink = なぜ私のブラウザには対応していないのでしょうか? notSupportedLink = なぜ私のブラウザには対応していないのでしょうか?
notSupportedOutdatedDetail = 残念ながらお使いのバージョンの Firefox は Firefox Send が活用しているウェブ技術に対応していません。ブラウザーを更新する必要があります。 notSupportedOutdatedDetail = 残念ながらお使いのバージョンの Firefox は Firefox Send が活用しているウェブ技術に対応していません。ブラウザーを更新する必要があります。
@@ -79,7 +79,7 @@ updateFirefox = Firefox を更新
downloadFirefoxButtonSub = 無料ダウンロード downloadFirefoxButtonSub = 無料ダウンロード
uploadedFile = ファイル uploadedFile = ファイル
copyFileList = URL をコピー copyFileList = URL をコピー
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = 有効期限: expiryFileList = 有効期限:
deleteFileList = 削除 deleteFileList = 削除
nevermindButton = 気にしないでください nevermindButton = 気にしないでください
@@ -92,7 +92,7 @@ deletePopupCancel = キャンセル
deleteButtonHover = 削除 deleteButtonHover = 削除
copyUrlHover = URL をコピー copyUrlHover = URL をコピー
footerLinkLegal = 法的情報 footerLinkLegal = 法的情報
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Test Pilot について footerLinkAbout = Test Pilot について
footerLinkPrivacy = プライバシー footerLinkPrivacy = プライバシー
footerLinkTerms = 利用規約 footerLinkTerms = 利用規約
@@ -101,13 +101,17 @@ requirePasswordCheckbox = このファイルをダウンロードするにはパ
addPasswordButton = パスワードを追加 addPasswordButton = パスワードを追加
changePasswordButton = 変更 changePasswordButton = 変更
passwordTryAgain = パスワードが正しくありません。再度入力してください。 passwordTryAgain = パスワードが正しくありません。再度入力してください。
// This label is followed by the password needed to download a file
passwordResult = パスワード: { $password }
reportIPInfringement = 知的財産侵害報告 reportIPInfringement = 知的財産侵害報告
javascriptRequired = Firefox Send を使うには JavaScript が必要です javascriptRequired = Firefox Send を使うには JavaScript が必要です
whyJavascript = Firefox Send が JavaScript を必要とする理由 whyJavascript = Firefox Send が JavaScript を必要とする理由
enableJavascript = JavaScript を有効にして再度試してください。 enableJavascript = JavaScript を有効にして再度試してください。
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours } 時間 { $minutes } 分 expiresHoursMinutes = { $hours } 時間 { $minutes } 分
// 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
maxPasswordLength = パスワード最長文字数: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = このパスワードは設定できませんでした

View File

@@ -1,4 +1,4 @@
// 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 = საცდელი siteSubtitle = საცდელი
siteFeedback = გამოხმაურება siteFeedback = გამოხმაურება
@@ -37,25 +37,29 @@ copyUrlFormButton = დაკოპირება
copiedUrl = დაკოპირდა! copiedUrl = დაკოპირდა!
deleteFileButton = ფაილის წაშლა deleteFileButton = ფაილის წაშლა
sendAnotherFileLink = სხვა ფაილის გაგზავნა sendAnotherFileLink = სხვა ფაილის გაგზავნა
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = ჩამოტვირთვა downloadAltText = ჩამოტვირთვა
downloadsFileList = ჩამოტვირთვები downloadsFileList = ჩამოტვირთვები
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = დრო timeFileList = დრო
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = { $filename } ჩამოტვირთვა downloadFileName = { $filename } ჩამოტვირთვა
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = შეიყვანეთ პაროლი unlockInputLabel = შეიყვანეთ პაროლი
unlockInputPlaceholder = პაროლი unlockInputPlaceholder = პაროლი
unlockButtonLabel = გახსნა unlockButtonLabel = გახსნა
downloadFileTitle = დაშიფრული ფაილის ჩამოტვირთვა downloadFileTitle = დაშიფრული ფაილის ჩამოტვირთვა
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = თქვენი მეგობარი გიგზავნით ფაილს Firefox Send მომსახურების მეშვეობით, რომლითაც შეგიძლიათ ფაილების უსაფრთხოდ, დაფარულად და დაშიფრულად გაზიარება ბმულის საშუალებით, წინასწარ განსაზღვრული ვადით, რაც საწინდარია იმის, რომ თქვენი კუთვნილი მასალა, არ დარჩება ინტერნეტში სამუდამოდ. downloadMessage = თქვენი მეგობარი გიგზავნით ფაილს Firefox Send მომსახურების მეშვეობით, რომლითაც შეგიძლიათ ფაილების უსაფრთხოდ, დაფარულად და დაშიფრულად გაზიარება ბმულის საშუალებით, წინასწარ განსაზღვრული ვადით, რაც საწინდარია იმის, რომ თქვენი კუთვნილი მასალა, არ დარჩება ინტერნეტში სამუდამოდ.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = ჩამოტვირთვა downloadButtonLabel = ჩამოტვირთვა
downloadNotification = თქვენი ჩამოტვირთვა დასრულებულია. downloadNotification = თქვენი ჩამოტვირთვა დასრულებულია.
downloadFinish = ჩამოტვირთვა დასრულდა downloadFinish = ჩამოტვირთვა დასრულდა
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } { $totalSize }-იდან) fileSizeProgress = ({ $partialSize } { $totalSize }-იდან)
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = გამოცადეთ Firefox Send sendYourFilesLink = გამოცადეთ Firefox Send
downloadingPageProgress = მიმდინარეობს ჩამოტვირთვა { $filename } ({ $size }) downloadingPageProgress = მიმდინარეობს ჩამოტვირთვა { $filename } ({ $size })
downloadingPageMessage = გთხოვთ დატოვოთ ეს ჩანართი გახსნილი, სანამ ფაილი ჩამოიტვირთება და გაიშიფრება. downloadingPageMessage = გთხოვთ დატოვოთ ეს ჩანართი გახსნილი, სანამ ფაილი ჩამოიტვირთება და გაიშიფრება.
@@ -67,7 +71,7 @@ fileTooBig = ფაილი ზედმეტად დიდია. უნდ
linkExpiredAlt = ბმული ვადაგასულია linkExpiredAlt = ბმული ვადაგასულია
expiredPageHeader = ბმული ან ვადაგასულია, ან არ არსებობს! expiredPageHeader = ბმული ან ვადაგასულია, ან არ არსებობს!
notSupportedHeader = თქვენი ბრაუზერი არაა მხარდაჭერილი. notSupportedHeader = თქვენი ბრაუზერი არაა მხარდაჭერილი.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = სამწუხაროდ, ამ ბრაუზერს არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Firefox Send-ის მუშაობისთვის. გესაჭიროებათ სხვა ბრაუზერი. ჩვენ შეგვიძლია გირჩიოთ Firefox! notSupportedDetail = სამწუხაროდ, ამ ბრაუზერს არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Firefox Send-ის მუშაობისთვის. გესაჭიროებათ სხვა ბრაუზერი. ჩვენ შეგვიძლია გირჩიოთ Firefox!
notSupportedLink = რატომ არაა ჩემი ბრაუზერი მხარდაჭერილი? notSupportedLink = რატომ არაა ჩემი ბრაუზერი მხარდაჭერილი?
notSupportedOutdatedDetail = სამწუხაროდ, Firefox-ის ამ ვერსიას არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Firefox Send-ის მუშაობისთვის. გესაჭიროებათ, ბრაუზერის განახლება. notSupportedOutdatedDetail = სამწუხაროდ, Firefox-ის ამ ვერსიას არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Firefox Send-ის მუშაობისთვის. გესაჭიროებათ, ბრაუზერის განახლება.
@@ -75,7 +79,7 @@ updateFirefox = Firefox-ის განახლება
downloadFirefoxButtonSub = უფასო ჩამოტვირთვა downloadFirefoxButtonSub = უფასო ჩამოტვირთვა
uploadedFile = ფაილი uploadedFile = ფაილი
copyFileList = URL ბმულის დაკოპირება copyFileList = URL ბმულის დაკოპირება
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = ვადის გასვლის დრო expiryFileList = ვადის გასვლის დრო
deleteFileList = წაშლა deleteFileList = წაშლა
nevermindButton = არ აქვს მნიშვნელობა nevermindButton = არ აქვს მნიშვნელობა
@@ -88,7 +92,7 @@ deletePopupCancel = გაუქმება
deleteButtonHover = წაშლა deleteButtonHover = წაშლა
copyUrlHover = URL-ს დაკოპირება copyUrlHover = URL-ს დაკოპირება
footerLinkLegal = იურიდიული ინფორმაცია footerLinkLegal = იურიდიული ინფორმაცია
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Test Pilot-ის შესახებ footerLinkAbout = Test Pilot-ის შესახებ
footerLinkPrivacy = პირადულობა footerLinkPrivacy = პირადულობა
footerLinkTerms = პირობები footerLinkTerms = პირობები
@@ -97,6 +101,17 @@ requirePasswordCheckbox = პაროლის მოთხოვნა, ფა
addPasswordButton = პაროლის დამატება addPasswordButton = პაროლის დამატება
changePasswordButton = შეცვლა changePasswordButton = შეცვლა
passwordTryAgain = პაროლი არასწორია. სცადეთ ხელახლა. passwordTryAgain = პაროლი არასწორია. სცადეთ ხელახლა.
// This label is followed by the password needed to download a file
passwordResult = პაროლი: { $password }
reportIPInfringement = მოხსენება დარღვევაზე reportIPInfringement = მოხსენება დარღვევაზე
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 a password is successfully set
passwordIsSet = პაროლი დაყენებულია
# A short status message shown when the user enters a long password
maxPasswordLength = პაროლის დაშვებული ზომა: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = ამ პაროლის დაყენება ვერ ხერხდება

View File

@@ -1,4 +1,4 @@
// 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 = Tarmit web siteSubtitle = Tarmit web
siteFeedback = Tikti siteFeedback = Tikti
@@ -39,23 +39,29 @@ copyUrlFormButton = Sers ɣef afus
copiedUrl = Yenɣel! copiedUrl = Yenɣel!
deleteFileButton = Kkes afaylu deleteFileButton = Kkes afaylu
sendAnotherFileLink = Azen afaylu-nniḍen sendAnotherFileLink = Azen afaylu-nniḍen
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Sider downloadAltText = Sider
downloadsFileList = Isidar
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = Akud
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = Sider { $filename } downloadFileName = Sider { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Sekcem awal uffir unlockInputLabel = Sekcem awal uffir
unlockInputPlaceholder = Awal uffir unlockInputPlaceholder = Awal uffir
unlockButtonLabel = Serreḥ unlockButtonLabel = Serreḥ
downloadFileTitle = Sider afaylu awgelhan downloadFileTitle = Sider afaylu awgelhan
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Amdakel-ik yuzen-ak-d afaylu s Firefox Firefox Send, ameẓlu ara yeǧǧen tuzna n ifuyla s wudem aɣelsan, s tbadnit akked uwgelhen s useqdec n useqwen ara yeùten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda. downloadMessage = Amdakel-ik yuzen-ak-d afaylu s Firefox Firefox Send, ameẓlu ara yeǧǧen tuzna n ifuyla s wudem aɣelsan, s tbadnit akked uwgelhen s useqdec n useqwen ara yeùten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Sider downloadButtonLabel = Sider
downloadNotification = Asider-ik yemmed. downloadNotification = Asider-ik yemmed.
downloadFinish = Asider yemmed downloadFinish = Asider yemmed
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } seg { $totalSize }) fileSizeProgress = ({ $partialSize } seg { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Ɛreḍ Firefox Send sendYourFilesLink = Ɛreḍ Firefox Send
downloadingPageProgress = Asider n { $filename } ({ $size }) downloadingPageProgress = Asider n { $filename } ({ $size })
downloadingPageMessage = Eǧǧ iccer-agi yeldi ticki nettnadi afaylu akken ad newgelhen. downloadingPageMessage = Eǧǧ iccer-agi yeldi ticki nettnadi afaylu akken ad newgelhen.
@@ -67,7 +73,7 @@ fileTooBig = Afaylu-agi meqqeṛ aṭas. Yessefk ad yili daw n { $size }.
linkExpiredAlt = Aseɣwen yemmut linkExpiredAlt = Aseɣwen yemmut
expiredPageHeader = Aseɣwen-agi yemmut neɣ wurǧin yella seg tazwara! expiredPageHeader = Aseɣwen-agi yemmut neɣ wurǧin yella seg tazwara!
notSupportedHeader = Iminig-ik ur ittusefrak ara notSupportedHeader = Iminig-ik ur ittusefrak ara
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Ad nesḥissef imi iminig-ik ur isefrak ara tatiknulujit web iseqdac Firefox Send. Yessefk ad tesqedceḍ iminig-nniḍen. Seqdec Firefox! notSupportedDetail = Ad nesḥissef imi iminig-ik ur isefrak ara tatiknulujit web iseqdac Firefox Send. Yessefk ad tesqedceḍ iminig-nniḍen. Seqdec Firefox!
notSupportedLink = Ayγer iminig inu ur yettwasefrek ara? notSupportedLink = Ayγer iminig inu ur yettwasefrek ara?
notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Firefox Send. Yessefk ad tleqmeḍ iminig-ik. notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Firefox Send. Yessefk ad tleqmeḍ iminig-ik.
@@ -75,7 +81,7 @@ updateFirefox = Leqqem Firefox
downloadFirefoxButtonSub = Asider ilelli downloadFirefoxButtonSub = Asider ilelli
uploadedFile = Afaylu uploadedFile = Afaylu
copyFileList = Nɣel URL copyFileList = Nɣel URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Ad ifak di expiryFileList = Ad ifak di
deleteFileList = Kkes deleteFileList = Kkes
nevermindButton = Wicqa nevermindButton = Wicqa
@@ -88,14 +94,26 @@ deletePopupCancel = Sefsex
deleteButtonHover = Kkes deleteButtonHover = Kkes
copyUrlHover = Nɣel URL. copyUrlHover = Nɣel URL.
footerLinkLegal = Usḍif footerLinkLegal = Usḍif
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Ɣef Test Pilot footerLinkAbout = Ɣef Test Pilot
footerLinkPrivacy = Tabaḍnit footerLinkPrivacy = Tabaḍnit
footerLinkTerms = Tiwtilin footerLinkTerms = Tiwtilin
footerLinkCookies = Inagan n tuqqna footerLinkCookies = Inagan n tuqqna
requirePasswordCheckbox = YEsra awal uffir akken ad isider afaylu-agi requirePasswordCheckbox = YEsra awal uffir akken ad isider afaylu-agi
addPasswordButton = rnu awal uffir addPasswordButton = rnu awal uffir
changePasswordButton = Snifel
passwordTryAgain = Yir awal uffir. Ɛreḍ tikelt nniḍen. passwordTryAgain = Yir awal uffir. Ɛreḍ tikelt nniḍen.
// This label is followed by the password needed to download a file
passwordResult = Awal uffir: { $password }
reportIPInfringement = Neqqes akukel n IP reportIPInfringement = Neqqes akukel n IP
javascriptRequired = Firefox Send yesra JavaScript
whyJavascript = Ayɣer firefox Send yesra JavaScript?
enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍen.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }Isragen { $minutes }Tisdatin
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }Tisdatin
# A short status message shown when a password is successfully set
passwordIsSet = Awal uffir ittwasbaded
# A short status message shown when the user enters a long password
maxPasswordLength = Tuγzi tafellayt n wawal uffir: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded

View File

@@ -1,4 +1,4 @@
// 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 = experimen web siteSubtitle = experimen web
siteFeedback = Maklum balas siteFeedback = Maklum balas
@@ -37,29 +37,29 @@ copyUrlFormButton = Salin ke Klipbod
copiedUrl = Disalin! copiedUrl = Disalin!
deleteFileButton = Buang Fail deleteFileButton = Buang Fail
sendAnotherFileLink = Hantar fail lain sendAnotherFileLink = Hantar fail lain
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Muat turun downloadAltText = Muat turun
downloadsFileList = Muat turun downloadsFileList = Muat turun
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Masa timeFileList = Masa
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = Muat turun { $filename } downloadFileName = Muat turun { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Masukkan Kata Laluan unlockInputLabel = Masukkan Kata Laluan
unlockInputPlaceholder = Kata laluan unlockInputPlaceholder = Kata laluan
unlockButtonLabel = Buka unlockButtonLabel = Buka
downloadFileTitle = Muat turun Fail Enkripsi downloadFileTitle = Muat turun Fail Enkripsi
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan Firefox Send, satu perkhidmatan yang membolehkan anda berkongsi fail dengan pautan yang selamat, peribadi dan dienkrip, yang secara automatik akan luput bagi memastikan fail anda tidak terus berada dalam talian selama-lamanya. downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan Firefox Send, satu perkhidmatan yang membolehkan anda berkongsi fail dengan pautan yang selamat, peribadi dan dienkrip, yang secara automatik akan luput bagi memastikan fail anda tidak terus berada dalam talian selama-lamanya.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Muat turun downloadButtonLabel = Muat turun
downloadNotification = Muat turun anda sudah siap. downloadNotification = Muat turun anda sudah siap.
downloadFinish = Muat turun Selesai downloadFinish = Muat turun Selesai
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } daripada { $totalSize }) fileSizeProgress = ({ $partialSize } daripada { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Cuba Firefox Send sendYourFilesLink = Cuba Firefox Send
downloadingPageProgress = Memuat turun { $filename } ({ $size }) downloadingPageProgress = Memuat turun { $filename } ({ $size })
downloadingPageMessage = Sila biarkan tab ini terbuka semasa kami mengambil fail anda dan menghuraikannya. downloadingPageMessage = Sila biarkan tab ini terbuka semasa kami mengambil fail anda dan menghuraikannya.
@@ -71,7 +71,7 @@ fileTooBig = Fail terlalu besar untuk dimuat naik. Perlu kurang daripada { $size
linkExpiredAlt = Pautan sudah luput linkExpiredAlt = Pautan sudah luput
expiredPageHeader = Pautan ini sudah luput atau pun tidak pernah wujud! expiredPageHeader = Pautan ini sudah luput atau pun tidak pernah wujud!
notSupportedHeader = Pelayar anda tidak disokong. notSupportedHeader = Pelayar anda tidak disokong.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Malangnya, pelayar ini tidak menyokong teknologi web yang melaksanakan Firefox Send. Anda perlu cuba pelayar lain. Kami syorkan Firefox! notSupportedDetail = Malangnya, pelayar ini tidak menyokong teknologi web yang melaksanakan Firefox Send. Anda perlu cuba pelayar lain. Kami syorkan Firefox!
notSupportedLink = Kenapa pelayar saya tidak disokong? notSupportedLink = Kenapa pelayar saya tidak disokong?
notSupportedOutdatedDetail = Malangnya versi Firefox ini tidak menyokong teknologi web yang menguasakan Firefox Send. Anda perlu mengemaskini pelayar anda. notSupportedOutdatedDetail = Malangnya versi Firefox ini tidak menyokong teknologi web yang menguasakan Firefox Send. Anda perlu mengemaskini pelayar anda.
@@ -79,7 +79,7 @@ updateFirefox = Kemaskini Firefox
downloadFirefoxButtonSub = Muat turun Percuma downloadFirefoxButtonSub = Muat turun Percuma
uploadedFile = Fail uploadedFile = Fail
copyFileList = Salin URL copyFileList = Salin URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Luput Pada expiryFileList = Luput Pada
deleteFileList = Buang deleteFileList = Buang
nevermindButton = Tak apalah nevermindButton = Tak apalah
@@ -92,7 +92,7 @@ deletePopupCancel = Batal
deleteButtonHover = Buang deleteButtonHover = Buang
copyUrlHover = Salin URL copyUrlHover = Salin URL
footerLinkLegal = Perundangan footerLinkLegal = Perundangan
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Perihal Ujian Perintis footerLinkAbout = Perihal Ujian Perintis
footerLinkPrivacy = Privasi footerLinkPrivacy = Privasi
footerLinkTerms = Terma footerLinkTerms = Terma
@@ -101,13 +101,17 @@ requirePasswordCheckbox = Perlu kata laluan untuk memuat turun fail ini
addPasswordButton = Tambah Kata laluan addPasswordButton = Tambah Kata laluan
changePasswordButton = Tukar changePasswordButton = Tukar
passwordTryAgain = Kata laluan tidak betul. Cuba lagi. passwordTryAgain = Kata laluan tidak betul. Cuba lagi.
// This label is followed by the password needed to download a file
passwordResult = Kata laluan: { $password }
reportIPInfringement = Lapor Pencerobohan IP reportIPInfringement = Lapor Pencerobohan IP
javascriptRequired = Firefox Send perlukan JavaScript javascriptRequired = Firefox Send perlukan JavaScript
whyJavascript = Kenapa Firefox Send perlukan JavaScript? whyJavascript = Kenapa Firefox Send perlukan JavaScript?
enableJavascript = Sila dayakan JavaScript dan cuba lagi. enableJavascript = Sila dayakan JavaScript dan cuba lagi.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m expiresHoursMinutes = { $hours }h { $minutes }m
// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Kata laluan ditetapkan
# A short status message shown when the user enters a long password
maxPasswordLength = Panjang kata laluan maksimum: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Kata laluan ini tidak boleh ditetapkan

View File

@@ -1,4 +1,4 @@
// 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 = netteksperiment siteSubtitle = netteksperiment
siteFeedback = Tilbakemelding siteFeedback = Tilbakemelding
@@ -39,29 +39,29 @@ copyUrlFormButton = Kopier til utklippstavle
copiedUrl = Kopiert! copiedUrl = Kopiert!
deleteFileButton = Slett fil deleteFileButton = Slett fil
sendAnotherFileLink = Send en annen fil sendAnotherFileLink = Send en annen fil
// Alternative text used on the download link/button (indicates an action). # Alternative text used on the download link/button (indicates an action).
downloadAltText = Last ned downloadAltText = Last ned
downloadsFileList = Nedlastinger downloadsFileList = Nedlastinger
// Used as header in a column indicating the amount of time left before a # Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m") # download link expires (e.g. "10h 5m")
timeFileList = Tid timeFileList = Tid
// Used as header in a column indicating the number of times a file has been # Used as header in a column indicating the number of times a file has been
// downloaded # downloaded
downloadFileName = Last ned { $filename } downloadFileName = Last ned { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
unlockInputLabel = Skriv inn passord unlockInputLabel = Skriv inn passord
unlockInputPlaceholder = Passord unlockInputPlaceholder = Passord
unlockButtonLabel = Lås opp unlockButtonLabel = Lås opp
downloadFileTitle = Last ned kryptert fil downloadFileTitle = Last ned kryptert fil
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
downloadMessage = Din venn sender deg en fil med Firefox Send, en tjeneste som lar deg dele filer med en sikker, privat og kryptert lenke, som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid. downloadMessage = Din venn sender deg en fil med Firefox Send, en tjeneste som lar deg dele filer med en sikker, privat og kryptert lenke, som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid.
// Text and title used on the download link/button (indicates an action). # Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Last ned downloadButtonLabel = Last ned
downloadNotification = Nedlastingen er fullført. downloadNotification = Nedlastingen er fullført.
downloadFinish = Nedlastingen er fullført. downloadFinish = Nedlastingen er fullført.
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } av { $totalSize }) fileSizeProgress = ({ $partialSize } av { $totalSize })
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Prøv Firefox Send sendYourFilesLink = Prøv Firefox Send
downloadingPageProgress = Laster ned { $filename } ({ $size }) downloadingPageProgress = Laster ned { $filename } ({ $size })
downloadingPageMessage = La denne fanen være åpen mens vi henter filen og dekrypterer den. downloadingPageMessage = La denne fanen være åpen mens vi henter filen og dekrypterer den.
@@ -73,7 +73,7 @@ fileTooBig = Filen er for stor til å laste opp. Det må være mindre enn { $siz
linkExpiredAlt = Lenke utløpt linkExpiredAlt = Lenke utløpt
expiredPageHeader = Denne lenken er utløpt eller har aldri eksistert i utgangspunktet! expiredPageHeader = Denne lenken er utløpt eller har aldri eksistert i utgangspunktet!
notSupportedHeader = Din nettleser er ikke støttet. notSupportedHeader = Din nettleser er ikke støttet.
// Firefox Send is a brand name and should not be localized. # Firefox Send is a brand name and should not be localized.
notSupportedDetail = Dessverre støtter denne nettleseren ikke webteknologien som driver Firefox Send. Du må prøve en annen nettleser. Vi anbefaler Firefox! notSupportedDetail = Dessverre støtter denne nettleseren ikke webteknologien som driver Firefox Send. Du må prøve en annen nettleser. Vi anbefaler Firefox!
notSupportedLink = Hvorfor er ikke nettleseren min støttet? notSupportedLink = Hvorfor er ikke nettleseren min støttet?
notSupportedOutdatedDetail = Dessverre støtter ikke denne versjonen av Firefox netteknologien som driver Firefox Send. Du trenger å oppdatere nettleseren din. notSupportedOutdatedDetail = Dessverre støtter ikke denne versjonen av Firefox netteknologien som driver Firefox Send. Du trenger å oppdatere nettleseren din.
@@ -81,7 +81,7 @@ updateFirefox = Oppdater Firefox
downloadFirefoxButtonSub = Gratis nedlasting downloadFirefoxButtonSub = Gratis nedlasting
uploadedFile = Fil uploadedFile = Fil
copyFileList = Kopier URL copyFileList = Kopier URL
// expiryFileList is used as a column header # expiryFileList is used as a column header
expiryFileList = Utløper om expiryFileList = Utløper om
deleteFileList = Slett deleteFileList = Slett
nevermindButton = Glem det nevermindButton = Glem det
@@ -94,7 +94,7 @@ deletePopupCancel = Avbryt
deleteButtonHover = Slett deleteButtonHover = Slett
copyUrlHover = Kopier URL copyUrlHover = Kopier URL
footerLinkLegal = Juridisk informasjon footerLinkLegal = Juridisk informasjon
// Test Pilot is a proper name and should not be localized. # Test Pilot is a proper name and should not be localized.
footerLinkAbout = Om Test Pilot footerLinkAbout = Om Test Pilot
footerLinkPrivacy = Personvern footerLinkPrivacy = Personvern
footerLinkTerms = Vilkår footerLinkTerms = Vilkår
@@ -103,13 +103,15 @@ requirePasswordCheckbox = Krever et passord for å laste ned denne filen
addPasswordButton = Legg til passord addPasswordButton = Legg til passord
changePasswordButton = Endre changePasswordButton = Endre
passwordTryAgain = Feil passord. Prøv igjen. passwordTryAgain = Feil passord. Prøv igjen.
// This label is followed by the password needed to download a file # This label is followed by the password needed to download a file
passwordResult = Passord: { $password } passwordResult = Passord: { $password }
reportIPInfringement = Rapporter brudd på åndsverk reportIPInfringement = Rapporter brudd på åndsverk
javascriptRequired = Firefox Send krever JavaScript. javascriptRequired = Firefox Send krever JavaScript.
whyJavascript = Hvorfor krever Firefox Send JavaScript? whyJavascript = Hvorfor krever Firefox Send JavaScript?
enableJavascript = Slå på JavaScript og prøv igjen. enableJavascript = Slå på JavaScript og prøv igjen.
// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }t { $minutes }m expiresHoursMinutes = { $hours }t { $minutes }m
// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Passord satt

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