mirror of
https://gitlab.com/timvisee/send.git
synced 2025-12-08 07:00:54 +03:00
Compare commits
149 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d658dc159 | ||
|
|
fb8e0afd85 | ||
|
|
5263839731 | ||
|
|
484063a596 | ||
|
|
5650c7f778 | ||
|
|
74728782f3 | ||
|
|
0a0980f9e3 | ||
|
|
26c46b8488 | ||
|
|
c469696687 | ||
|
|
27550a7781 | ||
|
|
e79bacd268 | ||
|
|
fd2dfcc4f2 | ||
|
|
74b9e364fe | ||
|
|
d2412679ea | ||
|
|
98e6fc3b4a | ||
|
|
b64b2a3091 | ||
|
|
6275f3abf7 | ||
|
|
22e836c98a | ||
|
|
d6c0489fa3 | ||
|
|
78728ce4ca | ||
|
|
6803a34b51 | ||
|
|
42b6383283 | ||
|
|
147f009279 | ||
|
|
b899781b69 | ||
|
|
64d0819ab4 | ||
|
|
3ea4af816a | ||
|
|
037d2c6974 | ||
|
|
fe2c664474 | ||
|
|
a3d429b9c3 | ||
|
|
d0e6f4118d | ||
|
|
75fb58e454 | ||
|
|
6563b7fd11 | ||
|
|
e1b78174e2 | ||
|
|
aab7e25f80 | ||
|
|
24b2ba7b35 | ||
|
|
20ae667b3b | ||
|
|
d8cb9da483 | ||
|
|
8abce2ccf3 | ||
|
|
aa3ebd3bd2 | ||
|
|
4929437283 | ||
|
|
389dd19a8a | ||
|
|
a8b6b3335b | ||
|
|
a925e2fae0 | ||
|
|
dc79b5923e | ||
|
|
b39bbaf6fb | ||
|
|
14b40d820b | ||
|
|
354d5963ec | ||
|
|
6a32b94336 | ||
|
|
5c68437b1c | ||
|
|
0106f280f0 | ||
|
|
b567aaac69 | ||
|
|
36b419202b | ||
|
|
c80d01c648 | ||
|
|
1d00646b17 | ||
|
|
e4b98fe65a | ||
|
|
12443db891 | ||
|
|
03f08de32f | ||
|
|
c18f488be7 | ||
|
|
099012fac9 | ||
|
|
fa510af65a | ||
|
|
46b514cc61 | ||
|
|
019c8814f6 | ||
|
|
46249935b2 | ||
|
|
ebecc6bb81 | ||
|
|
130ddca135 | ||
|
|
f2661989dc | ||
|
|
3f6cb8c356 | ||
|
|
228d9cca6c | ||
|
|
d08a1dd2ca | ||
|
|
7d76a60db7 | ||
|
|
e4f0865067 | ||
|
|
cad4bd7c04 | ||
|
|
f85aaf0370 | ||
|
|
312d78617d | ||
|
|
af5aa12fa1 | ||
|
|
1c7e2edae0 | ||
|
|
a49eee9685 | ||
|
|
61938c8e66 | ||
|
|
76d10f5920 | ||
|
|
2cf85926e9 | ||
|
|
afb099f9df | ||
|
|
343627eb82 | ||
|
|
86f2477c63 | ||
|
|
2684150141 | ||
|
|
3f8d8d055d | ||
|
|
e775e0542e | ||
|
|
7992ba5bc1 | ||
|
|
d24bbaa65a | ||
|
|
58a91e1b86 | ||
|
|
cfed1d0230 | ||
|
|
b14c70f4b6 | ||
|
|
ad77fc20c6 | ||
|
|
029633f3d3 | ||
|
|
78459d759c | ||
|
|
a0d5a3dd07 | ||
|
|
d76d983d5d | ||
|
|
68b8e7dc7c | ||
|
|
1a7aff5102 | ||
|
|
677edffb80 | ||
|
|
2cd90c998b | ||
|
|
346e604f34 | ||
|
|
8d41111cd6 | ||
|
|
3163edcbe4 | ||
|
|
18df43c9cb | ||
|
|
4f2179c4d7 | ||
|
|
b89546ac22 | ||
|
|
c0ad7635f2 | ||
|
|
a82688163e | ||
|
|
29c36ee110 | ||
|
|
43698f8d61 | ||
|
|
b5b29aeb17 | ||
|
|
fdcf4c152a | ||
|
|
dcfda9521b | ||
|
|
950c9cdaeb | ||
|
|
1e9641a40e | ||
|
|
3fd2537311 | ||
|
|
6d470b8eba | ||
|
|
71ad81a67d | ||
|
|
9a1852ea05 | ||
|
|
629a86de99 | ||
|
|
3539868683 | ||
|
|
71d4566df5 | ||
|
|
caaa613ce9 | ||
|
|
cf36a33aea | ||
|
|
a777a808ee | ||
|
|
a78150b7ad | ||
|
|
deb177c6bb | ||
|
|
1c5e47b4c4 | ||
|
|
aae61f9451 | ||
|
|
807c44f057 | ||
|
|
9782007f7e | ||
|
|
77d5f1e603 | ||
|
|
81ee6de0a3 | ||
|
|
82fe65ada2 | ||
|
|
ce79d7b745 | ||
|
|
755cc4f5ec | ||
|
|
fde4d311e3 | ||
|
|
b08f40aaa3 | ||
|
|
e12ade6b31 | ||
|
|
43fc80ef41 | ||
|
|
6ca96157f6 | ||
|
|
856181ea54 | ||
|
|
f84bd46cdc | ||
|
|
0b43924ee2 | ||
|
|
16d3fd3828 | ||
|
|
cf5defa6a9 | ||
|
|
3de760db12 | ||
|
|
1366f0b68e | ||
|
|
be498e0bd3 |
@@ -6,3 +6,5 @@ assets
|
|||||||
docs
|
docs
|
||||||
public
|
public
|
||||||
test
|
test
|
||||||
|
coverage
|
||||||
|
.nyc_output
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
dist
|
dist
|
||||||
assets
|
assets
|
||||||
firefox
|
firefox
|
||||||
|
coverage
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,6 @@
|
|||||||
node_modules
|
node_modules
|
||||||
|
coverage
|
||||||
dist
|
dist
|
||||||
.idea
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
.nyc_output
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
dist
|
dist
|
||||||
assets/*.js
|
assets/*.js
|
||||||
|
coverage
|
||||||
82
CHANGELOG.md
82
CHANGELOG.md
@@ -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)
|
||||||
|
|||||||
58
CONTRIBUTORS
58
CONTRIBUTORS
@@ -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ć)
|
||||||
|
صفا الفليج
|
||||||
|
|||||||
118
app/api.js
118
app/api.js
@@ -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
267
app/base.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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' });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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'
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
16
app/main.css
Normal 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';
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
|
||||||
};
|
|
||||||
26
app/pages/completed/index.js
Normal file
26
app/pages/completed/index.js
Normal 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', '/');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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;
|
|
||||||
};
|
|
||||||
42
app/pages/download/index.js
Normal file
42
app/pages/download/index.js
Normal 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');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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>`;
|
||||||
};
|
};
|
||||||
@@ -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>`;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
};
|
|
||||||
16
app/pages/notFound/index.js
Normal file
16
app/pages/notFound/index.js
Normal 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>`;
|
||||||
|
};
|
||||||
@@ -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;
|
|
||||||
};
|
|
||||||
40
app/pages/preview/index.js
Normal file
40
app/pages/preview/index.js
Normal 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>
|
||||||
|
`;
|
||||||
|
};
|
||||||
@@ -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
115
app/pages/share/index.js
Normal 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
112
app/pages/share/share.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
|
||||||
};
|
|
||||||
67
app/pages/unsupported/index.js
Normal file
67
app/pages/unsupported/index.js
Normal 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')
|
||||||
|
};
|
||||||
|
}
|
||||||
49
app/pages/unsupported/unsupported.css
Normal file
49
app/pages/unsupported/unsupported.css
Normal 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;
|
||||||
|
}
|
||||||
@@ -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
39
app/pages/upload/index.js
Normal 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');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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;
|
|
||||||
};
|
};
|
||||||
65
app/pages/welcome/welcome.css
Normal file
65
app/pages/welcome/welcome.css
Normal 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;
|
||||||
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
6
app/templates/downloadButton/downloadButton.css
Normal file
6
app/templates/downloadButton/downloadButton.css
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
.btn--download {
|
||||||
|
width: 180px;
|
||||||
|
height: 44px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
@@ -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>`;
|
|
||||||
};
|
};
|
||||||
@@ -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;
|
|
||||||
};
|
|
||||||
22
app/templates/downloadPassword/downloadPassword.css
Normal file
22
app/templates/downloadPassword/downloadPassword.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
66
app/templates/downloadPassword/index.js
Normal file
66
app/templates/downloadPassword/index.js
Normal 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;
|
||||||
|
};
|
||||||
26
app/templates/file/file.css
Normal file
26
app/templates/file/file.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
52
app/templates/fileList/fileList.css
Normal file
52
app/templates/fileList/fileList.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
|
||||||
`;
|
|
||||||
};
|
};
|
||||||
@@ -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>`;
|
|
||||||
};
|
|
||||||
93
app/templates/footer/footer.css
Normal file
93
app/templates/footer/footer.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
64
app/templates/footer/index.js
Normal file
64
app/templates/footer/index.js
Normal 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>`;
|
||||||
|
};
|
||||||
56
app/templates/fxPromo/fxPromo.css
Normal file
56
app/templates/fxPromo/fxPromo.css
Normal 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;
|
||||||
|
}
|
||||||
@@ -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' });
|
||||||
|
}
|
||||||
};
|
};
|
||||||
104
app/templates/header/header.css
Normal file
104
app/templates/header/header.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>`;
|
|
||||||
};
|
|
||||||
109
app/templates/passwordInput/index.js
Normal file
109
app/templates/passwordInput/index.js
Normal 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');
|
||||||
|
}
|
||||||
42
app/templates/passwordInput/passwordInput.css
Normal file
42
app/templates/passwordInput/passwordInput.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
26
app/templates/popup/index.js
Normal file
26
app/templates/popup/index.js
Normal 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');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
122
app/templates/popup/popup.css
Normal file
122
app/templates/popup/popup.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
|
||||||
};
|
};
|
||||||
39
app/templates/progress/progress.css
Normal file
39
app/templates/progress/progress.css
Normal 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;
|
||||||
|
}
|
||||||
@@ -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>`;
|
|
||||||
};
|
};
|
||||||
36
app/templates/selectbox/selectbox.css
Normal file
36
app/templates/selectbox/selectbox.css
Normal 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;
|
||||||
|
}
|
||||||
37
app/templates/setPasswordSection/index.js
Normal file
37
app/templates/setPasswordSection/index.js
Normal 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 = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
68
app/templates/setPasswordSection/setPasswordSection.css
Normal file
68
app/templates/setPasswordSection/setPasswordSection.css
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -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;
|
|
||||||
};
|
|
||||||
34
app/utils.js
34
app/utils.js
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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 |
1236
assets/main.css
1236
assets/main.css
File diff suppressed because it is too large
Load Diff
17
assets/spinner.svg
Normal file
17
assets/spinner.svg
Normal 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 |
@@ -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
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
134
circle.yml
134
circle.yml
@@ -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
11596
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
85
package.json
85
package.json
@@ -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",
|
||||||
|
|||||||
@@ -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 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 = ضُبطت كلمة السر
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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ś
|
||||||
|
|||||||
@@ -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 }λ
|
||||||
|
|||||||
@@ -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. You’ll need to try another browser. We recommend Firefox!
|
notSupportedDetail = Unfortunately this browser does not support the web technology that powers Firefox Send. You’ll 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. You’ll need to update your browser.
|
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll 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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 d’envoyer 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 d’envoyer 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 n’a jamais existé.
|
expiredPageHeader = Ce lien a expiré ou n’a jamais existé.
|
||||||
notSupportedHeader = Votre navigateur n’est pas pris en charge.
|
notSupportedHeader = Votre navigateur n’est 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 n’est-il pas pris en charge ?
|
notSupportedLink = Pourquoi mon navigateur n’est-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 d’utilisation
|
footerLinkTerms = Conditions d’utilisation
|
||||||
@@ -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 n’a pas pu être défini
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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ć
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 = このパスワードは設定できませんでした
|
||||||
|
|||||||
@@ -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 = ამ პაროლის დაყენება ვერ ხერხდება
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user