mirror of
https://gitlab.com/timvisee/send.git
synced 2025-12-09 19:55:34 +00:00
Compare commits
352 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94f1eabbc7 | ||
|
|
902bc6628e | ||
|
|
460b741f17 | ||
|
|
d5c488196d | ||
|
|
9ad9c9feb2 | ||
|
|
6576e4a74c | ||
|
|
950872109e | ||
|
|
87051d27ed | ||
|
|
3451803b37 | ||
|
|
ac15153e8f | ||
|
|
924f5dc682 | ||
|
|
ff9be6a213 | ||
|
|
883728570e | ||
|
|
0435f17f9a | ||
|
|
1e1268fff0 | ||
|
|
252d7817e3 | ||
|
|
ce28c38ebe | ||
|
|
f0407f9beb | ||
|
|
c6f222eb57 | ||
|
|
6dd6135185 | ||
|
|
8df339b66d | ||
|
|
8702fda651 | ||
|
|
807ecff471 | ||
|
|
927c981cd7 | ||
|
|
7073cc8ce6 | ||
|
|
c925fae696 | ||
|
|
966d7a5e35 | ||
|
|
96c750c098 | ||
|
|
0729064753 | ||
|
|
259a5a5f24 | ||
|
|
27be72e0cd | ||
|
|
e4231bbc0f | ||
|
|
1d184f06bf | ||
|
|
f7b46a99ac | ||
|
|
3fadb489c7 | ||
|
|
6378676c2d | ||
|
|
014d84e4c7 | ||
|
|
a08d8435a9 | ||
|
|
40a05c9ecf | ||
|
|
527040afef | ||
|
|
a48a447808 | ||
|
|
f3569d7f98 | ||
|
|
6ca7d11efb | ||
|
|
b71ae4a0ff | ||
|
|
7ba25664b5 | ||
|
|
80fb42ad3d | ||
|
|
f036df5f47 | ||
|
|
20c063db7c | ||
|
|
a6b43c9eef | ||
|
|
c80f9ada65 | ||
|
|
e0ae5cb3c6 | ||
|
|
c0fb3d17be | ||
|
|
116f090b7e | ||
|
|
7cbd9716e2 | ||
|
|
58191975b9 | ||
|
|
76695aee5d | ||
|
|
b356b4cad3 | ||
|
|
63ddbeefc4 | ||
|
|
7b423b24b6 | ||
|
|
b67050b742 | ||
|
|
06242dfd38 | ||
|
|
3b8dbfd81c | ||
|
|
9c2fe39764 | ||
|
|
8b21d43bfa | ||
|
|
e7e39f4d4a | ||
|
|
e4c801d9a1 | ||
|
|
324f275dd4 | ||
|
|
594e0bd28e | ||
|
|
6a7fdfe780 | ||
|
|
0c82741b98 | ||
|
|
fe57734792 | ||
|
|
4754bed9b8 | ||
|
|
a60da467b9 | ||
|
|
362da2bbfc | ||
|
|
1a9ef4a246 | ||
|
|
f51dbbb8f5 | ||
|
|
e497107e59 | ||
|
|
10ad6fc1ae | ||
|
|
c982db4c75 | ||
|
|
cd8130563d | ||
|
|
730a569d43 | ||
|
|
769dae1bdc | ||
|
|
54a8c504ce | ||
|
|
92dc9a0f71 | ||
|
|
80a7c92056 | ||
|
|
c6ebea0100 | ||
|
|
039b5daaed | ||
|
|
4bf4e61c2c | ||
|
|
3c21e2a00f | ||
|
|
38a379d1de | ||
|
|
adeb19d974 | ||
|
|
744c410704 | ||
|
|
99ab3882eb | ||
|
|
7cdf566bcd | ||
|
|
b6e4877d93 | ||
|
|
b9c87fd779 | ||
|
|
6ef5b5133c | ||
|
|
b7d2420765 | ||
|
|
c139531c91 | ||
|
|
88fe3902bc | ||
|
|
645fd062ac | ||
|
|
ccb0b71df5 | ||
|
|
b8ec90a398 | ||
|
|
7ed5f37c66 | ||
|
|
c899129f9a | ||
|
|
1bb91690c5 | ||
|
|
073f6f67d3 | ||
|
|
533bfdb496 | ||
|
|
34de65d7d2 | ||
|
|
209fdf34f8 | ||
|
|
ba5c2a049d | ||
|
|
1528aa3f1b | ||
|
|
b1f1b9bd19 | ||
|
|
2963b2fc05 | ||
|
|
e4f9cfa023 | ||
|
|
09e961219d | ||
|
|
b36a5f6973 | ||
|
|
1a36dc084e | ||
|
|
c66347b3da | ||
|
|
a7d0551509 | ||
|
|
f6f6324aa1 | ||
|
|
a24597695b | ||
|
|
706ac638da | ||
|
|
d66d08f0ed | ||
|
|
ab9af7fd9b | ||
|
|
466a087689 | ||
|
|
71956739f8 | ||
|
|
62689b9556 | ||
|
|
7d1b8e002f | ||
|
|
8c535ce50d | ||
|
|
a3bdcd8478 | ||
|
|
1e77d86e8a | ||
|
|
1af01b1ee3 | ||
|
|
eb1bcde37f | ||
|
|
8def910d61 | ||
|
|
5892532d03 | ||
|
|
8ede5cf05c | ||
|
|
7213fef7c3 | ||
|
|
d3e9bb09df | ||
|
|
2682aec90d | ||
|
|
0ea89a58b0 | ||
|
|
2a2a3ad21f | ||
|
|
36c73bae7b | ||
|
|
f5116cee29 | ||
|
|
72ab5bdbf3 | ||
|
|
94f0b928ae | ||
|
|
5e14a0b45a | ||
|
|
84a382af77 | ||
|
|
8680dc6b3c | ||
|
|
cf787eef9f | ||
|
|
a5dffdba14 | ||
|
|
2dcc3730d9 | ||
|
|
3fb3f6f77f | ||
|
|
0a4a9f674d | ||
|
|
7e2e171f83 | ||
|
|
a64bb4ac8b | ||
|
|
acab58ca1e | ||
|
|
10ed88fa40 | ||
|
|
9b2a7dfcd7 | ||
|
|
517f51f4f0 | ||
|
|
73735010ae | ||
|
|
72497b77b2 | ||
|
|
7c4a00ecd1 | ||
|
|
d96cb1aec4 | ||
|
|
fc99ed584f | ||
|
|
da1ffe581b | ||
|
|
6cbbbab691 | ||
|
|
b91bd2b859 | ||
|
|
14ae124ca8 | ||
|
|
3bd087a66d | ||
|
|
57e9fbcd26 | ||
|
|
bd42445a98 | ||
|
|
0e1027544c | ||
|
|
c7532f3f4a | ||
|
|
97e861f050 | ||
|
|
9f3adbf6ad | ||
|
|
7b4c42a56f | ||
|
|
0f763ca4ec | ||
|
|
97164a4b08 | ||
|
|
ee8baff557 | ||
|
|
637a6d86fb | ||
|
|
f8f200cbcd | ||
|
|
0e4b9f425f | ||
|
|
eb4a2c9f02 | ||
|
|
55f3abaa1b | ||
|
|
bb1ee80c34 | ||
|
|
f9edf196a2 | ||
|
|
9bebab3f66 | ||
|
|
e9bf6e235b | ||
|
|
88a3dc94d5 | ||
|
|
d7143ab63a | ||
|
|
b340969cc1 | ||
|
|
ce0bf26b9e | ||
|
|
193f43ac9d | ||
|
|
e376f978a2 | ||
|
|
bd93fb66a5 | ||
|
|
fc79233ade | ||
|
|
8263a9eaa9 | ||
|
|
5d02f47e41 | ||
|
|
23ecb632eb | ||
|
|
b82177dc44 | ||
|
|
51296d5489 | ||
|
|
f603f40f43 | ||
|
|
19ac0480ee | ||
|
|
7d43f4f145 | ||
|
|
8f17c86611 | ||
|
|
f517c514d8 | ||
|
|
e2d9c0acca | ||
|
|
c3221bddf2 | ||
|
|
5ac10a2057 | ||
|
|
85ce14a991 | ||
|
|
2594581965 | ||
|
|
1a3968476a | ||
|
|
281abfc79b | ||
|
|
6dd4a92467 | ||
|
|
9614c119aa | ||
|
|
1e1c21a45a | ||
|
|
8cff6f9441 | ||
|
|
23c2a61567 | ||
|
|
903cb9cc49 | ||
|
|
d4901662f8 | ||
|
|
686197be61 | ||
|
|
dd848f19b4 | ||
|
|
a7d1607cb3 | ||
|
|
508e252067 | ||
|
|
2cf409ca11 | ||
|
|
3f0fac738a | ||
|
|
9bd14a17f9 | ||
|
|
4505296b35 | ||
|
|
5a91ba47c6 | ||
|
|
b82e2efd33 | ||
|
|
284676d956 | ||
|
|
d91edcb653 | ||
|
|
9ffc792dec | ||
|
|
7d3973a5e4 | ||
|
|
ffc0d57576 | ||
|
|
f28ee8ab78 | ||
|
|
6b02a2167c | ||
|
|
c9b9c338d7 | ||
|
|
d22d54dee0 | ||
|
|
20b9279eec | ||
|
|
ce4157ac08 | ||
|
|
3c74d9958f | ||
|
|
569d110f6e | ||
|
|
e69c91b5eb | ||
|
|
2477b6cde8 | ||
|
|
8cf42a2711 | ||
|
|
5207c3fb15 | ||
|
|
a166f98b66 | ||
|
|
d572c44dd0 | ||
|
|
9286140b15 | ||
|
|
0b738bc152 | ||
|
|
f06ddfd888 | ||
|
|
f10ed62310 | ||
|
|
a5c05daac5 | ||
|
|
a84ce0b0cf | ||
|
|
adecddae77 | ||
|
|
927706d67c | ||
|
|
e70c883673 | ||
|
|
09f583c569 | ||
|
|
6e676404a0 | ||
|
|
daa70a61eb | ||
|
|
2ed4ad6772 | ||
|
|
f0a42c5c07 | ||
|
|
02174c3245 | ||
|
|
8a148747bd | ||
|
|
66750ca9ff | ||
|
|
e84ec0fcb3 | ||
|
|
39edee306e | ||
|
|
464fdc9873 | ||
|
|
38ef8db3f1 | ||
|
|
3fee10c890 | ||
|
|
3a35b2ae2a | ||
|
|
cff4227132 | ||
|
|
b01dbdc119 | ||
|
|
62603f095e | ||
|
|
1e95a9122e | ||
|
|
308fd0cdcb | ||
|
|
a4e8c0b4a3 | ||
|
|
e7964c03ed | ||
|
|
c800257678 | ||
|
|
89a3c984e7 | ||
|
|
05d32ef9d7 | ||
|
|
a2ec22a4e0 | ||
|
|
7ae676ce8a | ||
|
|
b0c2c329e2 | ||
|
|
9c423bb435 | ||
|
|
3cb6952d68 | ||
|
|
147ed4c736 | ||
|
|
f94918bebd | ||
|
|
ee45a835be | ||
|
|
26ad1b8763 | ||
|
|
8b798ce36c | ||
|
|
894ad6cb08 | ||
|
|
98c4bd0f50 | ||
|
|
898d152810 | ||
|
|
9c588ed008 | ||
|
|
1da7e1c112 | ||
|
|
19d1f8cf80 | ||
|
|
29f243fdda | ||
|
|
bd58022b08 | ||
|
|
a6fa2c642c | ||
|
|
890642fcff | ||
|
|
74ecb598d2 | ||
|
|
48b5d85904 | ||
|
|
373da3f090 | ||
|
|
4a69ccbe51 | ||
|
|
4c1496e1cd | ||
|
|
0a243dfb52 | ||
|
|
79bd847042 | ||
|
|
2fe5cad9d5 | ||
|
|
fbde75fd66 | ||
|
|
24167161b1 | ||
|
|
eda132832f | ||
|
|
4839ff3584 | ||
|
|
de2d11cc59 | ||
|
|
95779b3243 | ||
|
|
7f76a279c3 | ||
|
|
219b1d6806 | ||
|
|
efea0e5ab0 | ||
|
|
5d19a9d696 | ||
|
|
17a12e3194 | ||
|
|
b71265b0c5 | ||
|
|
4a62048d64 | ||
|
|
acd48cc2f5 | ||
|
|
364778c516 | ||
|
|
d7ca9b4f84 | ||
|
|
b6350c787a | ||
|
|
ee8a672873 | ||
|
|
67b812a538 | ||
|
|
c811cbd34e | ||
|
|
2ed09d1fda | ||
|
|
557ecb196d | ||
|
|
88e8a234d6 | ||
|
|
34eb0fce2a | ||
|
|
995054a2cb | ||
|
|
e70161bfb0 | ||
|
|
ebf62761bc | ||
|
|
cf08b03a6b | ||
|
|
f3be26d5f5 | ||
|
|
03c68b0c58 | ||
|
|
59d460e80b | ||
|
|
87f947c31d | ||
|
|
7ff0a7654c | ||
|
|
9f829e8467 | ||
|
|
b68762da50 | ||
|
|
caef279fed | ||
|
|
0dfda7c610 | ||
|
|
5c2d9d8673 | ||
|
|
be51ae7ac9 | ||
|
|
1ba6aceb1f | ||
|
|
0a3c3d8c51 |
@@ -2,5 +2,6 @@ dist
|
|||||||
assets
|
assets
|
||||||
firefox
|
firefox
|
||||||
coverage
|
coverage
|
||||||
|
android/app/build
|
||||||
app/locale.js
|
app/locale.js
|
||||||
app/capabilities.js
|
app/capabilities.js
|
||||||
@@ -4,6 +4,7 @@ env:
|
|||||||
|
|
||||||
extends:
|
extends:
|
||||||
- eslint:recommended
|
- eslint:recommended
|
||||||
|
- prettier
|
||||||
- plugin:node/recommended
|
- plugin:node/recommended
|
||||||
- plugin:security/recommended
|
- plugin:security/recommended
|
||||||
|
|
||||||
@@ -22,13 +23,5 @@ rules:
|
|||||||
security/detect-non-literal-fs-filename: off
|
security/detect-non-literal-fs-filename: off
|
||||||
security/detect-object-injection: off
|
security/detect-object-injection: off
|
||||||
|
|
||||||
eol-last: [error, always]
|
|
||||||
eqeqeq: error
|
|
||||||
no-alert: warn
|
|
||||||
no-console: warn
|
|
||||||
no-path-concat: error
|
|
||||||
no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}]
|
no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}]
|
||||||
no-var: error
|
require-atomic-updates: warn
|
||||||
one-var: [error, never]
|
|
||||||
prefer-const: error
|
|
||||||
quotes: [error, single, {avoidEscape: true}]
|
|
||||||
|
|||||||
15
CODE_OF_CONDUCT.md
Normal file
15
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Community Participation Guidelines
|
||||||
|
|
||||||
|
This repository is governed by Mozilla's code of conduct and etiquette guidelines.
|
||||||
|
For more details, please read the
|
||||||
|
[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/).
|
||||||
|
|
||||||
|
## How to Report
|
||||||
|
For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
## Project Specific Etiquette
|
||||||
|
|
||||||
|
In some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).
|
||||||
|
Please update for your project.
|
||||||
|
-->
|
||||||
41
CONTRIBUTORS
41
CONTRIBUTORS
@@ -4,15 +4,18 @@ Adnan Kičin
|
|||||||
Alberto Castro
|
Alberto Castro
|
||||||
Alexander Slovesnik
|
Alexander Slovesnik
|
||||||
Alfredos-Panagiotis Damkalis
|
Alfredos-Panagiotis Damkalis
|
||||||
|
Aman Alam
|
||||||
Amin Mahmudian
|
Amin Mahmudian
|
||||||
Ander Elortondo
|
Ander Elortondo
|
||||||
Andreas Pettersson
|
Andreas Pettersson
|
||||||
Anesu Chiodza
|
Anesu Chiodza
|
||||||
Anika Dorn
|
Anika Dorn
|
||||||
|
Anish Sheela
|
||||||
Arash Mousavi
|
Arash Mousavi
|
||||||
Artem Polivanchuk
|
Artem Polivanchuk
|
||||||
Ashikur Rahman
|
Ashikur Rahman
|
||||||
Ashok kumar
|
Ashok kumar
|
||||||
|
Balasankar C
|
||||||
Balázs Meskó
|
Balázs Meskó
|
||||||
Belayet Hossain
|
Belayet Hossain
|
||||||
Benjamin Forehand Jr
|
Benjamin Forehand Jr
|
||||||
@@ -20,8 +23,11 @@ Besnik Bleta
|
|||||||
Björn I
|
Björn I
|
||||||
Bjørn I
|
Bjørn I
|
||||||
Boopesh Mahendran
|
Boopesh Mahendran
|
||||||
|
Brahim Essaidi
|
||||||
Brainlulz
|
Brainlulz
|
||||||
Breana Gonzales
|
Breana Gonzales
|
||||||
|
Christian Elbrianno
|
||||||
|
Christoph Kührer
|
||||||
Christopher Ramírez
|
Christopher Ramírez
|
||||||
Chuck Harmston
|
Chuck Harmston
|
||||||
Cloney 173741
|
Cloney 173741
|
||||||
@@ -31,6 +37,7 @@ Cynthia Pereira
|
|||||||
Daniel Thorn
|
Daniel Thorn
|
||||||
Daniela Arcese
|
Daniela Arcese
|
||||||
Danny Coates
|
Danny Coates
|
||||||
|
Davide
|
||||||
Derek Tamsen
|
Derek Tamsen
|
||||||
Dhyey Thakore
|
Dhyey Thakore
|
||||||
Donovan Preston
|
Donovan Preston
|
||||||
@@ -52,11 +59,16 @@ Frederick Villaluna
|
|||||||
G12r
|
G12r
|
||||||
Gabriela
|
Gabriela
|
||||||
Gautam krishna.R
|
Gautam krishna.R
|
||||||
|
George Raptis
|
||||||
Georgianizator
|
Georgianizator
|
||||||
Gonçalo Matos
|
Gonçalo Matos
|
||||||
|
Gwenn
|
||||||
|
Hugo
|
||||||
|
Hugo Abreu
|
||||||
Hyeonseok Shin
|
Hyeonseok Shin
|
||||||
Håvar Henriksen
|
Håvar Henriksen
|
||||||
Ian Neal
|
Ian Neal
|
||||||
|
ItielMaN
|
||||||
Jae Hyeon Park
|
Jae Hyeon Park
|
||||||
Jakob Kappel
|
Jakob Kappel
|
||||||
Jakub Rychlý
|
Jakub Rychlý
|
||||||
@@ -65,6 +77,8 @@ Jarmo
|
|||||||
Jim Spentzos
|
Jim Spentzos
|
||||||
Jiri Grönroos
|
Jiri Grönroos
|
||||||
Jobava
|
Jobava
|
||||||
|
Joe Becher
|
||||||
|
Joe ST
|
||||||
Joergen
|
Joergen
|
||||||
Johann-S
|
Johann-S
|
||||||
John Gruen
|
John Gruen
|
||||||
@@ -81,9 +95,11 @@ Khaled Hosny
|
|||||||
Kim Ludvigsen
|
Kim Ludvigsen
|
||||||
Kohei Yoshino
|
Kohei Yoshino
|
||||||
Lan Glad
|
Lan Glad
|
||||||
|
Lasse Liehu
|
||||||
Laurent Jouanneau
|
Laurent Jouanneau
|
||||||
Lobodzets
|
Lobodzets
|
||||||
LuFlo
|
LuFlo
|
||||||
|
Luis A. Sánchez
|
||||||
Luiz Carlos de Morais
|
Luiz Carlos de Morais
|
||||||
Luna Jernberg
|
Luna Jernberg
|
||||||
Mahay Alam Khan
|
Mahay Alam Khan
|
||||||
@@ -106,14 +122,18 @@ Michal Vašíček
|
|||||||
Mikeyy
|
Mikeyy
|
||||||
Miro Rauhala
|
Miro Rauhala
|
||||||
Mozilla Pontoon
|
Mozilla Pontoon
|
||||||
|
Mozilla-GitHub-Standards
|
||||||
Mozinet
|
Mozinet
|
||||||
Moḥend Belqasem
|
Moḥend Belqasem
|
||||||
|
Muhend Belkacem
|
||||||
Muḥend Belqasem
|
Muḥend Belqasem
|
||||||
Myungjae Won
|
Myungjae Won
|
||||||
Nicholas Skinsacos
|
Nicholas Skinsacos
|
||||||
Nihad
|
Nihad
|
||||||
Nihad Suljić
|
Nihad Suljić
|
||||||
Oscar
|
Oscar
|
||||||
|
Paulius
|
||||||
|
Pedro Burlamaqui Bendahan
|
||||||
Peter deHaan
|
Peter deHaan
|
||||||
Pierre Neter
|
Pierre Neter
|
||||||
Pin-guang Chen
|
Pin-guang Chen
|
||||||
@@ -125,10 +145,12 @@ RickieES
|
|||||||
Rimas Kudelis
|
Rimas Kudelis
|
||||||
Rizky Ariestiyansyah
|
Rizky Ariestiyansyah
|
||||||
Rob Powell
|
Rob Powell
|
||||||
|
Robert
|
||||||
Roberto Alvarado
|
Roberto Alvarado
|
||||||
Rodrigo
|
Rodrigo
|
||||||
Rodrigo Guerra
|
Rodrigo Guerra
|
||||||
Rok Žerdin
|
Rok Žerdin
|
||||||
|
Romi Hardiyanto
|
||||||
Rongjian Zhang
|
Rongjian Zhang
|
||||||
Ruba
|
Ruba
|
||||||
Sahithi
|
Sahithi
|
||||||
@@ -139,9 +161,12 @@ Sara Todaro
|
|||||||
Sav22999
|
Sav22999
|
||||||
Schieck :)
|
Schieck :)
|
||||||
Selim Şumlu
|
Selim Şumlu
|
||||||
|
Sidak Singh Aulakh
|
||||||
Slimane Amiri
|
Slimane Amiri
|
||||||
|
Slimane Selyan AMIRI
|
||||||
Soumya Himanish Mohapatra
|
Soumya Himanish Mohapatra
|
||||||
Staś Małolepszy
|
Staś Małolepszy
|
||||||
|
Suriyaa ✌️️
|
||||||
Tema
|
Tema
|
||||||
Thomas Dalichow
|
Thomas Dalichow
|
||||||
Théo Chevalier
|
Théo Chevalier
|
||||||
@@ -150,6 +175,7 @@ Tim Visée
|
|||||||
Tomer Cohen
|
Tomer Cohen
|
||||||
Tomáš Zelina
|
Tomáš Zelina
|
||||||
Ton
|
Ton
|
||||||
|
Top
|
||||||
Tymur Faradzhev
|
Tymur Faradzhev
|
||||||
Uccen Marzuq
|
Uccen Marzuq
|
||||||
Varghese Thomas
|
Varghese Thomas
|
||||||
@@ -159,6 +185,7 @@ Vitaliy Krutko
|
|||||||
Weihang Lo
|
Weihang Lo
|
||||||
Wil Clouser
|
Wil Clouser
|
||||||
YFdyh000
|
YFdyh000
|
||||||
|
Yassine Aït-El-Mouden
|
||||||
Yongmin H
|
Yongmin H
|
||||||
You-Wen Liang (Mark)
|
You-Wen Liang (Mark)
|
||||||
aaaaalbert
|
aaaaalbert
|
||||||
@@ -169,6 +196,7 @@ alex_mayorga
|
|||||||
ariestiyansyah
|
ariestiyansyah
|
||||||
avelper
|
avelper
|
||||||
chilledfrogs
|
chilledfrogs
|
||||||
|
clouserw-mozilla-owner
|
||||||
dgadelha
|
dgadelha
|
||||||
dskmori
|
dskmori
|
||||||
ehuggett
|
ehuggett
|
||||||
@@ -180,25 +208,35 @@ gmontagu
|
|||||||
goofy
|
goofy
|
||||||
hello
|
hello
|
||||||
hi
|
hi
|
||||||
|
ivan.pompa
|
||||||
jesferman1993
|
jesferman1993
|
||||||
jlG
|
jlG
|
||||||
josotrix
|
josotrix
|
||||||
jspam
|
jspam
|
||||||
julenx
|
julenx
|
||||||
kenrick95
|
kenrick95
|
||||||
|
kumincir
|
||||||
|
m4hdi.pdroid
|
||||||
|
mail
|
||||||
manxmensch
|
manxmensch
|
||||||
marigalicer
|
marigalicer
|
||||||
|
marsf
|
||||||
|
merianosnikos
|
||||||
mirzet.omerovic.1992
|
mirzet.omerovic.1992
|
||||||
|
mujeebcpy
|
||||||
|
p.sanroman.bengoetxea
|
||||||
passionforlife
|
passionforlife
|
||||||
paul.trevor
|
paul.trevor
|
||||||
pyup.io bot
|
pyup.io bot
|
||||||
ravmn
|
ravmn
|
||||||
rcmainak
|
rcmainak
|
||||||
reza.habibi2008
|
reza.habibi2008
|
||||||
|
rgpublic
|
||||||
risger
|
risger
|
||||||
robbp
|
robbp
|
||||||
ruikunai
|
ruikunai
|
||||||
savemore99.sm
|
savemore99.sm
|
||||||
|
sergio
|
||||||
shikhar-scs
|
shikhar-scs
|
||||||
siparon
|
siparon
|
||||||
skystar-p
|
skystar-p
|
||||||
@@ -210,10 +248,13 @@ victor.gonzalezro
|
|||||||
xcffl
|
xcffl
|
||||||
ybouhamam
|
ybouhamam
|
||||||
yoshimitsu002
|
yoshimitsu002
|
||||||
|
yusup.ramdani
|
||||||
Μιχάλης
|
Μιχάλης
|
||||||
Марко Костић (Marko Kostić)
|
Марко Костић (Marko Kostić)
|
||||||
|
Ратко Вујановић
|
||||||
صفا الفليج
|
صفا الفليج
|
||||||
వీవెన్
|
వీవెన్
|
||||||
|
ജോയ്സ്
|
||||||
张无忌
|
张无忌
|
||||||
新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美
|
新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美
|
||||||
莫非前世那一眼
|
莫非前世那一眼
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ USER app
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --chown=app:app --from=builder /app .
|
COPY --chown=app:app --from=builder /app .
|
||||||
COPY --chown=app:app . .
|
COPY --chown=app:app . .
|
||||||
|
RUN mkdir -p /app/.config/configstore
|
||||||
|
RUN ln -s dist/version.json version.json
|
||||||
|
|
||||||
ENV PORT=1443
|
ENV PORT=1443
|
||||||
EXPOSE $PORT
|
EXPOSE $PORT
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Firefox Send
|
# [](https://send.firefox.com/)
|
||||||
|
|
||||||
[](https://circleci.com/gh/mozilla/send)
|
[](https://circleci.com/gh/mozilla/send)
|
||||||
|
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
* [Localization](#localization)
|
* [Localization](#localization)
|
||||||
* [Contributing](#contributing)
|
* [Contributing](#contributing)
|
||||||
* [Testing](#testing)
|
* [Testing](#testing)
|
||||||
|
* [Deployment](#deployment)
|
||||||
* [Android](#android)
|
* [Android](#android)
|
||||||
* [License](#license)
|
* [License](#license)
|
||||||
|
|
||||||
@@ -91,6 +92,12 @@ Pull requests are always welcome! Feel free to check out the list of ["good firs
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
see also [docs/deployment.md](docs/deployment.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Android
|
## Android
|
||||||
|
|
||||||
The android implementation is contained in the `android` directory, and can be viewed locally for easy testing and editing by running `ANDROID=1 npm start` and then visiting <http://localhost:8080>. CSS and image files are located in the `android/app/src/main/assets` directory.
|
The android implementation is contained in the `android` directory, and can be viewed locally for easy testing and editing by running `ANDROID=1 npm start` and then visiting <http://localhost:8080>. CSS and image files are located in the `android/app/src/main/assets` directory.
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
/* global window, navigator */
|
import 'intl-pluralrules';
|
||||||
import 'fluent-intl-polyfill';
|
|
||||||
import choo from 'choo';
|
import choo from 'choo';
|
||||||
import html from 'choo/html';
|
import html from 'choo/html';
|
||||||
import Raven from 'raven-js';
|
import * as Sentry from '@sentry/browser';
|
||||||
|
|
||||||
import { setApiUrlPrefix, getConstants } from '../app/api';
|
import { setApiUrlPrefix, getConstants } from '../app/api';
|
||||||
import metrics from '../app/metrics';
|
import metrics from '../app/metrics';
|
||||||
@@ -19,6 +18,8 @@ import share from './pages/share';
|
|||||||
import preferences from './pages/preferences';
|
import preferences from './pages/preferences';
|
||||||
import error from './pages/error';
|
import error from './pages/error';
|
||||||
import { getTranslator } from '../app/locale';
|
import { getTranslator } from '../app/locale';
|
||||||
|
import { setTranslate } from '../app/utils';
|
||||||
|
|
||||||
import { delay } from '../app/utils';
|
import { delay } from '../app/utils';
|
||||||
|
|
||||||
if (navigator.userAgent === 'Send Android') {
|
if (navigator.userAgent === 'Send Android') {
|
||||||
@@ -51,7 +52,7 @@ function body(main) {
|
|||||||
|
|
||||||
const menu = html`<a
|
const menu = html`<a
|
||||||
id="hamburger"
|
id="hamburger"
|
||||||
class="absolute pin-t pin-r z-50"
|
class="absolute top-0 right-0 z-50"
|
||||||
href="#"
|
href="#"
|
||||||
onclick="${clickPreferences}"
|
onclick="${clickPreferences}"
|
||||||
>
|
>
|
||||||
@@ -69,6 +70,7 @@ function body(main) {
|
|||||||
}
|
}
|
||||||
(async function start() {
|
(async function start() {
|
||||||
const translate = await getTranslator('en-US');
|
const translate = await getTranslator('en-US');
|
||||||
|
setTranslate(translate);
|
||||||
const { LIMITS, DEFAULTS } = await getConstants();
|
const { LIMITS, DEFAULTS } = await getConstants();
|
||||||
app.use(state => {
|
app.use(state => {
|
||||||
state.LIMITS = LIMITS;
|
state.LIMITS = LIMITS;
|
||||||
@@ -80,7 +82,7 @@ function body(main) {
|
|||||||
state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS);
|
state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS);
|
||||||
state.storage = storage;
|
state.storage = storage;
|
||||||
state.user = new User(storage, LIMITS);
|
state.user = new User(storage, LIMITS);
|
||||||
state.raven = Raven;
|
state.sentry = Sentry;
|
||||||
});
|
});
|
||||||
app.use(metrics);
|
app.use(metrics);
|
||||||
app.route('/', body(home));
|
app.route('/', body(home));
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
apply plugin: 'kotlin-android-extensions'
|
apply plugin: 'kotlin-android-extensions'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
@@ -31,7 +29,7 @@ dependencies {
|
|||||||
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
||||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
||||||
implementation 'com.github.delight-im:Android-AdvancedWebView:v3.0.0'
|
implementation 'com.github.delight-im:Android-AdvancedWebView:v3.0.0'
|
||||||
implementation "org.mozilla.components:service-firefox-accounts:${rootProject.ext.android_components_version}"
|
implementation "org.mozilla.components:service-firefox-accounts:$android_components_version"
|
||||||
}
|
}
|
||||||
|
|
||||||
task generateAndLinkBundle(type: Exec, description: 'Generate the android.js bundle and link it into the assets directory') {
|
task generateAndLinkBundle(type: Exec, description: 'Generate the android.js bundle and link it into the assets directory') {
|
||||||
|
|||||||
@@ -1,39 +1,39 @@
|
|||||||
package org.mozilla.firefoxsend
|
package org.mozilla.firefoxsend
|
||||||
|
|
||||||
|
|
||||||
import android.support.v7.app.AppCompatActivity
|
|
||||||
import android.os.Bundle
|
|
||||||
import im.delight.android.webview.AdvancedWebView
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.content.Intent
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.Bitmap
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.webkit.WebView
|
import android.os.Bundle
|
||||||
import android.webkit.WebMessage
|
import android.support.v7.app.AppCompatActivity
|
||||||
import android.util.Log
|
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.webkit.ConsoleMessage
|
import android.webkit.*
|
||||||
import android.webkit.JavascriptInterface
|
import im.delight.android.webview.AdvancedWebView
|
||||||
import android.webkit.WebChromeClient
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
import mozilla.components.service.fxa.Config
|
import mozilla.components.service.fxa.Config
|
||||||
import mozilla.components.service.fxa.FirefoxAccount
|
import mozilla.components.service.fxa.FirefoxAccount
|
||||||
import mozilla.components.service.fxa.Profile
|
|
||||||
import mozilla.components.service.fxa.FxaResult
|
import mozilla.components.service.fxa.FxaResult
|
||||||
|
import org.json.JSONObject
|
||||||
|
|
||||||
internal class LoggingWebChromeClient : WebChromeClient() {
|
internal class LoggingWebChromeClient : WebChromeClient() {
|
||||||
override fun onConsoleMessage(cm: ConsoleMessage): Boolean {
|
override fun onConsoleMessage(cm: ConsoleMessage): Boolean {
|
||||||
Log.w("CONTENT", String.format("%s @ %d: %s",
|
Log.d(TAG, String.format("%s @ %d: %s",
|
||||||
cm.message(), cm.lineNumber(), cm.sourceId()))
|
cm.message(), cm.lineNumber(), cm.sourceId()))
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "CONTENT"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class WebAppInterface(private val mContext: MainActivity) {
|
class WebAppInterface(private val mContext: MainActivity) {
|
||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
fun beginOAuthFlow() {
|
fun beginOAuthFlow() {
|
||||||
mContext.beginOAuthFlow();
|
mContext.beginOAuthFlow()
|
||||||
}
|
}
|
||||||
|
|
||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
@@ -43,176 +43,184 @@ class WebAppInterface(private val mContext: MainActivity) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity(), AdvancedWebView.Listener {
|
class MainActivity : AppCompatActivity(), AdvancedWebView.Listener {
|
||||||
private var mWebView: AdvancedWebView? = null
|
|
||||||
private var mToShare: String? = null
|
private var mToShare: String? = null
|
||||||
private var mToCall: String? = null
|
private var mToCall: String? = null
|
||||||
private var mAccount: FirefoxAccount? = null
|
private var mAccount: FirefoxAccount? = null
|
||||||
|
|
||||||
|
@SuppressLint("SetJavaScriptEnabled")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContentView(R.layout.activity_main)
|
setContentView(R.layout.activity_main)
|
||||||
|
|
||||||
// https://developers.google.com/web/tools/chrome-devtools/remote-debugging/webviews
|
WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG)
|
||||||
// WebView.setWebContentsDebuggingEnabled(true); // TODO only dev builds
|
webView.apply {
|
||||||
|
setListener(this@MainActivity, this@MainActivity)
|
||||||
|
addJavascriptInterface(WebAppInterface(this@MainActivity), JS_INTERFACE_NAME)
|
||||||
|
setLayerType(View.LAYER_TYPE_HARDWARE, null)
|
||||||
|
webChromeClient = LoggingWebChromeClient()
|
||||||
|
|
||||||
mWebView = findViewById<WebView>(R.id.webview) as AdvancedWebView
|
settings.apply {
|
||||||
mWebView!!.setListener(this, this)
|
userAgentString = "Send Android"
|
||||||
mWebView!!.setWebChromeClient(LoggingWebChromeClient())
|
allowUniversalAccessFromFileURLs = true
|
||||||
mWebView!!.addJavascriptInterface(WebAppInterface(this), "Android")
|
javaScriptEnabled = true
|
||||||
mWebView!!.setLayerType(View.LAYER_TYPE_HARDWARE, null);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val webSettings = mWebView!!.getSettings()
|
val type = intent.type
|
||||||
webSettings.setUserAgentString("Send Android")
|
if (Intent.ACTION_SEND == intent.action && type != null) {
|
||||||
webSettings.setAllowUniversalAccessFromFileURLs(true)
|
if (type == "text/plain") {
|
||||||
webSettings.setJavaScriptEnabled(true)
|
|
||||||
|
|
||||||
val intent = getIntent()
|
|
||||||
val action = intent.getAction()
|
|
||||||
val type = intent.getType()
|
|
||||||
|
|
||||||
if (Intent.ACTION_SEND.equals(action) && type != null) {
|
|
||||||
if (type.equals("text/plain")) {
|
|
||||||
val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)
|
val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)
|
||||||
Log.w("INTENT", "text/plain " + sharedText)
|
// Log.d(TAG_INTENT, "text/plain $sharedText")
|
||||||
mToShare = "data:text/plain;base64," + Base64.encodeToString(sharedText.toByteArray(), 16).trim()
|
mToShare = "data:text/plain;base64," + Base64.encodeToString(sharedText.toByteArray(), 16).trim()
|
||||||
} else if (type.startsWith("image/")) {
|
} else if (type.startsWith("image/")) {
|
||||||
val imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM) as Uri
|
val imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM) as Uri
|
||||||
Log.w("INTENT", "image/ " + imageUri)
|
// Log.d(TAG_INTENT, "image/ $imageUri")
|
||||||
mToShare = "data:text/plain;base64," + Base64.encodeToString(imageUri.path.toByteArray(), 16).trim()
|
mToShare = "data:text/plain;base64," + Base64.encodeToString(imageUri.path.toByteArray(), 16).trim()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
webView.loadUrl("file:///android_asset/android.html")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun beginOAuthFlow() {
|
fun beginOAuthFlow() {
|
||||||
Config.release().then(fun (value: Config): FxaResult<Unit> {
|
Config.release().then { value ->
|
||||||
mAccount = FirefoxAccount(value, "20f7931c9054d833", "https://send.firefox.com/fxa/android-redirect.html")
|
mAccount = FirefoxAccount(value, "20f7931c9054d833", "https://send.firefox.com/fxa/android-redirect.html")
|
||||||
mAccount?.beginOAuthFlow(arrayOf("profile", "https://identity.mozilla.com/apps/send"), true)?.then(fun (url: String): FxaResult<Unit> {
|
mAccount?.beginOAuthFlow(arrayOf("profile", "https://identity.mozilla.com/apps/send"), true)
|
||||||
Log.w("CONFIG", "GOT A URL " + url)
|
?.then { url ->
|
||||||
this@MainActivity.runOnUiThread({
|
// Log.d(TAG_CONFIG, "GOT A URL $url")
|
||||||
mWebView!!.loadUrl(url)
|
this@MainActivity.runOnUiThread {
|
||||||
})
|
webView.loadUrl(url)
|
||||||
return FxaResult.fromValue(Unit)
|
}
|
||||||
})
|
FxaResult.fromValue(Unit)
|
||||||
Log.w("CONFIG", "CREATED FIREFOXACCOUNT")
|
}
|
||||||
return FxaResult.fromValue(Unit)
|
// Log.d(TAG_CONFIG, "CREATED FIREFOXACCOUNT")
|
||||||
})
|
FxaResult.fromValue(Unit)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun shareUrl(url: String) {
|
fun shareUrl(url: String) {
|
||||||
val shareIntent = Intent()
|
val shareIntent = Intent().apply {
|
||||||
shareIntent.action = Intent.ACTION_SEND
|
action = Intent.ACTION_SEND
|
||||||
shareIntent.type = "text/plain"
|
type = "text/plain"
|
||||||
shareIntent.putExtra(Intent.EXTRA_TEXT, url)
|
putExtra(Intent.EXTRA_TEXT, url)
|
||||||
|
}
|
||||||
|
|
||||||
|
val components = arrayOf(ComponentName(applicationContext, MainActivity::class.java))
|
||||||
val chooser = Intent.createChooser(shareIntent, "")
|
val chooser = Intent.createChooser(shareIntent, "")
|
||||||
chooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, arrayOf(ComponentName(applicationContext, MainActivity::class.java)))
|
.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, components)
|
||||||
|
|
||||||
startActivity(chooser)
|
startActivity(chooser)
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
mWebView!!.onResume()
|
webView.onResume()
|
||||||
// ...
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
mWebView!!.onPause()
|
webView.onPause()
|
||||||
// ...
|
|
||||||
super.onPause()
|
super.onPause()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
mWebView!!.onDestroy()
|
webView.onDestroy()
|
||||||
// ...
|
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
|
||||||
super.onActivityResult(requestCode, resultCode, intent)
|
super.onActivityResult(requestCode, resultCode, intent)
|
||||||
mWebView!!.onActivityResult(requestCode, resultCode, intent)
|
webView.onActivityResult(requestCode, resultCode, intent)
|
||||||
// ...
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
if (!mWebView!!.onBackPressed()) {
|
if (!webView.onBackPressed()) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// ...
|
|
||||||
super.onBackPressed()
|
super.onBackPressed()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPageStarted(url: String, favicon: Bitmap?) {
|
override fun onPageStarted(url: String, favicon: Bitmap?) {
|
||||||
if (url.startsWith("https://send.firefox.com/fxa/android-redirect.html")) {
|
if (url.startsWith("https://send.firefox.com/fxa/android-redirect.html")) {
|
||||||
// We load this here so the user doesn't see the android-redirect.html page
|
// We load this here so the user doesn't see the android-redirect.html page
|
||||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
webView.loadUrl("file:///android_asset/android.html")
|
||||||
|
|
||||||
val parsed = Uri.parse(url)
|
val uri = Uri.parse(url)
|
||||||
val code = parsed.getQueryParameter("code")
|
uri.getQueryParameter("code")?.let { code ->
|
||||||
val state = parsed.getQueryParameter("state")
|
uri.getQueryParameter("state")?.let { state ->
|
||||||
|
|
||||||
code?.let { code ->
|
|
||||||
state?.let { state ->
|
|
||||||
mAccount?.completeOAuthFlow(code, state)?.whenComplete { info ->
|
mAccount?.completeOAuthFlow(code, state)?.whenComplete { info ->
|
||||||
//displayAndPersistProfile(code, state)
|
mAccount?.getProfile(false)?.then { profile ->
|
||||||
val profile = mAccount?.getProfile(false)?.then(fun (profile: Profile): FxaResult<Unit> {
|
val profileJsonPayload = JSONObject()
|
||||||
val accessToken = info.accessToken
|
.put("accessToken", info.accessToken)
|
||||||
val keys = info.keys
|
.put("keys", info.keys)
|
||||||
val avatar = profile.avatar
|
.put("avatar", profile.avatar)
|
||||||
val displayName = profile.displayName
|
.put("displayName", profile.displayName)
|
||||||
val email = profile.email
|
.put("email", profile.email)
|
||||||
val uid = profile.uid
|
.put("uid", profile.uid).toString()
|
||||||
val toPass = "{\"accessToken\": \"${accessToken}\", \"keys\": '${keys}', \"avatar\": \"${avatar}\", \"displayName\": \"${displayName}\", \"email\": \"${email}\", \"uid\": \"${uid}\"}"
|
mToCall = "finishLogin($profileJsonPayload)"
|
||||||
mToCall = "finishLogin(${toPass})"
|
this@MainActivity.runOnUiThread {
|
||||||
this@MainActivity.runOnUiThread({
|
|
||||||
// Clear the history so that the user can't use the back button to see broken pages
|
// Clear the history so that the user can't use the back button to see broken pages
|
||||||
// that were inserted into the history by the login process.
|
// that were inserted into the history by the login process.
|
||||||
mWebView!!.clearHistory()
|
webView.clearHistory()
|
||||||
|
|
||||||
// We also reload this here because we need to make sure onPageFinished runs after mToCall has been set.
|
// We also reload this here because we need to make sure onPageFinished runs after mToCall has been set.
|
||||||
// We can't guarantee that onPageFinished wasn't already called at this point.
|
// We can't guarantee that onPageFinished wasn't already called at this point.
|
||||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
webView.loadUrl("file:///android_asset/android.html")
|
||||||
})
|
}
|
||||||
|
FxaResult.fromValue(Unit)
|
||||||
|
}
|
||||||
return FxaResult.fromValue(Unit)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.w("MAIN", "onPageStarted");
|
if (!url.startsWith("file:///android_asset/") && !url.startsWith("https://accounts.firefox.com/")) {
|
||||||
|
// Don't allow loading anything other than the app in our webview
|
||||||
|
// It should be possible to do this with shouldOverrideUrlLoading
|
||||||
|
// but it didn't seem to be working, so this works as a hack.
|
||||||
|
webView.loadUrl("file:///android_asset/android.html")
|
||||||
|
Log.d(TAG_MAIN, "BAD URL " + url)
|
||||||
|
} else {
|
||||||
|
// Log.d(TAG_MAIN, "onPageStarted " + url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPageFinished(url: String) {
|
override fun onPageFinished(url: String) {
|
||||||
Log.w("MAIN", "onPageFinished")
|
// Log.d(TAG_MAIN, "onPageFinished")
|
||||||
if (mToShare != null) {
|
if (mToShare != null) {
|
||||||
Log.w("INTENT", mToShare)
|
// Log.d(TAG_INTENT, mToShare)
|
||||||
|
|
||||||
mWebView?.postWebMessage(WebMessage(mToShare), Uri.EMPTY)
|
webView.postWebMessage(WebMessage(mToShare), Uri.EMPTY)
|
||||||
mToShare = null
|
mToShare = null
|
||||||
}
|
}
|
||||||
if (mToCall != null) {
|
if (mToCall != null) {
|
||||||
this@MainActivity.runOnUiThread({
|
this@MainActivity.runOnUiThread {
|
||||||
mWebView?.evaluateJavascript(mToCall, fun (value: String) {
|
webView.evaluateJavascript(mToCall) {
|
||||||
mToCall = null
|
mToCall = null
|
||||||
})
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPageError(errorCode: Int, description: String, failingUrl: String) {
|
override fun onPageError(errorCode: Int, description: String, failingUrl: String) {
|
||||||
Log.w("MAIN", "onPageError " + description)
|
Log.d(TAG_MAIN, "onPageError($errorCode, $description, $failingUrl)")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDownloadRequested(url: String, suggestedFilename: String, mimeType: String, contentLength: Long, contentDisposition: String, userAgent: String) {
|
override fun onDownloadRequested(url: String,
|
||||||
Log.w("MAIN", "onDownloadRequested")
|
suggestedFilename: String,
|
||||||
|
mimeType: String,
|
||||||
|
contentLength: Long,
|
||||||
|
contentDisposition: String,
|
||||||
|
userAgent: String) {
|
||||||
|
// Log.d(TAG_MAIN, "onDownloadRequested")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onExternalPageRequest(url: String) {
|
override fun onExternalPageRequest(url: String) {
|
||||||
Log.w("MAIN", "onExternalPageRequest")
|
// Log.d(TAG_MAIN, "onExternalPageRequest($url)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val TAG_MAIN = "MAIN"
|
||||||
|
private const val TAG_INTENT = "INTENT"
|
||||||
|
private const val TAG_CONFIG = "CONFIG"
|
||||||
|
private const val JS_INTERFACE_NAME = "Android"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<im.delight.android.webview.AdvancedWebView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/webView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".MainActivity">
|
tools:context=".MainActivity" />
|
||||||
|
|
||||||
<im.delight.android.webview.AdvancedWebView
|
|
||||||
android:id="@+id/webview"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent" />
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
|
||||||
@@ -8,20 +8,15 @@ buildscript {
|
|||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.3.1'
|
classpath 'com.android.tools.build:gradle:3.3.2'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.20"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21"
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
|
||||||
// in the individual module build.gradle files
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
maven {
|
maven { url "https://maven.mozilla.org/maven2" }
|
||||||
url "https://maven.mozilla.org/maven2"
|
|
||||||
}
|
|
||||||
jcenter()
|
jcenter()
|
||||||
maven { url "https://jitpack.io" }
|
maven { url "https://jitpack.io" }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,11 +42,7 @@ module.exports = function(state, emit) {
|
|||||||
content =
|
content =
|
||||||
archives.length < 1
|
archives.length < 1
|
||||||
? intro(state)
|
? intro(state)
|
||||||
: list(
|
: list(archives, 'h-full overflow-y-auto w-full', 'mb-3 w-full');
|
||||||
archives,
|
|
||||||
'list-reset h-full overflow-y-auto w-full',
|
|
||||||
'mb-3 w-full'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
@@ -57,7 +53,7 @@ module.exports = function(state, emit) {
|
|||||||
>
|
>
|
||||||
${content}
|
${content}
|
||||||
</section>
|
</section>
|
||||||
<div class="fixed pin-r pin-b z-20">
|
<div class="fixed right-0 bottom-0 z-20">
|
||||||
${button}
|
${button}
|
||||||
<input
|
<input
|
||||||
id="file-upload"
|
id="file-upload"
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export default function initialState(state, emitter) {
|
|||||||
getAsset(name) {
|
getAsset(name) {
|
||||||
return `${state.prefix}/${name}`;
|
return `${state.prefix}/${name}`;
|
||||||
},
|
},
|
||||||
raven: {
|
sentry: {
|
||||||
captureException: e => {
|
captureException: e => {
|
||||||
console.error('ERROR ' + e + ' ' + e.stack);
|
console.error('ERROR ' + e + ' ' + e.stack);
|
||||||
}
|
}
|
||||||
|
|||||||
78
app/api.js
78
app/api.js
@@ -11,6 +11,15 @@ if (!fileProtocolWssUrl) {
|
|||||||
fileProtocolWssUrl = 'wss://send.firefox.com/api/ws';
|
fileProtocolWssUrl = 'wss://send.firefox.com/api/ws';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class ConnectionError extends Error {
|
||||||
|
constructor(cancelled, duration, size) {
|
||||||
|
super(cancelled ? '0' : 'connection closed');
|
||||||
|
this.cancelled = cancelled;
|
||||||
|
this.duration = duration;
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function setFileProtocolWssUrl(url) {
|
export function setFileProtocolWssUrl(url) {
|
||||||
localStorage && localStorage.setItem('wssURL', url);
|
localStorage && localStorage.setItem('wssURL', url);
|
||||||
fileProtocolWssUrl = url;
|
fileProtocolWssUrl = url;
|
||||||
@@ -137,17 +146,25 @@ export async function setPassword(id, owner_token, keychain) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function asyncInitWebSocket(server) {
|
function asyncInitWebSocket(server) {
|
||||||
return new Promise(resolve => {
|
return new Promise((resolve, reject) => {
|
||||||
const ws = new WebSocket(server);
|
try {
|
||||||
ws.onopen = () => {
|
const ws = new WebSocket(server);
|
||||||
resolve(ws);
|
ws.addEventListener('open', () => resolve(ws), { once: true });
|
||||||
};
|
} catch (e) {
|
||||||
|
reject(new ConnectionError(false));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function listenForResponse(ws, canceller) {
|
function listenForResponse(ws, canceller) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
function handleClose(event) {
|
||||||
|
// a 'close' event before a 'message' event means the request failed
|
||||||
|
ws.removeEventListener('message', handleMessage);
|
||||||
|
reject(new ConnectionError(canceller.cancelled));
|
||||||
|
}
|
||||||
function handleMessage(msg) {
|
function handleMessage(msg) {
|
||||||
|
ws.removeEventListener('close', handleClose);
|
||||||
try {
|
try {
|
||||||
const response = JSON.parse(msg.data);
|
const response = JSON.parse(msg.data);
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
@@ -156,13 +173,11 @@ function listenForResponse(ws, canceller) {
|
|||||||
resolve(response);
|
resolve(response);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ws.close();
|
|
||||||
canceller.cancelled = true;
|
|
||||||
canceller.error = e;
|
|
||||||
reject(e);
|
reject(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ws.addEventListener('message', handleMessage, { once: true });
|
ws.addEventListener('message', handleMessage, { once: true });
|
||||||
|
ws.addEventListener('close', handleClose, { once: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,6 +191,8 @@ async function upload(
|
|||||||
onprogress,
|
onprogress,
|
||||||
canceller
|
canceller
|
||||||
) {
|
) {
|
||||||
|
let size = 0;
|
||||||
|
const start = Date.now();
|
||||||
const host = window.location.hostname;
|
const host = window.location.hostname;
|
||||||
const port = window.location.port;
|
const port = window.location.port;
|
||||||
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||||
@@ -203,31 +220,41 @@ async function upload(
|
|||||||
|
|
||||||
const reader = stream.getReader();
|
const reader = stream.getReader();
|
||||||
let state = await reader.read();
|
let state = await reader.read();
|
||||||
let size = 0;
|
|
||||||
while (!state.done) {
|
while (!state.done) {
|
||||||
const buf = state.value;
|
|
||||||
if (canceller.cancelled) {
|
if (canceller.cancelled) {
|
||||||
throw canceller.error;
|
ws.close();
|
||||||
}
|
}
|
||||||
|
if (ws.readyState !== WebSocket.OPEN) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const buf = state.value;
|
||||||
ws.send(buf);
|
ws.send(buf);
|
||||||
|
|
||||||
onprogress(size);
|
onprogress(size);
|
||||||
size += buf.length;
|
size += buf.length;
|
||||||
state = await reader.read();
|
state = await reader.read();
|
||||||
while (ws.bufferedAmount > ECE_RECORD_SIZE * 2) {
|
while (
|
||||||
|
ws.bufferedAmount > ECE_RECORD_SIZE * 2 &&
|
||||||
|
ws.readyState === WebSocket.OPEN &&
|
||||||
|
!canceller.cancelled
|
||||||
|
) {
|
||||||
await delay();
|
await delay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const footer = new Uint8Array([0]);
|
if (ws.readyState === WebSocket.OPEN) {
|
||||||
ws.send(footer);
|
ws.send(new Uint8Array([0])); //EOF
|
||||||
|
}
|
||||||
|
|
||||||
await completedResponse;
|
await completedResponse;
|
||||||
ws.close();
|
uploadInfo.duration = Date.now() - start;
|
||||||
return uploadInfo;
|
return uploadInfo;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ws.close(4000);
|
e.size = size;
|
||||||
|
e.duration = Date.now() - start;
|
||||||
throw e;
|
throw e;
|
||||||
|
} finally {
|
||||||
|
if (![WebSocket.CLOSED, WebSocket.CLOSING].includes(ws.readyState)) {
|
||||||
|
ws.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,7 +271,6 @@ export function uploadWs(
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
cancel: function() {
|
cancel: function() {
|
||||||
canceller.error = new Error(0);
|
|
||||||
canceller.cancelled = true;
|
canceller.cancelled = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -284,7 +310,7 @@ async function downloadS(id, keychain, signal) {
|
|||||||
return response.body;
|
return response.body;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function tryDownloadStream(id, keychain, signal, tries = 1) {
|
async function tryDownloadStream(id, keychain, signal, tries = 2) {
|
||||||
try {
|
try {
|
||||||
const result = await downloadS(id, keychain, signal);
|
const result = await downloadS(id, keychain, signal);
|
||||||
return result;
|
return result;
|
||||||
@@ -306,18 +332,19 @@ export function downloadStream(id, keychain) {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
cancel,
|
cancel,
|
||||||
result: tryDownloadStream(id, keychain, controller.signal, 2)
|
result: tryDownloadStream(id, keychain, controller.signal)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////
|
//////////////////
|
||||||
|
|
||||||
function download(id, keychain, onprogress, canceller) {
|
async function download(id, keychain, onprogress, canceller) {
|
||||||
|
const auth = await keychain.authHeader();
|
||||||
const xhr = new XMLHttpRequest();
|
const xhr = new XMLHttpRequest();
|
||||||
canceller.oncancel = function() {
|
canceller.oncancel = function() {
|
||||||
xhr.abort();
|
xhr.abort();
|
||||||
};
|
};
|
||||||
return new Promise(async function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
xhr.addEventListener('loadend', function() {
|
xhr.addEventListener('loadend', function() {
|
||||||
canceller.oncancel = function() {};
|
canceller.oncancel = function() {};
|
||||||
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
|
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
|
||||||
@@ -337,7 +364,6 @@ function download(id, keychain, onprogress, canceller) {
|
|||||||
onprogress(event.loaded);
|
onprogress(event.loaded);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const auth = await keychain.authHeader();
|
|
||||||
xhr.open('get', getApiUrl(`/api/download/blob/${id}`));
|
xhr.open('get', getApiUrl(`/api/download/blob/${id}`));
|
||||||
xhr.setRequestHeader('Authorization', auth);
|
xhr.setRequestHeader('Authorization', auth);
|
||||||
xhr.responseType = 'blob';
|
xhr.responseType = 'blob';
|
||||||
@@ -346,7 +372,7 @@ function download(id, keychain, onprogress, canceller) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function tryDownload(id, keychain, onprogress, canceller, tries = 1) {
|
async function tryDownload(id, keychain, onprogress, canceller, tries = 2) {
|
||||||
try {
|
try {
|
||||||
const result = await download(id, keychain, onprogress, canceller);
|
const result = await download(id, keychain, onprogress, canceller);
|
||||||
return result;
|
return result;
|
||||||
@@ -367,7 +393,7 @@ export function downloadFile(id, keychain, onprogress) {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
cancel,
|
cancel,
|
||||||
result: tryDownload(id, keychain, onprogress, canceller, 2)
|
result: tryDownload(id, keychain, onprogress, canceller)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* global AUTH_CONFIG LOCALE */
|
/* global AUTH_CONFIG */
|
||||||
import { browserName } from './utils';
|
import { browserName, locale } from './utils';
|
||||||
|
|
||||||
async function checkCrypto() {
|
async function checkCrypto() {
|
||||||
try {
|
try {
|
||||||
@@ -76,8 +76,8 @@ async function polyfillStreams() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default async function getCapabilities() {
|
export default async function getCapabilities() {
|
||||||
const serviceWorker =
|
const browser = browserName();
|
||||||
'serviceWorker' in navigator && browserName() !== 'edge';
|
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
|
||||||
let crypto = await checkCrypto();
|
let crypto = await checkCrypto();
|
||||||
const nativeStreams = checkStreams();
|
const nativeStreams = checkStreams();
|
||||||
let polyStreams = false;
|
let polyStreams = false;
|
||||||
@@ -91,19 +91,22 @@ export default async function getCapabilities() {
|
|||||||
account = false;
|
account = false;
|
||||||
}
|
}
|
||||||
const share =
|
const share =
|
||||||
typeof navigator.share === 'function' && LOCALE.startsWith('en'); // en until strings merge
|
typeof navigator.share === 'function' && locale().startsWith('en'); // en until strings merge
|
||||||
|
|
||||||
const standalone =
|
const standalone =
|
||||||
window.matchMedia('(display-mode: standalone)').matches ||
|
window.matchMedia('(display-mode: standalone)').matches ||
|
||||||
navigator.standalone;
|
navigator.standalone;
|
||||||
|
|
||||||
|
const mobileFirefox =
|
||||||
|
browser === 'firefox' && /mobile/i.test(navigator.userAgent);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
account,
|
account,
|
||||||
crypto,
|
crypto,
|
||||||
serviceWorker,
|
serviceWorker,
|
||||||
streamUpload: nativeStreams || polyStreams,
|
streamUpload: nativeStreams || polyStreams,
|
||||||
streamDownload:
|
streamDownload:
|
||||||
nativeStreams && serviceWorker && browserName() !== 'safari',
|
nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox,
|
||||||
multifile: nativeStreams || polyStreams,
|
multifile: nativeStreams || polyStreams,
|
||||||
share,
|
share,
|
||||||
standalone
|
standalone
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ import FileSender from './fileSender';
|
|||||||
import FileReceiver from './fileReceiver';
|
import FileReceiver from './fileReceiver';
|
||||||
import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils';
|
import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils';
|
||||||
import * as metrics from './metrics';
|
import * as metrics from './metrics';
|
||||||
import { bytes } from './utils';
|
import { bytes, locale } from './utils';
|
||||||
import okDialog from './ui/okDialog';
|
import okDialog from './ui/okDialog';
|
||||||
import copyDialog from './ui/copyDialog';
|
import copyDialog from './ui/copyDialog';
|
||||||
import shareDialog from './ui/shareDialog';
|
import shareDialog from './ui/shareDialog';
|
||||||
import signupDialog from './ui/signupDialog';
|
import signupDialog from './ui/signupDialog';
|
||||||
|
import surveyDialog from './ui/surveyDialog';
|
||||||
|
|
||||||
export default function(state, emitter) {
|
export default function(state, emitter) {
|
||||||
let lastRender = 0;
|
let lastRender = 0;
|
||||||
@@ -75,7 +76,7 @@ export default function(state, emitter) {
|
|||||||
state.storage.remove(ownedFile.id);
|
state.storage.remove(ownedFile.id);
|
||||||
await ownedFile.del();
|
await ownedFile.del();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
state.raven.captureException(e);
|
state.sentry.captureException(e);
|
||||||
}
|
}
|
||||||
render();
|
render();
|
||||||
});
|
});
|
||||||
@@ -175,14 +176,17 @@ export default function(state, emitter) {
|
|||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.message === '0') {
|
if (err.message === '0') {
|
||||||
//cancelled. do nothing
|
//cancelled. do nothing
|
||||||
const duration = Date.now() - start;
|
metrics.cancelledUpload(archive, err.duration);
|
||||||
metrics.cancelledUpload(archive, duration);
|
|
||||||
render();
|
render();
|
||||||
} else {
|
} else {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.error(err);
|
console.error(err);
|
||||||
state.raven.captureException(err);
|
state.sentry.withScope(scope => {
|
||||||
metrics.stoppedUpload(archive);
|
scope.setExtra('duration', err.duration);
|
||||||
|
scope.setExtra('size', err.size);
|
||||||
|
state.sentry.captureException(err);
|
||||||
|
});
|
||||||
|
metrics.stoppedUpload(archive, err.duration);
|
||||||
emitter.emit('pushState', '/error');
|
emitter.emit('pushState', '/error');
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@@ -261,7 +265,12 @@ export default function(state, emitter) {
|
|||||||
state.transfer = null;
|
state.transfer = null;
|
||||||
const location = err.message === '404' ? '/404' : '/error';
|
const location = err.message === '404' ? '/404' : '/error';
|
||||||
if (location === '/error') {
|
if (location === '/error') {
|
||||||
state.raven.captureException(err);
|
state.sentry.withScope(scope => {
|
||||||
|
scope.setExtra('duration', err.duration);
|
||||||
|
scope.setExtra('size', err.size);
|
||||||
|
scope.setExtra('progress', err.progress);
|
||||||
|
state.sentry.captureException(err);
|
||||||
|
});
|
||||||
const duration = Date.now() - start;
|
const duration = Date.now() - start;
|
||||||
metrics.stoppedDownload({
|
metrics.stoppedDownload({
|
||||||
size,
|
size,
|
||||||
@@ -281,6 +290,22 @@ export default function(state, emitter) {
|
|||||||
// metrics.copiedLink({ location });
|
// metrics.copiedLink({ location });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
emitter.on('closeModal', () => {
|
||||||
|
if (
|
||||||
|
state.PREFS.surveyUrl &&
|
||||||
|
['copy', 'share'].includes(state.modal.type) &&
|
||||||
|
locale().startsWith('en') &&
|
||||||
|
(state.storage.totalUploads > 1 || state.storage.totalDownloads > 0) &&
|
||||||
|
!state.user.surveyed
|
||||||
|
) {
|
||||||
|
state.user.surveyed = true;
|
||||||
|
state.modal = surveyDialog();
|
||||||
|
} else {
|
||||||
|
state.modal = null;
|
||||||
|
}
|
||||||
|
render();
|
||||||
|
});
|
||||||
|
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
// poll for updates of the upload list
|
// poll for updates of the upload list
|
||||||
if (!state.modal && state.route === '/') {
|
if (!state.modal && state.route === '/') {
|
||||||
|
|||||||
@@ -1,6 +1,22 @@
|
|||||||
import hash from 'string-hash';
|
import hash from 'string-hash';
|
||||||
|
import Account from './ui/account';
|
||||||
|
|
||||||
const experiments = {};
|
const experiments = {
|
||||||
|
signin_button_color: {
|
||||||
|
eligible: function() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
variant: function() {
|
||||||
|
return ['white-blue', 'blue', 'white-violet', 'violet'][
|
||||||
|
Math.floor(Math.random() * 4)
|
||||||
|
];
|
||||||
|
},
|
||||||
|
run: function(variant, state) {
|
||||||
|
const account = state.cache(Account, 'account');
|
||||||
|
account.buttonClass = variant;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//Returns a number between 0 and 1
|
//Returns a number between 0 and 1
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
@@ -25,23 +41,12 @@ export default function initialize(state, emitter) {
|
|||||||
xp.run(+state.query.v, state, emitter);
|
xp.run(+state.query.v, state, emitter);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
const enrolled = state.storage.enrolled;
|
||||||
if (!state.storage.get('testpilot_ga__cid')) {
|
// single experiment per session for now
|
||||||
// first ever visit. check again after cid is assigned.
|
const id = Object.keys(enrolled)[0];
|
||||||
emitter.on('DOMContentLoaded', () => {
|
if (Object.keys(experiments).includes(id)) {
|
||||||
checkExperiments(state, emitter);
|
experiments[id].run(enrolled[id], state, emitter);
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
const enrolled = state.storage.enrolled.filter(([id, variant]) => {
|
checkExperiments(state, emitter);
|
||||||
const xp = experiments[id];
|
|
||||||
if (xp) {
|
|
||||||
xp.run(variant, state, emitter);
|
|
||||||
}
|
|
||||||
return !!xp;
|
|
||||||
});
|
|
||||||
// single experiment per session for now
|
|
||||||
if (enrolled.length === 0) {
|
|
||||||
checkExperiments(state, emitter);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ export default class FileReceiver extends Nanobus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async downloadStream(noSave = false) {
|
async downloadStream(noSave = false) {
|
||||||
|
const start = Date.now();
|
||||||
const onprogress = p => {
|
const onprogress = p => {
|
||||||
this.progress = [p, this.fileInfo.size];
|
this.progress = [p, this.fileInfo.size];
|
||||||
this.emit('progress');
|
this.emit('progress');
|
||||||
@@ -153,9 +154,7 @@ export default class FileReceiver extends Nanobus {
|
|||||||
const downloadPath = `/api/download/${this.fileInfo.id}`;
|
const downloadPath = `/api/download/${this.fileInfo.id}`;
|
||||||
let downloadUrl = getApiUrl(downloadPath);
|
let downloadUrl = getApiUrl(downloadPath);
|
||||||
if (downloadUrl === downloadPath) {
|
if (downloadUrl === downloadPath) {
|
||||||
downloadUrl = `${location.protocol}//${location.host}/api/download/${
|
downloadUrl = `${location.protocol}//${location.host}${downloadPath}`;
|
||||||
this.fileInfo.id
|
|
||||||
}`;
|
|
||||||
}
|
}
|
||||||
const a = document.createElement('a');
|
const a = document.createElement('a');
|
||||||
a.href = downloadUrl;
|
a.href = downloadUrl;
|
||||||
@@ -164,11 +163,29 @@ export default class FileReceiver extends Nanobus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let prog = 0;
|
let prog = 0;
|
||||||
|
let hangs = 0;
|
||||||
while (prog < this.fileInfo.size) {
|
while (prog < this.fileInfo.size) {
|
||||||
const msg = await this.sendMessageToSw({
|
const msg = await this.sendMessageToSw({
|
||||||
request: 'progress',
|
request: 'progress',
|
||||||
id: this.fileInfo.id
|
id: this.fileInfo.id
|
||||||
});
|
});
|
||||||
|
if (msg.progress === prog) {
|
||||||
|
hangs++;
|
||||||
|
} else {
|
||||||
|
hangs = 0;
|
||||||
|
}
|
||||||
|
if (hangs > 30) {
|
||||||
|
// TODO: On Chrome we don't get a cancel
|
||||||
|
// signal so one is indistinguishable from
|
||||||
|
// a hang. We may be able to detect
|
||||||
|
// which end is hung in the service worker
|
||||||
|
// to improve on this.
|
||||||
|
const e = new Error('hung download');
|
||||||
|
e.duration = Date.now() - start;
|
||||||
|
e.size = this.fileInfo.size;
|
||||||
|
e.progress = prog;
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
prog = msg.progress;
|
prog = msg.progress;
|
||||||
onprogress(prog);
|
onprogress(prog);
|
||||||
await delay(1000);
|
await delay(1000);
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ export default class FileSender extends Nanobus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async upload(archive, bearerToken) {
|
async upload(archive, bearerToken) {
|
||||||
const start = Date.now();
|
|
||||||
if (this.cancelled) {
|
if (this.cancelled) {
|
||||||
throw new Error(0);
|
throw new Error(0);
|
||||||
}
|
}
|
||||||
@@ -76,7 +75,6 @@ export default class FileSender extends Nanobus {
|
|||||||
this.emit('progress'); // HACK to kick MS Edge
|
this.emit('progress'); // HACK to kick MS Edge
|
||||||
try {
|
try {
|
||||||
const result = await this.uploadRequest.result;
|
const result = await this.uploadRequest.result;
|
||||||
const time = Date.now() - start;
|
|
||||||
this.msg = 'notifyUploadEncryptDone';
|
this.msg = 'notifyUploadEncryptDone';
|
||||||
this.uploadRequest = null;
|
this.uploadRequest = null;
|
||||||
this.progress = [1, 1];
|
this.progress = [1, 1];
|
||||||
@@ -87,8 +85,8 @@ export default class FileSender extends Nanobus {
|
|||||||
name: archive.name,
|
name: archive.name,
|
||||||
size: archive.size,
|
size: archive.size,
|
||||||
manifest: archive.manifest,
|
manifest: archive.manifest,
|
||||||
time: time,
|
time: result.duration,
|
||||||
speed: archive.size / (time / 1000),
|
speed: archive.size / (result.duration / 1000),
|
||||||
createdAt: Date.now(),
|
createdAt: Date.now(),
|
||||||
expiresAt: Date.now() + archive.timeLimit * 1000,
|
expiresAt: Date.now() + archive.timeLimit * 1000,
|
||||||
secretKey: secretKey,
|
secretKey: secretKey,
|
||||||
|
|||||||
@@ -18,23 +18,6 @@ export default class Keychain {
|
|||||||
false,
|
false,
|
||||||
['deriveKey']
|
['deriveKey']
|
||||||
);
|
);
|
||||||
this.encryptKeyPromise = this.secretKeyPromise.then(function(secretKey) {
|
|
||||||
return crypto.subtle.deriveKey(
|
|
||||||
{
|
|
||||||
name: 'HKDF',
|
|
||||||
salt: new Uint8Array(),
|
|
||||||
info: encoder.encode('encryption'),
|
|
||||||
hash: 'SHA-256'
|
|
||||||
},
|
|
||||||
secretKey,
|
|
||||||
{
|
|
||||||
name: 'AES-GCM',
|
|
||||||
length: 128
|
|
||||||
},
|
|
||||||
false,
|
|
||||||
['encrypt', 'decrypt']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
this.metaKeyPromise = this.secretKeyPromise.then(function(secretKey) {
|
this.metaKeyPromise = this.secretKeyPromise.then(function(secretKey) {
|
||||||
return crypto.subtle.deriveKey(
|
return crypto.subtle.deriveKey(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FluentBundle } from 'fluent';
|
import { FluentBundle } from '@fluent/bundle';
|
||||||
|
|
||||||
function makeBundle(locale, ftl) {
|
function makeBundle(locale, ftl) {
|
||||||
const bundle = new FluentBundle(locale, { useIsolating: false });
|
const bundle = new FluentBundle(locale, { useIsolating: false });
|
||||||
@@ -10,9 +10,9 @@ export async function getTranslator(locale) {
|
|||||||
const bundles = [];
|
const bundles = [];
|
||||||
const { default: en } = await import('../public/locales/en-US/send.ftl');
|
const { default: en } = await import('../public/locales/en-US/send.ftl');
|
||||||
if (locale !== 'en-US') {
|
if (locale !== 'en-US') {
|
||||||
const {
|
const { default: ftl } = await import(
|
||||||
default: ftl
|
`../public/locales/${locale}/send.ftl`
|
||||||
} = await import(`../public/locales/${locale}/send.ftl`);
|
);
|
||||||
bundles.push(makeBundle(locale, ftl));
|
bundles.push(makeBundle(locale, ftl));
|
||||||
}
|
}
|
||||||
bundles.push(makeBundle('en-US', en));
|
bundles.push(makeBundle('en-US', en));
|
||||||
|
|||||||
100
app/main.css
100
app/main.css
@@ -1,4 +1,9 @@
|
|||||||
@tailwind preflight;
|
@tailwind base;
|
||||||
|
|
||||||
|
html {
|
||||||
|
line-height: 1.15;
|
||||||
|
}
|
||||||
|
|
||||||
@tailwind components;
|
@tailwind components;
|
||||||
|
|
||||||
:not(input) {
|
:not(input) {
|
||||||
@@ -8,6 +13,14 @@
|
|||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--violet-gradient: linear-gradient(
|
||||||
|
-180deg,
|
||||||
|
rgba(144, 89, 255, 0.8) 0%,
|
||||||
|
rgba(144, 89, 255, 0.4) 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@@ -31,6 +44,7 @@ body {
|
|||||||
@apply cursor-pointer;
|
@apply cursor-pointer;
|
||||||
@apply py-4;
|
@apply py-4;
|
||||||
@apply px-6;
|
@apply px-6;
|
||||||
|
@apply font-semibold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn:hover {
|
.btn:hover {
|
||||||
@@ -139,6 +153,11 @@ footer li:hover {
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.main-header img {
|
||||||
|
height: 32px;
|
||||||
|
width: 170px;
|
||||||
|
}
|
||||||
|
|
||||||
.intro {
|
.intro {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: unset;
|
height: unset;
|
||||||
@@ -159,7 +178,7 @@ footer li:hover {
|
|||||||
.mozilla-logo {
|
.mozilla-logo {
|
||||||
background-image: url('../assets/mozilla-logo.svg');
|
background-image: url('../assets/mozilla-logo.svg');
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-size: 100px, 32px;
|
background-size: 100px, 48px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-indent: 120%;
|
text-indent: 120%;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
@@ -246,6 +265,11 @@ select {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@screen md {
|
@screen md {
|
||||||
|
.main-header img {
|
||||||
|
height: 48px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.intro {
|
.intro {
|
||||||
max-width: unset;
|
max-width: unset;
|
||||||
height: unset;
|
height: unset;
|
||||||
@@ -261,7 +285,7 @@ select {
|
|||||||
@apply py-8;
|
@apply py-8;
|
||||||
|
|
||||||
min-height: 36rem;
|
min-height: 36rem;
|
||||||
max-height: 40rem;
|
max-height: 42rem;
|
||||||
width: calc(100% - 3rem);
|
width: calc(100% - 3rem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -274,8 +298,9 @@ select {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.shadow-big {
|
.shadow-big {
|
||||||
box-shadow: 0 0 32px 0 rgba(12, 12, 13, 0.1),
|
box-shadow: 0 12px 18px 2px rgba(34, 0, 51, 0.04),
|
||||||
0 2px 16px 0 rgba(12, 12, 13, 0.05);
|
0 6px 22px 4px rgba(7, 48, 114, 0.12),
|
||||||
|
0 6px 10px -4px rgba(14, 13, 26, 0.12);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,4 +312,69 @@ select {
|
|||||||
|
|
||||||
.word-break-all {
|
.word-break-all {
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
|
line-break: anywhere;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.signin {
|
||||||
|
backface-visibility: hidden;
|
||||||
|
border-radius: 6px;
|
||||||
|
transition-property: transform, background-color;
|
||||||
|
transition-duration: 250ms;
|
||||||
|
transition-timing-function: cubic-bezier(0.07, 0.95, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.signin:hover,
|
||||||
|
.signin:focus {
|
||||||
|
@apply shadow-btn;
|
||||||
|
|
||||||
|
transform: scale(1.0625);
|
||||||
|
}
|
||||||
|
|
||||||
|
.signin:hover:active {
|
||||||
|
transform: scale(0.9375);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* begin signin button color experiment */
|
||||||
|
|
||||||
|
.white-blue {
|
||||||
|
@apply border-blue-dark;
|
||||||
|
@apply border-2;
|
||||||
|
@apply text-blue-dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
.white-blue:hover,
|
||||||
|
.white-blue:focus {
|
||||||
|
@apply bg-blue-dark;
|
||||||
|
@apply text-white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blue {
|
||||||
|
@apply bg-blue-dark;
|
||||||
|
@apply text-white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.white-violet {
|
||||||
|
@apply border-violet;
|
||||||
|
@apply border-2;
|
||||||
|
@apply text-violet;
|
||||||
|
}
|
||||||
|
|
||||||
|
.white-violet:hover,
|
||||||
|
.white-violet:focus {
|
||||||
|
@apply bg-violet;
|
||||||
|
@apply text-white;
|
||||||
|
|
||||||
|
background-image: var(--violet-gradient);
|
||||||
|
}
|
||||||
|
|
||||||
|
.violet {
|
||||||
|
@apply bg-violet;
|
||||||
|
@apply text-white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.violet:hover,
|
||||||
|
.violet:focus {
|
||||||
|
background-image: var(--violet-gradient);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end signin button color experiment */
|
||||||
|
|||||||
23
app/main.js
23
app/main.js
@@ -1,7 +1,7 @@
|
|||||||
/* global DEFAULTS LIMITS LOCALE */
|
/* global DEFAULTS LIMITS PREFS */
|
||||||
import 'core-js';
|
import 'core-js';
|
||||||
import 'fast-text-encoding'; // MS Edge support
|
import 'fast-text-encoding'; // MS Edge support
|
||||||
import 'fluent-intl-polyfill';
|
import 'intl-pluralrules';
|
||||||
import choo from 'choo';
|
import choo from 'choo';
|
||||||
import nanotiming from 'nanotiming';
|
import nanotiming from 'nanotiming';
|
||||||
import routes from './routes';
|
import routes from './routes';
|
||||||
@@ -12,15 +12,15 @@ import pasteManager from './pasteManager';
|
|||||||
import storage from './storage';
|
import storage from './storage';
|
||||||
import metrics from './metrics';
|
import metrics from './metrics';
|
||||||
import experiments from './experiments';
|
import experiments from './experiments';
|
||||||
import Raven from 'raven-js';
|
import * as Sentry from '@sentry/browser';
|
||||||
import './main.css';
|
import './main.css';
|
||||||
import User from './user';
|
import User from './user';
|
||||||
import { getTranslator } from './locale';
|
import { getTranslator } from './locale';
|
||||||
import Archive from './archive';
|
import Archive from './archive';
|
||||||
import { setTranslate } from './utils';
|
import { setTranslate, locale } from './utils';
|
||||||
|
|
||||||
if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) {
|
if (navigator.doNotTrack !== '1' && window.SENTRY_CONFIG) {
|
||||||
Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install();
|
Sentry.init(window.SENTRY_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'production') {
|
if (process.env.NODE_ENV === 'production') {
|
||||||
@@ -45,27 +45,30 @@ if (process.env.NODE_ENV === 'production') {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const translate = await getTranslator(LOCALE);
|
const translate = await getTranslator(locale());
|
||||||
setTranslate(translate);
|
setTranslate(translate);
|
||||||
|
// eslint-disable-next-line require-atomic-updates
|
||||||
window.initialState = {
|
window.initialState = {
|
||||||
LIMITS,
|
LIMITS,
|
||||||
DEFAULTS,
|
DEFAULTS,
|
||||||
|
PREFS,
|
||||||
archive: new Archive([], DEFAULTS.EXPIRE_SECONDS),
|
archive: new Archive([], DEFAULTS.EXPIRE_SECONDS),
|
||||||
capabilities,
|
capabilities,
|
||||||
translate,
|
translate,
|
||||||
storage,
|
storage,
|
||||||
raven: Raven,
|
sentry: Sentry,
|
||||||
user: new User(storage, LIMITS, window.AUTH_CONFIG),
|
user: new User(storage, LIMITS, window.AUTH_CONFIG),
|
||||||
transfer: null,
|
transfer: null,
|
||||||
fileInfo: null
|
fileInfo: null
|
||||||
};
|
};
|
||||||
|
|
||||||
const app = routes(choo());
|
const app = routes(choo({ hash: true }));
|
||||||
|
// eslint-disable-next-line require-atomic-updates
|
||||||
window.app = app;
|
window.app = app;
|
||||||
|
app.use(experiments);
|
||||||
app.use(metrics);
|
app.use(metrics);
|
||||||
app.use(controller);
|
app.use(controller);
|
||||||
app.use(dragManager);
|
app.use(dragManager);
|
||||||
app.use(experiments);
|
|
||||||
app.use(pasteManager);
|
app.use(pasteManager);
|
||||||
app.mount('body');
|
app.mount('body');
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -1,21 +1,23 @@
|
|||||||
import storage from './storage';
|
import storage from './storage';
|
||||||
import { platform } from './utils';
|
import { platform, locale } from './utils';
|
||||||
import { sendMetrics } from './api';
|
import { sendMetrics } from './api';
|
||||||
|
|
||||||
let appState = null;
|
let appState = null;
|
||||||
// let experiment = null;
|
let experiment = null;
|
||||||
const HOUR = 1000 * 60 * 60;
|
const HOUR = 1000 * 60 * 60;
|
||||||
const events = [];
|
const events = [];
|
||||||
let session_id = Date.now();
|
let session_id = Date.now();
|
||||||
const lang = document.querySelector('html').lang;
|
const lang = locale();
|
||||||
|
|
||||||
export default function initialize(state, emitter) {
|
export default function initialize(state, emitter) {
|
||||||
appState = state;
|
appState = state;
|
||||||
if (!appState.user.firstAction) {
|
|
||||||
appState.user.firstAction = appState.route === '/' ? 'upload' : 'download';
|
|
||||||
}
|
|
||||||
emitter.on('DOMContentLoaded', () => {
|
emitter.on('DOMContentLoaded', () => {
|
||||||
// experiment = storage.enrolled[0];
|
experiment = storage.enrolled;
|
||||||
|
if (!appState.user.firstAction) {
|
||||||
|
appState.user.firstAction =
|
||||||
|
appState.route === '/' ? 'upload' : 'download';
|
||||||
|
}
|
||||||
const query = appState.query;
|
const query = appState.query;
|
||||||
addEvent('client_visit', {
|
addEvent('client_visit', {
|
||||||
entrypoint: appState.route === '/' ? 'upload' : 'download',
|
entrypoint: appState.route === '/' ? 'upload' : 'download',
|
||||||
@@ -59,6 +61,11 @@ function submitEvents() {
|
|||||||
async function addEvent(event_type, event_properties) {
|
async function addEvent(event_type, event_properties) {
|
||||||
const user_id = await appState.user.metricId();
|
const user_id = await appState.user.metricId();
|
||||||
const device_id = await appState.user.deviceId();
|
const device_id = await appState.user.deviceId();
|
||||||
|
const ab_id = Object.keys(experiment)[0];
|
||||||
|
if (ab_id) {
|
||||||
|
event_properties.experiment = ab_id;
|
||||||
|
event_properties.variant = experiment[ab_id];
|
||||||
|
}
|
||||||
events.push({
|
events.push({
|
||||||
device_id,
|
device_id,
|
||||||
event_properties,
|
event_properties,
|
||||||
@@ -100,9 +107,10 @@ function completedUpload(archive, duration) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function stoppedUpload(archive) {
|
function stoppedUpload(archive, duration = 0) {
|
||||||
return addEvent('client_upload', {
|
return addEvent('client_upload', {
|
||||||
download_limit: archive.dlimit,
|
download_limit: archive.dlimit,
|
||||||
|
duration: sizeOrder(duration),
|
||||||
file_count: archive.numFiles,
|
file_count: archive.numFiles,
|
||||||
password_protected: !!archive.password,
|
password_protected: !!archive.password,
|
||||||
size: sizeOrder(archive.size),
|
size: sizeOrder(archive.size),
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ const choo = require('choo');
|
|||||||
const download = require('./ui/download');
|
const download = require('./ui/download');
|
||||||
const body = require('./ui/body');
|
const body = require('./ui/body');
|
||||||
|
|
||||||
module.exports = function(app = choo()) {
|
module.exports = function(app = choo({ hash: true })) {
|
||||||
app.route('/', body(require('./ui/home')));
|
app.route('/', body(require('./ui/home')));
|
||||||
app.route('/download/:id', body(download));
|
app.route('/download/:id', body(download));
|
||||||
app.route('/download/:id/:key', body(download));
|
app.route('/download/:id/:key', body(download));
|
||||||
@@ -13,6 +13,7 @@ module.exports = function(app = choo()) {
|
|||||||
app.route('/oauth', function(state, emit) {
|
app.route('/oauth', function(state, emit) {
|
||||||
emit('authenticate', state.query.code, state.query.state);
|
emit('authenticate', state.query.code, state.query.state);
|
||||||
});
|
});
|
||||||
|
app.route('/login', body(require('./ui/home')));
|
||||||
app.route('*', body(require('./ui/notFound')));
|
app.route('*', body(require('./ui/notFound')));
|
||||||
return app;
|
return app;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,13 +11,14 @@ const map = new Map();
|
|||||||
const IMAGES = /.*\.(png|svg|jpg)$/;
|
const IMAGES = /.*\.(png|svg|jpg)$/;
|
||||||
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/;
|
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/;
|
||||||
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
||||||
|
const FONT = /\.woff2?$/;
|
||||||
|
|
||||||
self.addEventListener('install', event => {
|
self.addEventListener('install', event => {
|
||||||
event.waitUntil(precache());
|
event.waitUntil(precache());
|
||||||
});
|
});
|
||||||
|
|
||||||
self.addEventListener('activate', event => {
|
self.addEventListener('activate', event => {
|
||||||
event.waitUntil(self.clients.claim());
|
event.waitUntil(self.clients.claim().then(cleanCache));
|
||||||
});
|
});
|
||||||
|
|
||||||
async function decryptStream(id) {
|
async function decryptStream(id) {
|
||||||
@@ -83,16 +84,23 @@ async function decryptStream(id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function precache() {
|
async function precache() {
|
||||||
|
const cache = await caches.open(version);
|
||||||
|
const images = assets.match(IMAGES);
|
||||||
|
await cache.addAll(images);
|
||||||
|
return self.skipWaiting();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function cleanCache() {
|
||||||
const oldCaches = await caches.keys();
|
const oldCaches = await caches.keys();
|
||||||
for (const c of oldCaches) {
|
for (const c of oldCaches) {
|
||||||
if (c !== version) {
|
if (c !== version) {
|
||||||
await caches.delete(c);
|
await caches.delete(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const cache = await caches.open(version);
|
}
|
||||||
const images = assets.match(IMAGES);
|
|
||||||
await cache.addAll(images);
|
function cacheable(url) {
|
||||||
return self.skipWaiting();
|
return VERSIONED_ASSET.test(url) || FONT.test(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cachedOrFetched(req) {
|
async function cachedOrFetched(req) {
|
||||||
@@ -102,7 +110,7 @@ async function cachedOrFetched(req) {
|
|||||||
return cached;
|
return cached;
|
||||||
}
|
}
|
||||||
const fetched = await fetch(req);
|
const fetched = await fetch(req);
|
||||||
if (fetched.ok && VERSIONED_ASSET.test(req.url)) {
|
if (fetched.ok && cacheable(req.url)) {
|
||||||
cache.put(req, fetched.clone());
|
cache.put(req, fetched.clone());
|
||||||
}
|
}
|
||||||
return fetched;
|
return fetched;
|
||||||
@@ -115,7 +123,7 @@ self.onfetch = event => {
|
|||||||
const dlmatch = DOWNLOAD_URL.exec(url.pathname);
|
const dlmatch = DOWNLOAD_URL.exec(url.pathname);
|
||||||
if (dlmatch) {
|
if (dlmatch) {
|
||||||
event.respondWith(decryptStream(dlmatch[1]));
|
event.respondWith(decryptStream(dlmatch[1]));
|
||||||
} else if (VERSIONED_ASSET.test(url.pathname)) {
|
} else if (cacheable(url.pathname)) {
|
||||||
event.respondWith(cachedOrFetched(req));
|
event.respondWith(cachedOrFetched(req));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -86,16 +86,13 @@ class Storage {
|
|||||||
this.engine.setItem('referrer', str);
|
this.engine.setItem('referrer', str);
|
||||||
}
|
}
|
||||||
get enrolled() {
|
get enrolled() {
|
||||||
return JSON.parse(this.engine.getItem('experiments') || '[]');
|
return JSON.parse(this.engine.getItem('ab_experiments') || '{}');
|
||||||
}
|
}
|
||||||
|
|
||||||
enroll(id, variant) {
|
enroll(id, variant) {
|
||||||
const enrolled = this.enrolled;
|
const enrolled = {};
|
||||||
// eslint-disable-next-line no-unused-vars
|
enrolled[id] = variant;
|
||||||
if (!enrolled.find(([i, v]) => i === id)) {
|
this.engine.setItem('ab_experiments', JSON.stringify(enrolled));
|
||||||
enrolled.push([id, variant]);
|
|
||||||
this.engine.setItem('experiments', JSON.stringify(enrolled));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get files() {
|
get files() {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* global ReadableStream TransformStream */
|
/* global TransformStream */
|
||||||
|
|
||||||
export function transformStream(readable, transformer, oncancel) {
|
export function transformStream(readable, transformer, oncancel) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ class Account extends Component {
|
|||||||
this.emit = emit;
|
this.emit = emit;
|
||||||
this.enabled = state.capabilities.account;
|
this.enabled = state.capabilities.account;
|
||||||
this.local = state.components[name] = {};
|
this.local = state.components[name] = {};
|
||||||
this.setState();
|
this.buttonClass = '';
|
||||||
|
this.setLocal();
|
||||||
}
|
}
|
||||||
|
|
||||||
avatarClick(event) {
|
avatarClick(event) {
|
||||||
@@ -38,7 +39,7 @@ class Account extends Component {
|
|||||||
return this.local.loggedIn !== this.state.user.loggedIn;
|
return this.local.loggedIn !== this.state.user.loggedIn;
|
||||||
}
|
}
|
||||||
|
|
||||||
setState() {
|
setLocal() {
|
||||||
const changed = this.changed();
|
const changed = this.changed();
|
||||||
if (changed) {
|
if (changed) {
|
||||||
this.local.loggedIn = this.state.user.loggedIn;
|
this.local.loggedIn = this.state.user.loggedIn;
|
||||||
@@ -47,7 +48,7 @@ class Account extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
return this.setState();
|
return this.setLocal();
|
||||||
}
|
}
|
||||||
|
|
||||||
createElement() {
|
createElement() {
|
||||||
@@ -58,15 +59,17 @@ class Account extends Component {
|
|||||||
}
|
}
|
||||||
const user = this.state.user;
|
const user = this.state.user;
|
||||||
const translate = this.state.translate;
|
const translate = this.state.translate;
|
||||||
|
this.setLocal();
|
||||||
if (!this.local.loggedIn) {
|
if (!this.local.loggedIn) {
|
||||||
return html`
|
return html`
|
||||||
<send-account>
|
<send-account>
|
||||||
<button
|
<button
|
||||||
class="p-2 md:p-4 border rounded-lg text-blue-dark border-blue-dark hover:text-white hover:bg-blue-dark focus:outline"
|
class="px-4 py-2 md:px-8 md:py-4 focus:outline signin ${this
|
||||||
|
.buttonClass}"
|
||||||
onclick="${e => this.login(e)}"
|
onclick="${e => this.login(e)}"
|
||||||
title="${translate('signInButton')}"
|
title="${translate('signInOnlyButton')}"
|
||||||
>
|
>
|
||||||
${translate('signInButton')}
|
${translate('signInOnlyButton')}
|
||||||
</button>
|
</button>
|
||||||
</send-account>
|
</send-account>
|
||||||
`;
|
`;
|
||||||
@@ -82,7 +85,7 @@ class Account extends Component {
|
|||||||
/>
|
/>
|
||||||
<ul
|
<ul
|
||||||
id="accountMenu"
|
id="accountMenu"
|
||||||
class="invisible list-reset absolute pin-t pin-r mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50"
|
class="invisible absolute top-0 right-0 mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50"
|
||||||
onblur="${e => this.hideMenu(e)}"
|
onblur="${e => this.hideMenu(e)}"
|
||||||
>
|
>
|
||||||
<li class="p-2 text-grey-dark">${user.email}</li>
|
<li class="p-2 text-grey-dark">${user.email}</li>
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ function fileInfo(file, action) {
|
|||||||
function archiveInfo(archive, action) {
|
function archiveInfo(archive, action) {
|
||||||
return html`
|
return html`
|
||||||
<p class="w-full flex items-center">
|
<p class="w-full flex items-center">
|
||||||
<img class="mr-3 flex-no-shrink" src="${assets.get('blue_file.svg')}"/>
|
<img class="mr-3 flex-shrink-0" src="${assets.get('blue_file.svg')}"/>
|
||||||
<p class="flex-grow">
|
<p class="flex-grow">
|
||||||
<h1 class="text-base font-medium word-break-all">${archive.name}</h1>
|
<h1 class="text-base font-medium word-break-all">${archive.name}</h1>
|
||||||
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
||||||
@@ -155,7 +155,7 @@ function archiveDetails(translate, archive) {
|
|||||||
num: archive.manifest.files.length
|
num: archive.manifest.files.length
|
||||||
})}
|
})}
|
||||||
</summary>
|
</summary>
|
||||||
${list(archive.manifest.files.map(f => fileInfo(f)), 'list-reset')}
|
${list(archive.manifest.files.map(f => fileInfo(f)))}
|
||||||
</details>
|
</details>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
@@ -213,7 +213,7 @@ module.exports = function(state, emit, archive) {
|
|||||||
html`
|
html`
|
||||||
<input
|
<input
|
||||||
type="image"
|
type="image"
|
||||||
class="self-start flex-no-shrink text-white hover:opacity-75 focus:outline"
|
class="self-start flex-shrink-0 text-white hover:opacity-75 focus:outline"
|
||||||
alt="${state.translate('deleteButtonHover')}"
|
alt="${state.translate('deleteButtonHover')}"
|
||||||
title="${state.translate('deleteButtonHover')}"
|
title="${state.translate('deleteButtonHover')}"
|
||||||
src="${assets.get('close-16.svg')}"
|
src="${assets.get('close-16.svg')}"
|
||||||
@@ -256,9 +256,7 @@ module.exports = function(state, emit, archive) {
|
|||||||
try {
|
try {
|
||||||
await navigator.share({
|
await navigator.share({
|
||||||
title: state.translate('-send-brand'),
|
title: state.translate('-send-brand'),
|
||||||
text: `Download "${
|
text: `Download "${archive.name}" with Firefox Send: simple, safe file sharing`,
|
||||||
archive.name
|
|
||||||
}" with Firefox Send: simple, safe file sharing`,
|
|
||||||
//state.translate('shareMessage', { name }),
|
//state.translate('shareMessage', { name }),
|
||||||
url: archive.url
|
url: archive.url
|
||||||
});
|
});
|
||||||
@@ -278,15 +276,15 @@ module.exports.wip = function(state, emit) {
|
|||||||
.map(f =>
|
.map(f =>
|
||||||
fileInfo(f, remove(f, state.translate('deleteButtonHover')))
|
fileInfo(f, remove(f, state.translate('deleteButtonHover')))
|
||||||
),
|
),
|
||||||
'flex-shrink bg-grey-lightest rounded-t list-reset overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen',
|
'flex-shrink bg-grey-lightest rounded-t overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen',
|
||||||
'bg-white px-2 my-2 shadow-light rounded'
|
'bg-white px-2 my-2 shadow-light rounded'
|
||||||
)}
|
)}
|
||||||
<div
|
<div
|
||||||
class="flex-no-shrink flex-grow flex items-end p-4 bg-grey-lightest rounded-b mb-1 font-medium"
|
class="flex-shrink-0 flex-grow flex items-end p-4 bg-grey-lightest rounded-b mb-1 font-medium"
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
id="file-upload"
|
id="file-upload"
|
||||||
class="opacity-0 w-0 h-0 appearance-none absolute"
|
class="opacity-0 w-0 h-0 appearance-none absolute overflow-hidden"
|
||||||
type="file"
|
type="file"
|
||||||
multiple
|
multiple
|
||||||
onfocus="${focus}"
|
onfocus="${focus}"
|
||||||
@@ -315,7 +313,7 @@ module.exports.wip = function(state, emit) {
|
|||||||
${expiryOptions(state, emit)} ${password(state, emit)}
|
${expiryOptions(state, emit)} ${password(state, emit)}
|
||||||
<button
|
<button
|
||||||
id="upload-btn"
|
id="upload-btn"
|
||||||
class="btn rounded-lg flex-no-shrink focus:outline"
|
class="btn rounded-lg flex-shrink-0 focus:outline"
|
||||||
title="${state.translate('uploadButton')}"
|
title="${state.translate('uploadButton')}"
|
||||||
onclick="${upload}"
|
onclick="${upload}"
|
||||||
>
|
>
|
||||||
@@ -430,7 +428,7 @@ module.exports.empty = function(state, emit) {
|
|||||||
`;
|
`;
|
||||||
return html`
|
return html`
|
||||||
<send-upload-area
|
<send-upload-area
|
||||||
class="flex flex-col items-center justify-center border-2 border-dashed border-grey rounded px-6 py-16 h-full w-full"
|
class="flex flex-col items-center justify-center border-2 border-dashed border-grey-transparent rounded px-6 py-16 h-full w-full"
|
||||||
onclick="${e => {
|
onclick="${e => {
|
||||||
if (e.target.tagName !== 'LABEL') {
|
if (e.target.tagName !== 'LABEL') {
|
||||||
document.getElementById('file-upload').click();
|
document.getElementById('file-upload').click();
|
||||||
@@ -448,7 +446,7 @@ module.exports.empty = function(state, emit) {
|
|||||||
</div>
|
</div>
|
||||||
<input
|
<input
|
||||||
id="file-upload"
|
id="file-upload"
|
||||||
class="opacity-0 w-0 h-0 appearance-none absolute"
|
class="opacity-0 w-0 h-0 appearance-none absolute overflow-hidden"
|
||||||
type="file"
|
type="file"
|
||||||
multiple
|
multiple
|
||||||
onfocus="${focus}"
|
onfocus="${focus}"
|
||||||
@@ -509,7 +507,7 @@ module.exports.preview = function(state, emit) {
|
|||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
id="download-btn"
|
id="download-btn"
|
||||||
class="btn rounded-lg mt-4 w-full flex-no-shrink focus:outline"
|
class="btn rounded-lg mt-4 w-full flex-shrink-0 focus:outline"
|
||||||
title="${state.translate('downloadButtonLabel')}"
|
title="${state.translate('downloadButtonLabel')}"
|
||||||
onclick=${download}
|
onclick=${download}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ module.exports = function() {
|
|||||||
return html`
|
return html`
|
||||||
<main class="main">
|
<main class="main">
|
||||||
<section
|
<section
|
||||||
class="h-full w-full p-6 md:flex md:flex-row md:rounded-lg md:shadow-big"
|
class="h-full w-full p-6 md:p-8 md:flex md:flex-row md:rounded-xl md:shadow-big"
|
||||||
>
|
>
|
||||||
<div class="md:mr-6 md:w-1/2 w-full"></div>
|
<div class="md:mr-6 md:w-1/2 w-full"></div>
|
||||||
<div class="md:w-1/2 mt-6 md:mt-0 w-full"></div>
|
<div class="md:w-1/2 mt-6 md:mt-0 w-full"></div>
|
||||||
|
|||||||
@@ -8,10 +8,7 @@ function banner(state) {
|
|||||||
return; // server side
|
return; // server side
|
||||||
}
|
}
|
||||||
const show =
|
const show =
|
||||||
!state.capabilities.standalone &&
|
!state.capabilities.standalone && !state.route.startsWith('/unsupported/');
|
||||||
!/firefox/i.test(navigator.userAgent) &&
|
|
||||||
document.querySelector('html').lang.startsWith('en') &&
|
|
||||||
!state.route.startsWith('/unsupported/');
|
|
||||||
if (show) {
|
if (show) {
|
||||||
return state.cache(Promo, 'promo').render();
|
return state.cache(Promo, 'promo').render();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ const html = require('choo/html');
|
|||||||
const { copyToClipboard } = require('../utils');
|
const { copyToClipboard } = require('../utils');
|
||||||
|
|
||||||
module.exports = function(name, url) {
|
module.exports = function(name, url) {
|
||||||
return function(state, emit, close) {
|
const dialog = function(state, emit, close) {
|
||||||
return html`
|
return html`
|
||||||
<send-copy-dialog
|
<send-copy-dialog
|
||||||
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
||||||
>
|
>
|
||||||
<h1 class="font-bold my-4">
|
<h1 class="text-3xl font-bold my-4">
|
||||||
${state.translate('notifyUploadEncryptDone')}
|
${state.translate('notifyUploadEncryptDone')}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="font-normal leading-normal text-grey-darkest word-break-all">
|
<p class="font-normal leading-normal text-grey-darkest word-break-all">
|
||||||
@@ -22,7 +22,7 @@ module.exports = function(name, url) {
|
|||||||
readonly="true"
|
readonly="true"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
class="btn rounded-lg w-full flex-no-shrink focus:outline"
|
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
|
||||||
onclick="${copy}"
|
onclick="${copy}"
|
||||||
title="${state.translate('copyLinkButton')}"
|
title="${state.translate('copyLinkButton')}"
|
||||||
>
|
>
|
||||||
@@ -45,4 +45,6 @@ module.exports = function(name, url) {
|
|||||||
setTimeout(close, 1000);
|
setTimeout(close, 1000);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
dialog.type = 'copy';
|
||||||
|
return dialog;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ function downloading(state, emit) {
|
|||||||
<div
|
<div
|
||||||
class="flex flex-col w-full h-full items-center md:justify-center md:-mt-8"
|
class="flex flex-col w-full h-full items-center md:justify-center md:-mt-8"
|
||||||
>
|
>
|
||||||
<h1 class="mb-4">${state.translate('downloadingTitle')}</h1>
|
<h1 class="text-3xl font-bold mb-4">
|
||||||
|
${state.translate('downloadingTitle')}
|
||||||
|
</h1>
|
||||||
${archiveTile.downloading(state, emit)}
|
${archiveTile.downloading(state, emit)}
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
@@ -36,7 +38,9 @@ function preview(state, emit) {
|
|||||||
<div
|
<div
|
||||||
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
||||||
>
|
>
|
||||||
<h1 class="mb-4">${state.translate('downloadTitle')}</h1>
|
<h1 class="text-3xl font-bold mb-4">
|
||||||
|
${state.translate('downloadTitle')}
|
||||||
|
</h1>
|
||||||
<p class="w-full text-grey-darkest text-center leading-normal">
|
<p class="w-full text-grey-darkest text-center leading-normal">
|
||||||
${state.translate('downloadDescription')}
|
${state.translate('downloadDescription')}
|
||||||
</p>
|
</p>
|
||||||
@@ -76,7 +80,9 @@ module.exports = function(state, emit) {
|
|||||||
return html`
|
return html`
|
||||||
<main class="main">
|
<main class="main">
|
||||||
${state.modal && modal(state, emit)}
|
${state.modal && modal(state, emit)}
|
||||||
<section class="relative h-full w-full p-6 md:rounded-lg md:shadow-big">
|
<section
|
||||||
|
class="relative h-full w-full p-6 md:p-8 md:rounded-xl md:shadow-big"
|
||||||
|
>
|
||||||
${content}
|
${content}
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ module.exports = function(state) {
|
|||||||
id="download-complete"
|
id="download-complete"
|
||||||
class="flex flex-col items-center justify-center h-full w-full bg-white p-2"
|
class="flex flex-col items-center justify-center h-full w-full bg-white p-2"
|
||||||
>
|
>
|
||||||
<h1 class="text-center font-bold my-2">
|
<h1 class="text-center text-3xl font-bold my-2">
|
||||||
${state.translate('downloadFinish')}
|
${state.translate('downloadFinish')}
|
||||||
</h1>
|
</h1>
|
||||||
<img src="${assets.get('completed.svg')}" class="my-12 h-48" />
|
<img src="${assets.get('completed.svg')}" class="my-12 h-48" />
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ module.exports = function(state, emit) {
|
|||||||
<div
|
<div
|
||||||
class="h-full w-full flex flex-col items-center justify-center bg-white py-8 max-w-md mx-auto"
|
class="h-full w-full flex flex-col items-center justify-center bg-white py-8 max-w-md mx-auto"
|
||||||
>
|
>
|
||||||
<h1 class="mb-4">${state.translate('downloadTitle')}</h1>
|
<h1 class="text-3xl font-bold mb-4">
|
||||||
|
${state.translate('downloadTitle')}
|
||||||
|
</h1>
|
||||||
<p class="w-full mb-4 text-center text-grey-darkest leading-normal">
|
<p class="w-full mb-4 text-center text-grey-darkest leading-normal">
|
||||||
${state.translate('downloadDescription')}
|
${state.translate('downloadDescription')}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ module.exports = function(state, emit) {
|
|||||||
<main class="main">
|
<main class="main">
|
||||||
${state.modal && modal(state, emit)}
|
${state.modal && modal(state, emit)}
|
||||||
<section
|
<section
|
||||||
class="flex flex-col items-center justify-center h-full w-full p-6 overflow-hidden md:rounded-lg md:shadow-big"
|
class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big"
|
||||||
>
|
>
|
||||||
<h1 class="text-center font-bold my-2">
|
<h1 class="text-center text-3xl font-bold my-2">
|
||||||
${state.translate('errorPageHeader')}
|
${state.translate('errorPageHeader')}
|
||||||
</h1>
|
</h1>
|
||||||
<img class="my-12 h-48" src="${assets.get('error.svg')}" />
|
<img class="my-12 h-48" src="${assets.get('error.svg')}" />
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class Footer extends Component {
|
|||||||
const feedbackUrl = `https://qsurvey.mozilla.com/s3/Firefox-Send-Product-Feedback?ver=${version}&browser=${browser}`;
|
const feedbackUrl = `https://qsurvey.mozilla.com/s3/Firefox-Send-Product-Feedback?ver=${version}&browser=${browser}`;
|
||||||
return html`
|
return html`
|
||||||
<footer
|
<footer
|
||||||
class="flex flex-col md:flex-row items-start w-full flex-none self-start p-6 font-medium text-xs text-grey-dark md:items-center justify-between"
|
class="flex flex-col md:flex-row items-start w-full flex-none self-start p-6 md:p-8 font-medium text-xs text-grey-dark md:items-center justify-between"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
class="mozilla-logo pb-10 md:pb-0 m-2"
|
class="mozilla-logo pb-10 md:pb-0 m-2"
|
||||||
@@ -28,7 +28,7 @@ class Footer extends Component {
|
|||||||
Mozilla
|
Mozilla
|
||||||
</a>
|
</a>
|
||||||
<ul
|
<ul
|
||||||
class="list-reset flex flex-col md:flex-row items-start md:items-center md:justify-end"
|
class="flex flex-col md:flex-row items-start md:items-center md:justify-end"
|
||||||
>
|
>
|
||||||
<li class="m-2">
|
<li class="m-2">
|
||||||
<a href="https://www.mozilla.org/about/legal/terms/services/#send">
|
<a href="https://www.mozilla.org/about/legal/terms/services/#send">
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class Header extends Component {
|
|||||||
`;
|
`;
|
||||||
return html`
|
return html`
|
||||||
<header
|
<header
|
||||||
class="relative flex-none flex flex-row items-center justify-between w-full px-6 h-16 md:h-24 z-20 bg-transparent"
|
class="main-header relative flex-none flex flex-row items-center justify-between w-full px-6 md:px-8 h-16 md:h-24 z-20 bg-transparent"
|
||||||
>
|
>
|
||||||
${title} ${this.account.render()}
|
${title} ${this.account.render()}
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@@ -20,19 +20,15 @@ module.exports = function(state, emit) {
|
|||||||
const right =
|
const right =
|
||||||
archives.length === 0
|
archives.length === 0
|
||||||
? intro(state)
|
? intro(state)
|
||||||
: list(
|
: list(archives, 'p-2 h-full overflow-y-auto w-full', 'mb-4 w-full');
|
||||||
archives,
|
|
||||||
'list-reset p-2 h-full overflow-y-auto w-full',
|
|
||||||
'mb-4 w-full'
|
|
||||||
);
|
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<main class="main">
|
<main class="main">
|
||||||
${state.modal && modal(state, emit)}
|
${state.modal && modal(state, emit)}
|
||||||
<section
|
<section
|
||||||
class="h-full w-full p-6 overflow-hidden md:flex md:flex-row md:rounded-lg md:shadow-big"
|
class="h-full w-full p-6 md:p-8 overflow-hidden md:flex md:flex-row md:rounded-xl md:shadow-big"
|
||||||
>
|
>
|
||||||
<div class="px-2 w-full md:px-0 md:mr-6 md:w-1/2">${left}</div>
|
<div class="px-2 w-full md:px-0 md:mr-8 md:w-1/2">${left}</div>
|
||||||
<div class="mt-6 w-full md:w-1/2 md:-m-2">${right}</div>
|
<div class="mt-6 w-full md:w-1/2 md:-m-2">${right}</div>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ module.exports = function intro(state) {
|
|||||||
class="flex flex-col items-center justify-center bg-white px-6 md:py-0 py-6 mb-0 h-full w-full"
|
class="flex flex-col items-center justify-center bg-white px-6 md:py-0 py-6 mb-0 h-full w-full"
|
||||||
>
|
>
|
||||||
<div class="mt-12 flex flex-col h-full">
|
<div class="mt-12 flex flex-col h-full">
|
||||||
<h1 class="font-bold">
|
<h1 class="text-3xl font-bold md:pb-2">
|
||||||
${state.translate('introTitle')}
|
${state.translate('introTitle')}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="max-w-sm leading-normal mt-6 md:mt-2 md:pr-16">
|
<p class="max-w-sm leading-loose mt-6 md:mt-2 md:pr-14">
|
||||||
${state.translate('introDescription')}
|
${state.translate('introDescription')}
|
||||||
</p>
|
</p>
|
||||||
<img class="intro" src="${assets.get('intro.svg')}" />
|
<img class="intro" src="${assets.get('intro.svg')}" />
|
||||||
|
|||||||
@@ -8,9 +8,11 @@ module.exports = function(state, emit) {
|
|||||||
<div
|
<div
|
||||||
class="flex flex-col items-center bg-white m-4 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
|
class="flex flex-col items-center bg-white m-4 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
|
||||||
>
|
>
|
||||||
<h1 class="text-center">${state.translate('legalTitle')}</h1>
|
<h1 class="text-center text-3xl font-bold">
|
||||||
|
${state.translate('legalTitle')}
|
||||||
|
</h1>
|
||||||
<p class="mt-2">${state.translate('legalDateStamp')}</p>
|
<p class="mt-2">${state.translate('legalDateStamp')}</p>
|
||||||
<div class="overflow-scroll py-8 px-12">
|
<div class="overflow-y-scroll py-8 px-12">
|
||||||
<p class="leading-normal">
|
<p class="leading-normal">
|
||||||
<span>When Mozilla receives information from you, our</span>
|
<span>When Mozilla receives information from you, our</span>
|
||||||
<a
|
<a
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ const html = require('choo/html');
|
|||||||
module.exports = function(state, emit) {
|
module.exports = function(state, emit) {
|
||||||
return html`
|
return html`
|
||||||
<send-modal
|
<send-modal
|
||||||
class="absolute pin flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-lg md:my-8"
|
class="absolute inset-0 flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-xl md:my-8"
|
||||||
onclick="${close}"
|
onclick="${close}"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="h-full w-full max-h-screen absolute pin-t flex items-center justify-center"
|
class="h-full w-full max-h-screen absolute top-0 flex items-center justify-center"
|
||||||
>
|
>
|
||||||
<div class="w-full" onclick="${e => e.stopPropagation()}">
|
<div class="w-full" onclick="${e => e.stopPropagation()}">
|
||||||
${state.modal(state, emit, close)}
|
${state.modal(state, emit, close)}
|
||||||
@@ -21,7 +21,6 @@ module.exports = function(state, emit) {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
}
|
||||||
state.modal = null;
|
emit('closeModal');
|
||||||
emit('render');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ module.exports = function(state, emit) {
|
|||||||
<div
|
<div
|
||||||
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
||||||
>
|
>
|
||||||
<h1 class="mb-4">${state.translate('downloadTitle')}</h1>
|
<h1 class="mb-4 text-3xl font-bold">${state.translate(
|
||||||
|
'downloadTitle'
|
||||||
|
)}</h1>
|
||||||
<p
|
<p
|
||||||
class="w-full p-2 border border-yellow-light rounded md:w-4/5 text-orange-dark bg-yellow-lighter text-center leading-normal"
|
class="w-full p-2 border border-yellow-light rounded md:w-4/5 text-orange-dark bg-yellow-lighter text-center leading-normal"
|
||||||
>
|
>
|
||||||
@@ -17,7 +19,7 @@ module.exports = function(state, emit) {
|
|||||||
<form class="md:w-128" onsubmit=${submit}>
|
<form class="md:w-128" onsubmit=${submit}>
|
||||||
<fieldset class="border rounded p-4 my-4" onchange=${optionChanged}>
|
<fieldset class="border rounded p-4 my-4" onchange=${optionChanged}>
|
||||||
<div class="flex items-center mb-2">
|
<div class="flex items-center mb-2">
|
||||||
<img class="mr-3 flex-no-shrink" src="${assets.get(
|
<img class="mr-3 flex-shrink-0" src="${assets.get(
|
||||||
'blue_file.svg'
|
'blue_file.svg'
|
||||||
)}"/>
|
)}"/>
|
||||||
<p class="flex-grow">
|
<p class="flex-grow">
|
||||||
@@ -49,7 +51,7 @@ module.exports = function(state, emit) {
|
|||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<input
|
<input
|
||||||
class="btn rounded-lg w-full flex flex-no-shrink items-center justify-center"
|
class="btn rounded-lg w-full flex flex-shrink-0 items-center justify-center"
|
||||||
value="${state.translate('copyLinkButton')}"
|
value="${state.translate('copyLinkButton')}"
|
||||||
title="${state.translate('copyLinkButton')}"
|
title="${state.translate('copyLinkButton')}"
|
||||||
type="submit" />
|
type="submit" />
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ module.exports = function(state, emit) {
|
|||||||
<main class="main">
|
<main class="main">
|
||||||
${state.modal && modal(state, emit)}
|
${state.modal && modal(state, emit)}
|
||||||
<section
|
<section
|
||||||
class="flex flex-col items-center justify-center h-full w-full p-6 overflow-hidden md:rounded-lg md:shadow-big"
|
class="flex flex-col items-center justify-center h-full w-full p-6 md:p-8 overflow-hidden md:rounded-xl md:shadow-big"
|
||||||
>
|
>
|
||||||
<h1 class="text-center font-bold my-2">
|
<h1 class="text-center text-3xl font-bold my-2">
|
||||||
${state.translate('expiredTitle')}
|
${state.translate('expiredTitle')}
|
||||||
</h1>
|
</h1>
|
||||||
<img src="${assets.get('notFound.svg')}" class="my-12" />
|
<img src="${assets.get('notFound.svg')}" class="my-12" />
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ module.exports = function(message) {
|
|||||||
return function(state, emit, close) {
|
return function(state, emit, close) {
|
||||||
return html`
|
return html`
|
||||||
<send-ok-dialog class="flex flex-col max-w-sm p-4 m-auto">
|
<send-ok-dialog class="flex flex-col max-w-sm p-4 m-auto">
|
||||||
<h2 class="text-center m-8 leading-normal">${message}</h2>
|
<h2 class="text-center text-xl font-bold m-8 leading-normal">
|
||||||
|
${message}
|
||||||
|
</h2>
|
||||||
<button
|
<button
|
||||||
class="btn rounded-lg w-full flex-no-shrink"
|
class="btn rounded-lg w-full flex-shrink-0"
|
||||||
onclick="${close}"
|
onclick="${close}"
|
||||||
title="${state.translate('okButton')}"
|
title="${state.translate('okButton')}"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -3,8 +3,9 @@ const Component = require('choo/component');
|
|||||||
const assets = require('../../common/assets');
|
const assets = require('../../common/assets');
|
||||||
|
|
||||||
class Promo extends Component {
|
class Promo extends Component {
|
||||||
constructor(name) {
|
constructor(name, state) {
|
||||||
super(name);
|
super(name);
|
||||||
|
this.state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
@@ -14,21 +15,20 @@ class Promo extends Component {
|
|||||||
createElement() {
|
createElement() {
|
||||||
return html`
|
return html`
|
||||||
<send-promo
|
<send-promo
|
||||||
class="w-full flex-none flex-row items-center content-center justify-center text-sm bg-grey-light leading-tight text-grey-darkest px-4 py-3 hidden md:flex"
|
class="w-full flex-row items-center content-center justify-center bg-white text-grey-darkest px-4 py-3 flex border-b border-grey-banner leading-normal"
|
||||||
>
|
>
|
||||||
<div class="flex items-center mx-auto">
|
<div class="flex items-center mx-auto">
|
||||||
<img
|
<img
|
||||||
src="${assets.get('firefox_logo-only.svg')}"
|
src="${assets.get('master-logo.svg')}"
|
||||||
class="w-6"
|
class="w-6 h-6"
|
||||||
alt="Firefox"
|
alt="Firefox"
|
||||||
/>
|
/>
|
||||||
<span class="ml-3"
|
<span class="ml-2 sm:ml-4 text-xs sm:text-base">
|
||||||
>Send is brought to you by the all-new Firefox.${' '}
|
${this.state.translate('trailheadPromo')}${' '}
|
||||||
<a
|
<a
|
||||||
class="text-blue"
|
class="underline text-blue-dark"
|
||||||
href="https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com"
|
href="http://www.mozilla.org/firefox/accounts/?utm_source=send.firefox.com&utm_medium=banner&utm_campaign=trailhead&utm_content=protect-your-privacy"
|
||||||
>
|
>${this.state.translate('learnMore')}</a
|
||||||
Download Firefox now ≫</a
|
|
||||||
>
|
>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,22 +1,16 @@
|
|||||||
const html = require('choo/html');
|
const html = require('choo/html');
|
||||||
|
|
||||||
/* Possible strings for l10n
|
|
||||||
shareLinkDescription = Share the link to your file:
|
|
||||||
shareLinkButton = Share link
|
|
||||||
shareMessage = Download "{ $name }" with { -send-brand }: simple, safe file sharing
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = function(name, url) {
|
module.exports = function(name, url) {
|
||||||
return function(state, emit, close) {
|
const dialog = function(state, emit, close) {
|
||||||
return html`
|
return html`
|
||||||
<send-share-dialog
|
<send-share-dialog
|
||||||
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
||||||
>
|
>
|
||||||
<h1 class="font-bold my-4">
|
<h1 class="text-3xl font-bold my-4">
|
||||||
${state.translate('notifyUploadEncryptDone')}
|
${state.translate('notifyUploadEncryptDone')}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="font-normal leading-normal text-grey-darkest word-break-all">
|
<p class="font-normal leading-normal text-grey-darkest word-break-all">
|
||||||
Share the link to your file:<br />
|
${state.translate('shareLinkDescription')}<br />
|
||||||
${name}
|
${name}
|
||||||
</p>
|
</p>
|
||||||
<input
|
<input
|
||||||
@@ -27,11 +21,11 @@ module.exports = function(name, url) {
|
|||||||
readonly="true"
|
readonly="true"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
class="btn rounded-lg w-full flex-no-shrink focus:outline"
|
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
|
||||||
onclick="${share}"
|
onclick="${share}"
|
||||||
title="Share link"
|
title="${state.translate('shareLinkButton')}"
|
||||||
>
|
>
|
||||||
Share link
|
${state.translate('shareLinkButton')}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker my-4 font-medium cursor-pointer focus:outline"
|
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker my-4 font-medium cursor-pointer focus:outline"
|
||||||
@@ -48,8 +42,7 @@ module.exports = function(name, url) {
|
|||||||
try {
|
try {
|
||||||
await navigator.share({
|
await navigator.share({
|
||||||
title: state.translate('-send-brand'),
|
title: state.translate('-send-brand'),
|
||||||
text: `Download "${name}" with Firefox Send: simple, safe file sharing`,
|
text: state.translate('shareMessage', { name }),
|
||||||
//state.translate('shareMessage', { name }),
|
|
||||||
url
|
url
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -61,4 +54,6 @@ module.exports = function(name, url) {
|
|||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
dialog.type = 'share';
|
||||||
|
return dialog;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,14 +12,11 @@ module.exports = function(trigger) {
|
|||||||
<send-signup-dialog
|
<send-signup-dialog
|
||||||
class="flex flex-col lg:flex-row justify-center px-8 md:px-24 w-full h-full"
|
class="flex flex-col lg:flex-row justify-center px-8 md:px-24 w-full h-full"
|
||||||
>
|
>
|
||||||
<img
|
<img src="${assets.get('master-logo.svg')}" class="h-16 mt-1 mb-4" />
|
||||||
src="${assets.get('firefox_logo-only.svg')}"
|
|
||||||
class="h-16 mt-1 mb-4"
|
|
||||||
/>
|
|
||||||
<section
|
<section
|
||||||
class="flex flex-col flex-no-shrink self-center lg:mx-6 lg:max-w-xs"
|
class="flex flex-col flex-shrink-0 self-center lg:mx-6 lg:max-w-xs"
|
||||||
>
|
>
|
||||||
<h1 class="font-bold text-center lg:text-left">
|
<h1 class="text-3xl font-bold text-center lg:text-left">
|
||||||
${state.translate('accountBenefitTitle')}
|
${state.translate('accountBenefitTitle')}
|
||||||
</h1>
|
</h1>
|
||||||
<ul
|
<ul
|
||||||
@@ -49,9 +46,9 @@ module.exports = function(trigger) {
|
|||||||
placeholder=${state.translate('emailPlaceholder')}
|
placeholder=${state.translate('emailPlaceholder')}
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
class="btn rounded-lg w-full flex flex-no-shrink items-center justify-center"
|
class="btn rounded-lg w-full flex flex-shrink-0 items-center justify-center"
|
||||||
value="${state.translate('signInButton')}"
|
value="${state.translate('signInOnlyButton')}"
|
||||||
title="${state.translate('signInButton')}"
|
title="${state.translate('signInOnlyButton')}"
|
||||||
id="email-submit"
|
id="email-submit"
|
||||||
type="submit"
|
type="submit"
|
||||||
/>
|
/>
|
||||||
|
|||||||
42
app/ui/surveyDialog.js
Normal file
42
app/ui/surveyDialog.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
const html = require('choo/html');
|
||||||
|
const version = require('../../package.json').version;
|
||||||
|
const { browserName } = require('../utils');
|
||||||
|
|
||||||
|
module.exports = function() {
|
||||||
|
return function(state, emit, close) {
|
||||||
|
const surveyUrl = `${
|
||||||
|
state.PREFS.surveyUrl
|
||||||
|
}?ver=${version}&browser=${browserName()}&anon=${
|
||||||
|
state.user.loggedIn
|
||||||
|
}&active_count=${state.storage.files.length}`;
|
||||||
|
return html`
|
||||||
|
<send-survey-dialog
|
||||||
|
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
||||||
|
>
|
||||||
|
<h1 class="text-3xl font-bold my-4">
|
||||||
|
Tell us what you think.
|
||||||
|
</h1>
|
||||||
|
<p class="font-normal leading-normal text-grey-darkest px-4">
|
||||||
|
Love Firefox Send? Take a quick survey to let us know how we can make
|
||||||
|
it better.
|
||||||
|
</p>
|
||||||
|
<a
|
||||||
|
class="btn rounded-lg w-full flex-shrink-0 focus:outline my-5"
|
||||||
|
onclick="${() => emit('closeModal')}"
|
||||||
|
title="Give feedback"
|
||||||
|
href="${surveyUrl}"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
Give feedback
|
||||||
|
</a>
|
||||||
|
<button
|
||||||
|
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker font-medium cursor-pointer focus:outline"
|
||||||
|
onclick="${close}"
|
||||||
|
title="Skip"
|
||||||
|
>
|
||||||
|
Skip
|
||||||
|
</button>
|
||||||
|
</send-survey-dialog>
|
||||||
|
`;
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -29,7 +29,7 @@ module.exports = function(state, emit) {
|
|||||||
<section
|
<section
|
||||||
class="flex flex-col items-center justify-center text-center bg-white m-6 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
|
class="flex flex-col items-center justify-center text-center bg-white m-6 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
|
||||||
>
|
>
|
||||||
<h1 class="">${strings.header}</h1>
|
<h1 class="text-3xl font-bold">${strings.header}</h1>
|
||||||
<p class="mt-4 mb-8 max-w-md leading-normal">${strings.description}</p>
|
<p class="mt-4 mb-8 max-w-md leading-normal">${strings.description}</p>
|
||||||
${why}
|
${why}
|
||||||
<a href="${url}" class="btn rounded-lg mt-8 px-8">
|
<a href="${url}" class="btn rounded-lg mt-8 px-8">
|
||||||
|
|||||||
@@ -44,6 +44,14 @@ export default class User {
|
|||||||
this.storage.set('firstAction', action);
|
this.storage.set('firstAction', action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get surveyed() {
|
||||||
|
return this.storage.get('surveyed');
|
||||||
|
}
|
||||||
|
|
||||||
|
set surveyed(yes) {
|
||||||
|
this.storage.set('surveyed', yes);
|
||||||
|
}
|
||||||
|
|
||||||
get avatar() {
|
get avatar() {
|
||||||
const defaultAvatar = assets.get('user.svg');
|
const defaultAvatar = assets.get('user.svg');
|
||||||
if (this.info.avatarDefault) {
|
if (this.info.avatarDefault) {
|
||||||
|
|||||||
14
app/utils.js
14
app/utils.js
@@ -14,6 +14,10 @@ function b64ToArray(str) {
|
|||||||
return b64.toByteArray(str + '==='.slice((str.length + 3) % 4));
|
return b64.toByteArray(str + '==='.slice((str.length + 3) % 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function locale() {
|
||||||
|
return document.querySelector('html').lang;
|
||||||
|
}
|
||||||
|
|
||||||
function loadShim(polyfill) {
|
function loadShim(polyfill) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const shim = document.createElement('script');
|
const shim = document.createElement('script');
|
||||||
@@ -67,8 +71,7 @@ function bytes(num) {
|
|||||||
let nStr = n.toFixed(decimalDigits);
|
let nStr = n.toFixed(decimalDigits);
|
||||||
if (LOCALIZE_NUMBERS) {
|
if (LOCALIZE_NUMBERS) {
|
||||||
try {
|
try {
|
||||||
const locale = document.querySelector('html').lang;
|
nStr = n.toLocaleString(locale(), {
|
||||||
nStr = n.toLocaleString(locale, {
|
|
||||||
minimumFractionDigits: decimalDigits,
|
minimumFractionDigits: decimalDigits,
|
||||||
maximumFractionDigits: decimalDigits
|
maximumFractionDigits: decimalDigits
|
||||||
});
|
});
|
||||||
@@ -85,8 +88,7 @@ function bytes(num) {
|
|||||||
function percent(ratio) {
|
function percent(ratio) {
|
||||||
if (LOCALIZE_NUMBERS) {
|
if (LOCALIZE_NUMBERS) {
|
||||||
try {
|
try {
|
||||||
const locale = document.querySelector('html').lang;
|
return ratio.toLocaleString(locale(), { style: 'percent' });
|
||||||
return ratio.toLocaleString(locale, { style: 'percent' });
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// fall through
|
// fall through
|
||||||
}
|
}
|
||||||
@@ -96,8 +98,7 @@ function percent(ratio) {
|
|||||||
|
|
||||||
function number(n) {
|
function number(n) {
|
||||||
if (LOCALIZE_NUMBERS) {
|
if (LOCALIZE_NUMBERS) {
|
||||||
const locale = document.querySelector('html').lang;
|
return n.toLocaleString(locale());
|
||||||
return n.toLocaleString(locale);
|
|
||||||
}
|
}
|
||||||
return n.toString();
|
return n.toString();
|
||||||
}
|
}
|
||||||
@@ -267,6 +268,7 @@ function setTranslate(t) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
locale,
|
||||||
fadeOut,
|
fadeOut,
|
||||||
delay,
|
delay,
|
||||||
allowedCopy,
|
allowedCopy,
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 8.1 KiB |
99
assets/master-logo.svg
Normal file
99
assets/master-logo.svg
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80">
|
||||||
|
<defs>
|
||||||
|
<radialGradient id="a" cx="-1186.91" cy="-517.676" r="90.78" gradientTransform="translate(1258.441 534.061)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#fff36e"/>
|
||||||
|
<stop offset=".5" stop-color="#fc4055"/>
|
||||||
|
<stop offset="1" stop-color="#e31587"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="b" cx="-1251.812" cy="-513.921" r="53.726" gradientTransform="translate(1258.441 534.061)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset=".001" stop-color="#c60084"/>
|
||||||
|
<stop offset="1" stop-color="#fc4055" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="c" cx="-1179.15" cy="-522.842" r="106.599" gradientTransform="translate(1258.441 534.061)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#ffde67" stop-opacity=".6"/>
|
||||||
|
<stop offset=".093" stop-color="#ffd966" stop-opacity=".581"/>
|
||||||
|
<stop offset=".203" stop-color="#ffca65" stop-opacity=".525"/>
|
||||||
|
<stop offset=".321" stop-color="#feb262" stop-opacity=".432"/>
|
||||||
|
<stop offset=".446" stop-color="#fe8f5e" stop-opacity=".302"/>
|
||||||
|
<stop offset=".573" stop-color="#fd6459" stop-opacity=".137"/>
|
||||||
|
<stop offset=".664" stop-color="#fc4055" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="d" cx="42.285" cy="44.499" r="137.521" gradientTransform="translate(0 -.095)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset=".153" stop-color="#810220"/>
|
||||||
|
<stop offset=".167" stop-color="#920b27" stop-opacity=".861"/>
|
||||||
|
<stop offset=".216" stop-color="#cb2740" stop-opacity=".398"/>
|
||||||
|
<stop offset=".253" stop-color="#ef394f" stop-opacity=".11"/>
|
||||||
|
<stop offset=".272" stop-color="#fc4055" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="e" cx="31.878" cy="42.77" r="137.521" gradientTransform="translate(0 -.095)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset=".113" stop-color="#810220"/>
|
||||||
|
<stop offset=".133" stop-color="#920b27" stop-opacity=".861"/>
|
||||||
|
<stop offset=".204" stop-color="#cb2740" stop-opacity=".398"/>
|
||||||
|
<stop offset=".257" stop-color="#ef394f" stop-opacity=".11"/>
|
||||||
|
<stop offset=".284" stop-color="#fc4055" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="f" x1="-1212.61" y1="-525.103" x2="-1189.052" y2="-484.299" gradientTransform="translate(1258.441 532.89)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#ffbd4f"/>
|
||||||
|
<stop offset=".508" stop-color="#ff9640" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="g" cx="-1255.933" cy="-77.395" r="88.863" gradientTransform="matrix(.959 0 0 .961 1273.896 86.468)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#ff9640"/>
|
||||||
|
<stop offset=".8" stop-color="#fc4055"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="h" cx="-1255.933" cy="-77.395" r="88.863" gradientTransform="matrix(.959 0 0 .961 1273.896 86.468)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset=".084" stop-color="#ffde67"/>
|
||||||
|
<stop offset=".147" stop-color="#ffdc66" stop-opacity=".968"/>
|
||||||
|
<stop offset=".246" stop-color="#ffd562" stop-opacity=".879"/>
|
||||||
|
<stop offset=".369" stop-color="#ffcb5d" stop-opacity=".734"/>
|
||||||
|
<stop offset=".511" stop-color="#ffbc55" stop-opacity=".533"/>
|
||||||
|
<stop offset=".667" stop-color="#ffaa4b" stop-opacity=".28"/>
|
||||||
|
<stop offset=".822" stop-color="#ff9640" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="i" cx="49.941" cy="38.654" r="41.79" gradientTransform="matrix(.247 .971 -1.011 .259 76.681 -19.851)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset=".363" stop-color="#fc4055"/>
|
||||||
|
<stop offset=".443" stop-color="#fd604d" stop-opacity=".633"/>
|
||||||
|
<stop offset=".545" stop-color="#fe8644" stop-opacity=".181"/>
|
||||||
|
<stop offset=".59" stop-color="#ff9640" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="j" cx="42.737" cy="42.193" r="41.79" gradientTransform="translate(0 -.095)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset=".216" stop-color="#fc4055" stop-opacity=".8"/>
|
||||||
|
<stop offset=".267" stop-color="#fd5251" stop-opacity=".633"/>
|
||||||
|
<stop offset=".41" stop-color="#fe8345" stop-opacity=".181"/>
|
||||||
|
<stop offset=".474" stop-color="#ff9640" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="k" cx="-1238.198" cy="-87.433" r="150.195" gradientTransform="matrix(.959 0 0 .961 1273.896 86.468)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset=".054" stop-color="#fff36e"/>
|
||||||
|
<stop offset=".457" stop-color="#ff9640"/>
|
||||||
|
<stop offset=".639" stop-color="#ff9640"/>
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="l" x1="59.052" y1="7.083" x2="18.155" y2="77.92" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#fff36e" stop-opacity=".8"/>
|
||||||
|
<stop offset=".094" stop-color="#fff36e" stop-opacity=".699"/>
|
||||||
|
<stop offset=".752" stop-color="#fff36e" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="m" x1="40.585" y1="-.67" x2="62.3" y2="62.203" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#b833e1"/>
|
||||||
|
<stop offset=".371" stop-color="#9059ff"/>
|
||||||
|
<stop offset=".614" stop-color="#5b6df8"/>
|
||||||
|
<stop offset="1" stop-color="#0090ed"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="n" x1="-1230.731" y1="-532.566" x2="-1190.37" y2="-492.205" gradientTransform="translate(1258.441 532.89)" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset=".805" stop-color="#722291" stop-opacity="0"/>
|
||||||
|
<stop offset="1" stop-color="#592acb" stop-opacity=".5"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<path d="M71.944 15.7A39.47 39.47 0 0 0 41.588.009C32.3-.177 25.884 2.614 22.254 4.858 27.111 2.041 34.14.443 40.294.522c15.83.2 32.832 10.981 35.357 30.413 2.9 22.306-12.637 40.923-34.493 40.98-24.045.061-38.67-21.229-34.847-40.352a19.735 19.735 0 0 1 .413-2.787 37.815 37.815 0 0 1 4.193-14.018c-2.769 1.433-6.295 5.965-8.035 10.163A41.355 41.355 0 0 0 .284 45.1c.06.518.114 1.035.182 1.549A40.062 40.062 0 1 0 71.944 15.7zm-63.4 3.487z" fill="url(#a)"/>
|
||||||
|
<path d="M71.944 15.7A39.47 39.47 0 0 0 41.588.009C32.3-.177 25.884 2.614 22.254 4.858 27.111 2.041 34.14.443 40.294.522c15.83.2 32.832 10.981 35.357 30.413 2.9 22.306-12.637 40.923-34.493 40.98-24.045.061-38.67-21.229-34.847-40.352a19.735 19.735 0 0 1 .413-2.787 37.815 37.815 0 0 1 4.193-14.018c-2.769 1.433-6.295 5.965-8.035 10.163A41.355 41.355 0 0 0 .284 45.1c.06.518.114 1.035.182 1.549A40.062 40.062 0 1 0 71.944 15.7zm-63.4 3.487z" fill="url(#b)" opacity=".67"/>
|
||||||
|
<path d="M71.944 15.7A39.47 39.47 0 0 0 41.588.009C32.3-.177 25.884 2.614 22.254 4.858 27.111 2.041 34.14.443 40.294.522c15.83.2 32.832 10.981 35.357 30.413 2.9 22.306-12.637 40.923-34.493 40.98-24.045.061-38.67-21.229-34.847-40.352a19.735 19.735 0 0 1 .413-2.787 37.815 37.815 0 0 1 4.193-14.018c-2.769 1.433-6.295 5.965-8.035 10.163A41.355 41.355 0 0 0 .284 45.1c.06.518.114 1.035.182 1.549A40.062 40.062 0 1 0 71.944 15.7zm-63.4 3.487z" fill="url(#c)"/>
|
||||||
|
<path d="M71.944 15.7A39.47 39.47 0 0 0 41.588.009C32.3-.177 25.884 2.614 22.254 4.858 27.111 2.041 34.14.443 40.294.522c15.83.2 32.832 10.981 35.357 30.413 2.9 22.306-12.637 40.923-34.493 40.98-24.045.061-38.67-21.229-34.847-40.352a19.735 19.735 0 0 1 .413-2.787 37.815 37.815 0 0 1 4.193-14.018c-2.769 1.433-6.295 5.965-8.035 10.163A41.355 41.355 0 0 0 .284 45.1c.06.518.114 1.035.182 1.549A40.062 40.062 0 1 0 71.944 15.7zm-63.4 3.487z" fill="url(#d)"/>
|
||||||
|
<path d="M71.944 15.7A39.47 39.47 0 0 0 41.588.009C32.3-.177 25.884 2.614 22.254 4.858 27.111 2.041 34.14.443 40.294.522c15.83.2 32.832 10.981 35.357 30.413 2.9 22.306-12.637 40.923-34.493 40.98-24.045.061-38.67-21.229-34.847-40.352a19.735 19.735 0 0 1 .413-2.787 37.815 37.815 0 0 1 4.193-14.018c-2.769 1.433-6.295 5.965-8.035 10.163A41.355 41.355 0 0 0 .284 45.1c.06.518.114 1.035.182 1.549A40.062 40.062 0 1 0 71.944 15.7zm-63.4 3.487z" fill="url(#e)"/>
|
||||||
|
<path d="M75.651 30.935a41.01 41.01 0 0 1 .3 7.247q1.99-.3 3.987-.53A40.01 40.01 0 0 0 71.944 15.7 39.47 39.47 0 0 0 41.588.009C32.3-.177 25.884 2.614 22.254 4.858 27.111 2.041 34.14.443 40.294.522 56.124.724 73.126 11.5 75.651 30.935z" fill="url(#f)"/>
|
||||||
|
<path d="M76.625 29.826C74.374 9.518 56.263.39 40.294.522c-6.155.05-13.183 1.519-18.04 4.336a19.7 19.7 0 0 0-3.56 2.7c.129-.107.514-.424 1.152-.862l.063-.043.056-.038a26.655 26.655 0 0 1 7.692-3.572A43.5 43.5 0 0 1 40.84 1.5a33.254 33.254 0 0 1 31.25 31.993C72.457 46.7 61.648 57.23 49.188 57.84c-9.062.444-17.6-3.941-21.77-12.713a21.68 21.68 0 0 1-1.964-6.333c-1.976-13.35 6.989-24.735 15.21-27.554-4.435-3.874-15.548-3.611-23.819 2.474-5.956 4.382-9.82 11.049-11.1 19a32.945 32.945 0 0 0 2.34 18 35.3 35.3 0 0 0 30.089 21.443q1.489.114 2.984.113c26.462 0 37.942-20.087 35.467-42.444z" fill="url(#g)"/>
|
||||||
|
<path d="M76.625 29.826C74.374 9.518 56.263.39 40.294.522c-6.155.05-13.183 1.519-18.04 4.336a19.7 19.7 0 0 0-3.56 2.7c.129-.107.514-.424 1.152-.862l.063-.043.056-.038a26.655 26.655 0 0 1 7.692-3.572A43.5 43.5 0 0 1 40.84 1.5a33.254 33.254 0 0 1 31.25 31.993C72.457 46.7 61.648 57.23 49.188 57.84c-9.062.444-17.6-3.941-21.77-12.713a21.68 21.68 0 0 1-1.964-6.333c-1.976-13.35 6.989-24.735 15.21-27.554-4.435-3.874-15.548-3.611-23.819 2.474-5.956 4.382-9.82 11.049-11.1 19a32.945 32.945 0 0 0 2.34 18 35.3 35.3 0 0 0 30.089 21.443q1.489.114 2.984.113c26.462 0 37.942-20.087 35.467-42.444z" fill="url(#h)"/>
|
||||||
|
<path d="M76.625 29.826C74.374 9.518 56.263.39 40.294.522c-6.155.05-13.183 1.519-18.04 4.336a19.7 19.7 0 0 0-3.56 2.7c.129-.107.514-.424 1.152-.862l.063-.043.056-.038a26.655 26.655 0 0 1 7.692-3.572A43.5 43.5 0 0 1 40.84 1.5a33.254 33.254 0 0 1 31.25 31.993C72.457 46.7 61.648 57.23 49.188 57.84c-9.062.444-17.6-3.941-21.77-12.713a21.68 21.68 0 0 1-1.964-6.333c-1.976-13.35 6.989-24.735 15.21-27.554-4.435-3.874-15.548-3.611-23.819 2.474-5.956 4.382-9.82 11.049-11.1 19a32.945 32.945 0 0 0 2.34 18 35.3 35.3 0 0 0 30.089 21.443q1.489.114 2.984.113c26.462 0 37.942-20.087 35.467-42.444z" style="mix-blend-mode:multiply" opacity=".53" fill="url(#i)"/>
|
||||||
|
<path d="M76.625 29.826C74.374 9.518 56.263.39 40.294.522c-6.155.05-13.183 1.519-18.04 4.336a19.7 19.7 0 0 0-3.56 2.7c.129-.107.514-.424 1.152-.862l.063-.043.056-.038a26.655 26.655 0 0 1 7.692-3.572A43.5 43.5 0 0 1 40.84 1.5a33.254 33.254 0 0 1 31.25 31.993C72.457 46.7 61.648 57.23 49.188 57.84c-9.062.444-17.6-3.941-21.77-12.713a21.68 21.68 0 0 1-1.964-6.333c-1.976-13.35 6.989-24.735 15.21-27.554-4.435-3.874-15.548-3.611-23.819 2.474-5.956 4.382-9.82 11.049-11.1 19a32.945 32.945 0 0 0 2.34 18 35.3 35.3 0 0 0 30.089 21.443q1.489.114 2.984.113c26.462 0 37.942-20.087 35.467-42.444z" style="mix-blend-mode:multiply" opacity=".53" fill="url(#j)"/>
|
||||||
|
<path d="M49.188 57.84c17.1-1.04 24.42-15.2 24.879-25.245C74.783 16.9 65.472-.02 40.84 1.5a43.5 43.5 0 0 0-13.183 1.546 28.855 28.855 0 0 0-7.692 3.572l-.056.038-.063.043q-.574.4-1.123.842A33.482 33.482 0 0 1 39.7 3.605c14.142 1.856 27.072 12.857 27.072 27.373 0 11.169-8.631 19.7-18.738 19.087-15.015-.9-18.8-16.3-10.989-22.954-2.106-.453-6.064.435-8.82 4.555-2.473 3.7-2.333 9.41-.807 13.461a22.118 22.118 0 0 0 21.77 12.713z" fill="url(#k)"/>
|
||||||
|
<path d="M71.944 15.7a39.958 39.958 0 0 0-3.482-3.982 31.342 31.342 0 0 0-3.177-2.926 24.393 24.393 0 0 1 1.849 1.79 22.466 22.466 0 0 1 4.882 8.144c2.089 6.329 1.953 14.25-2.036 20.471a23.539 23.539 0 0 1-20.855 10.895c-.361 0-.725 0-1.091-.027-15.015-.9-18.8-16.3-10.988-22.954-2.107-.453-6.065.435-8.821 4.555-2.473 3.7-2.333 9.41-.807 13.461a21.679 21.679 0 0 1-1.963-6.333c-1.977-13.35 6.988-24.735 15.209-27.554-4.435-3.874-15.548-3.611-23.819 2.474a27.845 27.845 0 0 0-10.087 14.6 38.5 38.5 0 0 1 4.159-13.553c-2.769 1.433-6.295 5.965-8.035 10.163A41.355 41.355 0 0 0 .284 45.1c.06.518.114 1.035.182 1.549A40.062 40.062 0 1 0 71.944 15.7z" fill="url(#l)"/>
|
||||||
|
<path d="M72.016 18.726a22.458 22.458 0 0 0-4.882-8.144 30.224 30.224 0 0 0-9.094-6.493A40.518 40.518 0 0 0 49.1.92a39.834 39.834 0 0 0-16.565-.1c-5.683 1.2-10.68 3.659-13.841 6.733a32.1 32.1 0 0 1 8.031-3.2 33.565 33.565 0 0 1 31.173 8.1 27.01 27.01 0 0 1 4.329 5.3c4.895 7.959 4.432 17.965.615 23.866-2.835 4.384-8.907 8.5-14.572 8.452A23.629 23.629 0 0 0 69.98 39.2c3.989-6.224 4.125-14.145 2.036-20.474z" fill="url(#m)"/>
|
||||||
|
<path d="M72.016 18.726a22.458 22.458 0 0 0-4.882-8.144 30.224 30.224 0 0 0-9.094-6.493A40.518 40.518 0 0 0 49.1.92a39.834 39.834 0 0 0-16.565-.1c-5.683 1.2-10.68 3.659-13.841 6.733a32.1 32.1 0 0 1 8.031-3.2 33.565 33.565 0 0 1 31.173 8.1 27.01 27.01 0 0 1 4.329 5.3c4.895 7.959 4.432 17.965.615 23.866-2.835 4.384-8.907 8.5-14.572 8.452A23.629 23.629 0 0 0 69.98 39.2c3.989-6.224 4.125-14.145 2.036-20.474z" fill="url(#n)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 12 KiB |
68
docs/deployment.md
Normal file
68
docs/deployment.md
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
## Requirements
|
||||||
|
This document describes how to do a full deployment of Firefox Send on your own Linux server. You will need:
|
||||||
|
|
||||||
|
* A working (and ideally somewhat recent) installation of NodeJS and NPM
|
||||||
|
* GIT
|
||||||
|
* An Apache webserver
|
||||||
|
* Optionally telnet, to be able to quickly check your installation
|
||||||
|
|
||||||
|
For Debian/Ubuntu systems this probably just means something like this:
|
||||||
|
|
||||||
|
* apt install git apache2 nodejs npm telnet
|
||||||
|
|
||||||
|
## Building
|
||||||
|
* We assume an already configured virtual-host on your webserver with an existing empty htdocs folder
|
||||||
|
* First, remove that htdocs folder - we will replace it with Firefox Send's version now
|
||||||
|
* git clone https://github.com/mozilla/send.git htdocs
|
||||||
|
* Make now sure you are NOT root but rather the user your webserver is serving files under (e.g. "su www-data" or whoever the owner of your htdocs folder is)
|
||||||
|
* npm install
|
||||||
|
* npm run build
|
||||||
|
|
||||||
|
## Running
|
||||||
|
To have a permanently running version of Firefox Send as a background process:
|
||||||
|
|
||||||
|
* Create a file "run.sh" with:
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
nohup su www-data -c "npm run prod" 2>/dev/null &
|
||||||
|
```
|
||||||
|
* chmod +x run.sh
|
||||||
|
* ./run.sh
|
||||||
|
|
||||||
|
Now the Firefox Send backend should be running on port 1443. You can check with:
|
||||||
|
* telnet localhost 1443
|
||||||
|
|
||||||
|
## Reverse Proxy
|
||||||
|
Of course, we don't want to expose the service on port 1443. Instead we want our normal webserver to forward all requests to Firefox send ("Reverse proxy").
|
||||||
|
|
||||||
|
# Apache webserver
|
||||||
|
|
||||||
|
* a2enmod proxy
|
||||||
|
* a2enmod proxy_http
|
||||||
|
* a2enmod proxy_wstunnel
|
||||||
|
|
||||||
|
In your Apache virtual host configuration file, insert this:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Enable rewrite engine
|
||||||
|
RewriteEngine on
|
||||||
|
|
||||||
|
# Make sure the original domain name is forwarded to Send
|
||||||
|
# Otherwise the generated URLs will be wrong
|
||||||
|
ProxyPreserveHost on
|
||||||
|
|
||||||
|
# Make sure the generated URL is https://
|
||||||
|
RequestHeader set X-Forwarded-Proto https
|
||||||
|
|
||||||
|
# If it's a normal file (e.g. PNG, CSS) just return it
|
||||||
|
RewriteCond %{REQUEST_FILENAME} -f
|
||||||
|
RewriteRule .* - [L]
|
||||||
|
|
||||||
|
# If it's a websocket connection, redirect it to a Send WS connection
|
||||||
|
RewriteCond %{HTTP:Upgrade} =websocket [NC]
|
||||||
|
RewriteRule /(.*) ws://127.0.0.1:1443/$1 [P,L]
|
||||||
|
|
||||||
|
# Otherwise redirect it to a normal HTTP connection
|
||||||
|
RewriteRule ^/(.*)$ http://127.0.0.1:1443/$1 [P,QSA]
|
||||||
|
ProxyPassReverse "/" "http://127.0.0.1:1443"
|
||||||
|
```
|
||||||
@@ -7,8 +7,8 @@ Send use 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.m
|
|||||||
### Uploading
|
### Uploading
|
||||||
|
|
||||||
1. A new secret key is generated with `crypto.getRandomValues`
|
1. A new secret key is generated with `crypto.getRandomValues`
|
||||||
2. The secret key is used to derive 3 more keys via HKDF SHA-256
|
2. The secret key is used to derive more keys via HKDF SHA-256
|
||||||
- an encryption key for the file (AES-GCM)
|
- a series of encryption keys for the file, via [ECE](https://tools.ietf.org/html/rfc8188) (AES-GCM)
|
||||||
- an encryption key for the file metadata (AES-GCM)
|
- an encryption key for the file metadata (AES-GCM)
|
||||||
- a signing key for request authentication (HMAC SHA-256)
|
- a signing key for request authentication (HMAC SHA-256)
|
||||||
3. The file and metadata are encrypted with their corresponding keys
|
3. The file and metadata are encrypted with their corresponding keys
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ Server events allow us to aggregate data about file lifecycle without collecting
|
|||||||
* `event_properties`
|
* `event_properties`
|
||||||
* `download_count` downloads completed
|
* `download_count` downloads completed
|
||||||
* `ttl` time remaining before expiry truncated to hour
|
* `ttl` time remaining before expiry truncated to hour
|
||||||
|
* `agent` the browser name or first 6 characters of the user agent that made the request
|
||||||
|
|
||||||
### Client Events
|
### Client Events
|
||||||
|
|
||||||
|
|||||||
9835
package-lock.json
generated
9835
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
135
package.json
135
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "firefox-send",
|
"name": "firefox-send",
|
||||||
"description": "File Sharing Experiment",
|
"description": "File Sharing Experiment",
|
||||||
"version": "3.0.9",
|
"version": "3.0.17",
|
||||||
"author": "Mozilla (https://mozilla.org)",
|
"author": "Mozilla (https://mozilla.org)",
|
||||||
"repository": "mozilla/send",
|
"repository": "mozilla/send",
|
||||||
"homepage": "https://github.com/mozilla/send/",
|
"homepage": "https://github.com/mozilla/send/",
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
"test:report": "nyc report --reporter=html",
|
"test:report": "nyc report --reporter=html",
|
||||||
"test-integration": "cross-env NODE_ENV=development wdio test/wdio.docker.conf.js",
|
"test-integration": "cross-env NODE_ENV=development wdio test/wdio.docker.conf.js",
|
||||||
"circleci-test-integration": "cross-env NODE_ENV=development wdio test/wdio.circleci.conf.js",
|
"circleci-test-integration": "cross-env NODE_ENV=development wdio test/wdio.circleci.conf.js",
|
||||||
"start": "npm run clean && cross-env NODE_ENV=development FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:8080 webpack-dev-server --mode=development",
|
"start": "npm run clean && cross-env NODE_ENV=development L10N_DEV=true FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:8080 webpack-dev-server --mode=development",
|
||||||
"android": "cross-env ANDROID=1 npm start",
|
"android": "cross-env ANDROID=1 npm start",
|
||||||
"prod": "node server/bin/prod.js"
|
"prod": "node server/bin/prod.js"
|
||||||
},
|
},
|
||||||
@@ -35,7 +35,8 @@
|
|||||||
"hooks": {
|
"hooks": {
|
||||||
"pre-commit": "lint-staged",
|
"pre-commit": "lint-staged",
|
||||||
"pre-push": "npm test",
|
"pre-push": "npm test",
|
||||||
"post-merge": "npm install"
|
"post-merge": "npm install",
|
||||||
|
"post-checkout": "scripts/sync-npm-dependencies.sh"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
@@ -60,66 +61,66 @@
|
|||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.3.4",
|
"@babel/core": "^7.5.5",
|
||||||
"@babel/plugin-proposal-class-properties": "^7.3.4",
|
"@babel/plugin-proposal-class-properties": "^7.5.5",
|
||||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||||
"@babel/preset-env": "^7.3.4",
|
"@babel/preset-env": "^7.5.5",
|
||||||
"@dannycoates/webcrypto-liner": "^0.1.37",
|
"@dannycoates/webcrypto-liner": "^0.1.37",
|
||||||
"@dannycoates/webpack-dev-server": "^3.1.4",
|
"@fullhuman/postcss-purgecss": "^1.2.0",
|
||||||
"@fullhuman/postcss-purgecss": "^1.1.0",
|
|
||||||
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
||||||
|
"@sentry/browser": "^5.6.3",
|
||||||
"asmcrypto.js": "^0.22.0",
|
"asmcrypto.js": "^0.22.0",
|
||||||
"babel-loader": "^8.0.5",
|
"babel-loader": "^8.0.6",
|
||||||
"babel-plugin-istanbul": "^5.1.1",
|
"babel-plugin-istanbul": "^5.2.0",
|
||||||
"base64-js": "^1.3.0",
|
"base64-js": "^1.3.1",
|
||||||
"content-disposition": "^0.5.3",
|
"content-disposition": "^0.5.3",
|
||||||
"copy-webpack-plugin": "^5.0.0",
|
"copy-webpack-plugin": "^5.0.4",
|
||||||
"core-js": "^2.6.5",
|
"core-js": "^3.2.1",
|
||||||
"crc": "^3.8.0",
|
"crc": "^3.8.0",
|
||||||
"cross-env": "^5.2.0",
|
"cross-env": "^5.2.1",
|
||||||
"css-loader": "^2.1.1",
|
"css-loader": "^3.2.0",
|
||||||
"css-mqpacker": "^7.0.0",
|
"css-mqpacker": "^7.0.0",
|
||||||
"cssnano": "^4.1.10",
|
"cssnano": "^4.1.10",
|
||||||
"eslint": "^5.15.1",
|
"eslint": "^6.3.0",
|
||||||
"eslint-plugin-mocha": "^5.3.0",
|
"eslint-config-prettier": "^6.2.0",
|
||||||
"eslint-plugin-node": "^8.0.1",
|
"eslint-plugin-mocha": "^6.1.0",
|
||||||
|
"eslint-plugin-node": "^9.2.0",
|
||||||
"eslint-plugin-security": "^1.4.0",
|
"eslint-plugin-security": "^1.4.0",
|
||||||
"expose-loader": "^0.7.5",
|
"expose-loader": "^0.7.5",
|
||||||
"extract-loader": "^3.1.0",
|
"extract-loader": "^3.1.0",
|
||||||
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
||||||
"fast-text-encoding": "^1.0.0",
|
"fast-text-encoding": "^1.0.0",
|
||||||
"file-loader": "^3.0.1",
|
"file-loader": "^4.2.0",
|
||||||
"fluent-intl-polyfill": "^0.1.0",
|
|
||||||
"git-rev-sync": "^1.12.0",
|
"git-rev-sync": "^1.12.0",
|
||||||
"html-loader": "^0.5.5",
|
"html-loader": "^0.5.5",
|
||||||
"http_ece": "^1.1.0",
|
"http_ece": "^1.1.0",
|
||||||
"husky": "^1.3.1",
|
"husky": "^3.0.5",
|
||||||
"lint-staged": "^8.1.5",
|
"intl-pluralrules": "^1.0.3",
|
||||||
"mocha": "^6.0.2",
|
"lint-staged": "^9.2.5",
|
||||||
|
"mocha": "^6.2.0",
|
||||||
"morgan": "^1.9.1",
|
"morgan": "^1.9.1",
|
||||||
"nanobus": "^4.4.0",
|
"nanobus": "^4.4.0",
|
||||||
"nanohtml": "^1.4.0",
|
"nanohtml": "^1.8.1",
|
||||||
"nanotiming": "^7.3.1",
|
"nanotiming": "^7.3.1",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"nyc": "^13.3.0",
|
"nyc": "^14.1.1",
|
||||||
"postcss-loader": "^3.0.0",
|
"postcss-loader": "^3.0.0",
|
||||||
"postcss-preset-env": "^6.6.0",
|
"postcss-preset-env": "^6.7.0",
|
||||||
"prettier": "^1.16.4",
|
"prettier": "^1.18.2",
|
||||||
"proxyquire": "^2.1.0",
|
"proxyquire": "^2.1.3",
|
||||||
"puppeteer": "1.11.0",
|
"puppeteer": "^1.19.0",
|
||||||
"raven-js": "^3.27.0",
|
"raw-loader": "^3.1.0",
|
||||||
"raw-loader": "^1.0.0",
|
"redis-mock": "^0.46.0",
|
||||||
"redis-mock": "^0.43.0",
|
"rimraf": "^3.0.0",
|
||||||
"rimraf": "^2.6.3",
|
|
||||||
"script-loader": "^0.7.2",
|
"script-loader": "^0.7.2",
|
||||||
"sinon": "^7.2.7",
|
"sinon": "^7.4.2",
|
||||||
"string-hash": "^1.1.3",
|
"string-hash": "^1.1.3",
|
||||||
"stylelint": "^9.10.1",
|
"stylelint": "^10.1.0",
|
||||||
"stylelint-config-standard": "^18.2.0",
|
"stylelint-config-standard": "^18.3.0",
|
||||||
"stylelint-no-unsupported-browser-features": "^3.0.2",
|
"stylelint-no-unsupported-browser-features": "^3.0.2",
|
||||||
"svgo": "^1.2.0",
|
"svgo": "^1.3.0",
|
||||||
"svgo-loader": "^2.2.0",
|
"svgo-loader": "^2.2.1",
|
||||||
"tailwindcss": "^0.7.4",
|
"tailwindcss": "^1.1.2",
|
||||||
"val-loader": "^1.1.1",
|
"val-loader": "^1.1.1",
|
||||||
"wdio-docker-service": "^1.4.2",
|
"wdio-docker-service": "^1.4.2",
|
||||||
"wdio-dot-reporter": "0.0.10",
|
"wdio-dot-reporter": "0.0.10",
|
||||||
@@ -128,39 +129,42 @@
|
|||||||
"wdio-sauce-service": "^0.4.14",
|
"wdio-sauce-service": "^0.4.14",
|
||||||
"wdio-selenium-standalone-service": "0.0.12",
|
"wdio-selenium-standalone-service": "0.0.12",
|
||||||
"wdio-spec-reporter": "^0.1.5",
|
"wdio-spec-reporter": "^0.1.5",
|
||||||
"webdriverio": "^4.14.3",
|
"webdriverio": "^4.14.4",
|
||||||
"webpack": "4.28.4",
|
"webpack": "4.38.0",
|
||||||
"webpack-cli": "^3.2.3",
|
"webpack-cli": "^3.3.7",
|
||||||
"webpack-dev-middleware": "^3.6.1",
|
"webpack-dev-middleware": "^3.7.1",
|
||||||
|
"webpack-dev-server": "^3.8.0",
|
||||||
"webpack-manifest-plugin": "^2.0.4",
|
"webpack-manifest-plugin": "^2.0.4",
|
||||||
"webpack-unassert-loader": "^1.2.0"
|
"webpack-unassert-loader": "^1.2.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@google-cloud/storage": "^2.4.2",
|
"@dannycoates/express-ws": "^5.0.3",
|
||||||
"aws-sdk": "^2.417.0",
|
"@fluent/bundle": "^0.13.0",
|
||||||
"body-parser": "^1.18.3",
|
"@fluent/langneg": "^0.3.0",
|
||||||
"choo": "^6.12.1",
|
"@google-cloud/storage": "^3.2.1",
|
||||||
"cldr-core": "^34.0.0",
|
"@sentry/node": "^5.6.2",
|
||||||
"convict": "^4.4.1",
|
"aws-sdk": "^2.523.0",
|
||||||
"express": "^4.16.3",
|
"body-parser": "^1.19.0",
|
||||||
"express-ws": "github:dannycoates/express-ws",
|
"choo": "^7.0.0",
|
||||||
"fluent": "^0.11.0",
|
"cldr-core": "^35.1.0",
|
||||||
"fluent-langneg": "^0.1.1",
|
"configstore": "github:dannycoates/configstore#master",
|
||||||
|
"convict": "^5.1.0",
|
||||||
|
"express": "^4.17.1",
|
||||||
"fxa-geodb": "^1.0.4",
|
"fxa-geodb": "^1.0.4",
|
||||||
"helmet": "^3.15.1",
|
"helmet": "^3.21.0",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"mozlog": "^2.2.0",
|
"mozlog": "^2.2.0",
|
||||||
"node-fetch": "^2.3.0",
|
"node-fetch": "^2.6.0",
|
||||||
"raven": "^2.6.4",
|
|
||||||
"redis": "^2.8.0",
|
"redis": "^2.8.0",
|
||||||
"selenium-standalone": "^6.15.6",
|
"selenium-standalone": "^6.15.6",
|
||||||
"ua-parser-js": "^0.7.19",
|
"ua-parser-js": "^0.7.20"
|
||||||
"websocket-stream": "^5.1.2"
|
|
||||||
},
|
},
|
||||||
"availableLanguages": [
|
"availableLanguages": [
|
||||||
"en-US",
|
"en-US",
|
||||||
|
"ar",
|
||||||
"ast",
|
"ast",
|
||||||
"bn-BD",
|
"bn",
|
||||||
|
"br",
|
||||||
"ca",
|
"ca",
|
||||||
"cak",
|
"cak",
|
||||||
"cs",
|
"cs",
|
||||||
@@ -175,9 +179,12 @@
|
|||||||
"es-CL",
|
"es-CL",
|
||||||
"es-ES",
|
"es-ES",
|
||||||
"es-MX",
|
"es-MX",
|
||||||
|
"et",
|
||||||
|
"eu",
|
||||||
"fi",
|
"fi",
|
||||||
"fr",
|
"fr",
|
||||||
"fy-NL",
|
"fy-NL",
|
||||||
|
"he",
|
||||||
"hr",
|
"hr",
|
||||||
"hsb",
|
"hsb",
|
||||||
"hu",
|
"hu",
|
||||||
@@ -186,9 +193,15 @@
|
|||||||
"it",
|
"it",
|
||||||
"ja",
|
"ja",
|
||||||
"ka",
|
"ka",
|
||||||
|
"kab",
|
||||||
|
"ko",
|
||||||
"lt",
|
"lt",
|
||||||
|
"ml",
|
||||||
|
"nb-NO",
|
||||||
"nl",
|
"nl",
|
||||||
"nn-NO",
|
"nn-NO",
|
||||||
|
"oc",
|
||||||
|
"pa-IN",
|
||||||
"pl",
|
"pl",
|
||||||
"pt-BR",
|
"pt-BR",
|
||||||
"pt-PT",
|
"pt-PT",
|
||||||
@@ -196,11 +209,15 @@
|
|||||||
"ru",
|
"ru",
|
||||||
"sk",
|
"sk",
|
||||||
"sl",
|
"sl",
|
||||||
|
"sq",
|
||||||
"sr",
|
"sr",
|
||||||
|
"su",
|
||||||
"sv-SE",
|
"sv-SE",
|
||||||
|
"th",
|
||||||
"tr",
|
"tr",
|
||||||
"uk",
|
"uk",
|
||||||
"vi",
|
"vi",
|
||||||
|
"zgh",
|
||||||
"zh-CN",
|
"zh-CN",
|
||||||
"zh-TW"
|
"zh-TW"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ class TailwindExtractor {
|
|||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
plugins: [
|
plugins: [
|
||||||
require('tailwindcss')('./tailwind.js'),
|
require('tailwindcss')('./tailwind.config.js'),
|
||||||
require('postcss-preset-env')
|
require('postcss-preset-env')
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,31 +1,9 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = فَيَرفُكس سِنْد
|
title = فَيَرفُكس سِنْد
|
||||||
siteSubtitle = تجربة وِبّيّة
|
|
||||||
siteFeedback = الانطباعات
|
siteFeedback = الانطباعات
|
||||||
uploadPageHeader = شارِك ملفاتك بخصوصية وتعمية
|
|
||||||
uploadPageExplainer = أرسل الملفات عبر رابط آمن خاص ومعمّى تنتهي صلاحيته تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد.
|
|
||||||
uploadPageLearnMore = اطّلع على المزيد
|
|
||||||
uploadPageDropMessage = أسقِط ملفّك هنا لبدء الرفع
|
|
||||||
uploadPageSizeMessage = لتتحصل على أفضل تجربة، من المستحسن أن يكون الملف أصغر من 1 غ.بايت
|
|
||||||
uploadPageBrowseButton = اختر ملفًا على حاسوبك
|
|
||||||
uploadPageBrowseButton1 = اختر ملفّا لرفعه
|
|
||||||
uploadPageMultipleFilesAlert = رفع عدة ملفات (أو رفع مجلد) ليس مدعوما حاليا.
|
|
||||||
uploadPageBrowseButtonTitle = ارفع ملفًا
|
|
||||||
uploadingPageProgress = يرفع { $filename } ({ $size })
|
|
||||||
importingFile = يستورد…
|
importingFile = يستورد…
|
||||||
verifyingFile = يتحقق…
|
|
||||||
encryptingFile = يعمّي…
|
encryptingFile = يعمّي…
|
||||||
decryptingFile = يفك التعمية…
|
decryptingFile = يفك التعمية…
|
||||||
notifyUploadDone = انتهى الرفع.
|
|
||||||
uploadingPageMessage = ما إن يُرفع الملف سيُتاح ضبط خيارات انتهاء صلاحيته.
|
|
||||||
uploadingPageCancel = ألغِ الرفع
|
|
||||||
uploadCancelNotification = أُلغي الرفع.
|
|
||||||
uploadingPageLargeFileMessage = هذا الملف كبير الحجم وسيأخذ رفعه وقتا. انتظر رجاءً.
|
|
||||||
uploadingFileNotification = أعلِمني عندما يكتمل الرفع.
|
|
||||||
uploadSuccessConfirmHeader = جاهز للإرسال
|
|
||||||
uploadSvgAlt = ارفع
|
|
||||||
uploadSuccessTimingHeader = ستنتهي صلاحية الرابط الذي يشير إلى الملف في حال: نُزِّل لأول مرة، أو مرّ ٢٤ ساعة على رفعه.
|
|
||||||
expireInfo = ستنتهي صلاحية رابط الملف بعد { $downloadCount } أو { $timespan }.
|
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[zero] لا تنزيلات
|
[zero] لا تنزيلات
|
||||||
@@ -44,76 +22,26 @@ timespanHours =
|
|||||||
[many] { $num } ساعة
|
[many] { $num } ساعة
|
||||||
*[other] { $num } ساعة
|
*[other] { $num } ساعة
|
||||||
}
|
}
|
||||||
copyUrlFormLabelWithName = انسخ الرابط وشاركه لإرسال الملف: { $filename }
|
|
||||||
copyUrlFormButton = انسخ إلى الحافظة
|
|
||||||
copiedUrl = نُسخ!
|
copiedUrl = نُسخ!
|
||||||
deleteFileButton = احذف الملف
|
|
||||||
sendAnotherFileLink = أرسِل ملفًا آخر
|
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
downloadAltText = نزّل
|
|
||||||
downloadsFileList = التنزيلات
|
|
||||||
# Used as header in a column indicating the amount of time left before a
|
|
||||||
# download link expires (e.g. "10h 5m")
|
|
||||||
timeFileList = الوقت
|
|
||||||
# Used as header in a column indicating the number of times a file has been
|
|
||||||
# downloaded
|
|
||||||
downloadFileName = نزّل { $filename }
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
unlockInputLabel = أدخل كلمة السر
|
|
||||||
unlockInputPlaceholder = كلمة السر
|
unlockInputPlaceholder = كلمة السر
|
||||||
unlockButtonLabel = افتح القفل
|
unlockButtonLabel = افتح القفل
|
||||||
downloadFileTitle = نزِّل الملف المعمّى
|
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
downloadMessage = يُرسل إليك صديقك ملفا عبر «فَيَرفُكس سِنْد»، وهي خدمة تتيح لك مشاركة الملفات عبر رابط آمن وخاص ومعمّى، حيث تنتهي صلاحياتها تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد.
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = نزّل
|
downloadButtonLabel = نزّل
|
||||||
downloadNotification = لقد اكتمل التنزيل.
|
|
||||||
downloadFinish = اكتمل التنزيل
|
downloadFinish = اكتمل التنزيل
|
||||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
|
||||||
fileSizeProgress = ({ $partialSize } من أصل { $totalSize })
|
fileSizeProgress = ({ $partialSize } من أصل { $totalSize })
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
sendYourFilesLink = جرِّب «فَيَرفُكس سِنْد»
|
sendYourFilesLink = جرِّب «فَيَرفُكس سِنْد»
|
||||||
downloadingPageProgress = ينزّل { $filename } ({ $size })
|
|
||||||
downloadingPageMessage = رجاء أبقِ هذا اللسان مفتوحا حتى نجلب الملف ونفك تعميته.
|
|
||||||
errorAltText = خطأ أثناء الرفع
|
|
||||||
errorPageHeader = حدث خطب ما.
|
errorPageHeader = حدث خطب ما.
|
||||||
errorPageMessage = حدث خطب ما أثناء رفع الملف.
|
|
||||||
errorPageLink = أرسل ملفا آخر
|
|
||||||
fileTooBig = حجم الملف كبير للغاية لرفعه. يجب أن يكون أصغر من { $size }.
|
fileTooBig = حجم الملف كبير للغاية لرفعه. يجب أن يكون أصغر من { $size }.
|
||||||
linkExpiredAlt = انتهت صلاحية الرابط
|
linkExpiredAlt = انتهت صلاحية الرابط
|
||||||
expiredPageHeader = انتهت صلاحية هذا الرابط أو لم يكن موجودا في المقام الأول!
|
|
||||||
notSupportedHeader = متصفحك غير مدعوم.
|
notSupportedHeader = متصفحك غير مدعوم.
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
notSupportedDetail = للأسف فإن متصفحك لا يدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تجربة متصفح آخر، ونحن ننصحك بِفَيَرفُكس!
|
|
||||||
notSupportedLink = لماذا متصفحي غير مدعوم؟
|
notSupportedLink = لماذا متصفحي غير مدعوم؟
|
||||||
notSupportedOutdatedDetail = للأسف فإن إصدارة فَيَرفُكس هذه لا تدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تحديث متصفحك.
|
notSupportedOutdatedDetail = للأسف فإن إصدارة فَيَرفُكس هذه لا تدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تحديث متصفحك.
|
||||||
updateFirefox = حدّث فَيَرفُكس
|
updateFirefox = حدّث فَيَرفُكس
|
||||||
downloadFirefoxButtonSub = تنزيل مجاني
|
|
||||||
uploadedFile = ملف
|
|
||||||
copyFileList = انسخ الرابط
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = ينتهي في
|
|
||||||
deleteFileList = احذف
|
|
||||||
nevermindButton = لا بأس
|
|
||||||
legalHeader = الشروط والخصوصية
|
|
||||||
legalNoticeTestPilot = «فَيَرفُكس سِنْد» جزء من اختبار تجريبي حاليًا و يخضع <a>لبنود خدمة</a> الاختبار التجريبي و <a>تنويه الخصوصية</a>. يمكنك التعرف على مزيد من المعلومات حول هذه التجربة وجمع البيانات<a>هنا</a>.
|
|
||||||
legalNoticeMozilla = يخضع استخدام موقع «فَيَرفُكس سِنْد» إلى<a>تنويه خصوصية المواقع</a> و <a>بنود خدمة المواقع</a>.
|
|
||||||
deletePopupText = أأحذف هذا الملف؟
|
|
||||||
deletePopupYes = نعم
|
|
||||||
deletePopupCancel = ألغِ
|
deletePopupCancel = ألغِ
|
||||||
deleteButtonHover = احذف
|
deleteButtonHover = احذف
|
||||||
copyUrlHover = انسخ الرابط
|
|
||||||
footerLinkLegal = القانونية
|
footerLinkLegal = القانونية
|
||||||
# Test Pilot is a proper name and should not be localized.
|
|
||||||
footerLinkAbout = حول الاختبار التجريبي
|
|
||||||
footerLinkPrivacy = الخصوصية
|
footerLinkPrivacy = الخصوصية
|
||||||
footerLinkTerms = الشروط
|
|
||||||
footerLinkCookies = الكعكات
|
footerLinkCookies = الكعكات
|
||||||
requirePasswordCheckbox = اطلب كلمة سر لتنزيل هذا الملف
|
|
||||||
addPasswordButton = أضِف كلمة سر
|
|
||||||
changePasswordButton = غيّر
|
|
||||||
passwordTryAgain = كلمة السر خاطئة. أعِد المحاولة.
|
passwordTryAgain = كلمة السر خاطئة. أعِد المحاولة.
|
||||||
reportIPInfringement = أبلغ عن انتهاك للملكية الفكرية
|
|
||||||
javascriptRequired = يتطلب فَيَرفُكس سِنْد جافاسكربت
|
javascriptRequired = يتطلب فَيَرفُكس سِنْد جافاسكربت
|
||||||
whyJavascript = لماذا يتطلب فَيَرفُكس سِنْد جافاسكربت؟
|
whyJavascript = لماذا يتطلب فَيَرفُكس سِنْد جافاسكربت؟
|
||||||
enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاولة.
|
enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاولة.
|
||||||
@@ -121,9 +49,137 @@ enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاو
|
|||||||
expiresHoursMinutes = { $hours }س { $minutes }د
|
expiresHoursMinutes = { $hours }س { $minutes }د
|
||||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
expiresMinutes = { $minutes }د
|
expiresMinutes = { $minutes }د
|
||||||
# A short status message shown when a password is successfully set
|
|
||||||
passwordIsSet = ضُبطت كلمة السر
|
|
||||||
# A short status message shown when the user enters a long password
|
# A short status message shown when the user enters a long password
|
||||||
maxPasswordLength = أقصر طول لكلمة السر: { $length }
|
maxPasswordLength = أقصر طول لكلمة السر: { $length }
|
||||||
# A short status message shown when there was an error setting the password
|
# A short status message shown when there was an error setting the password
|
||||||
passwordSetError = يجب ألا تُضبط كلمة السر هذه
|
passwordSetError = يجب ألا تُضبط كلمة السر هذه
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
introTitle = شارِك ملفاتك بلا عناء وبخصوصية تامة
|
||||||
|
introDescription = يتيح لك { -send-brand } مشاركة الملفات عبر تعميتها من الطرفين وإتاحتها في رابط ينقضي أجله تلقائيا. هكذا يمكنك إبقاء ما شاركته خاصًا فتضمن بأن ملفاتك لن تبقى في الوِب أبد الدهر.
|
||||||
|
notifyUploadEncryptDone = اكتملت تعمية الملف وأصبح جاهزًا لإرساله
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = ينقضي بعد { $downloadCount } أو { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[zero] أقل من دقيقة
|
||||||
|
[one] دقيقة واحدة
|
||||||
|
[two] دقيقتين اثنتين
|
||||||
|
[few] { $num } دقائق
|
||||||
|
[many] { $num } دقيقة
|
||||||
|
*[other] { $num } دقيقة
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[zero] أقل من يوم
|
||||||
|
[one] يوم واحد
|
||||||
|
[two] يومين اثنين
|
||||||
|
[few] { $num } أيام
|
||||||
|
[many] { $num } يومًا
|
||||||
|
*[other] { $num } يوم
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[zero] أقل من أسبوع
|
||||||
|
[one] أسبوع واحد
|
||||||
|
[two] أسبوعين اثنين
|
||||||
|
[few] { $num } أسابيع
|
||||||
|
[many] { $num } أسبوعًا
|
||||||
|
*[other] { $num } أسبوع
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[zero] { $num } ملف
|
||||||
|
[one] ملف واحد
|
||||||
|
[two] ملفان اثنان
|
||||||
|
[few] { $num } ملفات
|
||||||
|
[many] { $num } ملفًا
|
||||||
|
*[other] { $num } ملف
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = بايت
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = ك.بايت
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = م.بايت
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = ج.بايت
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num } { $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = إجمالي الحجم: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = انسخ هذا الرابط لتُشارك الملف:
|
||||||
|
copyLinkButton = انسخ الرابط
|
||||||
|
downloadTitle = نزّل الملفات
|
||||||
|
downloadDescription = شارك أحد هذا الملف معك عبر { -send-brand } وعمّاه بتعمية من الطرفين وبرابط ينقضي أجله تلقائيا.
|
||||||
|
trySendDescription = جرِّب { -send-brand } وشارِك ملفاتك بلا عناء وبخصوصية تامة.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[zero] لا يمكنك تنزيل أي ملف في آن واحد.
|
||||||
|
[one] لا يمكنك تنزيل ما يزيد على ملف واحد في آن واحد.
|
||||||
|
[two] لا يمكنك تنزيل ما يزيد على ملفين اثنين في آن واحد.
|
||||||
|
[few] لا يمكنك تنزيل ما يزيد على { $count } ملفات في آن واحد.
|
||||||
|
[many] لا يمكنك تنزيل ما يزيد على { $count } ملفًا في آن واحد.
|
||||||
|
*[other] لا يمكنك تنزيل ما يزيد على { $count } ملف في آن واحد.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[zero] الأرشيفات ممنوعة.
|
||||||
|
[one] لا يُسمح إلا بأرشيف واحد.
|
||||||
|
[two] لا يُسمح إلا بأرشيفين اثنين.
|
||||||
|
[few] لا يُسمح إلا ب { $count } أرشيفات.
|
||||||
|
[many] لا يُسمح إلا ب { $count } أرشيفًا.
|
||||||
|
*[other] لا يُسمح إلا ب { $count } أرشيف.
|
||||||
|
}
|
||||||
|
expiredTitle = انقضى وقت الرابط.
|
||||||
|
notSupportedDescription = لن يعمل { -send-brand } في هذا المتصفح. أفضل المتصفحات التي يعمل معها { -send-short-brand } هو { -firefox } بآخر إصدارة، كما وأحدث إصدارة من أغلب المتصفحات الموجودة.
|
||||||
|
downloadFirefox = نزِّل { -firefox }
|
||||||
|
legalTitle = تنويه خصوصية { -send-short-brand }
|
||||||
|
legalDateStamp = الإصدارة ١٫٠ بتاريخ ١٢ مارس ٢٠١٩
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days }يوم { $hours }سا { $minutes }دق
|
||||||
|
addFilesButton = حدّد الملفات التي تريد رفعها
|
||||||
|
uploadButton = ارفع
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = اسحب الملفات وأفلِتها هنا
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = أو انقر لإرسال ملفات يصل حجمها { $size }
|
||||||
|
addPassword = احمِه بكلمة سر
|
||||||
|
emailPlaceholder = أدخل بريدك الإلكتروني
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = لِج وأرسِل ملفات يصل حجمها { $size }
|
||||||
|
signInOnlyButton = لِج
|
||||||
|
accountBenefitTitle = أنشِئ حساب { -firefox } أو لِج إلى حسابك
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = شارِك ملفات يصل حجمها { $size }
|
||||||
|
accountBenefitDownloadCount = شارِك الملفات مع أناس أكثر وأكثر
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[zero] لا تُبقِ أي روابط نشطة
|
||||||
|
[one] أبقِ الروابط نشطة لمدة تصل إلى يوم واحد
|
||||||
|
[two] أبقِ الروابط نشطة لمدة تصل إلى يومين اثنين
|
||||||
|
[few] أبقِ الروابط نشطة لمدة تصل إلى { $count } أيام
|
||||||
|
[many] أبقِ الروابط نشطة لمدة تصل إلى { $count } يومًا
|
||||||
|
*[other] أبقِ الروابط نشطة لمدة تصل إلى { $count } يوم
|
||||||
|
}
|
||||||
|
accountBenefitSync = أدِر ملفاتك التي شاركتها من أيّ جهاز تريد
|
||||||
|
accountBenefitMoz = اطّلع على المزيد حول خدمات { -mozilla }
|
||||||
|
signOut = اخرج
|
||||||
|
okButton = حسنًا
|
||||||
|
downloadingTitle = يجري التنزيل
|
||||||
|
noStreamsWarning = هناك احتمال بألا يقدر هذا المتصفح على فكّ تعمية الملفات الكبيرة كهذا.
|
||||||
|
noStreamsOptionCopy = انسخ الرابط لتفتحه في متصفح آخر
|
||||||
|
noStreamsOptionFirefox = جرّب متصفّحنا المفضل
|
||||||
|
noStreamsOptionDownload = واصِل بهذا المتصفح
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } تقدمة { -firefox } الجديد الأنيق.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = شارِك الرابط الذي يصل إلى الملف:
|
||||||
|
shareLinkButton = شارِك الرابط
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة
|
||||||
|
learnMore = اطّلع على المزيد.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = পাসওয়ার্ড দ্বারা সুরক্ষ
|
|||||||
emailPlaceholder = আপনার ইমেইল দিন
|
emailPlaceholder = আপনার ইমেইল দিন
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন
|
signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন
|
||||||
signInButton = সাইন ইন/আপ
|
signInOnlyButton = সাইন ইন
|
||||||
accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন
|
accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন
|
accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = এই ব্রাউজার এতো বড় একট
|
|||||||
noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন
|
noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন
|
||||||
noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন
|
noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন
|
||||||
noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন
|
noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } আপনারদের জন্য নিয়ে এসেছে একেবারে নতুন { -firefox }।
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = আপনার ফাইলে লিঙ্ক শেয়ার করুন:
|
||||||
|
shareLinkButton = লিঙ্ক শেয়ার করুন
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = { -send-brand } এর মাধ্যমে "{ $name }" ডাউনলোড করুন: সরল, নিরাপদ ফাইল শেয়ারিং
|
||||||
|
trailheadPromo = আপনার গোপনীয়তা রক্ষা করার একটি উপায় আছে। Firefox এ যোগ দিন।
|
||||||
|
learnMore = আরও জানুন।
|
||||||
182
public/locales/br/send.ftl
Normal file
182
public/locales/br/send.ftl
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = Firefox Send
|
||||||
|
siteFeedback = Roit hoc'h ali
|
||||||
|
importingFile = Oc'h enporzhiañ …
|
||||||
|
encryptingFile = Oc'h enrinegañ..
|
||||||
|
decryptingFile = Oc'h ezrinegañ...
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } bellgargadenn
|
||||||
|
[two] { $num } bellgargadenn
|
||||||
|
[few] { $num } fellgargadenn
|
||||||
|
[many] { $num } a bellgargadennoù
|
||||||
|
*[other] { $num } pellgargadenn
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } eur
|
||||||
|
[two] { $num } eur
|
||||||
|
[few] { $num } eur
|
||||||
|
[many] { $num } a eurioù
|
||||||
|
*[other] { $num } eur
|
||||||
|
}
|
||||||
|
copiedUrl = Eilet!
|
||||||
|
unlockInputPlaceholder = Ger-tremen
|
||||||
|
unlockButtonLabel = Dibrennañ
|
||||||
|
downloadButtonLabel = Pellgargañ
|
||||||
|
downloadFinish = Pellgargadur echu
|
||||||
|
fileSizeProgress = ({ $partialSize } war { $totalSize })
|
||||||
|
sendYourFilesLink = Esaeit Firefox Send
|
||||||
|
errorPageHeader = Degouezhet ez eus bet ur fazi!
|
||||||
|
fileTooBig = Re vras eo ar restr-mañ evit e pellgas. Rankout a ra bezañ nebeutoc'h eget { $size }
|
||||||
|
linkExpiredAlt = Ere diamzeret
|
||||||
|
notSupportedHeader = N'eo ket skoret ho merdeer.
|
||||||
|
notSupportedLink = Perak n'eo ket skoret ma merdeer?
|
||||||
|
notSupportedOutdatedDetail = Siwazh n'eo ket skoret ar c'halvezerezhioù implijet evit Firefox Send gant an handelv-mañ eus Firefox. Ret e vo deoc'h hizivaat ho merdeer.
|
||||||
|
updateFirefox = Hizivaat Firefox
|
||||||
|
deletePopupCancel = Nullañ
|
||||||
|
deleteButtonHover = Dilemel
|
||||||
|
footerLinkLegal = Lezennel
|
||||||
|
footerLinkPrivacy = Buhez prevez
|
||||||
|
footerLinkCookies = Toupinoù
|
||||||
|
passwordTryAgain = Ger-tremen direizh. Klaskit en-dro.
|
||||||
|
javascriptRequired = Firefox Send a azgoulenn Javascript
|
||||||
|
whyJavascript = Perak e azgoulenn Firefox Send Javascript?
|
||||||
|
enableJavascript = Gweredekait Javascript ha klaskit en-dro.
|
||||||
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
|
expiresHoursMinutes = { $hours }e { $minutes }m
|
||||||
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
|
expiresMinutes = { $minutes }m
|
||||||
|
# A short status message shown when the user enters a long password
|
||||||
|
maxPasswordLength = Hirder brasañ aotreet evit ar ger-tremen: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = N'haller ket despizañ ar ger-tremen
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Rannañ restroù en un doare eeun ha prevez
|
||||||
|
introDescription = A-drugarez da { -send-brand } a c'hallit rannañ restroù gant un enrinegañ penn-ouzh-penn hag un ere a ziamzero ent emgefreek. Evel-se e c'hallit mirout ar pezh a rannit prevez ha bezañ sur ne chomo ket ho traoù enlinenn da viken.
|
||||||
|
notifyUploadEncryptDone = Enrineget eo ho restr ha prest eo da vezañ kaset
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Diamzeriñ a raio goude { $downloadCount } pe { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } vunutenn
|
||||||
|
[two] { $num } vunutenn
|
||||||
|
[few] { $num } munutenn
|
||||||
|
[many] { $num } a vunutennoù
|
||||||
|
*[other] { $num } munutenn
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } devezh
|
||||||
|
[two] { $num } zevezh
|
||||||
|
[few] { $num } devezh
|
||||||
|
[many] { $num } a zevezhioù
|
||||||
|
*[other] { $num } devezh
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } sizhun
|
||||||
|
[two] { $num } sizhun
|
||||||
|
[few] { $num } sizhun
|
||||||
|
[many] { $num } a sizhunioù
|
||||||
|
*[other] { $num } sizhun
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] { $num } restr
|
||||||
|
[two] { $num } restr
|
||||||
|
[few] { $num } restr
|
||||||
|
[many] { $num } a restroù
|
||||||
|
*[other] { $num } restr
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = e
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = Ke
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = Me
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = Ge
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = Ment hollek: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Eilit an ere evit rannañ ho restr
|
||||||
|
copyLinkButton = Eilañ an ere
|
||||||
|
downloadTitle = Pellgargañ ar restroù
|
||||||
|
downloadDescription = Dre { -send-brand } eo bet rannet ar restr-mañ, gant un enrinegañ penn-ouzh-penn hag un ere a ziamzer ent emgefreek.
|
||||||
|
trySendDescription = Esaeit { -send-brand } evit rannañ restroù en un doare eeun ha prevez.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] N'haller pellgas nemet { $count } restr er memes mare.
|
||||||
|
[two] N'haller pellgas nemet { $count } restr er memes mare.
|
||||||
|
[few] N'haller pellgas nemet { $count } restr er memes mare.
|
||||||
|
[many] N'haller pellgas nemet { $count } a restroù er memes mare.
|
||||||
|
*[other] N'haller pellgas nemet { $count } restr er memes mare.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Aotreet eo{ $count } diell nemetken.
|
||||||
|
[two] Aotreet eo{ $count } ziell nemetken.
|
||||||
|
[few] Aotreet eo{ $count } diell nemetken.
|
||||||
|
[many] Aotreet eo{ $count } a zielloù nemetken.
|
||||||
|
*[other] Aotreet eo{ $count } diell nemetken.
|
||||||
|
}
|
||||||
|
expiredTitle = Diamzeret eo an ere.
|
||||||
|
notSupportedDescription = { -send-brand } n'aio ket en-dro war ar merdeer-mañ. { -send-short-brand } a za en-dro gwelloc'h gant handelv diwezhañ { -firefox }, ha mont a raio en-dro gant handelv bremanel lodenn vrasañ ar merdeerioù.
|
||||||
|
downloadFirefox = Pellgargañ { -firefox }
|
||||||
|
legalTitle = Evezhiadenn a fed buhez prevez { -send-short-brand }
|
||||||
|
legalDateStamp = Handelv 1.0, d'an 12 a viz Meurzh 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days }d { $hours }e { $minutes }m
|
||||||
|
addFilesButton = Diuzit ur restr da bellgas
|
||||||
|
uploadButton = Pellgas
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Riklit ha laoskit restroù
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = pe klikit evit kas betek { $size }
|
||||||
|
addPassword = Gwareziñ gant ur ger-tremen
|
||||||
|
emailPlaceholder = Enankit ho chomlec'h postel
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Kennaskit evit kas betek { $size }
|
||||||
|
signInOnlyButton = Kennaskañ
|
||||||
|
accountBenefitTitle = Krouit ur gont { -firefox } pe kennaskit
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Rannit restroù betek { $size }
|
||||||
|
accountBenefitDownloadCount = Rannit restroù gant muioc'h a dud
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Dalc'hit an ereoù oberiant e-pad { $count } devezh
|
||||||
|
[two] Dalc'hit an ereoù oberiant e-pad { $count } zevezh
|
||||||
|
[few] Dalc'hit an ereoù oberiant e-pad { $count } devezh
|
||||||
|
[many] Dalc'hit an ereoù oberiant e-pad { $count } a zevezhioù
|
||||||
|
*[other] Dalc'hit an ereoù oberiant e-pad { $count } devezh
|
||||||
|
}
|
||||||
|
accountBenefitSync = Merit ar restroù rannet gant forzh peseurt trevnad
|
||||||
|
accountBenefitMoz = Gouzout hiroc'h a-zivout gwazerezhioù all { -mozilla }
|
||||||
|
signOut = Digennaskañ
|
||||||
|
okButton = Mat eo
|
||||||
|
downloadingTitle = O pellgargañ
|
||||||
|
noStreamsWarning = Posupl eo ne vefe ket gouest ar merdeer-mañ da ezrinegañ ur restr ken bras.
|
||||||
|
noStreamsOptionCopy = Eilit an ere evit digeriñ anezhañ en ur merdeer all
|
||||||
|
noStreamsOptionFirefox = Esaeit hor merdeer karetañ
|
||||||
|
noStreamsOptionDownload = Kenderc'hel gant ar merdeer-mañ
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } a zo kinniget deoc'h gant ar { -firefox } nevez-flamm.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Rannit an ere etrezek ho restr:
|
||||||
|
shareLinkButton = Rannañ an ere
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Pellgargañ "{ $name }" gant { -send-brand }: rannañ restroù en un doare eeun ha prevez
|
||||||
|
trailheadPromo = Un doare a zo da wareziñ ho puhez prevez. Tremenit da Firefox.
|
||||||
|
learnMore = Gouzout hiroc'h.
|
||||||
@@ -126,7 +126,7 @@ addPassword = Protegeix amb contrasenya
|
|||||||
emailPlaceholder = Introduïu la vostra adreça electrònica
|
emailPlaceholder = Introduïu la vostra adreça electrònica
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Inicieu la sessió per enviar fins a { $size }
|
signInSizeBump = Inicieu la sessió per enviar fins a { $size }
|
||||||
signInButton = Inicieu la sessió o registreu-vos
|
signInOnlyButton = Inicia la sessió
|
||||||
accountBenefitTitle = Creeu un compte del { -firefox } o inicieu la sessió
|
accountBenefitTitle = Creeu un compte del { -firefox } o inicieu la sessió
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Compartiu fitxers fins a { $size }
|
accountBenefitLargeFiles = Compartiu fitxers fins a { $size }
|
||||||
@@ -145,3 +145,9 @@ noStreamsWarning = Pot ser que aquest navegador no pugui desxifrar un fitxer tan
|
|||||||
noStreamsOptionCopy = Copieu l'enllaç per obrir-lo en un altre navegador
|
noStreamsOptionCopy = Copieu l'enllaç per obrir-lo en un altre navegador
|
||||||
noStreamsOptionFirefox = Proveu el nostre navegador preferit
|
noStreamsOptionFirefox = Proveu el nostre navegador preferit
|
||||||
noStreamsOptionDownload = Segueix amb aquest navegador
|
noStreamsOptionDownload = Segueix amb aquest navegador
|
||||||
|
downloadFirefoxPromo = El nou { -firefox } us ofereix el { -send-short-brand }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Compartiu l'enllaç al vostre fitxer:
|
||||||
|
shareLinkButton = Comparteix l'enllaç
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Baixeu «{ $name }» amb el { -send-brand }: compartició de fitxers senzilla i segura
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Tichajïx rik'in ewan tzij
|
|||||||
emailPlaceholder = Tatz'ib'aj ataqoya'l
|
emailPlaceholder = Tatz'ib'aj ataqoya'l
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Tatikirisaj molojri'ïl richin natäq k'a { $size }
|
signInSizeBump = Tatikirisaj molojri'ïl richin natäq k'a { $size }
|
||||||
signInButton = Tatikirisaj molojri'ïl/tatz'ib'aj ab'i'
|
signInOnlyButton = Titikirisäx molojri'ïl
|
||||||
accountBenefitTitle = Tatz'uku' jun { -firefox } Rub'i' Ataqoy'al o Tatikirisaj molojri'ïl
|
accountBenefitTitle = Tatz'uku' jun { -firefox } Rub'i' Ataqoy'al o Tatikirisaj molojri'ïl
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Ke'akomonij taq yakb'äl k'a { $size }
|
accountBenefitLargeFiles = Ke'akomonij taq yakb'äl k'a { $size }
|
||||||
@@ -145,3 +145,9 @@ noStreamsWarning = Rik'in jub'a' re okik'amaya'l re' man nitikïr ta nretamaj ru
|
|||||||
noStreamsOptionCopy = Tiwachib'ëx ri ximonel richin nijaq pa jun chik okik'amaya'l
|
noStreamsOptionCopy = Tiwachib'ëx ri ximonel richin nijaq pa jun chik okik'amaya'l
|
||||||
noStreamsOptionFirefox = Tatojtob'ej ri jeb'ël qokik'amaya'l
|
noStreamsOptionFirefox = Tatojtob'ej ri jeb'ël qokik'amaya'l
|
||||||
noStreamsOptionDownload = Kisamäj na rik'in re okik'amaya'l re'
|
noStreamsOptionDownload = Kisamäj na rik'in re okik'amaya'l re'
|
||||||
|
downloadFirefoxPromo = Ja ri k'ak'a' { -firefox } nusüj ri { -send-short-brand } chawe.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Nakomonij ri ximonel rik'in ri awokisab'al:
|
||||||
|
shareLinkButton = Tikomonïx ximonel
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Tiqasäx "{ $name }" rik'in { -send-brand }: man k'ayew ta chuqa' ütz kikomonik ri yakb'äl
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ addPassword = Ochránit heslem
|
|||||||
emailPlaceholder = Zadejte svoji e-mailovou adresu
|
emailPlaceholder = Zadejte svoji e-mailovou adresu
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Pro odesílání souborů o velikosti až { $size } se prosím přihlaste
|
signInSizeBump = Pro odesílání souborů o velikosti až { $size } se prosím přihlaste
|
||||||
signInButton = Přihlásit/Registrovat se
|
signInOnlyButton = Přihlásit se
|
||||||
accountBenefitTitle = Vytvořte si účet { -firefox(case: "gen") } nebo se přihlaste
|
accountBenefitTitle = Vytvořte si účet { -firefox(case: "gen") } nebo se přihlaste
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Sdílejte soubory o velikosti až { $size }
|
accountBenefitLargeFiles = Sdílejte soubory o velikosti až { $size }
|
||||||
@@ -190,3 +190,11 @@ noStreamsWarning = Dešifrování tak velikého souboru se v tomto prohlížeči
|
|||||||
noStreamsOptionCopy = Zkopírujte odkaz pro otevření v jiném prohlížeči
|
noStreamsOptionCopy = Zkopírujte odkaz pro otevření v jiném prohlížeči
|
||||||
noStreamsOptionFirefox = Vyzkoušejte náš oblíbený prohlížeč
|
noStreamsOptionFirefox = Vyzkoušejte náš oblíbený prohlížeč
|
||||||
noStreamsOptionDownload = Pokračovat v tomto prohlížeči
|
noStreamsOptionDownload = Pokračovat v tomto prohlížeči
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } od aplikace { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Sdílet odkaz na soubor:
|
||||||
|
shareLinkButton = Sdílet odkaz
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Stáhněte si soubor „{ $name }“ s { -send-brand(case: "ins") } - jednoduché a bezpečné sdílení souborů
|
||||||
|
trailheadPromo = Existuje způsob, jak ochránit své soukromí. Používejte Firefox.
|
||||||
|
learnMore = Zjistit více.
|
||||||
|
|||||||
@@ -6,21 +6,21 @@ encryptingFile = Wrthi'n amgryptio…
|
|||||||
decryptingFile = Wrthi'n dadgryptio…
|
decryptingFile = Wrthi'n dadgryptio…
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[zero] Llwythi i lawr
|
[zero] Dim llwythi i lawr
|
||||||
[one] Llwyth i lawr
|
[one] 1 llwyth i lawr
|
||||||
[two] Lwyth i lawr
|
[two] { $num } llwyth i lawr
|
||||||
[few] Llwyth i lawr
|
[few] { $num } llwyth i lawr
|
||||||
[many] Llwyth i lawr
|
[many] { $num } llwyth i lawr
|
||||||
*[other] Llwyth i lawr
|
*[other] { $num } llwyth i lawr
|
||||||
}
|
}
|
||||||
timespanHours =
|
timespanHours =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[zero] awr
|
[zero] awr
|
||||||
[one] awr
|
[one] 1 awr
|
||||||
[two] awr
|
[two] { $num } awr
|
||||||
[few] awr
|
[few] { $num } awr
|
||||||
[many] awr
|
[many] { $num } awr
|
||||||
*[other] awr
|
*[other] { $num } awr
|
||||||
}
|
}
|
||||||
copiedUrl = Wedi eu copïo!
|
copiedUrl = Wedi eu copïo!
|
||||||
unlockInputPlaceholder = Cyfrinair
|
unlockInputPlaceholder = Cyfrinair
|
||||||
@@ -78,7 +78,7 @@ timespanMinutes =
|
|||||||
timespanDays =
|
timespanDays =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[zero] 0 diwrnod
|
[zero] 0 diwrnod
|
||||||
[one] 1 dwrnod
|
[one] 1 diwrnod
|
||||||
[two] { $num } diwrnod
|
[two] { $num } diwrnod
|
||||||
[few] { $num } diwrnod
|
[few] { $num } diwrnod
|
||||||
[many] { $num } diwrnod
|
[many] { $num } diwrnod
|
||||||
@@ -158,7 +158,7 @@ addPassword = Diogelu gyda chyfrinair
|
|||||||
emailPlaceholder = Rhowch eich e-bost
|
emailPlaceholder = Rhowch eich e-bost
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Mewngofnodi i anfon hyd at { $size }
|
signInSizeBump = Mewngofnodi i anfon hyd at { $size }
|
||||||
signInButton = Mewngofnodi/Cofrestru
|
signInOnlyButton = Mewngofnodi
|
||||||
accountBenefitTitle = Creu Cyfrif { -firefox } neu fewngofnodi
|
accountBenefitTitle = Creu Cyfrif { -firefox } neu fewngofnodi
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Rhannu ffeiliau hyd at { $size }
|
accountBenefitLargeFiles = Rhannu ffeiliau hyd at { $size }
|
||||||
@@ -181,3 +181,11 @@ noStreamsWarning = Efallai na fydd y porwr hwn yn gallu dadgryptio ffeil mor faw
|
|||||||
noStreamsOptionCopy = Copïwch y ddolen i'w agor mewn porwr arall
|
noStreamsOptionCopy = Copïwch y ddolen i'w agor mewn porwr arall
|
||||||
noStreamsOptionFirefox = Rhowch gynnig ar ein hoff porwr
|
noStreamsOptionFirefox = Rhowch gynnig ar ein hoff porwr
|
||||||
noStreamsOptionDownload = Parhau gyda'r porwr hwn
|
noStreamsOptionDownload = Parhau gyda'r porwr hwn
|
||||||
|
downloadFirefoxPromo = Mae { -send-short-brand } yn cael ei gynnig i ci gan y { -firefox } newydd.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Rhannu'r ddolen i'ch ffeil:
|
||||||
|
shareLinkButton = Rhannu'r ddolen
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Llwytho i lawr “{ $name }” gyda { -send-brand }: rhannu ffeiliau syml a diogel
|
||||||
|
trailheadPromo = Mae ffordd o ddiogelu eich preifatrwydd. Ymunwch â Firefox.
|
||||||
|
learnMore = Dysgu rhagor.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Beskyt med adgangskode
|
|||||||
emailPlaceholder = Indtast din mailadresse
|
emailPlaceholder = Indtast din mailadresse
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Log ind for at sende filer på op til { $size }
|
signInSizeBump = Log ind for at sende filer på op til { $size }
|
||||||
signInButton = Log ind/tilmeld dig
|
signInOnlyButton = Log ind
|
||||||
accountBenefitTitle = Opret en { -firefox }-konto eller log ind
|
accountBenefitTitle = Opret en { -firefox }-konto eller log ind
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Del filer på op til { $size }
|
accountBenefitLargeFiles = Del filer på op til { $size }
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Denne browser kan muligvis ikke dekryptere en fil, der er så
|
|||||||
noStreamsOptionCopy = Kopier linket for at åbne det i en anden browser
|
noStreamsOptionCopy = Kopier linket for at åbne det i en anden browser
|
||||||
noStreamsOptionFirefox = Prøv vores favorit-browser
|
noStreamsOptionFirefox = Prøv vores favorit-browser
|
||||||
noStreamsOptionDownload = Fortsæt med denne browser
|
noStreamsOptionDownload = Fortsæt med denne browser
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } præsenteres af den nye { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Del linket til din fil:
|
||||||
|
shareLinkButton = Del link
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling
|
||||||
|
trailheadPromo = Beskyt dine digitale rettigheder. Slut dig til Firefox.
|
||||||
|
learnMore = Læs mere.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Mit Passwort schützen
|
|||||||
emailPlaceholder = E-Mail-Adresse eingeben
|
emailPlaceholder = E-Mail-Adresse eingeben
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Melde dich an, um Dateien bis { $size } zu senden
|
signInSizeBump = Melde dich an, um Dateien bis { $size } zu senden
|
||||||
signInButton = Anmelden/Registrieren
|
signInOnlyButton = Anmelden
|
||||||
accountBenefitTitle = Erstelle ein { -firefox }-Konto oder melde dich an
|
accountBenefitTitle = Erstelle ein { -firefox }-Konto oder melde dich an
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Dateien bis zu { $size } teilen
|
accountBenefitLargeFiles = Dateien bis zu { $size } teilen
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Dieser Browser kann eine so große Datei möglicherweise nich
|
|||||||
noStreamsOptionCopy = Kopiere den Link, um ihn in einem anderen Browser zu öffnen
|
noStreamsOptionCopy = Kopiere den Link, um ihn in einem anderen Browser zu öffnen
|
||||||
noStreamsOptionFirefox = Probiere unseren Lieblingsbrowser aus
|
noStreamsOptionFirefox = Probiere unseren Lieblingsbrowser aus
|
||||||
noStreamsOptionDownload = Mit diesem Browser weitermachen
|
noStreamsOptionDownload = Mit diesem Browser weitermachen
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } wird Ihnen präsentiert vom brandneuen { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Teilen Sie den Link zu Ihrer Datei:
|
||||||
|
shareLinkButton = Link teilen
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Laden Sie „{ $name }“ mit { -send-brand } herunter: einfaches, sicheres Teilen von Dateien
|
||||||
|
trailheadPromo = Es gibt einen Weg, deine Privatsphäre zu schützen. Komm zu Firefox.
|
||||||
|
learnMore = Mehr erfahren.
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ addPassword = Z gronidłom šćitaś
|
|||||||
emailPlaceholder = Zapódajśo swóju e-mailowu adresu
|
emailPlaceholder = Zapódajśo swóju e-mailowu adresu
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Pśizjawśo se, aby do { $size } pósłał
|
signInSizeBump = Pśizjawśo se, aby do { $size } pósłał
|
||||||
signInButton = Pśizjawiś/Registrěrowaś
|
signInOnlyButton = Pśizjawiś
|
||||||
accountBenefitTitle = Załožćo konto { -firefox } abo pśizjawśo se
|
accountBenefitTitle = Załožćo konto { -firefox } abo pśizjawśo se
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Dataje do { $size } źěliś
|
accountBenefitLargeFiles = Dataje do { $size } źěliś
|
||||||
@@ -163,3 +163,11 @@ noStreamsWarning = Toś ten wobglědowak njamógał taku wjeliku dataju dešifr
|
|||||||
noStreamsOptionCopy = Kopěrujśo wótkaz, aby jen w drugim wobglědowaku wócynił
|
noStreamsOptionCopy = Kopěrujśo wótkaz, aby jen w drugim wobglědowaku wócynił
|
||||||
noStreamsOptionFirefox = Wopytajśo naš nejlubšy wobglědowak
|
noStreamsOptionFirefox = Wopytajśo naš nejlubšy wobglědowak
|
||||||
noStreamsOptionDownload = Z toś tym wobglědowakom pókšacowaś
|
noStreamsOptionDownload = Z toś tym wobglědowakom pókšacowaś
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } se wam pśez cele nowy { -firefox } pśinjaso.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Źělśo wótkaz k swójej dataji:
|
||||||
|
shareLinkButton = Wótkaz źěliś
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Ześěgniśo „{ $name }“ z { -send-brand }: jadnore, wěste źělenje datajow
|
||||||
|
trailheadPromo = Jo móžnosć, wašu priwatnosć šćitaś. Pśiźćo k Firefox.
|
||||||
|
learnMore = Dalšne informacije.
|
||||||
|
|||||||
@@ -94,15 +94,25 @@ totalSize = Συνολικό μέγεθος: { $size }
|
|||||||
copyLinkDescription = Αντιγράψτε το σύνδεσμο για να μοιραστείτε το αρχείο:
|
copyLinkDescription = Αντιγράψτε το σύνδεσμο για να μοιραστείτε το αρχείο:
|
||||||
copyLinkButton = Αντιγραφή συνδέσμου
|
copyLinkButton = Αντιγραφή συνδέσμου
|
||||||
downloadTitle = Λήψη αρχείων
|
downloadTitle = Λήψη αρχείων
|
||||||
|
downloadDescription = Αυτό το αρχείο διαμοιράστηκε μέσω του { -send-brand } με κρυπτογράφηση από άκρο σε άκρο και με ένα σύνδεσμο που λήγει αυτόματα.
|
||||||
|
trySendDescription = Δοκιμάστε το { -send-brand } για απλό, ασφαλή διαμοιρασμό αρχείων.
|
||||||
# count will always be > 10
|
# count will always be > 10
|
||||||
tooManyFiles =
|
tooManyFiles =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
[one] Μόνο 1 αρχείο μπορεί να μεταφορτωθεί κάθε φορά.
|
[one] Μόνο 1 αρχείο μπορεί να μεταφορτωθεί κάθε φορά.
|
||||||
*[other] Μόνο { $count } αρχεία μπορούν να μεταφορτωθούν κάθε φορά.
|
*[other] Μόνο { $count } αρχεία μπορούν να μεταφορτωθούν κάθε φορά.
|
||||||
}
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Μόνο 1 αρχείο επιτρέπεται.
|
||||||
|
*[other] Μόνο { $count } αρχεία επιτρέπονται.
|
||||||
|
}
|
||||||
expiredTitle = Αυτός ο σύνδεσμος έχει λήξει.
|
expiredTitle = Αυτός ο σύνδεσμος έχει λήξει.
|
||||||
|
notSupportedDescription = Το { -send-brand } δεν θα λειτουργήσει με αυτό το πρόγραμμα περιήγησης. Το { -send-short-brand } λειτουργεί καλύτερα με την πιο πρόσφατη έκδοση του { -firefox }, καθώς και με την τρέχουσα έκδοση των περισσότερων προγραμμάτων περιήγησης.
|
||||||
downloadFirefox = Λήψη του { -firefox }
|
downloadFirefox = Λήψη του { -firefox }
|
||||||
legalTitle = Σημείωση Απορρήτου { -send-short-brand }
|
legalTitle = Σημείωση Απορρήτου { -send-short-brand }
|
||||||
|
legalDateStamp = Έκδοση 1.0, από 12 Μαρτίου 2019
|
||||||
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
expiresDaysHoursMinutes = { $days }η { $hours }ώ { $minutes }λ
|
expiresDaysHoursMinutes = { $days }η { $hours }ώ { $minutes }λ
|
||||||
addFilesButton = Επιλέξτε αρχεία για μεταφόρτωση
|
addFilesButton = Επιλέξτε αρχεία για μεταφόρτωση
|
||||||
@@ -116,10 +126,30 @@ addPassword = Προστασία με κωδικό πρόσβασης
|
|||||||
emailPlaceholder = Εισάγετε το email σας
|
emailPlaceholder = Εισάγετε το email σας
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Συνδεθείτε για να στείλετε μέχρι { $size }
|
signInSizeBump = Συνδεθείτε για να στείλετε μέχρι { $size }
|
||||||
signInButton = Σύνδεση/εγγραφή
|
signInOnlyButton = Σύνδεση
|
||||||
|
accountBenefitTitle = Δημιουργία λογαριασμού { -firefox } ή σύνδεση
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Μοιραστείτε αρχεία έως { $size }
|
||||||
|
accountBenefitDownloadCount = Μοιραστείτε αρχεία με περισσότερα άτομα
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και 1 ημέρα
|
||||||
|
*[other] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και { $count } ημέρες
|
||||||
|
}
|
||||||
|
accountBenefitSync = Διαχειριστείτε τα διαμοιρασμένα αρχεία από οποιαδήποτε συσκευή
|
||||||
accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla }
|
accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla }
|
||||||
signOut = Αποσύνδεση
|
signOut = Αποσύνδεση
|
||||||
okButton = OK
|
okButton = OK
|
||||||
downloadingTitle = Λήψη
|
downloadingTitle = Λήψη
|
||||||
|
noStreamsWarning = Αυτό το πρόγραμμα περιήγησης ενδέχεται να μην μπορέσει να αποκρυπτογραφήσει αρχεία αυτού του μεγέθους.
|
||||||
|
noStreamsOptionCopy = Αντιγράψτε το σύνδεσμο για άνοιγμα σε άλλο πρόγραμμα περιήγησης
|
||||||
noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης
|
noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης
|
||||||
noStreamsOptionDownload = Συνέχεια με αυτό το πρόγραμμα περιήγησης
|
noStreamsOptionDownload = Συνέχεια με αυτό το πρόγραμμα περιήγησης
|
||||||
|
downloadFirefoxPromo = Το { -send-short-brand } παρέχεται σε εσάς από το ολοκαίνουριο { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Μοιραστείτε το σύνδεσμο του αρχείου σας:
|
||||||
|
shareLinkButton = Κοινή χρήση συνδέσμου
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Λήψη του “{ $name }” με το { -send-brand }: απλός και ασφαλής διαμοιρασμός αρχείων
|
||||||
|
trailheadPromo = Υπάρχει τρόπος να προστατέψετε το απόρρητό σας. Γίνετε μέλος του Firefox.
|
||||||
|
learnMore = Μάθετε περισσότερα.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Protect with password
|
|||||||
emailPlaceholder = Enter your email
|
emailPlaceholder = Enter your email
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Sign in to send up to { $size }
|
signInSizeBump = Sign in to send up to { $size }
|
||||||
signInButton = Sign in/up
|
signInOnlyButton = Sign in
|
||||||
accountBenefitTitle = Create a { -firefox } Account or sign in
|
accountBenefitTitle = Create a { -firefox } Account or sign in
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Share files up to { $size }
|
accountBenefitLargeFiles = Share files up to { $size }
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = This browser might not be able to decrypt a file this big.
|
|||||||
noStreamsOptionCopy = Copy the link to open in another browser
|
noStreamsOptionCopy = Copy the link to open in another browser
|
||||||
noStreamsOptionFirefox = Try our favourite browser
|
noStreamsOptionFirefox = Try our favourite browser
|
||||||
noStreamsOptionDownload = Continue with this browser
|
noStreamsOptionDownload = Continue with this browser
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Share the link to your file:
|
||||||
|
shareLinkButton = Share link
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing
|
||||||
|
trailheadPromo = There is a way to protect your privacy. Join Firefox.
|
||||||
|
learnMore = Learn more.
|
||||||
|
|||||||
@@ -1,31 +1,9 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteSubtitle = web experiment
|
|
||||||
siteFeedback = Feedback
|
siteFeedback = Feedback
|
||||||
uploadPageHeader = Private, Encrypted File Sharing
|
|
||||||
uploadPageExplainer = Send files through a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
|
|
||||||
uploadPageLearnMore = Learn more
|
|
||||||
uploadPageDropMessage = Drop your file here to start uploading
|
|
||||||
uploadPageSizeMessage = For the most reliable operation, it’s best to keep your file under 1GB
|
|
||||||
uploadPageBrowseButton = Select a file on your computer
|
|
||||||
uploadPageBrowseButton1 = Select a file to upload
|
|
||||||
uploadPageMultipleFilesAlert = Uploading multiple files or a folder is currently not supported.
|
|
||||||
uploadPageBrowseButtonTitle = Upload file
|
|
||||||
uploadingPageProgress = Uploading { $filename } ({ $size })
|
|
||||||
importingFile = Importing…
|
importingFile = Importing…
|
||||||
verifyingFile = Verifying…
|
|
||||||
encryptingFile = Encrypting…
|
encryptingFile = Encrypting…
|
||||||
decryptingFile = Decrypting…
|
decryptingFile = Decrypting…
|
||||||
notifyUploadDone = Your upload has finished.
|
|
||||||
uploadingPageMessage = Once your file uploads you will be able to set expiry options.
|
|
||||||
uploadingPageCancel = Cancel upload
|
|
||||||
uploadCancelNotification = Your upload was cancelled.
|
|
||||||
uploadingPageLargeFileMessage = This file is large and may take a while to upload. Sit tight!
|
|
||||||
uploadingFileNotification = Notify me when the upload is complete.
|
|
||||||
uploadSuccessConfirmHeader = Ready to Send
|
|
||||||
uploadSvgAlt = Upload
|
|
||||||
uploadSuccessTimingHeader = The link to your file will expire after 1 download or in 24 hours.
|
|
||||||
expireInfo = The link to your file will expire after { $downloadCount } or { $timespan }.
|
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 download
|
[one] 1 download
|
||||||
@@ -36,76 +14,26 @@ timespanHours =
|
|||||||
[one] 1 hour
|
[one] 1 hour
|
||||||
*[other] { $num } hours
|
*[other] { $num } hours
|
||||||
}
|
}
|
||||||
copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename }
|
|
||||||
copyUrlFormButton = Copy to clipboard
|
|
||||||
copiedUrl = Copied!
|
copiedUrl = Copied!
|
||||||
deleteFileButton = Delete file
|
|
||||||
sendAnotherFileLink = Send another file
|
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
downloadAltText = Download
|
|
||||||
downloadsFileList = Downloads
|
|
||||||
# Used as header in a column indicating the amount of time left before a
|
|
||||||
# download link expires (e.g. "10h 5m")
|
|
||||||
timeFileList = Time
|
|
||||||
# Used as header in a column indicating the number of times a file has been
|
|
||||||
# downloaded
|
|
||||||
downloadFileName = Download { $filename }
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
unlockInputLabel = Enter Password
|
|
||||||
unlockInputPlaceholder = Password
|
unlockInputPlaceholder = Password
|
||||||
unlockButtonLabel = Unlock
|
unlockButtonLabel = Unlock
|
||||||
downloadFileTitle = Download Encrypted File
|
|
||||||
# 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.
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = Download
|
downloadButtonLabel = Download
|
||||||
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)".
|
|
||||||
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
sendYourFilesLink = Try Firefox Send
|
sendYourFilesLink = Try Firefox Send
|
||||||
downloadingPageProgress = Downloading { $filename } ({ $size })
|
|
||||||
downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it.
|
|
||||||
errorAltText = Upload error
|
|
||||||
errorPageHeader = Something went wrong!
|
errorPageHeader = Something went wrong!
|
||||||
errorPageMessage = There has been an error uploading the file.
|
|
||||||
errorPageLink = Send another file
|
|
||||||
fileTooBig = That file is too big to upload. It should be less than { $size }.
|
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!
|
|
||||||
notSupportedHeader = Your browser is not supported.
|
notSupportedHeader = Your browser is not supported.
|
||||||
# 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!
|
|
||||||
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.
|
||||||
updateFirefox = Update Firefox
|
updateFirefox = Update Firefox
|
||||||
downloadFirefoxButtonSub = Free Download
|
|
||||||
uploadedFile = File
|
|
||||||
copyFileList = Copy URL
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = Expires In
|
|
||||||
deleteFileList = Delete
|
|
||||||
nevermindButton = Never mind
|
|
||||||
legalHeader = Terms & Privacy
|
|
||||||
legalNoticeTestPilot = Firefox Send is currently a Test Pilot experiment, and subject to the Test Pilot <a>Terms of Service</a> and <a>Privacy Notice</a>. You can learn more about this experiment and its data collection <a>here</a>.
|
|
||||||
legalNoticeMozilla = Use of the Firefox Send web site is also subject to Mozilla’s <a>Websites Privacy Notice</a> and <a>Websites Terms of Use</a>.
|
|
||||||
deletePopupText = Delete this file?
|
|
||||||
deletePopupYes = Yes
|
|
||||||
deletePopupCancel = Cancel
|
deletePopupCancel = Cancel
|
||||||
deleteButtonHover = Delete
|
deleteButtonHover = Delete
|
||||||
copyUrlHover = Copy URL
|
|
||||||
footerLinkLegal = Legal
|
footerLinkLegal = Legal
|
||||||
# Test Pilot is a proper name and should not be localized.
|
|
||||||
footerLinkAbout = About Test Pilot
|
|
||||||
footerLinkPrivacy = Privacy
|
footerLinkPrivacy = Privacy
|
||||||
footerLinkTerms = Terms
|
|
||||||
footerLinkCookies = Cookies
|
footerLinkCookies = Cookies
|
||||||
requirePasswordCheckbox = Require a password to download this file
|
|
||||||
addPasswordButton = Add password
|
|
||||||
changePasswordButton = Change
|
|
||||||
passwordTryAgain = Incorrect password. Try again.
|
passwordTryAgain = Incorrect password. Try again.
|
||||||
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.
|
||||||
@@ -113,14 +41,12 @@ enableJavascript = Please enable JavaScript and try again.
|
|||||||
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
|
# A short status message shown when the user enters a long password
|
||||||
maxPasswordLength = Maximum password length: { $length }
|
maxPasswordLength = Maximum password length: { $length }
|
||||||
# A short status message shown when there was an error setting the password
|
# A short status message shown when there was an error setting the password
|
||||||
passwordSetError = This password could not be set
|
passwordSetError = This password could not be set
|
||||||
|
|
||||||
## New strings for the vNext version of Firefox Send
|
## Send version 2 strings
|
||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
-send-brand = Firefox Send
|
-send-brand = Firefox Send
|
||||||
@@ -152,7 +78,17 @@ fileCount =
|
|||||||
[one] 1 file
|
[one] 1 file
|
||||||
*[other] { $num } files
|
*[other] { $num } files
|
||||||
}
|
}
|
||||||
# size is a localized number followed by a unit of bytes, ex. 2.5GB
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = kB
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = MB
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = GB
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
totalSize = Total size: { $size }
|
totalSize = Total size: { $size }
|
||||||
# the next line after the colon contains a file name
|
# the next line after the colon contains a file name
|
||||||
copyLinkDescription = Copy the link to share your file:
|
copyLinkDescription = Copy the link to share your file:
|
||||||
@@ -184,15 +120,15 @@ uploadButton = Upload
|
|||||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
dragAndDropFiles = Drag and drop files
|
dragAndDropFiles = Drag and drop files
|
||||||
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
# size is a localized number followed by a unit of bytes, ex. 2.5GB
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
orClickWithSize = or click to send up to { $size }
|
orClickWithSize = or click to send up to { $size }
|
||||||
addPassword = Protect with password
|
addPassword = Protect with password
|
||||||
emailPlaceholder = Enter your email
|
emailPlaceholder = Enter your email
|
||||||
# size is a localized number followed by a unit of bytes, ex. 2.5GB
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Sign in to send up to { $size }
|
signInSizeBump = Sign in to send up to { $size }
|
||||||
signInButton = Sign in/up
|
signInOnlyButton = Sign in
|
||||||
accountBenefitTitle = Create a { -firefox } Account or sign in
|
accountBenefitTitle = Create a { -firefox } Account or sign in
|
||||||
# size is a localized number followed by a unit of bytes, ex. 2.5GB
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Share files up to { $size }
|
accountBenefitLargeFiles = Share files up to { $size }
|
||||||
accountBenefitDownloadCount = Share files with more people
|
accountBenefitDownloadCount = Share files with more people
|
||||||
accountBenefitTimeLimit =
|
accountBenefitTimeLimit =
|
||||||
@@ -209,3 +145,11 @@ noStreamsWarning = This browser might not be able to decrypt a file this big.
|
|||||||
noStreamsOptionCopy = Copy the link to open in another browser
|
noStreamsOptionCopy = Copy the link to open in another browser
|
||||||
noStreamsOptionFirefox = Try our favourite browser
|
noStreamsOptionFirefox = Try our favourite browser
|
||||||
noStreamsOptionDownload = Continue with this browser
|
noStreamsOptionDownload = Continue with this browser
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Share the link to your file:
|
||||||
|
shareLinkButton = Share link
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing
|
||||||
|
trailheadPromo = There is a way to protect your privacy. Join Firefox.
|
||||||
|
learnMore = Learn more.
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ addPassword = Protect with password
|
|||||||
emailPlaceholder = Enter your email
|
emailPlaceholder = Enter your email
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Sign in to send up to { $size }
|
signInSizeBump = Sign in to send up to { $size }
|
||||||
signInButton = Sign in/up
|
signInOnlyButton = Sign in
|
||||||
accountBenefitTitle = Create a { -firefox } Account or sign in
|
accountBenefitTitle = Create a { -firefox } Account or sign in
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Share files up to { $size }
|
accountBenefitLargeFiles = Share files up to { $size }
|
||||||
@@ -137,3 +137,11 @@ noStreamsWarning = This browser might not be able to decrypt a file this big.
|
|||||||
noStreamsOptionCopy = Copy the link to open in another browser
|
noStreamsOptionCopy = Copy the link to open in another browser
|
||||||
noStreamsOptionFirefox = Try our favorite browser
|
noStreamsOptionFirefox = Try our favorite browser
|
||||||
noStreamsOptionDownload = Continue with this browser
|
noStreamsOptionDownload = Continue with this browser
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Share the link to your file:
|
||||||
|
shareLinkButton = Share link
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing
|
||||||
|
trailheadPromo = There is a way to protect your privacy. Join Firefox.
|
||||||
|
learnMore = Learn more.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Proteger con contraseña
|
|||||||
emailPlaceholder = Ingrese su correo electrónico
|
emailPlaceholder = Ingrese su correo electrónico
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Inicie sesión para enviar hasta { $size }
|
signInSizeBump = Inicie sesión para enviar hasta { $size }
|
||||||
signInButton = Iniciar sesión/registrarse
|
signInOnlyButton = Iniciar sesión
|
||||||
accountBenefitTitle = Cree una cuenta de { -firefox } o inicie la sesión
|
accountBenefitTitle = Cree una cuenta de { -firefox } o inicie la sesión
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Compartir archivos hasta { $size }
|
accountBenefitLargeFiles = Compartir archivos hasta { $size }
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Es posible que este navegador no pueda descifrar un archivo t
|
|||||||
noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador.
|
noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador.
|
||||||
noStreamsOptionFirefox = Pruebe nuestro navegador favorito
|
noStreamsOptionFirefox = Pruebe nuestro navegador favorito
|
||||||
noStreamsOptionDownload = Continuar con este navegador
|
noStreamsOptionDownload = Continuar con este navegador
|
||||||
|
downloadFirefoxPromo = El nuevo { -firefox } te ofrece { -send-short-brand }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Compartir el enlace con tu dispositivo:
|
||||||
|
shareLinkButton = Compartir el enlace
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Descargar "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura
|
||||||
|
trailheadPromo = Hay una forma de proteger tu privacidad. Unite a Firefox.
|
||||||
|
learnMore = Conocer más.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Protegido con contraseña
|
|||||||
emailPlaceholder = Ingresa tu correo
|
emailPlaceholder = Ingresa tu correo
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Conéctate para enviar hasta { $size }
|
signInSizeBump = Conéctate para enviar hasta { $size }
|
||||||
signInButton = Conectarse/registrarse
|
signInOnlyButton = Conectarse
|
||||||
accountBenefitTitle = Crea una cuenta de { -firefox } o conéctate
|
accountBenefitTitle = Crea una cuenta de { -firefox } o conéctate
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Comparte archivos de hasta { $size }
|
accountBenefitLargeFiles = Comparte archivos de hasta { $size }
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Es posible que este navegador no pueda descifrar un archivo t
|
|||||||
noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador
|
noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador
|
||||||
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
||||||
noStreamsOptionDownload = Continuar con este navegador
|
noStreamsOptionDownload = Continuar con este navegador
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } es traído a ti por el renovado { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Comparte el enlace a tu dispositivo:
|
||||||
|
shareLinkButton = Compartir enlace
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Baja "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura
|
||||||
|
trailheadPromo = Hay una forma de proteger tu privacidad. Únete a Firefox.
|
||||||
|
learnMore = Aprender más.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Proteger con contraseña
|
|||||||
emailPlaceholder = Introducir dirección de correo
|
emailPlaceholder = Introducir dirección de correo
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Iniciar sesión para enviar hasta { $size }
|
signInSizeBump = Iniciar sesión para enviar hasta { $size }
|
||||||
signInButton = Iniciar sesión/registrarse
|
signInOnlyButton = Iniciar sesión
|
||||||
accountBenefitTitle = Crear una cuenta { -firefox } o iniciar sesión
|
accountBenefitTitle = Crear una cuenta { -firefox } o iniciar sesión
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Compartir archivos de hasta { $size }
|
accountBenefitLargeFiles = Compartir archivos de hasta { $size }
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan gr
|
|||||||
noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador
|
noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador
|
||||||
noStreamsOptionFirefox = Probar nuestro navegador favorito
|
noStreamsOptionFirefox = Probar nuestro navegador favorito
|
||||||
noStreamsOptionDownload = Continuar en este navegador
|
noStreamsOptionDownload = Continuar en este navegador
|
||||||
|
downloadFirefoxPromo = El nuevo { -firefox } te ofrece { -send-short-brand }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Compartir el enlace a tu archivo:
|
||||||
|
shareLinkButton = Compartir enlace
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Descargar “{ $name }” con { -send-brand }: comparte archivos de forma segura y sencilla
|
||||||
|
trailheadPromo = Existe la forma de proteger tu privacidad. Únete a Firefox.
|
||||||
|
learnMore = Saber más.
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ encryptingFile = Encriptando...
|
|||||||
decryptingFile = Desencriptando...
|
decryptingFile = Desencriptando...
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
*[one] 1 descarga
|
[one] 1 descarga
|
||||||
|
*[other] { $num } descargas
|
||||||
}
|
}
|
||||||
timespanHours =
|
timespanHours =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
@@ -77,6 +78,10 @@ fileCount =
|
|||||||
[one] 1 archivo
|
[one] 1 archivo
|
||||||
*[other] { $num } archivos
|
*[other] { $num } archivos
|
||||||
}
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = KB
|
||||||
# mebibyte abbreviation
|
# mebibyte abbreviation
|
||||||
mb = MB
|
mb = MB
|
||||||
# gibibyte abbreviation
|
# gibibyte abbreviation
|
||||||
@@ -121,7 +126,7 @@ addPassword = Protegido con contraseña
|
|||||||
emailPlaceholder = Ingresa tu correo electrónico
|
emailPlaceholder = Ingresa tu correo electrónico
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Iniciar sesión para enviar hasta { $size }
|
signInSizeBump = Iniciar sesión para enviar hasta { $size }
|
||||||
signInButton = Iniciar sesión/registrarse
|
signInOnlyButton = Iniciar sesión
|
||||||
accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión
|
accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Compartir archivos de hasta { $size }
|
accountBenefitLargeFiles = Compartir archivos de hasta { $size }
|
||||||
@@ -140,3 +145,11 @@ noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan gr
|
|||||||
noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador
|
noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador
|
||||||
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
||||||
noStreamsOptionDownload = Continuar con este navegador
|
noStreamsOptionDownload = Continuar con este navegador
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } te lo ofrece el nuevo { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Comparte el enlace a tu archivo:
|
||||||
|
shareLinkButton = Enlace para compartir
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Descarga «{ $name }» con { -send-brand }: es sencillo y seguro
|
||||||
|
trailheadPromo = Existe una forma de proteger tu privacidad. Únete a Firefox.
|
||||||
|
learnMore = Saber más.
|
||||||
|
|||||||
@@ -1,31 +1,9 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteSubtitle = veebieksperiment
|
|
||||||
siteFeedback = Tagasiside
|
siteFeedback = Tagasiside
|
||||||
uploadPageHeader = Privaatne ja krüpteeritud failiedastus
|
|
||||||
uploadPageExplainer = Firefox Send võimaldab saata faile üle ohutu, privaatse ja krüpteeritud kanali. Failid kustutatakse automaatselt, et need ei jääks internetti igaveseks.
|
|
||||||
uploadPageLearnMore = Rohkem teavet
|
|
||||||
uploadPageDropMessage = Faili üleslaadimiseks lohista see siia
|
|
||||||
uploadPageSizeMessage = Parima kogemuse saamiseks tasub faili suurus hoida alla 1GB
|
|
||||||
uploadPageBrowseButton = Vali fail arvutist
|
|
||||||
uploadPageBrowseButton1 = Vali fail üleslaadimiseks
|
|
||||||
uploadPageMultipleFilesAlert = Mitme faili või kausta üleslaadimine pole praegu toetatud.
|
|
||||||
uploadPageBrowseButtonTitle = Laadi fail üles
|
|
||||||
uploadingPageProgress = Faili { $filename } ({ $size }) üleslaadimine
|
|
||||||
importingFile = Importimine...
|
importingFile = Importimine...
|
||||||
verifyingFile = Kontrollimine…
|
|
||||||
encryptingFile = Krüptimine…
|
encryptingFile = Krüptimine…
|
||||||
decryptingFile = Dekrüptimine...
|
decryptingFile = Dekrüptimine...
|
||||||
notifyUploadDone = Üleslaadimine on lõpetatud.
|
|
||||||
uploadingPageMessage = Aegumise sätteid saab muuta siis, kui faili üles laaditakse.
|
|
||||||
uploadingPageCancel = Katkesta üleslaadimine
|
|
||||||
uploadCancelNotification = Üleslaadimine katkestati
|
|
||||||
uploadingPageLargeFileMessage = Fail on suur ja selle üleslaadimine võib aega võtta.
|
|
||||||
uploadingFileNotification = Teavita mind üleslaadimise lõppemisest.
|
|
||||||
uploadSuccessConfirmHeader = Saatmiseks valmis
|
|
||||||
uploadSvgAlt = Laadi üles
|
|
||||||
uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel.
|
|
||||||
expireInfo = Link failile aegub peale { $downloadCount } või { $timespan }.
|
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] üht allalaadimist
|
[one] üht allalaadimist
|
||||||
@@ -33,79 +11,29 @@ downloadCount =
|
|||||||
}
|
}
|
||||||
timespanHours =
|
timespanHours =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] üht tundi
|
[one] 1 tunni
|
||||||
*[other] { $num } tundi
|
*[other] { $num } tunni
|
||||||
}
|
}
|
||||||
copyUrlFormLabelWithName = Kopeeri ja jaga linki faili allalaadimiseks: { $filename }
|
|
||||||
copyUrlFormButton = Kopeeri vahemällu
|
|
||||||
copiedUrl = Kopeeritud!
|
copiedUrl = Kopeeritud!
|
||||||
deleteFileButton = Kustuta fail
|
|
||||||
sendAnotherFileLink = Saada järgmine fail
|
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
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
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
unlockInputLabel = Sisesta parool
|
|
||||||
unlockInputPlaceholder = Parool
|
unlockInputPlaceholder = Parool
|
||||||
unlockButtonLabel = Ava
|
unlockButtonLabel = Ava
|
||||||
downloadFileTitle = Krüptitud faili allalaadimine
|
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
downloadMessage = Sulle on saadetud fail Firefox Sendiga - teenusega, mis lubab faile ohutult, privaatselt ja krüpteeritult jagada. Failid kustutatakse automaatselt, et need ei jääks internetti igaveseks.
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = Laadi alla
|
downloadButtonLabel = Laadi alla
|
||||||
downloadNotification = Allalaadimine on lõpetatud.
|
|
||||||
downloadFinish = Allalaadimine lõpetati
|
downloadFinish = Allalaadimine lõpetati
|
||||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
|
||||||
fileSizeProgress = ({ $partialSize }/{ $totalSize })
|
fileSizeProgress = ({ $partialSize }/{ $totalSize })
|
||||||
# Firefox Send is a brand name and should not be localized.
|
sendYourFilesLink = Proovi Firefox Send'i
|
||||||
sendYourFilesLink = Proovi Firefox Sendi
|
|
||||||
downloadingPageProgress = Faili { $filename } ({ $size }) allalaadimine
|
|
||||||
downloadingPageMessage = Palun jäta see kaart lahti, kuni fail on alla laaditud ja dekrüptitud.
|
|
||||||
errorAltText = Viga üleslaadimisel
|
|
||||||
errorPageHeader = Midagi läks valesti!
|
errorPageHeader = Midagi läks valesti!
|
||||||
errorPageMessage = Faili üleslaadimisel esines viga.
|
|
||||||
errorPageLink = Saada järgmine fail
|
|
||||||
fileTooBig = Fail on üleslaadimiseks liiga suur. See peaks olema väiksem kui { $size }.
|
fileTooBig = Fail on üleslaadimiseks liiga suur. See peaks olema väiksem kui { $size }.
|
||||||
linkExpiredAlt = Link on aegunud
|
linkExpiredAlt = Link on aegunud
|
||||||
expiredPageHeader = See link on aegunud või seda pole kunagi olnudki!
|
|
||||||
notSupportedHeader = Sinu brauser pole toetatud.
|
notSupportedHeader = Sinu brauser pole toetatud.
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
notSupportedDetail = Kahjuks ei toeta see brauser veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead proovima teise brauseriga. Me soovitame Firefoxi!
|
|
||||||
notSupportedLink = Miks mu brauser toetatud pole?
|
notSupportedLink = Miks mu brauser toetatud pole?
|
||||||
notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama.
|
notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama.
|
||||||
updateFirefox = Uuenda Firefox
|
updateFirefox = Uuenda Firefox
|
||||||
downloadFirefoxButtonSub = Laadi alla tasuta
|
|
||||||
uploadedFile = Fail
|
|
||||||
copyFileList = Kopeeri URL
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = Aegub
|
|
||||||
deleteFileList = Kustuta
|
|
||||||
nevermindButton = Ära pane tähele
|
|
||||||
legalHeader = Tingimused ja privaatsusreeglid
|
|
||||||
legalNoticeTestPilot = Firefox Send on praegu Test Piloti eksperiment ja sellele rakenduvad Test Piloti <a>teenusetingimused</a> ning <a>privaatsusreeglid</a>. Rohkem teavet selle eksperimendi ja kogutavate andmete kohta leiab <a>siit</a>.
|
|
||||||
legalNoticeMozilla = Firefox Sendi veebilehe kasutamisele rakenduvad ka Mozilla <a>veebilehtede privaatsusreeglid</a> ja <a>veebilehtede teenusetingimused</a>.
|
|
||||||
deletePopupText = Kas kustutada see fail?
|
|
||||||
deletePopupYes = Jah
|
|
||||||
deletePopupCancel = Loobu
|
deletePopupCancel = Loobu
|
||||||
deleteButtonHover = Kustuta
|
deleteButtonHover = Kustuta
|
||||||
copyUrlHover = Kopeeri URL
|
|
||||||
footerLinkLegal = Õiguslik teave
|
footerLinkLegal = Õiguslik teave
|
||||||
# Test Pilot is a proper name and should not be localized.
|
|
||||||
footerLinkAbout = Test Pilotist
|
|
||||||
footerLinkPrivacy = Privaatsusest
|
footerLinkPrivacy = Privaatsusest
|
||||||
footerLinkTerms = Teenusetingimused
|
|
||||||
footerLinkCookies = Küpsistest
|
footerLinkCookies = Küpsistest
|
||||||
requirePasswordCheckbox = Selle faili allalaadimiseks nõutakse parooli
|
|
||||||
addPasswordButton = Lisa parool
|
|
||||||
changePasswordButton = Muuda
|
|
||||||
passwordTryAgain = Vale parool. Palun proovi uuesti.
|
passwordTryAgain = Vale parool. Palun proovi uuesti.
|
||||||
reportIPInfringement = Intellektuaalomandi keelatud kasutamise raporteerimine
|
|
||||||
javascriptRequired = Firefox Send'i kasutamiseks tuleb JavaScript lubada
|
javascriptRequired = Firefox Send'i kasutamiseks tuleb JavaScript lubada
|
||||||
whyJavascript = Miks Firefox Send JavaScripti vajab?
|
whyJavascript = Miks Firefox Send JavaScripti vajab?
|
||||||
enableJavascript = Palun luba JavaScript ja proovi uuesti.
|
enableJavascript = Palun luba JavaScript ja proovi uuesti.
|
||||||
@@ -113,9 +41,113 @@ enableJavascript = Palun luba JavaScript ja proovi uuesti.
|
|||||||
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 = Parool on muudetud
|
|
||||||
# A short status message shown when the user enters a long password
|
# A short status message shown when the user enters a long password
|
||||||
maxPasswordLength = Maksimaalne parooli pikkus: { $length }
|
maxPasswordLength = Maksimaalne parooli pikkus: { $length }
|
||||||
# A short status message shown when there was an error setting the password
|
# A short status message shown when there was an error setting the password
|
||||||
passwordSetError = Parooli muutmine ebaõnnestus
|
passwordSetError = Parooli muutmine ebaõnnestus
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Lihtne ja privaatne failijagamine
|
||||||
|
introDescription = { -send-brand } võimaldab sul faile jagada otspunktkrüpteerimise ning automaatselt aeguva lingiga. Nii saad jagatava privaatsena hoida ja kindlustada, et su asjad igavesti internetti vedelema ei jää.
|
||||||
|
notifyUploadEncryptDone = Sinu fail on krüptitud ja saatmiseks valmis
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Aegub peale { $downloadCount } või { $timespan } järel
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 minuti
|
||||||
|
*[other] { $num } minuti
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 päeva
|
||||||
|
*[other] { $num } päeva
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 nädala
|
||||||
|
*[other] { $num } nädala
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 fail
|
||||||
|
*[other] { $num } faili
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = kB
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = MB
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = GB
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = Kogusuurus: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Faili jagamiseks kopeeri link:
|
||||||
|
copyLinkButton = Kopeeri link
|
||||||
|
downloadTitle = Failide allalaadimine
|
||||||
|
downloadDescription = See fail jagati teenuse { -send-brand } kaudu otspunktkrüpteeritult ja automaatselt aeguva lingiga.
|
||||||
|
trySendDescription = Proovi lihtsaks ja turvaliseks failijagamiseks { -send-brand } teenust.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Korraga saab üles laadida vaid 1 faili.
|
||||||
|
*[other] Korraga saab üles laadida vaid { $count } faili.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Vaid 1 arhiveerimine on lubatud.
|
||||||
|
*[other] Vaid { $count } arhiveerimist on lubatud.
|
||||||
|
}
|
||||||
|
expiredTitle = Link on aegunud.
|
||||||
|
notSupportedDescription = { -send-brand } ei tööta selle veebilehitsejaga. Kõige paremini töötab { -send-short-brand } uusima { -firefox }iga ja töötab ka enamikes teistes uuendatud brauserites.
|
||||||
|
downloadFirefox = Laadi { -firefox } alla
|
||||||
|
legalTitle = { -send-short-brand } privaatsusteade
|
||||||
|
legalDateStamp = Versioon 1.0, alates 12. märts 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days }p { $hours }t { $minutes }m
|
||||||
|
addFilesButton = Vali failid üleslaadimiseks
|
||||||
|
uploadButton = Laadi üles
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Lohista failid siia
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = või klõpsa kuni { $size } suuruste failide saatmiseks
|
||||||
|
addPassword = Kaitse parooliga
|
||||||
|
emailPlaceholder = Sisesta e-posti aadress
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Logi sisse ning saad saata kuni { $size } suuruseid faile
|
||||||
|
signInOnlyButton = Logi sisse
|
||||||
|
accountBenefitTitle = Loo { -firefox }i konto või logi sisse
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Jaga kuni { $size } suuruseid faile
|
||||||
|
accountBenefitDownloadCount = Jaga faile enamate inimestega
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Hoia linke aktiivsena 1 päev
|
||||||
|
*[other] Hoia linke aktiivsena kuni { $count } päeva
|
||||||
|
}
|
||||||
|
accountBenefitSync = Jagatud faile saad hallata mis tahes seadmes
|
||||||
|
accountBenefitMoz = Rohkem teavet teistest { -mozilla } teenustest
|
||||||
|
signOut = Logi välja
|
||||||
|
okButton = Olgu
|
||||||
|
downloadingTitle = Allalaadimine
|
||||||
|
noStreamsWarning = Sinu veebilehitseja ei pruugi suuta nii suurt faili dekrüptida.
|
||||||
|
noStreamsOptionCopy = Kopeeri link teises brauseris avamiseks
|
||||||
|
noStreamsOptionFirefox = Proovi meie lemmikbrauserit
|
||||||
|
noStreamsOptionDownload = Jätka selle brauseriga
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } toob sinuni uhiuus { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Jaga linki failile:
|
||||||
|
shareLinkButton = Jaga linki
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Laadi “{ $name }” alla teenusega { -send-brand }, mis pakub lihtsat ja turvalist failijagamist
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ fileSizeProgress = ({ $totalSize } / { $partialSize })
|
|||||||
sendYourFilesLink = Probatu Firefox Send
|
sendYourFilesLink = Probatu Firefox Send
|
||||||
errorPageHeader = Zerbait gaizki joan da!
|
errorPageHeader = Zerbait gaizki joan da!
|
||||||
fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du.
|
fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du.
|
||||||
linkExpiredAlt = Lotura iraungita
|
linkExpiredAlt = Lotura iraungi da
|
||||||
notSupportedHeader = Zure nabigatzailea ez da onartzen.
|
notSupportedHeader = Zure nabigatzailea ez da onartzen.
|
||||||
notSupportedLink = Zergatik ez da nire nabigatzailea onartzen?
|
notSupportedLink = Zergatik ez da nire nabigatzailea onartzen?
|
||||||
notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Firefox Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu.
|
notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Firefox Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu.
|
||||||
@@ -50,10 +50,34 @@ passwordSetError = Pasahitz hau ezin da ezarri
|
|||||||
|
|
||||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
-send-brand = Firefox Send
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Partekatu fitxategiak modu sinple eta pribatuan
|
introTitle = Partekatu fitxategiak modu sinple eta pribatuan
|
||||||
|
introDescription = { -send-brand } tresna fitxategiak partekatzeko da, muturretik muturrera zifratuta eta automatikoki iraungitzen diren loturekin. Hortaz, partekatzen duzuna pribatua izango da eta ziur egon zaitezke zure fitxategiak ez direla online egongo betirako.
|
||||||
notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago
|
notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = { $downloadCount } edo { $timespan } ondoren iraungiko da
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] minutu 1
|
||||||
|
*[other] { $num } minutu
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] egun 1
|
||||||
|
*[other] { $num } egun
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] aste 1
|
||||||
|
*[other] { $num } aste
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] fitxategi 1
|
||||||
|
*[other] { $num } fitxategi
|
||||||
|
}
|
||||||
# byte abbreviation
|
# byte abbreviation
|
||||||
bytes = B
|
bytes = B
|
||||||
# kibibyte abbreviation
|
# kibibyte abbreviation
|
||||||
@@ -64,9 +88,33 @@ mb = MB
|
|||||||
gb = GB
|
gb = GB
|
||||||
# localized number and byte abbreviation. example "2.5MB"
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
fileSize = { $num }{ $units }
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = Tamaina guztira: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Kopiatu fitxategia partekatzeko lotura:
|
||||||
|
copyLinkButton = Kopiatu lotura
|
||||||
downloadTitle = Deskargatu fitxategiak
|
downloadTitle = Deskargatu fitxategiak
|
||||||
|
downloadDescription = { -send-brand } bidez partekatu da fitxategia muturretik muturrera zifratuta eta automatikoki iraungitzen den lotura batekin.
|
||||||
|
trySendDescription = Probatu { -send-brand } fitxategiak partekatzeko modu sinple eta segururako.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Soilik fitxategi bakarra igo daiteke aldi berean.
|
||||||
|
*[other] Soilik { $count } fitxategi igo daitezke aldi berean.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Soilik artxibo bakarra onartzen da.
|
||||||
|
*[other] Soilik { $count } artxibo onartzen dira.
|
||||||
|
}
|
||||||
|
expiredTitle = Lotura hau iraungi da.
|
||||||
|
notSupportedDescription = { -send-brand } ez da nabigatzaile honetan ibiliko. { -send-short-brand } hobeto dabil { -firefox }(r)en azken bertsioarekin; halaber, nabigatzaile gehienen azken bertsioarekin ibiliko da.
|
||||||
downloadFirefox = Deskargatu { -firefox }
|
downloadFirefox = Deskargatu { -firefox }
|
||||||
|
legalTitle = { -send-short-brand } pribatutasun-oharra
|
||||||
legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa.
|
legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa.
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days }e { $hours }h { $minutes }m
|
||||||
addFilesButton = Hautatu igotzeko fitxategiak
|
addFilesButton = Hautatu igotzeko fitxategiak
|
||||||
uploadButton = Igo
|
uploadButton = Igo
|
||||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
@@ -76,8 +124,32 @@ dragAndDropFiles = Arrastatu eta jaregin fitxategiak
|
|||||||
orClickWithSize = edo egin klik { $size } arte igotzeko
|
orClickWithSize = edo egin klik { $size } arte igotzeko
|
||||||
addPassword = Babestu pasahitzarekin
|
addPassword = Babestu pasahitzarekin
|
||||||
emailPlaceholder = Idatzi zure helbide elektronikoa
|
emailPlaceholder = Idatzi zure helbide elektronikoa
|
||||||
signInButton = Hasi saioa/eman izena
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Hasi saioa { $size } arte bidaltzeko
|
||||||
|
signInOnlyButton = Hasi saioa
|
||||||
accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa
|
accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak
|
accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak
|
||||||
accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin
|
accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Utzi loturak erabilgarri egun batez
|
||||||
|
*[other] Utzi loturak erabilgarri { $count } egunez
|
||||||
|
}
|
||||||
|
accountBenefitSync = Kudeatu partekatutako fitxategiak edozein gailutatik
|
||||||
|
accountBenefitMoz = { -mozilla }ren beste zerbitzuei buruzko argibide gehiago
|
||||||
|
signOut = Amaitu saioa
|
||||||
|
okButton = Ados
|
||||||
|
downloadingTitle = Deskargatzen
|
||||||
|
noStreamsWarning = Baliteke nabigatzailea gai ez izatea horrelako tamaina handiko fitxategiak deszifratzeko.
|
||||||
|
noStreamsOptionCopy = Kopiatu lotura beste nabigatzaile batean irekitzeko
|
||||||
|
noStreamsOptionFirefox = Probatu gure nabigatzaile gogokoena
|
||||||
|
noStreamsOptionDownload = Jarraitu nabigatzaile honekin
|
||||||
|
downloadFirefoxPromo = Erabat berritutako { -firefox }(e)k eskaintzen dizu { -send-short-brand }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Partekatu zure fitxategirako lotura:
|
||||||
|
shareLinkButton = Partekatu lotura
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Deskargatu "{ $name }" { -send-brand } erabiliz: fitxategi-partekatze sinple eta segurua
|
||||||
|
trailheadPromo = Badago zure pribatutasuna babesteko modua. Egizu bat Firefoxekin.
|
||||||
|
learnMore = Argibide gehiago.
|
||||||
|
|||||||
@@ -1,31 +1,9 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteSubtitle = آزمایش وب
|
|
||||||
siteFeedback = بازخورد
|
siteFeedback = بازخورد
|
||||||
uploadPageHeader = اشتراکگذاری پروندهها، رمزنگاری شده و خصوصی
|
|
||||||
uploadPageExplainer = پرونده های خود را به صورت ایمن، خصوصی و رمزنگاری شده با تعیین تاریخ انقضا خودکار ارسال کنید تا اطمینان پیدا کنید چیزهای شما همیشه آنلاین باقی نماند.
|
|
||||||
uploadPageLearnMore = بیشتر بدانید
|
|
||||||
uploadPageDropMessage = برای شروع بارگذاری پروندههای خود را اینجا بیاندازید
|
|
||||||
uploadPageSizeMessage = برای بیشترین قابلیت اطمینان، بهتر است که پروندهتان کمتر از ۱ گیگابایت باشد
|
|
||||||
uploadPageBrowseButton = یک پرونده را از روی کامپیوتر خود انتخاب کنید
|
|
||||||
uploadPageBrowseButton1 = یک پرونده را برای بارگذاری انتخاب کنید
|
|
||||||
uploadPageMultipleFilesAlert = بارگذاری چندین پرونده یا یک پوشه در حال حاضر پشتیبانی نمیشود.
|
|
||||||
uploadPageBrowseButtonTitle = بارگذاری پرونده
|
|
||||||
uploadingPageProgress = در حال بارگذاری پرونده { $filename } ({ $size })
|
|
||||||
importingFile = در حال وارد کردن…
|
importingFile = در حال وارد کردن…
|
||||||
verifyingFile = در حال تایید…
|
|
||||||
encryptingFile = در حال رمزنگاری…
|
encryptingFile = در حال رمزنگاری…
|
||||||
decryptingFile = در حال رمزگشایی…
|
decryptingFile = در حال رمزگشایی…
|
||||||
notifyUploadDone = بارگذاری شما پایان یافت.
|
|
||||||
uploadingPageMessage = به محض بارگذاری پرونده شما قادر خواهید بود برای آن گزینه انقضا تعیین کنید.
|
|
||||||
uploadingPageCancel = لغو بارگذاری
|
|
||||||
uploadCancelNotification = بارگذاری شما لغو شد
|
|
||||||
uploadingPageLargeFileMessage = پرونده بزرگ است و ممکن است بارگذاری آن مدتی طول بکشد. محکم بشینید!
|
|
||||||
uploadingFileNotification = هر وقت بارگذاری تمام شد به من اطلاع بده.
|
|
||||||
uploadSuccessConfirmHeader = آماده برای ارسال
|
|
||||||
uploadSvgAlt = بارگذاری
|
|
||||||
uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد.
|
|
||||||
expireInfo = این پیوند به فایل شما پس از { $downloadCount } یا { $timespan } منقضی خواهد شد.
|
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] ۱ بارگیری
|
[one] ۱ بارگیری
|
||||||
@@ -36,76 +14,26 @@ timespanHours =
|
|||||||
[one] ۱ ساعت
|
[one] ۱ ساعت
|
||||||
*[other] { $num } ساعت
|
*[other] { $num } ساعت
|
||||||
}
|
}
|
||||||
copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename }
|
|
||||||
copyUrlFormButton = رونوشت به کلیپبورد
|
|
||||||
copiedUrl = رونوشت شد!
|
copiedUrl = رونوشت شد!
|
||||||
deleteFileButton = حذف پرونده
|
|
||||||
sendAnotherFileLink = ارسال پرونده دیگر
|
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
downloadAltText = دریافت
|
|
||||||
downloadsFileList = دریافتها
|
|
||||||
# Used as header in a column indicating the amount of time left before a
|
|
||||||
# download link expires (e.g. "10h 5m")
|
|
||||||
timeFileList = زمان
|
|
||||||
# Used as header in a column indicating the number of times a file has been
|
|
||||||
# downloaded
|
|
||||||
downloadFileName = بارگیری { $filename }
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
unlockInputLabel = گذرواژه را وارد کنید
|
|
||||||
unlockInputPlaceholder = گذرواژه
|
unlockInputPlaceholder = گذرواژه
|
||||||
unlockButtonLabel = باز کردن
|
unlockButtonLabel = باز کردن
|
||||||
downloadFileTitle = دریافت پروندهٔ رمزنگاری شده
|
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
downloadMessage = دوست شما درحال ارسال پرونده ای به وسیله Firefox Send است، این سرویس این امکان را به شما میدهد تا پروندههای خود را به صورت ایمن،خصوصی و رمزنگاری شده به همراه پیوند انقضا خودکار همرسانی کنید تا اطمینان حاصل کنید چیزهای شما برای همیشه آنلاین باقی نخواهد ماند.
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = بارگیری
|
downloadButtonLabel = بارگیری
|
||||||
downloadNotification = بارگیری شما کامل شد.
|
|
||||||
downloadFinish = بارگیری کامل شد
|
downloadFinish = بارگیری کامل شد
|
||||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
|
||||||
fileSizeProgress = ({ $partialSize } از { $totalSize })
|
fileSizeProgress = ({ $partialSize } از { $totalSize })
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
sendYourFilesLink = Firefox Send را امتحان کنید
|
sendYourFilesLink = Firefox Send را امتحان کنید
|
||||||
downloadingPageProgress = دریافت { $filename } ({ $size })
|
|
||||||
downloadingPageMessage = لطفا این زبانه را باز بگذارید در حالی که ما فایل شما را دریافت میکنیم و کدگذاری میکنیم.
|
|
||||||
errorAltText = خطا در بارگذاری
|
|
||||||
errorPageHeader = چیزی دچار اشکال شده است!
|
errorPageHeader = چیزی دچار اشکال شده است!
|
||||||
errorPageMessage = خطایی در هنگام بارگذاری پرونده شما رخ داده است.
|
|
||||||
errorPageLink = پرونده دیگری ارسال کنید.
|
|
||||||
fileTooBig = این پرونده بسیار حجیم است. حجم آن میبایستی کم تر { $size } باشد.
|
fileTooBig = این پرونده بسیار حجیم است. حجم آن میبایستی کم تر { $size } باشد.
|
||||||
linkExpiredAlt = پیوند منقضی شده است
|
linkExpiredAlt = پیوند منقضی شده است
|
||||||
expiredPageHeader = پیوند منقضی شده است یا در از همان ابتدا وجود نداشته است!
|
|
||||||
notSupportedHeader = مرورگر شما پشتیبانی نمیکند.
|
notSupportedHeader = مرورگر شما پشتیبانی نمیکند.
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
notSupportedDetail = متاسفانه این مرورگر این تکنولوژی وب را که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما بایستی مرورگری دیگری را امتحان کنید. پیشنهاد ما به شما فایرفاکس است !
|
|
||||||
notSupportedLink = چرا مرورگر من پشتیبانی نمیکند؟
|
notSupportedLink = چرا مرورگر من پشتیبانی نمیکند؟
|
||||||
notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما نیاز دارید تا مرورگر خود را بروز کنید.
|
notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما نیاز دارید تا مرورگر خود را بروز کنید.
|
||||||
updateFirefox = بروزرسانی فایرفاکس
|
updateFirefox = بروزرسانی فایرفاکس
|
||||||
downloadFirefoxButtonSub = دریافت رایگان
|
|
||||||
uploadedFile = پرونده
|
|
||||||
copyFileList = رونوشت از نشانی
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = زمان انقضا
|
|
||||||
deleteFileList = حذف
|
|
||||||
nevermindButton = بیخیال
|
|
||||||
legalHeader = شرایط و حریمخصوصی
|
|
||||||
legalNoticeTestPilot = Firefox Send در حال حاضر در نسخه آزمایشی خود به صورت میدهد و تحت عنوان خلبان آموزشی <a>شرایط و خدمات</a> و <a>موارد حریم خصوصی </a> کار میکند. شما میتوانید اطلاعات بیشتر در مورد این آزمایش و اطلاعات که ذخیره میکنید را از <a> اینجا </a> کسب کنید.
|
|
||||||
legalNoticeMozilla = استفاده از Firefox Send همچنین منصوب به موزیلا است. <a>پایگاه اینترنتی نکات حریم شخصی </a> و <a> پایگاه اطلاع رسانی شرایط خدمات و استفاده </a>.
|
|
||||||
deletePopupText = حذف این پرونده؟
|
|
||||||
deletePopupYes = بله
|
|
||||||
deletePopupCancel = انصراف
|
deletePopupCancel = انصراف
|
||||||
deleteButtonHover = حذف
|
deleteButtonHover = حذف
|
||||||
copyUrlHover = رونوشت از نشانی
|
|
||||||
footerLinkLegal = ملاحظات حقوقی
|
footerLinkLegal = ملاحظات حقوقی
|
||||||
# Test Pilot is a proper name and should not be localized.
|
|
||||||
footerLinkAbout = درباره Test Pilot
|
|
||||||
footerLinkPrivacy = حریمخصوصی
|
footerLinkPrivacy = حریمخصوصی
|
||||||
footerLinkTerms = شرایط
|
|
||||||
footerLinkCookies = کوکیها
|
footerLinkCookies = کوکیها
|
||||||
requirePasswordCheckbox = دریافت این پرونده نیاز به گذرواژه دارد
|
|
||||||
addPasswordButton = افزودن گذرواژه
|
|
||||||
changePasswordButton = تغییر
|
|
||||||
passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید.
|
passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید.
|
||||||
reportIPInfringement = گزارش تخلف IP
|
|
||||||
javascriptRequired = Firefox Send نیازمند جاوااسکریپت است
|
javascriptRequired = Firefox Send نیازمند جاوااسکریپت است
|
||||||
whyJavascript = چرا Firefox Send جاوااسکریپت لازم داد؟
|
whyJavascript = چرا Firefox Send جاوااسکریپت لازم داد؟
|
||||||
enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید.
|
enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید.
|
||||||
@@ -113,9 +41,25 @@ enableJavascript = لطفا جاوااسکریپت را فعال کنید و م
|
|||||||
expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه
|
expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه
|
||||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
expiresMinutes = { $minutes } دقیقه
|
expiresMinutes = { $minutes } دقیقه
|
||||||
# A short status message shown when a password is successfully set
|
|
||||||
passwordIsSet = گذرواژه تنظیم شد
|
|
||||||
# A short status message shown when the user enters a long password
|
# A short status message shown when the user enters a long password
|
||||||
maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $length }
|
maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $length }
|
||||||
# A short status message shown when there was an error setting the password
|
# A short status message shown when there was an error setting the password
|
||||||
passwordSetError = امکان ثبت این گذواژه نیست
|
passwordSetError = امکان ثبت این گذواژه نیست
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = ارسال
|
||||||
|
-firefox = فایرفاکس
|
||||||
|
-mozilla = موزیلا
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = KB
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = MB
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = GB
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = حجم کل: { $size }
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ unlockButtonLabel = Avaa
|
|||||||
downloadButtonLabel = Lataa
|
downloadButtonLabel = Lataa
|
||||||
downloadFinish = Lataus valmis
|
downloadFinish = Lataus valmis
|
||||||
fileSizeProgress = { $partialSize } / { $totalSize }
|
fileSizeProgress = { $partialSize } / { $totalSize }
|
||||||
sendYourFilesLink = Kokeile Firefox Sendiä
|
sendYourFilesLink = Kokeile Firefox Send -palvelua
|
||||||
errorPageHeader = Jokin meni pieleen!
|
errorPageHeader = Jokin meni pieleen!
|
||||||
fileTooBig = Tämä tiedosto on liian suuri ladattavaksi. Sen pitäisi olla pienempi kuin { $size }.
|
fileTooBig = Tämä tiedosto on liian suuri ladattavaksi. Sen pitäisi olla pienempi kuin { $size }.
|
||||||
linkExpiredAlt = Linkki on vanhentunut
|
linkExpiredAlt = Linkki on vanhentunut
|
||||||
@@ -38,9 +38,9 @@ javascriptRequired = Firefox-Send vaatii JavaScriptin
|
|||||||
whyJavascript = Miksi Firefox Send vaatii JavaScriptin?
|
whyJavascript = Miksi Firefox Send vaatii JavaScriptin?
|
||||||
enableJavascript = Ota JavaScript käyttöön ja yritä uudelleen.
|
enableJavascript = Ota JavaScript käyttöön ja yritä uudelleen.
|
||||||
# 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 }min
|
expiresHoursMinutes = { $hours } t { $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 the user enters a long password
|
# A short status message shown when the user enters a long password
|
||||||
maxPasswordLength = Salasanan enimmäispituus: { $length }
|
maxPasswordLength = Salasanan enimmäispituus: { $length }
|
||||||
# A short status message shown when there was an error setting the password
|
# A short status message shown when there was an error setting the password
|
||||||
@@ -54,21 +54,24 @@ passwordSetError = Tätä salasanaa ei voitu asettaa
|
|||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Helppoa ja yksityistä tiedostonjakoa
|
introTitle = Helppoa ja yksityistä tiedostonjakoa
|
||||||
|
introDescription = { -send-brand } mahdollistaa tiedostojen jakamisen automaattisesti vanhenevalla linkillä. Tiedostojen jakaminen tapahtuu päästä päähän -salattuna. Näin jakamasi tiedostot pysyvät yksityisinä ja voit olla varma, etteivät lähettämäsi tiedostot pysy verkossa ikuisesti.
|
||||||
notifyUploadEncryptDone = Tiedosto on salattu ja valmis lähetettäväksi
|
notifyUploadEncryptDone = Tiedosto on salattu ja valmis lähetettäväksi
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Vanhenee { $downloadCount } tai { $timespan } jälkeen
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 minuutti
|
[one] 1 minuutin
|
||||||
*[other] { $num } minuuttia
|
*[other] { $num } minuutin
|
||||||
}
|
}
|
||||||
timespanDays =
|
timespanDays =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 päivä
|
[one] 1 päivän
|
||||||
*[other] { $num } päivää
|
*[other] { $num } päivän
|
||||||
}
|
}
|
||||||
timespanWeeks =
|
timespanWeeks =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 viikko
|
[one] 1 viikon
|
||||||
*[other] { $num } viikkoa
|
*[other] { $num } viikon
|
||||||
}
|
}
|
||||||
fileCount =
|
fileCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
@@ -87,9 +90,24 @@ gb = Gt
|
|||||||
fileSize = { $num } { $units }
|
fileSize = { $num } { $units }
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
totalSize = Koko yhteensä: { $size }
|
totalSize = Koko yhteensä: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Kopioi linkki jakaaksesi tiedoston:
|
||||||
copyLinkButton = Kopioi linkki
|
copyLinkButton = Kopioi linkki
|
||||||
downloadTitle = Lataa tiedostot
|
downloadTitle = Lataa tiedostot
|
||||||
|
downloadDescription = Tämä tiedosto jaettiin { -send-brand } -palvelun kautta päästä päähän -salattuna ja automaattisesti vanhenevalla linkillä.
|
||||||
trySendDescription = Kokeile { -send-brand } -palvelua jakaaksesi tiedostoja helposti ja turvallisesti.
|
trySendDescription = Kokeile { -send-brand } -palvelua jakaaksesi tiedostoja helposti ja turvallisesti.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Vain 1 tiedosto on mahdollistaa lähettää kerralla.
|
||||||
|
*[other] Vain { $count } tiedostoa on mahdollista lähettää kerralla.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Vain 1 arkisto on sallittu.
|
||||||
|
*[other] Vain { $count } arkistoa on sallittu.
|
||||||
|
}
|
||||||
expiredTitle = Tämä linkki on vanhentunut.
|
expiredTitle = Tämä linkki on vanhentunut.
|
||||||
notSupportedDescription = { -send-brand } ei toimi tällä selaimella. { -send-short-brand } toimii parhaiten { -firefox }in uusimmalla versiolla, ja toimii useimpien selainten uusimmilla versioilla.
|
notSupportedDescription = { -send-brand } ei toimi tällä selaimella. { -send-short-brand } toimii parhaiten { -firefox }in uusimmalla versiolla, ja toimii useimpien selainten uusimmilla versioilla.
|
||||||
downloadFirefox = Lataa { -firefox }
|
downloadFirefox = Lataa { -firefox }
|
||||||
@@ -99,17 +117,39 @@ legalDateStamp = Versio 1.0, päivätty 13. maaliskuuta 2019
|
|||||||
expiresDaysHoursMinutes = { $days } pv { $hours } t { $minutes } min
|
expiresDaysHoursMinutes = { $days } pv { $hours } t { $minutes } min
|
||||||
addFilesButton = Valitse lähetettävät tiedostot
|
addFilesButton = Valitse lähetettävät tiedostot
|
||||||
uploadButton = Lähetä
|
uploadButton = Lähetä
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Vedä ja pudota tiedostot
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = tai napsauta lähettääksesi tiedostoja, joiden koko voi olla enintään { $size }
|
||||||
addPassword = Suojaa salasanalla
|
addPassword = Suojaa salasanalla
|
||||||
emailPlaceholder = Kirjoita sähköpostiosoitteesi
|
emailPlaceholder = Kirjoita sähköpostiosoitteesi
|
||||||
signInButton = Kirjaudu tai rekisteröidy
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Kirjautumalla voit lähettää jopa { $size } kokoisia tiedostoja
|
||||||
|
signInOnlyButton = Kirjaudu sisään
|
||||||
accountBenefitTitle = Luo { -firefox }-tili tai kirjaudu sisään
|
accountBenefitTitle = Luo { -firefox }-tili tai kirjaudu sisään
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Jaa tiedostoja, joiden koko on enintään { $size }
|
accountBenefitLargeFiles = Jaa jopa { $size } kokoisia tiedostoja
|
||||||
accountBenefitDownloadCount = Jaa tiedostoja useamman ihmisen kesken
|
accountBenefitDownloadCount = Jaa tiedostoja useamman ihmisen kesken
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Säilytä linkit aktiivisina 1 päivän ajan
|
||||||
|
*[other] Säilytä linkit aktiivisina { $count } päivän ajan
|
||||||
|
}
|
||||||
|
accountBenefitSync = Hallitse jaettuja tiedostoja miltä tahansa laitteelta
|
||||||
accountBenefitMoz = Lue lisää muista { -mozilla }-palveluista
|
accountBenefitMoz = Lue lisää muista { -mozilla }-palveluista
|
||||||
signOut = Kirjaudu ulos
|
signOut = Kirjaudu ulos
|
||||||
okButton = OK
|
okButton = OK
|
||||||
downloadingTitle = Ladataan
|
downloadingTitle = Ladataan
|
||||||
noStreamsWarning = Tämä selain ei välttämättä osaa purkaa salausta näin suurikokoisista tiedostoista.
|
noStreamsWarning = Tämä selain ei välttämättä osaa purkaa salausta näin suurikokoisista tiedostoista.
|
||||||
|
noStreamsOptionCopy = Kopioi linkki avataksesi sen toisessa selaimessa
|
||||||
noStreamsOptionFirefox = Kokeile suosikkiselaintamme
|
noStreamsOptionFirefox = Kokeile suosikkiselaintamme
|
||||||
noStreamsOptionDownload = Jatka tällä selaimella
|
noStreamsOptionDownload = Jatka tällä selaimella
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } on olemassa kiitos uuden { -firefox }in.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Jaa linkki tiedostoosi:
|
||||||
|
shareLinkButton = Jaa linkki
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Lataa tiedosto ”{ $name }” { -send-brand } -palvelusta: yksinkertaista ja turvallista tiedostonjakoa
|
||||||
|
trailheadPromo = On tapa suojata yksityisyyttään. Liity Firefoxiin.
|
||||||
|
learnMore = Lue lisää.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Protéger par mot de passe
|
|||||||
emailPlaceholder = Votre adresse électronique
|
emailPlaceholder = Votre adresse électronique
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Connectez-vous pour envoyer jusqu’à { $size }
|
signInSizeBump = Connectez-vous pour envoyer jusqu’à { $size }
|
||||||
signInButton = Se connecter/S’inscrire
|
signInOnlyButton = Connexion
|
||||||
accountBenefitTitle = Créez un compte { -firefox } ou connectez-vous
|
accountBenefitTitle = Créez un compte { -firefox } ou connectez-vous
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Partagez des fichiers jusqu’à { $size }
|
accountBenefitLargeFiles = Partagez des fichiers jusqu’à { $size }
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Ce navigateur pourrait ne pas être en mesure de déchiffrer
|
|||||||
noStreamsOptionCopy = Copiez le lien pour l’ouvrir dans un autre navigateur
|
noStreamsOptionCopy = Copiez le lien pour l’ouvrir dans un autre navigateur
|
||||||
noStreamsOptionFirefox = Essayez notre navigateur préféré
|
noStreamsOptionFirefox = Essayez notre navigateur préféré
|
||||||
noStreamsOptionDownload = Continuer avec ce navigateur
|
noStreamsOptionDownload = Continuer avec ce navigateur
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } vous est proposé par le tout nouveau { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Partagez le lien vers votre fichier :
|
||||||
|
shareLinkButton = Partager le lien
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Télécharger « { $name } » avec { -send-brand } : un moyen simple et sûr de partager des fichiers
|
||||||
|
trailheadPromo = Il existe un moyen de protéger votre vie privée. Rejoignez Firefox.
|
||||||
|
learnMore = En savoir plus.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Mei wachtwurd beskermje
|
|||||||
emailPlaceholder = Fier jo e-mailadres yn
|
emailPlaceholder = Fier jo e-mailadres yn
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Meld jo oan, om bestannen oant { $size } te stjoeren
|
signInSizeBump = Meld jo oan, om bestannen oant { $size } te stjoeren
|
||||||
signInButton = Oanmelde/Registrearje
|
signInOnlyButton = Oanmelde
|
||||||
accountBenefitTitle = Meitsje in { -firefox }-account of meld jo oan
|
accountBenefitTitle = Meitsje in { -firefox }-account of meld jo oan
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Diel bestannen oant { $size }
|
accountBenefitLargeFiles = Diel bestannen oant { $size }
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Dizze browser kin in sa'n grut bestân mooglik net fersiferje
|
|||||||
noStreamsOptionCopy = Kopiearje de koppeling om yn in oare browser te iepenjen
|
noStreamsOptionCopy = Kopiearje de koppeling om yn in oare browser te iepenjen
|
||||||
noStreamsOptionFirefox = Probearje ús favorite browser
|
noStreamsOptionFirefox = Probearje ús favorite browser
|
||||||
noStreamsOptionDownload = Trochgean mei dizze browser
|
noStreamsOptionDownload = Trochgean mei dizze browser
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } wurdt jo oanbean troch it folslein fernijde { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Diel de keppeling nei jo bestân:
|
||||||
|
shareLinkButton = Keppeling diele
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Download ‘{ $name }’ mei { -send-brand }: ienfâldich, feilich bestannen diele
|
||||||
|
trailheadPromo = Der is in manier om jo privacy te beskermjen. Doch mei mei Firefox.
|
||||||
|
learnMore = Mear ynfo.
|
||||||
|
|||||||
@@ -1,66 +1,158 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteSubtitle = ניסוי אינטרנט
|
|
||||||
siteFeedback = משוב
|
siteFeedback = משוב
|
||||||
uploadPageHeader = שיתוף קבצים פרטי, מוצפן
|
|
||||||
uploadPageExplainer = לשלוח קבצים דרך קישור בטוח, פרטי ומוצפן שפג אוטומטית, כדי לוודא שהתכנים הפרטיים שלך לא יהיו ברשת לנצח.
|
|
||||||
uploadPageLearnMore = מידע נוסף
|
|
||||||
uploadPageDropMessage = יש לגרור קבצים לכאן כדי להתחיל בהעלאה
|
|
||||||
uploadPageSizeMessage = להשגת ביצועים מיטביים, מוטב לשמור על הקובץ מתחת לגודל של 1 ג״ב
|
|
||||||
uploadPageBrowseButton1 = נא לבחור קובץ להעלאה
|
|
||||||
uploadPageMultipleFilesAlert = העלאה של מספר קבצים או ספריה אינה נתמכת כרגע.
|
|
||||||
uploadPageBrowseButtonTitle = העלאת קובץ
|
|
||||||
uploadingPageProgress = { $filename } ({ $size }) בהעלאה
|
|
||||||
importingFile = מתבצע ייבוא...
|
importingFile = מתבצע ייבוא...
|
||||||
verifyingFile = מתבצע אימות…
|
|
||||||
encryptingFile = מתבצעת הצפנה...
|
encryptingFile = מתבצעת הצפנה...
|
||||||
decryptingFile = מתבצע פענוח...
|
decryptingFile = מתבצע פענוח...
|
||||||
notifyUploadDone = ההעלאה שלך הסתיימה
|
downloadCount =
|
||||||
uploadingPageMessage = אחרי שהקובץ שלך יעלה, ניתן יהיה להגדיר אפשרויות תפוגה.
|
{ $num ->
|
||||||
uploadCancelNotification = ההעלאה שלך בוטלה.
|
[one] הורדה אחת
|
||||||
uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות!
|
*[other] { $num } הורדות
|
||||||
uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה.
|
}
|
||||||
uploadSuccessConfirmHeader = מוכן לשליחה
|
timespanHours =
|
||||||
uploadSvgAlt = העלאה
|
{ $num ->
|
||||||
uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות.
|
[one] שעה אחת
|
||||||
copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename }
|
[two] שעתיים
|
||||||
|
*[other] { $num } שעות
|
||||||
|
}
|
||||||
copiedUrl = הועתק!
|
copiedUrl = הועתק!
|
||||||
deleteFileButton = מחיקת קובץ
|
unlockInputPlaceholder = ססמה
|
||||||
sendAnotherFileLink = שליחת קובץ נוסף
|
unlockButtonLabel = שחרור נעילה
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
downloadAltText = הורדה
|
|
||||||
# Used as header in a column indicating the number of times a file has been
|
|
||||||
# downloaded
|
|
||||||
downloadFileName = ההורדה נכשלה
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = הורדה
|
downloadButtonLabel = הורדה
|
||||||
downloadNotification = ההורדה הושלמה.
|
|
||||||
downloadFinish = ההורדה הושלמה
|
downloadFinish = ההורדה הושלמה
|
||||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
|
||||||
fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
|
fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
|
||||||
downloadingPageProgress = בהורדה: { $filename } ({ $size })
|
sendYourFilesLink = נסו את Firefox Send
|
||||||
errorAltText = תקלה בהעלאה
|
|
||||||
errorPageHeader = משהו השתבש!
|
errorPageHeader = משהו השתבש!
|
||||||
errorPageLink = שליחת קובץ נוסף
|
|
||||||
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
|
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
|
||||||
linkExpiredAlt = הקישור פג
|
linkExpiredAlt = הקישור פג
|
||||||
notSupportedHeader = הדפדפן שלך לא נתמך.
|
notSupportedHeader = הדפדפן שלך לא נתמך.
|
||||||
notSupportedLink = למה אין תמיכה בדפדפן שלי?
|
notSupportedLink = למה אין תמיכה בדפדפן שלי?
|
||||||
downloadFirefoxButtonSub = הורדה בחינם
|
notSupportedOutdatedDetail = לצערנו גרסת Firefox זו לא תומכת בטכנולוגית הרשת שמפעילה את Firefox Send. יש לעדכן את הגרסה של הדפדפן שלך.
|
||||||
uploadedFile = קובץ
|
updateFirefox = עדכון Firefox
|
||||||
copyFileList = העתקת כתובת
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = יפוג בעוד
|
|
||||||
deleteFileList = מחיקה
|
|
||||||
nevermindButton = לא משנה
|
|
||||||
legalHeader = תנאי שירות ופרטיות
|
|
||||||
deletePopupText = למחוק דף זה?
|
|
||||||
deletePopupYes = כן
|
|
||||||
deletePopupCancel = ביטול
|
deletePopupCancel = ביטול
|
||||||
deleteButtonHover = מחיקה
|
deleteButtonHover = מחיקה
|
||||||
copyUrlHover = העתקת קישור
|
|
||||||
footerLinkLegal = מידע משפטי
|
footerLinkLegal = מידע משפטי
|
||||||
footerLinkPrivacy = פרטיות
|
footerLinkPrivacy = פרטיות
|
||||||
footerLinkTerms = תנאי שימוש
|
|
||||||
footerLinkCookies = קובצי עוגיות
|
footerLinkCookies = קובצי עוגיות
|
||||||
|
passwordTryAgain = סיסמה שגויה. נא לנסות שוב.
|
||||||
|
javascriptRequired = ל־Firefox Send דרוש JavaScript
|
||||||
|
whyJavascript = למה ל־Firefox Send דרוש JavaScript?
|
||||||
|
enableJavascript = נא להפעיל JavaScript ולנסות שוב.
|
||||||
|
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||||
|
expiresHoursMinutes = { $hours } שע׳ { $minutes } דק׳
|
||||||
|
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||||
|
expiresMinutes = { $minutes } דק׳
|
||||||
|
# A short status message shown when the user enters a long password
|
||||||
|
maxPasswordLength = אורך הססמה המרבי: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = לא ניתן להגדיר את הססמה הזאת
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = שיתוף קבצים פרטי ופשוט
|
||||||
|
introDescription = { -send-brand } מאפשר לך לשתף קבצים עם הצפנה מקצה לקצה וקישור עם תפוגה אוטומטית. בצורה זו תוכלו לשתף קבצים באופן פרטי ולהבטיח שהדברים שלכם לא נשארים ברשת לנצח.
|
||||||
|
notifyUploadEncryptDone = הקובץ שלך מוצפן ומוכן לשליחה
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = יפוג לאחר { $downloadCount } או { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] דקה אחת
|
||||||
|
*[other] { $num } דקות
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] יום אחד
|
||||||
|
[two] יומיים
|
||||||
|
*[other] { $num } ימים
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] שבוע אחד
|
||||||
|
[two] שבועיים
|
||||||
|
*[other] { $num } שבועות
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] קובץ אחד
|
||||||
|
*[other] { $num } קבצים
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = בתים
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = ק״ב
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = מ״ב
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = ג״ב
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num } { $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = גודל כולל: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = יש להעתיק את הקישור כדי לשתף את הקובץ שלך:
|
||||||
|
copyLinkButton = העתקת קישור
|
||||||
|
downloadTitle = הורדת קבצים
|
||||||
|
downloadDescription = קובץ זה שותף באמצעות { -send-brand } עם הצפנה מקצה לקצה וקישור שפג באופן אוטומטי.
|
||||||
|
trySendDescription = כדאי לנסות את { -send-brand } לשיתוף קבצים פשוט ומאובטח.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] ניתן להעלות רק קובץ אחד בכל פעם.
|
||||||
|
*[other] ניתן להעלות רק { $count } קבצים בכל פעם.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] רק ארכיון אחד מורשה.
|
||||||
|
*[other] רק { $count } ארכיונים מורשים.
|
||||||
|
}
|
||||||
|
expiredTitle = פג תוקפו של קישור זה.
|
||||||
|
notSupportedDescription = { -send-brand } לא יפעל עם דפדפן זה. { -send-short-brand } פועל בצורה הטובה ביותר עם הגרסה העדכנית ביותר של { -firefox }, ויעבוד עם הגרסה הנוכחית של רוב הדפדפנים.
|
||||||
|
downloadFirefox = הורדת { -firefox }
|
||||||
|
legalTitle = הצהרת פרטיות של { -send-short-brand }
|
||||||
|
legalDateStamp = גרסה 1.0, בתאריך 12 במרץ 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days } ימים { $hours } שעות { $minutes } דקות
|
||||||
|
addFilesButton = בחירת קבצים להעלאה
|
||||||
|
uploadButton = העלאה
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = גרירה והשלכת קבצים
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = או ללחוץ כדי לשלוח קבצים עד לגודל של { $size }
|
||||||
|
addPassword = הגנה באמצעות ססמה
|
||||||
|
emailPlaceholder = נא להכניס כתובת דוא״ל
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = נא להירשם כדי לשלוח קבצים עד גודל של { $size }
|
||||||
|
signInOnlyButton = כניסה
|
||||||
|
accountBenefitTitle = נא ליצור חשבון { -firefox } או להיכנס לחשבון
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = שיתוף קבצים עד גודל של { $size }
|
||||||
|
accountBenefitDownloadCount = שיתוף קבצים עם יותר אנשים
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] שמירה על קישורים פעילים עד ליום אחד
|
||||||
|
*[other] שמירה על קישורים פעילים עד ל־{ $count } ימים
|
||||||
|
}
|
||||||
|
accountBenefitSync = ניהול קבצים משותפים מכל מכשיר
|
||||||
|
accountBenefitMoz = מידע נוסף על שירותי { -mozilla } אחרים
|
||||||
|
signOut = יציאה
|
||||||
|
okButton = אישור
|
||||||
|
downloadingTitle = בהורדה
|
||||||
|
noStreamsWarning = ייתכן שדפדפן זה לא יוכל לפענח קובץ בגודל כזה.
|
||||||
|
noStreamsOptionCopy = העתקת הקישור לפתיחה בדפדפן אחר
|
||||||
|
noStreamsOptionFirefox = נסו את הדפדפן המועדף עלינו
|
||||||
|
noStreamsOptionDownload = המשך בדפדפן זה
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } מובא אליך בחסות { -firefox }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = שיתוף הקישור לקובץ שלך:
|
||||||
|
shareLinkButton = שיתוף קישור
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = הורדת ״{ $name }״ עם { -send-brand }: שיתוף קבצים פשוט ובטוח
|
||||||
|
trailheadPromo = ישנן דרכים נוספות להגן על הפרטיות שלכם. הצטרפו אל Firefox.
|
||||||
|
learnMore = מידע נוסף.
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ addPassword = Zaštitite lozinkom
|
|||||||
emailPlaceholder = Unesite svoju adresu e-pošte
|
emailPlaceholder = Unesite svoju adresu e-pošte
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Prijavite se za slanje do { $size }
|
signInSizeBump = Prijavite se za slanje do { $size }
|
||||||
signInButton = Prijavite se
|
signInOnlyButton = Prijavi se
|
||||||
accountBenefitTitle = Stvorite { -firefox } račun ili se prijavite
|
accountBenefitTitle = Stvorite { -firefox } račun ili se prijavite
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Dijelite datoteke do { $size }
|
accountBenefitLargeFiles = Dijelite datoteke do { $size }
|
||||||
@@ -154,3 +154,11 @@ noStreamsWarning = Ovaj preglednik možda neće moći dekriptirati datoteku ove
|
|||||||
noStreamsOptionCopy = Kopirajte poveznicu kako biste je otvorili u drugom pregledniku
|
noStreamsOptionCopy = Kopirajte poveznicu kako biste je otvorili u drugom pregledniku
|
||||||
noStreamsOptionFirefox = Isprobajte naš omiljeni preglednik
|
noStreamsOptionFirefox = Isprobajte naš omiljeni preglednik
|
||||||
noStreamsOptionDownload = Nastavite s ovim preglednikom
|
noStreamsOptionDownload = Nastavite s ovim preglednikom
|
||||||
|
downloadFirefoxPromo = Potpuno novi { -firefox } vam donosi { -send-short-brand }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Dijelite poveznicu na svoju datoteku:
|
||||||
|
shareLinkButton = Dijeli poveznicu
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Preuzmite “{ $name }” sa { -send-brand }: jednostavno i sigurno dijeljenje datoteka
|
||||||
|
trailheadPromo = Postoji način da zaštitite svoju privatnost. Pridružite se Firefoxu.
|
||||||
|
learnMore = Saznajte više.
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ addPassword = Z hesłom škitać
|
|||||||
emailPlaceholder = Zapodajće swoju e-mejlowu adresu
|
emailPlaceholder = Zapodajće swoju e-mejlowu adresu
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Přizjewće so, zo byšće do { $size } pósłał
|
signInSizeBump = Přizjewće so, zo byšće do { $size } pósłał
|
||||||
signInButton = Přizjewić/Registrować
|
signInOnlyButton = Přizjewić
|
||||||
accountBenefitTitle = Załožće konto { -firefox } abo přizjewće so
|
accountBenefitTitle = Załožće konto { -firefox } abo přizjewće so
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Dataje do { $size } dźělić
|
accountBenefitLargeFiles = Dataje do { $size } dźělić
|
||||||
@@ -163,3 +163,11 @@ noStreamsWarning = Tutón wobhladowak njemóhł tajku wulku dataju dešifrować.
|
|||||||
noStreamsOptionCopy = Kopěrujće wotkaz, zo byšće jón w druhim wobhladowaku wočinił
|
noStreamsOptionCopy = Kopěrujće wotkaz, zo byšće jón w druhim wobhladowaku wočinił
|
||||||
noStreamsOptionFirefox = Wupruwujće naš najlubši wobhladowak
|
noStreamsOptionFirefox = Wupruwujće naš najlubši wobhladowak
|
||||||
noStreamsOptionDownload = Z tutym wobhladowakom pokročować
|
noStreamsOptionDownload = Z tutym wobhladowakom pokročować
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } so wam přez cyle nowy { -firefox } přinjese.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Dźělće wotkaz k swojej dataji:
|
||||||
|
shareLinkButton = Wotkaz dźělić
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Sćehńće „{ $name }“ z { -send-brand }: jednore, wěste dźělenje datajow
|
||||||
|
trailheadPromo = Je móžnosć, wašu priwatnosć škitać. Přińdźće k Firefox.
|
||||||
|
learnMore = Dalše informacije.
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = Jelszavas védelem
|
|||||||
emailPlaceholder = Adja meg az e-mail címét
|
emailPlaceholder = Adja meg az e-mail címét
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Jelentkezzen be, és küldjön legfeljebb { $size }-ot
|
signInSizeBump = Jelentkezzen be, és küldjön legfeljebb { $size }-ot
|
||||||
signInButton = Bejelentkezés/regisztráció
|
signInOnlyButton = Bejelentkezés
|
||||||
accountBenefitTitle = Hozzon létre egy { -firefox } fiókot vagy jelentkezzen be
|
accountBenefitTitle = Hozzon létre egy { -firefox } fiókot vagy jelentkezzen be
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Osszon meg fájlokat { $size }-ig
|
accountBenefitLargeFiles = Osszon meg fájlokat { $size }-ig
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = Előfordulhat, hogy a böngésző nem fog tudni visszafejteni
|
|||||||
noStreamsOptionCopy = Másolja a hivatkozást, és nyissa meg egy másik böngészőben
|
noStreamsOptionCopy = Másolja a hivatkozást, és nyissa meg egy másik böngészőben
|
||||||
noStreamsOptionFirefox = Próbálja ki a kedvenc böngészőnket
|
noStreamsOptionFirefox = Próbálja ki a kedvenc böngészőnket
|
||||||
noStreamsOptionDownload = Folytatás ezzel a böngészővel
|
noStreamsOptionDownload = Folytatás ezzel a böngészővel
|
||||||
|
downloadFirefoxPromo = A { -send-short-brand }et a vadonatúj { -firefox } hozza el Önnek.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Ossza meg a fájlja hivatkozását:
|
||||||
|
shareLinkButton = Hivatkozás megosztása
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = „{ $name }” letöltése a { -send-brand } segítségével: egyszerű, biztonságos fájlmegosztás
|
||||||
|
trailheadPromo = Védje meg a magánszféráját. Csatlakozzon a Firefoxhoz.
|
||||||
|
learnMore = További tudnivalók.
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ passwordSetError = Iste contrasigno non pote ser definite
|
|||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Comparti file in maniera confidential
|
introTitle = Comparti file in maniera confidential
|
||||||
|
introDescription = { -send-brand } te pone in grado de compartir files con cryptographia bilateral e un ligamine que automaticamente expira. Assi que tu pote mantener private lo que tu comparti e liberar te del anxietate que tu problema resta online per sempre.
|
||||||
|
notifyUploadEncryptDone = Tu file es cryptate e preste pro ser inviate.
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Expira post { $downloadCount } o { $timespan }
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 minuta
|
[one] 1 minuta
|
||||||
@@ -90,6 +94,8 @@ totalSize = Dimension total: { $size }
|
|||||||
copyLinkDescription = Copia le ligamine pro compartir le file:
|
copyLinkDescription = Copia le ligamine pro compartir le file:
|
||||||
copyLinkButton = Copiar ligamine
|
copyLinkButton = Copiar ligamine
|
||||||
downloadTitle = Discargar files
|
downloadTitle = Discargar files
|
||||||
|
downloadDescription = Iste file era compartite via { -send-brand } con cryptographia bilateral e un ligamine que expira automaticamente.
|
||||||
|
trySendDescription = Prova { -send-brand } pro le compartimento de file simple e secur.
|
||||||
# count will always be > 10
|
# count will always be > 10
|
||||||
tooManyFiles =
|
tooManyFiles =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
@@ -103,6 +109,7 @@ tooManyArchives =
|
|||||||
*[other] Solo { $count } archivos es consentite.
|
*[other] Solo { $count } archivos es consentite.
|
||||||
}
|
}
|
||||||
expiredTitle = Iste ligamine ha expirate.
|
expiredTitle = Iste ligamine ha expirate.
|
||||||
|
notSupportedDescription = { -send-brand } non functionara con iste navigator. { -send-short-brand } functiona melio con le ultime version de { -firefox }, e functionara con le version actual de plure navigatores.
|
||||||
downloadFirefox = Discargar { -firefox }
|
downloadFirefox = Discargar { -firefox }
|
||||||
legalTitle = Politica de confidentialitate de { -send-short-brand }
|
legalTitle = Politica de confidentialitate de { -send-short-brand }
|
||||||
legalDateStamp = Version 1.0 del 12 martio 2019
|
legalDateStamp = Version 1.0 del 12 martio 2019
|
||||||
@@ -116,10 +123,10 @@ dragAndDropFiles = Traher e deponer files
|
|||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
orClickWithSize = o cliccar pro inviar usque { $size }
|
orClickWithSize = o cliccar pro inviar usque { $size }
|
||||||
addPassword = Proteger per contrasigno
|
addPassword = Proteger per contrasigno
|
||||||
emailPlaceholder = Insere tu adresse email
|
emailPlaceholder = Insere tu adresse de e-mail
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Accede pro inviar usque { $size }
|
signInSizeBump = Accede pro inviar usque { $size }
|
||||||
signInButton = Authentica/registra te
|
signInOnlyButton = Authentica te
|
||||||
accountBenefitTitle = Crea un conto { -firefox } o registra te
|
accountBenefitTitle = Crea un conto { -firefox } o registra te
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Comparti files usque { $size }
|
accountBenefitLargeFiles = Comparti files usque { $size }
|
||||||
@@ -129,8 +136,20 @@ accountBenefitTimeLimit =
|
|||||||
[one] Retene active le ligamine pro 1 die
|
[one] Retene active le ligamine pro 1 die
|
||||||
*[other] Retene active le ligamine pro { $count } dies
|
*[other] Retene active le ligamine pro { $count } dies
|
||||||
}
|
}
|
||||||
|
accountBenefitSync = Gere files compartite ab ulle apparato
|
||||||
|
accountBenefitMoz = Discoperi altere servicios de { -mozilla }
|
||||||
signOut = Disconnecter
|
signOut = Disconnecter
|
||||||
okButton = OK
|
okButton = OK
|
||||||
downloadingTitle = Discargamento
|
downloadingTitle = Discargamento
|
||||||
|
noStreamsWarning = Iste navigator pote non pote decifrar un file assi grande.
|
||||||
|
noStreamsOptionCopy = Copiar le ligamine e aperir lo in un altere navigator
|
||||||
noStreamsOptionFirefox = Prova nostre navigator favorite
|
noStreamsOptionFirefox = Prova nostre navigator favorite
|
||||||
noStreamsOptionDownload = Continuar con iste navigator
|
noStreamsOptionDownload = Continuar con iste navigator
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } es portate a te per le novissime { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Condivide le ligamine a tu file:
|
||||||
|
shareLinkButton = Condivide ligamine
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Discarga “{ $name }” con { -send-brand }: condivide files in modo simple e secur
|
||||||
|
trailheadPromo = Il ha un via pro proteger tu confidentialitate. Junge te a Firefox!
|
||||||
|
learnMore = Saper plus.
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ addPassword = Lindungi dengan kata sandi
|
|||||||
emailPlaceholder = Masukkan surel Anda
|
emailPlaceholder = Masukkan surel Anda
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Masuk untuk dapat mengirim hingga { $size }
|
signInSizeBump = Masuk untuk dapat mengirim hingga { $size }
|
||||||
signInButton = Masuk/Daftar
|
signInOnlyButton = Masuk
|
||||||
accountBenefitTitle = Buat { -firefox } Account atau masuk
|
accountBenefitTitle = Buat { -firefox } Account atau masuk
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Bagikan berkas hingga { $size }
|
accountBenefitLargeFiles = Bagikan berkas hingga { $size }
|
||||||
@@ -130,9 +130,17 @@ accountBenefitTimeLimit =
|
|||||||
accountBenefitSync = Kelola berkas yang dibagikan dari perangkat apa pun
|
accountBenefitSync = Kelola berkas yang dibagikan dari perangkat apa pun
|
||||||
accountBenefitMoz = Pelajari tentang layanan { -mozilla } lainnya
|
accountBenefitMoz = Pelajari tentang layanan { -mozilla } lainnya
|
||||||
signOut = Keluar
|
signOut = Keluar
|
||||||
okButton = OK
|
okButton = Oke
|
||||||
downloadingTitle = Mengunduh
|
downloadingTitle = Mengunduh
|
||||||
noStreamsWarning = Peramban ini mungkin tidak dapat mendekripsi berkas sebesar ini.
|
noStreamsWarning = Peramban ini mungkin tidak dapat mendekripsi berkas sebesar ini.
|
||||||
noStreamsOptionCopy = Salin tautan untuk dibuka di peramban lainnya
|
noStreamsOptionCopy = Salin tautan untuk dibuka di peramban lainnya
|
||||||
noStreamsOptionFirefox = Coba peramban favorit kami
|
noStreamsOptionFirefox = Coba peramban favorit kami
|
||||||
noStreamsOptionDownload = Lanjutkan dengan peramban ini
|
noStreamsOptionDownload = Lanjutkan dengan peramban ini
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } dipersembahkan untuk Anda oleh { -firefox } terbaru.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Bagikan tautan ke berkas Anda:
|
||||||
|
shareLinkButton = Bagikan tautan
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Unduh "{ $name }" dengan { -send-brand }: berbagi berkas dengan sederhana dan aman
|
||||||
|
trailheadPromo = Ada cara untuk melindungi privasi Anda. Bergabunglah dengan Firefox.
|
||||||
|
learnMore = Pelajari lebih lanjut.
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ addPassword = Proteggi con una password
|
|||||||
emailPlaceholder = Inserisci il tuo indirizzo email
|
emailPlaceholder = Inserisci il tuo indirizzo email
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Accedi per inviare fino a { $size }
|
signInSizeBump = Accedi per inviare fino a { $size }
|
||||||
signInButton = Accedi o registrati
|
signInOnlyButton = Accedi
|
||||||
accountBenefitTitle = Crea un account { -firefox } o accedi
|
accountBenefitTitle = Crea un account { -firefox } o accedi
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Condividi file fino a { $size }
|
accountBenefitLargeFiles = Condividi file fino a { $size }
|
||||||
@@ -137,3 +137,11 @@ noStreamsWarning = Questo browser potrebbe non essere in grado di decrittare un
|
|||||||
noStreamsOptionCopy = Copia il link e aprilo in un altro browser
|
noStreamsOptionCopy = Copia il link e aprilo in un altro browser
|
||||||
noStreamsOptionFirefox = Prova il nostro browser preferito
|
noStreamsOptionFirefox = Prova il nostro browser preferito
|
||||||
noStreamsOptionDownload = Continua con questo browser
|
noStreamsOptionDownload = Continua con questo browser
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } è offerto dal nuovissimo { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Condividi il link al tuo file:
|
||||||
|
shareLinkButton = Condividi link
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Scarica “{ $name }” con { -send-brand }: condivisione di file semplice e sicura
|
||||||
|
trailheadPromo = C’è un modo per proteggere la tua privacy. Entra a far parte di Firefox.
|
||||||
|
learnMore = Ulteriori informazioni.
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ addPassword = パスワードで保護
|
|||||||
emailPlaceholder = メールアドレスを入力
|
emailPlaceholder = メールアドレスを入力
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = ログインすると最大 { $size } のファイルを送信できます
|
signInSizeBump = ログインすると最大 { $size } のファイルを送信できます
|
||||||
signInButton = ログイン/登録
|
signInOnlyButton = ログイン
|
||||||
accountBenefitTitle = { -firefox } アカウントを作成またはログイン
|
accountBenefitTitle = { -firefox } アカウントを作成またはログイン
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = 最大 { $size } までのファイルを共有
|
accountBenefitLargeFiles = 最大 { $size } までのファイルを共有
|
||||||
@@ -135,3 +135,10 @@ downloadingTitle = ダウンロード中
|
|||||||
noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。
|
noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。
|
||||||
noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください
|
noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください
|
||||||
noStreamsOptionDownload = このブラウザーで続ける
|
noStreamsOptionDownload = このブラウザーで続ける
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = ファイルへのリンクを共有しましょう:
|
||||||
|
shareLinkButton = リンクを共有
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有
|
||||||
|
trailheadPromo = プライバシーを保護する方法があります。Firefox を試してください。
|
||||||
|
learnMore = 詳細情報
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ addPassword = პაროლით დაცვა
|
|||||||
emailPlaceholder = შეიყვანეთ ელფოსტა
|
emailPlaceholder = შეიყვანეთ ელფოსტა
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = შედით ანგარიშზე, რომ გაგზავნოთ { $size }-მდე
|
signInSizeBump = შედით ანგარიშზე, რომ გაგზავნოთ { $size }-მდე
|
||||||
signInButton = ანგარიშზე შესვლა/შექმნა
|
signInOnlyButton = შესვლა
|
||||||
accountBenefitTitle = შექმენით { -firefox }-ანგარიში ან შედით
|
accountBenefitTitle = შექმენით { -firefox }-ანგარიში ან შედით
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = გააზიარეთ ფაილები { $size }-მდე
|
accountBenefitLargeFiles = გააზიარეთ ფაილები { $size }-მდე
|
||||||
@@ -145,3 +145,11 @@ noStreamsWarning = ამ ბრაუზერმა, შესაძლოა
|
|||||||
noStreamsOptionCopy = ბმულის ასლის აღება სხვა ბრაუზერში გასახსნელად
|
noStreamsOptionCopy = ბმულის ასლის აღება სხვა ბრაუზერში გასახსნელად
|
||||||
noStreamsOptionFirefox = სცადეთ ჩვენი რჩეული ბრაუზერი
|
noStreamsOptionFirefox = სცადეთ ჩვენი რჩეული ბრაუზერი
|
||||||
noStreamsOptionDownload = განაგრძეთ ამ ბრაუზერით
|
noStreamsOptionDownload = განაგრძეთ ამ ბრაუზერით
|
||||||
|
downloadFirefoxPromo = { -send-short-brand }-ს წარმოგიდგინეთ უახლესი { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = ფაილის ბმულის გაზიარება:
|
||||||
|
shareLinkButton = ბმულის გაზიარება
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = ჩამოტვირთეთ „{ $name }“ { -send-brand }-ით: ფაილების გაზიარება მარტივად, უსაფრთხოდ
|
||||||
|
trailheadPromo = გზა, თქვენი პირადულობის დასაცავად. შემოუერთდით Firefox-ს.
|
||||||
|
learnMore = იხილეთ ვრცლად.
|
||||||
|
|||||||
@@ -1,31 +1,9 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteSubtitle = Tarmit web
|
|
||||||
siteFeedback = Tikti
|
siteFeedback = Tikti
|
||||||
uploadPageHeader = Beṭṭu n ifuyla s uwgelhen akked tbaḍnit
|
|
||||||
uploadPageExplainer = Azen ifuyla s wudem aɣelsant, s tbaḍnit akked uwgelhen, s useqdec n useɣwen ara yemten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda.
|
|
||||||
uploadPageLearnMore = Issin ugar
|
|
||||||
uploadPageDropMessage = Zuɣeṛ afaylu-ik ar dagi akken ad tebduḍ asali
|
|
||||||
uploadPageSizeMessage = I ugmuḍ ufrin, yelha ad tesqedceḍ ifuyla daw n 1 GAṬ
|
|
||||||
uploadPageBrowseButton = Fren afaylu sef uselkim-ik
|
|
||||||
uploadPageBrowseButton1 = Fren afaylu ad tazneḍ
|
|
||||||
uploadPageMultipleFilesAlert = Asali n ddeqs n ifuyla neɣ ikaramen ur ittusefrak ara yakan.
|
|
||||||
uploadPageBrowseButtonTitle = Sali ifuyla
|
|
||||||
uploadingPageProgress = Tuzna n { $filename } ({ $size })
|
|
||||||
importingFile = Akter...
|
importingFile = Akter...
|
||||||
verifyingFile = Asenqed...
|
|
||||||
encryptingFile = Awgelhen...
|
encryptingFile = Awgelhen...
|
||||||
decryptingFile = Azmek...
|
decryptingFile = Azmek...
|
||||||
notifyUploadDone = Asali n ufaylu yemmed.
|
|
||||||
uploadingPageMessage = Ticki afaylu-ik yettali, ad tizmired ad ternuḍ iɣewwaṛen n wazen n tagara.
|
|
||||||
uploadingPageCancel = Sefsex asali
|
|
||||||
uploadCancelNotification = Asali-ik yefsex.
|
|
||||||
uploadingPageLargeFileMessage = Afaylu meqqer aṭas ihi yezmer ad yawi ddeqs n wakud. Rǧu ihi!
|
|
||||||
uploadingFileNotification = Lɣu-yid ticki yemmed usali.
|
|
||||||
uploadSuccessConfirmHeader = Ihegga i walluy
|
|
||||||
uploadSvgAlt = Sali
|
|
||||||
uploadSuccessTimingHeader = Aseɣwen ar ufaylu-ik ad yemmet ticki yuder-d neɣ deffir n 24 n yisragen.
|
|
||||||
expireInfo = Aseɣwen icudden ar ufaylu-inek ad yemmet send { $downloadCount } naɣ { $timespan }.
|
|
||||||
downloadCount =
|
downloadCount =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
[one] 1 usider
|
[one] 1 usider
|
||||||
@@ -36,76 +14,26 @@ timespanHours =
|
|||||||
[one] 1 usrag
|
[one] 1 usrag
|
||||||
*[other] { $num } isragen
|
*[other] { $num } isragen
|
||||||
}
|
}
|
||||||
copyUrlFormLabelWithName = Nɣel sakin Bḍu aseɣwen akken ad tazneḍ afaylu-ik: { $filename }
|
|
||||||
copyUrlFormButton = Sers ɣef afus
|
|
||||||
copiedUrl = Yenɣel!
|
copiedUrl = Yenɣel!
|
||||||
deleteFileButton = Kkes afaylu
|
|
||||||
sendAnotherFileLink = Azen afaylu-nniḍen
|
|
||||||
# Alternative text used on the download link/button (indicates an action).
|
|
||||||
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 }
|
|
||||||
downloadFileSize = ({ $size })
|
|
||||||
unlockInputLabel = Sekcem awal uffir
|
|
||||||
unlockInputPlaceholder = Awal uffir
|
unlockInputPlaceholder = Awal uffir
|
||||||
unlockButtonLabel = Serreḥ
|
unlockButtonLabel = Serreḥ
|
||||||
downloadFileTitle = Sider afaylu awgelhan
|
|
||||||
# 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.
|
|
||||||
# Text and title used on the download link/button (indicates an action).
|
|
||||||
downloadButtonLabel = Sider
|
downloadButtonLabel = Sider
|
||||||
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)".
|
|
||||||
fileSizeProgress = ({ $partialSize } seg { $totalSize })
|
fileSizeProgress = ({ $partialSize } seg { $totalSize })
|
||||||
# Firefox Send is a brand name and should not be localized.
|
|
||||||
sendYourFilesLink = Ɛreḍ Firefox Send
|
sendYourFilesLink = Ɛreḍ Firefox Send
|
||||||
downloadingPageProgress = Asider n { $filename } ({ $size })
|
|
||||||
downloadingPageMessage = Eǧǧ iccer-agi yeldi ticki nettnadi afaylu akken ad newgelhen.
|
|
||||||
errorAltText = Tuccḍa n tuzna
|
|
||||||
errorPageHeader = Yella wayen yeḍran!
|
errorPageHeader = Yella wayen yeḍran!
|
||||||
errorPageMessage = Teḍra-d tuccḍa deg usali n ufaylu.
|
|
||||||
errorPageLink = Azen afaylu-nniḍen
|
|
||||||
fileTooBig = Afaylu-agi meqqeṛ aṭas. Yessefk ad yili daw n { $size }.
|
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!
|
|
||||||
notSupportedHeader = Iminig-ik ur ittusefrak ara
|
notSupportedHeader = Iminig-ik ur ittusefrak ara
|
||||||
# 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!
|
|
||||||
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.
|
||||||
updateFirefox = Leqqem Firefox
|
updateFirefox = Leqqem Firefox
|
||||||
downloadFirefoxButtonSub = Asider ilelli
|
|
||||||
uploadedFile = Afaylu
|
|
||||||
copyFileList = Nɣel URL
|
|
||||||
# expiryFileList is used as a column header
|
|
||||||
expiryFileList = Ad ifak di
|
|
||||||
deleteFileList = Kkes
|
|
||||||
nevermindButton = Wicqa
|
|
||||||
legalHeader = Tiwtilin &tabaḍnit
|
|
||||||
legalNoticeTestPilot = Firefox Send yettwasekyad akka tura am tarmit Test Pilot, ihi ad yili daw n <a>n tewtilin n useqdec </a> n Test Pilot akked <a>Tasertit n tbaḍnit</a>. Tzemreḍ ad teẓreḍ ugar ɣeef tarmit-agi akked ulqaḍ n isefka<a> dagihere</a>.
|
|
||||||
legalNoticeMozilla = Aseqdec n usmel n Firefox Send yella daw n <a> ilugan tbaḍnit n yismal web </a> n Mozilla akked <a> Tiwtilin n useqdec n yismal Web</a> n Mozilla.
|
|
||||||
deletePopupText = Kkes afaylu-agi?
|
|
||||||
deletePopupYes = Ih
|
|
||||||
deletePopupCancel = Sefsex
|
deletePopupCancel = Sefsex
|
||||||
deleteButtonHover = Kkes
|
deleteButtonHover = Kkes
|
||||||
copyUrlHover = Nɣel URL.
|
|
||||||
footerLinkLegal = Usḍif
|
footerLinkLegal = Usḍif
|
||||||
# Test Pilot is a proper name and should not be localized.
|
|
||||||
footerLinkAbout = Ɣef Test Pilot
|
|
||||||
footerLinkPrivacy = Tabaḍnit
|
footerLinkPrivacy = Tabaḍnit
|
||||||
footerLinkTerms = Tiwtilin
|
|
||||||
footerLinkCookies = Inagan n tuqqna
|
footerLinkCookies = Inagan n tuqqna
|
||||||
requirePasswordCheckbox = YEsra awal uffir akken ad isider afaylu-agi
|
|
||||||
addPasswordButton = rnu awal uffir
|
|
||||||
changePasswordButton = Snifel
|
|
||||||
passwordTryAgain = Yir awal uffir. Ɛreḍ tikelt nniḍen.
|
passwordTryAgain = Yir awal uffir. Ɛreḍ tikelt nniḍen.
|
||||||
reportIPInfringement = Neqqes akukel n IP
|
|
||||||
javascriptRequired = Firefox Send yesra JavaScript
|
javascriptRequired = Firefox Send yesra JavaScript
|
||||||
whyJavascript = Ayɣer firefox Send yesra JavaScript?
|
whyJavascript = Ayɣer firefox Send yesra JavaScript?
|
||||||
enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍen.
|
enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍen.
|
||||||
@@ -113,9 +41,115 @@ enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍe
|
|||||||
expiresHoursMinutes = { $hours }Isragen { $minutes }Tisdatin
|
expiresHoursMinutes = { $hours }Isragen { $minutes }Tisdatin
|
||||||
# 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 }Tisdatin
|
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
|
# A short status message shown when the user enters a long password
|
||||||
maxPasswordLength = Tuγzi tafellayt n wawal uffir: { $length }
|
maxPasswordLength = Tuγzi tafellayt n wawal uffir: { $length }
|
||||||
# A short status message shown when there was an error setting the password
|
# A short status message shown when there was an error setting the password
|
||||||
passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded
|
passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = Firefox Send
|
||||||
|
-send-short-brand = Send
|
||||||
|
-firefox = Firefox
|
||||||
|
-mozilla = Mozilla
|
||||||
|
introTitle = Afessas, beṭṭu n ifuyla s wudem uslig
|
||||||
|
introDescription = { -send-brand } ad k(yeǧǧ ad tebḍuḍ ifuyla iwgelhanensi ṭṭerf ɣer ṭṭerf akked useɣwen ara yemmten s wudem awurman. Daɣen, ad tizmireḍ ad tḥ€rzeḍ ayen i tbeṭṭuḍ s wudem uslig daɣen ad temneḍ imi agbur-ik ur yettɣimi ara srid i lebda.
|
||||||
|
notifyUploadEncryptDone = Afaylu-ik yewgelhen daɣen ihegga i tuzna
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = Ad yemmet deffir { $downloadCount } neɣ { $timespan }
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 n tsedat
|
||||||
|
*[other] { $num } n tsedatin
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 n wass
|
||||||
|
*[other] { $num } n wussan
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 n dduṛt
|
||||||
|
*[other] { $num } n ledwaṛ
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 n ufaylu
|
||||||
|
*[other] { $num } n ifuyla
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = KAṬ
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = MAṬ
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = GAṬ
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = Tuɣzi s umata: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = Nɣel aseɣwen akken ad tebḍuḍ afaylu-inek
|
||||||
|
copyLinkButton = Nɣel aseɣwen
|
||||||
|
downloadTitle = Sider ifuyla
|
||||||
|
downloadDescription = Afaylu-a yettwabḍa s { -send-brand } s uwgelhen s ṭṭerf ɣer ṭṭerf s useɣwen ara yemmten s wudem awurman.
|
||||||
|
trySendDescription = Ɛreḍ { -send-brand } i beḍḍu afessas n ifuyla s wudem ameɣtu.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Ala 1 n ufaylu i yemzren ad yali i tikkelt.
|
||||||
|
*[other] Ala { $count } n yifuyla i yemzren ad alin i tikkelt.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Ala 1 n teṛcibt i yettwasirgen.
|
||||||
|
*[other] Ala { $count } n teṛcibin i yettwasiregn.
|
||||||
|
}
|
||||||
|
expiredTitle = Immut useɣwen.
|
||||||
|
notSupportedDescription = { -send-brand } ur iteddu ara s yiminig-a. { -send-short-brand } iteddu akken iwata s lqem aneggaru n { -firefox }, daɣen iteddu s lqem amiran n tuget n yiminigen.
|
||||||
|
downloadFirefox = Sider { -firefox }
|
||||||
|
legalTitle = Tasertit tabaḍnit n { -send-short-brand }
|
||||||
|
legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days } ass { $hours } srg { $minutes } tsd
|
||||||
|
addFilesButton = Fren ifuyla ad tessaliḍ
|
||||||
|
uploadButton = Sali
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Ẓuɣer sakin sers ifuyla
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = neɣ sit akken ad tazneḍ arma d { $size }
|
||||||
|
addPassword = Ḥrez s wawal uffir
|
||||||
|
emailPlaceholder = Sekcem imayl inek
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Qqen akken ad tazneḍ arma d { $size }
|
||||||
|
signInOnlyButton = Qqen
|
||||||
|
accountBenefitTitle = Rnu amiḍan { -firefox } akken ad teqqneḍ
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Bḍu ifuyla arma d { $size }
|
||||||
|
accountBenefitDownloadCount = Bḍu ifuyla d wugan n medden
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Eǧǧ iseɣwan d urmiden arma d 1 n wass
|
||||||
|
*[other] Eǧǧ iseɣwan d urmiden arma d { $count } n wassan
|
||||||
|
}
|
||||||
|
accountBenefitSync = Sefrek ifuyla yebdan seg yal ibenk
|
||||||
|
accountBenefitMoz = Issin ugar ɣef yimeẓla-nniḍen n { -mozilla }
|
||||||
|
signOut = Ffeɣ
|
||||||
|
okButton = IH
|
||||||
|
downloadingTitle = Azdam
|
||||||
|
noStreamsWarning = Iminig-a ur yezmir ara ad yezmek afaylu meqqren.
|
||||||
|
noStreamsOptionCopy = Nɣel aseɣwen i tulya deg yiminig-nniden
|
||||||
|
noStreamsOptionFirefox = Ɛreḍ iminig-ik ufrin
|
||||||
|
noStreamsOptionDownload = Kemmel akked iminig-a
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } yettwasumer i yal { -firefox } amaynut.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Bḍu aseɣwen ɣer ufaylu-ik:
|
||||||
|
shareLinkButton = Bḍu aseɣwen
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Sider "{ $name }" s { -send-brand }: d fessas, d aɣelsan i beṭṭu n yifuyla.
|
||||||
|
trailheadPromo = Yella wallal n ummesten n tudert-ik tusligt. Ddu ɣer Firefox.
|
||||||
|
learnMore = Issin ugar.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ siteFeedback = 사용자 의견
|
|||||||
importingFile = 가져오는 중…
|
importingFile = 가져오는 중…
|
||||||
encryptingFile = 암호화 중…
|
encryptingFile = 암호화 중…
|
||||||
decryptingFile = 복호화 중…
|
decryptingFile = 복호화 중…
|
||||||
downloadCount = 1 다운로드
|
downloadCount = 다운로드 { $num }회
|
||||||
timespanHours = 1 시간
|
timespanHours = 1 시간
|
||||||
copiedUrl = 복사 완료!
|
copiedUrl = 복사 완료!
|
||||||
unlockInputPlaceholder = 비밀번호
|
unlockInputPlaceholder = 비밀번호
|
||||||
@@ -18,7 +18,7 @@ fileTooBig = 파일의 크기가 너무 큽니다. { $size } 보다 작아야
|
|||||||
linkExpiredAlt = 링크가 만료됨
|
linkExpiredAlt = 링크가 만료됨
|
||||||
notSupportedHeader = 이 브라우저는 지원되지 않습니다.
|
notSupportedHeader = 이 브라우저는 지원되지 않습니다.
|
||||||
notSupportedLink = 왜 이 브라우저는 지원이 되지 않나요?
|
notSupportedLink = 왜 이 브라우저는 지원이 되지 않나요?
|
||||||
notSupportedOutdatedDetail = 안타깝게도 현재 브라우저 버전에서는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다.
|
notSupportedOutdatedDetail = 안타깝게도 사용중인 Firefox 버전에서는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다.
|
||||||
updateFirefox = Firefox 업데이트
|
updateFirefox = Firefox 업데이트
|
||||||
deletePopupCancel = 아니오
|
deletePopupCancel = 아니오
|
||||||
deleteButtonHover = 삭제
|
deleteButtonHover = 삭제
|
||||||
@@ -45,11 +45,11 @@ passwordSetError = 이 비밀번호를 설정할 수 없었습니다
|
|||||||
-send-short-brand = Send
|
-send-short-brand = Send
|
||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = 간단하고 안전한 파일 공유
|
introTitle = 간단하고, 사생활을 보호하는 파일 공유
|
||||||
introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다.
|
introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다.
|
||||||
notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다
|
notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다
|
||||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
archiveExpiryInfo = { $downloadCount }나 { $timespan } 후 만료됨
|
archiveExpiryInfo = { $downloadCount } 혹은 { $timespan } 후 만료됨
|
||||||
timespanMinutes =
|
timespanMinutes =
|
||||||
{ $num ->
|
{ $num ->
|
||||||
*[other] { $num }분
|
*[other] { $num }분
|
||||||
@@ -82,8 +82,59 @@ totalSize = 전체 크기: { $size }
|
|||||||
copyLinkDescription = 링크를 복사해서 파일을 공유하세요:
|
copyLinkDescription = 링크를 복사해서 파일을 공유하세요:
|
||||||
copyLinkButton = 링크 복사
|
copyLinkButton = 링크 복사
|
||||||
downloadTitle = 파일 다운로드
|
downloadTitle = 파일 다운로드
|
||||||
|
downloadDescription = 이 파일은 종단간 암호화 및 자동으로 만료되는 링크를 지원하는 { -send-brand }를 통해 공유되었습니다.
|
||||||
|
trySendDescription = 간단하고 안전한 파일 공유를 원하시나요? { -send-brand }를 사용해보세요.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
*[other] 한번에 { $count }개의 파일만 업로드 할 수 있습니다.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
*[other] { $count }개의 아카이브만 허용됩니다.
|
||||||
|
}
|
||||||
|
expiredTitle = 이 링크는 만료되었습니다.
|
||||||
|
notSupportedDescription = { -send-brand }는 이 브라우저와 작동하지 않습니다. { -send-short-brand }는 최신 { -firefox }와 가장 잘 작동하며, 대부분의 최신 웹 브라우저와도 잘 작동합니다.
|
||||||
downloadFirefox = 다운로드 { -firefox }
|
downloadFirefox = 다운로드 { -firefox }
|
||||||
|
legalTitle = { -send-short-brand } 개인정보 보호 공지
|
||||||
|
legalDateStamp = 버전 1.0, 2019년 3월 12일 출시됨
|
||||||
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
expiresDaysHoursMinutes = { $days }일 { $hours }시간 { $minutes }분
|
expiresDaysHoursMinutes = { $days }일 { $hours }시간 { $minutes }분
|
||||||
signInButton = 로그인/등록
|
addFilesButton = 업로드할 파일을 선택하세요
|
||||||
signOut = 로그 아웃
|
uploadButton = 업로드
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = 파일을 이곳에 드래그 엔 드롭하세요.
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = 또는 여기를 클릭하여 { $size }까지의 파일을 공유하세요.
|
||||||
|
addPassword = 비밀번호로 파일 보호
|
||||||
|
emailPlaceholder = 이메일 입력
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인
|
||||||
|
signInOnlyButton = 로그인
|
||||||
|
accountBenefitTitle = { -firefox } 계정을 하나 만들거나, 로그인
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = { $size }까지의 파일 공유
|
||||||
|
accountBenefitDownloadCount = 더 많은 사람들과 함께 파일 공유
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
*[other] 최대 { $count }일까지 링크 유지
|
||||||
|
}
|
||||||
|
accountBenefitSync = 어떤 기기에서든지 공유된 링크 관리
|
||||||
|
accountBenefitMoz = 더 많은 { -mozilla } 서비스에 대해 알아보기
|
||||||
|
signOut = 로그아웃
|
||||||
|
okButton = 확인
|
||||||
|
downloadingTitle = 다운로드 중
|
||||||
|
noStreamsWarning = 이 브라우저는 이렇게 큰 용량의 파일 암호화를 풀 수 없을 수도 있습니다.
|
||||||
|
noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사
|
||||||
|
noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요
|
||||||
|
noStreamsOptionDownload = 이 브라우저로 계속하기
|
||||||
|
downloadFirefoxPromo = 완전히 새로운 { -firefox }로 { -send-short-brand }가 제공됩니다.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = 파일 링크 공유:
|
||||||
|
shareLinkButton = 링크 공유
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = { -send-brand }으로 “{ $name }” 파일을 내려받으세요: 쉽고 안전한 파일 공유입니다.
|
||||||
|
trailheadPromo = 개인 정보를 보호하는 방법이 있습니다. 파이어폭스와 함께 하세요.
|
||||||
|
learnMore = 자세히 알아보기
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ addPassword = Apsaugoti slaptažodžiu
|
|||||||
emailPlaceholder = Įveskite savo el. pašto adresą
|
emailPlaceholder = Įveskite savo el. pašto adresą
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Prisijunkite, jeigu norite siųsti iki { $size }
|
signInSizeBump = Prisijunkite, jeigu norite siųsti iki { $size }
|
||||||
signInButton = Prisijungti / registruotis
|
signInOnlyButton = Prisijungti
|
||||||
accountBenefitTitle = Susikurkite „{ -firefox }“ paskyrą arba prisijunkite
|
accountBenefitTitle = Susikurkite „{ -firefox }“ paskyrą arba prisijunkite
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Dalinkitės iki { $size } dydžio failais
|
accountBenefitLargeFiles = Dalinkitės iki { $size } dydžio failais
|
||||||
@@ -162,3 +162,11 @@ noStreamsWarning = jūsų naršyklei gali nepavykti iššifruoti tokio didelio f
|
|||||||
noStreamsOptionCopy = Nukopijuokite saitą ir atverkite jį kita naršykle
|
noStreamsOptionCopy = Nukopijuokite saitą ir atverkite jį kita naršykle
|
||||||
noStreamsOptionFirefox = Išbandykite mūsų mėgstamiausią naršyklę
|
noStreamsOptionFirefox = Išbandykite mūsų mėgstamiausią naršyklę
|
||||||
noStreamsOptionDownload = Tęsti naudojantis šia naršykle
|
noStreamsOptionDownload = Tęsti naudojantis šia naršykle
|
||||||
|
downloadFirefoxPromo = „{ -send-short-brand }“ jums atkeliauja iš naujosios „{ -firefox }“.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Pasidalinkite saitu į jūsų failą:
|
||||||
|
shareLinkButton = Dalintis saitu
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Atsisiųskite „{ $name }“ su „{ -send-brand }“: paprastas, saugus dalinimasis failais
|
||||||
|
trailheadPromo = Yra būdas apsaugoti jūsų privatumą. Naudokite „Firefox“.
|
||||||
|
learnMore = Sužinoti daugiau.
|
||||||
|
|||||||
153
public/locales/ml/send.ftl
Normal file
153
public/locales/ml/send.ftl
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
# Firefox Send is a brand name and should not be localized.
|
||||||
|
title = ഫയർഫോക്സ് സെൻഡ്
|
||||||
|
siteFeedback = പ്രതികരണം
|
||||||
|
importingFile = ഇറക്കുമതി ചെയ്യുന്നു...
|
||||||
|
encryptingFile = എൻക്രിപ്റ്റ് ചെയ്യുന്നു...
|
||||||
|
decryptingFile = ഡീക്രിപ്റ്റ് ചെയ്യുന്നു...
|
||||||
|
downloadCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] ഒരു ഡൗൺലോഡ്
|
||||||
|
*[other] { $num } ഡൗൺലോഡുകൾ
|
||||||
|
}
|
||||||
|
timespanHours =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 മണിക്കൂർ
|
||||||
|
*[other] { $num } മണിക്കൂറുകൾ
|
||||||
|
}
|
||||||
|
copiedUrl = പകർത്തി!
|
||||||
|
unlockInputPlaceholder = രഹസ്യവാക്ക്
|
||||||
|
unlockButtonLabel = തുറക്കുക
|
||||||
|
downloadButtonLabel = ഡൗൺലോഡ്
|
||||||
|
downloadFinish = ഡൗൺലോഡ് പൂർത്തിയായി
|
||||||
|
fileSizeProgress = ({ $totalSize } -ന്റെ { $partialSize })
|
||||||
|
sendYourFilesLink = ഫയർഫോക്സ് സെൻഡ് പരീക്ഷിക്കൂ
|
||||||
|
errorPageHeader = എന്തോ പ്രശ്നമുണ്ട്!
|
||||||
|
fileTooBig = ഈ ഫയൽ വളരെ വലുതായതിനാൽ അപ്ലോഡ് ചെയ്യാൻ സാധിച്ചില്ല. പരമാവധി വലുപ്പം { $size } ആണ്.
|
||||||
|
linkExpiredAlt = കണ്ണി കാലഹരണപ്പെട്ടു
|
||||||
|
notSupportedHeader = താങ്കളുടെ ബ്രൗസറിന് പിന്തുണയില്ല.
|
||||||
|
notSupportedLink = എന്തുകൊണ്ടാണ് എന്റെ ബ്രൗസറിന് പിന്തുണയില്ലാത്തത്?
|
||||||
|
notSupportedOutdatedDetail = ദൗർഭാഗ്യവശാൽ ഫയർഫോക്സിന്റെ ഈ പതിപ്പ് ഫയർഫോക്സ് സെൻഡ് ഉപയോഗിക്കുന്ന വെബ് സാങ്കേതികവിദ്യ പിന്തുണയ്ക്കുന്നില്ല. താങ്കൾ താങ്കളുടെ ബ്രൗസർ പുതുക്കേണ്ടി വരും.
|
||||||
|
updateFirefox = ഫയർഫോക്സ് പുതുക്കൂ
|
||||||
|
deletePopupCancel = റദ്ദാക്കുക
|
||||||
|
deleteButtonHover = നീക്കം ചെയ്യുക
|
||||||
|
footerLinkLegal = നിയമസംബന്ധവിവരങ്ങൾ
|
||||||
|
footerLinkPrivacy = സ്വകാര്യത
|
||||||
|
footerLinkCookies = കുക്കികൾ
|
||||||
|
passwordTryAgain = രഹസ്യവാക്ക് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക.
|
||||||
|
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 the user enters a long password
|
||||||
|
maxPasswordLength = രഹസ്യവാക്കിന്റെ പരമാവധി നീളം: { $length }
|
||||||
|
# A short status message shown when there was an error setting the password
|
||||||
|
passwordSetError = ഈ രഹസ്യവാക്ക് ക്രമീകരിക്കാനായില്ല
|
||||||
|
|
||||||
|
## Send version 2 strings
|
||||||
|
|
||||||
|
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||||
|
-send-brand = ഫയർഫോക്സ് സെൻഡ്
|
||||||
|
-send-short-brand = സെൻഡ്
|
||||||
|
-firefox = ഫയർഫോക്സ്
|
||||||
|
-mozilla = മോസില്ല
|
||||||
|
introTitle = ലളിതവും സ്വകാര്യവുമായ ഫയൽ പങ്കിടൽ
|
||||||
|
introDescription = തനിയെ കാലഹരണപ്പെടുന്ന ലിങ്ക് ഉപയോഗിച്ച് തുടക്കം മുതല് അവസാനം വരെയുള്ള എന്ക്രിപ്ഷന് സാങ്കേതികതയോടെ ഫയലുകള് പങ്കിടാന് { -send-brand } ഉപയോഗിക്കാം. അത് കൊണ്ട് തന്നെ നിങ്ങള് പങ്കിടുന്നത് സ്വകാര്യമായി സൂക്ഷിക്കാനും അത് ഓണ്ലൈനില് എക്കാലവും കാണില്ലെന്ന് ഉറപ്പാക്കാനും പറ്റും.
|
||||||
|
notifyUploadEncryptDone = നിങ്ങളുടെ ഫയൽ എൻക്രിപ്റ്റ് ചെയ്തിരിക്കുന്നു, അയയ്ക്കാൻ തയ്യാറാണ്
|
||||||
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
|
archiveExpiryInfo = { $downloadCount } അല്ലെങ്കിൽ { $timespan } കഴിഞ്ഞാൽ കാലഹരണപ്പെടും
|
||||||
|
timespanMinutes =
|
||||||
|
{ $num ->
|
||||||
|
[one] മിനുട്ട്
|
||||||
|
*[other] { $num } മിനുട്ട്
|
||||||
|
}
|
||||||
|
timespanDays =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 ദിവസം
|
||||||
|
*[other] { $num } ദിവസം
|
||||||
|
}
|
||||||
|
timespanWeeks =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 ആഴ്ച
|
||||||
|
*[other] { $num } ആഴ്ച
|
||||||
|
}
|
||||||
|
fileCount =
|
||||||
|
{ $num ->
|
||||||
|
[one] 1 ഫയൽ
|
||||||
|
*[other] { $num } ഫയലുകൾ
|
||||||
|
}
|
||||||
|
# byte abbreviation
|
||||||
|
bytes = ബൈറ്റ്
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = കി.ബൈ
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = എംബി
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = ജിബി
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
totalSize = ആകെ വലിപ്പം: { $size }
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
copyLinkDescription = നിങ്ങളുടെ ഫയൽ പങ്കിടാനുള്ള ലിങ്ക് പകർത്തുക:
|
||||||
|
copyLinkButton = ലിങ്ക് പകർത്തുക
|
||||||
|
downloadTitle = ഫയലുകൾ ഡൗൺലോഡുചെയ്യുക
|
||||||
|
downloadDescription = ഈ ഫയൽ { -send-brand } ഉപയോഗിച്ച് എൻഡ്-ടു-എൻഡ് എൻക്രിപ്ഷനോടും തനിയെ കാലഹരണപ്പെടുന്ന ഒരു ലിങ്കോടും കൂടി പങ്കിട്ടതാണ്.
|
||||||
|
trySendDescription = ലളിതവും സുരക്ഷിതവുമായ ഫയൽ പങ്കിടലിനായി { -send-brand } പരീക്ഷിക്കുക.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] ഒരേസമയം 1 ഫയൽ മാത്രമേ അപ്ലോഡു ചെയ്യാൻ കഴിയൂ.
|
||||||
|
*[other] ഒരേസമയം { $count } ഫയലുകൾ മാത്രമേ അപ്ലോഡു ചെയ്യാൻ കഴിയൂ.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] ഒരു ആർക്കൈവ് മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ.
|
||||||
|
*[other] { $count } ആർക്കൈവുകൾ മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ.
|
||||||
|
}
|
||||||
|
expiredTitle = ഈ ലിങ്ക് കാലഹരണപ്പെട്ടു.
|
||||||
|
notSupportedDescription = ഈ ബ്രൌസറിൽ { -send-brand } പ്രവർത്തിക്കില്ല. { -send-short-brand } { -firefox }- ന്റെ ഏറ്റവും പുതിയ പതിപ്പിൽ വളരെ നന്നായി പ്രവർത്തിക്കുന്നു, കൂടാതെ മിക്ക ബ്രൌസറുകളുടെയും നിലവിലെ പതിപ്പിൽ പ്രവർത്തിക്കുകയും ചെയ്യും.
|
||||||
|
downloadFirefox = { -firefox } ഡൗണ്ലോഡ് ചെയ്യുക
|
||||||
|
legalTitle = { -send-short-brand } സ്വകാര്യതാ അറിയിപ്പ്
|
||||||
|
legalDateStamp = 2019 മാർച്ച് 12 തീയതിയിൽ പതിപ്പ് 1.0
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days } ദിവസം { $hours } മണിക്കൂർ { $minutes } മിനിറ്റ്
|
||||||
|
addFilesButton = അപ്ലോഡ് ചെയ്യാനുള്ള ഫയലുകൾ തിരഞ്ഞെടുക്കുക
|
||||||
|
uploadButton = അപ്ലോഡ്
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = ഫയലുകൾ വലിച്ചിടുക
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = അല്ലെങ്കിൽ { $size } വരെ അയയ്ക്കുന്നതിന് അമർത്തുക
|
||||||
|
addPassword = രഹസ്യവാക്ക് ഉപയോഗിച്ച് സംരക്ഷിക്കുക
|
||||||
|
emailPlaceholder = നിങ്ങളുടെ ഇമെയിൽ നൽകുക
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = { $size } വരെയുള്ള ഫയലുകൾ അയയ്ക്കുന്നതിന് പ്രവേശിക്കുക
|
||||||
|
signInOnlyButton = പ്രവേശിയ്ക്കുക
|
||||||
|
accountBenefitTitle = ഒരു { -firefox } അക്കൗണ്ട് സൃഷ്ടിക്കുക അല്ലെങ്കിൽ പ്രവേശിക്കുക
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = { $size } വരെയുള്ള ഫയലുകൾ പങ്കിടുക
|
||||||
|
accountBenefitDownloadCount = കൂടുതൽ ആളുകളുമായി ഫയലുകൾ പങ്കിടുക
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] ഒരു ദിവസം വരെ ലിങ്കുകൾ സജീവമായി നിലനിർത്തുക
|
||||||
|
*[other] { $count } ദിവസം വരെ ലിങ്കുകൾ സജീവമായി നിലനിർത്തുക
|
||||||
|
}
|
||||||
|
accountBenefitSync = ഏതൊരു ഉപകരണത്തിൽ നിന്നും പങ്കിട്ട ഫയലുകൾ കൈകാര്യം ചെയ്യുക
|
||||||
|
accountBenefitMoz = മറ്റ് { -mozilla } സേവനങ്ങളെക്കുറിച്ച് അറിയുക
|
||||||
|
signOut = പുറത്തിറങ്ങുക
|
||||||
|
okButton = ശരി
|
||||||
|
downloadingTitle = ഡൌണ്ലോഡ് ചെയ്യുന്നു
|
||||||
|
noStreamsWarning = ഇത്ര വലിയ ഫയൽ ബ്രൌസറില് ഡീക്രിപ്റ്റ് ചെയ്യാൻ കഴിഞ്ഞേക്കില്ല.
|
||||||
|
noStreamsOptionCopy = മറ്റൊരു ബ്രൗസറിൽ തുറക്കുന്നതിന് ലിങ്ക് പകർത്തുക
|
||||||
|
noStreamsOptionFirefox = ഞങ്ങളുടെ പ്രിയപ്പെട്ട ബ്രൗസർ പരീക്ഷിക്കുക
|
||||||
|
noStreamsOptionDownload = ഈ ബ്രൗസറിൽ തുടരുക
|
||||||
|
downloadFirefoxPromo = എറ്റവും പുതിയ { -firefox } { -send-short-brand } മുഖേന നിങ്ങൾക്ക് എത്തിച്ചിരിക്കുന്നു.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = നിങ്ങളുടെ ഫയലിനുള്ള കണ്ണി പങ്കിടുക:
|
||||||
|
shareLinkButton = കണ്ണി പങ്കിടുക
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = "{ -send-brand }" ഉപയോഗിച്ച് { $name } ഡൌൺലോഡ് ചെയ്യുക: ലളിതവും സുരക്ഷിതവുമായ ഫയൽ പങ്കിടൽ
|
||||||
@@ -54,6 +54,7 @@ passwordSetError = Dette passordet kunne ikke settes
|
|||||||
-firefox = Firefox
|
-firefox = Firefox
|
||||||
-mozilla = Mozilla
|
-mozilla = Mozilla
|
||||||
introTitle = Enkel, privat fildeling
|
introTitle = Enkel, privat fildeling
|
||||||
|
introDescription = { -send-brand } lar deg dele filer via en tidsbegrenset lenke med ende-til-ende-kryptering. På den måten kan du dele filer privat og samtidig være trygg på at filene dine ikke blir liggende på nettet for alltid.
|
||||||
notifyUploadEncryptDone = Filen din er kryptert og klar til å sende
|
notifyUploadEncryptDone = Filen din er kryptert og klar til å sende
|
||||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||||
archiveExpiryInfo = Utløper etter { $downloadCount } eller { $timespan }
|
archiveExpiryInfo = Utløper etter { $downloadCount } eller { $timespan }
|
||||||
@@ -77,9 +78,78 @@ fileCount =
|
|||||||
[one] 1 fil
|
[one] 1 fil
|
||||||
*[other] { $num } filer
|
*[other] { $num } filer
|
||||||
}
|
}
|
||||||
# size is a localized number followed by a unit of bytes, ex. 2.5GB
|
# byte abbreviation
|
||||||
|
bytes = B
|
||||||
|
# kibibyte abbreviation
|
||||||
|
kb = KB
|
||||||
|
# mebibyte abbreviation
|
||||||
|
mb = MB
|
||||||
|
# gibibyte abbreviation
|
||||||
|
gb = GB
|
||||||
|
# localized number and byte abbreviation. example "2.5MB"
|
||||||
|
fileSize = { $num }{ $units }
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
totalSize = Total størrelse: { $size }
|
totalSize = Total størrelse: { $size }
|
||||||
# the next line after the colon contains a file name
|
# the next line after the colon contains a file name
|
||||||
copyLinkDescription = Kopier lenken for å dele filen din:
|
copyLinkDescription = Kopier lenken for å dele filen din:
|
||||||
copyLinkButton = Kopier lenke
|
copyLinkButton = Kopier lenke
|
||||||
downloadTitle = Last ned filer
|
downloadTitle = Last ned filer
|
||||||
|
downloadDescription = Denne filen ble delt via { -send-brand } med ende-til-ende-kryptering og en lenke som automatisk utløper.
|
||||||
|
trySendDescription = Prøv { -send-brand } for enkel, sikker fildeling.
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyFiles =
|
||||||
|
{ $count ->
|
||||||
|
[one] Kun 1 fil kan lastes opp om gangen.
|
||||||
|
*[other] Kun { $count } filer kan lastes opp om gangen.
|
||||||
|
}
|
||||||
|
# count will always be > 10
|
||||||
|
tooManyArchives =
|
||||||
|
{ $count ->
|
||||||
|
[one] Kun 1 arkiv er tillatt.
|
||||||
|
*[other] Kun { $count } arkiver er tillatt.
|
||||||
|
}
|
||||||
|
expiredTitle = Denne lenken er utløpt.
|
||||||
|
notSupportedDescription = { -send-brand } virker ikke med denne nettleseren. { -send-short-brand } fungerer best med den nyeste versjonen av { -firefox }, og vil fungere med den nyeste versjonen av de fleste nettlesere.
|
||||||
|
downloadFirefox = Last ned { -firefox }
|
||||||
|
legalTitle = { -send-short-brand } Personvernerklæring
|
||||||
|
legalDateStamp = Versjon 1.0, datert den 12. mars 2019
|
||||||
|
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||||
|
expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m
|
||||||
|
addFilesButton = Velg filer du vil laste opp
|
||||||
|
uploadButton = Last opp
|
||||||
|
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
dragAndDropFiles = Dra og slipp filer
|
||||||
|
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
orClickWithSize = eller klikk for å sende filer på opptil { $size }
|
||||||
|
addPassword = Beskytt med passord
|
||||||
|
emailPlaceholder = Skriv inn e-postadressen din
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
signInSizeBump = Logg inn for å sende opptil { $size }
|
||||||
|
signInOnlyButton = Logg inn
|
||||||
|
accountBenefitTitle = Opprett en { -firefox }-konto eller logg inn
|
||||||
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
|
accountBenefitLargeFiles = Del filer på opptil { $size }
|
||||||
|
accountBenefitDownloadCount = Del filer med flere personer
|
||||||
|
accountBenefitTimeLimit =
|
||||||
|
{ $count ->
|
||||||
|
[one] Hold lenker aktiv opptil 1 dag
|
||||||
|
*[other] Hold lenker aktiv opptil { $count } dager
|
||||||
|
}
|
||||||
|
accountBenefitSync = Behandle delte filer fra en hvilken som helst enhet
|
||||||
|
accountBenefitMoz = Les om andre { -mozilla }-tjenester
|
||||||
|
signOut = Logg ut
|
||||||
|
okButton = OK
|
||||||
|
downloadingTitle = Laster ned
|
||||||
|
noStreamsWarning = Denne nettleseren kan kanskje ikke dekryptere en så stor fil.
|
||||||
|
noStreamsOptionCopy = Kopier lenken for å åpne den i en annen nettleser
|
||||||
|
noStreamsOptionFirefox = Prøv favorittnettleseren vår
|
||||||
|
noStreamsOptionDownload = Fortsett med denne nettleseren
|
||||||
|
downloadFirefoxPromo = { -send-short-brand } presenteres for deg av den helt nye { -firefox }.
|
||||||
|
# the next line after the colon contains a file name
|
||||||
|
shareLinkDescription = Del lenken til filen din:
|
||||||
|
shareLinkButton = Del lenke
|
||||||
|
# $name is the name of the file
|
||||||
|
shareMessage = Last ned ‹{ $name }› med { -send-brand }: enkel, trygg fildeling
|
||||||
|
trailheadPromo = Det finnes en måte å ta vare på personvernet ditt. Bruk Firefox.
|
||||||
|
learnMore = Les mer.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user