mirror of
https://gitlab.com/timvisee/send.git
synced 2025-12-07 14:40:55 +03:00
Compare commits
355 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2dd51c638 | ||
|
|
cdd98af86a | ||
|
|
883f2bc0f9 | ||
|
|
94f1eabbc7 | ||
|
|
902bc6628e | ||
|
|
460b741f17 | ||
|
|
d5c488196d | ||
|
|
9ad9c9feb2 | ||
|
|
6576e4a74c | ||
|
|
950872109e | ||
|
|
87051d27ed | ||
|
|
3451803b37 | ||
|
|
ac15153e8f | ||
|
|
924f5dc682 | ||
|
|
ff9be6a213 | ||
|
|
883728570e | ||
|
|
0435f17f9a | ||
|
|
1e1268fff0 | ||
|
|
252d7817e3 | ||
|
|
ce28c38ebe | ||
|
|
f0407f9beb | ||
|
|
c6f222eb57 | ||
|
|
6dd6135185 | ||
|
|
8df339b66d | ||
|
|
8702fda651 | ||
|
|
807ecff471 | ||
|
|
927c981cd7 | ||
|
|
7073cc8ce6 | ||
|
|
c925fae696 | ||
|
|
966d7a5e35 | ||
|
|
96c750c098 | ||
|
|
0729064753 | ||
|
|
259a5a5f24 | ||
|
|
27be72e0cd | ||
|
|
e4231bbc0f | ||
|
|
1d184f06bf | ||
|
|
f7b46a99ac | ||
|
|
3fadb489c7 | ||
|
|
6378676c2d | ||
|
|
014d84e4c7 | ||
|
|
a08d8435a9 | ||
|
|
40a05c9ecf | ||
|
|
527040afef | ||
|
|
a48a447808 | ||
|
|
f3569d7f98 | ||
|
|
6ca7d11efb | ||
|
|
b71ae4a0ff | ||
|
|
7ba25664b5 | ||
|
|
80fb42ad3d | ||
|
|
f036df5f47 | ||
|
|
20c063db7c | ||
|
|
a6b43c9eef | ||
|
|
c80f9ada65 | ||
|
|
e0ae5cb3c6 | ||
|
|
c0fb3d17be | ||
|
|
116f090b7e | ||
|
|
7cbd9716e2 | ||
|
|
58191975b9 | ||
|
|
76695aee5d | ||
|
|
b356b4cad3 | ||
|
|
63ddbeefc4 | ||
|
|
7b423b24b6 | ||
|
|
b67050b742 | ||
|
|
06242dfd38 | ||
|
|
3b8dbfd81c | ||
|
|
9c2fe39764 | ||
|
|
8b21d43bfa | ||
|
|
e7e39f4d4a | ||
|
|
e4c801d9a1 | ||
|
|
324f275dd4 | ||
|
|
594e0bd28e | ||
|
|
6a7fdfe780 | ||
|
|
0c82741b98 | ||
|
|
fe57734792 | ||
|
|
4754bed9b8 | ||
|
|
a60da467b9 | ||
|
|
362da2bbfc | ||
|
|
1a9ef4a246 | ||
|
|
f51dbbb8f5 | ||
|
|
e497107e59 | ||
|
|
10ad6fc1ae | ||
|
|
c982db4c75 | ||
|
|
cd8130563d | ||
|
|
730a569d43 | ||
|
|
769dae1bdc | ||
|
|
54a8c504ce | ||
|
|
92dc9a0f71 | ||
|
|
80a7c92056 | ||
|
|
c6ebea0100 | ||
|
|
039b5daaed | ||
|
|
4bf4e61c2c | ||
|
|
3c21e2a00f | ||
|
|
38a379d1de | ||
|
|
adeb19d974 | ||
|
|
744c410704 | ||
|
|
99ab3882eb | ||
|
|
7cdf566bcd | ||
|
|
b6e4877d93 | ||
|
|
b9c87fd779 | ||
|
|
6ef5b5133c | ||
|
|
b7d2420765 | ||
|
|
c139531c91 | ||
|
|
88fe3902bc | ||
|
|
645fd062ac | ||
|
|
ccb0b71df5 | ||
|
|
b8ec90a398 | ||
|
|
7ed5f37c66 | ||
|
|
c899129f9a | ||
|
|
1bb91690c5 | ||
|
|
073f6f67d3 | ||
|
|
533bfdb496 | ||
|
|
34de65d7d2 | ||
|
|
209fdf34f8 | ||
|
|
ba5c2a049d | ||
|
|
1528aa3f1b | ||
|
|
b1f1b9bd19 | ||
|
|
2963b2fc05 | ||
|
|
e4f9cfa023 | ||
|
|
09e961219d | ||
|
|
b36a5f6973 | ||
|
|
1a36dc084e | ||
|
|
c66347b3da | ||
|
|
a7d0551509 | ||
|
|
f6f6324aa1 | ||
|
|
a24597695b | ||
|
|
706ac638da | ||
|
|
d66d08f0ed | ||
|
|
ab9af7fd9b | ||
|
|
466a087689 | ||
|
|
71956739f8 | ||
|
|
62689b9556 | ||
|
|
7d1b8e002f | ||
|
|
8c535ce50d | ||
|
|
a3bdcd8478 | ||
|
|
1e77d86e8a | ||
|
|
1af01b1ee3 | ||
|
|
eb1bcde37f | ||
|
|
8def910d61 | ||
|
|
5892532d03 | ||
|
|
8ede5cf05c | ||
|
|
7213fef7c3 | ||
|
|
d3e9bb09df | ||
|
|
2682aec90d | ||
|
|
0ea89a58b0 | ||
|
|
2a2a3ad21f | ||
|
|
36c73bae7b | ||
|
|
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
|
||||
firefox
|
||||
coverage
|
||||
android/app/build
|
||||
app/locale.js
|
||||
app/capabilities.js
|
||||
@@ -4,6 +4,7 @@ env:
|
||||
|
||||
extends:
|
||||
- eslint:recommended
|
||||
- prettier
|
||||
- plugin:node/recommended
|
||||
- plugin:security/recommended
|
||||
|
||||
@@ -22,13 +23,5 @@ rules:
|
||||
security/detect-non-literal-fs-filename: off
|
||||
security/detect-object-injection: off
|
||||
|
||||
eol-last: [error, always]
|
||||
eqeqeq: error
|
||||
no-alert: warn
|
||||
no-console: warn
|
||||
no-path-concat: error
|
||||
no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}]
|
||||
no-var: error
|
||||
one-var: [error, never]
|
||||
prefer-const: error
|
||||
quotes: [error, single, {avoidEscape: true}]
|
||||
require-atomic-updates: warn
|
||||
|
||||
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
|
||||
Alexander Slovesnik
|
||||
Alfredos-Panagiotis Damkalis
|
||||
Aman Alam
|
||||
Amin Mahmudian
|
||||
Ander Elortondo
|
||||
Andreas Pettersson
|
||||
Anesu Chiodza
|
||||
Anika Dorn
|
||||
Anish Sheela
|
||||
Arash Mousavi
|
||||
Artem Polivanchuk
|
||||
Ashikur Rahman
|
||||
Ashok kumar
|
||||
Balasankar C
|
||||
Balázs Meskó
|
||||
Belayet Hossain
|
||||
Benjamin Forehand Jr
|
||||
@@ -20,8 +23,11 @@ Besnik Bleta
|
||||
Björn I
|
||||
Bjørn I
|
||||
Boopesh Mahendran
|
||||
Brahim Essaidi
|
||||
Brainlulz
|
||||
Breana Gonzales
|
||||
Christian Elbrianno
|
||||
Christoph Kührer
|
||||
Christopher Ramírez
|
||||
Chuck Harmston
|
||||
Cloney 173741
|
||||
@@ -31,6 +37,7 @@ Cynthia Pereira
|
||||
Daniel Thorn
|
||||
Daniela Arcese
|
||||
Danny Coates
|
||||
Davide
|
||||
Derek Tamsen
|
||||
Dhyey Thakore
|
||||
Donovan Preston
|
||||
@@ -52,11 +59,16 @@ Frederick Villaluna
|
||||
G12r
|
||||
Gabriela
|
||||
Gautam krishna.R
|
||||
George Raptis
|
||||
Georgianizator
|
||||
Gonçalo Matos
|
||||
Gwenn
|
||||
Hugo
|
||||
Hugo Abreu
|
||||
Hyeonseok Shin
|
||||
Håvar Henriksen
|
||||
Ian Neal
|
||||
ItielMaN
|
||||
Jae Hyeon Park
|
||||
Jakob Kappel
|
||||
Jakub Rychlý
|
||||
@@ -65,6 +77,8 @@ Jarmo
|
||||
Jim Spentzos
|
||||
Jiri Grönroos
|
||||
Jobava
|
||||
Joe Becher
|
||||
Joe ST
|
||||
Joergen
|
||||
Johann-S
|
||||
John Gruen
|
||||
@@ -81,9 +95,11 @@ Khaled Hosny
|
||||
Kim Ludvigsen
|
||||
Kohei Yoshino
|
||||
Lan Glad
|
||||
Lasse Liehu
|
||||
Laurent Jouanneau
|
||||
Lobodzets
|
||||
LuFlo
|
||||
Luis A. Sánchez
|
||||
Luiz Carlos de Morais
|
||||
Luna Jernberg
|
||||
Mahay Alam Khan
|
||||
@@ -106,14 +122,18 @@ Michal Vašíček
|
||||
Mikeyy
|
||||
Miro Rauhala
|
||||
Mozilla Pontoon
|
||||
Mozilla-GitHub-Standards
|
||||
Mozinet
|
||||
Moḥend Belqasem
|
||||
Muhend Belkacem
|
||||
Muḥend Belqasem
|
||||
Myungjae Won
|
||||
Nicholas Skinsacos
|
||||
Nihad
|
||||
Nihad Suljić
|
||||
Oscar
|
||||
Paulius
|
||||
Pedro Burlamaqui Bendahan
|
||||
Peter deHaan
|
||||
Pierre Neter
|
||||
Pin-guang Chen
|
||||
@@ -125,10 +145,12 @@ RickieES
|
||||
Rimas Kudelis
|
||||
Rizky Ariestiyansyah
|
||||
Rob Powell
|
||||
Robert
|
||||
Roberto Alvarado
|
||||
Rodrigo
|
||||
Rodrigo Guerra
|
||||
Rok Žerdin
|
||||
Romi Hardiyanto
|
||||
Rongjian Zhang
|
||||
Ruba
|
||||
Sahithi
|
||||
@@ -139,9 +161,12 @@ Sara Todaro
|
||||
Sav22999
|
||||
Schieck :)
|
||||
Selim Şumlu
|
||||
Sidak Singh Aulakh
|
||||
Slimane Amiri
|
||||
Slimane Selyan AMIRI
|
||||
Soumya Himanish Mohapatra
|
||||
Staś Małolepszy
|
||||
Suriyaa ✌️️
|
||||
Tema
|
||||
Thomas Dalichow
|
||||
Théo Chevalier
|
||||
@@ -150,6 +175,7 @@ Tim Visée
|
||||
Tomer Cohen
|
||||
Tomáš Zelina
|
||||
Ton
|
||||
Top
|
||||
Tymur Faradzhev
|
||||
Uccen Marzuq
|
||||
Varghese Thomas
|
||||
@@ -159,6 +185,7 @@ Vitaliy Krutko
|
||||
Weihang Lo
|
||||
Wil Clouser
|
||||
YFdyh000
|
||||
Yassine Aït-El-Mouden
|
||||
Yongmin H
|
||||
You-Wen Liang (Mark)
|
||||
aaaaalbert
|
||||
@@ -169,6 +196,7 @@ alex_mayorga
|
||||
ariestiyansyah
|
||||
avelper
|
||||
chilledfrogs
|
||||
clouserw-mozilla-owner
|
||||
dgadelha
|
||||
dskmori
|
||||
ehuggett
|
||||
@@ -180,25 +208,35 @@ gmontagu
|
||||
goofy
|
||||
hello
|
||||
hi
|
||||
ivan.pompa
|
||||
jesferman1993
|
||||
jlG
|
||||
josotrix
|
||||
jspam
|
||||
julenx
|
||||
kenrick95
|
||||
kumincir
|
||||
m4hdi.pdroid
|
||||
mail
|
||||
manxmensch
|
||||
marigalicer
|
||||
marsf
|
||||
merianosnikos
|
||||
mirzet.omerovic.1992
|
||||
mujeebcpy
|
||||
p.sanroman.bengoetxea
|
||||
passionforlife
|
||||
paul.trevor
|
||||
pyup.io bot
|
||||
ravmn
|
||||
rcmainak
|
||||
reza.habibi2008
|
||||
rgpublic
|
||||
risger
|
||||
robbp
|
||||
ruikunai
|
||||
savemore99.sm
|
||||
sergio
|
||||
shikhar-scs
|
||||
siparon
|
||||
skystar-p
|
||||
@@ -210,10 +248,13 @@ victor.gonzalezro
|
||||
xcffl
|
||||
ybouhamam
|
||||
yoshimitsu002
|
||||
yusup.ramdani
|
||||
Μιχάλης
|
||||
Марко Костић (Marko Kostić)
|
||||
Ратко Вујановић
|
||||
صفا الفليج
|
||||
వీవెన్
|
||||
ജോയ്സ്
|
||||
张无忌
|
||||
新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美
|
||||
莫非前世那一眼
|
||||
|
||||
@@ -10,6 +10,8 @@ USER app
|
||||
WORKDIR /app
|
||||
COPY --chown=app:app --from=builder /app .
|
||||
COPY --chown=app:app . .
|
||||
RUN mkdir -p /app/.config/configstore
|
||||
RUN ln -s dist/version.json version.json
|
||||
|
||||
ENV PORT=1443
|
||||
EXPOSE $PORT
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Firefox Send
|
||||
# [](https://send.firefox.com/)
|
||||
|
||||
[](https://circleci.com/gh/mozilla/send)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
* [Localization](#localization)
|
||||
* [Contributing](#contributing)
|
||||
* [Testing](#testing)
|
||||
* [Deployment](#deployment)
|
||||
* [Android](#android)
|
||||
* [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
|
||||
|
||||
The android implementation is contained in the `android` directory, and can be viewed locally for easy testing and editing by running `ANDROID=1 npm start` and then visiting <http://localhost:8080>. CSS and image files are located in the `android/app/src/main/assets` directory.
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
/* global window, navigator */
|
||||
import 'fluent-intl-polyfill';
|
||||
import 'intl-pluralrules';
|
||||
import choo from 'choo';
|
||||
import html from 'choo/html';
|
||||
import Raven from 'raven-js';
|
||||
import * as Sentry from '@sentry/browser';
|
||||
|
||||
import { setApiUrlPrefix, getConstants } from '../app/api';
|
||||
import metrics from '../app/metrics';
|
||||
@@ -19,6 +18,8 @@ import share from './pages/share';
|
||||
import preferences from './pages/preferences';
|
||||
import error from './pages/error';
|
||||
import { getTranslator } from '../app/locale';
|
||||
import { setTranslate } from '../app/utils';
|
||||
|
||||
import { delay } from '../app/utils';
|
||||
|
||||
if (navigator.userAgent === 'Send Android') {
|
||||
@@ -51,7 +52,7 @@ function body(main) {
|
||||
|
||||
const menu = html`<a
|
||||
id="hamburger"
|
||||
class="absolute pin-t pin-r z-50"
|
||||
class="absolute top-0 right-0 z-50"
|
||||
href="#"
|
||||
onclick="${clickPreferences}"
|
||||
>
|
||||
@@ -69,6 +70,7 @@ function body(main) {
|
||||
}
|
||||
(async function start() {
|
||||
const translate = await getTranslator('en-US');
|
||||
setTranslate(translate);
|
||||
const { LIMITS, DEFAULTS } = await getConstants();
|
||||
app.use(state => {
|
||||
state.LIMITS = LIMITS;
|
||||
@@ -80,7 +82,7 @@ function body(main) {
|
||||
state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS);
|
||||
state.storage = storage;
|
||||
state.user = new User(storage, LIMITS);
|
||||
state.raven = Raven;
|
||||
state.sentry = Sentry;
|
||||
});
|
||||
app.use(metrics);
|
||||
app.route('/', body(home));
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
|
||||
android {
|
||||
@@ -31,7 +29,7 @@ dependencies {
|
||||
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
||||
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') {
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
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.content.ComponentName
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.net.Uri
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebMessage
|
||||
import android.util.Log
|
||||
import android.os.Bundle
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.util.Base64
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.webkit.ConsoleMessage
|
||||
import android.webkit.JavascriptInterface
|
||||
import android.webkit.WebChromeClient
|
||||
import android.webkit.*
|
||||
import im.delight.android.webview.AdvancedWebView
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import mozilla.components.service.fxa.Config
|
||||
import mozilla.components.service.fxa.FirefoxAccount
|
||||
import mozilla.components.service.fxa.Profile
|
||||
import mozilla.components.service.fxa.FxaResult
|
||||
import org.json.JSONObject
|
||||
|
||||
internal class LoggingWebChromeClient : WebChromeClient() {
|
||||
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()))
|
||||
return true
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "CONTENT"
|
||||
}
|
||||
}
|
||||
|
||||
class WebAppInterface(private val mContext: MainActivity) {
|
||||
@JavascriptInterface
|
||||
fun beginOAuthFlow() {
|
||||
mContext.beginOAuthFlow();
|
||||
mContext.beginOAuthFlow()
|
||||
}
|
||||
|
||||
@JavascriptInterface
|
||||
@@ -43,176 +43,184 @@ class WebAppInterface(private val mContext: MainActivity) {
|
||||
}
|
||||
|
||||
class MainActivity : AppCompatActivity(), AdvancedWebView.Listener {
|
||||
private var mWebView: AdvancedWebView? = null
|
||||
|
||||
private var mToShare: String? = null
|
||||
private var mToCall: String? = null
|
||||
private var mAccount: FirefoxAccount? = null
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_main)
|
||||
|
||||
// https://developers.google.com/web/tools/chrome-devtools/remote-debugging/webviews
|
||||
// WebView.setWebContentsDebuggingEnabled(true); // TODO only dev builds
|
||||
WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG)
|
||||
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
|
||||
mWebView!!.setListener(this, this)
|
||||
mWebView!!.setWebChromeClient(LoggingWebChromeClient())
|
||||
mWebView!!.addJavascriptInterface(WebAppInterface(this), "Android")
|
||||
mWebView!!.setLayerType(View.LAYER_TYPE_HARDWARE, null);
|
||||
settings.apply {
|
||||
userAgentString = "Send Android"
|
||||
allowUniversalAccessFromFileURLs = true
|
||||
javaScriptEnabled = true
|
||||
}
|
||||
}
|
||||
|
||||
val webSettings = mWebView!!.getSettings()
|
||||
webSettings.setUserAgentString("Send Android")
|
||||
webSettings.setAllowUniversalAccessFromFileURLs(true)
|
||||
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 type = intent.type
|
||||
if (Intent.ACTION_SEND == intent.action && type != null) {
|
||||
if (type == "text/plain") {
|
||||
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()
|
||||
} else if (type.startsWith("image/")) {
|
||||
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()
|
||||
}
|
||||
}
|
||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
||||
|
||||
webView.loadUrl("file:///android_asset/android.html")
|
||||
}
|
||||
|
||||
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?.beginOAuthFlow(arrayOf("profile", "https://identity.mozilla.com/apps/send"), true)?.then(fun (url: String): FxaResult<Unit> {
|
||||
Log.w("CONFIG", "GOT A URL " + url)
|
||||
this@MainActivity.runOnUiThread({
|
||||
mWebView!!.loadUrl(url)
|
||||
})
|
||||
return FxaResult.fromValue(Unit)
|
||||
})
|
||||
Log.w("CONFIG", "CREATED FIREFOXACCOUNT")
|
||||
return FxaResult.fromValue(Unit)
|
||||
})
|
||||
mAccount?.beginOAuthFlow(arrayOf("profile", "https://identity.mozilla.com/apps/send"), true)
|
||||
?.then { url ->
|
||||
// Log.d(TAG_CONFIG, "GOT A URL $url")
|
||||
this@MainActivity.runOnUiThread {
|
||||
webView.loadUrl(url)
|
||||
}
|
||||
FxaResult.fromValue(Unit)
|
||||
}
|
||||
// Log.d(TAG_CONFIG, "CREATED FIREFOXACCOUNT")
|
||||
FxaResult.fromValue(Unit)
|
||||
}
|
||||
}
|
||||
|
||||
fun shareUrl(url: String) {
|
||||
val shareIntent = Intent()
|
||||
shareIntent.action = Intent.ACTION_SEND
|
||||
shareIntent.type = "text/plain"
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, url)
|
||||
val shareIntent = Intent().apply {
|
||||
action = Intent.ACTION_SEND
|
||||
type = "text/plain"
|
||||
putExtra(Intent.EXTRA_TEXT, url)
|
||||
}
|
||||
|
||||
val components = arrayOf(ComponentName(applicationContext, MainActivity::class.java))
|
||||
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)
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
mWebView!!.onResume()
|
||||
// ...
|
||||
webView.onResume()
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
override fun onPause() {
|
||||
mWebView!!.onPause()
|
||||
// ...
|
||||
webView.onPause()
|
||||
super.onPause()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
mWebView!!.onDestroy()
|
||||
// ...
|
||||
webView.onDestroy()
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, intent)
|
||||
mWebView!!.onActivityResult(requestCode, resultCode, intent)
|
||||
// ...
|
||||
webView.onActivityResult(requestCode, resultCode, intent)
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
if (!mWebView!!.onBackPressed()) {
|
||||
if (!webView.onBackPressed()) {
|
||||
return
|
||||
}
|
||||
// ...
|
||||
super.onBackPressed()
|
||||
}
|
||||
|
||||
override fun onPageStarted(url: String, favicon: Bitmap?) {
|
||||
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
|
||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
||||
webView.loadUrl("file:///android_asset/android.html")
|
||||
|
||||
val parsed = Uri.parse(url)
|
||||
val code = parsed.getQueryParameter("code")
|
||||
val state = parsed.getQueryParameter("state")
|
||||
|
||||
code?.let { code ->
|
||||
state?.let { state ->
|
||||
val uri = Uri.parse(url)
|
||||
uri.getQueryParameter("code")?.let { code ->
|
||||
uri.getQueryParameter("state")?.let { state ->
|
||||
mAccount?.completeOAuthFlow(code, state)?.whenComplete { info ->
|
||||
//displayAndPersistProfile(code, state)
|
||||
val profile = mAccount?.getProfile(false)?.then(fun (profile: Profile): FxaResult<Unit> {
|
||||
val accessToken = info.accessToken
|
||||
val keys = info.keys
|
||||
val avatar = profile.avatar
|
||||
val displayName = profile.displayName
|
||||
val email = profile.email
|
||||
val uid = profile.uid
|
||||
val toPass = "{\"accessToken\": \"${accessToken}\", \"keys\": '${keys}', \"avatar\": \"${avatar}\", \"displayName\": \"${displayName}\", \"email\": \"${email}\", \"uid\": \"${uid}\"}"
|
||||
mToCall = "finishLogin(${toPass})"
|
||||
this@MainActivity.runOnUiThread({
|
||||
mAccount?.getProfile(false)?.then { profile ->
|
||||
val profileJsonPayload = JSONObject()
|
||||
.put("accessToken", info.accessToken)
|
||||
.put("keys", info.keys)
|
||||
.put("avatar", profile.avatar)
|
||||
.put("displayName", profile.displayName)
|
||||
.put("email", profile.email)
|
||||
.put("uid", profile.uid).toString()
|
||||
mToCall = "finishLogin($profileJsonPayload)"
|
||||
this@MainActivity.runOnUiThread {
|
||||
// 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.
|
||||
mWebView!!.clearHistory()
|
||||
webView.clearHistory()
|
||||
|
||||
// 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.
|
||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
||||
})
|
||||
|
||||
|
||||
return FxaResult.fromValue(Unit)
|
||||
})
|
||||
webView.loadUrl("file:///android_asset/android.html")
|
||||
}
|
||||
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) {
|
||||
Log.w("MAIN", "onPageFinished")
|
||||
// Log.d(TAG_MAIN, "onPageFinished")
|
||||
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
|
||||
}
|
||||
if (mToCall != null) {
|
||||
this@MainActivity.runOnUiThread({
|
||||
mWebView?.evaluateJavascript(mToCall, fun (value: String) {
|
||||
this@MainActivity.runOnUiThread {
|
||||
webView.evaluateJavascript(mToCall) {
|
||||
mToCall = null
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
Log.w("MAIN", "onDownloadRequested")
|
||||
override fun onDownloadRequested(url: String,
|
||||
suggestedFilename: String,
|
||||
mimeType: String,
|
||||
contentLength: Long,
|
||||
contentDisposition: String,
|
||||
userAgent: String) {
|
||||
// Log.d(TAG_MAIN, "onDownloadRequested")
|
||||
}
|
||||
|
||||
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"?>
|
||||
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
<im.delight.android.webview.AdvancedWebView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/webView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
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>
|
||||
tools:context=".MainActivity" />
|
||||
@@ -8,20 +8,15 @@ buildscript {
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.3.1'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.20"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
classpath 'com.android.tools.build:gradle:3.3.2'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21"
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
maven {
|
||||
url "https://maven.mozilla.org/maven2"
|
||||
}
|
||||
maven { url "https://maven.mozilla.org/maven2" }
|
||||
jcenter()
|
||||
maven { url "https://jitpack.io" }
|
||||
}
|
||||
|
||||
@@ -42,11 +42,7 @@ module.exports = function(state, emit) {
|
||||
content =
|
||||
archives.length < 1
|
||||
? intro(state)
|
||||
: list(
|
||||
archives,
|
||||
'list-reset h-full overflow-y-auto w-full',
|
||||
'mb-3 w-full'
|
||||
);
|
||||
: list(archives, 'h-full overflow-y-auto w-full', 'mb-3 w-full');
|
||||
}
|
||||
|
||||
return html`
|
||||
@@ -57,7 +53,7 @@ module.exports = function(state, emit) {
|
||||
>
|
||||
${content}
|
||||
</section>
|
||||
<div class="fixed pin-r pin-b z-20">
|
||||
<div class="fixed right-0 bottom-0 z-20">
|
||||
${button}
|
||||
<input
|
||||
id="file-upload"
|
||||
|
||||
@@ -12,7 +12,7 @@ export default function initialState(state, emitter) {
|
||||
getAsset(name) {
|
||||
return `${state.prefix}/${name}`;
|
||||
},
|
||||
raven: {
|
||||
sentry: {
|
||||
captureException: e => {
|
||||
console.error('ERROR ' + e + ' ' + e.stack);
|
||||
}
|
||||
|
||||
78
app/api.js
78
app/api.js
@@ -11,6 +11,15 @@ if (!fileProtocolWssUrl) {
|
||||
fileProtocolWssUrl = 'wss://send.firefox.com/api/ws';
|
||||
}
|
||||
|
||||
export class ConnectionError extends Error {
|
||||
constructor(cancelled, duration, size) {
|
||||
super(cancelled ? '0' : 'connection closed');
|
||||
this.cancelled = cancelled;
|
||||
this.duration = duration;
|
||||
this.size = size;
|
||||
}
|
||||
}
|
||||
|
||||
export function setFileProtocolWssUrl(url) {
|
||||
localStorage && localStorage.setItem('wssURL', url);
|
||||
fileProtocolWssUrl = url;
|
||||
@@ -137,17 +146,25 @@ export async function setPassword(id, owner_token, keychain) {
|
||||
}
|
||||
|
||||
function asyncInitWebSocket(server) {
|
||||
return new Promise(resolve => {
|
||||
const ws = new WebSocket(server);
|
||||
ws.onopen = () => {
|
||||
resolve(ws);
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
const ws = new WebSocket(server);
|
||||
ws.addEventListener('open', () => resolve(ws), { once: true });
|
||||
} catch (e) {
|
||||
reject(new ConnectionError(false));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function listenForResponse(ws, canceller) {
|
||||
return new Promise((resolve, reject) => {
|
||||
function handleClose(event) {
|
||||
// a 'close' event before a 'message' event means the request failed
|
||||
ws.removeEventListener('message', handleMessage);
|
||||
reject(new ConnectionError(canceller.cancelled));
|
||||
}
|
||||
function handleMessage(msg) {
|
||||
ws.removeEventListener('close', handleClose);
|
||||
try {
|
||||
const response = JSON.parse(msg.data);
|
||||
if (response.error) {
|
||||
@@ -156,13 +173,11 @@ function listenForResponse(ws, canceller) {
|
||||
resolve(response);
|
||||
}
|
||||
} catch (e) {
|
||||
ws.close();
|
||||
canceller.cancelled = true;
|
||||
canceller.error = e;
|
||||
reject(e);
|
||||
}
|
||||
}
|
||||
ws.addEventListener('message', handleMessage, { once: true });
|
||||
ws.addEventListener('close', handleClose, { once: true });
|
||||
});
|
||||
}
|
||||
|
||||
@@ -176,6 +191,8 @@ async function upload(
|
||||
onprogress,
|
||||
canceller
|
||||
) {
|
||||
let size = 0;
|
||||
const start = Date.now();
|
||||
const host = window.location.hostname;
|
||||
const port = window.location.port;
|
||||
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||
@@ -203,31 +220,41 @@ async function upload(
|
||||
|
||||
const reader = stream.getReader();
|
||||
let state = await reader.read();
|
||||
let size = 0;
|
||||
while (!state.done) {
|
||||
const buf = state.value;
|
||||
if (canceller.cancelled) {
|
||||
throw canceller.error;
|
||||
ws.close();
|
||||
}
|
||||
|
||||
if (ws.readyState !== WebSocket.OPEN) {
|
||||
break;
|
||||
}
|
||||
const buf = state.value;
|
||||
ws.send(buf);
|
||||
|
||||
onprogress(size);
|
||||
size += buf.length;
|
||||
state = await reader.read();
|
||||
while (ws.bufferedAmount > ECE_RECORD_SIZE * 2) {
|
||||
while (
|
||||
ws.bufferedAmount > ECE_RECORD_SIZE * 2 &&
|
||||
ws.readyState === WebSocket.OPEN &&
|
||||
!canceller.cancelled
|
||||
) {
|
||||
await delay();
|
||||
}
|
||||
}
|
||||
const footer = new Uint8Array([0]);
|
||||
ws.send(footer);
|
||||
if (ws.readyState === WebSocket.OPEN) {
|
||||
ws.send(new Uint8Array([0])); //EOF
|
||||
}
|
||||
|
||||
await completedResponse;
|
||||
ws.close();
|
||||
uploadInfo.duration = Date.now() - start;
|
||||
return uploadInfo;
|
||||
} catch (e) {
|
||||
ws.close(4000);
|
||||
e.size = size;
|
||||
e.duration = Date.now() - start;
|
||||
throw e;
|
||||
} finally {
|
||||
if (![WebSocket.CLOSED, WebSocket.CLOSING].includes(ws.readyState)) {
|
||||
ws.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,7 +271,6 @@ export function uploadWs(
|
||||
|
||||
return {
|
||||
cancel: function() {
|
||||
canceller.error = new Error(0);
|
||||
canceller.cancelled = true;
|
||||
},
|
||||
|
||||
@@ -284,7 +310,7 @@ async function downloadS(id, keychain, signal) {
|
||||
return response.body;
|
||||
}
|
||||
|
||||
async function tryDownloadStream(id, keychain, signal, tries = 1) {
|
||||
async function tryDownloadStream(id, keychain, signal, tries = 2) {
|
||||
try {
|
||||
const result = await downloadS(id, keychain, signal);
|
||||
return result;
|
||||
@@ -306,18 +332,19 @@ export function downloadStream(id, keychain) {
|
||||
}
|
||||
return {
|
||||
cancel,
|
||||
result: tryDownloadStream(id, keychain, controller.signal, 2)
|
||||
result: tryDownloadStream(id, keychain, controller.signal)
|
||||
};
|
||||
}
|
||||
|
||||
//////////////////
|
||||
|
||||
function download(id, keychain, onprogress, canceller) {
|
||||
async function download(id, keychain, onprogress, canceller) {
|
||||
const auth = await keychain.authHeader();
|
||||
const xhr = new XMLHttpRequest();
|
||||
canceller.oncancel = function() {
|
||||
xhr.abort();
|
||||
};
|
||||
return new Promise(async function(resolve, reject) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
xhr.addEventListener('loadend', function() {
|
||||
canceller.oncancel = function() {};
|
||||
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
|
||||
@@ -337,7 +364,6 @@ function download(id, keychain, onprogress, canceller) {
|
||||
onprogress(event.loaded);
|
||||
}
|
||||
});
|
||||
const auth = await keychain.authHeader();
|
||||
xhr.open('get', getApiUrl(`/api/download/blob/${id}`));
|
||||
xhr.setRequestHeader('Authorization', auth);
|
||||
xhr.responseType = 'blob';
|
||||
@@ -346,7 +372,7 @@ function download(id, keychain, onprogress, canceller) {
|
||||
});
|
||||
}
|
||||
|
||||
async function tryDownload(id, keychain, onprogress, canceller, tries = 1) {
|
||||
async function tryDownload(id, keychain, onprogress, canceller, tries = 2) {
|
||||
try {
|
||||
const result = await download(id, keychain, onprogress, canceller);
|
||||
return result;
|
||||
@@ -367,7 +393,7 @@ export function downloadFile(id, keychain, onprogress) {
|
||||
}
|
||||
return {
|
||||
cancel,
|
||||
result: tryDownload(id, keychain, onprogress, canceller, 2)
|
||||
result: tryDownload(id, keychain, onprogress, canceller)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* global AUTH_CONFIG LOCALE */
|
||||
import { browserName } from './utils';
|
||||
/* global AUTH_CONFIG */
|
||||
import { browserName, locale } from './utils';
|
||||
|
||||
async function checkCrypto() {
|
||||
try {
|
||||
@@ -76,8 +76,8 @@ async function polyfillStreams() {
|
||||
}
|
||||
|
||||
export default async function getCapabilities() {
|
||||
const serviceWorker =
|
||||
'serviceWorker' in navigator && browserName() !== 'edge';
|
||||
const browser = browserName();
|
||||
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
|
||||
let crypto = await checkCrypto();
|
||||
const nativeStreams = checkStreams();
|
||||
let polyStreams = false;
|
||||
@@ -91,19 +91,22 @@ export default async function getCapabilities() {
|
||||
account = false;
|
||||
}
|
||||
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 =
|
||||
window.matchMedia('(display-mode: standalone)').matches ||
|
||||
navigator.standalone;
|
||||
|
||||
const mobileFirefox =
|
||||
browser === 'firefox' && /mobile/i.test(navigator.userAgent);
|
||||
|
||||
return {
|
||||
account,
|
||||
crypto,
|
||||
serviceWorker,
|
||||
streamUpload: nativeStreams || polyStreams,
|
||||
streamDownload:
|
||||
nativeStreams && serviceWorker && browserName() !== 'safari',
|
||||
nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox,
|
||||
multifile: nativeStreams || polyStreams,
|
||||
share,
|
||||
standalone
|
||||
|
||||
@@ -2,11 +2,12 @@ import FileSender from './fileSender';
|
||||
import FileReceiver from './fileReceiver';
|
||||
import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils';
|
||||
import * as metrics from './metrics';
|
||||
import { bytes } from './utils';
|
||||
import { bytes, locale } from './utils';
|
||||
import okDialog from './ui/okDialog';
|
||||
import copyDialog from './ui/copyDialog';
|
||||
import shareDialog from './ui/shareDialog';
|
||||
import signupDialog from './ui/signupDialog';
|
||||
import surveyDialog from './ui/surveyDialog';
|
||||
|
||||
export default function(state, emitter) {
|
||||
let lastRender = 0;
|
||||
@@ -75,7 +76,7 @@ export default function(state, emitter) {
|
||||
state.storage.remove(ownedFile.id);
|
||||
await ownedFile.del();
|
||||
} catch (e) {
|
||||
state.raven.captureException(e);
|
||||
state.sentry.captureException(e);
|
||||
}
|
||||
render();
|
||||
});
|
||||
@@ -175,14 +176,17 @@ export default function(state, emitter) {
|
||||
} catch (err) {
|
||||
if (err.message === '0') {
|
||||
//cancelled. do nothing
|
||||
const duration = Date.now() - start;
|
||||
metrics.cancelledUpload(archive, duration);
|
||||
metrics.cancelledUpload(archive, err.duration);
|
||||
render();
|
||||
} else {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(err);
|
||||
state.raven.captureException(err);
|
||||
metrics.stoppedUpload(archive);
|
||||
state.sentry.withScope(scope => {
|
||||
scope.setExtra('duration', err.duration);
|
||||
scope.setExtra('size', err.size);
|
||||
state.sentry.captureException(err);
|
||||
});
|
||||
metrics.stoppedUpload(archive, err.duration);
|
||||
emitter.emit('pushState', '/error');
|
||||
}
|
||||
} finally {
|
||||
@@ -261,7 +265,12 @@ export default function(state, emitter) {
|
||||
state.transfer = null;
|
||||
const location = err.message === '404' ? '/404' : '/error';
|
||||
if (location === '/error') {
|
||||
state.raven.captureException(err);
|
||||
state.sentry.withScope(scope => {
|
||||
scope.setExtra('duration', err.duration);
|
||||
scope.setExtra('size', err.size);
|
||||
scope.setExtra('progress', err.progress);
|
||||
state.sentry.captureException(err);
|
||||
});
|
||||
const duration = Date.now() - start;
|
||||
metrics.stoppedDownload({
|
||||
size,
|
||||
@@ -281,6 +290,22 @@ export default function(state, emitter) {
|
||||
// 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(() => {
|
||||
// poll for updates of the upload list
|
||||
if (!state.modal && state.route === '/') {
|
||||
|
||||
@@ -1,6 +1,22 @@
|
||||
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
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
@@ -25,23 +41,12 @@ export default function initialize(state, emitter) {
|
||||
xp.run(+state.query.v, state, emitter);
|
||||
}
|
||||
});
|
||||
|
||||
if (!state.storage.get('testpilot_ga__cid')) {
|
||||
// first ever visit. check again after cid is assigned.
|
||||
emitter.on('DOMContentLoaded', () => {
|
||||
checkExperiments(state, emitter);
|
||||
});
|
||||
const enrolled = state.storage.enrolled;
|
||||
// single experiment per session for now
|
||||
const id = Object.keys(enrolled)[0];
|
||||
if (Object.keys(experiments).includes(id)) {
|
||||
experiments[id].run(enrolled[id], state, emitter);
|
||||
} else {
|
||||
const enrolled = state.storage.enrolled.filter(([id, variant]) => {
|
||||
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);
|
||||
}
|
||||
checkExperiments(state, emitter);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,6 +112,7 @@ export default class FileReceiver extends Nanobus {
|
||||
}
|
||||
|
||||
async downloadStream(noSave = false) {
|
||||
const start = Date.now();
|
||||
const onprogress = p => {
|
||||
this.progress = [p, this.fileInfo.size];
|
||||
this.emit('progress');
|
||||
@@ -153,9 +154,7 @@ export default class FileReceiver extends Nanobus {
|
||||
const downloadPath = `/api/download/${this.fileInfo.id}`;
|
||||
let downloadUrl = getApiUrl(downloadPath);
|
||||
if (downloadUrl === downloadPath) {
|
||||
downloadUrl = `${location.protocol}//${location.host}/api/download/${
|
||||
this.fileInfo.id
|
||||
}`;
|
||||
downloadUrl = `${location.protocol}//${location.host}${downloadPath}`;
|
||||
}
|
||||
const a = document.createElement('a');
|
||||
a.href = downloadUrl;
|
||||
@@ -164,11 +163,29 @@ export default class FileReceiver extends Nanobus {
|
||||
}
|
||||
|
||||
let prog = 0;
|
||||
let hangs = 0;
|
||||
while (prog < this.fileInfo.size) {
|
||||
const msg = await this.sendMessageToSw({
|
||||
request: 'progress',
|
||||
id: this.fileInfo.id
|
||||
});
|
||||
if (msg.progress === prog) {
|
||||
hangs++;
|
||||
} else {
|
||||
hangs = 0;
|
||||
}
|
||||
if (hangs > 30) {
|
||||
// TODO: On Chrome we don't get a cancel
|
||||
// signal so one is indistinguishable from
|
||||
// a hang. We may be able to detect
|
||||
// which end is hung in the service worker
|
||||
// to improve on this.
|
||||
const e = new Error('hung download');
|
||||
e.duration = Date.now() - start;
|
||||
e.size = this.fileInfo.size;
|
||||
e.progress = prog;
|
||||
throw e;
|
||||
}
|
||||
prog = msg.progress;
|
||||
onprogress(prog);
|
||||
await delay(1000);
|
||||
|
||||
@@ -44,7 +44,6 @@ export default class FileSender extends Nanobus {
|
||||
}
|
||||
|
||||
async upload(archive, bearerToken) {
|
||||
const start = Date.now();
|
||||
if (this.cancelled) {
|
||||
throw new Error(0);
|
||||
}
|
||||
@@ -76,7 +75,6 @@ export default class FileSender extends Nanobus {
|
||||
this.emit('progress'); // HACK to kick MS Edge
|
||||
try {
|
||||
const result = await this.uploadRequest.result;
|
||||
const time = Date.now() - start;
|
||||
this.msg = 'notifyUploadEncryptDone';
|
||||
this.uploadRequest = null;
|
||||
this.progress = [1, 1];
|
||||
@@ -87,8 +85,8 @@ export default class FileSender extends Nanobus {
|
||||
name: archive.name,
|
||||
size: archive.size,
|
||||
manifest: archive.manifest,
|
||||
time: time,
|
||||
speed: archive.size / (time / 1000),
|
||||
time: result.duration,
|
||||
speed: archive.size / (result.duration / 1000),
|
||||
createdAt: Date.now(),
|
||||
expiresAt: Date.now() + archive.timeLimit * 1000,
|
||||
secretKey: secretKey,
|
||||
|
||||
@@ -18,23 +18,6 @@ export default class Keychain {
|
||||
false,
|
||||
['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) {
|
||||
return crypto.subtle.deriveKey(
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { FluentBundle } from 'fluent';
|
||||
import { FluentBundle } from '@fluent/bundle';
|
||||
|
||||
function makeBundle(locale, ftl) {
|
||||
const bundle = new FluentBundle(locale, { useIsolating: false });
|
||||
@@ -10,9 +10,9 @@ export async function getTranslator(locale) {
|
||||
const bundles = [];
|
||||
const { default: en } = await import('../public/locales/en-US/send.ftl');
|
||||
if (locale !== 'en-US') {
|
||||
const {
|
||||
default: ftl
|
||||
} = await import(`../public/locales/${locale}/send.ftl`);
|
||||
const { default: ftl } = await import(
|
||||
`../public/locales/${locale}/send.ftl`
|
||||
);
|
||||
bundles.push(makeBundle(locale, ftl));
|
||||
}
|
||||
bundles.push(makeBundle('en-US', en));
|
||||
|
||||
100
app/main.css
100
app/main.css
@@ -1,4 +1,9 @@
|
||||
@tailwind preflight;
|
||||
@tailwind base;
|
||||
|
||||
html {
|
||||
line-height: 1.15;
|
||||
}
|
||||
|
||||
@tailwind components;
|
||||
|
||||
:not(input) {
|
||||
@@ -8,6 +13,14 @@
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
:root {
|
||||
--violet-gradient: linear-gradient(
|
||||
-180deg,
|
||||
rgba(144, 89, 255, 0.8) 0%,
|
||||
rgba(144, 89, 255, 0.4) 100%
|
||||
);
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
@@ -31,6 +44,7 @@ body {
|
||||
@apply cursor-pointer;
|
||||
@apply py-4;
|
||||
@apply px-6;
|
||||
@apply font-semibold;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
@@ -139,6 +153,11 @@ footer li:hover {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.main-header img {
|
||||
height: 32px;
|
||||
width: 170px;
|
||||
}
|
||||
|
||||
.intro {
|
||||
max-width: 100%;
|
||||
height: unset;
|
||||
@@ -159,7 +178,7 @@ footer li:hover {
|
||||
.mozilla-logo {
|
||||
background-image: url('../assets/mozilla-logo.svg');
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100px, 32px;
|
||||
background-size: 100px, 48px;
|
||||
overflow: hidden;
|
||||
text-indent: 120%;
|
||||
white-space: nowrap;
|
||||
@@ -246,6 +265,11 @@ select {
|
||||
}
|
||||
|
||||
@screen md {
|
||||
.main-header img {
|
||||
height: 48px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.intro {
|
||||
max-width: unset;
|
||||
height: unset;
|
||||
@@ -261,7 +285,7 @@ select {
|
||||
@apply py-8;
|
||||
|
||||
min-height: 36rem;
|
||||
max-height: 40rem;
|
||||
max-height: 42rem;
|
||||
width: calc(100% - 3rem);
|
||||
}
|
||||
}
|
||||
@@ -274,8 +298,9 @@ select {
|
||||
}
|
||||
|
||||
.shadow-big {
|
||||
box-shadow: 0 0 32px 0 rgba(12, 12, 13, 0.1),
|
||||
0 2px 16px 0 rgba(12, 12, 13, 0.05);
|
||||
box-shadow: 0 12px 18px 2px rgba(34, 0, 51, 0.04),
|
||||
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: 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 'fast-text-encoding'; // MS Edge support
|
||||
import 'fluent-intl-polyfill';
|
||||
import 'intl-pluralrules';
|
||||
import choo from 'choo';
|
||||
import nanotiming from 'nanotiming';
|
||||
import routes from './routes';
|
||||
@@ -12,15 +12,15 @@ import pasteManager from './pasteManager';
|
||||
import storage from './storage';
|
||||
import metrics from './metrics';
|
||||
import experiments from './experiments';
|
||||
import Raven from 'raven-js';
|
||||
import * as Sentry from '@sentry/browser';
|
||||
import './main.css';
|
||||
import User from './user';
|
||||
import { getTranslator } from './locale';
|
||||
import Archive from './archive';
|
||||
import { setTranslate } from './utils';
|
||||
import { setTranslate, locale } from './utils';
|
||||
|
||||
if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) {
|
||||
Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install();
|
||||
if (navigator.doNotTrack !== '1' && window.SENTRY_CONFIG) {
|
||||
Sentry.init(window.SENTRY_CONFIG);
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
@@ -45,27 +45,30 @@ if (process.env.NODE_ENV === 'production') {
|
||||
}
|
||||
}
|
||||
|
||||
const translate = await getTranslator(LOCALE);
|
||||
const translate = await getTranslator(locale());
|
||||
setTranslate(translate);
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
window.initialState = {
|
||||
LIMITS,
|
||||
DEFAULTS,
|
||||
PREFS,
|
||||
archive: new Archive([], DEFAULTS.EXPIRE_SECONDS),
|
||||
capabilities,
|
||||
translate,
|
||||
storage,
|
||||
raven: Raven,
|
||||
sentry: Sentry,
|
||||
user: new User(storage, LIMITS, window.AUTH_CONFIG),
|
||||
transfer: null,
|
||||
fileInfo: null
|
||||
};
|
||||
|
||||
const app = routes(choo());
|
||||
const app = routes(choo({ hash: true }));
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
window.app = app;
|
||||
app.use(experiments);
|
||||
app.use(metrics);
|
||||
app.use(controller);
|
||||
app.use(dragManager);
|
||||
app.use(experiments);
|
||||
app.use(pasteManager);
|
||||
app.mount('body');
|
||||
})();
|
||||
|
||||
@@ -1,21 +1,23 @@
|
||||
import storage from './storage';
|
||||
import { platform } from './utils';
|
||||
import { platform, locale } from './utils';
|
||||
import { sendMetrics } from './api';
|
||||
|
||||
let appState = null;
|
||||
// let experiment = null;
|
||||
let experiment = null;
|
||||
const HOUR = 1000 * 60 * 60;
|
||||
const events = [];
|
||||
let session_id = Date.now();
|
||||
const lang = document.querySelector('html').lang;
|
||||
const lang = locale();
|
||||
|
||||
export default function initialize(state, emitter) {
|
||||
appState = state;
|
||||
if (!appState.user.firstAction) {
|
||||
appState.user.firstAction = appState.route === '/' ? 'upload' : 'download';
|
||||
}
|
||||
|
||||
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;
|
||||
addEvent('client_visit', {
|
||||
entrypoint: appState.route === '/' ? 'upload' : 'download',
|
||||
@@ -59,6 +61,11 @@ function submitEvents() {
|
||||
async function addEvent(event_type, event_properties) {
|
||||
const user_id = await appState.user.metricId();
|
||||
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({
|
||||
device_id,
|
||||
event_properties,
|
||||
@@ -100,9 +107,10 @@ function completedUpload(archive, duration) {
|
||||
});
|
||||
}
|
||||
|
||||
function stoppedUpload(archive) {
|
||||
function stoppedUpload(archive, duration = 0) {
|
||||
return addEvent('client_upload', {
|
||||
download_limit: archive.dlimit,
|
||||
duration: sizeOrder(duration),
|
||||
file_count: archive.numFiles,
|
||||
password_protected: !!archive.password,
|
||||
size: sizeOrder(archive.size),
|
||||
|
||||
@@ -2,7 +2,7 @@ const choo = require('choo');
|
||||
const download = require('./ui/download');
|
||||
const body = require('./ui/body');
|
||||
|
||||
module.exports = function(app = choo()) {
|
||||
module.exports = function(app = choo({ hash: true })) {
|
||||
app.route('/', body(require('./ui/home')));
|
||||
app.route('/download/:id', body(download));
|
||||
app.route('/download/:id/:key', body(download));
|
||||
@@ -13,6 +13,7 @@ module.exports = function(app = choo()) {
|
||||
app.route('/oauth', function(state, emit) {
|
||||
emit('authenticate', state.query.code, state.query.state);
|
||||
});
|
||||
app.route('/login', body(require('./ui/home')));
|
||||
app.route('*', body(require('./ui/notFound')));
|
||||
return app;
|
||||
};
|
||||
|
||||
@@ -11,13 +11,14 @@ const map = new Map();
|
||||
const IMAGES = /.*\.(png|svg|jpg)$/;
|
||||
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/;
|
||||
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
||||
const FONT = /\.woff2?$/;
|
||||
|
||||
self.addEventListener('install', event => {
|
||||
event.waitUntil(precache());
|
||||
self.addEventListener('install', () => {
|
||||
self.skipWaiting();
|
||||
});
|
||||
|
||||
self.addEventListener('activate', event => {
|
||||
event.waitUntil(self.clients.claim());
|
||||
event.waitUntil(self.clients.claim().then(precache));
|
||||
});
|
||||
|
||||
async function decryptStream(id) {
|
||||
@@ -83,16 +84,28 @@ async function decryptStream(id) {
|
||||
}
|
||||
|
||||
async function precache() {
|
||||
try {
|
||||
await cleanCache();
|
||||
const cache = await caches.open(version);
|
||||
const images = assets.match(IMAGES);
|
||||
await cache.addAll(images);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
// cache will get populated on demand
|
||||
}
|
||||
}
|
||||
|
||||
async function cleanCache() {
|
||||
const oldCaches = await caches.keys();
|
||||
for (const c of oldCaches) {
|
||||
if (c !== version) {
|
||||
await caches.delete(c);
|
||||
}
|
||||
}
|
||||
const cache = await caches.open(version);
|
||||
const images = assets.match(IMAGES);
|
||||
await cache.addAll(images);
|
||||
return self.skipWaiting();
|
||||
}
|
||||
|
||||
function cacheable(url) {
|
||||
return VERSIONED_ASSET.test(url) || FONT.test(url);
|
||||
}
|
||||
|
||||
async function cachedOrFetched(req) {
|
||||
@@ -102,7 +115,7 @@ async function cachedOrFetched(req) {
|
||||
return cached;
|
||||
}
|
||||
const fetched = await fetch(req);
|
||||
if (fetched.ok && VERSIONED_ASSET.test(req.url)) {
|
||||
if (fetched.ok && cacheable(req.url)) {
|
||||
cache.put(req, fetched.clone());
|
||||
}
|
||||
return fetched;
|
||||
@@ -115,7 +128,7 @@ self.onfetch = event => {
|
||||
const dlmatch = DOWNLOAD_URL.exec(url.pathname);
|
||||
if (dlmatch) {
|
||||
event.respondWith(decryptStream(dlmatch[1]));
|
||||
} else if (VERSIONED_ASSET.test(url.pathname)) {
|
||||
} else if (cacheable(url.pathname)) {
|
||||
event.respondWith(cachedOrFetched(req));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -86,16 +86,13 @@ class Storage {
|
||||
this.engine.setItem('referrer', str);
|
||||
}
|
||||
get enrolled() {
|
||||
return JSON.parse(this.engine.getItem('experiments') || '[]');
|
||||
return JSON.parse(this.engine.getItem('ab_experiments') || '{}');
|
||||
}
|
||||
|
||||
enroll(id, variant) {
|
||||
const enrolled = this.enrolled;
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
if (!enrolled.find(([i, v]) => i === id)) {
|
||||
enrolled.push([id, variant]);
|
||||
this.engine.setItem('experiments', JSON.stringify(enrolled));
|
||||
}
|
||||
const enrolled = {};
|
||||
enrolled[id] = variant;
|
||||
this.engine.setItem('ab_experiments', JSON.stringify(enrolled));
|
||||
}
|
||||
|
||||
get files() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* global ReadableStream TransformStream */
|
||||
/* global TransformStream */
|
||||
|
||||
export function transformStream(readable, transformer, oncancel) {
|
||||
try {
|
||||
|
||||
@@ -8,7 +8,8 @@ class Account extends Component {
|
||||
this.emit = emit;
|
||||
this.enabled = state.capabilities.account;
|
||||
this.local = state.components[name] = {};
|
||||
this.setState();
|
||||
this.buttonClass = '';
|
||||
this.setLocal();
|
||||
}
|
||||
|
||||
avatarClick(event) {
|
||||
@@ -38,7 +39,7 @@ class Account extends Component {
|
||||
return this.local.loggedIn !== this.state.user.loggedIn;
|
||||
}
|
||||
|
||||
setState() {
|
||||
setLocal() {
|
||||
const changed = this.changed();
|
||||
if (changed) {
|
||||
this.local.loggedIn = this.state.user.loggedIn;
|
||||
@@ -47,7 +48,7 @@ class Account extends Component {
|
||||
}
|
||||
|
||||
update() {
|
||||
return this.setState();
|
||||
return this.setLocal();
|
||||
}
|
||||
|
||||
createElement() {
|
||||
@@ -58,15 +59,17 @@ class Account extends Component {
|
||||
}
|
||||
const user = this.state.user;
|
||||
const translate = this.state.translate;
|
||||
this.setLocal();
|
||||
if (!this.local.loggedIn) {
|
||||
return html`
|
||||
<send-account>
|
||||
<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)}"
|
||||
title="${translate('signInButton')}"
|
||||
title="${translate('signInOnlyButton')}"
|
||||
>
|
||||
${translate('signInButton')}
|
||||
${translate('signInOnlyButton')}
|
||||
</button>
|
||||
</send-account>
|
||||
`;
|
||||
@@ -82,7 +85,7 @@ class Account extends Component {
|
||||
/>
|
||||
<ul
|
||||
id="accountMenu"
|
||||
class="invisible list-reset absolute pin-t pin-r mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50"
|
||||
class="invisible absolute top-0 right-0 mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50"
|
||||
onblur="${e => this.hideMenu(e)}"
|
||||
>
|
||||
<li class="p-2 text-grey-dark">${user.email}</li>
|
||||
|
||||
@@ -120,7 +120,7 @@ function fileInfo(file, action) {
|
||||
function archiveInfo(archive, action) {
|
||||
return html`
|
||||
<p class="w-full flex items-center">
|
||||
<img class="mr-3 flex-no-shrink" src="${assets.get('blue_file.svg')}"/>
|
||||
<img class="mr-3 flex-shrink-0" src="${assets.get('blue_file.svg')}"/>
|
||||
<p class="flex-grow">
|
||||
<h1 class="text-base font-medium word-break-all">${archive.name}</h1>
|
||||
<div class="text-sm font-normal opacity-75 pt-1">${bytes(
|
||||
@@ -155,7 +155,7 @@ function archiveDetails(translate, archive) {
|
||||
num: archive.manifest.files.length
|
||||
})}
|
||||
</summary>
|
||||
${list(archive.manifest.files.map(f => fileInfo(f)), 'list-reset')}
|
||||
${list(archive.manifest.files.map(f => fileInfo(f)))}
|
||||
</details>
|
||||
`;
|
||||
}
|
||||
@@ -213,7 +213,7 @@ module.exports = function(state, emit, archive) {
|
||||
html`
|
||||
<input
|
||||
type="image"
|
||||
class="self-start flex-no-shrink text-white hover:opacity-75 focus:outline"
|
||||
class="self-start flex-shrink-0 text-white hover:opacity-75 focus:outline"
|
||||
alt="${state.translate('deleteButtonHover')}"
|
||||
title="${state.translate('deleteButtonHover')}"
|
||||
src="${assets.get('close-16.svg')}"
|
||||
@@ -256,9 +256,7 @@ module.exports = function(state, emit, archive) {
|
||||
try {
|
||||
await navigator.share({
|
||||
title: state.translate('-send-brand'),
|
||||
text: `Download "${
|
||||
archive.name
|
||||
}" with Firefox Send: simple, safe file sharing`,
|
||||
text: `Download "${archive.name}" with Firefox Send: simple, safe file sharing`,
|
||||
//state.translate('shareMessage', { name }),
|
||||
url: archive.url
|
||||
});
|
||||
@@ -278,15 +276,15 @@ module.exports.wip = function(state, emit) {
|
||||
.map(f =>
|
||||
fileInfo(f, remove(f, state.translate('deleteButtonHover')))
|
||||
),
|
||||
'flex-shrink bg-grey-lightest rounded-t list-reset overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen',
|
||||
'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'
|
||||
)}
|
||||
<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
|
||||
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"
|
||||
multiple
|
||||
onfocus="${focus}"
|
||||
@@ -315,7 +313,7 @@ module.exports.wip = function(state, emit) {
|
||||
${expiryOptions(state, emit)} ${password(state, emit)}
|
||||
<button
|
||||
id="upload-btn"
|
||||
class="btn rounded-lg flex-no-shrink focus:outline"
|
||||
class="btn rounded-lg flex-shrink-0 focus:outline"
|
||||
title="${state.translate('uploadButton')}"
|
||||
onclick="${upload}"
|
||||
>
|
||||
@@ -430,7 +428,7 @@ module.exports.empty = function(state, emit) {
|
||||
`;
|
||||
return html`
|
||||
<send-upload-area
|
||||
class="flex flex-col items-center justify-center border-2 border-dashed border-grey 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 => {
|
||||
if (e.target.tagName !== 'LABEL') {
|
||||
document.getElementById('file-upload').click();
|
||||
@@ -448,7 +446,7 @@ module.exports.empty = function(state, emit) {
|
||||
</div>
|
||||
<input
|
||||
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"
|
||||
multiple
|
||||
onfocus="${focus}"
|
||||
@@ -509,7 +507,7 @@ module.exports.preview = function(state, emit) {
|
||||
</div>
|
||||
<button
|
||||
id="download-btn"
|
||||
class="btn rounded-lg mt-4 w-full flex-no-shrink focus:outline"
|
||||
class="btn rounded-lg mt-4 w-full flex-shrink-0 focus:outline"
|
||||
title="${state.translate('downloadButtonLabel')}"
|
||||
onclick=${download}
|
||||
>
|
||||
|
||||
@@ -4,7 +4,7 @@ module.exports = function() {
|
||||
return html`
|
||||
<main class="main">
|
||||
<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:w-1/2 mt-6 md:mt-0 w-full"></div>
|
||||
|
||||
@@ -8,10 +8,7 @@ function banner(state) {
|
||||
return; // server side
|
||||
}
|
||||
const show =
|
||||
!state.capabilities.standalone &&
|
||||
!/firefox/i.test(navigator.userAgent) &&
|
||||
document.querySelector('html').lang.startsWith('en') &&
|
||||
!state.route.startsWith('/unsupported/');
|
||||
!state.capabilities.standalone && !state.route.startsWith('/unsupported/');
|
||||
if (show) {
|
||||
return state.cache(Promo, 'promo').render();
|
||||
}
|
||||
|
||||
@@ -2,12 +2,12 @@ const html = require('choo/html');
|
||||
const { copyToClipboard } = require('../utils');
|
||||
|
||||
module.exports = function(name, url) {
|
||||
return function(state, emit, close) {
|
||||
const dialog = function(state, emit, close) {
|
||||
return html`
|
||||
<send-copy-dialog
|
||||
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
||||
>
|
||||
<h1 class="font-bold my-4">
|
||||
<h1 class="text-3xl font-bold my-4">
|
||||
${state.translate('notifyUploadEncryptDone')}
|
||||
</h1>
|
||||
<p class="font-normal leading-normal text-grey-darkest word-break-all">
|
||||
@@ -22,7 +22,7 @@ module.exports = function(name, url) {
|
||||
readonly="true"
|
||||
/>
|
||||
<button
|
||||
class="btn rounded-lg w-full flex-no-shrink focus:outline"
|
||||
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
|
||||
onclick="${copy}"
|
||||
title="${state.translate('copyLinkButton')}"
|
||||
>
|
||||
@@ -45,4 +45,6 @@ module.exports = function(name, url) {
|
||||
setTimeout(close, 1000);
|
||||
}
|
||||
};
|
||||
dialog.type = 'copy';
|
||||
return dialog;
|
||||
};
|
||||
|
||||
@@ -22,7 +22,9 @@ function downloading(state, emit) {
|
||||
<div
|
||||
class="flex flex-col w-full h-full items-center md:justify-center md:-mt-8"
|
||||
>
|
||||
<h1 class="mb-4">${state.translate('downloadingTitle')}</h1>
|
||||
<h1 class="text-3xl font-bold mb-4">
|
||||
${state.translate('downloadingTitle')}
|
||||
</h1>
|
||||
${archiveTile.downloading(state, emit)}
|
||||
</div>
|
||||
`;
|
||||
@@ -36,7 +38,9 @@ function preview(state, emit) {
|
||||
<div
|
||||
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
||||
>
|
||||
<h1 class="mb-4">${state.translate('downloadTitle')}</h1>
|
||||
<h1 class="text-3xl font-bold mb-4">
|
||||
${state.translate('downloadTitle')}
|
||||
</h1>
|
||||
<p class="w-full text-grey-darkest text-center leading-normal">
|
||||
${state.translate('downloadDescription')}
|
||||
</p>
|
||||
@@ -76,7 +80,9 @@ module.exports = function(state, emit) {
|
||||
return html`
|
||||
<main class="main">
|
||||
${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}
|
||||
</section>
|
||||
</main>
|
||||
|
||||
@@ -7,7 +7,7 @@ module.exports = function(state) {
|
||||
id="download-complete"
|
||||
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')}
|
||||
</h1>
|
||||
<img src="${assets.get('completed.svg')}" class="my-12 h-48" />
|
||||
|
||||
@@ -8,7 +8,9 @@ module.exports = function(state, emit) {
|
||||
<div
|
||||
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">
|
||||
${state.translate('downloadDescription')}
|
||||
</p>
|
||||
|
||||
@@ -7,9 +7,9 @@ module.exports = function(state, emit) {
|
||||
<main class="main">
|
||||
${state.modal && modal(state, emit)}
|
||||
<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')}
|
||||
</h1>
|
||||
<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}`;
|
||||
return html`
|
||||
<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
|
||||
class="mozilla-logo pb-10 md:pb-0 m-2"
|
||||
@@ -28,7 +28,7 @@ class Footer extends Component {
|
||||
Mozilla
|
||||
</a>
|
||||
<ul
|
||||
class="list-reset flex flex-col md:flex-row items-start md:items-center md:justify-end"
|
||||
class="flex flex-col md:flex-row items-start md:items-center md:justify-end"
|
||||
>
|
||||
<li class="m-2">
|
||||
<a href="https://www.mozilla.org/about/legal/terms/services/#send">
|
||||
|
||||
@@ -28,7 +28,7 @@ class Header extends Component {
|
||||
`;
|
||||
return html`
|
||||
<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()}
|
||||
</header>
|
||||
|
||||
@@ -20,19 +20,15 @@ module.exports = function(state, emit) {
|
||||
const right =
|
||||
archives.length === 0
|
||||
? intro(state)
|
||||
: list(
|
||||
archives,
|
||||
'list-reset p-2 h-full overflow-y-auto w-full',
|
||||
'mb-4 w-full'
|
||||
);
|
||||
: list(archives, 'p-2 h-full overflow-y-auto w-full', 'mb-4 w-full');
|
||||
|
||||
return html`
|
||||
<main class="main">
|
||||
${state.modal && modal(state, emit)}
|
||||
<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>
|
||||
</section>
|
||||
</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"
|
||||
>
|
||||
<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')}
|
||||
</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')}
|
||||
</p>
|
||||
<img class="intro" src="${assets.get('intro.svg')}" />
|
||||
|
||||
@@ -8,9 +8,11 @@ module.exports = function(state, emit) {
|
||||
<div
|
||||
class="flex flex-col items-center bg-white m-4 px-6 py-8 border border-grey-light md:border-none md:px-12 md:py-16 shadow w-full md:h-full"
|
||||
>
|
||||
<h1 class="text-center">${state.translate('legalTitle')}</h1>
|
||||
<h1 class="text-center text-3xl font-bold">
|
||||
${state.translate('legalTitle')}
|
||||
</h1>
|
||||
<p class="mt-2">${state.translate('legalDateStamp')}</p>
|
||||
<div class="overflow-scroll py-8 px-12">
|
||||
<div class="overflow-y-scroll py-8 px-12">
|
||||
<p class="leading-normal">
|
||||
<span>When Mozilla receives information from you, our</span>
|
||||
<a
|
||||
|
||||
@@ -3,11 +3,11 @@ const html = require('choo/html');
|
||||
module.exports = function(state, emit) {
|
||||
return html`
|
||||
<send-modal
|
||||
class="absolute pin flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-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}"
|
||||
>
|
||||
<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()}">
|
||||
${state.modal(state, emit, close)}
|
||||
@@ -21,7 +21,6 @@ module.exports = function(state, emit) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
state.modal = null;
|
||||
emit('render');
|
||||
emit('closeModal');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -8,7 +8,9 @@ module.exports = function(state, emit) {
|
||||
<div
|
||||
class="flex flex-col w-full max-w-md h-full mx-auto items-center justify-center"
|
||||
>
|
||||
<h1 class="mb-4">${state.translate('downloadTitle')}</h1>
|
||||
<h1 class="mb-4 text-3xl font-bold">${state.translate(
|
||||
'downloadTitle'
|
||||
)}</h1>
|
||||
<p
|
||||
class="w-full p-2 border border-yellow-light rounded md:w-4/5 text-orange-dark bg-yellow-lighter text-center leading-normal"
|
||||
>
|
||||
@@ -17,7 +19,7 @@ module.exports = function(state, emit) {
|
||||
<form class="md:w-128" onsubmit=${submit}>
|
||||
<fieldset class="border rounded p-4 my-4" onchange=${optionChanged}>
|
||||
<div class="flex items-center mb-2">
|
||||
<img class="mr-3 flex-no-shrink" src="${assets.get(
|
||||
<img class="mr-3 flex-shrink-0" src="${assets.get(
|
||||
'blue_file.svg'
|
||||
)}"/>
|
||||
<p class="flex-grow">
|
||||
@@ -49,7 +51,7 @@ module.exports = function(state, emit) {
|
||||
</div>
|
||||
</fieldset>
|
||||
<input
|
||||
class="btn rounded-lg w-full flex flex-no-shrink items-center justify-center"
|
||||
class="btn rounded-lg w-full flex flex-shrink-0 items-center justify-center"
|
||||
value="${state.translate('copyLinkButton')}"
|
||||
title="${state.translate('copyLinkButton')}"
|
||||
type="submit" />
|
||||
|
||||
@@ -7,9 +7,9 @@ module.exports = function(state, emit) {
|
||||
<main class="main">
|
||||
${state.modal && modal(state, emit)}
|
||||
<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')}
|
||||
</h1>
|
||||
<img src="${assets.get('notFound.svg')}" class="my-12" />
|
||||
|
||||
@@ -4,9 +4,11 @@ module.exports = function(message) {
|
||||
return function(state, emit, close) {
|
||||
return html`
|
||||
<send-ok-dialog class="flex flex-col max-w-sm p-4 m-auto">
|
||||
<h2 class="text-center m-8 leading-normal">${message}</h2>
|
||||
<h2 class="text-center text-xl font-bold m-8 leading-normal">
|
||||
${message}
|
||||
</h2>
|
||||
<button
|
||||
class="btn rounded-lg w-full flex-no-shrink"
|
||||
class="btn rounded-lg w-full flex-shrink-0"
|
||||
onclick="${close}"
|
||||
title="${state.translate('okButton')}"
|
||||
>
|
||||
|
||||
@@ -3,8 +3,9 @@ const Component = require('choo/component');
|
||||
const assets = require('../../common/assets');
|
||||
|
||||
class Promo extends Component {
|
||||
constructor(name) {
|
||||
constructor(name, state) {
|
||||
super(name);
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
update() {
|
||||
@@ -14,21 +15,20 @@ class Promo extends Component {
|
||||
createElement() {
|
||||
return html`
|
||||
<send-promo
|
||||
class="w-full flex-none flex-row items-center content-center justify-center text-sm bg-grey-light leading-tight text-grey-darkest px-4 py-3 hidden md:flex"
|
||||
class="w-full flex-row items-center content-center justify-center bg-white text-grey-darkest px-4 py-3 flex border-b border-grey-banner leading-normal"
|
||||
>
|
||||
<div class="flex items-center mx-auto">
|
||||
<img
|
||||
src="${assets.get('firefox_logo-only.svg')}"
|
||||
class="w-6"
|
||||
src="${assets.get('master-logo.svg')}"
|
||||
class="w-6 h-6"
|
||||
alt="Firefox"
|
||||
/>
|
||||
<span class="ml-3"
|
||||
>Send is brought to you by the all-new Firefox.${' '}
|
||||
<span class="ml-2 sm:ml-4 text-xs sm:text-base">
|
||||
${this.state.translate('trailheadPromo')}${' '}
|
||||
<a
|
||||
class="text-blue"
|
||||
href="https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com"
|
||||
>
|
||||
Download Firefox now ≫</a
|
||||
class="underline text-blue-dark"
|
||||
href="http://www.mozilla.org/firefox/accounts/?utm_source=send.firefox.com&utm_medium=banner&utm_campaign=trailhead&utm_content=protect-your-privacy"
|
||||
>${this.state.translate('learnMore')}</a
|
||||
>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -1,22 +1,16 @@
|
||||
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) {
|
||||
return function(state, emit, close) {
|
||||
const dialog = function(state, emit, close) {
|
||||
return html`
|
||||
<send-share-dialog
|
||||
class="flex flex-col items-center text-center p-4 max-w-sm m-auto"
|
||||
>
|
||||
<h1 class="font-bold my-4">
|
||||
<h1 class="text-3xl font-bold my-4">
|
||||
${state.translate('notifyUploadEncryptDone')}
|
||||
</h1>
|
||||
<p class="font-normal leading-normal text-grey-darkest word-break-all">
|
||||
Share the link to your file:<br />
|
||||
${state.translate('shareLinkDescription')}<br />
|
||||
${name}
|
||||
</p>
|
||||
<input
|
||||
@@ -27,11 +21,11 @@ module.exports = function(name, url) {
|
||||
readonly="true"
|
||||
/>
|
||||
<button
|
||||
class="btn rounded-lg w-full flex-no-shrink focus:outline"
|
||||
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
|
||||
onclick="${share}"
|
||||
title="Share link"
|
||||
title="${state.translate('shareLinkButton')}"
|
||||
>
|
||||
Share link
|
||||
${state.translate('shareLinkButton')}
|
||||
</button>
|
||||
<button
|
||||
class="text-blue-dark hover:text-blue-darker focus:text-blue-darker my-4 font-medium cursor-pointer focus:outline"
|
||||
@@ -48,8 +42,7 @@ module.exports = function(name, url) {
|
||||
try {
|
||||
await navigator.share({
|
||||
title: state.translate('-send-brand'),
|
||||
text: `Download "${name}" with Firefox Send: simple, safe file sharing`,
|
||||
//state.translate('shareMessage', { name }),
|
||||
text: state.translate('shareMessage', { name }),
|
||||
url
|
||||
});
|
||||
} catch (e) {
|
||||
@@ -61,4 +54,6 @@ module.exports = function(name, url) {
|
||||
close();
|
||||
}
|
||||
};
|
||||
dialog.type = 'share';
|
||||
return dialog;
|
||||
};
|
||||
|
||||
@@ -12,14 +12,11 @@ module.exports = function(trigger) {
|
||||
<send-signup-dialog
|
||||
class="flex flex-col lg:flex-row justify-center px-8 md:px-24 w-full h-full"
|
||||
>
|
||||
<img
|
||||
src="${assets.get('firefox_logo-only.svg')}"
|
||||
class="h-16 mt-1 mb-4"
|
||||
/>
|
||||
<img src="${assets.get('master-logo.svg')}" class="h-16 mt-1 mb-4" />
|
||||
<section
|
||||
class="flex flex-col flex-no-shrink self-center lg:mx-6 lg:max-w-xs"
|
||||
class="flex flex-col flex-shrink-0 self-center lg:mx-6 lg:max-w-xs"
|
||||
>
|
||||
<h1 class="font-bold text-center lg:text-left">
|
||||
<h1 class="text-3xl font-bold text-center lg:text-left">
|
||||
${state.translate('accountBenefitTitle')}
|
||||
</h1>
|
||||
<ul
|
||||
@@ -49,9 +46,9 @@ module.exports = function(trigger) {
|
||||
placeholder=${state.translate('emailPlaceholder')}
|
||||
/>
|
||||
<input
|
||||
class="btn rounded-lg w-full flex flex-no-shrink items-center justify-center"
|
||||
value="${state.translate('signInButton')}"
|
||||
title="${state.translate('signInButton')}"
|
||||
class="btn rounded-lg w-full flex flex-shrink-0 items-center justify-center"
|
||||
value="${state.translate('signInOnlyButton')}"
|
||||
title="${state.translate('signInOnlyButton')}"
|
||||
id="email-submit"
|
||||
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
|
||||
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>
|
||||
${why}
|
||||
<a href="${url}" class="btn rounded-lg mt-8 px-8">
|
||||
|
||||
@@ -44,6 +44,14 @@ export default class User {
|
||||
this.storage.set('firstAction', action);
|
||||
}
|
||||
|
||||
get surveyed() {
|
||||
return this.storage.get('surveyed');
|
||||
}
|
||||
|
||||
set surveyed(yes) {
|
||||
this.storage.set('surveyed', yes);
|
||||
}
|
||||
|
||||
get avatar() {
|
||||
const defaultAvatar = assets.get('user.svg');
|
||||
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));
|
||||
}
|
||||
|
||||
function locale() {
|
||||
return document.querySelector('html').lang;
|
||||
}
|
||||
|
||||
function loadShim(polyfill) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const shim = document.createElement('script');
|
||||
@@ -67,8 +71,7 @@ function bytes(num) {
|
||||
let nStr = n.toFixed(decimalDigits);
|
||||
if (LOCALIZE_NUMBERS) {
|
||||
try {
|
||||
const locale = document.querySelector('html').lang;
|
||||
nStr = n.toLocaleString(locale, {
|
||||
nStr = n.toLocaleString(locale(), {
|
||||
minimumFractionDigits: decimalDigits,
|
||||
maximumFractionDigits: decimalDigits
|
||||
});
|
||||
@@ -85,8 +88,7 @@ function bytes(num) {
|
||||
function percent(ratio) {
|
||||
if (LOCALIZE_NUMBERS) {
|
||||
try {
|
||||
const locale = document.querySelector('html').lang;
|
||||
return ratio.toLocaleString(locale, { style: 'percent' });
|
||||
return ratio.toLocaleString(locale(), { style: 'percent' });
|
||||
} catch (e) {
|
||||
// fall through
|
||||
}
|
||||
@@ -96,8 +98,7 @@ function percent(ratio) {
|
||||
|
||||
function number(n) {
|
||||
if (LOCALIZE_NUMBERS) {
|
||||
const locale = document.querySelector('html').lang;
|
||||
return n.toLocaleString(locale);
|
||||
return n.toLocaleString(locale());
|
||||
}
|
||||
return n.toString();
|
||||
}
|
||||
@@ -267,6 +268,7 @@ function setTranslate(t) {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
locale,
|
||||
fadeOut,
|
||||
delay,
|
||||
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
|
||||
|
||||
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
|
||||
- an encryption key for the file (AES-GCM)
|
||||
2. The secret key is used to derive more keys via HKDF SHA-256
|
||||
- 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)
|
||||
- a signing key for request authentication (HMAC SHA-256)
|
||||
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`
|
||||
* `download_count` downloads completed
|
||||
* `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
|
||||
|
||||
|
||||
9806
package-lock.json
generated
9806
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",
|
||||
"description": "File Sharing Experiment",
|
||||
"version": "3.0.9",
|
||||
"version": "3.0.18",
|
||||
"author": "Mozilla (https://mozilla.org)",
|
||||
"repository": "mozilla/send",
|
||||
"homepage": "https://github.com/mozilla/send/",
|
||||
@@ -27,7 +27,7 @@
|
||||
"test:report": "nyc report --reporter=html",
|
||||
"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",
|
||||
"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",
|
||||
"prod": "node server/bin/prod.js"
|
||||
},
|
||||
@@ -35,7 +35,8 @@
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged",
|
||||
"pre-push": "npm test",
|
||||
"post-merge": "npm install"
|
||||
"post-merge": "npm install",
|
||||
"post-checkout": "scripts/sync-npm-dependencies.sh"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
@@ -60,66 +61,66 @@
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.3.4",
|
||||
"@babel/plugin-proposal-class-properties": "^7.3.4",
|
||||
"@babel/core": "^7.6.0",
|
||||
"@babel/plugin-proposal-class-properties": "^7.5.5",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||
"@babel/preset-env": "^7.3.4",
|
||||
"@babel/preset-env": "^7.6.0",
|
||||
"@dannycoates/webcrypto-liner": "^0.1.37",
|
||||
"@dannycoates/webpack-dev-server": "^3.1.4",
|
||||
"@fullhuman/postcss-purgecss": "^1.1.0",
|
||||
"@fullhuman/postcss-purgecss": "^1.2.0",
|
||||
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
||||
"@sentry/browser": "^5.6.3",
|
||||
"asmcrypto.js": "^0.22.0",
|
||||
"babel-loader": "^8.0.5",
|
||||
"babel-plugin-istanbul": "^5.1.1",
|
||||
"base64-js": "^1.3.0",
|
||||
"babel-loader": "^8.0.6",
|
||||
"babel-plugin-istanbul": "^5.2.0",
|
||||
"base64-js": "^1.3.1",
|
||||
"content-disposition": "^0.5.3",
|
||||
"copy-webpack-plugin": "^5.0.0",
|
||||
"core-js": "^2.6.5",
|
||||
"copy-webpack-plugin": "^5.0.4",
|
||||
"core-js": "^3.2.1",
|
||||
"crc": "^3.8.0",
|
||||
"cross-env": "^5.2.0",
|
||||
"css-loader": "^2.1.1",
|
||||
"cross-env": "^5.2.1",
|
||||
"css-loader": "^3.2.0",
|
||||
"css-mqpacker": "^7.0.0",
|
||||
"cssnano": "^4.1.10",
|
||||
"eslint": "^5.15.1",
|
||||
"eslint-plugin-mocha": "^5.3.0",
|
||||
"eslint-plugin-node": "^8.0.1",
|
||||
"eslint": "^6.3.0",
|
||||
"eslint-config-prettier": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^6.1.0",
|
||||
"eslint-plugin-node": "^9.2.0",
|
||||
"eslint-plugin-security": "^1.4.0",
|
||||
"expose-loader": "^0.7.5",
|
||||
"extract-loader": "^3.1.0",
|
||||
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
||||
"fast-text-encoding": "^1.0.0",
|
||||
"file-loader": "^3.0.1",
|
||||
"fluent-intl-polyfill": "^0.1.0",
|
||||
"file-loader": "^4.2.0",
|
||||
"git-rev-sync": "^1.12.0",
|
||||
"html-loader": "^0.5.5",
|
||||
"http_ece": "^1.1.0",
|
||||
"husky": "^1.3.1",
|
||||
"lint-staged": "^8.1.5",
|
||||
"mocha": "^6.0.2",
|
||||
"husky": "^3.0.5",
|
||||
"intl-pluralrules": "^1.0.3",
|
||||
"lint-staged": "^9.2.5",
|
||||
"mocha": "^6.2.0",
|
||||
"morgan": "^1.9.1",
|
||||
"nanobus": "^4.4.0",
|
||||
"nanohtml": "^1.4.0",
|
||||
"nanohtml": "^1.8.1",
|
||||
"nanotiming": "^7.3.1",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"nyc": "^13.3.0",
|
||||
"nyc": "^14.1.1",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"postcss-preset-env": "^6.6.0",
|
||||
"prettier": "^1.16.4",
|
||||
"proxyquire": "^2.1.0",
|
||||
"puppeteer": "1.11.0",
|
||||
"raven-js": "^3.27.0",
|
||||
"raw-loader": "^1.0.0",
|
||||
"redis-mock": "^0.43.0",
|
||||
"rimraf": "^2.6.3",
|
||||
"postcss-preset-env": "^6.7.0",
|
||||
"prettier": "^1.18.2",
|
||||
"proxyquire": "^2.1.3",
|
||||
"puppeteer": "^1.19.0",
|
||||
"raw-loader": "^3.1.0",
|
||||
"redis-mock": "^0.46.0",
|
||||
"rimraf": "^3.0.0",
|
||||
"script-loader": "^0.7.2",
|
||||
"sinon": "^7.2.7",
|
||||
"sinon": "^7.4.2",
|
||||
"string-hash": "^1.1.3",
|
||||
"stylelint": "^9.10.1",
|
||||
"stylelint-config-standard": "^18.2.0",
|
||||
"stylelint": "^10.1.0",
|
||||
"stylelint-config-standard": "^18.3.0",
|
||||
"stylelint-no-unsupported-browser-features": "^3.0.2",
|
||||
"svgo": "^1.2.0",
|
||||
"svgo-loader": "^2.2.0",
|
||||
"tailwindcss": "^0.7.4",
|
||||
"svgo": "^1.3.0",
|
||||
"svgo-loader": "^2.2.1",
|
||||
"tailwindcss": "^1.1.2",
|
||||
"val-loader": "^1.1.1",
|
||||
"wdio-docker-service": "^1.4.2",
|
||||
"wdio-dot-reporter": "0.0.10",
|
||||
@@ -128,39 +129,42 @@
|
||||
"wdio-sauce-service": "^0.4.14",
|
||||
"wdio-selenium-standalone-service": "0.0.12",
|
||||
"wdio-spec-reporter": "^0.1.5",
|
||||
"webdriverio": "^4.14.3",
|
||||
"webpack": "4.28.4",
|
||||
"webpack-cli": "^3.2.3",
|
||||
"webpack-dev-middleware": "^3.6.1",
|
||||
"webdriverio": "^4.14.4",
|
||||
"webpack": "4.38.0",
|
||||
"webpack-cli": "^3.3.8",
|
||||
"webpack-dev-middleware": "^3.7.1",
|
||||
"webpack-dev-server": "^3.8.0",
|
||||
"webpack-manifest-plugin": "^2.0.4",
|
||||
"webpack-unassert-loader": "^1.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@google-cloud/storage": "^2.4.2",
|
||||
"aws-sdk": "^2.417.0",
|
||||
"body-parser": "^1.18.3",
|
||||
"choo": "^6.12.1",
|
||||
"cldr-core": "^34.0.0",
|
||||
"convict": "^4.4.1",
|
||||
"express": "^4.16.3",
|
||||
"express-ws": "github:dannycoates/express-ws",
|
||||
"fluent": "^0.11.0",
|
||||
"fluent-langneg": "^0.1.1",
|
||||
"@dannycoates/express-ws": "^5.0.3",
|
||||
"@fluent/bundle": "^0.13.0",
|
||||
"@fluent/langneg": "^0.3.0",
|
||||
"@google-cloud/storage": "^3.2.1",
|
||||
"@sentry/node": "^5.6.2",
|
||||
"aws-sdk": "^2.524.0",
|
||||
"body-parser": "^1.19.0",
|
||||
"choo": "^7.0.0",
|
||||
"cldr-core": "^35.1.0",
|
||||
"configstore": "github:dannycoates/configstore#master",
|
||||
"convict": "^5.1.0",
|
||||
"express": "^4.17.1",
|
||||
"fxa-geodb": "^1.0.4",
|
||||
"helmet": "^3.15.1",
|
||||
"helmet": "^3.21.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mozlog": "^2.2.0",
|
||||
"node-fetch": "^2.3.0",
|
||||
"raven": "^2.6.4",
|
||||
"node-fetch": "^2.6.0",
|
||||
"redis": "^2.8.0",
|
||||
"selenium-standalone": "^6.15.6",
|
||||
"ua-parser-js": "^0.7.19",
|
||||
"websocket-stream": "^5.1.2"
|
||||
"ua-parser-js": "^0.7.20"
|
||||
},
|
||||
"availableLanguages": [
|
||||
"en-US",
|
||||
"ar",
|
||||
"ast",
|
||||
"bn-BD",
|
||||
"bn",
|
||||
"br",
|
||||
"ca",
|
||||
"cak",
|
||||
"cs",
|
||||
@@ -175,9 +179,12 @@
|
||||
"es-CL",
|
||||
"es-ES",
|
||||
"es-MX",
|
||||
"et",
|
||||
"eu",
|
||||
"fi",
|
||||
"fr",
|
||||
"fy-NL",
|
||||
"he",
|
||||
"hr",
|
||||
"hsb",
|
||||
"hu",
|
||||
@@ -186,9 +193,15 @@
|
||||
"it",
|
||||
"ja",
|
||||
"ka",
|
||||
"kab",
|
||||
"ko",
|
||||
"lt",
|
||||
"ml",
|
||||
"nb-NO",
|
||||
"nl",
|
||||
"nn-NO",
|
||||
"oc",
|
||||
"pa-IN",
|
||||
"pl",
|
||||
"pt-BR",
|
||||
"pt-PT",
|
||||
@@ -196,11 +209,15 @@
|
||||
"ru",
|
||||
"sk",
|
||||
"sl",
|
||||
"sq",
|
||||
"sr",
|
||||
"su",
|
||||
"sv-SE",
|
||||
"th",
|
||||
"tr",
|
||||
"uk",
|
||||
"vi",
|
||||
"zgh",
|
||||
"zh-CN",
|
||||
"zh-TW"
|
||||
]
|
||||
|
||||
@@ -6,7 +6,7 @@ class TailwindExtractor {
|
||||
|
||||
const options = {
|
||||
plugins: [
|
||||
require('tailwindcss')('./tailwind.js'),
|
||||
require('tailwindcss')('./tailwind.config.js'),
|
||||
require('postcss-preset-env')
|
||||
]
|
||||
};
|
||||
|
||||
@@ -1,31 +1,9 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = فَيَرفُكس سِنْد
|
||||
siteSubtitle = تجربة وِبّيّة
|
||||
siteFeedback = الانطباعات
|
||||
uploadPageHeader = شارِك ملفاتك بخصوصية وتعمية
|
||||
uploadPageExplainer = أرسل الملفات عبر رابط آمن خاص ومعمّى تنتهي صلاحيته تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد.
|
||||
uploadPageLearnMore = اطّلع على المزيد
|
||||
uploadPageDropMessage = أسقِط ملفّك هنا لبدء الرفع
|
||||
uploadPageSizeMessage = لتتحصل على أفضل تجربة، من المستحسن أن يكون الملف أصغر من 1 غ.بايت
|
||||
uploadPageBrowseButton = اختر ملفًا على حاسوبك
|
||||
uploadPageBrowseButton1 = اختر ملفّا لرفعه
|
||||
uploadPageMultipleFilesAlert = رفع عدة ملفات (أو رفع مجلد) ليس مدعوما حاليا.
|
||||
uploadPageBrowseButtonTitle = ارفع ملفًا
|
||||
uploadingPageProgress = يرفع { $filename } ({ $size })
|
||||
importingFile = يستورد…
|
||||
verifyingFile = يتحقق…
|
||||
encryptingFile = يعمّي…
|
||||
decryptingFile = يفك التعمية…
|
||||
notifyUploadDone = انتهى الرفع.
|
||||
uploadingPageMessage = ما إن يُرفع الملف سيُتاح ضبط خيارات انتهاء صلاحيته.
|
||||
uploadingPageCancel = ألغِ الرفع
|
||||
uploadCancelNotification = أُلغي الرفع.
|
||||
uploadingPageLargeFileMessage = هذا الملف كبير الحجم وسيأخذ رفعه وقتا. انتظر رجاءً.
|
||||
uploadingFileNotification = أعلِمني عندما يكتمل الرفع.
|
||||
uploadSuccessConfirmHeader = جاهز للإرسال
|
||||
uploadSvgAlt = ارفع
|
||||
uploadSuccessTimingHeader = ستنتهي صلاحية الرابط الذي يشير إلى الملف في حال: نُزِّل لأول مرة، أو مرّ ٢٤ ساعة على رفعه.
|
||||
expireInfo = ستنتهي صلاحية رابط الملف بعد { $downloadCount } أو { $timespan }.
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[zero] لا تنزيلات
|
||||
@@ -44,76 +22,26 @@ timespanHours =
|
||||
[many] { $num } ساعة
|
||||
*[other] { $num } ساعة
|
||||
}
|
||||
copyUrlFormLabelWithName = انسخ الرابط وشاركه لإرسال الملف: { $filename }
|
||||
copyUrlFormButton = انسخ إلى الحافظة
|
||||
copiedUrl = نُسخ!
|
||||
deleteFileButton = احذف الملف
|
||||
sendAnotherFileLink = أرسِل ملفًا آخر
|
||||
# Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = نزّل
|
||||
downloadsFileList = التنزيلات
|
||||
# Used as header in a column indicating the amount of time left before a
|
||||
# download link expires (e.g. "10h 5m")
|
||||
timeFileList = الوقت
|
||||
# Used as header in a column indicating the number of times a file has been
|
||||
# downloaded
|
||||
downloadFileName = نزّل { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
unlockInputLabel = أدخل كلمة السر
|
||||
unlockInputPlaceholder = كلمة السر
|
||||
unlockButtonLabel = افتح القفل
|
||||
downloadFileTitle = نزِّل الملف المعمّى
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = يُرسل إليك صديقك ملفا عبر «فَيَرفُكس سِنْد»، وهي خدمة تتيح لك مشاركة الملفات عبر رابط آمن وخاص ومعمّى، حيث تنتهي صلاحياتها تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد.
|
||||
# Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = نزّل
|
||||
downloadNotification = لقد اكتمل التنزيل.
|
||||
downloadFinish = اكتمل التنزيل
|
||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } من أصل { $totalSize })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = جرِّب «فَيَرفُكس سِنْد»
|
||||
downloadingPageProgress = ينزّل { $filename } ({ $size })
|
||||
downloadingPageMessage = رجاء أبقِ هذا اللسان مفتوحا حتى نجلب الملف ونفك تعميته.
|
||||
errorAltText = خطأ أثناء الرفع
|
||||
errorPageHeader = حدث خطب ما.
|
||||
errorPageMessage = حدث خطب ما أثناء رفع الملف.
|
||||
errorPageLink = أرسل ملفا آخر
|
||||
fileTooBig = حجم الملف كبير للغاية لرفعه. يجب أن يكون أصغر من { $size }.
|
||||
linkExpiredAlt = انتهت صلاحية الرابط
|
||||
expiredPageHeader = انتهت صلاحية هذا الرابط أو لم يكن موجودا في المقام الأول!
|
||||
notSupportedHeader = متصفحك غير مدعوم.
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = للأسف فإن متصفحك لا يدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تجربة متصفح آخر، ونحن ننصحك بِفَيَرفُكس!
|
||||
notSupportedLink = لماذا متصفحي غير مدعوم؟
|
||||
notSupportedOutdatedDetail = للأسف فإن إصدارة فَيَرفُكس هذه لا تدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تحديث متصفحك.
|
||||
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 = ألغِ
|
||||
deleteButtonHover = احذف
|
||||
copyUrlHover = انسخ الرابط
|
||||
footerLinkLegal = القانونية
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = حول الاختبار التجريبي
|
||||
footerLinkPrivacy = الخصوصية
|
||||
footerLinkTerms = الشروط
|
||||
footerLinkCookies = الكعكات
|
||||
requirePasswordCheckbox = اطلب كلمة سر لتنزيل هذا الملف
|
||||
addPasswordButton = أضِف كلمة سر
|
||||
changePasswordButton = غيّر
|
||||
passwordTryAgain = كلمة السر خاطئة. أعِد المحاولة.
|
||||
reportIPInfringement = أبلغ عن انتهاك للملكية الفكرية
|
||||
javascriptRequired = يتطلب فَيَرفُكس سِنْد جافاسكربت
|
||||
whyJavascript = لماذا يتطلب فَيَرفُكس سِنْد جافاسكربت؟
|
||||
enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاولة.
|
||||
@@ -121,9 +49,137 @@ enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاو
|
||||
expiresHoursMinutes = { $hours }س { $minutes }د
|
||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||
expiresMinutes = { $minutes }د
|
||||
# A short status message shown when a password is successfully set
|
||||
passwordIsSet = ضُبطت كلمة السر
|
||||
# A short status message shown when the user enters a long password
|
||||
maxPasswordLength = أقصر طول لكلمة السر: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
passwordSetError = يجب ألا تُضبط كلمة السر هذه
|
||||
|
||||
## Send version 2 strings
|
||||
|
||||
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 = আপনার ইমেইল দিন
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন
|
||||
signInButton = সাইন ইন/আপ
|
||||
signInOnlyButton = সাইন ইন
|
||||
accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন
|
||||
@@ -145,3 +145,11 @@ noStreamsWarning = এই ব্রাউজার এতো বড় একট
|
||||
noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন
|
||||
noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন
|
||||
noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন
|
||||
downloadFirefoxPromo = { -send-short-brand } আপনারদের জন্য নিয়ে এসেছে একেবারে নতুন { -firefox }।
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = আপনার ফাইলে লিঙ্ক শেয়ার করুন:
|
||||
shareLinkButton = লিঙ্ক শেয়ার করুন
|
||||
# $name is the name of the file
|
||||
shareMessage = { -send-brand } এর মাধ্যমে "{ $name }" ডাউনলোড করুন: সরল, নিরাপদ ফাইল শেয়ারিং
|
||||
trailheadPromo = আপনার গোপনীয়তা রক্ষা করার একটি উপায় আছে। Firefox এ যোগ দিন।
|
||||
learnMore = আরও জানুন।
|
||||
182
public/locales/br/send.ftl
Normal file
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
|
||||
# $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 }
|
||||
signInButton = Inicieu la sessió o registreu-vos
|
||||
signInOnlyButton = Inicia 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")
|
||||
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
|
||||
noStreamsOptionFirefox = Proveu el nostre navegador preferit
|
||||
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
|
||||
# $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 }
|
||||
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
|
||||
# $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 }
|
||||
@@ -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
|
||||
noStreamsOptionFirefox = Tatojtob'ej ri jeb'ël qokik'amaya'l
|
||||
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
|
||||
# $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
|
||||
signInButton = Přihlásit/Registrovat se
|
||||
signInOnlyButton = Přihlásit se
|
||||
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")
|
||||
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
|
||||
noStreamsOptionFirefox = Vyzkoušejte náš oblíbený prohlížeč
|
||||
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…
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[zero] Llwythi i lawr
|
||||
[one] Llwyth i lawr
|
||||
[two] Lwyth i lawr
|
||||
[few] Llwyth i lawr
|
||||
[many] Llwyth i lawr
|
||||
*[other] Llwyth i lawr
|
||||
[zero] Dim llwythi i lawr
|
||||
[one] 1 llwyth i lawr
|
||||
[two] { $num } llwyth i lawr
|
||||
[few] { $num } llwyth i lawr
|
||||
[many] { $num } llwyth i lawr
|
||||
*[other] { $num } llwyth i lawr
|
||||
}
|
||||
timespanHours =
|
||||
{ $num ->
|
||||
[zero] awr
|
||||
[one] awr
|
||||
[two] awr
|
||||
[few] awr
|
||||
[many] awr
|
||||
*[other] awr
|
||||
[one] 1 awr
|
||||
[two] { $num } awr
|
||||
[few] { $num } awr
|
||||
[many] { $num } awr
|
||||
*[other] { $num } awr
|
||||
}
|
||||
copiedUrl = Wedi eu copïo!
|
||||
unlockInputPlaceholder = Cyfrinair
|
||||
@@ -78,7 +78,7 @@ timespanMinutes =
|
||||
timespanDays =
|
||||
{ $num ->
|
||||
[zero] 0 diwrnod
|
||||
[one] 1 dwrnod
|
||||
[one] 1 diwrnod
|
||||
[two] { $num } diwrnod
|
||||
[few] { $num } diwrnod
|
||||
[many] { $num } diwrnod
|
||||
@@ -158,7 +158,7 @@ addPassword = Diogelu gyda chyfrinair
|
||||
emailPlaceholder = Rhowch eich e-bost
|
||||
# $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 }
|
||||
signInButton = Mewngofnodi/Cofrestru
|
||||
signInOnlyButton = Mewngofnodi
|
||||
accountBenefitTitle = Creu Cyfrif { -firefox } neu fewngofnodi
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
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
|
||||
noStreamsOptionFirefox = Rhowch gynnig ar ein hoff porwr
|
||||
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
|
||||
# $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 }
|
||||
signInButton = Log ind/tilmeld dig
|
||||
signInOnlyButton = 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")
|
||||
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
|
||||
noStreamsOptionFirefox = Prøv vores favorit-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
|
||||
# $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
|
||||
signInButton = Anmelden/Registrieren
|
||||
signInOnlyButton = Anmelden
|
||||
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")
|
||||
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
|
||||
noStreamsOptionFirefox = Probiere unseren Lieblingsbrowser aus
|
||||
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
|
||||
# $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ł
|
||||
signInButton = Pśizjawiś/Registrěrowaś
|
||||
signInOnlyButton = Pśizjawiś
|
||||
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")
|
||||
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ł
|
||||
noStreamsOptionFirefox = Wopytajśo naš nejlubšy wobglědowak
|
||||
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 = Αντιγράψτε το σύνδεσμο για να μοιραστείτε το αρχείο:
|
||||
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] Μόνο 1 αρχείο επιτρέπεται.
|
||||
*[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 = Επιλέξτε αρχεία για μεταφόρτωση
|
||||
@@ -116,10 +126,30 @@ addPassword = Προστασία με κωδικό πρόσβασης
|
||||
emailPlaceholder = Εισάγετε το email σας
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Συνδεθείτε για να στείλετε μέχρι { $size }
|
||||
signInButton = Σύνδεση/εγγραφή
|
||||
signInOnlyButton = Σύνδεση
|
||||
accountBenefitTitle = Δημιουργία λογαριασμού { -firefox } ή σύνδεση
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = Μοιραστείτε αρχεία έως { $size }
|
||||
accountBenefitDownloadCount = Μοιραστείτε αρχεία με περισσότερα άτομα
|
||||
accountBenefitTimeLimit =
|
||||
{ $count ->
|
||||
[one] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και 1 ημέρα
|
||||
*[other] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και { $count } ημέρες
|
||||
}
|
||||
accountBenefitSync = Διαχειριστείτε τα διαμοιρασμένα αρχεία από οποιαδήποτε συσκευή
|
||||
accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla }
|
||||
signOut = Αποσύνδεση
|
||||
okButton = OK
|
||||
downloadingTitle = Λήψη
|
||||
noStreamsWarning = Αυτό το πρόγραμμα περιήγησης ενδέχεται να μην μπορέσει να αποκρυπτογραφήσει αρχεία αυτού του μεγέθους.
|
||||
noStreamsOptionCopy = Αντιγράψτε το σύνδεσμο για άνοιγμα σε άλλο πρόγραμμα περιήγησης
|
||||
noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης
|
||||
noStreamsOptionDownload = Συνέχεια με αυτό το πρόγραμμα περιήγησης
|
||||
downloadFirefoxPromo = Το { -send-short-brand } παρέχεται σε εσάς από το ολοκαίνουριο { -firefox }.
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = Μοιραστείτε το σύνδεσμο του αρχείου σας:
|
||||
shareLinkButton = Κοινή χρήση συνδέσμου
|
||||
# $name is the name of the file
|
||||
shareMessage = Λήψη του “{ $name }” με το { -send-brand }: απλός και ασφαλής διαμοιρασμός αρχείων
|
||||
trailheadPromo = Υπάρχει τρόπος να προστατέψετε το απόρρητό σας. Γίνετε μέλος του Firefox.
|
||||
learnMore = Μάθετε περισσότερα.
|
||||
|
||||
@@ -126,7 +126,7 @@ addPassword = Protect with password
|
||||
emailPlaceholder = Enter your email
|
||||
# $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 }
|
||||
signInButton = Sign in/up
|
||||
signInOnlyButton = 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")
|
||||
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
|
||||
noStreamsOptionFirefox = Try our favourite 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.
|
||||
title = Firefox Send
|
||||
siteSubtitle = web experiment
|
||||
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…
|
||||
verifyingFile = Verifying…
|
||||
encryptingFile = Encrypting…
|
||||
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 =
|
||||
{ $num ->
|
||||
[one] 1 download
|
||||
@@ -36,76 +14,26 @@ timespanHours =
|
||||
[one] 1 hour
|
||||
*[other] { $num } hours
|
||||
}
|
||||
copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename }
|
||||
copyUrlFormButton = Copy to clipboard
|
||||
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
|
||||
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
|
||||
downloadNotification = Your download has completed.
|
||||
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 })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
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!
|
||||
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 }.
|
||||
linkExpiredAlt = Link expired
|
||||
expiredPageHeader = This link has expired or never existed in the first place!
|
||||
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?
|
||||
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
|
||||
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
|
||||
deleteButtonHover = Delete
|
||||
copyUrlHover = Copy URL
|
||||
footerLinkLegal = Legal
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = About Test Pilot
|
||||
footerLinkPrivacy = Privacy
|
||||
footerLinkTerms = Terms
|
||||
footerLinkCookies = Cookies
|
||||
requirePasswordCheckbox = Require a password to download this file
|
||||
addPasswordButton = Add password
|
||||
changePasswordButton = Change
|
||||
passwordTryAgain = Incorrect password. Try again.
|
||||
reportIPInfringement = Report IP Infringement
|
||||
javascriptRequired = Firefox Send requires JavaScript
|
||||
whyJavascript = Why does Firefox Send require JavaScript?
|
||||
enableJavascript = Please enable JavaScript and try again.
|
||||
@@ -113,14 +41,12 @@ enableJavascript = Please enable JavaScript and try again.
|
||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||
expiresMinutes = { $minutes }m
|
||||
# A short status message shown when a password is successfully set
|
||||
passwordIsSet = Password set
|
||||
# A short status message shown when the user enters a long password
|
||||
maxPasswordLength = Maximum password length: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
passwordSetError = This password could not be set
|
||||
|
||||
## 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
|
||||
-send-brand = Firefox Send
|
||||
@@ -152,7 +78,17 @@ fileCount =
|
||||
[one] 1 file
|
||||
*[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 }
|
||||
# the next line after the colon contains a file name
|
||||
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'
|
||||
dragAndDropFiles = Drag and drop files
|
||||
# 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 }
|
||||
addPassword = Protect with password
|
||||
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 }
|
||||
signInButton = Sign in/up
|
||||
signInOnlyButton = 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 }
|
||||
accountBenefitDownloadCount = Share files with more people
|
||||
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
|
||||
noStreamsOptionFirefox = Try our favourite 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
|
||||
# $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 }
|
||||
signInButton = Sign in/up
|
||||
signInOnlyButton = 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")
|
||||
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
|
||||
noStreamsOptionFirefox = Try our favorite 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
|
||||
# $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 }
|
||||
signInButton = Iniciar sesión/registrarse
|
||||
signInOnlyButton = Iniciar 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")
|
||||
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.
|
||||
noStreamsOptionFirefox = Pruebe nuestro navegador favorito
|
||||
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
|
||||
# $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 }
|
||||
signInButton = Conectarse/registrarse
|
||||
signInOnlyButton = Conectarse
|
||||
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")
|
||||
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
|
||||
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
||||
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
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Iniciar sesión para enviar hasta { $size }
|
||||
signInButton = Iniciar sesión/registrarse
|
||||
signInOnlyButton = Iniciar sesión
|
||||
accountBenefitTitle = Crear una cuenta { -firefox } o iniciar sesión
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = Compartir archivos de hasta { $size }
|
||||
@@ -145,3 +145,11 @@ noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan gr
|
||||
noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador
|
||||
noStreamsOptionFirefox = Probar nuestro navegador favorito
|
||||
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...
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
*[one] 1 descarga
|
||||
[one] 1 descarga
|
||||
*[other] { $num } descargas
|
||||
}
|
||||
timespanHours =
|
||||
{ $num ->
|
||||
@@ -77,6 +78,10 @@ fileCount =
|
||||
[one] 1 archivo
|
||||
*[other] { $num } archivos
|
||||
}
|
||||
# byte abbreviation
|
||||
bytes = B
|
||||
# kibibyte abbreviation
|
||||
kb = KB
|
||||
# mebibyte abbreviation
|
||||
mb = MB
|
||||
# gibibyte abbreviation
|
||||
@@ -121,7 +126,7 @@ addPassword = Protegido con contraseña
|
||||
emailPlaceholder = Ingresa tu correo electrónico
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Iniciar sesión para enviar hasta { $size }
|
||||
signInButton = Iniciar sesión/registrarse
|
||||
signInOnlyButton = Iniciar sesión
|
||||
accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = Compartir archivos de hasta { $size }
|
||||
@@ -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
|
||||
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
||||
noStreamsOptionDownload = Continuar con este navegador
|
||||
downloadFirefoxPromo = { -send-short-brand } te lo ofrece el nuevo { -firefox }.
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = Comparte el enlace a tu archivo:
|
||||
shareLinkButton = Enlace para compartir
|
||||
# $name is the name of the file
|
||||
shareMessage = Descarga «{ $name }» con { -send-brand }: es sencillo y seguro
|
||||
trailheadPromo = Existe una forma de proteger tu privacidad. Únete a Firefox.
|
||||
learnMore = Saber más.
|
||||
|
||||
@@ -1,31 +1,9 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = veebieksperiment
|
||||
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...
|
||||
verifyingFile = Kontrollimine…
|
||||
encryptingFile = Krü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 =
|
||||
{ $num ->
|
||||
[one] üht allalaadimist
|
||||
@@ -33,79 +11,29 @@ downloadCount =
|
||||
}
|
||||
timespanHours =
|
||||
{ $num ->
|
||||
[one] üht tundi
|
||||
*[other] { $num } tundi
|
||||
[one] 1 tunni
|
||||
*[other] { $num } tunni
|
||||
}
|
||||
copyUrlFormLabelWithName = Kopeeri ja jaga linki faili allalaadimiseks: { $filename }
|
||||
copyUrlFormButton = Kopeeri vahemällu
|
||||
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
|
||||
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
|
||||
downloadNotification = Allalaadimine on lõpetatud.
|
||||
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 })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
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
|
||||
sendYourFilesLink = Proovi Firefox Send'i
|
||||
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 }.
|
||||
linkExpiredAlt = Link on aegunud
|
||||
expiredPageHeader = See link on aegunud või seda pole kunagi olnudki!
|
||||
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?
|
||||
notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama.
|
||||
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
|
||||
deleteButtonHover = Kustuta
|
||||
copyUrlHover = Kopeeri URL
|
||||
footerLinkLegal = Õiguslik teave
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilotist
|
||||
footerLinkPrivacy = Privaatsusest
|
||||
footerLinkTerms = Teenusetingimused
|
||||
footerLinkCookies = Küpsistest
|
||||
requirePasswordCheckbox = Selle faili allalaadimiseks nõutakse parooli
|
||||
addPasswordButton = Lisa parool
|
||||
changePasswordButton = Muuda
|
||||
passwordTryAgain = Vale parool. Palun proovi uuesti.
|
||||
reportIPInfringement = Intellektuaalomandi keelatud kasutamise raporteerimine
|
||||
javascriptRequired = Firefox Send'i kasutamiseks tuleb JavaScript lubada
|
||||
whyJavascript = Miks Firefox Send JavaScripti vajab?
|
||||
enableJavascript = Palun luba JavaScript ja proovi uuesti.
|
||||
@@ -113,9 +41,113 @@ enableJavascript = Palun luba JavaScript ja proovi uuesti.
|
||||
expiresHoursMinutes = { $hours }t { $minutes }m
|
||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||
expiresMinutes = { $minutes }m
|
||||
# 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
|
||||
maxPasswordLength = Maksimaalne parooli pikkus: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
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
|
||||
errorPageHeader = Zerbait gaizki joan da!
|
||||
fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du.
|
||||
linkExpiredAlt = Lotura iraungita
|
||||
linkExpiredAlt = Lotura iraungi da
|
||||
notSupportedHeader = Zure nabigatzailea ez da onartzen.
|
||||
notSupportedLink = Zergatik ez da nire nabigatzailea onartzen?
|
||||
notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Firefox Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu.
|
||||
@@ -50,10 +50,34 @@ passwordSetError = Pasahitz hau ezin da ezarri
|
||||
|
||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||
-send-brand = Firefox Send
|
||||
-send-short-brand = Send
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = Partekatu fitxategiak modu sinple eta pribatuan
|
||||
introDescription = { -send-brand } tresna fitxategiak partekatzeko da, muturretik muturrera zifratuta eta automatikoki iraungitzen diren loturekin. Hortaz, partekatzen duzuna pribatua izango da eta ziur egon zaitezke zure fitxategiak ez direla online egongo betirako.
|
||||
notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago
|
||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||
archiveExpiryInfo = { $downloadCount } edo { $timespan } ondoren iraungiko da
|
||||
timespanMinutes =
|
||||
{ $num ->
|
||||
[one] minutu 1
|
||||
*[other] { $num } minutu
|
||||
}
|
||||
timespanDays =
|
||||
{ $num ->
|
||||
[one] egun 1
|
||||
*[other] { $num } egun
|
||||
}
|
||||
timespanWeeks =
|
||||
{ $num ->
|
||||
[one] aste 1
|
||||
*[other] { $num } aste
|
||||
}
|
||||
fileCount =
|
||||
{ $num ->
|
||||
[one] fitxategi 1
|
||||
*[other] { $num } fitxategi
|
||||
}
|
||||
# byte abbreviation
|
||||
bytes = B
|
||||
# kibibyte abbreviation
|
||||
@@ -64,9 +88,33 @@ mb = MB
|
||||
gb = GB
|
||||
# localized number and byte abbreviation. example "2.5MB"
|
||||
fileSize = { $num }{ $units }
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
totalSize = Tamaina guztira: { $size }
|
||||
# the next line after the colon contains a file name
|
||||
copyLinkDescription = Kopiatu fitxategia partekatzeko lotura:
|
||||
copyLinkButton = Kopiatu lotura
|
||||
downloadTitle = Deskargatu fitxategiak
|
||||
downloadDescription = { -send-brand } bidez partekatu da fitxategia muturretik muturrera zifratuta eta automatikoki iraungitzen den lotura batekin.
|
||||
trySendDescription = Probatu { -send-brand } fitxategiak partekatzeko modu sinple eta segururako.
|
||||
# count will always be > 10
|
||||
tooManyFiles =
|
||||
{ $count ->
|
||||
[one] Soilik fitxategi bakarra igo daiteke aldi berean.
|
||||
*[other] Soilik { $count } fitxategi igo daitezke aldi berean.
|
||||
}
|
||||
# count will always be > 10
|
||||
tooManyArchives =
|
||||
{ $count ->
|
||||
[one] Soilik artxibo bakarra onartzen da.
|
||||
*[other] Soilik { $count } artxibo onartzen dira.
|
||||
}
|
||||
expiredTitle = Lotura hau iraungi da.
|
||||
notSupportedDescription = { -send-brand } ez da nabigatzaile honetan ibiliko. { -send-short-brand } hobeto dabil { -firefox }(r)en azken bertsioarekin; halaber, nabigatzaile gehienen azken bertsioarekin ibiliko da.
|
||||
downloadFirefox = Deskargatu { -firefox }
|
||||
legalTitle = { -send-short-brand } pribatutasun-oharra
|
||||
legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa.
|
||||
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||
expiresDaysHoursMinutes = { $days }e { $hours }h { $minutes }m
|
||||
addFilesButton = Hautatu igotzeko fitxategiak
|
||||
uploadButton = Igo
|
||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||
@@ -76,8 +124,32 @@ dragAndDropFiles = Arrastatu eta jaregin fitxategiak
|
||||
orClickWithSize = edo egin klik { $size } arte igotzeko
|
||||
addPassword = Babestu pasahitzarekin
|
||||
emailPlaceholder = Idatzi zure helbide elektronikoa
|
||||
signInButton = Hasi saioa/eman izena
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Hasi saioa { $size } arte bidaltzeko
|
||||
signInOnlyButton = Hasi saioa
|
||||
accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak
|
||||
accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin
|
||||
accountBenefitTimeLimit =
|
||||
{ $count ->
|
||||
[one] Utzi loturak erabilgarri egun batez
|
||||
*[other] Utzi loturak erabilgarri { $count } egunez
|
||||
}
|
||||
accountBenefitSync = Kudeatu partekatutako fitxategiak edozein gailutatik
|
||||
accountBenefitMoz = { -mozilla }ren beste zerbitzuei buruzko argibide gehiago
|
||||
signOut = Amaitu saioa
|
||||
okButton = Ados
|
||||
downloadingTitle = Deskargatzen
|
||||
noStreamsWarning = Baliteke nabigatzailea gai ez izatea horrelako tamaina handiko fitxategiak deszifratzeko.
|
||||
noStreamsOptionCopy = Kopiatu lotura beste nabigatzaile batean irekitzeko
|
||||
noStreamsOptionFirefox = Probatu gure nabigatzaile gogokoena
|
||||
noStreamsOptionDownload = Jarraitu nabigatzaile honekin
|
||||
downloadFirefoxPromo = Erabat berritutako { -firefox }(e)k eskaintzen dizu { -send-short-brand }
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = Partekatu zure fitxategirako lotura:
|
||||
shareLinkButton = Partekatu lotura
|
||||
# $name is the name of the file
|
||||
shareMessage = Deskargatu "{ $name }" { -send-brand } erabiliz: fitxategi-partekatze sinple eta segurua
|
||||
trailheadPromo = Badago zure pribatutasuna babesteko modua. Egizu bat Firefoxekin.
|
||||
learnMore = Argibide gehiago.
|
||||
|
||||
@@ -1,31 +1,9 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = آزمایش وب
|
||||
siteFeedback = بازخورد
|
||||
uploadPageHeader = اشتراکگذاری پروندهها، رمزنگاری شده و خصوصی
|
||||
uploadPageExplainer = پرونده های خود را به صورت ایمن، خصوصی و رمزنگاری شده با تعیین تاریخ انقضا خودکار ارسال کنید تا اطمینان پیدا کنید چیزهای شما همیشه آنلاین باقی نماند.
|
||||
uploadPageLearnMore = بیشتر بدانید
|
||||
uploadPageDropMessage = برای شروع بارگذاری پروندههای خود را اینجا بیاندازید
|
||||
uploadPageSizeMessage = برای بیشترین قابلیت اطمینان، بهتر است که پروندهتان کمتر از ۱ گیگابایت باشد
|
||||
uploadPageBrowseButton = یک پرونده را از روی کامپیوتر خود انتخاب کنید
|
||||
uploadPageBrowseButton1 = یک پرونده را برای بارگذاری انتخاب کنید
|
||||
uploadPageMultipleFilesAlert = بارگذاری چندین پرونده یا یک پوشه در حال حاضر پشتیبانی نمیشود.
|
||||
uploadPageBrowseButtonTitle = بارگذاری پرونده
|
||||
uploadingPageProgress = در حال بارگذاری پرونده { $filename } ({ $size })
|
||||
importingFile = در حال وارد کردن…
|
||||
verifyingFile = در حال تایید…
|
||||
encryptingFile = در حال رمزنگاری…
|
||||
decryptingFile = در حال رمزگشایی…
|
||||
notifyUploadDone = بارگذاری شما پایان یافت.
|
||||
uploadingPageMessage = به محض بارگذاری پرونده شما قادر خواهید بود برای آن گزینه انقضا تعیین کنید.
|
||||
uploadingPageCancel = لغو بارگذاری
|
||||
uploadCancelNotification = بارگذاری شما لغو شد
|
||||
uploadingPageLargeFileMessage = پرونده بزرگ است و ممکن است بارگذاری آن مدتی طول بکشد. محکم بشینید!
|
||||
uploadingFileNotification = هر وقت بارگذاری تمام شد به من اطلاع بده.
|
||||
uploadSuccessConfirmHeader = آماده برای ارسال
|
||||
uploadSvgAlt = بارگذاری
|
||||
uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد.
|
||||
expireInfo = این پیوند به فایل شما پس از { $downloadCount } یا { $timespan } منقضی خواهد شد.
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] ۱ بارگیری
|
||||
@@ -36,76 +14,26 @@ timespanHours =
|
||||
[one] ۱ ساعت
|
||||
*[other] { $num } ساعت
|
||||
}
|
||||
copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename }
|
||||
copyUrlFormButton = رونوشت به کلیپبورد
|
||||
copiedUrl = رونوشت شد!
|
||||
deleteFileButton = حذف پرونده
|
||||
sendAnotherFileLink = ارسال پرونده دیگر
|
||||
# Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = دریافت
|
||||
downloadsFileList = دریافتها
|
||||
# Used as header in a column indicating the amount of time left before a
|
||||
# download link expires (e.g. "10h 5m")
|
||||
timeFileList = زمان
|
||||
# Used as header in a column indicating the number of times a file has been
|
||||
# downloaded
|
||||
downloadFileName = بارگیری { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
unlockInputLabel = گذرواژه را وارد کنید
|
||||
unlockInputPlaceholder = گذرواژه
|
||||
unlockButtonLabel = باز کردن
|
||||
downloadFileTitle = دریافت پروندهٔ رمزنگاری شده
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = دوست شما درحال ارسال پرونده ای به وسیله Firefox Send است، این سرویس این امکان را به شما میدهد تا پروندههای خود را به صورت ایمن،خصوصی و رمزنگاری شده به همراه پیوند انقضا خودکار همرسانی کنید تا اطمینان حاصل کنید چیزهای شما برای همیشه آنلاین باقی نخواهد ماند.
|
||||
# Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = بارگیری
|
||||
downloadNotification = بارگیری شما کامل شد.
|
||||
downloadFinish = بارگیری کامل شد
|
||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } از { $totalSize })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send را امتحان کنید
|
||||
downloadingPageProgress = دریافت { $filename } ({ $size })
|
||||
downloadingPageMessage = لطفا این زبانه را باز بگذارید در حالی که ما فایل شما را دریافت میکنیم و کدگذاری میکنیم.
|
||||
errorAltText = خطا در بارگذاری
|
||||
errorPageHeader = چیزی دچار اشکال شده است!
|
||||
errorPageMessage = خطایی در هنگام بارگذاری پرونده شما رخ داده است.
|
||||
errorPageLink = پرونده دیگری ارسال کنید.
|
||||
fileTooBig = این پرونده بسیار حجیم است. حجم آن میبایستی کم تر { $size } باشد.
|
||||
linkExpiredAlt = پیوند منقضی شده است
|
||||
expiredPageHeader = پیوند منقضی شده است یا در از همان ابتدا وجود نداشته است!
|
||||
notSupportedHeader = مرورگر شما پشتیبانی نمیکند.
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = متاسفانه این مرورگر این تکنولوژی وب را که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما بایستی مرورگری دیگری را امتحان کنید. پیشنهاد ما به شما فایرفاکس است !
|
||||
notSupportedLink = چرا مرورگر من پشتیبانی نمیکند؟
|
||||
notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما نیاز دارید تا مرورگر خود را بروز کنید.
|
||||
updateFirefox = بروزرسانی فایرفاکس
|
||||
downloadFirefoxButtonSub = دریافت رایگان
|
||||
uploadedFile = پرونده
|
||||
copyFileList = رونوشت از نشانی
|
||||
# expiryFileList is used as a column header
|
||||
expiryFileList = زمان انقضا
|
||||
deleteFileList = حذف
|
||||
nevermindButton = بیخیال
|
||||
legalHeader = شرایط و حریمخصوصی
|
||||
legalNoticeTestPilot = Firefox Send در حال حاضر در نسخه آزمایشی خود به صورت میدهد و تحت عنوان خلبان آموزشی <a>شرایط و خدمات</a> و <a>موارد حریم خصوصی </a> کار میکند. شما میتوانید اطلاعات بیشتر در مورد این آزمایش و اطلاعات که ذخیره میکنید را از <a> اینجا </a> کسب کنید.
|
||||
legalNoticeMozilla = استفاده از Firefox Send همچنین منصوب به موزیلا است. <a>پایگاه اینترنتی نکات حریم شخصی </a> و <a> پایگاه اطلاع رسانی شرایط خدمات و استفاده </a>.
|
||||
deletePopupText = حذف این پرونده؟
|
||||
deletePopupYes = بله
|
||||
deletePopupCancel = انصراف
|
||||
deleteButtonHover = حذف
|
||||
copyUrlHover = رونوشت از نشانی
|
||||
footerLinkLegal = ملاحظات حقوقی
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = درباره Test Pilot
|
||||
footerLinkPrivacy = حریمخصوصی
|
||||
footerLinkTerms = شرایط
|
||||
footerLinkCookies = کوکیها
|
||||
requirePasswordCheckbox = دریافت این پرونده نیاز به گذرواژه دارد
|
||||
addPasswordButton = افزودن گذرواژه
|
||||
changePasswordButton = تغییر
|
||||
passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید.
|
||||
reportIPInfringement = گزارش تخلف IP
|
||||
javascriptRequired = Firefox Send نیازمند جاوااسکریپت است
|
||||
whyJavascript = چرا Firefox Send جاوااسکریپت لازم داد؟
|
||||
enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید.
|
||||
@@ -113,9 +41,25 @@ enableJavascript = لطفا جاوااسکریپت را فعال کنید و م
|
||||
expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه
|
||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||
expiresMinutes = { $minutes } دقیقه
|
||||
# A short status message shown when a password is successfully set
|
||||
passwordIsSet = گذرواژه تنظیم شد
|
||||
# A short status message shown when the user enters a long password
|
||||
maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
passwordSetError = امکان ثبت این گذواژه نیست
|
||||
|
||||
## Send version 2 strings
|
||||
|
||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||
-send-brand = Firefox Send
|
||||
-send-short-brand = ارسال
|
||||
-firefox = فایرفاکس
|
||||
-mozilla = موزیلا
|
||||
# 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
|
||||
downloadFinish = Lataus valmis
|
||||
fileSizeProgress = { $partialSize } / { $totalSize }
|
||||
sendYourFilesLink = Kokeile Firefox Sendiä
|
||||
sendYourFilesLink = Kokeile Firefox Send -palvelua
|
||||
errorPageHeader = Jokin meni pieleen!
|
||||
fileTooBig = Tämä tiedosto on liian suuri ladattavaksi. Sen pitäisi olla pienempi kuin { $size }.
|
||||
linkExpiredAlt = Linkki on vanhentunut
|
||||
@@ -38,9 +38,9 @@ javascriptRequired = Firefox-Send vaatii JavaScriptin
|
||||
whyJavascript = Miksi Firefox Send vaatii JavaScriptin?
|
||||
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"
|
||||
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"
|
||||
expiresMinutes = { $minutes }min
|
||||
expiresMinutes = { $minutes } min
|
||||
# A short status message shown when the user enters a long password
|
||||
maxPasswordLength = Salasanan enimmäispituus: { $length }
|
||||
# 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
|
||||
-mozilla = Mozilla
|
||||
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
|
||||
# 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 =
|
||||
{ $num ->
|
||||
[one] 1 minuutti
|
||||
*[other] { $num } minuuttia
|
||||
[one] 1 minuutin
|
||||
*[other] { $num } minuutin
|
||||
}
|
||||
timespanDays =
|
||||
{ $num ->
|
||||
[one] 1 päivä
|
||||
*[other] { $num } päivää
|
||||
[one] 1 päivän
|
||||
*[other] { $num } päivän
|
||||
}
|
||||
timespanWeeks =
|
||||
{ $num ->
|
||||
[one] 1 viikko
|
||||
*[other] { $num } viikkoa
|
||||
[one] 1 viikon
|
||||
*[other] { $num } viikon
|
||||
}
|
||||
fileCount =
|
||||
{ $num ->
|
||||
@@ -87,9 +90,24 @@ gb = Gt
|
||||
fileSize = { $num } { $units }
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
totalSize = Koko yhteensä: { $size }
|
||||
# the next line after the colon contains a file name
|
||||
copyLinkDescription = Kopioi linkki jakaaksesi tiedoston:
|
||||
copyLinkButton = Kopioi linkki
|
||||
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.
|
||||
# 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.
|
||||
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 }
|
||||
@@ -99,17 +117,39 @@ legalDateStamp = Versio 1.0, päivätty 13. maaliskuuta 2019
|
||||
expiresDaysHoursMinutes = { $days } pv { $hours } t { $minutes } min
|
||||
addFilesButton = Valitse lähetettävät tiedostot
|
||||
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
|
||||
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
|
||||
# $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
|
||||
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
|
||||
signOut = Kirjaudu ulos
|
||||
okButton = OK
|
||||
downloadingTitle = Ladataan
|
||||
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
|
||||
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
|
||||
# $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 }
|
||||
signInButton = Se connecter/S’inscrire
|
||||
signInOnlyButton = Connexion
|
||||
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")
|
||||
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
|
||||
noStreamsOptionFirefox = Essayez notre navigateur préféré
|
||||
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
|
||||
# $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
|
||||
signInButton = Oanmelde/Registrearje
|
||||
signInOnlyButton = Oanmelde
|
||||
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")
|
||||
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
|
||||
noStreamsOptionFirefox = Probearje ús favorite 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.
|
||||
title = Firefox Send
|
||||
siteSubtitle = ניסוי אינטרנט
|
||||
siteFeedback = משוב
|
||||
uploadPageHeader = שיתוף קבצים פרטי, מוצפן
|
||||
uploadPageExplainer = לשלוח קבצים דרך קישור בטוח, פרטי ומוצפן שפג אוטומטית, כדי לוודא שהתכנים הפרטיים שלך לא יהיו ברשת לנצח.
|
||||
uploadPageLearnMore = מידע נוסף
|
||||
uploadPageDropMessage = יש לגרור קבצים לכאן כדי להתחיל בהעלאה
|
||||
uploadPageSizeMessage = להשגת ביצועים מיטביים, מוטב לשמור על הקובץ מתחת לגודל של 1 ג״ב
|
||||
uploadPageBrowseButton1 = נא לבחור קובץ להעלאה
|
||||
uploadPageMultipleFilesAlert = העלאה של מספר קבצים או ספריה אינה נתמכת כרגע.
|
||||
uploadPageBrowseButtonTitle = העלאת קובץ
|
||||
uploadingPageProgress = { $filename } ({ $size }) בהעלאה
|
||||
importingFile = מתבצע ייבוא...
|
||||
verifyingFile = מתבצע אימות…
|
||||
encryptingFile = מתבצעת הצפנה...
|
||||
decryptingFile = מתבצע פענוח...
|
||||
notifyUploadDone = ההעלאה שלך הסתיימה
|
||||
uploadingPageMessage = אחרי שהקובץ שלך יעלה, ניתן יהיה להגדיר אפשרויות תפוגה.
|
||||
uploadCancelNotification = ההעלאה שלך בוטלה.
|
||||
uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות!
|
||||
uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה.
|
||||
uploadSuccessConfirmHeader = מוכן לשליחה
|
||||
uploadSvgAlt = העלאה
|
||||
uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות.
|
||||
copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename }
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] הורדה אחת
|
||||
*[other] { $num } הורדות
|
||||
}
|
||||
timespanHours =
|
||||
{ $num ->
|
||||
[one] שעה אחת
|
||||
[two] שעתיים
|
||||
*[other] { $num } שעות
|
||||
}
|
||||
copiedUrl = הועתק!
|
||||
deleteFileButton = מחיקת קובץ
|
||||
sendAnotherFileLink = שליחת קובץ נוסף
|
||||
# Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = הורדה
|
||||
# Used as header in a column indicating the number of times a file has been
|
||||
# downloaded
|
||||
downloadFileName = ההורדה נכשלה
|
||||
downloadFileSize = ({ $size })
|
||||
# Text and title used on the download link/button (indicates an action).
|
||||
unlockInputPlaceholder = ססמה
|
||||
unlockButtonLabel = שחרור נעילה
|
||||
downloadButtonLabel = הורדה
|
||||
downloadNotification = ההורדה הושלמה.
|
||||
downloadFinish = ההורדה הושלמה
|
||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
|
||||
downloadingPageProgress = בהורדה: { $filename } ({ $size })
|
||||
errorAltText = תקלה בהעלאה
|
||||
sendYourFilesLink = נסו את Firefox Send
|
||||
errorPageHeader = משהו השתבש!
|
||||
errorPageLink = שליחת קובץ נוסף
|
||||
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
|
||||
linkExpiredAlt = הקישור פג
|
||||
notSupportedHeader = הדפדפן שלך לא נתמך.
|
||||
notSupportedLink = למה אין תמיכה בדפדפן שלי?
|
||||
downloadFirefoxButtonSub = הורדה בחינם
|
||||
uploadedFile = קובץ
|
||||
copyFileList = העתקת כתובת
|
||||
# expiryFileList is used as a column header
|
||||
expiryFileList = יפוג בעוד
|
||||
deleteFileList = מחיקה
|
||||
nevermindButton = לא משנה
|
||||
legalHeader = תנאי שירות ופרטיות
|
||||
deletePopupText = למחוק דף זה?
|
||||
deletePopupYes = כן
|
||||
notSupportedOutdatedDetail = לצערנו גרסת Firefox זו לא תומכת בטכנולוגית הרשת שמפעילה את Firefox Send. יש לעדכן את הגרסה של הדפדפן שלך.
|
||||
updateFirefox = עדכון Firefox
|
||||
deletePopupCancel = ביטול
|
||||
deleteButtonHover = מחיקה
|
||||
copyUrlHover = העתקת קישור
|
||||
footerLinkLegal = מידע משפטי
|
||||
footerLinkPrivacy = פרטיות
|
||||
footerLinkTerms = תנאי שימוש
|
||||
footerLinkCookies = קובצי עוגיות
|
||||
passwordTryAgain = סיסמה שגויה. נא לנסות שוב.
|
||||
javascriptRequired = ל־Firefox Send דרוש JavaScript
|
||||
whyJavascript = למה ל־Firefox Send דרוש JavaScript?
|
||||
enableJavascript = נא להפעיל JavaScript ולנסות שוב.
|
||||
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
|
||||
expiresHoursMinutes = { $hours } שע׳ { $minutes } דק׳
|
||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||
expiresMinutes = { $minutes } דק׳
|
||||
# A short status message shown when the user enters a long password
|
||||
maxPasswordLength = אורך הססמה המרבי: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
passwordSetError = לא ניתן להגדיר את הססמה הזאת
|
||||
|
||||
## Send version 2 strings
|
||||
|
||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||
-send-brand = Firefox Send
|
||||
-send-short-brand = Send
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = שיתוף קבצים פרטי ופשוט
|
||||
introDescription = { -send-brand } מאפשר לך לשתף קבצים עם הצפנה מקצה לקצה וקישור עם תפוגה אוטומטית. בצורה זו תוכלו לשתף קבצים באופן פרטי ולהבטיח שהדברים שלכם לא נשארים ברשת לנצח.
|
||||
notifyUploadEncryptDone = הקובץ שלך מוצפן ומוכן לשליחה
|
||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||
archiveExpiryInfo = יפוג לאחר { $downloadCount } או { $timespan }
|
||||
timespanMinutes =
|
||||
{ $num ->
|
||||
[one] דקה אחת
|
||||
*[other] { $num } דקות
|
||||
}
|
||||
timespanDays =
|
||||
{ $num ->
|
||||
[one] יום אחד
|
||||
[two] יומיים
|
||||
*[other] { $num } ימים
|
||||
}
|
||||
timespanWeeks =
|
||||
{ $num ->
|
||||
[one] שבוע אחד
|
||||
[two] שבועיים
|
||||
*[other] { $num } שבועות
|
||||
}
|
||||
fileCount =
|
||||
{ $num ->
|
||||
[one] קובץ אחד
|
||||
*[other] { $num } קבצים
|
||||
}
|
||||
# byte abbreviation
|
||||
bytes = בתים
|
||||
# kibibyte abbreviation
|
||||
kb = ק״ב
|
||||
# mebibyte abbreviation
|
||||
mb = מ״ב
|
||||
# gibibyte abbreviation
|
||||
gb = ג״ב
|
||||
# localized number and byte abbreviation. example "2.5MB"
|
||||
fileSize = { $num } { $units }
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
totalSize = גודל כולל: { $size }
|
||||
# the next line after the colon contains a file name
|
||||
copyLinkDescription = יש להעתיק את הקישור כדי לשתף את הקובץ שלך:
|
||||
copyLinkButton = העתקת קישור
|
||||
downloadTitle = הורדת קבצים
|
||||
downloadDescription = קובץ זה שותף באמצעות { -send-brand } עם הצפנה מקצה לקצה וקישור שפג באופן אוטומטי.
|
||||
trySendDescription = כדאי לנסות את { -send-brand } לשיתוף קבצים פשוט ומאובטח.
|
||||
# count will always be > 10
|
||||
tooManyFiles =
|
||||
{ $count ->
|
||||
[one] ניתן להעלות רק קובץ אחד בכל פעם.
|
||||
*[other] ניתן להעלות רק { $count } קבצים בכל פעם.
|
||||
}
|
||||
# count will always be > 10
|
||||
tooManyArchives =
|
||||
{ $count ->
|
||||
[one] רק ארכיון אחד מורשה.
|
||||
*[other] רק { $count } ארכיונים מורשים.
|
||||
}
|
||||
expiredTitle = פג תוקפו של קישור זה.
|
||||
notSupportedDescription = { -send-brand } לא יפעל עם דפדפן זה. { -send-short-brand } פועל בצורה הטובה ביותר עם הגרסה העדכנית ביותר של { -firefox }, ויעבוד עם הגרסה הנוכחית של רוב הדפדפנים.
|
||||
downloadFirefox = הורדת { -firefox }
|
||||
legalTitle = הצהרת פרטיות של { -send-short-brand }
|
||||
legalDateStamp = גרסה 1.0, בתאריך 12 במרץ 2019
|
||||
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
|
||||
expiresDaysHoursMinutes = { $days } ימים { $hours } שעות { $minutes } דקות
|
||||
addFilesButton = בחירת קבצים להעלאה
|
||||
uploadButton = העלאה
|
||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||
dragAndDropFiles = גרירה והשלכת קבצים
|
||||
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
orClickWithSize = או ללחוץ כדי לשלוח קבצים עד לגודל של { $size }
|
||||
addPassword = הגנה באמצעות ססמה
|
||||
emailPlaceholder = נא להכניס כתובת דוא״ל
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = נא להירשם כדי לשלוח קבצים עד גודל של { $size }
|
||||
signInOnlyButton = כניסה
|
||||
accountBenefitTitle = נא ליצור חשבון { -firefox } או להיכנס לחשבון
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = שיתוף קבצים עד גודל של { $size }
|
||||
accountBenefitDownloadCount = שיתוף קבצים עם יותר אנשים
|
||||
accountBenefitTimeLimit =
|
||||
{ $count ->
|
||||
[one] שמירה על קישורים פעילים עד ליום אחד
|
||||
*[other] שמירה על קישורים פעילים עד ל־{ $count } ימים
|
||||
}
|
||||
accountBenefitSync = ניהול קבצים משותפים מכל מכשיר
|
||||
accountBenefitMoz = מידע נוסף על שירותי { -mozilla } אחרים
|
||||
signOut = יציאה
|
||||
okButton = אישור
|
||||
downloadingTitle = בהורדה
|
||||
noStreamsWarning = ייתכן שדפדפן זה לא יוכל לפענח קובץ בגודל כזה.
|
||||
noStreamsOptionCopy = העתקת הקישור לפתיחה בדפדפן אחר
|
||||
noStreamsOptionFirefox = נסו את הדפדפן המועדף עלינו
|
||||
noStreamsOptionDownload = המשך בדפדפן זה
|
||||
downloadFirefoxPromo = { -send-short-brand } מובא אליך בחסות { -firefox }
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = שיתוף הקישור לקובץ שלך:
|
||||
shareLinkButton = שיתוף קישור
|
||||
# $name is the name of the file
|
||||
shareMessage = הורדת ״{ $name }״ עם { -send-brand }: שיתוף קבצים פשוט ובטוח
|
||||
trailheadPromo = ישנן דרכים נוספות להגן על הפרטיות שלכם. הצטרפו אל Firefox.
|
||||
learnMore = מידע נוסף.
|
||||
|
||||
@@ -134,7 +134,7 @@ addPassword = Zaštitite lozinkom
|
||||
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")
|
||||
signInSizeBump = Prijavite se za slanje do { $size }
|
||||
signInButton = Prijavite se
|
||||
signInOnlyButton = Prijavi se
|
||||
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")
|
||||
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
|
||||
noStreamsOptionFirefox = Isprobajte naš omiljeni preglednik
|
||||
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
|
||||
# $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ł
|
||||
signInButton = Přizjewić/Registrować
|
||||
signInOnlyButton = Přizjewić
|
||||
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")
|
||||
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ł
|
||||
noStreamsOptionFirefox = Wupruwujće naš najlubši wobhladowak
|
||||
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
|
||||
# $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
|
||||
signInButton = Bejelentkezés/regisztráció
|
||||
signInOnlyButton = Bejelentkezés
|
||||
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")
|
||||
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
|
||||
noStreamsOptionFirefox = Próbálja ki a kedvenc böngészőnket
|
||||
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
|
||||
-mozilla = Mozilla
|
||||
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 =
|
||||
{ $num ->
|
||||
[one] 1 minuta
|
||||
@@ -90,6 +94,8 @@ totalSize = Dimension total: { $size }
|
||||
copyLinkDescription = Copia le ligamine pro compartir le file:
|
||||
copyLinkButton = Copiar ligamine
|
||||
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
|
||||
tooManyFiles =
|
||||
{ $count ->
|
||||
@@ -103,6 +109,7 @@ tooManyArchives =
|
||||
*[other] Solo { $count } archivos es consentite.
|
||||
}
|
||||
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 }
|
||||
legalTitle = Politica de confidentialitate de { -send-short-brand }
|
||||
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")
|
||||
orClickWithSize = o cliccar pro inviar usque { $size }
|
||||
addPassword = Proteger per contrasigno
|
||||
emailPlaceholder = Insere tu adresse email
|
||||
emailPlaceholder = Insere tu adresse de e-mail
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Accede pro inviar usque { $size }
|
||||
signInButton = Authentica/registra te
|
||||
signInOnlyButton = Authentica 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")
|
||||
accountBenefitLargeFiles = Comparti files usque { $size }
|
||||
@@ -129,8 +136,20 @@ accountBenefitTimeLimit =
|
||||
[one] Retene active le ligamine pro 1 die
|
||||
*[other] Retene active le ligamine pro { $count } dies
|
||||
}
|
||||
accountBenefitSync = Gere files compartite ab ulle apparato
|
||||
accountBenefitMoz = Discoperi altere servicios de { -mozilla }
|
||||
signOut = Disconnecter
|
||||
okButton = OK
|
||||
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
|
||||
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
|
||||
# $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 }
|
||||
signInButton = Masuk/Daftar
|
||||
signInOnlyButton = 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")
|
||||
accountBenefitLargeFiles = Bagikan berkas hingga { $size }
|
||||
@@ -130,9 +130,17 @@ accountBenefitTimeLimit =
|
||||
accountBenefitSync = Kelola berkas yang dibagikan dari perangkat apa pun
|
||||
accountBenefitMoz = Pelajari tentang layanan { -mozilla } lainnya
|
||||
signOut = Keluar
|
||||
okButton = OK
|
||||
okButton = Oke
|
||||
downloadingTitle = Mengunduh
|
||||
noStreamsWarning = Peramban ini mungkin tidak dapat mendekripsi berkas sebesar ini.
|
||||
noStreamsOptionCopy = Salin tautan untuk dibuka di peramban lainnya
|
||||
noStreamsOptionFirefox = Coba peramban favorit kami
|
||||
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
|
||||
# $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 }
|
||||
signInButton = Accedi o registrati
|
||||
signInOnlyButton = 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")
|
||||
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
|
||||
noStreamsOptionFirefox = Prova il nostro browser preferito
|
||||
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 = メールアドレスを入力
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = ログインすると最大 { $size } のファイルを送信できます
|
||||
signInButton = ログイン/登録
|
||||
signInOnlyButton = ログイン
|
||||
accountBenefitTitle = { -firefox } アカウントを作成またはログイン
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = 最大 { $size } までのファイルを共有
|
||||
@@ -135,3 +135,10 @@ downloadingTitle = ダウンロード中
|
||||
noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。
|
||||
noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください
|
||||
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 = შეიყვანეთ ელფოსტა
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = შედით ანგარიშზე, რომ გაგზავნოთ { $size }-მდე
|
||||
signInButton = ანგარიშზე შესვლა/შექმნა
|
||||
signInOnlyButton = შესვლა
|
||||
accountBenefitTitle = შექმენით { -firefox }-ანგარიში ან შედით
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = გააზიარეთ ფაილები { $size }-მდე
|
||||
@@ -145,3 +145,11 @@ noStreamsWarning = ამ ბრაუზერმა, შესაძლოა
|
||||
noStreamsOptionCopy = ბმულის ასლის აღება სხვა ბრაუზერში გასახსნელად
|
||||
noStreamsOptionFirefox = სცადეთ ჩვენი რჩეული ბრაუზერი
|
||||
noStreamsOptionDownload = განაგრძეთ ამ ბრაუზერით
|
||||
downloadFirefoxPromo = { -send-short-brand }-ს წარმოგიდგინეთ უახლესი { -firefox }.
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = ფაილის ბმულის გაზიარება:
|
||||
shareLinkButton = ბმულის გაზიარება
|
||||
# $name is the name of the file
|
||||
shareMessage = ჩამოტვირთეთ „{ $name }“ { -send-brand }-ით: ფაილების გაზიარება მარტივად, უსაფრთხოდ
|
||||
trailheadPromo = გზა, თქვენი პირადულობის დასაცავად. შემოუერთდით Firefox-ს.
|
||||
learnMore = იხილეთ ვრცლად.
|
||||
|
||||
@@ -1,31 +1,9 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = Tarmit web
|
||||
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...
|
||||
verifyingFile = Asenqed...
|
||||
encryptingFile = Awgelhen...
|
||||
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 =
|
||||
{ $num ->
|
||||
[one] 1 usider
|
||||
@@ -36,76 +14,26 @@ timespanHours =
|
||||
[one] 1 usrag
|
||||
*[other] { $num } isragen
|
||||
}
|
||||
copyUrlFormLabelWithName = Nɣel sakin Bḍu aseɣwen akken ad tazneḍ afaylu-ik: { $filename }
|
||||
copyUrlFormButton = Sers ɣef afus
|
||||
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
|
||||
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
|
||||
downloadNotification = Asider-ik 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 })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
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!
|
||||
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 }.
|
||||
linkExpiredAlt = Aseɣwen yemmut
|
||||
expiredPageHeader = Aseɣwen-agi yemmut neɣ wurǧin yella seg tazwara!
|
||||
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?
|
||||
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
|
||||
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
|
||||
deleteButtonHover = Kkes
|
||||
copyUrlHover = Nɣel URL.
|
||||
footerLinkLegal = Usḍif
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Ɣef Test Pilot
|
||||
footerLinkPrivacy = Tabaḍnit
|
||||
footerLinkTerms = Tiwtilin
|
||||
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.
|
||||
reportIPInfringement = Neqqes akukel n IP
|
||||
javascriptRequired = Firefox Send yesra JavaScript
|
||||
whyJavascript = Ayɣer firefox Send yesra JavaScript?
|
||||
enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍen.
|
||||
@@ -113,9 +41,115 @@ enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍe
|
||||
expiresHoursMinutes = { $hours }Isragen { $minutes }Tisdatin
|
||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||
expiresMinutes = { $minutes }Tisdatin
|
||||
# A short status message shown when a password is successfully set
|
||||
passwordIsSet = Awal uffir ittwasbaded
|
||||
# A short status message shown when the user enters a long password
|
||||
maxPasswordLength = Tuγzi tafellayt n wawal uffir: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded
|
||||
|
||||
## 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 = 가져오는 중…
|
||||
encryptingFile = 암호화 중…
|
||||
decryptingFile = 복호화 중…
|
||||
downloadCount = 1 다운로드
|
||||
downloadCount = 다운로드 { $num }회
|
||||
timespanHours = 1 시간
|
||||
copiedUrl = 복사 완료!
|
||||
unlockInputPlaceholder = 비밀번호
|
||||
@@ -18,7 +18,7 @@ fileTooBig = 파일의 크기가 너무 큽니다. { $size } 보다 작아야
|
||||
linkExpiredAlt = 링크가 만료됨
|
||||
notSupportedHeader = 이 브라우저는 지원되지 않습니다.
|
||||
notSupportedLink = 왜 이 브라우저는 지원이 되지 않나요?
|
||||
notSupportedOutdatedDetail = 안타깝게도 현재 브라우저 버전에서는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다.
|
||||
notSupportedOutdatedDetail = 안타깝게도 사용중인 Firefox 버전에서는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다.
|
||||
updateFirefox = Firefox 업데이트
|
||||
deletePopupCancel = 아니오
|
||||
deleteButtonHover = 삭제
|
||||
@@ -45,11 +45,11 @@ passwordSetError = 이 비밀번호를 설정할 수 없었습니다
|
||||
-send-short-brand = Send
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = 간단하고 안전한 파일 공유
|
||||
introTitle = 간단하고, 사생활을 보호하는 파일 공유
|
||||
introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다.
|
||||
notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다
|
||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||
archiveExpiryInfo = { $downloadCount }나 { $timespan } 후 만료됨
|
||||
archiveExpiryInfo = { $downloadCount } 혹은 { $timespan } 후 만료됨
|
||||
timespanMinutes =
|
||||
{ $num ->
|
||||
*[other] { $num }분
|
||||
@@ -82,8 +82,59 @@ totalSize = 전체 크기: { $size }
|
||||
copyLinkDescription = 링크를 복사해서 파일을 공유하세요:
|
||||
copyLinkButton = 링크 복사
|
||||
downloadTitle = 파일 다운로드
|
||||
downloadDescription = 이 파일은 종단간 암호화 및 자동으로 만료되는 링크를 지원하는 { -send-brand }를 통해 공유되었습니다.
|
||||
trySendDescription = 간단하고 안전한 파일 공유를 원하시나요? { -send-brand }를 사용해보세요.
|
||||
# count will always be > 10
|
||||
tooManyFiles =
|
||||
{ $count ->
|
||||
*[other] 한번에 { $count }개의 파일만 업로드 할 수 있습니다.
|
||||
}
|
||||
# count will always be > 10
|
||||
tooManyArchives =
|
||||
{ $count ->
|
||||
*[other] { $count }개의 아카이브만 허용됩니다.
|
||||
}
|
||||
expiredTitle = 이 링크는 만료되었습니다.
|
||||
notSupportedDescription = { -send-brand }는 이 브라우저와 작동하지 않습니다. { -send-short-brand }는 최신 { -firefox }와 가장 잘 작동하며, 대부분의 최신 웹 브라우저와도 잘 작동합니다.
|
||||
downloadFirefox = 다운로드 { -firefox }
|
||||
legalTitle = { -send-short-brand } 개인정보 보호 공지
|
||||
legalDateStamp = 버전 1.0, 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"
|
||||
expiresDaysHoursMinutes = { $days }일 { $hours }시간 { $minutes }분
|
||||
signInButton = 로그인/등록
|
||||
signOut = 로그 아웃
|
||||
addFilesButton = 업로드할 파일을 선택하세요
|
||||
uploadButton = 업로드
|
||||
# the first part of the string 'Drag and drop files or click to send up to 1GB'
|
||||
dragAndDropFiles = 파일을 이곳에 드래그 엔 드롭하세요.
|
||||
# the second part of the string 'Drag and drop files or click to send up to 1GB'
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
orClickWithSize = 또는 여기를 클릭하여 { $size }까지의 파일을 공유하세요.
|
||||
addPassword = 비밀번호로 파일 보호
|
||||
emailPlaceholder = 이메일 입력
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인
|
||||
signInOnlyButton = 로그인
|
||||
accountBenefitTitle = { -firefox } 계정을 하나 만들거나, 로그인
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = { $size }까지의 파일 공유
|
||||
accountBenefitDownloadCount = 더 많은 사람들과 함께 파일 공유
|
||||
accountBenefitTimeLimit =
|
||||
{ $count ->
|
||||
*[other] 최대 { $count }일까지 링크 유지
|
||||
}
|
||||
accountBenefitSync = 어떤 기기에서든지 공유된 링크 관리
|
||||
accountBenefitMoz = 더 많은 { -mozilla } 서비스에 대해 알아보기
|
||||
signOut = 로그아웃
|
||||
okButton = 확인
|
||||
downloadingTitle = 다운로드 중
|
||||
noStreamsWarning = 이 브라우저는 이렇게 큰 용량의 파일 암호화를 풀 수 없을 수도 있습니다.
|
||||
noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사
|
||||
noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요
|
||||
noStreamsOptionDownload = 이 브라우저로 계속하기
|
||||
downloadFirefoxPromo = 완전히 새로운 { -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ą
|
||||
# $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 }
|
||||
signInButton = Prisijungti / registruotis
|
||||
signInOnlyButton = Prisijungti
|
||||
accountBenefitTitle = Susikurkite „{ -firefox }“ paskyrą arba prisijunkite
|
||||
# $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
|
||||
@@ -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
|
||||
noStreamsOptionFirefox = Išbandykite mūsų mėgstamiausią naršyklę
|
||||
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
|
||||
-mozilla = Mozilla
|
||||
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
|
||||
# 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 }
|
||||
@@ -77,9 +78,78 @@ fileCount =
|
||||
[one] 1 fil
|
||||
*[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 }
|
||||
# the next line after the colon contains a file name
|
||||
copyLinkDescription = Kopier lenken for å dele filen din:
|
||||
copyLinkButton = Kopier lenke
|
||||
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